package com.ruoyi.quartz.task; import com.alibaba.fastjson2.JSON; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.enums.ServiceFromEnum; import com.ruoyi.common.utils.RSAPublicKeyExample; import com.ruoyi.common.utils.StringUtils; import com.smartor.common.SendService; import com.smartor.domain.*; import com.smartor.mapper.ServiceSubtaskMapper; import com.smartor.mapper.ServiceTaskMapper; import com.smartor.service.*; 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 java.util.*; /** * 定时任务调度测试 * * @author ruoyi */ @Slf4j @Component("ryTask") public class RyTask { @Autowired private IServiceThirdDataService iServiceThirdDataService; @Autowired private IServiceSubtaskAnswerService serviceSubtaskAnswerService; @Autowired private IPatMedInhospService iPatMedInhospService; @Autowired private IServiceSubtaskService iServiceSubtaskService; @Value("${localIP}") private String localIP; @Value("${pub_key}") private String pub_key; @Value("${req_path}") private String req_path; @Autowired private ServiceTaskMapper serviceTaskMapper; @Autowired private SendService sendService; @Autowired private RedisCache redisCache; @Autowired private IServiceSubtaskRecordService serviceSubtaskRecordService; @Autowired IBaseSmsaccountService baseSmsaccountService; 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 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); } /** * 处理his数据 */ public void dealHisData() { //将患者信息、出院、门诊数据全部采集 //调用dealOupHospInfo数据处理方法,处理完后,将“出院表的check_flag=1” //获取当前日期 (精确到天)往前推相应天数(在指定的基础模板中找对应的天数), //循环患者信息,根据患者"出院诊断ICD值”获取到相当的模板(获取取相应的天数); //根据查询出来的模板,去固定任务(固定任务,已经将模板也固定了)去匹配模板 //根据匹配出来的模板和任务与患者信息,将数据插入到子任务表中 iPatMedInhospService.dealOupHospInfo(); } /** * 长期任务执行 */ public void longTaskSend() { //获取任务信息 ServiceTask st =new ServiceTask(); st.setDelFlag("0"); st.setLongTask(1); List serviceTasks = serviceTaskMapper.selectServiceTaskList(st); for (ServiceTask serviceTask : serviceTasks) { //通过taskId,获取未执行的子任务信息 ServiceSubtask serviceSubtask = new ServiceSubtask(); serviceSubtask.setTaskid(serviceTask.getTaskid()); serviceSubtask.setSendstate(2L); List selectServiceSubtaskList = iServiceSubtaskService.selectServiceSubtaskList(serviceSubtask); if (CollectionUtils.isNotEmpty(selectServiceSubtaskList)) { for (ServiceSubtask serviceSubtask1 : selectServiceSubtaskList) { //如果患者的发送日期是今天,则进行发送 boolean dateToday = isDateToday(serviceSubtask1.getLongSendTime()); if (dateToday) { CommonTaskcallMQ commonTaskcallMQ = new CommonTaskcallMQ(); commonTaskcallMQ.setTaskid(serviceTask.getTaskid()); commonTaskcallMQ.setPreachform(serviceSubtask1.getServiceform()); sfHandle(commonTaskcallMQ, localIP); //发送完成后,修改状态 serviceSubtask1.setSendstate(3L); iServiceSubtaskService.updateServiceSubtask(serviceSubtask1); } } } } } /** * 判断日期是否是今天 * * @param date * @return */ public boolean isDateToday(Date date) { // 获取当前日期 Calendar calendarNow = Calendar.getInstance(); int todayYear = calendarNow.get(Calendar.YEAR); int todayMonth = calendarNow.get(Calendar.MONTH); int todayDay = calendarNow.get(Calendar.DAY_OF_MONTH); // 创建一个 Calendar 实例用于检查的日期 Calendar calendarToCheck = Calendar.getInstance(); calendarToCheck.setTime(date); // 比较年、月和日 return (calendarToCheck.get(Calendar.YEAR) == todayYear && calendarToCheck.get(Calendar.MONTH) == todayMonth && calendarToCheck.get(Calendar.DAY_OF_MONTH) == todayDay); } public void sfHandle(CommonTaskcallMQ commonTaskcallMQ, String ip) { //判断一下commonTaskcallMQ中的stopstate是否与ivr_task中的一致,不一致,则说明是暂停了 ServiceTask ivrTask1 = serviceTaskMapper.selectServiceTaskByTaskid(commonTaskcallMQ.getTaskid()); if (StringUtils.isNotEmpty(commonTaskcallMQ.getPreachform())) { //如何任务发送方式不为空 String[] split = commonTaskcallMQ.getPreachform().split(","); System.out.println("split的值为:" + split); for (String serviceFrom : split) { String descByCode = ServiceFromEnum.getDescByCode(Integer.valueOf(serviceFrom)); //这里可以考虑用策略模式优化一下,不然太难看了 //通过任务ID拿到患者信息 ServiceSubtask ivrTaskcall = new ServiceSubtask(); ivrTaskcall.setTaskid(commonTaskcallMQ.getTaskid()); List selectServiceSubtaskList = iServiceSubtaskService.selectServiceSubtaskList(ivrTaskcall); if (descByCode.equals("电话")) { for (ServiceSubtask serviceSubtask : selectServiceSubtaskList) { ServiceTask ivrTask = serviceTaskMapper.selectServiceTaskByTaskid(serviceSubtask.getTaskid()); if (ivrTask.getSendState() != null && ivrTask.getSendState() == 3 || ivrTask.getSendState() != null && ivrTask.getSendState() == 4) { //如何任务被“暂停”或“终止” break; } //获取到value值最少的key String key = getKey(); if (commonTaskcallMQ.getSendType().equals("2")) { //说明是立即发送 String value = redisCache.getCacheObject("cache-0"); ServiceSubtask serviceSubtask1 = new ServiceSubtask(); serviceSubtask1.setTaskid(commonTaskcallMQ.getTaskid()); List selectServiceSubtaskList1 = iServiceSubtaskService.selectServiceSubtaskList(serviceSubtask1); for (ServiceSubtask serviceSubtask2 : selectServiceSubtaskList1) { if (StringUtils.isEmpty(value)) { value = "," + serviceSubtask2.getId().toString() + ","; } else { value = value + "," + serviceSubtask2.getId().toString() + ","; } } redisCache.setCacheObject("cache-0", value); } else { //非立即发送 String value = redisCache.getCacheObject(key); ServiceSubtask serviceSubtask1 = new ServiceSubtask(); serviceSubtask1.setTaskid(commonTaskcallMQ.getTaskid()); List selectServiceSubtaskList1 = iServiceSubtaskService.selectServiceSubtaskList(serviceSubtask1); for (ServiceSubtask serviceSubtask2 : selectServiceSubtaskList1) { if (StringUtils.isEmpty(value)) { value = "," + serviceSubtask2.getId().toString() + ","; } else { value = value + "," + serviceSubtask2.getId().toString() + ","; } } redisCache.setCacheObject(key, value); } //任务发送记录(这个代码应该写在phoneTask中,先写在这,后面再改) ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord(); serviceSubtaskRecord.setTaskid(serviceSubtask.getTaskid().toString()); serviceSubtaskRecord.setUuid(UUID.randomUUID().toString()); serviceSubtaskRecord.setTasktype(serviceSubtask.getType()); serviceSubtaskRecord.setPreachform("3"); serviceSubtaskRecord.setStartTime(System.currentTimeMillis()); serviceSubtaskRecordService.insertServiceSubtaskRecord(serviceSubtaskRecord); // //通过多线程的方式去打电话 // executorService.submit(new PhoneTask(serviceSubtask, ivrTaskTemplateVO1, redisCache, sendService, phonePath, robotPhoneUtils)); } } else if (descByCode.equals("多媒体")) { //多媒体 return; } else if (descByCode.equals("纸质")) { //纸质 return; } else if (descByCode.equals("短信")) { //短信 // http://localhost:8099/followvisit/particty?param1=3¶m2=348 //对url中两个参数加密 RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample(); String taskId = rsaPublicKeyExample.encryptedData(ivrTask1.getTaskid().toString(), pub_key); for (ServiceSubtask serviceSubtask : selectServiceSubtaskList) { String patid = rsaPublicKeyExample.encryptedData(serviceSubtask.getPatid().toString(), pub_key); SendMagParam sendMagParam = new SendMagParam(); sendMagParam.setType("4"); sendMagParam.setPhone(serviceSubtask.getPhone()); sendMagParam.setUrl(ip + ":" + req_path + "/followvisit/particty?param1=" + taskId + "¶m2=" + patid + "¶m5=false"); Boolean aBoolean = sendService.sendMsg(sendMagParam); //任务发送记录 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(aBoolean == true ? "成功" : "失败"); serviceSubtaskRecordService.insertServiceSubtaskRecord(serviceSubtaskRecord); } } else if (descByCode.equals("公众号")) { //公众号 RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample(); String taskId = rsaPublicKeyExample.encryptedData(ivrTask1.getTaskid().toString(), pub_key); for (ServiceSubtask serviceSubtask : selectServiceSubtaskList) { String patid = rsaPublicKeyExample.encryptedData(serviceSubtask.getPatid().toString(), pub_key); SendMagParam sendMagParam = new SendMagParam(); sendMagParam.setType("5"); sendMagParam.setUrl(ip + ":" + req_path + "/outsideChain?param1=" + taskId + "¶m2=" + patid + "¶m3=" + ivrTask1.getTaskName() + "¶m5=false"); log.info("链接完整路径:{}", ip + ":" + req_path + "/outsideChain?param1=" + taskId + "¶m2=" + patid + "¶m3=" + ivrTask1.getTaskName() + "¶m5=false"); //这个模板ID先写死,后面做成可选 sendMagParam.setTmpCode("oG3pJHPVWpE81DmZsua_2tKwgJ97r0qz37z56ns7NB4"); Map map = new HashMap(); map.put("first", ivrTask1.getTaskName()); sendMagParam.setContent(JSON.toJSONString(map)); sendMagParam.setOpenid(serviceSubtask.getOpenid()); Boolean aBoolean = sendService.sendMsg(sendMagParam); //任务发送记录 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(aBoolean == true ? "成功" : "失败"); serviceSubtaskRecordService.insertServiceSubtaskRecord(serviceSubtaskRecord); } } //通知 MQ 消息已被接收,可以ACK(从队列中删除)了 (这个需要根据业务再去处理ACK) } } } private String getKey() { Map map = new HashMap<>(); for (int i = 0; i < 6; i++) { Boolean aBoolean = redisCache.hasKey("cache-" + i); if (!aBoolean) { redisCache.setCacheObject("cache-" + i, ""); map.put("cache-" + i, ""); } else { map.put("cache-" + i, redisCache.getCacheObject("cache-" + i)); } } String key = null; String value = ""; for (Map.Entry entry : map.entrySet()) { if (StringUtils.isEmpty(value)) { value = entry.getValue(); key = entry.getKey(); } else { if (entry.getValue().split(",").length < value.split(",").length) { value = entry.getValue(); key = entry.getKey(); } } } return key; } }