From 3d047130b059efd46f56be37465a751ab16ee8cb Mon Sep 17 00:00:00 2001
From: 陈昶聿 <chychen@nbjetron.com>
Date: 星期三, 11 十一月 2026 14:06:56 +0800
Subject: [PATCH] Merge branch 'smartor_ls_merge' into 20261111-妇幼档案随访
---
ruoyi-task/src/main/java/com/ruoyi/task/controller/ServiceSubtaskController.java | 189 +++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 188 insertions(+), 1 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 e4e6b90..06204ba 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;
/**
* 浠诲姟杩愮淮瑙﹀彂鑳藉姏銆�
@@ -593,6 +599,155 @@
serviceSubtaskCountReq.setPageSize(null);
List<ServiceSubtaskStatistic> sfStatistics = serviceSubtaskService.getSfStatistics(serviceSubtaskCountReq);
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;
}
/**
@@ -1158,10 +1313,12 @@
Boolean redisFlag = false;
if (MapUtils.isNotEmpty(redisMap)) {
long tCmp = System.currentTimeMillis();
- ServiceSubtaskEntity oldCondition = (ServiceSubtaskEntity) redisMap.get("searchCondition");
+ ServiceSubtaskEntity oldCondition = convertCachedCondition(redisMap.get("searchCondition"));
if (ObjectUtils.isNotEmpty(oldCondition) && isSameCondition(oldCondition, serviceSubtaskEntity)) {
redisFlag = true;
map = redisMap;
+ // 椤烘墜鍥炲~杞崲鍚庣殑瀹炰綋锛岃杩欐潯缂撳瓨涓嬫鑳戒互姝g‘绫诲瀷鍙嶅簭鍒楀寲
+ map.put("searchCondition", oldCondition);
redisCache.setCacheObject(userId + "patItemCount", map, 60, TimeUnit.MINUTES);
}
log.info("[patItem鑰楁椂] 4.2 鏉′欢姣斿={}ms锛屽懡涓�={}", System.currentTimeMillis() - tCmp, redisFlag);
@@ -1181,6 +1338,36 @@
return map;
}
+ /**
+ * 鎶� Redis 缂撳瓨閲岀殑鏌ヨ鏉′欢杩樺師鎴� {@link ServiceSubtaskEntity}銆�
+ * <p>
+ * 缂撳瓨鐢� {@code FastJson2JsonRedisSerializer} 鎸� {@code Object.class} 鍙嶅簭鍒楀寲锛�
+ * 褰� {@code searchCondition} 鐨� {@code @type} 缂哄け銆佹垨鎸囧悜宸茶縼绉荤殑鏃у寘鍚�
+ * 锛堝 {@code com.smartor.domain.entity.ServiceSubtaskEntity}锛夋椂锛宖astjson2 浼�
+ * 闈欓粯閫�鍖栨垚 {@link com.alibaba.fastjson2.JSONObject}锛岀洿鎺ュ己杞細鎶�
+ * {@code ClassCastException}銆傝繖閲岀粺涓�杞崲锛涜浆鎹㈠け璐ヨ繑鍥� {@code null}锛�
+ * 璋冪敤鏂规寜缂撳瓨鏈懡涓鐞嗭紙閲嶆柊鏌ュ簱锛夛紝閬垮厤鏁翠釜鎺ュ彛 500銆�
+ */
+ private ServiceSubtaskEntity convertCachedCondition(Object cachedCondition) {
+ if (cachedCondition == null) {
+ return null;
+ }
+ if (cachedCondition instanceof ServiceSubtaskEntity) {
+ return (ServiceSubtaskEntity) cachedCondition;
+ }
+ try {
+ // 涓嶈兘鐩存帴鐢� TypeUtils.cast / toJavaObject锛氭棫缂撳瓨閲岀殑 @type 鍙兘鎸囧悜宸茶縼绉荤殑绫伙紝
+ // fastjson2 浼氭寜 @type 鍘绘壘绫诲苟鎶� "No suitable ObjectReader found"銆�
+ // 杞垚 JSON 瀛楃涓插悗鎸夌洰鏍囩被瑙f瀽锛屾湭寮�鍚� SupportAutoType 鏃� @type 鍙細琚綋浣滄櫘閫氬瓧娈靛拷鐣ャ��
+ return com.alibaba.fastjson2.JSON.parseObject(
+ com.alibaba.fastjson2.JSON.toJSONString(cachedCondition),
+ ServiceSubtaskEntity.class);
+ } catch (Exception e) {
+ log.warn("銆恜atItemCount銆戠紦瀛樹腑鐨勬煡璇㈡潯浠舵棤娉曡繕鍘熶负 ServiceSubtaskEntity锛屾寜缂撳瓨鏈懡涓鐞嗭紝瀹為檯绫诲瀷锛歿}",
+ cachedCondition.getClass().getName(), e);
+ return null;
+ }
+ }
/**
* 姣旇緝涓や釜ServiceSubtaskVO鐨勬煡璇㈡潯浠舵槸鍚︿竴鑷�
--
Gitblit v1.9.3