package cn.iocoder.yudao.module.mes.service.md.item; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.batchconfig.MesMdItemBatchConfigSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemBatchConfigDO; import cn.iocoder.yudao.module.mes.dal.mysql.md.item.MesMdItemBatchConfigMapper; import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi; import cn.iocoder.yudao.module.mdm.api.item.MdmItemBatchConfigApi; import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemBatchConfigRespDTO; import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemBatchConfigDO; import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.MD_ITEM_BATCH_CONFIG_NOT_EXISTS; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.MD_ITEM_NOT_EXISTS; /** * MES 物料批次属性配置 Service 实现类 * * 批次配置统一存储在 MDM 表(mdm_item_batch_config) * MES 本地表(mes_md_item_batch_config)仅用于兼容历史数据和 MES 模块内部查询 * * @author 芋道源码 */ @Service @Validated public class MesMdItemBatchConfigServiceImpl implements MesMdItemBatchConfigService { @Resource private MesMdItemBatchConfigMapper itemBatchConfigMapper; @Resource @Lazy private MesMdItemService itemService; @Resource @Lazy private MdmItemApi mdmItemApi; @Resource private MdmItemBatchConfigApi mdmItemBatchConfigApi; @Override public MesMdItemBatchConfigDO getItemBatchConfigByItemId(Long itemId) { // 优先从 MES 本地表查询(性能更好) MesMdItemBatchConfigDO mesConfig = itemBatchConfigMapper.selectByItemId(itemId); if (mesConfig != null) { return mesConfig; } // 本地表不存在,尝试从 MDM 获取(不写入本地,避免副作用) MdmItemBatchConfigRespDTO mdmConfig = mdmItemBatchConfigApi.getItemBatchConfig(itemId); if (mdmConfig != null) { return BeanUtils.toBean(mdmConfig, MesMdItemBatchConfigDO.class); } return null; } @Override public MesMdItemBatchConfigDO validateItemBatchConfigExists(Long itemId) { MesMdItemBatchConfigDO config = getItemBatchConfigByItemId(itemId); if (config == null) { throw exception(MD_ITEM_BATCH_CONFIG_NOT_EXISTS); } return config; } @Override @Transactional(rollbackFor = Exception.class) public Long saveItemBatchConfig(MesMdItemBatchConfigSaveReqVO saveReqVO) { // 1. 校验物料存在(从 MDM 校验) if (mdmItemApi.getItem(saveReqVO.getItemId()).getCheckedData() == null) { throw exception(MD_ITEM_NOT_EXISTS); } // 2. 清空不需要的字段(只保留必要的7个字段) MesMdItemBatchConfigSaveReqVO cleanReqVO = new MesMdItemBatchConfigSaveReqVO(); cleanReqVO.setId(saveReqVO.getId()); cleanReqVO.setItemId(saveReqVO.getItemId()); cleanReqVO.setProduceDateFlag(saveReqVO.getProduceDateFlag()); cleanReqVO.setExpireDateFlag(saveReqVO.getExpireDateFlag()); cleanReqVO.setReceiptDateFlag(saveReqVO.getReceiptDateFlag()); cleanReqVO.setVendorFlag(saveReqVO.getVendorFlag()); cleanReqVO.setPurchaseOrderCodeFlag(saveReqVO.getPurchaseOrderCodeFlag()); cleanReqVO.setLotNumberFlag(saveReqVO.getLotNumberFlag()); cleanReqVO.setQualityStatusFlag(saveReqVO.getQualityStatusFlag()); // 3. 保存到 MDM 表 MdmItemBatchConfigDO mdmConfig = BeanUtils.toBean(cleanReqVO, MdmItemBatchConfigDO.class); Long configId = mdmItemBatchConfigApi.saveItemBatch(mdmConfig); // 4. 同步保存到 MES 本地表 saveToMesTable(cleanReqVO); return configId; } @Override public void deleteItemBatchConfigByItemId(Long itemId) { itemBatchConfigMapper.deleteByItemId(itemId); } /** * 保存到 MES 本地表 */ private void saveToMesTable(MesMdItemBatchConfigSaveReqVO saveReqVO) { MesMdItemBatchConfigDO existing = itemBatchConfigMapper.selectByItemId(saveReqVO.getItemId()); MesMdItemBatchConfigDO mesConfig = BeanUtils.toBean(saveReqVO, MesMdItemBatchConfigDO.class); if (existing != null) { // 存在则更新,使用已有的 ID mesConfig.setId(existing.getId()); itemBatchConfigMapper.updateById(mesConfig); } else { // 不存在则插入,让数据库自动生成 ID mesConfig.setId(null); itemBatchConfigMapper.insert(mesConfig); } } }