From c24d16a37523a49080392610357872ce580cbc38 Mon Sep 17 00:00:00 2001
From: liusheng <337615773@qq.com>
Date: 星期一, 26 十月 2026 14:03:33 +0800
Subject: [PATCH] 代码提交

---
 ruoyi-task/src/main/java/com/ruoyi/task/service/impl/ServiceSubtaskServiceImpl.java |  532 ++++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 367 insertions(+), 165 deletions(-)

diff --git a/ruoyi-task/src/main/java/com/ruoyi/task/service/impl/ServiceSubtaskServiceImpl.java b/ruoyi-task/src/main/java/com/ruoyi/task/service/impl/ServiceSubtaskServiceImpl.java
index 18d40e8..bad652a 100644
--- a/ruoyi-task/src/main/java/com/ruoyi/task/service/impl/ServiceSubtaskServiceImpl.java
+++ b/ruoyi-task/src/main/java/com/ruoyi/task/service/impl/ServiceSubtaskServiceImpl.java
@@ -383,8 +383,8 @@
                 patTaskRelevance.setDiagname(serviceSubtask1.getLeavediagname());
                 patTaskRelevance.setPatid(serviceSubtask1.getPatid());
                 patTaskRelevance.setSendStatus(serviceSubtask1.getSendstate());
-                patTaskRelevance.setDeptcode(serviceSubtask1.getDeptcode());
-                patTaskRelevance.setDeptName(serviceSubtask1.getDeptname());
+                patTaskRelevance.setDeptcode(serviceSubtask1.getLeaveldeptcode());
+                patTaskRelevance.setDeptName(serviceSubtask1.getLeaveldeptname());
                 patTaskRelevance.setLeavehospitaldistrictcode(serviceSubtask1.getLeavehospitaldistrictcode());
                 patTaskRelevance.setLeavehospitaldistrictname(serviceSubtask1.getLeavehospitaldistrictname());
                 patTaskRelevance.setInhosptime(serviceSubtask1.getInhosptime());
@@ -404,8 +404,8 @@
                 patTaskRelevance.setTelcode(serviceSubtask1.getPhone());
                 patTaskRelevance.setFinishtime(serviceSubtask1.getFinishtime());
                 patTaskRelevance.setAddr(serviceSubtask1.getAddr());
-                patTaskRelevance.setDeptName(serviceSubtask1.getDeptname());
-                patTaskRelevance.setDeptcode(serviceSubtask1.getDeptcode());
+                patTaskRelevance.setDeptName(serviceSubtask1.getLeaveldeptname());
+                patTaskRelevance.setDeptcode(serviceSubtask1.getLeaveldeptcode());
                 patTaskRelevance.setBedNo(serviceSubtask1.getBedNo());
                 patTaskRelevance.setDiagname(serviceSubtask1.getLeavediagname());
                 patTaskRelevance.setPatid(serviceSubtask1.getPatid());
@@ -469,6 +469,12 @@
         List<ServiceSubtask> selectServiceSubtaskList = getServiceSubtasks(serviceSubtaskEntity);
 
         List<ServiceSubtaskRes> serviceSubtaskResList = new ArrayList<>();
+        // 鍚屼竴娆¤姹傦紙鍒楄〃鍒嗛〉 / 鍏ㄩ噺瀵煎嚭锛夐噷锛宨nhospid 涓� patid 楂樺害閲嶅
+        // 锛堝啀娆¢殢璁裤�佸悓涓�鎮h�呭浠诲姟閮戒細鎸囧悜鍚屼竴鏉′綇闄㈣褰�/鍚屼竴浠芥。妗堬級銆�
+        // 鍘熸潵姣忚閮借 2 娆″崟鏉℃煡璇紝瀵煎嚭鍑犲崈琛屽氨鏄嚑鍗兠�2 娆″線杩旓紱杩欓噷鎸� id 鍋氳繘绋嬪唴缂撳瓨锛�
+        // 鎶娿�屾瘡琛� 2 娆°�嶅帇鎴愩�屾瘡涓笉鍚� id 1 娆°�嶏紝鍙栨暟璇箟涓嶅彉銆�
+        Map<Long, PatMedInhosp> inhospCache = new HashMap<>();
+        Map<Long, PatArchive> archiveCache = new HashMap<>();
         for (ServiceSubtask serviceSubtask : selectServiceSubtaskList) {
             ServiceSubtaskRes serviceSubtaskRes = DtoConversionUtils.sourceToTarget(serviceSubtask, ServiceSubtaskRes.class);
             if (ObjectUtils.isNotEmpty(serviceSubtask.getContinueContent())) {
@@ -486,9 +492,9 @@
                     serviceSubtaskRes.setCurrentPreachform(serviceSubtask.getPreachform().split(",")[0]);
                 }
             }
-            PatMedInhosp inhosp = inhospVisitFacade.selectPatMedInhospByInhospid(serviceSubtask.getInhospid());
+            PatMedInhosp inhosp = loadInhospCached(inhospCache, serviceSubtask.getInhospid());
             if (ObjectUtils.isNotEmpty(inhosp)) {
-                PatArchive patArchive = taskArchivePort.findByPatid(inhosp.getPatid());
+                PatArchive patArchive = loadArchiveCached(archiveCache, inhosp.getPatid());
                 if (ObjectUtils.isNotEmpty(patArchive)) {
                     Map<String, String> stringStringMap = calculateAge(patArchive.getBirthdate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(), LocalDate.now());
                     serviceSubtaskRes.setAge(StringUtils.isNotEmpty(stringStringMap.get("age")) ? Long.valueOf(stringStringMap.get("age")) : null);
@@ -502,6 +508,36 @@
             serviceSubtaskResList.add(serviceSubtaskRes);
         }
         return serviceSubtaskResList;
+    }
+
+    /**
+     * 鎸� inhospid 鍙栦綇闄㈣褰曪紙甯﹁繘绋嬪唴缂撳瓨锛夈��
+     * <p>
+     * 鍙槸鎶娿�屽悓涓�娆¤姹傚唴鍚屼竴涓� id 鍙煡涓�娆°�嶈繖浠朵簨鏀跺彛锛�<b>涓嶆敼鍙樺彇鏁拌涔�</b>锛�
+     * 鏌ヤ笉鍒帮紙null锛変篃浼氱紦瀛橈紝閬垮厤鍚屼竴鎵规暟鎹噷瀵逛笉瀛樺湪鐨� id 鍙嶅鎵撳簱銆�
+     * 缂撳瓨鐢熷懡鍛ㄦ湡 = 鍗曟 {@code patItem} 璋冪敤锛屼笉璺ㄨ姹傘�佷笉鍏变韩銆�
+     */
+    private PatMedInhosp loadInhospCached(Map<Long, PatMedInhosp> cache, Long inhospid) {
+        if (inhospid == null) {
+            return null;
+        }
+        if (!cache.containsKey(inhospid)) {
+            cache.put(inhospid, inhospVisitFacade.selectPatMedInhospByInhospid(inhospid));
+        }
+        return cache.get(inhospid);
+    }
+
+    /**
+     * 鎸� patid 鍙栨偅鑰呮。妗堬紙甯﹁繘绋嬪唴缂撳瓨锛夛紝璇箟鍚� {@link #loadInhospCached}銆�
+     */
+    private PatArchive loadArchiveCached(Map<Long, PatArchive> cache, Long patid) {
+        if (patid == null) {
+            return null;
+        }
+        if (!cache.containsKey(patid)) {
+            cache.put(patid, taskArchivePort.findByPatid(patid));
+        }
+        return cache.get(patid);
     }
 
     public List<ServiceSubtask> getServiceSubtasks(ServiceSubtaskEntity serviceSubtaskEntity) {
@@ -524,8 +560,63 @@
                 }
             }
         }
