CcCallPhoneController.java 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  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. for (CcCallPhone data: records) {
  69. if (data.getWavfile().startsWith("/")) {
  70. data.setWavfile(data.getWavfile().substring(1));
  71. }
  72. data.setWavfile("/recordings/files?filename=" + data.getWavfile());
  73. data.setTelephone(CommonUtils.maskPhoneNumber(data.getTelephone()));
  74. data.setCallerNumber(CommonUtils.maskPhoneNumber(data.getCallerNumber()));
  75. if (StringUtils.isBlank(data.getBatchName())) {
  76. data.setBatchName("-");
  77. }
  78. // 挂机原因处理
  79. if (StringUtils.isNotEmpty(data.getHangupCause())) {
  80. if (data.getHangupCause().startsWith("{") && data.getHangupCause().endsWith("}")) {
  81. try {
  82. JSONObject hangupCause = JSONObject.parseObject(data.getHangupCause());
  83. String hangupCauseCode = hangupCause.getString("code");
  84. String hangupCauseDetail = hangupCause.getString("details");
  85. String hangupCauseCodeI18n = MessageUtils.message("_hangup_cause_code_" + hangupCauseCode);
  86. if (StringUtils.isNotEmpty(hangupCauseCodeI18n)) {
  87. hangupCauseCode = hangupCauseCodeI18n;
  88. }
  89. if (StringUtils.isNotEmpty(hangupCauseDetail)) {
  90. data.setHangupCause(hangupCauseCode + ":" + hangupCauseDetail);
  91. } else {
  92. data.setHangupCause(hangupCauseCode);
  93. }
  94. } catch (Exception e) {
  95. logger.error(ExceptionUtil.getExceptionMessage(e));
  96. }
  97. }
  98. }
  99. }
  100. tableDataInfo.setRows(records);
  101. logger.info("通话记录查询后端累计耗时:{}ms", (System.currentTimeMillis() - t0));
  102. return tableDataInfo;
  103. }
  104. /**
  105. * 导出外呼号码列表
  106. */
  107. @RequiresPermissions("aicall:callPhone:export")
  108. @Log(title = "外呼号码", businessType = BusinessType.EXPORT)
  109. @PostMapping("/export")
  110. @ResponseBody
  111. public AjaxResult export(CcCallPhone ccCallPhone)
  112. {
  113. List<CcCallPhone> list = ccCallPhoneService.selectCcCallPhoneList(ccCallPhone);
  114. Date d0 = DateUtils.dateTime( "yyyy-MM-dd", "2025-01-01");
  115. Map<Long, String> batchNameMap = new HashMap<>();
  116. List<CallPhoneExportVo> dataList = new ArrayList<>();
  117. for (CcCallPhone data: list) {
  118. data.setTelephone(CommonUtils.maskPhoneNumber(data.getTelephone()));
  119. data.setCallerNumber(CommonUtils.maskPhoneNumber(data.getCallerNumber()));
  120. String batchName = batchNameMap.getOrDefault(data.getBatchId(), "");
  121. if (StringUtils.isBlank(batchName)) {
  122. CcCallTask ccCallTask = ccCallTaskService.selectCcCallTaskByBatchId(data.getBatchId());
  123. if (null != ccCallTask) {
  124. batchName = ccCallTask.getBatchName();
  125. } else {
  126. batchName = "-";
  127. }
  128. batchNameMap.put(data.getBatchId(), batchName);
  129. }
  130. data.setBatchName(batchName);
  131. CallPhoneExportVo vo = new CallPhoneExportVo();
  132. BeanUtils.copyProperties(data, vo);
  133. vo.setCallstatusName(MessageUtils.message("callPhone.table.callstatus" + data.getCallstatus()));
  134. if (data.getCalloutTime() <= d0.getTime()) {
  135. vo.setCalloutTimeStr("-");
  136. } else {
  137. vo.setCalloutTimeStr(DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", new Date(data.getCalloutTime())));
  138. }
  139. if (data.getAnsweredTime() <= d0.getTime()) {
  140. vo.setAnsweredTimeStr("-");
  141. } else {
  142. vo.setAnsweredTimeStr(DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", new Date(data.getAnsweredTime())));
  143. }
  144. if (data.getCallEndTime() <= d0.getTime()) {
  145. vo.setCallEndTimeStr("-");
  146. } else {
  147. vo.setCallEndTimeStr(DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", new Date(data.getCallEndTime())));
  148. }
  149. Long timeLen = data.getTimeLen()/1000;
  150. vo.setTimeLenSec(timeLen/60 + "分" + timeLen%60 + "秒" );
  151. dataList.add(vo);
  152. }
  153. ExcelUtil<CallPhoneExportVo> util = new ExcelUtil<>(CallPhoneExportVo.class);
  154. return util.exportExcel(dataList, "外呼结果数据");
  155. }
  156. /**
  157. * 新增外呼号码
  158. */
  159. @GetMapping("/add")
  160. public String add()
  161. {
  162. return prefix + "/add";
  163. }
  164. /**
  165. * 新增保存外呼号码
  166. */
  167. @RequiresPermissions("aicall:callPhone:add")
  168. @Log(title = "外呼号码", businessType = BusinessType.INSERT)
  169. @PostMapping("/add")
  170. @ResponseBody
  171. public AjaxResult addSave(CcCallPhone ccCallPhone)
  172. {
  173. return toAjax(ccCallPhoneService.insertCcCallPhone(ccCallPhone));
  174. }
  175. /**
  176. * 修改外呼号码
  177. */
  178. @RequiresPermissions("aicall:callPhone:edit")
  179. @GetMapping("/edit/{id}")
  180. public String edit(@PathVariable("id") String id, ModelMap mmap)
  181. {
  182. CcCallPhone ccCallPhone = ccCallPhoneService.selectCcCallPhoneById(id);
  183. mmap.put("ccCallPhone", ccCallPhone);
  184. return prefix + "/edit";
  185. }
  186. /**
  187. * 修改保存外呼号码
  188. */
  189. @RequiresPermissions("aicall:callPhone:edit")
  190. @Log(title = "外呼号码", businessType = BusinessType.UPDATE)
  191. @PostMapping("/edit")
  192. @ResponseBody
  193. public AjaxResult editSave(CcCallPhone ccCallPhone)
  194. {
  195. return toAjax(ccCallPhoneService.updateCcCallPhone(ccCallPhone));
  196. }
  197. /**
  198. * 删除外呼号码
  199. */
  200. @RequiresPermissions("aicall:callPhone:remove")
  201. @Log(title = "外呼号码", businessType = BusinessType.DELETE)
  202. @PostMapping( "/remove")
  203. @ResponseBody
  204. public AjaxResult remove(String ids)
  205. {
  206. return toAjax(ccCallPhoneService.deleteCcCallPhoneByIds(ids));
  207. }
  208. }