1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
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.dal.mysql.md.item.MesMdItemMapper;
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 java.util.Collection;
import java.util.Set;
 
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 MesMdItemMapper itemMapper;
    @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;
    }
 
    @Override
    public void deleteItem(Long mdmItemId) {
        log.info("[deleteItem] 同步删除 MES 物料产品,mdmItemId={}", mdmItemId);
        MesMdItemDO existItem = itemService.getItemByMdmItemId(mdmItemId);
        if (existItem != null) {
            itemService.deleteItem(existItem.getId());
        }
    }
 
    @Override
    public void updateItemStatus(Long mdmItemId, Integer status) {
        log.info("[updateItemStatus] 同步更新 MES 物料产品状态,mdmItemId={}, status={}", mdmItemId, status);
        MesMdItemDO existItem = itemService.getItemByMdmItemId(mdmItemId);
        if (existItem != null) {
            itemService.updateItemStatus(existItem.getId(), status);
        }
    }
 
    @Override
    public Set<Long> getSyncedMdmItemIds(Collection<Long> mdmItemIds) {
        return itemMapper.selectMdmItemIdsByMdmItemIds(mdmItemIds);
    }
 
    /**
     * 保存批次配置
     */
    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);
    }
 
}