-        List<ServiceSubtask> selectServiceSubtaskList = this.selectServiceSubtaskList(serviceSubtaskEntity);
-        return selectServiceSubtaskList;
+        // 鍒嗛〉璇锋眰璧般�屼袱闃舵銆嶏細鍏堝彧鍙栧綋椤� id锛屽啀鎸� id 鍥炶〃銆�
+        // 鍒楄〃 select 绾� 100 鍒楋紝娣辩炕椤垫椂琚� offset 璺宠繃鐨勬瘡涓�琛屽師鏈兘瑕佸洖琛ㄨ鏁磋锛�
+        // 鍙彇 id 鐨勬煡璇㈣兘璧拌鐩栫储寮曞苟鎻愬墠鎴柇锛屼唬浠峰皬寰楀銆�
+        if (serviceSubtaskEntity.getPageNum() != null && serviceSubtaskEntity.getPageSize() != null) {
+            return selectServiceSubtaskPage(serviceSubtaskEntity);
+        }
+        return this.selectServiceSubtaskList(serviceSubtaskEntity);
+    }
+
+    /**
+     * 涓ら樁娈靛垎椤碉細鈶� 鍙煡 id锛堣鐩栫储寮� + limit offset锛夆憽 鎸� id 鍥炶〃鍙栨暣琛屻��
+     * <p>
+     * 绗簩闃舵澶嶇敤 {@code selectServiceSubtaskList} 鐨� subIdList 鏉′欢鍥炶〃锛�
+     * 蹇呴』鎶� pageNum/pageSize 鎽樻帀 鈥斺�� 鍚﹀垯浼氬湪銆屽綋椤� id 闆嗗悎銆嶄笂鍐嶇炕涓�娆¢〉銆�
+     * <p>
+     * 缁熻缂撳瓨锛圕ontroller 鐨� {@code getPatItemCountWithCache}锛夌敤 ReflectUtils 姣斿鏁翠釜
+     * entity 浣滀负缂撳瓨鍛戒腑鏉′欢锛寋@code subIdList} 鍙備笌姣斿锛屾墍浠ョ敤瀹屽繀椤诲師鏍疯繕鍘燂紝
+     * 鍚﹀垯缂撳瓨姘歌繙涓嶅懡涓紝姣忔璇锋眰閮借閲嶇畻涓�娆¤仛鍚堛��
+     */
+    private List<ServiceSubtask> selectServiceSubtaskPage(ServiceSubtaskEntity serviceSubtaskEntity) {
+        List<Long> pageIds = serviceSubtaskMapper.selectServiceSubtaskIdsPage(serviceSubtaskEntity);
+        if (CollectionUtils.isEmpty(pageIds)) {
+            return new ArrayList<>();
+        }
+        Integer pageNum = serviceSubtaskEntity.getPageNum();
+        Integer pageSize = serviceSubtaskEntity.getPageSize();
+        List<Long> originSubIdList = serviceSubtaskEntity.getSubIdList();
+        serviceSubtaskEntity.setPageNum(null);
+        serviceSubtaskEntity.setPageSize(null);
+        serviceSubtaskEntity.setSubIdList(pageIds);
+        List<ServiceSubtask> rows;
+        try {
+            rows = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskEntity);
+        } finally {
+            serviceSubtaskEntity.setPageNum(pageNum);
+            serviceSubtaskEntity.setPageSize(pageSize);
+            serviceSubtaskEntity.setSubIdList(originSubIdList);
+        }
+        if (CollectionUtils.isEmpty(rows)) {
+            return new ArrayList<>();
+        }
+        // 浠ョ涓�闃舵鐨� id 椤哄簭涓哄噯閲嶆帓锛氱浜岄樁娈电殑 order by 鍙繚璇併�屽悓涓�椤靛唴銆嶆湁搴忥紝
+        // 閬囧埌鎺掑簭瀛楁鍊肩浉鍚岀殑琛屾椂鐩稿椤哄簭涓嶄竴瀹氫笌绗竴闃舵涓�鑷淬��
+        Map<Long, ServiceSubtask> byId = new HashMap<>(Math.max(16, rows.size() * 2));
+        for (ServiceSubtask row : rows) {
+            if (row.getId() != null) {
+                byId.put(row.getId(), row);
+            }
+        }
+        List<ServiceSubtask> ordered = new ArrayList<>(pageIds.size());
+        for (Long id : pageIds) {
+            ServiceSubtask row = byId.get(id);
+            if (row != null) {
+                ordered.add(row);
+            }
+        }
+        return ordered;
     }
 
     @Override
@@ -1164,8 +1255,8 @@
                     serviceSubtask.setInhospid(patTaskRelevance.getHospid());
                     //鏂板缓瀹屾垚灏辨槸寰呭彂閫佺姸鎬�
                     serviceSubtask.setSendstate(2L);
-                    serviceSubtask.setDeptcode(StringUtils.isNotEmpty(patTaskRelevance.getDeptcode()) ? patTaskRelevance.getDeptcode() : serviceTaskVO.getDeptcode());
-                    serviceSubtask.setDeptname(StringUtils.isNotEmpty(patTaskRelevance.getDeptName()) ? patTaskRelevance.getDeptName() : serviceTaskVO.getDeptname());
+                    serviceSubtask.setLeaveldeptcode(StringUtils.isNotEmpty(patTaskRelevance.getDeptcode()) ? patTaskRelevance.getDeptcode() : serviceTaskVO.getDeptcode());
+                    serviceSubtask.setLeaveldeptname(StringUtils.isNotEmpty(patTaskRelevance.getDeptName()) ? patTaskRelevance.getDeptName() : serviceTaskVO.getDeptname());
                     serviceSubtask.setLeavehospitaldistrictcode(patTaskRelevance.getLeavehospitaldistrictcode());
                     serviceSubtask.setLeavehospitaldistrictname(patTaskRelevance.getLeavehospitaldistrictname());
                     serviceSubtask.setType(serviceTaskVO.getType());
@@ -1530,10 +1621,10 @@
                     serviceSubtask.setAddr(patTaskRelevance.getAddr());
                     serviceSubtask.setPatid(patTaskRelevance.getPatid());
                     serviceSubtask.setOpenid(patTaskRelevance.getOpenid());
-                    serviceSubtask.setDeptcode(patTaskRelevance.getDeptcode());
+                    serviceSubtask.setLeaveldeptcode(patTaskRelevance.getDeptcode());
                     serviceSubtask.setLeavehospitaldistrictname(patTaskRelevance.getLeavehospitaldistrictname());
                     serviceSubtask.setLeavehospitaldistrictcode(patTaskRelevance.getLeavehospitaldistrictcode());
-                    serviceSubtask.setDeptname(patTaskRelevance.getDeptName());
+                    serviceSubtask.setLeaveldeptname(patTaskRelevance.getDeptName());
                     serviceSubtask.setType(serviceTaskVO.getType());
                     serviceSubtask.setCreateTime(DateUtils.getNowDate());
                     serviceSubtask.setDrname(patTaskRelevance.getDrname());
@@ -1787,7 +1878,7 @@
                 collect = rawData.stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getManagementDoctorCode()).orElse("Unknown")));
                 break;
             case "deptcode":
-                collect = rawData.stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDeptcode()).orElse("Unknown")));
+                collect = rawData.stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getLeaveldeptcode()).orElse("Unknown")));
                 break;
             case "leavehospitaldistrictcode":
                 collect = rawData.stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getLeavehospitaldistrictcode()).orElse("Unknown")));
@@ -1852,6 +1943,21 @@
      * @return
      */
     public Map<String, Map<String, Object>> getSsRateForSfStatistics(ServiceSubtaskCountReq serviceSubtaskCountReq, Map<String, List<ServiceSubtask>> collect) {
+        if (ObjectUtils.isEmpty(serviceSubtaskCountReq) || ObjectUtils.isEmpty(collect)) {
+            return null;
+        }
+        return getSsRateForSfStatistics(serviceSubtaskCountReq, new ArrayList<>(collect.keySet()));
+    }
+
+    /**
+     * 闅忚缁熻-鍙婃椂鐜囩粺璁★紙鍒嗙粍閿洿鎺ヤ紶鍊肩殑閲嶈浇锛�
+     * <p>
+     * 缁熻涓嬫帹鍒� SQL 鐨� {@code getSfStatisticsScript} 涓嶅啀鎶婃槑缁嗚鎹炲洖鍐呭瓨锛屾嬁涓嶅埌
+     * {@code Map<鍒嗙粍, List<鏄庣粏>>}锛屽洜姝ょ洿鎺ヤ紶鍒嗙粍閿泦鍚堬紱鏌ヨ璇彞涓庡師鏉ュ畬鍏ㄥ悓涓�涓��
+     *
+     * @param groupKeyList 鍒嗙粍閿泦鍚堬紙drcode / leaveldeptcode / leavehospitaldistrictcode 鐨勫疄闄呭彇鍊硷級
+     */
+    public Map<String, Map<String, Object>> getSsRateForSfStatistics(ServiceSubtaskCountReq serviceSubtaskCountReq, List<String> groupKeyList) {
         if (ObjectUtils.isEmpty(serviceSubtaskCountReq)) {
             return null;
         }
@@ -1859,7 +1965,6 @@
         if (StringUtils.isEmpty(groupKey)) {
             return null;
         }
-        List<String> groupKeyList = new ArrayList<>(collect.keySet());
         if (ObjectUtils.isEmpty(groupKeyList)) {
             return null;
         }
@@ -1878,11 +1983,21 @@
         ssRate.setGroupKey(groupKey);
         ssRate.setGroupKeyList(groupKeyList);
         ssRate.setRateDay(serviceSubtaskCountReq.getRateDay());
-        Map<String, Map<String, Object>> jsRates = new HashMap<>();
-        if (!collect.isEmpty()) {
-            jsRates = serviceSubtaskMapper.selectTimelyRateBatch(ssRate);
-        }
-        return jsRates;
+        return serviceSubtaskMapper.selectTimelyRateBatch(ssRate);
+    }
+
+    /**
+     * 绌哄�煎厹搴曪細SUM(CASE ...) 鐞嗚涓婁笉浼氭槸 null锛岃繖閲屽彧鍋氶槻寰★紝閬垮厤鎷嗙 NPE銆�
+     */
+    private long nvlLong(Long value) {
+        return value == null ? 0L : value;
+    }
+
+    /**
+     * 鎶婃暟鎹簱鑱氬悎鍊硷紙BigDecimal / Long / Integer 绛夛級杞垚 int銆�
+     */
+    private int toIntValue(Object value) {
+        return value instanceof Number ? ((Number) value).intValue() : 0;
     }
 
     public List<ServiceSubtaskStatistic> getSfStatisticsExport(ServiceSubtaskCountReq serviceSubtaskCountReq) {
@@ -1930,7 +2045,7 @@
             if (serviceSubtaskCountReq.getDrcode() != null && !serviceSubtaskCountReq.getDrcode().isEmpty()) {
                 collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDrname()).orElse("Unknown")));
             } else {
-                collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDeptname()).orElse("Unknown")));
+                collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getLeaveldeptname()).orElse("Unknown")));
             }
         }
         List<ServiceSubtaskCount> joySubCount = serviceSubtaskMapper.getSfStatisticsJoy(serviceSubtaskCountReq);
