Parcourir la source

Merge branch 'release' of http://110.188.24.182:10023/Fengwo/hotline into release

田爽 il y a 8 mois
Parent
commit
e80f5e4404

+ 108 - 0
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -3689,5 +3689,113 @@ namespace Hotline.Api.Controllers.Bi
 
             return ExcelStreamResult(stream, "未签收统计明细数据");
         }
+
+        /// <summary>
+        /// 企业专席信件统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("get_enterprise_seats_report")]
+        public async Task<object> GetEnterpriseSeatsReport([FromQuery] EnterpriseSeatsReportRequestDto dto)
+        {
+            var items = await _orderReportApplication.GetEnterpriseSeatsReport(dto);
+
+            var total = new EnterpriseSeatsReportDto
+            {
+                UserName = "合计",
+                UserId = "",
+                UserNo = "",
+                TelCallNum = items.Sum(p => p.TelCallNum),
+                OrderNum = items.Sum(p => p.OrderNum),
+            };
+
+            return new { List = items, Total = total };
+        }
+
+        /// <summary>
+        /// 企业专席信件统计--导出
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("get_enterprise_seats_report_export")]
+        public async Task<FileStreamResult> ExportGetEnterpriseSeatsReport([FromBody] ExportExcelDto<EnterpriseSeatsReportRequestDto> dto)
+        {
+            var list = await _orderReportApplication.GetEnterpriseSeatsReport(dto.QueryDto);
+
+            //增加合计
+            list.Add(new EnterpriseSeatsReportDto
+            {
+                UserName = "合计",
+                UserId = "",
+                UserNo = "",
+                TelCallNum = list.Sum(p => p.TelCallNum),
+                OrderNum = list.Sum(p => p.OrderNum),
+            });
+
+            var orderDtos = _mapper.Map<ICollection<EnterpriseSeatsReportDto>>(list);
+
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+            var dtos = orderDtos
+                .Select(stu => _mapper.Map(stu, typeof(EnterpriseSeatsReportDto), dynamicClass))
+                .Cast<object>()
+                .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
+
+            return ExcelStreamResult(stream, "企业专席信件统计");
+        }
+
+        /// <summary>
+        /// 企业专席信件统计--明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("get_enterprise_seats_report_detail")]
+        public async Task<PagedDto<OrderDto>> GetEnterpriseSeatsReportDetail([FromQuery] EnterpriseSeatsReportRequestDto dto)
+        {
+            RefAsync<int> total = 0;
+            var queryData = await _orderReportApplication.GetEnterpriseSeatsReportDetail(dto)
+                        .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
+
+            return new PagedDto<OrderDto>(total, _mapper.Map<List<OrderDto>>(queryData));
+        }
+
+        /// <summary>
+        /// 企业专席信件统计--明细--导出
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("get_enterprise_seats_report_detail_export")]
+        public async Task<FileStreamResult> ExportGetEnterpriseSeatsReportDetail([FromBody] ExportExcelDto<EnterpriseSeatsReportRequestDto> dto)
+        {
+            var query = _orderReportApplication.GetEnterpriseSeatsReportDetail(dto.QueryDto);
+
+            List<OrderDto> list = new();
+            if (dto.IsExportAll)
+            {
+                var listData = await query.ToListAsync(HttpContext.RequestAborted);
+                list = _mapper.Map<List<OrderDto>>(listData);
+            }
+            else
+            {
+                RefAsync<int> total = 0;
+                var listData = await query.ToPageListAsync(dto.QueryDto.PageIndex, dto.QueryDto.PageSize, total, HttpContext.RequestAborted);
+                list = _mapper.Map<List<OrderDto>>(listData);
+            }
+
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+            var dtos = list
+                .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
+                .Cast<object>()
+                .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
+
+            return ExcelStreamResult(stream, "企业专席信件统计");
+        }
+
+
     }
 }

+ 14 - 0
src/Hotline.Application/StatisticalReport/IOrderReportApplication.cs

@@ -133,5 +133,19 @@ namespace Hotline.Application.StatisticalReport
         /// <param name="dto"></param>
         /// <returns></returns>
         ISugarQueryable<Order> GetOrderNoSigenDetail(OrderNoSigenRequestDto dto);
