Commit 34061f903c192ee82b55c3b524ce8c7e756e754f

Authored by YunaiV
1 parent 6ef9907c

feat(mes): refactor inspection result types and add new result detail structure

Showing 22 changed files with 580 additions and 642 deletions
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectRespVO.java
@@ -29,7 +29,7 @@ public class MesQcDefectRespVO { @@ -29,7 +29,7 @@ public class MesQcDefectRespVO {
29 29
30 @Schema(description = "检测项类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "APPEARANCE") 30 @Schema(description = "检测项类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "APPEARANCE")
31 @ExcelProperty(value = "检测项类型", converter = DictConvert.class) 31 @ExcelProperty(value = "检测项类型", converter = DictConvert.class)
32 - @DictFormat(DictTypeConstants.MES_INDEX_TYPE) 32 + @DictFormat(DictTypeConstants.MES_INDICATOR_TYPE)
33 private String type; 33 private String type;
34 34
35 @Schema(description = "缺陷等级", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") 35 @Schema(description = "缺陷等级", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicator/vo/MesQcIndicatorRespVO.java
@@ -29,7 +29,7 @@ public class MesQcIndicatorRespVO { @@ -29,7 +29,7 @@ public class MesQcIndicatorRespVO {
29 29
30 @Schema(description = "检测项类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "SIZE") 30 @Schema(description = "检测项类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "SIZE")
31 @ExcelProperty(value = "检测项类型", converter = DictConvert.class) 31 @ExcelProperty(value = "检测项类型", converter = DictConvert.class)
32 - @DictFormat(DictTypeConstants.MES_INDEX_TYPE) 32 + @DictFormat(DictTypeConstants.MES_INDICATOR_TYPE)
33 private String type; 33 private String type;
34 34
35 @Schema(description = "检测工具", example = "卡尺") 35 @Schema(description = "检测工具", example = "卡尺")
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/MesQcIndicatorResultController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  5 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  7 +import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.*;
  8 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
  9 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
  10 +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicator.MesQcIndicatorDO;
  11 +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDO;
  12 +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDetailDO;
  13 +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcDO;
  14 +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcLineDO;
  15 +import cn.iocoder.yudao.module.mes.dal.dataobject.tm.tool.MesTmToolDO;
  16 +import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum;
  17 +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
  18 +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
  19 +import cn.iocoder.yudao.module.mes.service.qc.indicator.MesQcIndicatorService;
  20 +import cn.iocoder.yudao.module.mes.service.qc.indicatorresult.MesQcIndicatorResultService;
  21 +import cn.iocoder.yudao.module.mes.service.qc.lqc.MesQcIqcLineService;
  22 +import cn.iocoder.yudao.module.mes.service.qc.lqc.MesQcIqcService;
  23 +import cn.iocoder.yudao.module.mes.service.tm.tool.MesTmToolService;
  24 +import io.swagger.v3.oas.annotations.Operation;
  25 +import io.swagger.v3.oas.annotations.Parameter;
  26 +import io.swagger.v3.oas.annotations.Parameters;
  27 +import io.swagger.v3.oas.annotations.tags.Tag;
  28 +import jakarta.annotation.Resource;
  29 +import jakarta.validation.Valid;
  30 +import org.springframework.security.access.prepost.PreAuthorize;
  31 +import org.springframework.validation.annotation.Validated;
  32 +import org.springframework.web.bind.annotation.*;
  33 +
  34 +import java.util.*;
  35 +
  36 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  37 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
  38 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
  39 +import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen;
  40 +
  41 +@Tag(name = "管理后台 - MES 检验结果")
  42 +@RestController
  43 +@RequestMapping("/mes/qc/indicator-result")
  44 +@Validated
  45 +public class MesQcIndicatorResultController {
  46 +
  47 + @Resource
  48 + private MesQcIndicatorResultService resultService;
  49 + @Resource
  50 + private MesQcIqcService iqcService;
  51 + @Resource
  52 + private MesQcIqcLineService iqcLineService;
  53 + @Resource
  54 + private MesMdItemService itemService;
  55 + @Resource
  56 + private MesMdUnitMeasureService unitMeasureService;
  57 + @Resource
  58 + private MesQcIndicatorService indicatorService;
  59 + @Resource
  60 + private MesTmToolService toolService;
  61 +
  62 + @PostMapping("/create")
  63 + @Operation(summary = "创建检验结果")
  64 + @PreAuthorize("@ss.hasPermission('mes:qc-iqc:create')")
  65 + public CommonResult<Long> createIndicatorResult(@Valid @RequestBody MesQcIndicatorResultSaveReqVO createReqVO) {
  66 + return success(resultService.createIndicatorResult(createReqVO));
  67 + }
  68 +
  69 + @PutMapping("/update")
  70 + @Operation(summary = "更新检验结果")
  71 + @PreAuthorize("@ss.hasPermission('mes:qc-iqc:update')")
  72 + public CommonResult<Boolean> updateIndicatorResult(@Valid @RequestBody MesQcIndicatorResultSaveReqVO updateReqVO) {
  73 + resultService.updateIndicatorResult(updateReqVO);
  74 + return success(true);
  75 + }
  76 +
  77 + @DeleteMapping("/delete")
  78 + @Operation(summary = "删除检验结果")
  79 + @Parameter(name = "id", description = "编号", required = true)
  80 + @PreAuthorize("@ss.hasPermission('mes:qc-iqc:delete')")
  81 + public CommonResult<Boolean> deleteIndicatorResult(@RequestParam("id") Long id) {
  82 + resultService.deleteIndicatorResult(id);
  83 + return success(true);
  84 + }
  85 +
  86 + // TODO @AI:是不是把 get 和 getIndicatorResultDetailTemplate 合并为一个接口?参数是 qcId + qcType;新的接口是 get-detail;
  87 + @GetMapping("/get")
  88 + @Operation(summary = "获得检验结果(含明细)")
  89 + @Parameter(name = "id", description = "编号", required = true, example = "1024")
  90 + @PreAuthorize("@ss.hasPermission('mes:qc-iqc:query')")
  91 + public CommonResult<MesQcIndicatorResultRespVO> getIndicatorResult(@RequestParam("id") Long id) {
  92 + MesQcIndicatorResultDO result = resultService.getIndicatorResult(id);
  93 + if (result == null) {
  94 + return success(null);
  95 + }
  96 + // 构建 RespVO(含关联字段)
  97 + MesQcIndicatorResultRespVO respVO = buildIndicatorResultRespVOList(Collections.singletonList(result)).get(0);
  98 + // 查询明细并组装
  99 + List<MesQcIndicatorResultDetailDO> details = resultService.getIndicatorResultDetailListByResultId(result.getId());
  100 + respVO.setItems(buildDetailItemList(details, result.getQcId(), result.getQcType()));
  101 + return success(respVO);
  102 + }
  103 +
  104 + @GetMapping("/page")
  105 + @Operation(summary = "获得检验结果分页")
  106 + @PreAuthorize("@ss.hasPermission('mes:qc-iqc:query')")
  107 + public CommonResult<PageResult<MesQcIndicatorResultRespVO>> getIndicatorResultPage(@Valid MesQcIndicatorResultPageReqVO pageReqVO) {
  108 + PageResult<MesQcIndicatorResultDO> pageResult = resultService.getIndicatorResultPage(pageReqVO);
  109 + return success(new PageResult<>(buildIndicatorResultRespVOList(pageResult.getList()), pageResult.getTotal()));
  110 + }
  111 +
  112 + @GetMapping("/detail-template")
  113 + @Operation(summary = "获取空值检测项模板")
  114 + @Parameters({
  115 + @Parameter(name = "qcId", description = "质检单ID", required = true, example = "1"),
  116 + @Parameter(name = "qcType", description = "质检类型", required = true, example = "1")
  117 + })
  118 + @PreAuthorize("@ss.hasPermission('mes:qc-iqc:query')")
  119 + public CommonResult<List<MesQcIndicatorResultRespVO.Item>> getIndicatorResultDetailTemplate(
  120 + @RequestParam("qcId") Long qcId,
  121 + @RequestParam("qcType") Integer qcType) {
  122 + return success(buildDetailItemList(Collections.emptyList(), qcId, qcType));
  123 + }
  124 +
  125 + // ==================== 拼接 VO ====================
  126 +
  127 + /**
  128 + * 构建主表 RespVO 列表(拼接物料、质检单等关联信息)
  129 + */
  130 + private List<MesQcIndicatorResultRespVO> buildIndicatorResultRespVOList(List<MesQcIndicatorResultDO> list) {
  131 + if (CollUtil.isEmpty(list)) {
  132 + return Collections.emptyList();
  133 + }
  134 + // 批量查询物料
  135 + Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
  136 + convertSet(list, MesQcIndicatorResultDO::getItemId));
  137 + // 批量查询计量单位
  138 + Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
  139 + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
  140 + // 批量查询 IQC 质检单
  141 + Set<Long> iqcIds = convertSet(list, r ->
  142 + Objects.equals(r.getQcType(), MesQcTypeEnum.IQC.getType()) ? r.getQcId() : null);
  143 + iqcIds.remove(null);
  144 + Map<Long, MesQcIqcDO> iqcMap = iqcService.getIqcMap(iqcIds);
  145 +
  146 + // 拼装 VO
  147 + return BeanUtils.toBean(list, MesQcIndicatorResultRespVO.class, vo -> {
  148 + // 拼接物料信息
  149 + findAndThen(itemMap, vo.getItemId(), item -> {
  150 + vo.setItemCode(item.getCode()).setItemName(item.getName()).setItemSpecification(item.getSpecification());
  151 + findAndThen(unitMeasureMap, item.getUnitMeasureId(),
  152 + unit -> vo.setUnitName(unit.getName()));
  153 + });
  154 + // 拼接质检单编号/名称
  155 + if (Objects.equals(vo.getQcType(), MesQcTypeEnum.IQC.getType())) {
  156 + findAndThen(iqcMap, vo.getQcId(), iqc ->
  157 + vo.setQcCode(iqc.getCode()).setQcName(iqc.getName()));
  158 + }
  159 + // TODO @芋艿:IPQC/OQC/RQC 模块迁移后实现
  160 + });
  161 + }
  162 +
  163 + /**
  164 + * 构建明细 Item 列表:从 IQC line + indicator + tool + unitMeasure + 已有结果明细组装
  165 + *
  166 + * @param details 已有结果明细(空列表表示获取空值模板)
  167 + * @param qcId 质检单 ID
  168 + * @param qcType 质检类型
  169 + */
  170 + private List<MesQcIndicatorResultRespVO.Item> buildDetailItemList(
  171 + List<MesQcIndicatorResultDetailDO> details, Long qcId, Integer qcType) {
  172 + // 1. 获取检验单行列表
  173 + List<MesQcIqcLineDO> lines;
  174 + if (Objects.equals(qcType, MesQcTypeEnum.IQC.getType())) {
  175 + lines = iqcLineService.getIqcLineListByIqcId(qcId);
  176 + } else {
  177 + // TODO @芋艿:IPQC/OQC/RQC 模块迁移后实现
  178 + return Collections.emptyList();
  179 + }
  180 + if (CollUtil.isEmpty(lines)) {
  181 + return Collections.emptyList();
  182 + }
  183 +
  184 + // 2. 批量查询关联信息
  185 + Map<Long, MesQcIndicatorDO> indicatorMap = indicatorService.getIndicatorMap(
  186 + convertSet(lines, MesQcIqcLineDO::getIndicatorId));
  187 + Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
  188 + convertSet(lines, MesQcIqcLineDO::getUnitMeasureId));
  189 +
  190 + // 3. 构建已有明细 Map(按 indicatorId 索引)
  191 + Map<Long, MesQcIndicatorResultDetailDO> detailMap = CollUtil.isEmpty(details)
  192 + ? Collections.emptyMap()
  193 + : convertMap(details, MesQcIndicatorResultDetailDO::getIndicatorId);
  194 +
  195 + // 4. 遍历行,组装 VO
  196 + List<MesQcIndicatorResultRespVO.Item> voList = new ArrayList<>(lines.size());
  197 + for (MesQcIqcLineDO line : lines) {
  198 + MesQcIndicatorResultRespVO.Item vo = new MesQcIndicatorResultRespVO.Item();
  199 + // 来自 IQC line
  200 + vo.setIndicatorId(line.getIndicatorId());
  201 + vo.setCheckMethod(line.getCheckMethod());
  202 + vo.setStandardValue(line.getStandardValue());
  203 + vo.setMaxThreshold(line.getMaxThreshold());
  204 + vo.setMinThreshold(line.getMinThreshold());
  205 +
  206 + // 来自 indicator
  207 + findAndThen(indicatorMap, line.getIndicatorId(), indicator -> {
  208 + vo.setIndicatorCode(indicator.getCode());
  209 + vo.setIndicatorName(indicator.getName());
  210 + vo.setIndicatorType(indicator.getType());
  211 + vo.setValueType(indicator.getResultType());
  212 + vo.setValueSpecification(indicator.getResultSpecification());
  213 + });
  214 +
  215 + // 来自 unitMeasure
  216 + findAndThen(unitMeasureMap, line.getUnitMeasureId(),
  217 + unit -> vo.setUnitMeasureName(unit.getName()));
  218 +
  219 + // 来自 tool(逐个查询,数量通常较少)
  220 + if (line.getToolId() != null) {
  221 + MesTmToolDO tool = toolService.getTool(line.getToolId());
  222 + if (tool != null) {
  223 + vo.setToolName(tool.getName());
  224 + }
  225 + }
  226 +
  227 + // 来自已有结果明细(如有)
  228 + MesQcIndicatorResultDetailDO detail = detailMap.get(line.getIndicatorId());
  229 + if (detail != null) {
  230 + vo.setId(detail.getId());
  231 + vo.setResultId(detail.getResultId());
  232 + vo.setValue(detail.getValue());
  233 + vo.setRemark(detail.getRemark());
  234 + }
  235 +
  236 + voList.add(vo);
  237 + }
  238 + return voList;
  239 + }
  240 +
  241 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/MesQcResultController.java deleted
1 -package cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult;  
2 -  
3 -import cn.hutool.core.collection.CollUtil;  
4 -import cn.iocoder.yudao.framework.common.pojo.CommonResult;  
5 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
6 -import cn.iocoder.yudao.framework.common.util.object.BeanUtils;  
7 -import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.*;  
8 -import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;  
9 -import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;  
10 -import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcDO;  
11 -import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcResultDO;  
12 -import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum;  
13 -import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;  
14 -import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;  
15 -import cn.iocoder.yudao.module.mes.service.qc.lqc.MesQcIqcService;  
16 -import cn.iocoder.yudao.module.mes.service.qc.indicatorresult.MesQcResultService;  
17 -import io.swagger.v3.oas.annotations.Operation;  
18 -import io.swagger.v3.oas.annotations.Parameter;  
19 -import io.swagger.v3.oas.annotations.Parameters;  
20 -import io.swagger.v3.oas.annotations.tags.Tag;  
21 -import jakarta.annotation.Resource;  
22 -import jakarta.validation.Valid;  
23 -import org.springframework.security.access.prepost.PreAuthorize;  
24 -import org.springframework.validation.annotation.Validated;  
25 -import org.springframework.web.bind.annotation.*;  
26 -  
27 -import java.util.Collections;  
28 -import java.util.List;  
29 -import java.util.Map;  
30 -import java.util.Objects;  
31 -  
32 -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;  
33 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;  
34 -import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen;  
35 -  
36 -@Tag(name = "管理后台 - MES 检验结果")  
37 -@RestController  
38 -@RequestMapping("/mes/qc/result")  
39 -@Validated  
40 -public class MesQcResultController {  
41 -  
42 - @Resource  
43 - private MesQcResultService resultService;  
44 - @Resource  
45 - private MesQcIqcService iqcService;  
46 - @Resource  
47 - private MesMdItemService itemService;  
48 - @Resource  
49 - private MesMdUnitMeasureService unitMeasureService;  
50 -  
51 - @PostMapping("/create")  
52 - @Operation(summary = "创建检验结果")  
53 - @PreAuthorize("@ss.hasPermission('mes:qc-iqc:create')")  
54 - public CommonResult<Long> createResult(@Valid @RequestBody MesQcResultSaveReqVO createReqVO) {  
55 - return success(resultService.createResult(createReqVO));  
56 - }  
57 -  
58 - @PutMapping("/update")  
59 - @Operation(summary = "更新检验结果")  
60 - @PreAuthorize("@ss.hasPermission('mes:qc-iqc:update')")  
61 - public CommonResult<Boolean> updateResult(@Valid @RequestBody MesQcResultSaveReqVO updateReqVO) {  
62 - resultService.updateResult(updateReqVO);  
63 - return success(true);  
64 - }  
65 -  
66 - @DeleteMapping("/delete")  
67 - @Operation(summary = "删除检验结果")  
68 - @Parameter(name = "id", description = "编号", required = true)  
69 - @PreAuthorize("@ss.hasPermission('mes:qc-iqc:delete')")  
70 - public CommonResult<Boolean> deleteResult(@RequestParam("id") Long id) {  
71 - resultService.deleteResult(id);  
72 - return success(true);  
73 - }  
74 -  
75 - @GetMapping("/get")  
76 - @Operation(summary = "获得检验结果(含明细)")  
77 - @Parameter(name = "id", description = "编号", required = true, example = "1024")  
78 - @PreAuthorize("@ss.hasPermission('mes:qc-iqc:query')")  
79 - public CommonResult<MesQcResultRespVO> getResult(@RequestParam("id") Long id) {  
80 - MesQcResultDO result = resultService.getResult(id);  
81 - if (result == null) {  
82 - return success(null);  
83 - }  
84 - // 构建 RespVO(含关联字段 + 明细列表)  
85 - MesQcResultRespVO respVO = buildResultRespVOList(Collections.singletonList(result)).get(0);  
86 - // 组装明细  
87 - // TODO @AI:先查询下;然后在 buildResultRespVOList 统一 build;  
88 - respVO.setItems(resultService.getResultDetailList(result.getId(), result.getQcId(), result.getQcType()));  
89 - return success(respVO);  
90 - }  
91 -  
92 - @GetMapping("/page")  
93 - @Operation(summary = "获得检验结果分页")  
94 - @PreAuthorize("@ss.hasPermission('mes:qc-iqc:query')")  
95 - public CommonResult<PageResult<MesQcResultRespVO>> getResultPage(@Valid MesQcResultPageReqVO pageReqVO) {  
96 - PageResult<MesQcResultDO> pageResult = resultService.getResultPage(pageReqVO);  
97 - return success(new PageResult<>(buildResultRespVOList(pageResult.getList()), pageResult.getTotal()));  
98 - }  
99 -  
100 - // TODO @AI:resultService.getDetailTemplate(qcId, qcType) 放在 controller 里弄啊;  
101 - @GetMapping("/detail-template")  
102 - @Operation(summary = "获取空值检测项模板")  
103 - @Parameters({  
104 - @Parameter(name = "qcId", description = "质检单ID", required = true, example = "1"),  
105 - @Parameter(name = "qcType", description = "质检类型", required = true, example = "1")  
106 - })  
107 - @PreAuthorize("@ss.hasPermission('mes:qc-iqc:query')")  
108 - public CommonResult<List<MesQcResultDetailRespVO>> getDetailTemplate(  
109 - @RequestParam("qcId") Long qcId,  
110 - @RequestParam("qcType") Integer qcType) {  
111 - return success(resultService.getDetailTemplate(qcId, qcType));  
112 - }  
113 -  
114 - // ==================== 拼接 VO ====================  
115 -  
116 - private List<MesQcResultRespVO> buildResultRespVOList(List<MesQcResultDO> list) {  
117 - if (CollUtil.isEmpty(list)) {  
118 - return Collections.emptyList();  
119 - }  
120 - // 批量查询物料  
121 - Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(  
122 - convertSet(list, MesQcResultDO::getItemId));  
123 - // 批量查询计量单位  
124 - Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(  
125 - convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));  
126 - // 拼装 VO  
127 - return BeanUtils.toBean(list, MesQcResultRespVO.class, vo -> {  
128 - // 拼接物料信息  
129 - findAndThen(itemMap, vo.getItemId(), item -> {  
130 - vo.setItemCode(item.getCode()).setItemName(item.getName()).setItemSpecification(item.getSpecification());  
131 - findAndThen(unitMeasureMap, item.getUnitMeasureId(),  
132 - unit -> vo.setUnitName(unit.getName()));  
133 - });  
134 - // 拼接质检单编号/名称(根据 qcType 从对应服务获取)  
135 - if (Objects.equals(vo.getQcType(), MesQcTypeEnum.IQC.getType())) {  
136 - // TODO @AI:findAndThen 方式优化;  
137 - MesQcIqcDO iqc = iqcService.getIqc(vo.getQcId());  
138 - if (iqc != null) {  
139 - vo.setQcCode(iqc.getCode()).setQcName(iqc.getName());  
140 - }  
141 - }  
142 - // TODO @芋艿:IPQC/OQC/RQC 模块迁移后实现  
143 - });  
144 - }  
145 -  
146 -}  
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultPageReqVO.java renamed to yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcIndicatorResultPageReqVO.java
@@ -12,7 +12,7 @@ import lombok.ToString; @@ -12,7 +12,7 @@ import lombok.ToString;
12 @Data 12 @Data
13 @EqualsAndHashCode(callSuper = true) 13 @EqualsAndHashCode(callSuper = true)
14 @ToString(callSuper = true) 14 @ToString(callSuper = true)
15 -public class MesQcResultPageReqVO extends PageParam { 15 +public class MesQcIndicatorResultPageReqVO extends PageParam {
16 16
17 @Schema(description = "关联质检单ID", example = "1") 17 @Schema(description = "关联质检单ID", example = "1")
18 private Long qcId; 18 private Long qcId;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultRespVO.java renamed to yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcIndicatorResultRespVO.java
@@ -3,12 +3,13 @@ package cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo; @@ -3,12 +3,13 @@ package cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo;
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.Data; 4 import lombok.Data;
5 5
  6 +import java.math.BigDecimal;
6 import java.time.LocalDateTime; 7 import java.time.LocalDateTime;
7 import java.util.List; 8 import java.util.List;
8 9
9 @Schema(description = "管理后台 - MES 检验结果 Response VO") 10 @Schema(description = "管理后台 - MES 检验结果 Response VO")
10 @Data 11 @Data
11 -public class MesQcResultRespVO { 12 +public class MesQcIndicatorResultRespVO {
12 13
13 @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") 14 @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
14 private Long id; 15 private Long id;
@@ -36,28 +37,83 @@ public class MesQcResultRespVO { @@ -36,28 +37,83 @@ public class MesQcResultRespVO {
36 37
37 // ========== 关联查询字段 ========== 38 // ========== 关联查询字段 ==========
38 39
39 - @Schema(description = "质检单编号(关联查询)", example = "IQC-001") 40 + @Schema(description = "质检单编号", example = "IQC-001")
40 private String qcCode; 41 private String qcCode;
41 42
42 - @Schema(description = "质检单名称(关联查询)", example = "xxx来料检验") 43 + @Schema(description = "质检单名称", example = "xxx来料检验")
43 private String qcName; 44 private String qcName;
44 45
45 - @Schema(description = "产品物料编码(关联查询)", example = "ITEM-001") 46 + @Schema(description = "产品物料编码", example = "ITEM-001")
46 private String itemCode; 47 private String itemCode;
47 48
48 - @Schema(description = "产品物料名称(关联查询)", example = "电阻") 49 + @Schema(description = "产品物料名称", example = "电阻")
49 private String itemName; 50 private String itemName;
50 51
51 - @Schema(description = "规格型号(关联查询)", example = "100Ω") 52 + @Schema(description = "规格型号", example = "100Ω")
52 private String itemSpecification; 53 private String itemSpecification;
53 54
54 - @Schema(description = "单位名称(关联查询)", example = "个") 55 + @Schema(description = "单位名称", example = "个")
55 private String unitName; 56 private String unitName;
56 57
57 // ========== 子表:检验结果明细 ========== 58 // ========== 子表:检验结果明细 ==========
58 59
59 - // TODO @AI:内嵌进来,不用队里类文件;  
60 @Schema(description = "检验结果明细列表") 60 @Schema(description = "检验结果明细列表")
61 - private List<MesQcResultDetailRespVO> items; 61 + private List<Item> items;
  62 +
  63 + @Schema(description = "检验结果明细项")
  64 + @Data
  65 + public static class Item {
  66 +
  67 + @Schema(description = "编号", example = "1024")
  68 + private Long id;
  69 +
  70 + @Schema(description = "关联检验结果ID", example = "1")
  71 + private Long resultId;
  72 +
  73 + @Schema(description = "检测指标ID", example = "1")
  74 + private Long indicatorId;
  75 +
  76 + @Schema(description = "检测值(统一存为字符串)", example = "3.14")
  77 + private String value;
  78 +
  79 + @Schema(description = "备注", example = "无")
  80 + private String remark;
  81 +
  82 + // ========== 关联查询字段(来自 IQC line + indicator) ==========
  83 +
  84 + @Schema(description = "检测指标编码", example = "IDX-001")
  85 + private String indicatorCode;
  86 +
  87 + @Schema(description = "检测指标名称", example = "外观检查")
  88 + private String indicatorName;
  89 +
  90 + @Schema(description = "检测指标类型", example = "QUANTITATIVE")
  91 + private String indicatorType;
  92 +
  93 + @Schema(description = "质检值类型", example = "1")
  94 + private Integer valueType;
  95 +
  96 + @Schema(description = "值属性", example = "IMG")
  97 + private String valueSpecification;
  98 +
  99 + @Schema(description = "检测工具名称", example = "卡尺")
  100 + private String toolName;
  101 +
  102 + @Schema(description = "检测方法", example = "目视检查")
  103 + private String checkMethod;
  104 +
  105 + @Schema(description = "标准值", example = "10.0000")
  106 + private BigDecimal standardValue;
  107 +
  108 + @Schema(description = "计量单位名称", example = "mm")
  109 + private String unitMeasureName;
  110 +
  111 + @Schema(description = "误差上限", example = "10.5000")
  112 + private BigDecimal maxThreshold;
  113 +
  114 + @Schema(description = "误差下限", example = "9.5000")
  115 + private BigDecimal minThreshold;
  116 +
  117 + }
62 118
63 } 119 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultSaveReqVO.java renamed to yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcIndicatorResultSaveReqVO.java
1 package cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo; 1 package cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo;
2 2
  3 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  4 +import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum;
3 import io.swagger.v3.oas.annotations.media.Schema; 5 import io.swagger.v3.oas.annotations.media.Schema;
4 import jakarta.validation.constraints.NotNull; 6 import jakarta.validation.constraints.NotNull;
5 import lombok.Data; 7 import lombok.Data;
@@ -8,7 +10,7 @@ import java.util.List; @@ -8,7 +10,7 @@ import java.util.List;
8 10
9 @Schema(description = "管理后台 - MES 检验结果创建/更新 Request VO") 11 @Schema(description = "管理后台 - MES 检验结果创建/更新 Request VO")
10 @Data 12 @Data
11 -public class MesQcResultSaveReqVO { 13 +public class MesQcIndicatorResultSaveReqVO {
12 14
13 @Schema(description = "编号", example = "1024") 15 @Schema(description = "编号", example = "1024")
14 private Long id; 16 private Long id;
@@ -20,8 +22,9 @@ public class MesQcResultSaveReqVO { @@ -20,8 +22,9 @@ public class MesQcResultSaveReqVO {
20 @NotNull(message = "关联质检单ID不能为空") 22 @NotNull(message = "关联质检单ID不能为空")
21 private Long qcId; 23 private Long qcId;
22 24
23 - @Schema(description = "质检类型(1=IQC 2=IPQC 3=OQC 4=RQC)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") 25 + @Schema(description = "质检类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
24 @NotNull(message = "质检类型不能为空") 26 @NotNull(message = "质检类型不能为空")
  27 + @InEnum(MesQcTypeEnum.class)
25 private Integer qcType; 28 private Integer qcType;
26 29
27 @Schema(description = "物资SN", example = "SN-001") 30 @Schema(description = "物资SN", example = "SN-001")
@@ -30,8 +33,25 @@ public class MesQcResultSaveReqVO { @@ -30,8 +33,25 @@ public class MesQcResultSaveReqVO {
30 @Schema(description = "备注", example = "无") 33 @Schema(description = "备注", example = "无")
31 private String remark; 34 private String remark;
32 35
33 - // TODO @AI:MesQcResultDetailSaveReqVO 内嵌进来;不用独立类;  
34 @Schema(description = "检验结果明细列表") 36 @Schema(description = "检验结果明细列表")
35 - private List<MesQcResultDetailSaveReqVO> items; 37 + private List<Item> items;
  38 +
  39 + @Schema(description = "检验结果明细项")
  40 + @Data
  41 + public static class Item {
  42 +
  43 + @Schema(description = "编号(更新时传入已有明细的 ID)", example = "1024")
  44 + private Long id;
  45 +
  46 + @Schema(description = "检测指标ID", example = "1")
  47 + private Long indicatorId;
  48 +
  49 + @Schema(description = "检测值(统一存为字符串)", example = "3.14")
  50 + private String value;
  51 +
  52 + @Schema(description = "备注", example = "无")
  53 + private String remark;
  54 +
  55 + }
36 56
37 } 57 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultDetailRespVO.java deleted
1 -package cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo;  
2 -  
3 -import io.swagger.v3.oas.annotations.media.Schema;  
4 -import lombok.Data;  
5 -  
6 -import java.math.BigDecimal;  
7 -  
8 -@Schema(description = "管理后台 - MES 检验结果明细 Response VO")  
9 -@Data  
10 -public class MesQcResultDetailRespVO {  
11 -  
12 - @Schema(description = "编号", example = "1024")  
13 - private Long id;  
14 -  
15 - @Schema(description = "关联检验结果ID", example = "1")  
16 - private Long resultId;  
17 -  
18 - @Schema(description = "检测指标ID", example = "1")  
19 - private Long indicatorId;  
20 -  
21 - @Schema(description = "检测工具ID", example = "1")  
22 - private Long toolId;  
23 -  
24 - @Schema(description = "计量单位ID", example = "1")  
25 - private Long unitMeasureId;  
26 -  
27 - @Schema(description = "质检值类型(1=浮点 2=整数 3=文本 4=字典 5=文件)", example = "1")  
28 - private Integer valueType;  
29 -  
30 - @Schema(description = "值属性", example = "IMG")  
31 - private String valueSpecification;  
32 -  
33 - @Schema(description = "浮点值", example = "3.14")  
34 - private BigDecimal valueFloat;  
35 -  
36 - @Schema(description = "整数值", example = "100")  
37 - private Integer valueInteger;  
38 -  
39 - @Schema(description = "文字值", example = "合格")  
40 - private String valueText;  
41 -  
42 - @Schema(description = "字典项值", example = "PASS")  
43 - private String valueDict;  
44 -  
45 - @Schema(description = "文件值", example = "https://xxx.com/file.jpg")  
46 - private String valueFile;  
47 -  
48 - @Schema(description = "备注", example = "无")  
49 - private String remark;  
50 -  
51 - // ========== 关联查询字段(来自 IQC line + indicator) ==========  
52 -  
53 - @Schema(description = "检测指标编码(关联查询)", example = "IDX-001")  
54 - private String indicatorCode;  
55 -  
56 - @Schema(description = "检测指标名称(关联查询)", example = "外观检查")  
57 - private String indicatorName;  
58 -  
59 - @Schema(description = "检测指标类型(关联查询)", example = "QUANTITATIVE")  
60 - private String indicatorType;  
61 -  
62 - @Schema(description = "检测工具名称(关联查询)", example = "卡尺")  
63 - private String toolName;  
64 -  
65 - @Schema(description = "检测方法(关联查询)", example = "目视检查")  
66 - private String checkMethod;  
67 -  
68 - @Schema(description = "标准值(关联查询)", example = "10.0000")  
69 - private BigDecimal standardValue;  
70 -  
71 - @Schema(description = "计量单位名称(关联查询)", example = "mm")  
72 - private String unitMeasureName;  
73 -  
74 - @Schema(description = "误差上限(关联查询)", example = "10.5000")  
75 - private BigDecimal maxThreshold;  
76 -  
77 - @Schema(description = "误差下限(关联查询)", example = "9.5000")  
78 - private BigDecimal minThreshold;  
79 -  
80 -}  
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultDetailSaveReqVO.java deleted
1 -package cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo;  
2 -  
3 -import io.swagger.v3.oas.annotations.media.Schema;  
4 -import lombok.Data;  
5 -  
6 -import java.math.BigDecimal;  
7 -  
8 -@Schema(description = "管理后台 - MES 检验结果明细创建/更新 Request VO")  
9 -@Data  
10 -public class MesQcResultDetailSaveReqVO {  
11 -  
12 - @Schema(description = "编号", example = "1024")  
13 - private Long id;  
14 -  
15 - @Schema(description = "检测指标ID", example = "1")  
16 - private Long indicatorId;  
17 -  
18 - @Schema(description = "检测工具ID", example = "1")  
19 - private Long toolId;  
20 -  
21 - @Schema(description = "计量单位ID", example = "1")  
22 - private Long unitMeasureId;  
23 -  
24 - @Schema(description = "质检值类型(1=浮点 2=整数 3=文本 4=字典 5=文件)", example = "1")  
25 - private Integer valueType;  
26 -  
27 - @Schema(description = "值属性", example = "IMG")  
28 - private String valueSpecification;  
29 -  
30 - @Schema(description = "浮点值", example = "3.14")  
31 - private BigDecimal valueFloat;  
32 -  
33 - @Schema(description = "整数值", example = "100")  
34 - private Integer valueInteger;  
35 -  
36 - @Schema(description = "文字值", example = "合格")  
37 - private String valueText;  
38 -  
39 - @Schema(description = "字典项值", example = "PASS")  
40 - private String valueDict;  
41 -  
42 - @Schema(description = "文件值", example = "https://xxx.com/file.jpg")  
43 - private String valueFile;  
44 -  
45 - @Schema(description = "备注", example = "无")  
46 - private String remark;  
47 -  
48 -}  
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicator/MesQcIndicatorDO.java
@@ -37,7 +37,7 @@ public class MesQcIndicatorDO extends BaseDO { @@ -37,7 +37,7 @@ public class MesQcIndicatorDO extends BaseDO {
37 /** 37 /**
38 * 检测项类型 38 * 检测项类型
39 * 39 *
40 - * 枚举 {@link cn.iocoder.yudao.module.mes.enums.DictTypeConstants#MES_INDEX_TYPE} 40 + * 枚举 {@link cn.iocoder.yudao.module.mes.enums.DictTypeConstants#MES_INDICATOR_TYPE}
41 */ 41 */
42 private String type; 42 private String type;
43 /** 43 /**
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcResultDO.java renamed to yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcIndicatorResultDO.java
@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult; @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; 4 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
  5 +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcDO;
5 import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum; 6 import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum;
6 import com.baomidou.mybatisplus.annotation.KeySequence; 7 import com.baomidou.mybatisplus.annotation.KeySequence;
7 import com.baomidou.mybatisplus.annotation.TableId; 8 import com.baomidou.mybatisplus.annotation.TableId;
@@ -13,15 +14,15 @@ import lombok.*; @@ -13,15 +14,15 @@ import lombok.*;
13 * 14 *
14 * @author 芋道源码 15 * @author 芋道源码
15 */ 16 */
16 -@TableName("mes_qc_result")  
17 -@KeySequence("mes_qc_result_seq") 17 +@TableName("mes_qc_indicator_result")
  18 +@KeySequence("mes_qc_indicator_result_seq")
18 @Data 19 @Data
19 @EqualsAndHashCode(callSuper = true) 20 @EqualsAndHashCode(callSuper = true)
20 @ToString(callSuper = true) 21 @ToString(callSuper = true)
21 @Builder 22 @Builder
22 @NoArgsConstructor 23 @NoArgsConstructor
23 @AllArgsConstructor 24 @AllArgsConstructor
24 -public class MesQcResultDO extends BaseDO { 25 +public class MesQcIndicatorResultDO extends BaseDO {
25 26
26 /** 27 /**
27 * 编号 28 * 编号
@@ -32,9 +33,11 @@ public class MesQcResultDO extends BaseDO { @@ -32,9 +33,11 @@ public class MesQcResultDO extends BaseDO {
32 * 样品编号 33 * 样品编号
33 */ 34 */
34 private String code; 35 private String code;
35 - // TODO @AI:关联下 linkter;  
36 /** 36 /**
37 * 关联质检单 ID(IQC/IPQC/OQC/RQC 的 id) 37 * 关联质检单 ID(IQC/IPQC/OQC/RQC 的 id)
  38 + *
  39 + * 关联 IQC {@link MesQcIqcDO#getId()}
  40 + * TODO @芋艿:IPQC/OQC/RQC 关联补充
38 */ 41 */
39 private Long qcId; 42 private Long qcId;
40 /** 43 /**
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcResultDetailDO.java renamed to yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcIndicatorResultDetailDO.java
1 package cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult; 1 package cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 -import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;  
5 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicator.MesQcIndicatorDO; 4 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicator.MesQcIndicatorDO;
6 -import cn.iocoder.yudao.module.mes.dal.dataobject.tm.tool.MesTmToolDO;  
7 -import cn.iocoder.yudao.module.mes.enums.qc.MesQcResultValueTypeEnum;  
8 import com.baomidou.mybatisplus.annotation.KeySequence; 5 import com.baomidou.mybatisplus.annotation.KeySequence;
9 import com.baomidou.mybatisplus.annotation.TableId; 6 import com.baomidou.mybatisplus.annotation.TableId;
10 import com.baomidou.mybatisplus.annotation.TableName; 7 import com.baomidou.mybatisplus.annotation.TableName;
11 import lombok.*; 8 import lombok.*;
12 9
13 -import java.math.BigDecimal;  
14 -  
15 /** 10 /**
16 * MES 检验结果明细记录 DO 11 * MES 检验结果明细记录 DO
17 * 12 *
18 * @author 芋道源码 13 * @author 芋道源码
19 */ 14 */
20 -@TableName("mes_qc_result_detail")  
21 -@KeySequence("mes_qc_result_detail_seq") 15 +@TableName("mes_qc_indicator_result_detail")
  16 +@KeySequence("mes_qc_indicator_result_detail_seq")
22 @Data 17 @Data
23 @EqualsAndHashCode(callSuper = true) 18 @EqualsAndHashCode(callSuper = true)
24 @ToString(callSuper = true) 19 @ToString(callSuper = true)
25 @Builder 20 @Builder
26 @NoArgsConstructor 21 @NoArgsConstructor
27 @AllArgsConstructor 22 @AllArgsConstructor
28 -public class MesQcResultDetailDO extends BaseDO { 23 +public class MesQcIndicatorResultDetailDO extends BaseDO {
29 24
30 /** 25 /**
31 * 编号 26 * 编号
@@ -35,7 +30,7 @@ public class MesQcResultDetailDO extends BaseDO { @@ -35,7 +30,7 @@ public class MesQcResultDetailDO extends BaseDO {
35 /** 30 /**
36 * 关联检验结果 ID 31 * 关联检验结果 ID
37 * 32 *
38 - * 关联 {@link MesQcResultDO#getId()} 33 + * 关联 {@link MesQcIndicatorResultDO#getId()}
39 */ 34 */
40 private Long resultId; 35 private Long resultId;
41 /** 36 /**
@@ -44,52 +39,10 @@ public class MesQcResultDetailDO extends BaseDO { @@ -44,52 +39,10 @@ public class MesQcResultDetailDO extends BaseDO {
44 * 关联 {@link MesQcIndicatorDO#getId()} 39 * 关联 {@link MesQcIndicatorDO#getId()}
45 */ 40 */
46 private Long indicatorId; 41 private Long indicatorId;
47 - // TODO @AI:toolId、unitMeasureId、valueType、valueSpecification 都不存储;  
48 - /**  
49 - * 检测工具 ID  
50 - *  
51 - * 关联 {@link MesTmToolDO#getId()}  
52 - */  
53 - private Long toolId;  
54 - /**  
55 - * 计量单位 ID  
56 - *  
57 - * 关联 {@link MesMdUnitMeasureDO#getId()}  
58 - */  
59 - private Long unitMeasureId;  
60 - /**  
61 - * 质检值类型  
62 - *  
63 - * 枚举 {@link MesQcResultValueTypeEnum}  
64 - */  
65 - private Integer valueType;  
66 - /**  
67 - * 值属性  
68 - *  
69 - * FILE 时存 IMG/FILE;DICT 时存字典类型名  
70 - */  
71 - private String valueSpecification;  
72 - // TODO @AI:是不是可以调整成 String value?  
73 - /**  
74 - * 浮点值  
75 - */  
76 - private BigDecimal valueFloat;  
77 - /**  
78 - * 整数值  
79 - */  
80 - private Integer valueInteger;  
81 - /**  
82 - * 文字值  
83 - */  
84 - private String valueText;  
85 - /**  
86 - * 字典项值  
87 - */  
88 - private String valueDict;  
89 /** 42 /**
90 - * 文件值 43 + * 检测值(统一存为字符串)
91 */ 44 */
92 - private String valueFile; 45 + private String value;
93 /** 46 /**
94 * 备注 47 * 备注
95 */ 48 */
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcResultDetailMapper.java renamed to yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcIndicatorResultDetailMapper.java
@@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.mes.dal.mysql.qc.indicatorresult; @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.mes.dal.mysql.qc.indicatorresult;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
4 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
5 -import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcResultDetailDO; 5 +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDetailDO;
6 import org.apache.ibatis.annotations.Mapper; 6 import org.apache.ibatis.annotations.Mapper;
7 7
8 import java.util.List; 8 import java.util.List;
@@ -13,15 +13,15 @@ import java.util.List; @@ -13,15 +13,15 @@ import java.util.List;
13 * @author 芋道源码 13 * @author 芋道源码
14 */ 14 */
15 @Mapper 15 @Mapper
16 -public interface MesQcResultDetailMapper extends BaseMapperX<MesQcResultDetailDO> { 16 +public interface MesQcIndicatorResultDetailMapper extends BaseMapperX<MesQcIndicatorResultDetailDO> {
17 17
18 - default List<MesQcResultDetailDO> selectListByResultId(Long resultId) {  
19 - return selectList(MesQcResultDetailDO::getResultId, resultId); 18 + default List<MesQcIndicatorResultDetailDO> selectListByResultId(Long resultId) {
  19 + return selectList(MesQcIndicatorResultDetailDO::getResultId, resultId);
20 } 20 }
21 21
22 default void deleteByResultId(Long resultId) { 22 default void deleteByResultId(Long resultId) {
23 - delete(new LambdaQueryWrapperX<MesQcResultDetailDO>()  
24 - .eq(MesQcResultDetailDO::getResultId, resultId)); 23 + delete(new LambdaQueryWrapperX<MesQcIndicatorResultDetailDO>()
  24 + .eq(MesQcIndicatorResultDetailDO::getResultId, resultId));
25 } 25 }
26 26
27 } 27 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcResultMapper.java renamed to yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcIndicatorResultMapper.java
@@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.mes.dal.mysql.qc.indicatorresult; @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.mes.dal.mysql.qc.indicatorresult;
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
6 -import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcResultPageReqVO;  
7 -import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcResultDO; 6 +import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcIndicatorResultPageReqVO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDO;
8 import org.apache.ibatis.annotations.Mapper; 8 import org.apache.ibatis.annotations.Mapper;
9 9
10 /** 10 /**
@@ -13,15 +13,15 @@ import org.apache.ibatis.annotations.Mapper; @@ -13,15 +13,15 @@ import org.apache.ibatis.annotations.Mapper;
13 * @author 芋道源码 13 * @author 芋道源码
14 */ 14 */
15 @Mapper 15 @Mapper
16 -public interface MesQcResultMapper extends BaseMapperX<MesQcResultDO> { 16 +public interface MesQcIndicatorResultMapper extends BaseMapperX<MesQcIndicatorResultDO> {
17 17
18 - default PageResult<MesQcResultDO> selectPage(MesQcResultPageReqVO reqVO) {  
19 - return selectPage(reqVO, new LambdaQueryWrapperX<MesQcResultDO>()  
20 - .eqIfPresent(MesQcResultDO::getQcId, reqVO.getQcId())  
21 - .eqIfPresent(MesQcResultDO::getQcType, reqVO.getQcType())  
22 - .likeIfPresent(MesQcResultDO::getCode, reqVO.getCode())  
23 - .eqIfPresent(MesQcResultDO::getItemId, reqVO.getItemId())  
24 - .orderByDesc(MesQcResultDO::getId)); 18 + default PageResult<MesQcIndicatorResultDO> selectPage(MesQcIndicatorResultPageReqVO reqVO) {
  19 + return selectPage(reqVO, new LambdaQueryWrapperX<MesQcIndicatorResultDO>()
  20 + .eqIfPresent(MesQcIndicatorResultDO::getQcId, reqVO.getQcId())
  21 + .eqIfPresent(MesQcIndicatorResultDO::getQcType, reqVO.getQcType())
  22 + .likeIfPresent(MesQcIndicatorResultDO::getCode, reqVO.getCode())
  23 + .eqIfPresent(MesQcIndicatorResultDO::getItemId, reqVO.getItemId())
  24 + .orderByDesc(MesQcIndicatorResultDO::getId));
25 } 25 }
26 26
27 } 27 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java
@@ -18,7 +18,7 @@ public interface DictTypeConstants { @@ -18,7 +18,7 @@ public interface DictTypeConstants {
18 String MES_CAL_PLAN_STATUS = "mes_cal_plan_status"; // MES 排班计划状态 18 String MES_CAL_PLAN_STATUS = "mes_cal_plan_status"; // MES 排班计划状态
19 String MES_DV_MACHINERY_STATUS = "mes_dv_machinery_status"; // MES 设备状态 19 String MES_DV_MACHINERY_STATUS = "mes_dv_machinery_status"; // MES 设备状态
20 String MES_DV_SUBJECT_TYPE = "mes_dv_subject_type"; // MES 点检保养项目类型 20 String MES_DV_SUBJECT_TYPE = "mes_dv_subject_type"; // MES 点检保养项目类型
21 - String MES_INDEX_TYPE = "mes_index_type"; // MES 检测项类型 21 + String MES_INDICATOR_TYPE = "mes_indicator_type"; // MES 检测项类型
22 String MES_QC_RESULT_TYPE = "mes_qc_result_type"; // MES 质检结果值类型 22 String MES_QC_RESULT_TYPE = "mes_qc_result_type"; // MES 质检结果值类型
23 String MES_DEFECT_LEVEL = "mes_defect_level"; // MES 缺陷等级 23 String MES_DEFECT_LEVEL = "mes_defect_level"; // MES 缺陷等级
24 String MES_PRO_WORK_ORDER_STATUS = "mes_pro_work_order_status"; // MES 生产工单状态 24 String MES_PRO_WORK_ORDER_STATUS = "mes_pro_work_order_status"; // MES 生产工单状态
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcResultService.java renamed to yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultService.java
1 package cn.iocoder.yudao.module.mes.service.qc.indicatorresult; 1 package cn.iocoder.yudao.module.mes.service.qc.indicatorresult;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 -import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcResultDetailRespVO;  
5 -import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcResultPageReqVO;  
6 -import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcResultSaveReqVO;  
7 -import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcResultDO; 4 +import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcIndicatorResultPageReqVO;
  5 +import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcIndicatorResultSaveReqVO;
  6 +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDetailDO;
8 import jakarta.validation.Valid; 8 import jakarta.validation.Valid;
9 9
10 import java.util.List; 10 import java.util.List;
@@ -14,7 +14,7 @@ import java.util.List; @@ -14,7 +14,7 @@ import java.util.List;
14 * 14 *
15 * @author 芋道源码 15 * @author 芋道源码
16 */ 16 */
17 -public interface MesQcResultService { 17 +public interface MesQcIndicatorResultService {
18 18
19 /** 19 /**
20 * 创建检验结果(含明细) 20 * 创建检验结果(含明细)
@@ -22,21 +22,21 @@ public interface MesQcResultService { @@ -22,21 +22,21 @@ public interface MesQcResultService {
22 * @param createReqVO 创建信息 22 * @param createReqVO 创建信息
23 * @return 编号 23 * @return 编号
24 */ 24 */
25 - Long createResult(@Valid MesQcResultSaveReqVO createReqVO); 25 + Long createIndicatorResult(@Valid MesQcIndicatorResultSaveReqVO createReqVO);
26 26
27 /** 27 /**
28 * 更新检验结果(含明细) 28 * 更新检验结果(含明细)
29 * 29 *
30 * @param updateReqVO 更新信息 30 * @param updateReqVO 更新信息
31 */ 31 */
32 - void updateResult(@Valid MesQcResultSaveReqVO updateReqVO); 32 + void updateIndicatorResult(@Valid MesQcIndicatorResultSaveReqVO updateReqVO);
33 33
34 /** 34 /**
35 * 删除检验结果(级联删除明细) 35 * 删除检验结果(级联删除明细)
36 * 36 *
37 * @param id 编号 37 * @param id 编号
38 */ 38 */
39 - void deleteResult(Long id); 39 + void deleteIndicatorResult(Long id);
40 40
41 /** 41 /**
42 * 获得检验结果 42 * 获得检验结果
@@ -44,7 +44,7 @@ public interface MesQcResultService { @@ -44,7 +44,7 @@ public interface MesQcResultService {
44 * @param id 编号 44 * @param id 编号
45 * @return 检验结果 45 * @return 检验结果
46 */ 46 */
47 - MesQcResultDO getResult(Long id); 47 + MesQcIndicatorResultDO getIndicatorResult(Long id);
48 48
49 /** 49 /**
50 * 获得检验结果分页 50 * 获得检验结果分页
@@ -52,25 +52,14 @@ public interface MesQcResultService { @@ -52,25 +52,14 @@ public interface MesQcResultService {
52 * @param pageReqVO 分页查询 52 * @param pageReqVO 分页查询
53 * @return 检验结果分页 53 * @return 检验结果分页
54 */ 54 */
55 - PageResult<MesQcResultDO> getResultPage(MesQcResultPageReqVO pageReqVO); 55 + PageResult<MesQcIndicatorResultDO> getIndicatorResultPage(MesQcIndicatorResultPageReqVO pageReqVO);
56 56
57 /** 57 /**
58 - * 获取检验结果明细列表(含已填值,组装 IQC line + indicator 信息) 58 + * 获取检验结果明细列表
59 * 59 *
60 * @param resultId 检验结果 ID 60 * @param resultId 检验结果 ID
61 - * @param qcId 质检单 ID  
62 - * @param qcType 质检类型  
63 * @return 明细列表 61 * @return 明细列表
64 */ 62 */
65 - List<MesQcResultDetailRespVO> getResultDetailList(Long resultId, Long qcId, Integer qcType);  
66 -  
67 - /**  
68 - * 获取空值检测项模板(新建结果时用)  
69 - *  
70 - * @param qcId 质检单 ID  
71 - * @param qcType 质检类型  
72 - * @return 空值明细列表  
73 - */  
74 - List<MesQcResultDetailRespVO> getDetailTemplate(Long qcId, Integer qcType); 63 + List<MesQcIndicatorResultDetailDO> getIndicatorResultDetailListByResultId(Long resultId);
75 64
76 } 65 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.service.qc.indicatorresult;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  6 +import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcIndicatorResultPageReqVO;
  7 +import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcIndicatorResultSaveReqVO;
  8 +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcDO;
  9 +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDO;
  10 +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDetailDO;
  11 +import cn.iocoder.yudao.module.mes.dal.mysql.qc.indicatorresult.MesQcIndicatorResultDetailMapper;
  12 +import cn.iocoder.yudao.module.mes.dal.mysql.qc.indicatorresult.MesQcIndicatorResultMapper;
  13 +import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum;
  14 +import cn.iocoder.yudao.module.mes.service.qc.lqc.MesQcIqcService;
  15 +import jakarta.annotation.Resource;
  16 +import org.springframework.stereotype.Service;
  17 +import org.springframework.transaction.annotation.Transactional;
  18 +import org.springframework.validation.annotation.Validated;
  19 +
  20 +import java.util.*;
  21 +
  22 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  23 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
  24 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
  25 +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
  26 +
  27 +/**
  28 + * MES 检验结果 Service 实现类
  29 + *
  30 + * @author 芋道源码
  31 + */
  32 +@Service
  33 +@Validated
  34 +public class MesQcIndicatorResultServiceImpl implements MesQcIndicatorResultService {
  35 +
  36 + @Resource
  37 + private MesQcIndicatorResultMapper resultMapper;
  38 + @Resource
  39 + private MesQcIndicatorResultDetailMapper resultDetailMapper;
  40 +
  41 + @Resource
  42 + private MesQcIqcService iqcService;
  43 +
  44 + @Override
  45 + @Transactional(rollbackFor = Exception.class)
  46 + public Long createIndicatorResult(MesQcIndicatorResultSaveReqVO createReqVO) {
  47 + // 1. 校验明细不为空
  48 + // TODO @AI:是不是 MesQcIndicatorResultSaveReqVO validator 参数校验;
  49 + List<MesQcIndicatorResultSaveReqVO.Item> items = createReqVO.getItems();
  50 + if (CollUtil.isEmpty(items)) {
  51 + throw exception(QC_RESULT_ITEMS_EMPTY);
  52 + }
  53 +
  54 + // 2. 根据 qcType 查询源质检单,获取 itemId
  55 + Long itemId = getItemIdFromQcDoc(createReqVO.getQcId(), createReqVO.getQcType());
  56 +
  57 + // 3.1 插入主表
  58 + MesQcIndicatorResultDO result = BeanUtils.toBean(createReqVO, MesQcIndicatorResultDO.class);
  59 + result.setItemId(itemId);
  60 + resultMapper.insert(result);
  61 + // 3.2 批量插入明细
  62 + List<MesQcIndicatorResultDetailDO> details = BeanUtils.toBean(items, MesQcIndicatorResultDetailDO.class);
  63 + details.forEach(detail -> detail.setResultId(result.getId()));
  64 + resultDetailMapper.insertBatch(details);
  65 + return result.getId();
  66 + }
  67 +
  68 + @Override
  69 + @Transactional(rollbackFor = Exception.class)
  70 + public void updateIndicatorResult(MesQcIndicatorResultSaveReqVO updateReqVO) {
  71 + // 1. 校验存在
  72 + validateIndicatorResultExists(updateReqVO.getId());
  73 +
  74 + // 2. 校验明细不为空
  75 + // TODO @AI:是不是 MesQcIndicatorResultSaveReqVO validator 参数校验;
  76 + List<MesQcIndicatorResultSaveReqVO.Item> items = updateReqVO.getItems();
  77 + if (CollUtil.isEmpty(items)) {
  78 + throw exception(QC_RESULT_ITEMS_EMPTY);
  79 + }
  80 +
  81 + // 2.1 更新主表
  82 + MesQcIndicatorResultDO updateObj = BeanUtils.toBean(updateReqVO, MesQcIndicatorResultDO.class);
  83 + resultMapper.updateById(updateObj);
  84 +
  85 + // TODO @AI:直接 for 循环,resultMapper.insertOrUpdate() 简单粗暴点!
  86 + // 4. 更新明细:diff 方式(有 id → 更新,无 id → 新增,不在列表中 → 删除)
  87 + List<MesQcIndicatorResultDetailDO> existingDetails = resultDetailMapper.selectListByResultId(updateReqVO.getId());
  88 + Map<Long, MesQcIndicatorResultDetailDO> existingMap = convertMap(existingDetails, MesQcIndicatorResultDetailDO::getId);
  89 +
  90 + // 4.1 收集前端传入的、已有 id 的集合
  91 + Set<Long> newItemIds = convertSet(items, MesQcIndicatorResultSaveReqVO.Item::getId);
  92 + newItemIds.remove(null);
  93 +
  94 + // 4.2 遍历传入的明细:有 id 则更新,无 id 则新增
  95 + for (MesQcIndicatorResultSaveReqVO.Item item : items) {
  96 + MesQcIndicatorResultDetailDO detail = BeanUtils.toBean(item, MesQcIndicatorResultDetailDO.class);
  97 + detail.setResultId(updateReqVO.getId());
  98 + if (item.getId() != null && existingMap.containsKey(item.getId())) {
  99 + // 更新已有记录
  100 + resultDetailMapper.updateById(detail);
  101 + } else {
  102 + // 新增记录
  103 + detail.setId(null);
  104 + resultDetailMapper.insert(detail);
  105 + }
  106 + }
  107 +
  108 + // 4.3 删除不在新列表中的旧记录
  109 + for (MesQcIndicatorResultDetailDO existing : existingDetails) {
  110 + if (!newItemIds.contains(existing.getId())) {
  111 + resultDetailMapper.deleteById(existing.getId());
  112 + }
  113 + }
  114 + }
  115 +
  116 + @Override
  117 + @Transactional(rollbackFor = Exception.class)
  118 + public void deleteIndicatorResult(Long id) {
  119 + // 1. 校验存在
  120 + validateIndicatorResultExists(id);
  121 +
  122 + // 2.1 级联删除明细
  123 + resultDetailMapper.deleteByResultId(id);
  124 + // 2.2 删除主表
  125 + resultMapper.deleteById(id);
  126 + }
  127 +
  128 + @Override
  129 + public MesQcIndicatorResultDO getIndicatorResult(Long id) {
  130 + return resultMapper.selectById(id);
  131 + }
  132 +
  133 + @Override
  134 + public PageResult<MesQcIndicatorResultDO> getIndicatorResultPage(MesQcIndicatorResultPageReqVO pageReqVO) {
  135 + return resultMapper.selectPage(pageReqVO);
  136 + }
  137 +
  138 + @Override
  139 + public List<MesQcIndicatorResultDetailDO> getIndicatorResultDetailListByResultId(Long resultId) {
  140 + return resultDetailMapper.selectListByResultId(resultId);
  141 + }
  142 +
  143 + // ==================== 私有方法 ====================
  144 +
  145 + private MesQcIndicatorResultDO validateIndicatorResultExists(Long id) {
  146 + MesQcIndicatorResultDO result = resultMapper.selectById(id);
  147 + if (result == null) {
  148 + throw exception(QC_RESULT_NOT_EXISTS);
  149 + }
  150 + return result;
  151 + }
  152 +
  153 + /**
  154 + * 根据 qcType 查询源质检单,获取 itemId
  155 + */
  156 + private Long getItemIdFromQcDoc(Long qcId, Integer qcType) {
  157 + if (Objects.equals(qcType, MesQcTypeEnum.IQC.getType())) {
  158 + // TODO @AI:使用 iqcService 的 validateIqcExists 方法,这样更聚焦!
  159 + MesQcIqcDO iqc = iqcService.getIqc(qcId);
  160 + if (iqc == null) {
  161 + throw exception(QC_RESULT_SOURCE_DOC_NOT_EXISTS);
  162 + }
  163 + return iqc.getItemId();
  164 + }
  165 + // TODO @芋艿:IPQC/OQC/RQC 模块迁移后实现
  166 + throw exception(QC_RESULT_SOURCE_DOC_TYPE_INVALID);
  167 + }
  168 +
  169 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcResultServiceImpl.java deleted
1 -package cn.iocoder.yudao.module.mes.service.qc.indicatorresult;  
2 -  
3 -import cn.hutool.core.collection.CollUtil;  
4 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
5 -import cn.iocoder.yudao.framework.common.util.object.BeanUtils;  
6 -import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcResultDetailRespVO;  
7 -import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcResultDetailSaveReqVO;  
8 -import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcResultPageReqVO;  
9 -import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcResultSaveReqVO;  
10 -import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;  
11 -import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicator.MesQcIndicatorDO;  
12 -import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcDO;  
13 -import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcLineDO;  
14 -import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcResultDO;  
15 -import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcResultDetailDO;  
16 -import cn.iocoder.yudao.module.mes.dal.dataobject.tm.tool.MesTmToolDO;  
17 -import cn.iocoder.yudao.module.mes.dal.mysql.qc.lqc.MesQcIqcLineMapper;  
18 -import cn.iocoder.yudao.module.mes.dal.mysql.qc.indicatorresult.MesQcResultDetailMapper;  
19 -import cn.iocoder.yudao.module.mes.dal.mysql.qc.indicatorresult.MesQcResultMapper;  
20 -import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum;  
21 -import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;  
22 -import cn.iocoder.yudao.module.mes.service.qc.indicator.MesQcIndicatorService;  
23 -import cn.iocoder.yudao.module.mes.service.qc.lqc.MesQcIqcService;  
24 -import cn.iocoder.yudao.module.mes.service.tm.tool.MesTmToolService;  
25 -import jakarta.annotation.Resource;  
26 -import org.springframework.stereotype.Service;  
27 -import org.springframework.transaction.annotation.Transactional;  
28 -import org.springframework.validation.annotation.Validated;  
29 -  
30 -import java.util.*;  
31 -  
32 -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;  
33 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;  
34 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;  
35 -import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen;  
36 -import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;  
37 -  
38 -/**  
39 - * MES 检验结果 Service 实现类  
40 - *  
41 - * @author 芋道源码  
42 - */  
43 -@Service  
44 -@Validated  
45 -public class MesQcResultServiceImpl implements MesQcResultService {  
46 -  
47 - @Resource  
48 - private MesQcResultMapper resultMapper;  
49 - @Resource  
50 - private MesQcResultDetailMapper resultDetailMapper;  
51 -  
52 - @Resource  
53 - private MesQcIqcService iqcService;  
54 - @Resource  
55 - private MesQcIqcLineMapper iqcLineMapper;  
56 - @Resource  
57 - private MesQcIndicatorService indicatorService;  
58 - @Resource  
59 - private MesMdUnitMeasureService unitMeasureService;  
60 - @Resource  
61 - private MesTmToolService toolService;  
62 -  
63 - @Override  
64 - @Transactional(rollbackFor = Exception.class)  
65 - public Long createResult(MesQcResultSaveReqVO createReqVO) {  
66 - // 1. 校验明细不为空  
67 - List<MesQcResultDetailSaveReqVO> items = createReqVO.getItems();  
68 - if (CollUtil.isEmpty(items)) {  
69 - throw exception(QC_RESULT_ITEMS_EMPTY);  
70 - }  
71 -  
72 - // 2. 根据 qcType 查询源质检单,获取 itemId  
73 - Long itemId = getItemIdFromQcDoc(createReqVO.getQcId(), createReqVO.getQcType());  
74 -  
75 - // 3. 插入主表  
76 - MesQcResultDO result = BeanUtils.toBean(createReqVO, MesQcResultDO.class);  
77 - result.setItemId(itemId);  
78 - resultMapper.insert(result);  
79 -  
80 - // 4. 批量插入明细  
81 - List<MesQcResultDetailDO> details = BeanUtils.toBean(items, MesQcResultDetailDO.class);  
82 - details.forEach(detail -> detail.setResultId(result.getId()));  
83 - resultDetailMapper.insertBatch(details);  
84 - return result.getId();  
85 - }  
86 -  
87 - @Override  
88 - @Transactional(rollbackFor = Exception.class)  
89 - public void updateResult(MesQcResultSaveReqVO updateReqVO) {  
90 - // 1. 校验存在  
91 - validateResultExists(updateReqVO.getId());  
92 -  
93 - // 2. 校验明细不为空  
94 - List<MesQcResultDetailSaveReqVO> items = updateReqVO.getItems();  
95 - if (CollUtil.isEmpty(items)) {  
96 - throw exception(QC_RESULT_ITEMS_EMPTY);  
97 - }  
98 -  
99 - // 3. 更新主表  
100 - MesQcResultDO updateObj = BeanUtils.toBean(updateReqVO, MesQcResultDO.class);  
101 - resultMapper.updateById(updateObj);  
102 -  
103 - // 4. 更新明细:先删后插  
104 - resultDetailMapper.deleteByResultId(updateReqVO.getId());  
105 - List<MesQcResultDetailDO> details = BeanUtils.toBean(items, MesQcResultDetailDO.class);  
106 - details.forEach(detail -> detail.setResultId(updateReqVO.getId()));  
107 - resultDetailMapper.insertBatch(details);  
108 - }  
109 -  
110 - @Override  
111 - @Transactional(rollbackFor = Exception.class)  
112 - public void deleteResult(Long id) {  
113 - // 1. 校验存在  
114 - validateResultExists(id);  
115 - // 2. 级联删除明细  
116 - resultDetailMapper.deleteByResultId(id);  
117 - // 3. 删除主表  
118 - resultMapper.deleteById(id);  
119 - }  
120 -  
121 - @Override  
122 - public MesQcResultDO getResult(Long id) {  
123 - return resultMapper.selectById(id);  
124 - }  
125 -  
126 - @Override  
127 - public PageResult<MesQcResultDO> getResultPage(MesQcResultPageReqVO pageReqVO) {  
128 - return resultMapper.selectPage(pageReqVO);  
129 - }  
130 -  
131 - @Override  
132 - public List<MesQcResultDetailRespVO> getResultDetailList(Long resultId, Long qcId, Integer qcType) {  
133 - return buildDetailRespVOList(resultId, qcId, qcType);  
134 - }  
135 -  
136 - @Override  
137 - public List<MesQcResultDetailRespVO> getDetailTemplate(Long qcId, Integer qcType) {  
138 - return buildDetailRespVOList(null, qcId, qcType);  
139 - }  
140 -  
141 - // ==================== 私有方法 ====================  
142 -  
143 - private MesQcResultDO validateResultExists(Long id) {  
144 - MesQcResultDO result = resultMapper.selectById(id);  
145 - if (result == null) {  
146 - throw exception(QC_RESULT_NOT_EXISTS);  
147 - }  
148 - return result;  
149 - }  
150 -  
151 - /**  
152 - * 根据 qcType 查询源质检单,获取 itemId  
153 - */  
154 - private Long getItemIdFromQcDoc(Long qcId, Integer qcType) {  
155 - if (Objects.equals(qcType, MesQcTypeEnum.IQC.getType())) {  
156 - MesQcIqcDO iqc = iqcService.getIqc(qcId);  
157 - if (iqc == null) {  
158 - throw exception(QC_RESULT_SOURCE_DOC_NOT_EXISTS);  
159 - }  
160 - return iqc.getItemId();  
161 - }  
162 - // TODO @芋艿:IPQC/OQC/RQC 模块迁移后实现  
163 - throw exception(QC_RESULT_SOURCE_DOC_TYPE_INVALID);  
164 - }  
165 -  
166 - /**  
167 - * 组装明细 VO 列表:从 IQC line + indicator + tool + unitMeasure + 已有结果明细 三方组装  
168 - *  
169 - * @param resultId 检验结果 ID,为 null 时表示获取空值模板  
170 - * @param qcId 质检单 ID  
171 - * @param qcType 质检类型  
172 - */  
173 - private List<MesQcResultDetailRespVO> buildDetailRespVOList(Long resultId, Long qcId, Integer qcType) {  
174 - // 1. 获取检验单行列表  
175 - List<MesQcIqcLineDO> lines;  
176 - if (Objects.equals(qcType, MesQcTypeEnum.IQC.getType())) {  
177 - lines = iqcLineMapper.selectListByIqcId(qcId);  
178 - } else {  
179 - // TODO @芋艿:IPQC/OQC/RQC 模块迁移后实现  
180 - return Collections.emptyList();  
181 - }  
182 - if (CollUtil.isEmpty(lines)) {  
183 - return Collections.emptyList();  
184 - }  
185 -  
186 - // 2. 批量查询关联信息  
187 - Map<Long, MesQcIndicatorDO> indicatorMap = indicatorService.getIndicatorMap(  
188 - convertSet(lines, MesQcIqcLineDO::getIndicatorId));  
189 - Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(  
190 - convertSet(lines, MesQcIqcLineDO::getUnitMeasureId));  
191 -  
192 - // 3. 查询已有结果明细(如有 resultId)  
193 - Map<Long, MesQcResultDetailDO> detailMap;  
194 - if (resultId != null) {  
195 - List<MesQcResultDetailDO> details = resultDetailMapper.selectListByResultId(resultId);  
196 - detailMap = convertMap(details, MesQcResultDetailDO::getIndicatorId);  
197 - } else {  
198 - detailMap = Collections.emptyMap();  
199 - }  
200 -  
201 - // 4. 遍历行,组装 VO  
202 - List<MesQcResultDetailRespVO> voList = new ArrayList<>(lines.size());  
203 - for (MesQcIqcLineDO line : lines) {  
204 - MesQcResultDetailRespVO vo = new MesQcResultDetailRespVO();  
205 - // 来自 IQC line  
206 - vo.setIndicatorId(line.getIndicatorId());  
207 - vo.setToolId(line.getToolId());  
208 - vo.setUnitMeasureId(line.getUnitMeasureId());  
209 - vo.setCheckMethod(line.getCheckMethod());  
210 - vo.setStandardValue(line.getStandardValue());  
211 - vo.setMaxThreshold(line.getMaxThreshold());  
212 - vo.setMinThreshold(line.getMinThreshold());  
213 -  
214 - // 来自 indicator  
215 - findAndThen(indicatorMap, line.getIndicatorId(), indicator -> {  
216 - vo.setIndicatorCode(indicator.getCode());  
217 - vo.setIndicatorName(indicator.getName());  
218 - vo.setIndicatorType(indicator.getType());  
219 - vo.setValueType(indicator.getResultType());  
220 - vo.setValueSpecification(indicator.getResultSpecification());  
221 - });  
222 -  
223 - // 来自 unitMeasure  
224 - findAndThen(unitMeasureMap, line.getUnitMeasureId(),  
225 - unit -> vo.setUnitMeasureName(unit.getName()));  
226 -  
227 - // 来自 tool(逐个查询,数量通常较少)  
228 - if (line.getToolId() != null) {  
229 - MesTmToolDO tool = toolService.getTool(line.getToolId());  
230 - if (tool != null) {  
231 - vo.setToolName(tool.getName());  
232 - }  
233 - }  
234 -  
235 - // 来自已有结果明细(如有)  
236 - MesQcResultDetailDO detail = detailMap.get(line.getIndicatorId());  
237 - if (detail != null) {  
238 - vo.setId(detail.getId());  
239 - vo.setResultId(detail.getResultId());  
240 - vo.setValueFloat(detail.getValueFloat());  
241 - vo.setValueInteger(detail.getValueInteger());  
242 - vo.setValueText(detail.getValueText());  
243 - vo.setValueDict(detail.getValueDict());  
244 - vo.setValueFile(detail.getValueFile());  
245 - }  
246 -  
247 - voList.add(vo);  
248 - }  
249 - return voList;  
250 - }  
251 -  
252 -}  
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcLineService.java
@@ -56,6 +56,14 @@ public interface MesQcIqcLineService { @@ -56,6 +56,14 @@ public interface MesQcIqcLineService {
56 void recalculateLineDefectStats(Long iqcId, List<MesQcDefectRecordDO> records); 56 void recalculateLineDefectStats(Long iqcId, List<MesQcDefectRecordDO> records);
57 57
58 /** 58 /**
  59 + * 根据来料检验单 ID 获取所有行
  60 + *
  61 + * @param iqcId 来料检验单 ID
  62 + * @return 行列表
  63 + */
  64 + List<MesQcIqcLineDO> getIqcLineListByIqcId(Long iqcId);
  65 +
  66 + /**
59 * 根据来料检验单 ID 级联删除所有行 67 * 根据来料检验单 ID 级联删除所有行
60 * 68 *
61 * @param iqcId 来料检验单 ID 69 * @param iqcId 来料检验单 ID
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcLineServiceImpl.java
@@ -101,6 +101,11 @@ public class MesQcIqcLineServiceImpl implements MesQcIqcLineService { @@ -101,6 +101,11 @@ public class MesQcIqcLineServiceImpl implements MesQcIqcLineService {
101 } 101 }
102 102
103 @Override 103 @Override
  104 + public List<MesQcIqcLineDO> getIqcLineListByIqcId(Long iqcId) {
  105 + return iqcLineMapper.selectListByIqcId(iqcId);
  106 + }
  107 +
  108 + @Override
104 public void deleteByIqcId(Long iqcId) { 109 public void deleteByIqcId(Long iqcId) {
105 iqcLineMapper.deleteByIqcId(iqcId); 110 iqcLineMapper.deleteByIqcId(iqcId);
106 } 111 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcService.java
@@ -7,7 +7,9 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.qc.defectrecord.MesQcDefectRec @@ -7,7 +7,9 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.qc.defectrecord.MesQcDefectRec
7 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcDO; 7 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcDO;
8 import jakarta.validation.Valid; 8 import jakarta.validation.Valid;
9 9
  10 +import java.util.Collection;
10 import java.util.List; 11 import java.util.List;
  12 +import java.util.Map;
11 13
12 /** 14 /**
13 * MES 来料检验单(IQC) Service 接口 15 * MES 来料检验单(IQC) Service 接口
@@ -77,4 +79,12 @@ public interface MesQcIqcService { @@ -77,4 +79,12 @@ public interface MesQcIqcService {
77 */ 79 */
78 void recalculateDefectStats(Long iqcId, List<MesQcDefectRecordDO> records); 80 void recalculateDefectStats(Long iqcId, List<MesQcDefectRecordDO> records);
79 81
  82 + /**
  83 + * 批量获取来料检验单 Map
  84 + *
  85 + * @param ids 编号集合
  86 + * @return 来料检验单 Map
  87 + */
  88 + Map<Long, MesQcIqcDO> getIqcMap(Collection<Long> ids);
  89 +
80 } 90 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcServiceImpl.java
@@ -23,8 +23,9 @@ import org.springframework.validation.annotation.Validated; @@ -23,8 +23,9 @@ import org.springframework.validation.annotation.Validated;
23 23
24 import java.math.BigDecimal; 24 import java.math.BigDecimal;
25 import java.math.RoundingMode; 25 import java.math.RoundingMode;
26 -import java.util.List;  
27 -import java.util.Objects; 26 +import java.util.*;
  27 +
  28 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
28 29
29 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 30 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
30 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; 31 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
@@ -212,4 +213,13 @@ public class MesQcIqcServiceImpl implements MesQcIqcService { @@ -212,4 +213,13 @@ public class MesQcIqcServiceImpl implements MesQcIqcService {
212 iqcMapper.updateById(updateIqc); 213 iqcMapper.updateById(updateIqc);
213 } 214 }
214 215
  216 + @Override
  217 + public Map<Long, MesQcIqcDO> getIqcMap(Collection<Long> ids) {
  218 + if (CollUtil.isEmpty(ids)) {
  219 + return Collections.emptyMap();
  220 + }
  221 + List<MesQcIqcDO> list = iqcMapper.selectBatchIds(ids);
  222 + return convertMap(list, MesQcIqcDO::getId);
  223 + }
  224 +
215 } 225 }