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