From 7191c6d38f03f2e1baf39f959227ce9c038e4e96 Mon Sep 17 00:00:00 2001
From: liusheng <337615773@qq.com>
Date: 星期二, 03 十一月 2026 14:39:52 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master' into smartor_ls_261012

---
 ruoyi-task/src/main/java/com/ruoyi/task/controller/ServiceSubtaskController.java |  239 +++++++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 191 insertions(+), 48 deletions(-)

diff --git a/ruoyi-task/src/main/java/com/ruoyi/task/controller/ServiceSubtaskController.java b/ruoyi-task/src/main/java/com/ruoyi/task/controller/ServiceSubtaskController.java
index 4087dd9..ac3f09a 100644
--- a/ruoyi-task/src/main/java/com/ruoyi/task/controller/ServiceSubtaskController.java
+++ b/ruoyi-task/src/main/java/com/ruoyi/task/controller/ServiceSubtaskController.java
@@ -20,11 +20,8 @@
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.common.utils.reflect.ReflectUtils;
 import com.ruoyi.common.core.service.TaskOpsTriggerApi;
-import com.ruoyi.task.api.spi.TaskSysConfigPort;
-import com.ruoyi.task.api.spi.TaskSysUserDeptPort;
 import com.ruoyi.satisfaction.api.SatisfactionExportBundle;
 import com.ruoyi.satisfaction.api.SatisfactionFacade;
-import com.ruoyi.task.api.spi.TaskSubtaskRecordPort;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -54,6 +51,7 @@
 import com.ruoyi.task.domain.ServiceSubtaskStatistic;
 import com.ruoyi.task.domain.ServiceTask;
 import com.ruoyi.task.domain.VO.ServiceSubtaskCotinueCountVO;
+import com.ruoyi.task.service.IServiceSubtaskRecordService;
 import com.ruoyi.task.service.IServiceSubtaskService;
 import com.ruoyi.task.service.IServiceTaskService;
 import com.ruoyi.task.domain.PatArchiveSrmVO;
@@ -65,6 +63,8 @@
 import com.ruoyi.task.domain.VO.ServiceSubtaskVO;
 import com.ruoyi.task.domain.VO.TransferDeptVO;
 import com.ruoyi.task.domain.ServiceSubtaskExport;
