package com.xinelu.quartz.task; import com.alibaba.fastjson2.JSONObject; import com.xinelu.common.enums.NodeExecuteStatusEnum; import com.xinelu.common.enums.PhoneDialMethodEnum; import com.xinelu.common.enums.TaskNodeTypeEnum; import com.xinelu.common.utils.StringUtils; import com.xinelu.manage.domain.patientinfo.PatientInfo; import com.xinelu.manage.domain.patientvisitrecord.PatientVisitRecord; import com.xinelu.manage.domain.scriptInfo.ScriptInfo; import com.xinelu.manage.domain.scriptinfotaskinfo.ScriptInfoTaskInfo; import com.xinelu.manage.domain.signpatientmanageroute.SignPatientManageRoute; import com.xinelu.manage.domain.signpatientmanageroutenode.SignPatientManageRouteNode; import com.xinelu.manage.domain.signpatientrecord.SignPatientRecord; import com.xinelu.manage.dto.aibo.CreateTaskDto; import com.xinelu.manage.dto.aibo.CustomerInfoDto; import com.xinelu.manage.dto.aibo.ImportTaskDto; import com.xinelu.manage.dto.signpatientmanageroutenode.SignPatientManageRouteNodeDto; import com.xinelu.manage.mapper.labelfieldcontent.LabelFieldContentMapper; import com.xinelu.manage.mapper.patientinfo.PatientInfoMapper; import com.xinelu.manage.mapper.patientvisitrecord.PatientVisitRecordMapper; import com.xinelu.manage.mapper.scriptInfo.ScriptInfoMapper; import com.xinelu.manage.mapper.scriptinfotaskinfo.ScriptInfoTaskInfoMapper; import com.xinelu.manage.mapper.signpatientmanageroute.SignPatientManageRouteMapper; import com.xinelu.manage.mapper.signpatientmanageroutenode.SignPatientManageRouteNodeMapper; import com.xinelu.manage.mapper.signpatientrecord.SignPatientRecordMapper; import com.xinelu.manage.service.aibo.IAIOBService; import com.xinelu.manage.service.signpatientmanageroutenode.ISignPatientManageRouteNodeService; import com.xinelu.manage.vo.labelfieldcontent.LabelFieldInfoContentVo; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.springframework.stereotype.Component; /** * @description: 爱医声上传任务定时任务 * @author: haown * @create: 2024-08-19 13:58 **/ @Slf4j @Component("UploadRobotPublishTask") public class UploadRobotPublishTask { @Resource private SignPatientManageRouteNodeMapper signPatientManageRouteNodeMapper; @Resource private ISignPatientManageRouteNodeService signPatientManageRouteNodeService; @Resource private SignPatientManageRouteMapper signPatientManageRouteMapper; @Resource private SignPatientRecordMapper signPatientRecordMapper; @Resource private PatientVisitRecordMapper patientVisitRecordMapper; @Resource private ScriptInfoTaskInfoMapper scriptInfoTaskInfoMapper; @Resource private IAIOBService aiobService; @Resource private ScriptInfoMapper scriptInfoMapper; @Resource private PatientInfoMapper patientInfoMapper; @Resource private LabelFieldContentMapper labelFieldContentMapper; public void uploadRobotPublishTask() { log.info("开始执行百度智能外呼创建任务定时任务......"); // 查找需要当天执行的AI打电话任务 SignPatientManageRouteNodeDto signPatientManageRouteNodeDto = new SignPatientManageRouteNodeDto(); signPatientManageRouteNodeDto.setTaskNodeType(TaskNodeTypeEnum.PHONE_OUTBOUND.getInfo()); signPatientManageRouteNodeDto.setNodeExecuteStatus(NodeExecuteStatusEnum.UNEXECUTED.getInfo()); signPatientManageRouteNodeDto.setPhoneDialMethod(PhoneDialMethodEnum.AI.getInfo()); List nodeList = signPatientManageRouteNodeMapper.selectSignPatientManageRouteNodeList(signPatientManageRouteNodeDto); List executeNodeList = new ArrayList<>(); nodeList.forEach(node -> { SignPatientManageRoute signPatientManageRoute = signPatientManageRouteMapper.selectSignPatientManageRouteById(node.getManageRouteId()); SignPatientRecord signPatientRecord = signPatientRecordMapper.selectByPrimaryKey(signPatientManageRoute.getSignPatientRecordId()); PatientVisitRecord patientVisitRecord = patientVisitRecordMapper.selectPatientVisitRecordById(signPatientRecord.getPatientVisitRecordId()); LocalDateTime executeTime = signPatientManageRouteNodeService.getExecuteTime(node.getExecuteTime(), node.getRouteNodeName(), node.getRouteNodeDay(), patientVisitRecord); if (executeTime.toLocalDate().isBefore(LocalDate.now())) { executeNodeList.add(node); } }); if (CollectionUtils.isNotEmpty(executeNodeList)) { // 按照话术id分组,每个话术id对应不同的机器人id, 每个机器人每天创建一条任务 Map> groupByScriptInfo = executeNodeList.stream().collect(Collectors.groupingBy(SignPatientManageRouteNode::getScriptInfoId)); // 根据机器人id查询智能外呼系统的任务id for (Long scriptInfoId : groupByScriptInfo.keySet()) { ScriptInfo scriptInfo = scriptInfoMapper.selectScriptInfoById(scriptInfoId); String taskId = scriptInfoTaskInfoMapper.getByScriptInfoId(scriptInfoId); if (StringUtils.isBlank(taskId)) { // 没有任务则创建任务 if (ObjectUtils.isNotEmpty(scriptInfo)) { CreateTaskDto createTaskDto = new CreateTaskDto(); createTaskDto.setTaskName(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + scriptInfo.getScriptName()); createTaskDto.setRobotId(scriptInfo.getRobotPublishId()); createTaskDto.setDialStartDate(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); createTaskDto.setDialEndDate(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); createTaskDto.setForbidDialDate(Arrays.asList(99)); createTaskDto.setNumTypeFilterList(Arrays.asList(1,2)); taskId = aiobService.createTask(createTaskDto); ScriptInfoTaskInfo scriptInfoTaskInfo = new ScriptInfoTaskInfo(); scriptInfoTaskInfo.setScriptInfoId(scriptInfoId); scriptInfoTaskInfo.setTaskId(taskId); scriptInfoTaskInfo.setRobotId(scriptInfo.getRobotPublishId()); scriptInfoTaskInfo.setCreateTime(LocalDateTime.now()); scriptInfoTaskInfoMapper.insertScriptInfoTaskInfo(scriptInfoTaskInfo); } } // 客户名单list List scriptNodeList = groupByScriptInfo.get(scriptInfoId); List customerInfoList = new ArrayList<>(); scriptNodeList.forEach(node -> { CustomerInfoDto customerInfoDto = new CustomerInfoDto(); customerInfoDto.setExtJson(node.getId() + ""); SignPatientManageRoute signPatientManageRoute = signPatientManageRouteMapper.selectSignPatientManageRouteById(node.getManageRouteId()); PatientInfo patientInfo = patientInfoMapper.selectPatientInfoById(signPatientManageRoute.getPatientId()); customerInfoDto.setMobile(patientInfo.getPatientPhone()); // 查询患者画像信息 List labelFieldContentList = labelFieldContentMapper.selectByPatientId(patientInfo.getId()); // 处理变量 JSONObject jsonObject = new JSONObject(); if (StringUtils.isNotBlank(scriptInfo.getVariables())) { List variables = Arrays.asList(scriptInfo.getVariables().split("|")); variables.forEach(variable -> { LabelFieldInfoContentVo labelFieldContent = labelFieldContentList.stream().filter(s -> Objects.equals(s.getFieldCode(), variable.replaceAll("_", "").toUpperCase())).findFirst().orElse(null); jsonObject.fluentPut(variable, ObjectUtils.isEmpty(labelFieldContent) ? "" : labelFieldContent.getFieldValue()); }); } customerInfoDto.setVar(jsonObject); customerInfoList.add(customerInfoDto); }); // 上传名单 ImportTaskDto importTaskDto = new ImportTaskDto(); importTaskDto.setTaskId(taskId); importTaskDto.setSecretType(2); importTaskDto.setCustomerInfoList(customerInfoList); aiobService.importTask(importTaskDto); // 开启任务 aiobService.updateTaskStatus(taskId, 2); } } } }