package com.smartor.service.impl; import java.util.*; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DtoConversionUtils; import com.ruoyi.common.utils.RSAPublicKeyExample; import com.ruoyi.common.utils.http.HttpUtils; import com.sun.org.apache.bcel.internal.generic.NEW; import org.apache.commons.lang3.StringUtils; import com.smartor.domain.*; import com.smartor.mapper.*; 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.scheduling.annotation.Async; import org.springframework.stereotype.Service; import com.smartor.service.IServiceTaskService; import org.springframework.transaction.annotation.Transactional; /** * 语音任务Service业务层处理 * * @author smartor * @date 2023-03-24 */ @Slf4j @Service public class ServiceTaskServiceImpl implements IServiceTaskService { @Autowired private ServiceTaskMapper serviceTaskMapper; @Autowired private ServiceSubtaskMapper serviceSubtaskMapper; @Autowired private ServiceTaskdeptMapper serviceTaskdeptMapper; @Autowired private SvyTaskTemplateMapper svyTaskTemplateMapper; @Autowired private HeLibraryMapper heLibraryMapper; @Autowired private IvrLibaTemplateScriptMapper ivrLibaTemplateScriptMapper; @Autowired private SvyLibTemplateScriptMapper svyLibTemplateScriptMapper; @Autowired private PatArchiveMapper patArchiveMapper; @Autowired private IvrLibaTemplateTargetoptionMapper ivrLibaTemplateTargetOptionMapper; @Autowired private PatReservationRecordMapper patReservationRecordMapper; @Autowired private SvyLibTemplateTargetoptionMapper svyLibTemplateTargetoptionMapper; @Autowired private RedisCache redisCache; @Value("${pub_key}") private String pub_key; /** * 查询语音任务 * * @param taskid 语音任务主键 * @return 语音任务 */ @Override public ServiceTask selectServiceTaskByTaskid(Long taskid) { return serviceTaskMapper.selectServiceTaskByTaskid(taskid); } /** * 查询语音任务列表 * * @param serviceTask 语音任务 * @return 语音任务 */ @Override public List selectServiceTaskList(ServiceTask serviceTask) { //如果为0不置空,会影响到我的查询 if (CollectionUtils.isEmpty(serviceTask.getLeaveldeptcodes()) || serviceTask.getLeaveldeptcodes().size() == 0) serviceTask.setLeaveldeptcodes(null); if (CollectionUtils.isEmpty(serviceTask.getLeavehospitaldistrictcodes()) || serviceTask.getLeavehospitaldistrictcodes().size() == 0) serviceTask.setLeavehospitaldistrictcodes(null); return serviceTaskMapper.selectServiceTaskList(serviceTask); } @Override public List selectServiceTaskAndtaskDeptList(ServiceTask serviceTask) { //如果为0不置空,会影响到我的查询 if (CollectionUtils.isEmpty(serviceTask.getLeaveldeptcodes()) || serviceTask.getLeaveldeptcodes().size() == 0) serviceTask.setLeaveldeptcodes(new ArrayList()); if (!CollectionUtils.isEmpty(serviceTask.getLeavehospitaldistrictcodes()) && serviceTask.getLeavehospitaldistrictcodes().size() > 0) { List leaveldeptcodes = serviceTask.getLeaveldeptcodes(); leaveldeptcodes.addAll(serviceTask.getLeavehospitaldistrictcodes()); serviceTask.setLeaveldeptcodes(leaveldeptcodes); } return serviceTaskMapper.selectServiceTaskAndtaskDeptList(serviceTask); } /** * 新增语音任务 * * @param serviceTask 语音任务 * @return 结果 */ @Override public int insertServiceTask(ServiceTask serviceTask) { serviceTask.setCreateTime(DateUtils.getNowDate()); serviceTask.setUpdateTime(DateUtils.getNowDate()); return serviceTaskMapper.insertServiceTask(serviceTask); } /** * 修改语音任务 * * @param serviceTask 语音任务 * @return 结果 */ @Override public int updateServiceTask(ServiceTask serviceTask) { serviceTask.setUpdateTime(DateUtils.getNowDate()); return serviceTaskMapper.updateServiceTask(serviceTask); } /** * 批量删除语音任务 * * @param taskids 需要删除的语音任务主键 * @return 结果 */ @Override public int deleteServiceTaskByTaskids(Long[] taskids) { return serviceTaskMapper.deleteServiceTaskByTaskids(taskids); } /** * 删除语音任务信息 * * @param taskid 语音任务主键 * @return 结果 */ @Transactional(rollbackFor = Exception.class) @Override public Boolean deleteServiceTaskByTaskid(Long taskid) { ServiceSubtask serviceSubtask = new ServiceSubtask(); serviceSubtask.setTaskid(taskid); //查询子任务 ServiceSubtaskVO serviceSubtaskVO = DtoConversionUtils.sourceToTarget(serviceSubtask, ServiceSubtaskVO.class); List serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO); for (ServiceSubtask ss : serviceSubtaskList) { log.error("sfSend需要移除的subId为:{}", ss.getId().toString()); redisCache.removeElementFromList("cache-exist", ss.getId().toString()); redisCache.removeElementFromList("cache-0", ss.getId().toString()); redisCache.removeElementFromList("cache-1", ss.getId().toString()); redisCache.removeElementFromList("cache-2", ss.getId().toString()); redisCache.removeElementFromList("cache-3", ss.getId().toString()); redisCache.removeElementFromList("cache-4", ss.getId().toString()); } serviceSubtask.setDelFlag("1"); Boolean aBoolean = serviceSubtaskMapper.updateServiceSubtaskByPatId(serviceSubtask); //关联表删除 ServiceTaskdept serviceTaskdept = new ServiceTaskdept(); serviceTaskdept.setTaskId(taskid); serviceTaskdept.setUpdateTime(new Date()); int i = serviceTaskdeptMapper.deleteServiceTaskdeptByTaskId(serviceTaskdept); Boolean isSuccess = false; if (!aBoolean || i <= 0) { new BaseException("任务删除失败"); } isSuccess = serviceTaskMapper.deleteServiceTaskByTaskid(taskid); return isSuccess; } @Override public Map getScriptInfoByCondition(Long taskid, Long patid, Boolean isFinish) { Map map = new HashMap<>(); ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO(); serviceSubtaskVO.setPatid(patid); serviceSubtaskVO.setTaskid(taskid); //通过任务ID获取模板ID ServiceTask serviceTask = selectServiceTaskByTaskid(taskid); List info = new ArrayList(); if (serviceTask.getType().equals("1")) { //随访 log.error("文本随访问题"); info = sfInfo(serviceTask, patid); } else if (serviceTask.getType().equals("2")) { //问卷 log.error("文本问卷问题"); info = wjInfo(serviceTask, patid, isFinish); } else { //宣教 info = xjInfo(Long.valueOf(serviceTask.getLibtemplateid()), taskid, patid, isFinish); } SvyTaskTemplate svyTaskTemplate = svyTaskTemplateMapper.selectSvyTaskTemplateBySvyid(serviceTask.getTemplateid()); if (StringUtils.isNotEmpty(serviceTask.getKcb())) map.put("kcb", serviceTask.getKcb()); map.put("script", info); if (StringUtils.isNotEmpty(serviceTask.getJsy())) map.put("jsy", serviceTask.getJsy()); map.put("type", serviceTask.getType()); map.put("taskName", serviceTask.getTaskName()); map.put("submit", "0"); return map; } /** * 随访信息 * * @param serviceTask * @param patid * @return */ public List sfInfo(ServiceTask serviceTask, Long patid) { //通过模板ID获取问题信息 IvrLibaTemplateScript ivrLibaTemplateScript = new IvrLibaTemplateScript(); ivrLibaTemplateScript.setTemplateid(Long.valueOf(serviceTask.getLibtemplateid())); ivrLibaTemplateScript.setDelFlag("0"); List ivrLibaTemplateScripts = ivrLibaTemplateScriptMapper.selectIvrLibaTemplateScriptList(ivrLibaTemplateScript); if (CollectionUtils.isEmpty(ivrLibaTemplateScripts) || ivrLibaTemplateScripts.size() == 0) { log.info("ivrLibaTemplateScripts为空了,请尽快联系管理员处理"); return new ArrayList<>(); } List ivrLibaTemplateScriptVOS = DtoConversionUtils.sourceToTarget(ivrLibaTemplateScripts, IvrLibaTemplateScriptVO.class); //获取患者信息 PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patid); //通过患者信息和任务信息中的textParam对问题中的变量进行填充 ObjectMapper objectMapper = new ObjectMapper(); Map> serviceTaskMap = null; try { serviceTaskMap = objectMapper.readValue(serviceTask.getTextParam(), Map.class); } catch (JsonProcessingException e) { e.printStackTrace(); } List> mapList = new ArrayList<>(); for (Map map : serviceTaskMap.values()) { mapList.add(map); } //将模板问题话术里的通配符替换 for (IvrLibaTemplateScriptVO ivrLibaTemplateScriptVO : ivrLibaTemplateScriptVOS) { if (StringUtils.isNotEmpty(ivrLibaTemplateScriptVO.getScriptContent())) { for (Map map : mapList) { for (String key : map.keySet()) { ivrLibaTemplateScriptVO.setScriptContent(ivrLibaTemplateScriptVO.getScriptContent().replace(key, StringUtils.isNotEmpty(map.get(key)) ? map.get(key) : "")); } } //替换患者个人信息数据 ivrLibaTemplateScriptVO.setScriptContent(ivrLibaTemplateScriptVO.getScriptContent().replace("${name}", StringUtils.isNotEmpty(patArchive.getName()) ? patArchive.getName() : "")); ivrLibaTemplateScriptVO.setScriptContent(ivrLibaTemplateScriptVO.getScriptContent().replace("${dzz}", StringUtils.isNotEmpty(patArchive.getPlaceOfResidence()) ? patArchive.getPlaceOfResidence() : "")); ivrLibaTemplateScriptVO.setScriptContent(ivrLibaTemplateScriptVO.getScriptContent().replace("${dhh}", StringUtils.isNotEmpty(patArchive.getTelcode()) ? patArchive.getTelcode() : "")); //获取问题选项 IvrLibaTemplateTargetoption ivrLibaTemplateTargetoption = new IvrLibaTemplateTargetoption(); ivrLibaTemplateTargetoption.setScriptid(ivrLibaTemplateScriptVO.getId()); List ivrLibaTemplateTargetoptions = ivrLibaTemplateTargetOptionMapper.selectIvrLibaTemplateTargetoptionList(ivrLibaTemplateTargetoption); ivrLibaTemplateScriptVO.setIvrLibaScriptTargetoptionList(ivrLibaTemplateTargetoptions); } } Collections.sort(ivrLibaTemplateScriptVOS, Comparator.comparingInt(IvrLibaTemplateScriptVO::getSort)); return ivrLibaTemplateScriptVOS; } /** * 问卷信息 * * @param serviceTask * @param patid * @return */ private List wjInfo(ServiceTask serviceTask, Long patid, Boolean isFinish) { // 只要打开了页面,就算领取 if (Boolean.TRUE.equals(isFinish)) { ServiceSubtask ss = new ServiceSubtask(); ss.setTaskid(serviceTask.getTaskid()); ss.setPatid(patid); // 需要通过taskid(任务不是循环任务pat_cycle=0) 和 patid查询 Integer integer = serviceSubtaskMapper.selectSendstateByCondition(ss); log.info("----------integer的值为:{},taskid:{},patid:{}", integer, serviceTask.getTaskid(), patid); if (Integer.valueOf(3).equals(integer)) { ss.setSendstate(1L); serviceSubtaskMapper.updateServiceSubtaskByCondition(ss); } } //通过模板ID获取问题信息 SvyLibTemplateScript svyLibTemplateScript = new SvyLibTemplateScript(); svyLibTemplateScript.setSvyid(Long.valueOf(serviceTask.getLibtemplateid())); svyLibTemplateScript.setDelFlag("0"); List svyLibTemplateScripts = svyLibTemplateScriptMapper.selectSvyLibTemplateScriptList(svyLibTemplateScript); if (CollectionUtils.isEmpty(svyLibTemplateScripts) || svyLibTemplateScripts.size() == 0) { log.info("ivrLibaTemplateScripts为空了,请尽快联系管理员处理"); return new ArrayList<>(); } List svyLibTemplateScriptVOS = DtoConversionUtils.sourceToTarget(svyLibTemplateScripts, SvyLibTemplateScriptVO.class); //获取患者信息 PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patid); //通过患者信息和任务信息中的textParam对问题中的变量进行填充 ObjectMapper objectMapper = new ObjectMapper(); Map> ivrTaskMap = null; try { ivrTaskMap = objectMapper.readValue(serviceTask.getTextParam(), Map.class); } catch (JsonProcessingException e) { e.printStackTrace(); } List> mapList = new ArrayList<>(); for (Map map : ivrTaskMap.values()) { mapList.add(map); } //将模板问题话术里的通配符替换 for (SvyLibTemplateScriptVO svyLibTemplateScriptVO : svyLibTemplateScriptVOS) { if (StringUtils.isNotEmpty(svyLibTemplateScriptVO.getScriptContent())) { for (Map map : mapList) { for (String key : map.keySet()) { svyLibTemplateScriptVO.setScriptContent(svyLibTemplateScriptVO.getScriptContent().replace(key, StringUtils.isNotEmpty(map.get(key)) ? map.get(key) : "")); } } //替换患者个人信息数据 log.error("问题id:{}, 问题内容:{}", svyLibTemplateScriptVO.getId(), svyLibTemplateScriptVO.getScriptContent()); if (StringUtils.isNotEmpty(svyLibTemplateScriptVO.getScriptContent())) { svyLibTemplateScriptVO.setScriptContent(svyLibTemplateScriptVO.getScriptContent().replace("${name}", StringUtils.isNotEmpty(patArchive.getName()) ? patArchive.getName() : "")); svyLibTemplateScriptVO.setScriptContent(svyLibTemplateScriptVO.getScriptContent().replace("${dzz}", StringUtils.isNotEmpty(patArchive.getPlaceOfResidence()) ? patArchive.getPlaceOfResidence() : "")); svyLibTemplateScriptVO.setScriptContent(svyLibTemplateScriptVO.getScriptContent().replace("${dhh}", StringUtils.isNotEmpty(patArchive.getTelcode()) ? patArchive.getTelcode() : "")); } //获取问题选项 SvyLibTemplateTargetoption svyLibTemplateTargetoption = new SvyLibTemplateTargetoption(); svyLibTemplateTargetoption.setScriptid(svyLibTemplateScriptVO.getId()); List svyLibTemplateTargetoptions = svyLibTemplateTargetoptionMapper.selectSvyLibTemplateTargetoptionList(svyLibTemplateTargetoption); // 判断预约人数 for (SvyLibTemplateTargetoption stt : svyLibTemplateTargetoptions) { Boolean full = patReservationRecordMapper.existsEqualNum(stt.getId()); if (Boolean.TRUE.equals(full)) { stt.setPerson(-1L); } stt.setTemplateID(null); RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample(); String id = rsaPublicKeyExample.encryptedData(stt.getId().toString(), pub_key); stt.setJmid(id); stt.setId(null); } svyLibTemplateScriptVO.setSvyLibTemplateTargetoptions(svyLibTemplateTargetoptions); } } svyLibTemplateScriptVOS.sort(Comparator.comparingLong(SvyLibTemplateScriptVO::getSort)); return svyLibTemplateScriptVOS; } private List xjInfo(Long templateId, Long taskid, Long patid, Boolean isFinish) { if (isFinish == true) { ServiceSubtask serviceSubtask = new ServiceSubtask(); serviceSubtask.setTaskid(taskid); serviceSubtask.setPatid(patid); Integer integer = serviceSubtaskMapper.selectSendstateByCondition(serviceSubtask); if (integer == 3) { serviceSubtask.setResult("完成"); serviceSubtask.setFinishtime(new Date()); serviceSubtask.setSendstate(6L); serviceSubtaskMapper.updateServiceSubtaskByCondition(serviceSubtask); } } HeLibrary heLibrary = heLibraryMapper.selectHeLibraryById(Long.valueOf(templateId)); List list = new ArrayList(); list.add(heLibrary); return list; } }