package com.ruoyi.quartz.task;
|
|
import com.alibaba.fastjson2.JSONObject;
|
import com.fasterxml.jackson.databind.JsonNode;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.google.gson.Gson;
|
import com.ruoyi.common.core.redis.RedisCache;
|
import com.ruoyi.common.dx.MessageSend;
|
import com.ruoyi.common.enums.MsgLSEnum;
|
import com.ruoyi.common.enums.ServiceFromEnum;
|
import com.ruoyi.common.enums.WxGZHEnum;
|
import com.ruoyi.common.utils.HttpUtil;
|
import com.ruoyi.common.utils.OkHttpExample;
|
import com.ruoyi.common.utils.RSAPublicKeyExample;
|
import com.ruoyi.common.utils.StringUtils;
|
import com.ruoyi.common.utils.http.HttpUtils;
|
import com.ruoyi.common.utils.sms.smsUtils;
|
import com.ruoyi.quartz.service.ICollectHISService;
|
import com.ruoyi.system.service.ISysConfigService;
|
import com.smartor.common.LSHospTokenUtil;
|
import com.smartor.domain.*;
|
import com.smartor.mapper.*;
|
import com.smartor.service.*;
|
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.beans.factory.annotation.Value;
|
import org.springframework.stereotype.Component;
|
|
import java.io.IOException;
|
import java.net.URLEncoder;
|
import java.nio.charset.StandardCharsets;
|
import java.nio.file.Files;
|
import java.nio.file.Paths;
|
import java.security.MessageDigest;
|
import java.time.LocalDate;
|
import java.time.LocalDateTime;
|
import java.time.LocalTime;
|
import java.time.ZoneId;
|
import java.time.format.DateTimeFormatter;
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
import static cn.hutool.core.convert.Convert.toHex;
|
|
/**
|
* 定时任务调度测试
|
*
|
* @author ruoyi
|
*/
|
@Slf4j
|
@Component("ryTask")
|
public class RyTask {
|
@Autowired
|
private IServiceThirdDataService iServiceThirdDataService;
|
|
@Autowired
|
private IServiceOutPathService iServiceOutPathService;
|
|
@Autowired
|
private IServiceSubtaskAnswerService serviceSubtaskAnswerService;
|
|
@Autowired
|
private IPatMedInhospService iPatMedInhospService;
|
|
@Autowired
|
private IPatMedOuthospService iPatMedOuthospService;
|
|
@Autowired
|
private IPatMedOperationService iPatMedOperationService;
|
|
@Autowired
|
private IServiceSubtaskService iServiceSubtaskService;
|
|
@Autowired
|
private IServicePatientTempService iServicePatientTempService;
|
|
@Autowired
|
private IHNGatherPatArchiveService ihnGatherPatArchiveService;
|
|
@Autowired
|
private IServiceSLTDHealthcareRecordService serviceSLTDHealthcareRecordService;
|
|
@Autowired
|
private SysUserImportMapper sysUserImportMapper;
|
|
@Autowired
|
private HeLibraryMapper heLibraryMapper;
|
|
@Autowired
|
private ICollectHISService ichService;
|
|
@Autowired
|
private ISysConfigService configService;
|
|
@Value("${localIP}")
|
private String localIP;
|
|
@Value("${xhsmsPath}")
|
private String xhsmsPath;
|
|
@Value("${xhsmsAccount}")
|
private String xhsmsAccount;
|
|
@Value("${xhsmsPwd}")
|
private String xhsmsPwd;
|
|
@Value("${pub_key}")
|
private String pub_key;
|
|
@Value("${req_path}")
|
private String req_path;
|
|
@Value("${visitHosp}")
|
private Integer visitHosp;
|
|
@Autowired
|
private ServiceTaskMapper serviceTaskMapper;
|
|
@Autowired
|
private ServiceSubtaskMapper serviceSubtaskMapper;
|
|
@Autowired
|
private RedisCache redisCache;
|
|
@Autowired
|
private IServiceSubtaskRecordService serviceSubtaskRecordService;
|
|
@Autowired
|
IBaseSmsaccountService baseSmsaccountService;
|
|
@Autowired
|
IPatArchiveService patArchiveService;
|
|
|
@Autowired
|
IPatMedOuthospService patMedOuthospService;
|
|
@Autowired
|
ISvyTaskTemplateService svyTaskTemplateService;
|
|
@Autowired
|
IIvrTaskTemplateService iIvrTaskTemplateService;
|
|
@Autowired
|
IXHGatherPatArchiveService ixhGatherPatArchiveService;
|
|
@Autowired
|
ServiceSubtaskPreachformMapper serviceSubtaskPreachformMapper;
|
|
@Autowired
|
ICollectHISService icollectHis;
|
|
|
@Value("${appid}")
|
private String appid;
|
|
@Value("${server.port}")
|
private String port;
|
|
|
@Value("${spring.profiles.active}")
|
private String active;
|
|
public void ryMultipleParams(String s, Boolean b, Long l, Double d, Integer i) {
|
System.out.println(StringUtils.format("执行多参方法: 字符串类型{},布尔类型{},长整型{},浮点型{},整形{}", s, b, l, d, i));
|
}
|
|
public void ryParams(String params) {
|
System.out.println("执行有参方法:" + params);
|
}
|
|
public void ryNoParams() {
|
System.out.println("执行无参方法");
|
}
|
|
public void importData() {
|
String filePath = "C:\\Users\\86176\\Desktop\\新建文本文档 4.txt"; // 替换为你的文件路径
|
|
try {
|
// 读取文件内容
|
String jsonContent = new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8);
|
|
// 创建ObjectMapper对象
|
ObjectMapper objectMapper = new ObjectMapper();
|
// 解析JSON为JsonNode
|
JsonNode rootNode = objectMapper.readTree(jsonContent);
|
// 获取resultList
|
JsonNode resultListNode = rootNode.path("results").path("resultList");
|
// 遍历resultList中的每个对象
|
for (JsonNode item : resultListNode) {
|
|
SysUserImport person = objectMapper.treeToValue(item, SysUserImport.class);
|
person.setStaffPhoto("");
|
sysUserImportMapper.insertSysUserImport(person);
|
|
}
|
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
|
}
|
|
public void analysisData() {
|
System.out.println("---------------------------");
|
//数据解析
|
ServiceThirdData serviceThirdData = new ServiceThirdData();
|
serviceThirdData.setDataType("ADT^A03");
|
serviceThirdData.setIsDeal(0);
|
serviceThirdData.setCreateTime(new Date());
|
iServiceThirdDataService.queryList(serviceThirdData);
|
|
}
|
|
/**
|
* 定时处理外链的数据
|
*/
|
public void runServiceSubTaskAnswer() {
|
serviceSubtaskAnswerService.saveQuestionAnswer(null, 0L);
|
}
|
|
|
/**
|
* 处理HIS数据采集
|
* 定时任务:采集患者信息、出院、门诊数据
|
*/
|
public void dealHisData() {
|
log.info("【dealHisData】开始执行HIS数据采集任务");
|
// 获取昨天0点到今天0点的时间范围
|
LocalDateTime todayZero = LocalDateTime.now().with(LocalTime.MIN);
|
LocalDateTime yesterdayZero = todayZero.minusDays(1);
|
log.info("【dealHisData】采集时间范围:{} ~ {}", yesterdayZero, todayZero);
|
|
if (active.trim().equals("xh")) {
|
try {
|
// 采集入院数据
|
log.info("【dealHisData】新华开始采集入院数据");
|
ixhGatherPatArchiveService.getInHospDataGather("0", yesterdayZero, todayZero);
|
log.info("【dealHisData】新华入院数据采集完成");
|
|
// 采集出院数据
|
log.info("【dealHisData】新华开始采集出院数据");
|
ixhGatherPatArchiveService.getInHospDataGather("1", yesterdayZero, todayZero);
|
log.info("【dealHisData】新华出院数据采集完成");
|
|
} catch (Exception e) {
|
log.error("【dealHisData】新华数据采集异常", e);
|
}
|
} else if (active.trim().equals("hn")) {
|
try {
|
// 河南数据采集
|
HnDataGatherVO hnDataGatherVO = new HnDataGatherVO();
|
log.info("【dealHisData】河南开始采集数据");
|
Date startTime = Date.from(yesterdayZero.atZone(ZoneId.systemDefault()).toInstant());
|
Date endTime = Date.from(todayZero.atZone(ZoneId.systemDefault()).toInstant());
|
|
hnDataGatherVO.setStartTime(startTime);
|
hnDataGatherVO.setEndTime(endTime);
|
ihnGatherPatArchiveService.hnDataGather(hnDataGatherVO);
|
log.info("【dealHisData】河南结束采集数据");
|
} catch (Exception e) {
|
log.error("【dealHisData】河南数据采集异常", e);
|
}
|
} else if (active.trim().equals("sltd")) {
|
try {
|
// 省立同德数据采集
|
log.info("【dealHisData】省立同德“入院”开始采集数据");
|
String yesterday = LocalDate.now().minusDays(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
ServiceSLTDInhospReqVO serviceSLTDInhospReqVO = new ServiceSLTDInhospReqVO();
|
serviceSLTDInhospReqVO.setOrgId("20001001");
|
serviceSLTDInhospReqVO.setCampusId(30001002L);
|
serviceSLTDInhospReqVO.setStartHeadTime(yesterday);
|
serviceSLTDInhospReqVO.setStartTailTime(yesterday);
|
List<String> list = new ArrayList<>();
|
list.add("FH0108.02");
|
serviceSLTDInhospReqVO.setHealthcareRecordTypeList(list);
|
serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
|
log.info("【dealHisData】省立同德“入院”結束采集数据");
|
|
log.info("【dealHisData】省立同德“门急诊”开始采集数据");
|
serviceSLTDInhospReqVO.setStartHeadTime(null);
|
serviceSLTDInhospReqVO.setStartTailTime(null);
|
serviceSLTDInhospReqVO.setEncounterTimeStart(yesterday);
|
serviceSLTDInhospReqVO.setEncounterTimeEnd(yesterday);
|
List<String> list1 = new ArrayList<>();
|
list1.add("FH0108.01");
|
list1.add("FH0108.03");
|
serviceSLTDInhospReqVO.setHealthcareRecordTypeList(list1);
|
serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
|
log.info("【dealHisData】河南结“门急诊”束采集数据");
|
|
log.info("【dealHisData】省立同德“出院”开始采集数据");
|
serviceSLTDInhospReqVO.setStartHeadTime(null);
|
serviceSLTDInhospReqVO.setStartTailTime(null);
|
serviceSLTDInhospReqVO.setEncounterTimeStart(null);
|
serviceSLTDInhospReqVO.setEncounterTimeEnd(null);
|
serviceSLTDInhospReqVO.setPreOutHospitalHeadDate(yesterday);
|
serviceSLTDInhospReqVO.setPreOutHospitalTailDate(yesterday);
|
List<String> list2 = new ArrayList<>();
|
list2.add("FH0108.02");
|
serviceSLTDInhospReqVO.setHealthcareRecordTypeList(list2);
|
serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
|
log.info("【dealHisData】河南结“出院”束采集数据");
|
|
} catch (Exception e) {
|
log.error("【dealHisData】省立同德数据采集异常", e);
|
}
|
}
|
}
|
|
/**
|
* 这个只是新华临时使用,平时用不到
|
*/
|
public void dealHisData2() {
|
//将患者信息、出入院数据全部采集
|
// 指定的开始日期
|
LocalDate endDate = LocalDate.of(2025, 3, 3);
|
// 当前日期
|
LocalDate currentDate = LocalDate.now();
|
// 定义日期格式
|
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd ");
|
|
// 从开始日期到当前日期逐天打印
|
for (LocalDate date = endDate; !date.isAfter(currentDate); date = date.plusDays(1)) {
|
System.out.println(date.format(formatter));
|
ixhGatherPatArchiveService.getInHospDataGather("0", date.minusDays(1).atStartOfDay(), date.atStartOfDay());
|
ixhGatherPatArchiveService.getInHospDataGather("1", date.minusDays(1).atStartOfDay(), date.atStartOfDay());
|
}
|
|
}
|
|
/**
|
* 处理患者信息,进入子任务表
|
*/
|
public void dealOutHospInfo() {
|
if (port.equals("8095")) {
|
//出院表
|
iPatMedInhospService.dealOutHospInfo();
|
//门诊表
|
if (visitHosp != 1) {
|
iPatMedOuthospService.dealOutpatientInfo();
|
}
|
}
|
}
|
|
|
/**
|
* 处理手术信息,进入子任务表
|
*/
|
public void dealOperationInfo() {
|
if (port.equals("8095")) iPatMedOperationService.dealOperationInfo();
|
|
}
|
|
/**
|
* 处理患者信息,进入子任务表(微信小程序)
|
*/
|
public void dealOutHospInfoXHC() {
|
if (port.equals("8095")) {
|
PatMedInhosp patMedInhosp = new PatMedInhosp();
|
//获取未处理的数据
|
List<ServicePatientTemp> servicePatientTemps = iServicePatientTempService.selectServicePatientTempList(new ServicePatientTemp());
|
}
|
}
|
|
|
/**
|
* 长期任务执行
|
*/
|
public void longTaskSend() {
|
//获取任务信息
|
ServiceTask st = new ServiceTask();
|
st.setDelFlag("0");
|
st.setLongTask(1);
|
List<ServiceTask> serviceTasks = serviceTaskMapper.selectServiceTaskList(st);
|
log.info("【longTaskSend】获取到{}个长期任务", serviceTasks.size());
|
for (ServiceTask serviceTask : serviceTasks) {
|
CommonTaskcallMQ commonTaskcallMQ = new CommonTaskcallMQ();
|
commonTaskcallMQ.setTaskid(serviceTask.getTaskid());
|
commonTaskcallMQ.setPreachform(serviceTask.getPreachform());
|
commonTaskcallMQ.setSendType("2");
|
|
//通过任务ID拿到患者信息,并且随访时间得是今天之前的
|
ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
|
serviceSubtaskVO.setTaskid(commonTaskcallMQ.getTaskid());
|
serviceSubtaskVO.setSendstate(2L);
|
serviceSubtaskVO.setVisitTime(new Date());
|
List<ServiceSubtask> selectServiceSubtaskList = serviceSubtaskMapper.queryServiceSubtaskList(serviceSubtaskVO);
|
for (ServiceSubtask serviceSubtask : selectServiceSubtaskList) {
|
sfHandlle(serviceSubtask);
|
}
|
|
}
|
}
|
|
/**
|
* 处理补偿任务
|
*/
|
public void compensateTask() {
|
//获取到sendstate=3 并且 visit_time为今天的subtask
|
ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
|
serviceSubtaskVO.setSendstate(3L);
|
serviceSubtaskVO.setVisitTime(new Date());
|
List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
|
for (ServiceSubtask serviceSubtask : serviceSubtaskList) {
|
//根据当前的执行方式,获取下一种执行方式
|
ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
|
serviceSubtaskPreachform.setTaskid(serviceSubtask.getTaskid());
|
serviceSubtaskPreachform.setSubid(serviceSubtask.getId());
|
serviceSubtaskPreachform.setOrgid(serviceSubtask.getOrgid());
|
List<ServiceSubtaskPreachform> serviceSubtaskPreachforms = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
|
//获取当前执行方式的序号
|
Optional<Long> currentSort = serviceSubtaskPreachforms.stream().filter(item -> serviceSubtask.getCurrentPreachform().equals(item.getPreachform())).map(ServiceSubtaskPreachform::getSort).findFirst();
|
Optional<Long> id = serviceSubtaskPreachforms.stream().filter(item -> serviceSubtask.getCurrentPreachform().equals(item.getPreachform())).map(ServiceSubtaskPreachform::getId).findFirst();
|
if (currentSort.isPresent()) {
|
//1先检查一下,是不是有执行状态是完成的(怕之前已经有完的了,没有将servuce_subtask的状态改成功,这里再检查一下)
|
boolean finishState = serviceSubtaskPreachforms.stream().allMatch(item -> item.getSendstate().equals("9"));
|
if (finishState) {
|
serviceSubtask.setSendstate(6L);
|
serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
|
continue;
|
}
|
|
//2判断一下,当前的sort是不是等于需要执行的总个数,如果等于的话,说明是最后一个,直接将servuce_subtask的状态改成5,执行失败就行了
|
Long cs = currentSort.get();
|
if (cs.equals(serviceSubtaskPreachforms.size())) {
|
serviceSubtask.setSendstate(5L);
|
serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
|
//修改发送方式的状态为失败
|
serviceSubtaskPreachform.setSendstate("5");
|
serviceSubtaskPreachform.setId(id.get());
|
serviceSubtaskPreachformMapper.updateServiceSubtaskPreachform(serviceSubtaskPreachform);
|
continue;
|
}
|
|
//3.不是最后一个,获取到下一个执行方式(因为都是在今天执行,那就直接发出去就完了)
|
sfHandlle(serviceSubtask);
|
|
}
|
|
}
|
|
}
|
|
|
/**
|
* 判断日期是否是今天
|
*
|
* @param date
|
* @return
|
*/
|
public boolean isDateToday(Date date) {
|
if (date == null) {
|
return false;
|
}
|
// 将 Date 转为 LocalDate
|
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
|
// 获取今天的 LocalDate
|
LocalDate today = LocalDate.now();
|
// 如果日期早于或等于今天,返回 true
|
return !localDate.isAfter(today);
|
}
|
|
public void sfHandlle(ServiceSubtask serviceSubtask) {
|
//这里需要根据身份证去重(给微信小程序的固定任务用的)
|
List<ServiceSubtask> serviceSubtaskListFilter = new ArrayList<>();
|
ServiceTask ivrTask1 = serviceTaskMapper.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
|
ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
|
serviceSubtaskPreachform.setTaskid(serviceSubtask.getTaskid());
|
serviceSubtaskPreachform.setSubid(serviceSubtask.getId());
|
//获取发送方式
|
String sendPreachform = getSendPreachform(serviceSubtaskPreachform, serviceSubtask);
|
if (sendPreachform.equals("-1") || serviceSubtask.getSendstate() == 6 || serviceSubtask.getSendstate() == 5 || serviceSubtask.getSendstate() == 4) {
|
//说明已经全部遍历完了,当前的执行方式序号是最后一个了 或者 该患者已经随访结束(成功或失败了或不执行)
|
return;
|
}
|
//先判断患者是不是还要发送
|
PatArchive patArchive = patArchiveService.selectPatArchiveByPatid(serviceSubtask.getPatid());
|
if (!Objects.isNull(patArchive) && patArchive.getNotrequiredFlag() == "1") {
|
//不需要发送
|
serviceSubtask.setResult("患者不需要随访");
|
serviceSubtask.setRemark(patArchive.getNotrequiredreason());
|
serviceSubtask.setSendstate(4L);
|
iServiceSubtaskService.insertServiceSubtask(serviceSubtask);
|
setSuccessPreachForm(serviceSubtask, "-1", "不需要执行", "6");
|
return;
|
}
|
|
String descByCode = ServiceFromEnum.getDescByCode(Integer.valueOf(sendPreachform));
|
if (descByCode.equals("电话")) {
|
List<String> list = new ArrayList<>();
|
ServiceTask ivrTask = serviceTaskMapper.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
|
if (ivrTask.getSendState() != null && ivrTask.getSendState() == 3 || ivrTask.getSendState() != null && ivrTask.getSendState() == 4) {
|
//如何任务被"暂停"或"终止"
|
return;
|
}
|
|
if (org.apache.commons.lang3.StringUtils.isEmpty(serviceSubtask.getPhone())) {
|
setSuccessPreachForm(serviceSubtask, sendPreachform, "手机号为空", "4");
|
return;
|
}
|
boolean dateToday = isDateToday(serviceSubtask.getVisitTime());
|
//说明是立即发送(先把消息放到cache-0中, displayNo不知道怎么配置)
|
if (dateToday) {
|
list.add(serviceSubtask.getId().toString());
|
//在子任务表里记录一下
|
setSuccessPreachForm(serviceSubtask, sendPreachform, "长期任务,电话进入队列成功", "2");
|
//任务发送记录
|
ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord();
|
serviceSubtaskRecord.setTaskid(serviceSubtask.getTaskid().toString());
|
serviceSubtaskRecord.setSubtaskId(serviceSubtask.getId());
|
serviceSubtaskRecord.setUuid(UUID.randomUUID().toString());
|
serviceSubtaskRecord.setTasktype(serviceSubtask.getType());
|
serviceSubtaskRecord.setPreachform("3");
|
serviceSubtaskRecord.setStartTime(System.currentTimeMillis());
|
serviceSubtaskRecord.setRemark("长期任务,电话进入队列成功");
|
serviceSubtaskRecordService.insertServiceSubtaskRecord(serviceSubtaskRecord);
|
}
|
//将要执行的放到缓存中
|
if (list.size() > 0) {
|
redisCache.setCacheListLeftAndDistinct("cache-0", list);
|
log.info("【sfHandlle】电话任务已加入队列,数量:{}", list.size());
|
}
|
} else if (descByCode.equals("微信小程序")) {
|
//微信小程序
|
if (ObjectUtils.isNotEmpty(ivrTask1) && ivrTask1.getPatCycle() == 1) {
|
//说明该任务的患者是循环执行的
|
//判断患者过滤集合中,是否存在当前执行患者的身份证
|
boolean continutFlag = false;
|
for (ServiceSubtask ss : serviceSubtaskListFilter) {
|
if (ss.getSfzh().equals(serviceSubtask.getSfzh())) {
|
continutFlag = true;
|
}
|
}
|
//如果存在当前执行患者的身份证,则不执行该患者了
|
if (continutFlag) {
|
return;
|
}
|
|
//将子任务ID删除 、sendstate改成3(循环任务就是这样)
|
serviceSubtask.setSendstate(3L);
|
serviceSubtask.setId(null);
|
serviceSubtask.setFinishtime(null);
|
serviceSubtask.setCreateTime(new Date());
|
serviceSubtask.setUpdateTime(new Date());
|
serviceSubtaskMapper.insertServiceSubtask(serviceSubtask);
|
|
//将当前要执行的患者放到过滤患者集合中
|
serviceSubtaskListFilter.add(serviceSubtask);
|
}
|
} else if (descByCode.equals("短信")) {
|
RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample();
|
String taskId = rsaPublicKeyExample.encryptedData(ivrTask1.getTaskid().toString(), pub_key);
|
log.info("【sfHandlle】处理短信长期任务,患者ID:{}", serviceSubtask.getPatid());
|
boolean dateToday = isDateToday(serviceSubtask.getVisitTime());
|
if (dateToday) {
|
try {
|
String patid = rsaPublicKeyExample.encryptedData(serviceSubtask.getPatid().toString(), pub_key);
|
String subId = rsaPublicKeyExample.encryptedData(serviceSubtask.getId().toString(), pub_key);
|
SendMagParam sendMagParam = new SendMagParam();
|
sendMagParam.setType("4");
|
ServiceOutPath serviceOutPath = new ServiceOutPath();
|
serviceOutPath.setParam1(taskId);
|
serviceOutPath.setParam2(patid);
|
serviceOutPath.setParam3(ivrTask1.getTaskName());
|
serviceOutPath.setParam6(subId);
|
serviceOutPath.setCreateTime(new Date());
|
iServiceOutPathService.insertServiceOutPath(serviceOutPath);
|
String format = String.format("%03X", serviceOutPath.getId());
|
serviceOutPath.setRadix(format);
|
serviceOutPath.setUpdateTime(new Date());
|
iServiceOutPathService.updateServiceOutPath(serviceOutPath);
|
//先判断一下发的是不是宣教
|
if (!"3".equals(serviceSubtask.getType())) {
|
sendMagParam.setPhone(serviceSubtask.getPhone());
|
sendMagParam.setUrl(localIP + ":" + req_path + "/wt?p=" + format);
|
//如果type是语音随访的话(说明补偿发送方式中有电话随访的方式,这里的外链就地址只能用/sf)
|
if (serviceSubtask.getType().equals("1"))
|
sendMagParam.setUrl(localIP + ":" + req_path + "/sf?p=" + format);
|
sendMagParam.setContent("您好,邀请您填写出院调查表,请点击" + sendMagParam.getUrl() + "填写。感谢您配合!");
|
} else {
|
HeLibrary heLibrary = heLibraryMapper.selectHeLibraryById(serviceSubtask.getLibtemplateid());
|
if ("2".equals(heLibrary.getHetype())) {
|
sendMagParam.setPhone(serviceSubtask.getPhone());
|
sendMagParam.setContent(heLibrary.getPreachcontent());
|
}
|
}
|
String isSuccess = null;
|
if (visitHosp == 1) {
|
Map<String, String> req = new HashMap<>();
|
req.put("phone", sendMagParam.getPhone());
|
req.put("content", sendMagParam.getContent());
|
isSuccess = HttpUtil.postJsonRequest(xhsmsPath, new Gson().toJson(req));
|
} else if (visitHosp == 2) {
|
String url = configService.selectConfigByKey("token.360", serviceSubtask.getOrgid());
|
//丽水的短信发送方式
|
Map<String, String> map = MsgLSEnum.getAddressByCode(serviceSubtask.getOrgid());
|
String token = LSHospTokenUtil.getToken(serviceSubtask.getOrgid(), url);
|
if (ObjectUtils.isNotEmpty(map) && StringUtils.isEmpty(map.get("address"))) {
|
setSuccessPreachForm(serviceSubtask, sendPreachform, "短信发送失败,该机构没有配置短信地址", "5");
|
return;
|
}
|
log.info("【sfHandlle】丽水短信发送,地址:{},参数:{},机构ID:{}", map.get("address"), sendMagParam, serviceSubtask.getOrgid());
|
String dxCode = getDXCode(map.get("address"), sendMagParam.getPhone(), sendMagParam.getContent(), map.get("sendPersonId"), map.get("sendPersonName"), MsgLSEnum.getHeaderByCode(serviceSubtask.getOrgid()), token);
|
log.info("【sfHandlle】丽水短信发送结果:{}", dxCode);
|
ObjectMapper objectMapper = new ObjectMapper();
|
Map<String, Object> textParam = objectMapper.readValue(dxCode, Map.class);
|
String code = textParam.get("Code").toString();
|
if (code.equals("0")) {
|
isSuccess = "true";
|
}
|
} else if (visitHosp == 4) {
|
//省立同德的短信发送方式
|
JSONObject data = MessageSend.sendMsg(sendMagParam.getContent(), "2", sendMagParam.getPhone(), LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
|
String code = data.get("code").toString();
|
if (StringUtils.isNotEmpty(code) && code.equals("00000")) {
|
isSuccess = "true";
|
}
|
} else if (visitHosp == 3) {//市一医院
|
String content = sendMagParam.getContent().replace("【新华医院】", "");
|
String result = smsUtils.sendSms(xhsmsPath, xhsmsAccount, xhsmsPwd, sendMagParam.getPhone(), content);
|
//这里需要根据result返回的值去判断,是否成功,然后将值赋值给isSuccess
|
|
|
}
|
//任务发送记录
|
ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord();
|
serviceSubtaskRecord.setTaskid(serviceSubtask.getTaskid().toString());
|
serviceSubtaskRecord.setUuid(UUID.randomUUID().toString());
|
serviceSubtaskRecord.setTasktype(serviceSubtask.getType());
|
serviceSubtaskRecord.setPreachform("4");
|
serviceSubtaskRecord.setStartTime(System.currentTimeMillis());
|
serviceSubtaskRecord.setResult("success");
|
if (StringUtils.isNotEmpty(isSuccess) && !isSuccess.equals("true"))
|
serviceSubtaskRecord.setResult("error");
|
serviceSubtaskRecordService.insertServiceSubtaskRecord(serviceSubtaskRecord);
|
|
//发送完成后,修改状态
|
serviceSubtask.setSendstate(3L);
|
if (StringUtils.isNotEmpty(isSuccess) && isSuccess.equals("true")) {
|
serviceSubtask.setResult("success");
|
serviceSubtask.setRemark("短信发送成功");
|
setSuccessPreachForm(serviceSubtask, sendPreachform, "短信发送成功", "2");
|
} else {
|
serviceSubtask.setResult("error");
|
serviceSubtask.setRemark("短信发送失败");
|
setSuccessPreachForm(serviceSubtask, sendPreachform, "短信发送失败", "5");
|
}
|
} catch (Exception e) {
|
String guid = UUID.randomUUID().toString();
|
log.error("【sfHandlle】长期任务短信发送失败,原因:{},GUID:{}", e.getMessage(), guid);
|
setSuccessPreachForm(serviceSubtask, sendPreachform, "长期任务短信发送失败:系统错误", "5");
|
}
|
}
|
|
} else if (descByCode.equals("公众号")) {
|
log.info("【sfHandlle】处理公众号任务,任务信息:{}", ivrTask1);
|
//公众号
|
RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample();
|
String taskId = rsaPublicKeyExample.encryptedData(ivrTask1.getTaskid().toString(), pub_key);
|
boolean dateToday = isDateToday(serviceSubtask.getVisitTime());
|
if (dateToday) {
|
try {
|
String patid = rsaPublicKeyExample.encryptedData(serviceSubtask.getPatid().toString(), pub_key);
|
String url = null;
|
url = localIP + ":" + req_path + "/outsideChainwt?param1=" + taskId + "¶m2=" + patid + "¶m3=" + URLEncoder.encode(ivrTask1.getTaskName(), StandardCharsets.UTF_8.toString()) + "¶m5=false";
|
|
//获取微信公众号请求信息根据机构ID
|
List<String> wxqqxx = WxGZHEnum.getDescByCode(patArchive.getOrgid());
|
if (CollectionUtils.isEmpty(wxqqxx) || wxqqxx.size() < 4) {
|
setSuccessPreachForm(serviceSubtask, sendPreachform, "【公众号】该机构的公众号配置信息不全,无法通过公众号发送", "4");
|
return;
|
}
|
|
if (StringUtils.isEmpty(patArchive.getPatidHis())) {
|
setSuccessPreachForm(serviceSubtask, sendPreachform, "【公众号】公众号发送失败,his系统的患者id为空", "5");
|
return;
|
}
|
String wxCode = "";
|
if (visitHosp == 3) {//市一医院
|
String urlTemp = "http://192.200.54.14:5003/sfjk/SendMessage?sfzh=" + serviceSubtask.getSfzh()
|
+ "&title=您好,邀请您填写出院调查表,请点击填写。&content=您好,邀请您填写出院调查表,请点击填写。&phone=" + patArchive.getTelcode()
|
+ "&url=" + url + "&key=ff76f8904f5f32b5ee1739e8ea46e60g";
|
HttpUtils.sendGet(urlTemp);
|
} else {
|
wxCode = getWXCode(serviceSubtask.getSfzh(), url, serviceSubtask.getTaskName(), serviceSubtask.getTaskDesc(), patArchive.getTelcode(), serviceSubtask.getSendname(), patArchive.getPatidHis(), wxqqxx);
|
}
|
|
Map<String, Object> map = JSONObject.parseObject(wxCode, Map.class);
|
//任务发送记录
|
ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord();
|
serviceSubtaskRecord.setTaskid(serviceSubtask.getTaskid().toString());
|
serviceSubtaskRecord.setUuid(UUID.randomUUID().toString());
|
serviceSubtaskRecord.setTasktype(serviceSubtask.getType());
|
serviceSubtaskRecord.setPreachform("4");
|
serviceSubtaskRecord.setStartTime(System.currentTimeMillis());
|
serviceSubtaskRecord.setResult("success");
|
if (!map.isEmpty() && (Boolean) map.get("succ") == false) serviceSubtaskRecord.setResult("error");
|
serviceSubtaskRecordService.insertServiceSubtaskRecord(serviceSubtaskRecord);
|
|
//发送完成后,修改状态
|
serviceSubtask.setSendstate(3L);
|
if ((Boolean) map.get("succ") == true) {
|
serviceSubtask.setResult("success");
|
setSuccessPreachForm(serviceSubtask, sendPreachform, "【公众号】公众号发送成功", "2");
|
} else {
|
log.error("【sfHandlle】公众号发送失败,患者信息:{},错误信息:{}", serviceSubtask, map.get("msg"));
|
setSuccessPreachForm(serviceSubtask, sendPreachform, "【公众号】公众号发送失败", "5");
|
}
|
} catch (Exception e) {
|
String guid = UUID.randomUUID().toString();
|
log.error("【sfHandlle】长期任务公众号发送失败,原因:{},GUID:{}", e.getMessage(), guid);
|
setSuccessPreachForm(serviceSubtask, sendPreachform, "【公众号】长期任务公众号发送失败,原因:" + e.getMessage(), "5");
|
}
|
}
|
} else if (descByCode.equals("人工")) {
|
setSuccessPreachForm(serviceSubtask, sendPreachform, "人工待执行", "2");
|
}
|
|
}
|
|
|
private Date getNextVisitTime(Long subid, Long taskid, Date visitTime) {
|
ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
|
serviceSubtaskPreachform.setSubid(subid);
|
serviceSubtaskPreachform.setTaskid(taskid);
|
List<ServiceSubtaskPreachform> serviceSubtaskPreachforms = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
|
if (CollectionUtils.isNotEmpty(serviceSubtaskPreachforms)) {
|
String compensateTime = serviceSubtaskPreachforms.get(0).getCompensateTime();
|
int hoursToAdd = Integer.valueOf(compensateTime) * 24;
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(visitTime);
|
calendar.add(Calendar.HOUR_OF_DAY, hoursToAdd);
|
Date newDate = calendar.getTime();
|
return newDate;
|
}
|
return visitTime;
|
}
|
|
private String getSendPreachform(ServiceSubtaskPreachform serviceSubtaskPreachform, ServiceSubtask serviceSubtask) {
|
List<ServiceSubtaskPreachform> serviceSubtaskPreachforms = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
|
|
// 情况1:currentPreachform为空,取sort为1的preachform
|
if (StringUtils.isEmpty(serviceSubtask.getCurrentPreachform())) {
|
return serviceSubtaskPreachforms.stream().filter(item -> item.getSort() == 1L).map(ServiceSubtaskPreachform::getPreachform).findFirst().orElse(null);
|
}
|
|
// 情况2:currentPreachform不为空,找下一个sort
|
Optional<Long> currentSort = serviceSubtaskPreachforms.stream().filter(item -> serviceSubtask.getCurrentPreachform().equals(item.getPreachform())).map(ServiceSubtaskPreachform::getSort).findFirst();
|
|
if (currentSort.isPresent()) {
|
// 检查是否所有sendstate不等于9
|
boolean allSendStateNot1AndNot9 = serviceSubtaskPreachforms.stream().allMatch(item -> !item.getSendstate().equals("9"));
|
if (!allSendStateNot1AndNot9) {
|
//说明,在某种方式发送失败后,又成功了(例如短信或公众号,在规定时间外患者做完了,这个时候,状态改成了9)
|
serviceSubtask.setSendstate(6L);
|
serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
|
return "-1";
|
}
|
|
// 当sort等于列表size时,并且所有sendstate都不等于9,则返回-1
|
if (currentSort.get().equals((long) serviceSubtaskPreachforms.size())) {
|
if (allSendStateNot1AndNot9) {
|
//说明全发送失败了
|
serviceSubtask.setSendstate(5L);
|
serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
|
//修改发送状态
|
setFail(serviceSubtaskPreachforms, serviceSubtask);
|
}
|
return "-1";
|
}
|
|
// 当sort等于列表size时,下一个sort为-1
|
Long nextSort = currentSort.get() + 1;
|
|
//如果当前的发送方式不为空,并且开始准备要用下一种方式发送了,那当前的肯定没有发送成功,需要设置失败
|
// (这里主要是,人工如果没有随访,然后到公众号的时候,就不会再去管人工是否成功,人工的状态会一直卡在2的状态上)
|
if (StringUtils.isNotEmpty(serviceSubtask.getCurrentPreachform())) {
|
setFail(serviceSubtaskPreachforms, serviceSubtask);
|
}
|
|
// 找到下一个sort对应的preachform
|
return serviceSubtaskPreachforms.stream().filter(item -> nextSort.equals(item.getSort())).map(ServiceSubtaskPreachform::getPreachform).findFirst().orElse("-1");
|
}
|
|
return null;
|
}
|
|
private Integer setFail(List<ServiceSubtaskPreachform> serviceSubtaskPreachforms, ServiceSubtask serviceSubtask) {
|
Optional<Long> id = serviceSubtaskPreachforms.stream().filter(item -> serviceSubtask.getCurrentPreachform().equals(item.getPreachform())).map(ServiceSubtaskPreachform::getId).findFirst();
|
if (id.isPresent()) {
|
ServiceSubtaskPreachform subtaskPreachform = new ServiceSubtaskPreachform();
|
subtaskPreachform.setSendstate("5");
|
subtaskPreachform.setId(id.get());
|
return serviceSubtaskPreachformMapper.updateServiceSubtaskPreachform(subtaskPreachform);
|
}
|
return 0;
|
}
|
|
|
private String getDXCode(String address, String ShouJiHM, String FaSongNR, String FaSongRID, String FaSongRXM, Map<String, Object> headerMap, String token) {
|
Map<String, Object> map = new LinkedHashMap<>();
|
|
Map<String, Object> YeWuXX = new LinkedHashMap<>();
|
Map<String, Object> DuanXinXX = new LinkedHashMap<>();
|
DuanXinXX.put("ShouJiHM", ShouJiHM);
|
DuanXinXX.put("FaSongNR", FaSongNR);
|
DuanXinXX.put("FaSongRID", FaSongRID);
|
DuanXinXX.put("FaSongRXM", FaSongRXM);
|
YeWuXX.put("DuanXinXX", DuanXinXX);
|
|
map.put("XiaoXiTou", headerMap);
|
map.put("YeWuXX", YeWuXX);
|
|
String body = new Gson().toJson(map);
|
|
// String result = HttpUtils.sendPost(address, body);
|
String result = null;
|
try {
|
result = OkHttpExample.sendPostRequest(address, body, token);
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
log.info("【getDXCode】短信发送结果:{}", result);
|
|
JSONObject jsonObject = JSONObject.parseObject(result);
|
String code = (String) jsonObject.toString();
|
return code;
|
}
|
|
|
private String getWXCode(String idcard, String url, String taskName, String taskDesc, String phone, String setPatientname, String setPatientid, List<String> wxqqxx) {
|
XinHuaWXReq xinHuaWXReq = new XinHuaWXReq();
|
xinHuaWXReq.setIdcard(idcard);
|
xinHuaWXReq.setUrl(url);
|
xinHuaWXReq.setPatientid(setPatientid);
|
xinHuaWXReq.setPatientname(setPatientname);
|
xinHuaWXReq.setMobile(phone);
|
xinHuaWXReq.setMedcardno(null);
|
xinHuaWXReq.setTitlename(taskName);
|
xinHuaWXReq.setContent(taskDesc);
|
xinHuaWXReq.setAppid(wxqqxx.get(1));
|
log.info("【getWXCode】微信公众号请求参数:{}", xinHuaWXReq);
|
String body = new Gson().toJson(xinHuaWXReq);
|
String encode = encode(wxqqxx.get(2).concat(body));
|
Map<String, String> headerMap = new HashMap<>();
|
headerMap.put("sign", encode);
|
String result = HttpUtils.sendPostByHeader(wxqqxx.get(3), body, headerMap);
|
|
JSONObject jsonObject = JSONObject.parseObject(result);
|
String code = (String) jsonObject.toString();
|
return code;
|
}
|
|
|
public String encode(String arg) {
|
if (arg == null) {
|
arg = "";
|
}
|
MessageDigest md5 = null;
|
try {
|
md5 = MessageDigest.getInstance("MD5");
|
md5.update(arg.getBytes("UTF-8"));
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return toHex(md5.digest());
|
}
|
|
public void collectHIS() {
|
try {
|
// HIS数据采集
|
log.info("【dealHisData】HIS开始采集数据");
|
ichService.sync();
|
log.info("【dealHisData】HIS结束采集数据");
|
} catch (Exception e) {
|
log.error("【dealHisData】HIS数据采集异常", e);
|
}
|
}
|
|
public Boolean setSuccessPreachForm(ServiceSubtask serviceSubtask, String preachform, String remark, String failSendstate) {
|
if (preachform.equals("-1")) {
|
//说明都不需要执行了
|
ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
|
serviceSubtaskPreachform.setSubid(serviceSubtask.getId());
|
serviceSubtaskPreachform.setTaskid(serviceSubtask.getTaskid());
|
serviceSubtaskPreachform.setOrgid(serviceSubtask.getOrgid());
|
serviceSubtaskPreachform.setSendstate(failSendstate);
|
serviceSubtaskPreachformMapper.updateSSPByCondition(serviceSubtaskPreachform);
|
return true;
|
}
|
|
|
ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
|
serviceSubtaskPreachform.setSubid(serviceSubtask.getId());
|
serviceSubtaskPreachform.setTaskid(serviceSubtask.getTaskid());
|
serviceSubtaskPreachform.setOrgid(serviceSubtask.getOrgid());
|
List<ServiceSubtaskPreachform> sspCount = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
|
|
serviceSubtaskPreachform.setPreachform(preachform);
|
//1:未发送状态
|
serviceSubtaskPreachform.setSendstate("1");
|
//电话的未发送状态,需要查2,因为,数据可能卡在队列里了; (没进队列,电话状态还是1)
|
if (preachform.equals("3") && StringUtils.isNotEmpty(failSendstate) && Long.valueOf(failSendstate) > 2)
|
serviceSubtaskPreachform.setSendstate("2");
|
//人工的未发送状态,需要查2
|
if (preachform.equals("1") && StringUtils.isNotEmpty(failSendstate) && Long.valueOf(failSendstate) > 2)
|
serviceSubtaskPreachform.setSendstate("2");
|
|
List<ServiceSubtaskPreachform> serviceSubtaskPreachforms = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
|
if (CollectionUtils.isNotEmpty(serviceSubtaskPreachforms)) {
|
ServiceSubtaskPreachform serviceSubtaskPreachform1 = serviceSubtaskPreachforms.get(0);
|
serviceSubtaskPreachform1.setSendstate(failSendstate);
|
serviceSubtaskPreachform1.setRemark(remark);
|
serviceSubtaskPreachformMapper.updateServiceSubtaskPreachform(serviceSubtaskPreachform1);
|
|
//如果当前的preachform已经是最后一个了,那直接将serviceSubtask的sendstate状态改成5就行了(全失败了)
|
if (serviceSubtaskPreachform1.getSort() == sspCount.size()) {
|
if (failSendstate.equals("4") || failSendstate.equals("5")) {
|
serviceSubtask.setCurrentPreachform(preachform);
|
serviceSubtask.setSendstate(5L);
|
serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
|
return true;
|
}
|
}
|
} else {
|
log.error("【定时任务中该患者没有查询到属于他的发送方式,subid:{},prechform:{},orgid:{}】", serviceSubtask.getId(), preachform, serviceSubtask.getOrgid());
|
return false;
|
}
|
//将下一次的随访时间与当前执行方式记录一下
|
serviceSubtask.setVisitTime(getNextVisitTime(serviceSubtask.getId(), serviceSubtask.getTaskid(), serviceSubtask.getVisitTime()));
|
serviceSubtask.setCurrentPreachform(preachform);
|
serviceSubtask.setSendstate(3L);
|
serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
|
return true;
|
}
|
}
|