7 小时以前 e85a60b1778ed442545c00e14bbfe4f8d33c68ac
fix(mes): 解决生产反馈和物料消耗服务中的潜在异常问题

- 在创建生产反馈时强制清空ID字段,防止前端误传已有主键导致冲突
- 为物料消耗服务添加日志记录功能
- 在物料消耗处理中增加物料主数据校验,避免因BOM引用已删除或未同步物料导致的NPE异常
- 当物料主数据缺失时跳过该行处理并记录警告日志,确保其他正常数据继续处理
已修改2个文件
10 ■■■■■ 文件已修改
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemconsume/MesWmItemConsumeServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java
@@ -118,8 +118,9 @@
        // 1. 校验
        MesProTaskDO task = validateFeedbackData(createReqVO);
        // 2. 插入(自动填充 itemId)
        // 2. 插入(自动填充 itemId;创建时强制清空 id,防止前端误传已有主键导致冲突)
        MesProFeedbackDO feedback = BeanUtils.toBean(createReqVO, MesProFeedbackDO.class)
                .setId(null)
                .setStatus(MesProFeedbackStatusEnum.PREPARE.getStatus())
                .setItemId(task.getItemId());
        feedbackMapper.insert(feedback);
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemconsume/MesWmItemConsumeServiceImpl.java
@@ -27,6 +27,7 @@
import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
@@ -48,6 +49,7 @@
 */
@Service
@Validated
@Slf4j
public class MesWmItemConsumeServiceImpl implements MesWmItemConsumeService {
    @Resource
@@ -181,6 +183,11 @@
        // 2. 遍历明细,创建库存事务(按批次精确扣减线边库)
        for (MesWmItemConsumeDetailDO detail : details) {
            MesMdItemDO item = mesMdItemService.getItem(detail.getItemId());
            // 物料主数据缺失(BOM 引用了已删除/未同步的物料)时跳过该行,避免 NPE 阻断报工
            if (item == null || item.getMdmItemId() == null) {
                log.warn("[finishItemConsume] 消耗明细({}) 物料({}) 在 mes_md_item 中不存在,跳过扣库", detail.getId(), detail.getItemId());
                continue;
            }
            wmTransactionService.createTransaction(new MesWmTransactionSaveReqDTO()
                    .setType(MesWmTransactionTypeEnum.OUT.getType())
                    .setItemId(item.getMdmItemId())