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 itemId, Integer qcType) { List templateItems = getTemplateItemList(itemId, qcType, null, null); if (CollUtil.isEmpty(templateItems)) { throw exception(QC_NO_TEMPLATE); } return templateItems.get(0); } @Override public List getTemplateItemList(Long itemId, Integer qcType, Long workOrderId, Long taskId) { // 1. 解析真实产品物料 ID:任务优先,其次工单,最后直接用入参 Long resolvedItemId = itemId; if (taskId != null) { resolvedItemId = proTaskService.validateTaskExists(taskId).getItemId(); } else if (workOrderId != null) { resolvedItemId = proWorkOrderService.validateWorkOrderExists(workOrderId).getProductId(); } if (resolvedItemId == null) { return Collections.emptyList(); } // 2. mes_md_item.id 转 mdm_item.id(产品关联表存的是 mdm 物料) MesMdItemDO item = mesMdItemService.getItem(resolvedItemId); if (item == null || item.getMdmItemId() == null) { return Collections.emptyList(); } // 3. 查出该物料关联的所有产品关联 List templateItems = templateItemMapper.selectListByItemId(item.getMdmItemId()); if (CollUtil.isEmpty(templateItems)) { return Collections.emptyList(); } // 4. 过滤:方案启用且检测种类包含 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()); } }