From 34061f903c192ee82b55c3b524ce8c7e756e754f Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 21 Feb 2026 23:42:34 +0800 Subject: [PATCH] feat(mes): refactor inspection result types and add new result detail structure --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectRespVO.java | 2 +- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicator/vo/MesQcIndicatorRespVO.java | 2 +- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/MesQcIndicatorResultController.java | 241 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/MesQcResultController.java | 146 -------------------------------------------------------------------------------------------------------------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcIndicatorResultPageReqVO.java | 30 ++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcIndicatorResultRespVO.java | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcIndicatorResultSaveReqVO.java | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultDetailRespVO.java | 80 -------------------------------------------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultDetailSaveReqVO.java | 48 ------------------------------------------------ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultPageReqVO.java | 30 ------------------------------ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultRespVO.java | 63 --------------------------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultSaveReqVO.java | 37 ------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicator/MesQcIndicatorDO.java | 2 +- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcIndicatorResultDO.java | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcIndicatorResultDetailDO.java | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcResultDO.java | 80 -------------------------------------------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcResultDetailDO.java | 117 --------------------------------------------------------------------------------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcIndicatorResultDetailMapper.java | 27 +++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcIndicatorResultMapper.java | 27 +++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcResultDetailMapper.java | 27 --------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcResultMapper.java | 27 --------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java | 2 +- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultService.java | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultServiceImpl.java | 169 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcResultService.java | 76 ---------------------------------------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcResultServiceImpl.java | 252 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcLineService.java | 8 ++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcLineServiceImpl.java | 5 +++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcService.java | 10 ++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcServiceImpl.java | 14 ++++++++++++-- 30 files changed, 927 insertions(+), 989 deletions(-) create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/MesQcIndicatorResultController.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/MesQcResultController.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcIndicatorResultPageReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcIndicatorResultRespVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcIndicatorResultSaveReqVO.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultDetailRespVO.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultDetailSaveReqVO.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultPageReqVO.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultRespVO.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultSaveReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcIndicatorResultDO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcIndicatorResultDetailDO.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcResultDO.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcResultDetailDO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcIndicatorResultDetailMapper.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcIndicatorResultMapper.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcResultDetailMapper.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcResultMapper.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultService.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultServiceImpl.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcResultService.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcResultServiceImpl.java 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/MesQcIndicatorResultPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcIndicatorResultPageReqVO.java new file mode 100644 index 0000000..cd830cf --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcIndicatorResultPageReqVO.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +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 lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - MES 检验结果分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MesQcIndicatorResultPageReqVO extends PageParam { + + @Schema(description = "关联质检单ID", example = "1") + private Long qcId; + + @Schema(description = "质检类型", example = "1") + @InEnum(MesQcTypeEnum.class) + private Integer qcType; + + @Schema(description = "样品编号", example = "SPL-001") + private String code; + + @Schema(description = "产品物料ID", example = "1") + private Long itemId; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcIndicatorResultRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcIndicatorResultRespVO.java new file mode 100644 index 0000000..ee86357 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcIndicatorResultRespVO.java @@ -0,0 +1,119 @@ +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 MesQcIndicatorResultRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "样品编号", example = "SPL-001") + private String code; + + @Schema(description = "关联质检单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long qcId; + + @Schema(description = "质检类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer qcType; + + @Schema(description = "产品物料ID", example = "1") + private Long itemId; + + @Schema(description = "物资SN", example = "SN-001") + private String sn; + + @Schema(description = "备注", example = "无") + private String remark; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + + // ========== 关联查询字段 ========== + + @Schema(description = "质检单编号", example = "IQC-001") + private String qcCode; + + @Schema(description = "质检单名称", example = "xxx来料检验") + private String qcName; + + @Schema(description = "产品物料编码", example = "ITEM-001") + private String itemCode; + + @Schema(description = "产品物料名称", example = "电阻") + private String itemName; + + @Schema(description = "规格型号", example = "100Ω") + private String itemSpecification; + + @Schema(description = "单位名称", example = "个") + private String unitName; + + // ========== 子表:检验结果明细 ========== + + @Schema(description = "检验结果明细列表") + 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/MesQcIndicatorResultSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcIndicatorResultSaveReqVO.java new file mode 100644 index 0000000..51d6781 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcIndicatorResultSaveReqVO.java @@ -0,0 +1,57 @@ +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; + +import java.util.List; + +@Schema(description = "管理后台 - MES 检验结果创建/更新 Request VO") +@Data +public class MesQcIndicatorResultSaveReqVO { + + @Schema(description = "编号", example = "1024") + private Long id; + + @Schema(description = "样品编号", example = "SPL-001") + private String code; + + @Schema(description = "关联质检单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "关联质检单ID不能为空") + private Long qcId; + + @Schema(description = "质检类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "质检类型不能为空") + @InEnum(MesQcTypeEnum.class) + private Integer qcType; + + @Schema(description = "物资SN", example = "SN-001") + private String sn; + + @Schema(description = "备注", example = "无") + private String remark; + + @Schema(description = "检验结果明细列表") + 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/controller/admin/qc/indicatorresult/vo/MesQcResultPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultPageReqVO.java deleted file mode 100644 index 2a4c199..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultPageReqVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -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 lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@Schema(description = "管理后台 - MES 检验结果分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MesQcResultPageReqVO extends PageParam { - - @Schema(description = "关联质检单ID", example = "1") - private Long qcId; - - @Schema(description = "质检类型", example = "1") - @InEnum(MesQcTypeEnum.class) - private Integer qcType; - - @Schema(description = "样品编号", example = "SPL-001") - private String code; - - @Schema(description = "产品物料ID", example = "1") - private Long itemId; - -} 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/MesQcResultRespVO.java deleted file mode 100644 index 8cb7b54..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultRespVO.java +++ /dev/null @@ -1,63 +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.time.LocalDateTime; -import java.util.List; - -@Schema(description = "管理后台 - MES 检验结果 Response VO") -@Data -public class MesQcResultRespVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "样品编号", example = "SPL-001") - private String code; - - @Schema(description = "关联质检单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long qcId; - - @Schema(description = "质检类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer qcType; - - @Schema(description = "产品物料ID", example = "1") - private Long itemId; - - @Schema(description = "物资SN", example = "SN-001") - private String sn; - - @Schema(description = "备注", example = "无") - private String remark; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - - // ========== 关联查询字段 ========== - - @Schema(description = "质检单编号(关联查询)", example = "IQC-001") - private String qcCode; - - @Schema(description = "质检单名称(关联查询)", example = "xxx来料检验") - private String qcName; - - @Schema(description = "产品物料编码(关联查询)", example = "ITEM-001") - private String itemCode; - - @Schema(description = "产品物料名称(关联查询)", example = "电阻") - private String itemName; - - @Schema(description = "规格型号(关联查询)", example = "100Ω") - private String itemSpecification; - - @Schema(description = "单位名称(关联查询)", example = "个") - private String unitName; - - // ========== 子表:检验结果明细 ========== - - // TODO @AI:内嵌进来,不用队里类文件; - @Schema(description = "检验结果明细列表") - private List items; - -} 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/MesQcResultSaveReqVO.java deleted file mode 100644 index 1da6edc..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicatorresult/vo/MesQcResultSaveReqVO.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.util.List; - -@Schema(description = "管理后台 - MES 检验结果创建/更新 Request VO") -@Data -public class MesQcResultSaveReqVO { - - @Schema(description = "编号", example = "1024") - private Long id; - - @Schema(description = "样品编号", example = "SPL-001") - private String code; - - @Schema(description = "关联质检单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "关联质检单ID不能为空") - private Long qcId; - - @Schema(description = "质检类型(1=IQC 2=IPQC 3=OQC 4=RQC)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "质检类型不能为空") - private Integer qcType; - - @Schema(description = "物资SN", example = "SN-001") - private String sn; - - @Schema(description = "备注", example = "无") - private String remark; - - // TODO @AI:MesQcResultDetailSaveReqVO 内嵌进来;不用独立类; - @Schema(description = "检验结果明细列表") - private List items; - -} 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/MesQcIndicatorResultDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcIndicatorResultDO.java new file mode 100644 index 0000000..010ce21 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcIndicatorResultDO.java @@ -0,0 +1,83 @@ +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; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * MES 检验结果记录 DO + * + * @author 芋道源码 + */ +@TableName("mes_qc_indicator_result") +@KeySequence("mes_qc_indicator_result_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesQcIndicatorResultDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 样品编号 + */ + private String code; + /** + * 关联质检单 ID(IQC/IPQC/OQC/RQC 的 id) + * + * 关联 IQC {@link MesQcIqcDO#getId()} + * TODO @芋艿:IPQC/OQC/RQC 关联补充 + */ + private Long qcId; + /** + * 质检类型 + * + * 枚举 {@link MesQcTypeEnum} + */ + private Integer qcType; + /** + * 产品物料 ID + * + * 关联 {@link MesMdItemDO#getId()} + */ + private Long itemId; + /** + * 物资 SN + */ + private String sn; + /** + * 备注 + */ + private String remark; + + // ========== 预留字段 ========== + + /** + * 预留字段 1 + */ + private String attribute1; + /** + * 预留字段 2 + */ + private String attribute2; + /** + * 预留字段 3 + */ + private Integer attribute3; + /** + * 预留字段 4 + */ + private Integer attribute4; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcIndicatorResultDetailDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcIndicatorResultDetailDO.java new file mode 100644 index 0000000..c2c0fd1 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcIndicatorResultDetailDO.java @@ -0,0 +1,70 @@ +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.qc.indicator.MesQcIndicatorDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * MES 检验结果明细记录 DO + * + * @author 芋道源码 + */ +@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 MesQcIndicatorResultDetailDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 关联检验结果 ID + * + * 关联 {@link MesQcIndicatorResultDO#getId()} + */ + private Long resultId; + /** + * 检测指标 ID + * + * 关联 {@link MesQcIndicatorDO#getId()} + */ + private Long indicatorId; + /** + * 检测值(统一存为字符串) + */ + private String value; + /** + * 备注 + */ + private String remark; + + // ========== 预留字段 ========== + + /** + * 预留字段 1 + */ + private String attribute1; + /** + * 预留字段 2 + */ + private String attribute2; + /** + * 预留字段 3 + */ + private Integer attribute3; + /** + * 预留字段 4 + */ + private Integer attribute4; + +} 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/MesQcResultDO.java deleted file mode 100644 index 37cd96c..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcResultDO.java +++ /dev/null @@ -1,80 +0,0 @@ -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.enums.qc.MesQcTypeEnum; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -/** - * MES 检验结果记录 DO - * - * @author 芋道源码 - */ -@TableName("mes_qc_result") -@KeySequence("mes_qc_result_seq") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class MesQcResultDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Long id; - /** - * 样品编号 - */ - private String code; - // TODO @AI:关联下 linkter; - /** - * 关联质检单 ID(IQC/IPQC/OQC/RQC 的 id) - */ - private Long qcId; - /** - * 质检类型 - * - * 枚举 {@link MesQcTypeEnum} - */ - private Integer qcType; - /** - * 产品物料 ID - * - * 关联 {@link MesMdItemDO#getId()} - */ - private Long itemId; - /** - * 物资 SN - */ - private String sn; - /** - * 备注 - */ - private String remark; - - // ========== 预留字段 ========== - - /** - * 预留字段 1 - */ - private String attribute1; - /** - * 预留字段 2 - */ - private String attribute2; - /** - * 预留字段 3 - */ - private Integer attribute3; - /** - * 预留字段 4 - */ - private Integer attribute4; - -} 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/MesQcResultDetailDO.java deleted file mode 100644 index 1c6e12e..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcResultDetailDO.java +++ /dev/null @@ -1,117 +0,0 @@ -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") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class MesQcResultDetailDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Long id; - /** - * 关联检验结果 ID - * - * 关联 {@link MesQcResultDO#getId()} - */ - private Long resultId; - /** - * 检测指标 ID - * - * 关联 {@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 remark; - - // ========== 预留字段 ========== - - /** - * 预留字段 1 - */ - private String attribute1; - /** - * 预留字段 2 - */ - private String attribute2; - /** - * 预留字段 3 - */ - private Integer attribute3; - /** - * 预留字段 4 - */ - private Integer attribute4; - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcIndicatorResultDetailMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcIndicatorResultDetailMapper.java new file mode 100644 index 0000000..b11de0f --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcIndicatorResultDetailMapper.java @@ -0,0 +1,27 @@ +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.MesQcIndicatorResultDetailDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * MES 检验结果明细记录 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface MesQcIndicatorResultDetailMapper extends BaseMapperX { + + default List selectListByResultId(Long resultId) { + return selectList(MesQcIndicatorResultDetailDO::getResultId, resultId); + } + + default void deleteByResultId(Long 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/MesQcIndicatorResultMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcIndicatorResultMapper.java new file mode 100644 index 0000000..265ba12 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcIndicatorResultMapper.java @@ -0,0 +1,27 @@ +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.MesQcIndicatorResultPageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * MES 检验结果记录 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface MesQcIndicatorResultMapper extends BaseMapperX { + + 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/dal/mysql/qc/indicatorresult/MesQcResultDetailMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcResultDetailMapper.java deleted file mode 100644 index 612ab81..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcResultDetailMapper.java +++ /dev/null @@ -1,27 +0,0 @@ -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 org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -/** - * MES 检验结果明细记录 Mapper - * - * @author 芋道源码 - */ -@Mapper -public interface MesQcResultDetailMapper extends BaseMapperX { - - default List selectListByResultId(Long resultId) { - return selectList(MesQcResultDetailDO::getResultId, resultId); - } - - default void deleteByResultId(Long resultId) { - delete(new LambdaQueryWrapperX() - .eq(MesQcResultDetailDO::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/MesQcResultMapper.java deleted file mode 100644 index f2973a4..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcResultMapper.java +++ /dev/null @@ -1,27 +0,0 @@ -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 org.apache.ibatis.annotations.Mapper; - -/** - * MES 检验结果记录 Mapper - * - * @author 芋道源码 - */ -@Mapper -public interface MesQcResultMapper 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)); - } - -} 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/MesQcIndicatorResultService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultService.java new file mode 100644 index 0000000..ea4f2c7 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultService.java @@ -0,0 +1,65 @@ +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.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; + +/** + * MES 检验结果 Service 接口 + * + * @author 芋道源码 + */ +public interface MesQcIndicatorResultService { + + /** + * 创建检验结果(含明细) + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createIndicatorResult(@Valid MesQcIndicatorResultSaveReqVO createReqVO); + + /** + * 更新检验结果(含明细) + * + * @param updateReqVO 更新信息 + */ + void updateIndicatorResult(@Valid MesQcIndicatorResultSaveReqVO updateReqVO); + + /** + * 删除检验结果(级联删除明细) + * + * @param id 编号 + */ + void deleteIndicatorResult(Long id); + + /** + * 获得检验结果 + * + * @param id 编号 + * @return 检验结果 + */ + MesQcIndicatorResultDO getIndicatorResult(Long id); + + /** + * 获得检验结果分页 + * + * @param pageReqVO 分页查询 + * @return 检验结果分页 + */ + PageResult getIndicatorResultPage(MesQcIndicatorResultPageReqVO pageReqVO); + + /** + * 获取检验结果明细列表 + * + * @param resultId 检验结果 ID + * @return 明细列表 + */ + 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/MesQcResultService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcResultService.java deleted file mode 100644 index 946a2ed..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcResultService.java +++ /dev/null @@ -1,76 +0,0 @@ -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 jakarta.validation.Valid; - -import java.util.List; - -/** - * MES 检验结果 Service 接口 - * - * @author 芋道源码 - */ -public interface MesQcResultService { - - /** - * 创建检验结果(含明细) - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createResult(@Valid MesQcResultSaveReqVO createReqVO); - - /** - * 更新检验结果(含明细) - * - * @param updateReqVO 更新信息 - */ - void updateResult(@Valid MesQcResultSaveReqVO updateReqVO); - - /** - * 删除检验结果(级联删除明细) - * - * @param id 编号 - */ - void deleteResult(Long id); - - /** - * 获得检验结果 - * - * @param id 编号 - * @return 检验结果 - */ - MesQcResultDO getResult(Long id); - - /** - * 获得检验结果分页 - * - * @param pageReqVO 分页查询 - * @return 检验结果分页 - */ - PageResult getResultPage(MesQcResultPageReqVO 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); - -} 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); + } + } -- libgit2 0.21.4