using Hotline.Application.ExportExcel; using Hotline.Share.Tools; using Hotline.Application.StatisticalReport; using Hotline.Application.Systems; using Hotline.Caching.Interfaces; using Hotline.CallCenter.Calls; using Hotline.CallCenter.Tels; using Hotline.Share.Dtos; using Hotline.Share.Dtos.CallCenter; using Hotline.Share.Dtos.Order; using Hotline.Share.Dtos.TrCallCenter; using Hotline.Share.Requests; using Hotline.Tools; using Hotline.Users; using MapsterMapper; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using SqlSugar; using System.Data; using System.Linq.Dynamic.Core; using XF.Domain.Repository; using Hotline.Settings; using XF.Utility.EnumExtensions; using Hotline.Share.Enums.CallCenter; using Hotline.Repository.SqlSugar.Extensions; namespace Hotline.Api.Controllers.Bi; /// /// 话务报表 /// public class BiCallController : BaseController { private readonly IRepository _trCallRecordRepository; private readonly BaseDataApplication _baseDataApplication; private readonly IRepository _userRepository; private readonly IRepository _telRestRepository; private readonly IMapper _mapper; private readonly ISystemSettingCacheManager _systemSettingCacheManager; private readonly IRepository _workRepository; private readonly ISystemDicDataCacheManager _sysDicDataCacheManager; private readonly ICallReportApplication _callReportApplication; private readonly IExportApplication _exportApplication; public BiCallController( IRepository trCallRecordRepository, IRepository userRepository, IRepository telRestRepository, IMapper mapper, ISystemSettingCacheManager systemSettingCacheManager, ISystemDicDataCacheManager sysDicDataCacheManager, IRepository workRepository, ICallReportApplication callReportApplication, IExportApplication exportApplication, BaseDataApplication baseDataApplication) { _trCallRecordRepository = trCallRecordRepository; _userRepository = userRepository; _telRestRepository = telRestRepository; _mapper = mapper; _systemSettingCacheManager = systemSettingCacheManager; _workRepository = workRepository; _sysDicDataCacheManager = sysDicDataCacheManager; _callReportApplication = callReportApplication; _exportApplication = exportApplication; _baseDataApplication = baseDataApplication; } /// /// 话务统计分析 /// /// /// [HttpGet("calls")] [AllowAnonymous] public async Task> QueryCallsAsync([FromQuery] BiQueryCallsDto dto) => await _callReportApplication.QueryCallsAsync(dto, HttpContext.RequestAborted); /// /// 话务统计分析---导出 /// /// /// [HttpPost("calls_export")] [AllowAnonymous] public async Task ExportQueryCallsAsync([FromBody] ExportExcelDto dto) => ExcelStreamResult( _exportApplication.GetExcelStream( dto, await _callReportApplication.QueryCallsAsync(dto.QueryDto, HttpContext.RequestAborted), list => { return new BiCallDto() { HourRange = "合计", Hour = 13, Total = list.Sum(p => p.Total), Answered = list.Sum(p => p.Answered), Hanguped = list.Sum(p => p.Hanguped) }; }), "话务统计分析"); /// /// 话务日期统计 /// /// /// [HttpGet("query_calls_statistics")] public async Task> QueryCallsStatisticsAsync([FromQuery] StartEndTimeDto dto) { var items = await _callReportApplication.QueryCallsDetailStatisticsAsync(dto, HttpContext.RequestAborted); var total = new QueryCallsDetailStatistics { Date = "合计", //InTotal = items.Sum(m => m.InTotal), NotAcceptedHang = items.Sum(m => m.NotAcceptedHang), InConnectionQuantity = items.Sum(m => m.InConnectionQuantity), InNotAnswered = items.Sum(m => m.InNotAnswered), IvrByeCount = items.Sum(m => m.IvrByeCount), OutConnectionQuantity = items.Sum(m => m.OutConnectionQuantity), OutNotAnswered = items.Sum(m => m.OutNotAnswered) }; return new TotalList(items, total); } /// /// 话务日期统计-导出 /// /// /// [HttpPost("query_calls_statistics_export")] public async Task QueryCallsStatisticsExportAsync([FromBody] ExportExcelDto dto) { var items = (await _callReportApplication.QueryCallsDetailStatisticsAsync(dto.QueryDto, HttpContext.RequestAborted)); return _exportApplication.GetExcelFile(dto, items, "话务日期统计", "Date"); } /// /// 话务日期统计详情 /// /// /// [HttpGet("query_calls_statistics_detail")] public async Task> QueryCallsStatisticsDetailAsync([FromQuery] QueryCallsStatisticsDetailInDto dto) => (await _callReportApplication.QueryCallsStatisticsDetailAsync(dto, HttpContext.RequestAborted)) .ToPaged(); /// /// 话务日期统计详情--导出 /// /// /// [HttpPost("query_calls_statistics_detail/export")] public async Task QueryCallsStatisticsDetailAsync([FromBody] ExportExcelDto dto) { var items = (await _callReportApplication.QueryCallsStatisticsDetailAsync(dto.QueryDto, HttpContext.RequestAborted)).Item2; return _exportApplication.GetExcelFile(dto, items, "话务日期统计详情", "OrderNo"); } /// /// 话务日期统计详情页面基础数据 /// /// /// [HttpGet("query_calls_statistics_detail/base-data")] public Dictionary QueryCallsStatisticsDetailBaseData() { return new Dictionary { { "endBy", EnumExts.GetDescriptions() } }; } /// /// 话务日期明细 /// /// /// [HttpGet("query_calls_detail")] public async Task QueryCallsDetailAsync([FromQuery] BiQueryCallsDto dto) { var items = await _callReportApplication.QueryCallsDetailAsync(dto); var total = new QueryCallsDetailDto { Date = "合计", Hour = "", InTotal = items.Sum(p => p.InTotal), InConnectionQuantity = items.Sum(p => p.InConnectionQuantity), NotAcceptedHang = items.Sum(p => p.NotAcceptedHang), TotalDurationIncomingCalls = items.Sum(p => p.TotalDurationIncomingCalls), InAvailableAnswer = items.Sum(p => p.InAvailableAnswer), InHangupImmediateWhenAnswered = items.Sum(p => p.InHangupImmediateWhenAnswered), TimeoutConnection = items.Sum(p => p.TimeoutConnection), TimeoutSuspension = items.Sum(p => p.TimeoutSuspension), QueueByeCount = items.Sum(p => p.QueueByeCount), IvrByeCount = items.Sum(p => p.IvrByeCount), OutTotal = items.Sum(p => p.OutTotal), OutConnectionQuantity = items.Sum(p => p.OutConnectionQuantity) }; return new { List = items, Total = total }; } /// /// 话务日期明细--导出 /// /// /// [HttpPost("query_calls_detail_export")] public async Task QueryCallsDetailExportAsync([FromBody] ExportExcelDto dto) { return ExcelStreamResult( _exportApplication.GetExcelStream( dto, await _callReportApplication.QueryCallsDetailAsync(dto.QueryDto), items => { return new QueryCallsDetailDto { Date = "合计", Hour = "", InTotal = items.Sum(p => p.InTotal), InConnectionQuantity = items.Sum(p => p.InConnectionQuantity), NotAcceptedHang = items.Sum(p => p.NotAcceptedHang), TotalDurationIncomingCalls = items.Sum(p => p.TotalDurationIncomingCalls), InAvailableAnswer = items.Sum(p => p.InAvailableAnswer), InHangupImmediateWhenAnswered = items.Sum(p => p.InHangupImmediateWhenAnswered), TimeoutConnection = items.Sum(p => p.TimeoutConnection), TimeoutSuspension = items.Sum(p => p.TimeoutSuspension), QueueByeCount = items.Sum(p => p.QueueByeCount), IvrByeCount = items.Sum(p => p.IvrByeCount), OutTotal = items.Sum(p => p.OutTotal), OutConnectionQuantity = items.Sum(p => p.OutConnectionQuantity) }; }) , "话务日期明细数据"); } /// /// 话务日期明细--呼入明细 /// /// /// [HttpGet("query_incall_calls_list")] public async Task> GetInCallCallListAsync([FromQuery] BiQueryCallsDto dto) { var (total, items) = await _callReportApplication.QueryCallsDetailInTotalAsync(dto, false); return new PagedDto(total, items); } /// /// 话务日期明细----导出 /// /// /// [HttpPost("query_incall_calls_list_export")] public async Task GetInCallCallListExportAsync([FromBody] ExportExcelDto dto) { var (total, data) = await _callReportApplication.QueryCallsDetailInTotalAsync(dto.QueryDto, dto.IsExportAll); dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos); var dtos = data .Select(stu => _mapper.Map(stu, typeof(CallRecordOutDto), dynamicClass)) .Cast() .ToList(); var stream = ExcelHelper.CreateStream(dtos); return ExcelStreamResult( _exportApplication.GetExcelStream( dto, (await _callReportApplication.QueryCallsDetailInTotalAsync(dto.QueryDto, dto.IsExportAll)).Item2 ), dto.QueryDto.TypeCode == "2" ? "话务日期-接通明细数据" : "话务日期-总量明细数据"); } /// /// 话务日期明细--时间段 /// /// /// [HttpGet("query_calls_hour_detail_list")] public async Task> QueryCallsHourDetailListAsync([FromQuery] BiQueryCallsDto dto) { var items = await _callReportApplication.QueryCallsHourDetailAsync(dto, HttpContext.RequestAborted); var total = new QueryCallsDetailDto { Date = "", Hour = "合计", InTotal = items.Sum(p => p.InTotal), InConnectionQuantity = items.Sum(p => p.InConnectionQuantity), NotAcceptedHang = items.Sum(p => p.NotAcceptedHang), TotalDurationIncomingCalls = items.Sum(p => p.TotalDurationIncomingCalls), InAvailableAnswer = items.Sum(p => p.InAvailableAnswer), InHangupImmediateWhenAnswered = items.Sum(p => p.InHangupImmediateWhenAnswered), TimeoutConnection = items.Sum(p => p.TimeoutConnection), TimeoutSuspension = items.Sum(p => p.TimeoutSuspension), QueueByeCount = items.Sum(p => p.QueueByeCount), IvrByeCount = items.Sum(p => p.IvrByeCount), OutTotal = items.Sum(p => p.OutTotal), OutConnectionQuantity = items.Sum(p => p.OutConnectionQuantity) }; return new TotalList(items, total); } /// /// 话务日期明细--时间段--导出 /// /// /// [HttpPost("query_calls_hour_detail_list_export")] public async Task QueryCallsHourDetailListExportAsync([FromBody] ExportExcelDto dto) => ExcelStreamResult( _exportApplication.GetExcelStream( dto, await _callReportApplication.QueryCallsHourDetailAsync(dto.QueryDto, HttpContext.RequestAborted), items => { return new QueryCallsDetailDto { Date = "", Hour = "合计", InTotal = items.Sum(p => p.InTotal), InConnectionQuantity = items.Sum(p => p.InConnectionQuantity), NotAcceptedHang = items.Sum(p => p.NotAcceptedHang), TotalDurationIncomingCalls = items.Sum(p => p.TotalDurationIncomingCalls), InAvailableAnswer = items.Sum(p => p.InAvailableAnswer), InHangupImmediateWhenAnswered = items.Sum(p => p.InHangupImmediateWhenAnswered), TimeoutConnection = items.Sum(p => p.TimeoutConnection), TimeoutSuspension = items.Sum(p => p.TimeoutSuspension), QueueByeCount = items.Sum(p => p.QueueByeCount), IvrByeCount = items.Sum(p => p.IvrByeCount), OutTotal = items.Sum(p => p.OutTotal), OutConnectionQuantity = items.Sum(p => p.OutConnectionQuantity) }; }) , "话务日期明细-时间段"); /// /// 坐席话务统计分析 /// /// /// [HttpPost("seats/export")] public async Task ExportSeatss([FromBody] ExportExcelDto dto) { return ExcelStreamResult( _exportApplication.GetExcelStream( dto, await _callReportApplication.QuerySeatCallAsync(dto.QueryDto, HttpContext.RequestAborted), list => { return new BiSeatCallsDto() { Name = "合计", InTotal = list.Sum(p => p.InTotal), InAnswered = list.Sum(p => p.InAnswered), InHangupImmediate = list.Sum(p => p.InHangupImmediate), InHanguped = list.Sum(m => m.InHanguped), OutDurationAvg = list.Sum(m => m.OutDurationAvg), InAvailableAnswer = list.Sum(m => m.InAvailableAnswer), InHangupImmediateWhenAnswered = list.Sum(m => m.InHangupImmediateWhenAnswered), OutTotal = list.Sum(m => m.OutTotal), OutAnswered = list.Sum(m => m.OutAnswered), LoginDuration = list.Sum(m => m.LoginDuration), RestDuration = list.Sum(m => m.RestDuration), InDurationAvg = list.Sum(m => m.InDurationAvg) }; }) , "坐席话务统计分析"); } /// /// 坐席话务统计分析 /// /// /// [HttpGet("seats")] [AllowAnonymous] public async Task> QuerySeatCallsAsync([FromQuery] ReportRequiredPagedRequest dto) => await _callReportApplication.QuerySeatCallAsync(dto, HttpContext.RequestAborted); /// /// 小休统计 /// /// /// [HttpGet("rests")] [AllowAnonymous] public async Task> QuerySeatRest([FromQuery] QuerySeatRestRequest dto) { return await _telRestRepository.Queryable() .WhereIF(!string.IsNullOrEmpty(dto.UserName), x => x.UserName.Contains(dto.UserName)) .WhereIF(!string.IsNullOrEmpty(dto.StaffNo), x => x.StaffNo.Contains(dto.StaffNo)) .Where(x => x.CreationTime >= dto.StartTime) .Where(x => x.CreationTime <= dto.EndTime) .GroupBy(x => new { x.UserId, x.StaffNo, x.UserName }) .Select(x => new BiSeatRestDto { UserId = x.UserId, StaffNo = x.StaffNo, UserName = x.UserName, RestCount = SqlFunc.AggregateCount(x.Id), RestDuration = SqlFunc.AggregateSum(x.RestDuration / 60) / SqlFunc.AggregateCount(x.Id), CumulativeDuration = SqlFunc.AggregateSum(x.RestDuration / 60) }) .OrderByIF(dto.SortRule is 0, a => a.RestDuration, OrderByType.Asc) .OrderByIF(dto.SortRule is 1, a => a.RestDuration, OrderByType.Desc) .MergeTable() .ToListAsync(HttpContext.RequestAborted); } /// /// 坐席转接统计 /// /// /// [HttpGet("seatswitch")] [AllowAnonymous] public async Task> QuerySeatSwitch([FromQuery] QuerySeatSwitchRequest dto) { var (total, items) = await _callReportApplication.QuerySeatSwitchAsync(dto, HttpContext.RequestAborted); return new PagedDto(total, items); } /// /// 小时统计 /// /// [HttpGet("hourcall")] [AllowAnonymous] public async Task> QueryHourCall([FromQuery] BiQueryHourCallDto dto) => await _callReportApplication.GetCallHourListAsync(dto, HttpContext.RequestAborted); /// /// 小时统计--导出 /// /// [HttpPost("hourcall/export")] [AllowAnonymous] public async Task ExportQueryHourCall([FromBody] ExportExcelDto dto) => ExcelStreamResult( _exportApplication.GetExcelStream( dto, await _callReportApplication.GetCallHourListAsync(dto.QueryDto, HttpContext.RequestAborted), list => { return new TrCallHourDto() { HourTo = "合计", EffectiveCount = list.Sum(p => p.EffectiveCount), ConnectByeCount = list.Sum(p => p.ConnectByeCount), NoConnectByeCount = list.Sum(p => p.NoConnectByeCount), QueueByeCount = list.Sum(m => m.QueueByeCount), IvrByeCount = list.Sum(m => m.IvrByeCount) }; }) , "通话时段分析"); /// /// 通话时段统计明细 /// /// [HttpGet("hourcall_list")] public async Task QueryCallList([FromQuery] QueryCallListDto dto) => await _callReportApplication.GetCallListAsync(dto, HttpContext.RequestAborted); /// /// 通话时段统计明细获取基本信息 /// /// /// [HttpGet("hourcall_list_base")] public async Task ReTransactBaseData() { var rsp = new { CallForwardingSource = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.CallForwardingSource), CallForwardingType = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.CallForwardingType), }; return rsp; } /// /// 热线号码统计 /// /// /// /// [AllowAnonymous] [HttpGet("gateway-query")] public async Task> QueryGateWay([FromQuery] BiQueryGateWayDto dto) => await _callReportApplication.GetCallHotLineListAsync(dto, HttpContext.RequestAborted); /// /// 热线号码统计导出 /// /// /// [HttpPost("gateway-query/export")] public async Task ExportQueryGatetWay(ExportExcelDto dto) => ExcelStreamResult( _exportApplication.GetExcelStream( dto, await _callReportApplication.GetCallHotLineListAsync(dto.QueryDto, HttpContext.RequestAborted) ) , "热线号码统计"); #region 宜宾话务表 /// /// 话务日期统计明细 /// /// /// [HttpGet("query-calldate-statistics")] public async Task QueryCallDateStatisticsDetail([FromQuery] QueryCallDateStatisticsDetailDto dto) { var list = await _callReportApplication.QueryCallDateStatisticsDetail(dto); var total = new QueryCallDateStatisticsDetailResp() { Date = "合计", PersonCallInCount = list.Sum(x=>x.PersonCallInCount), EnterpriseCallInCount = list.Sum(x=>x.EnterpriseCallInCount), AiCallInCount = list.Sum(x=>x.AiCallInCount), PersonCallInPutthroughCount = list.Sum(x=>x.PersonCallInPutthroughCount), EnterpriseCallInPutthroughCount = list.Sum(x=>x.EnterpriseCallInPutthroughCount), AiCallInPutthroughCount = list.Sum(x=>x.AiCallInPutthroughCount), PersonRingOffCount = list.Sum(x=>x.PersonRingOffCount),//个人服务挂断 EnterpriseRingOffCount = list.Sum(x=>x.EnterpriseRingOffCount), //企业挂断 IvrRingOffCount = list.Sum(x=>x.IvrRingOffCount), //IVR挂断 }; return new { List = list, Total = total }; } /// /// 话务日期统计明细导出 /// /// /// [HttpPost("query-calldate-statistics/export")] public async Task QueryCallDateStatisticsDetailExport([FromBody]ExportExcelDto dto) => _exportApplication.GetExcelFile( dto, await _callReportApplication.QueryCallDateStatisticsDetail(dto.QueryDto) , "话务日期统计明细", "Date"); /// /// 个人服务话务明细 /// /// /// [HttpGet("query-person-calldate-statistics")] public async Task QueryPersonCallDateStatisticsDetail([FromQuery]QueryCallDateStatisticsDetailDto dto) { var list = await _callReportApplication.QueryPersonCallDateStatisticsDetail(dto); var total = new QueryPersonCallDateStatisticsDetailResp() { Date = "合计", PersonCallInCount = list.Sum(x=>x.PersonCallInCount), PersonCallInPutthroughCount = list.Sum(x=>x.PersonCallInPutthroughCount), //PersonRingOffCount = list.Sum(x=>x.PersonRingOffCount),//个人服务挂断 PersonQueueOffCount = list.Sum(x=>x.PersonQueueOffCount),//个人服务队列挂断 PersonWaitOffCount = list.Sum(x=>x.PersonWaitOffCount) //个人服务等待挂断 }; return new { List = list, Total = total }; } /// /// 个人服务话务明细导出 /// /// /// [HttpPost("query-person-calldate-statistics/export")] public async Task QueryPersonCallDateStatisticsDetailExport([FromBody]ExportExcelDto dto) => _exportApplication.GetExcelFile( dto, await _callReportApplication.QueryPersonCallDateStatisticsDetail(dto.QueryDto) , "个人服务话务明细","Date"); /// /// 企业服务话务明细 /// /// /// [HttpGet("query-enterprise-calldate-statistics")] public async Task QueryEnterpriseCallDateStatisticsDetail([FromQuery]QueryCallDateStatisticsDetailDto dto) { var list = await _callReportApplication.QueryEnterpriseCallDateStatisticsDetail(dto); var total = new QueryEnterpriseCallDateStatisticsDetailResp() { Date = "合计", EnterpriseCallInCount = list.Sum(x=>x.EnterpriseCallInCount), EnterpriseCallInPutthroughCount = list.Sum(x=>x.EnterpriseCallInPutthroughCount), //EnterpriseRingOffCount = list.Sum(x=>x.EnterpriseRingOffCount), //企业挂断 EnterpriseQueueOffCount = list.Sum(x=>x.EnterpriseQueueOffCount),//个人服务队列挂断 EnterpriseWaitOffCount = list.Sum(x=>x.EnterpriseWaitOffCount) //个人服务等待挂断 }; return new { List = list, Total = total }; } /// /// 企业服务话务明细导出 /// /// /// [HttpPost("query-enterprise-calldate-statistics/export")] public async Task QueryEnterpriseCallDateStatisticsDetailExport([FromBody]ExportExcelDto dto) => _exportApplication.GetExcelFile( dto, await _callReportApplication.QueryEnterpriseCallDateStatisticsDetail(dto.QueryDto) , "企业服务话务明细","Date"); /// /// 呼出话务统计明细 /// /// /// [HttpGet("query-callout-date-statistics")] public async Task QueryCallOutDateStatisticsDetail([FromQuery] QueryCallDateStatisticsDetailDto dto) { List enterpriseTels = _systemSettingCacheManager.GetSetting(SettingConstants.EnterpriseTel)?.SettingValue; var list = await _callReportApplication.QueryCallOutDateStatisticsDetail(dto,enterpriseTels); var total = new QueryCallOutDateStatisticsDetailResp() { Date = "合计", PersonCallOutCount = list.Sum(x => x.PersonCallOutCount), EnterpriseCallOutCount = list.Sum(x => x.EnterpriseCallOutCount), AiVisitCallOutCount = list.Sum(x => x.AiVisitCallOutCount), AiCallOutCount = list.Sum(x => x.AiCallOutCount), PersonCallOutPutthroughCount = list.Sum(x => x.PersonCallOutPutthroughCount), EnterpriseCallOutPutthroughCount = list.Sum(x=>x.EnterpriseCallOutPutthroughCount), AiVisitCallOutPutthroughCount = list.Sum(x=>x.AiVisitCallOutPutthroughCount), AiCallOutPutthroughCount = list.Sum(x=>x.AiCallOutPutthroughCount) }; return new { List = list, Total = total }; } /// /// 呼出话务统计明细 /// /// /// [HttpPost("query-callout-date-statistics/export")] public async Task QueryCallOutDateStatisticsDetailExport([FromBody]ExportExcelDto dto) { List enterpriseTels = _systemSettingCacheManager.GetSetting(SettingConstants.EnterpriseTel)?.SettingValue; return _exportApplication.GetExcelFile( dto, await _callReportApplication.QueryCallOutDateStatisticsDetail(dto.QueryDto,enterpriseTels) , "呼出话务统计明细", "Date"); } /// /// 坐席月接通率统计 /// /// /// [HttpGet("query-seat-monthcall")] public async Task QuerySeatMonthCall([FromQuery]QuerySeatMonthCallRequest dto) { var list = await _callReportApplication.QuerySeatMonthCall(dto); var total = new QuerySeatMonthCallResp() { Name = "合计", InAnswered = list.Sum(x => x.InAnswered), InAvailableAnswer = list.Sum(x => x.InAvailableAnswer), InHangupImmediateWhenAnswered = list.Sum(x => x.InHangupImmediateWhenAnswered), OverTimeImmediate = list.Sum(x => x.OverTimeImmediate), InTimeImmediate = list.Sum(x => x.InTimeImmediate), InHanguped = list.Sum(x => x.InHanguped), InHangupImmediate = list.Sum(x => x.InHangupImmediate), OverTimeInHanguped = list.Sum(x => x.OverTimeInHanguped), }; return new { List = list, Total = total }; } /// /// 坐席月接通率统计基础数据 /// /// [HttpGet("query-seat-monthcall-basedata")] public async Task QuerySeatMonthCallBaseData() { return new { SeatUser =await _userRepository.Queryable().Where(x => x.UserType == Share.Enums.User.EUserType.Seat).ToListAsync() }; } /// /// 坐席月接通率统计导出 /// /// /// [HttpPost("query-seat-monthcall/export")] public async Task QuerySeatMonthCallExport([FromBody] ExportExcelDto dto) => _exportApplication.GetExcelFile( dto, await _callReportApplication.QuerySeatMonthCall(dto.QueryDto) , "坐席月接通率统计", "Date"); /// /// 坐席月接通明细 /// /// /// [HttpGet("query-seat-monthcall-detail")] public async Task> QuerySeatMonthCallDetail([FromQuery] QuerySeatMonthCallDetailRequest dto) { var query = _callReportApplication.QuerySeatMonthCallDetail(dto); var(total, items) = await query.ToPagedListAsync(dto.PageIndex, dto.PageSize); return new PagedDto(total, items); } /// /// 坐席月接通明细导出 /// /// /// [HttpPost("query-seat-monthcall-detail/export")] public async Task QuerySeatMonthCallDetailExport([FromBody] ExportExcelDto dto) { var query = _callReportApplication.QuerySeatMonthCallDetail(dto.QueryDto); List data; if (dto.IsExportAll) { data = await query.ToListAsync(HttpContext.RequestAborted); } else { var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted); data = items; } var dataDtos = _mapper.Map>(data); dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos); var dtos = dataDtos .Select(stu => _mapper.Map(stu, typeof(QuerySeatMonthCallDetailResp), dynamicClass)) .Cast() .ToList(); var stream = ExcelHelper.CreateStream(dtos); return ExcelStreamResult(stream, "坐席月接通明细"); } #endregion }