BiCallController.cs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514
  1. using Hotline.Application.ExportExcel;
  2. using Hotline.Share.Tools;
  3. using Hotline.Application.StatisticalReport;
  4. using Hotline.Application.Systems;
  5. using Hotline.Caching.Interfaces;
  6. using Hotline.CallCenter.Calls;
  7. using Hotline.CallCenter.Tels;
  8. using Hotline.Share.Dtos;
  9. using Hotline.Share.Dtos.CallCenter;
  10. using Hotline.Share.Dtos.Order;
  11. using Hotline.Share.Dtos.TrCallCenter;
  12. using Hotline.Share.Requests;
  13. using Hotline.Tools;
  14. using Hotline.Users;
  15. using MapsterMapper;
  16. using Microsoft.AspNetCore.Authorization;
  17. using Microsoft.AspNetCore.Mvc;
  18. using SqlSugar;
  19. using System.Data;
  20. using System.Linq.Dynamic.Core;
  21. using XF.Domain.Repository;
  22. namespace Hotline.Api.Controllers.Bi;
  23. /// <summary>
  24. /// 话务报表
  25. /// </summary>
  26. public class BiCallController : BaseController
  27. {
  28. private readonly IRepository<TrCallRecord> _trCallRecordRepository;
  29. private readonly BaseDataApplication _baseDataApplication;
  30. private readonly IRepository<User> _userRepository;
  31. private readonly IRepository<TelRest> _telRestRepository;
  32. private readonly IMapper _mapper;
  33. private readonly ISystemSettingCacheManager _systemSettingCacheManager;
  34. private readonly IRepository<Work> _workRepository;
  35. private readonly ISystemDicDataCacheManager _sysDicDataCacheManager;
  36. private readonly ICallReportApplication _callReportApplication;
  37. private readonly IExportApplication _exportApplication;
  38. public BiCallController(
  39. IRepository<TrCallRecord> trCallRecordRepository,
  40. IRepository<User> userRepository,
  41. IRepository<TelRest> telRestRepository,
  42. IMapper mapper,
  43. ISystemSettingCacheManager systemSettingCacheManager,
  44. ISystemDicDataCacheManager sysDicDataCacheManager,
  45. IRepository<Work> workRepository,
  46. ICallReportApplication callReportApplication,
  47. IExportApplication exportApplication,
  48. BaseDataApplication baseDataApplication)
  49. {
  50. _trCallRecordRepository = trCallRecordRepository;
  51. _userRepository = userRepository;
  52. _telRestRepository = telRestRepository;
  53. _mapper = mapper;
  54. _systemSettingCacheManager = systemSettingCacheManager;
  55. _workRepository = workRepository;
  56. _sysDicDataCacheManager = sysDicDataCacheManager;
  57. _callReportApplication = callReportApplication;
  58. _exportApplication = exportApplication;
  59. _baseDataApplication = baseDataApplication;
  60. }
  61. /// <summary>
  62. /// 话务统计分析
  63. /// </summary>
  64. /// <param name="dto"></param>
  65. /// <returns></returns>
  66. [HttpGet("calls")]
  67. [AllowAnonymous]
  68. public async Task<List<BiCallDto>> QueryCallsAsync([FromQuery] BiQueryCallsDto dto)
  69. => await _callReportApplication.QueryCallsAsync(dto, HttpContext.RequestAborted);
  70. /// <summary>
  71. /// 话务统计分析---导出
  72. /// </summary>
  73. /// <param name="dto"></param>
  74. /// <returns></returns>
  75. [HttpPost("calls_export")]
  76. [AllowAnonymous]
  77. public async Task<FileStreamResult> ExportQueryCallsAsync([FromBody] ExportExcelDto<BiQueryCallsDto> dto)
  78. => ExcelStreamResult(
  79. _exportApplication.GetExcelStream(
  80. dto,
  81. await _callReportApplication.QueryCallsAsync(dto.QueryDto, HttpContext.RequestAborted),
  82. list =>
  83. {
  84. return new BiCallDto()
  85. {
  86. HourRange = "合计",
  87. Hour = 13,
  88. Total = list.Sum(p => p.Total),
  89. Answered = list.Sum(p => p.Answered),
  90. Hanguped = list.Sum(p => p.Hanguped)
  91. };
  92. }),
  93. "话务统计分析");
  94. /// <summary>
  95. /// 话务日期统计
  96. /// </summary>
  97. /// <param name="dto"></param>
  98. /// <returns></returns>
  99. [HttpGet("query_calls_statistics")]
  100. public async Task<TotalList<QueryCallsDetailStatistics>> QueryCallsStatisticsAsync([FromQuery] StartEndTimeDto dto)
  101. {
  102. var items = await _callReportApplication.QueryCallsDetailStatisticsAsync(dto, HttpContext.RequestAborted);
  103. var total = new QueryCallsDetailStatistics
  104. {
  105. Date = "合计",
  106. //InTotal = items.Sum(m => m.InTotal),
  107. NotAcceptedHang = items.Sum(m => m.NotAcceptedHang),
  108. InConnectionQuantity = items.Sum(m => m.InConnectionQuantity),
  109. InNotAnswered = items.Sum(m => m.InNotAnswered),
  110. IvrByeCount = items.Sum(m => m.IvrByeCount),
  111. OutConnectionQuantity = items.Sum(m => m.OutConnectionQuantity),
  112. OutNotAnswered = items.Sum(m => m.OutNotAnswered)
  113. };
  114. return new TotalList<QueryCallsDetailStatistics>(items, total);
  115. }
  116. /// <summary>
  117. /// 话务日期统计-导出
  118. /// </summary>
  119. /// <param name="dto"></param>
  120. /// <returns></returns>
  121. [HttpPost("query_calls_statistics_export")]
  122. public async Task<FileStreamResult> QueryCallsStatisticsExportAsync([FromBody] ExportExcelDto<StartEndTimeDto> dto)
  123. {
  124. var items = (await _callReportApplication.QueryCallsDetailStatisticsAsync(dto.QueryDto, HttpContext.RequestAborted));
  125. return _exportApplication.GetExcelFile(dto, items, "话务日期统计", "Date");
  126. }
  127. /// <summary>
  128. /// 话务日期统计详情
  129. /// </summary>
  130. /// <param name="dto"></param>
  131. /// <returns></returns>
  132. [HttpGet("query_calls_statistics_detail")]
  133. public async Task<PagedDto<QueryCallsStatisticsDetailOutDto>> QueryCallsStatisticsDetailAsync([FromQuery] QueryCallsStatisticsDetailInDto dto)
  134. => (await _callReportApplication.QueryCallsStatisticsDetailAsync(dto, HttpContext.RequestAborted))
  135. .ToPaged();
  136. /// <summary>
  137. /// 话务日期统计详情--导出
  138. /// </summary>
  139. /// <param name="dto"></param>
  140. /// <returns></returns>
  141. [HttpPost("query_calls_statistics_detail/export")]
  142. public async Task<FileStreamResult> QueryCallsStatisticsDetailAsync([FromBody] ExportExcelDto<QueryCallsStatisticsDetailInDto> dto)
  143. {
  144. var items = (await _callReportApplication.QueryCallsStatisticsDetailAsync(dto.QueryDto, HttpContext.RequestAborted)).Item2;
  145. return _exportApplication.GetExcelFile(dto, items, "话务日期统计详情", "OrderNo");
  146. }
  147. /// <summary>
  148. /// 话务日期统计详情页面基础数据
  149. /// </summary>
  150. /// <param name="dto"></param>
  151. /// <returns></returns>
  152. [HttpGet("query_calls_statistics_detail/base-data")]
  153. public async Task<Dictionary<string, dynamic>> QueryCallsStatisticsDetailBaseData()
  154. {
  155. return _baseDataApplication
  156. .EndBy()
  157. .Build();
  158. }
  159. /// <summary>
  160. /// 话务日期明细
  161. /// </summary>
  162. /// <param name="dto"></param>
  163. /// <returns></returns>
  164. [HttpGet("query_calls_detail")]
  165. public async Task<object> QueryCallsDetailAsync([FromQuery] BiQueryCallsDto dto)
  166. {
  167. var items = await _callReportApplication.QueryCallsDetailAsync(dto);
  168. var total = new QueryCallsDetailDto
  169. {
  170. Date = "合计",
  171. Hour = "",
  172. InTotal = items.Sum(p => p.InTotal),
  173. InConnectionQuantity = items.Sum(p => p.InConnectionQuantity),
  174. NotAcceptedHang = items.Sum(p => p.NotAcceptedHang),
  175. TotalDurationIncomingCalls = items.Sum(p => p.TotalDurationIncomingCalls),
  176. InAvailableAnswer = items.Sum(p => p.InAvailableAnswer),
  177. InHangupImmediateWhenAnswered = items.Sum(p => p.InHangupImmediateWhenAnswered),
  178. TimeoutConnection = items.Sum(p => p.TimeoutConnection),
  179. TimeoutSuspension = items.Sum(p => p.TimeoutSuspension),
  180. QueueByeCount = items.Sum(p => p.QueueByeCount),
  181. IvrByeCount = items.Sum(p => p.IvrByeCount),
  182. OutTotal = items.Sum(p => p.OutTotal),
  183. OutConnectionQuantity = items.Sum(p => p.OutConnectionQuantity)
  184. };
  185. return new { List = items, Total = total };
  186. }
  187. /// <summary>
  188. /// 话务日期明细--导出
  189. /// </summary>
  190. /// <param name="dto"></param>
  191. /// <returns></returns>
  192. [HttpPost("query_calls_detail_export")]
  193. public async Task<FileStreamResult> QueryCallsDetailExportAsync([FromBody] ExportExcelDto<BiQueryCallsDto> dto)
  194. {
  195. return ExcelStreamResult(
  196. _exportApplication.GetExcelStream(
  197. dto,
  198. await _callReportApplication.QueryCallsDetailAsync(dto.QueryDto),
  199. items =>
  200. {
  201. return new QueryCallsDetailDto
  202. {
  203. Date = "合计",
  204. Hour = "",
  205. InTotal = items.Sum(p => p.InTotal),
  206. InConnectionQuantity = items.Sum(p => p.InConnectionQuantity),
  207. NotAcceptedHang = items.Sum(p => p.NotAcceptedHang),
  208. TotalDurationIncomingCalls = items.Sum(p => p.TotalDurationIncomingCalls),
  209. InAvailableAnswer = items.Sum(p => p.InAvailableAnswer),
  210. InHangupImmediateWhenAnswered = items.Sum(p => p.InHangupImmediateWhenAnswered),
  211. TimeoutConnection = items.Sum(p => p.TimeoutConnection),
  212. TimeoutSuspension = items.Sum(p => p.TimeoutSuspension),
  213. QueueByeCount = items.Sum(p => p.QueueByeCount),
  214. IvrByeCount = items.Sum(p => p.IvrByeCount),
  215. OutTotal = items.Sum(p => p.OutTotal),
  216. OutConnectionQuantity = items.Sum(p => p.OutConnectionQuantity)
  217. };
  218. })
  219. , "话务日期明细数据");
  220. }
  221. /// <summary>
  222. /// 话务日期明细--呼入明细
  223. /// </summary>
  224. /// <param name="dto"></param>
  225. /// <returns></returns>
  226. [HttpGet("query_incall_calls_list")]
  227. public async Task<PagedDto<CallRecordOutDto>> GetInCallCallListAsync([FromQuery] BiQueryCallsDto dto)
  228. {
  229. var (total, items) = await _callReportApplication.QueryCallsDetailInTotalAsync(dto, false);
  230. return new PagedDto<CallRecordOutDto>(total, items);
  231. }
  232. /// <summary>
  233. /// 话务日期明细----导出
  234. /// </summary>
  235. /// <param name="dto"></param>
  236. /// <returns></returns>
  237. [HttpPost("query_incall_calls_list_export")]
  238. public async Task<FileStreamResult> GetInCallCallListExportAsync([FromBody] ExportExcelDto<BiQueryCallsDto> dto)
  239. {
  240. var (total, data) = await _callReportApplication.QueryCallsDetailInTotalAsync(dto.QueryDto, dto.IsExportAll);
  241. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  242. var dtos = data
  243. .Select(stu => _mapper.Map(stu, typeof(CallRecordOutDto), dynamicClass))
  244. .Cast<object>()
  245. .ToList();
  246. var stream = ExcelHelper.CreateStream(dtos);
  247. return ExcelStreamResult(
  248. _exportApplication.GetExcelStream(
  249. dto,
  250. (await _callReportApplication.QueryCallsDetailInTotalAsync(dto.QueryDto, dto.IsExportAll)).Item2
  251. ),
  252. dto.QueryDto.TypeCode == "2" ? "话务日期-接通明细数据" : "话务日期-总量明细数据");
  253. }
  254. /// <summary>
  255. /// 话务日期明细--时间段
  256. /// </summary>
  257. /// <param name="dto"></param>
  258. /// <returns></returns>
  259. [HttpGet("query_calls_hour_detail_list")]
  260. public async Task<TotalList<QueryCallsDetailDto>> QueryCallsHourDetailListAsync([FromQuery] BiQueryCallsDto dto)
  261. {
  262. var items = await _callReportApplication.QueryCallsHourDetailAsync(dto, HttpContext.RequestAborted);
  263. var total = new QueryCallsDetailDto
  264. {
  265. Date = "",
  266. Hour = "合计",
  267. InTotal = items.Sum(p => p.InTotal),
  268. InConnectionQuantity = items.Sum(p => p.InConnectionQuantity),
  269. NotAcceptedHang = items.Sum(p => p.NotAcceptedHang),
  270. TotalDurationIncomingCalls = items.Sum(p => p.TotalDurationIncomingCalls),
  271. InAvailableAnswer = items.Sum(p => p.InAvailableAnswer),
  272. InHangupImmediateWhenAnswered = items.Sum(p => p.InHangupImmediateWhenAnswered),
  273. TimeoutConnection = items.Sum(p => p.TimeoutConnection),
  274. TimeoutSuspension = items.Sum(p => p.TimeoutSuspension),
  275. QueueByeCount = items.Sum(p => p.QueueByeCount),
  276. IvrByeCount = items.Sum(p => p.IvrByeCount),
  277. OutTotal = items.Sum(p => p.OutTotal),
  278. OutConnectionQuantity = items.Sum(p => p.OutConnectionQuantity)
  279. };
  280. return new TotalList<QueryCallsDetailDto>(items, total);
  281. }
  282. /// <summary>
  283. /// 话务日期明细--时间段--导出
  284. /// </summary>
  285. /// <param name="dto"></param>
  286. /// <returns></returns>
  287. [HttpPost("query_calls_hour_detail_list_export")]
  288. public async Task<FileStreamResult> QueryCallsHourDetailListExportAsync([FromBody] ExportExcelDto<BiQueryCallsDto> dto)
  289. => ExcelStreamResult(
  290. _exportApplication.GetExcelStream(
  291. dto,
  292. await _callReportApplication.QueryCallsHourDetailAsync(dto.QueryDto, HttpContext.RequestAborted),
  293. items =>
  294. {
  295. return new QueryCallsDetailDto
  296. {
  297. Date = "",
  298. Hour = "合计",
  299. InTotal = items.Sum(p => p.InTotal),
  300. InConnectionQuantity = items.Sum(p => p.InConnectionQuantity),
  301. NotAcceptedHang = items.Sum(p => p.NotAcceptedHang),
  302. TotalDurationIncomingCalls = items.Sum(p => p.TotalDurationIncomingCalls),
  303. InAvailableAnswer = items.Sum(p => p.InAvailableAnswer),
  304. InHangupImmediateWhenAnswered = items.Sum(p => p.InHangupImmediateWhenAnswered),
  305. TimeoutConnection = items.Sum(p => p.TimeoutConnection),
  306. TimeoutSuspension = items.Sum(p => p.TimeoutSuspension),
  307. QueueByeCount = items.Sum(p => p.QueueByeCount),
  308. IvrByeCount = items.Sum(p => p.IvrByeCount),
  309. OutTotal = items.Sum(p => p.OutTotal),
  310. OutConnectionQuantity = items.Sum(p => p.OutConnectionQuantity)
  311. };
  312. })
  313. , "话务日期明细-时间段");
  314. /// <summary>
  315. /// 坐席话务统计分析
  316. /// </summary>
  317. /// <param name="dto"></param>
  318. /// <returns></returns>
  319. [HttpPost("seats/export")]
  320. public async Task<FileStreamResult> ExportSeatss([FromBody] ExportExcelDto<ReportRequiredPagedRequest> dto)
  321. {
  322. return ExcelStreamResult(
  323. _exportApplication.GetExcelStream(
  324. dto,
  325. await _callReportApplication.QuerySeatCallAsync(dto.QueryDto, HttpContext.RequestAborted),
  326. list =>
  327. {
  328. return new BiSeatCallsDto()
  329. {
  330. Name = "合计",
  331. InTotal = list.Sum(p => p.InTotal),
  332. InAnswered = list.Sum(p => p.InAnswered),
  333. InHangupImmediate = list.Sum(p => p.InHangupImmediate),
  334. InHanguped = list.Sum(m => m.InHanguped),
  335. OutDurationAvg = list.Sum(m => m.OutDurationAvg),
  336. InAvailableAnswer = list.Sum(m => m.InAvailableAnswer),
  337. InHangupImmediateWhenAnswered = list.Sum(m => m.InHangupImmediateWhenAnswered),
  338. OutTotal = list.Sum(m => m.OutTotal),
  339. OutAnswered = list.Sum(m => m.OutAnswered),
  340. LoginDuration = list.Sum(m => m.LoginDuration),
  341. RestDuration = list.Sum(m => m.RestDuration),
  342. InDurationAvg = list.Sum(m => m.InDurationAvg)
  343. };
  344. })
  345. , "坐席话务统计分析");
  346. }
  347. /// <summary>
  348. /// 坐席话务统计分析
  349. /// </summary>
  350. /// <param name="dto"></param>
  351. /// <returns></returns>
  352. [HttpGet("seats")]
  353. [AllowAnonymous]
  354. public async Task<IReadOnlyList<BiSeatCallsDto>> QuerySeatCallsAsync([FromQuery] ReportRequiredPagedRequest dto)
  355. => await _callReportApplication.QuerySeatCallAsync(dto, HttpContext.RequestAborted);
  356. /// <summary>
  357. /// 小休统计
  358. /// </summary>
  359. /// <param name="dto"></param>
  360. /// <returns></returns>
  361. [HttpGet("rests")]
  362. [AllowAnonymous]
  363. public async Task<IReadOnlyList<BiSeatRestDto>> QuerySeatRest([FromQuery] QuerySeatRestRequest dto)
  364. {
  365. return await _telRestRepository.Queryable()
  366. .WhereIF(!string.IsNullOrEmpty(dto.UserName), x => x.UserName.Contains(dto.UserName))
  367. .WhereIF(!string.IsNullOrEmpty(dto.StaffNo), x => x.StaffNo.Contains(dto.StaffNo))
  368. .Where(x => x.CreationTime >= dto.StartTime)
  369. .Where(x => x.CreationTime <= dto.EndTime)
  370. .GroupBy(x => new { x.UserId, x.StaffNo, x.UserName })
  371. .Select(x => new BiSeatRestDto
  372. {
  373. UserId = x.UserId,
  374. StaffNo = x.StaffNo,
  375. UserName = x.UserName,
  376. RestCount = SqlFunc.AggregateCount(x.Id),
  377. RestDuration = SqlFunc.AggregateSum(x.RestDuration / 60) / SqlFunc.AggregateCount(x.Id),
  378. CumulativeDuration = SqlFunc.AggregateSum(x.RestDuration / 60)
  379. })
  380. .OrderByIF(dto.SortRule is 0, a => a.RestDuration, OrderByType.Asc)
  381. .OrderByIF(dto.SortRule is 1, a => a.RestDuration, OrderByType.Desc)
  382. .MergeTable()
  383. .ToListAsync(HttpContext.RequestAborted);
  384. }
  385. /// <summary>
  386. /// 坐席转接统计
  387. /// </summary>
  388. /// <param name="dto"></param>
  389. /// <returns></returns>
  390. [HttpGet("seatswitch")]
  391. [AllowAnonymous]
  392. public async Task<PagedDto<BiSeatSwitchDto>> QuerySeatSwitch([FromQuery] QuerySeatSwitchRequest dto)
  393. {
  394. var (total, items) = await _callReportApplication.QuerySeatSwitchAsync(dto, HttpContext.RequestAborted);
  395. return new PagedDto<BiSeatSwitchDto>(total, items);
  396. }
  397. /// <summary>
  398. /// 小时统计
  399. /// </summary>
  400. /// <returns></returns>
  401. [HttpGet("hourcall")]
  402. [AllowAnonymous]
  403. public async Task<List<TrCallHourDto>> QueryHourCall([FromQuery] BiQueryHourCallDto dto)
  404. => await _callReportApplication.GetCallHourListAsync(dto, HttpContext.RequestAborted);
  405. /// <summary>
  406. /// 小时统计--导出
  407. /// </summary>
  408. /// <returns></returns>
  409. [HttpPost("hourcall/export")]
  410. [AllowAnonymous]
  411. public async Task<FileStreamResult> ExportQueryHourCall([FromBody] ExportExcelDto<BiQueryHourCallDto> dto)
  412. => ExcelStreamResult(
  413. _exportApplication.GetExcelStream(
  414. dto,
  415. await _callReportApplication.GetCallHourListAsync(dto.QueryDto, HttpContext.RequestAborted),
  416. list =>
  417. {
  418. return new TrCallHourDto()
  419. {
  420. HourTo = "合计",
  421. EffectiveCount = list.Sum(p => p.EffectiveCount),
  422. ConnectByeCount = list.Sum(p => p.ConnectByeCount),
  423. NoConnectByeCount = list.Sum(p => p.NoConnectByeCount),
  424. QueueByeCount = list.Sum(m => m.QueueByeCount),
  425. IvrByeCount = list.Sum(m => m.IvrByeCount)
  426. };
  427. })
  428. , "通话时段分析");
  429. /// <summary>
  430. /// 通话时段统计明细
  431. /// </summary>
  432. /// <returns></returns>
  433. [HttpGet("hourcall_list")]
  434. public async Task<object> QueryCallList([FromQuery] QueryCallListDto dto)
  435. => await _callReportApplication.GetCallListAsync(dto, HttpContext.RequestAborted);
  436. /// <summary>
  437. /// 通话时段统计明细获取基本信息
  438. /// </summary>
  439. /// <param name="id"></param>
  440. /// <returns></returns>
  441. [HttpGet("hourcall_list_base")]
  442. public async Task<object> ReTransactBaseData()
  443. => _baseDataApplication
  444. .CallForwardingType()
  445. .CallForwardingSource()
  446. .Build();
  447. /// <summary>
  448. /// 热线号码统计
  449. /// </summary>
  450. /// <param name="StartTime"></param>
  451. /// <param name="EndTime"></param>
  452. /// <returns></returns>
  453. [AllowAnonymous]
  454. [HttpGet("gateway-query")]
  455. public async Task<List<CallHotLineDto>> QueryGateWay([FromQuery] BiQueryGateWayDto dto)
  456. => await _callReportApplication.GetCallHotLineListAsync(dto, HttpContext.RequestAborted);
  457. /// <summary>
  458. /// 热线号码统计导出
  459. /// </summary>
  460. /// <param name="dto"></param>
  461. /// <returns></returns>
  462. [HttpPost("gateway-query/export")]
  463. public async Task<FileStreamResult> ExportQueryGatetWay(ExportExcelDto<BiQueryGateWayDto> dto)
  464. => ExcelStreamResult(
  465. _exportApplication.GetExcelStream(
  466. dto,
  467. await _callReportApplication.GetCallHotLineListAsync(dto.QueryDto, HttpContext.RequestAborted)
  468. )
  469. , "热线号码统计");
  470. }