| | |
| | | package com.ruoyi.web.component; |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | import com.fasterxml.jackson.core.JsonProcessingException; |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import com.fasterxml.jackson.databind.ObjectMapper; |
| | | import com.google.gson.Gson; |
| | | 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.ruoyi.common.utils.http.HttpUtils; |
| | | import com.ruoyi.web.task.PhoneTask; |
| | | import com.smartor.common.SendService; |
| | | import com.smartor.config.RobotPhoneUtils; |
| | | import com.smartor.domain.*; |
| | | import com.smartor.mapper.IvrTaskMapper; |
| | | import com.smartor.mapper.IvrTaskSingleMapper; |
| | | import com.smartor.service.IIvrTaskTemplateService; |
| | | import com.smartor.mapper.ServiceSubtaskMapper; |
| | | import com.smartor.mapper.ServiceTaskMapper; |
| | | import com.smartor.mapper.SvyTaskMapper; |
| | | import com.smartor.mapper.SvyTaskSingleMapper; |
| | | import com.smartor.service.*; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | |
| | | import org.springframework.data.redis.listener.RedisMessageListenerContainer; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.io.UnsupportedEncodingException; |
| | | import java.net.URLEncoder; |
| | | import java.nio.charset.StandardCharsets; |
| | | import java.time.LocalDateTime; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.util.*; |
| | | import java.util.concurrent.ExecutorService; |
| | | import java.util.concurrent.Executors; |
| | | import java.util.concurrent.TimeUnit; |
| | |
| | | @Value("${pub_key}") |
| | | private String pub_key; |
| | | |
| | | @Value("${localIP}") |
| | | private String localIP; |
| | | |
| | | @Value("${req_path}") |
| | | private String req_path; |
| | | |
| | | private static IIvrTaskTemplateService ivrTaskTemplateService; |
| | | @Value("${thirdWXUrl}") |
| | | private String thirdWXUrl; |
| | | |
| | | private static IvrTaskSingleMapper ivrTaskcallMapper; |
| | | @Autowired |
| | | private IIvrTaskTemplateService ivrTaskTemplateService; |
| | | @Autowired |
| | | private ISvyTaskTemplateService svyTaskTemplateService; |
| | | |
| | | private static IvrTaskMapper ivrTaskMapper; |
| | | @Autowired |
| | | private ServiceSubtaskMapper ivrTaskcallMapper; |
| | | |
| | | private static SendService sendService; |
| | | @Autowired |
| | | private ServiceTaskMapper ivrTaskMapper; |
| | | |
| | | private static RedisCache redisCache; |
| | | @Autowired |
| | | private SendService sendService; |
| | | |
| | | private static RobotPhoneUtils robotPhoneUtils; |
| | | @Autowired |
| | | private RedisCache redisCache; |
| | | |
| | | @Autowired |
| | | private RobotPhoneUtils robotPhoneUtils; |
| | | |
| | | @Autowired |
| | | private ServiceTaskMapper svyTaskMapper; |
| | | |
| | | @Autowired |
| | | private ServiceSubtaskMapper serviceSubtaskMapper; |
| | | |
| | | @Autowired |
| | | private ISvyTaskTemplateService iSvyTaskTemplateService; |
| | | |
| | | @Autowired |
| | | private IServiceSubtaskRecordService serviceSubtaskRecordService; |
| | | |
| | | @Autowired |
| | | IBaseSmsaccountService baseSmsaccountService; |
| | | |
| | | // 创建固定大小的线程池 |
| | | private static final ExecutorService executorService = Executors.newFixedThreadPool(10); |
| | |
| | | super(listenerContainer); |
| | | } |
| | | |
| | | |
| | | @Autowired |
| | | public void setIIvrTaskTemplateService(IIvrTaskTemplateService ivrTaskTemplateService) { |
| | | RedisMqReceiver.ivrTaskTemplateService = ivrTaskTemplateService; |
| | | } |
| | | |
| | | @Autowired |
| | | public void setRobotPhoneUtilsService(RobotPhoneUtils robotPhoneUtils) { |
| | | RedisMqReceiver.robotPhoneUtils = robotPhoneUtils; |
| | | } |
| | | |
| | | @Autowired |
| | | public void setSendService(SendService sendService) { |
| | | RedisMqReceiver.sendService = sendService; |
| | | } |
| | | |
| | | @Autowired |
| | | public void setIvrTaskcallMapper(IvrTaskSingleMapper ivrTaskcallMapper) { |
| | | RedisMqReceiver.ivrTaskcallMapper = ivrTaskcallMapper; |
| | | } |
| | | |
| | | @Autowired |
| | | public void setIvrTaskMapper(IvrTaskMapper ivrTaskMapper) { |
| | | RedisMqReceiver.ivrTaskMapper = ivrTaskMapper; |
| | | } |
| | | |
| | | @Autowired |
| | | public void setRedisCache(RedisCache redisCache) { |
| | | RedisMqReceiver.redisCache = redisCache; |
| | | } |
| | | |
| | | @Override |
| | | public void onMessage(Message message, byte[] pattern) { |
| | | log.info("监听Redis key过期,key:{},channel:{}", message.toString(), new String(pattern)); |
| | | String ip = localIP; |
| | | log.error("本机的网络IP为:{}", ip); |
| | | String content = message.toString(); |
| | | IvrTaskcallMQ ivrTaskcallMQ = null; |
| | | //判断是不是任务信息,如果不是,直接返回,不需要执行 |
| | | if (!content.contains("taskid")) { |
| | | log.info("不是任务信息"); |
| | | return; |
| | | } |
| | | CommonTaskcallMQ commonTaskcallMQ = null; |
| | | try { |
| | | ObjectMapper mapper = new ObjectMapper(); |
| | | try { |
| | | if (!content.startsWith("{")) { |
| | | ivrTaskcallMQ = mapper.readValue("{" + content + "}", IvrTaskcallMQ.class); |
| | | } else { |
| | | ivrTaskcallMQ = mapper.readValue(content, IvrTaskcallMQ.class); |
| | | } |
| | | } catch (JsonProcessingException e) { |
| | | e.printStackTrace(); |
| | | if (!content.startsWith("{")) { |
| | | commonTaskcallMQ = mapper.readValue("{" + content + "}", CommonTaskcallMQ.class); |
| | | } else { |
| | | commonTaskcallMQ = mapper.readValue(content, CommonTaskcallMQ.class); |
| | | } |
| | | //判断一下ivrTaskcallMQ中的stopstate是否与ivr_task中的一致,不一致,则说明是暂停了 |
| | | IvrTask ivrTask1 = ivrTaskMapper.selectIvrTaskByTaskid(ivrTaskcallMQ.getTaskid()); |
| | | if (ivrTask1.getStopState() != ivrTaskcallMQ.getStopState()) { |
| | | //将消息从队列中剔除 |
| | | return; |
| | | } |
| | | if (commonTaskcallMQ != null) tsakHandle(commonTaskcallMQ, ip, commonTaskcallMQ.getTaskType()); |
| | | |
| | | if (StringUtils.isNotEmpty(ivrTaskcallMQ.getPreachform())) { |
| | | //如何任务发送方式不为空 |
| | | String[] split = ivrTaskcallMQ.getPreachform().split(","); |
| | | System.out.println("split的值为:" + split); |
| | | for (String serviceFrom : split) { |
| | | String descByCode = ServiceFromEnum.getDescByCode(Integer.valueOf(serviceFrom)); |
| | | //这里可以考虑用策略模式优化一下,不然太难看了 |
| | | |
| | | //通过模板ID获取模板问题 |
| | | IvrTaskTemplateVO ivrTaskTemplateVO = new IvrTaskTemplateVO(); |
| | | ivrTaskTemplateVO.setID(Long.valueOf(ivrTaskcallMQ.getTemplateid())); |
| | | IvrTaskTemplateVO ivrTaskTemplateVO1 = ivrTaskTemplateService.selectInfoByCondition(ivrTaskTemplateVO); |
| | | |
| | | //通过任务ID拿到患者信息 |
| | | IvrTaskSingle ivrTaskcall = new IvrTaskSingle(); |
| | | ivrTaskcall.setTaskid(ivrTaskcallMQ.getTaskid()); |
| | | List<IvrTaskSingle> ivrTaskcalls = ivrTaskcallMapper.selectIvrTaskcallList(ivrTaskcall); |
| | | if (descByCode.equals("电话")) { |
| | | for (IvrTaskSingle ivrTaskcall1 : ivrTaskcalls) { |
| | | IvrTask ivrTask = ivrTaskMapper.selectIvrTaskByTaskid(ivrTaskcall1.getTaskid()); |
| | | if (ivrTask.getSendState() != null && ivrTask.getSendState() == 3 || ivrTask.getSendState() != null && ivrTask.getSendState() == 4) { |
| | | //如何任务被“暂停”或“终止” |
| | | break; |
| | | } |
| | | //通过多线程的方式去打电话 |
| | | executorService.submit(new PhoneTask(ivrTaskcall1, ivrTaskTemplateVO1, redisCache, sendService, phonePath, robotPhoneUtils)); |
| | | } |
| | | } else if (descByCode.equals("多媒体")) { |
| | | //多媒体 |
| | | } else if (descByCode.equals("纸质")) { |
| | | //纸质 |
| | | } 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 (IvrTaskSingle ivrTaskSingle : ivrTaskcalls) { |
| | | String patid = rsaPublicKeyExample.encryptedData(ivrTaskSingle.getPatid().toString(), pub_key); |
| | | SendMagParam sendMagParam = new SendMagParam(); |
| | | sendMagParam.setType("4"); |
| | | sendMagParam.setUrl(req_path + "/followvisit/particty?param1=" + taskId + "¶m2=" + patid); |
| | | sendService.sendMsg(sendMagParam); |
| | | } |
| | | } else if (descByCode.equals("公众号")) { |
| | | //公众号 |
| | | RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample(); |
| | | String taskId = rsaPublicKeyExample.encryptedData(ivrTask1.getTaskid().toString(), pub_key); |
| | | for (IvrTaskSingle ivrTaskSingle : ivrTaskcalls) { |
| | | String patid = rsaPublicKeyExample.encryptedData(ivrTaskSingle.getPatid().toString(), pub_key); |
| | | SendMagParam sendMagParam = new SendMagParam(); |
| | | sendMagParam.setType("5"); |
| | | sendMagParam.setUrl(req_path + "/outsideChain?param1=" + taskId + "¶m2=" + patid + "¶m3=" + ivrTask1.getTaskName()); |
| | | log.info("链接完整路径:{}", req_path + "/outsideChain?param1=" + taskId + "¶m2=" + patid + "¶m3=" + ivrTask1.getTaskName()); |
| | | //这个模板ID先写死,后面做成可选 |
| | | sendMagParam.setTmpCode("oG3pJHPVWpE81DmZsua_2tKwgJ97r0qz37z56ns7NB4"); |
| | | Map map = new HashMap(); |
| | | map.put("first", ivrTask1.getTaskName()); |
| | | sendMagParam.setContent(JSON.toJSONString(map)); |
| | | sendService.sendMsg(sendMagParam); |
| | | } |
| | | } |
| | | //通知 MQ 消息已被接收,可以ACK(从队列中删除)了 (这个需要根据业务再去处理ACK) |
| | | } |
| | | } |
| | | //处理完成,移除redis |
| | | redisCache.deleteObject(message.toString()); |
| | | //将状态改成完成 |
| | | ServiceTask serviceTask = new ServiceTask(); |
| | | serviceTask.setTaskid(Long.valueOf(commonTaskcallMQ.getTaskid())); |
| | | serviceTask.setSendState(5L); |
| | | serviceTask.setFail(1L); |
| | | svyTaskMapper.updateServiceTask(serviceTask); |
| | | } catch (Exception e) { |
| | | Integer integer = redisCache.getCacheObject(ivrTaskcallMQ.getTaskid().toString()); |
| | | if (integer != null && integer == 2) { |
| | | Integer integer = redisCache.getCacheObject(commonTaskcallMQ.getTaskid().toString()); |
| | | if (integer != null && integer == 3) { |
| | | redisCache.deleteObject(message.toString()); |
| | | ServiceTask serviceTask = new ServiceTask(); |
| | | serviceTask.setTaskid(Long.valueOf(commonTaskcallMQ.getTaskid().toString())); |
| | | serviceTask.setFail(0L); |
| | | svyTaskMapper.updateServiceTask(serviceTask); |
| | | //将消息从队列中删除 |
| | | } else if (integer == null) { |
| | | redisCache.setCacheObject(ivrTaskcallMQ.getTaskid().toString(), 1, 120, TimeUnit.MINUTES); |
| | | redisCache.setCacheObject(commonTaskcallMQ.getTaskid().toString(), 1, 120, TimeUnit.MINUTES); |
| | | } else { |
| | | redisCache.setCacheObject(ivrTaskcallMQ.getTaskid().toString(), integer + 1, 120, TimeUnit.MINUTES); |
| | | redisCache.setCacheObject(commonTaskcallMQ.getTaskid().toString(), integer + 1, 120, TimeUnit.MINUTES); |
| | | } |
| | | |
| | | log.error("============消费失败,尝试消息补发再次消费!=============="); |
| | | log.error(e.getMessage()); |
| | | log.error("============消费失败,尝试消息补发再次消费!============== {}", e.getMessage()); |
| | | redisCache.setCacheObject(message.toString(), message.toString(), 60, TimeUnit.SECONDS); |
| | | } |
| | | |
| | | } |
| | | |
| | | // /** |
| | | /** |
| | | * 任务处理 |
| | | * |
| | | * @param commonTaskcallMQ |
| | | */ |
| | | public void tsakHandle(CommonTaskcallMQ commonTaskcallMQ, String ip, Integer type) { |
| | | log.error("进任务了吗?{}", commonTaskcallMQ); |
| | | //判断一下commonTaskcallMQ中的stopstate是否与ivr_task中的一致,不一致,则说明是暂停了 |
| | | ServiceTask ivrTask1 = ivrTaskMapper.selectServiceTaskByTaskid(commonTaskcallMQ.getTaskid()); |
| | | if (ivrTask1.getStopState() != commonTaskcallMQ.getStopState()) { |
| | | //将消息从队列中剔除 |
| | | return; |
| | | } |
| | | |
| | | 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获取模板问题 |
| | | // IvrTaskTemplateVO ivrTaskTemplateVO = new IvrTaskTemplateVO(); |
| | | // ivrTaskTemplateVO.setId(Long.valueOf(commonTaskcallMQ.getTemplateid())); |
| | | // IvrTaskTemplateVO ivrTaskTemplateVO1 = ivrTaskTemplateService.selectInfoByCondition(ivrTaskTemplateVO); |
| | | |
| | | //通过任务ID拿到患者信息 |
| | | ServiceSubtaskVO ivrTaskcall = new ServiceSubtaskVO(); |
| | | ivrTaskcall.setTaskid(commonTaskcallMQ.getTaskid()); |
| | | List<ServiceSubtask> selectServiceSubtaskList = ivrTaskcallMapper.selectServiceSubtaskList(ivrTaskcall); |
| | | if (descByCode.equals("电话")) { |
| | | for (ServiceSubtask serviceSubtask : selectServiceSubtaskList) { |
| | | ServiceTask ivrTask = ivrTaskMapper.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"); |
| | | ServiceSubtaskVO serviceSubtask1 = new ServiceSubtaskVO(); |
| | | serviceSubtask1.setTaskid(commonTaskcallMQ.getTaskid()); |
| | | List<ServiceSubtask> selectServiceSubtaskList1 = ivrTaskcallMapper.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); |
| | | ServiceSubtaskVO serviceSubtask1 = new ServiceSubtaskVO(); |
| | | serviceSubtask1.setTaskid(commonTaskcallMQ.getTaskid()); |
| | | List<ServiceSubtask> selectServiceSubtaskList1 = ivrTaskcallMapper.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("多媒体")) { |
| | | //多媒体 |
| | | continue; |
| | | } else if (descByCode.equals("纸质")) { |
| | | //纸质 |
| | | continue; |
| | | } 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) { |
| | | try { |
| | | String patid = rsaPublicKeyExample.encryptedData(serviceSubtask.getPatid().toString(), pub_key); |
| | | SendMagParam sendMagParam = new SendMagParam(); |
| | | sendMagParam.setType("4"); |
| | | if (type == 1) { |
| | | sendMagParam.setUrl(ip + ":" + req_path + "/followvisit/particty?param1=" + taskId + "¶m2=" + patid + "¶m5=false"); |
| | | } else if (type == 1) { |
| | | sendMagParam.setUrl(ip + ":" + req_path + "/outsideChainwt?param1=" + taskId + "¶m2=" + patid + "¶m3=" + URLEncoder.encode(ivrTask1.getTaskName(), StandardCharsets.UTF_8.toString()) + "¶m5=false"); |
| | | } else if (type == 3) { |
| | | sendMagParam.setUrl(ip + ":" + req_path + "/outsideChainxj?param1=" + taskId + "¶m2=" + patid + "¶m3=" + URLEncoder.encode(ivrTask1.getTaskName(), StandardCharsets.UTF_8.toString()) + "¶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 ? "success" : "error"); |
| | | serviceSubtaskMapper.updateServiceSubtask(serviceSubtask); |
| | | serviceSubtaskRecordService.insertServiceSubtaskRecord(serviceSubtaskRecord); |
| | | } catch (UnsupportedEncodingException e) { |
| | | String guid = UUID.randomUUID().toString(); |
| | | log.error("短信任务,发送失败原因:{},{}", e.getMessage(), guid); |
| | | serviceSubtask.setResult("error"); |
| | | serviceSubtask.setRemark("系统错误(任务)"); |
| | | serviceSubtask.setGuid(guid); |
| | | serviceSubtask.setSendstate(4L); |
| | | serviceSubtask.setFinishtime(new Date()); |
| | | serviceSubtaskMapper.insertServiceSubtask(serviceSubtask); |
| | | } |
| | | } |
| | | } 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); |
| | | String url = null; |
| | | try { |
| | | if (type == 1) { |
| | | url = ip + ":" + req_path + "/outsideChain?param1=" + taskId + "¶m2=" + patid + "¶m3=" + URLEncoder.encode(ivrTask1.getTaskName(), StandardCharsets.UTF_8.toString()) + "¶m5=false"; |
| | | } else if (type == 2) { |
| | | url = ip + ":" + req_path + "/outsideChainwt?param1=" + taskId + "¶m2=" + patid + "¶m3=" + URLEncoder.encode(ivrTask1.getTaskName(), StandardCharsets.UTF_8.toString()) + "¶m5=false"; |
| | | } else if (type == 3) { |
| | | url = ip + ":" + req_path + "/outsideChainxj?param1=" + taskId + "¶m2=" + patid + "¶m3=" + URLEncoder.encode(ivrTask1.getTaskName(), StandardCharsets.UTF_8.toString()) + "¶m5=false"; |
| | | } |
| | | |
| | | String wxCode = getWXCode(serviceSubtask.getSfzh(), url, serviceSubtask.getTaskName(), serviceSubtask.getTaskDesc(), "无"); |
| | | Map<String, Object> map = JSONObject.parseObject(wxCode, Map.class); |
| | | if (!map.isEmpty()) { |
| | | serviceSubtask.setResult("success"); |
| | | serviceSubtask.setSendstate(3L); |
| | | if ((Boolean) map.get("succ") == false) { |
| | | serviceSubtask.setResult("error"); |
| | | serviceSubtask.setRemark(map.get("msg").toString()); |
| | | serviceSubtask.setSendstate(5L); |
| | | } |
| | | } |
| | | //任务发送记录 |
| | | ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord(); |
| | | serviceSubtaskRecord.setTaskid(serviceSubtask.getTaskid().toString()); |
| | | serviceSubtaskRecord.setUuid(UUID.randomUUID().toString()); |
| | | serviceSubtaskRecord.setTasktype(serviceSubtask.getType()); |
| | | serviceSubtaskRecord.setPreachform("5"); |
| | | serviceSubtaskRecord.setStartTime(System.currentTimeMillis()); |
| | | serviceSubtaskRecord.setResult("success"); |
| | | if ((Boolean) map.get("succ") == false) { |
| | | serviceSubtaskRecord.setResult("error"); |
| | | } |
| | | serviceSubtaskMapper.insertServiceSubtask(serviceSubtask); |
| | | serviceSubtaskRecordService.insertServiceSubtaskRecord(serviceSubtaskRecord); |
| | | } catch (Exception e) { |
| | | String guid = UUID.randomUUID().toString(); |
| | | log.error("公众号任务,发送失败原因:{},{}", e.getMessage(), guid); |
| | | serviceSubtask.setResult("error"); |
| | | serviceSubtask.setRemark("系统错误(任务)"); |
| | | serviceSubtask.setGuid(guid); |
| | | serviceSubtask.setSendstate(5L); |
| | | serviceSubtask.setFinishtime(new Date()); |
| | | serviceSubtaskMapper.insertServiceSubtask(serviceSubtask); |
| | | } |
| | | } |
| | | } |
| | | //通知 MQ 消息已被接收,可以ACK(从队列中删除)了 (这个需要根据业务再去处理ACK) |
| | | } |
| | | } |
| | | } |
| | | |
| | | // /** |
| | | // * 机器人第一句话语音 |
| | | // * concurrency = "50" 并发数为50 |
| | | // */ |
| | | // @RabbitListener(queues = "ob_queue", concurrency = "50") |
| | | // public void obVisit(String content, Message message, Channel channel) throws IOException { |
| | | // try { |
| | | // IvrTaskcallPhoneMQ ivrTaskcallMQ = null; |
| | | // IvrTaskcallPhoneMQ commonTaskcallMQ = null; |
| | | // ObjectMapper mapper = new ObjectMapper(); |
| | | // ivrTaskcallMQ = mapper.readValue(content, IvrTaskcallPhoneMQ.class); |
| | | // commonTaskcallMQ = mapper.readValue(content, IvrTaskcallPhoneMQ.class); |
| | | // //判断患者是否已经接电话 |
| | | // String str = redisCache.getCacheObject(ivrTaskcallMQ.getUuid() + "state_id"); |
| | | // String str = redisCache.getCacheObject(commonTaskcallMQ.getUuid() + "state_id"); |
| | | // System.out.println("-----------------" + str); |
| | | // if (StringUtils.isNotEmpty(str) && str.equals("0")) { |
| | | // //患者已经接听了电话 |
| | | // new PhoneUtils().ttsPlayback(ivrTaskcallMQ.getScript(), ivrTaskcallMQ.getUuid()); |
| | | // new PhoneUtils().ttsPlayback(commonTaskcallMQ.getScript(), commonTaskcallMQ.getUuid()); |
| | | // } else if (StringUtils.isNotEmpty(str) && str.equals("-10")) { |
| | | // //这个说明,已经打了指定遍数还是没有人接,可以将消息从队列中移除了 |
| | | // channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); |
| | |
| | | // channel.basicReject(message.getMessageProperties().getDeliveryTag(), true); |
| | | // } |
| | | // } |
| | | private String getKey() { |
| | | Map<String, String> 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<String, String> 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; |
| | | } |
| | | |
| | | private String getWXCode(String idcard, String url, String taskName, String taskDesc, String submitprompt) { |
| | | XinHuaWXReq xinHuaWXReq = new XinHuaWXReq(); |
| | | xinHuaWXReq.setIdcard(idcard); |
| | | xinHuaWXReq.setUrl(url); |
| | | xinHuaWXReq.setKeyword1("浙中医大二院出院随访"); |
| | | xinHuaWXReq.setKeyword2(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); |
| | | xinHuaWXReq.setKeyword3(taskName); |
| | | xinHuaWXReq.setKeyword4("疾病康复注意事项"); |
| | | |
| | | String result = HttpUtils.sendPost(thirdWXUrl, new Gson().toJson(xinHuaWXReq)); |
| | | JSONObject jsonObject = JSONObject.parseObject(result); |
| | | String code = (String) jsonObject.toString(); |
| | | return code; |
| | | } |
| | | |
| | | } |