BiCallController.cs 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806
  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. using Hotline.Settings;
  23. using XF.Utility.EnumExtensions;
  24. using Hotline.Share.Enums.CallCenter;
  25. using Hotline.Repository.SqlSugar.Extensions;
  26. namespace Hotline.Api.Controllers.Bi;
  27. /// <summary>
  28. /// 话务报表
  29. /// </summary>
  30. public class BiCallController : BaseController
  31. {
  32. private readonly IRepository<TrCallRecord> _trCallRecordRepository;
  33. private readonly BaseDataApplication _baseDataApplication;
  34. private readonly IRepository<User> _userRepository;
  35. private readonly IRepository<TelRest> _telRestRepository;
  36. private readonly IMapper _mapper;
  37. private readonly ISystemSettingCacheManager _systemSettingCacheManager;
  38. private readonly IRepository<Work> _workRepository;
  39. private readonly ISystemDicDataCacheManager _sysDicDataCacheManager;
  40. private readonly ICallReportApplication _callReportApplication;
  41. private readonly IExportApplication _exportApplication;
  42. public BiCallController(
  43. IRepository<TrCallRecord> trCallRecordRepository,
  44. IRepository<User> userRepository,
  45. IRepository<TelRest> telRestRepository,
  46. IMapper mapper,
  47. ISystemSettingCacheManager systemSettingCacheManager,
  48. ISystemDicDataCacheManager sysDicDataCacheManager,
  49. IRepository<Work> workRepository,
  50. ICallReportApplication callReportApplication,
  51. IExportApplication exportApplication,
  52. BaseDataApplication baseDataApplication)
  53. {
  54. _trCallRecordRepository = trCallRecordRepository;
  55. _userRepository = userRepository;
  56. _telRestRepository = telRestRepository;
  57. _mapper = mapper;
  58. _systemSettingCacheManager = systemSettingCacheManager;
  59. _workRepository = workRepository;
  60. _sysDicDataCacheManager = sysDicDataCacheManager;
  61. _callReportApplication = callReportApplication;
  62. _exportApplication = exportApplication;
  63. _baseDataApplication = baseDataApplication;
  64. }
  65. /// <summary>
  66. /// 话务统计分析
  67. /// </summary>
  68. /// <param name="dto"></param>
  69. /// <returns></returns>
  70. [HttpGet("calls")]
  71. [AllowAnonymous]
  72. public async Task<List<BiCallDto>> QueryCallsAsync([FromQuery] BiQueryCallsDto dto)
  73. => await _callReportApplication.QueryCallsAsync(dto, HttpContext.RequestAborted);
  74. /// <summary>
  75. /// 话务统计分析---导出
  76. /// </summary>
  77. /// <param name="dto"></param>
  78. /// <returns></returns>
  79. [HttpPost("calls_export")]
  80. [AllowAnonymous]
  81. public async Task<FileStreamResult> ExportQueryCallsAsync([FromBody] ExportExcelDto<BiQueryCallsDto> dto)
  82. => ExcelStreamResult(
  83. _exportApplication.GetExcelStream(
  84. dto,
  85. await _callReportApplication.QueryCallsAsync(dto.QueryDto, HttpContext.RequestAborted),
  86. list =>
  87. {
  88. return new BiCallDto()
  89. {
  90. HourRange = "合计",
  91. Hour = 13,
  92. Total = list.Sum(p => p.Total),
  93. Answered = list.Sum(p => p.Answered),
  94. Hanguped = list.Sum(p => p.Hanguped)
  95. };
  96. }),
  97. "话务统计分析");
  98. /// <summary>
  99. /// 话务日期统计
  100. /// </summary>
  101. /// <param name="dto"></param>
  102. /// <returns></returns>
  103. [HttpGet("query_calls_statistics")]
  104. public async Task<TotalList<QueryCallsDetailStatistics>> QueryCallsStatisticsAsync([FromQuery] StartEndTimeDto dto)
  105. {
  106. var items = await _callReportApplication.QueryCallsDetailStatisticsAsync(dto, HttpContext.RequestAborted);
  107. var total = new QueryCallsDetailStatistics
  108. {
  109. Date = "合计",
  110. //InTotal = items.Sum(m => m.InTotal),
  111. NotAcceptedHang = items.Sum(m => m.NotAcceptedHang),
  112. InConnectionQuantity = items.Sum(m => m.InConnectionQuantity),
  113. InNotAnswered = items.Sum(m => m.InNotAnswered),
  114. IvrByeCount = items.Sum(m => m.IvrByeCount),
  115. OutConnectionQuantity = items.Sum(m => m.OutConnectionQuantity),
  116. OutNotAnswered = items.Sum(m => m.OutNotAnswered)
  117. };
  118. return new TotalList<QueryCallsDetailStatistics>(items, total);
  119. }
  120. /// <summary>
  121. /// 话务日期统计-导出
  122. /// </summary>
  123. /// <param name="dto"></param>
  124. /// <returns></returns>
  125. [HttpPost("query_calls_statistics_export")]
  126. public async Task<FileStreamResult> QueryCallsStatisticsExportAsync([FromBody] ExportExcelDto<StartEndTimeDto> dto)
  127. {
  128. var items = (await _callReportApplication.QueryCallsDetailStatisticsAsync(dto.QueryDto, HttpContext.RequestAborted));
  129. return _exportApplication.GetExcelFile(dto, items, "话务日期统计", "Date");
  130. }
  131. /// <summary>
  132. /// 话务日期统计详情
  133. /// </summary>
  134. /// <param name="dto"></param>
  135. /// <returns></returns>
  136. [HttpGet("query_calls_statistics_detail")]
  137. public async Task<PagedDto<QueryCallsStatisticsDetailOutDto>> QueryCallsStatisticsDetailAsync([FromQuery] QueryCallsStatisticsDetailInDto dto)
  138. => (await _callReportApplication.QueryCallsStatisticsDetailAsync(dto, HttpContext.RequestAborted))
  139. .ToPaged();
  140. /// <summary>
  141. /// 话务日期统计详情--导出
  142. /// </summary>
  143. /// <param name="dto"></param>
  144. /// <returns></returns>
  145. [HttpPost("query_calls_statistics_detail/export")]
  146. public async Task<FileStreamResult> QueryCallsStatisticsDetailAsync([FromBody] ExportExcelDto<QueryCallsStatisticsDetailInDto> dto)
  147. {
  148. var items = (await _callReportApplication.QueryCallsStatisticsDetailAsync(dto.QueryDto, HttpContext.RequestAborted)).Item2;
  149. return _exportApplication.GetExcelFile(dto, items, "话务日期统计详情", "OrderNo");
  150. }
  151. /// <summary>
  152. /// 话务日期统计详情页面基础数据
  153. /// </summary>
  154. /// <param name="dto"></param>
  155. /// <returns></returns>
  156. [HttpGet("query_calls_statistics_detail/base-data")]
  157. public Dictionary<string, dynamic> QueryCallsStatisticsDetailBaseData()
  158. {
  159. return new Dictionary<string, dynamic>
  160. {
  161. { "endBy", EnumExts.GetDescriptions<EEndBy>() }
  162. };
  163. }
  164. /// <summary>
  165. /// 话务日期明细
  166. /// </summary>
  167. /// <param name="dto"></param>
  168. /// <returns></returns>
  169. [HttpGet("query_calls_detail")]
  170. public async Task<object> QueryCallsDetailAsync([FromQuery] BiQueryCallsDto dto)
  171. {
  172. var items = await _callReportApplication.QueryCallsDetailAsync(dto);
  173. var total = new QueryCallsDetailDto
  174. {
  175. Date = "合计",
  176. Hour = "",
  177. InTotal = items.Sum(p => p.InTotal),
  178. InConnectionQuantity = items.Sum(p => p.InConnectionQuantity),
  179. NotAcceptedHang = items.Sum(p => p.NotAcceptedHang),
  180. TotalDurationIncomingCalls = items.Sum(p => p.TotalDurationIncomingCalls),
  181. InAvailableAnswer = items.Sum(p => p.InAvailableAnswer),
  182. InHangupImmediateWhenAnswered = items.Sum(p => p.InHangupImmediateWhenAnswered),
  183. TimeoutConnection = items.Sum(p => p.TimeoutConnection),
  184. TimeoutSuspension = items.Sum(p => p.TimeoutSuspension),
  185. QueueByeCount = items.Sum(p => p.QueueByeCount),
  186. IvrByeCount = items.Sum(p => p.IvrByeCount),
  187. OutTotal = items.Sum(p => p.OutTotal),
  188. OutConnectionQuantity = items.Sum(p => p.OutConnectionQuantity)
  189. };
  190. return new { List = items, Total = total };
  191. }
  192. /// <summary>
  193. /// 话务日期明细--导出
  194. /// </summary>
  195. /// <param name="dto"></param>
  196. /// <returns></returns>
  197. [HttpPost("query_calls_detail_export")]
  198. public async Task<FileStreamResult> QueryCallsDetailExportAsync([FromBody] ExportExcelDto<BiQueryCallsDto> dto)
  199. {
  200. return ExcelStreamResult(
  201. _exportApplication.GetExcelStream(
  202. dto,
  203. await _callReportApplication.QueryCallsDetailAsync(dto.QueryDto),
  204. items =>
  205. {
  206. return new QueryCallsDetailDto
  207. {
  208. Date = "合计",
  209. Hour = "",
  210. InTotal = items.Sum(p => p.InTotal),
  211. InConnectionQuantity = items.Sum(p => p.InConnectionQuantity),
  212. NotAcceptedHang = items.Sum(p => p.NotAcceptedHang),
  213. TotalDurationIncomingCalls = items.Sum(p => p.TotalDurationIncomingCalls),
  214. InAvailableAnswer = items.Sum(p => p.InAvailableAnswer),
  215. InHangupImmediateWhenAnswered = items.Sum(p => p.InHangupImmediateWhenAnswered),
  216. TimeoutConnection = items.Sum(p => p.TimeoutConnection),
  217. TimeoutSuspension = items.Sum(p => p.TimeoutSuspension),
  218. QueueByeCount = items.Sum(p => p.QueueByeCount),
  219. IvrByeCount = items.Sum(p => p.IvrByeCount),
  220. OutTotal = items.Sum(p => p.OutTotal),
  221. OutConnectionQuantity = items.Sum(p => p.OutConnectionQuantity)
  222. };
  223. })
  224. , "话务日期明细数据");
  225. }
  226. /// <summary>
  227. /// 话务日期明细--呼入明细
  228. /// </summary>
  229. /// <param name="dto"></param>
  230. /// <returns></returns>
  231. [HttpGet("query_incall_calls_list")]
  232. public async Task<PagedDto<CallRecordOutDto>> GetInCallCallListAsync([FromQuery] BiQueryCallsDto dto)
  233. {
  234. var (total, items) = await _callReportApplication.QueryCallsDetailInTotalAsync(dto, false);
  235. return new PagedDto<CallRecordOutDto>(total, items);
  236. }
  237. /// <summary>
  238. /// 话务日期明细----导出
  239. /// </summary>
  240. /// <param name="dto"></param>
  241. /// <returns></returns>
  242. [HttpPost("query_incall_calls_list_export")]
  243. public async Task<FileStreamResult> GetInCallCallListExportAsync([FromBody] ExportExcelDto<BiQueryCallsDto> dto)
  244. {
  245. var (total, data) = await _callReportApplication.QueryCallsDetailInTotalAsync(dto.QueryDto, dto.IsExportAll);
  246. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<CallRecordOutDto>(dto.ColumnInfos);
  247. var dtos = data
  248. .Select(stu => _mapper.Map(stu, typeof(CallRecordOutDto), dynamicClass))
  249. .Cast<object>()
  250. .ToList();
  251. var stream = ExcelHelper.CreateStream(dtos);
  252. return ExcelStreamResult(
  253. _exportApplication.GetExcelStream(
  254. dto,
  255. (await _callReportApplication.QueryCallsDetailInTotalAsync(dto.QueryDto, dto.IsExportAll)).Item2
  256. ),
  257. dto.QueryDto.TypeCode == "2" ? "话务日期-接通明细数据" : "话务日期-总量明细数据");
  258. }
  259. /// <summary>
  260. /// 话务日期明细--时间段
  261. /// </summary>
  262. /// <param name="dto"></param>
  263. /// <returns></returns>
  264. [HttpGet("query_calls_hour_detail_list")]
  265. public async Task<TotalList<QueryCallsDetailDto>> QueryCallsHourDetailListAsync([FromQuery] BiQueryCallsDto dto)
  266. {
  267. var items = await _callReportApplication.QueryCallsHourDetailAsync(dto, HttpContext.RequestAborted);
  268. var total = new QueryCallsDetailDto
  269. {
  270. Date = "",
  271. Hour = "合计",
  272. InTotal = items.Sum(p => p.InTotal),
  273. InConnectionQuantity = items.Sum(p => p.InConnectionQuantity),
  274. NotAcceptedHang = items.Sum(p => p.NotAcceptedHang),
  275. TotalDurationIncomingCalls = items.Sum(p => p.TotalDurationIncomingCalls),
  276. InAvailableAnswer = items.Sum(p => p.InAvailableAnswer),
  277. InHangupImmediateWhenAnswered = items.Sum(p => p.InHangupImmediateWhenAnswered),
  278. TimeoutConnection = items.Sum(p => p.TimeoutConnection),
  279. TimeoutSuspension = items.Sum(p => p.TimeoutSuspension),
  280. QueueByeCount = items.Sum(p => p.QueueByeCount),
  281. IvrByeCount = items.Sum(p => p.IvrByeCount),
  282. OutTotal = items.Sum(p => p.OutTotal),
  283. OutConnectionQuantity = items.Sum(p => p.OutConnectionQuantity)
  284. };
  285. return new TotalList<QueryCallsDetailDto>(items, total);
  286. }
  287. /// <summary>
  288. /// 话务日期明细--时间段--导出
  289. /// </summary>
  290. /// <param name="dto"></param>
  291. /// <returns></returns>
  292. [HttpPost("query_calls_hour_detail_list_export")]
  293. public async Task<FileStreamResult> QueryCallsHourDetailListExportAsync([FromBody] ExportExcelDto<BiQueryCallsDto> dto)
  294. => ExcelStreamResult(
  295. _exportApplication.GetExcelStream(
  296. dto,
  297. await _callReportApplication.QueryCallsHourDetailAsync(dto.QueryDto, HttpContext.RequestAborted),
  298. items =>
  299. {
  300. return new QueryCallsDetailDto
  301. {
  302. Date = "",
  303. Hour = "合计",
  304. InTotal = items.Sum(p => p.InTotal),
  305. InConnectionQuantity = items.Sum(p => p.InConnectionQuantity),
  306. NotAcceptedHang = items.Sum(p => p.NotAcceptedHang),
  307. TotalDurationIncomingCalls = items.Sum(p => p.TotalDurationIncomingCalls),
  308. InAvailableAnswer = items.Sum(p => p.InAvailableAnswer),
  309. InHangupImmediateWhenAnswered = items.Sum(p => p.InHangupImmediateWhenAnswered),
  310. TimeoutConnection = items.Sum(p => p.TimeoutConnection),
  311. TimeoutSuspension = items.Sum(p => p.TimeoutSuspension),
  312. QueueByeCount = items.Sum(p => p.QueueByeCount),
  313. IvrByeCount = items.Sum(p => p.IvrByeCount),
  314. OutTotal = items.Sum(p => p.OutTotal),
  315. OutConnectionQuantity = items.Sum(p => p.OutConnectionQuantity)
  316. };
  317. })
  318. , "话务日期明细-时间段");
  319. /// <summary>
  320. /// 坐席话务统计分析
  321. /// </summary>
  322. /// <param name="dto"></param>
  323. /// <returns></returns>
  324. [HttpPost("seats/export")]
  325. public async Task<FileStreamResult> ExportSeatss([FromBody] ExportExcelDto<ReportRequiredPagedRequest> dto)
  326. {
  327. return ExcelStreamResult(
  328. _exportApplication.GetExcelStream(
  329. dto,
  330. await _callReportApplication.QuerySeatCallAsync(dto.QueryDto, HttpContext.RequestAborted),
  331. list =>
  332. {
  333. return new BiSeatCallsDto()
  334. {
  335. Name = "合计",
  336. InTotal = list.Sum(p => p.InTotal),
  337. InAnswered = list.Sum(p => p.InAnswered),
  338. InHangupImmediate = list.Sum(p => p.InHangupImmediate),
  339. InHanguped = list.Sum(m => m.InHanguped),
  340. OutDurationAvg = list.Sum(m => m.OutDurationAvg),
  341. InAvailableAnswer = list.Sum(m => m.InAvailableAnswer),
  342. InHangupImmediateWhenAnswered = list.Sum(m => m.InHangupImmediateWhenAnswered),
  343. OutTotal = list.Sum(m => m.OutTotal),
  344. OutAnswered = list.Sum(m => m.OutAnswered),
  345. LoginDuration = list.Sum(m => m.LoginDuration),
  346. RestDuration = list.Sum(m => m.RestDuration),
  347. InDurationAvg = list.Sum(m => m.InDurationAvg)
  348. };
  349. })
  350. , "坐席话务统计分析");
  351. }
  352. /// <summary>
  353. /// 坐席话务统计分析
  354. /// </summary>
  355. /// <param name="dto"></param>
  356. /// <returns></returns>
  357. [HttpGet("seats")]
  358. [AllowAnonymous]
  359. public async Task<IReadOnlyList<BiSeatCallsDto>> QuerySeatCallsAsync([FromQuery] ReportRequiredPagedRequest dto)
  360. => await _callReportApplication.QuerySeatCallAsync(dto, HttpContext.RequestAborted);
  361. /// <summary>
  362. /// 小休统计
  363. /// </summary>
  364. /// <param name="dto"></param>
  365. /// <returns></returns>
  366. [HttpGet("rests")]
  367. [AllowAnonymous]
  368. public async Task<IReadOnlyList<BiSeatRestDto>> QuerySeatRest([FromQuery] QuerySeatRestRequest dto)
  369. {
  370. return await _telRestRepository.Queryable()
  371. .WhereIF(!string.IsNullOrEmpty(dto.UserName), x => x.UserName.Contains(dto.UserName))
  372. .WhereIF(!string.IsNullOrEmpty(dto.StaffNo), x => x.StaffNo.Contains(dto.StaffNo))
  373. .Where(x => x.CreationTime >= dto.StartTime)
  374. .Where(x => x.CreationTime <= dto.EndTime)
  375. .GroupBy(x => new { x.UserId, x.StaffNo, x.UserName })
  376. .Select(x => new BiSeatRestDto
  377. {
  378. UserId = x.UserId,
  379. StaffNo = x.StaffNo,
  380. UserName = x.UserName,
  381. RestCount = SqlFunc.AggregateCount(x.Id),
  382. RestDuration = SqlFunc.AggregateSum(x.RestDuration / 60) / SqlFunc.AggregateCount(x.Id),
  383. CumulativeDuration = SqlFunc.AggregateSum(x.RestDuration / 60)
  384. })
  385. .OrderByIF(dto.SortRule is 0, a => a.RestDuration, OrderByType.Asc)
  386. .OrderByIF(dto.SortRule is 1, a => a.RestDuration, OrderByType.Desc)
  387. .MergeTable()
  388. .ToListAsync(HttpContext.RequestAborted);
  389. }
  390. /// <summary>
  391. /// 坐席转接统计
  392. /// </summary>
  393. /// <param name="dto"></param>
  394. /// <returns></returns>
  395. [HttpGet("seatswitch")]
  396. [AllowAnonymous]
  397. public async Task<PagedDto<BiSeatSwitchDto>> QuerySeatSwitch([FromQuery] QuerySeatSwitchRequest dto)
  398. {
  399. var (total, items) = await _callReportApplication.QuerySeatSwitchAsync(dto, HttpContext.RequestAborted);
  400. return new PagedDto<BiSeatSwitchDto>(total, items);
  401. }
  402. /// <summary>
  403. /// 小时统计
  404. /// </summary>
  405. /// <returns></returns>
  406. [HttpGet("hourcall")]
  407. [AllowAnonymous]
  408. public async Task<List<TrCallHourDto>> QueryHourCall([FromQuery] BiQueryHourCallDto dto)
  409. => await _callReportApplication.GetCallHourListAsync(dto, HttpContext.RequestAborted);
  410. /// <summary>
  411. /// 小时统计--导出
  412. /// </summary>
  413. /// <returns></returns>
  414. [HttpPost("hourcall/export")]
  415. [AllowAnonymous]
  416. public async Task<FileStreamResult> ExportQueryHourCall([FromBody] ExportExcelDto<BiQueryHourCallDto> dto)
  417. => ExcelStreamResult(
  418. _exportApplication.GetExcelStream(
  419. dto,
  420. await _callReportApplication.GetCallHourListAsync(dto.QueryDto, HttpContext.RequestAborted),
  421. list =>
  422. {
  423. return new TrCallHourDto()
  424. {
  425. HourTo = "合计",
  426. EffectiveCount = list.Sum(p => p.EffectiveCount),
  427. ConnectByeCount = list.Sum(p => p.ConnectByeCount),
  428. NoConnectByeCount = list.Sum(p => p.NoConnectByeCount),
  429. QueueByeCount = list.Sum(m => m.QueueByeCount),
  430. IvrByeCount = list.Sum(m => m.IvrByeCount)
  431. };
  432. })
  433. , "通话时段分析");
  434. /// <summary>
  435. /// 通话时段统计明细
  436. /// </summary>
  437. /// <returns></returns>
  438. [HttpGet("hourcall_list")]
  439. public async Task<PagedDto<BiSeatSwitchDto>> QueryCallList([FromQuery] QueryCallListDto dto)
  440. {
  441. var res = await _callReportApplication.GetCallListAsync(dto, HttpContext.RequestAborted);
  442. return new PagedDto<BiSeatSwitchDto>(res.Total, res.Data);
  443. }
  444. /// <summary>
  445. /// 通话时段统计明细 导出
  446. /// </summary>
  447. /// <param name="dto"></param>
  448. /// <returns></returns>
  449. [HttpPost("hourcall_list/export")]
  450. public async Task<FileStreamResult> ExportQueryCallList([FromBody] ExportExcelDto<QueryCallListDto> dto)
  451. {
  452. foreach (var item in dto.ColumnInfos)
  453. {
  454. if (item.Prop == "cpn" || item.Prop == "cdpn")
  455. {
  456. item.Prop = item.Prop.ToUpper();
  457. }
  458. }
  459. return ExcelStreamResult(
  460. _exportApplication.GetExcelStream(
  461. dto,
  462. (await _callReportApplication.GetCallListAsync(dto.QueryDto, HttpContext.RequestAborted)).Data)
  463. , "通话时段分析");
  464. }
  465. /// <summary>
  466. /// 通话时段统计明细获取基本信息
  467. /// </summary>
  468. /// <param name="id"></param>
  469. /// <returns></returns>
  470. [HttpGet("hourcall_list_base")]
  471. public async Task<object> ReTransactBaseData()
  472. {
  473. var rsp = new
  474. {
  475. CallForwardingSource = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.CallForwardingSource),
  476. CallForwardingType = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.CallForwardingType),
  477. };
  478. return rsp;
  479. }
  480. /// <summary>
  481. /// 热线号码统计
  482. /// </summary>
  483. /// <param name="StartTime"></param>
  484. /// <param name="EndTime"></param>
  485. /// <returns></returns>
  486. [AllowAnonymous]
  487. [HttpGet("gateway-query")]
  488. public async Task<List<CallHotLineDto>> QueryGateWay([FromQuery] BiQueryGateWayDto dto)
  489. => await _callReportApplication.GetCallHotLineListAsync(dto, HttpContext.RequestAborted);
  490. /// <summary>
  491. /// 热线号码统计导出
  492. /// </summary>
  493. /// <param name="dto"></param>
  494. /// <returns></returns>
  495. [HttpPost("gateway-query/export")]
  496. public async Task<FileStreamResult> ExportQueryGatetWay(ExportExcelDto<BiQueryGateWayDto> dto)
  497. => ExcelStreamResult(
  498. _exportApplication.GetExcelStream(
  499. dto,
  500. await _callReportApplication.GetCallHotLineListAsync(dto.QueryDto, HttpContext.RequestAborted)
  501. )
  502. , "热线号码统计");
  503. #region 宜宾话务表
  504. /// <summary>
  505. /// 话务日期统计明细
  506. /// </summary>
  507. /// <param name="dto"></param>
  508. /// <returns></returns>
  509. [HttpGet("query-calldate-statistics")]
  510. public async Task<object> QueryCallDateStatisticsDetail([FromQuery] QueryCallDateStatisticsDetailDto dto)
  511. {
  512. var list = await _callReportApplication.QueryCallDateStatisticsDetail(dto);
  513. var total = new QueryCallDateStatisticsDetailResp() {
  514. Date = "合计",
  515. IvrCallInTotal = list.Sum(x=>x.IvrCallInTotal),
  516. PersonCallInCount = list.Sum(x=>x.PersonCallInCount),
  517. EnterpriseCallInCount = list.Sum(x=>x.EnterpriseCallInCount),
  518. GaoXiaoCallInCount = list.Sum(x=>x.GaoXiaoCallInCount), //高效办成一件事
  519. AiCallInCount = list.Sum(x=>x.AiCallInCount),
  520. PersonCallInPutthroughCount = list.Sum(x=>x.PersonCallInPutthroughCount),
  521. EnterpriseCallInPutthroughCount = list.Sum(x=>x.EnterpriseCallInPutthroughCount),
  522. GaoXiaoCallInPutthroughCount = list.Sum(x=>x.GaoXiaoCallInPutthroughCount),
  523. AiCallInPutthroughCount = list.Sum(x=>x.AiCallInPutthroughCount),
  524. PersonRingOffCount = list.Sum(x=>x.PersonRingOffCount),//个人服务挂断
  525. EnterpriseRingOffCount = list.Sum(x=>x.EnterpriseRingOffCount), //企业挂断
  526. GaoXiaoRingOffCount = list.Sum(x=>x.GaoXiaoRingOffCount),
  527. IvrRingOffCount = list.Sum(x=>x.IvrRingOffCount), //IVR挂断
  528. };
  529. return new { List = list, Total = total };
  530. }
  531. /// <summary>
  532. /// 话务日期统计明细导出
  533. /// </summary>
  534. /// <param name="dto"></param>
  535. /// <returns></returns>
  536. [HttpPost("query-calldate-statistics/export")]
  537. public async Task<FileStreamResult> QueryCallDateStatisticsDetailExport([FromBody]ExportExcelDto<QueryCallDateStatisticsDetailDto> dto)
  538. =>
  539. _exportApplication.GetExcelFile(
  540. dto,
  541. await _callReportApplication.QueryCallDateStatisticsDetail(dto.QueryDto)
  542. , "话务日期统计明细", "Date");
  543. /// <summary>
  544. /// 个人服务话务明细
  545. /// </summary>
  546. /// <param name="dto"></param>
  547. /// <returns></returns>
  548. [HttpGet("query-person-calldate-statistics")]
  549. public async Task<object> QueryPersonCallDateStatisticsDetail([FromQuery]QueryCallDateStatisticsDetailDto dto)
  550. {
  551. var list = await _callReportApplication.QueryPersonCallDateStatisticsDetail(dto);
  552. var total = new QueryPersonCallDateStatisticsDetailResp() {
  553. Date = "合计",
  554. PersonCallInCount = list.Sum(x=>x.PersonCallInCount),
  555. PersonCallInPutthroughCount = list.Sum(x=>x.PersonCallInPutthroughCount),
  556. //PersonRingOffCount = list.Sum(x=>x.PersonRingOffCount),//个人服务挂断
  557. PersonQueueOffCount = list.Sum(x=>x.PersonQueueOffCount),//个人服务队列挂断
  558. PersonWaitOffCount = list.Sum(x=>x.PersonWaitOffCount) //个人服务等待挂断
  559. };
  560. return new { List = list, Total = total };
  561. }
  562. /// <summary>
  563. /// 个人服务话务明细导出
  564. /// </summary>
  565. /// <param name="dto"></param>
  566. /// <returns></returns>
  567. [HttpPost("query-person-calldate-statistics/export")]
  568. public async Task<FileStreamResult> QueryPersonCallDateStatisticsDetailExport([FromBody]ExportExcelDto<QueryCallDateStatisticsDetailDto> dto)
  569. => _exportApplication.GetExcelFile(
  570. dto,
  571. await _callReportApplication.QueryPersonCallDateStatisticsDetail(dto.QueryDto)
  572. , "个人服务话务明细","Date");
  573. /// <summary>
  574. /// 企业服务话务明细
  575. /// </summary>
  576. /// <param name="dto"></param>
  577. /// <returns></returns>
  578. [HttpGet("query-enterprise-calldate-statistics")]
  579. public async Task<object> QueryEnterpriseCallDateStatisticsDetail([FromQuery]QueryCallDateStatisticsDetailDto dto)
  580. {
  581. var list = await _callReportApplication.QueryEnterpriseCallDateStatisticsDetail(dto);
  582. var total = new QueryEnterpriseCallDateStatisticsDetailResp() {
  583. Date = "合计",
  584. EnterpriseCallInCount = list.Sum(x=>x.EnterpriseCallInCount),
  585. EnterpriseCallInPutthroughCount = list.Sum(x=>x.EnterpriseCallInPutthroughCount),
  586. //EnterpriseRingOffCount = list.Sum(x=>x.EnterpriseRingOffCount), //企业挂断
  587. EnterpriseQueueOffCount = list.Sum(x=>x.EnterpriseQueueOffCount),//个人服务队列挂断
  588. EnterpriseWaitOffCount = list.Sum(x=>x.EnterpriseWaitOffCount) //个人服务等待挂断
  589. };
  590. return new { List = list, Total = total };
  591. }
  592. /// <summary>
  593. /// 企业服务话务明细导出
  594. /// </summary>
  595. /// <param name="dto"></param>
  596. /// <returns></returns>
  597. [HttpPost("query-enterprise-calldate-statistics/export")]
  598. public async Task<FileStreamResult> QueryEnterpriseCallDateStatisticsDetailExport([FromBody]ExportExcelDto<QueryCallDateStatisticsDetailDto> dto)
  599. => _exportApplication.GetExcelFile(
  600. dto,
  601. await _callReportApplication.QueryEnterpriseCallDateStatisticsDetail(dto.QueryDto)
  602. , "企业服务话务明细","Date");
  603. /// <summary>
  604. /// 呼出话务统计明细
  605. /// </summary>
  606. /// <param name="dto"></param>
  607. /// <returns></returns>
  608. [HttpGet("query-callout-date-statistics")]
  609. public async Task<object> QueryCallOutDateStatisticsDetail([FromQuery] QueryCallDateStatisticsDetailDto dto)
  610. {
  611. List<string> enterpriseTels = _systemSettingCacheManager.GetSetting(SettingConstants.EnterpriseTel)?.SettingValue;
  612. var list = await _callReportApplication.QueryCallOutDateStatisticsDetail(dto,enterpriseTels);
  613. var total = new QueryCallOutDateStatisticsDetailResp()
  614. {
  615. Date = "合计",
  616. PersonCallOutCount = list.Sum(x => x.PersonCallOutCount),
  617. EnterpriseCallOutCount = list.Sum(x => x.EnterpriseCallOutCount),
  618. AiVisitCallOutCount = list.Sum(x => x.AiVisitCallOutCount),
  619. AiCallOutCount = list.Sum(x => x.AiCallOutCount),
  620. PersonCallOutPutthroughCount = list.Sum(x => x.PersonCallOutPutthroughCount),
  621. EnterpriseCallOutPutthroughCount = list.Sum(x=>x.EnterpriseCallOutPutthroughCount),
  622. AiVisitCallOutPutthroughCount = list.Sum(x=>x.AiVisitCallOutPutthroughCount),
  623. AiCallOutPutthroughCount = list.Sum(x=>x.AiCallOutPutthroughCount)
  624. };
  625. return new { List = list, Total = total };
  626. }
  627. /// <summary>
  628. /// 呼出话务统计明细
  629. /// </summary>
  630. /// <param name="dto"></param>
  631. /// <returns></returns>
  632. [HttpPost("query-callout-date-statistics/export")]
  633. public async Task<FileStreamResult> QueryCallOutDateStatisticsDetailExport([FromBody]ExportExcelDto<QueryCallDateStatisticsDetailDto> dto)
  634. {
  635. List<string> enterpriseTels = _systemSettingCacheManager.GetSetting(SettingConstants.EnterpriseTel)?.SettingValue;
  636. return _exportApplication.GetExcelFile(
  637. dto,
  638. await _callReportApplication.QueryCallOutDateStatisticsDetail(dto.QueryDto,enterpriseTels)
  639. , "呼出话务统计明细", "Date");
  640. }
  641. /// <summary>
  642. /// 坐席月接通率统计
  643. /// </summary>
  644. /// <param name="dto"></param>
  645. /// <returns></returns>
  646. [HttpGet("query-seat-monthcall")]
  647. public async Task<object> QuerySeatMonthCall([FromQuery]QuerySeatMonthCallRequest dto)
  648. {
  649. var list = await _callReportApplication.QuerySeatMonthCall(dto);
  650. var total = new QuerySeatMonthCallResp()
  651. {
  652. Name = "合计",
  653. InAnswered = list.Sum(x => x.InAnswered),
  654. InAvailableAnswer = list.Sum(x => x.InAvailableAnswer),
  655. InHangupImmediateWhenAnswered = list.Sum(x => x.InHangupImmediateWhenAnswered),
  656. OverTimeImmediate = list.Sum(x => x.OverTimeImmediate),
  657. InTimeImmediate = list.Sum(x => x.InTimeImmediate),
  658. InHanguped = list.Sum(x => x.InHanguped),
  659. InHangupImmediate = list.Sum(x => x.InHangupImmediate),
  660. OverTimeInHanguped = list.Sum(x => x.OverTimeInHanguped),
  661. };
  662. return new { List = list, Total = total };
  663. }
  664. /// <summary>
  665. /// 坐席月接通率统计基础数据
  666. /// </summary>
  667. /// <returns></returns>
  668. [HttpGet("query-seat-monthcall-basedata")]
  669. public async Task<object> QuerySeatMonthCallBaseData()
  670. {
  671. var setting = _systemSettingCacheManager.GetSetting(SettingConstants.RoleZuoXi).SettingValue;
  672. return new
  673. {
  674. SeatUser =await _userRepository.Queryable().Includes(d => d.Roles).Where(d => d.Roles.Any(x => setting.Contains(x.Name))).ToListAsync()
  675. };
  676. }
  677. /// <summary>
  678. /// 坐席月接通率统计导出
  679. /// </summary>
  680. /// <param name="dto"></param>
  681. /// <returns></returns>
  682. [HttpPost("query-seat-monthcall/export")]
  683. public async Task<FileStreamResult> QuerySeatMonthCallExport([FromBody] ExportExcelDto<QuerySeatMonthCallRequest> dto)
  684. => _exportApplication.GetExcelFile(
  685. dto,
  686. await _callReportApplication.QuerySeatMonthCall(dto.QueryDto)
  687. , "坐席月接通率统计", "Name");
  688. /// <summary>
  689. /// 坐席月接通明细
  690. /// </summary>
  691. /// <param name="dto"></param>
  692. /// <returns></returns>
  693. [HttpGet("query-seat-monthcall-detail")]
  694. public async Task<PagedDto<QuerySeatMonthCallDetailResp>> QuerySeatMonthCallDetail([FromQuery] QuerySeatMonthCallDetailRequest dto)
  695. {
  696. var query = _callReportApplication.QuerySeatMonthCallDetail(dto);
  697. var(total, items) = await query.ToPagedListAsync(dto.PageIndex, dto.PageSize);
  698. return new PagedDto<QuerySeatMonthCallDetailResp>(total, items);
  699. }
  700. /// <summary>
  701. /// 坐席月接通明细导出
  702. /// </summary>
  703. /// <param name="dto"></param>
  704. /// <returns></returns>
  705. [HttpPost("query-seat-monthcall-detail/export")]
  706. public async Task<FileStreamResult> QuerySeatMonthCallDetailExport([FromBody] ExportExcelDto<QuerySeatMonthCallDetailRequest> dto)
  707. {
  708. var query = _callReportApplication.QuerySeatMonthCallDetail(dto.QueryDto);
  709. List<QuerySeatMonthCallDetailResp> data;
  710. if (dto.IsExportAll)
  711. {
  712. data = await query.ToListAsync(HttpContext.RequestAborted);
  713. }
  714. else
  715. {
  716. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  717. data = items;
  718. }
  719. var dataDtos = _mapper.Map<ICollection<QuerySeatMonthCallDetailResp>>(data);
  720. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<QuerySeatMonthCallDetailResp>(dto.ColumnInfos);
  721. var dtos = dataDtos
  722. .Select(stu => _mapper.Map(stu, typeof(QuerySeatMonthCallDetailResp), dynamicClass))
  723. .Cast<object>()
  724. .ToList();
  725. var stream = ExcelHelper.CreateStream(dtos);
  726. return ExcelStreamResult(stream, "坐席月接通明细");
  727. }
  728. #endregion
  729. }