+
+        /// <summary>
+        /// 企业专席信件统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        Task<List<EnterpriseSeatsReportDto>> GetEnterpriseSeatsReport(EnterpriseSeatsReportRequestDto dto);
+
+        /// <summary>
+        /// 企业专席信件统计--明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<Order> GetEnterpriseSeatsReportDetail(EnterpriseSeatsReportRequestDto dto);
     }
 }

+ 91 - 3
src/Hotline.Application/StatisticalReport/OrderReportApplication.cs

@@ -1,17 +1,21 @@
 using Hotline.Application.Orders;
 using Hotline.Caching.Interfaces;
 using Hotline.Caching.Services;
+using Hotline.CallCenter.Calls;
 using Hotline.FlowEngine.WorkflowModules;
 using Hotline.FlowEngine.Workflows;
+using Hotline.Identity.Accounts;
 using Hotline.Orders;
 using Hotline.Settings;
 using Hotline.Settings.TimeLimits;
 using Hotline.Share.Dtos.Bi;
 using Hotline.Share.Dtos.CallCenter;
 using Hotline.Share.Dtos.Order;
+using Hotline.Share.Enums.CallCenter;
 using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Requests;
+using Hotline.Users;
 using JiebaNet.Segmenter.Common;
 using MapsterMapper;
 using MediatR;
@@ -40,6 +44,10 @@ namespace Hotline.Application.StatisticalReport
         private readonly IOrderSecondaryHandlingApplication _orderSecondaryHandlingApplication;
         private readonly ITimeLimitDomainService _timeLimitDomainService;
         private readonly IRepository<SystemDicData> _systemDicDataRepository;
+        private readonly IRepository<TrCallRecord> _trCallRecordRepository;
+        private readonly ISystemSettingCacheManager _systemSettingCacheManager;
+        private readonly IRepository<User> _userRepository;
+        private readonly IRepository<Account> _accountRepository;
 
         /// <summary>
         /// 
@@ -65,9 +73,12 @@ namespace Hotline.Application.StatisticalReport
             IRepository<OrderScreen> orderScreenRepository,
             IOrderSecondaryHandlingApplication orderSecondaryHandlingApplication,
             ITimeLimitDomainService timeLimitDomainService,
-            IRepository<SystemDicData> systemDicDataRepository
-,
-            ISystemDicDataCacheManager sysDicDataCacheManager
+            IRepository<SystemDicData> systemDicDataRepository,
+            ISystemDicDataCacheManager sysDicDataCacheManager,
+            IRepository<TrCallRecord> trCallRecordRepository,
+            ISystemSettingCacheManager systemSettingCacheManager,
+            IRepository<User> userRepository,
+            IRepository<Account> accountRepository
             )
         {
             _orderRepository = orderRepository;
@@ -82,6 +93,10 @@ namespace Hotline.Application.StatisticalReport
             _timeLimitDomainService = timeLimitDomainService;
             _systemDicDataRepository = systemDicDataRepository;
             _sysDicDataCacheManager = sysDicDataCacheManager;
+            _trCallRecordRepository = trCallRecordRepository;
+            _systemSettingCacheManager = systemSettingCacheManager;
+            _userRepository = userRepository;
+            _accountRepository = accountRepository;
         }
         /// <summary>
         /// 部门办件统计表---新
@@ -1862,5 +1877,78 @@ namespace Hotline.Application.StatisticalReport
                   .MergeTable();
             }
         }
