From 87b79ea739ec32bd7d0e493a6ea8525212f6c763 Mon Sep 17 00:00:00 2001
From: liusheng <337615773@qq.com>
Date: 星期六, 10 十月 2026 15:11:17 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master' into smartor_ls_261008

---
 smartor/src/main/java/com/smartor/service/impl/PatSatisfactionServiceImpl.java |  152 ++++++++++++++++++++++++++++++++------------------
 1 files changed, 96 insertions(+), 56 deletions(-)

diff --git a/smartor/src/main/java/com/smartor/service/impl/PatSatisfactionServiceImpl.java b/smartor/src/main/java/com/smartor/service/impl/PatSatisfactionServiceImpl.java
index d952ca2..9e07d77 100644
--- a/smartor/src/main/java/com/smartor/service/impl/PatSatisfactionServiceImpl.java
+++ b/smartor/src/main/java/com/smartor/service/impl/PatSatisfactionServiceImpl.java
@@ -326,31 +326,40 @@
             //2 鍐嶈幏鍙栬闂婊℃剰搴﹀垎绫讳笅鐨処vrLibaTemplateScript鐨勯泦鍚�
             List<IvrLibaTemplateScript> ivrLibaTemplateScripts = ivrLibaTemplateScriptMapper.queryLibTemplateIds(mydIdList);
 
-            //2.1 涓�娆℃�ф妸鏈璇锋眰鍏ㄩ儴妯℃澘鐨勫彂閫侀噺銆佸~鎶ラ噺鏌ュ洖鏉ワ紙鍘熸潵鏄瘡涓ā鏉块棶棰樺悇鏌ヤ袱娆★級
+            //2.1 涓�娆℃�ф妸鏈璇锋眰鍏ㄩ儴妯℃澘鐨勫彂閫侀噺銆佸洖鏀朵汉鏁版煡鍥炴潵锛堝師鏉ユ槸姣忎釜妯℃澘闂鍚勬煡涓ゆ锛�
             SatisfactionStatQuery statQuery = buildSatisfactionStatQuery(patSatisfactionReqVO, "1",
                     ivrLibaTemplateScripts.stream().map(IvrLibaTemplateScript::getTemplateid).collect(Collectors.toList()));
             Map<Long, Long> sendCountMap = mapSatisfactionSendCount(statQuery);
             SatisfactionFillStat fillStat = querySatisfactionFillStat(statQuery);
