CcCallPhoneServiceImpl.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. package com.ruoyi.aicall.service.impl;
  2. import java.util.HashMap;
  3. import java.util.List;
  4. import java.util.Map;
  5. import com.alibaba.fastjson.JSONArray;
  6. import com.alibaba.fastjson.JSONObject;
  7. import com.ruoyi.aicall.domain.CcLlmAgentAccount;
  8. import com.ruoyi.aicall.llm.ILlmCapability;
  9. import com.ruoyi.aicall.llm.model.AccountBaseEntity;
  10. import com.ruoyi.aicall.model.CallTaskStatModel;
  11. import com.ruoyi.cc.utils.LlmAccountParser;
  12. import com.ruoyi.common.utils.DateUtils;
  13. import com.ruoyi.common.utils.StringUtils;
  14. import lombok.extern.slf4j.Slf4j;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.stereotype.Service;
  17. import com.ruoyi.aicall.mapper.CcCallPhoneMapper;
  18. import com.ruoyi.aicall.domain.CcCallPhone;
  19. import com.ruoyi.aicall.service.ICcCallPhoneService;
  20. import com.ruoyi.common.core.text.Convert;
  21. /**
  22. * 外呼号码Service业务层处理
  23. *
  24. * @author ruoyi
  25. * @date 2025-05-29
  26. */
  27. @Service
  28. @Slf4j
  29. public class CcCallPhoneServiceImpl implements ICcCallPhoneService
  30. {
  31. @Autowired
  32. private CcCallPhoneMapper ccCallPhoneMapper;
  33. /**
  34. * 查询外呼号码
  35. *
  36. * @param id 外呼号码主键
  37. * @return 外呼号码
  38. */
  39. @Override
  40. public CcCallPhone selectCcCallPhoneById(String id)
  41. {
  42. return ccCallPhoneMapper.selectCcCallPhoneById(id);
  43. }
  44. /**
  45. * 查询外呼号码列表
  46. *
  47. * @param ccCallPhone 外呼号码
  48. * @return 外呼号码
  49. */
  50. @Override
  51. public List<CcCallPhone> selectCcCallPhoneList(CcCallPhone ccCallPhone)
  52. {
  53. normalizeListQueryParams(ccCallPhone);
  54. return ccCallPhoneMapper.selectCcCallPhoneList(ccCallPhone);
  55. }
  56. @Override
  57. public List<String> selectCcCallPhoneIds(CcCallPhone ccCallPhone) {
  58. normalizeListQueryParams(ccCallPhone);
  59. return ccCallPhoneMapper.selectCcCallPhoneIds(ccCallPhone);
  60. }
  61. @Override
  62. public List<CcCallPhone> selectCcCallPhoneLiteByIds(List<String> ids) {
  63. if (ids == null || ids.isEmpty()) {
  64. return new java.util.ArrayList<>();
  65. }
  66. return ccCallPhoneMapper.selectCcCallPhoneLiteByIds(ids);
  67. }
  68. /**
  69. * 统一处理列表查询时间参数;已是数值则不再转换,避免重复转换异常
  70. */
  71. private void normalizeListQueryParams(CcCallPhone ccCallPhone) {
  72. Map<String, Object> params = ccCallPhone.getParams();
  73. if (params == null) {
  74. params = new HashMap<>();
  75. ccCallPhone.setParams(params);
  76. return;
  77. }
  78. convertStringDateToMillis(params, "calloutTimeStart");
  79. convertStringDateToMillis(params, "calloutTimeEnd");
  80. convertStringDateToMillis(params, "callEndTimeStart");
  81. convertStringDateToMillis(params, "callEndTimeEnd");
  82. convertStringDateToMillis(params, "connectedTimeStart");
  83. convertStringDateToMillis(params, "connectedTimeEnd");
  84. convertStringDateToMillis(params, "answeredTimeStart");
  85. convertStringDateToMillis(params, "answeredTimeEnd");
  86. // 页面时长按“分钟”筛选(历史逻辑)
  87. convertMinutesToMillis(params, "timeLenStart");
  88. convertMinutesToMillis(params, "timeLenEnd");
  89. convertMinutesToMillis(params, "timeLenSecondStart");
  90. convertMinutesToMillis(params, "timeLenSecondEnd");
  91. ccCallPhone.setParams(params);
  92. }
  93. private void convertStringDateToMillis(Map<String, Object> params, String key) {
  94. Object value = params.get(key);
  95. if (!(value instanceof String) || StringUtils.isEmpty((String) value)) {
  96. return;
  97. }
  98. String text = ((String) value).trim();
  99. if (text.matches("^\\d+$")) {
  100. params.put(key, Long.parseLong(text));
  101. return;
  102. }
  103. params.put(key, DateUtils.dateTime("yyyy-MM-dd HH:mm:ss", text).getTime());
  104. }
  105. private void convertMinutesToMillis(Map<String, Object> params, String key) {
  106. Object value = params.get(key);
  107. if (value == null || "".equals(value)) {
  108. return;
  109. }
  110. if (value instanceof Number) {
  111. return;
  112. }
  113. params.put(key, Double.valueOf(value.toString()) * 60 * 1000L);
  114. }
  115. /**
  116. * 新增外呼号码
  117. *
  118. * @param ccCallPhone 外呼号码
  119. * @return 结果
  120. */
  121. @Override
  122. public int insertCcCallPhone(CcCallPhone ccCallPhone)
  123. {
  124. return ccCallPhoneMapper.insertCcCallPhone(ccCallPhone);
  125. }
  126. /**
  127. * 修改外呼号码
  128. *
  129. * @param ccCallPhone 外呼号码
  130. * @return 结果
  131. */
  132. @Override
  133. public int updateCcCallPhone(CcCallPhone ccCallPhone)
  134. {
  135. return ccCallPhoneMapper.updateCcCallPhone(ccCallPhone);
  136. }
  137. /**
  138. * 批量删除外呼号码
  139. *
  140. * @param ids 需要删除的外呼号码主键
  141. * @return 结果
  142. */
  143. @Override
  144. public int deleteCcCallPhoneByIds(String ids)
  145. {
  146. return ccCallPhoneMapper.deleteCcCallPhoneByIds(Convert.toStrArray(ids));
  147. }
  148. /**
  149. * 删除外呼号码信息
  150. *
  151. * @param id 外呼号码主键
  152. * @return 结果
  153. */
  154. @Override
  155. public int deleteCcCallPhoneById(String id)
  156. {
  157. return ccCallPhoneMapper.deleteCcCallPhoneById(id);
  158. }
  159. @Override
  160. public CallTaskStatModel statByBatchId(Long batchId) {
  161. CallTaskStatModel callTaskStatModel = ccCallPhoneMapper.statByBatchId(batchId);
  162. return normalizeStat(callTaskStatModel);
  163. }
  164. @Override
  165. public Map<Long, CallTaskStatModel> statByBatchIds(List<Long> batchIds) {
  166. Map<Long, CallTaskStatModel> result = new HashMap<>();
  167. if (batchIds == null || batchIds.isEmpty()) {
  168. return result;
  169. }
  170. List<CallTaskStatModel> stats = ccCallPhoneMapper.statByBatchIds(batchIds);
  171. if (stats != null) {
  172. for (CallTaskStatModel stat : stats) {
  173. CallTaskStatModel normalized = normalizeStat(stat);
  174. if (normalized.getBatchId() != null) {
  175. result.put(normalized.getBatchId(), normalized);
  176. }
  177. }
  178. }
  179. return result;
  180. }
  181. private CallTaskStatModel normalizeStat(CallTaskStatModel callTaskStatModel) {
  182. if (callTaskStatModel == null) {
  183. callTaskStatModel = new CallTaskStatModel();
  184. }
  185. if (null == callTaskStatModel.getPhoneCount()) {
  186. callTaskStatModel.setPhoneCount(0);
  187. }
  188. if (null == callTaskStatModel.getCallCount()) {
  189. callTaskStatModel.setCallCount(0);
  190. }
  191. if (null == callTaskStatModel.getConnectCount()) {
  192. callTaskStatModel.setConnectCount(0);
  193. }
  194. return callTaskStatModel;
  195. }
  196. @Override
  197. public void batchInsertCcCallPhone(List<CcCallPhone> phoneList) {
  198. if (phoneList.size() <= 0) {
  199. return;
  200. }
  201. ccCallPhoneMapper.batchInsertCcCallPhone(phoneList);
  202. }
  203. @Override
  204. public List<CcCallPhone> getCustIntentionList() {
  205. return ccCallPhoneMapper.getCustIntentionList();
  206. }
  207. @Override
  208. public void updateIntentionByIds(String intention, List<String> phoneIds) {
  209. if (StringUtils.isBlank(intention) || phoneIds.size() <= 0) {
  210. return;
  211. }
  212. ccCallPhoneMapper.updateIntentionByIds(intention, phoneIds);
  213. }
  214. @Override
  215. public String getIntenetionByDialogue(CcLlmAgentAccount ccLlmAgentAccount, String dialogue) {
  216. try {
  217. ILlmCapability llmAccount;
  218. String provider = ccLlmAgentAccount.getProviderClassName();
  219. AccountBaseEntity account = LlmAccountParser.parse(ccLlmAgentAccount);
  220. llmAccount = (ILlmCapability) (Class.forName("com.ruoyi.aicall.llm.impl." + provider).newInstance());
  221. JSONArray dialogueContents = JSONArray.parseArray(dialogue);
  222. log.info("account:{}", JSONObject.toJSONString(account));
  223. llmAccount.setAccount(account);
  224. String intention = llmAccount.getIntentionByTips(ccLlmAgentAccount, dialogueContents);
  225. return intention;
  226. } catch (Exception e) {
  227. }
  228. return "";
  229. }
  230. @Override
  231. public List<CcCallPhone> selectNoHangupCalls(Long batchId) {
  232. return ccCallPhoneMapper.selectNoHangupCalls(batchId);
  233. }
  234. @Override
  235. public void bakCallPhoneByBatchId(Long batchId) {
  236. ccCallPhoneMapper.bakCallPhoneByBatchId(batchId);
  237. }
  238. @Override
  239. public void delCallPhoneByBatchId(Long batchId) {
  240. ccCallPhoneMapper.delCallPhoneByBatchId(batchId);
  241. }
  242. /**
  243. * 查询外呼号码列表
  244. *
  245. * @param ccCallPhone 外呼号码
  246. * @return 外呼号码
  247. */
  248. @Override
  249. public List<CcCallPhone> selectCcCallPhoneYlrzList(CcCallPhone ccCallPhone)
  250. {
  251. Map<String, Object> params = ccCallPhone.getParams();
  252. if (null == params) {
  253. params = new HashMap<>();
  254. }
  255. if (null != params.get("timeLenStart")
  256. && !"".equals(params.get("timeLenStart"))) {
  257. params.put("timeLenStart", Double.valueOf((String)params.get("timeLenStart")) * 60 * 1000L);
  258. }
  259. if (null != params.get("timeLenEnd")
  260. && !"".equals(params.get("timeLenEnd"))) {
  261. params.put("timeLenEnd", Double.valueOf((String)params.get("timeLenEnd")) * 60 * 1000L);
  262. }
  263. if (null != params.get("calloutTimeStart")
  264. && !"".equals(params.get("calloutTimeStart"))) {
  265. params.put("calloutTimeStart", DateUtils.dateTime("yyyy-MM-dd HH:mm:ss", (String)params.get("calloutTimeStart")).getTime());
  266. }
  267. if (null != params.get("calloutTimeEnd")
  268. && !"".equals(params.get("calloutTimeEnd"))) {
  269. params.put("calloutTimeEnd", DateUtils.dateTime("yyyy-MM-dd HH:mm:ss", (String)params.get("calloutTimeEnd")).getTime());
  270. }
  271. if (null != params.get("answeredTimeStart")
  272. && !"".equals(params.get("answeredTimeStart"))) {
  273. params.put("answeredTimeStart", DateUtils.dateTime("yyyy-MM-dd HH:mm:ss", (String)params.get("answeredTimeStart")).getTime());
  274. }
  275. if (null != params.get("answeredTimeEnd")
  276. && !"".equals(params.get("answeredTimeEnd"))) {
  277. params.put("answeredTimeEnd", DateUtils.dateTime("yyyy-MM-dd HH:mm:ss", (String)params.get("answeredTimeEnd")).getTime());
  278. }
  279. if (null != params.get("callEndTimeStart")
  280. && !"".equals(params.get("callEndTimeStart"))) {
  281. params.put("callEndTimeStart", DateUtils.dateTime("yyyy-MM-dd HH:mm:ss", (String)params.get("callEndTimeStart")).getTime());
  282. }
  283. if (null != params.get("callEndTimeEnd")
  284. && !"".equals(params.get("callEndTimeEnd"))) {
  285. params.put("callEndTimeEnd", DateUtils.dateTime("yyyy-MM-dd HH:mm:ss", (String)params.get("callEndTimeEnd")).getTime());
  286. }
  287. ccCallPhone.setParams(params);
  288. return ccCallPhoneMapper.selectCcCallPhoneYlrzList(ccCallPhone);
  289. }
  290. @Override
  291. public List<CcCallPhone> selectCcCallPhoneListByIds(List<String> callPhoneIds) {
  292. return ccCallPhoneMapper.selectCcCallPhoneListByIds(callPhoneIds);
  293. }
  294. @Override
  295. public String selectCcCallPhoneDialogueByUuid(String uuid) {
  296. return ccCallPhoneMapper.selectCcCallPhoneDialogueByUuid(uuid);
  297. }
  298. }