From c6eb0d852595f235b21520dab1d8600ed1b80776 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期五, 04 九月 2026 14:44:21 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_business' into dev_business

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/MesQcIqcController.java |  198 +++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 191 insertions(+), 7 deletions(-)

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 54b7169..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.erp.api.purchase.ErpSupplierApi;
-import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpSupplierRespDTO;
+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;
@@ -50,11 +67,17 @@
     @Resource
     private MesQcIqcService iqcService;
     @Resource
-    private ErpSupplierApi supplierApi;
+    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 ====================
@@ -128,9 +151,9 @@
             return Collections.emptyList();
         }
         // 鎵归噺鏌ヨ渚涘簲鍟�
-        Map<Long, ErpSupplierRespDTO> vendorMap = supplierApi.getSupplierList(
+        Map<Long, SrmSupplierRespDTO> vendorMap = srmSupplierApi.getSupplierList(
                 convertSet(list, MesQcIqcDO::getVendorId)).getCheckedData().stream()
-                .collect(java.util.stream.Collectors.toMap(ErpSupplierRespDTO::getId, s -> s));
+                .collect(java.util.stream.Collectors.toMap(SrmSupplierRespDTO::getId, s -> s));
         // 鎵归噺鏌ヨ鐗╂枡
         Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
                 convertSet(list, MesQcIqcDO::getItemId));
@@ -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));
+    }
+
 }

--
Gitblit v1.9.3