diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PackRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PackRespVO.java index eed6b39cf..5113a0646 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PackRespVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PackRespVO.java @@ -77,19 +77,18 @@ public class PackRespVO { @Schema(description = "创建时间") private LocalDateTime createTime; - @Schema(description = "板件数量") - private Integer plateNum; - @Schema(description = "已打包数-包裹数") - private Long packCount; + private Integer packCount; + @Schema(description = "已打包板件数") + private Integer packedPlatesCount; - @Schema(description = "已打包片数-已处理量") - private Long packPieceCount; + @Schema(description = "已打包配件数") + private Integer packedPartsCount; @Schema(description = "总片数-板件总数") - private Long totalPieceCount; + private Integer totalPieceCount; @Schema(description = "待处理量") diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/order/OrderDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/order/OrderDO.java index 11c12d9fc..3a521b09b 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/order/OrderDO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/order/OrderDO.java @@ -152,6 +152,16 @@ public class OrderDO extends BaseDO { */ private int version; + /** + * 已打包板件数 + */ + private Integer packedPlatesCount; + + /** + * 已打包配件数 + */ + private Integer packedPartsCount; + /** * 子单列表 */ diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/order/OrderPackNumDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/order/OrderPackNumDO.java new file mode 100644 index 000000000..775116531 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/order/OrderPackNumDO.java @@ -0,0 +1,33 @@ +package com.cf.imes.module.executor.dal.dataobject.order; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 订单已打包数统计 DO + * + * @author Gqr + * @since 2026/5/8 10:55 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class OrderPackNumDO { + /** + * 订单id + */ + private Long orderId; + + /** + * 已打包板件数量 + */ + private Integer plateNum; + + /** + * 已打包配件数量 + */ + private Integer partsNum; +} \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java index c8f037d57..14c127d97 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java @@ -23,6 +23,7 @@ import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPlanPlat import com.cf.imes.module.executor.controller.admin.plan.bo.OrderIds; import com.cf.imes.module.executor.controller.admin.plan.vo.*; import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; +import com.cf.imes.module.executor.dal.dataobject.order.OrderPackNumDO; import com.cf.imes.module.executor.dal.dataobject.order.OrderPlateNumAndAreaDO; import com.cf.imes.module.executor.enums.OrderDeletedEnum; import com.cf.imes.module.executor.enums.OrderStatusEnum; @@ -343,4 +344,20 @@ public interface OrderMapper extends BaseMapperX { * @return */ OrderPlateNumAndAreaDO selectPlateNumAndArea(@Param("orderId") Long orderId, @Param("delete") Boolean delete); + + /** + * 查询订单列表对应的已打包数 + * + * @param orderIds + * @return + */ + List selectPackPlateNum(@Param("orderIds") Collection orderIds); + + /** + * 查询订单列表对应的已打包数 + * + * @param orderIds + * @return + */ + List selectPackPartsNum(@Param("orderIds") Collection orderIds); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/pack/PackServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/pack/PackServiceImpl.java index 101378a1f..58cb10bfb 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/pack/PackServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/pack/PackServiceImpl.java @@ -17,7 +17,6 @@ import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.common.util.Assert.AssertUtils; import com.cf.imes.framework.id.core.util.SnowflakeIdWorker3rd; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; import com.cf.imes.module.executor.api.plan.OrderPlanApi; import com.cf.imes.module.executor.controller.admin.manage.pack.vo.*; import com.cf.imes.module.executor.controller.admin.manage.query.vo.pack.OrderPackageVO; @@ -34,6 +33,7 @@ import com.cf.imes.module.executor.dal.mysql.pack.OrderPackageMapper; import com.cf.imes.module.executor.dal.mysql.plate.PlateMapper; import com.cf.imes.module.executor.enums.OrderPackageMethodEnum; import com.cf.imes.module.executor.enums.pack.PackScanComponentCorrelationTypeEnum; +import com.cf.imes.module.executor.service.order.OrderInfoVersionControlService; import com.cf.imes.module.executor.service.order.OrderService; import com.cf.imes.module.executor.service.orderParts.OrderPartsService; import com.cf.imes.module.executor.service.ordercomponent.OrderComponentService; @@ -113,6 +113,9 @@ public class PackServiceImpl implements PackService { @Resource private OrderComponentService orderComponentService; + @Resource + private OrderInfoVersionControlService orderInfoVersionControlService; + // 打包分页查询 @Override public PageResult getPackPage(PackPageReqVO pageReqVO) { @@ -218,7 +221,7 @@ public class PackServiceImpl implements PackService { @Override @Transactional(rollbackFor = Exception.class) public OrderPackRespVO updatePack(OrderPackReqVO packageVO) { - Long organId = SecurityFrameworkUtils.getUserOrganId(); + Long organId = getUserOrganId(); String packNo = packageVO.getPackNo(); List orderIds = packageVO.getOrderIds(); List addPlateNos = packageVO.getAddPlateNoList(); @@ -269,14 +272,17 @@ public class PackServiceImpl implements PackService { processParts(addPartsList, packMethod, orderIds, packageNo, true); // 更新订单打包状态 - for (Long orderId : orderIds) { - if (validateOrderPack(orderId)) { + List orderDOS = ordersMapper.selectBatchIds(orderIds); + for (OrderDO orderDO : orderDOS) { + if (validateOrderPack(orderDO.getId())) { // 修改订单的打包状态 PackServiceImpl p = (PackServiceImpl) AopContext.currentProxy(); - p.updateOrderStatus(orderId); + p.updateOrderStatus(orderDO); } } + // 更新已打包数量到订单 + orderInfoVersionControlService.updateOrderPackNum(orderDOS); return typeConversion(orderPackageDOS.get(0), orderIds); } @@ -346,14 +352,17 @@ public class PackServiceImpl implements PackService { // 更新订单打包状态 - for (Long orderId : orderIds) { - if (validateOrderPack(orderId)) { + List orderDOS = ordersMapper.selectBatchIds(orderIds); + for (OrderDO orderDO : orderDOS) { + if (validateOrderPack(orderDO.getId())) { // 修改订单的打包状态 PackServiceImpl p = (PackServiceImpl) AopContext.currentProxy(); - p.updateOrderStatus(orderId); + p.updateOrderStatus(orderDO); } } + // 更新已打包数量到订单 + orderInfoVersionControlService.updateOrderPackNum(orderDOS); return typeConversion(existPackageDO, orderIds); @@ -617,7 +626,7 @@ public class PackServiceImpl implements PackService { OrderItemDO newItem = new OrderItemDO(); // 基础字段复制(建议用BeanUtils) - org.springframework.beans.BeanUtils.copyProperties(source, newItem); + BeanUtils.copyProperties(source, newItem); newItem.setId(null); // 新ID newItem.setPackNum(packNum); @@ -650,10 +659,8 @@ public class PackServiceImpl implements PackService { // 修改当前订单的工序状态和订单的状态 @Transactional(rollbackFor = Exception.class) - public void updateOrderStatus(Long orderId) { - - OrderDO orderDO = ordersMapper.selectById(orderId); - + public OrderDO updateOrderStatus(OrderDO orderDO) { + Long orderId = orderDO.getId(); // 修改订单的打包状态为已打包 orderDO.setPackaged(OrderPackageStatusEnum.PACKAGED.getStatus()); @@ -667,8 +674,7 @@ public class PackServiceImpl implements PackService { ordersMapper.updateById(orderDO); - - + return orderDO; } @@ -690,6 +696,8 @@ public class PackServiceImpl implements PackService { Long packageNo = reqVO.getPackageNo(); List orderIds = reqVO.getOrderIds(); + List orderDOS = ordersMapper.selectBatchIds(orderIds); + List orderPackagDOS = orderPackageMapper.selectList(new LambdaQueryWrapper() .eq(OrderPackagDO::getPackageNo, packageNo) .in(OrderPackagDO::getOrderId, orderIds) @@ -827,6 +835,9 @@ public class PackServiceImpl implements PackService { .eq(OrderDO::getPackaged, OrderPackageStatusEnum.PACKAGED.getStatus()) .set(OrderDO::getPackaged, OrderPackageStatusEnum.UNPACKED.getStatus()) ); + + // 更新已打包数量到订单 + orderInfoVersionControlService.updateOrderPackNum(orderDOS); } // 生成包裹编号 @@ -940,9 +951,12 @@ public class PackServiceImpl implements PackService { .orderByDesc(OrderDO::getId) ); if (CollUtil.isNotEmpty(childList)) { - List childOrdersPackList = BeanUtil.copyToList(childList, PackRespVO.class); - orderIds.addAll(childOrdersPackList.stream().map(PackRespVO::getId).toList()); - packRespVOS.getRecords().addAll(childOrdersPackList); + for (OrderDO child : childList) { + PackRespVO childPackRespVO = BeanUtil.copyProperties(child, PackRespVO.class); + childPackRespVO.setTotalPieceCount(child.getPlateNum()); + packRespVOS.getRecords().add(childPackRespVO); + orderIds.add(childPackRespVO.getId()); + } } return buildPageResult(orderIds, packRespVOS); @@ -966,20 +980,9 @@ public class PackServiceImpl implements PackService { // 查询当前生产的包裹数量 List orderPackNumGroup = orderPackageMapper.selectPackPage(orderIds, getUserOrganId()); - - // 查询当前订单已经打包的板材数量 - List orderPackedPlateNumGroup = orderPackageMapper.selectPackPieceCount(orderIds, getUserOrganId()); - for (PackRespVO vosRecord : records) { - - // 板材总数 - vosRecord.setTotalPieceCount(vosRecord.getPlateNum().longValue()); // 已打包裹数 - vosRecord.setPackCount(orderPackNumGroup.stream().filter(f -> Objects.equals(f.getId(), vosRecord.getId())).mapToLong(PackRespVO::getPackCount).sum()); - // 已打包片数 - vosRecord.setPackPieceCount(orderPackedPlateNumGroup.stream().filter(f -> Objects.equals(f.getId(), vosRecord.getId())).mapToLong(PackRespVO::getPackPieceCount).sum()); - // 待处理量 - vosRecord.setPendingNum(vosRecord.getTotalPieceCount() - vosRecord.getPackPieceCount()); + vosRecord.setPackCount(orderPackNumGroup.stream().filter(f -> Objects.equals(f.getId(), vosRecord.getId())).mapToInt(PackRespVO::getPackCount).sum()); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java index ce6d5555a..8cf419c79 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java @@ -84,6 +84,7 @@ import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.atomic.AtomicLong; +import java.util.function.Function; import java.util.stream.Collectors; import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.DATA_DATA_ERROR; @@ -796,14 +797,55 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { AssertUtils.notEmpty(plateDetailRespVOS,ORDER_PLATE_MODEL_DATE_ERROR); return OrderSource.builder() - .orderList(orderDOS) + .orderList(buildTree(orderDOS)) .goodsList(goodsReqVOS) .plateList(plateDetailRespVOS) -// .plateModels(orderModelDOS) + .plateModels(Collections.emptyList()) .build(); } + /** + * 将订单列表整理成父子结构 + * 规则: + * 1. parentId = 0 的为父级 + * 2. 子级通过 parentId 关联父级 id + * 3. 只有一层父子关系 + */ + public List buildTree(List orderList) { + + if (orderList == null || orderList.isEmpty()) { + return Collections.emptyList(); + } + + // 父级Map + Map parentMap = orderList.stream() + .filter(order -> order.getParentId() == 0) + .collect(Collectors.toMap(OrderDO::getId, Function.identity())); + + // 初始化child + parentMap.values().forEach(order -> order.setChild(new ArrayList<>())); + + List result = new ArrayList<>(); + + for (OrderDO order : orderList) { + + // 顶级 + if (order.getParentId() == 0) { + result.add(order); + continue; + } + + // 子级挂到父级 + OrderDO parent = parentMap.get(order.getParentId()); + if (parent != null) { + parent.getChild().add(order); + } + } + + return result; + } + /** * 分页获取订单ids下的es.orderModels数据 * diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderInfoVersionControlService.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderInfoVersionControlService.java index 6a8e45cc9..9e95b12b8 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderInfoVersionControlService.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderInfoVersionControlService.java @@ -3,6 +3,7 @@ package com.cf.imes.module.executor.service.order; import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; import java.util.Collection; +import java.util.List; /** * 订单信息版本控制服务 Service @@ -34,4 +35,11 @@ public interface OrderInfoVersionControlService { * @param delete */ void updateOrderGoodsPlateNumAndArea(Collection orderGoodsIds, Boolean delete); + + /** + * 更新订单的已打包板件数 + * + * @param orderDOS + */ + void updateOrderPackNum(List orderDOS); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderInfoVersionControlServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderInfoVersionControlServiceImpl.java index 5d1dfcd0a..4118a6101 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderInfoVersionControlServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderInfoVersionControlServiceImpl.java @@ -1,11 +1,14 @@ package com.cf.imes.module.executor.service.order; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.framework.mybatis.core.query.LambdaUpdateWrapperX; import com.cf.imes.module.executor.dal.dataobject.goods.GoodsDO; import com.cf.imes.module.executor.dal.dataobject.goods.OrderGoodsPlateNumAndAreaDO; import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; +import com.cf.imes.module.executor.dal.dataobject.order.OrderPackNumDO; import com.cf.imes.module.executor.dal.dataobject.order.OrderPlateNumAndAreaDO; import com.cf.imes.module.executor.dal.dataobject.orderBody.OrderBodyDO; import com.cf.imes.module.executor.dal.dataobject.orderBody.OrderBodyPlateNumDO; @@ -19,6 +22,8 @@ import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.Collection; +import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; @@ -137,4 +142,45 @@ public class OrderInfoVersionControlServiceImpl implements OrderInfoVersionContr } } } + + @Override + public void updateOrderPackNum(List orderDOS) { + List orderIds = orderDOS.stream().map(OrderDO::getId).collect(Collectors.toList()); + Map orderMap = orderDOS.stream() + .collect(Collectors.toMap(OrderDO::getId, Function.identity())); + + List orderPackPlateNumDOS = orderMapper.selectPackPlateNum(orderIds); + List orderPackPartsNumDOS = orderMapper.selectPackPartsNum(orderIds); + Map orderPackPartsNumMap = new HashMap<>(); + if (CollUtil.isNotEmpty(orderPackPartsNumDOS)) { + orderPackPartsNumMap = orderPackPartsNumDOS.stream() + .collect(Collectors.toMap(OrderPackNumDO::getOrderId, OrderPackNumDO::getPartsNum)); + } + + for (OrderPackNumDO orderPackPlateNumDO : orderPackPlateNumDOS) { + Long orderId = orderPackPlateNumDO.getOrderId(); + // 当前订单下已打包板件 + Integer plateNum = orderPackPlateNumDO.getPlateNum(); + // 当前订单下已打包配件 + Integer partsNum = orderPackPartsNumMap.getOrDefault(orderId, 0); + + OrderDO orderDO = orderMap.get(orderId); + + if (ObjectUtil.isNull(orderDO)) { + continue; + } + int version = orderDO.getVersion(); + // 更新数量 + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapperX() + .eq(OrderDO::getId, orderId) + .eq(OrderDO::getVersion, version) + .set(OrderDO::getPackedPlatesCount, plateNum) + .set(OrderDO::getPackedPartsCount, partsNum) + .set(OrderDO::getVersion, version + 1); + int update = orderMapper.update(updateWrapper); + if (update == 0) { + throw new ServiceException(com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_PLATE_UPDATE_CONCURRENCY_ERROR, orderId); + } + } + } } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderMapper.xml index 0df6c1eb7..23f75f7d9 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderMapper.xml @@ -502,8 +502,8 @@ - - + + @@ -559,7 +559,9 @@ splitter as splitter, packaged as packaged, remark as remark, - plate_num as plateNum + plate_num as totalPieceCount, + packed_plates_count as packedPlatesCount, + packed_parts_count as packedPartsCount from orders @@ -650,4 +652,37 @@ and o.deleted = false + + + \ No newline at end of file