diff --git a/postdischarge-admin/src/main/resources/application.yml b/postdischarge-admin/src/main/resources/application.yml index 5406b468..f58c7cbd 100644 --- a/postdischarge-admin/src/main/resources/application.yml +++ b/postdischarge-admin/src/main/resources/application.yml @@ -288,4 +288,6 @@ aiob: url: https://aiob-open.baidu.com/api accessKey: b6d2d73cdf2d4d7ca2ccc84968accdb3 secretKey: 9262d2fe32544eaabce18331bd5ca2c5 + # 任务执行回调地址--测试 + callBackUrl: http://8.131.93.145:54011/api/taskCallBack diff --git a/postdischarge-common/pom.xml b/postdischarge-common/pom.xml index 73f446fc..0245b359 100644 --- a/postdischarge-common/pom.xml +++ b/postdischarge-common/pom.xml @@ -52,6 +52,11 @@ jackson-databind + + com.alibaba + fastjson + 1.2.83 + com.alibaba.fastjson2 fastjson2 diff --git a/postdischarge-manage/src/main/java/com/xinelu/manage/controller/aibo/AIOBController.java b/postdischarge-manage/src/main/java/com/xinelu/manage/controller/aibo/AIOBController.java index d23841b0..4676debf 100644 --- a/postdischarge-manage/src/main/java/com/xinelu/manage/controller/aibo/AIOBController.java +++ b/postdischarge-manage/src/main/java/com/xinelu/manage/controller/aibo/AIOBController.java @@ -1,5 +1,7 @@ package com.xinelu.manage.controller.aibo; +import com.alibaba.fastjson2.JSONObject; +import com.aliyuncs.exceptions.ClientException; import com.xinelu.common.core.controller.BaseController; import com.xinelu.common.core.domain.R; import com.xinelu.manage.dto.aibo.CreateTaskDto; @@ -74,7 +76,7 @@ public class AIOBController extends BaseController { */ @ApiOperation("任务单通电话回调") @PostMapping("/taskCallBack") - public R taskCallBack(@RequestBody TaskCallbackDto taskCallbackDto) { - return R.ok(aiobService.taskCallBack(taskCallbackDto.getCallbackType(), taskCallbackDto.getData())); + public JSONObject taskCallBack(@RequestBody TaskCallbackDto taskCallbackDto) throws ClientException { + return aiobService.taskCallBack(taskCallbackDto.getCallbackType(), taskCallbackDto.getData()); } } diff --git a/postdischarge-manage/src/main/java/com/xinelu/manage/domain/signpatientmanageroutenode/SignPatientManageRouteNode.java b/postdischarge-manage/src/main/java/com/xinelu/manage/domain/signpatientmanageroutenode/SignPatientManageRouteNode.java index e9640dfc..10ce9270 100644 --- a/postdischarge-manage/src/main/java/com/xinelu/manage/domain/signpatientmanageroutenode/SignPatientManageRouteNode.java +++ b/postdischarge-manage/src/main/java/com/xinelu/manage/domain/signpatientmanageroutenode/SignPatientManageRouteNode.java @@ -106,6 +106,12 @@ public class SignPatientManageRouteNode extends BaseEntity { @Excel(name = "电话内容", readConverterExp = "富文本存放整个节点的信息,包含标签画像的名称以及其它,标签画像名称使用特殊符号进行标记") private String phoneNodeContent; + /** + * 爱医声平台任务查询返回JSON + */ + @ApiModelProperty(value = "爱医声平台任务查询返回JSON") + private String phoneResultJson; + /** 电话重拨次数,重拨一次:REDIAL_ONCE,重拨二次:REDIAL_TWICE,不重播:NOT_REPLAY */ @ApiModelProperty(value = "电话重拨次数,重拨一次:REDIAL_ONCE,重拨二次:REDIAL_TWICE,不重播:NOT_REPLAY") @Excel(name = "电话重拨次数,重拨一次:REDIAL_ONCE,重拨二次:REDIAL_TWICE,不重播:NOT_REPLAY") @@ -394,4 +400,7 @@ public class SignPatientManageRouteNode extends BaseEntity { @ApiModelProperty(value = "患者宣教阅读或问卷提交的时间") @Excel(name = "患者宣教阅读或问卷提交的时间") private LocalDateTime nodeFinishDate; + + @ApiModelProperty(value = "第三方返回的任务ID") + private String taskIdExt; } diff --git a/postdischarge-manage/src/main/java/com/xinelu/manage/dto/aibo/CreateTaskDto.java b/postdischarge-manage/src/main/java/com/xinelu/manage/dto/aibo/CreateTaskDto.java index 619bdf95..00ad9a62 100644 --- a/postdischarge-manage/src/main/java/com/xinelu/manage/dto/aibo/CreateTaskDto.java +++ b/postdischarge-manage/src/main/java/com/xinelu/manage/dto/aibo/CreateTaskDto.java @@ -59,6 +59,12 @@ public class CreateTaskDto { */ private List numTypeFilterList; + private Boolean taskDataCallback; + /** + * 任务级回调地址设置 + */ + private String callBackUrl; + /** * 任务拨号完成后是否进入完成状态, 0:拨号完成后任务不结束 1:拨号完成后任务结束 默认值为1 */ 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 9ee9e6da..377a9eca 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 @@ -20,4 +20,6 @@ public interface ScriptInfoTaskInfoMapper { */ int insertScriptInfoTaskInfo(ScriptInfoTaskInfo scriptInfoTaskInfo); + int deleteScriptInfoTaskInfo(); + } diff --git a/postdischarge-manage/src/main/java/com/xinelu/manage/service/aibo/IAIOBService.java b/postdischarge-manage/src/main/java/com/xinelu/manage/service/aibo/IAIOBService.java index c88f25bc..e1ca4789 100644 --- a/postdischarge-manage/src/main/java/com/xinelu/manage/service/aibo/IAIOBService.java +++ b/postdischarge-manage/src/main/java/com/xinelu/manage/service/aibo/IAIOBService.java @@ -1,5 +1,7 @@ package com.xinelu.manage.service.aibo; +import com.alibaba.fastjson2.JSONObject; +import com.aliyuncs.exceptions.ClientException; import com.xinelu.manage.dto.aibo.CreateTaskDto; import com.xinelu.manage.dto.aibo.ImportTaskDto; import com.xinelu.manage.dto.aibo.TaskCallbackDataDto; @@ -50,5 +52,13 @@ public interface IAIOBService { */ List importTask(ImportTaskDto importTaskDto); - String taskCallBack(Integer callbackType, TaskCallbackDataDto data); + /** + * @description 任务单执行回调方法 + * @param callbackType 回调数据类型, 0-任务呼叫单通电话回调 1-号码组终态回调 2-任务状态变更回调 3-实时呼叫单通电话回调 + * @param data 任务单通电话回调传输data + * @return null + * @Author haown + * @Date 2024-9-2 14:20 + */ + JSONObject taskCallBack(Integer callbackType, TaskCallbackDataDto data) throws ClientException; } diff --git a/postdischarge-manage/src/main/java/com/xinelu/manage/service/aibo/impl/AIOBServiceImpl.java b/postdischarge-manage/src/main/java/com/xinelu/manage/service/aibo/impl/AIOBServiceImpl.java index 131cde9b..8adcab16 100644 --- a/postdischarge-manage/src/main/java/com/xinelu/manage/service/aibo/impl/AIOBServiceImpl.java +++ b/postdischarge-manage/src/main/java/com/xinelu/manage/service/aibo/impl/AIOBServiceImpl.java @@ -1,20 +1,60 @@ package com.xinelu.manage.service.aibo.impl; +import com.alibaba.fastjson.serializer.SerializerFeature; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; +import com.aliyuncs.exceptions.ClientException; +import com.xinelu.common.config.AliYunSmsTwoConfig; +import com.xinelu.common.constant.PhoneMessageRemindConstants; +import com.xinelu.common.constant.TaskCreateTypeConstant; +import com.xinelu.common.constant.TaskStatisticsTypeConstants; import com.xinelu.common.core.redis.RedisCache; +import com.xinelu.common.enums.ErrorStatusEnum; +import com.xinelu.common.enums.NodeExecuteResultStatusEnum; +import com.xinelu.common.enums.NodeExecuteStatusEnum; +import com.xinelu.common.enums.PhoneRedialTimesEnum; import com.xinelu.common.exception.ServiceException; import com.xinelu.common.utils.StringUtils; +import com.xinelu.manage.domain.patientinfo.PatientInfo; +import com.xinelu.manage.domain.patienttaskexecuterecord.PatientTaskExecuteRecord; +import com.xinelu.manage.domain.phonedialrecord.PhoneDialRecord; +import com.xinelu.manage.domain.scriptInfo.ScriptInfo; +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.domain.textmessage.TextMessage; 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.aibo.TaskCallbackDataDto; +import com.xinelu.manage.dto.patientquestionsubmitresult.PatientQuestionSubmitResultDTO; +import com.xinelu.manage.dto.smssend.SmsInfoDTO; +import com.xinelu.manage.mapper.labelfieldcontent.LabelFieldContentMapper; +import com.xinelu.manage.mapper.patientinfo.PatientInfoMapper; +import com.xinelu.manage.mapper.patienttaskexecuterecord.PatientTaskExecuteRecordMapper; +import com.xinelu.manage.mapper.phonedialrecord.PhoneDialRecordMapper; +import com.xinelu.manage.mapper.scriptInfo.ScriptInfoMapper; +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.mapper.textmessage.TextMessageMapper; import com.xinelu.manage.service.aibo.IAIOBService; +import com.xinelu.manage.service.patienttaskstatistics.IPatientTaskStatisticsService; +import com.xinelu.manage.service.signpatientmanageroute.ISignPatientManageRouteService; import com.xinelu.manage.vo.aibo.ImportTaskVo; +import com.xinelu.manage.vo.labelfieldcontent.LabelFieldInfoContentVo; +import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Objects; import java.util.concurrent.TimeUnit; import javax.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; @@ -29,6 +69,7 @@ import org.springframework.web.client.RestTemplate; * @author: haown * @create: 2024-08-22 09:54 **/ +@Slf4j @Service public class AIOBServiceImpl implements IAIOBService { @Value("${aiob.url}") @@ -43,6 +84,31 @@ public class AIOBServiceImpl implements IAIOBService { @Resource private RedisCache redisCache; + @Resource + private SignPatientRecordMapper signPatientRecordMapper; + @Resource + private SignPatientManageRouteMapper signPatientManageRouteMapper; + @Resource + private SignPatientManageRouteNodeMapper signPatientManageRouteNodeMapper; + @Resource + private PhoneDialRecordMapper phoneDialRecordMapper; + @Resource + private AliYunSmsTwoConfig aliYunSmsTwoConfig; + @Resource + private ISignPatientManageRouteService signPatientManageRouteService; + @Resource + private TextMessageMapper textMessageMapper; + @Resource + private PatientTaskExecuteRecordMapper patientTaskExecuteRecordMapper; + @Resource + private IPatientTaskStatisticsService patientTaskStatisticsService; + @Resource + private PatientInfoMapper patientInfoMapper; + @Resource + private LabelFieldContentMapper labelFieldContentMapper; + @Resource + private ScriptInfoMapper scriptInfoMapper; + /** * @description 获取外呼平台accessToken * @return 智能外呼平台 accessToken @@ -71,7 +137,7 @@ public class AIOBServiceImpl implements IAIOBService { // accessToken放入redis缓存 accessToken = data.getString("accessToken"); // 有效期30天 - int expires_in = object.getInteger("expires_in"); + int expires_in = data.getInteger("expiresTime"); redisCache.setCacheObject("AIOBAssessToken", accessToken, expires_in, TimeUnit.MINUTES); } return accessToken; @@ -141,7 +207,7 @@ public class AIOBServiceImpl implements IAIOBService { .fluentPut("taskStatus", taskStatus); HttpEntity requestEntity = new HttpEntity<>(jsonObject, headers); RestTemplate restTemplate = new RestTemplate(); - ResponseEntity responseEntity = restTemplate.exchange(url + "/v3/console/realtime/status/create", HttpMethod.POST, requestEntity, String.class); + ResponseEntity responseEntity = restTemplate.exchange(url + "/v3/console/apitask/task/status/update", HttpMethod.POST, requestEntity, String.class); JSONObject object = JSON.parseObject(responseEntity.getBody()); if (object == null || object.getInteger("code") == null || object.getInteger("code") != 200) { throw new ServiceException("修改任务状态失败," + object.getString("msg")); @@ -179,7 +245,7 @@ public class AIOBServiceImpl implements IAIOBService { } JSONObject data = object.getJSONObject("data"); - JSONArray resList = data.getJSONArray("retList"); + JSONArray resList = data.getJSONArray("resList"); List importTaskList = Arrays.asList(resList.toArray(ImportTaskVo.class)); return importTaskList; // { @@ -206,8 +272,17 @@ public class AIOBServiceImpl implements IAIOBService { // } } + /** + * @description 任务单执行回调方法 + * @param callbackType 回调数据类型, 0-任务呼叫单通电话回调 1-号码组终态回调 2-任务状态变更回调 3-实时呼叫单通电话回调 + * @param data 任务单通电话回调传输data + * @return null + * @Author haown + * @Date 2024-9-2 14:20 + */ @Override - public String taskCallBack(Integer callbackType, TaskCallbackDataDto data) { + public JSONObject taskCallBack(Integer callbackType, TaskCallbackDataDto data) throws ClientException { + //{"extJson":"623","taskId":"3892402966495232","tenantId":3849515568332800} //TaskCallbackDataDto(sessionId=3874887150206976_2e1ae4e5ee0a4513b61d2411523f7b9b, tenantId=3849515568332800, // taskId=3874887150206976, taskName=测试20240829, robotId=11a05202-12a4-437a-b989-43235b920a2f, // robotName=慢病用药回访, memberId=3875110220070912, mobile=15166940975, callTimes=1, @@ -222,6 +297,155 @@ public class AIOBServiceImpl implements IAIOBService { // {"role":"speech","timestamp":1724917725993,"content":"是的","contextText":"祝您早日康复。","sn":"0e5c9c4e65db11ef_6_1","intent":"sys_yes","start":"00:27.505","stop":"00:29.637","timeLen":2132,"interrupted":false,"silent":false,"nodeInfo":"eyJwcm9jZXNzTmFtZSI6IuaFoueXheeUqOiNr+Wbnuiuv+ivneacryIsIm5vZGVOYW1lIjoi5oyJ5pe25pyN6I2v6IqC54K5X3Bxd2RkcDBpIiwiaW50ZW50Ijoi6IKv5a6a5oSP5Zu+IiwiZW50aXR5IjpbXSwic3lzdGVtRXZlbnQiOiIiLCJmYXEiOiIifQ=="}], // durationTimeLen=42, ringingTimeLen=9, talkingTimeLen=29, startTime=1724917686000, ringStartTime=1724917688000, talkingStartTime=1724917698000, endTime=1724917728000, intent=null, action=[HANGUP], isRobotHangup=true, // dialogVar={"departmentName":"山东省立医院","patientName":"李四"}, smsVar=null, extJson=测试2, transResult=0) - return data.getTaskId(); + + JSONObject retObj = new JSONObject(); + retObj.fluentPut("code", 200).fluentPut("msg", "success"); + if (callbackType == 0) { + // 是否发送短信标识 + boolean needSendSms = false; + // 根据id查询任务 + SignPatientManageRouteNode signPatientManageRouteNode = signPatientManageRouteNodeMapper.selectSignPatientManageRouteNodeById(Long.valueOf(data.getExtJson())); + if (ObjectUtils.isNotEmpty(signPatientManageRouteNode)) { + // 标记任务执行状态 + signPatientManageRouteNode.setNodeExecuteStatus(NodeExecuteStatusEnum.EXECUTED.getInfo()); + // 获取电话已拨打次数 + PhoneDialRecord phoneDialRecordQuery = new PhoneDialRecord(); + phoneDialRecordQuery.setManageRouteNodeId(signPatientManageRouteNode.getId()); + List phoneDialRecordList = phoneDialRecordMapper.selectPhoneDialRecordList(phoneDialRecordQuery); + // 电话拨打未成功,判断是否需要重拨;电话拨打成功,设置电话拨通情况为成功 + if (data.getEndType() != null && data.getEndType() == 0) {//接通状态,1-已接通 0-未接通 + // 已经拨打的次数 + int dialCount = CollectionUtils.isEmpty(phoneDialRecordList) ? 0 : phoneDialRecordList.size() + 1; + if (PhoneRedialTimesEnum.getValueByInfo(signPatientManageRouteNode.getPhoneRedialTimes()).getValue() + 1 > dialCount) { + // 需要重拨-导入名单 + uploadCustomerInfoList(signPatientManageRouteNode, data.getTaskId()); + } else { + // 不需要重拨,设置电话拨通情况 + signPatientManageRouteNode.setPhoneNodeExecuteResultStatus(NodeExecuteResultStatusEnum.FAILURE.getInfo()); + } + //电话短信提醒 + if (StringUtils.equals(PhoneMessageRemindConstants.NOT_CONNECTED_SEND_MESSAGE, signPatientManageRouteNode.getPhoneMessageRemind())) { + // 发送短信 + needSendSms = true; + } + } else { + signPatientManageRouteNode.setPhoneNodeExecuteResultStatus(NodeExecuteResultStatusEnum.SUCCESS.getInfo()); + if (StringUtils.equals(PhoneMessageRemindConstants.CONNECTED_SEND_MESSAGE, signPatientManageRouteNode.getPhoneMessageRemind())) { + // 发送短信 + needSendSms = true; + } + // 记录通话详情 + signPatientManageRouteNode.setPhoneResultJson(com.alibaba.fastjson.JSON.toJSONString(data, SerializerFeature.WriteMapNullValue)); + } + + signPatientManageRouteNodeMapper.updateSignPatientManageRouteNode(signPatientManageRouteNode); + + PatientTaskExecuteRecord patientTaskExecuteRecord = new PatientTaskExecuteRecord(); + BeanUtils.copyProperties(signPatientManageRouteNode, patientTaskExecuteRecord); + + SignPatientManageRoute signPatientManageRoute = signPatientManageRouteMapper.selectSignPatientManageRouteById(signPatientManageRouteNode.getManageRouteId()); + if (ObjectUtils.isNotEmpty(signPatientManageRoute)) { + patientTaskExecuteRecord.setPatientId(signPatientManageRoute.getPatientId()); + patientTaskExecuteRecord.setPatientName(signPatientManageRoute.getPatientName()); + // 就诊记录 + SignPatientRecord signPatientRecord = signPatientRecordMapper.selectByPrimaryKey(signPatientManageRoute.getSignPatientRecordId()); + if (ObjectUtils.isNotEmpty(signPatientRecord)) { + patientTaskExecuteRecord.setVisitRecordId(signPatientRecord.getPatientVisitRecordId()); + } + + // 发送短信 + if (needSendSms) { + sendSms(signPatientManageRoute.getPatientId(), signPatientManageRouteNode); + } + } + // 增加任务执行记录 + patientTaskExecuteRecord.setManageRouteNodeId(signPatientManageRouteNode.getId()); + patientTaskExecuteRecord.setManageRouteNodeName(signPatientManageRouteNode.getRouteNodeName()); + patientTaskExecuteRecord.setExecuteResult(data.getEndTypeReason()); + patientTaskExecuteRecord.setExecuteType(TaskCreateTypeConstant.MANUAL_MATCHE); + patientTaskExecuteRecord.setExecuteTime(LocalDateTime.now()); + patientTaskExecuteRecord.setCreateTime(LocalDateTime.now()); + + // 增加电话拨打记录 + PhoneDialRecord phoneDialRecord = new PhoneDialRecord(); + phoneDialRecord.setPatientId(signPatientManageRoute.getPatientId()); + phoneDialRecord.setManageRouteNodeId(signPatientManageRouteNode.getId()); + phoneDialRecord.setPatientPhone(data.getMobile()); + phoneDialRecord.setDialTime(LocalDateTime.now()); + phoneDialRecord.setPhoneTemplateId(signPatientManageRouteNode.getScriptInfoId() + ""); + phoneDialRecord.setPhoneDialMethod(signPatientManageRouteNode.getPhoneDialMethod()); + phoneDialRecord.setErrorCode(data.getEndType() == 0 ? 1L : 0); + phoneDialRecord.setErrorStatus(data.getEndType() == 0 ? ErrorStatusEnum.fail.getValue() : ErrorStatusEnum.success.getValue()); + phoneDialRecord.setCreateTime(LocalDateTime.now()); + phoneDialRecordMapper.insertPhoneDialRecord(phoneDialRecord); + + // 修改任务统计表数据 + if (patientTaskExecuteRecordMapper.insertPatientTaskExecuteRecord(patientTaskExecuteRecord) > 0) { + // 任务统计表修改 + patientTaskStatisticsService.updateNum(signPatientManageRoute.getPatientId(), TaskStatisticsTypeConstants.TASK_EXECUTE_NUM, 1); + } + } + } + return retObj; } + + private void sendSms(Long patientId, SignPatientManageRouteNode signPatientManageRouteNode) throws ClientException { + TextMessage textMessage = textMessageMapper.selectTextMessageById(signPatientManageRouteNode.getPhoneMessageTemplateId()); + if (ObjectUtils.isNotEmpty(textMessage)) { + // 发送短信 + SmsInfoDTO smsInfoDTO = new SmsInfoDTO(); + String patientPhone = signPatientManageRouteMapper.selectPatientPhone(patientId); + smsInfoDTO.setPhoneNumbers(patientPhone); + smsInfoDTO.setSignName(aliYunSmsTwoConfig.getSignName()); + smsInfoDTO.setTemplateCode(textMessage.getTextMessageId()); + Boolean b = signPatientManageRouteService.sendSms(smsInfoDTO); + //发送记录 + PatientQuestionSubmitResultDTO dto = new PatientQuestionSubmitResultDTO(); + dto.setPatientId(patientId); + dto.setPatientPhone(patientPhone); + dto.setManageRouteNodeId(signPatientManageRouteNode.getId()); + dto.setPhoneMessageTemplateCode(textMessage.getTextMessageId()); + dto.setPhoneMessageTemplateContent(signPatientManageRouteNode.getPhoneMessageTemplateContent()); + signPatientManageRouteService.shortMessageSendRecordExtracted(dto, LocalDateTime.now(), b, "AI"); + + if (!b) { + log.info("短信发送失败"); + } else { + log.info("短信发送成功"); + } + } else { + log.info("短信发送成功"); + } + } + + private void uploadCustomerInfoList(SignPatientManageRouteNode node, String taskId) { + CustomerInfoDto customerInfoDto = new CustomerInfoDto(); + List customerInfoList = new ArrayList<>(); + 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()); + ScriptInfo scriptInfo = scriptInfoMapper.selectScriptInfoById(node.getScriptInfoId()); + // 处理变量 + 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); + importTask(importTaskDto); + } + } diff --git a/postdischarge-manage/src/main/java/com/xinelu/manage/service/signpatientmanageroute/ISignPatientManageRouteService.java b/postdischarge-manage/src/main/java/com/xinelu/manage/service/signpatientmanageroute/ISignPatientManageRouteService.java index 091d0a68..ba2ae9bb 100644 --- a/postdischarge-manage/src/main/java/com/xinelu/manage/service/signpatientmanageroute/ISignPatientManageRouteService.java +++ b/postdischarge-manage/src/main/java/com/xinelu/manage/service/signpatientmanageroute/ISignPatientManageRouteService.java @@ -121,5 +121,5 @@ public interface ISignPatientManageRouteService { Boolean sendSms(SmsInfoDTO smsInfoDTO) throws ClientException, ServiceException; - void shortMessageSendRecordExtracted(PatientQuestionSubmitResultDTO dto, LocalDateTime time, Boolean b); + void shortMessageSendRecordExtracted(PatientQuestionSubmitResultDTO dto, LocalDateTime time, Boolean b, String createBy); } 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 2d7036a3..9e871bce 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 @@ -426,7 +426,7 @@ public class SignPatientManageRouteServiceImpl implements ISignPatientManageRout smsInfoDTO.setTemplateCode(dto.getPhoneMessageTemplateCode()); Boolean b = sendSms(smsInfoDTO); //发送记录 - shortMessageSendRecordExtracted(dto, time, b); + shortMessageSendRecordExtracted(dto, time, b, null); if (!b) { log.info("短信发送失败"); } else { @@ -496,7 +496,7 @@ public class SignPatientManageRouteServiceImpl implements ISignPatientManageRout * @param b 状态 */ @Override - public void shortMessageSendRecordExtracted(PatientQuestionSubmitResultDTO dto, LocalDateTime time, Boolean b) { + public void shortMessageSendRecordExtracted(PatientQuestionSubmitResultDTO dto, LocalDateTime time, Boolean b, String createBy) { ShortMessageSendRecord shortMessageSendRecord = new ShortMessageSendRecord(); shortMessageSendRecord.setPatientId(dto.getPatientId()); shortMessageSendRecord.setPatientPhone(dto.getPatientPhone()); @@ -512,7 +512,7 @@ public class SignPatientManageRouteServiceImpl implements ISignPatientManageRout shortMessageSendRecord.setErrorCode(0L); shortMessageSendRecord.setErrorStatus(ErrorStatusEnum.success.getValue()); } - shortMessageSendRecord.setCreateBy(SecurityUtils.getUsername()); + shortMessageSendRecord.setCreateBy(StringUtils.isBlank(createBy) ? SecurityUtils.getUsername() : createBy); shortMessageSendRecord.setCreateTime(time); shortMessageSendRecordMapper.insertShortMessageSendRecord(shortMessageSendRecord); } diff --git a/postdischarge-manage/src/main/java/com/xinelu/manage/service/signpatientmanageroutenode/impl/RobotPublishServiceImpl.java b/postdischarge-manage/src/main/java/com/xinelu/manage/service/signpatientmanageroutenode/impl/RobotPublishServiceImpl.java index a185fe3c..3cc80dc0 100644 --- a/postdischarge-manage/src/main/java/com/xinelu/manage/service/signpatientmanageroutenode/impl/RobotPublishServiceImpl.java +++ b/postdischarge-manage/src/main/java/com/xinelu/manage/service/signpatientmanageroutenode/impl/RobotPublishServiceImpl.java @@ -224,7 +224,7 @@ public class RobotPublishServiceImpl implements IRobotPublishService { dto.setManageRouteNodeId(signPatientManageRouteNode.getId()); dto.setPhoneMessageTemplateCode(textMessage.getTextMessageId()); dto.setPhoneMessageTemplateContent(signPatientManageRouteNode.getPhoneMessageTemplateContent()); - signPatientManageRouteService.shortMessageSendRecordExtracted(dto, LocalDateTime.now(), b); + signPatientManageRouteService.shortMessageSendRecordExtracted(dto, LocalDateTime.now(), b, "AI"); if (!b) { log.info("短信发送失败"); diff --git a/postdischarge-manage/src/main/resources/mapper/manage/scriptinfotaskinfo/ScriptInfoTaskInfoMapper.xml b/postdischarge-manage/src/main/resources/mapper/manage/scriptinfotaskinfo/ScriptInfoTaskInfoMapper.xml index ebbab86a..8399e5ce 100644 --- a/postdischarge-manage/src/main/resources/mapper/manage/scriptinfotaskinfo/ScriptInfoTaskInfoMapper.xml +++ b/postdischarge-manage/src/main/resources/mapper/manage/scriptinfotaskinfo/ScriptInfoTaskInfoMapper.xml @@ -51,4 +51,9 @@ + + + delete + from script_info_task_info + \ No newline at end of file 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 1d79c1fd..c1b95932 100644 --- a/postdischarge-manage/src/main/resources/mapper/manage/signpatientmanageroutenode/SignPatientManageRouteNodeMapper.xml +++ b/postdischarge-manage/src/main/resources/mapper/manage/signpatientmanageroutenode/SignPatientManageRouteNodeMapper.xml @@ -22,6 +22,7 @@ + @@ -80,10 +81,11 @@ + - select id, manage_route_id, manage_route_name, route_node_id, route_node_name, route_node_day, task_type, task_status, task_subdivision, task_node_type, second_classify_describe, execute_time, phone_push_sign, script_info_id, phone_template_id, phone_template_name, phone_node_content, phone_redial_times, phone_time_interval, phone_message_remind, phone_message_template_id, phone_message_template_name,phone_message_template_content,question_info_id, questionnaire_name, questionnaire_content, question_expiration_date, propaganda_info_id, propaganda_title, propaganda_content, message_push_sign, message_template_id, message_template_code, message_template_name, message_preview, message_node_content, official_push_sign, official_template_id, official_template_code, official_template_name, official_remind_content, official_node_content, follow_template_id, follow_template_name, applet_push_sign, applet_template_id, applet_template_code, applet_template_name, applet_remind_content, applet_prompt_description, applet_node_content, route_check_status, route_check_person, route_check_date, route_check_remark, route_node_remark, node_execute_status, route_handle_remark, route_handle_id, route_handle_person, route_link,text_remind_content, node_content,message_status, del_flag, create_by, create_time, update_by, update_time, phone_dial_method, phone_node_execute_result_status, message_node_execute_result_status, official_node_execute_result_status, applet_node_execute_result_status, node_finish_date from sign_patient_manage_route_node + select id, manage_route_id, manage_route_name, route_node_id, route_node_name, route_node_day, task_type, task_status, task_subdivision, task_node_type, second_classify_describe, execute_time, phone_push_sign, script_info_id, phone_template_id, phone_template_name, phone_node_content,phone_result_json, phone_redial_times, phone_time_interval, phone_message_remind, phone_message_template_id, phone_message_template_name,phone_message_template_content,question_info_id, questionnaire_name, questionnaire_content, question_expiration_date, propaganda_info_id, propaganda_title, propaganda_content, message_push_sign, message_template_id, message_template_code, message_template_name, message_preview, message_node_content, official_push_sign, official_template_id, official_template_code, official_template_name, official_remind_content, official_node_content, follow_template_id, follow_template_name, applet_push_sign, applet_template_id, applet_template_code, applet_template_name, applet_remind_content, applet_prompt_description, applet_node_content, route_check_status, route_check_person, route_check_date, route_check_remark, route_node_remark, node_execute_status, route_handle_remark, route_handle_id, route_handle_person, route_link,text_remind_content, node_content,message_status, del_flag, create_by, create_time, update_by, update_time, phone_dial_method, phone_node_execute_result_status, message_node_execute_result_status, official_node_execute_result_status, applet_node_execute_result_status, node_finish_date, task_id_ext from sign_patient_manage_route_node