昨天 c89f7dcf9344a35efde2a00edb10491b401ba000
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java
@@ -4,18 +4,21 @@
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchFlowRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchGenerateReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchProcessTraceRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchPurchaseSourceRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchSalesTargetRespVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.sn.MesWmSnDO;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.batch.MesWmBatchMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.sn.MesWmSnMapper;
import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants;
import cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodeRuleCodeEnum;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
import cn.iocoder.yudao.module.mes.service.wm.barcode.MesWmBarcodeService;
@@ -407,6 +410,11 @@
    }
    @Override
    public List<MesWmBatchFlowRespVO> getBatchFlowList(String code) {
        return batchMapper.selectBatchFlowList(code);
    }
    @Override
    public MesWmBatchDO getBatchBySn(String sn) {
        MesWmSnDO snDO = snMapper.selectOne(MesWmSnDO::getCode, sn);
        if (snDO == null || StrUtil.isBlank(snDO.getBatchCode())) {
@@ -415,4 +423,36 @@
        return batchMapper.selectByCode(snDO.getBatchCode());
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public MesWmBatchDO getOrCreateByProBatch(MesProBatchDO proBatch) {
        if (proBatch == null || StrUtil.isBlank(proBatch.getCode())) {
            return null;
        }
        // 1. 优先按生产批次 ID 复用,兼容历史数据再按批次号匹配
        MesWmBatchDO existing = batchMapper.selectOne(MesWmBatchDO::getProBatchId, proBatch.getId());
        if (existing == null) {
            existing = batchMapper.selectByCode(proBatch.getCode());
        }
        if (existing != null) {
            if (existing.getProBatchId() == null && proBatch.getId() != null) {
                existing.setProBatchId(proBatch.getId());
                batchMapper.updateById(existing);
            }
            return existing;
        }
        // 2. 新建仓库批次:以生产批次号作为仓库批次号,质量状态置为待检验
        MesWmBatchDO batch = MesWmBatchDO.builder()
                .proBatchId(proBatch.getId())
                .code(proBatch.getCode())
                .itemId(proBatch.getItemId())
                .produceDate(proBatch.getProduceDate())
                .receiptDate(java.time.LocalDateTime.now())
                .qualityStatus(MesWmQualityStatusEnum.PENDING.getStatus())
                .remark("生产批次自动桥接")
                .build();
        batchMapper.insert(batch);
        return batch;
    }
}