CcCallPhoneController.java 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. package com.ruoyi.aicall.controller;
  2. import java.text.ParseException;
  3. import java.util.*;
  4. import java.util.stream.Collectors;
  5. import com.alibaba.fastjson.JSONObject;
  6. import com.ruoyi.aicall.domain.CcCallTask;
  7. import com.ruoyi.aicall.model.CallPhoneExportVo;
  8. import com.ruoyi.aicall.service.ICcCallTaskService;
  9. import com.ruoyi.common.utils.DateUtils;
  10. import com.ruoyi.common.utils.ExceptionUtil;
  11. import com.ruoyi.common.utils.MessageUtils;
  12. import com.ruoyi.common.utils.StringUtils;
  13. import org.apache.shiro.authz.annotation.RequiresPermissions;
  14. import org.springframework.beans.BeanUtils;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.stereotype.Controller;
  17. import org.springframework.ui.ModelMap;
  18. import org.springframework.web.bind.annotation.GetMapping;
  19. import org.springframework.web.bind.annotation.PathVariable;
  20. import org.springframework.web.bind.annotation.PostMapping;
  21. import org.springframework.web.bind.annotation.RequestMapping;
  22. import org.springframework.web.bind.annotation.ResponseBody;
  23. import com.ruoyi.common.annotation.Log;
  24. import com.ruoyi.common.enums.BusinessType;
  25. import com.ruoyi.aicall.domain.CcCallPhone;
  26. import com.ruoyi.aicall.service.ICcCallPhoneService;
  27. import com.ruoyi.common.core.controller.BaseController;
  28. import com.ruoyi.common.core.domain.AjaxResult;
  29. import com.ruoyi.common.utils.CommonUtils;
  30. import com.ruoyi.common.utils.poi.ExcelUtil;
  31. import com.ruoyi.common.core.page.TableDataInfo;
  32. /**
  33. * 外呼号码Controller
  34. *
  35. * @author ruoyi
  36. * @date 2025-05-29
  37. */
  38. @Controller
  39. @RequestMapping("/aicall/callPhone")
  40. public class CcCallPhoneController extends BaseController
  41. {
  42. private String prefix = "aicall/callPhone";
  43. @Autowired
  44. private ICcCallPhoneService ccCallPhoneService;
  45. @Autowired
  46. private ICcCallTaskService ccCallTaskService;
  47. @RequiresPermissions("aicall:callPhone:view")
  48. @GetMapping()
  49. public String callPhone()
  50. {
  51. return prefix + "/callPhone";
  52. }
  53. /**
  54. * 查询外呼号码列表
  55. */
  56. @RequiresPermissions("aicall:callPhone:list")
  57. @PostMapping("/list")
  58. @Log(title = "查询通话记录", businessType = BusinessType.OTHER)
  59. @ResponseBody
  60. public TableDataInfo list(CcCallPhone ccCallPhone)
  61. {
  62. Long t0 = System.currentTimeMillis();
  63. startPage();
  64. List<CcCallPhone> list = ccCallPhoneService.selectCcCallPhoneList(ccCallPhone);
  65. logger.info("通话记录查询执行sql耗时:{}ms", (System.currentTimeMillis() - t0));
  66. TableDataInfo tableDataInfo = getDataTable(list);
  67. List<CcCallPhone> records = (List<CcCallPhone>) tableDataInfo.getRows();
  68. Map<Long, String> batchNameMap = new HashMap<>();
  69. for (CcCallPhone data: records) {
  70. if (data.getWavfile().startsWith("/")) {
  71. data.setWavfile(data.getWavfile().substring(1));
  72. }
  73. data.setWavfile("/recordings/files?filename=" + data.getWavfile());
  74. data.setTelephone(CommonUtils.maskPhoneNumber(data.getTelephone()));
  75. data.setCallerNumber(CommonUtils.maskPhoneNumber(data.getCallerNumber()));
  76. String batchName = batchNameMap.getOrDefault(data.getBatchId(), "");
  77. if (StringUtils.isBlank(batchName)) {
  78. CcCallTask ccCallTask = ccCallTaskService.selectCcCallTaskByBatchId(data.getBatchId());
  79. if (null != ccCallTask) {
  80. batchName = ccCallTask.getBatchName();
  81. } else {
  82. batchName = "-";
  83. }
  84. batchNameMap.put(data.getBatchId(), batchName);
  85. }
  86. data.setBatchName(batchName);
  87. // 挂机原因处理
  88. if (StringUtils.isNotEmpty(data.getHangupCause())) {
  89. if (data.getHangupCause().startsWith("{") && data.getHangupCause().endsWith("}")) {
  90. try {
  91. JSONObject hangupCause = JSONObject.parseObject(data.getHangupCause());
  92. String hangupCauseCode = hangupCause.getString("code");
  93. String hangupCauseDetail = hangupCause.getString("details");
  94. String hangupCauseCodeI18n = MessageUtils.message("_hangup_cause_code_" + hangupCauseCode);
  95. if (StringUtils.isNotEmpty(hangupCauseCodeI18n)) {
  96. hangupCauseCode = hangupCauseCodeI18n;
  97. }
  98. if (StringUtils.isNotEmpty(hangupCauseDetail)) {
  99. data.setHangupCause(hangupCauseCode + ":" + hangupCauseDetail);
  100. } else {
  101. data.setHangupCause(hangupCauseCode);
  102. }
  103. } catch (Exception e) {
  104. logger.error(ExceptionUtil.getExceptionMessage(e));
  105. }
  106. }
  107. }
  108. }
  109. tableDataInfo.setRows(records);
  110. logger.info("通话记录查询后端累计耗时:{}ms", (System.currentTimeMillis() - t0));
  111. return tableDataInfo;
  112. }
  113. /**
  114. * 导出外呼号码列表
  115. */
  116. @RequiresPermissions("aicall:callPhone:export")
  117. @Log(title = "外呼号码", businessType = BusinessType.EXPORT)
  118. @PostMapping("/export")
  119. @ResponseBody
  120. public AjaxResult export(CcCallPhone ccCallPhone)
  121. {
  122. List<CcCallPhone> list = ccCallPhoneService.selectCcCallPhoneList(ccCallPhone);
  123. Date d0 = DateUtils.dateTime( "yyyy-MM-dd", "2025-01-01");
  124. Map<Long, String> batchNameMap = new HashMap<>();
  125. List<CallPhoneExportVo> dataList = new ArrayList<>();
  126. for (CcCallPhone data: list) {
  127. data.setTelephone(CommonUtils.maskPhoneNumber(data.getTelephone()));
  128. data.setCallerNumber(CommonUtils.maskPhoneNumber(data.getCallerNumber()));
  129. String batchName = batchNameMap.getOrDefault(data.getBatchId(), "");
  130. if (StringUtils.isBlank(batchName)) {
  131. CcCallTask ccCallTask = ccCallTaskService.selectCcCallTaskByBatchId(data.getBatchId());
  132. if (null != ccCallTask) {
  133. batchName = ccCallTask.getBatchName();
  134. } else {
  135. batchName = "-";
  136. }
  137. batchNameMap.put(data.getBatchId(), batchName);
  138. }
  139. data.setBatchName(batchName);
  140. CallPhoneExportVo vo = new CallPhoneExportVo();
  141. BeanUtils.copyProperties(data, vo);
  142. vo.setCallstatusName(MessageUtils.message("callPhone.table.callstatus" + data.getCallstatus()));
  143. if (data.getCalloutTime() <= d0.getTime()) {
  144. vo.setCalloutTimeStr("-");
  145. } else {
  146. vo.setCalloutTimeStr(DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", new Date(data.getCalloutTime())));
  147. }
  148. if (data.getAnsweredTime() <= d0.getTime()) {
  149. vo.setAnsweredTimeStr("-");
  150. } else {
  151. vo.setAnsweredTimeStr(DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", new Date(data.getAnsweredTime())));
  152. }
  153. if (data.getCallEndTime() <= d0.getTime()) {
  154. vo.setCallEndTimeStr("-");
  155. } else {
  156. vo.setCallEndTimeStr(DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", new Date(data.getCallEndTime())));
  157. }
  158. Long timeLen = data.getTimeLen()/1000;
  159. vo.setTimeLenSec(timeLen/60 + "分" + timeLen%60 + "秒" );
  160. dataList.add(vo);
  161. }
  162. ExcelUtil<CallPhoneExportVo> util = new ExcelUtil<>(CallPhoneExportVo.class);
  163. return util.exportExcel(dataList, "外呼结果数据");
  164. }
  165. /**
  166. * 新增外呼号码
  167. */
  168. @GetMapping("/add")
  169. public String add()
  170. {
  171. return prefix + "/add";
  172. }
  173. /**
  174. * 新增保存外呼号码
  175. */
  176. @RequiresPermissions("aicall:callPhone:add")
  177. @Log(title = "外呼号码", businessType = BusinessType.INSERT)
  178. @PostMapping("/add")
  179. @ResponseBody
  180. public AjaxResult addSave(CcCallPhone ccCallPhone)
  181. {
  182. return toAjax(ccCallPhoneService.insertCcCallPhone(ccCallPhone));
  183. }
  184. /**
  185. * 修改外呼号码
  186. */
  187. @RequiresPermissions("aicall:callPhone:edit")
  188. @GetMapping("/edit/{id}")
  189. public String edit(@PathVariable("id") String id, ModelMap mmap)
  190. {
  191. CcCallPhone ccCallPhone = ccCallPhoneService.selectCcCallPhoneById(id);
  192. mmap.put("ccCallPhone", ccCallPhone);
  193. return prefix + "/edit";
  194. }
  195. /**
  196. * 修改保存外呼号码
  197. */
  198. @RequiresPermissions("aicall:callPhone:edit")
  199. @Log(title = "外呼号码", businessType = BusinessType.UPDATE)
  200. @PostMapping("/edit")
  201. @ResponseBody
  202. public AjaxResult editSave(CcCallPhone ccCallPhone)
  203. {
  204. return toAjax(ccCallPhoneService.updateCcCallPhone(ccCallPhone));
  205. }
  206. /**
  207. * 删除外呼号码
  208. */
  209. @RequiresPermissions("aicall:callPhone:remove")
  210. @Log(title = "外呼号码", businessType = BusinessType.DELETE)
  211. @PostMapping( "/remove")
  212. @ResponseBody
  213. public AjaxResult remove(String ids)
  214. {
  215. return toAjax(ccCallPhoneService.deleteCcCallPhoneByIds(ids));
  216. }
  217. }