From 007055b80677a53598c501553b4265ecd1ace3ca Mon Sep 17 00:00:00 2001
From: 陈昶聿 <chychen@nbjetron.com>
Date: 星期六, 07 十一月 2026 14:08:21 +0800
Subject: [PATCH] fix: 任务组及时率不再叠加 send_day

---
 ruoyi-task/src/main/java/com/ruoyi/task/controller/ServiceSubtaskController.java |  180 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 172 insertions(+), 8 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 ac3f09a..06b4a55 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
@@ -3,10 +3,12 @@
 import com.alibaba.fastjson.JSON;
 import com.github.pagehelper.ISelect;
 import com.ruoyi.common.annotation.AddOrgId;
+import com.ruoyi.common.annotation.Anonymous;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.constant.HttpStatus;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.entity.SysDept;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.core.domain.entity.SysUserDept;
 import com.ruoyi.common.core.domain.model.LoginUser;
@@ -64,6 +66,7 @@
 import com.ruoyi.task.domain.VO.TransferDeptVO;
 import com.ruoyi.task.domain.ServiceSubtaskExport;
 import com.ruoyi.system.service.ISysConfigService;
+import com.ruoyi.system.service.ISysDeptService;
 import com.ruoyi.system.service.ISysUserDeptService;
 
 /**
@@ -111,6 +114,9 @@
 
     @Autowired
     private ISysConfigService sysConfigService;
+
+    @Autowired
+    private ISysDeptService sysDeptService;
 
     /**
      * 浠诲姟杩愮淮瑙﹀彂鑳藉姏銆�
@@ -595,6 +601,155 @@
         return getDataTable4(CollectionUtils.isEmpty(sfStatistics) ? sfStatistics.size() : 0, serviceSubtaskService.getSfStatistics(serviceSubtaskCountReq));
     }
 
+    // =====================================================================================
+    // 鍏嶇櫥褰曢殢璁跨粺璁★紙渚� public/html/sfstat.html 鐙珛椤甸潰浣跨敤锛孈Anonymous 鍗� SecurityConfig 鐨� permitAll锛�
+    // 鍙e緞涓� /getSfStatistics 瀹屽叏涓�鑷达紝鍖哄埆鍙湁涓ょ偣锛�
+    //   1. 涓嶄緷璧栫櫥褰曠敤鎴凤紝orgid / campusid 鐢辫姹備綋鏄惧紡浼犲叆锛�
+    //   2. 鏈寚瀹氱梾鍖猴紙绉戝锛夋椂锛屽彇璇ユ満鏋勶紙闄㈠尯锛変笅鐨勫叏閮ㄧ梾鍖猴紙绉戝锛夛紝鑰岄潪褰撳墠鐧诲綍鐢ㄦ埛鐨勬潈闄愯寖鍥淬��
+    // =====================================================================================
+
+    /**
+     * 鍏嶇櫥褰曪細闅忚缁熻锛堥娆� / 鍐嶆锛�
+     */
+    @Anonymous
+    @PostMapping("/publicSfStatistics")
+    public Map<String, Object> publicSfStatistics(@RequestBody ServiceSubtaskCountReq serviceSubtaskCountReq) {
+        if (CollectionUtils.isEmpty(serviceSubtaskCountReq.getServiceType())) {
+            return error("鏈嶅姟绫诲瀷涓嶈兘涓虹┖");
+        }
+        if (StringUtils.isEmpty(serviceSubtaskCountReq.getOrgid())) {
+            return error("缂哄皯鏈烘瀯鍙傛暟 orgid");
+        }
+        Integer statisticaltype = serviceSubtaskCountReq.getStatisticaltype();
+        if (statisticaltype != null && statisticaltype == 1) {
+            List<String> wardCodes = isAllSelected(serviceSubtaskCountReq.getLeavehospitaldistrictcodes())
+                    ? listDeptCodesByType(serviceSubtaskCountReq.getOrgid(), serviceSubtaskCountReq.getCampusid(), "2")
+                    : serviceSubtaskCountReq.getLeavehospitaldistrictcodes();
+            if (CollectionUtils.isEmpty(wardCodes)) {
+                return getDataTable4(0, new ArrayList<>());
+            }
+            serviceSubtaskCountReq.setLeavehospitaldistrictcodes(wardCodes);
+            serviceSubtaskCountReq.setDeptcodes(null);
+        } else if (statisticaltype != null && statisticaltype == 2) {
+            List<String> deptCodes = isAllSelected(serviceSubtaskCountReq.getDeptcodes())
+                    ? listDeptCodesByType(serviceSubtaskCountReq.getOrgid(), serviceSubtaskCountReq.getCampusid(), "1")
+                    : serviceSubtaskCountReq.getDeptcodes();
+            if (CollectionUtils.isEmpty(deptCodes)) {
+                return getDataTable4(0, new ArrayList<>());
+            }
+            serviceSubtaskCountReq.setDeptcodes(deptCodes);
+            serviceSubtaskCountReq.setLeavehospitaldistrictcodes(null);
+        }
+        String followUpCountStyle = sysConfigService.selectConfigByKey("followUpCountStyle", serviceSubtaskCountReq.getOrgid());
+        if (ObjectUtils.isNotEmpty(followUpCountStyle)) {
+            serviceSubtaskCountReq.setFollowUpCountStyle(followUpCountStyle);
+        } else {
+            serviceSubtaskCountReq.setFollowUpCountStyle("1");
+        }
+        if (serviceSubtaskCountReq.getRateDay() == null) {
+            serviceSubtaskCountReq.setRateDay(7);
+        }
+        serviceSubtaskCountReq.setPageNum(null);
+        serviceSubtaskCountReq.setPageSize(null);
+        List<ServiceSubtaskStatistic> sfStatistics = serviceSubtaskService.getSfStatistics(serviceSubtaskCountReq);
+        return getDataTable4(CollectionUtils.isEmpty(sfStatistics) ? 0 : sfStatistics.size(), sfStatistics);
+    }
+
+    /**
+     * 鍏嶇櫥褰曪細闅忚缁熻绛涢�夐」锛堢梾鍖哄垪琛� / 绉戝鍒楄〃锛�
+     *
+     * @param orgid    鏈烘瀯ID锛屽繀濉�
+     * @param campusid 闄㈠尯ID锛屽彲涓虹┖锛涗负绌烘椂鍙栬鏈烘瀯鍏ㄩ儴闄㈠尯
+     */
+    @Anonymous
+    @GetMapping("/publicSfStatisticsOptions")    public AjaxResult publicSfStatisticsOptions(@RequestParam(value = "orgid", required = false) String orgid,
+                                                @RequestParam(value = "campusid", required = false) String campusid) {
+        if (StringUtils.isEmpty(orgid)) {
+            return error("缂哄皯鏈烘瀯鍙傛暟 orgid");
+        }
+        Map<String, Object> result = new LinkedHashMap<>();
+        result.put("orgid", orgid);
+        result.put("campusid", campusid);
+        result.put("wards", listDepts(orgid, campusid, "2"));
+        result.put("depts", listDepts(orgid, campusid, "1"));
+        return success(result);
+    }
+
+    /**
+     * 鍏嶇櫥褰曪細寤剁画鎶ょ悊缁熻锛堝彛寰勪笌 /getContinueNerseCount 涓�鑷达紝orgid / campusid 鐢辫姹備綋浼犲叆锛�
+     */
+    @Anonymous
+    @PostMapping("/publicContinueNerseCount")
+    public AjaxResult publicContinueNerseCount(@RequestBody ServiceSubtaskCotinueCountVO serviceSubtaskCotinueCountVO) {
+        if (StringUtils.isEmpty(serviceSubtaskCotinueCountVO.getOrgid())) {
+            return error("缂哄皯鏈烘瀯鍙傛暟 orgid");
+        }
+        List<String> districts = serviceSubtaskCotinueCountVO.getLeavehospitaldistrictcodes();
+        List<String> depts = serviceSubtaskCotinueCountVO.getDeptcodes();
+        boolean hasDistrict = !CollectionUtils.isEmpty(districts) && !districts.contains("all");
+        boolean hasDept = !CollectionUtils.isEmpty(depts) && !depts.contains("all");
+        if (hasDistrict && hasDept) {
+            return error("鐥呭尯Code闆嗗悎涓庣瀹ode闆嗗悎浜掓枼锛屼笉鑳藉悓鏃朵紶鍏�");
+        }
+        if (!hasDistrict && !hasDept) {
+            // 鏈寚瀹氱梾鍖�/绉戝锛氭寜璇ユ満鏋勶紙闄㈠尯锛変笅鍏ㄩ儴鐥呭尯缁熻
+            List<String> wardCodes = listDeptCodesByType(serviceSubtaskCotinueCountVO.getOrgid(),
+                    serviceSubtaskCotinueCountVO.getCampusid(), "2");
+            if (CollectionUtils.isEmpty(wardCodes)) {
+                return success(new LinkedHashMap<>());
+            }
+            serviceSubtaskCotinueCountVO.setLeavehospitaldistrictcodes(wardCodes);
+            serviceSubtaskCotinueCountVO.setDeptcodes(null);
+        } else if (hasDistrict) {
+            serviceSubtaskCotinueCountVO.setDeptcodes(null);
+        } else {
+            serviceSubtaskCotinueCountVO.setLeavehospitaldistrictcodes(null);
+        }
+        return success(serviceSubtaskService.getContinueNurseCount(serviceSubtaskCotinueCountVO));
+    }
+
+    /**
+     * 鍓嶇鏈�夋嫨鍏蜂綋鐥呭尯/绉戝锛堟垨閫夋嫨浜� all锛夋椂锛岃涓衡�滃叏閮ㄢ��
+     */
+    private boolean isAllSelected(List<String> codes) {
+        return CollectionUtils.isEmpty(codes) || codes.contains("all");
+    }
+
+    private List<String> listDeptCodesByType(String orgid, String campusid, String deptType) {
+        List<String> codes = new ArrayList<>();
+        for (Map<String, String> item : listDepts(orgid, campusid, deptType)) {
+            codes.add(item.get("code"));
+        }
+        return codes;
+    }
+
+    /**
+     * 鏌ヨ鏈烘瀯锛堥櫌鍖猴級涓嬫寚瀹氱被鍨嬬殑閮ㄩ棬锛歞eptType=2 鐥呭尯锛宒eptType=1 绉戝
+     */
+    private List<Map<String, String>> listDepts(String orgid, String campusid, String deptType) {
+        List<Map<String, String>> result = new ArrayList<>();
+        SysDept query = new SysDept();
+        query.setOrgid(orgid);
+        query.setDeptType(deptType);
+        if (StringUtils.isNotEmpty(campusid) && !"all".equalsIgnoreCase(campusid)) {
+            query.setCampusid(campusid);
+        }
+        List<SysDept> depts = sysDeptService.selectSysDeptList(query);
+        if (CollectionUtils.isEmpty(depts)) {
+            return result;
+        }
+        for (SysDept dept : depts) {
+            if (StringUtils.isEmpty(dept.getDeptCode())) {
+                continue;
+            }
+            Map<String, String> item = new LinkedHashMap<>();
+            item.put("code", dept.getDeptCode());
+            item.put("name", dept.getDeptName());
+            result.add(item);
+        }
+        return result;
+    }
+
     /**
      * 鑾峰彇涓撶梾闅忚缁熻姣斾緥
      */
