From 72337c4a38bc8f5dbadbb492e2f0548521842798 Mon Sep 17 00:00:00 2001
From: 陈昶聿 <chychen@nbjetron.com>
Date: 星期四, 22 十月 2026 16:20:12 +0800
Subject: [PATCH] 【丽水】1、出院未到28天超时,也到了随访中心 2、出院28天超时任务,到随访中心的,会一次性生成4条任务
---
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java | 84 ++++++--------------
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java | 130 ++++++++++++++++++++++++++++++++
smartor/src/main/java/com/smartor/service/IServiceSubtaskService.java | 10 ++
3 files changed, 167 insertions(+), 57 deletions(-)
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java
index fe49361..cfe92f6 100644
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java
+++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java
@@ -1907,7 +1907,16 @@
/**
* 澶勭悊瓒呮椂闅忚浠诲姟
- * @return
+ * <p>
+ * 鎵弿銆屽嚭闄㈡弧 deadlineDay 澶╀粛鏈畬鎴愩�嶇殑棣栨闅忚浠诲姟锛坰endstate=7 + visit_count=1锛夛紝
+ * 鎸夊綋鍓嶄换鍔$殑 nexttaskid 鐢熸垚鍐嶆闅忚浠诲姟骞惰浆鍒伴殢璁夸腑蹇冦��
+ * <p>
+ * 娉ㄦ剰锛氭埅姝㈡椂闂村繀椤诲湪寰幆澶栬绠椾竴娆°�傚巻鍙插疄鐜版妸 {@code deadlineDay = -deadlineDay}
+ * 鍐欏湪寰幆浣撳唴锛屾瘡杞彇鍙嶄竴娆★紝瀵艰嚧鍋舵暟杞敤銆屼粖澶� + deadlineDay銆嶅仛鎴鏃堕棿锛�
+ * 鎶婂嚭闄笉婊� 28 澶╃殑瓒呮椂浠诲姟涔熸壂浜嗚繘鏉ャ��
+ *
+ * @param orgid 鏈烘瀯ID
+ * @param deadlineDay 鍑洪櫌婊″灏戝ぉ绠楄秴鏃讹紙姝f暟锛屽 28锛�
*/
public void dealSubtaskDeadline(String orgid, Integer deadlineDay){
//鑾峰彇浠诲姟淇℃伅
@@ -1918,24 +1927,16 @@
st.setOrgid(orgid);
List<ServiceTask> serviceTasks = serviceTaskMapper.selectServiceTaskList(st);
- // 闅忚涓績绉戝
- String centerDept = configService.selectConfigByKey("sys.smartor.center.dept", orgid);
- SysDept sysDeptVo = new SysDept();
- SysDept centerSysDept = null;
- if(StringUtils.isNotEmpty(centerDept)){
- sysDeptVo.setDeptType("1");
- sysDeptVo.setOrgid(orgid);
- sysDeptVo.setDeptCode(centerDept);
- List<SysDept> sysDepts = sysDeptService.selectDeptList(sysDeptVo);
- if (CollectionUtils.isNotEmpty(sysDepts)) {
- centerSysDept = sysDepts.get(0);
- }
- }
+ // 鎴鏃堕棿鍙畻涓�娆★細鍑洪櫌鏃堕棿 <= 浠婂ぉ - deadlineDay
+ int days = Math.abs(ObjectUtils.isEmpty(deadlineDay) ? 28 : deadlineDay);
+ Date deadline = DateUtils.addDays(new Date(), -days);
+ log.info("銆恉ealSubtaskDeadline銆戝紑濮嬫壂鎻�, orgid={}, day={}, deadline={}, 浠诲姟鏁�={}",
+ orgid, days, deadline, serviceTasks.size());
- String config = configService.selectConfigByKey("visit.early.day");
for (ServiceTask serviceTask : serviceTasks) {
- deadlineDay = -deadlineDay;
- Date deadline = DateUtils.addDays(new Date(), deadlineDay);
+ if (ObjectUtils.isEmpty(serviceTask.getNexttaskid())) {
+ continue;
+ }
//閫氳繃浠诲姟ID鎷垮埌鎮h�呬俊鎭�,骞朵笖闅忚鏃堕棿寰楁槸浠婂ぉ涔嬪墠鐨�
ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
serviceSubtaskVO.setOrgid(orgid);
@@ -1949,46 +1950,15 @@
= serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
log.info("銆恉ealSubtaskDeadline銆戣幏鍙栧埌{}涓秴鏃朵换鍔�, taskid={}", serviceSubtaskList.size(), serviceTask.getTaskid());
for (ServiceSubtask serviceSubtask : serviceSubtaskList) {
- PatMedInhosp patMedInhospVo = new PatMedInhosp();
- patMedInhospVo.setOrgid(serviceSubtask.getOrgid());
- patMedInhospVo.setInhospid(serviceSubtask.getInhospid());
- patMedInhospVo.setCry(1);
- List<PatMedInhosp> patMedInhospList = iPatMedInhospService.selectPatMedInhospList(patMedInhospVo);
- PatMedInhosp patMedInhosp = new PatMedInhosp();
- if (!patMedInhospList.isEmpty()) {
- patMedInhosp = patMedInhospList.get(0);
- }else {
- continue;
- }
- if(ObjectUtils.isEmpty(serviceTask.getNexttaskid())){
- continue;
- }
- ServiceTask nextServiceTask = serviceTaskMapper.selectServiceTaskByTaskid(serviceTask.getNexttaskid());
- PatArchive patArchive = patArchiveService.selectPatArchiveByPatid(serviceSubtask.getPatid());
- Integer type = 1;
-
- //鏂板鍐嶆闅忚浠诲姟
- ServiceSubtask serviceSubtaskAgain = iPatMedInhospService.boxedServiceSubtask(nextServiceTask,
- patMedInhosp, patArchive, config, type);
- serviceSubtaskAgain.setId(null);
- serviceSubtaskAgain.setUpid(serviceSubtask.getId().intValue());
- serviceSubtaskAgain.setVisitCount(serviceSubtask.getVisitCount() + 1);
- serviceSubtaskAgain.setSendstate(2L);
- serviceSubtaskAgain.setCreateTime(new Date());
- serviceSubtaskAgain.setUpdateTime(new Date());
- serviceSubtaskAgain.setVisitType(serviceSubtask.getVisitType());
- if(ObjectUtils.isNotEmpty(centerSysDept)){
- serviceSubtaskAgain.setVisitDeptCode(centerSysDept.getDeptCode());
- serviceSubtaskAgain.setVisitDeptName(centerSysDept.getDeptName());
- }else {
- serviceSubtaskAgain.setVisitDeptCode(serviceSubtask.getVisitDeptCode());
- serviceSubtaskAgain.setVisitDeptName(serviceSubtask.getVisitDeptName());
- }
- int i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtaskAgain);
- if (i == 1) {
- //鍐嶆闅忚浠诲姟鍒涘缓鎴愬姛鍚庯紝鍘熶换鍔℃敼涓哄け璐ョ姸鎬�
- serviceSubtask.setSendstate(5L);
- serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
+ try {
+ // 鐢熸垚閫昏緫缁熶竴鏀跺彛鍒� service锛氶攣 + 骞傜瓑 + 浜嬪姟 + 鍙戦�佹柟寮忔槑缁嗗垵濮嬪寲
+ String result = iServiceSubtaskService.addSubTaskAgainByDeadline(serviceSubtask);
+ log.info("銆恉ealSubtaskDeadline銆戠敓鎴愬啀娆¢殢璁�, subId={}, taskid={}, 缁撴灉={}",
+ serviceSubtask.getId(), serviceTask.getTaskid(), result);
+ } catch (Exception e) {
+ // 鍗曟潯澶辫触涓嶅奖鍝嶅叾浠栨偅鑰�
+ log.error("銆恉ealSubtaskDeadline銆戠敓鎴愬啀娆¢殢璁垮け璐�, subId=" + serviceSubtask.getId()
+ + ", taskid=" + serviceTask.getTaskid(), e);
}
}
}
diff --git a/smartor/src/main/java/com/smartor/service/IServiceSubtaskService.java b/smartor/src/main/java/com/smartor/service/IServiceSubtaskService.java
index 9fa95f8..2ec5625 100644
--- a/smartor/src/main/java/com/smartor/service/IServiceSubtaskService.java
+++ b/smartor/src/main/java/com/smartor/service/IServiceSubtaskService.java
@@ -88,6 +88,16 @@
public String addSubTaskAgain(ServiceSubtask ServiceSubtask);
/**
+ * 棣栨闅忚浠诲姟瓒呮椂鍚庯紝鎸変笅涓�浠诲姟鑷姩鐢熸垚鍐嶆闅忚浠诲姟锛堥殢璁夸腑蹇冿級銆�
+ * <p>
+ * 涓庢墜鍔ㄥ叆鍙g殑宸紓锛氶殢璁夸腑蹇冪瀹ゆ湭閰嶇疆鏃跺洖閫�鍘熶换鍔$瀹わ紱鍚屼竴鍘熶换鍔″彧鐢熸垚涓�鏉★紙閿� + 鏉′欢鏇存柊骞傜瓑锛夈��
+ *
+ * @param serviceSubtask 宸茶秴鏃剁殑棣栨闅忚瀛愪换鍔�
+ * @return 缁撴灉鎻忚堪
+ */
+ public String addSubTaskAgainByDeadline(ServiceSubtask serviceSubtask);
+
+ /**
* 淇敼鍗曚竴浠诲姟锛堥殢璁匡級
*
* @param ServiceSubtask 鍗曚竴浠诲姟锛堥殢璁匡級
diff --git a/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java b/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
index d7c2f24..301c40a 100644
--- a/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
+++ b/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
@@ -967,6 +967,136 @@
}
/**
+ * 棣栨闅忚浠诲姟瓒呮椂鍚庯紝鎸変笅涓�浠诲姟鑷姩鐢熸垚鍐嶆闅忚浠诲姟锛堥殢璁夸腑蹇冿級銆�
+ * <p>
+ * 瀹氭椂浠诲姟鍏ュ彛 {@code RyTask#dealSubtaskDeadline} 浣跨敤銆備笌鎵嬪姩鍏ュ彛涓�鑷寸殑閮ㄥ垎锛�
+ * 琛ㄥ崟/鍙戦�佹柟寮忓彇涓嬩竴浠诲姟銆侀摼璺� upid + visit_count銆佸彂閫佹柟寮忔槑缁嗗垵濮嬪寲锛�
+ * 宸紓锛氶殢璁夸腑蹇冪瀹ゆ湭閰嶇疆鏃跺洖閫�鍘熶换鍔$瀹わ紝鍘熶换鍔$疆涓哄彂閫佸け璐ワ紙sendstate=5锛夈��
+ * <p>
+ * 骞傜瓑锛氬悓涓�鍘熶换鍔″彧鍏佽鐢熸垚涓�鏉″啀娆¢殢璁匡紙Redis 閿� + upid 鏍¢獙 + 鍘熶换鍔℃潯浠舵洿鏂帮級锛�
+ * 澶氳妭鐐�/澶氱嚎绋嬪悓鏃舵壂鎻忔椂锛屽悗鍒扮殑浜嬪姟浼氬湪鏉′欢鏇存柊澶勬嬁鍒� 0 琛屽苟鍥炴粴鏈鎻掑叆銆�
+ *
+ * @param serviceSubtask 宸茶秴鏃剁殑棣栨闅忚瀛愪换鍔�
+ * @return 缁撴灉鎻忚堪
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public String addSubTaskAgainByDeadline(ServiceSubtask serviceSubtask) {
+ if (ObjectUtils.isEmpty(serviceSubtask) || ObjectUtils.isEmpty(serviceSubtask.getId())) {
+ return "鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屽師浠诲姟涓嶅瓨鍦�";
+ }
+ String lockToken = tryLockAgainTask(serviceSubtask.getId());
+ if (lockToken == null) {
+ return "鍐嶆闅忚浠诲姟姝e湪鍒涘缓涓紝璇峰嬁閲嶅鎻愪氦";
+ }
+ try {
+ // 骞傜瓑鏍¢獙锛氬悓涓�鍘熶换鍔″彧鍏佽鐢熸垚涓�鏉″啀娆¢殢璁�
+ ServiceSubtaskEntity againQuery = new ServiceSubtaskEntity();
+ againQuery.setUpid(serviceSubtask.getId().intValue());
+ if (CollectionUtils.isNotEmpty(serviceSubtaskMapper.selectServiceSubtaskList(againQuery))) {
+ return "鏃犻渶鍐嶆闅忚锛岃浠诲姟宸茬粡鍐嶆闅忚杩囦簡";
+ }
+ // 鍘熶换鍔″凡琚爣璁颁负涓嶅啀闅忚锛堟墜鍔ㄥ叆鍙e啓杩� is_visit_again=2锛�
+ if (ObjectUtils.isNotEmpty(serviceSubtask.getIsVisitAgain()) && serviceSubtask.getIsVisitAgain() == 2) {
+ return "鏃犻渶鍐嶆闅忚锛岃浠诲姟宸茬粡鍐嶆闅忚杩囦簡";
+ }
+ ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
+ if (ObjectUtils.isEmpty(serviceTask)) {
+ return "鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屾壘涓嶅埌瀵瑰簲浠诲姟 taskid = " + serviceSubtask.getTaskid();
+ }
+ if (ObjectUtils.isEmpty(serviceTask.getNexttaskid())) {
+ return "鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屼换鍔$己灏� nexttaskid, taskid = " + serviceSubtask.getTaskid();
+ }
+ ServiceTask nextServiceTask = serviceTaskService.selectServiceTaskByTaskid(serviceTask.getNexttaskid());
+ if (ObjectUtils.isEmpty(nextServiceTask)) {
+ return "鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屾壘涓嶅埌瀵瑰簲浠诲姟 nexttaskid = " + serviceTask.getNexttaskid();
+ }
+ PatMedInhosp patMedInhosp = selectOutHospRecord(serviceSubtask);
+ if (ObjectUtils.isEmpty(patMedInhosp)) {
+ return "鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屼换鍔$己灏戝搴旂殑鍑洪櫌璁板綍, taskid = " + serviceSubtask.getTaskid();
+ }
+ PatArchive patArchive = patArchiveService.selectPatArchiveByPatid(serviceSubtask.getPatid());
+ if (ObjectUtils.isEmpty(patArchive)) {
+ return "鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屾湭鎵惧埌鎮h�呮。妗�, subTaskId = " + serviceSubtask.getId();
+ }
+ // 闅忚涓績绉戝锛氭湭閰嶇疆锛堟垨绉戝涓嶅瓨鍦級鏃跺洖閫�鍘熶换鍔$瀹わ紝淇濇寔瓒呮椂鍏ュ彛鍘熸湁琛屼负
+ SysDept visitDept = selectCenterDept(serviceSubtask.getOrgid());
+ String config = configService.selectConfigByKey("visit.early.day");
+ ServiceSubtask serviceSubtaskAgain = patMedInhospService.boxedServiceSubtask(nextServiceTask,
+ patMedInhosp, patArchive, config, 1);
+ if (ObjectUtils.isEmpty(serviceSubtaskAgain) || ObjectUtils.isEmpty(serviceSubtaskAgain.getTaskid())) {
+ return "鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屾偅鑰呭嚭闄㈣褰曚笉瀹屾暣鎴栦笅涓�浠诲姟閰嶇疆寮傚父, subTaskId = " + serviceSubtask.getId();
+ }
+ Date now = new Date();
+ serviceSubtaskAgain.setId(null);
+ serviceSubtaskAgain.setUpid(serviceSubtask.getId().intValue());
+ serviceSubtaskAgain.setVisitCount(ObjectUtils.isNotEmpty(serviceSubtask.getVisitCount())
+ ? serviceSubtask.getVisitCount() + 1 : 2);
+ serviceSubtaskAgain.setSendstate(2L);
+ serviceSubtaskAgain.setIsVisitAgain(1);
+ serviceSubtaskAgain.setCreateTime(now);
+ serviceSubtaskAgain.setUpdateTime(now);
+ serviceSubtaskAgain.setVisitType(serviceSubtask.getVisitType());
+ if (ObjectUtils.isNotEmpty(visitDept)) {
+ serviceSubtaskAgain.setVisitDeptCode(visitDept.getDeptCode());
+ serviceSubtaskAgain.setVisitDeptName(visitDept.getDeptName());
+ } else {
+ serviceSubtaskAgain.setVisitDeptCode(serviceSubtask.getVisitDeptCode());
+ serviceSubtaskAgain.setVisitDeptName(serviceSubtask.getVisitDeptName());
+ }
+ if (serviceSubtaskMapper.insertServiceSubtask(serviceSubtaskAgain) != 1) {
+ return "鍐嶆闅忚浠诲姟鍒涘缓澶辫触锛屽啀璇锋閲嶈瘯";
+ }
+ // 鍒濆鍖栧彂閫佹柟寮忔槑缁嗭紝琛ュ伩锛坈ompensateTask锛夊拰瓒呮椂鍒ゆ柇渚濊禆璇ヨ〃
+ patMedInhospService.addServiceSubtaskPreachform(serviceSubtaskAgain, null);
+ // 鏉′欢鏇存柊鍘熶换鍔★細0 琛岃鏄庡凡琚叾浠栬姹傜敓鎴愶紝鎶涘紓甯稿洖婊氭湰娆℃彃鍏ョ殑閲嶅鏁版嵁
+ if (serviceSubtaskMapper.updateIsVisitAgainById(serviceSubtask.getId(), 2) != 1) {
+ throw new BaseException("鏃犻渶鍐嶆闅忚锛岃浠诲姟宸茬粡鍐嶆闅忚杩囦簡");
+ }
+ // 鍘熶换鍔¤秴鏃讹紝缃负鍙戦�佸け璐�
+ ServiceSubtask originUpdate = new ServiceSubtask();
+ originUpdate.setId(serviceSubtask.getId());
+ originUpdate.setSendstate(5L);
+ originUpdate.setUpdateTime(now);
+ serviceSubtaskMapper.updateServiceSubtask(originUpdate);
+ return "鍐嶆闅忚浠诲姟鍒涘缓鎴愬姛";
+ } finally {
+ unlockAgainTask(serviceSubtask.getId(), lockToken);
+ }
+ }
+
+ /**
+ * 鎸� orgid + inhospid 鍙栧嚭闄㈣褰曪紙瓒呮椂鍐嶆闅忚鐢級銆�
+ */
+ private PatMedInhosp selectOutHospRecord(ServiceSubtask serviceSubtask) {
+ PatMedInhosp patMedInhospVo = new PatMedInhosp();
+ patMedInhospVo.setOrgid(serviceSubtask.getOrgid());
+ patMedInhospVo.setInhospid(serviceSubtask.getInhospid());
+ patMedInhospVo.setCry(1);
+ List<PatMedInhosp> patMedInhospList = patMedInhospService.selectPatMedInhospList(patMedInhospVo);
+ if (CollectionUtils.isEmpty(patMedInhospList)) {
+ return null;
+ }
+ return patMedInhospList.get(0);
+ }
+
+ /**
+ * 鍙栭殢璁夸腑蹇冪瀹わ紝鏈厤缃垨绉戝涓嶅瓨鍦ㄦ椂杩斿洖 null锛堢敱璋冪敤鏂瑰洖閫�鍘熶换鍔$瀹わ級銆�
+ */
+ private SysDept selectCenterDept(String orgid) {
+ String centerDept = configService.selectConfigByKey("sys.smartor.center.dept", orgid);
+ if (StringUtils.isEmpty(centerDept)) {
+ return null;
+ }
+ SysDept sysDeptVo = new SysDept();
+ sysDeptVo.setDeptType("1");
+ sysDeptVo.setOrgid(orgid);
+ sysDeptVo.setDeptCode(centerDept);
+ List<SysDept> sysDepts = sysDeptService.selectDeptList(sysDeptVo);
+ return CollectionUtils.isEmpty(sysDepts) ? null : sysDepts.get(0);
+ }
+
+ /**
* 鑾峰彇浜屾闅忚鐢熸垚閿併�俁edis 寮傚父鏃堕檷绾т负鏁版嵁搴撳箓绛夋牎楠岋紝涓嶉樆鏂笟鍔°��
*/
private String tryLockAgainTask(Long subId) {
--
Gitblit v1.9.3