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/domain/ServiceSubtaskStatistic.java | 10 +
ruoyi-task/src/main/java/com/ruoyi/task/controller/ServiceSubtaskController.java | 13 +
ruoyi-satisfaction/src/main/java/com/ruoyi/satisfaction/api/DefaultSatisfactionApi.java | 7
ruoyi-task/src/main/java/com/ruoyi/task/service/impl/ServiceSubtaskServiceImpl.java | 93 +++++++++++
ruoyi-inhospvisit/src/main/java/com/ruoyi/inhospvisit/support/VisitSubtaskFactory.java | 37 +++
ruoyi-task/src/main/resources/mapper/task/ServiceSubtaskMapper.xml | 230 +++++++++++++++++++++++-----
ruoyi-admin/src/main/resources/application.yml | 2
ruoyi-task/src/main/java/com/ruoyi/task/domain/ServiceSubtaskCountReq.java | 31 +++
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskAnswerServiceImpl.java | 21 ++
9 files changed, 383 insertions(+), 61 deletions(-)
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index 30df966..f2039f0 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -78,7 +78,7 @@
# 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
basename: i18n/messages
profiles:
- active: sltd
+ active: nhfy
# 鏂囦欢涓婁紶
servlet:
diff --git a/ruoyi-inhospvisit/src/main/java/com/ruoyi/inhospvisit/support/VisitSubtaskFactory.java b/ruoyi-inhospvisit/src/main/java/com/ruoyi/inhospvisit/support/VisitSubtaskFactory.java
index 3b6de07..a130624 100644
--- a/ruoyi-inhospvisit/src/main/java/com/ruoyi/inhospvisit/support/VisitSubtaskFactory.java
+++ b/ruoyi-inhospvisit/src/main/java/com/ruoyi/inhospvisit/support/VisitSubtaskFactory.java
@@ -49,12 +49,25 @@
* 瀹為檯瀹炵幇鏃舵妸瀹冩敹绐勪负"绾粍瑁� + 绾伐鍏�"锛屽洜涓� {@code writeInSubTask}锛�232 琛岋級閲屾湁澶ч噺
* 鍐欏簱涓庡幓閲嶇紪鎺掞紝娣峰湪涓�璧蜂細璁╂湰绫荤殑 A 妗i�愯绛変环鎺㈤拡澶卞幓鎰忎箟銆�
*
- * <h3>鈿狅笍 鍞竴鐨�"闈炴惉杩�"琛岋細{@code hospno}</h3>
- * {@link #boxedServiceSubtask} 閲屽浜嗕竴鍙� {@code d.setHospno(inhosp.getInhospno())}銆�
- * 鍘熷疄鐜扮‘瀹�<b>娌℃湁</b>杩欎竴鍙ワ紝鎵�浠ュ嚭闄㈤摼璺殑 {@code service_subtask.hospno} 涓�鐩磋惤绌猴紱
- * 鑰� {@code ServiceSubtask.hospno} 鐨勮涔夊氨鏄�"灏辫瘖缂栧彿锛堝搴旂殑 outhospno銆乮nhospno锛�"銆�
- * 杩欐槸<b>鏈夋剰琛ラ綈</b>锛屼笉鏄妱婕� 鈥斺�� 鍙嶅悜鎺㈤拡锛坽@code verify_inhospvisit_boxed_fields.py}锛�
- * 鍙牎楠�"鍘� setter 鏄惁閮芥湁瀵瑰簲璋冪敤"锛屼笉浼氬洜姝ゆ姤閿欍��
+ * <h3>鈿狅笍 涓ゅ鏈夋剰鐨�"闈炴惉杩�"琛�</h3>
+ * <ol>
+ * <li><b>{@code hospno}</b>锛歿@link #boxedServiceSubtask} 閲屽浜嗕竴鍙�
+ * {@code d.setHospno(inhosp.getInhospno())}銆傚師瀹炵幇纭疄<b>娌℃湁</b>杩欎竴鍙ワ紝
+ * 鎵�浠ュ嚭闄㈤摼璺殑 {@code service_subtask.hospno} 涓�鐩磋惤绌猴紱
+ * 鑰� {@code ServiceSubtask.hospno} 鐨勮涔夊氨鏄�"灏辫瘖缂栧彿锛堝搴旂殑 outhospno銆乮nhospno锛�"銆�
+ * 杩欐槸<b>鏈夋剰琛ラ綈</b>锛屼笉鏄妱婕� 鈥斺�� 鍙嶅悜鎺㈤拡锛坽@code verify_inhospvisit_boxed_fields.py}锛�
+ * 鍙牎楠�"鍘� setter 鏄惁閮芥湁瀵瑰簲璋冪敤"锛屼笉浼氬洜姝ゆ姤閿欍��</li>
+ * <li><b>campusid 涓嶅啀琚┖鍊艰鐩�</b>锛�2026-10-29 淇級锛氬師瀹炵幇鏃犳潯浠�
+ * {@code d.setCampusid(inhosp.getCampusid())}锛屼細鎶婁粠闀挎湡浠诲姟鎼潵鐨勯櫌鍖烘姽鎴� {@code null}銆�
+ * 鍚庢灉鏄换鍔¤惤搴� {@code campusid=NULL}锛岃�岄殢璁垮垪琛ㄦ帴鍙�
+ * 锛坽@code ServiceSubtaskController#patItem}锛夊己鍒剁敤鐧诲綍鐢ㄦ埛鐨勯櫌鍖鸿繃婊�
+ * 锛坽@code and campusid = #{campusid}}锛夛紝NULL 涓嶅尮閰嶄换浣曞�� 鈫�
+ * <b>浠诲姟瀛樺湪銆侀〉闈㈡案杩滄煡涓嶅埌</b>銆傚疄娴嬪崡鍗庨檮涓� 2026-07 鏈� 894 鏉¤繖鏍�"鐢熸垚浜嗕絾涓嶆樉绀�"鐨�
+ * 鍑洪櫌闅忚浠诲姟锛堝叾涓绉戜腑蹇冧竴鐥呭尯 25 鏉★級銆傜幇鏀逛负"鍑洪櫌璁板綍鏈夐櫌鍖烘墠瑕嗙洊"銆�
+ * 鈿狅笍 杩欐槸<b>琛屼负鍙樻洿</b>锛堜笉鏄瓑浠锋惉杩侊級锛岃Е鍙戞潯浠跺彧鏈�"鍑洪櫌璁板綍闄㈠尯涓虹┖"杩欎竴绉嶏紝
+ * 鍏朵綑鎯呭喌浠嶄笌鍘熷疄鐜板畬鍏ㄤ竴鑷淬�傚巻鍙叉暟鎹洖濉剼鏈細
+ * {@code sql/fix_nhfy_鍑洪櫌闅忚浠诲姟闄㈠尯鐥呭尯鍥炲~_20261029.sql}銆�</li>
+ * </ol>
*/
@Slf4j
@Component
@@ -157,7 +170,17 @@
d.setAge(archive.getAge());
// ---- 鍘� L1147-1163 ----
d.setSendstate(2L);
- d.setCampusid(inhosp.getCampusid());
+ // 鈿狅笍 绗簩澶勩�愭湁鎰忓亸绂诲師瀹炵幇銆戯紙2026-10-29锛岃绫绘敞閲�"campusid 涓嶅啀琚┖鍊艰鐩�"锛夛細
+ // 鍘熷疄鐜版棤鏉′欢 d.setCampusid(inhosp.getCampusid())锛屼細鎶婁笂闈粠闀挎湡浠诲姟鎼潵鐨勯櫌鍖烘姽鎴� null銆�
+ // 绾夸笂鍚庢灉锛氫换鍔¤惤搴� campusid=NULL 鈫�
+ // ServiceSubtaskController#patItem 寮哄埗 setCampusid(鐧诲綍鐢ㄦ埛闄㈠尯)锛�
+ // SQL 鏉′欢 `and campusid = #{campusid}` 鈫� 璇ヤ换鍔″浠讳綍浜洪兘涓嶆樉绀猴紙"鐢熸垚浜嗕絾鏌ヤ笉鍒�"锛夈��
+ // 瀹炴祴鍗楀崕闄勪竴 2026-07锛�894 鏉″嚭闄㈤殢璁夸换鍔″洜姝ゅ湪椤甸潰涓婁笉鍙
+ // 锛堝叾涓绉戜腑蹇冧竴鐥呭尯 25 鏉★紝姝f槸"鍑洪櫌 475 鏉� / 闅忚 444 鏉�"鐨勬潵婧愶級銆�
+ // 杩欓噷鏀逛负"鍑洪櫌璁板綍鏈夐櫌鍖烘墠瑕嗙洊"锛屽嚭闄㈣褰曞彇涓嶅埌鏃朵繚鐣欎换鍔¤嚜甯︾殑闄㈠尯銆�
+ if (StringUtils.isNotEmpty(inhosp.getCampusid())) {
+ d.setCampusid(inhosp.getCampusid());
+ }
d.setManagementDoctor(inhosp.getManagementDoctor());
d.setManagementDoctorCode(inhosp.getManagementDoctorCode());
d.setStarttime(inhosp.getStarttime());
diff --git a/ruoyi-satisfaction/src/main/java/com/ruoyi/satisfaction/api/DefaultSatisfactionApi.java b/ruoyi-satisfaction/src/main/java/com/ruoyi/satisfaction/api/DefaultSatisfactionApi.java
index 8d346bd..2cb4336 100644
--- a/ruoyi-satisfaction/src/main/java/com/ruoyi/satisfaction/api/DefaultSatisfactionApi.java
+++ b/ruoyi-satisfaction/src/main/java/com/ruoyi/satisfaction/api/DefaultSatisfactionApi.java
@@ -3,6 +3,7 @@
import com.ruoyi.satisfaction.domain.ServiceSubtaskDetailRatioExport;
import com.ruoyi.satisfaction.service.SatisfactionSubtaskService;
import com.ruoyi.satisfaction.support.MydOptionRatioChartBuilder;
+import com.ruoyi.satisfaction.support.MydOptionRatioPieChartBuilder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@@ -53,8 +54,12 @@
// 娌℃湁琛屾椂涓嶇粰鍥捐〃鏋勫缓鍣細ExcelUtil 浼氳烦杩囪 Sheet锛堜笌鍘熷疄鐜�"绌烘暟鎹笉鐢诲浘"涓�鑷达級
return new SatisfactionExportBundle(rows, ServiceSubtaskDetailRatioExport.class, null);
}
+ // 涓�涓� Sheet 鏌辩姸鍥撅紙鍘熸湁锛夛紝涓�涓� Sheet 楗煎浘锛堟寜棰樼洰涓�寮狅紝甯︾櫨鍒嗘瘮鍜屽浘渚嬶級
return new SatisfactionExportBundle(rows, ServiceSubtaskDetailRatioExport.class,
- new MydOptionRatioChartBuilder(rows));
+ workbook -> {
+ new MydOptionRatioChartBuilder(rows).build(workbook);
+ new MydOptionRatioPieChartBuilder(rows, null).build(workbook);
+ });
}
@Override
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 0a8d93c..78393a6 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
@@ -887,7 +887,7 @@
* <p>
* 鍙e緞锛歴ervice_subtask 涓�
* service_type = '2' 鍑洪櫌闅忚 / '3' 闂ㄨ瘖闅忚
- * + 寰呴殢璁跨姸鎬侊紙sendstate in 1,2,3,5,7锛�
+ * + 寰呴殢璁跨姸鎬侊紙sendstate in 1,2,3,7锛屽彂閫佸け璐�(5) 涓嶈鍏ワ級
* + 鍑洪櫌婊� 7 澶╋紙鍚��7 澶╁墠閭d竴澶┿�嶅嚭闄㈢殑鎮h�咃級
* + 鍙湅鏈�杩� 4 涓嚭闄㈡湀浠斤紙鍚綋鏈堬級锛�
* 绉戝/鐥呭尯鏉冮檺鍙� OR锛堜笌闅忚鍒楄〃 deptOrDistrict=2 涓�鑷达級銆�
@@ -921,9 +921,10 @@
List<SysUserDept> sysUserWards = sysUserDeptService.selectSysUserDeptList(wardQuery);
boolean isAdmin = "admin".equals(sysUser.getUserName());
+ // 娌℃湁绉戝/鐥呭尯閰嶇疆鐨勮处鍙凤紙濡傞儴鍒嗙鐞嗗憳璐﹀彿锛夛紝鍒楄〃鏈韩鏄寜 鏈烘瀯+闄㈠尯 鏌ョ殑锛�
+ // 杩欓噷涔熸寜鍚屾牱鍙e緞缁熻锛屽惁鍒欏垪琛ㄦ湁鏁版嵁銆佸崱鐗囧嵈鍏ㄦ槸 0銆�
if (!isAdmin && CollectionUtils.isEmpty(sysUserDepts) && CollectionUtils.isEmpty(sysUserWards)) {
- // 鏃㈡病鏈夌瀹や篃娌℃湁鐥呭尯鏉冮檺鏃朵笉缁熻锛岄伩鍏嶈秺鏉冪湅鍒板叏鏈烘瀯鏁版嵁
- return result;
+ log.info("[pendingTaskMonthStats] 鐢ㄦ埛 {} 鏈厤缃瀹�/鐥呭尯锛屾寜鏈烘瀯+闄㈠尯缁熻", sysUser.getUserName());
}
// sys_user_dept 閲屽悓涓�绉戝/鐥呭尯浼氶噸澶嶅緢澶氳锛屽幓閲嶅悗鍐嶆嫾 IN锛岄伩鍏� SQL 鍙傛暟杩囧
@@ -940,6 +941,8 @@
ServiceSubtaskEntity entity = new ServiceSubtaskEntity();
entity.setOrgid(sysUser.getOrgid());
+ // 涓庡垪琛ㄤ竴鑷达細鎸夌櫥褰曚細璇濋噷鐨勯櫌鍖鸿繃婊わ紙鐧诲綍椤甸�夋嫨鐨勯櫌鍖猴級
+ entity.setCampusid(sysUser.getCampusid());
entity.setLeaveldeptcodes(deptCodes);
entity.setLeavehospitaldistrictcodes(wardCodes);
@@ -1060,9 +1063,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)
diff --git a/ruoyi-task/src/main/java/com/ruoyi/task/domain/ServiceSubtaskCountReq.java b/ruoyi-task/src/main/java/com/ruoyi/task/domain/ServiceSubtaskCountReq.java
index 1a090a7..1dc4a6a 100644
--- a/ruoyi-task/src/main/java/com/ruoyi/task/domain/ServiceSubtaskCountReq.java
+++ b/ruoyi-task/src/main/java/com/ruoyi/task/domain/ServiceSubtaskCountReq.java
@@ -183,6 +183,37 @@
private String groupKey;
/**
+ * 鐥呭尯缁熻锛堢闄㈢淮搴︼級瀹為檯浣跨敤鐨勨�滄湁鏁堢梾鍖衡�濆垪琛ㄨ揪寮忥紙浠呮湇鍔$鍐呴儴浣跨敤锛夈��
+ * <p>
+ * 婊℃剰搴﹀瓙浠诲姟锛坰ervice_type 6/14/15/16锛夌殑 {@code leavehospitaldistrictcode} 绾︿笁鎴愪负绌猴紝
+ * 鏃у啓娉曟妸绌哄�煎綋鎴愨�滀笉闄愨�濇斁琛岋紙{@code xxx IS NULL OR xxx IN (...)}锛夛紝
+ * 缁撴灉閫変腑 A 鐥呭尯鏃朵細鎶婄┖鐥呭尯鐨勮褰曞叏甯﹁繘鏉ワ紝鍐嶆寜
+ * {@code IFNULL(leavehospitaldistrictcode,'Unknown')} 褰掓垚涓�涓粍锛�
+ * 杩欎竴缁勭殑鐥呭尯鍚嶅張鏄� {@code MAX(hospitaldistrictname)} 闅忎究鎸戠殑銆�
+ * <p>
+ * 杩欓噷缁欏嚭鈥滃嚭闄㈢梾鍖轰负绌哄垯鍥為��鍒板湪闄㈢梾鍖衡�濈殑琛ㄨ揪寮忥紝杩囨护涓庡垎缁勯兘鏀圭敤瀹冿紝
+ * 绌虹梾鍖虹殑璁板綍鍥犳鍥炲埌瀹冪湡姝g殑鍦ㄩ櫌鐥呭尯锛岃�屼笉鏄薄鏌撶敤鎴烽�変腑鐨勭梾鍖恒��
+ * 涓� null 鏃朵繚鎸佸巻鍙茶涓猴紙鍏煎鍏跺畠璋冪敤鏂癸級銆�
+ */
+ @JsonIgnore
+ private String districtColumn;
+
+ /**
+ * 鍒嗛〉鍋忕Щ閲忥紙浠呮湇鍔$鍐呴儴浣跨敤锛夈��
+ * <p>
+ * pageNum 鏄� 1 璧峰鐨勶紝鑰屽巻鍙插啓娉曠洿鎺ユ妸瀹冨綋 SQL 鐨� OFFSET 鐢�
+ * 锛坽@code limit 20 OFFSET 1}锛夛紝绗竴椤典細鍑┖璺虫帀绗竴鏉″垎缁勬暟鎹��
+ */
+ @JsonIgnore
+ public Integer getPageOffset() {
+ if (pageSize == null) {
+ return null;
+ }
+ int current = (pageNum == null || pageNum < 1) ? 1 : pageNum;
+ return (current - 1) * pageSize;
+ }
+
+ /**
* 闅忚缁熻鏂瑰紡 1-榛樿缁熻鏂瑰紡 2-缁熻鏃剁畻涓婁笉鍙戦�佺殑 3-鍙粺璁″凡瀹屾垚鐨�
*/
@ApiModelProperty(value = "缁熻鏂瑰紡")
diff --git a/ruoyi-task/src/main/java/com/ruoyi/task/domain/ServiceSubtaskStatistic.java b/ruoyi-task/src/main/java/com/ruoyi/task/domain/ServiceSubtaskStatistic.java
index 2a8e164..d840716 100644
--- a/ruoyi-task/src/main/java/com/ruoyi/task/domain/ServiceSubtaskStatistic.java
+++ b/ruoyi-task/src/main/java/com/ruoyi/task/domain/ServiceSubtaskStatistic.java
@@ -377,6 +377,16 @@
private String groupCode;
/**
+ * 鍒嗙粍閿搴旂殑鏄剧ず鍚嶏紙鐥呭尯缁熻鏃跺嵆璇ョ粍鐨勭梾鍖哄悕锛夈��
+ * <p>
+ * 浠呮湇鍔$鍐呴儴浣跨敤锛氬師鏉ョ梾鍖哄垪鍙栫殑鏄� {@code MAX(hospitaldistrictname)}锛�
+ * 涓�涓粍閲屾贩浜嗗涓梾鍖烘椂灏变細闅忔満鏄剧ず鍏朵腑涓�涓紙閫夎娑插唴绉戠梾鍖哄嵈鏄剧ず鈥滈绉戜腑蹇冧笁鐥呭尯鈥濓級銆�
+ * 鏀规垚鎸夊垎缁勯敭鍙栧悕瀛楋紝鍐嶅洖濉埌鐥呭尯 code/name 瀛楁銆�
+ */
+ @JsonIgnore
+ private String groupName;
+
+ /**
* 棣栨闅忚璁板綍鏁帮紙visit_count = 1 鐨勮鏁帮級銆�
* <p>
* 浠呮湇鍔$鍐呴儴浣跨敤锛氬師鍐呭瓨缁熻閲屸�滈娆¢殢璁跨巼鈥濆彧鍦ㄨ鍒嗙粍瀛樺湪棣栨闅忚璁板綍鏃舵墠浼氳璧嬪��
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 12ad312..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
@@ -538,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)
@@ -809,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 鍗曚竴浠诲姟锛堥殢璁匡級
@@ -850,6 +894,8 @@
}
serviceSubtask.setCreateTime(DateUtils.getNowDate());
+ // 鍙e緞锛�2026-10-29 涓氬姟纭锛夛細鍑洪櫌闅忚鐨勭瀹�/鐥呭尯涓�寰嬩互鍑洪櫌璁板綍涓哄噯
+ alignDischargeWardFromInhosp(serviceSubtask);
serviceSubtaskMapper.insertServiceSubtask(serviceSubtask);
//淇敼浣忛櫌婊℃剰搴︾姸鎬侊紙閬垮厤閲嶅鏌ヨ锛�
if (serviceSubtask.getServiceType() != null && "6".equals(serviceSubtask.getServiceType())) {
@@ -943,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) {
//鏂板鎴愬姛鍚庯紝闇�瑕佸皢涔嬪墠鐨勪换鍔¤缃负涓嶈鍐嶉殢璁匡紙闃叉閲嶅鐐癸紝鐒跺悗閲嶅鐢熸垚锛�
@@ -3206,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);
/*
@@ -3280,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) {
@@ -3309,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());
diff --git a/ruoyi-task/src/main/resources/mapper/task/ServiceSubtaskMapper.xml b/ruoyi-task/src/main/resources/mapper/task/ServiceSubtaskMapper.xml
index dc7c0b4..ea2743c 100644
--- a/ruoyi-task/src/main/resources/mapper/task/ServiceSubtaskMapper.xml
+++ b/ruoyi-task/src/main/resources/mapper/task/ServiceSubtaskMapper.xml
@@ -1861,9 +1861,17 @@
<select id="getSfStatisticsGroupKey" parameterType="com.ruoyi.task.domain.ServiceSubtaskCountReq"
resultType="String">
select
- <if test="groupKey != null and groupKey != ''">
- ${groupKey} as groupKey
- </if>
+ <choose>
+ <when test="groupColumn != null and groupColumn != ''">
+ ${groupColumn} as groupKey
+ </when>
+ <when test="groupKey != null and groupKey != ''">
+ ${groupKey} as groupKey
+ </when>
+ <otherwise>
+ NULL as groupKey
+ </otherwise>
+ </choose>
from service_subtask
where 1=1
and del_flag = 0
@@ -1877,14 +1885,39 @@
鍗楀崕婊℃剰搴﹀瓙浠诲姟鐨� leavehospitaldistrictcode 鏈� 83%锛�3236/3811锛変负 NULL锛�
鍘熸潵銆岀瀹� AND 鐥呭尯銆嶄袱涓潯浠舵案杩滀笉鍙兘鍚屾椂鎴愮珛 鈫� 鏁村紶缁熻琛ㄧ┖銆�
鍒ょ┖鏀捐鍙奖鍝嶇梾鍖轰负绌虹殑璁板綍锛屾湁鐥呭尯鐨勬暟鎹涓轰笉鍙樸�� -->
- <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0">
- AND (leavehospitaldistrictcode IS NULL OR leavehospitaldistrictcode IN
- <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator=","
- close=")">
- #{leavehospitaldistrictcode}
- </foreach>
- )
- </if>
+ <choose>
+ <!-- 婊℃剰搴︾粺璁★紙getSfStatisticsScript锛夛細鏀圭敤鈥滄湁鏁堢梾鍖衡�濆垪锛�
+ 鍑洪櫌鐥呭尯涓虹┖鍒欏洖閫�鍒板湪闄㈢梾鍖恒�傜瓫閫夊洜姝ょ湡姝g敓鏁堬紝
+ 绌虹梾鍖虹殑璁板綍涔熶細褰掑埌瀹冪湡瀹炵殑鍦ㄩ櫌鐥呭尯锛岃�屼笉鏄贩杩涚敤鎴烽�変腑鐨勭梾鍖恒�� -->
+ <when test="districtColumn != null and districtColumn != ''">
+ <!-- 鍑洪櫌鐥呭尯涓虹┖鍥為��鍒板湪闄㈢梾鍖恒�傝繖閲屽埢鎰忓啓鎴� OR 灞曞紑鑰屼笉鏄� IFNULL(a,b) IN (...)锛�
+ 鍒楄鍑芥暟鍖呬綇灏辩敤涓嶄簡绱㈠紩锛�56 涓囪鏄庣粏琛ㄤ笂鏄叏琛ㄦ壂锛堝疄娴� 5.1s 鈫� 0.7s锛夈��
+ 涓や釜鍒嗘敮鍒嗗埆鍛戒腑 idx_ss_district_pair 鐨� (leave..., hospital...) 鍓嶇紑銆� -->
+ <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0">
+ AND (leavehospitaldistrictcode IN
+ <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator=","
+ close=")">
+ #{leavehospitaldistrictcode}
+ </foreach>
+ OR (leavehospitaldistrictcode IS NULL AND hospitaldistrictcode IN
+ <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator=","
+ close=")">
+ #{leavehospitaldistrictcode}
+ </foreach>
+ ))
+ </if>
+ </when>
+ <otherwise>
+ <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0">
+ AND (leavehospitaldistrictcode IS NULL OR leavehospitaldistrictcode IN
+ <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator=","
+ close=")">
+ #{leavehospitaldistrictcode}
+ </foreach>
+ )
+ </if>
+ </otherwise>
+ </choose>
<if test="leaveldeptcodes != null and leaveldeptcodes.size() > 0">
AND leaveldeptcode IN
<foreach collection="leaveldeptcodes" item="leaveldeptcode" open="(" separator=","
@@ -1947,11 +1980,20 @@
<if test="visitCount != null and visitCount > 1">
AND visit_count > 1
</if>
- <if test="groupKey != null and groupKey != ''">
- group by ${groupKey}
- </if>
+ <choose>
+ <when test="groupColumn != null and groupColumn != ''">
+ group by ${groupColumn}
+ order by ${groupColumn}
+ </when>
+ <when test="groupKey != null and groupKey != ''">
+ group by ${groupKey}
+ order by ${groupKey}
+ </when>
+ </choose>
+ <!-- pageNum 鏄� 1 璧峰鐨勶紝OFFSET 蹇呴』鐢� (pageNum-1)*pageSize锛�
+ 浠ュ墠鐩存帴鍐� OFFSET ${pageNum}锛岀涓�椤典細璺虫帀绗竴鏉″垎缁勩�� -->
<if test="pageSize != null and pageNum != null">
- limit ${pageSize} OFFSET ${pageNum}
+ limit ${pageSize} OFFSET ${pageOffset}
</if>
</select>
@@ -1977,6 +2019,8 @@
-->
<resultMap type="com.ruoyi.task.domain.ServiceSubtaskStatistic" id="ServiceSubtaskScriptStatisticResult">
<result property="groupCode" column="group_code"/>
+ <result property="groupName" column="group_name"/>
+ <result property="dischargeCount" column="discharge_count"/>
<result property="firstVisitCount" column="first_visit_count"/>
<result property="againVisitCount" column="again_visit_count"/>
<result property="drcode" column="drcode"/>
@@ -2025,6 +2069,10 @@
resultMap="ServiceSubtaskScriptStatisticResult">
select
IFNULL(${groupColumn}, 'Unknown') as group_code,
+ <!-- 鍒嗙粍閿搴旂殑鏄剧ず鍚嶏細鐥呭尯缁熻鏃跺氨鏄繖涓�缁勭殑鐥呭尯鍚嶃��
+ 浠ュ墠杩欎竴鍒楁槸 MAX(hospitaldistrictname)锛屼竴涓粍娣蜂簡澶氫釜鐥呭尯鏃朵細闅忔満鏄剧ず鍏朵腑涓�涓紝
+ 浜庢槸鍑虹幇鈥滈�夎娑插唴绉戠梾鍖哄嵈鏄剧ず楠ㄧ涓績涓夌梾鍖衡�濄�� -->
+ MAX(IFNULL(leavehospitaldistrictname, hospitaldistrictname)) as group_name,
MAX(drcode) as drcode,
MAX(drname) as drname,
MAX(leaveldeptcode) as deptcode,
@@ -2056,7 +2104,10 @@
SUM(CASE WHEN visit_count > 1 and sendstate is not null and current_preachform = '3' THEN 1 ELSE 0 END) as voice_again,
SUM(CASE WHEN visit_count > 1 and sendstate is not null and current_preachform = '4' THEN 1 ELSE 0 END) as sms_again,
SUM(CASE WHEN visit_count > 1 and sendstate is not null and current_preachform = '5' THEN 1 ELSE 0 END) as we_chat_again,
- SUM(CASE WHEN visit_count > 1 and sendstate is not null and excep = '1' THEN 1 ELSE 0 END) as abnormal_again
+ SUM(CASE WHEN visit_count > 1 and sendstate is not null and excep = '1' THEN 1 ELSE 0 END) as abnormal_again,
+ <!-- 鍑洪櫌浜烘锛氬師鏉ョ殑鍐呭瓨瀹炵幇鏄� serviceSubtaskList.size()锛屽嵆鍒嗙粍鍐呭懡涓殑瀛愪换鍔℃潯鏁般��
+ 鏀规垚鏈鍙ュ悗涓�鐩存病鏈夎仛鍚堣繖涓�鍒楋紝椤甸潰涓娾�滃嚭闄汉娆♀�濇亽涓� 0锛屼笌搴旈殢璁夸汉娆¤嚜鐩哥煕鐩俱�� -->
+ COUNT(*) as discharge_count
from service_subtask
where 1=1
and del_flag = 0
@@ -2066,14 +2117,37 @@
<if test="campusid != null and campusid != ''">
and campusid = #{campusid}
</if>
- <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0">
- AND (leavehospitaldistrictcode IS NULL OR leavehospitaldistrictcode IN
- <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator=","
- close=")">
- #{leavehospitaldistrictcode}
- </foreach>
- )
- </if>
+ <choose>
+ <!-- 婊℃剰搴︾粺璁★細鏀圭敤鈥滄湁鏁堢梾鍖衡�濆垪锛堝嚭闄㈢梾鍖轰负绌哄洖閫�鍦ㄩ櫌鐥呭尯锛夛紝绛涢�夋墠鐪熸鐢熸晥 -->
+ <when test="districtColumn != null and districtColumn != ''">
+ <!-- 鍑洪櫌鐥呭尯涓虹┖鍥為��鍒板湪闄㈢梾鍖恒�傝繖閲屽埢鎰忓啓鎴� OR 灞曞紑鑰屼笉鏄� IFNULL(a,b) IN (...)锛�
+ 鍒楄鍑芥暟鍖呬綇灏辩敤涓嶄簡绱㈠紩锛�56 涓囪鏄庣粏琛ㄤ笂鏄叏琛ㄦ壂锛堝疄娴� 5.1s 鈫� 0.7s锛夈��
+ 涓や釜鍒嗘敮鍒嗗埆鍛戒腑 idx_ss_district_pair 鐨� (leave..., hospital...) 鍓嶇紑銆� -->
+ <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0">
+ AND (leavehospitaldistrictcode IN
+ <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator=","
+ close=")">
+ #{leavehospitaldistrictcode}
+ </foreach>
+ OR (leavehospitaldistrictcode IS NULL AND hospitaldistrictcode IN
+ <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator=","
+ close=")">
+ #{leavehospitaldistrictcode}
+ </foreach>
+ ))
+ </if>
+ </when>
+ <otherwise>
+ <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0">
+ AND (leavehospitaldistrictcode IS NULL OR leavehospitaldistrictcode IN
+ <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator=","
+ close=")">
+ #{leavehospitaldistrictcode}
+ </foreach>
+ )
+ </if>
+ </otherwise>
+ </choose>
<if test="deptcodes != null and deptcodes.size() > 0">
AND leaveldeptcode IN
<foreach collection="deptcodes" item="deptcode" open="(" separator=","
@@ -2134,8 +2208,10 @@
<if test="visitCount != null and visitCount > 1">
AND visit_count > 1
</if>
- <if test="groupKey != null and groupKey != '' and groupKeyList != null and groupKeyList.size>0">
- AND IFNULL(${groupKey}, 'Unknown') IN
+ <!-- 杩囨护鍒楀繀椤讳笌 GROUP BY 鐨勫垪涓�鑷达細閮界敤 groupColumn锛堟弧鎰忓害鐥呭尯缁熻鏃跺畠鏄�
+ IFNULL(鍑洪櫌鐥呭尯, 鍦ㄩ櫌鐥呭尯) 杩欐牱鐨勮〃杈惧紡锛夛紝鍚﹀垯鑱氬悎鍑烘潵鐨勫垎缁勯敭杩囨护涓嶄笂锛岄鐩噺浼氬叏鍙� 0銆� -->
+ <if test="groupColumn != null and groupColumn != '' and groupKeyList != null and groupKeyList.size>0">
+ AND IFNULL(${groupColumn}, 'Unknown') IN
<foreach collection="groupKeyList" item="key" open="(" separator=","
close=")">
#{key}
@@ -2153,7 +2229,14 @@
<select id="getSfStatisticsScriptJoySum" parameterType="com.ruoyi.task.domain.ServiceSubtaskCountReq"
resultType="map">
select
- IFNULL(t.${groupColumn}, 'Unknown') as groupCode,
+ <choose>
+ <when test="districtColumn != null and districtColumn != ''">
+ IFNULL(${districtColumn}, 'Unknown') as groupCode,
+ </when>
+ <otherwise>
+ IFNULL(t.${groupColumn}, 'Unknown') as groupCode,
+ </otherwise>
+ </choose>
SUM(CASE WHEN a.categoryid IN(${configValue})
THEN 1 ELSE 0 END) as joyAllCount,
SUM(CASE WHEN a.categoryid IN(${configValue})
@@ -2171,14 +2254,38 @@
<if test="campusid != null and campusid != ''">
and t.campusid = #{campusid}
</if>
- <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0">
- AND (t.leavehospitaldistrictcode IS NULL OR t.leavehospitaldistrictcode IN
- <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator=","
- close=")">
- #{leavehospitaldistrictcode}
- </foreach>
- )
- </if>
+ <choose>
+ <!-- 婊℃剰搴︾粺璁★細涓庤仛鍚堜富鏌ヨ涓�鑷达紝鐢ㄢ�滄湁鏁堢梾鍖衡�濆垪杩囨护锛�
+ 鍚﹀垯棰樼洰閲忎細鍜屼富鏌ヨ鐨勮瀵逛笉涓婏紙鍒嗙粍閿笉涓�鏍凤紝杩囨护涓嶄笂灏卞叏鍙� 0锛夈�� -->
+ <when test="districtColumn != null and districtColumn != ''">
+ <!-- 鍑洪櫌鐥呭尯涓虹┖鍥為��鍒板湪闄㈢梾鍖恒�傝繖閲屽埢鎰忓啓鎴� OR 灞曞紑鑰屼笉鏄� IFNULL(a,b) IN (...)锛�
+ 鍒楄鍑芥暟鍖呬綇灏辩敤涓嶄簡绱㈠紩锛�56 涓囪鏄庣粏琛ㄤ笂鏄叏琛ㄦ壂锛堝疄娴� 5.1s 鈫� 0.7s锛夈��
+ 涓や釜鍒嗘敮鍒嗗埆鍛戒腑 idx_ss_district_pair 鐨� (leave..., hospital...) 鍓嶇紑銆� -->
+ <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0">
+ AND (leavehospitaldistrictcode IN
+ <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator=","
+ close=")">
+ #{leavehospitaldistrictcode}
+ </foreach>
+ OR (leavehospitaldistrictcode IS NULL AND hospitaldistrictcode IN
+ <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator=","
+ close=")">
+ #{leavehospitaldistrictcode}
+ </foreach>
+ ))
+ </if>
+ </when>
+ <otherwise>
+ <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0">
+ AND (t.leavehospitaldistrictcode IS NULL OR t.leavehospitaldistrictcode IN
+ <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator=","
+ close=")">
+ #{leavehospitaldistrictcode}
+ </foreach>
+ )
+ </if>
+ </otherwise>
+ </choose>
<if test="deptcodes != null and deptcodes.size() > 0">
AND t.leaveldeptcode IN
<foreach collection="deptcodes" item="deptcode" open="(" separator=","
@@ -2239,14 +2346,28 @@
<if test="visitCount != null and visitCount > 1">
AND t.visit_count > 1
</if>
- <if test="groupKey != null and groupKey != '' and groupKeyList != null and groupKeyList.size>0">
+ <if test="districtColumn != null and districtColumn != '' and groupKeyList != null and groupKeyList.size>0">
+ AND IFNULL(${districtColumn}, 'Unknown') IN
+ <foreach collection="groupKeyList" item="key" open="(" separator=","
+ close=")">
+ #{key}
+ </foreach>
+ </if>
+ <if test="(districtColumn == null or districtColumn == '') and groupKey != null and groupKey != '' and groupKeyList != null and groupKeyList.size>0">
AND IFNULL(t.${groupKey}, 'Unknown') IN
<foreach collection="groupKeyList" item="key" open="(" separator=","
close=")">
#{key}
</foreach>
</if>
- group by IFNULL(t.${groupColumn}, 'Unknown')
+ <choose>
+ <when test="districtColumn != null and districtColumn != ''">
+ group by IFNULL(${districtColumn}, 'Unknown')
+ </when>
+ <otherwise>
+ group by IFNULL(t.${groupColumn}, 'Unknown')
+ </otherwise>
+ </choose>
</select>
<select id="getSfStatisticsHyperlink" parameterType="com.ruoyi.task.domain.ServiceSubtaskCountReq"
@@ -2300,13 +2421,20 @@
and campusid = #{campusid}
</if>
<!-- 2026-10-21锛氱梾鍖轰负绌烘椂瑙嗕负"涓嶉檺"锛堝崡鍗庢弧鎰忓害 83% 瀛愪换鍔℃棤鐥呭尯锛夛紝鏈夌梾鍖虹殑鏁版嵁琛屼负涓嶅彉 -->
+ <!-- 涓� getSfStatisticsScript 鐨勬眹鎬昏淇濇寔涓�鑷达細鍑洪櫌鐥呭尯涓虹┖鍒欏洖閫�鍒板湪闄㈢梾鍖猴紝
+ 鍚﹀垯鐐光�滄煡鐪嬭鎯呪�濇煡鍑烘潵鐨勬潯鏁颁細鍜屾眹鎬昏鐨勬暟瀛楀涓嶄笂銆� -->
<if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0">
- AND (leavehospitaldistrictcode IS NULL OR leavehospitaldistrictcode IN
+ AND (leavehospitaldistrictcode IN
<foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator=","
close=")">
#{leavehospitaldistrictcode}
</foreach>
- )
+ OR (leavehospitaldistrictcode IS NULL AND hospitaldistrictcode IN
+ <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator=","
+ close=")">
+ #{leavehospitaldistrictcode}
+ </foreach>
+ ))
</if>
<if test="deptcodes != null and deptcodes.size() > 0">
AND leaveldeptcode IN
@@ -2637,11 +2765,17 @@
AND ss.campusid = #{campusid}
</if>
<if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0">
- AND ss.leavehospitaldistrictcode IN
+ AND (ss.leavehospitaldistrictcode IN
<foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator=","
close=")">
#{leavehospitaldistrictcode}
</foreach>
+ OR (ss.leavehospitaldistrictcode IS NULL AND ss.hospitaldistrictcode IN
+ <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator=","
+ close=")">
+ #{leavehospitaldistrictcode}
+ </foreach>
+ ))
</if>
<if test="deptcodes != null and deptcodes.size() > 0">
AND ss.leaveldeptcode IN
@@ -2719,11 +2853,17 @@
and ss.campusid = #{campusid}
</if>
<if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0">
- AND ss.leavehospitaldistrictcode IN
+ AND (ss.leavehospitaldistrictcode IN
<foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator=","
close=")">
#{leavehospitaldistrictcode}
</foreach>
+ OR (ss.leavehospitaldistrictcode IS NULL AND ss.hospitaldistrictcode IN
+ <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator=","
+ close=")">
+ #{leavehospitaldistrictcode}
+ </foreach>
+ ))
</if>
<if test="deptcodes != null and deptcodes.size() > 0">
AND ss.leaveldeptcode IN
@@ -3085,7 +3225,7 @@
SUM(CASE WHEN sendstate = 1 THEN 1 ELSE 0 END) AS blq,
SUM(CASE WHEN sendstate = 4 THEN 1 ELSE 0 END) AS wxsf,
SUM(CASE WHEN sendstate != 4 THEN 1 ELSE 0 END) AS xsf,
- SUM(CASE WHEN (sendstate = 1 OR sendstate = 2 OR sendstate = 3 OR sendstate = 5 OR sendstate = 7 ) THEN 1 ELSE 0
+ SUM(CASE WHEN (sendstate = 1 OR sendstate = 2 OR sendstate = 3 OR sendstate = 7 ) THEN 1 ELSE 0
END) AS dsf,
SUM(CASE WHEN sendstate != 2 THEN 1 ELSE 0 END) AS yfs,
SUM(CASE WHEN sendstate = 2 THEN 1 ELSE 0 END) AS wfs,
@@ -3282,7 +3422,8 @@
褰撳墠鐧诲綍浜恒�屽緟澶勭悊銆嶉殢璁夸换鍔★紝鎸夊嚭闄㈠勾鏈堬紙endtime锛夊垎缁勭粺璁★紝鍑洪櫌闅忚 / 闂ㄨ瘖闅忚鍒嗗紑璁℃暟銆�
鍙e緞锛堜笌闅忚鍒楄〃銆屽緟闅忚銆嶉〉绛句竴鑷达級锛�
1) 鍑洪櫌闅忚 service_type = '2'锛岄棬璇婇殢璁� service_type = '3'
- 2) 寰呴殢璁匡紙鏈畬鎴愶級鈫� sendstate IN (1,2,3,5,7)锛屾帓闄� 4 涓嶆墽琛� / 6 瀹屾垚
+ 2) 缁熻鐘舵�� 鈫� sendstate IN (1,2,3,7)锛�1 琚鍙� / 2 寰呭彂閫� / 3 宸插彂閫� / 7 瓒呮椂
+ 锛堜笉鍚� 4 涓嶆墽琛屻��5 鍙戦�佸け璐ャ��6 宸插畬鎴愶級
3) 鍑洪櫌婊� 7 澶� 鈫� endtime < (浠婂ぉ - 7 澶�) + 1 澶╋紝
鍗炽��7 澶╁墠閭d竴澶┿�嶅嚭闄㈢殑涔熻鍏ワ紙鐢� <= DATE_SUB(...) 鍙細鎴埌褰撳ぉ 0 鐐癸紝浼氭紡鎺� 9 鏉★級
4) 鍙湅鏈�杩� 4 涓嚭闄㈡湀浠斤紙鍚綋鏈堬級鈫� endtime >= 褰撴湀寰�鍓嶆帹 3 涓湀鐨� 1 鍙�
@@ -3302,7 +3443,8 @@
FROM service_subtask
WHERE del_flag = '0'
AND service_type IN ('2', '3')
- AND sendstate IN (1, 2, 3, 5, 7)
+ <!-- 娴獥銆屽緟澶勭悊闅忚浠诲姟銆嶅彛寰勶細1 琚鍙� / 2 寰呭彂閫� / 3 宸插彂閫� / 7 瓒呮椂 -->
+ AND sendstate IN (1, 2, 3, 7)
AND endtime IS NOT NULL
AND endtime < DATE_ADD(DATE_SUB(CURDATE(), INTERVAL 7 DAY), INTERVAL 1 DAY)
AND endtime >= DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 3 MONTH), '%Y-%m-01')
diff --git a/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskAnswerServiceImpl.java b/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskAnswerServiceImpl.java
index b8368b4..80225ac 100644
--- a/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskAnswerServiceImpl.java
+++ b/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskAnswerServiceImpl.java
@@ -518,8 +518,29 @@
}
}
+ /**
+ * 鍚屼竴浠介棶鍗风殑淇濆瓨閿侊細鎸夈�屼换鍔�+鎮h��+瀛愪换鍔°�嶅姞閿侊紝
+ * 鍓嶇閲嶅鐐瑰嚮 / 骞跺彂璇锋眰杩涙潵鏃朵覆琛屾墽琛岋紝閬垮厤鍚屼竴浠介棶鍗疯鍐欎袱閬嶃��
+ * 娉ㄦ剰锛氬彧鏄覆琛屽寲锛屼笉闃绘鍐嶆淇濆瓨鈥斺�旈棶鍗蜂粛鐒跺厑璁镐慨鏀瑰悗鍐嶄繚瀛橈紙璧版洿鏂伴�昏緫锛夈��
+ */
+ private static final java.util.concurrent.ConcurrentHashMap<String, Object> SAVE_LOCKS =
+ new java.util.concurrent.ConcurrentHashMap<>();
+
@Override
public Integer saveQuestionDetail(ServiceSubTaskCacheReq serviceSubTaskCacheReq, Long flag) {
+ String lockKey = serviceSubTaskCacheReq.getParam1() + "_"
+ + serviceSubTaskCacheReq.getParam2() + "_"
+ + serviceSubTaskCacheReq.getParam6();
+ Object lock = SAVE_LOCKS.computeIfAbsent(lockKey, k -> new Object());
+ if (SAVE_LOCKS.size() > 20000) {
+ SAVE_LOCKS.clear();
+ }
+ synchronized (lock) {
+ return doSaveQuestionDetail(serviceSubTaskCacheReq, flag);
+ }
+ }
+
+ private Integer doSaveQuestionDetail(ServiceSubTaskCacheReq serviceSubTaskCacheReq, Long flag) {
Long tid = Long.valueOf(serviceSubTaskCacheReq.getParam1());
Long pid = Long.valueOf(serviceSubTaskCacheReq.getParam2());
Long subid = Long.valueOf(serviceSubTaskCacheReq.getParam6());
--
Gitblit v1.9.3