| | |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemPageReqVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemSaveReqVO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.category.MdmItemCategoryDO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemBatchConfigDO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemDO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.unit.MdmUnitMeasureDO; |
| | | import cn.iocoder.yudao.module.mdm.dal.mysql.item.MdmItemBatchConfigMapper; |
| | |
| | | /** |
| | | * MDM 物料主数据 Service 实现类 |
| | | * |
| | | * @author 芋道源码 |
| | | * @author 超级管理员 |
| | | */ |
| | | @Service |
| | | @Validated |
| | |
| | | // 保存批次配置(如果有) |
| | | saveBatchConfig(item.getId(), createReqVO); |
| | | |
| | | // 同步到 MES(勾选 syncMes 时) |
| | | createReqVO.setId(item.getId()); |
| | | // 勾选同步时,同步到 MES |
| | | if (Boolean.TRUE.equals(createReqVO.getSyncMes())) { |
| | | createReqVO.setId(item.getId()); |
| | | syncItemToMes(createReqVO); |
| | | } |
| | | return item.getId(); |
| | |
| | | // 保存批次配置(如果有) |
| | | saveBatchConfig(updateReqVO.getId(), updateReqVO); |
| | | |
| | | // 同步到 MES(勾选 syncMes 时) |
| | | // 根据同步开关决定:打开则同步到 MES,关闭则取消同步(从 MES 删除) |
| | | if (Boolean.TRUE.equals(updateReqVO.getSyncMes())) { |
| | | syncItemToMes(updateReqVO); |
| | | } else { |
| | | mesMdItemApi.deleteItem(updateReqVO.getId()); |
| | | } |
| | | } |
| | | |
| | |
| | | syncReqDTO.setMaxStock(reqVO.getMaxStock()); |
| | | syncReqDTO.setHighValue(reqVO.getIsHighValue()); |
| | | syncReqDTO.setBatchFlag(reqVO.getIsBatchManaged()); |
| | | syncReqDTO.setStatus(reqVO.getStatus()); |
| | | syncReqDTO.setRemark(reqVO.getRemark()); |
| | | // 批次配置字段 |
| | | syncReqDTO.setProduceDateFlag(reqVO.getProduceDateFlag()); |
| | |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updateItemStatus(Long id, Integer status) { |
| | | // 校验存在 |
| | | validateItemExists(id); |
| | | // 更新状态 |
| | | itemMapper.updateById(new MdmItemDO().setId(id).setStatus(status)); |
| | | // 同步状态到 MES |
| | | mesMdItemApi.updateItemStatus(id, status); |
| | | } |
| | | |
| | | @Override |
| | |
| | | public void deleteItem(Long id) { |
| | | // 校验存在 |
| | | MdmItemDO item = validateItemExists(id); |
| | | // 解决软删除唯一键冲突:如果已存在相同 code 且已软删除的记录,先物理删除它 |
| | | // MdmItemDO existingDeleted = itemMapper.selectByCodeAndDeleted(item.getCode(), true); |
| | | // if (existingDeleted != null && !existingDeleted.getId().equals(id)) { |
| | | // itemMapper.physicalDeleteById(existingDeleted.getId()); |
| | | // } |
| | | // 校验物料是否被业务引用 |
| | | validateItemNoReference(id); |
| | | // 软删除当前记录 |
| | | itemMapper.deleteById(id); |
| | | // 同步删除到 MES |
| | | mesMdItemApi.deleteItem(id); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updateItemSync(Long id, Boolean sync) { |
| | | // 校验存在 |
| | | MdmItemDO item = validateItemExists(id); |
| | | if (Boolean.TRUE.equals(sync)) { |
| | | // 同步到 MES:从 DB 读取完整物料数据组装后走 syncItemToMes |
| | | MdmItemSaveReqVO reqVO = BeanUtils.toBean(item, MdmItemSaveReqVO.class); |
| | | // DO 字段名为 highValue,与 VO 的 isHighValue 不自动匹配,手动补齐 |
| | | reqVO.setIsHighValue(item.getHighValue()); |
| | | // 补齐批次属性配置 |
| | | MdmItemBatchConfigDO config = itemBatchConfigMapper.selectOne( |
| | | MdmItemBatchConfigDO::getItemId, id); |
| | | if (config != null) { |
| | | reqVO.setProduceDateFlag(config.getProduceDateFlag()); |
| | | reqVO.setExpireDateFlag(config.getExpireDateFlag()); |
| | | reqVO.setReceiptDateFlag(config.getReceiptDateFlag()); |
| | | reqVO.setVendorFlag(config.getVendorFlag()); |
| | | reqVO.setPurchaseOrderCodeFlag(config.getPurchaseOrderCodeFlag()); |
| | | reqVO.setLotNumberFlag(config.getLotNumberFlag()); |
| | | reqVO.setQualityStatusFlag(config.getQualityStatusFlag()); |
| | | } |
| | | syncItemToMes(reqVO); |
| | | } else { |
| | | // 取消同步:从 MES 删除该物料(MES 无此物料时内部为空操作) |
| | | mesMdItemApi.deleteItem(id); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 校验物料未被业务引用(销售、采购、生产、质检、库存等) |
| | | * |
| | | * @param id 物料编号 |
| | | */ |
| | | private void validateItemNoReference(Long id) { |
| | | List<Map<String, Object>> references = itemMapper.selectItemReferenceCount(id); |
| | | if (CollUtil.isNotEmpty(references)) { |
| | | String refDesc = references.stream() |
| | | .map(r -> r.get("source") + "(" + r.get("cnt") + ")") |
| | | .collect(Collectors.joining("、")); |
| | | throw exception(MDM_ITEM_EXISTS_REFERENCE, refDesc); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | |
| | | return itemMapper.selectByCode(code); |
| | | } |
| | | |
| | | @Override |
| | | public List<MdmItemDO> getItemSimpleList() { |
| | | return itemMapper.selectList(MdmItemDO::getStatus, |
| | | cn.iocoder.yudao.framework.common.enums.CommonStatusEnum.ENABLE.getStatus()); |
| | | } |
| | | |
| | | /** |
| | | * 保存批次配置(到 MDM 本地表) |
| | | */ |