+
+        /// <summary>
+        /// 企业专席信件统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public async Task<List<EnterpriseSeatsReportDto>> GetEnterpriseSeatsReport(EnterpriseSeatsReportRequestDto dto)
+        {
+            dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
+
+            //查询坐席信息
+            var enterpriseSeats = _systemSettingCacheManager.GetSetting(SettingConstants.EnterpriseSeats)?.SettingValue;
+            var userData = await _accountRepository.Queryable()
+                  .Where(p => enterpriseSeats.Contains(p.UserName)).Select(p => p.Id).ToListAsync();
+
+            //查询工单
+            var queryOrderData = _orderRepository.Queryable()
+                .Where(p => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime)
+                .Where(p => userData.Contains(p.SignerId))
+                .WhereIF(!string.IsNullOrEmpty(dto.UserName), p => p.SignerName.Contains(dto.UserName))
+                .GroupBy(p => new { p.SignerId })
+                .Select(p => new EnterpriseSeatsReportDto
+                {
+                    UserId = p.SignerId,
+                    OrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(p.AcceptType != "无效", 1, 0)),
+                })
+                .MergeTable();
+
+            //查询通话
+            var queryCall = _trCallRecordRepository.Queryable()
+                .Where(t => t.CreatedTime >= dto.StartTime && t.CreatedTime <= dto.EndTime)
+                .Where(t => userData.Contains(t.UserId))
+                .WhereIF(!string.IsNullOrEmpty(dto.UserName), t => t.UserName.Contains(dto.UserName))
+                .GroupBy(t => new { t.UserId })
+                .Select(t => new EnterpriseSeatsReportDto
+                {
+                    UserId = t.UserId,
+                    TelCallNum = SqlFunc.AggregateSum(SqlFunc.IIF(t.CallDirection == ECallDirection.In || t.CallDirection == ECallDirection.Out, 1, 0)),
+                })
+                .MergeTable();
+
+            return await _userRepository.Queryable()
+                .Where(u => userData.Contains(u.Id))
+                .WhereIF(!string.IsNullOrEmpty(dto.UserName), u => u.Name.Contains(dto.UserName))
+                .LeftJoin(queryOrderData, (u, qo) => u.Id == qo.UserId)
+                .LeftJoin(queryCall, (u, qo, qc) => u.Id == qc.UserId)
+                .Select((u, qo, qc) => new EnterpriseSeatsReportDto
+                {
+                    UserName = u.Name,
+                    UserId = u.Id,
+                    UserNo = u.StaffNo,
+                    TelCallNum = qc.TelCallNum,
+                    OrderNum = qo.OrderNum,
+                })
+                .ToListAsync();
+
+        }
+
+        /// <summary>
+        /// 企业专席信件统计--明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public ISugarQueryable<Order> GetEnterpriseSeatsReportDetail(EnterpriseSeatsReportRequestDto dto)
+        {
+            dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
+
+            return _orderRepository.Queryable()
+                  .Where(o => o.CreationTime >= dto.StartTime && o.CreationTime <= dto.EndTime && o.SignerId == dto.UserId)
+                  .WhereIF(!string.IsNullOrEmpty(dto.UserName), o => o.SignerName.Contains(dto.UserName))
+               .OrderByDescending(o => o.CreationTime);
+
+        }
     }
 }

+ 27 - 0
src/Hotline.Share/Dtos/Bi/EnterpriseSeatsReportDto.cs

@@ -0,0 +1,27 @@
+namespace Hotline.Share.Dtos.Bi
+{
+    public class EnterpriseSeatsReportDto
+    {
+        /// <summary>
+        /// 坐席名称
+        /// </summary>
+        public string UserName { get; set; }
+
+        public string UserId { get; set; }
+
+        /// <summary>
+        /// 坐席工号
+        /// </summary>
+        public string UserNo { get; set; }
+
+        /// <summary>
+        /// 话务量
+        /// </summary>
+        public int TelCallNum { get; set; }
+
+        /// <summary>
+        /// 工单量
+        /// </summary>
+        public int OrderNum { get; set; }
+    }
+}

+ 23 - 0
src/Hotline.Share/Requests/OrderNoSigenRequestDto.cs

@@ -37,4 +37,27 @@
         /// </summary>
         public int? DataSoure { get; set; }
     }
+
+    public record EnterpriseSeatsReportRequestDto : PagedRequest
+    {
+        /// <summary>
+        /// 开始时间
+        /// </summary>
+        public DateTime StartTime { get; set; }
+
+        /// <summary>
+        /// 结束时间
+        /// </summary>
+        public DateTime EndTime { get; set; }
+
+        /// <summary>
+        /// 坐席名称
+        /// </summary>
+        public string? UserName { get; set; }
+
+        /// <summary>
+        /// 坐席Id
+        /// </summary>
+        public string? UserId { get; set; }
+    }
 }

+ 5 - 0
src/Hotline/Settings/SettingConstants.cs

@@ -464,5 +464,10 @@ namespace Hotline.Settings
         /// 接受短信的角色ID
         /// </summary>
         public const string AcceptSmsRoleIds = "AcceptSmsRoleIds";
+
+        /// <summary>
+        /// 企业专席配置	
+        /// </summary>
+        public const string EnterpriseSeats = "EnterpriseSeats";
     }
 }