云
2026-10-27 ffca46b39d25439a06a27cafda2ec523a3fb67cf
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java
@@ -84,11 +84,16 @@
    }
    @Override
    public List<MesWmBatchDO> getBatchList(java.util.Collection<Long> ids) {
        return CollUtil.isEmpty(ids) ? java.util.Collections.emptyList() : batchMapper.selectByIds(ids);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public MesWmBatchDO getOrGenerateBatchCode(MesWmBatchGenerateReqVO reqVO) {
        // 1.1 查询物料信息,检查是否启用批次管理
        MesMdmItemDO item = mdmItemService.validateItemExists(reqVO.getItemId());
        if (Boolean.FALSE.equals(item.getIsBatchManaged())) {
        if (Boolean.FALSE.equals(item.getIsBatchManaged()) && StrUtil.isBlank(reqVO.getReelNo())) {
            // 未启用批次管理,返回 null
            return null;
        }
@@ -101,7 +106,8 @@
        MdmItemBatchConfigRespDTO config = itemBatchConfigApi.getItemBatchConfig(reqVO.getItemId());
        // 2. 根据配置校验必填参数并清空不需要的参数
        MesWmBatchDO batch = MesWmBatchDO.builder().itemId(reqVO.getItemId()).build();
        String reelNo = StrUtil.isBlank(reqVO.getReelNo()) ? null : reqVO.getReelNo();
        MesWmBatchDO batch = MesWmBatchDO.builder().itemId(reqVO.getItemId()).reelNo(reelNo).build();
        if (config != null) {
            // ========== 必填校验(flag=true 表示该字段为必填) ==========
            // 生产日期
@@ -214,6 +220,15 @@
                if (!existingBatch.getItemId().equals(reqVO.getItemId())) {
                    throw exception(WM_BATCH_ITEM_MISMATCH);
                }
                // 已有批次不能改变盘号,避免历史库存被误标或不同盘号混合。
                String existingReelNo = StrUtil.isBlank(existingBatch.getReelNo()) ? null : existingBatch.getReelNo();
                if (!ObjUtil.equal(existingReelNo, reelNo)) {
                    throw exception(WM_BATCH_REEL_MISMATCH);
                }
                if (existingReelNo != null && !ObjUtil.equal(existingBatch.getWorkOrderId(), reqVO.getWorkOrderId())) {
                    // 已有追溯批次不能被另一工单复用并覆盖来源。
                    throw exception(WM_BATCH_REEL_MISMATCH);
                }
                // 更新批次属性(仅更新传入的非空值)
                updateBatchProperties(existingBatch, batch);
                return existingBatch;