From b5d55e1dd793c01f08786f805f01345bca64c893 Mon Sep 17 00:00:00 2001
From: liusheng <337615773@qq.com>
Date: 星期二, 03 十一月 2026 09:58:44 +0800
Subject: [PATCH] 代码提交

---
 ruoyi-task/src/main/java/com/ruoyi/task/service/impl/ServiceSubtaskServiceImpl.java |  170 ++++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 151 insertions(+), 19 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 bad652a..8548af1 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
@@ -101,11 +101,8 @@
 import com.ruoyi.task.mapper.ServiceOutPathMapper;
 import com.ruoyi.task.service.IServiceOutPathService;
 import com.ruoyi.task.domain.ServiceSubtaskPreachform;
-import com.ruoyi.task.api.spi.TaskPreachformPort;
+import com.ruoyi.task.mapper.ServiceSubtaskPreachformMapper;
 import com.ruoyi.task.api.spi.TaskArchivePort;
-import com.ruoyi.task.api.spi.TaskFtpPort;
-import com.ruoyi.task.api.spi.TaskSysConfigPort;
-import com.ruoyi.task.api.spi.TaskSysDeptPort;
 import com.ruoyi.task.common.ScheduleSubtaskBuilder;
 import com.ruoyi.task.domain.ServiceTaskScheduleVO;
 import com.ruoyi.task.service.IServiceSubtaskService;
@@ -124,6 +121,8 @@
 import com.ruoyi.task.domain.ServiceSubtaskTemplateVO;
 import com.ruoyi.task.domain.ServiceTaskVO;
 import com.ruoyi.task.domain.VO.TransferDeptVO;
