yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeServiceImpl.java
@@ -6,6 +6,7 @@
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice.vo.MesWmSalesNoticePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice.vo.MesWmSalesNoticeSaveReqVO;
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.dataobject.wm.salesnotice.MesWmSalesNoticeDO;
@@ -17,6 +18,7 @@
import cn.iocoder.yudao.module.mes.enums.wm.MesWmOutStatusEnum;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductSalesStatusEnum;
import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi;
import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi;
import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderItemRespDTO;
@@ -29,11 +31,14 @@
import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
import static cn.iocoder.yudao.module.mes.enums.wm.MesWmSalesNoticeStatusEnum.*;
@@ -64,6 +69,8 @@
    private MesWmProductSalesLineMapper productSalesLineMapper;
    @Resource
    private MesWmSalesNoticeLineMapper salesNoticeLineMapper;
    @Resource
    private MesMdItemService mdItemService;
    @Override
    public Long createSalesNotice(MesWmSalesNoticeSaveReqVO createReqVO) {
@@ -103,22 +110,12 @@
    @Override
    public MesWmSalesNoticeDO getSalesNotice(Long id) {
        MesWmSalesNoticeDO notice = salesNoticeMapper.selectById(id);
        // 校验客户权限
        if (notice != null && notice.getClientId() != null) {
            List<Long> permittedIds = customerApi.getPermittedCustomerIds();
            if (permittedIds != null && !permittedIds.contains(notice.getClientId())) {
                return null; // 无权限则返回 null
            }
        }
        return notice;
        return salesNoticeMapper.selectById(id);
    }
    @Override
    public PageResult<MesWmSalesNoticeDO> getSalesNoticePage(MesWmSalesNoticePageReqVO pageReqVO) {
        // 获取用户有权限的客户 ID 列表
        List<Long> permittedClientIds = customerApi.getPermittedCustomerIds();
        return salesNoticeMapper.selectPage(pageReqVO, permittedClientIds);
        return salesNoticeMapper.selectPage(pageReqVO, (List<Long>) null);
    }
    @Override
@@ -362,6 +359,8 @@
        productSalesMapper.insert(productSales);
        // 6. 遍历发货通知单行创建销售出库单行
        Map<Long, MesMdItemDO> itemMap = mdItemService.getItemMap(
                convertSet(noticeLines, MesWmSalesNoticeLineDO::getItemId));
        for (MesWmSalesNoticeLineDO noticeLine : noticeLines) {
            MesWmProductSalesLineDO salesLine = new MesWmProductSalesLineDO();
            salesLine.setSalesId(productSales.getId());
@@ -372,6 +371,14 @@
            salesLine.setBatchId(noticeLine.getBatchId());
            salesLine.setBatchCode(noticeLine.getBatchCode());
            salesLine.setOqcCheckFlag(noticeLine.getOqcCheckFlag());
            // 按 数量 / 物料每箱数量 向上取整计算箱数;未维护每箱数量时记 0
            MesMdItemDO item = itemMap.get(noticeLine.getItemId());
            if (item != null && item.getBoxQuantity() != null
                    && item.getBoxQuantity().compareTo(BigDecimal.ZERO) > 0
                    && noticeLine.getQuantity() != null) {
                salesLine.setBoxCount(noticeLine.getQuantity()
                        .divide(item.getBoxQuantity(), 0, RoundingMode.CEILING).intValue());
            }
            productSalesLineMapper.insert(salesLine);
        }