分堆打包 配件多加工组/部件组展示数量错误修复

This commit is contained in:
gaoqr
2026-06-24 15:19:01 +08:00
parent 9a45e8751e
commit ce24ef2db0
6 changed files with 152 additions and 43 deletions
@@ -98,11 +98,15 @@ public class OrderPartsRespVO {
@Schema(description = "组件名称")
private String componentName;
private List<String> componentNameList;
private List<String> processGroupNameList;
@Schema(description = "加工组")
private String processGroup;
private Long groupId;
@Schema(description = "分堆状态,true:已分堆")
private Boolean heapSplitStatus;
@@ -75,6 +75,8 @@ public class PackageDetailsRespVO {
private List<String> processGroupNameList;
private List<String> componentNameList;
@Schema(description = "备注(板材和配件都要传递)")
private String remark;
@@ -139,9 +141,7 @@ public class PackageDetailsRespVO {
@Schema(description = "柜体ID")
private Long bodyId;
@Schema(description = "加工组-用于计算-不显示")
private List<Long> groupId;
private Long groupId;
@Schema(description = "正面孔数量")
private Integer frontHoleCount;
@@ -125,6 +125,15 @@ public interface OrderPartsMapper extends BaseMapperX<OrderPartsDO> {
*/
List<PackageDetailsRespVO> selectPackedParts(@Param("orderIds") Set<Long> orderIds, @Param("packageNo") String packageId);
/**
* 查询包裹配件加工组、部件关联关系
*
* @param orderIds
* @param partsIds
* @return
*/
List<PackageDetailsRespVO> selectPackedPartsGroupAndComponent(@Param("orderIds") Set<Long> orderIds, @Param("partsIds") Set<Long> partsIds);
/**
* 查询订单列表未打包配件
*
@@ -201,7 +201,11 @@ public class HeapSplitServiceImpl implements HeapSplitService {
LambdaQueryWrapper<OrderItemDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(OrderItemDO::getPartsId, partsId);
// 有加工组的扣减groupId = 0的,没加工组的扣减groupId = null && compId = null的
wrapper.eq(OrderItemDO::getPartsId, partsId)
.and(w -> w.eq(OrderItemDO::getGroupId, 0)
.or(x -> x.isNull(OrderItemDO::getGroupId)
.isNull(OrderItemDO::getCompId)));
if (filterHeapSplit) {
wrapper.eq(OrderItemDO::getHeapSplitStatus, false);
@@ -320,11 +324,13 @@ public class HeapSplitServiceImpl implements HeapSplitService {
v.setNum(BigDecimal.ZERO);
v.setHeapNum(BigDecimal.ZERO);
v.setProcessGroupNameList(new ArrayList<>());
v.setComponentNameList(new ArrayList<>());
return v;
});
// ===== 3. num 累加 =====
if (row.getNum() != null) {
if (row.getNum() != null &&
(ObjectUtil.equals(row.getGroupId(), 0L) || (ObjectUtil.isNull(row.getGroupId()) && ObjectUtil.isNull(row.getComponentName())))) {
vo.setNum(vo.getNum().add(row.getNum()));
}
@@ -337,6 +343,11 @@ public class HeapSplitServiceImpl implements HeapSplitService {
if (row.getProcessGroup() != null) {
vo.getProcessGroupNameList().add(row.getProcessGroup());
}
// ===== 6. 部件组(允许重复)=====
if (row.getComponentName() != null) {
vo.getComponentNameList().add(row.getComponentName());
}
}
// ===== 7. 收尾处理 =====
@@ -350,8 +361,17 @@ public class HeapSplitServiceImpl implements HeapSplitService {
vo.setProcessGroup("");
}
// ===== 部件组拼接 =====
List<String> componentNameList = vo.getComponentNameList();
if (CollUtil.isNotEmpty(componentNameList)) {
vo.setComponentName(String.join(",", componentNameList));
} else {
vo.setComponentName(null);
}
// 可释放内存
vo.setProcessGroupNameList(null);
vo.setComponentNameList(null);
// ===== multiSort 处理(柜体编号)=====
if (vo.getMultiNum() > 1) {
@@ -6,6 +6,7 @@ import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -51,6 +52,7 @@ import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
@@ -444,7 +446,11 @@ public class PackServiceImpl implements PackService {
LambdaQueryWrapper<OrderItemDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(OrderItemDO::getPartsId, partsId);
// 有加工组的扣减groupId = 0的,没加工组的扣减groupId = null && compId = null的
wrapper.eq(OrderItemDO::getPartsId, partsId)
.and(w -> w.eq(OrderItemDO::getGroupId, 0)
.or(x -> x.isNull(OrderItemDO::getGroupId)
.isNull(OrderItemDO::getCompId)));
if (isAdd) {
// 新增要查的是没打包的
@@ -640,7 +646,7 @@ public class PackServiceImpl implements PackService {
item.setPackNum(item.getPackNum() + remain);
orderItemMapper.updateById(item);
// 新建分堆记录
// 新建打包记录
OrderItemDO newItem = buildPackItem(item, packNo, remain);
orderItemMapper.insert(newItem);
@@ -1206,13 +1212,15 @@ public class PackServiceImpl implements PackService {
// ===== 初始化 =====
newVo.setProcessGroupNameList(new ArrayList<>());
newVo.setComponentNameList(new ArrayList<>());
newVo.setNum(BigDecimal.ZERO);
return newVo;
});
// ===== 2. num 累加 =====
if (row.getNum() != null) {
if (row.getNum() != null &&
(ObjectUtil.equals(row.getGroupId(), 0L) || (ObjectUtil.isNull(row.getGroupId()) && ObjectUtil.isNull(row.getComponentName())))) {
vo.setNum(vo.getNum().add(row.getNum()));
}
@@ -1220,6 +1228,11 @@ public class PackServiceImpl implements PackService {
if (row.getProcessGroup() != null) {
vo.getProcessGroupNameList().add(row.getProcessGroup());
}
// ===== 4. 部件组(允许重复)=====
if (row.getComponentName() != null) {
vo.getComponentNameList().add(row.getComponentName());
}
}
Collection<OrderPartsRespVO> values = map.values();
@@ -1233,8 +1246,17 @@ public class PackServiceImpl implements PackService {
vo.setProcessGroup(null);
}
// ===== 部件组拼接 =====
List<String> componentNameList = vo.getComponentNameList();
if (CollUtil.isNotEmpty(componentNameList)) {
vo.setComponentName(String.join(",", componentNameList));
} else {
vo.setComponentName(null);
}
// 可释放内存
vo.setProcessGroupNameList(null);
vo.setComponentNameList(null);
// ===== multiSort 处理(柜体编号)=====
if (vo.getMultiNum() > 1) {
@@ -1266,7 +1288,7 @@ public class PackServiceImpl implements PackService {
List<PackageDetailsRespVO> packPartsList = orderPartsMapper.selectPackedParts(orderIds, packageNo);
Collection<PackageDetailsRespVO> resultList = buildPackPlateGroup(packPlateList);
resultList.addAll(buildPackPartsGroup(packPartsList));
resultList.addAll(buildPackPartsGroup(orderIds, packPartsList));
return CollUtil.newArrayList(resultList);
}
@@ -1335,7 +1357,27 @@ public class PackServiceImpl implements PackService {
* @param parts
* @return
*/
private Collection<PackageDetailsRespVO> buildPackPartsGroup(List<PackageDetailsRespVO> parts) {
private Collection<PackageDetailsRespVO> buildPackPartsGroup(Set<Long> orderIds, List<PackageDetailsRespVO> parts) {
if (CollUtil.isEmpty(parts)) {
return Collections.emptyList();
}
// 提取当前包裹涉及的配件
Set<Long> partsIds = parts.stream()
.map(PackageDetailsRespVO::getPartsId)
.collect(Collectors.toSet());
// 查询加工组/组件关系
List<PackageDetailsRespVO> relations =
orderPartsMapper.selectPackedPartsGroupAndComponent(orderIds, partsIds);
Map<String, List<PackageDetailsRespVO>> relationMap =
relations.stream()
.collect(Collectors.groupingBy(item ->
item.getPartsId()
+ "_" + item.getRoomId()
+ "_" + item.getBodyId()
));
Map<String, PackageDetailsRespVO> map = new LinkedHashMap<>();
for (PackageDetailsRespVO row : parts) {
@@ -1351,7 +1393,6 @@ public class PackServiceImpl implements PackService {
BeanUtils.copyProperties(row, newVo);
// ===== 初始化 =====
newVo.setProcessGroupNameList(new ArrayList<>());
newVo.setPackNum(BigDecimal.ZERO);
return newVo;
@@ -1361,34 +1402,41 @@ public class PackServiceImpl implements PackService {
if (row.getPackNum() != null) {
vo.setPackNum(vo.getPackNum().add(row.getPackNum()));
}
// ===== 3. 加工组(允许重复)=====
if (row.getProcessGroup() != null) {
vo.getProcessGroupNameList().add(row.getProcessGroup());
}
}
Collection<PackageDetailsRespVO> values = map.values();
for (PackageDetailsRespVO vo : values) {
// ===== 加工组拼接 =====
List<String> processGroupNameList = vo.getProcessGroupNameList();
if (CollUtil.isNotEmpty(processGroupNameList)) {
vo.setProcessGroup(String.join(",", processGroupNameList));
} else {
vo.setProcessGroup(null);
String key = vo.getPartsId()
+ "_" + vo.getRoomId()
+ "_" + vo.getBodyId();
List<PackageDetailsRespVO> relationList = relationMap.get(key);
if (CollUtil.isNotEmpty(relationList)) {
String processGroup = relationList.stream()
.map(PackageDetailsRespVO::getProcessGroup)
.filter(StrUtil::isNotBlank)
.collect(Collectors.joining(","));
vo.setProcessGroup(StrUtil.blankToDefault(processGroup, null));
String componentName = relationList.stream()
.map(PackageDetailsRespVO::getComponentName)
.filter(StrUtil::isNotBlank)
.collect(Collectors.joining(","));
vo.setComponentName(StrUtil.blankToDefault(componentName, null));
}
// 可释放内存
vo.setProcessGroupNameList(null);
if (ObjectUtil.isNotNull(vo.getMultiNum())
&& vo.getMultiNum() > 1) {
// ===== multiSort 处理(柜体编号)=====
if (vo.getMultiNum() > 1) {
vo.setCabinetName(
vo.getCabinetName() + "-" + vo.getMultiSort()
);
} else {
vo.setCabinetName(vo.getCabinetName());
}
}
@@ -1410,7 +1458,7 @@ public class PackServiceImpl implements PackService {
List<PackageDetailsRespVO> packPlateList = orderPlateMapper.selectPackedPlateList(orderIds, packageNo);
Collection<PackageDetailsRespVO> resultList = buildPackPlateGroup(packPlateList);
resultList.addAll(buildPackPartsGroup(packPartsList));
resultList.addAll(buildPackPartsGroup(orderIds, packPartsList));
return CollUtil.newArrayList(resultList);
}
@@ -303,9 +303,6 @@
ob.room_id AS roomId,
ob.id AS bodyId,
og.name AS groupName,
oc.name AS componentName,
oi.pack_num AS packNum,
oi.package_id AS packageId,
@@ -337,21 +334,11 @@
AND oi.organ_id = op.organ_id
AND oi.order_id = op.order_id
LEFT JOIN order_group og
ON oi.organ_id = og.organ_id
AND oi.order_id = og.order_id
AND oi.group_id = og.id
LEFT JOIN order_body ob
ON oi.organ_id = ob.organ_id
AND oi.order_id = ob.order_id
AND oi.body_id = ob.id
LEFT JOIN order_component oc
ON oi.organ_id = oc.organ_id
AND oi.order_id = oc.order_id
AND oi.comp_id = oc.id
WHERE
oi.package_id = #{packageNo}
AND oi.parts_id != 0
@@ -366,7 +353,47 @@
order by partsId
</select>
<select id="selectPackedPartsGroupAndComponent"
parameterType="java.lang.Long"
resultMap="partsMap">
SELECT
oi.parts_id AS partsId,
oi.room_id AS roomId,
oi.body_id AS bodyId,
oi.group_id,
oi.comp_id,
og.name AS processGroup,
oc.name AS componentName
FROM order_item oi
LEFT JOIN order_group og
ON oi.organ_id = og.organ_id
AND oi.order_id = og.order_id
AND oi.group_id = og.id
LEFT JOIN order_component oc
ON oi.organ_id = oc.organ_id
AND oi.order_id = oc.order_id
AND oi.comp_id = oc.id
WHERE ((
oi.group_id IS NOT NULL
AND oi.group_id != 0
)
OR oi.comp_id IS NOT NULL)
AND oi.order_id IN
<foreach item="orderId" collection="orderIds" open="(" separator="," close=")">
#{orderId}
</foreach>
AND oi.parts_id IN
<foreach item="partsId" collection="partsIds" open="(" separator="," close=")">
#{partsId}
</foreach>
</select>
<resultMap id="PartsListMap" type="com.cf.imes.module.executor.controller.admin.manage.pack.vo.OrderPartsRespVO">
<result property="packageId" column="packageId"/>
@@ -410,6 +437,7 @@
ob.room_id AS roomId,
ob.id AS bodyId,
og.name AS processGroup,
oi.group_id AS groupId,
oc.name AS componentName,
(oi.num - oi.pack_num) AS num,
ob.multi_num AS multiNum,
@@ -454,7 +482,6 @@
oi.parts_id != 0
AND oi.package_id = 0
AND oi.source_id = 0
AND (oi.group_id != 0 or oi.group_id is null)
AND op.deleted = false
AND op.type != '封边条'
AND oi.order_id IN
@@ -474,6 +501,7 @@
ob.id AS bodyId,
oi.heap_split_status AS heapSplitStatus,
oi.group_id AS groupId,
og.name AS processGroup,
oc.name AS componentName,