+            Map<Long, Long> fillPersonCountMap = mapSatisfactionFillPersonCount(statQuery);
 
             //3 鎸塻criptAssortname鍒嗙粍,骞惰幏鍙栨瘡涓泦鍚堣繘琛岄亶鍘嗭紝璁$畻姣忎釜鍒嗙被鐨勬�讳汉鏁板拰濉姤浜烘暟
             Map<String, List<IvrLibaTemplateScript>> scriptGroupByAssortName = ivrLibaTemplateScripts.stream().filter(item -> item.getScriptAssortname() != null).collect(Collectors.groupingBy(IvrLibaTemplateScript::getScriptAssortname));
             if (scriptGroupByAssortName != null && !scriptGroupByAssortName.isEmpty()) {
                 for (String assortNameKey : scriptGroupByAssortName.keySet()) {
-                    //璁板綍鎬讳汉鏁�
-                    Double subidAll = 0.0;
-                    //璁板綍鎬荤殑濉姤浜烘暟
-                    Double fillCountAll = 0.0;
-                    //鑾峰彇璇ュ垎绫荤殑濉姤鎬绘暟閲�
+                    // 璇ュ垎绫绘秹鍙婄殑鍘婚噸妯℃澘锛氬彂閫佷汉鏁�/鍥炴敹浜烘暟閮芥寜妯℃澘缁熻锛�
+                    // 鎸夐鐩惊鐜疮鍔犱細鎶婂悓涓�涓ā鏉跨殑閲忛噸澶嶈鎴愩�岄閲忋��
+                    Set<Long> categoryTemplateIds = new LinkedHashSet<>();
+                    //鑾峰彇璇ュ垎绫荤殑濉姤鎬绘暟閲忥紙鍙敤浜庣畻骞冲潎鍒嗭紝鎸夐鐩仛鍚堢殑琛屾暟锛�
                     List<ScoreCount> allFillCountList = new ArrayList<>();
 
                     List<IvrLibaTemplateScript> ivrLibaTemplateScriptList = scriptGroupByAssortName.get(assortNameKey);
                     for (IvrLibaTemplateScript ivrLibaTemplateScript : ivrLibaTemplateScriptList) {
-                        //閫氳繃妯℃澘id鍙栭棶棰樺彂閫佹�婚噺锛堝師鏉ユ槸鎶婂叏閮� sub_id 鏌ュ洖 Java 鍐嶅彇 size锛�
-                        subidAll += sendCountMap.getOrDefault(ivrLibaTemplateScript.getTemplateid(), 0L);
-                        //鑾峰彇濉姤鏁伴噺锛堝師鏉ユ槸鎶婃槑缁嗚鍏ㄩ儴鏌ュ洖 Java 鍐嶅彇 size锛�
-                        List<ScoreCount> fillCount = fillStat.get(ivrLibaTemplateScript.getTemplateid(), ivrLibaTemplateScript.getScriptContent());
+                        Long templateId = ivrLibaTemplateScript.getTemplateid();
+                        if (templateId != null) {
+                            categoryTemplateIds.add(templateId);
+                        }
+                        //鑾峰彇濉姤鍒嗗�煎垎甯冿紙鍙敤浜庡钩鍧囧垎锛�
+                        List<ScoreCount> fillCount = fillStat.get(templateId, ivrLibaTemplateScript.getScriptContent());
                         if (CollectionUtils.isNotEmpty(fillCount)) allFillCountList.addAll(fillCount);
-                        fillCountAll += countFillRows(fillCount);
+                    }
+
+                    //璁板綍鍙戦�佹�讳汉鏁般�佸洖鏀舵�讳汉鏁�
+                    Double subidAll = 0.0;
+                    Double fillCountAll = 0.0;
+                    for (Long templateId : categoryTemplateIds) {
+                        subidAll += sendCountMap.getOrDefault(templateId, 0L);
+                        fillCountAll += fillPersonCountMap.getOrDefault(templateId, 0L);
                     }
 
                     // 杩欓噷鍏堣褰曚竴涓嬫瘡涓垎绫荤殑鎬讳汉鏁板拰濉姤浜烘暟
@@ -375,31 +384,40 @@
             //2 鍐嶈幏鍙栬闂婊℃剰搴﹀垎绫讳笅鐨処vrLibaTemplateScript鐨勯泦鍚�
             List<SvyLibTemplateScript> svyLibTemplateScripts = svyLibTemplateScriptMapper.querySvyLibTemplateIds(mydIdList);
 
-            //2.1 涓�娆℃�ф妸鏈璇锋眰鍏ㄩ儴妯℃澘鐨勫彂閫侀噺銆佸~鎶ラ噺鏌ュ洖鏉ワ紙鍘熸潵鏄瘡涓ā鏉块棶棰樺悇鏌ヤ袱娆★級
+            //2.1 涓�娆℃�ф妸鏈璇锋眰鍏ㄩ儴妯℃澘鐨勫彂閫侀噺銆佸洖鏀朵汉鏁版煡鍥炴潵锛堝師鏉ユ槸姣忎釜妯℃澘闂鍚勬煡涓ゆ锛�
             SatisfactionStatQuery statQuery = buildSatisfactionStatQuery(patSatisfactionReqVO, "2",
                     svyLibTemplateScripts.stream().map(SvyLibTemplateScript::getSvyid).collect(Collectors.toList()));
             Map<Long, Long> sendCountMap = mapSatisfactionSendCount(statQuery);
             SatisfactionFillStat fillStat = querySatisfactionFillStat(statQuery);
+            Map<Long, Long> fillPersonCountMap = mapSatisfactionFillPersonCount(statQuery);
 
             //3 鎸塻criptAssortname鍒嗙粍,骞惰幏鍙栨瘡涓泦鍚堣繘琛岄亶鍘嗭紝璁$畻姣忎釜鍒嗙被鐨勬�讳汉鏁板拰濉姤浜烘暟
             Map<String, List<SvyLibTemplateScript>> scriptGroupByatCegoryName = svyLibTemplateScripts.stream().filter(item -> item.getCategoryName() != null).collect(Collectors.groupingBy(SvyLibTemplateScript::getCategoryName));
             if (scriptGroupByatCegoryName != null && !scriptGroupByatCegoryName.isEmpty()) {
                 for (String categoryNameKey : scriptGroupByatCegoryName.keySet()) {
-                    //璁板綍鎬讳汉鏁�
-                    Double subidAll = 0.0;
-                    //璁板綍鎬荤殑濉姤浜烘暟
-                    Double fillCountAll = 0.0;
-                    //鑾峰彇璇ュ垎绫荤殑濉姤鎬绘暟閲�
+                    // 璇ュ垎绫绘秹鍙婄殑鍘婚噸妯℃澘锛氬彂閫佷汉鏁�/鍥炴敹浜烘暟閮芥寜妯℃澘缁熻锛�
+                    // 鎸夐鐩惊鐜疮鍔犱細鎶婂悓涓�涓ā鏉跨殑閲忛噸澶嶈鎴愩�岄閲忋��
+                    Set<Long> categoryTemplateIds = new LinkedHashSet<>();
+                    //鑾峰彇璇ュ垎绫荤殑濉姤鎬绘暟閲忥紙鍙敤浜庣畻骞冲潎鍒嗭紝鎸夐鐩仛鍚堢殑琛屾暟锛�
                     List<ScoreCount> allFillCountList = new ArrayList<>();
 
                     List<SvyLibTemplateScript> svyLibTemplateScriptList = scriptGroupByatCegoryName.get(categoryNameKey);
                     for (SvyLibTemplateScript svyLibTemplateScript : svyLibTemplateScriptList) {
-                        //閫氳繃妯℃澘id鍙栭棶棰樺彂閫佹�婚噺锛堝師鏉ユ槸鎶婂叏閮� sub_id 鏌ュ洖 Java 鍐嶅彇 size锛�
-                        subidAll += sendCountMap.getOrDefault(svyLibTemplateScript.getSvyid(), 0L);
-                        //鑾峰彇濉姤鏁伴噺锛堝師鏉ユ槸鎶婃槑缁嗚鍏ㄩ儴鏌ュ洖 Java 鍐嶅彇 size锛�
-                        List<ScoreCount> fillCount = fillStat.get(svyLibTemplateScript.getSvyid(), svyLibTemplateScript.getScriptContent());
+                        Long templateId = svyLibTemplateScript.getSvyid();
+                        if (templateId != null) {
+                            categoryTemplateIds.add(templateId);
+                        }
+                        //鑾峰彇濉姤鍒嗗�煎垎甯冿紙鍙敤浜庡钩鍧囧垎锛�
+                        List<ScoreCount> fillCount = fillStat.get(templateId, svyLibTemplateScript.getScriptContent());
                         if (CollectionUtils.isNotEmpty(fillCount)) allFillCountList.addAll(fillCount);
-                        fillCountAll += countFillRows(fillCount);
+                    }
+
+                    //璁板綍鍙戦�佹�讳汉鏁般�佸洖鏀舵�讳汉鏁�
+                    Double subidAll = 0.0;
+                    Double fillCountAll = 0.0;
+                    for (Long templateId : categoryTemplateIds) {
+                        subidAll += sendCountMap.getOrDefault(templateId, 0L);
+                        fillCountAll += fillPersonCountMap.getOrDefault(templateId, 0L);
                     }
 
 
@@ -453,28 +471,36 @@
                 Map<String, List<IvrLibaTemplateScript>> groupByDimension = dimensionScripts.stream().collect(Collectors.groupingBy(IvrLibaTemplateScript::getDimension));
 
                 if (groupByDimension != null && !groupByDimension.isEmpty()) {
-                    //3.1 涓�娆℃�ф妸鏈璇锋眰鍏ㄩ儴妯℃澘鐨勫彂閫侀噺銆佸~鎶ラ噺鏌ュ洖鏉ワ紙鍘熸潵鏄瘡涓ā鏉块棶棰樺悇鏌ヤ袱娆★級
+                    //3.1 涓�娆℃�ф妸鏈璇锋眰鍏ㄩ儴妯℃澘鐨勫彂閫侀噺銆佸洖鏀朵汉鏁版煡鍥炴潵锛堝師鏉ユ槸姣忎釜妯℃澘闂鍚勬煡涓ゆ锛�
                     SatisfactionStatQuery statQuery = buildSatisfactionStatQuery(patSatisfactionReqVO, "1",
                             dimensionScripts.stream().map(IvrLibaTemplateScript::getTemplateid).collect(Collectors.toList()));
                     Map<Long, Long> sendCountMap = mapSatisfactionSendCount(statQuery);
                     SatisfactionFillStat fillStat = querySatisfactionFillStat(statQuery);
+                    Map<Long, Long> fillPersonCountMap = mapSatisfactionFillPersonCount(statQuery);
 
                     for (String dimension : groupByDimension.keySet()) {
-                        //璁板綍鎬讳汉鏁�
-                        Double subidAll = 0.0;
-                        //璁板綍鎬荤殑濉姤浜烘暟
-                        Double fillCountAll = 0.0;
-                        //鑾峰彇璇ョ淮搴︾殑濉姤鎬绘暟閲�
+                        // 璇ョ淮搴︽秹鍙婄殑鍘婚噸妯℃澘锛氬彂閫佷汉鏁�/鍥炴敹浜烘暟閮芥寜妯℃澘缁熻锛屾寜棰樼洰绱姞浼氬彉鎴愰閲�
+                        Set<Long> dimensionTemplateIds = new LinkedHashSet<>();
+                        //鑾峰彇璇ョ淮搴︾殑濉姤鍒嗗�煎垎甯冿紙鍙敤浜庣畻骞冲潎鍒嗭級
                         List<ScoreCount> allFillCountList = new ArrayList<>();
 
                         List<IvrLibaTemplateScript> ivrLibaTemplateScriptList = groupByDimension.get(dimension);
                         for (IvrLibaTemplateScript ivrLibaTemplateScript : ivrLibaTemplateScriptList) {
-                            //閫氳繃妯℃澘id鍙栭棶棰樺彂閫佹�婚噺锛堝師鏉ユ槸鎶婂叏閮� sub_id 鏌ュ洖 Java 鍐嶅彇 size锛�
-                            subidAll += sendCountMap.getOrDefault(ivrLibaTemplateScript.getTemplateid(), 0L);
-                            //鑾峰彇濉姤鏁伴噺锛堝師鏉ユ槸鎶婃槑缁嗚鍏ㄩ儴鏌ュ洖 Java 鍐嶅彇 size锛�
-                            List<ScoreCount> fillCount = fillStat.get(ivrLibaTemplateScript.getTemplateid(), ivrLibaTemplateScript.getScriptContent());
+                            Long templateId = ivrLibaTemplateScript.getTemplateid();
+                            if (templateId != null) {
+                                dimensionTemplateIds.add(templateId);
+                            }
+                            //鑾峰彇濉姤鍒嗗�煎垎甯冿紙鍙敤浜庡钩鍧囧垎锛�
+                            List<ScoreCount> fillCount = fillStat.get(templateId, ivrLibaTemplateScript.getScriptContent());
                             if (CollectionUtils.isNotEmpty(fillCount)) allFillCountList.addAll(fillCount);
-                            fillCountAll += countFillRows(fillCount);
+                        }
+
+                        //璁板綍鍙戦�佹�讳汉鏁般�佸洖鏀舵�讳汉鏁�
+                        Double subidAll = 0.0;
+                        Double fillCountAll = 0.0;
+                        for (Long templateId : dimensionTemplateIds) {
+                            subidAll += sendCountMap.getOrDefault(templateId, 0L);
+                            fillCountAll += fillPersonCountMap.getOrDefault(templateId, 0L);
                         }
 
                         // 杩欓噷鍏堣褰曚竴涓嬫瘡涓垎绫荤殑鎬讳汉鏁板拰濉姤浜烘暟
@@ -502,28 +528,36 @@
                 List<SvyLibTemplateScript> dimensionScripts = svyLibTemplateScripts.stream().filter(item -> item.getDimension() != null).collect(Collectors.toList());
                 Map<String, List<SvyLibTemplateScript>> groupByDimension = dimensionScripts.stream().collect(Collectors.groupingBy(SvyLibTemplateScript::getDimension));
                 if (groupByDimension != null && !groupByDimension.isEmpty()) {
-                    //3.1 涓�娆℃�ф妸鏈璇锋眰鍏ㄩ儴妯℃澘鐨勫彂閫侀噺銆佸~鎶ラ噺鏌ュ洖鏉ワ紙鍘熸潵鏄瘡涓ā鏉块棶棰樺悇鏌ヤ袱娆★級
+                    //3.1 涓�娆℃�ф妸鏈璇锋眰鍏ㄩ儴妯℃澘鐨勫彂閫侀噺銆佸洖鏀朵汉鏁版煡鍥炴潵锛堝師鏉ユ槸姣忎釜妯℃澘闂鍚勬煡涓ゆ锛�
                     SatisfactionStatQuery statQuery = buildSatisfactionStatQuery(patSatisfactionReqVO, "2",
                             dimensionScripts.stream().map(SvyLibTemplateScript::getSvyid).collect(Collectors.toList()));
                     Map<Long, Long> sendCountMap = mapSatisfactionSendCount(statQuery);
                     SatisfactionFillStat fillStat = querySatisfactionFillStat(statQuery);
+                    Map<Long, Long> fillPersonCountMap = mapSatisfactionFillPersonCount(statQuery);
 
                     for (String dimension : groupByDimension.keySet()) {
-                        //璁板綍鎬讳汉鏁�
-                        Double subidAll = 0.0;
-                        //璁板綍鎬荤殑濉姤浜烘暟
-                        Double fillCountAll = 0.0;
-                        //鑾峰彇璇ュ垎绫荤殑濉姤鎬绘暟閲�
+                        // 璇ョ淮搴︽秹鍙婄殑鍘婚噸妯℃澘锛氬彂閫佷汉鏁�/鍥炴敹浜烘暟閮芥寜妯℃澘缁熻锛屾寜棰樼洰绱姞浼氬彉鎴愰閲�
+                        Set<Long> dimensionTemplateIds = new LinkedHashSet<>();
+                        //鑾峰彇璇ュ垎绫荤殑濉姤鍒嗗�煎垎甯冿紙鍙敤浜庣畻骞冲潎鍒嗭級
                         List<ScoreCount> allFillCountList = new ArrayList<>();
 
                         List<SvyLibTemplateScript> svyLibTemplateScriptList = groupByDimension.get(dimension);
                         for (SvyLibTemplateScript svyLibTemplateScript : svyLibTemplateScriptList) {
-                            //閫氳繃妯℃澘id鍙栭棶棰樺彂閫佹�婚噺锛堝師鏉ユ槸鎶婂叏閮� sub_id 鏌ュ洖 Java 鍐嶅彇 size锛�
-                            subidAll += sendCountMap.getOrDefault(svyLibTemplateScript.getSvyid(), 0L);
-                            //鑾峰彇濉姤鏁伴噺锛堝師鏉ユ槸鎶婃槑缁嗚鍏ㄩ儴鏌ュ洖 Java 鍐嶅彇 size锛�
-                            List<ScoreCount> fillCount = fillStat.get(svyLibTemplateScript.getSvyid(), svyLibTemplateScript.getScriptContent());
+                            Long templateId = svyLibTemplateScript.getSvyid();
+                            if (templateId != null) {
+                                dimensionTemplateIds.add(templateId);
+                            }
+                            //鑾峰彇濉姤鍒嗗�煎垎甯冿紙鍙敤浜庡钩鍧囧垎锛�
+                            List<ScoreCount> fillCount = fillStat.get(templateId, svyLibTemplateScript.getScriptContent());
                             if (CollectionUtils.isNotEmpty(fillCount)) allFillCountList.addAll(fillCount);
-                            fillCountAll += countFillRows(fillCount);
+                        }
+
+                        //璁板綍鍙戦�佹�讳汉鏁般�佸洖鏀舵�讳汉鏁�
+                        Double subidAll = 0.0;
+                        Double fillCountAll = 0.0;
+                        for (Long templateId : dimensionTemplateIds) {
+                            subidAll += sendCountMap.getOrDefault(templateId, 0L);
+                            fillCountAll += fillPersonCountMap.getOrDefault(templateId, 0L);
                         }
 
 
@@ -644,6 +678,24 @@
     }
 
     /**
+     * 涓�娆℃煡鍑哄叏閮ㄦā鏉跨殑銆屽洖鏀朵汉鏁般�嶏紙鎸夋ā鏉垮幓閲嶏紝鍚屼竴涓汉绛斿閬撻鍙畻涓�浜猴級
+     *
+     * @return key=妯℃澘id锛寁alue=鍥炴敹浜烘暟
+     */
+    private Map<Long, Long> mapSatisfactionFillPersonCount(SatisfactionStatQuery statQuery) {
+        Map<Long, Long> fillPersonCountMap = new HashMap<>();
+        if (statQuery == null || CollectionUtils.isEmpty(statQuery.getLibTemplateIds())) return fillPersonCountMap;
+        List<Map<String, Object>> rows = serviceSubtaskDetailMapper.selectSatisfactionFillPersonCount(statQuery);
+        if (CollectionUtils.isEmpty(rows)) return fillPersonCountMap;
+        for (Map<String, Object> row : rows) {
+            Long templateId = toLong(row.get("libtemplateid"));
+            if (templateId == null) continue;
+            fillPersonCountMap.put(templateId, toLong(row.get("cnt"), 0L));
+        }
+        return fillPersonCountMap;
+    }
+
+    /**
      * 涓�娆℃煡鍑哄叏閮ㄦā鏉跨殑濉姤閲忥紙鎸� 妯℃澘+闂+鍒嗗�� 鍒嗙粍锛�
      */
     private SatisfactionFillStat querySatisfactionFillStat(SatisfactionStatQuery statQuery) {
@@ -662,18 +714,6 @@
             fillStat.add(templateId, questiontextValue == null ? null : String.valueOf(questiontextValue), scoreCount);
         }
         return fillStat;
-    }
-
-    /**
-     * 鍙栧~鎶ユ槑缁嗚鏁帮紙鍘� fillCount.size()锛�
-     */
-    private long countFillRows(List<ScoreCount> fillCount) {
-        if (CollectionUtils.isEmpty(fillCount)) return 0L;
-        long rows = 0L;
-        for (ScoreCount scoreCount : fillCount) {
-            rows += scoreCount.getCount();
-        }
-        return rows;
     }
 
     /**

--
Gitblit v1.9.3