+import com.ruoyi.system.service.ISysConfigService;
+import com.ruoyi.system.service.ISysUserDeptService;
 
 /**
  * 鍗曚竴浠诲姟锛堥殢璁匡級Controller
@@ -104,13 +104,13 @@
     private IServiceTaskService serviceTaskService;
 
     @Autowired
-    private TaskSysUserDeptPort taskSysUserDeptPort;
+    private ISysUserDeptService sysUserDeptService;
 
     @Autowired
-    private TaskSubtaskRecordPort serviceSubtaskRecordService;
+    private IServiceSubtaskRecordService serviceSubtaskRecordService;
 
     @Autowired
-    private TaskSysConfigPort taskSysConfigPort;
+    private ISysConfigService sysConfigService;
 
     /**
      * 浠诲姟杩愮淮瑙﹀彂鑳藉姏銆�
@@ -169,6 +169,7 @@
         LoginUser loginUser = getLoginUser();
         SysUser user = loginUser.getUser();
         serviceSubtaskVO.setOrgid(user.getOrgid());
+        // 闄㈠尯鍙栫櫥褰曚細璇濋噷鐨勫�硷紙鐧诲綍椤甸�夋嫨鐨勯櫌鍖猴紝瑙� SysLoginService#login锛�
         serviceSubtaskVO.setCampusid(user.getCampusid());
         ServiceSubtaskEntity serviceSubtaskEntity = null;
         if (serviceSubtaskVO != null) {
@@ -363,8 +364,7 @@
     public AjaxResult querySubtaskList(@RequestBody ServiceSubtaskVO serviceSubtaskVO) {
         ServiceSubtaskEntity serviceSubtaskEntity = DtoConversionUtils.sourceToTarget(serviceSubtaskVO, ServiceSubtaskEntity.class);
         serviceSubtaskEntity.setContinueContent(ObjectUtils.isNotEmpty(serviceSubtaskVO.getContinueContent()) ? serviceSubtaskVO.getContinueContent().toString() : null);
-        PageUtils.startPageByPost(serviceSubtaskEntity.getPageNum(), serviceSubtaskEntity.getPageSize());
-        serviceSubtaskService.selectServiceSubtaskList(serviceSubtaskEntity);
+        // 璇� SQL 宸插唴缃� limit ${pageSize} OFFSET ${pageNum}锛屼笉鍐嶈蛋 PageHelper锛岄伩鍏嶄袱濂楀垎椤靛彔鍔犱骇鐢熶袱涓� LIMIT
         return success(serviceSubtaskService.selectServiceSubtaskList(serviceSubtaskEntity));
     }
 
@@ -378,8 +378,8 @@
     public TableDataInfo querySubtaskListAgain(@RequestBody ServiceSubtaskVO serviceSubtaskVO) {
         ServiceSubtaskEntity serviceSubtaskEntity = DtoConversionUtils.sourceToTarget(serviceSubtaskVO, ServiceSubtaskEntity.class);
         serviceSubtaskEntity.setContinueContent(ObjectUtils.isNotEmpty(serviceSubtaskVO.getContinueContent()) ? serviceSubtaskVO.getContinueContent().toString() : null);
+        // 璇� SQL 鏈唴缃� limit锛屼娇鐢� PageHelper 鍒嗛〉锛涘彧璋冪敤涓�娆★紝getDataTable 鍙熀浜� Page 鍙栧埌姝g‘ total
         PageUtils.startPageByPost(serviceSubtaskEntity.getPageNum(), serviceSubtaskEntity.getPageSize());
-        serviceSubtaskService.selectServiceSubtaskListAgain(serviceSubtaskEntity);
         return getDataTable(serviceSubtaskService.selectServiceSubtaskListAgain(serviceSubtaskEntity));
     }
 
@@ -558,7 +558,7 @@
                         sysUserWard.setOrgid(user.getOrgid());
                         sysUserWard.setCampusid(user.getCampusid());
                         sysUserWard.setDeptType("2");
-                        List<SysUserDept> wardList = taskSysUserDeptPort.selectSysUserDeptList(sysUserWard);
+                        List<SysUserDept> wardList = sysUserDeptService.selectSysUserDeptList(sysUserWard);
                         if (CollectionUtils.isNotEmpty(wardList)) {
                             leavehospitaldistrictcodes = wardList.stream().map(SysUserDept::getDeptCode).collect(Collectors.toList());
                         }
@@ -573,7 +573,7 @@
                         sysUserDept.setOrgid(user.getOrgid());
                         sysUserDept.setCampusid(user.getCampusid());
                         sysUserDept.setDeptType("1");
-                        List<SysUserDept> deptList = taskSysUserDeptPort.selectSysUserDeptList(sysUserDept);
+                        List<SysUserDept> deptList = sysUserDeptService.selectSysUserDeptList(sysUserDept);
                         if (CollectionUtils.isNotEmpty(deptList)) {
                             deptCodes = deptList.stream().map(SysUserDept::getDeptCode).collect(Collectors.toList());
                         }
@@ -583,7 +583,7 @@
             }
         }
 
-        String followUpCountStyle = taskSysConfigPort.selectConfigValue("followUpCountStyle", serviceSubtaskCountReq.getOrgid());
+        String followUpCountStyle = sysConfigService.selectConfigByKey("followUpCountStyle", serviceSubtaskCountReq.getOrgid());
         if (ObjectUtils.isNotEmpty(followUpCountStyle)) {
             serviceSubtaskCountReq.setFollowUpCountStyle(followUpCountStyle);
         } else {
@@ -608,7 +608,7 @@
         Integer offset = PageUtils.getOffset(serviceSubtaskCountReq.getPageNum(), serviceSubtaskCountReq.getPageSize());
         serviceSubtaskCountReq.setPageNum(offset);
 
-        String followUpCountStyle = taskSysConfigPort.selectConfigValue("followUpCountStyle", serviceSubtaskCountReq.getOrgid());
+        String followUpCountStyle = sysConfigService.selectConfigByKey("followUpCountStyle", serviceSubtaskCountReq.getOrgid());
         if (ObjectUtils.isNotEmpty(followUpCountStyle)) {
             serviceSubtaskCountReq.setFollowUpCountStyle(followUpCountStyle);
         } else {
@@ -692,6 +692,10 @@
      * manualInfo - visitCount = 1 && currentPreachForm = "1"
      * voiceInfo - visitCount = 1 && currentPreachForm = "3"
      * smsInfo - visitCount = 1 && currentPreachForm = "4"
+     * manualSuccessInfo - visitCount = 1 && currentPreachForm = "1" && sendstate = 6
+     * voiceSuccessInfo - visitCount = 1 && currentPreachForm = "3" && sendstate = 6
+     * smsSuccessInfo - visitCount = 1 && currentPreachForm = "4" && sendstate = 6
+     * wechatSuccessInfo - visitCount = 1 && currentPreachForm = "5" && sendstate = 6
      * wechatInfo - visitCount = 1 && currentPreachForm = "5"
      * abnormalInfo - visitCount = 1 && excep = "1"
      * needFollowUpAgainInfo - visitCount > 1 && sendstate != 4
@@ -709,6 +713,19 @@
      * taskSituation4Info - taskSituation = 4
      * taskSituation5Info - taskSituation = 5
      * taskSituation6Info - taskSituation = 7
+     * manuallyCalledInfo - isManuallyCalled = 1L
+     * manualCallTimeoutInfo - visitCount = 1 && sendstate = 7 && isManuallyCalled = 0
+     * manualCallTimeoutAgainInfo - visitCount > 1 && sendstate = 7 && isManuallyCalled = 0
+     * pendingFollowUpAllInfo - visitCount = 1 && sendstate in (1,2,3,7)
+     * pendingFollowUpAllAgainInfo - visitCount > 1 && sendstate in (1,2,3,7)
+     * pendingFollowUpWaitSendInfo - visitCount = 1 && sendstate in (1,2)
+     * pendingFollowUpWaitSendAgainInfo - visitCount > 1 && sendstate in (1,2)
+     * pendingFollowUpSentInfo - visitCount = 1 && sendstate in (3,7)
+     * pendingFollowUpSentAgainInfo - visitCount > 1 && sendstate in (3,7)
+     * sentInfo - visitCount = 1 && sendstate = 3
+     * sentAgainInfo - visitCount > 1 && sendstate = 3
+     * firstDischargeCountInfo - visitCount = 1
+     * againFollowUpPushCountInfo - visitCount = 2 && visitDeptCode = sys.smartor.center.dept
      * filterCountList - taskSituation = 6 && sendstate = 4
      *
      */
