package com.ruoyi.task.api.contract; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.ruoyi.common.core.domain.entity.PatArchive; import com.ruoyi.common.core.service.dto.PatMedReq; import com.ruoyi.common.core.service.dto.PatMedRes; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DtoConversionUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.inhospvisit.api.InhospVisitFacade; import com.ruoyi.inhospvisit.domain.PatMedInhosp; import com.ruoyi.inhospvisit.domain.PatMedInhospDTO; import com.ruoyi.inhospvisit.domain.PatMedInhospVO; import com.ruoyi.othervisit.api.OtherVisitFacade; import com.ruoyi.othervisit.domain.PatMedOperationItem; import com.ruoyi.task.api.spi.TaskArchivePort; import com.ruoyi.task.common.ScheduleSubtaskBuilder; import com.ruoyi.task.domain.ServiceSubtask; import com.ruoyi.task.domain.ServiceSubtaskPreachform; import com.ruoyi.task.domain.ServiceTask; import com.ruoyi.task.domain.ServiceTaskRule; import com.ruoyi.task.domain.ServiceTaskSchedule; import com.ruoyi.task.domain.ServiceTaskScheduleDetail; import com.ruoyi.task.domain.ServiceTaskdept; import com.ruoyi.task.domain.ServiceTaskdiag; import com.ruoyi.task.domain.ServiceTaskoper; import com.ruoyi.task.domain.entity.ServiceSubtaskEntity; import com.ruoyi.task.mapper.ServiceSubtaskMapper; import com.ruoyi.task.mapper.ServiceSubtaskPreachformMapper; import com.ruoyi.task.mapper.ServiceTaskMapper; import com.ruoyi.task.mapper.ServiceTaskRuleMapper; import com.ruoyi.task.mapper.ServiceTaskScheduleDetailMapper; import com.ruoyi.task.mapper.ServiceTaskScheduleMapper; import com.ruoyi.task.mapper.ServiceTaskdeptMapper; import com.ruoyi.task.mapper.ServiceTaskdiagMapper; import com.ruoyi.task.mapper.ServiceTaskoperMapper; import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.*; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; /** * 手术随访分支 + 任务组首轮纳入。 * *

位置变更史(两次回退后才落在这里,别再随手挪)

*
    *
  1. 原本在 {@code PatMedInhospServiceImpl}(约 1600 行)里,2026-11 先整簇抽到 * {@code smartor/.../impl/op/OperationSubtaskWriter},原方法改成一行委托 —— * 方法体逐字未变;
  2. *
  3. 尝试整类搬进 {@code ruoyi-othervisit} → Maven 环: * {@code task -> othervisit -> patarchive -> task};
  4. *
  5. 改用 {@code ruoyi-task} + {@code TaskArchivePort} 断环,但当时用脚本摘方法 * 把 1600 行的类改坏,已回退;
  6. *
  7. 本轮(第 7 轮)落在 {@code ruoyi-task}:它本来就拥有 * {@code service_task*} / {@code service_subtask*} 的写能力,且已依赖 * {@code inhospvisit} / {@code othervisit},读档案走 {@link TaskArchivePort}, * 不依赖 ruoyi-patarchive,环彻底消失。
  8. *
* *

⚠️ 只搬位置,不改逻辑

* 方法体与在 smartor 时逐字一致;唯一的数据访问替换是 * {@code patArchiveMapper.selectPatArchiveByPatid(..)} → {@code taskArchivePort.findByPatid(..)} * ({@code TaskArchivePortImpl} 里就是同一个 {@code PatArchiveMapper} 的纯转发)。 * *

谁在调它

* 只经 {@link OtherVisitApiImpl}(本包内)对外,即 {@code ruoyi-common} 的 * {@code OtherVisitApi} 契约;smartor 侧的 {@code OtherVisitApiBridge} 已删除, * {@code IPatMedInhospService} 上的 3 个过渡入口也已一并删除。 */ @Slf4j @Component public class OperationSubtaskWriter { @Value("${spring.profiles.active}") private String active; @Autowired private InhospVisitFacade inhospVisitFacade; @Autowired private OtherVisitFacade otherVisitFacade; @Autowired private TaskArchivePort taskArchivePort; @Autowired private ScheduleSubtaskBuilder scheduleSubtaskBuilder; @Autowired private ServiceSubtaskMapper serviceSubtaskMapper; @Autowired private ServiceSubtaskPreachformMapper serviceSubtaskPreachformMapper; @Autowired private ServiceTaskMapper serviceTaskMapper; @Autowired private ServiceTaskScheduleDetailMapper serviceTaskScheduleDetailMapper; @Autowired private ServiceTaskScheduleMapper serviceTaskScheduleMapper; @Autowired private ServiceTaskoperMapper serviceTaskoperMapper; public int dealOutHospInfoBySchedule(String config) { ServiceTask serviceTaskVo = new ServiceTask(); serviceTaskVo.setLongTask(1); serviceTaskVo.setAppltype("5"); List serviceTasks = serviceTaskMapper.selectServiceTaskList(serviceTaskVo); if (CollectionUtils.isNotEmpty(serviceTasks)) { for (ServiceTask serviceTask : serviceTasks) { if (!ObjectUtils.isEmpty(serviceTask.getTaskid())) { ServiceTaskSchedule serviceTaskSchedule = new ServiceTaskSchedule(); ServiceTaskSchedule taskSchedule = new ServiceTaskSchedule(); taskSchedule.setTaskid(serviceTask.getTaskid()); List serviceTaskSchedules = serviceTaskScheduleMapper.selectServiceTaskScheduleList(taskSchedule); if (CollectionUtils.isNotEmpty(serviceTaskSchedules)) { serviceTaskSchedule = serviceTaskSchedules.get(0); String deptCodes = serviceTaskSchedule.getDeptCodes(); String wardCodes = serviceTaskSchedule.getWardCodes(); String icd10Codes = serviceTaskSchedule.getIcd10Codes(); String opLevelCodes = serviceTaskSchedule.getOplevelCodes(); List icd10CodeList = new ArrayList<>(); List opLevelCodeList = new ArrayList<>(); List deptCodeList = new ArrayList<>(); List wardCodeList = new ArrayList<>(); /** * 随访类型(1-科室,2-病区,3-疾病 4-入院科室 5-入院病区 6-手术) */ Integer type = 1; if (StringUtils.isNotEmpty(deptCodes)) { type = 1; deptCodeList = new ArrayList<>(Arrays.asList(deptCodes.split(","))); } if (StringUtils.isNotEmpty(wardCodes)) { type = 2; wardCodeList = new ArrayList<>(Arrays.asList(wardCodes.split(","))); } if (StringUtils.isNotEmpty(icd10Codes)) { type = 3; icd10CodeList = new ArrayList<>(Arrays.asList(icd10Codes.split(","))); } if (StringUtils.isNotEmpty(opLevelCodes)) { type = 6; opLevelCodeList = new ArrayList<>(Arrays.asList(opLevelCodes.split(","))); } //非手术处理方式 if (type != 6) { PatMedInhosp patMedInhospVo = new PatMedInhosp(); patMedInhospVo.setScheduleCheckFlag("0"); patMedInhospVo.setInhospstate("1"); patMedInhospVo.setFuflag("1"); // patMedInhospVo.setDeptcodeList(deptCodeList); patMedInhospVo.setLeaveldeptcodes(deptCodeList); patMedInhospVo.setLeavehospitaldistrictcodes(wardCodeList); patMedInhospVo.setIcd10codeList(icd10CodeList); List patList = inhospVisitFacade.selectPatMedInhospList(patMedInhospVo); log.info("dealOutHospInfoBySchedule 任务组随访, taskid = {}, 扫描患者人数 {}", serviceTask.getTaskid(), patList.size()); for (PatMedInhosp patMedInhosp : patList) { ServiceTaskScheduleDetail scheduleDetailVo = new ServiceTaskScheduleDetail(); scheduleDetailVo.setTaskid(serviceTask.getTaskid()); scheduleDetailVo.setScheduleid(serviceTaskSchedule.getId()); List serviceTaskScheduleDetails = serviceTaskScheduleDetailMapper.selectServiceTaskScheduleDetailList(scheduleDetailVo); PatArchive patArchive = taskArchivePort.findByPatid(patMedInhosp.getPatid()); if (Objects.isNull(patArchive)) { continue; } //封装serviceSubtask ServiceSubtask serviceSubtask = boxedServiceSubtask(serviceTask, patMedInhosp, patArchive, config, type); List> preachformList = new ArrayList<>(); if (StringUtils.isNotEmpty(serviceTask.getPreachformDesc())) { try { ObjectMapper objectMapper = new ObjectMapper(); preachformList = objectMapper.readValue(serviceTask.getPreachformDesc(), List.class); } catch (Exception e) { log.error("任务组preachformDesc解析失败,taskid={},inhospid={}", serviceTask.getTaskid(), patMedInhosp.getInhospid()); } } scheduleSubtaskBuilder.buildSubtasksForPatient(serviceTask, serviceTaskSchedule, serviceTaskScheduleDetails, serviceSubtask, preachformList); //置首轮纳入标记,避免下次扫描重复生成(后续轮次由 rollTaskGroupCycle 负责) PatMedInhosp flagUpd = new PatMedInhosp(); flagUpd.setInhospid(patMedInhosp.getInhospid()); flagUpd.setScheduleCheckFlag("1"); inhospVisitFacade.updatePatMedInhosp(flagUpd); } } else { //任务组 - 手术随访 if (CollectionUtils.isNotEmpty(opLevelCodeList)) { PatMedOperationItem pmoi = new PatMedOperationItem(); //获取需要出院疾病随访,未处理的数据 pmoi.setOpercheckFlag("0"); pmoi.setMainFlag("1"); pmoi.setDeptCodes(deptCodeList); pmoi.setWardCodes(wardCodeList); pmoi.setOpLevelCodes(opLevelCodeList); //每次查询只查最大的手术等级记录 List patMedOperationItems = otherVisitFacade.selectOperationItemListMaxLevel(pmoi); for (PatMedOperationItem patMedOperationItem : patMedOperationItems) { PatArchive patArchive = taskArchivePort.findByPatid(patMedOperationItem.getPatid()); if (Objects.isNull(patArchive)) { continue; } PatMedInhosp patMedInhospVo = new PatMedInhosp(); patMedInhospVo.setPatid((patMedOperationItem.getPatid())); patMedInhospVo.setScheduleCheckFlag("0"); patMedInhospVo.setInhospstate("1"); patMedInhospVo.setFuflag("1"); List patMedInhospList = inhospVisitFacade.selectPatMedInhospList(patMedInhospVo); if (CollectionUtils.isNotEmpty(patMedInhospList)) { ServiceTaskScheduleDetail scheduleDetailVo = new ServiceTaskScheduleDetail(); scheduleDetailVo.setTaskid(serviceTask.getTaskid()); scheduleDetailVo.setScheduleid(serviceTaskSchedule.getId()); List serviceTaskScheduleDetails = serviceTaskScheduleDetailMapper.selectServiceTaskScheduleDetailList(scheduleDetailVo); //封装serviceSubtask ServiceSubtask serviceSubtask = boxedServiceSubtaskForOp(serviceTask, patMedInhospList.get(0), patMedOperationItem, patArchive, config); List> preachformList = new ArrayList<>(); if (StringUtils.isNotEmpty(serviceTask.getPreachformDesc())) { try { ObjectMapper objectMapper = new ObjectMapper(); preachformList = objectMapper.readValue(serviceTask.getPreachformDesc(), List.class); } catch (Exception e) { log.error("任务组(手术)preachformDesc解析失败,taskid={}", serviceTask.getTaskid()); } } scheduleSubtaskBuilder.buildSubtasksForPatient(serviceTask, serviceTaskSchedule, serviceTaskScheduleDetails, serviceSubtask, preachformList); //置首轮纳入标记,避免重复生成 PatMedInhosp flagUpd = new PatMedInhosp(); flagUpd.setInhospid(patMedInhospList.get(0).getInhospid()); flagUpd.setScheduleCheckFlag("1"); inhospVisitFacade.updatePatMedInhosp(flagUpd); } } } } } } } } return 1; } public void addOperationSubTask(String config) { // 手术随访 PatMedOperationItem pmoi = new PatMedOperationItem(); //获取需要出院手术随访,未处理的数据 if(!active.equals("hzszlyy")){ pmoi.setInhospstate("1"); } pmoi.setOpercheckFlag("0"); pmoi.setMainFlag("1"); //每次查询只查最大的手术等级记录 List patMedOperationItems = otherVisitFacade.selectOperationItemListMaxLevel(pmoi); log.info("dealOutHospInfo需要处理的出院手术患者信息:{}", CollectionUtils.isNotEmpty(patMedOperationItems) ? patMedOperationItems.size() : null); for (PatMedOperationItem opItem : patMedOperationItems) { try { if (StringUtils.isEmpty(opItem.getOplevelcode())) { continue; } // 根据患者的疾病,获取该疾病的长期任务 List serviceTaskopersDept = new ArrayList<>(); if(StringUtils.isNotEmpty(opItem.getLeaveldeptcode())){ ServiceTaskoper serviceTaskoper1 = new ServiceTaskoper(); serviceTaskoper1.setLongtask(1L); serviceTaskoper1.setOrgid(opItem.getOrgid()); serviceTaskoper1.setOplevelcode(opItem.getOplevelcode()); serviceTaskoper1.setDeptCode(opItem.getLeaveldeptcode()); serviceTaskopersDept = serviceTaskoperMapper.selectServiceTaskoperList(serviceTaskoper1); } List serviceTaskopersWard = new ArrayList<>(); if(StringUtils.isNotEmpty(opItem.getLeavehospitaldistrictcode())){ ServiceTaskoper serviceTaskoper2 = new ServiceTaskoper(); serviceTaskoper2.setLongtask(1L); serviceTaskoper2.setOrgid(opItem.getOrgid()); serviceTaskoper2.setOplevelcode(opItem.getOplevelcode()); serviceTaskoper2.setWardCode(opItem.getLeavehospitaldistrictcode()); serviceTaskopersWard = serviceTaskoperMapper.selectServiceTaskoperList(serviceTaskoper2); } List serviceTaskopers = new ArrayList<>(); serviceTaskopers.addAll(serviceTaskopersDept); serviceTaskopers.addAll(serviceTaskopersWard); //如果部门模板为空(将deptIsNull设置为true) if (CollectionUtils.isEmpty(serviceTaskopers) || serviceTaskopers.size() == 0) { PatMedOperationItem patMedOperationItem = otherVisitFacade.selectOperationItemById(opItem.getId()); patMedOperationItem.setOpercheckFlag("2"); patMedOperationItem.setLongTaskReason("所患的手术未配置长期任务;"); patMedOperationItem.setUpdateTime(new Date()); otherVisitFacade.updateOperationItem(patMedOperationItem); } else { for (ServiceTaskoper serviceTaskoper : serviceTaskopers) { writeInSubTaskForOp(serviceTaskoper.getTaskId(), true, opItem, config); } } } catch (Exception e) { e.printStackTrace(); log.error("人员手术处理出异常了:{}", e.getMessage()); opItem.setUpdateTime(new Date()); opItem.setOpercheckFlag("2"); opItem.setLongTaskReason("人员手术处理异常"); otherVisitFacade.updateOperationItem(opItem); } } } public int runOperationVisit(String config) { addOperationSubTask(config); return 1; } private void writeInSubTaskForOp(Long taskid, Boolean check, PatMedOperationItem patMedOperationItem, String config) { String longTaskReason = patMedOperationItem.getLongTaskReason(); String orgId = patMedOperationItem.getOrgid(); if (StringUtils.isEmpty(longTaskReason)) longTaskReason = ""; ServiceTask st = new ServiceTask(); st.setTaskid(taskid); st.setSendState(2L); List serviceTasks = serviceTaskMapper.selectServiceTaskList(st); ServiceTask serviceTask = null; if (CollectionUtils.isEmpty(serviceTasks)) { log.info("该手术对应手术等级的长期任务不存在,任务ID为:{}", taskid); patMedOperationItem.setOpercheckFlag("2"); patMedOperationItem.setLongTaskReason(" & 该手术对应手术等级的长期任务不存在,任务ID为:" + taskid +";"); otherVisitFacade.updateOperationItem(patMedOperationItem); return; } else { serviceTask = serviceTasks.get(0); } if (Objects.isNull(patMedOperationItem.getOplevelcode())) { return; } if (Objects.isNull(patMedOperationItem.getPatid())) { return; } PatArchive patArchive = taskArchivePort.findByPatid(patMedOperationItem.getPatid()); if (Objects.isNull(patArchive)) { return; } PatMedInhosp patMedInhosp = new PatMedInhosp(); patMedInhosp.setPatid((patMedOperationItem.getPatid())); patMedInhosp.setInhospstate("1"); patMedInhosp.setFuflag("1"); //手术随访 if(!active.equals("hzszlyy")){ patMedInhosp.setSerialnum(patMedOperationItem.getSerialnum()); } List patMedInhospList = inhospVisitFacade.selectPatMedInhospList(patMedInhosp); if (CollectionUtils.isEmpty(patMedInhospList)) { return; } //封装serviceSubtask ServiceSubtask serviceSubtask = boxedServiceSubtaskForOp(serviceTask, patMedInhospList.get(0), patMedOperationItem, patArchive, config); if (ObjectUtils.isEmpty(serviceSubtask) || Objects.isNull(serviceSubtask.getTaskid())) { return; } if (StringUtils.isNotEmpty(patMedOperationItem.getLeaveldeptcode())) { serviceSubtask.setVisitDeptCode(patMedOperationItem.getLeaveldeptcode()); serviceSubtask.setVisitDeptName(patMedOperationItem.getLeaveldeptname()); } else { serviceSubtask.setVisitDeptCode(patMedOperationItem.getLeavehospitaldistrictcode()); serviceSubtask.setVisitDeptName(patMedOperationItem.getLeavehospitaldistrictname()); } //记录insertServiceSubtask语句返回状态 Integer i = 0; try { //先判断一下,是否需要校验 if (check && (Objects.isNull(serviceSubtask.getTaskSituation()) || serviceSubtask.getTaskSituation() != 6)) { //在新增之前,先通过患者ID,sendstate=2查询一下,在所有长期任务中,是不是还有该患者待执行的任务,有的话,比较之前的endtime是否小于当前的endtaime,如果之前的小于现在的,则直接将之前的停掉(原因再入院) ServiceSubtaskEntity subtask = new ServiceSubtaskEntity(); subtask.setPatid(patArchive.getId()); subtask.setSendstate(2L); subtask.setTaskid(taskid); List selectServiceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(subtask); // log.info("该患者待执行的任务:{}", CollectionUtils.isNotEmpty(selectServiceSubtaskList) ? selectServiceSubtaskList.size() : null); if (CollectionUtils.isNotEmpty(selectServiceSubtaskList) && selectServiceSubtaskList.size() > 0) { for (ServiceSubtask serviceSubtask1 : selectServiceSubtaskList) { if (Objects.isNull(serviceSubtask1.getLongSendTime())) { //不是长期任务,不处理 continue; } } } else { if (StringUtils.isEmpty(serviceSubtask.getPhone())) { if (StringUtils.isNotEmpty(serviceSubtask.getRemark())) serviceSubtask.setRemark(serviceSubtask.getRemark() + ",手机号为空"); else serviceSubtask.setRemark("手机号为空"); serviceSubtask.setSendstate(4L); serviceSubtask.setResult("error"); } serviceSubtask.setCreateBy(serviceTask.getCreateBy()); serviceSubtask.setCreateTime(new Date()); i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtask); addServiceSubtaskPreachform(serviceSubtask, null); } } else if (serviceSubtask.getTaskSituation() == 6) { //说明该患者是被过滤的,不用再执行了 serviceSubtask.setCreateBy(serviceTask.getCreateBy()); serviceSubtask.setCreateTime(new Date()); serviceSubtask.setSendstate(4L); i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtask); } else { if (StringUtils.isEmpty(serviceSubtask.getPhone())) { if (StringUtils.isNotEmpty(serviceSubtask.getRemark())) serviceSubtask.setRemark(serviceSubtask.getRemark() + ",手机号为空"); else serviceSubtask.setRemark("手机号为空"); serviceSubtask.setSendstate(4L); serviceSubtask.setResult("error"); } serviceSubtask.setCreateBy(serviceTask.getCreateBy()); serviceSubtask.setCreateTime(new Date()); i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtask); addServiceSubtaskPreachform(serviceSubtask, null); } //将check_flag改成1(已处理) if (i == 1) { PatMedOperationItem patMedOperationItem2 = new PatMedOperationItem(); patMedOperationItem2.setId(patMedOperationItem.getId()); patMedOperationItem2.setOpercheckFlag("1"); otherVisitFacade.updateOperationItem(patMedOperationItem2); } else { //生成子任务失败, log.info("生成子任务失败serviceSubtask的taskid为:{},patid为:{}", serviceSubtask.getTaskid(), serviceSubtask.getPatid()); PatMedOperationItem patMedOperationItem2 = new PatMedOperationItem(); patMedOperationItem2.setId(patMedOperationItem.getId()); patMedOperationItem2.setOpercheckFlag("2"); patMedOperationItem2.setLongTaskReason("生成子任务失败 4;"); patMedOperationItem2.setUpdateTime(new Date()); otherVisitFacade.updateOperationItem(patMedOperationItem2); } } catch (Exception e) { //出错回滚事务 log.error("生成子任务报错回滚sserviceSubtask的taskid为:{},patid为:{},手术详情ID为:{}", serviceSubtask.getTaskid(), serviceSubtask.getPatid(), patMedOperationItem.getId(), e); PatMedOperationItem patMedOperationItem2 = new PatMedOperationItem(); patMedOperationItem2.setId(patMedOperationItem.getId()); patMedOperationItem2.setOpercheckFlag("2"); patMedOperationItem2.setUpdateTime(new Date()); patMedOperationItem2.setLongTaskReason("生成子任务报错回滚 4;"); otherVisitFacade.updateOperationItem(patMedOperationItem2); e.printStackTrace(); } } private ServiceSubtask boxedServiceSubtaskForOp(ServiceTask serviceTask, PatMedInhosp patMedInhosp1, PatMedOperationItem patMedOperationItem, PatArchive patArchive, String config) { ServiceSubtask serviceSubtask = DtoConversionUtils.sourceToTarget(serviceTask, ServiceSubtask.class); serviceSubtask.setTaskid(serviceTask.getTaskid()); serviceSubtask.setOrgid(serviceTask.getOrgid()); serviceSubtask.setCampusid(serviceTask.getCampusid()); if (StringUtils.isNotEmpty(serviceTask.getLibtemplateid())) serviceSubtask.setLibtemplateid(Long.valueOf(serviceTask.getLibtemplateid())); serviceSubtask.setNurseId(patMedInhosp1.getNurseId()); serviceSubtask.setNurseName(patMedInhosp1.getNurseName()); serviceSubtask.setInhospid(patMedInhosp1.getInhospid()); serviceSubtask.setDrcode(patMedInhosp1.getDrcode()); serviceSubtask.setDrname(patMedInhosp1.getDrname()); serviceSubtask.setLeaveldeptcode(patMedInhosp1.getLeaveldeptcode()); serviceSubtask.setLeaveldeptname(patMedInhosp1.getLeaveldeptname()); serviceSubtask.setLeavehospitaldistrictcode(patMedInhosp1.getLeavehospitaldistrictcode()); serviceSubtask.setLeavehospitaldistrictname(patMedInhosp1.getLeavehospitaldistrictname()); // 2026-11:重要性标记(含「日间」)随任务走,便于子任务列表直接按日间筛选 serviceSubtask.setImportanceFlagCode(patMedInhosp1.getImportanceFlagCode()); serviceSubtask.setTemplateid(serviceTask.getTemplateid()); serviceSubtask.setTemplatename(serviceTask.getTemplatename()); serviceSubtask.setPatid(patArchive.getId()); serviceSubtask.setSendname(patArchive.getName()); serviceSubtask.setSfzh(patArchive.getIdcardno()); serviceSubtask.setPhone(patArchive.getTelcode()); if (StringUtils.isBlank(patArchive.getTelcode())) serviceSubtask.setPhone(patArchive.getRelativetelcode()); serviceSubtask.setSex(patArchive.getSex()); serviceSubtask.setAge(patArchive.getAge()); serviceSubtask.setSendstate(2L); serviceSubtask.setManagementDoctor(patMedInhosp1.getDrname()); serviceSubtask.setManagementDoctorCode(patMedInhosp1.getDrcode()); serviceSubtask.setStarttime(patMedInhosp1.getStarttime()); serviceSubtask.setEndtime(patMedInhosp1.getEndtime()); serviceSubtask.setServiceType(serviceTask.getServiceType()); serviceSubtask.setPreachform(serviceTask.getPreachform()); serviceSubtask.setHospType("2"); serviceSubtask.setCreateTime(new Date()); serviceSubtask.setUpdateTime(new Date()); serviceSubtask.setCreateBy(patMedInhosp1.getNurseName()); serviceSubtask.setOperationItemId(patMedOperationItem.getId()); serviceSubtask.setUpdateBy(serviceTask.getUpdateBy()); serviceSubtask.setUpdateTime(new Date()); //设置发送时间 if (serviceTask.getSendDay() == null) serviceTask.setSendDay(1L); Date newDate = null; if (!Objects.isNull(patMedInhosp1.getEndtime())) { newDate = addDays(patMedInhosp1.getEndtime(), serviceTask.getSendDay().intValue()); } else { patMedOperationItem.setOpercheckFlag("2"); patMedOperationItem.setLongTaskReason("该患者手术出院时间为空,手术详情ID为:" + patMedOperationItem.getId() + ";"); otherVisitFacade.updateOperationItem(patMedOperationItem); // patMedInhosp1.setDeptcheckFlag("2"); // patMedInhosp1.setRemark(patMedInhosp1.getRemark() + "& 该患者手术出院时间为空,出院记录ID为:" + patMedInhosp1.getInhospid()); // inhospVisitFacade.updatePatMedInhosp(patMedInhosp1); //如果出院时间为空,则返回一个新对象 return null; } serviceSubtask.setLongSendTime(newDate); serviceSubtask.setVisitTime(newDate); //如果是通知的话,需要提前几天将通过短信发出去(具体几天,这个可以配置在sys_conf表中) if ("3".equals(serviceTask.getType())) { serviceSubtask.setVisitTime(minusDay(newDate, StringUtils.isNotEmpty(config) ? Integer.parseInt(config) : 0)); } //患者发送时间 if (StringUtils.isNotEmpty(patArchive.getNotrequiredFlag()) && patArchive.getNotrequiredFlag().equals("1")) { String remark = patArchive.getNotrequiredreason(); serviceSubtask.setRemark(remark); serviceSubtask.setResult("error"); serviceSubtask.setTaskSituation(6); //不执行 serviceSubtask.setSendstate(4L); } return serviceSubtask; } private Integer addServiceSubtaskPreachform(ServiceSubtask serviceSubtask, String sendstate) { //将preachformDesc的json对象,放到list集合中 ServiceTask serviceTask = serviceTaskMapper.selectServiceTaskByTaskid(serviceSubtask.getTaskid()); if (Objects.isNull(serviceTask)) { log.error("addServiceSubtaskPreachform taskid={} 查不到任务,跳过preachform子表生成", serviceSubtask.getTaskid()); return 0; } String preachformDesc = serviceTask.getPreachformDesc(); ObjectMapper objectMapper = new ObjectMapper(); if (org.apache.commons.lang3.StringUtils.isNotEmpty(preachformDesc)) { List serviceSubtaskPreachformList = null; try { serviceSubtaskPreachformList = objectMapper.readValue(preachformDesc, new TypeReference>() { }); } catch (JsonProcessingException e) { log.error("preachform转List报错了:{}", e.getMessage()); } if (CollectionUtils.isEmpty(serviceSubtaskPreachformList)) { log.error("preachformDesc解析后为空,跳过preachform子表生成,taskid为:{},preachformDesc为:{}", serviceSubtask.getTaskid(), preachformDesc); return 0; } for (ServiceSubtaskPreachform serviceSubtaskPreachform : serviceSubtaskPreachformList) { serviceSubtaskPreachform.setTaskid(serviceSubtask.getTaskid()); serviceSubtaskPreachform.setSubid(serviceSubtask.getId()); //先查询一下,是否存在,如果已经存在,就不新增了 List serviceSubtaskPreachformList1 = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform); if (CollectionUtils.isNotEmpty(serviceSubtaskPreachformList1)) continue; //这个sendstate需要在数据库设置一个默认值为“1” serviceSubtaskPreachform.setSendstate("1"); if (StringUtils.isNotEmpty(sendstate)) serviceSubtaskPreachform.setSendstate(sendstate); serviceSubtaskPreachform.setOrgid(serviceSubtask.getOrgid()); serviceSubtaskPreachformMapper.insertServiceSubtaskPreachform(serviceSubtaskPreachform); } } return 0; } public ServiceSubtask boxedServiceSubtask(ServiceTask serviceTask, PatMedInhosp patMedInhosp1, PatArchive patArchive, String config, Integer type) { //增加serviceTask判空 // if(Objects.isNull(serviceTask)){ // return null; // } ServiceSubtask serviceSubtask = DtoConversionUtils.sourceToTarget(serviceTask, ServiceSubtask.class); serviceSubtask.setTaskid(serviceTask.getTaskid()); serviceSubtask.setOrgid(serviceTask.getOrgid()); serviceSubtask.setCampusid(serviceTask.getCampusid()); if (StringUtils.isNotEmpty(serviceTask.getLibtemplateid())) serviceSubtask.setLibtemplateid(Long.valueOf(serviceTask.getLibtemplateid())); serviceSubtask.setNurseId(patMedInhosp1.getNurseId()); serviceSubtask.setNurseName(patMedInhosp1.getNurseName()); serviceSubtask.setInhospid(patMedInhosp1.getInhospid()); serviceSubtask.setDrcode(patMedInhosp1.getDrcode()); serviceSubtask.setDrname(patMedInhosp1.getDrname()); serviceSubtask.setLeaveldeptcode(patMedInhosp1.getLeaveldeptcode()); serviceSubtask.setLeaveldeptname(patMedInhosp1.getLeaveldeptname()); serviceSubtask.setLeavehospitaldistrictcode(patMedInhosp1.getLeavehospitaldistrictcode()); serviceSubtask.setLeavehospitaldistrictname(patMedInhosp1.getLeavehospitaldistrictname()); if (type == 4 || type == 5) { //设置入院的 serviceSubtask.setLeaveldeptcode(patMedInhosp1.getDeptcode()); serviceSubtask.setLeaveldeptname(patMedInhosp1.getDeptname()); serviceSubtask.setLeavehospitaldistrictcode(patMedInhosp1.getHospitaldistrictcode()); serviceSubtask.setLeavehospitaldistrictname(patMedInhosp1.getHospitaldistrictname()); } serviceSubtask.setLeaveicd10code(patMedInhosp1.getLeaveicd10code()); serviceSubtask.setLeavediagname(patMedInhosp1.getLeavediagname()); serviceSubtask.setDiagname(patMedInhosp1.getDiagname()); // 2026-11:重要性标记(含「日间」)随任务走(口径同上) serviceSubtask.setImportanceFlagCode(patMedInhosp1.getImportanceFlagCode()); serviceSubtask.setTemplateid(serviceTask.getTemplateid()); serviceSubtask.setTemplatename(serviceTask.getTemplatename()); serviceSubtask.setPatid(patArchive.getId()); serviceSubtask.setSendname(patArchive.getName()); serviceSubtask.setSfzh(patArchive.getIdcardno()); serviceSubtask.setPhone(patArchive.getTelcode()); if (StringUtils.isBlank(patArchive.getTelcode())) serviceSubtask.setPhone(patArchive.getRelativetelcode()); serviceSubtask.setSex(patArchive.getSex()); serviceSubtask.setAge(patArchive.getAge()); serviceSubtask.setSendstate(2L); serviceSubtask.setCampusid(patMedInhosp1.getCampusid()); serviceSubtask.setManagementDoctor(patMedInhosp1.getManagementDoctor()); serviceSubtask.setManagementDoctorCode(patMedInhosp1.getManagementDoctorCode()); serviceSubtask.setStarttime(patMedInhosp1.getStarttime()); serviceSubtask.setEndtime(patMedInhosp1.getEndtime()); serviceSubtask.setServiceType(serviceTask.getServiceType()); serviceSubtask.setPreachform(serviceTask.getPreachform()); serviceSubtask.setHospType("2"); if (type == 4 || type == 5) serviceSubtask.setHospType("6"); serviceSubtask.setCreateTime(new Date()); serviceSubtask.setUpdateTime(new Date()); serviceSubtask.setCreateBy(patMedInhosp1.getNurseName()); serviceSubtask.setLeavehospitaldistrictcode(patMedInhosp1.getLeavehospitaldistrictcode()); serviceSubtask.setLeavehospitaldistrictname(patMedInhosp1.getLeavehospitaldistrictname()); serviceSubtask.setUpdateBy(serviceTask.getUpdateBy()); serviceSubtask.setUpdateTime(new Date()); //如果是宣教就设置为7 if (serviceTask.getServiceType().equals("17")) serviceSubtask.setTaskSituation(7); //设置发送时间 if (serviceTask.getSendDay() == null) serviceTask.setSendDay(1L); Date newDate = null; if (!Objects.isNull(patMedInhosp1.getEndtime())) { newDate = addDays(patMedInhosp1.getEndtime(), serviceTask.getSendDay().intValue()); } else { //如果等于4,说明是入院宣教,入院不可能有endTime if (type != 4 && type != 5) { patMedInhosp1.setDeptcheckFlag("2"); patMedInhosp1.setRemark(patMedInhosp1.getRemark() + "& 该患者疾病出院时间为空,出院记录ID为:" + patMedInhosp1.getInhospid()); inhospVisitFacade.updatePatMedInhosp(patMedInhosp1); //如果出院时间为空,则返回一个新对象 return new ServiceSubtask(); } //入院宣教,基本当天或隔天就要发出 newDate = addDays(new Date(), serviceTask.getSendDay().intValue()); } serviceSubtask.setLongSendTime(newDate); serviceSubtask.setVisitTime(newDate); // if (patMedInhosp1.getFudate() != null && !patMedInhosp1.getOrgid().equals("47255004333112711A1001")) serviceSubtask.setVisitTime(patMedInhosp1.getFudate()); //如果是通知的话,需要提前几天将通过短信发出去(具体几天,这个可以配置在sys_conf表中) if ("3".equals(serviceTask.getType())) { serviceSubtask.setVisitTime(minusDay(newDate, StringUtils.isNotEmpty(config) ? Integer.parseInt(config) : 0)); //如果该出院记录有随访时间,则用他自己的随访时间 if (patMedInhosp1.getFudate() != null) { serviceSubtask.setVisitTime(minusDay(patMedInhosp1.getFudate(), StringUtils.isNotEmpty(config) ? Integer.parseInt(config) : 0)); } else { //判断是不是景宁 if (patMedInhosp1.getOrgid().equals("47255004333112711A1001")) { serviceSubtask.setVisitTime(null); //不执行 serviceSubtask.setSendstate(4L); serviceSubtask.setRemark("景宁没有给随访时间,不发送通知短信"); } } } //如果患者的入院和出院时间一致,可以不用随访(南华附一肿瘤一病区提出) if (active.equals("nhfy") && patMedInhosp1.getStarttime() != null && patMedInhosp1.getEndtime() != null && DateUtils.differentDaysByMillisecond(patMedInhosp1.getStarttime(), patMedInhosp1.getEndtime()) == 0) { serviceSubtask.setRemark("患者当天出院,不用随访"); serviceSubtask.setResult("error"); //不执行 serviceSubtask.setSendstate(4L); } //患者发送时间 if (StringUtils.isNotEmpty(patArchive.getNotrequiredFlag()) && patArchive.getNotrequiredFlag().equals("1")) { String remark = patArchive.getNotrequiredreason(); serviceSubtask.setRemark(remark); serviceSubtask.setResult("error"); serviceSubtask.setTaskSituation(6); //不执行 serviceSubtask.setSendstate(4L); } return serviceSubtask; } private Date addDays(Date date, Integer days) { if (days == null) { days = 1; } Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.DAY_OF_MONTH, days); return calendar.getTime(); } public Date minusDay(Date originalDate, Integer day) { // 1. 将 Date 转换为 Instant Instant instant = originalDate.toInstant(); // 2. 在 Instant 上减去2天 Instant twoDaysAgoInstant = instant.minus(2, ChronoUnit.DAYS); // 3. 将计算后的 Instant 转回 Date return Date.from(twoDaysAgoInstant); } }