@@ -854,26 +1009,35 @@
     @AddOrgId(field = "orgid", paramIndex = 0, campusField = "campusid")
     @PostMapping("/getSfStatisticsCountDetailsHyperLink")
     public AjaxResult getSfStatisticsCountDetailsHyperLink(@RequestBody ServiceSubtaskCountReq serviceSubtaskCountReq) {
+        Integer statisticaltype = serviceSubtaskCountReq.getStatisticaltype();
+        if (statisticaltype != null && statisticaltype != 1 && statisticaltype != 2 && statisticaltype != 3) {
+            return error("缁熻缁村害statisticaltype浠呮敮鎸侊細1-鎸夌梾鍖� 2-鎸夌瀹� 3-鎸塼askid");
+        }
+        if (serviceSubtaskCountReq.getScriptid() == null
+                && StringUtils.isEmpty(serviceSubtaskCountReq.getScriptContent())) {
+            return error("闂ID(scriptid)涓嶈兘涓虹┖");
+        }
+        if (serviceSubtaskCountReq.getOptionText() == null) {
+            return error("闂閫夐」(optionText)涓嶈兘涓虹┖");
+        }
+
         LoginUser loginUser = getLoginUser();
         String orgid = loginUser.getUser().getOrgid();
+        serviceSubtaskCountReq.setOrgid(orgid);
+
+        // 涓� getSfStatisticsCountDetails 淇濇寔鐩稿悓鐨勯厤缃瓫閫夊彛寰�
         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 + " 鏈厤缃�, 璇烽厤缃ソ鍚庨噸璇�";
+                String logInfo = "getSfStatisticsCountDetailsHyperLink-鍙傛暟 " + 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));
+        return success(serviceSubtaskService.getSfStatisticsScriptDetailsHyperlink(serviceSubtaskCountReq));
     }
     /**
      * 鍙戦�佺煭淇℃ā鏉�

--
Gitblit v1.9.3