diff --git a/postdischarge-manage/src/main/java/com/xinelu/manage/dto/phonedialrecord/PhoneDialRecordDto.java b/postdischarge-manage/src/main/java/com/xinelu/manage/dto/phonedialrecord/PhoneDialRecordDto.java new file mode 100644 index 00000000..29aa8112 --- /dev/null +++ b/postdischarge-manage/src/main/java/com/xinelu/manage/dto/phonedialrecord/PhoneDialRecordDto.java @@ -0,0 +1,24 @@ +package com.xinelu.manage.dto.phonedialrecord; + +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDateTime; +import lombok.Data; + +/** + * @description: 电话拨打记录查询传输对象 + * @author: haown + * @create: 2024-11-08 14:42 + **/ +@Data +public class PhoneDialRecordDto { + + @ApiModelProperty(value = "呼叫时间") + private LocalDateTime dialTime; + + /** + * AI :自动外呼 或 COMMON:人工随访电话,否则为空 + */ + @ApiModelProperty(value = "AI :自动外呼 或 COMMON:人工随访电话,否则为空") + private String phoneDialMethod; + +} diff --git a/postdischarge-manage/src/main/java/com/xinelu/manage/mapper/phonedialrecord/PhoneDialRecordMapper.java b/postdischarge-manage/src/main/java/com/xinelu/manage/mapper/phonedialrecord/PhoneDialRecordMapper.java index 5bfec274..35fedb0e 100644 --- a/postdischarge-manage/src/main/java/com/xinelu/manage/mapper/phonedialrecord/PhoneDialRecordMapper.java +++ b/postdischarge-manage/src/main/java/com/xinelu/manage/mapper/phonedialrecord/PhoneDialRecordMapper.java @@ -1,6 +1,7 @@ package com.xinelu.manage.mapper.phonedialrecord; import com.xinelu.manage.domain.phonedialrecord.PhoneDialRecord; +import com.xinelu.manage.dto.phonedialrecord.PhoneDialRecordDto; import com.xinelu.manage.dto.statistics.FollowUpRateDto; import com.xinelu.manage.vo.phonedialrecord.PhoneDialRecordVo; import java.util.List; @@ -60,7 +61,29 @@ public interface PhoneDialRecordMapper { */ int deletePhoneDialRecordByIds(Long[] ids); + /** + * @description 统计页面查询电话拨打记录列表 + * @Param queryDto 随访成功率查询传输对象 + * @return 电话拨打记录列表 + * @Author haown + * @Date 2024-11-8 14:44 + */ List getPhoneDialStatistic(FollowUpRateDto queryDto); + /** + * @description 根据任务主键获取最新一次的电话拨打记录 + * @Param manageRouteNodeId 任务主键 + * @return 最新一次的电话拨打记录 + * @Author haown + * @Date 2024-11-8 14:43 + */ PhoneDialRecord getLastRecord(Long manageRouteNodeId); + + /** + * 查询未获取录音地址的电话拨打记录列表 + * + * @param phoneDialRecordDto 电话拨打记录查询传输对象 + * @return 电话拨打记录集合 + */ + List getNoVideoList(PhoneDialRecordDto phoneDialRecordDto); } 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 587350bf..b268d58e 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 @@ -72,7 +72,21 @@ public interface IAIOBService { */ JSONObject taskCallBack(Integer callbackType, TaskCallbackDataDto data) throws ClientException; + /** + * @description + * @Param ccUUID 通话录音唯一标识 + * @return 录音下载地址 + * @Author haown + * @Date 2024-11-8 13:47 + */ String record(String ccUUID); + /** + * @description 通话录音保存到本地并返回本地虚拟路径 + * @Param ccUuid 通话录音唯一标识 + * @return 录音本地虚拟路径 + * @Author haown + * @Date 2024-11-8 13:49 + */ String getPhoneDialRecord(String ccUuid); } 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 761e1b4f..6c079226 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 @@ -100,6 +100,7 @@ import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.client.RestTemplate; /** @@ -364,6 +365,7 @@ public class AIOBServiceImpl implements IAIOBService { * @Date 2024-9-2 14:20 */ @Override + @Transactional(rollbackFor = Exception.class) public JSONObject taskCallBack(Integer callbackType, TaskCallbackDataDto data) throws ClientException { JSONObject retObj = new JSONObject(); retObj.fluentPut("code", 200).fluentPut("msg", "success"); @@ -483,6 +485,13 @@ public class AIOBServiceImpl implements IAIOBService { return retObj; } + /** + * @description + * @Param ccUUID 通话录音唯一标识 + * @return 录音下载地址 + * @Author haown + * @Date 2024-11-8 13:47 + */ @Override public String record(String ccUUID) { String accessToken = getAccessToken(); HttpHeaders headers = new HttpHeaders(); @@ -744,40 +753,48 @@ public class AIOBServiceImpl implements IAIOBService { scriptInfoTaskInfoMapper.insertScriptInfoTaskInfo(scriptInfoTaskInfo); } + /** + * @description 通话录音保存到本地并返回本地虚拟路径 + * @Param ccUuid 通话录音唯一标识 + * @return 录音本地虚拟路径 + * @Author haown + * @Date 2024-11-8 13:49 + */ @Override public String getPhoneDialRecord(String ccUuid) { String url = ""; String downLoadUrl = record(ccUuid); - if (StringUtils.isNotBlank(downLoadUrl)) { - url = systemBusinessConfig.getProfile() + systemBusinessConfig.getPhoneDialRecordVideo() + "/" + ccUuid + ".wav"; - File outputPath = new File(url); - File dir = outputPath.getParentFile(); - if (!dir.exists()){ - dir.mkdirs(); - } - try { - outputPath.createNewFile(); // 创建文件 - URL fileUrl = new URL(downLoadUrl); - HttpURLConnection connection = (HttpURLConnection)fileUrl.openConnection(); - connection.setRequestMethod("GET"); - connection.connect(); - if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) { - InputStream inputStream = new BufferedInputStream(connection.getInputStream()); - FileOutputStream outputStream = new FileOutputStream(outputPath); - byte[] buffer = new byte[1024]; - int bytesRead; - while ((bytesRead = inputStream.read(buffer)) != -1) { - outputStream.write(buffer, 0, bytesRead); - } - outputStream.close(); - inputStream.close(); - return Constants.RESOURCE_PREFIX + systemBusinessConfig.getPhoneDialRecordVideo() + "/" + ccUuid + ".wav"; - } else { - throw new ServiceException("下载录音失败"); + if (StringUtils.isBlank(downLoadUrl)) { + throw new ServiceException("暂未获取到录音,请稍后再试!"); + } + url = systemBusinessConfig.getProfile() + systemBusinessConfig.getPhoneDialRecordVideo() + "/" + ccUuid + ".wav"; + File outputPath = new File(url); + File dir = outputPath.getParentFile(); + if (!dir.exists()){ + dir.mkdirs(); + } + try { + outputPath.createNewFile(); // 创建文件 + URL fileUrl = new URL(downLoadUrl); + HttpURLConnection connection = (HttpURLConnection)fileUrl.openConnection(); + connection.setRequestMethod("GET"); + connection.connect(); + if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) { + InputStream inputStream = new BufferedInputStream(connection.getInputStream()); + FileOutputStream outputStream = new FileOutputStream(outputPath); + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); } - } catch (IOException e) { - e.printStackTrace(); + outputStream.close(); + inputStream.close(); + return Constants.RESOURCE_PREFIX + systemBusinessConfig.getPhoneDialRecordVideo() + "/" + ccUuid + ".wav"; + } else { + throw new ServiceException("下载录音失败,请稍后再试"); } + } catch (IOException e) { + e.printStackTrace(); } return null; } diff --git a/postdischarge-manage/src/main/java/com/xinelu/manage/service/signpatientmanageroutenode/impl/SignPatientManageRouteNodeServiceImpl.java b/postdischarge-manage/src/main/java/com/xinelu/manage/service/signpatientmanageroutenode/impl/SignPatientManageRouteNodeServiceImpl.java index e8538c8c..700861e1 100644 --- a/postdischarge-manage/src/main/java/com/xinelu/manage/service/signpatientmanageroutenode/impl/SignPatientManageRouteNodeServiceImpl.java +++ b/postdischarge-manage/src/main/java/com/xinelu/manage/service/signpatientmanageroutenode/impl/SignPatientManageRouteNodeServiceImpl.java @@ -589,7 +589,7 @@ public class SignPatientManageRouteNodeServiceImpl implements ISignPatientManage @Override public String getPhoneDialVideo(Long id) { PhoneDialRecord phoneDialRecord = phoneDialRecordMapper.getLastRecord(id); if(ObjectUtils.isEmpty(phoneDialRecord) || StringUtils.isBlank(phoneDialRecord.getCtUuid())) { - throw new ServiceException("获取录音失败"); + throw new ServiceException("暂未获取到录音,请稍后再试"); } if (StringUtils.isBlank(phoneDialRecord.getPhoneDialRecordVideo())) { String videoUrl = aiobService.getPhoneDialRecord(phoneDialRecord.getCtUuid()); diff --git a/postdischarge-manage/src/main/resources/mapper/manage/phonedialrecord/PhoneDialRecordMapper.xml b/postdischarge-manage/src/main/resources/mapper/manage/phonedialrecord/PhoneDialRecordMapper.xml index 7c379e75..09709da9 100644 --- a/postdischarge-manage/src/main/resources/mapper/manage/phonedialrecord/PhoneDialRecordMapper.xml +++ b/postdischarge-manage/src/main/resources/mapper/manage/phonedialrecord/PhoneDialRecordMapper.xml @@ -269,4 +269,17 @@ where manage_route_node_id = #{manageRouteNodeId} order by dial_time desc limit 1 + + \ No newline at end of file diff --git a/postdischarge-quartz/src/main/java/com/xinelu/quartz/task/GetAiboRecordVideoTask.java b/postdischarge-quartz/src/main/java/com/xinelu/quartz/task/GetAiboRecordVideoTask.java new file mode 100644 index 00000000..8d9894d1 --- /dev/null +++ b/postdischarge-quartz/src/main/java/com/xinelu/quartz/task/GetAiboRecordVideoTask.java @@ -0,0 +1,46 @@ +package com.xinelu.quartz.task; + +import com.xinelu.common.enums.PhoneDialMethodEnum; +import com.xinelu.common.utils.StringUtils; +import com.xinelu.manage.domain.phonedialrecord.PhoneDialRecord; +import com.xinelu.manage.dto.phonedialrecord.PhoneDialRecordDto; +import com.xinelu.manage.mapper.phonedialrecord.PhoneDialRecordMapper; +import com.xinelu.manage.service.aibo.IAIOBService; +import java.time.LocalDateTime; +import java.util.List; +import javax.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @description: 获取百度外呼通话记录录音定时任务 + * @author: haown + * @create: 2024-11-08 13:34 + **/ +@Slf4j +@Component("GetAiboRecordVideoTask") +public class GetAiboRecordVideoTask { + + @Resource + private PhoneDialRecordMapper phoneDialRecordMapper; + @Resource + private IAIOBService aiobService; + + public void getVideo() { + // 查询超过两分钟没有录音地址的通话记录 + PhoneDialRecordDto phoneDialRecordQuery = new PhoneDialRecordDto(); + LocalDateTime localDateTime = LocalDateTime.now(); + localDateTime.minusMinutes(2); + phoneDialRecordQuery.setDialTime(localDateTime); + phoneDialRecordQuery.setPhoneDialMethod(PhoneDialMethodEnum.AI.getInfo()); + List phoneDialRecordList = phoneDialRecordMapper.getNoVideoList(phoneDialRecordQuery); + phoneDialRecordList.forEach(phoneDialRecord -> { + if (StringUtils.isNotBlank(phoneDialRecord.getCtUuid())) { + String videoUrl = aiobService.getPhoneDialRecord(phoneDialRecord.getCtUuid()); + phoneDialRecord.setPhoneDialRecordVideo(videoUrl); + phoneDialRecordMapper.updatePhoneDialRecord(phoneDialRecord); + } + }); + } + +}