+import com.ruoyi.system.service.ISysConfigService;
+import com.ruoyi.system.mapper.ext.SysDept2Mapper;
 
 /**
  * 鍗曚竴浠诲姟锛堥殢璁匡級Service涓氬姟灞傚鐞�
@@ -166,7 +165,7 @@
     private ServiceSubtaskMapper serviceSubtaskMapper;
 
     @Autowired
-    private TaskPreachformPort taskPreachformPort;
+    private ServiceSubtaskPreachformMapper taskPreachformPort;
 
     @Autowired
     private ServiceSubtaskDetailMapper serviceSubtaskDetailMapper;
@@ -221,9 +220,6 @@
     @Autowired
     private ScheduleSubtaskBuilder scheduleSubtaskBuilder;
 
-    @Autowired
-    private TaskFtpPort taskFtpPort;
-
 
 
 
@@ -236,7 +232,7 @@
 
 
     @Autowired
-    private TaskSysConfigPort taskSysConfigPort;
+    private ISysConfigService sysConfigService;
 
     /**
      * 娑堟伅鍙戦�佹柟宸ュ巶锛堢煭淇�/寰俊鍏紬鍙凤級锛屾浛浠e師鏉ョ洿鎺ヨ皟鐢ㄥ悇绔欑偣鍙戦�佷唬鐮佺殑鍐欐硶
@@ -255,7 +251,7 @@
 
 
     @Autowired
-    private TaskSysDeptPort taskSysDeptPort;
+    private SysDept2Mapper sysDept2Mapper;
 
     @Value("${spring.profiles.active}")
     private String active;
@@ -542,9 +538,9 @@
 
     public List<ServiceSubtask> getServiceSubtasks(ServiceSubtaskEntity serviceSubtaskEntity) {
         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)
@@ -813,6 +809,50 @@
     }
 
     /**
+     * 缁熶竴銆岄殢璁跨梾鍖恒�嶅彛寰勶細涓�寰嬩互銆愬嚭闄㈣褰曘�憑@code pat_med_inhosp} 涓哄噯锛�2026-10-29 涓氬姟纭锛夈��
+     *
+     * <h3>涓轰粈涔堥渶瑕佸畠</h3>
+     * 鍑洪櫌闅忚瀛愪换鍔$殑绉戝/鐥呭尯鏈簲鏉ヨ嚜鍑洪櫌璁板綍锛屼絾銆屽啀娆¢殢璁� / 鎵嬪伐鏂板銆嶈繖涓や釜鍏ュ彛鏄�
+     * <b>鐩存帴鎸夊墠绔紶鏉ョ殑瀛楁钀藉簱</b>鐨勶細鍓嶇涓嶅甫杩欎簺瀛楁鏃�
+     * {@code leaveldeptcode} / {@code leavehospitaldistrictcode} / {@code campusid} 灏辨槸绌恒��
+     * 鑰岄殢璁垮垪琛ㄦ槸鎸夌瀹�/鐥呭尯杩囨护鐨勶紙{@code and leavehospitaldistrictcode = #{...}}锛夛紝
+     * 绌哄�间笉鍖归厤浠讳綍鍊� 鈫� 杩欎簺浠诲姟"鐢熸垚浜嗕絾椤甸潰涓婃煡涓嶅埌"锛堢嚎涓� 2026-10 瀹炴祴 314 鏉★級銆�
+     *
+     * <p>鍙e緞锛�<b>鐥呭尯鍙鍑洪櫌璁板綍</b> 鈥斺�� 涓嶆寜鎮h�呮。妗堝弽鎺ㄣ�佷篃涓嶇敤鍓嶇浼犵殑鍊笺��
+     * 鍙鍑洪櫌闅忚锛坽@code service_type='2'}锛変笖鑳藉畾浣嶅埌鍑洪櫌璁板綍锛坽@code inhospid} 闈炵┖锛夌殑琛岀敓鏁堬紱
+     * 鍏朵綑鎯呭喌鍘熸牱鏀捐锛屽婊℃剰搴�(6)/瀹f暀/闂ㄨ瘖绛夊叾瀹冪被鍨嬫病鏈変换浣曞奖鍝嶃��
+     *
+     * @param serviceSubtask 寰呰惤搴撶殑瀛愪换鍔★紙灏卞湴淇敼锛�
+     */
+    private void alignDischargeWardFromInhosp(ServiceSubtask serviceSubtask) {
+        if (serviceSubtask == null || serviceSubtask.getInhospid() == null) {
+            return;
+        }
+        if (!"2".equals(serviceSubtask.getServiceType())) {
+            return;
+        }
+        PatMedInhosp inhosp;
+        try {
+            inhosp = inhospVisitFacade.selectPatMedInhospByInhospid(serviceSubtask.getInhospid());
+        } catch (Exception e) {
+            log.warn("銆愰殢璁夸换鍔°�戞寜 inhospid={} 鍙栧嚭闄㈣褰曞け璐ワ紝鐥呭尯娌跨敤鍏ュ弬锛歿}",
+                    serviceSubtask.getInhospid(), e.toString());
+            return;
+        }
+        if (inhosp == null) {
+            log.warn("銆愰殢璁夸换鍔°�慽nhospid={} 鏌ヤ笉鍒板嚭闄㈣褰曪紝鐥呭尯娌跨敤鍏ュ弬", serviceSubtask.getInhospid());
+            return;
+        }
+        serviceSubtask.setLeaveldeptcode(inhosp.getLeaveldeptcode());
+        serviceSubtask.setLeaveldeptname(inhosp.getLeaveldeptname());
+        serviceSubtask.setLeavehospitaldistrictcode(inhosp.getLeavehospitaldistrictcode());
+        serviceSubtask.setLeavehospitaldistrictname(inhosp.getLeavehospitaldistrictname());
+        if (StringUtils.isNotEmpty(inhosp.getCampusid())) {
+            serviceSubtask.setCampusid(inhosp.getCampusid());
+        }
+    }
+
+    /**
      * 鏂板鍗曚竴浠诲姟锛堥殢璁匡級
      *
      * @param serviceSubtask 鍗曚竴浠诲姟锛堥殢璁匡級
@@ -854,6 +894,8 @@
             }
 
             serviceSubtask.setCreateTime(DateUtils.getNowDate());
+            // 鍙e緞锛�2026-10-29 涓氬姟纭锛夛細鍑洪櫌闅忚鐨勭瀹�/鐥呭尯涓�寰嬩互鍑洪櫌璁板綍涓哄噯
+            alignDischargeWardFromInhosp(serviceSubtask);
             serviceSubtaskMapper.insertServiceSubtask(serviceSubtask);
             //淇敼浣忛櫌婊℃剰搴︾姸鎬侊紙閬垮厤閲嶅鏌ヨ锛�
             if (serviceSubtask.getServiceType() != null && "6".equals(serviceSubtask.getServiceType())) {
@@ -947,6 +989,13 @@
         serviceSubtask2.setVisitType(serviceSubtask.getVisitType());
         serviceSubtask2.setVisitDeptCode(serviceSubtask.getVisitDeptCode());
         serviceSubtask2.setVisitDeptName(serviceSubtask.getVisitDeptName());
+        // 鍙e緞锛�2026-10-29 涓氬姟纭锛夛細闅忚鐥呭尯涓�寰嬪彇鍑洪櫌璁板綍鐨�
+        //   鈶� 鍐嶆闅忚鏄粠璇锋眰 DTO 澶嶅埗鍑烘潵鐨勶紝鍑洪櫌璁板綍ID 涓嶅湪璇锋眰閲� 鈫� 鍏堢敤鍘熶换鍔$殑涓婏紱
+        //   鈶� 鍐嶆寜鍑洪櫌璁板綍鎶婄瀹�/鐥呭尯/闄㈠尯缁熶竴杩囨潵锛堝彇涓嶅埌灏变繚鎸佷笉鍙橈級銆�
+        if (serviceSubtask2.getInhospid() == null) {
+            serviceSubtask2.setInhospid(serviceSubtask1.getInhospid());
+        }
+        alignDischargeWardFromInhosp(serviceSubtask2);
         int i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtask2);
         if (i == 1) {
             //鏂板鎴愬姛鍚庯紝闇�瑕佸皢涔嬪墠鐨勪换鍔¤缃负涓嶈鍐嶉殢璁匡紙闃叉閲嶅鐐癸紝鐒跺悗閲嶅鐢熸垚锛�
@@ -1085,7 +1134,7 @@
             }
             serviceTask.setLeaveldeptcodes(serviceTaskVO.getLeaveldeptcodes());
             if (StringUtils.isEmpty(serviceTask.getLeavehospitaldistrictname()) && StringUtils.isNotEmpty(serviceTask.getLeavehospitaldistrictcode())) {
-                SysDept sysDept = taskSysDeptPort.selectDeptByCode(serviceTask.getLeavehospitaldistrictcode(), null);
+                SysDept sysDept = sysDept2Mapper.selectDeptByCode(serviceTask.getLeavehospitaldistrictcode(), null);
                 serviceTask.setLeavehospitaldistrictname(sysDept.getDeptName());
             }
             if (serviceTaskVO.getLongTask() == 1) serviceTask.setSendState(2L);
@@ -3210,6 +3259,20 @@
         serviceSubtaskCountReq.setGroupKey(groupKey);
         // 鍒嗙粍鍒椾笌杩囨护鍒椾繚鎸佷竴鑷达細绂婚櫌绉戝 leaveldeptcode銆佸湪闄㈢瀹� deptcode
         serviceSubtaskCountReq.setGroupColumn(groupKey);
+        /*
+         * 婊℃剰搴︺�岀梾鍖虹粺璁°�嶏紙绂婚櫌缁村害锛夛細鍑洪櫌鐥呭尯涓虹┖鍒欏洖閫�鍒板湪闄㈢梾鍖恒��
+         * 婊℃剰搴﹀瓙浠诲姟锛坰ervice_type 6/14/15/16锛夌殑 leavehospitaldistrictcode 绾︿笁鎴愪负绌猴紝
+         * 涔嬪墠涓轰簡鈥滄煡寰楀埌鏁版嵁鈥濇妸鐥呭尯鏉′欢鍐欐垚 `xxx IS NULL OR xxx IN (...)`锛�
+         * 浜庢槸閫変簡 A 鐥呭尯涔熶細鎶婄┖鐥呭尯鐨勫叏閲忔暟鎹甫杩涙潵锛屽啀缁熶竴褰掑埌 'Unknown' 缁勶紝
+         * 璇ョ粍鐨勭梾鍖哄悕鍙堟槸 MAX(hospitaldistrictname) 闅忎究鎸戠殑 鈥斺�� 琛ㄧ幇灏辨槸
+         * 鈥滈�変簡琛�娑插唴绉戠梾鍖猴紝鍗存煡鍑轰竴琛屾樉绀洪绉戜腑蹇冧笁鐥呭尯鈥濄��
+         * 鐢ㄢ�滄湁鏁堢梾鍖衡�濆垪杩囨护 + 鍒嗙粍鍚庯細绛涢�夌湡姝g敓鏁堬紝绌虹梾鍖虹殑璁板綍涔熷洖鍒板畠鐪熷疄鐨勫湪闄㈢梾鍖恒��
+         */
+        if ("leavehospitaldistrictcode".equals(groupKey)) {
+            String districtColumn = "IFNULL(leavehospitaldistrictcode, hospitaldistrictcode)";
+            serviceSubtaskCountReq.setGroupColumn(districtColumn);
+            serviceSubtaskCountReq.setDistrictColumn(districtColumn);
+        }
         //鍒嗙粍閿泦鍚堬細杩欎竴姝ヤ繚鎸佷笉鍙橈紙鍒嗛〉鍙傛暟鐓ф棫浣滅敤鍦ㄨ鏌ヨ涓婏級锛屼繚璇佲�滃弬涓庣粺璁$殑鍒嗙粍鈥濅笌鏀归�犲墠涓�鑷�
         List<String> groupKeyList = serviceSubtaskMapper.getSfStatisticsGroupKey(serviceSubtaskCountReq);
         /*
@@ -3284,6 +3347,24 @@
             serviceSubtaskStatistics.add(statistic);
         }
 
+        /*
+         * 鐥呭尯缁熻锛氳繖涓�琛岀殑鐥呭尯灏辨槸鍒嗙粍閿湰韬紝灞曠ず鍚嶅彇璇ョ粍鑷繁鐨勭梾鍖哄悕銆�
+         * 鑱氬悎 SQL 閲屽師鏉ョ殑 MAX(hospitaldistrictname) 鍦ㄢ�滀竴涓粍娣蜂簡澶氫釜鐥呭尯鈥濇椂浼氭寫鍑�
+         * 涓�涓涓嶇浉骞茬殑鐥呭尯鍚嶏紙閫夎娑插唴绉戠梾鍖烘樉绀烘垚楠ㄧ涓績涓夌梾鍖哄氨鏄繖涔堟潵鐨勶級銆�
+         * 杩欓噷鎶婂垎缁勯敭鍥炲~鍒板湪闄�/绂婚櫌涓ゅ鐥呭尯瀛楁锛屼繚璇佸墠绔笉璁鸿鍝竴鍒楅兘鏄悓涓�涓梾鍖猴紝
+         * 涔熻鈥滄煡鐪嬭鎯呪�濆甫涓婃潵鐨勭梾鍖虹紪鐮佽兘鏌ュ洖鍚屼竴鎵规暟鎹��
+         */
+        if (StringUtils.isNotEmpty(serviceSubtaskCountReq.getDistrictColumn())) {
+            for (ServiceSubtaskStatistic statistic : serviceSubtaskStatistics) {
+                String districtCode = statistic.getGroupCode() == null ? "Unknown" : statistic.getGroupCode();
+                String districtName = StringUtils.isNotEmpty(statistic.getGroupName()) ? statistic.getGroupName() : districtCode;
+                statistic.setLeavehospitaldistrictcode(districtCode);
+                statistic.setLeavehospitaldistrictname(districtName);
+                statistic.setHospitaldistrictcode(districtCode);
+                statistic.setHospitaldistrictname(districtName);
+            }
+        }
+
         //鑾峰彇鍙婃椂鐜囩粺璁″悎闆嗭紙涓�娆℃壒閲忔煡璇紝涓嶆寜鍒嗙粍寰幆鏌ワ級
         Map<String, Map<String, Object>> jsRates = getSsRateForSfStatistics(serviceSubtaskCountReq, statisticsGroupKeys);
         for (ServiceSubtaskStatistic statistic : serviceSubtaskStatistics) {
@@ -3313,7 +3394,9 @@
                     sum = new BigDecimal(serviceSubtaskStatistic.getJoyAllCount());
                 }
                 if (sum.intValue() != 0) {
-                    finishedPercentage = finishedSum.divide(sum, 2, RoundingMode.HALF_UP).doubleValue();
+                    // 鍘熸潵鍙繚鐣� 2 浣嶅皬鏁帮紙23634/26106 浼氳鎴垚 0.91锛夛紝鍓嶇鍐� 脳100
+                    // 灏辨樉绀烘垚 91.00%锛屼笌瀹為檯鐨� 90.53% 宸簡鍗婁釜鐧惧垎鐐广�傝繖閲屼繚鐣� 4 浣嶃��
+                    finishedPercentage = finishedSum.divide(sum, 4, RoundingMode.HALF_UP).doubleValue();
                 }
                 serviceSubtaskStatistic.setJoyAllCount(sum.intValue());
                 serviceSubtaskStatistic.setJoyCount(finishedSum.intValue());
