Commit 83fdaad4b3c74ca95f7e115fde3619dddedf91d4

Authored by YunaiV
1 parent d0bd4394

feat(mes): enhance defect record service and controller with IPQC, OQC, and RQC support

yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/MesQcIndicatorResultController.java
@@ -8,11 +8,17 @@ import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.*; @@ -8,11 +8,17 @@ import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.*;
8 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicator.MesQcIndicatorDO; 8 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicator.MesQcIndicatorDO;
9 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDO; 9 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDO;
10 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDetailDO; 10 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDetailDO;
  11 +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.ipqc.MesQcIpqcLineDO;
11 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcLineDO; 12 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcLineDO;
  13 +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.oqc.MesQcOqcLineDO;
  14 +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.rqc.MesQcRqcLineDO;
12 import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum; 15 import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum;
13 import cn.iocoder.yudao.module.mes.service.qc.indicator.MesQcIndicatorService; 16 import cn.iocoder.yudao.module.mes.service.qc.indicator.MesQcIndicatorService;
14 import cn.iocoder.yudao.module.mes.service.qc.indicatorresult.MesQcIndicatorResultService; 17 import cn.iocoder.yudao.module.mes.service.qc.indicatorresult.MesQcIndicatorResultService;
  18 +import cn.iocoder.yudao.module.mes.service.qc.ipqc.MesQcIpqcLineService;
15 import cn.iocoder.yudao.module.mes.service.qc.lqc.MesQcIqcLineService; 19 import cn.iocoder.yudao.module.mes.service.qc.lqc.MesQcIqcLineService;
  20 +import cn.iocoder.yudao.module.mes.service.qc.oqc.MesQcOqcLineService;
  21 +import cn.iocoder.yudao.module.mes.service.qc.rqc.MesQcRqcLineService;
