yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesLineServiceImpl.java
@@ -7,11 +7,13 @@
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.line.MesWmProductSalesLinePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.line.MesWmProductSalesLineSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesLineDO;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales.MesWmProductSalesLineMapper;
import cn.iocoder.yudao.module.mes.enums.qc.MesQcCheckResultEnum;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO;
@@ -25,6 +27,8 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
import java.util.Objects;
@@ -50,6 +54,8 @@
    @Resource
    private MesMdmItemService mdmItemService;
    @Resource
    private MesMdItemService mdItemService;
    @Resource
    private MesWmBatchService batchService;
    @Resource
    @Lazy
@@ -68,6 +74,7 @@
        // 新增
        MesWmProductSalesLineDO line = BeanUtils.toBean(createReqVO, MesWmProductSalesLineDO.class);
        line.setBoxCount(calculateBoxCount(line.getItemId(), line.getQuantity()));
        productSalesLineMapper.insert(line);
        return line.getId();
    }
@@ -82,6 +89,7 @@
        // 更新
        MesWmProductSalesLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductSalesLineDO.class);
        updateObj.setBoxCount(calculateBoxCount(updateObj.getItemId(), updateObj.getQuantity()));
        productSalesLineMapper.updateById(updateObj);
        // 检查是否需要创建 OQC 检验单:从不需要检验变为需要检验
@@ -167,6 +175,21 @@
    }
    /**
     * 按 数量 / 物料每箱数量 向上取整计算箱数;未维护每箱数量时返回 0
     */
    private int calculateBoxCount(Long itemId, BigDecimal quantity) {
        if (itemId == null || quantity == null) {
            return 0;
        }
        MesMdItemDO item = mdItemService.getItem(itemId);
        if (item == null || item.getBoxQuantity() == null
                || item.getBoxQuantity().compareTo(BigDecimal.ZERO) <= 0) {
            return 0;
        }
        return quantity.divide(item.getBoxQuantity(), 0, RoundingMode.CEILING).intValue();
    }
    /**
     * 根据 batchCode 解析 batchId
     */
    private void fillBatchId(MesWmProductSalesLineSaveReqVO reqVO) {