package cn.iocoder.yudao.module.mes.service.qc.support; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi; import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.MD_ITEM_NOT_EXISTS; /** * 质检单据物料 ID 解析器 * * 质检单据的物料 ID 存在两套来源:质检/仓储单据使用 mdm_item.id,PRO 工单/任务使用 mes_md_item.id。 * 统一在此解析:先按 mdm_item.id 查询,未命中的再按 mes_md_item.id → mdm_item.id 映射查询。 */ @Service public class MesQcItemResolver { @Resource private MesMdItemService mesMdItemService; @Resource private MdmItemApi mdmItemApi; /** * 批量查询物料信息,返回以调用方传入的物料 ID 为 key 的结果 */ public Map getItemMap(Collection itemIds) { if (CollUtil.isEmpty(itemIds)) { return Collections.emptyMap(); } Set ids = new HashSet<>(); itemIds.forEach(id -> { if (id != null) { ids.add(id); } }); if (ids.isEmpty()) { return Collections.emptyMap(); } // 1. 先按 mdm_item.id 直接查询(质检/仓储单据) Map result = new HashMap<>(mdmItemApi.getItemMap(ids)); // 2. 未命中的再按 mes_md_item.id → mdm_item.id 解析(PRO 工单/任务) Set missingIds = new HashSet<>(ids); missingIds.removeAll(result.keySet()); if (missingIds.isEmpty()) { return result; } Map mesItemMap = mesMdItemService.getItemMap(missingIds); Map idToMdmId = new HashMap<>(); missingIds.forEach(id -> { MesMdItemDO mesItem = mesItemMap.get(id); if (mesItem != null && mesItem.getMdmItemId() != null) { idToMdmId.put(id, mesItem.getMdmItemId()); } }); if (idToMdmId.isEmpty()) { return result; } Map fallbackMap = mdmItemApi.getItemMap(idToMdmId.values()); idToMdmId.forEach((id, mdmId) -> { MdmItemRespDTO item = fallbackMap.get(mdmId); if (item != null) { result.put(id, item); } }); return result; } /** * 校验物料存在(兼容两套 ID) */ public void validateItemExists(Long itemId) { if (itemId == null) { return; } if (!getItemMap(Collections.singleton(itemId)).containsKey(itemId)) { throw exception(MD_ITEM_NOT_EXISTS); } } }