@@ -720,7 +737,7 @@
         String orgid = loginUser.getUser().getOrgid();
         String configKey = serviceSubtaskCountReq.getConfigKey();
         if (StringUtils.isNotEmpty(configKey)) {
-            String configValue = taskSysConfigPort.selectConfigValue(configKey, orgid);
+            String configValue = sysConfigService.selectConfigByKey(configKey, orgid);
             serviceSubtaskCountReq.setConfigValue(configValue);
             if (StringUtils.isEmpty(configValue)) {
                 String logInfo = "getSfStatisticsCount-鍙傛暟 " + configKey + " 鏈厤缃�, 璇烽厤缃ソ鍚庨噸璇�";
@@ -729,7 +746,7 @@
             }
         }
 
-        String followUpCountStyle = taskSysConfigPort.selectConfigValue("followUpCountStyle", orgid);
+        String followUpCountStyle = sysConfigService.selectConfigByKey("followUpCountStyle", orgid);
         if (ObjectUtils.isNotEmpty(followUpCountStyle)) {
             serviceSubtaskCountReq.setFollowUpCountStyle(followUpCountStyle);
         } else {
@@ -769,7 +786,7 @@
         }
         String configKey = serviceSubtaskCountReq.getConfigKey();
         if (StringUtils.isNotEmpty(configKey)) {
-            String configValue = taskSysConfigPort.selectConfigValue(configKey, serviceSubtaskCountReq.getOrgid());
+            String configValue = sysConfigService.selectConfigByKey(configKey, serviceSubtaskCountReq.getOrgid());
             serviceSubtaskCountReq.setConfigValue(configValue);
             if (StringUtils.isEmpty(configValue)) {
                 String logInfo = "getSfStatisticsCount-鍙傛暟 " + configKey + " 鏈厤缃�, 璇烽厤缃ソ鍚庨噸璇�";
@@ -781,6 +798,9 @@
             log.error(logInfo);
             return error(logInfo);
         }
+        // 鍒嗙被缁熻涓烘眹鎬荤粨鏋滐紝涓嶅弬涓庡垎椤碉紱鍚屾椂閬垮厤 pageNum/pageSize 褰卞搷鍒嗙粍 key 鐨勬敹闆嗐��
+        serviceSubtaskCountReq.setPageNum(null);
+        serviceSubtaskCountReq.setPageSize(null);
         List<ServiceSubtaskStatistic> serviceSubtaskStatistics = serviceSubtaskService.getSfStatisticsScript(serviceSubtaskCountReq);
         return success(serviceSubtaskStatistics);
     }
