liu
4 天以前 381e02b9eccbe953b31d09f2af1c2ce77c816140
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java
@@ -2,6 +2,7 @@
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemPageReqVO;
@@ -37,7 +38,7 @@
 *
 * 支持 MES 和 MDM 物料数据双向同步
 *
 * @author 芋道源码
 * @author 超级管理员
 */
@Service
@Validated
@@ -80,11 +81,19 @@
                updateItem(createReqVO);
                return createReqVO.getId();
            }
            // 存在逻辑删除记录(取消同步后重新同步):恢复该记录后走更新,避免主键冲突
            if (itemMapper.selectAnyById(createReqVO.getId()) != null) {
                itemMapper.restoreById(createReqVO.getId());
                updateItem(createReqVO);
                return createReqVO.getId();
            }
        }
        // 插入
        MesMdItemDO item = BeanUtils.toBean(createReqVO, MesMdItemDO.class);
        item.setStatus(CommonStatusEnum.DISABLE.getStatus()); // 默认禁用。信息完成后,再启用
        // 状态只能由基础数据(MDM)控制:MDM 同步时沿用其状态;MES 本地新增默认禁用
        item.setStatus(createReqVO.getMdmItemId() != null && createReqVO.getStatus() != null
                ? createReqVO.getStatus() : CommonStatusEnum.DISABLE.getStatus());
        clearStockIfNotSafe(item); // 如果未启用安全库存,清零库存上下限
        itemMapper.insert(item);
@@ -111,6 +120,10 @@
        // 更新
        MesMdItemDO updateObj = BeanUtils.toBean(updateReqVO, MesMdItemDO.class);
        clearStockIfNotSafe(updateObj); // 如果未启用安全库存,清零库存上下限
        // 状态只能由基础数据(MDM)控制,MES 本地更新不允许修改状态
        if (updateReqVO.getMdmItemId() == null) {
            updateObj.setStatus(null);
        }
        itemMapper.updateById(updateObj);
        // 同步到 MDM(勾选 syncMdm 时)
@@ -123,8 +136,10 @@
    private void validateItemSaveData(MesMdItemSaveReqVO reqVO) {
        // 校验物料编码的唯一性
        validateItemCodeUnique(reqVO.getId(), reqVO.getCode());
        // 校验物料名称的唯一性
        validateItemNameUnique(reqVO.getId(), reqVO.getName());
        // 校验物料名称的唯一性:MDM 主数据以编码为唯一标识,允许同名不同规格
        if (reqVO.getMdmItemId() == null) {
            validateItemNameUnique(reqVO.getId(), reqVO.getName());
        }
        // 校验物料分类存在
        validateItemTypeExists(reqVO.getItemTypeId());
        // 校验计量单位存在
@@ -200,11 +215,9 @@
    }
    private void validateItemNameUnique(Long id, String name) {
        MesMdItemDO item = itemMapper.selectByName(name);
        if (item == null) {
            return;
        }
        if (ObjUtil.notEqual(item.getId(), id)) {
        // 使用列表查询:存量数据可能存在同名物料,避免 selectOne 直接抛异常
        List<MesMdItemDO> items = itemMapper.selectList(MesMdItemDO::getName, name);
        if (items.stream().anyMatch(item -> ObjUtil.notEqual(item.getId(), id))) {
            throw exception(MD_ITEM_NAME_DUPLICATE);
        }
    }
@@ -278,8 +291,19 @@
            List<MesMdItemTypeDO> children = itemTypeService.getItemTypeChildrenList(pageReqVO.getItemTypeId());
            itemTypeIds.addAll(convertSet(children, MesMdItemTypeDO::getId));
        }
        // 生产物料管理等页面可按分类编码排除设备及其子分类;底层设备主数据仍保留给设备仓和库存流水使用。
        Set<Long> excludedItemTypeIds = null;
        if (StrUtil.isNotBlank(pageReqVO.getExcludeItemTypeCode())) {
            MesMdItemTypeDO excludedType = itemTypeService.getItemTypeByCode(pageReqVO.getExcludeItemTypeCode());
            if (excludedType != null) {
                excludedItemTypeIds = new HashSet<>();
                excludedItemTypeIds.add(excludedType.getId());
                List<MesMdItemTypeDO> children = itemTypeService.getItemTypeChildrenList(excludedType.getId());
                excludedItemTypeIds.addAll(convertSet(children, MesMdItemTypeDO::getId));
            }
        }
        // 分页查询
        return itemMapper.selectPage(pageReqVO, itemTypeIds);
        return itemMapper.selectPage(pageReqVO, itemTypeIds, excludedItemTypeIds);
    }
    @Override
@@ -407,4 +431,4 @@
        return item;
    }
}
}