diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectRespVO.java index f8485f0..aae7c82 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectRespVO.java +++ b/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 { @Schema(description = "检测项类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "APPEARANCE") @ExcelProperty(value = "检测项类型", converter = DictConvert.class) - @DictFormat(DictTypeConstants.MES_INDEX_TYPE) + @DictFormat(DictTypeConstants.MES_INDICATOR_TYPE) private String type; @Schema(description = "缺陷等级", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicator/vo/MesQcIndicatorRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicator/vo/MesQcIndicatorRespVO.java index eda78af..cf5dbac 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicator/vo/MesQcIndicatorRespVO.java +++ b/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 { @Schema(description = "检测项类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "SIZE") @ExcelProperty(value = "检测项类型", converter = DictConvert.class) - @DictFormat(DictTypeConstants.MES_INDEX_TYPE) + @DictFormat(DictTypeConstants.MES_INDICATOR_TYPE) private String type; @Schema(description = "检测工具", example = "卡尺") diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/MesQcIndicatorResultController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/MesQcIndicatorResultController.java new file mode 100644 index 0000000..71bbd71 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/MesQcIndicatorResultController.java @@ -0,0 +1,241 @@ +package cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +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.indicatorresult.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicator.MesQcIndicatorDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDetailDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcLineDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.tm.tool.MesTmToolDO; +import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; +import cn.iocoder.yudao.module.mes.service.qc.indicator.MesQcIndicatorService; +import cn.iocoder.yudao.module.mes.service.qc.indicatorresult.MesQcIndicatorResultService; +import cn.iocoder.yudao.module.mes.service.qc.lqc.MesQcIqcLineService; +import cn.iocoder.yudao.module.mes.service.qc.lqc.MesQcIqcService; +import cn.iocoder.yudao.module.mes.service.tm.tool.MesTmToolService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.*; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; +import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen; + +@Tag(name = "管理后台 - MES 检验结果") +@RestController +@RequestMapping("/mes/qc/indicator-result") +@Validated +public class MesQcIndicatorResultController { + + @Resource + private MesQcIndicatorResultService resultService; + @Resource + private MesQcIqcService iqcService; + @Resource + private MesQcIqcLineService iqcLineService; + @Resource + private MesMdItemService itemService; + @Resource + private MesMdUnitMeasureService unitMeasureService; + @Resource + private MesQcIndicatorService indicatorService; + @Resource + private MesTmToolService toolService; + + @PostMapping("/create") + @Operation(summary = "创建检验结果") + @PreAuthorize("@ss.hasPermission('mes:qc-iqc:create')") + public CommonResult createIndicatorResult(@Valid @RequestBody MesQcIndicatorResultSaveReqVO createReqVO) { + return success(resultService.createIndicatorResult(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新检验结果") + @PreAuthorize("@ss.hasPermission('mes:qc-iqc:update')") + public CommonResult updateIndicatorResult(@Valid @RequestBody MesQcIndicatorResultSaveReqVO updateReqVO) { + resultService.updateIndicatorResult(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除检验结果") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:qc-iqc:delete')") + public CommonResult deleteIndicatorResult(@RequestParam("id") Long id) { + resultService.deleteIndicatorResult(id); + return success(true); + } + + // TODO @AI:是不是把 get 和 getIndicatorResultDetailTemplate 合并为一个接口?参数是 qcId + qcType;新的接口是 get-detail; + @GetMapping("/get") + @Operation(summary = "获得检验结果(含明细)") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:qc-iqc:query')") + public CommonResult getIndicatorResult(@RequestParam("id") Long id) { + MesQcIndicatorResultDO result = resultService.getIndicatorResult(id); + if (result == null) { + return success(null); + } + // 构建 RespVO(含关联字段) + MesQcIndicatorResultRespVO respVO = buildIndicatorResultRespVOList(Collections.singletonList(result)).get(0); + // 查询明细并组装 + List details = resultService.getIndicatorResultDetailListByResultId(result.getId()); + respVO.setItems(buildDetailItemList(details, result.getQcId(), result.getQcType())); + return success(respVO); + } + + @GetMapping("/page") + @Operation(summary = "获得检验结果分页") + @PreAuthorize("@ss.hasPermission('mes:qc-iqc:query')") + public CommonResult> getIndicatorResultPage(@Valid MesQcIndicatorResultPageReqVO pageReqVO) { + PageResult pageResult = resultService.getIndicatorResultPage(pageReqVO); + return success(new PageResult<>(buildIndicatorResultRespVOList(pageResult.getList()), pageResult.getTotal())); + } + + @GetMapping("/detail-template") + @Operation(summary = "获取空值检测项模板") + @Parameters({ + @Parameter(name = "qcId", description = "质检单ID", required = true, example = "1"), + @Parameter(name = "qcType", description = "质检类型", required = true, example = "1") + }) + @PreAuthorize("@ss.hasPermission('mes:qc-iqc:query')") + public CommonResult> getIndicatorResultDetailTemplate( + @RequestParam("qcId") Long qcId, + @RequestParam("qcType") Integer qcType) { + return success(buildDetailItemList(Collections.emptyList(), qcId, qcType)); + } + + // ==================== 拼接 VO ==================== + + /** + * 构建主表 RespVO 列表(拼接物料、质检单等关联信息) + */ + private List buildIndicatorResultRespVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + // 批量查询物料 + Map itemMap = itemService.getItemMap( + convertSet(list, MesQcIndicatorResultDO::getItemId)); + // 批量查询计量单位 + Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); + // 批量查询 IQC 质检单 + Set iqcIds = convertSet(list, r -> + Objects.equals(r.getQcType(), MesQcTypeEnum.IQC.getType()) ? r.getQcId() : null); + iqcIds.remove(null); + Map iqcMap = iqcService.getIqcMap(iqcIds); + + // 拼装 VO + return BeanUtils.toBean(list, MesQcIndicatorResultRespVO.class, vo -> { + // 拼接物料信息 + findAndThen(itemMap, vo.getItemId(), item -> { + vo.setItemCode(item.getCode()).setItemName(item.getName()).setItemSpecification(item.getSpecification()); + findAndThen(unitMeasureMap, item.getUnitMeasureId(), + unit -> vo.setUnitName(unit.getName())); + }); + // 拼接质检单编号/名称 + if (Objects.equals(vo.getQcType(), MesQcTypeEnum.IQC.getType())) { + findAndThen(iqcMap, vo.getQcId(), iqc -> + vo.setQcCode(iqc.getCode()).setQcName(iqc.getName())); + } + // TODO @芋艿:IPQC/OQC/RQC 模块迁移后实现 + }); + } + + /** + * 构建明细 Item 列表:从 IQC line + indicator + tool + unitMeasure + 已有结果明细组装 + * + * @param details 已有结果明细(空列表表示获取空值模板) + * @param qcId 质检单 ID + * @param qcType 质检类型 + */ + private List buildDetailItemList( + List details, Long qcId, Integer qcType) { + // 1. 获取检验单行列表 + List lines; + if (Objects.equals(qcType, MesQcTypeEnum.IQC.getType())) { + lines = iqcLineService.getIqcLineListByIqcId(qcId); + } else { + // TODO @芋艿:IPQC/OQC/RQC 模块迁移后实现 + return Collections.emptyList(); + } + if (CollUtil.isEmpty(lines)) { + return Collections.emptyList(); + } + + // 2. 批量查询关联信息 + Map indicatorMap = indicatorService.getIndicatorMap( + convertSet(lines, MesQcIqcLineDO::getIndicatorId)); + Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( + convertSet(lines, MesQcIqcLineDO::getUnitMeasureId)); + + // 3. 构建已有明细 Map(按 indicatorId 索引) + Map detailMap = CollUtil.isEmpty(details) + ? Collections.emptyMap() + : convertMap(details, MesQcIndicatorResultDetailDO::getIndicatorId); + + // 4. 遍历行,组装 VO + List voList = new ArrayList<>(lines.size()); + for (MesQcIqcLineDO line : lines) { + MesQcIndicatorResultRespVO.Item vo = new MesQcIndicatorResultRespVO.Item(); + // 来自 IQC line + vo.setIndicatorId(line.getIndicatorId()); + vo.setCheckMethod(line.getCheckMethod()); + vo.setStandardValue(line.getStandardValue()); + vo.setMaxThreshold(line.getMaxThreshold()); + vo.setMinThreshold(line.getMinThreshold()); + + // 来自 indicator + findAndThen(indicatorMap, line.getIndicatorId(), indicator -> { + vo.setIndicatorCode(indicator.getCode()); + vo.setIndicatorName(indicator.getName()); + vo.setIndicatorType(indicator.getType()); + vo.setValueType(indicator.getResultType()); + vo.setValueSpecification(indicator.getResultSpecification()); + }); + + // 来自 unitMeasure + findAndThen(unitMeasureMap, line.getUnitMeasureId(), + unit -> vo.setUnitMeasureName(unit.getName())); + + // 来自 tool(逐个查询,数量通常较少) + if (line.getToolId() != null) { + MesTmToolDO tool = toolService.getTool(line.getToolId()); + if (tool != null) { + vo.setToolName(tool.getName()); + } + } + + // 来自已有结果明细(如有) + MesQcIndicatorResultDetailDO detail = detailMap.get(line.getIndicatorId()); + if (detail != null) { + vo.setId(detail.getId()); + vo.setResultId(detail.getResultId()); + vo.setValue(detail.getValue()); + vo.setRemark(detail.getRemark()); + } + + voList.add(vo); + } + return voList; + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/MesQcResultController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/MesQcResultController.java deleted file mode 100644 index a0d9e0f..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/MesQcResultController.java +++ /dev/null @@ -1,146 +0,0 @@ -package cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -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.indicatorresult.vo.*; -import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcResultDO; -import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum; -import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; -import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; -import cn.iocoder.yudao.module.mes.service.qc.lqc.MesQcIqcService; -import cn.iocoder.yudao.module.mes.service.qc.indicatorresult.MesQcResultService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Parameters; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; -import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen; - -@Tag(name = "管理后台 - MES 检验结果") -@RestController -@RequestMapping("/mes/qc/result") -@Validated -public class MesQcResultController { - - @Resource - private MesQcResultService resultService; - @Resource - private MesQcIqcService iqcService; - @Resource - private MesMdItemService itemService; - @Resource - private MesMdUnitMeasureService unitMeasureService; - - @PostMapping("/create") - @Operation(summary = "创建检验结果") - @PreAuthorize("@ss.hasPermission('mes:qc-iqc:create')") - public CommonResult createResult(@Valid @RequestBody MesQcResultSaveReqVO createReqVO) { - return success(resultService.createResult(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新检验结果") - @PreAuthorize("@ss.hasPermission('mes:qc-iqc:update')") - public CommonResult updateResult(@Valid @RequestBody MesQcResultSaveReqVO updateReqVO) { - resultService.updateResult(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除检验结果") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('mes:qc-iqc:delete')") - public CommonResult deleteResult(@RequestParam("id") Long id) { - resultService.deleteResult(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得检验结果(含明细)") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('mes:qc-iqc:query')") - public CommonResult getResult(@RequestParam("id") Long id) { - MesQcResultDO result = resultService.getResult(id); - if (result == null) { - return success(null); - } - // 构建 RespVO(含关联字段 + 明细列表) - MesQcResultRespVO respVO = buildResultRespVOList(Collections.singletonList(result)).get(0); - // 组装明细 - // TODO @AI:先查询下;然后在 buildResultRespVOList 统一 build; - respVO.setItems(resultService.getResultDetailList(result.getId(), result.getQcId(), result.getQcType())); - return success(respVO); - } - - @GetMapping("/page") - @Operation(summary = "获得检验结果分页") - @PreAuthorize("@ss.hasPermission('mes:qc-iqc:query')") - public CommonResult> getResultPage(@Valid MesQcResultPageReqVO pageReqVO) { - PageResult pageResult = resultService.getResultPage(pageReqVO); - return success(new PageResult<>(buildResultRespVOList(pageResult.getList()), pageResult.getTotal())); - } - - // TODO @AI:resultService.getDetailTemplate(qcId, qcType) 放在 controller 里弄啊; - @GetMapping("/detail-template") - @Operation(summary = "获取空值检测项模板") - @Parameters({ - @Parameter(name = "qcId", description = "质检单ID", required = true, example = "1"), - @Parameter(name = "qcType", description = "质检类型", required = true, example = "1") - }) - @PreAuthorize("@ss.hasPermission('mes:qc-iqc:query')") - public CommonResult> getDetailTemplate( - @RequestParam("qcId") Long qcId, - @RequestParam("qcType") Integer qcType) { - return success(resultService.getDetailTemplate(qcId, qcType)); - } - - // ==================== 拼接 VO ==================== - - private List buildResultRespVOList(List list) { - if (CollUtil.isEmpty(list)) { - return Collections.emptyList(); - } - // 批量查询物料 - Map itemMap = itemService.getItemMap( - convertSet(list, MesQcResultDO::getItemId)); - // 批量查询计量单位 - Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( - convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); - // 拼装 VO - return BeanUtils.toBean(list, MesQcResultRespVO.class, vo -> { - // 拼接物料信息 - findAndThen(itemMap, vo.getItemId(), item -> { - vo.setItemCode(item.getCode()).setItemName(item.getName()).setItemSpecification(item.getSpecification()); - findAndThen(unitMeasureMap, item.getUnitMeasureId(), - unit -> vo.setUnitName(unit.getName())); - }); - // 拼接质检单编号/名称(根据 qcType 从对应服务获取) - if (Objects.equals(vo.getQcType(), MesQcTypeEnum.IQC.getType())) { - // TODO @AI:findAndThen 方式优化; - MesQcIqcDO iqc = iqcService.getIqc(vo.getQcId()); - if (iqc != null) { - vo.setQcCode(iqc.getCode()).setQcName(iqc.getName()); - } - } - // TODO @芋艿:IPQC/OQC/RQC 模块迁移后实现 - }); - } - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcIndicatorResultPageReqVO.java index 2a4c199..cd830cf 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultPageReqVO.java +++ b/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; @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class MesQcResultPageReqVO extends PageParam { +public class MesQcIndicatorResultPageReqVO extends PageParam { @Schema(description = "关联质检单ID", example = "1") private Long qcId; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcIndicatorResultRespVO.java index 8cb7b54..ee86357 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultRespVO.java +++ b/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; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; @Schema(description = "管理后台 - MES 检验结果 Response VO") @Data -public class MesQcResultRespVO { +public class MesQcIndicatorResultRespVO { @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") private Long id; @@ -36,28 +37,83 @@ public class MesQcResultRespVO { // ========== 关联查询字段 ========== - @Schema(description = "质检单编号(关联查询)", example = "IQC-001") + @Schema(description = "质检单编号", example = "IQC-001") private String qcCode; - @Schema(description = "质检单名称(关联查询)", example = "xxx来料检验") + @Schema(description = "质检单名称", example = "xxx来料检验") private String qcName; - @Schema(description = "产品物料编码(关联查询)", example = "ITEM-001") + @Schema(description = "产品物料编码", example = "ITEM-001") private String itemCode; - @Schema(description = "产品物料名称(关联查询)", example = "电阻") + @Schema(description = "产品物料名称", example = "电阻") private String itemName; - @Schema(description = "规格型号(关联查询)", example = "100Ω") + @Schema(description = "规格型号", example = "100Ω") private String itemSpecification; - @Schema(description = "单位名称(关联查询)", example = "个") + @Schema(description = "单位名称", example = "个") private String unitName; // ========== 子表:检验结果明细 ========== - // TODO @AI:内嵌进来,不用队里类文件; @Schema(description = "检验结果明细列表") - private List items; + private List items; + + @Schema(description = "检验结果明细项") + @Data + public static class Item { + + @Schema(description = "编号", example = "1024") + private Long id; + + @Schema(description = "关联检验结果ID", example = "1") + private Long resultId; + + @Schema(description = "检测指标ID", example = "1") + private Long indicatorId; + + @Schema(description = "检测值(统一存为字符串)", example = "3.14") + private String value; + + @Schema(description = "备注", example = "无") + private String remark; + + // ========== 关联查询字段(来自 IQC line + indicator) ========== + + @Schema(description = "检测指标编码", example = "IDX-001") + private String indicatorCode; + + @Schema(description = "检测指标名称", example = "外观检查") + private String indicatorName; + + @Schema(description = "检测指标类型", example = "QUANTITATIVE") + private String indicatorType; + + @Schema(description = "质检值类型", example = "1") + private Integer valueType; + + @Schema(description = "值属性", example = "IMG") + private String valueSpecification; + + @Schema(description = "检测工具名称", example = "卡尺") + private String toolName; + + @Schema(description = "检测方法", example = "目视检查") + private String checkMethod; + + @Schema(description = "标准值", example = "10.0000") + private BigDecimal standardValue; + + @Schema(description = "计量单位名称", example = "mm") + private String unitMeasureName; + + @Schema(description = "误差上限", example = "10.5000") + private BigDecimal maxThreshold; + + @Schema(description = "误差下限", example = "9.5000") + private BigDecimal minThreshold; + + } } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcIndicatorResultSaveReqVO.java index 1da6edc..51d6781 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcIndicatorResultSaveReqVO.java @@ -1,5 +1,7 @@ package cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo; +import cn.iocoder.yudao.framework.common.validation.InEnum; +import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; import lombok.Data; @@ -8,7 +10,7 @@ import java.util.List; @Schema(description = "管理后台 - MES 检验结果创建/更新 Request VO") @Data -public class MesQcResultSaveReqVO { +public class MesQcIndicatorResultSaveReqVO { @Schema(description = "编号", example = "1024") private Long id; @@ -20,8 +22,9 @@ public class MesQcResultSaveReqVO { @NotNull(message = "关联质检单ID不能为空") private Long qcId; - @Schema(description = "质检类型(1=IQC 2=IPQC 3=OQC 4=RQC)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @Schema(description = "质检类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "质检类型不能为空") + @InEnum(MesQcTypeEnum.class) private Integer qcType; @Schema(description = "物资SN", example = "SN-001") @@ -30,8 +33,25 @@ public class MesQcResultSaveReqVO { @Schema(description = "备注", example = "无") private String remark; - // TODO @AI:MesQcResultDetailSaveReqVO 内嵌进来;不用独立类; @Schema(description = "检验结果明细列表") - private List items; + private List items; + + @Schema(description = "检验结果明细项") + @Data + public static class Item { + + @Schema(description = "编号(更新时传入已有明细的 ID)", example = "1024") + private Long id; + + @Schema(description = "检测指标ID", example = "1") + private Long indicatorId; + + @Schema(description = "检测值(统一存为字符串)", example = "3.14") + private String value; + + @Schema(description = "备注", example = "无") + private String remark; + + } } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultDetailRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultDetailRespVO.java deleted file mode 100644 index 165f997..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultDetailRespVO.java +++ /dev/null @@ -1,80 +0,0 @@ -package cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.math.BigDecimal; - -@Schema(description = "管理后台 - MES 检验结果明细 Response VO") -@Data -public class MesQcResultDetailRespVO { - - @Schema(description = "编号", example = "1024") - private Long id; - - @Schema(description = "关联检验结果ID", example = "1") - private Long resultId; - - @Schema(description = "检测指标ID", example = "1") - private Long indicatorId; - - @Schema(description = "检测工具ID", example = "1") - private Long toolId; - - @Schema(description = "计量单位ID", example = "1") - private Long unitMeasureId; - - @Schema(description = "质检值类型(1=浮点 2=整数 3=文本 4=字典 5=文件)", example = "1") - private Integer valueType; - - @Schema(description = "值属性", example = "IMG") - private String valueSpecification; - - @Schema(description = "浮点值", example = "3.14") - private BigDecimal valueFloat; - - @Schema(description = "整数值", example = "100") - private Integer valueInteger; - - @Schema(description = "文字值", example = "合格") - private String valueText; - - @Schema(description = "字典项值", example = "PASS") - private String valueDict; - - @Schema(description = "文件值", example = "https://xxx.com/file.jpg") - private String valueFile; - - @Schema(description = "备注", example = "无") - private String remark; - - // ========== 关联查询字段(来自 IQC line + indicator) ========== - - @Schema(description = "检测指标编码(关联查询)", example = "IDX-001") - private String indicatorCode; - - @Schema(description = "检测指标名称(关联查询)", example = "外观检查") - private String indicatorName; - - @Schema(description = "检测指标类型(关联查询)", example = "QUANTITATIVE") - private String indicatorType; - - @Schema(description = "检测工具名称(关联查询)", example = "卡尺") - private String toolName; - - @Schema(description = "检测方法(关联查询)", example = "目视检查") - private String checkMethod; - - @Schema(description = "标准值(关联查询)", example = "10.0000") - private BigDecimal standardValue; - - @Schema(description = "计量单位名称(关联查询)", example = "mm") - private String unitMeasureName; - - @Schema(description = "误差上限(关联查询)", example = "10.5000") - private BigDecimal maxThreshold; - - @Schema(description = "误差下限(关联查询)", example = "9.5000") - private BigDecimal minThreshold; - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultDetailSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultDetailSaveReqVO.java deleted file mode 100644 index 7ee2f7f..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultDetailSaveReqVO.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.math.BigDecimal; - -@Schema(description = "管理后台 - MES 检验结果明细创建/更新 Request VO") -@Data -public class MesQcResultDetailSaveReqVO { - - @Schema(description = "编号", example = "1024") - private Long id; - - @Schema(description = "检测指标ID", example = "1") - private Long indicatorId; - - @Schema(description = "检测工具ID", example = "1") - private Long toolId; - - @Schema(description = "计量单位ID", example = "1") - private Long unitMeasureId; - - @Schema(description = "质检值类型(1=浮点 2=整数 3=文本 4=字典 5=文件)", example = "1") - private Integer valueType; - - @Schema(description = "值属性", example = "IMG") - private String valueSpecification; - - @Schema(description = "浮点值", example = "3.14") - private BigDecimal valueFloat; - - @Schema(description = "整数值", example = "100") - private Integer valueInteger; - - @Schema(description = "文字值", example = "合格") - private String valueText; - - @Schema(description = "字典项值", example = "PASS") - private String valueDict; - - @Schema(description = "文件值", example = "https://xxx.com/file.jpg") - private String valueFile; - - @Schema(description = "备注", example = "无") - private String remark; - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicator/MesQcIndicatorDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicator/MesQcIndicatorDO.java index 84f85f7..c7ef712 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicator/MesQcIndicatorDO.java +++ b/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 { /** * 检测项类型 * - * 枚举 {@link cn.iocoder.yudao.module.mes.enums.DictTypeConstants#MES_INDEX_TYPE} + * 枚举 {@link cn.iocoder.yudao.module.mes.enums.DictTypeConstants#MES_INDICATOR_TYPE} */ private String type; /** diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcResultDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcIndicatorResultDO.java index 37cd96c..010ce21 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcResultDO.java +++ b/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; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcDO; import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; @@ -13,15 +14,15 @@ import lombok.*; * * @author 芋道源码 */ -@TableName("mes_qc_result") -@KeySequence("mes_qc_result_seq") +@TableName("mes_qc_indicator_result") +@KeySequence("mes_qc_indicator_result_seq") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) @Builder @NoArgsConstructor @AllArgsConstructor -public class MesQcResultDO extends BaseDO { +public class MesQcIndicatorResultDO extends BaseDO { /** * 编号 @@ -32,9 +33,11 @@ public class MesQcResultDO extends BaseDO { * 样品编号 */ private String code; - // TODO @AI:关联下 linkter; /** * 关联质检单 ID(IQC/IPQC/OQC/RQC 的 id) + * + * 关联 IQC {@link MesQcIqcDO#getId()} + * TODO @芋艿:IPQC/OQC/RQC 关联补充 */ private Long qcId; /** diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcResultDetailDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcIndicatorResultDetailDO.java index 1c6e12e..c2c0fd1 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcResultDetailDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcIndicatorResultDetailDO.java @@ -1,31 +1,26 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicator.MesQcIndicatorDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.tm.tool.MesTmToolDO; -import cn.iocoder.yudao.module.mes.enums.qc.MesQcResultValueTypeEnum; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; -import java.math.BigDecimal; - /** * MES 检验结果明细记录 DO * * @author 芋道源码 */ -@TableName("mes_qc_result_detail") -@KeySequence("mes_qc_result_detail_seq") +@TableName("mes_qc_indicator_result_detail") +@KeySequence("mes_qc_indicator_result_detail_seq") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) @Builder @NoArgsConstructor @AllArgsConstructor -public class MesQcResultDetailDO extends BaseDO { +public class MesQcIndicatorResultDetailDO extends BaseDO { /** * 编号 @@ -35,7 +30,7 @@ public class MesQcResultDetailDO extends BaseDO { /** * 关联检验结果 ID * - * 关联 {@link MesQcResultDO#getId()} + * 关联 {@link MesQcIndicatorResultDO#getId()} */ private Long resultId; /** @@ -44,52 +39,10 @@ public class MesQcResultDetailDO extends BaseDO { * 关联 {@link MesQcIndicatorDO#getId()} */ private Long indicatorId; - // TODO @AI:toolId、unitMeasureId、valueType、valueSpecification 都不存储; - /** - * 检测工具 ID - * - * 关联 {@link MesTmToolDO#getId()} - */ - private Long toolId; - /** - * 计量单位 ID - * - * 关联 {@link MesMdUnitMeasureDO#getId()} - */ - private Long unitMeasureId; - /** - * 质检值类型 - * - * 枚举 {@link MesQcResultValueTypeEnum} - */ - private Integer valueType; - /** - * 值属性 - * - * FILE 时存 IMG/FILE;DICT 时存字典类型名 - */ - private String valueSpecification; - // TODO @AI:是不是可以调整成 String value? - /** - * 浮点值 - */ - private BigDecimal valueFloat; - /** - * 整数值 - */ - private Integer valueInteger; - /** - * 文字值 - */ - private String valueText; - /** - * 字典项值 - */ - private String valueDict; /** - * 文件值 + * 检测值(统一存为字符串) */ - private String valueFile; + private String value; /** * 备注 */ diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcResultDetailMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcIndicatorResultDetailMapper.java index 612ab81..b11de0f 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcResultDetailMapper.java +++ b/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; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcResultDetailDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDetailDO; import org.apache.ibatis.annotations.Mapper; import java.util.List; @@ -13,15 +13,15 @@ import java.util.List; * @author 芋道源码 */ @Mapper -public interface MesQcResultDetailMapper extends BaseMapperX { +public interface MesQcIndicatorResultDetailMapper extends BaseMapperX { - default List selectListByResultId(Long resultId) { - return selectList(MesQcResultDetailDO::getResultId, resultId); + default List selectListByResultId(Long resultId) { + return selectList(MesQcIndicatorResultDetailDO::getResultId, resultId); } default void deleteByResultId(Long resultId) { - delete(new LambdaQueryWrapperX() - .eq(MesQcResultDetailDO::getResultId, resultId)); + delete(new LambdaQueryWrapperX() + .eq(MesQcIndicatorResultDetailDO::getResultId, resultId)); } } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcResultMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcIndicatorResultMapper.java index f2973a4..265ba12 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcResultMapper.java +++ b/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; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcResultPageReqVO; -import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcResultDO; +import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcIndicatorResultPageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDO; import org.apache.ibatis.annotations.Mapper; /** @@ -13,15 +13,15 @@ import org.apache.ibatis.annotations.Mapper; * @author 芋道源码 */ @Mapper -public interface MesQcResultMapper extends BaseMapperX { +public interface MesQcIndicatorResultMapper extends BaseMapperX { - default PageResult selectPage(MesQcResultPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(MesQcResultDO::getQcId, reqVO.getQcId()) - .eqIfPresent(MesQcResultDO::getQcType, reqVO.getQcType()) - .likeIfPresent(MesQcResultDO::getCode, reqVO.getCode()) - .eqIfPresent(MesQcResultDO::getItemId, reqVO.getItemId()) - .orderByDesc(MesQcResultDO::getId)); + default PageResult selectPage(MesQcIndicatorResultPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(MesQcIndicatorResultDO::getQcId, reqVO.getQcId()) + .eqIfPresent(MesQcIndicatorResultDO::getQcType, reqVO.getQcType()) + .likeIfPresent(MesQcIndicatorResultDO::getCode, reqVO.getCode()) + .eqIfPresent(MesQcIndicatorResultDO::getItemId, reqVO.getItemId()) + .orderByDesc(MesQcIndicatorResultDO::getId)); } } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java index baa4f42..f18538c 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java @@ -18,7 +18,7 @@ public interface DictTypeConstants { String MES_CAL_PLAN_STATUS = "mes_cal_plan_status"; // MES 排班计划状态 String MES_DV_MACHINERY_STATUS = "mes_dv_machinery_status"; // MES 设备状态 String MES_DV_SUBJECT_TYPE = "mes_dv_subject_type"; // MES 点检保养项目类型 - String MES_INDEX_TYPE = "mes_index_type"; // MES 检测项类型 + String MES_INDICATOR_TYPE = "mes_indicator_type"; // MES 检测项类型 String MES_QC_RESULT_TYPE = "mes_qc_result_type"; // MES 质检结果值类型 String MES_DEFECT_LEVEL = "mes_defect_level"; // MES 缺陷等级 String MES_PRO_WORK_ORDER_STATUS = "mes_pro_work_order_status"; // MES 生产工单状态 diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcResultService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultService.java index 946a2ed..ea4f2c7 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcResultService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultService.java @@ -1,10 +1,10 @@ package cn.iocoder.yudao.module.mes.service.qc.indicatorresult; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcResultDetailRespVO; -import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcResultPageReqVO; -import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcResultSaveReqVO; -import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcResultDO; +import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcIndicatorResultPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcIndicatorResultSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDetailDO; import jakarta.validation.Valid; import java.util.List; @@ -14,7 +14,7 @@ import java.util.List; * * @author 芋道源码 */ -public interface MesQcResultService { +public interface MesQcIndicatorResultService { /** * 创建检验结果(含明细) @@ -22,21 +22,21 @@ public interface MesQcResultService { * @param createReqVO 创建信息 * @return 编号 */ - Long createResult(@Valid MesQcResultSaveReqVO createReqVO); + Long createIndicatorResult(@Valid MesQcIndicatorResultSaveReqVO createReqVO); /** * 更新检验结果(含明细) * * @param updateReqVO 更新信息 */ - void updateResult(@Valid MesQcResultSaveReqVO updateReqVO); + void updateIndicatorResult(@Valid MesQcIndicatorResultSaveReqVO updateReqVO); /** * 删除检验结果(级联删除明细) * * @param id 编号 */ - void deleteResult(Long id); + void deleteIndicatorResult(Long id); /** * 获得检验结果 @@ -44,7 +44,7 @@ public interface MesQcResultService { * @param id 编号 * @return 检验结果 */ - MesQcResultDO getResult(Long id); + MesQcIndicatorResultDO getIndicatorResult(Long id); /** * 获得检验结果分页 @@ -52,25 +52,14 @@ public interface MesQcResultService { * @param pageReqVO 分页查询 * @return 检验结果分页 */ - PageResult getResultPage(MesQcResultPageReqVO pageReqVO); + PageResult getIndicatorResultPage(MesQcIndicatorResultPageReqVO pageReqVO); /** - * 获取检验结果明细列表(含已填值,组装 IQC line + indicator 信息) + * 获取检验结果明细列表 * * @param resultId 检验结果 ID - * @param qcId 质检单 ID - * @param qcType 质检类型 * @return 明细列表 */ - List getResultDetailList(Long resultId, Long qcId, Integer qcType); - - /** - * 获取空值检测项模板(新建结果时用) - * - * @param qcId 质检单 ID - * @param qcType 质检类型 - * @return 空值明细列表 - */ - List getDetailTemplate(Long qcId, Integer qcType); + List getIndicatorResultDetailListByResultId(Long resultId); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultServiceImpl.java new file mode 100644 index 0000000..735bf00 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultServiceImpl.java @@ -0,0 +1,169 @@ +package cn.iocoder.yudao.module.mes.service.qc.indicatorresult; + +import cn.hutool.core.collection.CollUtil; +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.indicatorresult.vo.MesQcIndicatorResultPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcIndicatorResultSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDetailDO; +import cn.iocoder.yudao.module.mes.dal.mysql.qc.indicatorresult.MesQcIndicatorResultDetailMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.qc.indicatorresult.MesQcIndicatorResultMapper; +import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum; +import cn.iocoder.yudao.module.mes.service.qc.lqc.MesQcIqcService; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import java.util.*; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; + +/** + * MES 检验结果 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class MesQcIndicatorResultServiceImpl implements MesQcIndicatorResultService { + + @Resource + private MesQcIndicatorResultMapper resultMapper; + @Resource + private MesQcIndicatorResultDetailMapper resultDetailMapper; + + @Resource + private MesQcIqcService iqcService; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createIndicatorResult(MesQcIndicatorResultSaveReqVO createReqVO) { + // 1. 校验明细不为空 + // TODO @AI:是不是 MesQcIndicatorResultSaveReqVO validator 参数校验; + List items = createReqVO.getItems(); + if (CollUtil.isEmpty(items)) { + throw exception(QC_RESULT_ITEMS_EMPTY); + } + + // 2. 根据 qcType 查询源质检单,获取 itemId + Long itemId = getItemIdFromQcDoc(createReqVO.getQcId(), createReqVO.getQcType()); + + // 3.1 插入主表 + MesQcIndicatorResultDO result = BeanUtils.toBean(createReqVO, MesQcIndicatorResultDO.class); + result.setItemId(itemId); + resultMapper.insert(result); + // 3.2 批量插入明细 + List details = BeanUtils.toBean(items, MesQcIndicatorResultDetailDO.class); + details.forEach(detail -> detail.setResultId(result.getId())); + resultDetailMapper.insertBatch(details); + return result.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateIndicatorResult(MesQcIndicatorResultSaveReqVO updateReqVO) { + // 1. 校验存在 + validateIndicatorResultExists(updateReqVO.getId()); + + // 2. 校验明细不为空 + // TODO @AI:是不是 MesQcIndicatorResultSaveReqVO validator 参数校验; + List items = updateReqVO.getItems(); + if (CollUtil.isEmpty(items)) { + throw exception(QC_RESULT_ITEMS_EMPTY); + } + + // 2.1 更新主表 + MesQcIndicatorResultDO updateObj = BeanUtils.toBean(updateReqVO, MesQcIndicatorResultDO.class); + resultMapper.updateById(updateObj); + + // TODO @AI:直接 for 循环,resultMapper.insertOrUpdate() 简单粗暴点! + // 4. 更新明细:diff 方式(有 id → 更新,无 id → 新增,不在列表中 → 删除) + List existingDetails = resultDetailMapper.selectListByResultId(updateReqVO.getId()); + Map existingMap = convertMap(existingDetails, MesQcIndicatorResultDetailDO::getId); + + // 4.1 收集前端传入的、已有 id 的集合 + Set newItemIds = convertSet(items, MesQcIndicatorResultSaveReqVO.Item::getId); + newItemIds.remove(null); + + // 4.2 遍历传入的明细:有 id 则更新,无 id 则新增 + for (MesQcIndicatorResultSaveReqVO.Item item : items) { + MesQcIndicatorResultDetailDO detail = BeanUtils.toBean(item, MesQcIndicatorResultDetailDO.class); + detail.setResultId(updateReqVO.getId()); + if (item.getId() != null && existingMap.containsKey(item.getId())) { + // 更新已有记录 + resultDetailMapper.updateById(detail); + } else { + // 新增记录 + detail.setId(null); + resultDetailMapper.insert(detail); + } + } + + // 4.3 删除不在新列表中的旧记录 + for (MesQcIndicatorResultDetailDO existing : existingDetails) { + if (!newItemIds.contains(existing.getId())) { + resultDetailMapper.deleteById(existing.getId()); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteIndicatorResult(Long id) { + // 1. 校验存在 + validateIndicatorResultExists(id); + + // 2.1 级联删除明细 + resultDetailMapper.deleteByResultId(id); + // 2.2 删除主表 + resultMapper.deleteById(id); + } + + @Override + public MesQcIndicatorResultDO getIndicatorResult(Long id) { + return resultMapper.selectById(id); + } + + @Override + public PageResult getIndicatorResultPage(MesQcIndicatorResultPageReqVO pageReqVO) { + return resultMapper.selectPage(pageReqVO); + } + + @Override + public List getIndicatorResultDetailListByResultId(Long resultId) { + return resultDetailMapper.selectListByResultId(resultId); + } + + // ==================== 私有方法 ==================== + + private MesQcIndicatorResultDO validateIndicatorResultExists(Long id) { + MesQcIndicatorResultDO result = resultMapper.selectById(id); + if (result == null) { + throw exception(QC_RESULT_NOT_EXISTS); + } + return result; + } + + /** + * 根据 qcType 查询源质检单,获取 itemId + */ + private Long getItemIdFromQcDoc(Long qcId, Integer qcType) { + if (Objects.equals(qcType, MesQcTypeEnum.IQC.getType())) { + // TODO @AI:使用 iqcService 的 validateIqcExists 方法,这样更聚焦! + MesQcIqcDO iqc = iqcService.getIqc(qcId); + if (iqc == null) { + throw exception(QC_RESULT_SOURCE_DOC_NOT_EXISTS); + } + return iqc.getItemId(); + } + // TODO @芋艿:IPQC/OQC/RQC 模块迁移后实现 + throw exception(QC_RESULT_SOURCE_DOC_TYPE_INVALID); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcResultServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcResultServiceImpl.java deleted file mode 100644 index 082afcd..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcResultServiceImpl.java +++ /dev/null @@ -1,252 +0,0 @@ -package cn.iocoder.yudao.module.mes.service.qc.indicatorresult; - -import cn.hutool.core.collection.CollUtil; -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.indicatorresult.vo.MesQcResultDetailRespVO; -import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcResultDetailSaveReqVO; -import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcResultPageReqVO; -import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcResultSaveReqVO; -import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicator.MesQcIndicatorDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcLineDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcResultDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcResultDetailDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.tm.tool.MesTmToolDO; -import cn.iocoder.yudao.module.mes.dal.mysql.qc.lqc.MesQcIqcLineMapper; -import cn.iocoder.yudao.module.mes.dal.mysql.qc.indicatorresult.MesQcResultDetailMapper; -import cn.iocoder.yudao.module.mes.dal.mysql.qc.indicatorresult.MesQcResultMapper; -import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum; -import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; -import cn.iocoder.yudao.module.mes.service.qc.indicator.MesQcIndicatorService; -import cn.iocoder.yudao.module.mes.service.qc.lqc.MesQcIqcService; -import cn.iocoder.yudao.module.mes.service.tm.tool.MesTmToolService; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.validation.annotation.Validated; - -import java.util.*; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; -import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen; -import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; - -/** - * MES 检验结果 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -public class MesQcResultServiceImpl implements MesQcResultService { - - @Resource - private MesQcResultMapper resultMapper; - @Resource - private MesQcResultDetailMapper resultDetailMapper; - - @Resource - private MesQcIqcService iqcService; - @Resource - private MesQcIqcLineMapper iqcLineMapper; - @Resource - private MesQcIndicatorService indicatorService; - @Resource - private MesMdUnitMeasureService unitMeasureService; - @Resource - private MesTmToolService toolService; - - @Override - @Transactional(rollbackFor = Exception.class) - public Long createResult(MesQcResultSaveReqVO createReqVO) { - // 1. 校验明细不为空 - List items = createReqVO.getItems(); - if (CollUtil.isEmpty(items)) { - throw exception(QC_RESULT_ITEMS_EMPTY); - } - - // 2. 根据 qcType 查询源质检单,获取 itemId - Long itemId = getItemIdFromQcDoc(createReqVO.getQcId(), createReqVO.getQcType()); - - // 3. 插入主表 - MesQcResultDO result = BeanUtils.toBean(createReqVO, MesQcResultDO.class); - result.setItemId(itemId); - resultMapper.insert(result); - - // 4. 批量插入明细 - List details = BeanUtils.toBean(items, MesQcResultDetailDO.class); - details.forEach(detail -> detail.setResultId(result.getId())); - resultDetailMapper.insertBatch(details); - return result.getId(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateResult(MesQcResultSaveReqVO updateReqVO) { - // 1. 校验存在 - validateResultExists(updateReqVO.getId()); - - // 2. 校验明细不为空 - List items = updateReqVO.getItems(); - if (CollUtil.isEmpty(items)) { - throw exception(QC_RESULT_ITEMS_EMPTY); - } - - // 3. 更新主表 - MesQcResultDO updateObj = BeanUtils.toBean(updateReqVO, MesQcResultDO.class); - resultMapper.updateById(updateObj); - - // 4. 更新明细:先删后插 - resultDetailMapper.deleteByResultId(updateReqVO.getId()); - List details = BeanUtils.toBean(items, MesQcResultDetailDO.class); - details.forEach(detail -> detail.setResultId(updateReqVO.getId())); - resultDetailMapper.insertBatch(details); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteResult(Long id) { - // 1. 校验存在 - validateResultExists(id); - // 2. 级联删除明细 - resultDetailMapper.deleteByResultId(id); - // 3. 删除主表 - resultMapper.deleteById(id); - } - - @Override - public MesQcResultDO getResult(Long id) { - return resultMapper.selectById(id); - } - - @Override - public PageResult getResultPage(MesQcResultPageReqVO pageReqVO) { - return resultMapper.selectPage(pageReqVO); - } - - @Override - public List getResultDetailList(Long resultId, Long qcId, Integer qcType) { - return buildDetailRespVOList(resultId, qcId, qcType); - } - - @Override - public List getDetailTemplate(Long qcId, Integer qcType) { - return buildDetailRespVOList(null, qcId, qcType); - } - - // ==================== 私有方法 ==================== - - private MesQcResultDO validateResultExists(Long id) { - MesQcResultDO result = resultMapper.selectById(id); - if (result == null) { - throw exception(QC_RESULT_NOT_EXISTS); - } - return result; - } - - /** - * 根据 qcType 查询源质检单,获取 itemId - */ - private Long getItemIdFromQcDoc(Long qcId, Integer qcType) { - if (Objects.equals(qcType, MesQcTypeEnum.IQC.getType())) { - MesQcIqcDO iqc = iqcService.getIqc(qcId); - if (iqc == null) { - throw exception(QC_RESULT_SOURCE_DOC_NOT_EXISTS); - } - return iqc.getItemId(); - } - // TODO @芋艿:IPQC/OQC/RQC 模块迁移后实现 - throw exception(QC_RESULT_SOURCE_DOC_TYPE_INVALID); - } - - /** - * 组装明细 VO 列表:从 IQC line + indicator + tool + unitMeasure + 已有结果明细 三方组装 - * - * @param resultId 检验结果 ID,为 null 时表示获取空值模板 - * @param qcId 质检单 ID - * @param qcType 质检类型 - */ - private List buildDetailRespVOList(Long resultId, Long qcId, Integer qcType) { - // 1. 获取检验单行列表 - List lines; - if (Objects.equals(qcType, MesQcTypeEnum.IQC.getType())) { - lines = iqcLineMapper.selectListByIqcId(qcId); - } else { - // TODO @芋艿:IPQC/OQC/RQC 模块迁移后实现 - return Collections.emptyList(); - } - if (CollUtil.isEmpty(lines)) { - return Collections.emptyList(); - } - - // 2. 批量查询关联信息 - Map indicatorMap = indicatorService.getIndicatorMap( - convertSet(lines, MesQcIqcLineDO::getIndicatorId)); - Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( - convertSet(lines, MesQcIqcLineDO::getUnitMeasureId)); - - // 3. 查询已有结果明细(如有 resultId) - Map detailMap; - if (resultId != null) { - List details = resultDetailMapper.selectListByResultId(resultId); - detailMap = convertMap(details, MesQcResultDetailDO::getIndicatorId); - } else { - detailMap = Collections.emptyMap(); - } - - // 4. 遍历行,组装 VO - List voList = new ArrayList<>(lines.size()); - for (MesQcIqcLineDO line : lines) { - MesQcResultDetailRespVO vo = new MesQcResultDetailRespVO(); - // 来自 IQC line - vo.setIndicatorId(line.getIndicatorId()); - vo.setToolId(line.getToolId()); - vo.setUnitMeasureId(line.getUnitMeasureId()); - vo.setCheckMethod(line.getCheckMethod()); - vo.setStandardValue(line.getStandardValue()); - vo.setMaxThreshold(line.getMaxThreshold()); - vo.setMinThreshold(line.getMinThreshold()); - - // 来自 indicator - findAndThen(indicatorMap, line.getIndicatorId(), indicator -> { - vo.setIndicatorCode(indicator.getCode()); - vo.setIndicatorName(indicator.getName()); - vo.setIndicatorType(indicator.getType()); - vo.setValueType(indicator.getResultType()); - vo.setValueSpecification(indicator.getResultSpecification()); - }); - - // 来自 unitMeasure - findAndThen(unitMeasureMap, line.getUnitMeasureId(), - unit -> vo.setUnitMeasureName(unit.getName())); - - // 来自 tool(逐个查询,数量通常较少) - if (line.getToolId() != null) { - MesTmToolDO tool = toolService.getTool(line.getToolId()); - if (tool != null) { - vo.setToolName(tool.getName()); - } - } - - // 来自已有结果明细(如有) - MesQcResultDetailDO detail = detailMap.get(line.getIndicatorId()); - if (detail != null) { - vo.setId(detail.getId()); - vo.setResultId(detail.getResultId()); - vo.setValueFloat(detail.getValueFloat()); - vo.setValueInteger(detail.getValueInteger()); - vo.setValueText(detail.getValueText()); - vo.setValueDict(detail.getValueDict()); - vo.setValueFile(detail.getValueFile()); - } - - voList.add(vo); - } - return voList; - } - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcLineService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcLineService.java index 5fd2a05..eb6bb43 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcLineService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcLineService.java @@ -56,6 +56,14 @@ public interface MesQcIqcLineService { void recalculateLineDefectStats(Long iqcId, List records); /** + * 根据来料检验单 ID 获取所有行 + * + * @param iqcId 来料检验单 ID + * @return 行列表 + */ + List getIqcLineListByIqcId(Long iqcId); + + /** * 根据来料检验单 ID 级联删除所有行 * * @param iqcId 来料检验单 ID diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcLineServiceImpl.java index 43c3093..02c7b80 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcLineServiceImpl.java +++ b/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 { } @Override + public List getIqcLineListByIqcId(Long iqcId) { + return iqcLineMapper.selectListByIqcId(iqcId); + } + + @Override public void deleteByIqcId(Long iqcId) { iqcLineMapper.deleteByIqcId(iqcId); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcService.java index 123d299..f274cbc 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcService.java +++ b/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 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcDO; import jakarta.validation.Valid; +import java.util.Collection; import java.util.List; +import java.util.Map; /** * MES 来料检验单(IQC) Service 接口 @@ -77,4 +79,12 @@ public interface MesQcIqcService { */ void recalculateDefectStats(Long iqcId, List records); + /** + * 批量获取来料检验单 Map + * + * @param ids 编号集合 + * @return 来料检验单 Map + */ + Map getIqcMap(Collection ids); + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcServiceImpl.java index dafc3a7..3244379 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcServiceImpl.java +++ b/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; import java.math.BigDecimal; import java.math.RoundingMode; -import java.util.List; -import java.util.Objects; +import java.util.*; + +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; @@ -212,4 +213,13 @@ public class MesQcIqcServiceImpl implements MesQcIqcService { iqcMapper.updateById(updateIqc); } + @Override + public Map getIqcMap(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyMap(); + } + List list = iqcMapper.selectBatchIds(ids); + return convertMap(list, MesQcIqcDO::getId); + } + }