@@ -800,7 +820,7 @@
         //澶嶈瘖缁熻
         String configKey = serviceSubtaskCountReq.getConfigKey();
         if (StringUtils.isNotEmpty(configKey)) {
-            String configValue = taskSysConfigPort.selectConfigValue(configKey, serviceSubtaskCountReq.getOrgid());
+            String configValue = sysConfigService.selectConfigByKey(configKey, serviceSubtaskCountReq.getOrgid());
             if (StringUtils.isEmpty(configValue)) {
                 String logInfo = "getSfStatisticsCountDetails-鍙傛暟 " + configKey + " 鏈厤缃�, 璇烽厤缃ソ鍚庨噸璇�";
                 log.error(logInfo);
@@ -816,10 +836,45 @@
         LoginUser loginUser = getLoginUser();
         String orgid = loginUser.getUser().getOrgid();
         serviceSubtaskCountReq.setOrgid(orgid);
-        PageUtils.startPageByPost(serviceSubtaskCountReq.getPageNum(), serviceSubtaskCountReq.getPageSize());
-        return success(serviceSubtaskService.getSfStatisticsScriptDetails(serviceSubtaskCountReq));
+        //娉ㄦ剰锛氳繖閲屼笉鑳藉啀璋冪敤 PageUtils.startPageByPost銆�
+        //杩斿洖缁撴瀯鏄� Map锛屼笖涓嶄紶 type 鏃朵細鎵ц涓ゆ潯 SQL锛孭ageHelper 鍙綔鐢ㄤ簬绗竴鏉� SQL锛�
+        //鍒嗛〉宸叉斁鍒� Service 閲屾寜棰樼洰锛坰criptid锛夊畬鎴愶紝淇濊瘉 total 鏄鐩�绘暟銆�
+        Map<String, Object> details = serviceSubtaskService.getSfStatisticsScriptDetails(serviceSubtaskCountReq);
+        AjaxResult ajax = success(details.get("data"));
+        //鍏煎鏃у墠绔細data 浠嶇劧鏄� {scriptid: 棰樼洰} 鐨� Map锛�
+        //鍚屾椂鎸� RuoYi 涔犳儻琛ヤ笂 rows/total/pageNum/pageSize 鏂逛究鍓嶇鍒嗛〉
+        ajax.put("rows", details.get("rows"));
+        ajax.put("total", details.get("total"));
+        ajax.put("pageNum", details.get("pageNum"));
+        ajax.put("pageSize", details.get("pageSize"));
+        return ajax;
     }
 
+    @ApiOperation("鑾峰彇闅忚鍒嗙被缁熻鏄庣粏璇︽儏瓒呴摼鎺�")
+    @AddOrgId(field = "orgid", paramIndex = 0, campusField = "campusid")
+    @PostMapping("/getSfStatisticsCountDetailsHyperLink")
+    public AjaxResult getSfStatisticsCountDetailsHyperLink(@RequestBody ServiceSubtaskCountReq serviceSubtaskCountReq) {
+        LoginUser loginUser = getLoginUser();
+        String orgid = loginUser.getUser().getOrgid();
+        String configKey = serviceSubtaskCountReq.getConfigKey();
+        if (StringUtils.isNotEmpty(configKey)) {
+            String configValue = sysConfigService.selectConfigByKey(configKey, orgid);
+            serviceSubtaskCountReq.setConfigValue(configValue);
+            if (StringUtils.isEmpty(configValue)) {
+                String logInfo = "getSfStatisticsCount-鍙傛暟 " + configKey + " 鏈厤缃�, 璇烽厤缃ソ鍚庨噸璇�";
+                log.error(logInfo);
+                return error(logInfo);
+            }
+        }
+
+        String followUpCountStyle = sysConfigService.selectConfigByKey("followUpCountStyle", orgid);
+        if (ObjectUtils.isNotEmpty(followUpCountStyle)) {
+            serviceSubtaskCountReq.setFollowUpCountStyle(followUpCountStyle);
+        } else {
+            serviceSubtaskCountReq.setFollowUpCountStyle("1");
+        }
+        return success(serviceSubtaskService.getSfStatisticsHyperlink(serviceSubtaskCountReq));
+    }
     /**
      * 鍙戦�佺煭淇℃ā鏉�
      */
@@ -837,48 +892,125 @@
     }
 
     /**
-     * 缁熻浠诲姟鍚勭鐘舵�佺殑鏁伴噺锛堜紭鍖栫増锛�
+     * 缁熻浠诲姟鍚勭鐘舵�佺殑鏁伴噺锛堜紭鍖栫増锛�-銆愰殢璁垮伐浣滃彴銆�
      *
+     * @param soonTimeoutHours 鍗冲皢瓒呮椂鏃堕棿锛堝皬鏃讹級锛岄粯璁� 48
      * @return Map<String, Object> 鍖呭惈鍚勭姸鎬佺粺璁℃暟鎹�
      * pendingVisitCount: 褰撳墠鐧诲綍浜烘埅姝粖鏃ュ緟闅忚鎬婚噺
      * failedVisitCount: 褰撳墠鐧诲綍浜洪殢璁夸换鍔″け璐ユ�婚噺
      * abnormalVisitVount: 褰撳墠鐧诲綍浜洪殢璁夸换鍔″紓甯告�婚噺
      * allVisitCount: 褰撳墠鐧诲綍浜洪殢璁夸换鍔℃�婚噺
+     * soonTimeoutCount: 褰撳墠鐧诲綍浜哄嵆灏嗚秴鏃舵暟閲忥紙瓒呮椂鎴鏃堕棿鍦� soonTimeoutHours 灏忔椂鍐咃級
      */
     @ApiOperation("鑾峰彇褰撳墠鐢ㄦ埛闅忚鏁伴噺缁熻")
     @PostMapping("/getCurrentUserServiceSubtaskCount")
