package cn.iocoder.yudao.module.mes.api.item;
|
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.module.mes.api.item.dto.MesMdItemSyncReqDTO;
|
import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemSaveReqVO;
|
import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.batchconfig.MesMdItemBatchConfigSaveReqVO;
|
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
|
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO;
|
import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
|
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemBatchConfigService;
|
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
|
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemTypeService;
|
import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
|
import jakarta.annotation.Resource;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.stereotype.Service;
|
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.*;
|
|
/**
|
* MES 物料产品 API 实现类
|
*
|
* 供 MDM 等模块同步物料主数据到 MES 使用。
|
* 单位、分类按 code 在 MES 侧解析为对应 id。
|
*
|
* @author 芋道源码
|
*/
|
@Service
|
@Validated
|
@Slf4j
|
public class MesMdItemApiImpl implements MesMdItemApi {
|
|
@Resource
|
private MesMdItemService itemService;
|
@Resource
|
private MesMdItemTypeService itemTypeService;
|
@Resource
|
private MesMdUnitMeasureService unitMeasureService;
|
@Resource
|
private MesMdItemBatchConfigService itemBatchConfigService;
|
|
@Override
|
public Long createItem(MesMdItemSyncReqDTO syncReqDTO) {
|
log.info("[createItem] 同步创建 MES 物料产品,code={}, mdmItemId={}", syncReqDTO.getCode(), syncReqDTO.getMdmItemId());
|
MesMdItemSaveReqVO saveReqVO = buildSaveReqVO(syncReqDTO);
|
// 使用 MDM 物料 ID 作为 MES 物料 ID
|
if (syncReqDTO.getMdmItemId() != null) {
|
saveReqVO.setId(syncReqDTO.getMdmItemId());
|
}
|
Long itemId = itemService.createItem(saveReqVO);
|
// 同步批次配置
|
// saveBatchConfig(itemId, syncReqDTO);
|
return itemId;
|
}
|
|
@Override
|
public void updateItem(MesMdItemSyncReqDTO syncReqDTO) {
|
log.info("[updateItem] 同步更新 MES 物料产品,code={}, mdmItemId={}", syncReqDTO.getCode(), syncReqDTO.getMdmItemId());
|
MesMdItemSaveReqVO saveReqVO = buildSaveReqVO(syncReqDTO);
|
// 使用 MDM 物料 ID 作为 MES 物料 ID
|
if (syncReqDTO.getMdmItemId() != null) {
|
saveReqVO.setId(syncReqDTO.getMdmItemId());
|
}
|
// 按 ID 或 code 匹配:存在则更新,不存在则创建(upsert)
|
MesMdItemDO existItem = null;
|
// 优先按 ID 查找
|
if (syncReqDTO.getMdmItemId() != null) {
|
existItem = itemService.getItem(syncReqDTO.getMdmItemId());
|
}
|
// 如果按 ID 找不到,再按 code 查找
|
if (existItem == null) {
|
existItem = itemService.getItemByCode(syncReqDTO.getCode());
|
}
|
Long itemId;
|
if (existItem == null) {
|
itemId = itemService.createItem(saveReqVO);
|
} else {
|
saveReqVO.setId(existItem.getId());
|
itemService.updateItem(saveReqVO);
|
itemId = existItem.getId();
|
}
|
// 同步批次配置
|
// saveBatchConfig(itemId, syncReqDTO);
|
}
|
|
/**
|
* 将同步 DTO 转换为 MES 物料产品 SaveReqVO,并按 code 解析单位/分类 id
|
*/
|
private MesMdItemSaveReqVO buildSaveReqVO(MesMdItemSyncReqDTO syncReqDTO) {
|
// 解析计量单位 code -> id
|
MesMdUnitMeasureDO unitMeasure = unitMeasureService.getUnitMeasureByCode(syncReqDTO.getUnitCode());
|
if (unitMeasure == null) {
|
throw exception(MD_UNIT_MEASURE_NOT_EXISTS);
|
}
|
// 解析物料分类 code -> id
|
MesMdItemTypeDO itemType = itemTypeService.getItemTypeByCode(syncReqDTO.getItemTypeCode());
|
if (itemType == null) {
|
throw exception(MD_ITEM_TYPE_NOT_EXISTS);
|
}
|
// 组装(code/name/specification/safeStockFlag/minStock/maxStock/highValue/batchFlag/remark 同名拷贝)
|
MesMdItemSaveReqVO saveReqVO = BeanUtils.toBean(syncReqDTO, MesMdItemSaveReqVO.class);
|
saveReqVO.setUnitMeasureId(unitMeasure.getId());
|
saveReqVO.setItemTypeId(itemType.getId());
|
return saveReqVO;
|
}
|
|
/**
|
* 保存批次配置
|
*/
|
private void saveBatchConfig(Long itemId, MesMdItemSyncReqDTO syncReqDTO) {
|
// 检查是否有批次配置数据
|
if (syncReqDTO.getProduceDateFlag() == null
|
&& syncReqDTO.getExpireDateFlag() == null
|
&& syncReqDTO.getReceiptDateFlag() == null
|
&& syncReqDTO.getVendorFlag() == null
|
&& syncReqDTO.getPurchaseOrderCodeFlag() == null
|
&& syncReqDTO.getLotNumberFlag() == null
|
&& syncReqDTO.getQualityStatusFlag() == null) {
|
return;
|
}
|
MesMdItemBatchConfigSaveReqVO configReqVO = new MesMdItemBatchConfigSaveReqVO();
|
configReqVO.setItemId(itemId);
|
configReqVO.setProduceDateFlag(syncReqDTO.getProduceDateFlag());
|
configReqVO.setExpireDateFlag(syncReqDTO.getExpireDateFlag());
|
configReqVO.setReceiptDateFlag(syncReqDTO.getReceiptDateFlag());
|
configReqVO.setVendorFlag(syncReqDTO.getVendorFlag());
|
configReqVO.setPurchaseOrderCodeFlag(syncReqDTO.getPurchaseOrderCodeFlag());
|
configReqVO.setLotNumberFlag(syncReqDTO.getLotNumberFlag());
|
configReqVO.setQualityStatusFlag(syncReqDTO.getQualityStatusFlag());
|
itemBatchConfigService.saveItemBatchConfig(configReqVO);
|
}
|
|
}
|