package cn.iocoder.yudao.module.mes.service.qc.template; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.qc.template.vo.item.MesQcTemplateItemPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.qc.template.vo.item.MesQcTemplateItemSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateItemDO; import cn.iocoder.yudao.module.mes.dal.mysql.qc.template.MesQcTemplateItemMapper; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.pro.task.MesProTaskService; import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.findFirst; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; /** * MES 质检方案-产品关联 Service 实现类 * * @author 超级管理员 */ @Service @Validated public class MesQcTemplateItemServiceImpl implements MesQcTemplateItemService { @Resource private MesQcTemplateItemMapper templateItemMapper; @Resource @Lazy private MesQcTemplateService templateService; @Resource private MesMdItemService mesMdItemService; @Resource @Lazy private MesProTaskService proTaskService; @Resource @Lazy private MesProWorkOrderService proWorkOrderService; @Override public Long createTemplateItem(MesQcTemplateItemSaveReqVO createReqVO) { // 校验保存参数 validateTemplateItemSaveData(createReqVO); // 插入 MesQcTemplateItemDO item = BeanUtils.toBean(createReqVO, MesQcTemplateItemDO.class); templateItemMapper.insert(item); return item.getId(); } @Override public void updateTemplateItem(MesQcTemplateItemSaveReqVO updateReqVO) { // 校验保存参数 validateTemplateItemSaveData(updateReqVO); // 更新 MesQcTemplateItemDO updateObj = BeanUtils.toBean(updateReqVO, MesQcTemplateItemDO.class); templateItemMapper.updateById(updateObj); } private void validateTemplateItemSaveData(MesQcTemplateItemSaveReqVO saveReqVO) { if (saveReqVO.getId() != null) { // 校验存在 validateTemplateItemExists(saveReqVO.getId()); } // 校验方案存在 templateService.validateTemplateExists(saveReqVO.getTemplateId()); // 校验产品在此方案中唯一 validateTemplateItemNotDuplicate(saveReqVO.getId(), saveReqVO.getTemplateId(), saveReqVO.getItemId()); } @Override public void deleteTemplateItem(Long id) { // 校验存在 validateTemplateItemExists(id); // 删除 templateItemMapper.deleteById(id); } private void validateTemplateItemExists(Long id) { if (templateItemMapper.selectById(id) == null) { throw exception(QC_TEMPLATE_ITEM_NOT_EXISTS); } } private void validateTemplateItemNotDuplicate(Long id, Long templateId, Long itemId) { MesQcTemplateItemDO existing = templateItemMapper.selectByTemplateIdAndItemId(templateId, itemId); if (existing == null) { return; } if (ObjUtil.notEqual(existing.getId(), id)) { throw exception(QC_TEMPLATE_ITEM_DUPLICATE); } } @Override public MesQcTemplateItemDO getTemplateItem(Long id) { return templateItemMapper.selectById(id); } @Override public PageResult getTemplateItemPage(MesQcTemplateItemPageReqVO pageReqVO) { return templateItemMapper.selectPage(pageReqVO); } @Override public void deleteTemplateItemByTemplateId(Long templateId) { templateItemMapper.deleteByTemplateId(templateId); } @Override public MesQcTemplateItemDO getRequiredTemplateByItemIdAndType(Long mdmItemId, Integer qcType) { List templateItems = getTemplateItemList(mdmItemId, qcType, null, null); if (CollUtil.isEmpty(templateItems)) { throw exception(QC_NO_TEMPLATE); } return templateItems.get(0); } @Override public List getTemplateItemList(Long mdmItemId, Integer qcType, Long workOrderId, Long taskId) { // 1. 解析 MDM 产品物料 ID:任务优先,其次工单;两者存的是 MES 物料 ID,需转换为 MDM 物料 ID。 // 未传工单/任务时,入参本身即 MDM 物料 ID(质检单前端选择的就是 MDM 物料) Long resolvedMdmItemId; if (taskId != null) { resolvedMdmItemId = convertMesItemIdToMdmItemId(proTaskService.validateTaskExists(taskId).getItemId()); } else if (workOrderId != null) { resolvedMdmItemId = convertMesItemIdToMdmItemId( proWorkOrderService.validateWorkOrderExists(workOrderId).getProductId()); } else { resolvedMdmItemId = mdmItemId; } if (resolvedMdmItemId == null) { return Collections.emptyList(); } // 2. 查出该物料关联的所有产品关联 List templateItems = templateItemMapper.selectListByItemId(resolvedMdmItemId); if (CollUtil.isEmpty(templateItems)) { return Collections.emptyList(); } // 3. 过滤:方案启用且检测种类包含 qcType,返回全部匹配项 List templates = templateService.getTemplateList( convertSet(templateItems, MesQcTemplateItemDO::getTemplateId)); Set matchedTemplateIds = templates.stream() .filter(t -> CommonStatusEnum.isEnable(t.getStatus()) && CollUtil.contains(t.getTypes(), qcType)) .map(MesQcTemplateDO::getId) .collect(Collectors.toSet()); return templateItems.stream() .filter(t -> matchedTemplateIds.contains(t.getTemplateId())) .collect(Collectors.toList()); } /** * MES 物料 ID 转 MDM 物料 ID * * @param mesItemId MES 物料 ID(mes_md_item.id) * @return MDM 物料 ID(mdm_item.id);MES 物料不存在或未关联 MDM 物料时返回 null */ private Long convertMesItemIdToMdmItemId(Long mesItemId) { if (mesItemId == null) { return null; } MesMdItemDO item = mesMdItemService.getItem(mesItemId); return item != null ? item.getMdmItemId() : null; } }