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)subtask 生成器
*
* 单一职责:根据 schedule + detailList 为每个患者派生 subtask。
* 同时服务两条路径:
* (a) 前端手动勾选患者(insertOrUpdateTask) —— 旧 6 参入口;
* (b) HIS 自动纳入新出院患者(PatMedInhospServiceImpl.writeInSubTask) —— 新 5 参入口。
* 两条路径统一从 baseSubtask 上取基准日字段,避免生成器与 PatTaskRelevance/ServiceTaskVO 耦合。
*
* @author smartor
* @date 2026-06-30
*/
@Slf4j
@Component
public class ScheduleSubtaskBuilder {
@Autowired
private ServiceSubtaskMapper serviceSubtaskMapper;
@Autowired
private ServiceSubtaskPreachformMapper serviceSubtaskPreachformMapper;
/**
* 为单个患者派生 subtask(appltype=5)—— 解耦入口(自动纳入 & 手动勾选统一走这里)。
*
* 非循环:按 detailList 一次性铺平 N 条;
* 循环 :按 schedule.currentLoopCount 生成当前轮 N 条,后续轮次由调度器滚动建。
*
* @param serviceTask 主任务(已落库)
* @param schedule 已落库的主计划
* @param detailList 明细列表(按 seq 升序)
* @param baseSubtask 模板 subtask(已填充患者基础信息 + 基准日字段),方法内会深拷贝
* @param preachformList 发送方式(调用方已解析好,可为空)
*/
public void buildSubtasksForPatient(ServiceTask serviceTask,
ServiceTaskSchedule schedule,
List detailList,
ServiceSubtask baseSubtask,
List