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;
|
|
/**
|
* 手术随访分支 + 任务组首轮纳入。
|
*
|
* <h3>位置变更史(两次回退后才落在这里,别再随手挪)</h3>
|
* <ol>
|
* <li>原本在 {@code PatMedInhospServiceImpl}(约 1600 行)里,2026-11 先整簇抽到
|
* {@code smartor/.../impl/op/OperationSubtaskWriter},原方法改成一行委托 ——
|
* <b>方法体逐字未变</b>;</li>
|
* <li>尝试整类搬进 {@code ruoyi-othervisit} → <b>Maven 环</b>:
|
* {@code task -> othervisit -> patarchive -> task};</li>
|
* <li>改用 {@code ruoyi-task} + {@code TaskArchivePort} 断环,但当时用脚本摘方法
|
* 把 1600 行的类改坏,已回退;</li>
|
* <li>本轮(第 7 轮)落在 {@code ruoyi-task}:它本来就拥有
|
* {@code service_task*} / {@code service_subtask*} 的写能力,且已依赖
|
* {@code inhospvisit} / {@code othervisit},读档案走 {@link TaskArchivePort},
|
* <b>不依赖 ruoyi-patarchive</b>,环彻底消失。</li>
|
* </ol>
|
*
|
* <h3>⚠️ 只搬位置,不改逻辑</h3>
|
* 方法体与在 smartor 时逐字一致;唯一的数据访问替换是
|
* {@code patArchiveMapper.selectPatArchiveByPatid(..)} → {@code taskArchivePort.findByPatid(..)}
|
* ({@code TaskArchivePortImpl} 里就是同一个 {@code PatArchiveMapper} 的纯转发)。
|
*
|
* <h3>谁在调它</h3>
|
* 只经 {@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<ServiceTask> 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<ServiceTaskSchedule> 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<String> icd10CodeList = new ArrayList<>();
|
List<String> opLevelCodeList = new ArrayList<>();
|
List<String> deptCodeList = new ArrayList<>();
|
List<String> 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<PatMedInhosp> 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<ServiceTaskScheduleDetail> 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<Map<String, Object>> 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<PatMedOperationItem> 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<PatMedInhosp> patMedInhospList = inhospVisitFacade.selectPatMedInhospList(patMedInhospVo);
|
if (CollectionUtils.isNotEmpty(patMedInhospList)) {
|
ServiceTaskScheduleDetail scheduleDetailVo = new ServiceTaskScheduleDetail();
|
scheduleDetailVo.setTaskid(serviceTask.getTaskid());
|
scheduleDetailVo.setScheduleid(serviceTaskSchedule.getId());
|
List<ServiceTaskScheduleDetail> serviceTaskScheduleDetails = serviceTaskScheduleDetailMapper.selectServiceTaskScheduleDetailList(scheduleDetailVo);
|
//封装serviceSubtask
|
ServiceSubtask serviceSubtask = boxedServiceSubtaskForOp(serviceTask, patMedInhospList.get(0), patMedOperationItem, patArchive, config);
|
List<Map<String, Object>> 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<PatMedOperationItem> 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<ServiceTaskoper> 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<ServiceTaskoper> 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<ServiceTaskoper> 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<ServiceTask> 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<PatMedInhosp> 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<ServiceSubtask> 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<ServiceSubtaskPreachform> serviceSubtaskPreachformList = null;
|
try {
|
serviceSubtaskPreachformList = objectMapper.readValue(preachformDesc, new TypeReference<List<ServiceSubtaskPreachform>>() {
|
});
|
} catch (JsonProcessingException e) {
|
log.error("preachform转List<ServiceSubtaskPreachform>报错了:{}", 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<ServiceSubtaskPreachform> 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);
|
}
|
|
}
|