@@ -1951,7 +2066,7 @@
                 if (CollectionUtils.isNotEmpty(serviceSubtaskCountReq.getLeavehospitaldistrictcodes())) {
                     ss.setLeavehospitaldistrictcode(serviceSubtaskList.get(0).getLeavehospitaldistrictcode());
                 } else if (CollectionUtils.isNotEmpty(serviceSubtaskCountReq.getDeptcodes())) {
-                    ss.setDeptcode(serviceSubtaskList.get(0).getDeptcode());
+                    ss.setLeaveldeptcode(serviceSubtaskList.get(0).getLeaveldeptcode());
                 }
             }
 
@@ -2000,8 +2115,8 @@
         } else {
             //鏍煎紡鍖栦负涓や綅灏忔暟鐨勭櫨鍒嗘瘮
             DecimalFormat percentFormat = new DecimalFormat("##.##%");
-            serviceSubtaskStatistic.setDeptname(serviceSubtaskList.get(0).getDeptname());
-            serviceSubtaskStatistic.setDeptcode(serviceSubtaskList.get(0).getDeptcode());
+            serviceSubtaskStatistic.setDeptname(serviceSubtaskList.get(0).getLeaveldeptname());
+            serviceSubtaskStatistic.setDeptcode(serviceSubtaskList.get(0).getLeaveldeptcode());
             serviceSubtaskStatistic.setLeavehospitaldistrictname(serviceSubtaskList.get(0).getLeavehospitaldistrictname());
             serviceSubtaskStatistic.setLeavehospitaldistrictcode(serviceSubtaskList.get(0).getLeavehospitaldistrictcode());
             serviceSubtaskStatistic.setDrcode(serviceSubtaskList.get(0).getDrcode());
@@ -2292,8 +2407,8 @@
         ServiceSubtaskStatistic serviceSubtaskStatistic = new ServiceSubtaskStatistic();
         //鏍煎紡鍖栦负涓や綅灏忔暟鐨勭櫨鍒嗘瘮
         DecimalFormat percentFormat = new DecimalFormat("##.##%");
-        serviceSubtaskStatistic.setDeptname(serviceSubtaskList.get(0).getDeptname());
-        serviceSubtaskStatistic.setDeptcode(serviceSubtaskList.get(0).getDeptcode());
+        serviceSubtaskStatistic.setDeptname(serviceSubtaskList.get(0).getLeaveldeptname());
+        serviceSubtaskStatistic.setDeptcode(serviceSubtaskList.get(0).getLeaveldeptcode());
         serviceSubtaskStatistic.setLeavehospitaldistrictname(serviceSubtaskList.get(0).getLeavehospitaldistrictname());
         serviceSubtaskStatistic.setLeavehospitaldistrictcode(serviceSubtaskList.get(0).getLeavehospitaldistrictcode());
         serviceSubtaskStatistic.setDrcode(serviceSubtaskList.get(0).getDrcode());
@@ -2462,8 +2577,8 @@
         ServiceSubtaskStatistic serviceSubtaskStatistic = new ServiceSubtaskStatistic();
         //鏍煎紡鍖栦负涓や綅灏忔暟鐨勭櫨鍒嗘瘮
         DecimalFormat percentFormat = new DecimalFormat("##.##%");
-        serviceSubtaskStatistic.setDeptname(serviceSubtaskList.get(0).getDeptname());
-        serviceSubtaskStatistic.setDeptcode(serviceSubtaskList.get(0).getDeptcode());
+        serviceSubtaskStatistic.setDeptname(serviceSubtaskList.get(0).getLeaveldeptname());
+        serviceSubtaskStatistic.setDeptcode(serviceSubtaskList.get(0).getLeaveldeptcode());
         serviceSubtaskStatistic.setLeavehospitaldistrictname(serviceSubtaskList.get(0).getLeavehospitaldistrictname());
         serviceSubtaskStatistic.setLeavehospitaldistrictcode(serviceSubtaskList.get(0).getLeavehospitaldistrictcode());
         serviceSubtaskStatistic.setDrcode(serviceSubtaskList.get(0).getDrcode());
@@ -2624,8 +2739,8 @@
         ServiceSubtaskStatistic serviceSubtaskStatistic = new ServiceSubtaskStatistic();
         //鏍煎紡鍖栦负涓や綅灏忔暟鐨勭櫨鍒嗘瘮
         DecimalFormat percentFormat = new DecimalFormat("##.##%");
-        serviceSubtaskStatistic.setDeptname(serviceSubtaskList.get(0).getDeptname());
-        serviceSubtaskStatistic.setDeptcode(serviceSubtaskList.get(0).getDeptcode());
+        serviceSubtaskStatistic.setDeptname(serviceSubtaskList.get(0).getLeaveldeptname());
+        serviceSubtaskStatistic.setDeptcode(serviceSubtaskList.get(0).getLeaveldeptcode());
         serviceSubtaskStatistic.setLeavehospitaldistrictname(serviceSubtaskList.get(0).getLeavehospitaldistrictname());
         serviceSubtaskStatistic.setLeavehospitaldistrictcode(serviceSubtaskList.get(0).getLeavehospitaldistrictcode());
         serviceSubtaskStatistic.setDrcode(serviceSubtaskList.get(0).getDrcode());
@@ -2729,8 +2844,8 @@
         ServiceSubtaskStatistic serviceSubtaskStatistic = new ServiceSubtaskStatistic();
         //鏍煎紡鍖栦负涓や綅灏忔暟鐨勭櫨鍒嗘瘮
         DecimalFormat percentFormat = new DecimalFormat("##.##%");
-        serviceSubtaskStatistic.setDeptname(serviceSubtaskList.get(0).getDeptname());
-        serviceSubtaskStatistic.setDeptcode(serviceSubtaskList.get(0).getDeptcode());
+        serviceSubtaskStatistic.setDeptname(serviceSubtaskList.get(0).getLeaveldeptname());
+        serviceSubtaskStatistic.setDeptcode(serviceSubtaskList.get(0).getLeaveldeptcode());
         serviceSubtaskStatistic.setLeavehospitaldistrictname(serviceSubtaskList.get(0).getLeavehospitaldistrictname());
         serviceSubtaskStatistic.setLeavehospitaldistrictcode(serviceSubtaskList.get(0).getLeavehospitaldistrictcode());
         serviceSubtaskStatistic.setDrcode(serviceSubtaskList.get(0).getDrcode());
@@ -3074,67 +3189,111 @@
         log.info("getSfStatisticsScript鐨勫叆鍙備负锛歿}", serviceSubtaskCountReq);
         List<ServiceSubtaskStatistic> serviceSubtaskStatistics = new ArrayList<>();
 
-        // 鏍规嵁鏉′欢杩涜鍒嗙粍
-        Map<String, List<ServiceSubtask>> collect = new HashMap<>();
+        // 鏍规嵁鏉′欢鍐冲畾鍒嗙粍缁村害锛氱闄㈢淮搴︽寜 leaveldeptcode / leavehospitaldistrictcode锛堝惈鍘嗗彶 deptcodes 鍏ュ弬锛夛紝
+        // 鍦ㄩ櫌缁村害鎸� deptcode / hospitaldistrictcode
         String groupKey = "drcode";
+        boolean hasDrcode = serviceSubtaskCountReq.getDrcode() != null && !serviceSubtaskCountReq.getDrcode().isEmpty();
         if (serviceSubtaskCountReq.getLeavehospitaldistrictcodes() != null && !serviceSubtaskCountReq.getLeavehospitaldistrictcodes().isEmpty()) {
-            if (serviceSubtaskCountReq.getDrcode() != null && !serviceSubtaskCountReq.getDrcode().isEmpty()) {
-                groupKey = "drcode";
-            } else {
-                groupKey = "leavehospitaldistrictcode";
-            }
+            groupKey = hasDrcode ? "drcode" : "leavehospitaldistrictcode";
+        } else if (serviceSubtaskCountReq.getLeaveldeptcodes() != null && !serviceSubtaskCountReq.getLeaveldeptcodes().isEmpty()) {
+            groupKey = hasDrcode ? "drcode" : "leaveldeptcode";
+        } else if (serviceSubtaskCountReq.getHospitaldistrictcodes() != null && !serviceSubtaskCountReq.getHospitaldistrictcodes().isEmpty()) {
+            // 鍦ㄩ櫌婊℃剰搴︼細鎸夊湪闄㈢梾鍖哄垎缁勶紙hospitaldistrictcode锛�
+            groupKey = hasDrcode ? "drcode" : "hospitaldistrictcode";
+        } else if (serviceSubtaskCountReq.getHospitaldeptcodes() != null && !serviceSubtaskCountReq.getHospitaldeptcodes().isEmpty()) {
+            // 鍦ㄩ櫌婊℃剰搴︼細鎸夊湪闄㈢瀹ゅ垎缁勶紙deptcode锛�
+            groupKey = hasDrcode ? "drcode" : "deptcode";
         } else if (serviceSubtaskCountReq.getDeptcodes() != null && !serviceSubtaskCountReq.getDeptcodes().isEmpty()) {
-            if (serviceSubtaskCountReq.getDrcode() != null && !serviceSubtaskCountReq.getDrcode().isEmpty()) {
-                groupKey = "drcode";
-            } else {
-                groupKey = "deptcode";
-            }
+            // 鍘嗗彶鍏ュ弬 deptcodes 琛ㄧず绂婚櫌绉戝
+            groupKey = hasDrcode ? "drcode" : "leaveldeptcode";
         }
         serviceSubtaskCountReq.setGroupKey(groupKey);
+        // 鍒嗙粍鍒椾笌杩囨护鍒椾繚鎸佷竴鑷达細绂婚櫌绉戝 leaveldeptcode銆佸湪闄㈢瀹� deptcode
+        serviceSubtaskCountReq.setGroupColumn(groupKey);
+        //鍒嗙粍閿泦鍚堬細杩欎竴姝ヤ繚鎸佷笉鍙橈紙鍒嗛〉鍙傛暟鐓ф棫浣滅敤鍦ㄨ鏌ヨ涓婏級锛屼繚璇佲�滃弬涓庣粺璁$殑鍒嗙粍鈥濅笌鏀归�犲墠涓�鑷�
         List<String> groupKeyList = serviceSubtaskMapper.getSfStatisticsGroupKey(serviceSubtaskCountReq);
+        /*
+         * 鍒嗙粍鍒楀彲鑳戒负 NULL锛氭弧鎰忓害瀛愪换鍔★紙service_type 6/14/15/16锛夌殑 leavehospitaldistrictcode
+         * 澶ч噺涓� NULL锛実etSfStatisticsGroupKey 浼氭妸 NULL 鍘熸牱甯﹀洖鏉ワ紝
+         * 鎷艰繘 SQL 灏卞彉鎴� `AND xxx IN (null)`锛堟亽涓嶆垚绔嬶級锛屾暣寮犵粺璁¤〃鐩存帴绌恒��
+         * 杩欓噷缁熶竴鎴� 'Unknown'锛屼笌鑱氬悎 SQL 鐨� GROUP BY IFNULL(鍒�,'Unknown') 瀵归綈銆�
+         */
+        if (groupKeyList != null) {
+            groupKeyList = groupKeyList.stream()
+                    .map(key -> key == null ? "Unknown" : key)
+                    .distinct()
+                    .collect(Collectors.toList());
+        }
         serviceSubtaskCountReq.setGroupKeyList(groupKeyList);
-        List<ServiceSubtask> rawData = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq);
-        switch (groupKey) {
-            case "deptcode":
-                collect = rawData.stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDeptcode()).orElse("Unknown")));
-                break;
-            case "drcode":
-                collect = rawData.stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDrcode()).orElse("Unknown")));
-                break;
-            case "leavehospitaldistrictcode":
-                collect = rawData.stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getLeavehospitaldistrictcode()).orElse("Unknown")));
-                break;
-            default:
-                collect = rawData.stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDrcode()).orElse("Unknown")));
-                break;
+
+        /*
+         * 缁熻涓嬫帹鍒版暟鎹簱锛氫竴娆� GROUP BY 鍙繑鍥炩�滃垎缁勬暟鈥濊銆�
+         * 鏀归�犲墠鏄� serviceSubtaskMapper.getSfStatistics() 鎶婂懡涓殑鍏ㄩ儴鏄庣粏琛岋紙39 涓瓧娈碉紝
+         * 鍚� continue_content 绛夊ぇ瀛楁锛夋崬鍥� JVM 鍚庨�愯绱姞锛屽嚑鍗冭鏃朵紶杈撳拰閬嶅巻閮藉緢鎱€��
+         * 杩欓噷鐨勮仛鍚堝彛寰勪笌鍘� getStatisticCategory 閫愭潯瀵归綈锛堣 Mapper 涓� getSfStatisticsScriptSum 鐨勬敞閲婏級銆�
+         */
+        List<ServiceSubtaskStatistic> sumStatistics = serviceSubtaskMapper.getSfStatisticsScriptSum(serviceSubtaskCountReq);
+        if (CollectionUtils.isEmpty(sumStatistics)) {
+            return serviceSubtaskStatistics;
         }
