From 254839b2fdb8cb7ce130972de22beafb506a7b7c Mon Sep 17 00:00:00 2001 From: zhuangyuanke Date: Wed, 11 Dec 2024 18:31:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=96=E5=91=BC=E6=89=B9=E9=87=8F=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E4=BB=A3=E7=A0=81=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xinelu/common/enums/DialStatusEnum.java | 24 + .../SignPatientManageRouteNodeDto.java | 5 + .../ScriptInfoTaskInfoMapper.java | 2 +- .../impl/PatientInfoServiceImpl.java | 36 +- .../SignPatientManageRouteServiceImpl.java | 6 +- .../SignPatientManageRouteNodeMapper.xml | 7 + .../quartz/task/UploadRobotPublishTask.java | 449 ++++++++++-------- 7 files changed, 299 insertions(+), 230 deletions(-) create mode 100644 postdischarge-common/src/main/java/com/xinelu/common/enums/DialStatusEnum.java diff --git a/postdischarge-common/src/main/java/com/xinelu/common/enums/DialStatusEnum.java b/postdischarge-common/src/main/java/com/xinelu/common/enums/DialStatusEnum.java new file mode 100644 index 00000000..8ed8df7b --- /dev/null +++ b/postdischarge-common/src/main/java/com/xinelu/common/enums/DialStatusEnum.java @@ -0,0 +1,24 @@ +package com.xinelu.common.enums; + + +import lombok.Getter; + +@Getter +public enum DialStatusEnum { + /** + * 未拨打 + */ + NODIALED("NODIALED"), + /** + * 已拨打 + */ + DIALED("DIALED"), + ; + final private String info; + + DialStatusEnum(String info) { + this.info = info; + } + + +} diff --git a/postdischarge-manage/src/main/java/com/xinelu/manage/dto/signpatientmanageroutenode/SignPatientManageRouteNodeDto.java b/postdischarge-manage/src/main/java/com/xinelu/manage/dto/signpatientmanageroutenode/SignPatientManageRouteNodeDto.java index 1ed3d3bb..33fc960d 100644 --- a/postdischarge-manage/src/main/java/com/xinelu/manage/dto/signpatientmanageroutenode/SignPatientManageRouteNodeDto.java +++ b/postdischarge-manage/src/main/java/com/xinelu/manage/dto/signpatientmanageroutenode/SignPatientManageRouteNodeDto.java @@ -81,6 +81,11 @@ public class SignPatientManageRouteNodeDto { */ @ApiModelProperty(value = "任务执行类型(批量还是单个执行,'批量任务:BATCH_TASK,单个实时拔打任务:ACTUAL_TIME_TASK')") private String taskExcuteType; + /** + * 拨打状态:DIALED,已拨打:NODIALED:未拨打;默认NULL表示未拨打 + */ + @ApiModelProperty(value = "拨打状态:DIALED,已拨打:NODIALED:未拨打;默认NULL表示未拨打") + private String dialStaus; diff --git a/postdischarge-manage/src/main/java/com/xinelu/manage/mapper/scriptinfotaskinfo/ScriptInfoTaskInfoMapper.java b/postdischarge-manage/src/main/java/com/xinelu/manage/mapper/scriptinfotaskinfo/ScriptInfoTaskInfoMapper.java index 3fef949e..3d2b097f 100644 --- a/postdischarge-manage/src/main/java/com/xinelu/manage/mapper/scriptinfotaskinfo/ScriptInfoTaskInfoMapper.java +++ b/postdischarge-manage/src/main/java/com/xinelu/manage/mapper/scriptinfotaskinfo/ScriptInfoTaskInfoMapper.java @@ -11,7 +11,7 @@ import java.util.List; */ public interface ScriptInfoTaskInfoMapper { - String getByNodeId(Long signPatientManageRouteNodeId, String aiobTaskType); + String getByNodeId(String signPatientManageRouteNodeId, String aiobTaskType); List selectList(ScriptInfoTaskInfo scriptInfoTaskInfo); diff --git a/postdischarge-manage/src/main/java/com/xinelu/manage/service/patientinfo/impl/PatientInfoServiceImpl.java b/postdischarge-manage/src/main/java/com/xinelu/manage/service/patientinfo/impl/PatientInfoServiceImpl.java index 4907c311..624b51a0 100644 --- a/postdischarge-manage/src/main/java/com/xinelu/manage/service/patientinfo/impl/PatientInfoServiceImpl.java +++ b/postdischarge-manage/src/main/java/com/xinelu/manage/service/patientinfo/impl/PatientInfoServiceImpl.java @@ -453,28 +453,28 @@ public class PatientInfoServiceImpl implements IPatientInfoService { patientInfoImportVO.setDeptAliasVOS(deptAliasVOS); } + //新增缓存表 + int insertCount = patientInfoImportMapper.insertPatientInfoImportList(patientInfoImportList); + if (insertCount <= 0) { + log.info("缓存表新增失败!"); + return AjaxResult.error("数据导入失败!"); + } + //导入记录主表 + //region 导入记录主表 + PatientInfoImportMain patientInfoImportMain = new PatientInfoImportMain(); + patientInfoImportMain.setCreateBy(SecurityUtils.getUsername()); + patientInfoImportMain.setCreateTime(LocalDateTime.now()); + patientInfoImportMain.setSn(sn); + patientInfoImportMain.setHospitalAgencyId(agency.getId()); + patientInfoImportMain.setFileName(fileName); + patientInfoImportMain.setHospitalAgencyName(agency.getAgencyName()); + patientInfoImportMainMapper.insertPatientInfoImportMain(patientInfoImportMain); + //endregion + //科室名称全符合新增患者表,否则返回数据 if (CollectionUtils.isNotEmpty(deptAliasVOS)) { return AjaxResult.error("科室名称不存在", patientInfoImportVO); } else { - //新增缓存表 - int insertCount = patientInfoImportMapper.insertPatientInfoImportList(patientInfoImportList); - if (insertCount <= 0) { - log.info("缓存表新增失败!"); - return AjaxResult.error("数据导入失败!"); - } - //导入记录主表 - //region 导入记录主表 - PatientInfoImportMain patientInfoImportMain = new PatientInfoImportMain(); - patientInfoImportMain.setCreateBy(SecurityUtils.getUsername()); - patientInfoImportMain.setCreateTime(LocalDateTime.now()); - patientInfoImportMain.setSn(sn); - patientInfoImportMain.setHospitalAgencyId(agency.getId()); - patientInfoImportMain.setFileName(fileName); - patientInfoImportMain.setHospitalAgencyName(agency.getAgencyName()); - patientInfoImportMainMapper.insertPatientInfoImportMain(patientInfoImportMain); - //endregion - //新增居民表 //region 新增居民表 patientInfoImportList.forEach(item -> diff --git a/postdischarge-manage/src/main/java/com/xinelu/manage/service/signpatientmanageroute/impl/SignPatientManageRouteServiceImpl.java b/postdischarge-manage/src/main/java/com/xinelu/manage/service/signpatientmanageroute/impl/SignPatientManageRouteServiceImpl.java index e92d0895..d265a314 100644 --- a/postdischarge-manage/src/main/java/com/xinelu/manage/service/signpatientmanageroute/impl/SignPatientManageRouteServiceImpl.java +++ b/postdischarge-manage/src/main/java/com/xinelu/manage/service/signpatientmanageroute/impl/SignPatientManageRouteServiceImpl.java @@ -230,7 +230,7 @@ public class SignPatientManageRouteServiceImpl implements ISignPatientManageRout signPatientManageRoute.setCreateBy(SecurityUtils.getUsername()); signPatientManageRoute.setCreateTime(LocalDateTime.now()); //任务执行类型,批量执行 - if(StringUtils.isNotBlank(signPatientManageRoute.getImportMainId())) + if(StringUtils.isNotBlank(signPatientManageRoute.getSn())) { signPatientManageRoute.setTaskExcuteType(TaskExcuteTypeEnum.BATCH_TASK.getInfo());} //任务路由主表 新增 @@ -247,7 +247,7 @@ public class SignPatientManageRouteServiceImpl implements ISignPatientManageRout continue; } //任务执行类型,批量执行 - if(StringUtils.isNotBlank(signPatientManageRoute.getImportMainId())) + if(StringUtils.isNotBlank(signPatientManageRoute.getSn())) { routeNode.setTaskExcuteType(TaskExcuteTypeEnum.BATCH_TASK.getInfo());} if(Objects.isNull(signPatientManageRoute.getSignPatientRecordId())) { //更新 审核状态为 已审核,适用场景:对未签约患者 手动创建任务 zyk 20241204 @@ -1095,7 +1095,7 @@ public class SignPatientManageRouteServiceImpl implements ISignPatientManageRout private void extracted(SignPatientManageRouteVO signPatientManageRoute, List signPatientManageRouteNodes, SignPatientManageRouteNode routeNode) { SignPatientManageRouteNode signPatientManageRouteNode = new SignPatientManageRouteNode(); //如果 导入患者主表id不为空,则认为此任务是批量执行类型 - if(StringUtils.isNotBlank(signPatientManageRoute.getImportMainId())) + if(StringUtils.isNotBlank(signPatientManageRoute.getSn())) signPatientManageRouteNode.setTaskExcuteType(TaskExcuteTypeEnum.BATCH_TASK.getInfo()); else signPatientManageRouteNode.setTaskExcuteType(TaskExcuteTypeEnum.ACTUAL_TIME_TASK.getInfo()); diff --git a/postdischarge-manage/src/main/resources/mapper/manage/signpatientmanageroutenode/SignPatientManageRouteNodeMapper.xml b/postdischarge-manage/src/main/resources/mapper/manage/signpatientmanageroutenode/SignPatientManageRouteNodeMapper.xml index b19e20b0..886a935a 100644 --- a/postdischarge-manage/src/main/resources/mapper/manage/signpatientmanageroutenode/SignPatientManageRouteNodeMapper.xml +++ b/postdischarge-manage/src/main/resources/mapper/manage/signpatientmanageroutenode/SignPatientManageRouteNodeMapper.xml @@ -83,6 +83,7 @@ + @@ -143,6 +144,12 @@ and task_excute_type = #{taskExcuteType} + + and (dial_status is null or dial_status = 'NODIALED') + + + and dial_status = 'DIALED' + diff --git a/postdischarge-quartz/src/main/java/com/xinelu/quartz/task/UploadRobotPublishTask.java b/postdischarge-quartz/src/main/java/com/xinelu/quartz/task/UploadRobotPublishTask.java index 82fea3da..f3cd6003 100644 --- a/postdischarge-quartz/src/main/java/com/xinelu/quartz/task/UploadRobotPublishTask.java +++ b/postdischarge-quartz/src/main/java/com/xinelu/quartz/task/UploadRobotPublishTask.java @@ -2,10 +2,7 @@ package com.xinelu.quartz.task; import com.alibaba.fastjson2.JSONObject; import com.xinelu.common.constant.AiobTaskTypeContant; -import com.xinelu.common.enums.NodeExecuteStatusEnum; -import com.xinelu.common.enums.PhoneDialMethodEnum; -import com.xinelu.common.enums.PhoneRedialTimesEnum; -import com.xinelu.common.enums.TaskExcuteTypeEnum; +import com.xinelu.common.enums.*; import com.xinelu.common.utils.StringUtils; import com.xinelu.manage.domain.patientinfo.PatientInfo; import com.xinelu.manage.domain.patientvisitrecord.PatientVisitRecord; @@ -31,16 +28,17 @@ import com.xinelu.manage.service.aiob.IAIOBService; import com.xinelu.manage.service.signpatientmanageroutenode.ISignPatientManageRouteNodeService; import com.xinelu.manage.vo.aiob.ImportTaskVo; 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.Objects; +import java.util.*; +import java.util.stream.Collectors; import javax.annotation.Resource; + import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.ObjectUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @@ -54,215 +52,250 @@ import org.springframework.stereotype.Component; @Component("UploadRobotPublishTask") public class UploadRobotPublishTask { - @Value("${aiob.callBackUrl}") - private String callBackUrl; - @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; + @Value("${aiob.callBackUrl}") + private String callBackUrl; + @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; - /** - * @description 创建百度智能外呼任务并导入客户名单 - * @Author haown - * @Date 2024-9-5 13:55 - */ - 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); + /** + * @description 创建百度智能外呼任务并导入客户名单 + * @Author haown + * @Date 2024-9-5 13:55 + * @Date 2024-12-11 重构批量执行 + */ + 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()); + //只获取 任务执行类型为 批量执行的 + signPatientManageRouteNodeDto.setTaskExcuteType(TaskExcuteTypeEnum.BATCH_TASK.getInfo()); + //查询未拨打的 + signPatientManageRouteNodeDto.setDialStaus(DialStatusEnum.NODIALED.getInfo()); - 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 (node.getScriptInfoId() != null && (executeTime.toLocalDate().isBefore(LocalDate.now()) || executeTime.toLocalDate().isEqual(LocalDate.now()))) { - executeNodeList.add(node); - } - }); + List nodeList = signPatientManageRouteNodeMapper.selectSignPatientManageRouteNodeList(signPatientManageRouteNodeDto); - if (CollectionUtils.isNotEmpty(executeNodeList)) { - // 根据机器人id查询智能外呼系统的任务id - executeNodeList.forEach(node -> { - ScriptInfo scriptInfo = scriptInfoMapper.selectScriptInfoById(node.getScriptInfoId()); - String taskId = scriptInfoTaskInfoMapper.getByNodeId(node.getId(), AiobTaskTypeContant.BATCHTASK); - if (StringUtils.isBlank(taskId)) { - // 没有任务则创建任务 - if (ObjectUtils.isNotEmpty(scriptInfo)) { - log.info("创建任务......"); - CreateTaskDto createTaskDto = new CreateTaskDto(); - createTaskDto.setTaskName(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + scriptInfo.getScriptName() + "(" +node.getId()+ ")"); - 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.setRetryTimes(StringUtils.isBlank(node.getPhoneRedialTimes()) ? 0 : PhoneRedialTimesEnum.getValueByInfo(node.getPhoneRedialTimes()).getValue()); - createTaskDto.setRetryInterval(node.getPhoneTimeInterval()); - createTaskDto.setNumTypeFilterList(Arrays.asList(1,2)); - createTaskDto.setTaskDataCallback(true); - createTaskDto.setCallBackUrl(callBackUrl); - taskId = aiobService.createTask(createTaskDto); - // 开启任务 - log.info("开启任务......"); - aiobService.updateTaskStatus(taskId, 2); + 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 (node.getScriptInfoId() != null && (executeTime.toLocalDate().isBefore(LocalDate.now()) || executeTime.toLocalDate().isEqual(LocalDate.now()))) { + executeNodeList.add(node); + } + }); + if (executeNodeList.isEmpty()) return; - ScriptInfoTaskInfo scriptInfoTaskInfo = new ScriptInfoTaskInfo(); - scriptInfoTaskInfo.setScriptInfoId(node.getScriptInfoId()); - scriptInfoTaskInfo.setTaskId(taskId); - scriptInfoTaskInfo.setRobotId(scriptInfo.getRobotPublishId()); - scriptInfoTaskInfo.setCreateTime(LocalDateTime.now()); - scriptInfoTaskInfo.setSignPatientManageRouteNodeId(node.getId()); - scriptInfoTaskInfo.setAiobTaskType(AiobTaskTypeContant.BATCHTASK); - scriptInfoTaskInfoMapper.insertScriptInfoTaskInfo(scriptInfoTaskInfo); - } - } - // 客户名单list - List customerInfoList = new ArrayList<>(); + //1、最外层,按照路径ID分组 + Map> routeNodeGroupListByRouteId = + executeNodeList.stream().collect(Collectors.groupingBy(SignPatientManageRouteNode::getManageRouteId)); - 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()); - }); - } + //开始遍历 + routeNodeGroupListByRouteId.keySet().forEach(routeId -> { + //2、次外层,按照话术ID分组 + Map> routeNodeGroupListByScriptInfoId = + executeNodeList.stream().collect(Collectors.groupingBy(SignPatientManageRouteNode::getScriptInfoId)); + //开始遍历,生成任务 + routeNodeGroupListByScriptInfoId.keySet().forEach(scriptInfoId -> { + // 同已分组下的任务节点,配置属性 应该是 是相同的,所以取第0项节点 来使用 + SignPatientManageRouteNode nodeTemp = routeNodeGroupListByScriptInfoId.get(scriptInfoId).get(0); + //话术 + ScriptInfo scriptInfo = scriptInfoMapper.selectScriptInfoById(scriptInfoId); + //拼接一个taskId,格式:NodeId_ScriptInfoId_ManageRouteId + String taskId = scriptInfoTaskInfoMapper.getByNodeId(Long.toString(nodeTemp.getId()).concat("_") + .concat(Long.toString(nodeTemp.getManageRouteId()).concat("_").concat(String.valueOf(nodeTemp.getScriptInfoId()))), + AiobTaskTypeContant.BATCHTASK); + if (StringUtils.isBlank(taskId)) { + // 没有任务则创建任务 + if (ObjectUtils.isNotEmpty(scriptInfo)) { + log.info("创建任务......"); + CreateTaskDto createTaskDto = new CreateTaskDto(); + createTaskDto.setTaskName(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + scriptInfo.getScriptName() + "(" + nodeTemp.getId() + ")"); + 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.setRetryTimes(StringUtils.isBlank(nodeTemp.getPhoneRedialTimes()) ? 0 : PhoneRedialTimesEnum.getValueByInfo(nodeTemp.getPhoneRedialTimes()).getValue()); + createTaskDto.setRetryInterval(nodeTemp.getPhoneTimeInterval()); + createTaskDto.setNumTypeFilterList(Arrays.asList(1, 2)); + createTaskDto.setTaskDataCallback(true); + createTaskDto.setCallBackUrl(callBackUrl); + taskId = aiobService.createTask(createTaskDto); + // 开启任务 + log.info("开启任务......"); + aiobService.updateTaskStatus(taskId, 2); - customerInfoDto.setVar(jsonObject); - customerInfoList.add(customerInfoDto); + ScriptInfoTaskInfo scriptInfoTaskInfo = new ScriptInfoTaskInfo(); + scriptInfoTaskInfo.setScriptInfoId(nodeTemp.getScriptInfoId()); + scriptInfoTaskInfo.setTaskId(taskId); + scriptInfoTaskInfo.setRobotId(scriptInfo.getRobotPublishId()); + scriptInfoTaskInfo.setCreateTime(LocalDateTime.now()); + scriptInfoTaskInfo.setSignPatientManageRouteNodeId(nodeTemp.getId()); + scriptInfoTaskInfo.setAiobTaskType(AiobTaskTypeContant.BATCHTASK); + //进入拔打记录表(用于后续重拨处理等判断) + scriptInfoTaskInfoMapper.insertScriptInfoTaskInfo(scriptInfoTaskInfo); - // 上传名单 - log.info("任务导入客户名单......"); - ImportTaskDto importTaskDto = new ImportTaskDto(); - importTaskDto.setTaskId(taskId); - importTaskDto.setSecretType(2); - importTaskDto.setCustomerInfoList(customerInfoList); - List importTaskList = aiobService.importTask(importTaskDto); - String finalTaskId = taskId; - importTaskList.forEach(importTaskVo -> { - // 名单导入成功后,sign_patient_manage_route_node表中设置taskId - if (importTaskVo.getStatus()) { - node.setTaskIdExt(finalTaskId); - node.setId(Long.valueOf(importTaskVo.getExtJson())); - signPatientManageRouteNodeMapper.updateSignPatientManageRouteNode(node); - } - }); - }); - } - log.info("百度智能外呼创建任务定时任务执行完成......"); - } + //3、开始组装本任务下的客户变量 + // 客户名单list + List customerInfoList = new ArrayList<>(); + //遍历最内层任务节点 + routeNodeGroupListByScriptInfoId.get(scriptInfoId).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); - /** - * @description 创建实时任务 - * @return null - * @Author haown - * @Date 2024-9-23 10:41 - */ - public void actualTimeTask() { - log.info("开始执行百度智能外呼创建实时任务定时任务......"); - // 查找需要当天执行的AI打电话任务(问卷或电话外呼类型) - SignPatientManageRouteNodeDto signPatientManageRouteNodeDto = new SignPatientManageRouteNodeDto(); - signPatientManageRouteNodeDto.setNodeExecuteStatus(NodeExecuteStatusEnum.UNEXECUTED.getInfo()); - signPatientManageRouteNodeDto.setPhoneDialMethod(PhoneDialMethodEnum.AI.getInfo()); - //只获取 任务执行类型为 单个执行的 - signPatientManageRouteNodeDto.setTaskExcuteType(TaskExcuteTypeEnum.ACTUAL_TIME_TASK.getInfo()); - List nodeList = signPatientManageRouteNodeMapper.selectSignPatientManageRouteNodeList(signPatientManageRouteNodeDto); - List executeNodeList = new ArrayList<>(); - nodeList.forEach(node -> { - LocalDateTime executeTime ; - //如果有计划执行时间,则直接获取 - if(node.getNodePlanTime()!=null) - { executeTime = node.getNodePlanTime(); } - // 否则 ,则根据诊后/院后 第几天 计算 - else { - SignPatientManageRoute signPatientManageRoute = signPatientManageRouteMapper.selectSignPatientManageRouteById(node.getManageRouteId()); - SignPatientRecord signPatientRecord = signPatientRecordMapper.selectByPrimaryKey(signPatientManageRoute.getSignPatientRecordId()); - PatientVisitRecord patientVisitRecord = patientVisitRecordMapper.selectPatientVisitRecordById(signPatientRecord.getPatientVisitRecordId()); - executeTime = signPatientManageRouteNodeService.getExecuteTime(node.getExecuteTime(), node.getRouteNodeName(), node.getRouteNodeDay(), patientVisitRecord); - } - if (node.getScriptInfoId() != null && (executeTime.toLocalDate().isBefore(LocalDate.now()) || executeTime.toLocalDate().isEqual(LocalDate.now()))) { - executeNodeList.add(node); - } - }); + }); + // 上传名单 + log.info("任务导入客户名单......"); + ImportTaskDto importTaskDto = new ImportTaskDto(); + importTaskDto.setTaskId(taskId); + importTaskDto.setSecretType(2); + importTaskDto.setCustomerInfoList(customerInfoList); + List importTaskList = aiobService.importTask(importTaskDto); + String finalTaskId = taskId; + importTaskList.forEach(importTaskVo -> { + SignPatientManageRouteNode signPatientManageRouteNode = new SignPatientManageRouteNode(); + // 名单导入成功后,sign_patient_manage_route_node表中设置taskId + if (importTaskVo.getStatus()) { + signPatientManageRouteNode.setTaskIdExt(finalTaskId); + signPatientManageRouteNode.setId(Long.valueOf(importTaskVo.getExtJson())); - // 查询需要重拨的任务 - ScriptInfoTaskInfo scriptInfoTaskInfo = new ScriptInfoTaskInfo(); - scriptInfoTaskInfo.setExecuteStatus(NodeExecuteStatusEnum.UNEXECUTED.getInfo()); - scriptInfoTaskInfo.setAiobTaskType(AiobTaskTypeContant.ACTUALTIMETASK); - List scriptInfoTaskInfoList = scriptInfoTaskInfoMapper.selectList(scriptInfoTaskInfo); - scriptInfoTaskInfoList.forEach(taskInfo -> { - SignPatientManageRouteNode node = signPatientManageRouteNodeMapper.selectSignPatientManageRouteNodeById(taskInfo.getSignPatientManageRouteNodeId()); - if (taskInfo.getExecuteTime().isBefore(LocalDateTime.now()) || taskInfo.getExecuteTime().isEqual(LocalDateTime.now())) { - executeNodeList.add(node); - } - }); - if (CollectionUtils.isNotEmpty(executeNodeList)) { - // 根据机器人id查询智能外呼系统的任务id - executeNodeList.forEach(node -> { - createTask(node); - }); - } - log.info("百度智能外呼创建实时任务定时任务执行完成......"); - } + signPatientManageRouteNodeMapper.updateSignPatientManageRouteNode(signPatientManageRouteNode); + } + }); + } + } - private void createTask(SignPatientManageRouteNode node) { - ScriptInfo scriptInfo = scriptInfoMapper.selectScriptInfoById(node.getScriptInfoId()); - SignPatientManageRoute signPatientManageRoute = signPatientManageRouteMapper.selectSignPatientManageRouteById(node.getManageRouteId()); - PatientInfo patientInfo = patientInfoMapper.selectPatientInfoById(signPatientManageRoute.getPatientId()); - // 没有任务则创建任务 - if (ObjectUtils.isNotEmpty(scriptInfo)) { - log.info("创建任务......"); - ActualTimeTaskDto actualTimeTaskDto = new ActualTimeTaskDto(); - actualTimeTaskDto.setRobotId(scriptInfo.getRobotPublishId()); - actualTimeTaskDto.setMobile(patientInfo.getPatientPhone()); - actualTimeTaskDto.setSecretType(2); - actualTimeTaskDto.setStopDate(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " 20:00:00"); - // 查询患者画像信息 - 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()); - }); - } - actualTimeTaskDto.setDialogVar(jsonObject); - actualTimeTaskDto.setCallBackUrl(callBackUrl); - actualTimeTaskDto.setExtJson(node.getId()+ ""); - aiobService.createActualTimeTask(actualTimeTaskDto); - log.info("创建任务完成......"); - } - } + }); + + + }); + // 根据机器人id查询智能外呼系统的任务id + log.info("百度智能外呼创建任务定时任务执行完成......"); + } + + /** + * @return null + * @description 创建实时任务 + * @Author haown + * @Date 2024-9-23 10:41 + */ + public void actualTimeTask() { + log.info("开始执行百度智能外呼创建实时任务定时任务......"); + // 查找需要当天执行的AI打电话任务(问卷或电话外呼类型) + SignPatientManageRouteNodeDto signPatientManageRouteNodeDto = new SignPatientManageRouteNodeDto(); + signPatientManageRouteNodeDto.setNodeExecuteStatus(NodeExecuteStatusEnum.UNEXECUTED.getInfo()); + signPatientManageRouteNodeDto.setPhoneDialMethod(PhoneDialMethodEnum.AI.getInfo()); + //只获取 任务执行类型为 单个执行的 + signPatientManageRouteNodeDto.setTaskExcuteType(TaskExcuteTypeEnum.ACTUAL_TIME_TASK.getInfo()); + //查询未拨打的 + signPatientManageRouteNodeDto.setDialStaus(DialStatusEnum.NODIALED.getInfo()); + + List nodeList = signPatientManageRouteNodeMapper.selectSignPatientManageRouteNodeList(signPatientManageRouteNodeDto); + List executeNodeList = new ArrayList<>(); + nodeList.forEach(node -> { + LocalDateTime executeTime; + //如果有计划执行时间,则直接获取 + if (node.getNodePlanTime() != null) { + executeTime = node.getNodePlanTime(); + } + // 否则 ,则根据诊后/院后 第几天 计算 + else { + SignPatientManageRoute signPatientManageRoute = signPatientManageRouteMapper.selectSignPatientManageRouteById(node.getManageRouteId()); + SignPatientRecord signPatientRecord = signPatientRecordMapper.selectByPrimaryKey(signPatientManageRoute.getSignPatientRecordId()); + PatientVisitRecord patientVisitRecord = patientVisitRecordMapper.selectPatientVisitRecordById(signPatientRecord.getPatientVisitRecordId()); + executeTime = signPatientManageRouteNodeService.getExecuteTime(node.getExecuteTime(), node.getRouteNodeName(), node.getRouteNodeDay(), patientVisitRecord); + } + if (node.getScriptInfoId() != null && (executeTime.toLocalDate().isBefore(LocalDate.now()) || executeTime.toLocalDate().isEqual(LocalDate.now()))) { + executeNodeList.add(node); + } + }); + + // 查询需要重拨的任务 + ScriptInfoTaskInfo scriptInfoTaskInfo = new ScriptInfoTaskInfo(); + scriptInfoTaskInfo.setExecuteStatus(NodeExecuteStatusEnum.UNEXECUTED.getInfo()); + scriptInfoTaskInfo.setAiobTaskType(AiobTaskTypeContant.ACTUALTIMETASK); + List scriptInfoTaskInfoList = scriptInfoTaskInfoMapper.selectList(scriptInfoTaskInfo); + scriptInfoTaskInfoList.forEach(taskInfo -> { + SignPatientManageRouteNode node = signPatientManageRouteNodeMapper.selectSignPatientManageRouteNodeById(taskInfo.getSignPatientManageRouteNodeId()); + if (taskInfo.getExecuteTime().isBefore(LocalDateTime.now()) || taskInfo.getExecuteTime().isEqual(LocalDateTime.now())) { + executeNodeList.add(node); + } + }); + if (CollectionUtils.isNotEmpty(executeNodeList)) { + // 根据机器人id查询智能外呼系统的任务id + executeNodeList.forEach(node -> { + createTask(node); + }); + } + log.info("百度智能外呼创建实时任务定时任务执行完成......"); + } + + private void createTask(SignPatientManageRouteNode node) { + ScriptInfo scriptInfo = scriptInfoMapper.selectScriptInfoById(node.getScriptInfoId()); + SignPatientManageRoute signPatientManageRoute = signPatientManageRouteMapper.selectSignPatientManageRouteById(node.getManageRouteId()); + PatientInfo patientInfo = patientInfoMapper.selectPatientInfoById(signPatientManageRoute.getPatientId()); + // 没有任务则创建任务 + if (ObjectUtils.isNotEmpty(scriptInfo)) { + log.info("创建任务......"); + ActualTimeTaskDto actualTimeTaskDto = new ActualTimeTaskDto(); + actualTimeTaskDto.setRobotId(scriptInfo.getRobotPublishId()); + actualTimeTaskDto.setMobile(patientInfo.getPatientPhone()); + actualTimeTaskDto.setSecretType(2); + actualTimeTaskDto.setStopDate(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " 20:00:00"); + // 查询患者画像信息 + 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()); + }); + } + actualTimeTaskDto.setDialogVar(jsonObject); + actualTimeTaskDto.setCallBackUrl(callBackUrl); + actualTimeTaskDto.setExtJson(node.getId() + ""); + aiobService.createActualTimeTask(actualTimeTaskDto); + log.info("创建任务完成......"); + } + } }