From b25c3b5188e402695f3792ad7da53e452682cd80 Mon Sep 17 00:00:00 2001
From: liusheng <337615773@qq.com>
Date: 星期一, 12 十月 2026 19:43:07 +0800
Subject: [PATCH] 满意度统计BUG修改

---
 ruoyi-satisfaction/src/main/java/com/ruoyi/satisfaction/mapper/SatisfactionMapper.java                 |   19 ++++
 ruoyi-satisfaction/src/main/resources/mapper/satisfaction/SatisfactionScriptMapper.xml                 |   51 ++++++++----
 ruoyi-satisfaction/src/main/java/com/ruoyi/satisfaction/service/impl/PatSatisfactionServiceImpl.java   |   91 ++++++++++++++++++----
 ruoyi-satisfaction/src/main/java/com/ruoyi/satisfaction/domain/entity/PatSatisfactionDetailEntity.java |    8 ++
 ruoyi-satisfaction/src/main/resources/mapper/satisfaction/SatisfactionMapper.xml                       |   66 ++++++++++++++++
 ruoyi-admin/src/main/resources/application.yml                                                         |    2 
 6 files changed, 199 insertions(+), 38 deletions(-)

diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index 49041c9..4950217 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -75,7 +75,7 @@
     # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
     basename: i18n/messages
   profiles:
-    active: nhfy
+    active: sltd
 
   # 鏂囦欢涓婁紶
   servlet:
diff --git a/ruoyi-satisfaction/src/main/java/com/ruoyi/satisfaction/domain/entity/PatSatisfactionDetailEntity.java b/ruoyi-satisfaction/src/main/java/com/ruoyi/satisfaction/domain/entity/PatSatisfactionDetailEntity.java
index a15c845..f9f831e 100644
--- a/ruoyi-satisfaction/src/main/java/com/ruoyi/satisfaction/domain/entity/PatSatisfactionDetailEntity.java
+++ b/ruoyi-satisfaction/src/main/java/com/ruoyi/satisfaction/domain/entity/PatSatisfactionDetailEntity.java
@@ -67,6 +67,14 @@
     private Double answerRate;
 
     /**
+     * 缁村害锛坕vr_liba_template_script.dimension / svy_lib_template_script.dimension锛�
+     * <p>
+     * 渚涖�岀淮搴﹂鐩槑缁嗐�嶉〉闈㈠睍绀虹淮搴﹀垪浣跨敤锛涢潪缁村害鍙e緞鐨勬帴鍙d篃浼氬甫涓婅鍊笺��
+     */
+    @ApiModelProperty(value = "缁村害")
+    private String dimension;
+
+    /**
      * 鍚勯�夐」锛坢atchedtext锛夋暟閲忓強鍗犳瘮
      * key=matchedtext锛寁alue={count: 鏁伴噺, ratio: 鍗犳瘮}
      */
diff --git a/ruoyi-satisfaction/src/main/java/com/ruoyi/satisfaction/mapper/SatisfactionMapper.java b/ruoyi-satisfaction/src/main/java/com/ruoyi/satisfaction/mapper/SatisfactionMapper.java
index 44d3189..073c9ef 100644
--- a/ruoyi-satisfaction/src/main/java/com/ruoyi/satisfaction/mapper/SatisfactionMapper.java
+++ b/ruoyi-satisfaction/src/main/java/com/ruoyi/satisfaction/mapper/SatisfactionMapper.java
@@ -85,6 +85,25 @@
      */
     List<Map<String, Object>> selectSatisfactionFillPersonCount(SatisfactionStatQuery query);
 