@@ -3574,6 +3657,55 @@
         return serviceSubtaskMapper.getCurrentUserServiceSubtaskCount(entity);
     }
 
+    /**
+     * 褰撳墠鐧诲綍浜哄緟澶勭悊闅忚浠诲姟锛屾寜鍑洪櫌骞存湀鍒嗙粍缁熻锛堝嚭闄㈤殢璁裤�侀棬璇婇殢璁垮垎寮�璁℃暟锛�
+     * <p>
+     * 鍙繑鍥炴湁鏁版嵁鐨勬湀浠斤紝鍓嶇鎸夈�屽綋鏈� + 鍓� 3 涓湀銆嶈ˉ榻愶紝娌℃湁鏁版嵁鏄剧ず 0 涓��
+     */
+    @Override
+    public Map<String, Object> getPendingManualTaskMonthStats(ServiceSubtaskEntity entity) {
+        List<Map<String, Object>> rows = serviceSubtaskMapper.countPendingManualTaskByMonth(entity);
+        List<Map<String, Object>> months = new ArrayList<>();
+        long total = 0L;
+        if (rows != null) {
+            for (Map<String, Object> row : rows) {
+                if (row == null || row.get("month") == null) {
+                    continue;
+                }
+                long dischargeCount = parsePendingCount(row.get("dischargeCnt"));
+                long outpatientCount = parsePendingCount(row.get("outpatientCnt"));
+                if (dischargeCount <= 0 && outpatientCount <= 0) {
+                    continue;
+                }
+                Map<String, Object> item = new LinkedHashMap<>();
+                item.put("month", row.get("month").toString());
+                item.put("dischargeCount", dischargeCount);
+                item.put("outpatientCount", outpatientCount);
+                months.add(item);
+                total += dischargeCount + outpatientCount;
+            }
+        }
+        Map<String, Object> result = new LinkedHashMap<>();
+        result.put("total", total);
+        result.put("months", months);
+        return result;
+    }
+
+    /**
+     * 缁熻缁撴灉閲岀殑鏁伴噺杞� long锛岃В鏋愬け璐ユ寜 0 澶勭悊
+     */
+    private long parsePendingCount(Object value) {
+        if (value == null) {
+            return 0L;
+        }
+        try {
+            return Long.parseLong(value.toString());
+        } catch (NumberFormatException e) {
+            log.warn("缁熻寰呭鐞嗛殢璁夸换鍔″け璐ワ紝鏁伴噺鏃犳硶瑙f瀽锛歿}", value);
+            return 0L;
+        }
+    }
+
     @Override
     public Map<String, Object> getContinueNurseCount(ServiceSubtaskCotinueCountVO vo) {
         boolean hasDistrict = !CollectionUtils.isEmpty(vo.getLeavehospitaldistrictcodes());
@@ -3641,8 +3773,8 @@
     public void setFailSubTaskDefalutVal(Long failDay) {
         //1.鍏堝幓sys_config涓紝鑾峰彇鍝簺绉戝鎴栫梾鍖洪渶瑕侀粯璁ら棶鍗烽粯璁ゅ��
         IConfigService configService = SpringUtils.getBean(IConfigService.class);
-        String deptConfigValue = taskSysConfigPort.selectConfigValue("hosp.default.dept");
-        String wardConfigValue = taskSysConfigPort.selectConfigValue("hosp.default.ward");
+        String deptConfigValue = sysConfigService.selectConfigByKey("hosp.default.dept");
+        String wardConfigValue = sysConfigService.selectConfigByKey("hosp.default.ward");
         List<String> leaveWard = null;
         List<String> leaveDept = null;
         if (deptConfigValue != null && !deptConfigValue.isEmpty()) {
@@ -3870,8 +4002,8 @@
 
         // 鍙傛暟鍊肩粡绔彛鍙栫敤锛堝師涓� sysConfigMapper.checkConfigKeyUnique + getConfigValue锛夈��
         // 璇箟绛変环锛氬師鍒ゅ畾"琛屽瓨鍦�"銆佽繖閲屽垽瀹�"鍊奸潪 null"锛岃�� sys_config.config_value 鏄�
-        // varchar(500) NOT NULL DEFAULT '' 鈬� 浜岃�呬笉鍙兘涓嶅悓锛堣瑙� TaskSysConfigPort javadoc锛夈��
-        String smsContemt = taskSysConfigPort.findConfigValueByKey("wj.sms.template");
+        // varchar(500) NOT NULL DEFAULT '' 鈬� 浜岃�呬笉鍙兘涓嶅悓锛堣瑙� ISysConfigService javadoc锛夈��
+        String smsContemt = sysConfigService.selectConfigByKey("wj.sms.template");
 
         if (smsContemt != null) {
             sendMagParam.setContent(smsContemt.replace("${wjurl}", sendMagParam.getUrl()));
@@ -4214,7 +4346,7 @@
             return null;
         }
         try {
-            SysDept sysDept = taskSysDeptPort.selectDeptByCode(deptCode, orgid);
+            SysDept sysDept = sysDept2Mapper.selectDeptByCode(deptCode, orgid);
             return sysDept == null ? null : sysDept.getCampusid();
         } catch (Exception e) {
             log.warn("鎸夌紪鐮佸弽鏌ラ櫌鍖哄け璐ワ細deptCode={}, orgid={}, err={}", deptCode, orgid, e.getMessage());

--
Gitblit v1.9.3