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