+    /**
+     * 銆愭寜 妯℃澘 + 闂銆戠粺璁$瓟棰樹汉鏁帮紙{@code count(distinct ssd.sub_id)}锛夈��
+     * <p>
+     * <b>涓轰粈涔堝崟鐙姞杩欎竴鏉�</b>锛歿@code /statistics} 鐨勩�岀瓟棰樹汉鏁� / 鏈瓟棰樹汉鏁般�嶅繀椤讳笌
+     * 銆屽彂閫佷汉鏁般�嶏紙{@link #selectSatisfactionSendCount}锛屼篃鏄汉鏁帮級鍚屽彛寰勩��
+     * 鍘熷疄鐜拌鐢� {@link #selectSatisfactionFillStatByMatchedtext} 鐨� {@code count(*)}锛堟槑缁�<b>琛屾暟</b>锛夛紝
+     * 鑰屼竴鏉� {@code (sub_id, questiontext)} 鍙兘鏈夊琛屾槑缁嗭紙澶氶�夐」 / 閲嶅鏄庣粏锛夛紝
+     * 瀵艰嚧銆屾湭绛旈浜烘暟 = 鍙戦�佷汉鏁� 鈭� 鏄庣粏琛屾暟銆嶅嚭鐜拌礋鏁帮紙瀹炴祴 -120锛夈��
+     * <p>
+     * 鈿狅笍 骞冲潎鍒� / 鏈�楂樺垎 / 鏈�浣庡垎 / 鍚勯�夐」鍗犳瘮浠嶄娇鐢ㄦ槑缁嗚鏁帮紙閭d簺鍙e緞鏈潵灏辨寜琛岃锛夛紝鏈敼鍔ㄣ��
+     * <p>
+     * 闄よ仛鍚堥敭涓� {@code distinct} 澶栵紝from/where 涓� {@link #selectSatisfactionFillStatByMatchedtext}
+     * 瀹屽叏涓�鑷达紝淇濊瘉涓よ�呯粺璁$殑鏄悓涓�鎵规暟鎹��
+     *
+     * @param query 鑱氬悎鏌ヨ鏉′欢
+     * @return 姣忚鍚� libtemplateid銆乹uestiontext銆乧nt锛堜汉鏁帮級
+     */
+    List<Map<String, Object>> selectSatisfactionFillPersonCountByQuestion(SatisfactionStatQuery query);
+
     // ================================================================ 鐪佺珛鍚屽痉锛氳秼鍔夸笌缁村害
 
     /**
diff --git a/ruoyi-satisfaction/src/main/java/com/ruoyi/satisfaction/service/impl/PatSatisfactionServiceImpl.java b/ruoyi-satisfaction/src/main/java/com/ruoyi/satisfaction/service/impl/PatSatisfactionServiceImpl.java
index 5d1078a..fd18c80 100644
--- a/ruoyi-satisfaction/src/main/java/com/ruoyi/satisfaction/service/impl/PatSatisfactionServiceImpl.java
+++ b/ruoyi-satisfaction/src/main/java/com/ruoyi/satisfaction/service/impl/PatSatisfactionServiceImpl.java
@@ -216,7 +216,7 @@
             //3 涓�娆$粺璁″叏閮ㄩ棶棰樼殑鍙戦�侀噺/濉姤閲�/閫夐」鍒嗗�硷紙鍘熸潵鏄瘡涓棶棰樺悇鏌� 3 娆★級
             List<SatScriptRef> scriptRefs = new ArrayList<>();
             for (SatisfactionIvrScriptRow ivrLibaTemplateScript : ivrLibaTemplateScripts) {
-                scriptRefs.add(new SatScriptRef(ivrLibaTemplateScript.getTemplateid(), ivrLibaTemplateScript.getScriptid(), ivrLibaTemplateScript.getScriptContent()));
+                scriptRefs.add(new SatScriptRef(ivrLibaTemplateScript.getTemplateid(), ivrLibaTemplateScript.getScriptid(), ivrLibaTemplateScript.getScriptContent(), ivrLibaTemplateScript.getDimension()));
             }
             buildSatisfactionDetailEntities(patSatisfactionReqVO, "1", true, scriptRefs, patSatisfactionDetailEntities, personTotals);
         }
@@ -231,7 +231,7 @@
             List<SatScriptRef> scriptRefs = new ArrayList<>();
             for (SatisfactionSvyScriptRow svyLibTemplateScript : svyLibTemplateScripts) {
                 // 闂嵎鐨勯�夐」琛ㄦ寜 svy_lib_template_script 鐨勪富閿叧鑱�
-                scriptRefs.add(new SatScriptRef(svyLibTemplateScript.getSvyid(), svyLibTemplateScript.getId(), svyLibTemplateScript.getScriptContent()));
+                scriptRefs.add(new SatScriptRef(svyLibTemplateScript.getSvyid(), svyLibTemplateScript.getId(), svyLibTemplateScript.getScriptContent(), svyLibTemplateScript.getDimension()));
             }
             buildSatisfactionDetailEntities(patSatisfactionReqVO, "2", false, scriptRefs, patSatisfactionDetailEntities, personTotals);
         }
@@ -270,7 +270,7 @@
                 //3 涓�娆$粺璁″叏閮ㄩ棶棰樼殑鍙戦�侀噺/濉姤閲�/閫夐」鍒嗗�硷紙鍘熸潵鏄瘡涓棶棰樺悇鏌� 3 娆★級
                 List<SatScriptRef> scriptRefs = new ArrayList<>();
                 for (SatisfactionIvrScriptRow ivrLibaTemplateScript : ivrLibaTemplateScripts) {
-                    scriptRefs.add(new SatScriptRef(ivrLibaTemplateScript.getTemplateid(), ivrLibaTemplateScript.getScriptid(), ivrLibaTemplateScript.getScriptContent()));
+                    scriptRefs.add(new SatScriptRef(ivrLibaTemplateScript.getTemplateid(), ivrLibaTemplateScript.getScriptid(), ivrLibaTemplateScript.getScriptContent(), ivrLibaTemplateScript.getDimension()));
                 }
                 buildSatisfactionDetailEntities(patSatisfactionReqVO, "1", true, scriptRefs, patSatisfactionDetailEntities, personTotals);
             }
@@ -284,7 +284,7 @@
                 List<SatScriptRef> scriptRefs = new ArrayList<>();
                 for (SatisfactionSvyScriptRow svyLibTemplateScript : svyLibTemplateScripts) {
                     // 闂嵎鐨勯�夐」琛ㄦ寜 svy_lib_template_script 鐨勪富閿叧鑱�
-                    scriptRefs.add(new SatScriptRef(svyLibTemplateScript.getSvyid(), svyLibTemplateScript.getId(), svyLibTemplateScript.getScriptContent()));
+                    scriptRefs.add(new SatScriptRef(svyLibTemplateScript.getSvyid(), svyLibTemplateScript.getId(), svyLibTemplateScript.getScriptContent(), svyLibTemplateScript.getDimension()));
                 }
                 buildSatisfactionDetailEntities(patSatisfactionReqVO, "2", false, scriptRefs, patSatisfactionDetailEntities, personTotals);
             }
@@ -763,31 +763,66 @@
         SatisfactionStatQuery statQuery = buildSatisfactionStatQuery(reqVO, type, templateIds);
         Map<Long, Long> sendCountMap = mapSatisfactionSendCount(statQuery);
         SatisfactionFillStatByMatchedtext fillStat = querySatisfactionFillStatByMatchedtext(statQuery);
+        //绛旈銆愪汉鏁般�戯細鎸� 妯℃澘+闂 鐨� distinct sub_id锛堜笌銆屽彂閫佷汉鏁般�嶅悓鍙e緞锛�
+        Map<String, Long> answerPersonMap = mapSatisfactionFillPersonCountByQuestion(statQuery);
         Map<Long, List<String>> optionScores = loadTargetOptionScores(voice, scriptRefs);
 
         for (SatScriptRef scriptRef : scriptRefs) {
             Long templateId = scriptRef.getTemplateId();
             //鍙戦�佹�婚噺锛堝師鏉ユ槸鎶婂叏閮� sub_id 鏌ュ洖 Java 鍐嶅彇 size锛�
             long sendCount = templateId == null ? 0L : sendCountMap.getOrDefault(templateId, 0L);
-            //濉姤鏁伴噺锛堝師鏉ユ槸鎶婃槑缁嗚鍏ㄩ儴鏌ュ洖 Java 鍐嶇粺璁★級
+            //濉姤銆愯鏁般�戯細鐢ㄤ簬骞冲潎鍒� / 鏈�楂樺垎 / 鏈�浣庡垎 / 鍚勯�夐」鍗犳瘮锛堣繖浜涘彛寰勬湰鏉ュ氨鎸夋槑缁嗚璁★級
             List<MatchedtextCount> fillRows = fillStat.get(templateId, scriptRef.getScriptContent());
             long fillCount = countFillRowsByMatchedtext(fillRows);
+            //绛旈銆愪汉鏁般�戯細鐢ㄤ簬 绛旈浜烘暟 / 鏈瓟棰樹汉鏁� / 绛旈鐜�
+            long answerPersonCount = answerPersonMap.getOrDefault(
+                    statKey(templateId, scriptRef.getScriptContent()), 0L);
 
             PatSatisfactionDetailEntity detail = new PatSatisfactionDetailEntity();
             detail.setScriptContent(scriptRef.getScriptContent());
-            detail.setAnswerPerson((int) fillCount);
-            detail.setNoAnswerPerson(fillCount > 0L && sendCount > 0L ? (int) (sendCount - fillCount) : sendCount > 0L ? (int) sendCount : 0);
+            //缁村害锛氬師鏈煡璇㈤噷宸插彇鍒帮紝浣嗘瀯閫� SatScriptRef 鏃惰涓㈡帀锛屽鑷村墠绔�岀淮搴︺�嶅垪涓�鐩翠负绌�
+            detail.setDimension(scriptRef.getDimension());
+            // 鈿狅笍 浜烘暟鍙e緞淇锛氬師鏉ヨ繖閲岀敤鐨勬槸 fillCount锛堟槑缁嗚鏁帮級锛�
+            //    鑰屽彂閫佷汉鏁版槸 count(distinct id)锛堜汉鏁帮級锛屼袱鑰呯浉鍑忎細鍑虹幇璐熸暟锛堝疄娴� -120 = 15 鈭� 135锛夈��
+            //    涓�鏉� (sub_id, questiontext) 鍙兘鏈夊琛屾槑缁嗭紝鎵�浠ョ瓟棰樹汉鏁板繀椤诲彇 distinct sub_id銆�
+            detail.setAnswerPerson((int) answerPersonCount);
+            detail.setNoAnswerPerson(answerPersonCount > 0L && sendCount > 0L ? (int) (sendCount - answerPersonCount)
+                    : sendCount > 0L ? (int) sendCount : 0);
             detail.setAverageScore(String.valueOf(averageScoreByMatchedtext(fillRows)));
             List<String> scores = optionScores.get(scriptRef.getOptionScriptId());
             detail.setMaxScore(String.valueOf(maxScoreOf(scores)));
             detail.setMinScore(String.valueOf(minScoreOf(scores)));
-            detail.setAnswerRate(sendCount == 0L ? 0 : fillCount == 0L ? 0 : fillCount * 1.0 / sendCount);
+            detail.setAnswerRate(sendCount == 0L ? 0 : answerPersonCount == 0L ? 0 : answerPersonCount * 1.0 / sendCount);
             detail.setMatchedtextStats(buildMatchedtextStats(fillRows, fillCount));
             out.add(detail);
 
-            totals[0] += (int) fillCount;
+            totals[0] += (int) answerPersonCount;
             totals[1] += (int) sendCount;
         }
+    }
+
+    /**
+     * 涓�娆℃煡鍑恒�屽叏閮� 妯℃澘+闂銆嶇殑绛旈浜烘暟锛坽@code count(distinct ssd.sub_id)}锛夈��
+     * <p>
+     * key 鐢ㄤ笌 {@link #statKey(Long, String)} 鐩稿悓鐨勮鍒欐瀯閫狅紝淇濊瘉涓庤皟鐢ㄦ柟鐨勬煡鎵句竴鑷�
+     * 锛坽@code statKey} 宸插仛 trim + 灏忓啓锛岀瓑浠蜂簬 MySQL 鐨勫拷鐣ュぇ灏忓啓涓庡熬閮ㄧ┖鏍兼瘮杈冿級銆�
+     */
+    private Map<String, Long> mapSatisfactionFillPersonCountByQuestion(SatisfactionStatQuery statQuery) {
+        Map<String, Long> answerPersonMap = new HashMap<>();
+        if (statQuery == null || CollectionUtils.isEmpty(statQuery.getLibTemplateIds())) return answerPersonMap;
+        List<Map<String, Object>> rows = satisfactionMapper.selectSatisfactionFillPersonCountByQuestion(statQuery);
+        if (CollectionUtils.isEmpty(rows)) return answerPersonMap;
+        for (Map<String, Object> row : rows) {
+            Long templateId = toLong(row.get("libtemplateid"));
+            if (templateId == null) continue;
+            long cnt = toLong(row.get("cnt"), 0L);
+            if (cnt <= 0L) continue;
+            Object questiontext = row.get("questiontext");
+            answerPersonMap.merge(
+                    statKey(templateId, questiontext == null ? null : String.valueOf(questiontext)),
+                    cnt, Long::sum);
+        }
+        return answerPersonMap;
     }
 
     /**
@@ -914,7 +949,7 @@
     /**
      * 鑾峰彇骞冲潎鍒嗭紙鑱氬悎鐗堬細鍒嗗�间笌鏉℃暟锛�
      * <p>
-     * 鍙e緞涓� {@link #averageScore(List)} 涓�鑷达細鍒嗗瓙涓哄彲瑙f瀽鍒嗗�间箣鍜岋紝鍒嗘瘝涓烘槑缁嗚鏁帮紙鍚垎鍊间负绌虹殑琛岋級銆�
+     * 鍒嗗瓙涓哄彲瑙f瀽鍒嗗�间箣鍜岋紝鍒嗘瘝涓烘槑缁嗚鏁帮紙鍚垎鍊间负绌虹殑琛岋級銆�
      */
     private Double averageScoreByMatchedtext(List<MatchedtextCount> fillRows) {
         if (CollectionUtils.isEmpty(fillRows)) return 0.0;
@@ -932,7 +967,7 @@
     }
 
     /**
-     * 鑾峰彇鏈�楂樺垎锛堣仛鍚堢増锛屽彛寰勫悓 {@link #maxScore(List)}锛氱┖鍒楄〃杩斿洖 0.0锛�
+     * 鑾峰彇鏈�楂樺垎锛堣仛鍚堢増锛岀┖鍒楄〃杩斿洖 0.0锛�
      */
     private Double maxScoreOf(List<String> scores) {
         if (CollectionUtils.isEmpty(scores)) return 0.0;
@@ -941,7 +976,7 @@
     }
 
     /**
-     * 鑾峰彇鏈�浣庡垎锛堣仛鍚堢増锛屽彛寰勫悓 {@link #minScore(List)}锛氱┖鍒楄〃杩斿洖 0.0锛�
+     * 鑾峰彇鏈�浣庡垎锛堣仛鍚堢増锛屽彛寰勫悓 {绌哄垪琛ㄨ繑鍥� 0.0锛�
      */
     private Double minScoreOf(List<String> scores) {
         if (CollectionUtils.isEmpty(scores)) return 0.0;
@@ -950,17 +985,19 @@
     }
 
     /**
-     * 婊℃剰搴︾粺璁$敤鐨勯棶棰樺紩鐢細妯℃澘id銆侀�夐」琛ㄥ叧鑱旂殑闂id锛堝彲鑳戒负 null锛夈�侀棶棰樺唴瀹�
+     * 婊℃剰搴︾粺璁$敤鐨勯棶棰樺紩鐢細妯℃澘id銆侀�夐」琛ㄥ叧鑱旂殑闂id锛堝彲鑳戒负 null锛夈�侀棶棰樺唴瀹广�佺淮搴�
      */
     private static class SatScriptRef {
         private final Long templateId;
         private final Long optionScriptId;
         private final String scriptContent;
+        private final String dimension;
 
-        SatScriptRef(Long templateId, Long optionScriptId, String scriptContent) {
+        SatScriptRef(Long templateId, Long optionScriptId, String scriptContent, String dimension) {
             this.templateId = templateId;
             this.optionScriptId = optionScriptId;
             this.scriptContent = scriptContent;
+            this.dimension = dimension;
         }
 
         Long getTemplateId() {
@@ -973,6 +1010,10 @@
 
         String getScriptContent() {
             return scriptContent;
+        }
+
+        String getDimension() {
+            return dimension;
         }
     }
 
@@ -1038,19 +1079,33 @@
     // 鍘熷疄鐜扮洿鎺� new smartor 鐨勫疄浣撳綋鍏ュ弬锛涙ā鍧楀寲鍚庣粺涓�鐢� SatisfactionScriptQuery锛�
     // 杩欓噷鎶婁笁澶勬瀯閫犳敹鏁涗负甯姪鏂规硶锛屾潯浠朵笌鍘熸潵閫愬瓧瀵瑰簲銆�
 
-    /** 婊℃剰搴﹀垎绫绘煡璇紙orgid + type=myd锛� */
+    /**
+     * 婊℃剰搴﹀垎绫绘煡璇紙璇煶渚э級銆�
+     * <p>
+     * 鈿狅笍 <b>涓庡師鏂囦竴鑷达細鍙紶 orgid锛�<u>涓嶄紶 type</u></b>銆傚師瀹炵幇鏄�
+     * <pre>
+     * IvrLibaScriptAssort e = new IvrLibaScriptAssort();
+     * e.setOrgid(reqVO.getOrgid());      // 鈫� 鍙湁 orgid
+     * mapper.selectIvrLibaScriptAssortList(e);
+     * </pre>
+     * 鍒嗙被鐨勩�屾槸涓嶆槸婊℃剰搴�(myd)銆嶆槸鍦� <b>Java 渚�</b>鐢�
+     * {@code item.getType().contains("myd")} 杩囨护鐨勶紙瑙� {@link #statistics} /
+     * {@link #satisfactionGraph}锛夈��
+     * <p>
+     * 濡傛灉鍦ㄨ繖閲岄『鎵嬪姞涓� {@code type="myd"}锛孲QL 灏变細澶氬嚭涓�涓�
+     * {@code type like '%myd%'} 鏉′欢 鈥斺�� 鑰� MySQL 鐨� LIKE 榛樿<b>涓嶅尯鍒嗗ぇ灏忓啓</b>锛�
+     * 浼氭瘮 Java 鐨� {@code contains("myd")} 澶氬懡涓垎绫伙紝瀵艰嚧缁熻缁撴灉鍑虹幇宸紓銆�
+     */
     private SatisfactionScriptQuery ivrCategoryQuery(PatSatisfactionReqVO reqVO) {
         SatisfactionScriptQuery q = new SatisfactionScriptQuery();
         q.setOrgid(reqVO.getOrgid());
-        q.setType("myd");
         return q;
     }
 
-    /** 婊℃剰搴﹀垎绫绘煡璇紙闂嵎渚э紝鏉′欢鍚岃闊充晶锛� */
+    /** 婊℃剰搴﹀垎绫绘煡璇紙闂嵎渚э紝鍚屾牱鍙紶 orgid锛岃 {@link #ivrCategoryQuery}锛� */
     private SatisfactionScriptQuery svyCategoryQuery(PatSatisfactionReqVO reqVO) {
         SatisfactionScriptQuery q = new SatisfactionScriptQuery();
         q.setOrgid(reqVO.getOrgid());
-        q.setType("myd");
         return q;
     }
 
diff --git a/ruoyi-satisfaction/src/main/resources/mapper/satisfaction/SatisfactionMapper.xml b/ruoyi-satisfaction/src/main/resources/mapper/satisfaction/SatisfactionMapper.xml
index dcf5555..e17a7b9 100644
--- a/ruoyi-satisfaction/src/main/resources/mapper/satisfaction/SatisfactionMapper.xml
+++ b/ruoyi-satisfaction/src/main/resources/mapper/satisfaction/SatisfactionMapper.xml
@@ -801,6 +801,72 @@
         </if>
         group by ss.libtemplateid
     </select>
+
+    <!-- ================================================
+         銆屾寜 妯℃澘 + 闂銆嶇殑绛旈銆愪汉鏁般�戯紙distinct sub_id锛�
+
+         涓轰粈涔堥渶瑕佸畠锛�/statistics 鐨勩�岀瓟棰樹汉鏁� / 鏈瓟棰樹汉鏁般�嶅繀椤讳笌銆屽彂閫佷汉鏁般�嶅悓鍙e緞锛堥兘鏄�愪汉銆戯級銆�
+         鍘熷疄鐜版妸銆岀瓟棰樹汉鏁般�嶅彇鎴愪簡 selectSatisfactionFillStatByMatchedtext 鐨� count(*)锛堛�愭槑缁嗚鏁般�戯級锛�
+         鑰屽悓涓�鏉� (sub_id, questiontext) 鍙兘瀵瑰簲澶氳鏄庣粏锛堝閫夐」 / 閲嶅鏄庣粏锛夛紝
+         浜庢槸銆屾湭绛旈浜烘暟 = 鍙戦�佷汉鏁� 鈭� 鏄庣粏琛屾暟銆嶄細绠楁垚璐熸暟锛堝疄娴� -120 = 15 鈭� 135锛夈��
+         杩欓噷琛ヤ竴鏉℃寜闂鑱氬悎鐨� distinct 浜烘暟鏌ヨ锛屼笓渚涖�岀瓟棰樹汉鏁� / 鏈瓟棰樹汉鏁� / 绛旈鐜囥�嶄娇鐢紱
+         骞冲潎鍒� / 鏈�楂樺垎 / 鏈�浣庡垎 / 鍚勯�夐」鍗犳瘮浠嶆寜鏄庣粏琛屾暟缁熻锛堥偅浜涘彛寰勬湰鏉ュ氨鏄寜琛岃锛屾湭鏀瑰姩锛夈��
+         闄よ仛鍚堥敭涓� distinct 涔嬪锛宖rom/where 涓� selectSatisfactionFillStatByMatchedtext 瀹屽叏涓�鑷达紝
+         淇濊瘉涓よ�呯粺璁$殑鏄悓涓�鎵规暟鎹��
+         ================================================ -->
+    <select id="selectSatisfactionFillPersonCountByQuestion"
+            parameterType="com.ruoyi.satisfaction.domain.entity.SatisfactionStatQuery"
+            resultType="java.util.Map">
+        select ss.libtemplateid as libtemplateid,
+               ssd.questiontext as questiontext,
+               count(distinct ssd.sub_id) as cnt
+        from service_subtask_detail ssd
+        join service_subtask ss on ss.id = ssd.sub_id
+        where ssd.del_flag = 0
+        and ss.del_flag = 0
+        <if test="orgid != null and orgid != ''">
+            and ss.orgid = #{orgid}
+        </if>
+        <if test="campusid != null and campusid != ''">
+            and ss.campusid = #{campusid}
+        </if>
+        <if test="type != null and type != ''">and ss.type = #{type}</if>
+        <if test="startTime != null">
+            and ss.visit_time &gt;= #{startTime}
+        </if>
+        <if test="endTime != null">
+            and ss.visit_time &lt; date_add(#{endTime}, interval 1 day)
+        </if>
+        <if test="libTemplateIds != null and libTemplateIds.size() > 0">
+            and ss.libtemplateid IN
+            <foreach collection="libTemplateIds" item="libTemplateId" open="(" separator="," close=")">
+                #{libTemplateId}
+            </foreach>
+        </if>
+        <if test="(hospitaldistrictcodes != null and hospitaldistrictcodes.size() > 0) or (deptcodes != null and deptcodes.size() > 0)">
+            AND (
+            <if test="hospitaldistrictcodes != null and hospitaldistrictcodes.size() > 0">
+                ss.leavehospitaldistrictcode IN
+                <foreach collection="hospitaldistrictcodes" item="hospitaldistrictcode" open="("
+                         separator=","
+                         close=")">
+                    #{hospitaldistrictcode}
+                </foreach>
+            </if>
+            <if test="hospitaldistrictcodes != null and hospitaldistrictcodes.size() > 0 and deptcodes != null and deptcodes.size() > 0">
+                OR
+            </if>
+            <if test="deptcodes != null and deptcodes.size() > 0">
+                ss.deptcode IN
+                <foreach collection="deptcodes" item="deptcode" open="(" separator="," close=")">
+                    #{deptcode}
+                </foreach>
+            </if>
+            )
+        </if>
+        group by ss.libtemplateid, ssd.questiontext
+    </select>
+
     <!-- ================================================ 閲嶅鏄庣粏娓呯悊锛堟弧鎰忓害缁熻鍓嶇疆锛�
          鍘熷睘 ServiceSubtaskDetailMapper.xml锛屽彧鏈夋弧鎰忓害缁熻璋冪敤锛堝凡鏍稿疄锛夛紝鏁呬竴骞舵惉鍏ャ��
          娉ㄦ剰 deleteRepeatDetailByIds 鏄�愬啓鎿嶄綔銆戯細鎸� id 閫昏緫鍒犻櫎閲嶅鏄庣粏锛坉el_flag=1锛夈�� -->
diff --git a/ruoyi-satisfaction/src/main/resources/mapper/satisfaction/SatisfactionScriptMapper.xml b/ruoyi-satisfaction/src/main/resources/mapper/satisfaction/SatisfactionScriptMapper.xml
index f4fab02..aa1b34c 100644
--- a/ruoyi-satisfaction/src/main/resources/mapper/satisfaction/SatisfactionScriptMapper.xml
+++ b/ruoyi-satisfaction/src/main/resources/mapper/satisfaction/SatisfactionScriptMapper.xml
@@ -16,7 +16,7 @@
       鍙e緞瑕佺偣锛堝繀椤讳笌鍘熸枃閫愬瓧涓�鑷达級锛�
       - queryIvrScriptByAssort / querySvyScriptByCategory锛歩ds 涓虹┖鏃朵笉鎷� IN 鏉′欢锛�
       - selectIvrScriptByDimension锛歞imensionList 涓虹┖鏃舵嫾 `dimension IS NOT NULL`锛�
-      - selectSvyScriptByDimension锛歞imensionList 涓虹┖鏃躲�愪笉鎷笺�戣鏉′欢锛堜袱渚т笉涓�鑷存槸鍘熸枃琛屼负锛夛紱
+      - selectSvyScriptByDimension锛歞imensionList 涓虹┖鏃躲�愬悓鏍枫�戞嫾璇ユ潯浠讹紙鍘熸枃鍐欏湪 <where> 鏈�鍚庝竴琛岋紝鏋佹槗鐪嬫紡锛涙棭鏈熻縼绉绘浘璇垽涓轰笉鎷硷紝宸蹭慨姝o級锛�
       - selectIvr/SvyTargetOptionScores锛歴criptIds 涓� null 鏃朵笉鎷艰繃婊わ紝绛変簬鍙栧叏閮ㄥ垎鍊笺��
     -->
 
@@ -45,7 +45,11 @@
     <!-- ================================================ 婊℃剰搴﹀垎绫伙紙闂嵎渚э級
          鍘燂細SvyLibScriptCategoryMapper.selectSvyLibScriptCategoryList
              锛堣 statement 瀹為檯瀹氫箟鍦� SvyLibTopicCategoryMapper.xml锛宯amespace 涓庢枃浠跺悕涓嶄竴鑷达級
-         娉ㄦ剰锛氶棶鍗蜂晶鍘熸枃灏辨槸鐩存帴鍙栥�愬叏閮ㄨ銆戯紙涓嶆嫾鏍戙�佷笉绛涢《灞傦級锛屼笌璇煶渚т笉鍚屻�� -->
+         娉ㄦ剰锛氶棶鍗蜂晶鍘熸枃灏辨槸鐩存帴鍙栥�愬叏閮ㄨ銆戯紙涓嶆嫾鏍戙�佷笉绛涢《灞傦級锛屼笌璇煶渚т笉鍚屻��
+         鈿狅笍 orgid 鐨勬潯浠朵笌鍘熸枃閫愬瓧涓�鑷达細鍘熸枃闂嵎渚ф槸 `<if test="orgid != null">`锛�**娌℃湁** != ''锛夛紝
+            璇煶渚ф墠鏄� `orgid != null and orgid != ''`銆備袱渚т笉涓�鑷存槸鍘熸枃琛屼负锛屽繀椤讳繚鐣欙細
+            鑻ョ粰闂嵎渚т篃鍔犱笂 `!= ''`锛屽綋鍏ュ弬 orgid 涓虹┖涓叉椂锛屽師瀹炵幇鎸� `orgid = ''` 鏌ワ紙鏃犳暟鎹級锛�
+            鍔犱簡 != '' 鍒欏彉鎴愪笉甯� orgid 鏉′欢锛堣繑鍥炲叏閮ㄦ満鏋勬暟鎹級鈥斺�� 缁撴灉浼氬彉銆� -->
     <select id="selectSvyCategoryList"
             resultType="com.ruoyi.satisfaction.domain.row.SatisfactionCategoryRow">
         select id,
@@ -57,7 +61,7 @@
         <if test="q.type != null and q.type != ''">
             and type like concat('%', #{q.type}, '%')
         </if>
-        <if test="q.orgid != null and q.orgid != ''">
+        <if test="q.orgid != null">
             and orgid = #{q.orgid}
         </if>
         order by seqno asc
@@ -75,11 +79,11 @@
         select id,
                templateid,
                scriptid,
-               script_content,
-               script_assortname,
-               script_assortid,
-               script_topic,
-               script_type,
+               script_content as scriptContent,
+               script_assortname as scriptAssortname,
+               script_assortid as scriptAssortid,
+               script_topic as scriptTopic,
+               script_type as scriptType,
                dimension
         from ivr_liba_template_script
         where del_flag = 0
@@ -102,11 +106,11 @@
             resultType="com.ruoyi.satisfaction.domain.row.SatisfactionSvyScriptRow">
         select id,
                svyid,
-               script_content,
+               script_content as scriptContent,
                categoryName,
                categoryid,
-               script_topic,
-               script_type,
+               script_topic as scriptTopic,
+               script_type as scriptType,
                dimension
         from svy_lib_template_script
         where del_flag = 0
@@ -120,13 +124,13 @@
 
     <!-- ================================================ 鎸夌淮搴﹀彇闂锛堣闊充晶锛�
          鍘燂細IvrLibaTemplateScriptMapper.selectILTSBydimension
-         鍙e緞瑕佺偣锛歞imensionList 涓虹┖鏃舵嫾 `dimension IS NOT NULL`锛堥棶鍗蜂晶涓嶆嫾锛屼袱渚т笉鍚屾槸鍘熸枃琛屼负锛� -->
+         鍙e緞瑕佺偣锛歞imensionList 涓虹┖鏃舵嫾 `dimension IS NOT NULL`锛堥棶鍗蜂晶鍘熸枃涔熸湁锛岃 selectSvyScriptByDimension锛� -->
     <select id="selectIvrScriptByDimension"
             resultType="com.ruoyi.satisfaction.domain.row.SatisfactionIvrScriptRow">
         select templateid,
                scriptid,
-               script_content,
-               script_assortname,
+               script_content as scriptContent,
+               script_assortname as scriptAssortname,
                dimension
         from ivr_liba_template_script
         <where>
@@ -145,13 +149,19 @@
 
     <!-- ================================================ 鎸夌淮搴﹀彇闂锛堥棶鍗蜂晶锛�
          鍘燂細SvyLibTemplateScriptMapper.selectSLTScriptListBydimension
-         鍙e緞瑕佺偣锛歞imensionList 涓虹┖鏃躲�愪笉鎷笺�慸imension IS NOT NULL锛堢瓑浜庡叏琛� del_flag=0锛夛紱
-                   鑱氬悎鐢ㄧ殑妯℃澘 id 涓庨�夐」鍏宠仈 id 閮芥槸 svyid -->
+         鈿狅笍 涓や晶鍏跺疄銆愰兘瑕併�戞嫾 dimension IS NOT NULL锛�
+            - 璇煶渚э紙selectIvrScriptByDimension锛夎鏉′欢绱ц窡鍦� dimensionList 鍒嗘敮涔嬪悗锛�
+            - 闂嵎渚у師鏂囨妸瀹冨啓鍦� <where> 鐨�**鏈�鍚庝竴琛�**锛堝湪 duty/report/circulation 閭d簺
+              婊℃剰搴︾敤涓嶅埌鐨勬潯浠朵箣鍚庯級锛屽鏄撶湅婕� 鈥斺�� 鏃╂湡杩佺Щ鏃舵浘璇垽涓�"闂嵎渚т笉鎷�"锛屽凡淇銆�
+         鈿狅笍 蹇呴』鍚屾椂鍙� id 涓� svyid 涓や釜銆愪笉鍚屻�戠殑鍒楋紙鍘熸枃鐨� <include> 鐗囨灏辨槸杩欐牱锛夛細
+            鑱氬悎缁熻锛堝彂閫侀噺/濉姤閲忥級鎸� svyid 鍒嗙粍锛岃�屽彇銆岄�夐」鍒嗗�笺�嶆椂鐢ㄧ殑鏄� id锛堜富閿級锛�
+            瀵瑰簲 svy_lib_template_targetoption.scriptid銆傛棭鏈熻縼绉绘椂鏇捐鍐欐垚 `svyid as id`锛�
+            瀵艰嚧閫夐」鍒嗗�煎尮閰嶄笉涓� -> 鏈�楂樺垎/鏈�浣庡垎鎭掍负 0.0銆� -->
     <select id="selectSvyScriptByDimension"
             resultType="com.ruoyi.satisfaction.domain.row.SatisfactionSvyScriptRow">
-        select svyid,
-               svyid as id,
-               script_content,
+        select id,
+               svyid,
+               script_content as scriptContent,
                categoryName,
                dimension
         from svy_lib_template_script
@@ -163,6 +173,9 @@
                     #{dimension}
                 </foreach>
             </if>
+            <if test="q.dimensionList == null or q.dimensionList.size() == 0">
+                and dimension IS NOT NULL
+            </if>
         </where>
     </select>
 

--
Gitblit v1.9.3