-        //鑾峰彇鍙婃椂鐜囩粺璁″悎闆�
-        Map<String, Map<String, Object>> jsRates = getSsRateForSfStatistics(serviceSubtaskCountReq, collect);
-        //涓�娆℃�ф煡璇㈡墍鏈夊垎缁勭殑棰樼洰缁熻锛岄伩鍏嶆瘡涓垎缁勪竴娆QL锛圢+1锛�
-        List<Long> allSubTaskIds = rawData.stream().map(ServiceSubtask::getId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
-        List<ServiceSubtaskCount> subCounts = new ArrayList<>();
-        if (CollectionUtils.isNotEmpty(allSubTaskIds)) {
-            serviceSubtaskCountReq.setSubTaskIds(allSubTaskIds);
-            subCounts = serviceSubtaskMapper.getSfStatisticsCategory(serviceSubtaskCountReq);
-        }
-        for (String collectKey : collect.keySet()) {
-            List<ServiceSubtask> serviceSubtaskList = collect.get(collectKey);
-            if (CollectionUtils.isEmpty(serviceSubtaskList)) {
-                continue;
-            }
-            ServiceSubtaskStatistic statistic = getStatisticCategory(serviceSubtaskList, serviceSubtaskCountReq, subCounts);
-            if (ObjectUtils.isNotEmpty(jsRates)) {
-                Map<String, Object> jsRateMap = jsRates.get(collectKey);
-                BigDecimal jsRate = new BigDecimal("0");
-                if (ObjectUtils.isNotEmpty(jsRateMap) && ObjectUtils.isNotEmpty(jsRateMap.get("rate"))) {
-                    jsRate = new BigDecimal(jsRateMap.get("rate").toString());
+
+        /*
+         * 婊℃剰搴﹂鐩噺锛氫篃鏀规垚鎸夊垎缁勫湪搴撻噷鑱氬悎銆�
+         * 鏀归�犲墠鏄厛鎶婃湰娆″懡涓殑鍏ㄩ儴瀛愪换鍔� id 鐏岃繘 getSfStatisticsCategory 鐨� IN 鍒楄〃鏌ヤ竴閬嶏紝
+         * 鍐嶅湪鍐呭瓨閲屽姣忎釜瀛愪换鍔″仛涓�娆� subCounts.stream().filter(...)锛圢*M 娆℃瘮杈冿級銆�
+         */
+        Map<String, Integer> joyCountMap = new HashMap<>();
+        Map<String, Integer> joyAllCountMap = new HashMap<>();
+        if (StringUtils.isNotEmpty(serviceSubtaskCountReq.getConfigValue())) {
+            List<Map<String, Object>> joySums = serviceSubtaskMapper.getSfStatisticsScriptJoySum(serviceSubtaskCountReq);
+            if (CollectionUtils.isNotEmpty(joySums)) {
+                for (Map<String, Object> joySum : joySums) {
+                    String joyGroupCode = joySum.get("groupCode") == null ? "Unknown" : joySum.get("groupCode").toString();
+                    joyCountMap.put(joyGroupCode, toIntValue(joySum.get("joyCount")));
+                    joyAllCountMap.put(joyGroupCode, toIntValue(joySum.get("joyAllCount")));
                 }
-                Double jsRateDouble = (jsRate.setScale(4, RoundingMode.HALF_UP)).doubleValue();
-                statistic.setRate(jsRateDouble);
             }
-            if (ObjectUtils.isNotEmpty(statistic)) {
-                serviceSubtaskStatistics.add(statistic);
+        }
+
+        //闅忚鐜囷細鍙e緞涓庡師 getStatisticCategory 涓�鑷达紙棣栨鐜囩殑鍒ゆ柇娌跨敤鍘熸潵鐨� needFollowUp銆佸啀娆$巼娌跨敤鍘熸潵鐨勫垎姣嶏級
+        DecimalFormat percentFormat = new DecimalFormat("##.##%");
+        List<String> statisticsGroupKeys = new ArrayList<>();
+        for (ServiceSubtaskStatistic statistic : sumStatistics) {
+            String statisticGroupCode = statistic.getGroupCode() == null ? "Unknown" : statistic.getGroupCode();
+            statistic.setJoyCount(joyCountMap.getOrDefault(statisticGroupCode, 0));
+            statistic.setJoyAllCount(joyAllCountMap.getOrDefault(statisticGroupCode, 0));
+            //棣栨闅忚鐜囷細鍙湁璇ュ垎缁勫瓨鍦ㄩ娆¢殢璁胯褰曟椂鎵嶄細琚祴鍊硷紙涓嶅瓨鍦ㄥ垯鏄� null锛屼笌鏀归�犲墠涓�鑷达級
+            if (statistic.getFirstVisitCount() != null && statistic.getFirstVisitCount() > 0) {
+                if (statistic.getNeedFollowUp() != null && statistic.getNeedFollowUp() > 0) {
+                    double rate = (double) (nvlLong(statistic.getFollowUpSuccess()) + nvlLong(statistic.getFollowUpFail())) / statistic.getNeedFollowUp();
+                    statistic.setFollowUpRate(percentFormat.format(rate));
+                } else {
+                    statistic.setFollowUpRate("0.00%");
+                }
             }
+            //鍐嶆闅忚鐜囷細鍒ゆ柇鏉′欢涓庡師瀹炵幇涓�鑷达紙鍘熸潵鍒ゆ柇鐨勬槸 needFollowUp锛岃繖閲岀収鎼互鍏嶅彛寰勫彉鍖栵級
+            if (statistic.getAgainVisitCount() != null && statistic.getAgainVisitCount() > 0) {
+                if (statistic.getNeedFollowUp() != null && statistic.getNeedFollowUp() > 0) {
+                    double rateAgain = (double) (nvlLong(statistic.getFollowUpSuccessAgain()) + nvlLong(statistic.getFollowUpFailAgain())) / nvlLong(statistic.getNeedFollowUpAgain());
+                    statistic.setFollowUpRateAgain(percentFormat.format(rateAgain));
+                } else {
+                    statistic.setFollowUpRateAgain("0.00%");
+                }
+            }
+            statisticsGroupKeys.add(statisticGroupCode);
+            serviceSubtaskStatistics.add(statistic);
+        }
+
+        //鑾峰彇鍙婃椂鐜囩粺璁″悎闆嗭紙涓�娆℃壒閲忔煡璇紝涓嶆寜鍒嗙粍寰幆鏌ワ級
+        Map<String, Map<String, Object>> jsRates = getSsRateForSfStatistics(serviceSubtaskCountReq, statisticsGroupKeys);
+        for (ServiceSubtaskStatistic statistic : serviceSubtaskStatistics) {
+            String statisticGroupCode = statistic.getGroupCode() == null ? "Unknown" : statistic.getGroupCode();
+            Map<String, Object> jsRateMap = jsRates == null ? null : jsRates.get(statisticGroupCode);
+            BigDecimal jsRate = new BigDecimal("0");
+            if (ObjectUtils.isNotEmpty(jsRateMap) && ObjectUtils.isNotEmpty(jsRateMap.get("rate"))) {
+                jsRate = new BigDecimal(jsRateMap.get("rate").toString());
+            }
+            statistic.setRate((jsRate.setScale(4, RoundingMode.HALF_UP)).doubleValue());
         }
 
         //缁熻闅忚棰樼洰鍒嗙被
@@ -3401,7 +3560,7 @@
             diagname.setPhone(subtask.getPhone());
             diagname.setNurseName(subtask.getNurseName());
             diagname.setDrname(subtask.getDrname());
-            diagname.setDeptname(subtask.getDeptname());
+            diagname.setDeptname(subtask.getLeaveldeptname());
             diagname.setLeavehospitaldistrictname(subtask.getLeavehospitaldistrictname());
             diagname.setTemplatename(subtask.getTemplatename());
             diagname.setPreachform(subtask.getPreachform());
@@ -3508,7 +3667,6 @@
         //3.濡傛灉鏌ュ嚭鏉ョ殑闆嗗悎涓嶄负绌猴紝鍒欒繘琛屽惊鐜�
         for (ServiceSubtask serviceSubtask : serviceSubtasks) {
             Integer preachformSize = 0;
-            Boolean flag = false;
             ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
             serviceSubtaskPreachform.setSubid(serviceSubtask.getId());
             List<ServiceSubtaskPreachform> serviceSubtaskPreachforms = taskPreachformPort.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
@@ -3516,31 +3674,100 @@
                 preachformSize = serviceSubtaskPreachforms.size();
             if (serviceSubtask.getUpdateTime() != null && DateUtils.differentDaysByMillisecond(new Date(), serviceSubtask.getUpdateTime()) >= failDay) {
                 //3.1 鍒ゆ柇褰撳墠serviceSubtask鐨剈pdateTime鏄笉鏄负绌猴紝濡傛灉涓嶄负绌猴紝鍒欏垽鏂綋鍓嶆椂闂存槸涓嶆槸涓巙pdateTime宸窛澶т簬绛変簬failDay
-                flag = saveServiceSubtaskDetail(serviceSubtask);
+                log.debug("銆愬け璐ヤ换鍔¢粯璁ゅ�笺�戝瓙浠诲姟 {} 杈惧埌澶辫触澶╂暟(updateTime)", serviceSubtask.getId());
             } else if (serviceSubtask.getVisitTime() != null && DateUtils.differentDaysByMillisecond(new Date(), serviceSubtask.getVisitTime()) >= failDay + preachformSize) {
                 //3.2 濡傛灉褰撳墠serviceSubtask鐨剈pdateTime涓虹┖锛屾牴鎹綋鍓峴erviceSubtask鐨剆ubid鍘绘煡service_subtask_preachform寰楀埌size锛堝鏋渟ize涓虹┖锛屽垯榛樿0锛夛紝鍒欐牴鎹綋鍓嶆椂闂存槸涓嶆槸涓庡綋鍓峴erviceSubtask鐨剉isitTime宸窛澶т簬绛変簬failDay + size
-                flag = saveServiceSubtaskDetail(serviceSubtask);
+                log.debug("銆愬け璐ヤ换鍔¢粯璁ゅ�笺�戝瓙浠诲姟 {} 杈惧埌澶辫触澶╂暟(visitTime+preachformSize)", serviceSubtask.getId());
             } else {
                 //3.3 濡傛灉2.1涓�2.2閮戒负false锛屽垯continue
                 continue;
             }
 
-            //4.濡傛灉flag涓簍rue锛屽垯鏇存柊service_subtask琛ㄤ腑鐨剆endstate涓�6锛宲reachform涓�1
-            if (flag) {
-                serviceSubtask.setSendstate(6L);
-                serviceSubtask.setPreachform("1");
-                serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
+            //4. 鈿狅笍 2026-10-21 鍔犲浐锛氬厛"绠楀畬"鍐�"钀藉簱"锛屽交搴曞幓鎺�"鍏堟彃鍏ャ�佸け璐ュ啀鍒犻櫎"鐨勫啓娉曘��
+            //   鏃ч�昏緫鏄竟鎻掕竟鍒ゆ柇锛屽彧瑕佹湁涓�棰樻病閰嶉粯璁ゅ�硷紝灏辨妸杩欎釜 sub_id 涓�**鎵�鏈�**鏄庣粏锛堝惈鎮h�呯湡瀹炰綔绛斻��
+            //   鐢氳嚦鍒氭彃杩涘幓鐨勯偅鎵癸級缁熺粺缃� del_flag='1' 鈥斺�� nhfy 2026-09-08 閭� 10 浣嶆偅鑰呯殑婊℃剰搴︿綔绛�
+            //   灏辨槸杩欐牱琚垹鎺夈�佸鑷村鍑恒�岄棶棰樿鎯呭崰姣斻��370 鑰屻�岄殢璁夸俊鎭〃鍗曘��380 鐨勩��
+            //   鐜板湪锛氣憼 娓呭崟涓虹┖锛�=鏈夐娌¢厤榛樿鍊硷級鈫� 鏁翠唤璺宠繃锛屼笉鍐欎篃涓嶅垹锛�
+            //         鈶� 娓呭崟榻愬叏 鈫� 缁熶竴钀藉簱锛堝瓨鍦ㄥ垯鏇存柊骞跺娲伙紝涓嶅瓨鍦ㄥ垯鎻掑叆锛夈��
+            List<ServiceSubtaskDetail> defaultDetails = buildDefaultDetails(serviceSubtask);
+            if (CollectionUtils.isEmpty(defaultDetails)) {
+                log.info("銆愬け璐ヤ换鍔¢粯璁ゅ�笺�戜换鍔� {} 瀛愪换鍔� {} 鏈夐鐩湭閰嶇疆榛樿鍊硷紝鏁翠唤璺宠繃锛堜笉鎻掑叆銆佷笉鍒犻櫎浠讳綍鏄庣粏锛�",
+                        serviceSubtask.getTaskid(), serviceSubtask.getId());
+                continue;
+            }
+            persistDefaultDetails(defaultDetails);
+
+            //5.鍏ㄩ儴钀藉簱鎴愬姛鍚庡啀鎶婁换鍔$疆涓哄凡瀹屾垚
+            serviceSubtask.setSendstate(6L);
+            serviceSubtask.setPreachform("1");
+            serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
+        }
+    }
+
+    /**
+     * 鎸夋ā鏉挎瀯閫�"榛樿鍊兼槑缁�"娓呭崟锛�<b>鍙绠椼�佷笉钀藉簱</b>锛�
+     * <p>
+     * 2026-10-21 鏂板锛氭妸鍘熸潵鐨� {@code saveServiceSubtaskDetail}锛堣竟绠楄竟鎻掋�佸け璐ュ啀鍒狅級鎷嗘垚
+     * 銆宐uild锛堟湰鏂规硶锛夈��+銆宲ersist锛坽@link #persistDefaultDetails}锛夈�嶄袱姝ワ紝
+     * 淇濊瘉"榛樿鍊间笉鍏�"鏃�**涓�涓瓧鑺傞兘涓嶄細鍐欍�佹洿涓嶄細鍒�**銆�
+     *
+     * @param serviceSubtask 瀛愪换鍔�
+     * @return 鏄庣粏娓呭崟锛涗换涓�棰樻病閰嶉粯璁ゅ�硷紙鎴栨ā鏉夸负绌猴級鏃惰繑鍥� {@code null}锛岃〃绀烘暣浠戒笉澶勭悊
+     */
+    private List<ServiceSubtaskDetail> buildDefaultDetails(ServiceSubtask serviceSubtask) {
+        if (serviceSubtask.getType() == null) {
+            return null;
+        }
+        List<ServiceSubtaskDetail> details = new ArrayList<>();
+        if (serviceSubtask.getType().equals("1")) {
+            //3.3.1 濡傛灉type鏄� 1锛屽垯鐢ㄥ綋鍓峴erviceSubtask鐨則emplateid鍘籭vr_task_temaplate_script涓幏鍙栭棶棰樺拰閫夐」
+            IvrTaskTemplateScript ivrTaskTemplateScript = new IvrTaskTemplateScript();
+            ivrTaskTemplateScript.setTemplateID(serviceSubtask.getTemplateid());
+            List<IvrTaskTemplateScript> ivrTaskTemplateScripts = iIvrTaskTemplateScriptService.selectIvrTaskTemplateScriptList(ivrTaskTemplateScript);
+            if (CollectionUtils.isEmpty(ivrTaskTemplateScripts)) return null;
+            for (IvrTaskTemplateScript its : ivrTaskTemplateScripts) {
+                IvrTaskTemplateScriptVO ivrTaskTemplateScriptVO = DtoConversionUtils.sourceToTarget(its, IvrTaskTemplateScriptVO.class);
+                IvrTaskTemplateTargetoption ivrTaskTemplateTargetoption = new IvrTaskTemplateTargetoption();
+                ivrTaskTemplateTargetoption.setScriptid(ivrTaskTemplateScriptVO.getId());
+                List<IvrTaskTemplateTargetoption> ivrTaskTemplateTargetoptions = iIvrTaskTemplateTargetoptionService.selectIvrTaskTemplateTargetoptionList(ivrTaskTemplateTargetoption);
+                ivrTaskTemplateScriptVO.setIvrTaskScriptTargetoptionList(ivrTaskTemplateTargetoptions);
+                ServiceSubtaskDetail detail = buildSFDetail(ivrTaskTemplateScriptVO, serviceSubtask);
+                if (detail == null) return null;
+                details.add(detail);
+            }
+        } else if (serviceSubtask.getType().equals("2")) {
+            //3.3.2 濡傛灉type鏄� 2锛屽垯鐢ㄥ綋鍓峴erviceSubtask鐨則emplateid鍘籹vy_task_temaplate_script涓幏鍙栭棶棰樺拰閫夐」
+            SvyTaskTemplateScript svyTaskTemplateScript = new SvyTaskTemplateScript();
+            svyTaskTemplateScript.setTemplateID(serviceSubtask.getTemplateid());
+            List<SvyTaskTemplateScript> svyTaskTemplateScripts = svyTaskTemplateScriptService.selectSvyTaskTemplateScriptList(svyTaskTemplateScript);
+            if (CollectionUtils.isEmpty(svyTaskTemplateScripts)) return null;
+            for (SvyTaskTemplateScript taskTemplateScript : svyTaskTemplateScripts) {
+                SvyTaskTemplateScriptVO svyTaskTemplateScriptVO = DtoConversionUtils.sourceToTarget(taskTemplateScript, SvyTaskTemplateScriptVO.class);
+                SvyTaskTemplateScriptVO svyTaskTemplateScriptVO1 = svyTaskTemplateScriptService.selectInfoByCondition(svyTaskTemplateScriptVO);
+                ServiceSubtaskDetail detail = buildWJDetail(svyTaskTemplateScriptVO1, serviceSubtask);
+                if (detail == null) return null;
+                details.add(detail);
+            }
+        } else {
+            return null;
+        }
+        return details;
+    }
+
+    /**
+     * 钀藉簱"榛樿鍊兼槑缁�"锛氬瓨鍦ㄥ垯鏇存柊骞跺娲伙紝涓嶅瓨鍦ㄥ垯鎻掑叆锛�<b>鍙涓嶅垹</b>锛�
+     */
+    private void persistDefaultDetails(List<ServiceSubtaskDetail> details) {
+        for (ServiceSubtaskDetail detail : details) {
+            ServiceSubtaskDetailDTO exist = serviceSubtaskDetailMapper.isExistServiceSubtaskDetail(detail.getSubId(), detail.getScriptid());
+            if (ObjectUtils.isNotEmpty(exist)) {
+                detail.setId(exist.getId());
+                detail.setUpdateTime(new Date());
+                serviceSubtaskDetailMapper.updateServiceSubtaskDetail(detail);
+                //鍛戒腑鍘嗗彶琚垹鍓湰鏃剁疆鍥� del_flag='0'锛岄伩鍏嶅啀鎻掍竴浠芥柊鍓湰
+                serviceSubtaskDetailMapper.reviveServiceSubtaskDetail(exist.getId());
             } else {
-                //鍒犻櫎璇柊澧瀌etail閲岀殑鏁版嵁
-                ServiceSubtaskDetail serviceSubtaskDetail = new ServiceSubtaskDetail();
-                serviceSubtaskDetail.setSubId(serviceSubtask.getId());
-                List<ServiceSubtaskDetail> serviceSubtaskDetails = serviceSubtaskDetailMapper.selectServiceSubtaskDetailList(serviceSubtaskDetail);
-                if (CollectionUtils.isNotEmpty(serviceSubtaskDetails)) {
-                    for (ServiceSubtaskDetail serviceSubtaskDetail1 : serviceSubtaskDetails) {
-                        serviceSubtaskDetail1.setDelFlag("1");
-                        serviceSubtaskDetailMapper.updateServiceSubtaskDetail(serviceSubtaskDetail1);
-                    }
-                }
+                serviceSubtaskDetailMapper.insertServiceSubtaskDetail(detail);
             }
         }
     }
@@ -3740,44 +3967,30 @@
         return resultMap;
     }
 
-    private Boolean saveServiceSubtaskDetail(ServiceSubtask serviceSubtask) {
-        Boolean result = true;
-        //3.4 濡傛灉3.1鎴�3.2涓簍rue鐨勮瘽锛屾牴鎹畉ype鍒ゆ柇浠�涔堢被鍨�
-        if (serviceSubtask.getType().equals("1")) {
-            //3.3.1    濡傛灉type鏄� 1 锛屽垯鐢ㄥ綋鍓峴erviceSubtask鐨則emplateid鍘籭vr_task_temaplate_script涓幏鍙栭棶棰樺拰閫夐」锛屽皢闂鍜岄�夐」鐨勯粯璁ゅ�兼斁鍒皊ervice_detail涓�
-            IvrTaskTemplateScript ivrTaskTemplateScript = new IvrTaskTemplateScript();
-            ivrTaskTemplateScript.setTemplateID(serviceSubtask.getTemplateid());
-            List<IvrTaskTemplateScript> ivrTaskTemplateScripts = iIvrTaskTemplateScriptService.selectIvrTaskTemplateScriptList(ivrTaskTemplateScript);
-            for (IvrTaskTemplateScript its : ivrTaskTemplateScripts) {
-                IvrTaskTemplateScriptVO ivrTaskTemplateScriptVO = DtoConversionUtils.sourceToTarget(its, IvrTaskTemplateScriptVO.class);
-                IvrTaskTemplateTargetoption ivrTaskTemplateTargetoption = new IvrTaskTemplateTargetoption();
-                ivrTaskTemplateTargetoption.setScriptid(ivrTaskTemplateScriptVO.getId());
-                List<IvrTaskTemplateTargetoption> ivrTaskTemplateTargetoptions = iIvrTaskTemplateTargetoptionService.selectIvrTaskTemplateTargetoptionList(ivrTaskTemplateTargetoption);
-                ivrTaskTemplateScriptVO.setIvrTaskScriptTargetoptionList(ivrTaskTemplateTargetoptions);
-                Integer integer = setSFDetailInfo(ivrTaskTemplateScriptVO, serviceSubtask);
-                if (Objects.isNull(integer) || integer == 0) result = false;
-            }
+    /*
+     * 2026-10-21 宸插垹闄� saveServiceSubtaskDetail(...)銆�
+     * 瀹冨師鏉ョ殑璇箟鏄�"杈圭畻榛樿鍊艰竟钀藉簱锛屾渶鍚庤繑鍥炲竷灏斿��"锛岃皟鐢ㄦ柟鍦ㄨ繑鍥� false 鏃舵妸璇� sub_id 涓嬬殑
+     * 鍏ㄩ儴鏄庣粏缃� del_flag='1'锛堣繛鎮h�呯湡瀹炰綔绛斾竴璧峰垹锛夈��
+     * 鐜板湪鎷嗘垚 buildDefaultDetails(...)锛堝彧绠椾笉鍐欙級 + persistDefaultDetails(...)锛堝彧澧炰笉鍒狅級锛�
+     * 浠讳綍涓�棰樼己榛樿鍊煎氨鏁翠唤璺宠繃锛屼笉浼氬啀浜х敓"鍒犻櫎"鍔ㄤ綔銆�
+     */
 
-        } else if (serviceSubtask.getType().equals("2")) {
-            //3.3.2    濡傛灉type鏄� 2,鍒欑敤褰撳墠serviceSubtask鐨則emplateid鍘籹vy_task_temaplate_script涓幏鍙栭棶棰樺拰閫夐」锛屽皢闂鍜岄�夐」鐨勯粯璁ゅ�兼斁鍒皊ervice_detail涓�
-            SvyTaskTemplateScript svyTaskTemplateScript = new SvyTaskTemplateScript();
-            svyTaskTemplateScript.setTemplateID(serviceSubtask.getTemplateid());
-            List<SvyTaskTemplateScript> svyTaskTemplateScripts = svyTaskTemplateScriptService.selectSvyTaskTemplateScriptList(svyTaskTemplateScript);
-            for (SvyTaskTemplateScript taskTemplateScript : svyTaskTemplateScripts) {
-                SvyTaskTemplateScriptVO svyTaskTemplateScriptVO = DtoConversionUtils.sourceToTarget(taskTemplateScript, SvyTaskTemplateScriptVO.class);
-                SvyTaskTemplateScriptVO svyTaskTemplateScriptVO1 = svyTaskTemplateScriptService.selectInfoByCondition(svyTaskTemplateScriptVO);
-                Integer integer = setWJDetailInfo(svyTaskTemplateScriptVO1, serviceSubtask);
-                if (Objects.isNull(integer) || integer == 0) result = false;
-            }
+    /**
+     * 鎸夈�岄棶鍗锋ā鏉裤�嶆瀯閫犱竴鏉�"榛樿鍊兼槑缁�"锛�<b>鍙绠椼�佷笉钀藉簱</b>锛�
+     * <p>
+     * 2026-10-21 鐢� {@code setWJDetailInfo}锛堢畻瀹屽氨鐩存帴 insert/update锛屽け璐ヨ繑鍥� 0锛夋敼閫犺�屾潵锛�
+     * 鐜板湪鍙礋璐f妸瀹炰綋鎷煎嚭鏉ワ紝鐢� {@link #persistDefaultDetails} 缁熶竴钀藉簱銆�
+     *
+     * @return 鏄庣粏锛涜棰樻病閰嶉粯璁ゅ�硷紙鍗�/澶氶�夐涓�涓粯璁ら�夐」閮芥病鏈夛級鏃惰繑鍥� {@code null}锛岃〃绀烘暣浠介棶鍗蜂笉澶勭悊
+     */
+    private ServiceSubtaskDetail buildWJDetail(SvyTaskTemplateScriptVO svyTaskTemplateScriptVO, ServiceSubtask serviceSubtask) {
+        if (svyTaskTemplateScriptVO == null) {
+            return null;
         }
-        return result;
-    }
-
-    private Integer setWJDetailInfo(SvyTaskTemplateScriptVO svyTaskTemplateScriptVO, ServiceSubtask serviceSubtask) {
-        log.info("-----setWJDetailInfo鐨勫叆鍙備负锛歿}", svyTaskTemplateScriptVO);
+        log.info("-----buildWJDetail鐨勫叆鍙備负锛歿}", svyTaskTemplateScriptVO);
 
         ServiceSubtaskDetailVO serviceSubtaskDetailVO = new ServiceSubtaskDetailVO();
-        if (svyTaskTemplateScriptVO.getScriptType().equals("1") || svyTaskTemplateScriptVO.getScriptType().equals("2")) {
+        if ("1".equals(svyTaskTemplateScriptVO.getScriptType()) || "2".equals(svyTaskTemplateScriptVO.getScriptType())) {
             //1銆�2涓哄崟閫夋垨澶氶��
             for (SvyTaskTemplateTargetoption svyTaskTemplateTargetoption : svyTaskTemplateScriptVO.getSvyTaskTemplateTargetoptions()) {
                 //灏嗛棶棰橀�夐」璁板綍涓嬫潵
@@ -3792,9 +4005,9 @@
                 }
 
             }
-            //濡傛灉asrtext鍜宮atchedtext閮戒负绌猴紝鍒欐病鏈夐粯璁ゅ�硷紝鍒欎笉杩涜澶勭悊
+            //濡傛灉asrtext鍜宮atchedtext閮戒负绌猴紝鍒欐病鏈夐粯璁ゅ�硷紝鍒欎笉杩涜澶勭悊锛堣繑鍥� null = 鏁翠唤闂嵎璺宠繃锛�
             if (StringUtils.isEmpty(serviceSubtaskDetailVO.getAsrtext()) && StringUtils.isEmpty(serviceSubtaskDetailVO.getMatchedtext())) {
-                return 0;
+                return null;
             }
         }
         ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
@@ -3817,21 +4030,16 @@
         }
         serviceSubtaskDetailVO.setSubId(serviceSubtask.getId());
         serviceSubtaskDetailVO.setTemplatequestionnum(svyTaskTemplateScriptVO.getId());
-        ServiceSubtaskDetail serviceSubtaskDetail = DtoConversionUtils.sourceToTarget(serviceSubtaskDetailVO, ServiceSubtaskDetail.class);
-
-        //鍏堢敤subid鍜宻criptid鏌ヨ涓�涓嬫槸鍚﹀瓨鍦紝濡傛灉瀛樺湪鍒欐洿鏂帮紝涓嶅瓨鍦ㄥ垯鎻掑叆
-        ServiceSubtaskDetailDTO existServiceSubtaskDetail = serviceSubtaskDetailMapper.isExistServiceSubtaskDetail(serviceSubtaskDetailVO.getSubId(), serviceSubtaskDetailVO.getScriptid());
-        if (ObjectUtils.isNotEmpty(existServiceSubtaskDetail)) {
-            serviceSubtaskDetail.setId(existServiceSubtaskDetail.getId());
-            serviceSubtaskDetail.setUpdateTime(new Date());
-            return serviceSubtaskDetailMapper.updateServiceSubtaskDetail(serviceSubtaskDetail);
-        } else {
-            return serviceSubtaskDetailMapper.insertServiceSubtaskDetail(serviceSubtaskDetail);
-        }
+        return DtoConversionUtils.sourceToTarget(serviceSubtaskDetailVO, ServiceSubtaskDetail.class);
     }
 
-    private Integer setSFDetailInfo(IvrTaskTemplateScriptVO ivrTaskTemplateScriptVO, ServiceSubtask serviceSubtask) {
-
+    /**
+     * 鎸夈�岀數璇濇ā鏉裤�嶆瀯閫犱竴鏉�"榛樿鍊兼槑缁�"锛�<b>鍙绠椼�佷笉钀藉簱</b>锛夛紝璇箟鍚� {@link #buildWJDetail}
+     */
+    private ServiceSubtaskDetail buildSFDetail(IvrTaskTemplateScriptVO ivrTaskTemplateScriptVO, ServiceSubtask serviceSubtask) {
+        if (ivrTaskTemplateScriptVO == null) {
+            return null;
+        }
         ServiceSubtaskDetailVO serviceSubtaskDetailVO = new ServiceSubtaskDetailVO();
         if (ivrTaskTemplateScriptVO.getScriptType() != null && (ivrTaskTemplateScriptVO.getScriptType().equals("1") || ivrTaskTemplateScriptVO.getScriptType().equals("2"))) {
             //1銆�2涓哄崟閫夋垨澶氶��
@@ -3848,10 +4056,12 @@
                     serviceSubtaskDetailVO.setMatchedtext(StringUtils.isEmpty(serviceSubtaskDetailVO.getMatchedtext()) ? ivrTaskTemplateTargetoption.getTargetvalue() : serviceSubtaskDetailVO.getMatchedtext() + "&" + ivrTaskTemplateTargetoption.getTargetvalue());
                 }
             }
-            //濡傛灉asrtext鍜宮atchedtext閮戒负绌猴紝鍒欐病鏈夐粯璁ゅ�硷紝涓嶈繘琛屽鐞�
+            //濡傛灉asrtext鍜宮atchedtext閮戒负绌猴紝鍒欐病鏈夐粯璁ゅ�硷紝涓嶈繘琛屽鐞嗭紙杩斿洖 null = 鏁翠唤闂嵎璺宠繃锛�
             if (StringUtils.isEmpty(serviceSubtaskDetailVO.getAsrtext()) && StringUtils.isEmpty(serviceSubtaskDetailVO.getMatchedtext())) {
-                return 0;
+                return null;
             }
+        } else if (ivrTaskTemplateScriptVO.getScriptType() == null) {
+            return null;
         }
 
         serviceSubtaskDetailVO.setTargetid(ivrTaskTemplateScriptVO.getTargetid() != null ? ivrTaskTemplateScriptVO.getTargetid().intValue() : null);
@@ -3871,17 +4081,9 @@
         serviceSubtaskDetailVO.setTemplateType(1);
         serviceSubtaskDetailVO.setTemplateid(ivrTaskTemplateScriptVO.getTemplateID() == null ? null : ivrTaskTemplateScriptVO.getTemplateID().toString());
         serviceSubtaskDetailVO.setLibTemplateid(serviceSubtask.getLibtemplateid() != null ? serviceSubtask.getLibtemplateid().intValue() : null);
-        ServiceSubtaskDetail serviceSubtaskDetail = DtoConversionUtils.sourceToTarget(serviceSubtaskDetailVO, ServiceSubtaskDetail.class);
-        //鍏堢敤subid鍜宻criptid鏌ヨ涓�涓嬫槸鍚﹀瓨鍦紝濡傛灉瀛樺湪鍒欐洿鏂帮紝涓嶅瓨鍦ㄥ垯鎻掑叆
-        ServiceSubtaskDetailDTO existServiceSubtaskDetail = serviceSubtaskDetailMapper.isExistServiceSubtaskDetail(serviceSubtaskDetailVO.getSubId(), serviceSubtaskDetailVO.getScriptid());
-        if (ObjectUtils.isNotEmpty(existServiceSubtaskDetail)) {
-            serviceSubtaskDetail.setId(existServiceSubtaskDetail.getId());
-            serviceSubtaskDetail.setUpdateTime(new Date());
-            return serviceSubtaskDetailMapper.updateServiceSubtaskDetail(serviceSubtaskDetail);
-        } else {
-            return serviceSubtaskDetailMapper.insertServiceSubtaskDetail(serviceSubtaskDetail);
-        }
+        return DtoConversionUtils.sourceToTarget(serviceSubtaskDetailVO, ServiceSubtaskDetail.class);
     }
+
 
     public String scanGenerateSubtask(ServiceTask serviceTaskVo) {
         String content = "";
@@ -3953,8 +4155,8 @@
 //        serviceSubtask.setDrcode(patMedInhosp1.getDrcode());
 //        serviceSubtask.setDrname(patMedInhosp1.getDrname());
         if (StringUtils.isNotEmpty(serviceTaskdept.getDeptType()) && serviceTaskdept.getDeptType().equals("1")) {
-            serviceSubtask.setDeptcode(serviceTaskdept.getDeptCode());
-            serviceSubtask.setDeptname(serviceTaskdept.getDeptName());
+            serviceSubtask.setLeaveldeptcode(serviceTaskdept.getDeptCode());
+            serviceSubtask.setLeaveldeptname(serviceTaskdept.getDeptName());
         } else {
             serviceSubtask.setLeavehospitaldistrictcode(serviceTaskdept.getDeptCode());
             serviceSubtask.setLeavehospitaldistrictname(serviceTaskdept.getDeptName());
@@ -3990,7 +4192,7 @@
         // 杩欓噷鐢ㄤ换鍔¢厤缃殑鐥呭尯锛堝叾娆$瀹わ級鍙嶆煡 sys_dept.campusid 钀藉簱锛屼繚璇侀棶鍗风粺璁¤兘鎸夐櫌鍖哄彇鍒般��
         String campusIdByDept = queryCampusIdByDeptCode(serviceSubtask.getLeavehospitaldistrictcode(), serviceTask.getOrgid());
         if (StringUtils.isEmpty(campusIdByDept)) {
-            campusIdByDept = queryCampusIdByDeptCode(serviceSubtask.getDeptcode(), serviceTask.getOrgid());
+            campusIdByDept = queryCampusIdByDeptCode(serviceSubtask.getLeaveldeptcode(), serviceTask.getOrgid());
         }
         if (StringUtils.isNotEmpty(campusIdByDept)) {
             serviceSubtask.setCampusid(campusIdByDept);
@@ -3999,7 +4201,7 @@
         if (StringUtils.isEmpty(serviceSubtask.getLeavehospitaldistrictcode())
                 && ("6".equals(serviceSubtask.getServiceType()) || "14".equals(serviceSubtask.getServiceType()))) {
             log.warn("銆愭壂鐮佺敓鎴愪换鍔°�戞弧鎰忓害瀛愪换鍔℃病鏈夌梾鍖猴紝鎸夌梾鍖虹瓫閫夌殑鎶ヨ〃灏嗙粺璁′笉鍒拌绛斿嵎锛歵askid={}, deptcode={}, campusid={}",
-                    serviceSubtask.getTaskid(), serviceSubtask.getDeptcode(), serviceSubtask.getCampusid());
+                    serviceSubtask.getTaskid(), serviceSubtask.getLeaveldeptcode(), serviceSubtask.getCampusid());
         }
         return serviceSubtask;
     }

--
Gitblit v1.9.3