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

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 = "组件名称") @Schema(description = "组件名称")
private String componentName; private String componentName;
private List<String> componentNameList;
private List<String> processGroupNameList; private List<String> processGroupNameList;
@Schema(description = "加工组") @Schema(description = "加工组")
private String processGroup; private String processGroup;
private Long groupId;
@Schema(description = "分堆状态,true:已分堆") @Schema(description = "分堆状态,true:已分堆")
private Boolean heapSplitStatus; private Boolean heapSplitStatus;
@@ -75,6 +75,8 @@ public class PackageDetailsRespVO {
private List<String> processGroupNameList; private List<String> processGroupNameList;
private List<String> componentNameList;
@Schema(description = "备注(板材和配件都要传递)") @Schema(description = "备注(板材和配件都要传递)")
private String remark; private String remark;
@@ -139,9 +141,7 @@ public class PackageDetailsRespVO {
@Schema(description = "柜体ID") @Schema(description = "柜体ID")
private Long bodyId; private Long bodyId;
private Long groupId;
@Schema(description = "加工组-用于计算-不显示")
private List<Long> groupId;
@Schema(description = "正面孔数量") @Schema(description = "正面孔数量")
private Integer frontHoleCount; 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); 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<>(); 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) { if (filterHeapSplit) {
wrapper.eq(OrderItemDO::getHeapSplitStatus, false); wrapper.eq(OrderItemDO::getHeapSplitStatus, false);
@@ -320,11 +324,13 @@ public class HeapSplitServiceImpl implements HeapSplitService {
v.setNum(BigDecimal.ZERO); v.setNum(BigDecimal.ZERO);
v.setHeapNum(BigDecimal.ZERO); v.setHeapNum(BigDecimal.ZERO);
v.setProcessGroupNameList(new ArrayList<>()); v.setProcessGroupNameList(new ArrayList<>());
v.setComponentNameList(new ArrayList<>());
return v; return v;
}); });
// ===== 3. num 累加 ===== // ===== 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())); vo.setNum(vo.getNum().add(row.getNum()));
} }
@@ -337,6 +343,11 @@ public class HeapSplitServiceImpl implements HeapSplitService {
if (row.getProcessGroup() != null) { if (row.getProcessGroup() != null) {
vo.getProcessGroupNameList().add(row.getProcessGroup()); vo.getProcessGroupNameList().add(row.getProcessGroup());
} }
// ===== 6. 部件组(允许重复)=====
if (row.getComponentName() != null) {
vo.getComponentNameList().add(row.getComponentName());
}
} }
// ===== 7. 收尾处理 ===== // ===== 7. 收尾处理 =====
@@ -350,8 +361,17 @@ public class HeapSplitServiceImpl implements HeapSplitService {
vo.setProcessGroup(""); vo.setProcessGroup("");
} }
// ===== 部件组拼接 =====
List<String> componentNameList = vo.getComponentNameList();
if (CollUtil.isNotEmpty(componentNameList)) {
vo.setComponentName(String.join(",", componentNameList));
} else {
vo.setComponentName(null);
}
// 可释放内存 // 可释放内存
vo.setProcessGroupNameList(null); vo.setProcessGroupNameList(null);
vo.setComponentNameList(null);
// ===== multiSort 处理(柜体编号)===== // ===== multiSort 处理(柜体编号)=====
if (vo.getMultiNum() > 1) { if (vo.getMultiNum() > 1) {
@@ -6,6 +6,7 @@ import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil; 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.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -51,6 +52,7 @@ import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
@@ -444,7 +446,11 @@ public class PackServiceImpl implements PackService {
LambdaQueryWrapper<OrderItemDO> wrapper = new LambdaQueryWrapper<>(); 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) { if (isAdd) {
// 新增要查的是没打包的 // 新增要查的是没打包的
@@ -640,7 +646,7 @@ public class PackServiceImpl implements PackService {
item.setPackNum(item.getPackNum() + remain); item.setPackNum(item.getPackNum() + remain);
orderItemMapper.updateById(item); orderItemMapper.updateById(item);
// 新建分堆记录 // 新建打包记录
OrderItemDO newItem = buildPackItem(item, packNo, remain); OrderItemDO newItem = buildPackItem(item, packNo, remain);
orderItemMapper.insert(newItem); orderItemMapper.insert(newItem);
@@ -1206,13 +1212,15 @@ public class PackServiceImpl implements PackService {
// ===== 初始化 ===== // ===== 初始化 =====
newVo.setProcessGroupNameList(new ArrayList<>()); newVo.setProcessGroupNameList(new ArrayList<>());
newVo.setComponentNameList(new ArrayList<>());
newVo.setNum(BigDecimal.ZERO); newVo.setNum(BigDecimal.ZERO);
return newVo; return newVo;
}); });
// ===== 2. num 累加 ===== // ===== 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())); vo.setNum(vo.getNum().add(row.getNum()));
} }
@@ -1220,6 +1228,11 @@ public class PackServiceImpl implements PackService {
if (row.getProcessGroup() != null) { if (row.getProcessGroup() != null) {
vo.getProcessGroupNameList().add(row.getProcessGroup()); vo.getProcessGroupNameList().add(row.getProcessGroup());
} }
// ===== 4. 部件组(允许重复)=====
if (row.getComponentName() != null) {
vo.getComponentNameList().add(row.getComponentName());
}
} }
Collection<OrderPartsRespVO> values = map.values(); Collection<OrderPartsRespVO> values = map.values();
@@ -1233,8 +1246,17 @@ public class PackServiceImpl implements PackService {
vo.setProcessGroup(null); 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.setProcessGroupNameList(null);
vo.setComponentNameList(null);
// ===== multiSort 处理(柜体编号)===== // ===== multiSort 处理(柜体编号)=====
if (vo.getMultiNum() > 1) { if (vo.getMultiNum() > 1) {
@@ -1266,7 +1288,7 @@ public class PackServiceImpl implements PackService {
List<PackageDetailsRespVO> packPartsList = orderPartsMapper.selectPackedParts(orderIds, packageNo); List<PackageDetailsRespVO> packPartsList = orderPartsMapper.selectPackedParts(orderIds, packageNo);
Collection<PackageDetailsRespVO> resultList = buildPackPlateGroup(packPlateList); Collection<PackageDetailsRespVO> resultList = buildPackPlateGroup(packPlateList);
resultList.addAll(buildPackPartsGroup(packPartsList)); resultList.addAll(buildPackPartsGroup(orderIds, packPartsList));
return CollUtil.newArrayList(resultList); return CollUtil.newArrayList(resultList);
} }
@@ -1335,7 +1357,27 @@ public class PackServiceImpl implements PackService {
* @param parts * @param parts
* @return * @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<>(); Map<String, PackageDetailsRespVO> map = new LinkedHashMap<>();
for (PackageDetailsRespVO row : parts) { for (PackageDetailsRespVO row : parts) {
@@ -1351,7 +1393,6 @@ public class PackServiceImpl implements PackService {
BeanUtils.copyProperties(row, newVo); BeanUtils.copyProperties(row, newVo);
// ===== 初始化 ===== // ===== 初始化 =====
newVo.setProcessGroupNameList(new ArrayList<>());
newVo.setPackNum(BigDecimal.ZERO); newVo.setPackNum(BigDecimal.ZERO);
return newVo; return newVo;
@@ -1361,34 +1402,41 @@ public class PackServiceImpl implements PackService {
if (row.getPackNum() != null) { if (row.getPackNum() != null) {
vo.setPackNum(vo.getPackNum().add(row.getPackNum())); vo.setPackNum(vo.getPackNum().add(row.getPackNum()));
} }
// ===== 3. 加工组(允许重复)=====
if (row.getProcessGroup() != null) {
vo.getProcessGroupNameList().add(row.getProcessGroup());
}
} }
Collection<PackageDetailsRespVO> values = map.values(); Collection<PackageDetailsRespVO> values = map.values();
for (PackageDetailsRespVO vo : values) { for (PackageDetailsRespVO vo : values) {
// ===== 加工组拼接 ===== String key = vo.getPartsId()
List<String> processGroupNameList = vo.getProcessGroupNameList(); + "_" + vo.getRoomId()
if (CollUtil.isNotEmpty(processGroupNameList)) { + "_" + vo.getBodyId();
vo.setProcessGroup(String.join(",", processGroupNameList));
} else { List<PackageDetailsRespVO> relationList = relationMap.get(key);
vo.setProcessGroup(null);
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));
} }
// 可释放内存 if (ObjectUtil.isNotNull(vo.getMultiNum())
vo.setProcessGroupNameList(null); && vo.getMultiNum() > 1) {
// ===== multiSort 处理(柜体编号)=====
if (vo.getMultiNum() > 1) {
vo.setCabinetName( vo.setCabinetName(
vo.getCabinetName() + "-" + vo.getMultiSort() 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); List<PackageDetailsRespVO> packPlateList = orderPlateMapper.selectPackedPlateList(orderIds, packageNo);
Collection<PackageDetailsRespVO> resultList = buildPackPlateGroup(packPlateList); Collection<PackageDetailsRespVO> resultList = buildPackPlateGroup(packPlateList);
resultList.addAll(buildPackPartsGroup(packPartsList)); resultList.addAll(buildPackPartsGroup(orderIds, packPartsList));
return CollUtil.newArrayList(resultList); return CollUtil.newArrayList(resultList);
} }
@@ -303,9 +303,6 @@
ob.room_id AS roomId, ob.room_id AS roomId,
ob.id AS bodyId, ob.id AS bodyId,
og.name AS groupName,
oc.name AS componentName,
oi.pack_num AS packNum, oi.pack_num AS packNum,
oi.package_id AS packageId, oi.package_id AS packageId,
@@ -337,21 +334,11 @@
AND oi.organ_id = op.organ_id AND oi.organ_id = op.organ_id
AND oi.order_id = op.order_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 LEFT JOIN order_body ob
ON oi.organ_id = ob.organ_id ON oi.organ_id = ob.organ_id
AND oi.order_id = ob.order_id AND oi.order_id = ob.order_id
AND oi.body_id = ob.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 WHERE
oi.package_id = #{packageNo} oi.package_id = #{packageNo}
AND oi.parts_id != 0 AND oi.parts_id != 0
@@ -366,7 +353,47 @@
order by partsId order by partsId
</select> </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"> <resultMap id="PartsListMap" type="com.cf.imes.module.executor.controller.admin.manage.pack.vo.OrderPartsRespVO">
<result property="packageId" column="packageId"/> <result property="packageId" column="packageId"/>
@@ -410,6 +437,7 @@
ob.room_id AS roomId, ob.room_id AS roomId,
ob.id AS bodyId, ob.id AS bodyId,
og.name AS processGroup, og.name AS processGroup,
oi.group_id AS groupId,
oc.name AS componentName, oc.name AS componentName,
(oi.num - oi.pack_num) AS num, (oi.num - oi.pack_num) AS num,
ob.multi_num AS multiNum, ob.multi_num AS multiNum,
@@ -454,7 +482,6 @@
oi.parts_id != 0 oi.parts_id != 0
AND oi.package_id = 0 AND oi.package_id = 0
AND oi.source_id = 0 AND oi.source_id = 0
AND (oi.group_id != 0 or oi.group_id is null)
AND op.deleted = false AND op.deleted = false
AND op.type != '封边条' AND op.type != '封边条'
AND oi.order_id IN AND oi.order_id IN
@@ -474,6 +501,7 @@
ob.id AS bodyId, ob.id AS bodyId,
oi.heap_split_status AS heapSplitStatus, oi.heap_split_status AS heapSplitStatus,
oi.group_id AS groupId,
og.name AS processGroup, og.name AS processGroup,
oc.name AS componentName, oc.name AS componentName,