From 3495965b99dfcbf191eefb8294a8de05bedc160a Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期五, 04 九月 2026 13:40:34 +0800
Subject: [PATCH] feat(mes): 新增批量查询方法并优化IPQC/IQC导出功能
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/MesQcIpqcPageReqVO.java | 4
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/vo/MesQcQualityExportVO.java | 92 ++++
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/MesQcIqcController.java | 188 ++++++++
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java | 19
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultDetailServiceImpl.java | 5
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcSaveReqVO.java | 3
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcIndicatorResultDetailMapper.java | 4
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/iqc/MesQcIqcLineMapper.java | 7
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultDetailService.java | 8
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/MesQcIqcSaveReqVO.java | 3
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/MesQcIpqcSaveReqVO.java | 3
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/MesQcIpqcController.java | 189 ++++++++
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateItemServiceImpl.java | 58 ++
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/ipqc/MesQcIpqcMapper.java | 1
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/MesQcIqcRespVO.java | 6
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcRespVO.java | 6
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/oqc/MesQcOqcLineMapper.java | 7
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultService.java | 26 +
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java | 18
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcPageReqVO.java | 9
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/MesQcRqcController.java | 188 ++++++++
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/rqc/MesQcRqcLineMapper.java | 7
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/oqc/MesQcOqcMapper.java | 2
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImpl.java | 19
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/ipqc/MesQcIpqcLineMapper.java | 7
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/vo/item/MesQcTemplateItemOptionRespVO.java | 39 +
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/MesQcOqcController.java | 188 ++++++++
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcPageReqVO.java | 4
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateItemService.java | 13
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImpl.java | 19
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/MesQcTemplateItemController.java | 31 +
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcIndicatorResultMapper.java | 6
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultServiceImpl.java | 28 +
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/MesQcIpqcRespVO.java | 6
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/rqc/MesQcRqcMapper.java | 1
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcRespVO.java | 6
36 files changed, 1,188 insertions(+), 32 deletions(-)
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/MesQcIpqcController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/MesQcIpqcController.java
index 3e1c52b..1113942 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/MesQcIpqcController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/MesQcIpqcController.java
@@ -1,26 +1,38 @@
package cn.iocoder.yudao.module.mes.controller.admin.qc.ipqc;
import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.dict.core.DictFrameworkUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.mes.controller.admin.qc.ipqc.vo.MesQcIpqcPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.qc.ipqc.vo.MesQcIpqcRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.qc.ipqc.vo.MesQcIpqcSaveReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.qc.vo.MesQcQualityExportVO;
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.md.workstation.MesMdWorkstationDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
+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.ipqc.MesQcIpqcDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.qc.ipqc.MesQcIpqcLineDO;
+import cn.iocoder.yudao.module.mes.dal.mysql.qc.ipqc.MesQcIpqcLineMapper;
+import cn.iocoder.yudao.module.mes.enums.DictTypeConstants;
+import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants;
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.md.workstation.MesMdWorkstationService;
import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessService;
import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
+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.ipqc.MesQcIpqcService;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
@@ -35,9 +47,14 @@
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -62,6 +79,12 @@
private MesMdItemService itemService;
@Resource
private MesMdUnitMeasureService unitMeasureService;
+ @Resource
+ private MesQcIndicatorResultService indicatorResultService;
+ @Resource
+ private MesQcIndicatorService indicatorService;
+ @Resource
+ private MesQcIpqcLineMapper ipqcLineMapper;
@Resource
private AdminUserApi adminUserApi;
@@ -124,8 +147,8 @@
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<MesQcIpqcDO> list = ipqcService.getIpqcPage(pageReqVO).getList();
- List<MesQcIpqcRespVO> voList = buildIpqcRespVOList(list);
- ExcelUtils.write(response, "杩囩▼妫�楠屽崟.xls", "鏁版嵁", MesQcIpqcRespVO.class, voList);
+ List<MesQcQualityExportVO> exportList = buildIpqcQualityExportList(list);
+ ExcelUtils.write(response, "杩囩▼妫�楠屽崟.xls", "鏁版嵁", MesQcQualityExportVO.class, exportList);
}
// ==================== 鎷兼帴 VO ====================
@@ -152,6 +175,8 @@
// 鎵归噺鏌ヨ妫�娴嬩汉鍛�
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
convertSet(list, MesQcIpqcDO::getInspectorUserId));
+ // 鎵归噺鏌ヨ妫�楠岄」鎸囨爣
+ Map<Long, String> indicatorSummaryMap = buildIndicatorSummaryMap(list);
// 鎷艰 VO
return BeanUtils.toBean(list, MesQcIpqcRespVO.class, vo -> {
findAndThen(workOrderMap, vo.getWorkOrderId(), workOrder -> vo
@@ -167,7 +192,167 @@
});
findAndThen(userMap, vo.getInspectorUserId(),
user -> vo.setInspectorNickname(user.getNickname()));
+ vo.setIndicatorResultSummary(indicatorSummaryMap.getOrDefault(vo.getId(), ""));
});
}
+ /**
+ * 鏋勫缓姣忎釜妫�楠屽崟鐨勬楠岄」鎸囨爣姹囨�诲瓧绗︿覆锛坬cType = IPQC锛�
+ */
+ private Map<Long, String> buildIndicatorSummaryMap(List<MesQcIpqcDO> list) {
+ Map<Long, String> indicatorSummaryMap = new HashMap<>();
+ Set<Long> qcIds = convertSet(list, MesQcIpqcDO::getId);
+ if (CollUtil.isEmpty(qcIds)) {
+ return indicatorSummaryMap;
+ }
+ // 鎸� QC ID 鎵归噺鏌ヨ妫�楠岀粨鏋�
+ List<MesQcIndicatorResultDO> indicatorResults = indicatorResultService.getIndicatorResultListByQcIdsAndType(
+ new ArrayList<>(qcIds), MesBizTypeConstants.QC_IPQC);
+ if (CollUtil.isEmpty(indicatorResults)) {
+ return indicatorSummaryMap;
+ }
+ // 鎸� QC ID 鍒嗙粍缁撴灉
+ Map<Long, List<MesQcIndicatorResultDO>> resultMap = indicatorResults.stream()
+ .collect(Collectors.groupingBy(MesQcIndicatorResultDO::getQcId));
+ // 鎵归噺鏌ヨ妫�楠岀粨鏋滄槑缁�
+ Set<Long> resultIds = convertSet(indicatorResults, MesQcIndicatorResultDO::getId);
+ List<MesQcIndicatorResultDetailDO> indicatorDetails = indicatorResultService.getIndicatorResultDetailListByResultIds(
+ new ArrayList<>(resultIds));
+ // 鎸夌粨鏋� ID 鍒嗙粍鏄庣粏
+ Map<Long, List<MesQcIndicatorResultDetailDO>> detailMapByResultId = indicatorDetails.stream()
+ .collect(Collectors.groupingBy(MesQcIndicatorResultDetailDO::getResultId));
+ // 鎵归噺鏌ヨ妫�娴嬫寚鏍�
+ Set<Long> indicatorIds = convertSet(indicatorDetails, MesQcIndicatorResultDetailDO::getIndicatorId);
+ Map<Long, MesQcIndicatorDO> indicatorMap = indicatorService.getIndicatorMap(indicatorIds);
+
+ // 鏋勫缓姣忎釜 QC 鐨勬寚鏍囨眹鎬诲瓧绗︿覆
+ resultMap.forEach((qcId, results) -> {
+ List<String> indicatorSummaries = new ArrayList<>();
+ for (MesQcIndicatorResultDO result : results) {
+ List<MesQcIndicatorResultDetailDO> details = detailMapByResultId.getOrDefault(result.getId(), Collections.emptyList());
+ for (MesQcIndicatorResultDetailDO detail : details) {
+ // 閫氳繃 indicatorId 鍏宠仈鎸囨爣鍚嶇О锛屾煡涓嶅埌鍒欏洖閫�涓� "鎸囨爣"
+ String indicatorName = "鎸囨爣";
+ MesQcIndicatorDO indicator = indicatorMap.get(detail.getIndicatorId());
+ if (indicator != null && StrUtil.isNotBlank(indicator.getName())) {
+ indicatorName = indicator.getName();
+ }
+ String value = detail.getValue();
+ String remark = detail.getRemark();
+ // 鏍煎紡鍖栦负 "鎸囨爣鍚嶇О:鍊�" 鎴� "鎸囨爣鍚嶇О:鍊�(澶囨敞)"
+ String indicatorStr = indicatorName + ":" + value;
+ if (StrUtil.isNotBlank(remark)) {
+ indicatorStr += "(" + remark + ")";
+ }
+ indicatorSummaries.add(indicatorStr);
+ }
+ }
+ indicatorSummaryMap.put(qcId, String.join(", ", indicatorSummaries));
+ });
+ return indicatorSummaryMap;
+ }
+
+ /**
+ * 鏋勫缓瀵煎嚭琛岋細涓�鍗曚竴琛岋紝妫�楠屾寚鏍� / 鍒ゅ畾渚濇嵁鍙栬嚜琛屾槑缁嗗苟鎷兼帴
+ */
+ private List<MesQcQualityExportVO> buildIpqcQualityExportList(List<MesQcIpqcDO> list) {
+ if (CollUtil.isEmpty(list)) {
+ return Collections.emptyList();
+ }
+ // 鎵归噺鏌ヨ妫�娴嬩汉鍛�
+ Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
+ convertSet(list, MesQcIpqcDO::getInspectorUserId));
+ // 鎵归噺鏌ヨ鐗╂枡
+ Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+ convertSet(list, MesQcIpqcDO::getItemId));
+ // 鎵归噺鏌ヨ琛屾槑缁�
+ List<MesQcIpqcLineDO> lines = ipqcLineMapper.selectListByIpqcIds(convertSet(list, MesQcIpqcDO::getId));
+ Map<Long, List<MesQcIpqcLineDO>> lineMap = lines.stream()
+ .collect(Collectors.groupingBy(MesQcIpqcLineDO::getIpqcId));
+ // 鎵归噺鏌ヨ妫�娴嬫寚鏍�
+ Map<Long, MesQcIndicatorDO> indicatorMap = CollUtil.isEmpty(lines) ? Collections.emptyMap()
+ : indicatorService.getIndicatorMap(convertSet(lines, MesQcIpqcLineDO::getIndicatorId));
+ // 鎵归噺鏌ヨ瀹炴祴鍊硷細妫�楠屽崟 ID -> {鎸囨爣 ID -> 瀹炴祴鍊紏
+ Map<Long, Map<Long, String>> measureMap = buildMeasureValueMap(
+ convertSet(list, MesQcIpqcDO::getId), MesBizTypeConstants.QC_IPQC);
+ // 缁勮瀵煎嚭琛�
+ List<MesQcQualityExportVO> exportList = new ArrayList<>(list.size());
+ for (MesQcIpqcDO ipqc : list) {
+ MesQcQualityExportVO vo = new MesQcQualityExportVO();
+ vo.setDocName(ipqc.getName());
+ MesMdItemDO item = itemMap.get(ipqc.getItemId());
+ vo.setItemName(item != null ? item.getName() : "");
+ // IPQC 鏃犳壒娆″彿瀛楁锛屾殏鐢ㄦ潵婧愬崟鎹紪鍙凤紙涓�鑸负鐢熶骇宸ュ崟鍙凤級浣滀负鎵瑰彿
+ vo.setBatchNo(ipqc.getSourceDocCode());
+ vo.setInspectDate(MesQcQualityExportVO.formatDateTime(ipqc.getInspectDate()));
+ List<String> indicatorNames = new ArrayList<>();
+ List<String> judgementSegments = new ArrayList<>();
+ for (MesQcIpqcLineDO line : lineMap.getOrDefault(ipqc.getId(), Collections.emptyList())) {
+ MesQcIndicatorDO indicator = indicatorMap.get(line.getIndicatorId());
+ String name = indicator != null && StrUtil.isNotBlank(indicator.getName())
+ ? indicator.getName() : "";
+ String range = MesQcQualityExportVO.buildRangeText(
+ line.getStandardValue(), line.getMinThreshold(), line.getMaxThreshold());
+ if (StrUtil.isNotBlank(name)) {
+ String measuredValue = measureMap
+ .getOrDefault(ipqc.getId(), Collections.emptyMap())
+ .get(line.getIndicatorId());
+ indicatorNames.add(StrUtil.isNotBlank(measuredValue) ? name + ":" + measuredValue : name);
+ if (StrUtil.isNotBlank(range)) {
+ judgementSegments.add(name + range);
+ }
+ }
+ }
+ vo.setIndicatorNames(String.join("銆�", indicatorNames));
+ vo.setJudgementBasis(String.join("锛�", judgementSegments));
+ vo.setCheckResultText(getCheckResultLabel(ipqc.getCheckResult()));
+ findAndThen(userMap, ipqc.getInspectorUserId(),
+ user -> vo.setInspectorName(user.getNickname()));
+ // 鏆傛棤瀹℃牳浜烘暟鎹潵婧愶紝瀵煎嚭绌哄垪
+ vo.setAuditorName("");
+ vo.setRemark(ipqc.getRemark());
+ exportList.add(vo);
+ }
+ return exportList;
+ }
+
+ /**
+ * 鏋勫缓 妫�楠屽崟 ID -> {鎸囨爣 ID -> 瀹炴祴鍊紏 鏄犲皠锛屽疄娴嬪�煎彇鑷楠岀粨鏋滄槑缁嗚〃
+ */
+ private Map<Long, Map<Long, String>> buildMeasureValueMap(Set<Long> qcIds, int qcType) {
+ Map<Long, Map<Long, String>> measureMap = new HashMap<>();
+ if (CollUtil.isEmpty(qcIds)) {
+ return measureMap;
+ }
+ List<MesQcIndicatorResultDO> results = indicatorResultService.getIndicatorResultListByQcIdsAndType(
+ new ArrayList<>(qcIds), qcType);
+ if (CollUtil.isEmpty(results)) {
+ return measureMap;
+ }
+ Map<Long, Long> resultQcMap = results.stream()
+ .collect(Collectors.toMap(MesQcIndicatorResultDO::getId, MesQcIndicatorResultDO::getQcId));
+ List<MesQcIndicatorResultDetailDO> details = indicatorResultService.getIndicatorResultDetailListByResultIds(
+ new ArrayList<>(resultQcMap.keySet()));
+ if (CollUtil.isEmpty(details)) {
+ return measureMap;
+ }
+ for (MesQcIndicatorResultDetailDO detail : details) {
+ Long qcId = resultQcMap.get(detail.getResultId());
+ if (qcId == null) {
+ continue;
+ }
+ measureMap.computeIfAbsent(qcId, k -> new HashMap<>())
+ .put(detail.getIndicatorId(), detail.getValue());
+ }
+ return measureMap;
+ }
+
+ private String getCheckResultLabel(Integer checkResult) {
+ if (checkResult == null) {
+ return "";
+ }
+ return DictFrameworkUtils.parseDictDataLabel(
+ DictTypeConstants.MES_QC_CHECK_RESULT, String.valueOf(checkResult));
+ }
+
}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/MesQcIpqcPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/MesQcIpqcPageReqVO.java
index a856a0a..8221b17 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/MesQcIpqcPageReqVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/MesQcIpqcPageReqVO.java
@@ -38,4 +38,8 @@
@Schema(description = "妫�娴嬩汉鍛樼敤鎴� ID", example = "1")
private Long inspectorUserId;
+ @Schema(description = "妫�娴嬫棩鏈�")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] inspectDate;
+
}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/MesQcIpqcRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/MesQcIpqcRespVO.java
index d5d48f8..cec6752 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/MesQcIpqcRespVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/MesQcIpqcRespVO.java
@@ -153,6 +153,12 @@
@DictFormat(DictTypeConstants.MES_QC_CHECK_RESULT)
private Integer checkResult;
+ // ========== 妫�楠岄」鎸囨爣 ==========
+
+ @Schema(description = "妫�楠岄」鎸囨爣姹囨��", example = "澶栬:鑹ソ(OK), 灏哄:100.00mm(OK)")
+ @ExcelProperty("妫�楠岄」鎸囨爣")
+ private String indicatorResultSummary;
+
@Schema(description = "妫�娴嬫棩鏈�")
@ExcelProperty("妫�娴嬫棩鏈�")
private LocalDateTime inspectDate;
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/MesQcIpqcSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/MesQcIpqcSaveReqVO.java
index 433765d..8ada36b 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/MesQcIpqcSaveReqVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/MesQcIpqcSaveReqVO.java
@@ -63,6 +63,9 @@
@Schema(description = "浜у搧鐗╂枡 ID", example = "50")
private Long itemId;
+ @Schema(description = "璐ㄦ鏂规 ID", example = "5")
+ private Long templateId;
+
// ========== 鏁伴噺 ==========
@Schema(description = "妫�娴嬫暟閲�", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/MesQcIqcController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/MesQcIqcController.java
index 56ff706..e535b20 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/MesQcIqcController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/MesQcIqcController.java
@@ -1,22 +1,34 @@
package cn.iocoder.yudao.module.mes.controller.admin.qc.iqc;
import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.dict.core.DictFrameworkUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo.MesQcIqcPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo.MesQcIqcRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo.MesQcIqcSaveReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.qc.vo.MesQcQualityExportVO;
import cn.iocoder.yudao.module.srm.api.supplier.SrmSupplierApi;
import cn.iocoder.yudao.module.srm.api.supplier.dto.SrmSupplierRespDTO;
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.iqc.MesQcIqcDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.qc.iqc.MesQcIqcLineDO;
+import cn.iocoder.yudao.module.mes.dal.mysql.qc.iqc.MesQcIqcLineMapper;
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.enums.DictTypeConstants;
+import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants;
+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.iqc.MesQcIqcService;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
@@ -31,9 +43,14 @@
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -52,9 +69,15 @@
@Resource
private SrmSupplierApi srmSupplierApi;
@Resource
+ private MesQcIndicatorResultService indicatorResultService;
+ @Resource
+ private MesQcIndicatorService indicatorService;
+ @Resource
private MesMdItemService itemService;
@Resource
private MesMdUnitMeasureService unitMeasureService;
+ @Resource
+ private MesQcIqcLineMapper iqcLineMapper;
@Resource
private AdminUserApi adminUserApi;
@@ -117,8 +140,8 @@
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<MesQcIqcDO> list = iqcService.getIqcPage(pageReqVO).getList();
- List<MesQcIqcRespVO> voList = buildIqcRespVOList(list);
- ExcelUtils.write(response, "鏉ユ枡妫�楠屽崟.xls", "鏁版嵁", MesQcIqcRespVO.class, voList);
+ List<MesQcQualityExportVO> exportList = buildIqcQualityExportList(list);
+ ExcelUtils.write(response, "鏉ユ枡妫�楠屽崟.xls", "鏁版嵁", MesQcQualityExportVO.class, exportList);
}
// ==================== 鎷兼帴 VO ====================
@@ -140,6 +163,63 @@
// 鎵归噺鏌ヨ妫�娴嬩汉鍛�
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
convertSet(list, MesQcIqcDO::getInspectorUserId));
+ // 鎵归噺鏌ヨ妫�楠岄」鎸囨爣
+ Set<Long> qcIds = convertSet(list, MesQcIqcDO::getId);
+ Map<Long, List<MesQcIndicatorResultDO>> indicatorResultMap = new HashMap<>();
+ if (CollUtil.isNotEmpty(qcIds)) {
+ // 鎸塓C ID鎵归噺鏌ヨ妫�楠岀粨鏋滐紙IQC绫诲瀷锛�
+ List<MesQcIndicatorResultDO> indicatorResults = indicatorResultService.getIndicatorResultListByQcIdsAndType(
+ new ArrayList<>(qcIds), MesBizTypeConstants.QC_IQC);
+ indicatorResults.forEach(result -> {
+ indicatorResultMap.computeIfAbsent(result.getQcId(), k -> new ArrayList<>()).add(result);
+ });
+ }
+ // 鎵归噺鏌ヨ妫�楠岀粨鏋滄槑缁嗗苟鏋勫缓鎸囨爣鏄犲皠
+ Map<Long, String> indicatorSummaryMap = new HashMap<>();
+ if (CollUtil.isNotEmpty(indicatorResultMap)) {
+ Set<Long> resultIds = new HashSet<>();
+ indicatorResultMap.values().forEach(results -> {
+ results.forEach(result -> resultIds.add(result.getId()));
+ });
+ if (CollUtil.isNotEmpty(resultIds)) {
+ // 鎵归噺鏌ヨ妫�楠岀粨鏋滄槑缁�
+ List<MesQcIndicatorResultDetailDO> indicatorDetails = indicatorResultService.getIndicatorResultDetailListByResultIds(
+ new ArrayList<>(resultIds));
+ // 鎸夌粨鏋淚D鍒嗙粍鏄庣粏
+ Map<Long, List<MesQcIndicatorResultDetailDO>> detailMapByResultId = indicatorDetails.stream()
+ .collect(Collectors.groupingBy(MesQcIndicatorResultDetailDO::getResultId));
+
+ // 鎵归噺鏌ヨ妫�娴嬫寚鏍囷紙indicatorId -> indicator锛�
+ Set<Long> indicatorIds = convertSet(indicatorDetails, MesQcIndicatorResultDetailDO::getIndicatorId);
+ Map<Long, MesQcIndicatorDO> indicatorMap = indicatorService.getIndicatorMap(indicatorIds);
+
+ // 鏋勫缓姣忎釜QC鐨勬寚鏍囨眹鎬诲瓧绗︿覆
+ indicatorResultMap.forEach((qcId, results) -> {
+ List<String> indicatorSummaries = new ArrayList<>();
+ for (MesQcIndicatorResultDO result : results) {
+ List<MesQcIndicatorResultDetailDO> details = detailMapByResultId.getOrDefault(result.getId(), Collections.emptyList());
+ for (MesQcIndicatorResultDetailDO detail : details) {
+ // 閫氳繃 indicatorId 鍏宠仈鎸囨爣鍚嶇О锛屾煡涓嶅埌鍒欏洖閫�涓� "鎸囨爣"
+ String indicatorName = "鎸囨爣";
+ MesQcIndicatorDO indicator = indicatorMap.get(detail.getIndicatorId());
+ if (indicator != null && StrUtil.isNotBlank(indicator.getName())) {
+ indicatorName = indicator.getName();
+ }
+ String value = detail.getValue();
+ String remark = detail.getRemark();
+ // 鏍煎紡鍖栦负 "鎸囨爣鍚嶇О:鍊�" 鎴� "鎸囨爣鍚嶇О:鍊�(澶囨敞)"
+ String indicatorStr = indicatorName + ":" + value;
+ if (StrUtil.isNotBlank(remark)) {
+ indicatorStr += "(" + remark + ")";
+ }
+ indicatorSummaries.add(indicatorStr);
+ }
+ }
+ // 鐢ㄩ�楀彿杩炴帴澶氫釜鎸囨爣
+ indicatorSummaryMap.put(qcId, String.join(", ", indicatorSummaries));
+ });
+ }
+ }
// 鎷艰 VO
return BeanUtils.toBean(list, MesQcIqcRespVO.class, vo -> {
findAndThen(vendorMap, vo.getVendorId(),
@@ -153,7 +233,111 @@
});
findAndThen(userMap, vo.getInspectorUserId(),
user -> vo.setInspectorNickname(user.getNickname()));
+ // 璁剧疆妫�楠岄」鎸囨爣姹囨��
+ vo.setIndicatorResultSummary(indicatorSummaryMap.getOrDefault(vo.getId(), ""));
});
}
+ /**
+ * 鏋勫缓瀵煎嚭琛岋細涓�鍗曚竴琛岋紝妫�楠屾寚鏍� / 鍒ゅ畾渚濇嵁鍙栬嚜琛屾槑缁嗗苟鎷兼帴
+ */
+ private List<MesQcQualityExportVO> buildIqcQualityExportList(List<MesQcIqcDO> list) {
+ if (CollUtil.isEmpty(list)) {
+ return Collections.emptyList();
+ }
+ // 鎵归噺鏌ヨ妫�娴嬩汉鍛�
+ Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
+ convertSet(list, MesQcIqcDO::getInspectorUserId));
+ // 鎵归噺鏌ヨ鐗╂枡
+ Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+ convertSet(list, MesQcIqcDO::getItemId));
+ // 鎵归噺鏌ヨ琛屾槑缁�
+ List<MesQcIqcLineDO> lines = iqcLineMapper.selectListByIqcIds(convertSet(list, MesQcIqcDO::getId));
+ Map<Long, List<MesQcIqcLineDO>> lineMap = lines.stream()
+ .collect(Collectors.groupingBy(MesQcIqcLineDO::getIqcId));
+ // 鎵归噺鏌ヨ妫�娴嬫寚鏍�
+ Map<Long, MesQcIndicatorDO> indicatorMap = CollUtil.isEmpty(lines) ? Collections.emptyMap()
+ : indicatorService.getIndicatorMap(convertSet(lines, MesQcIqcLineDO::getIndicatorId));
+ // 鎵归噺鏌ヨ瀹炴祴鍊硷細妫�楠屽崟 ID -> {鎸囨爣 ID -> 瀹炴祴鍊紏
+ Map<Long, Map<Long, String>> measureMap = buildMeasureValueMap(
+ convertSet(list, MesQcIqcDO::getId), MesBizTypeConstants.QC_IQC);
+ // 缁勮瀵煎嚭琛�
+ List<MesQcQualityExportVO> exportList = new ArrayList<>(list.size());
+ for (MesQcIqcDO iqc : list) {
+ MesQcQualityExportVO vo = new MesQcQualityExportVO();
+ vo.setDocName(iqc.getName());
+ MesMdItemDO item = itemMap.get(iqc.getItemId());
+ vo.setItemName(item != null ? item.getName() : "");
+ vo.setBatchNo(iqc.getVendorBatch());
+ vo.setInspectDate(MesQcQualityExportVO.formatDateTime(iqc.getInspectDate()));
+ List<String> indicatorNames = new ArrayList<>();
+ List<String> judgementSegments = new ArrayList<>();
+ for (MesQcIqcLineDO line : lineMap.getOrDefault(iqc.getId(), Collections.emptyList())) {
+ MesQcIndicatorDO indicator = indicatorMap.get(line.getIndicatorId());
+ String name = indicator != null && StrUtil.isNotBlank(indicator.getName())
+ ? indicator.getName() : "";
+ String range = MesQcQualityExportVO.buildRangeText(
+ line.getStandardValue(), line.getMinThreshold(), line.getMaxThreshold());
+ if (StrUtil.isNotBlank(name)) {
+ String measuredValue = measureMap
+ .getOrDefault(iqc.getId(), Collections.emptyMap())
+ .get(line.getIndicatorId());
+ indicatorNames.add(StrUtil.isNotBlank(measuredValue) ? name + ":" + measuredValue : name);
+ if (StrUtil.isNotBlank(range)) {
+ judgementSegments.add(name + range);
+ }
+ }
+ }
+ vo.setIndicatorNames(String.join("銆�", indicatorNames));
+ vo.setJudgementBasis(String.join("锛�", judgementSegments));
+ vo.setCheckResultText(getCheckResultLabel(iqc.getCheckResult()));
+ findAndThen(userMap, iqc.getInspectorUserId(),
+ user -> vo.setInspectorName(user.getNickname()));
+ // 鏆傛棤瀹℃牳浜烘暟鎹潵婧愶紝瀵煎嚭绌哄垪
+ vo.setAuditorName("");
+ vo.setRemark(iqc.getRemark());
+ exportList.add(vo);
+ }
+ return exportList;
+ }
+
+ /**
+ * 鏋勫缓 妫�楠屽崟 ID -> {鎸囨爣 ID -> 瀹炴祴鍊紏 鏄犲皠锛屽疄娴嬪�煎彇鑷楠岀粨鏋滄槑缁嗚〃
+ */
+ private Map<Long, Map<Long, String>> buildMeasureValueMap(Set<Long> qcIds, int qcType) {
+ Map<Long, Map<Long, String>> measureMap = new HashMap<>();
+ if (CollUtil.isEmpty(qcIds)) {
+ return measureMap;
+ }
+ List<MesQcIndicatorResultDO> results = indicatorResultService.getIndicatorResultListByQcIdsAndType(
+ new ArrayList<>(qcIds), qcType);
+ if (CollUtil.isEmpty(results)) {
+ return measureMap;
+ }
+ Map<Long, Long> resultQcMap = results.stream()
+ .collect(Collectors.toMap(MesQcIndicatorResultDO::getId, MesQcIndicatorResultDO::getQcId));
+ List<MesQcIndicatorResultDetailDO> details = indicatorResultService.getIndicatorResultDetailListByResultIds(
+ new ArrayList<>(resultQcMap.keySet()));
+ if (CollUtil.isEmpty(details)) {
+ return measureMap;
+ }
+ for (MesQcIndicatorResultDetailDO detail : details) {
+ Long qcId = resultQcMap.get(detail.getResultId());
+ if (qcId == null) {
+ continue;
+ }
+ measureMap.computeIfAbsent(qcId, k -> new HashMap<>())
+ .put(detail.getIndicatorId(), detail.getValue());
+ }
+ return measureMap;
+ }
+
+ private String getCheckResultLabel(Integer checkResult) {
+ if (checkResult == null) {
+ return "";
+ }
+ return DictFrameworkUtils.parseDictDataLabel(
+ DictTypeConstants.MES_QC_CHECK_RESULT, String.valueOf(checkResult));
+ }
+
}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/MesQcIqcRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/MesQcIqcRespVO.java
index 5605641..2ee455f 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/MesQcIqcRespVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/MesQcIqcRespVO.java
@@ -122,6 +122,12 @@
@DictFormat(DictTypeConstants.MES_QC_CHECK_RESULT)
private Integer checkResult;
+ // ========== 妫�楠岄」鎸囨爣 ==========
+
+ @Schema(description = "妫�楠岄」鎸囨爣姹囨��", example = "澶栬:鑹ソ(OK), 灏哄:100.00mm(OK)")
+ @ExcelProperty("妫�楠岄」鎸囨爣")
+ private String indicatorResultSummary;
+
@Schema(description = "鏉ユ枡鏃ユ湡")
@ExcelProperty("鏉ユ枡鏃ユ湡")
private LocalDateTime receiveDate;
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/MesQcIqcSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/MesQcIqcSaveReqVO.java
index b08e9d1..adc56ec 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/MesQcIqcSaveReqVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/MesQcIqcSaveReqVO.java
@@ -52,6 +52,9 @@
@NotNull(message = "浜у搧鐗╂枡涓嶈兘涓虹┖")
private Long itemId;
+ @Schema(description = "璐ㄦ鏂规 ID", example = "5")
+ private Long templateId;
+
// ========== 鏁伴噺 ==========
@Schema(description = "鏈鎺ユ敹鏁伴噺", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/MesQcOqcController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/MesQcOqcController.java
index 973218b..299e4f7 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/MesQcOqcController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/MesQcOqcController.java
@@ -1,23 +1,35 @@
package cn.iocoder.yudao.module.mes.controller.admin.qc.oqc;
import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.dict.core.DictFrameworkUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.mes.controller.admin.qc.oqc.vo.MesQcOqcPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.qc.oqc.vo.MesQcOqcRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.qc.oqc.vo.MesQcOqcSaveReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.qc.vo.MesQcQualityExportVO;
import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi;
import cn.iocoder.yudao.module.crm.api.customer.dto.CrmCustomerRespDTO;
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.oqc.MesQcOqcDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.qc.oqc.MesQcOqcLineDO;
+import cn.iocoder.yudao.module.mes.dal.mysql.qc.oqc.MesQcOqcLineMapper;
+import cn.iocoder.yudao.module.mes.enums.DictTypeConstants;
+import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants;
import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi;
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.oqc.MesQcOqcService;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
@@ -32,9 +44,14 @@
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -55,6 +72,12 @@
private MesMdItemService itemService;
@Resource
private MesMdUnitMeasureService unitMeasureService;
+ @Resource
+ private MesQcIndicatorResultService indicatorResultService;
+ @Resource
+ private MesQcIndicatorService indicatorService;
+ @Resource
+ private MesQcOqcLineMapper oqcLineMapper;
@Resource
private AdminUserApi adminUserApi;
@@ -117,8 +140,8 @@
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<MesQcOqcDO> list = oqcService.getOqcPage(pageReqVO).getList();
- List<MesQcOqcRespVO> voList = buildOqcRespVOList(list);
- ExcelUtils.write(response, "鍑鸿揣妫�楠屽崟.xls", "鏁版嵁", MesQcOqcRespVO.class, voList);
+ List<MesQcQualityExportVO> exportList = buildOqcQualityExportList(list);
+ ExcelUtils.write(response, "鍑鸿揣妫�楠屽崟.xls", "鏁版嵁", MesQcQualityExportVO.class, exportList);
}
// ==================== 鎷兼帴 VO ====================
@@ -139,6 +162,8 @@
// 鎵归噺鏌ヨ妫�娴嬩汉鍛�
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
convertSet(list, MesQcOqcDO::getInspectorUserId));
+ // 鎵归噺鏌ヨ妫�楠岄」鎸囨爣
+ Map<Long, String> indicatorSummaryMap = buildIndicatorSummaryMap(list);
// 鎷艰 VO
return BeanUtils.toBean(list, MesQcOqcRespVO.class, vo -> {
findAndThen(clientMap, vo.getClientId(),
@@ -150,7 +175,166 @@
});
findAndThen(userMap, vo.getInspectorUserId(),
user -> vo.setInspectorNickname(user.getNickname()));
+ vo.setIndicatorResultSummary(indicatorSummaryMap.getOrDefault(vo.getId(), ""));
});
}
+ /**
+ * 鏋勫缓瀵煎嚭琛岋細涓�鍗曚竴琛岋紝妫�楠屾寚鏍� / 鍒ゅ畾渚濇嵁鍙栬嚜琛屾槑缁嗗苟鎷兼帴
+ */
+ private List<MesQcQualityExportVO> buildOqcQualityExportList(List<MesQcOqcDO> list) {
+ if (CollUtil.isEmpty(list)) {
+ return Collections.emptyList();
+ }
+ // 鎵归噺鏌ヨ妫�娴嬩汉鍛�
+ Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
+ convertSet(list, MesQcOqcDO::getInspectorUserId));
+ // 鎵归噺鏌ヨ鐗╂枡
+ Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+ convertSet(list, MesQcOqcDO::getItemId));
+ // 鎵归噺鏌ヨ琛屾槑缁�
+ List<MesQcOqcLineDO> lines = oqcLineMapper.selectListByOqcIds(convertSet(list, MesQcOqcDO::getId));
+ Map<Long, List<MesQcOqcLineDO>> lineMap = lines.stream()
+ .collect(Collectors.groupingBy(MesQcOqcLineDO::getOqcId));
+ // 鎵归噺鏌ヨ妫�娴嬫寚鏍�
+ Map<Long, MesQcIndicatorDO> indicatorMap = CollUtil.isEmpty(lines) ? Collections.emptyMap()
+ : indicatorService.getIndicatorMap(convertSet(lines, MesQcOqcLineDO::getIndicatorId));
+ // 鎵归噺鏌ヨ瀹炴祴鍊硷細妫�楠屽崟 ID -> {鎸囨爣 ID -> 瀹炴祴鍊紏
+ Map<Long, Map<Long, String>> measureMap = buildMeasureValueMap(
+ convertSet(list, MesQcOqcDO::getId), MesBizTypeConstants.QC_OQC);
+ // 缁勮瀵煎嚭琛�
+ List<MesQcQualityExportVO> exportList = new ArrayList<>(list.size());
+ for (MesQcOqcDO oqc : list) {
+ MesQcQualityExportVO vo = new MesQcQualityExportVO();
+ vo.setDocName(oqc.getName());
+ MesMdItemDO item = itemMap.get(oqc.getItemId());
+ vo.setItemName(item != null ? item.getName() : "");
+ vo.setBatchNo(oqc.getBatchCode());
+ vo.setInspectDate(MesQcQualityExportVO.formatDateTime(oqc.getInspectDate()));
+ List<String> indicatorNames = new ArrayList<>();
+ List<String> judgementSegments = new ArrayList<>();
+ for (MesQcOqcLineDO line : lineMap.getOrDefault(oqc.getId(), Collections.emptyList())) {
+ MesQcIndicatorDO indicator = indicatorMap.get(line.getIndicatorId());
+ String name = indicator != null && StrUtil.isNotBlank(indicator.getName())
+ ? indicator.getName() : "";
+ String range = MesQcQualityExportVO.buildRangeText(
+ line.getStandardValue(), line.getMinThreshold(), line.getMaxThreshold());
+ if (StrUtil.isNotBlank(name)) {
+ String measuredValue = measureMap
+ .getOrDefault(oqc.getId(), Collections.emptyMap())
+ .get(line.getIndicatorId());
+ indicatorNames.add(StrUtil.isNotBlank(measuredValue) ? name + ":" + measuredValue : name);
+ if (StrUtil.isNotBlank(range)) {
+ judgementSegments.add(name + range);
+ }
+ }
+ }
+ vo.setIndicatorNames(String.join("銆�", indicatorNames));
+ vo.setJudgementBasis(String.join("锛�", judgementSegments));
+ vo.setCheckResultText(getCheckResultLabel(oqc.getCheckResult()));
+ findAndThen(userMap, oqc.getInspectorUserId(),
+ user -> vo.setInspectorName(user.getNickname()));
+ // 鏆傛棤瀹℃牳浜烘暟鎹潵婧愶紝瀵煎嚭绌哄垪
+ vo.setAuditorName("");
+ vo.setRemark(oqc.getRemark());
+ exportList.add(vo);
+ }
+ return exportList;
+ }
+
+ /**
+ * 鏋勫缓 妫�楠屽崟 ID -> {鎸囨爣 ID -> 瀹炴祴鍊紏 鏄犲皠锛屽疄娴嬪�煎彇鑷楠岀粨鏋滄槑缁嗚〃
+ */
+ private Map<Long, Map<Long, String>> buildMeasureValueMap(Set<Long> qcIds, int qcType) {
+ Map<Long, Map<Long, String>> measureMap = new HashMap<>();
+ if (CollUtil.isEmpty(qcIds)) {
+ return measureMap;
+ }
+ List<MesQcIndicatorResultDO> results = indicatorResultService.getIndicatorResultListByQcIdsAndType(
+ new ArrayList<>(qcIds), qcType);
+ if (CollUtil.isEmpty(results)) {
+ return measureMap;
+ }
+ Map<Long, Long> resultQcMap = results.stream()
+ .collect(Collectors.toMap(MesQcIndicatorResultDO::getId, MesQcIndicatorResultDO::getQcId));
+ List<MesQcIndicatorResultDetailDO> details = indicatorResultService.getIndicatorResultDetailListByResultIds(
+ new ArrayList<>(resultQcMap.keySet()));
+ if (CollUtil.isEmpty(details)) {
+ return measureMap;
+ }
+ for (MesQcIndicatorResultDetailDO detail : details) {
+ Long qcId = resultQcMap.get(detail.getResultId());
+ if (qcId == null) {
+ continue;
+ }
+ measureMap.computeIfAbsent(qcId, k -> new HashMap<>())
+ .put(detail.getIndicatorId(), detail.getValue());
+ }
+ return measureMap;
+ }
+
+ private String getCheckResultLabel(Integer checkResult) {
+ if (checkResult == null) {
+ return "";
+ }
+ return DictFrameworkUtils.parseDictDataLabel(
+ DictTypeConstants.MES_QC_CHECK_RESULT, String.valueOf(checkResult));
+ }
+
+ /**
+ * 鏋勫缓姣忎釜妫�楠屽崟鐨勬楠岄」鎸囨爣姹囨�诲瓧绗︿覆锛坬cType = OQC锛�
+ */
+ private Map<Long, String> buildIndicatorSummaryMap(List<MesQcOqcDO> list) {
+ Map<Long, String> indicatorSummaryMap = new HashMap<>();
+ Set<Long> qcIds = convertSet(list, MesQcOqcDO::getId);
+ if (CollUtil.isEmpty(qcIds)) {
+ return indicatorSummaryMap;
+ }
+ // 鎸� QC ID 鎵归噺鏌ヨ妫�楠岀粨鏋�
+ List<MesQcIndicatorResultDO> indicatorResults = indicatorResultService.getIndicatorResultListByQcIdsAndType(
+ new ArrayList<>(qcIds), MesBizTypeConstants.QC_OQC);
+ if (CollUtil.isEmpty(indicatorResults)) {
+ return indicatorSummaryMap;
+ }
+ // 鎸� QC ID 鍒嗙粍缁撴灉
+ Map<Long, List<MesQcIndicatorResultDO>> resultMap = indicatorResults.stream()
+ .collect(Collectors.groupingBy(MesQcIndicatorResultDO::getQcId));
+ // 鎵归噺鏌ヨ妫�楠岀粨鏋滄槑缁�
+ Set<Long> resultIds = convertSet(indicatorResults, MesQcIndicatorResultDO::getId);
+ List<MesQcIndicatorResultDetailDO> indicatorDetails = indicatorResultService.getIndicatorResultDetailListByResultIds(
+ new ArrayList<>(resultIds));
+ // 鎸夌粨鏋� ID 鍒嗙粍鏄庣粏
+ Map<Long, List<MesQcIndicatorResultDetailDO>> detailMapByResultId = indicatorDetails.stream()
+ .collect(Collectors.groupingBy(MesQcIndicatorResultDetailDO::getResultId));
+ // 鎵归噺鏌ヨ妫�娴嬫寚鏍�
+ Set<Long> indicatorIds = convertSet(indicatorDetails, MesQcIndicatorResultDetailDO::getIndicatorId);
+ Map<Long, MesQcIndicatorDO> indicatorMap = indicatorService.getIndicatorMap(indicatorIds);
+
+ // 鏋勫缓姣忎釜 QC 鐨勬寚鏍囨眹鎬诲瓧绗︿覆
+ resultMap.forEach((qcId, results) -> {
+ List<String> indicatorSummaries = new ArrayList<>();
+ for (MesQcIndicatorResultDO result : results) {
+ List<MesQcIndicatorResultDetailDO> details = detailMapByResultId.getOrDefault(result.getId(), Collections.emptyList());
+ for (MesQcIndicatorResultDetailDO detail : details) {
+ // 閫氳繃 indicatorId 鍏宠仈鎸囨爣鍚嶇О锛屾煡涓嶅埌鍒欏洖閫�涓� "鎸囨爣"
+ String indicatorName = "鎸囨爣";
+ MesQcIndicatorDO indicator = indicatorMap.get(detail.getIndicatorId());
+ if (indicator != null && StrUtil.isNotBlank(indicator.getName())) {
+ indicatorName = indicator.getName();
+ }
+ String value = detail.getValue();
+ String remark = detail.getRemark();
+ // 鏍煎紡鍖栦负 "鎸囨爣鍚嶇О:鍊�" 鎴� "鎸囨爣鍚嶇О:鍊�(澶囨敞)"
+ String indicatorStr = indicatorName + ":" + value;
+ if (StrUtil.isNotBlank(remark)) {
+ indicatorStr += "(" + remark + ")";
+ }
+ indicatorSummaries.add(indicatorStr);
+ }
+ }
+ indicatorSummaryMap.put(qcId, String.join(", ", indicatorSummaries));
+ });
+ return indicatorSummaryMap;
+ }
+
}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcPageReqVO.java
index 47926c1..431ba6d 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcPageReqVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcPageReqVO.java
@@ -5,6 +5,11 @@
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "绠$悊鍚庡彴 - MES 鍑鸿揣妫�楠屽崟鍒嗛〉 Request VO")
@Data
@@ -27,4 +32,8 @@
@Schema(description = "妫�娴嬬粨鏋�", example = "1")
private Integer checkResult;
+ @Schema(description = "妫�娴嬫棩鏈�")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] inspectDate;
+
}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcRespVO.java
index 18f5e14..6d360a9 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcRespVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcRespVO.java
@@ -130,6 +130,12 @@
@DictFormat(DictTypeConstants.MES_QC_CHECK_RESULT)
private Integer checkResult;
+ // ========== 妫�楠岄」鎸囨爣 ==========
+
+ @Schema(description = "妫�楠岄」鎸囨爣姹囨��", example = "澶栬:鑹ソ(OK), 灏哄:100.00mm(OK)")
+ @ExcelProperty("妫�楠岄」鎸囨爣")
+ private String indicatorResultSummary;
+
@Schema(description = "鍑鸿揣鏃ユ湡")
@ExcelProperty("鍑鸿揣鏃ユ湡")
private LocalDateTime outDate;
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcSaveReqVO.java
index 98c20eb..c720ae8 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcSaveReqVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcSaveReqVO.java
@@ -50,6 +50,9 @@
@NotNull(message = "浜у搧鐗╂枡涓嶈兘涓虹┖")
private Long itemId;
+ @Schema(description = "璐ㄦ鏂规 ID", example = "5")
+ private Long templateId;
+
// ========== 鏁伴噺 ==========
@Schema(description = "鏈鍑鸿揣鏁伴噺", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/MesQcRqcController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/MesQcRqcController.java
index 56f5c35..8ddc929 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/MesQcRqcController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/MesQcRqcController.java
@@ -1,20 +1,32 @@
package cn.iocoder.yudao.module.mes.controller.admin.qc.rqc;
import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.dict.core.DictFrameworkUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.mes.controller.admin.qc.rqc.vo.MesQcRqcPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.qc.rqc.vo.MesQcRqcRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.qc.rqc.vo.MesQcRqcSaveReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.qc.vo.MesQcQualityExportVO;
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.rqc.MesQcRqcDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.qc.rqc.MesQcRqcLineDO;
+import cn.iocoder.yudao.module.mes.dal.mysql.qc.rqc.MesQcRqcLineMapper;
+import cn.iocoder.yudao.module.mes.enums.DictTypeConstants;
+import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants;
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.rqc.MesQcRqcService;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
@@ -29,9 +41,14 @@
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -50,6 +67,12 @@
private MesMdItemService itemService;
@Resource
private MesMdUnitMeasureService unitMeasureService;
+ @Resource
+ private MesQcIndicatorResultService indicatorResultService;
+ @Resource
+ private MesQcIndicatorService indicatorService;
+ @Resource
+ private MesQcRqcLineMapper rqcLineMapper;
@Resource
private AdminUserApi adminUserApi;
@@ -112,8 +135,8 @@
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<MesQcRqcDO> list = rqcService.getRqcPage(pageReqVO).getList();
- List<MesQcRqcRespVO> voList = buildRqcRespVOList(list);
- ExcelUtils.write(response, "閫�璐ф楠屽崟.xls", "鏁版嵁", MesQcRqcRespVO.class, voList);
+ List<MesQcQualityExportVO> exportList = buildRqcQualityExportList(list);
+ ExcelUtils.write(response, "閫�璐ф楠屽崟.xls", "鏁版嵁", MesQcQualityExportVO.class, exportList);
}
// ==================== 鎷兼帴 VO ====================
@@ -131,6 +154,8 @@
// 鎵归噺鏌ヨ妫�娴嬩汉鍛�
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
convertSet(list, MesQcRqcDO::getInspectorUserId));
+ // 鎵归噺鏌ヨ妫�楠岄」鎸囨爣
+ Map<Long, String> indicatorSummaryMap = buildIndicatorSummaryMap(list);
// 鎷艰 VO
return BeanUtils.toBean(list, MesQcRqcRespVO.class, vo -> {
findAndThen(itemMap, vo.getItemId(), item -> {
@@ -140,7 +165,166 @@
});
findAndThen(userMap, vo.getInspectorUserId(),
user -> vo.setInspectorNickname(user.getNickname()));
+ vo.setIndicatorResultSummary(indicatorSummaryMap.getOrDefault(vo.getId(), ""));
});
}
+ /**
+ * 鏋勫缓姣忎釜妫�楠屽崟鐨勬楠岄」鎸囨爣姹囨�诲瓧绗︿覆锛坬cType = RQC锛�
+ */
+ private Map<Long, String> buildIndicatorSummaryMap(List<MesQcRqcDO> list) {
+ Map<Long, String> indicatorSummaryMap = new HashMap<>();
+ Set<Long> qcIds = convertSet(list, MesQcRqcDO::getId);
+ if (CollUtil.isEmpty(qcIds)) {
+ return indicatorSummaryMap;
+ }
+ // 鎸� QC ID 鎵归噺鏌ヨ妫�楠岀粨鏋�
+ List<MesQcIndicatorResultDO> indicatorResults = indicatorResultService.getIndicatorResultListByQcIdsAndType(
+ new ArrayList<>(qcIds), MesBizTypeConstants.QC_RQC);
+ if (CollUtil.isEmpty(indicatorResults)) {
+ return indicatorSummaryMap;
+ }
+ // 鎸� QC ID 鍒嗙粍缁撴灉
+ Map<Long, List<MesQcIndicatorResultDO>> resultMap = indicatorResults.stream()
+ .collect(Collectors.groupingBy(MesQcIndicatorResultDO::getQcId));
+ // 鎵归噺鏌ヨ妫�楠岀粨鏋滄槑缁�
+ Set<Long> resultIds = convertSet(indicatorResults, MesQcIndicatorResultDO::getId);
+ List<MesQcIndicatorResultDetailDO> indicatorDetails = indicatorResultService.getIndicatorResultDetailListByResultIds(
+ new ArrayList<>(resultIds));
+ // 鎸夌粨鏋� ID 鍒嗙粍鏄庣粏
+ Map<Long, List<MesQcIndicatorResultDetailDO>> detailMapByResultId = indicatorDetails.stream()
+ .collect(Collectors.groupingBy(MesQcIndicatorResultDetailDO::getResultId));
+ // 鎵归噺鏌ヨ妫�娴嬫寚鏍�
+ Set<Long> indicatorIds = convertSet(indicatorDetails, MesQcIndicatorResultDetailDO::getIndicatorId);
+ Map<Long, MesQcIndicatorDO> indicatorMap = indicatorService.getIndicatorMap(indicatorIds);
+
+ // 鏋勫缓姣忎釜 QC 鐨勬寚鏍囨眹鎬诲瓧绗︿覆
+ resultMap.forEach((qcId, results) -> {
+ List<String> indicatorSummaries = new ArrayList<>();
+ for (MesQcIndicatorResultDO result : results) {
+ List<MesQcIndicatorResultDetailDO> details = detailMapByResultId.getOrDefault(result.getId(), Collections.emptyList());
+ for (MesQcIndicatorResultDetailDO detail : details) {
+ // 閫氳繃 indicatorId 鍏宠仈鎸囨爣鍚嶇О锛屾煡涓嶅埌鍒欏洖閫�涓� "鎸囨爣"
+ String indicatorName = "鎸囨爣";
+ MesQcIndicatorDO indicator = indicatorMap.get(detail.getIndicatorId());
+ if (indicator != null && StrUtil.isNotBlank(indicator.getName())) {
+ indicatorName = indicator.getName();
+ }
+ String value = detail.getValue();
+ String remark = detail.getRemark();
+ // 鏍煎紡鍖栦负 "鎸囨爣鍚嶇О:鍊�" 鎴� "鎸囨爣鍚嶇О:鍊�(澶囨敞)"
+ String indicatorStr = indicatorName + ":" + value;
+ if (StrUtil.isNotBlank(remark)) {
+ indicatorStr += "(" + remark + ")";
+ }
+ indicatorSummaries.add(indicatorStr);
+ }
+ }
+ indicatorSummaryMap.put(qcId, String.join(", ", indicatorSummaries));
+ });
+ return indicatorSummaryMap;
+ }
+
+ /**
+ * 鏋勫缓瀵煎嚭琛岋細涓�鍗曚竴琛岋紝妫�楠屾寚鏍� / 鍒ゅ畾渚濇嵁鍙栬嚜琛屾槑缁嗗苟鎷兼帴
+ */
+ private List<MesQcQualityExportVO> buildRqcQualityExportList(List<MesQcRqcDO> list) {
+ if (CollUtil.isEmpty(list)) {
+ return Collections.emptyList();
+ }
+ // 鎵归噺鏌ヨ妫�娴嬩汉鍛�
+ Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
+ convertSet(list, MesQcRqcDO::getInspectorUserId));
+ // 鎵归噺鏌ヨ鐗╂枡
+ Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+ convertSet(list, MesQcRqcDO::getItemId));
+ // 鎵归噺鏌ヨ琛屾槑缁�
+ List<MesQcRqcLineDO> lines = rqcLineMapper.selectListByRqcIds(convertSet(list, MesQcRqcDO::getId));
+ Map<Long, List<MesQcRqcLineDO>> lineMap = lines.stream()
+ .collect(Collectors.groupingBy(MesQcRqcLineDO::getRqcId));
+ // 鎵归噺鏌ヨ妫�娴嬫寚鏍�
+ Map<Long, MesQcIndicatorDO> indicatorMap = CollUtil.isEmpty(lines) ? Collections.emptyMap()
+ : indicatorService.getIndicatorMap(convertSet(lines, MesQcRqcLineDO::getIndicatorId));
+ // 鎵归噺鏌ヨ瀹炴祴鍊硷細妫�楠屽崟 ID -> {鎸囨爣 ID -> 瀹炴祴鍊紏
+ Map<Long, Map<Long, String>> measureMap = buildMeasureValueMap(
+ convertSet(list, MesQcRqcDO::getId), MesBizTypeConstants.QC_RQC);
+ // 缁勮瀵煎嚭琛�
+ List<MesQcQualityExportVO> exportList = new ArrayList<>(list.size());
+ for (MesQcRqcDO rqc : list) {
+ MesQcQualityExportVO vo = new MesQcQualityExportVO();
+ vo.setDocName(rqc.getName());
+ MesMdItemDO item = itemMap.get(rqc.getItemId());
+ vo.setItemName(item != null ? item.getName() : "");
+ vo.setBatchNo(rqc.getBatchCode());
+ vo.setInspectDate(MesQcQualityExportVO.formatDateTime(rqc.getInspectDate()));
+ List<String> indicatorNames = new ArrayList<>();
+ List<String> judgementSegments = new ArrayList<>();
+ for (MesQcRqcLineDO line : lineMap.getOrDefault(rqc.getId(), Collections.emptyList())) {
+ MesQcIndicatorDO indicator = indicatorMap.get(line.getIndicatorId());
+ String name = indicator != null && StrUtil.isNotBlank(indicator.getName())
+ ? indicator.getName() : "";
+ String range = MesQcQualityExportVO.buildRangeText(
+ line.getStandardValue(), line.getMinThreshold(), line.getMaxThreshold());
+ if (StrUtil.isNotBlank(name)) {
+ String measuredValue = measureMap
+ .getOrDefault(rqc.getId(), Collections.emptyMap())
+ .get(line.getIndicatorId());
+ indicatorNames.add(StrUtil.isNotBlank(measuredValue) ? name + ":" + measuredValue : name);
+ if (StrUtil.isNotBlank(range)) {
+ judgementSegments.add(name + range);
+ }
+ }
+ }
+ vo.setIndicatorNames(String.join("銆�", indicatorNames));
+ vo.setJudgementBasis(String.join("锛�", judgementSegments));
+ vo.setCheckResultText(getCheckResultLabel(rqc.getCheckResult()));
+ findAndThen(userMap, rqc.getInspectorUserId(),
+ user -> vo.setInspectorName(user.getNickname()));
+ // 鏆傛棤瀹℃牳浜烘暟鎹潵婧愶紝瀵煎嚭绌哄垪
+ vo.setAuditorName("");
+ vo.setRemark(rqc.getRemark());
+ exportList.add(vo);
+ }
+ return exportList;
+ }
+
+ /**
+ * 鏋勫缓 妫�楠屽崟 ID -> {鎸囨爣 ID -> 瀹炴祴鍊紏 鏄犲皠锛屽疄娴嬪�煎彇鑷楠岀粨鏋滄槑缁嗚〃
+ */
+ private Map<Long, Map<Long, String>> buildMeasureValueMap(Set<Long> qcIds, int qcType) {
+ Map<Long, Map<Long, String>> measureMap = new HashMap<>();
+ if (CollUtil.isEmpty(qcIds)) {
+ return measureMap;
+ }
+ List<MesQcIndicatorResultDO> results = indicatorResultService.getIndicatorResultListByQcIdsAndType(
+ new ArrayList<>(qcIds), qcType);
+ if (CollUtil.isEmpty(results)) {
+ return measureMap;
+ }
+ Map<Long, Long> resultQcMap = results.stream()
+ .collect(Collectors.toMap(MesQcIndicatorResultDO::getId, MesQcIndicatorResultDO::getQcId));
+ List<MesQcIndicatorResultDetailDO> details = indicatorResultService.getIndicatorResultDetailListByResultIds(
+ new ArrayList<>(resultQcMap.keySet()));
+ if (CollUtil.isEmpty(details)) {
+ return measureMap;
+ }
+ for (MesQcIndicatorResultDetailDO detail : details) {
+ Long qcId = resultQcMap.get(detail.getResultId());
+ if (qcId == null) {
+ continue;
+ }
+ measureMap.computeIfAbsent(qcId, k -> new HashMap<>())
+ .put(detail.getIndicatorId(), detail.getValue());
+ }
+ return measureMap;
+ }
+
+ private String getCheckResultLabel(Integer checkResult) {
+ if (checkResult == null) {
+ return "";
+ }
+ return DictFrameworkUtils.parseDictDataLabel(
+ DictTypeConstants.MES_QC_CHECK_RESULT, String.valueOf(checkResult));
+ }
+
}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcPageReqVO.java
index b9566c1..99e2212 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcPageReqVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcPageReqVO.java
@@ -41,4 +41,8 @@
@Schema(description = "妫�娴嬩汉鍛樼敤鎴� ID", example = "1")
private Long inspectorUserId;
+ @Schema(description = "妫�娴嬫棩鏈�")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] inspectDate;
+
}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcRespVO.java
index d32c8b9..ec0a04f 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcRespVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcRespVO.java
@@ -121,6 +121,12 @@
@DictFormat(DictTypeConstants.MES_QC_CHECK_RESULT)
private Integer checkResult;
+ // ========== 妫�楠岄」鎸囨爣 ==========
+
+ @Schema(description = "妫�楠岄」鎸囨爣姹囨��", example = "澶栬:鑹ソ(OK), 灏哄:100.00mm(OK)")
+ @ExcelProperty("妫�楠岄」鎸囨爣")
+ private String indicatorResultSummary;
+
@Schema(description = "妫�娴嬫棩鏈�")
@ExcelProperty("妫�娴嬫棩鏈�")
private LocalDateTime inspectDate;
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/MesQcTemplateItemController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/MesQcTemplateItemController.java
index 32562ac..cdd5397 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/MesQcTemplateItemController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/MesQcTemplateItemController.java
@@ -1,17 +1,21 @@
package cn.iocoder.yudao.module.mes.controller.admin.qc.template;
+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.template.vo.item.MesQcTemplateItemOptionRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.qc.template.vo.item.MesQcTemplateItemPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.qc.template.vo.item.MesQcTemplateItemRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.qc.template.vo.item.MesQcTemplateItemSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateItemDO;
import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateItemService;
+import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -37,6 +41,8 @@
@Resource
private MesQcTemplateItemService templateItemService;
+ @Resource
+ private MesQcTemplateService templateService;
@Resource
private MesMdmItemService mdmItemService;
@Resource
@@ -84,6 +90,31 @@
return success(new PageResult<>(buildItemRespVOList(pageResult.getList()), pageResult.getTotal()));
}
+ @GetMapping("/list-by-item-and-type")
+ @Operation(summary = "鏍规嵁鐗╂枡鎴栧伐鍗�/浠诲姟鍜屾娴嬬绫昏幏鍙栧彲鐢ㄨ川妫�鏂规")
+ @PreAuthorize("@ss.hasPermission('mes:qc-template:query')")
+ public CommonResult<List<MesQcTemplateItemOptionRespVO>> getTemplateItemOptionList(
+ @RequestParam(value = "qcType", required = false) Integer qcType,
+ @RequestParam(value = "itemId", required = false) Long itemId,
+ @RequestParam(value = "workOrderId", required = false) Long workOrderId,
+ @RequestParam(value = "taskId", required = false) Long taskId) {
+ List<MesQcTemplateItemDO> list = templateItemService.getTemplateItemList(
+ itemId, qcType, workOrderId, taskId);
+ if (CollUtil.isEmpty(list)) {
+ return success(Collections.emptyList());
+ }
+ Map<Long, MesQcTemplateDO> templateMap = templateService.getTemplateMap(
+ convertSet(list, MesQcTemplateItemDO::getTemplateId));
+ List<MesQcTemplateItemOptionRespVO> result = BeanUtils.toBean(list,
+ MesQcTemplateItemOptionRespVO.class, vo -> {
+ MesQcTemplateDO template = templateMap.get(vo.getTemplateId());
+ if (template != null) {
+ vo.setTemplateCode(template.getCode()).setTemplateName(template.getName());
+ }
+ });
+ return success(result);
+ }
+
// ==================== 鎷兼帴 VO ====================
private List<MesQcTemplateItemRespVO> buildItemRespVOList(List<MesQcTemplateItemDO> list) {
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/vo/item/MesQcTemplateItemOptionRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/vo/item/MesQcTemplateItemOptionRespVO.java
new file mode 100644
index 0000000..fa02a7b
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/vo/item/MesQcTemplateItemOptionRespVO.java
@@ -0,0 +1,39 @@
+package cn.iocoder.yudao.module.mes.controller.admin.qc.template.vo.item;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 璐ㄦ鏂规-浜у搧鍏宠仈 閫夐」 Response VO")
+@Data
+public class MesQcTemplateItemOptionRespVO {
+
+ @Schema(description = "浜у搧鍏宠仈缂栧彿", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+ private Long id;
+
+ @Schema(description = "璐ㄦ鏂规 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ private Long templateId;
+
+ @Schema(description = "璐ㄦ鏂规缂栧彿", example = "QC_CAR_001")
+ private String templateCode;
+
+ @Schema(description = "璐ㄦ鏂规鍚嶇О", example = "姹借溅鏁磋溅璐ㄦ鏂规")
+ private String templateName;
+
+ @Schema(description = "鏈�浣庢娴嬫暟", example = "5")
+ private Integer quantityCheck;
+
+ @Schema(description = "鏈�澶т笉鍚堟牸鏁�", example = "0")
+ private Integer quantityUnqualified;
+
+ @Schema(description = "鏈�澶ц嚧鍛界己闄风巼锛�%锛�", example = "0")
+ private BigDecimal criticalRate;
+
+ @Schema(description = "鏈�澶т弗閲嶇己闄风巼锛�%锛�", example = "0")
+ private BigDecimal majorRate;
+
+ @Schema(description = "鏈�澶ц交寰己闄风巼锛�%锛�", example = "100")
+ private BigDecimal minorRate;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/vo/MesQcQualityExportVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/vo/MesQcQualityExportVO.java
new file mode 100644
index 0000000..26ee09a
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/vo/MesQcQualityExportVO.java
@@ -0,0 +1,92 @@
+package cn.iocoder.yudao.module.mes.controller.admin.qc.vo;
+
+import cn.idev.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * MES 璐ㄦ妫�楠屽崟瀵煎嚭 Excel VO锛圛QC/IPQC/OQC/RQC 鍏辩敤锛�
+ *
+ * <p>瀵煎嚭鍒楋細妫�楠屽崟鍚嶇О / 鐗╂枡鍚嶇О / 鎵瑰彿 / 妫�娴嬫棩鏈� / 妫�楠屾寚鏍� / 鍒ゅ畾渚濇嵁 / 妫�楠岀粨鏋� / 妫�楠屼汉 / 瀹℃牳浜� / 澶囨敞銆�
+ * 妫�楠屾寚鏍囥�佸垽瀹氫緷鎹彇鑷楠屽崟琛屾槑缁嗭紱瀹℃牳浜烘殏鏃犳暟鎹潵婧愶紝瀵煎嚭涓虹┖鍒椼��
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+@Data
+public class MesQcQualityExportVO {
+
+ @ExcelProperty("妫�楠屽崟鍚嶇О")
+ private String docName;
+
+ @ExcelProperty("鐗╂枡鍚嶇О")
+ private String itemName;
+
+ @ExcelProperty("鎵瑰彿")
+ private String batchNo;
+
+ @ExcelProperty("妫�娴嬫棩鏈�")
+ private String inspectDate;
+
+ @ExcelProperty("妫�楠屾寚鏍�")
+ private String indicatorNames;
+
+ @ExcelProperty("鍒ゅ畾渚濇嵁")
+ private String judgementBasis;
+
+ @ExcelProperty("妫�楠岀粨鏋�")
+ private String checkResultText;
+
+ @ExcelProperty("妫�楠屼汉")
+ private String inspectorName;
+
+ @ExcelProperty("瀹℃牳浜�")
+ private String auditorName;
+
+ @ExcelProperty("澶囨敞")
+ private String remark;
+
+ /**
+ * 鏍煎紡鍖栨娴嬫棩鏈燂紙浠呮棩鏈燂級锛宯ull 杩斿洖绌轰覆
+ */
+ public static String formatDateTime(LocalDateTime dateTime) {
+ if (dateTime == null) {
+ return "";
+ }
+ return dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+ }
+
+ /**
+ * 鍘绘帀鏁板�煎熬閮ㄦ棤鎰忎箟鐨� 0锛屽 35.000000 -> 35銆�2.500000 -> 2.5
+ */
+ public static String formatDecimal(BigDecimal value) {
+ if (value == null) {
+ return "";
+ }
+ return value.stripTrailingZeros().toPlainString();
+ }
+
+ /**
+ * 缁勮鍗曚釜妫�娴嬮」鐨勫垽瀹氫緷鎹枃鏈細
+ * 涓婁笅闄愬潎鏈� -> "涓嬮檺~涓婇檺"锛涗粎鏈変笂闄� -> "鈮や笂闄�"锛涗粎鏈変笅闄� -> "鈮ヤ笅闄�"锛�
+ * 鍧囨棤浣嗙粰浜嗘爣鍑嗗�� -> "鏍囧噯鍊� 鏍囧噯鍊�"锛涘惁鍒欒繑鍥炵┖涓层��
+ */
+ public static String buildRangeText(BigDecimal standardValue, BigDecimal minThreshold, BigDecimal maxThreshold) {
+ if (maxThreshold != null && minThreshold != null) {
+ return formatDecimal(minThreshold) + "~" + formatDecimal(maxThreshold);
+ }
+ if (maxThreshold != null) {
+ return "鈮�" + formatDecimal(maxThreshold);
+ }
+ if (minThreshold != null) {
+ return "鈮�" + formatDecimal(minThreshold);
+ }
+ if (standardValue != null) {
+ return "鏍囧噯鍊� " + formatDecimal(standardValue);
+ }
+ return "";
+ }
+
+}
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
index 15958f3..6308865 100644
--- 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
@@ -19,6 +19,10 @@
return selectList(MesQcIndicatorResultDetailDO::getResultId, resultId);
}
+ default List<MesQcIndicatorResultDetailDO> selectListByResultIds(List<Long> resultIds) {
+ return selectList(MesQcIndicatorResultDetailDO::getResultId, resultIds);
+ }
+
default void deleteByResultId(Long resultId) {
delete(new LambdaQueryWrapperX<MesQcIndicatorResultDetailDO>()
.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
index a1d1398..a021ea0 100644
--- 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
@@ -38,4 +38,10 @@
.eq(MesQcIndicatorResultDO::getQcType, qcType));
}
+ default List<MesQcIndicatorResultDO> selectListByQcIdsAndType(List<Long> qcIds, Integer qcType) {
+ return selectList(new LambdaQueryWrapperX<MesQcIndicatorResultDO>()
+ .in(MesQcIndicatorResultDO::getQcId, qcIds)
+ .eq(MesQcIndicatorResultDO::getQcType, qcType));
+ }
+
}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/ipqc/MesQcIpqcLineMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/ipqc/MesQcIpqcLineMapper.java
index 120692e..2bd42ad 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/ipqc/MesQcIpqcLineMapper.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/ipqc/MesQcIpqcLineMapper.java
@@ -7,6 +7,7 @@
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.ipqc.MesQcIpqcLineDO;
import org.apache.ibatis.annotations.Mapper;
+import java.util.Collection;
import java.util.List;
/**
@@ -27,6 +28,12 @@
return selectList(MesQcIpqcLineDO::getIpqcId, ipqcId);
}
+ default List<MesQcIpqcLineDO> selectListByIpqcIds(Collection<Long> ipqcIds) {
+ return selectList(new LambdaQueryWrapperX<MesQcIpqcLineDO>()
+ .in(MesQcIpqcLineDO::getIpqcId, ipqcIds)
+ .orderByAsc(MesQcIpqcLineDO::getId));
+ }
+
default void deleteByIpqcId(Long ipqcId) {
delete(new LambdaQueryWrapperX<MesQcIpqcLineDO>()
.eq(MesQcIpqcLineDO::getIpqcId, ipqcId));
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/ipqc/MesQcIpqcMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/ipqc/MesQcIpqcMapper.java
index fb69ac4..105c503 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/ipqc/MesQcIpqcMapper.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/ipqc/MesQcIpqcMapper.java
@@ -26,6 +26,7 @@
.eqIfPresent(MesQcIpqcDO::getCheckResult, reqVO.getCheckResult())
.eqIfPresent(MesQcIpqcDO::getStatus, reqVO.getStatus())
.eqIfPresent(MesQcIpqcDO::getInspectorUserId, reqVO.getInspectorUserId())
+ .betweenIfPresent(MesQcIpqcDO::getInspectDate, reqVO.getInspectDate())
.orderByDesc(MesQcIpqcDO::getId));
}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/iqc/MesQcIqcLineMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/iqc/MesQcIqcLineMapper.java
index b134e75..eeaaa66 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/iqc/MesQcIqcLineMapper.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/iqc/MesQcIqcLineMapper.java
@@ -7,6 +7,7 @@
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.iqc.MesQcIqcLineDO;
import org.apache.ibatis.annotations.Mapper;
+import java.util.Collection;
import java.util.List;
/**
@@ -27,6 +28,12 @@
return selectList(MesQcIqcLineDO::getIqcId, iqcId);
}
+ default List<MesQcIqcLineDO> selectListByIqcIds(Collection<Long> iqcIds) {
+ return selectList(new LambdaQueryWrapperX<MesQcIqcLineDO>()
+ .in(MesQcIqcLineDO::getIqcId, iqcIds)
+ .orderByAsc(MesQcIqcLineDO::getId));
+ }
+
default void deleteByIqcId(Long iqcId) {
delete(new LambdaQueryWrapperX<MesQcIqcLineDO>()
.eq(MesQcIqcLineDO::getIqcId, iqcId));
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/oqc/MesQcOqcLineMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/oqc/MesQcOqcLineMapper.java
index 3745a56..11d20e5 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/oqc/MesQcOqcLineMapper.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/oqc/MesQcOqcLineMapper.java
@@ -7,6 +7,7 @@
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.oqc.MesQcOqcLineDO;
import org.apache.ibatis.annotations.Mapper;
+import java.util.Collection;
import java.util.List;
/**
@@ -27,6 +28,12 @@
return selectList(MesQcOqcLineDO::getOqcId, oqcId);
}
+ default List<MesQcOqcLineDO> selectListByOqcIds(Collection<Long> oqcIds) {
+ return selectList(new LambdaQueryWrapperX<MesQcOqcLineDO>()
+ .in(MesQcOqcLineDO::getOqcId, oqcIds)
+ .orderByAsc(MesQcOqcLineDO::getId));
+ }
+
default void deleteByOqcId(Long oqcId) {
delete(new LambdaQueryWrapperX<MesQcOqcLineDO>()
.eq(MesQcOqcLineDO::getOqcId, oqcId));
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/oqc/MesQcOqcMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/oqc/MesQcOqcMapper.java
index 1a26e94..7c175d3 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/oqc/MesQcOqcMapper.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/oqc/MesQcOqcMapper.java
@@ -25,6 +25,7 @@
.likeIfPresent(MesQcOqcDO::getBatchCode, reqVO.getBatchCode())
.eqIfPresent(MesQcOqcDO::getItemId, reqVO.getItemId())
.eqIfPresent(MesQcOqcDO::getCheckResult, reqVO.getCheckResult())
+ .betweenIfPresent(MesQcOqcDO::getInspectDate, reqVO.getInspectDate())
.orderByDesc(MesQcOqcDO::getId));
}
@@ -38,6 +39,7 @@
.likeIfPresent(MesQcOqcDO::getBatchCode, reqVO.getBatchCode())
.eqIfPresent(MesQcOqcDO::getItemId, reqVO.getItemId())
.eqIfPresent(MesQcOqcDO::getCheckResult, reqVO.getCheckResult())
+ .betweenIfPresent(MesQcOqcDO::getInspectDate, reqVO.getInspectDate())
.orderByDesc(MesQcOqcDO::getId);
if (permittedClientIds != null) {
if (CollUtil.isEmpty(permittedClientIds)) {
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/rqc/MesQcRqcLineMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/rqc/MesQcRqcLineMapper.java
index b09cdaa..d9c7f4a 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/rqc/MesQcRqcLineMapper.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/rqc/MesQcRqcLineMapper.java
@@ -7,6 +7,7 @@
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.rqc.MesQcRqcLineDO;
import org.apache.ibatis.annotations.Mapper;
+import java.util.Collection;
import java.util.List;
/**
@@ -27,6 +28,12 @@
return selectList(MesQcRqcLineDO::getRqcId, rqcId);
}
+ default List<MesQcRqcLineDO> selectListByRqcIds(Collection<Long> rqcIds) {
+ return selectList(new LambdaQueryWrapperX<MesQcRqcLineDO>()
+ .in(MesQcRqcLineDO::getRqcId, rqcIds)
+ .orderByAsc(MesQcRqcLineDO::getId));
+ }
+
default void deleteByRqcId(Long rqcId) {
delete(new LambdaQueryWrapperX<MesQcRqcLineDO>()
.eq(MesQcRqcLineDO::getRqcId, rqcId));
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/rqc/MesQcRqcMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/rqc/MesQcRqcMapper.java
index b2bba02..7606793 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/rqc/MesQcRqcMapper.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/rqc/MesQcRqcMapper.java
@@ -25,6 +25,7 @@
.eqIfPresent(MesQcRqcDO::getCheckResult, reqVO.getCheckResult())
.eqIfPresent(MesQcRqcDO::getStatus, reqVO.getStatus())
.eqIfPresent(MesQcRqcDO::getInspectorUserId, reqVO.getInspectorUserId())
+ .betweenIfPresent(MesQcRqcDO::getInspectDate, reqVO.getInspectDate())
.orderByDesc(MesQcRqcDO::getId));
}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultDetailService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultDetailService.java
index b7bc5b1..5db7f7b 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultDetailService.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultDetailService.java
@@ -34,6 +34,14 @@
List<MesQcIndicatorResultDetailDO> getDetailListByResultId(Long resultId);
/**
+ * 鏍规嵁妫�楠岀粨鏋� ID 鍒楄〃鎵归噺鑾峰彇鏄庣粏鍒楄〃
+ *
+ * @param resultIds 妫�楠岀粨鏋� ID 鍒楄〃
+ * @return 鏄庣粏鍒楄〃
+ */
+ List<MesQcIndicatorResultDetailDO> getDetailListByResultIds(List<Long> resultIds);
+
+ /**
* 鏍规嵁妫�楠岀粨鏋� ID 鍒犻櫎鎵�鏈夋槑缁�
*
* @param resultId 妫�楠岀粨鏋� ID
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultDetailServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultDetailServiceImpl.java
index 580e989..533e057 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultDetailServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultDetailServiceImpl.java
@@ -37,6 +37,11 @@
}
@Override
+ public List<MesQcIndicatorResultDetailDO> getDetailListByResultIds(List<Long> resultIds) {
+ return detailMapper.selectListByResultIds(resultIds);
+ }
+
+ @Override
public void deleteDetailByResultId(Long resultId) {
detailMapper.delete(new LambdaQueryWrapperX<MesQcIndicatorResultDetailDO>()
.eq(MesQcIndicatorResultDetailDO::getResultId, resultId));
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
index 741e42f..a6856a7 100644
--- 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
@@ -63,6 +63,15 @@
List<MesQcIndicatorResultDetailDO> getIndicatorResultDetailListByResultId(Long resultId);
/**
+ * 鑾峰彇鎸囧畾璐ㄦ鍗曚笅鐨勬楠岀粨鏋滃垪琛�
+ *
+ * @param qcId 璐ㄦ鍗� ID
+ * @param qcType 璐ㄦ绫诲瀷
+ * @return 缁撴灉鍒楄〃
+ */
+ List<MesQcIndicatorResultDO> getIndicatorResultListByQcIdAndType(Long qcId, Integer qcType);
+
+ /**
* 鑾峰彇鎸囧畾璐ㄦ鍗曚笅鐨勬楠岀粨鏋滄暟閲�
*
* @param qcId 璐ㄦ鍗� ID
@@ -72,6 +81,23 @@
Long getIndicatorResultCountByQcIdAndType(Long qcId, Integer qcType);
/**
+ * 鏍规嵁璐ㄦ鍗旾D鍒楄〃鍜岀被鍨嬫壒閲忚幏鍙栨楠岀粨鏋�
+ *
+ * @param qcIds 璐ㄦ鍗� ID 鍒楄〃
+ * @param qcType 璐ㄦ绫诲瀷
+ * @return 妫�楠岀粨鏋滃垪琛�
+ */
+ List<MesQcIndicatorResultDO> getIndicatorResultListByQcIdsAndType(List<Long> qcIds, Integer qcType);
+
+ /**
+ * 鏍规嵁缁撴灉ID鍒楄〃鎵归噺鑾峰彇妫�楠岀粨鏋滄槑缁�
+ *
+ * @param resultIds 缁撴灉ID鍒楄〃
+ * @return 妫�楠岀粨鏋滄槑缁嗗垪琛�
+ */
+ List<MesQcIndicatorResultDetailDO> getIndicatorResultDetailListByResultIds(List<Long> resultIds);
+
+ /**
* 鏍¢獙鎸囧畾璐ㄦ鍗曚笅鑷冲皯瀛樺湪涓�鏉℃楠岀粨鏋�
*
* @param qcId 璐ㄦ鍗� ID
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
index 860ac64..1163b31 100644
--- 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
@@ -137,6 +137,34 @@
return resultMapper.selectCountByQcIdAndType(qcId, qcType);
}
+ /**
+ * 鑾峰彇鎸囧畾璐ㄦ鍗曚笅鐨勬楠岀粨鏋滃垪琛�
+ *
+ * @param qcId 璐ㄦ鍗� ID
+ * @param qcType 璐ㄦ绫诲瀷
+ * @return 缁撴灉鍒楄〃
+ */
+ @Override
+ public List<MesQcIndicatorResultDO> getIndicatorResultListByQcIdAndType(Long qcId, Integer qcType) {
+ return resultMapper.selectListByQcIdAndType(qcId, qcType);
+ }
+
+ @Override
+ public List<MesQcIndicatorResultDO> getIndicatorResultListByQcIdsAndType(List<Long> qcIds, Integer qcType) {
+ if (CollUtil.isEmpty(qcIds)) {
+ return Collections.emptyList();
+ }
+ return resultMapper.selectListByQcIdsAndType(qcIds, qcType);
+ }
+
+ @Override
+ public List<MesQcIndicatorResultDetailDO> getIndicatorResultDetailListByResultIds(List<Long> resultIds) {
+ if (CollUtil.isEmpty(resultIds)) {
+ return Collections.emptyList();
+ }
+ return resultDetailService.getDetailListByResultIds(resultIds);
+ }
+
@Override
public void validateIndicatorResultExistsByQcIdAndType(Long qcId, Integer qcType) {
Long resultCount = getIndicatorResultCountByQcIdAndType(qcId, qcType);
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImpl.java
index cf1ea78..6abef96 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImpl.java
@@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.mes.service.qc.ipqc;
+import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
@@ -123,9 +124,21 @@
MesProWorkOrderDO workOrder = workOrderService.validateWorkOrderExists(createReqVO.getWorkOrderId());
// 1.3 纭畾妫�楠岀墿鏂欙細鏈変换鍔℃椂鍙栦换鍔$殑鐗╂枡锛屾棤浠诲姟鏃跺彇宸ュ崟鐨勪骇鍝�
Long itemId = (ctx.task() != null) ? ctx.task().getItemId() : workOrder.getProductId();
- // 1.4 鏍规嵁鐗╂枡 + 妫�楠岀被鍨嬭嚜鍔ㄥ尮閰嶆ā鏉�
- MesQcTemplateItemDO templateItem = templateItemService.getRequiredTemplateByItemIdAndType(
- itemId, MesQcTypeEnum.IPQC.getType());
+ // 1.4 鏍规嵁鐗╂枡 + IPQC 绫诲瀷鏌ユ壘鍙敤璐ㄦ鏂规锛堟敮鎸佸墠绔樉寮忔寚瀹氾級
+ List<MesQcTemplateItemDO> templateItems = templateItemService.getTemplateItemList(
+ itemId, MesQcTypeEnum.IPQC.getType(), null, null);
+ if (CollUtil.isEmpty(templateItems)) {
+ throw exception(QC_NO_TEMPLATE);
+ }
+ MesQcTemplateItemDO templateItem = templateItems.get(0);
+ if (createReqVO.getTemplateId() != null) {
+ templateItem = templateItems.stream()
+ .filter(available -> Objects.equals(available.getTemplateId(), createReqVO.getTemplateId()))
+ .findFirst().orElse(null);
+ if (templateItem == null) {
+ throw exception(QC_NO_TEMPLATE); // 鎸囧畾浜嗘柟妗堜絾涓嶅湪鍖归厤鍒楄〃涓紝鎷掔粷
+ }
+ }
Long templateId = templateItem.getTemplateId();
// 1.5 鑾峰彇鏉ユ簮鍗曟嵁缂栧彿
String sourceDocCode = validateAndGetSourceDocCode(
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java
index b64b62f..975ddc0 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java
@@ -91,9 +91,21 @@
// 1.2 鏍¢獙鏉ユ簮鍗曟嵁鍙傛暟锛屽苟楠岃瘉鏁版嵁瀛樺湪
String sourceDocCode = validateAndGetSourceDocCode(
createReqVO.getSourceDocType(), createReqVO.getSourceDocId(), createReqVO.getSourceLineId());
- // 1.3 閫氳繃 itemId + IQC 绫诲瀷鑷姩鏌ユ壘妯℃澘
- MesQcTemplateItemDO templateItem = templateItemService.getRequiredTemplateByItemIdAndType(
- createReqVO.getItemId(), MesQcTypeEnum.IQC.getType());
+ // 1.3 鏍规嵁浜у搧 + IQC 绫诲瀷鏌ユ壘鍙敤璐ㄦ鏂规锛堟敮鎸佸墠绔樉寮忔寚瀹氾級
+ List<MesQcTemplateItemDO> templateItems = templateItemService.getTemplateItemList(
+ createReqVO.getItemId(), MesQcTypeEnum.IQC.getType(), null, null);
+ if (CollUtil.isEmpty(templateItems)) {
+ throw exception(QC_NO_TEMPLATE);
+ }
+ MesQcTemplateItemDO templateItem = templateItems.get(0);
+ if (createReqVO.getTemplateId() != null) {
+ templateItem = templateItems.stream()
+ .filter(item -> Objects.equals(item.getTemplateId(), createReqVO.getTemplateId()))
+ .findFirst().orElse(null);
+ if (templateItem == null) {
+ throw exception(QC_NO_TEMPLATE); // 鎸囧畾浜嗘柟妗堜絾涓嶅湪鍖归厤鍒楄〃涓紝鎷掔粷
+ }
+ }
Long templateId = templateItem.getTemplateId();
// 2. 鎻掑叆涓昏〃
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java
index 57b4dd2..30bf336 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java
@@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.mes.service.qc.oqc;
+import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
@@ -88,9 +89,21 @@
// 1.2 鏍¢獙鏉ユ簮鍗曟嵁鍙傛暟锛屽苟楠岃瘉鏁版嵁瀛樺湪
String sourceDocCode = validateAndGetSourceDocCode(
createReqVO.getSourceDocType(), createReqVO.getSourceLineId());
- // 1.3 鏍规嵁浜у搧 + 妫�楠岀被鍨嬭嚜鍔ㄥ尮閰嶆ā鏉�
- MesQcTemplateItemDO templateItem = templateItemService.getRequiredTemplateByItemIdAndType(
- createReqVO.getItemId(), MesQcTypeEnum.OQC.getType());
+ // 1.3 鏍规嵁浜у搧 + OQC 绫诲瀷鏌ユ壘鍙敤璐ㄦ鏂规锛堟敮鎸佸墠绔樉寮忔寚瀹氾級
+ List<MesQcTemplateItemDO> templateItems = templateItemService.getTemplateItemList(
+ createReqVO.getItemId(), MesQcTypeEnum.OQC.getType(), null, null);
+ if (CollUtil.isEmpty(templateItems)) {
+ throw exception(QC_NO_TEMPLATE);
+ }
+ MesQcTemplateItemDO templateItem = templateItems.get(0);
+ if (createReqVO.getTemplateId() != null) {
+ templateItem = templateItems.stream()
+ .filter(available -> Objects.equals(available.getTemplateId(), createReqVO.getTemplateId()))
+ .findFirst().orElse(null);
+ if (templateItem == null) {
+ throw exception(QC_NO_TEMPLATE); // 鎸囧畾浜嗘柟妗堜絾涓嶅湪鍖归厤鍒楄〃涓紝鎷掔粷
+ }
+ }
Long templateId = templateItem.getTemplateId();
// 2. 鎻掑叆涓昏〃
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImpl.java
index 878a611..86d79a9 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImpl.java
@@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.mes.service.qc.rqc;
+import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
@@ -89,9 +90,21 @@
public Long createRqc(MesQcRqcSaveReqVO createReqVO) {
// 1.1 鏍¢獙鏁版嵁
validateRqcSaveData(createReqVO);
- // 1.2 鏍规嵁鐗╂枡 + 妫�楠岀被鍨嬭嚜鍔ㄥ尮閰嶆ā鏉�
- MesQcTemplateItemDO templateItem = templateItemService.getRequiredTemplateByItemIdAndType(
- createReqVO.getItemId(), createReqVO.getType());
+ // 1.2 鏍规嵁鐗╂枡 + RQC 妫�娴嬬绫绘煡鎵惧彲鐢ㄨ川妫�鏂规锛堟敮鎸佸墠绔樉寮忔寚瀹氾級
+ List<MesQcTemplateItemDO> templateItems = templateItemService.getTemplateItemList(
+ createReqVO.getItemId(), MesQcTypeEnum.RQC.getType(), null, null);
+ if (CollUtil.isEmpty(templateItems)) {
+ throw exception(QC_NO_TEMPLATE);
+ }
+ MesQcTemplateItemDO templateItem = templateItems.get(0);
+ if (createReqVO.getTemplateId() != null) {
+ templateItem = templateItems.stream()
+ .filter(available -> Objects.equals(available.getTemplateId(), createReqVO.getTemplateId()))
+ .findFirst().orElse(null);
+ if (templateItem == null) {
+ throw exception(QC_NO_TEMPLATE); // 鎸囧畾浜嗘柟妗堜絾涓嶅湪鍖归厤鍒楄〃涓紝鎷掔粷
+ }
+ }
Long templateId = templateItem.getTemplateId();
// 1.3 鑾峰彇鏉ユ簮鍗曟嵁缂栧彿
String sourceDocCode = validateAndGetSourceDocCode(
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateItemService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateItemService.java
index 6d2935f..4a6ab79 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateItemService.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateItemService.java
@@ -7,6 +7,8 @@
import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum;
import jakarta.validation.Valid;
+import java.util.List;
+
/**
* MES 璐ㄦ鏂规-浜у搧鍏宠仈 Service 鎺ュ彛
*
@@ -68,4 +70,15 @@
*/
MesQcTemplateItemDO getRequiredTemplateByItemIdAndType(Long itemId, Integer qcType);
+ /**
+ * 鏍规嵁浜у搧鐗╂枡锛堟垨宸ュ崟/浠诲姟锛夊拰 QC 绫诲瀷锛岃幏鍙栨墍鏈夊彲鐢ㄧ殑璐ㄦ鏂规浜у搧鍏宠仈鍒楄〃
+ *
+ * @param itemId 浜у搧鐗╂枡 ID锛坢es_md_item.id锛夛紱涓� workOrderId/taskId 鑷冲皯鍏朵竴
+ * @param qcType 妫�娴嬬绫伙紙鏋氫妇 {@link MesQcTypeEnum}锛�
+ * @param workOrderId 鐢熶骇宸ュ崟 ID锛堝彲閫夛紝IPQC 鍦烘櫙鐢ㄤ簬瑙f瀽浜у搧鐗╂枡锛�
+ * @param taskId 鐢熶骇浠诲姟 ID锛堝彲閫夛紝浼樺厛鐢ㄤ簬瑙f瀽浜у搧鐗╂枡锛�
+ * @return 鍖归厤鐨勪骇鍝佸叧鑱斿垪琛紙淇濇寔鍘熼『搴忥級锛屾棤鍖归厤杩斿洖绌哄垪琛�
+ */
+ List<MesQcTemplateItemDO> getTemplateItemList(Long itemId, Integer qcType, Long workOrderId, Long taskId);
+
}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateItemServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateItemServiceImpl.java
index 5d6bb01..712c693 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateItemServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateItemServiceImpl.java
@@ -12,13 +12,18 @@
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateItemDO;
import cn.iocoder.yudao.module.mes.dal.mysql.qc.template.MesQcTemplateItemMapper;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.pro.task.MesProTaskService;
+import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
+import java.util.Collections;
import java.util.List;
import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -42,6 +47,12 @@
private MesQcTemplateService templateService;
@Resource
private MesMdItemService mesMdItemService;
+ @Resource
+ @Lazy
+ private MesProTaskService proTaskService;
+ @Resource
+ @Lazy
+ private MesProWorkOrderService proWorkOrderService;
@Override
public Long createTemplateItem(MesQcTemplateItemSaveReqVO createReqVO) {
@@ -116,23 +127,46 @@
@Override
public MesQcTemplateItemDO getRequiredTemplateByItemIdAndType(Long itemId, Integer qcType) {
- // 1. 鏌ュ嚭 itemId 鍏宠仈鐨勬墍鏈� templateItem
- MesMdItemDO item1 = mesMdItemService.getItem(itemId);
- List<MesQcTemplateItemDO> templateItems = templateItemMapper.selectListByItemId(item1.getMdmItemId());
+ List<MesQcTemplateItemDO> templateItems = getTemplateItemList(itemId, qcType, null, null);
if (CollUtil.isEmpty(templateItems)) {
throw exception(QC_NO_TEMPLATE);
}
- // 2. 绛涢�� types 鍖呭惈 qcType 涓旂姸鎬佷负寮�鍚殑妯℃澘
+ return templateItems.get(0);
+ }
+
+ @Override
+ public List<MesQcTemplateItemDO> getTemplateItemList(Long itemId, Integer qcType, Long workOrderId, Long taskId) {
+ // 1. 瑙f瀽鐪熷疄浜у搧鐗╂枡 ID锛氫换鍔′紭鍏堬紝鍏舵宸ュ崟锛屾渶鍚庣洿鎺ョ敤鍏ュ弬
+ Long resolvedItemId = itemId;
+ if (taskId != null) {
+ resolvedItemId = proTaskService.validateTaskExists(taskId).getItemId();
+ } else if (workOrderId != null) {
+ resolvedItemId = proWorkOrderService.validateWorkOrderExists(workOrderId).getProductId();
+ }
+ if (resolvedItemId == null) {
+ return Collections.emptyList();
+ }
+ // 2. mes_md_item.id 杞� mdm_item.id锛堜骇鍝佸叧鑱旇〃瀛樼殑鏄� mdm 鐗╂枡锛�
+ MesMdItemDO item = mesMdItemService.getItem(resolvedItemId);
+ if (item == null || item.getMdmItemId() == null) {
+ return Collections.emptyList();
+ }
+ // 3. 鏌ュ嚭璇ョ墿鏂欏叧鑱旂殑鎵�鏈変骇鍝佸叧鑱�
+ List<MesQcTemplateItemDO> templateItems = templateItemMapper.selectListByItemId(item.getMdmItemId());
+ if (CollUtil.isEmpty(templateItems)) {
+ return Collections.emptyList();
+ }
+ // 4. 杩囨护锛氭柟妗堝惎鐢ㄤ笖妫�娴嬬绫诲寘鍚� qcType锛岃繑鍥炲叏閮ㄥ尮閰嶉」
List<MesQcTemplateDO> templates = templateService.getTemplateList(
convertSet(templateItems, MesQcTemplateItemDO::getTemplateId));
- MesQcTemplateDO matchedTemplate = findFirst(templates,
- t -> CommonStatusEnum.isEnable(t.getStatus()) && CollUtil.contains(t.getTypes(), qcType));
- if (matchedTemplate == null) {
- throw exception(QC_NO_TEMPLATE);
- }
- // 3. 杩斿洖瀵瑰簲鐨� templateItem
- return findFirst(templateItems,
- item -> Objects.equals(item.getTemplateId(), matchedTemplate.getId()));
+ Set<Long> matchedTemplateIds = templates.stream()
+ .filter(t -> CommonStatusEnum.isEnable(t.getStatus())
+ && CollUtil.contains(t.getTypes(), qcType))
+ .map(MesQcTemplateDO::getId)
+ .collect(Collectors.toSet());
+ return templateItems.stream()
+ .filter(t -> matchedTemplateIds.contains(t.getTemplateId()))
+ .collect(Collectors.toList());
}
}
--
Gitblit v1.9.3