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.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 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; @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); if (CollUtil.isEmpty(templateItems)) { throw exception(QC_NO_TEMPLATE); } return templateItems.get(0); } @Override public List getTemplateItemList(Long itemId, Integer qcType) { // 1. 产品关联表 item_id 存的是 MDM 物料 ID(mdm_item.id),质检侧统一按 MDM 物料查询 if (itemId == null) { return Collections.emptyList(); } List templateItems = templateItemMapper.selectListByItemId(itemId); if (CollUtil.isEmpty(templateItems)) { return Collections.emptyList(); } // 2. 过滤:方案启用且检测种类包含 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()); } }