-    public Map<String, Object> getCurrentUserServiceSubtaskCount() {
-        Map<String, Object> map = new HashMap<>();
-        LoginUser loginUser = getLoginUser();
+    public Map<String, Object> getCurrentUserServiceSubtaskCount(
+            @RequestParam(value = "soonTimeoutHours", required = false, defaultValue = "48") Integer soonTimeoutHours) {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        if (loginUser == null || loginUser.getUser() == null) {
+            return new HashMap<>();
+        }
         SysUser sysUser = loginUser.getUser();
-        SysUserDept sysUserDept = new SysUserDept();
-        sysUserDept.setUserId(sysUser.getUserId());
-        sysUserDept.setOrgid(sysUser.getOrgid());
-        sysUserDept.setCampusid(sysUser.getCampusid());
-        sysUserDept.setDeptType("1");
-        List<SysUserDept> sysUserDepts = taskSysUserDeptPort.selectSysUserDeptList(sysUserDept);
-        SysUserDept sysUserWard = new SysUserDept();
-        sysUserWard.setUserId(sysUser.getUserId());
-        sysUserWard.setOrgid(sysUser.getOrgid());
-        sysUserWard.setCampusid(sysUser.getCampusid());
-        sysUserWard.setDeptType("2");
-        List<SysUserDept> sysUserWards = taskSysUserDeptPort.selectSysUserDeptList(sysUserWard);
-        List<String> deptCodes = sysUserDepts.stream().map(SysUserDept::getDeptCode).collect(Collectors.toList());
-        List<String> wardCodes = sysUserWards.stream().map(SysUserDept::getDeptCode).collect(Collectors.toList());
+        List<String> deptCodes = CollectionUtils.emptyIfNull(sysUser.getBelongDepts()).stream()
+                .map(item -> item.get("deptCode"))
+                .filter(Objects::nonNull) // 鍓旈櫎null
+                .map(Object::toString)
+                .collect(Collectors.toList());
+        List<String> wardCodes = CollectionUtils.emptyIfNull(sysUser.getBelongWards()).stream()
+                .map(item -> item.get("districtCode"))
+                .filter(Objects::nonNull) // 鍓旈櫎null
+                .map(Object::toString)
+                .collect(Collectors.toList());
         ServiceSubtaskEntity entity = new ServiceSubtaskEntity();
         entity.setOrgid(sysUser.getOrgid());
         entity.setLeaveldeptcodes(deptCodes);
         entity.setLeavehospitaldistrictcodes(wardCodes);
-        if (ObjectUtils.isNotEmpty(sysUser)) {
-            if (!("admin").equals(sysUser.getUserName())) {
-                if (ObjectUtils.isNotEmpty(sysUserWards) && ObjectUtils.isNotEmpty(sysUserDepts)) {
-                    map = serviceSubtaskService.getCurrentUserServiceSubtaskCount(entity);
-                }
-            } else {
-                map = serviceSubtaskService.getCurrentUserServiceSubtaskCount(entity);
-            }
+        entity.setSoonTimeoutHours(soonTimeoutHours);
+        // admin 鏌ョ湅鍏ㄩ櫌锛涢潪 admin 鍙閰嶇疆浜嗙瀹ゆ垨鐥呭尯浠讳竴缁村害鍗冲彲鏌ヨ锛圫QL 涓负 OR 鍏崇郴锛�
+        boolean isAdmin = "admin".equals(sysUser.getUserName());
+        if (isAdmin || CollectionUtils.isNotEmpty(deptCodes) || CollectionUtils.isNotEmpty(wardCodes)) {
+            return serviceSubtaskService.getCurrentUserServiceSubtaskCount(entity);
         }
-        return map;
+        // 闈� admin 涓旀湭閰嶇疆浠讳綍绉戝/鐥呭尯鏉冮檺鏃讹紝杩斿洖榛樿 0 鍊硷紝閬垮厤鍓嶇鍙栦笉鍒� key
+        Map<String, Object> empty = new HashMap<>();
+        empty.put("pendingVisitCount", 0);
+        empty.put("failedVisitCount", 0);
+        empty.put("abnormalVisitCount", 0);
+        empty.put("warnningVisitCount", 0);
+        empty.put("allVisitCount", 0);
+        empty.put("soonTimeoutCount", 0);
+        return empty;
+    }
+
+    /**
+     * 褰撳墠鐧诲綍浜哄緟澶勭悊闅忚浠诲姟缁熻锛堟寜鍑洪櫌骞存湀鍒嗙粍锛屽嚭闄㈤殢璁裤�侀棬璇婇殢璁垮垎寮�璁℃暟锛�
+     * <p>
+     * 鍙e緞锛歴ervice_subtask 涓�
+     * service_type = '2' 鍑洪櫌闅忚 / '3' 闂ㄨ瘖闅忚
+     * + 寰呴殢璁跨姸鎬侊紙sendstate in 1,2,3,7锛屽彂閫佸け璐�(5) 涓嶈鍏ワ級
+     * + 鍑洪櫌婊� 7 澶╋紙鍚��7 澶╁墠閭d竴澶┿�嶅嚭闄㈢殑鎮h�咃級
+     * + 鍙湅鏈�杩� 4 涓嚭闄㈡湀浠斤紙鍚綋鏈堬級锛�
+     * 绉戝/鐥呭尯鏉冮檺鍙� OR锛堜笌闅忚鍒楄〃 deptOrDistrict=2 涓�鑷达級銆�
+     *
+     * @return { userName, nickName, total, months: [{ month: 'yyyy-MM', dischargeCount, outpatientCount }] }
+     * 鍙繑鍥炴湁鏁版嵁鐨勬湀浠斤紝娌℃湁鏁版嵁鐨勬湀浠界敱鍓嶇琛� 0
+     */
+    @ApiOperation("鑾峰彇褰撳墠鐧诲綍浜哄緟澶勭悊闅忚浠诲姟缁熻锛堟寜鍑洪櫌骞存湀锛�")
+    @PostMapping("/pendingTaskMonthStats")
+    public Map<String, Object> pendingTaskMonthStats() {
+        LoginUser loginUser = getLoginUser();
+        SysUser sysUser = loginUser.getUser();
+        Map<String, Object> result = new LinkedHashMap<>();
+        result.put("userName", sysUser.getUserName());
+        result.put("nickName", sysUser.getNickName());
+        result.put("total", 0L);
+        result.put("months", new ArrayList<>());
+
+        // 娉ㄦ剰锛氫笉瑕佺敤 sys_user_dept.campusid 杩囨护鈥斺�旇繖寮犺〃鐨� campusid 澶ч噺涓� NULL锛�
+        // 甯︿笂瀹冧細鐩存帴鏌ヤ笉鍑烘潈闄愶紝缁熻缁撴灉姘歌繙鏄� 0銆傞櫌鍖烘潈闄愮敱 orgid + userId + deptType 宸茶兘瀹氫綅銆�
+        SysUserDept deptQuery = new SysUserDept();
+        deptQuery.setUserId(sysUser.getUserId());
+        deptQuery.setOrgid(sysUser.getOrgid());
+        deptQuery.setDeptType("1");
+        List<SysUserDept> sysUserDepts = sysUserDeptService.selectSysUserDeptList(deptQuery);
+
+        SysUserDept wardQuery = new SysUserDept();
+        wardQuery.setUserId(sysUser.getUserId());
+        wardQuery.setOrgid(sysUser.getOrgid());
+        wardQuery.setDeptType("2");
+        List<SysUserDept> sysUserWards = sysUserDeptService.selectSysUserDeptList(wardQuery);
+
+        boolean isAdmin = "admin".equals(sysUser.getUserName());
+        // 娌℃湁绉戝/鐥呭尯閰嶇疆鐨勮处鍙凤紙濡傞儴鍒嗙鐞嗗憳璐﹀彿锛夛紝鍒楄〃鏈韩鏄寜 鏈烘瀯+闄㈠尯 鏌ョ殑锛�
+        // 杩欓噷涔熸寜鍚屾牱鍙e緞缁熻锛屽惁鍒欏垪琛ㄦ湁鏁版嵁銆佸崱鐗囧嵈鍏ㄦ槸 0銆�
+        if (!isAdmin && CollectionUtils.isEmpty(sysUserDepts) && CollectionUtils.isEmpty(sysUserWards)) {
+            log.info("[pendingTaskMonthStats] 鐢ㄦ埛 {} 鏈厤缃瀹�/鐥呭尯锛屾寜鏈烘瀯+闄㈠尯缁熻", sysUser.getUserName());
+        }
+
+        // sys_user_dept 閲屽悓涓�绉戝/鐥呭尯浼氶噸澶嶅緢澶氳锛屽幓閲嶅悗鍐嶆嫾 IN锛岄伩鍏� SQL 鍙傛暟杩囧
+        List<String> deptCodes = sysUserDepts.stream()
+                .map(SysUserDept::getDeptCode)
+                .filter(Objects::nonNull)
+                .distinct()
+                .collect(Collectors.toList());
+        List<String> wardCodes = sysUserWards.stream()
+                .map(SysUserDept::getDeptCode)
+                .filter(Objects::nonNull)
+                .distinct()
+                .collect(Collectors.toList());
+
+        ServiceSubtaskEntity entity = new ServiceSubtaskEntity();
+        entity.setOrgid(sysUser.getOrgid());
+        // 涓庡垪琛ㄤ竴鑷达細鎸夌櫥褰曚細璇濋噷鐨勯櫌鍖鸿繃婊わ紙鐧诲綍椤甸�夋嫨鐨勯櫌鍖猴級
+        entity.setCampusid(sysUser.getCampusid());
+        entity.setLeaveldeptcodes(deptCodes);
+        entity.setLeavehospitaldistrictcodes(wardCodes);
+
+        Map<String, Object> stats = serviceSubtaskService.getPendingManualTaskMonthStats(entity);
+        if (stats != null) {
+            result.putAll(stats);
+        }
+        return result;
     }
 
     @ApiOperation("鑾峰彇褰撳墠鐢ㄦ埛瀹f暀鏁伴噺缁熻")
@@ -904,6 +1036,17 @@
     @GetMapping(value = "/smsSubTask/{subid}")
     public Map<String, Object> smsSubTask(@PathVariable("subid") Long subid) {
         return serviceSubtaskService.smsSubTask(subid);
+    }
+
+    /**
+     * 鎵嬪姩鍙戦�侀棶鍗锋ā鏉跨殑寰俊鍔熻兘
+     *
+     * @param subid
+     * @return
+     */
+    @GetMapping(value = "/weChatSubTask/{subid}")
+    public Map<String, Object> weChatSubTask(@PathVariable("subid") Long subid) {
+        return serviceSubtaskService.weChatSubTask(subid);
     }
 
     /**
@@ -991,9 +1134,9 @@
             userId = loginUser.getUser().getUserId();
         }
         if (serviceSubtaskEntity.getSendstateView() != null) {
-            //            1锛氬緟闅忚锛�1 琚鍙栥��2 寰呭彂閫併��3 宸插彂閫併��5 鍙戦�佸け璐ャ��7銆佽秴鏃讹級锛�2锛氬凡瀹屾垚锛� 6 宸插畬鎴愶級銆�3锛氭棤闇�闅忚锛�4 涓嶆墽琛岋級
+            //            1锛氬緟闅忚锛�1 琚鍙栥��2 寰呭彂閫併��3 宸插彂閫併��7 瓒呮椂锛涘彂閫佸け璐�(5) 鍗曠嫭缁熻锛夛紱2锛氬凡瀹屾垚锛� 6 宸插畬鎴愶級銆�3锛氭棤闇�闅忚锛�4 涓嶆墽琛岋級
             if (serviceSubtaskEntity.getSendstateView() == 1)
-                serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(1L, 2L, 3L, 5L, 7L)));
+                serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(1L, 2L, 3L, 7L)));
             if (serviceSubtaskEntity.getSendstateView() == 2)
                 serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(6L)));
             if (serviceSubtaskEntity.getSendstateView() == 3)

--
Gitblit v1.9.3