yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageServiceImpl.java
@@ -8,6 +8,9 @@
import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.MesWmPackagePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.MesWmPackageSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.packages.MesWmPackageDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.packages.MesWmPackageLineDO;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.workorder.MesProWorkOrderMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.packages.MesWmPackageLineMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.packages.MesWmPackageMapper;
import cn.iocoder.yudao.module.mes.enums.wm.BarcodeBizTypeEnum;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmPackageStatusEnum;
@@ -17,8 +20,11 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
@@ -38,6 +44,10 @@
    @Resource
    private MesWmPackageLineService packageLineService;
    @Resource
    private MesWmPackageLineMapper packageLineMapper;
    @Resource
    private MesProWorkOrderMapper workOrderMapper;
    @Resource
    private MesWmBarcodeService barcodeService;
    @Resource
@@ -100,6 +110,7 @@
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void finishPackage(Long id) {
        // 校验存在且为草稿
        validatePackageExistsAndDraft(id);
@@ -107,6 +118,23 @@
        // 更新状态为已完成
        packageMapper.updateById(new MesWmPackageDO()
                .setId(id).setStatus(MesWmPackageStatusEnum.FINISHED.getStatus()));
        // 按生产工单汇总本次装箱数量与箱数,累加到工单并重算装箱状态
        Map<Long, List<MesWmPackageLineDO>> linesByWorkOrder = packageLineMapper.selectListByPackageId(id).stream()
                .filter(line -> line.getWorkOrderId() != null)
                .collect(Collectors.groupingBy(MesWmPackageLineDO::getWorkOrderId));
        linesByWorkOrder.forEach((workOrderId, lines) -> {
            BigDecimal quantity = lines.stream()
                    .map(MesWmPackageLineDO::getQuantity)
                    .filter(Objects::nonNull)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            int boxCount = lines.stream()
                    .map(MesWmPackageLineDO::getBoxCount)
                    .filter(Objects::nonNull)
                    .mapToInt(Integer::intValue).sum();
            workOrderMapper.updatePackedQuantity(workOrderId, quantity, boxCount);
            workOrderMapper.updatePackingStatus(workOrderId);
        });
    }
    @Override