yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/MesWmPackageLineController.java
@@ -11,8 +11,10 @@
import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.packages.MesWmPackageLineDO;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
@@ -27,6 +29,7 @@
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -49,6 +52,8 @@
        private MdmUnitMeasureApi mdmUnitMeasureApi;
        @Resource
        private MesProWorkOrderService workOrderService;
        @Resource
        private MesMdItemService mdItemService;
        @PostMapping("/create")
        @Operation(summary = "创建装箱明细")
@@ -109,6 +114,9 @@
                // 批量查询工单
                Map<Long, MesProWorkOrderDO> workOrderMap = workOrderService.getWorkOrderMap(
                                convertSet(list, MesWmPackageLineDO::getWorkOrderId));
                // 批量查询 MES 物料(取每箱数量,计算尾箱数量)
                Map<Long, MesMdItemDO> mdItemMap = mdItemService.getItemMap(
                                convertSet(list, MesWmPackageLineDO::getItemId));
                // 拼接数据
                return BeanUtils.toBean(list, MesWmPackageLineRespVO.class, vo -> {
                        MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
@@ -120,6 +128,21 @@
                        MapUtils.findAndThen(workOrderMap, vo.getWorkOrderId(),
                                        workOrder -> vo.setWorkOrderCode(workOrder.getCode())
                                                        .setBatchCode(workOrder.getBatchCode()));
                        // 尾箱数量:最后一箱实际装的数量;刚好整箱时取每箱数量,并标记满装
                        MapUtils.findAndThen(mdItemMap, vo.getItemId(), item -> {
                                BigDecimal boxQuantity = item.getBoxQuantity();
                                if (boxQuantity == null || boxQuantity.compareTo(BigDecimal.ZERO) <= 0
                                                || vo.getQuantity() == null) {
                                        return;
                                }
                                BigDecimal remainder = vo.getQuantity().remainder(boxQuantity);
                                boolean full = remainder.compareTo(BigDecimal.ZERO) == 0;
                                BigDecimal tailBoxQuantity = (full ? boxQuantity : remainder).stripTrailingZeros();
                                if (tailBoxQuantity.scale() < 0) {
                                        tailBoxQuantity = tailBoxQuantity.setScale(0);
                                }
                                vo.setTailBoxQuantity(tailBoxQuantity).setTailBoxFull(full);
                        });
                });
        }