16 import io.swagger.v3.oas.annotations.Operation; 22 import io.swagger.v3.oas.annotations.Operation;
17 import io.swagger.v3.oas.annotations.Parameter; 23 import io.swagger.v3.oas.annotations.Parameter;
18 import io.swagger.v3.oas.annotations.Parameters; 24 import io.swagger.v3.oas.annotations.Parameters;
@@ -41,6 +47,12 @@ public class MesQcIndicatorResultController { @@ -41,6 +47,12 @@ public class MesQcIndicatorResultController {
41 @Resource 47 @Resource
42 private MesQcIqcLineService iqcLineService; 48 private MesQcIqcLineService iqcLineService;
43 @Resource 49 @Resource
  50 + private MesQcIpqcLineService ipqcLineService;
  51 + @Resource
  52 + private MesQcOqcLineService oqcLineService;
  53 + @Resource
  54 + private MesQcRqcLineService rqcLineService;
  55 + @Resource
44 private MesQcIndicatorService indicatorService; 56 private MesQcIndicatorService indicatorService;
45 57
46 @PostMapping("/create") 58 @PostMapping("/create")
@@ -118,38 +130,50 @@ public class MesQcIndicatorResultController { @@ -118,38 +130,50 @@ public class MesQcIndicatorResultController {
118 */ 130 */
119 private List<MesQcIndicatorResultRespVO.Item> buildDetailItemList( 131 private List<MesQcIndicatorResultRespVO.Item> buildDetailItemList(
120 List<MesQcIndicatorResultDetailDO> details, Long qcId, Integer qcType) { 132 List<MesQcIndicatorResultDetailDO> details, Long qcId, Integer qcType) {
121 - // 1.1 获取检验单行列表(知道有哪些检测指标)  
122 - List<MesQcIqcLineDO> lines; 133 + // 1.1 获取检验单行的指标 ID 列表(知道有哪些检测指标)
  134 + List<Long> indicatorIds;
123 if (Objects.equals(qcType, MesQcTypeEnum.IQC.getType())) { 135 if (Objects.equals(qcType, MesQcTypeEnum.IQC.getType())) {
124 - lines = iqcLineService.getIqcLineListByIqcId(qcId); 136 + List<MesQcIqcLineDO> lines = iqcLineService.getIqcLineListByIqcId(qcId);
  137 + indicatorIds = CollUtil.isEmpty(lines) ? Collections.emptyList()
  138 + : new ArrayList<>(convertSet(lines, MesQcIqcLineDO::getIndicatorId));
  139 + } else if (Objects.equals(qcType, MesQcTypeEnum.IPQC.getType())) {
  140 + List<MesQcIpqcLineDO> lines = ipqcLineService.selectListByIpqcId(qcId);
  141 + indicatorIds = CollUtil.isEmpty(lines) ? Collections.emptyList()
  142 + : new ArrayList<>(convertSet(lines, MesQcIpqcLineDO::getIndicatorId));
  143 + } else if (Objects.equals(qcType, MesQcTypeEnum.OQC.getType())) {
  144 + List<MesQcOqcLineDO> lines = oqcLineService.getOqcLineListByOqcId(qcId);
  145 + indicatorIds = CollUtil.isEmpty(lines) ? Collections.emptyList()
  146 + : new ArrayList<>(convertSet(lines, MesQcOqcLineDO::getIndicatorId));
  147 + } else if (Objects.equals(qcType, MesQcTypeEnum.RQC.getType())) {
  148 + List<MesQcRqcLineDO> lines = rqcLineService.getRqcLineListByRqcId(qcId);
  149 + indicatorIds = CollUtil.isEmpty(lines) ? Collections.emptyList()
  150 + : new ArrayList<>(convertSet(lines, MesQcRqcLineDO::getIndicatorId));
125 } else { 151 } else {
126 - // TODO @芋艿:IPQC/OQC/RQC 模块迁移后实现  
127 throw new IllegalArgumentException("暂不支持 qcType=" + qcType); 152 throw new IllegalArgumentException("暂不支持 qcType=" + qcType);
128 } 153 }
129 - if (CollUtil.isEmpty(lines)) { 154 + if (CollUtil.isEmpty(indicatorIds)) {
130 return Collections.emptyList(); 155 return Collections.emptyList();
131 } 156 }
132 157
133 // 1.2 批量查询检测指标 158 // 1.2 批量查询检测指标
134 - Map<Long, MesQcIndicatorDO> indicatorMap = indicatorService.getIndicatorMap(  
135 - convertSet(lines, MesQcIqcLineDO::getIndicatorId)); 159 + Map<Long, MesQcIndicatorDO> indicatorMap = indicatorService.getIndicatorMap(new HashSet<>(indicatorIds));
136 // 1.3 构建已有明细 Map(按 indicatorId 索引) 160 // 1.3 构建已有明细 Map(按 indicatorId 索引)
137 Map<Long, MesQcIndicatorResultDetailDO> detailMap = CollUtil.isEmpty(details) 161 Map<Long, MesQcIndicatorResultDetailDO> detailMap = CollUtil.isEmpty(details)
138 ? Collections.emptyMap() 162 ? Collections.emptyMap()
139 : convertMap(details, MesQcIndicatorResultDetailDO::getIndicatorId); 163 : convertMap(details, MesQcIndicatorResultDetailDO::getIndicatorId);
140 164
141 - // 2. 遍历行,组装 VO  
142 - List<MesQcIndicatorResultRespVO.Item> voList = new ArrayList<>(lines.size());  
143 - for (MesQcIqcLineDO line : lines) { 165 + // 2. 遍历指标 ID,组装 VO
  166 + List<MesQcIndicatorResultRespVO.Item> voList = new ArrayList<>(indicatorIds.size());
  167 + for (Long indicatorId : indicatorIds) {
144 MesQcIndicatorResultRespVO.Item vo = new MesQcIndicatorResultRespVO.Item() 168 MesQcIndicatorResultRespVO.Item vo = new MesQcIndicatorResultRespVO.Item()
145 - .setIndicatorId(line.getIndicatorId()); 169 + .setIndicatorId(indicatorId);
146 // 来自 indicator 170 // 来自 indicator
147 - findAndThen(indicatorMap, line.getIndicatorId(), indicator -> vo 171 + findAndThen(indicatorMap, indicatorId, indicator -> vo
148 .setIndicatorName(indicator.getName()) 172 .setIndicatorName(indicator.getName())
149 .setValueType(indicator.getResultType()) 173 .setValueType(indicator.getResultType())
150 .setValueSpecification(indicator.getResultSpecification())); 174 .setValueSpecification(indicator.getResultSpecification()));
151 // 来自已有结果明细(如有) 175 // 来自已有结果明细(如有)
152 - findAndThen(detailMap, line.getIndicatorId(), detail -> vo 176 + findAndThen(detailMap, indicatorId, detail -> vo
153 .setId(detail.getId()).setResultId(detail.getResultId()) 177 .setId(detail.getId()).setResultId(detail.getResultId())
154 .setValue(detail.getValue()).setRemark(detail.getRemark())); 178 .setValue(detail.getValue()).setRemark(detail.getRemark()));
155 voList.add(vo); 179 voList.add(vo);
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/defectrecord/MesQcDefectRecordServiceImpl.java
@@ -7,8 +7,14 @@ import cn.iocoder.yudao.module.mes.controller.admin.qc.defectrecord.vo.MesQcDefe @@ -7,8 +7,14 @@ import cn.iocoder.yudao.module.mes.controller.admin.qc.defectrecord.vo.MesQcDefe
7 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.defectrecord.MesQcDefectRecordDO; 7 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.defectrecord.MesQcDefectRecordDO;
8 import cn.iocoder.yudao.module.mes.dal.mysql.qc.defectrecord.MesQcDefectRecordMapper; 8 import cn.iocoder.yudao.module.mes.dal.mysql.qc.defectrecord.MesQcDefectRecordMapper;
9 import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum; 9 import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum;
  10 +import cn.iocoder.yudao.module.mes.service.qc.ipqc.MesQcIpqcLineService;
  11 +import cn.iocoder.yudao.module.mes.service.qc.ipqc.MesQcIpqcService;
10 import cn.iocoder.yudao.module.mes.service.qc.lqc.MesQcIqcLineService; 12 import cn.iocoder.yudao.module.mes.service.qc.lqc.MesQcIqcLineService;
11 import cn.iocoder.yudao.module.mes.service.qc.lqc.MesQcIqcService; 13 import cn.iocoder.yudao.module.mes.service.qc.lqc.MesQcIqcService;
  14 +import cn.iocoder.yudao.module.mes.service.qc.oqc.MesQcOqcLineService;
  15 +import cn.iocoder.yudao.module.mes.service.qc.oqc.MesQcOqcService;
  16 +import cn.iocoder.yudao.module.mes.service.qc.rqc.MesQcRqcLineService;
  17 +import cn.iocoder.yudao.module.mes.service.qc.rqc.MesQcRqcService;
12 import jakarta.annotation.Resource; 18 import jakarta.annotation.Resource;
13 import org.springframework.context.annotation.Lazy; 19 import org.springframework.context.annotation.Lazy;
14 import org.springframework.stereotype.Service; 20 import org.springframework.stereotype.Service;
@@ -40,6 +46,27 @@ public class MesQcDefectRecordServiceImpl implements MesQcDefectRecordService { @@ -40,6 +46,27 @@ public class MesQcDefectRecordServiceImpl implements MesQcDefectRecordService {
40 @Lazy 46 @Lazy
41 private MesQcIqcLineService iqcLineService; 47 private MesQcIqcLineService iqcLineService;
42 48
  49 + @Resource
  50 + @Lazy
  51 + private MesQcIpqcService ipqcService;
  52 + @Resource
  53 + @Lazy
  54 + private MesQcIpqcLineService ipqcLineService;
  55 +
  56 + @Resource
  57 + @Lazy
  58 + private MesQcOqcService oqcService;
  59 + @Resource
  60 + @Lazy
  61 + private MesQcOqcLineService oqcLineService;
  62 +
  63 + @Resource
  64 + @Lazy
  65 + private MesQcRqcService rqcService;
  66 + @Resource
  67 + @Lazy
  68 + private MesQcRqcLineService rqcLineService;
  69 +
43 @Override 70 @Override
44 @Transactional(rollbackFor = Exception.class) 71 @Transactional(rollbackFor = Exception.class)
45 public Long createDefectRecord(MesQcDefectRecordSaveReqVO createReqVO) { 72 public Long createDefectRecord(MesQcDefectRecordSaveReqVO createReqVO) {
@@ -98,8 +125,16 @@ public class MesQcDefectRecordServiceImpl implements MesQcDefectRecordService { @@ -98,8 +125,16 @@ public class MesQcDefectRecordServiceImpl implements MesQcDefectRecordService {
98 if (Objects.equals(qcType, MesQcTypeEnum.IQC.getType())) { 125 if (Objects.equals(qcType, MesQcTypeEnum.IQC.getType())) {
99 iqcService.validateIqcExists(qcId); 126 iqcService.validateIqcExists(qcId);
100 iqcLineService.validateIqcLineExists(lineId); 127 iqcLineService.validateIqcLineExists(lineId);
  128 + } else if (Objects.equals(qcType, MesQcTypeEnum.IPQC.getType())) {
  129 + ipqcService.validateIpqcExists(qcId);
  130 + ipqcLineService.validateIpqcLineExists(lineId);
  131 + } else if (Objects.equals(qcType, MesQcTypeEnum.OQC.getType())) {
  132 + oqcService.validateOqcExists(qcId);
  133 + oqcLineService.validateOqcLineExists(lineId);
  134 + } else if (Objects.equals(qcType, MesQcTypeEnum.RQC.getType())) {
  135 + rqcService.validateRqcExists(qcId);
  136 + rqcLineService.validateRqcLineExists(lineId);
101 } else { 137 } else {
102 - // 后续扩展:IPQC、OQC、RQC  
103 throw exception(QC_DEFECT_RECORD_QC_TYPE_UNSUPPORTED); 138 throw exception(QC_DEFECT_RECORD_QC_TYPE_UNSUPPORTED);
104 } 139 }
105 } 140 }
@@ -124,8 +159,13 @@ public class MesQcDefectRecordServiceImpl implements MesQcDefectRecordService { @@ -124,8 +159,13 @@ public class MesQcDefectRecordServiceImpl implements MesQcDefectRecordService {
124 List<MesQcDefectRecordDO> records = defectRecordMapper.selectListByQcTypeAndQcId(qcType, qcId); 159 List<MesQcDefectRecordDO> records = defectRecordMapper.selectListByQcTypeAndQcId(qcType, qcId);
125 if (Objects.equals(qcType, MesQcTypeEnum.IQC.getType())) { 160 if (Objects.equals(qcType, MesQcTypeEnum.IQC.getType())) {
126 iqcService.recalculateDefectStats(qcId, records); 161 iqcService.recalculateDefectStats(qcId, records);
  162 + } else if (Objects.equals(qcType, MesQcTypeEnum.IPQC.getType())) {
  163 + ipqcService.recalculateDefectStats(qcId, records);
  164 + } else if (Objects.equals(qcType, MesQcTypeEnum.OQC.getType())) {
  165 + oqcService.recalculateDefectStats(qcId, records);
  166 + } else if (Objects.equals(qcType, MesQcTypeEnum.RQC.getType())) {
  167 + rqcService.recalculateDefectStats(qcId, records);
127 } else { 168 } else {
128 - // 后续扩展:IPQC、OQC、RQC  
129 throw exception(QC_DEFECT_RECORD_QC_TYPE_UNSUPPORTED); 169 throw exception(QC_DEFECT_RECORD_QC_TYPE_UNSUPPORTED);
130 } 170 }
131 } 171 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultServiceImpl.java
@@ -9,9 +9,16 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndica @@ -9,9 +9,16 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndica
9 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDetailDO; 9 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDetailDO;
10 import cn.iocoder.yudao.module.mes.dal.mysql.qc.indicatorresult.MesQcIndicatorResultDetailMapper; 10 import cn.iocoder.yudao.module.mes.dal.mysql.qc.indicatorresult.MesQcIndicatorResultDetailMapper;
11 import cn.iocoder.yudao.module.mes.dal.mysql.qc.indicatorresult.MesQcIndicatorResultMapper; 11 import cn.iocoder.yudao.module.mes.dal.mysql.qc.indicatorresult.MesQcIndicatorResultMapper;
  12 +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.ipqc.MesQcIpqcDO;
  13 +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.oqc.MesQcOqcDO;
  14 +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.rqc.MesQcRqcDO;
12 import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum; 15 import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum;
  16 +import cn.iocoder.yudao.module.mes.service.qc.ipqc.MesQcIpqcService;
13 import cn.iocoder.yudao.module.mes.service.qc.lqc.MesQcIqcService; 17 import cn.iocoder.yudao.module.mes.service.qc.lqc.MesQcIqcService;
  18 +import cn.iocoder.yudao.module.mes.service.qc.oqc.MesQcOqcService;
  19 +import cn.iocoder.yudao.module.mes.service.qc.rqc.MesQcRqcService;
14 import jakarta.annotation.Resource; 20 import jakarta.annotation.Resource;
  21 +import org.springframework.context.annotation.Lazy;
15 import org.springframework.stereotype.Service; 22 import org.springframework.stereotype.Service;
16 import org.springframework.transaction.annotation.Transactional; 23 import org.springframework.transaction.annotation.Transactional;
17 import org.springframework.validation.annotation.Validated; 24 import org.springframework.validation.annotation.Validated;
@@ -39,6 +46,15 @@ public class MesQcIndicatorResultServiceImpl implements MesQcIndicatorResultServ @@ -39,6 +46,15 @@ public class MesQcIndicatorResultServiceImpl implements MesQcIndicatorResultServ
39 46
40 @Resource 47 @Resource
41 private MesQcIqcService iqcService; 48 private MesQcIqcService iqcService;
  49 + @Resource
  50 + @Lazy
  51 + private MesQcIpqcService ipqcService;
  52 + @Resource
  53 + @Lazy
  54 + private MesQcOqcService oqcService;
  55 + @Resource
  56 + @Lazy
  57 + private MesQcRqcService rqcService;
42 58
43 @Override 59 @Override
44 @Transactional(rollbackFor = Exception.class) 60 @Transactional(rollbackFor = Exception.class)
@@ -117,8 +133,16 @@ public class MesQcIndicatorResultServiceImpl implements MesQcIndicatorResultServ @@ -117,8 +133,16 @@ public class MesQcIndicatorResultServiceImpl implements MesQcIndicatorResultServ
117 if (Objects.equals(qcType, MesQcTypeEnum.IQC.getType())) { 133 if (Objects.equals(qcType, MesQcTypeEnum.IQC.getType())) {
118 MesQcIqcDO iqc = iqcService.validateIqcExists(qcId); 134 MesQcIqcDO iqc = iqcService.validateIqcExists(qcId);
119 return iqc.getItemId(); 135 return iqc.getItemId();
  136 + } else if (Objects.equals(qcType, MesQcTypeEnum.IPQC.getType())) {
  137 + MesQcIpqcDO ipqc = ipqcService.validateIpqcExists(qcId);
  138 + return ipqc.getItemId();
  139 + } else if (Objects.equals(qcType, MesQcTypeEnum.OQC.getType())) {
  140 + MesQcOqcDO oqc = oqcService.validateOqcExists(qcId);
  141 + return oqc.getItemId();
  142 + } else if (Objects.equals(qcType, MesQcTypeEnum.RQC.getType())) {
  143 + MesQcRqcDO rqc = rqcService.validateRqcExists(qcId);
  144 + return rqc.getItemId();
120 } 145 }
121 - // TODO @芋艿:IPQC/OQC/RQC 模块迁移后实现  
122 throw new IllegalArgumentException("暂不支持 qcType=" + qcType); 146 throw new IllegalArgumentException("暂不支持 qcType=" + qcType);
123 } 147 }
124 148