| | |
| | | |
| | | 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; |
| | |
| | | * |
| | | * 支持 MES 和 MDM 物料数据双向同步 |
| | | * |
| | | * @author 芋道源码 |
| | | * @author 超级管理员 |
| | | */ |
| | | @Service |
| | | @Validated |
| | |
| | | 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); |
| | | |
| | |
| | | // 更新 |
| | | MesMdItemDO updateObj = BeanUtils.toBean(updateReqVO, MesMdItemDO.class); |
| | | clearStockIfNotSafe(updateObj); // 如果未启用安全库存,清零库存上下限 |
| | | // 状态只能由基础数据(MDM)控制,MES 本地更新不允许修改状态 |
| | | if (updateReqVO.getMdmItemId() == null) { |
| | | updateObj.setStatus(null); |
| | | } |
| | | itemMapper.updateById(updateObj); |
| | | |
| | | // 同步到 MDM(勾选 syncMdm 时) |
| | |
| | | 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()); |
| | | // 校验计量单位存在 |
| | |
| | | } |
| | | |
| | | 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); |
| | | } |
| | | } |
| | |
| | | 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 |
| | |
| | | return item; |
| | | } |
| | | |
| | | } |
| | | } |