From af6c73841b54f0c9002ce85b8c0d1679e25d5d7c Mon Sep 17 00:00:00 2001
From: 陈昶聿 <chychen@nbjetron.com>
Date: 星期三, 01 七月 2026 18:06:02 +0800
Subject: [PATCH] 【景宁】任务组开发
---
smartor/src/main/java/com/smartor/common/ScheduleSubtaskBuilder.java | 192 ++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 192 insertions(+), 0 deletions(-)
diff --git a/smartor/src/main/java/com/smartor/common/ScheduleSubtaskBuilder.java b/smartor/src/main/java/com/smartor/common/ScheduleSubtaskBuilder.java
new file mode 100644
index 0000000..e281e01
--- /dev/null
+++ b/smartor/src/main/java/com/smartor/common/ScheduleSubtaskBuilder.java
@@ -0,0 +1,192 @@
+package com.smartor.common;
+
+import com.alibaba.fastjson2.JSON;
+import com.ruoyi.common.exception.base.BaseException;
+import com.ruoyi.common.utils.DateUtils;
+import com.smartor.domain.*;
+import com.smartor.mapper.ServiceSubtaskMapper;
+import com.smartor.mapper.ServiceSubtaskPreachformMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 浠诲姟缁勶紙appltype=5锛塻ubtask 鐢熸垚鍣�
+ * <p>
+ * 鍗曚竴鑱岃矗锛氭牴鎹� schedule + detailList 涓烘瘡涓偅鑰呮淳鐢� subtask銆�
+ * 鍚屾椂鏈嶅姟涓ゆ潯璺緞锛�
+ * (a) 鍓嶇鎵嬪姩鍕鹃�夋偅鑰咃紙insertOrUpdateTask锛� 鈥斺�� 鏃� 6 鍙傚叆鍙o紱
+ * (b) HIS 鑷姩绾冲叆鏂板嚭闄㈡偅鑰咃紙PatMedInhospServiceImpl.writeInSubTask锛� 鈥斺�� 鏂� 5 鍙傚叆鍙c��
+ * 涓ゆ潯璺緞缁熶竴浠� baseSubtask 涓婂彇鍩哄噯鏃ュ瓧娈碉紝閬垮厤鐢熸垚鍣ㄤ笌 PatTaskRelevance/ServiceTaskVO 鑰﹀悎銆�
+ *
+ * @author smartor
+ * @date 2026-06-30
+ */
+@Slf4j
+@Component
+public class ScheduleSubtaskBuilder {
+
+ @Autowired
+ private ServiceSubtaskMapper serviceSubtaskMapper;
+
+ @Autowired
+ private ServiceSubtaskPreachformMapper serviceSubtaskPreachformMapper;
+
+ /**
+ * 涓哄崟涓偅鑰呮淳鐢� subtask锛坅ppltype=5锛夆�斺�� 瑙h�﹀叆鍙o紙鑷姩绾冲叆 & 鎵嬪姩鍕鹃�夌粺涓�璧拌繖閲岋級銆�
+ * <p>
+ * 闈炲惊鐜細鎸� detailList 涓�娆℃�ч摵骞� N 鏉★紱
+ * 寰幆 锛氭寜 schedule.currentLoopCount 鐢熸垚褰撳墠杞� N 鏉★紝鍚庣画杞鐢辫皟搴﹀櫒婊氬姩寤恒��
+ *
+ * @param serviceTask 涓讳换鍔★紙宸茶惤搴擄級
+ * @param schedule 宸茶惤搴撶殑涓昏鍒�
+ * @param detailList 鏄庣粏鍒楄〃锛堟寜 seq 鍗囧簭锛�
+ * @param baseSubtask 妯℃澘 subtask锛堝凡濉厖鎮h�呭熀纭�淇℃伅 + 鍩哄噯鏃ュ瓧娈碉級锛屾柟娉曞唴浼氭繁鎷疯礉
+ * @param preachformList 鍙戦�佹柟寮忥紙璋冪敤鏂瑰凡瑙f瀽濂斤紝鍙负绌猴級
+ */
+ public void buildSubtasksForPatient(ServiceTask serviceTask,
+ ServiceTaskSchedule schedule,
+ List<ServiceTaskScheduleDetail> detailList,
+ ServiceSubtask baseSubtask,
+ List<Map<String, Object>> preachformList) {
+ if (CollectionUtils.isEmpty(detailList)) {
+ throw new BaseException("浠诲姟缁勬槑缁嗕负绌猴紝鏃犳硶鐢熸垚 subtask, taskid=" + serviceTask.getTaskid());
+ }
+
+ Date benchmark = resolveBenchmark(schedule, baseSubtask);
+ long currentLoop = schedule.getCurrentLoopCount() == null ? 0L : schedule.getCurrentLoopCount();
+
+ for (ServiceTaskScheduleDetail detail : detailList) {
+ ServiceSubtask subtask = copyFromBase(baseSubtask);
+
+ // 鍥炴函瀛楁
+ subtask.setScheduleId(schedule.getId());
+ subtask.setScheduleDetailId(detail.getId());
+ subtask.setScheduleSeq(detail.getSeq());
+ subtask.setLoopCount(currentLoop);
+
+ // 妯℃澘锛歞etail 浼樺厛浜� task
+ if (detail.getTemplateid() != null) {
+ subtask.setTemplateid(detail.getTemplateid());
+ subtask.setTemplatename(detail.getTemplatename());
+ }
+ if (detail.getLibtemplateid() != null) {
+ subtask.setLibtemplateid(detail.getLibtemplateid());
+ }
+
+ // 鏃堕棿锛氬熀鍑嗘棩 + dayOffset
+ Date visitTime = addDays(benchmark, detail.getDayOffset());
+ subtask.setVisitTime(visitTime);
+ subtask.setSenddate(visitTime);
+ subtask.setLongSendTime(visitTime);
+
+ // 鐘舵�侊細涓庡師娴佺▼涓�鑷达紝鏂板缓鍚庣疆涓哄緟鍙戦��
+ subtask.setSendstate(2L);
+ subtask.setCreateTime(DateUtils.getNowDate());
+ subtask.setUpdateTime(DateUtils.getNowDate());
+
+ serviceSubtaskMapper.insertServiceSubtask(subtask);
+
+ insertPreachform(serviceTask, preachformList, subtask);
+
+ log.info("[浠诲姟缁刔 taskid={} patid={} 鐢熸垚 subtask id={} seq={} dayOffset={} visitTime={}",
+ serviceTask.getTaskid(), baseSubtask.getPatid(),
+ subtask.getId(), detail.getSeq(), detail.getDayOffset(), visitTime);
+ }
+ }
+
+ /**
+ * 鍏煎鍏ュ彛锛氬墠绔墜鍔ㄥ嬀閫夋偅鑰咃紙insertOrUpdateTask锛夈��
+ * 鎶� patTaskRelevance 鐨勫熀鍑嗘棩瀛楁鍥炲~鍒� baseSubtask 鍚庯紝濮旀墭缁欒В鑰﹀叆鍙c��
+ */
+ public void buildSubtasksForPatient(ServiceTask serviceTask,
+ List<Map<String, Object>> preachformList,
+ ServiceTaskSchedule schedule,
+ List<ServiceTaskScheduleDetail> scheduleDetailList,
+ PatTaskRelevance patTaskRelevance,
+ ServiceSubtask baseSubtask) {
+ // 鍥炲~鍩哄噯鏃ュ瓧娈碉紙鎵嬪姩璺緞鐨� baseSubtask 鐢� VO 鎷艰锛屽熀鍑嗘棩瀛楁鍙兘鏈~鍏級
+ if (baseSubtask.getStarttime() == null) {
+ baseSubtask.setStarttime(patTaskRelevance.getInhosptime() != null
+ ? patTaskRelevance.getInhosptime() : patTaskRelevance.getStarttime());
+ }
+ if (baseSubtask.getEndtime() == null) {
+ baseSubtask.setEndtime(patTaskRelevance.getEndtime());
+ }
+ if (baseSubtask.getAdmindate() == null) {
+ baseSubtask.setAdmindate(patTaskRelevance.getVisittime());
+ }
+ buildSubtasksForPatient(serviceTask, schedule, scheduleDetailList, baseSubtask, preachformList);
+ }
+
+ /**
+ * 鏍规嵁 scheduleBenchmark 瑙f瀽鍩哄噯鏃堕棿锛�
+ * 0-鑷畾涔夋椂闂� 1-鍏ラ櫌鏃堕棿 2-鍑洪櫌鏃堕棿 3-灏辫瘖鏃堕棿 4-鍏ョ粍鏃堕棿
+ * 鍏ㄩ儴浠� baseSubtask 鍙栵紝鍙栦笉鍒板厹搴曞綋鍓嶆椂闂淬��
+ */
+ private Date resolveBenchmark(ServiceTaskSchedule schedule, ServiceSubtask base) {
+ Integer benchmark = schedule.getScheduleBenchmark() == null ? 0 : schedule.getScheduleBenchmark();
+ Date now = DateUtils.getNowDate();
+ switch (benchmark) {
+ case 1:
+ return base.getStarttime() != null ? base.getStarttime() : now;
+ case 2:
+ return base.getEndtime() != null ? base.getEndtime() : now;
+ case 3:
+ return base.getAdmindate() != null ? base.getAdmindate() : now;
+ case 4:
+ return base.getCreateTime() != null ? base.getCreateTime() : now;
+ case 0:
+ default:
+ return schedule.getScheduleBenchmarkCustomTime() != null
+ ? schedule.getScheduleBenchmarkCustomTime() : now;
+ }
+ }
+
+ private Date addDays(Date base, int dayOffset) {
+ Calendar c = Calendar.getInstance();
+ c.setTime(base);
+ c.add(Calendar.DAY_OF_MONTH, dayOffset);
+ return c.getTime();
+ }
+
+ /**
+ * 鍐� service_subtask_preachform锛屽彂閫佹柟寮忕敱璋冪敤鏂瑰濂姐��
+ */
+ private void insertPreachform(ServiceTask serviceTask, List<Map<String, Object>> pfList, ServiceSubtask subtask) {
+ if (CollectionUtils.isEmpty(pfList)) {
+ return;
+ }
+ for (Map<String, Object> map : pfList) {
+ ServiceSubtaskPreachform pf = new ServiceSubtaskPreachform();
+ pf.setSort(ObjectUtils.isEmpty(map.get("sort")) ? 0 : Long.valueOf(map.get("sort").toString()));
+ pf.setPreachform(ObjectUtils.isEmpty(map.get("preachform")) ? "" : map.get("preachform").toString());
+ pf.setCompensateTime(ObjectUtils.isEmpty(map.get("compensateTime")) ? "" : map.get("compensateTime").toString());
+ pf.setTaskid(serviceTask.getTaskid());
+ pf.setSubid(subtask.getId());
+ pf.setSendstate("1");
+ pf.setOrgid(serviceTask.getOrgid());
+ pf.setCreateTime(new Date());
+ serviceSubtaskPreachformMapper.insertServiceSubtaskPreachform(pf);
+ }
+ }
+
+ /**
+ * 娣辨嫹璐� baseSubtask 鍒颁竴涓柊瀵硅薄锛堟瘡娆� insert 鍚� id 浼氬洖鍐欙紝蹇呴』鐙珛瀹炰緥锛夈��
+ * 鐢� fastjson 鍋氭繁鎷疯礉锛岀渷涓�鍫� set銆�
+ */
+ private ServiceSubtask copyFromBase(ServiceSubtask base) {
+ String json = JSON.toJSONString(base);
+ ServiceSubtask copy = JSON.parseObject(json, ServiceSubtask.class);
+ // 涓婚敭銆乮d 蹇呴』娓呮帀锛屽惁鍒� useGeneratedKeys 浠嶄細鐢ㄤ笂杞殑 id 瑙﹀彂涓婚敭鍐茬獊
+ copy.setId(null);
+ return copy;
+ }
+}
--
Gitblit v1.9.3