Explorar o código

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

田爽 hai 9 meses
pai
achega
a208c9b003

+ 38 - 58
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -283,59 +283,39 @@ namespace Hotline.Api.Controllers.Bi
         [HttpGet("centre_data_list")]
         public async Task<List<OrderBiCentreDataListVo>> CentreDataList([FromQuery] ReportPagedRequest dto)
         {
-            if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
-
-            dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
-
-            var query = _orderRepository.Queryable(false, false, false)
-                .WhereIF(dto.StartTime.HasValue, it => it.CreationTime >= dto.StartTime)
-                .WhereIF(dto.EndTime.HasValue, it => it.CreationTime <= dto.EndTime)
-                .WhereIF(!string.IsNullOrEmpty(dto.Keyword), it => it.SignerName.Contains(dto.Keyword!))
-                .GroupBy(it => new { it.SignerId, it.SignerName })
-                .Select(it => new OrderBiCentreDataListVo
-                {
-                    UserName = it.SignerName,
-                    UserId = it.SignerId,
-                    //Subtotal = SqlFunc.AggregateCount(x.AcceptorId),
-                    CentreArchive = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed && it.ProcessType == EProcessType.Zhiban && it.AcceptType != "无效", 1, 0)), //中心归档件
-                    //CentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed && (it.FileUserRole == EFileUserType.Org || it.FileUserRole == EFileUserType.Dispatch), 1, 0)), //转办信件
-                    CentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF(it.AcceptType != "无效" && (it.ProcessType == EProcessType.Jiaoban || (it.ActualHandleStepName == "派单组" && it.Status < EOrderStatus.Filed) || (it.ActualHandleStepName == "班长审批" && it.Status < EOrderStatus.Filed)), 1, 0)),
-                    NoCentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF(it.AcceptType != "无效" && (it.Status <= EOrderStatus.SpecialToUnAccept), 1, 0)), //坐席待办 //中心领导?市领导? 是否在统计条件中
-                    //CentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed && it.ProcessType == EProcessType.Jiaoban, 1, 0)),
-                    //NoCentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF((int)x.Status < 300 && x.ExpiredTime > x.FiledTime, 1, 0)),
-                    Invalid = SqlFunc.AggregateSum(SqlFunc.IIF(it.AcceptType == "无效", 1, 0)),
-                    Repeat = SqlFunc.AggregateSum(SqlFunc.IIF(it.DuplicateIds != null && SqlFunc.JsonArrayLength(it.DuplicateIds) > 0, 1, 0)),
-                    Subtotal = SqlFunc.AggregateSum(SqlFunc.IIF((it.Status >= EOrderStatus.Filed && it.ProcessType == EProcessType.Zhiban && it.AcceptType != "无效") || (it.AcceptType != "无效" && (it.ProcessType == EProcessType.Jiaoban || (it.ActualHandleStepName == "派单组" && it.Status < EOrderStatus.Filed) || (it.ActualHandleStepName == "班长审批" && it.Status < EOrderStatus.Filed))) || (it.Status <= EOrderStatus.SpecialToUnAccept) || it.AcceptType == "无效" || (it.DuplicateIds != null && SqlFunc.JsonArrayLength(it.DuplicateIds) > 0), 1, 0))
-                }).MergeTable();
-            switch (dto.SortField)
-            {
-                case "centreArchive":
-                    query = dto.SortRule is 0 ? query.OrderBy(x => x.CentreArchive) : query.OrderByDescending(x => x.CentreArchive);
-                    break;
-                case "centreCareOf":
-                    query = dto.SortRule is 0 ? query.OrderBy(x => x.CentreCareOf) : query.OrderByDescending(x => x.CentreCareOf);
-                    break;
-                case "noCentreCareOf":
-                    query = dto.SortRule is 0 ? query.OrderBy(x => x.NoCentreCareOf) : query.OrderByDescending(x => x.NoCentreCareOf);
-                    break;
-                case "invalid":
-                    query = dto.SortRule is 0 ? query.OrderBy(x => x.Invalid) : query.OrderByDescending(x => x.Invalid);
-                    break;
-                case "repeat":
-                    query = dto.SortRule is 0 ? query.OrderBy(x => x.Repeat) : query.OrderByDescending(x => x.Repeat);
-                    break;
-                case "subtotal":
-                    query = dto.SortRule is 0 ? query.OrderBy(x => x.Subtotal) : query.OrderByDescending(x => x.Subtotal);
-                    break;
-            }
+            var query = _orderApplication.CentreDataList(dto);
+            var list = await query.Where(x => (x.CentreArchive + x.CentreCareOf + x.NoCentreCareOf + x.Invalid + x.Repeat) != 0).ToListAsync(HttpContext.RequestAborted);
+            return list;
+        }
 
-            if (string.IsNullOrEmpty(dto.SortField))
+        /// <summary>
+        /// 话务员办件统计--导出
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("centre_data_list_export")]
+        public async Task<FileStreamResult> CentreDataListExport([FromBody] ExportExcelDto<ReportPagedRequest> dto)
+        {
+            var query = _orderApplication.CentreDataList(dto.QueryDto);
+            List<OrderBiCentreDataListVo> data = await query.Where(x => (x.CentreArchive + x.CentreCareOf + x.NoCentreCareOf + x.Invalid + x.Repeat) != 0).ToListAsync(HttpContext.RequestAborted);
+            data.Add(new OrderBiCentreDataListVo
             {
-                query = query.OrderByDescending(x => x.Subtotal);
-            }
+                UserName = "合计",
+                CentreArchive = data.Select(s => s.CentreArchive).Sum(),
+                CentreCareOf = data.Select(s => s.CentreCareOf).Sum(),
+                NoCentreCareOf = data.Select(s => s.NoCentreCareOf).Sum(),
+                Invalid = data.Select(s => s.Invalid).Sum(),
+                Repeat = data.Select(s => s.Repeat).Sum(),
+                Subtotal = data.Select(s => s.Subtotal).Sum()
+            });
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+            var dtos = data
+             .Select(stu => _mapper.Map(stu, typeof(OrderBiCentreDataListVo), dynamicClass))
+             .Cast<object>()
+             .ToList();
 
-            var list = await query.Where(x => (x.CentreArchive + x.CentreCareOf + x.NoCentreCareOf + x.Invalid + x.Repeat) != 0).ToListAsync(HttpContext.RequestAborted);
-            return list;
+            var stream = ExcelHelper.CreateStream(dtos);
+            return ExcelStreamResult(stream, "话务员办件统计");
         }
 
         /// <summary>
@@ -1443,35 +1423,35 @@ namespace Hotline.Api.Controllers.Bi
                 OrgCode = "",
                 OrgType = "",
                 ZxAllCount = items.Sum(p => p.ZxAllCount),
-                ZxAllTimes = Math.Round(items.Sum(p => p.ZxAllTimes).Value,2),
+                ZxAllTimes = Math.Round(items.Sum(p => p.ZxAllTimes).Value, 2),
                 ZxAcceptanceTypeCode = "10",
 
                 JyAllCount = items.Sum(p => p.JyAllCount),
-                JyAllTimes = Math.Round(items.Sum(p => p.JyAllTimes).Value,2),
+                JyAllTimes = Math.Round(items.Sum(p => p.JyAllTimes).Value, 2),
                 JyAcceptanceTypeCode = "15",
 
                 QzAllCount = items.Sum(p => p.QzAllCount),
-                QzAllTimes = Math.Round(items.Sum(p => p.QzAllTimes).Value,2),
+                QzAllTimes = Math.Round(items.Sum(p => p.QzAllTimes).Value, 2),
                 QzAcceptanceTypeCode = "20",
 
                 ByAllCount = items.Sum(p => p.ByAllCount),
-                ByAllTimes = Math.Round(items.Sum(p => p.ByAllTimes).Value,2),
+                ByAllTimes = Math.Round(items.Sum(p => p.ByAllTimes).Value, 2),
                 ByAcceptanceTypeCode = "25",
 
                 JbAllCount = items.Sum(p => p.JbAllCount),
-                JbAllTimes = Math.Round(items.Sum(p => p.JbAllTimes).Value,2),
+                JbAllTimes = Math.Round(items.Sum(p => p.JbAllTimes).Value, 2),
                 JbAcceptanceTypeCode = "30",
 
                 TsAllCount = items.Sum(p => p.TsAllCount),
-                TsAllTimes = Math.Round(items.Sum(p => p.TsAllTimes).Value,2),
+                TsAllTimes = Math.Round(items.Sum(p => p.TsAllTimes).Value, 2),
                 TsAcceptanceTypeCode = "35",
 
                 QtAllCount = items.Sum(p => p.QtAllCount),
-                QtAllTimes = Math.Round(items.Sum(p => p.QtAllTimes).Value,2),
+                QtAllTimes = Math.Round(items.Sum(p => p.QtAllTimes).Value, 2),
                 QtAcceptanceTypeCode = "40",
 
                 YjAllCount = items.Sum(p => p.YjAllCount),
-                YjAllTimes = Math.Round(items.Sum(p => p.YjAllTimes).Value,2),
+                YjAllTimes = Math.Round(items.Sum(p => p.YjAllTimes).Value, 2),
                 YjAcceptanceTypeCode = "1"
             };
 

+ 59 - 51
src/Hotline.Application/Orders/IOrderApplication.cs

@@ -29,7 +29,7 @@ namespace Hotline.Application.Orders
         /// 1.更新工单 2.更新流程
         /// </summary>
         /// <returns></returns>
-        Task DelayOrderExpiredTimeAsync(string orderId, int timeCount, ETimeType timeType,bool IsProDelay, CancellationToken cancellationToken);
+        Task DelayOrderExpiredTimeAsync(string orderId, int timeCount, ETimeType timeType, bool IsProDelay, CancellationToken cancellationToken);
 
         /// <summary>
         /// 新增工单办理流程记录
@@ -42,10 +42,10 @@ namespace Hotline.Application.Orders
         Task CancelOrderAsync(string orderId, string opinion, CancellationToken cancellationToken);
 
         ISugarQueryable<Order> GetToExpireAsync(AboutToExpireListDto dto);
-		//Task<PagedDto<WorkflowOrderDto>> GetToExpireNodeAsync(AboutToExpireListDto dto, CancellationToken cancellationToken);
-		ISugarQueryable<Order> GetAboutToExpireAsync(AboutToExpireListDto dto);
+        //Task<PagedDto<WorkflowOrderDto>> GetToExpireNodeAsync(AboutToExpireListDto dto, CancellationToken cancellationToken);
+        ISugarQueryable<Order> GetAboutToExpireAsync(AboutToExpireListDto dto);
         //Task<PagedDto<WorkflowOrderDto>> GetAboutToExpireNodeAsync(AboutToExpireListDto dto, CancellationToken cancellationToken);
-        Task OrderParticiple(string inputStr, string orderId,DateTime time , CancellationToken cancellationToken);
+        Task OrderParticiple(string inputStr, string orderId, DateTime time, CancellationToken cancellationToken);
         Task OrderSensitiveParticiple(string inputStr, string orderId, CancellationToken cancellationToken);
         /// <summary>
         /// 接收外部平台工单
@@ -92,12 +92,12 @@ namespace Hotline.Application.Orders
         /// <returns></returns>
         ISugarQueryable<Order> QueryOrderSourceDetail(QueryOrderSourceDetailRequest dto);
 
-		/// <summary>
-		/// 部门超期统计
-		/// </summary>
-		/// <param name="dto"></param>
-		/// <returns></returns>
-		ISugarQueryable<OrderBiOrgDataListVo> QueryOrgDataList(ReportPagedRequest dto);
+        /// <summary>
+        /// 部门超期统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<OrderBiOrgDataListVo> QueryOrgDataList(ReportPagedRequest dto);
 
         /// <summary>
         /// 部门超期统计明细
@@ -106,46 +106,46 @@ namespace Hotline.Application.Orders
         /// <returns></returns>
 		ISugarQueryable<Order> QueryOrgDataListDetail(OrgDataListDetailRequest dto);
 
-		/// <summary>
-		/// 部门全量超期统计明细
-		/// </summary>
-		/// <param name="dto"></param>
-		/// <returns></returns>
-		ISugarQueryable<Order> QueryOrgDataListDetail(OrgDataListAllDetailRequest dto);
-
-		/// <summary>
-		/// 回退错件统计
-		/// </summary>
-		/// <param name="dto"></param>
-		/// <returns></returns>
-		ISugarQueryable<OrderReTransactVo> OrderReTransact(QueryOrderReTransactRequest dto);
-
-		/// <summary>
-		/// 回退错件明细统计
-        /// </summary>
-		/// <param name="dto"></param>
-		/// <returns></returns>
-		ISugarQueryable<OrderSpecialDetail> QueryOrderSourceDetail(QueryOrderReTransactDetailRequest dto);
-
-		/// <summary>
-		/// 部门满意度统计
-		/// </summary>
-		/// <returns></returns>
-		Task<List<VisitAndOrgSatisfactionStatisticsDto>> VisitAndOrgSatisfactionStatistics(PagedKeywordSonRequest dto);
-
-		/// <summary>
-		/// 子部门满意度
-		/// </summary>
-		/// <param name="dto"></param>
-		/// <returns></returns>
-		Task<List<VisitAndOrgSatisfactionStatisticsDto>> VisitAndOrgStatisfactionOrgDetail(PagedKeywordSonRequest dto);
-
-		/// <summary>
-		/// 部门满意度明细
-		/// </summary>
-		/// <param name="dto"></param>
-		/// <returns></returns>
-		ISugarQueryable<OrderVisitDetail> VisitAndOrgSatisfactionDetail(VisitAndOrgSatisfactionDetailDto dto);
+        /// <summary>
+        /// 部门全量超期统计明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<Order> QueryOrgDataListDetail(OrgDataListAllDetailRequest dto);
+
+        /// <summary>
+        /// 回退错件统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<OrderReTransactVo> OrderReTransact(QueryOrderReTransactRequest dto);
+
+        /// <summary>
+        /// 回退错件明细统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<OrderSpecialDetail> QueryOrderSourceDetail(QueryOrderReTransactDetailRequest dto);
+
+        /// <summary>
+        /// 部门满意度统计
+        /// </summary>
+        /// <returns></returns>
+        Task<List<VisitAndOrgSatisfactionStatisticsDto>> VisitAndOrgSatisfactionStatistics(PagedKeywordSonRequest dto);
+
+        /// <summary>
+        /// 子部门满意度
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        Task<List<VisitAndOrgSatisfactionStatisticsDto>> VisitAndOrgStatisfactionOrgDetail(PagedKeywordSonRequest dto);
+
+        /// <summary>
+        /// 部门满意度明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<OrderVisitDetail> VisitAndOrgSatisfactionDetail(VisitAndOrgSatisfactionDetailDto dto);
 
         /// <summary>
         /// 热点-区域统计
@@ -185,5 +185,13 @@ namespace Hotline.Application.Orders
         /// <param name="dto"></param>
         /// <returns></returns>
         ISugarQueryable<OrderVisitDetail> VisitAndHotspotSatisfactionDetail(VisitAndHotspotPagedKeywordRequest dto);
-	}
+
+        /// <summary>
+        /// 话务员办件统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<OrderBiCentreDataListVo> CentreDataList(ReportPagedRequest dto);
+
+    }
 }

+ 71 - 10
src/Hotline.Application/Orders/OrderApplication.cs

@@ -44,6 +44,7 @@ using Hotline.Share.Enums.FlowEngine;
 using Hotline.Authentications;
 using MediatR;
 using Hotline.Share.Mq;
+using Microsoft.AspNetCore.Http;
 
 namespace Hotline.Application.Orders;
 
@@ -132,7 +133,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         order.ExpiredTime = expiredTimeConfig.ExpiredTime;
         order.NearlyExpiredTime = expiredTimeConfig.NearlyExpiredTime;
         //发送即将超期(延时发送)
-        _capPublisher.PublishDelay(expiredTimeConfig.NearlyExpiredTime - DateTime.Now, EventNames.HotlineOrderNearlyExpiredTimeSms,new PublishNearlyExpiredTimeSmsDto() { OrderId= order.Id }) ;
+        _capPublisher.PublishDelay(expiredTimeConfig.NearlyExpiredTime - DateTime.Now, EventNames.HotlineOrderNearlyExpiredTimeSms, new PublishNearlyExpiredTimeSmsDto() { OrderId = order.Id });
         if (IsProDelay)
         {
             order.ExpiredTimeProvince = expiredTimeConfig.ExpiredTime;
@@ -500,7 +501,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .WhereIF(!string.IsNullOrEmpty(dto.ProvinceNo), d => d.ProvinceNo == dto.ProvinceNo) //省本地编号
             .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No) //工单编码
             .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), d => d.AcceptTypeCode == dto.AcceptType)//受理类型
-                                                                                                //.WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.AcceptTypeCode)) //受理类型
+                                                                                                    //.WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.AcceptTypeCode)) //受理类型
             .WhereIF(!string.IsNullOrEmpty(dto.Channel), d => d.SourceChannelCode == dto.Channel)
             //.WhereIF(dto.Channels.Any(), d => dto.Channels.Contains(d.SourceChannelCode)) //来源渠道
             //.WhereIF(dto.HotspotIds.Any(), d => dto.HotspotIds.Contains(d.HotspotId)) //热点类型
@@ -820,8 +821,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .Where(x => x.OrderVisit.VisitTime >= dto.StartTime.Value && x.OrderVisit.VisitTime <= dto.EndTime.Value && x.VisitTarget == EVisitTarget.Org && x.OrderVisit.VisitState == EVisitState.Visited && !string.IsNullOrEmpty(x.VisitOrgCode))
             .WhereIF(string.IsNullOrEmpty(dto.OrgName) == false, x => x.VisitOrgName.Contains(dto.OrgName))
             .WhereIF(string.IsNullOrEmpty(dto.LineNum) == false, x => x.OrderVisit.Order.CallRecord.Gateway.Contains(dto.LineNum))
-            .WhereIF(dto.TypeId != null && dto.TypeId == 1, x => x.OrderVisit.Order.IdentityType == EIdentityType.Citizen)
-            .WhereIF(dto.TypeId != null && dto.TypeId == 2, x => x.OrderVisit.Order.IdentityType == EIdentityType.Enterprise)
+            .WhereIF(dto.TypeCode != null && dto.TypeCode == 1, x => x.OrderVisit.Order.IdentityType == EIdentityType.Citizen)
+            .WhereIF(dto.TypeCode != null && dto.TypeCode == 2, x => x.OrderVisit.Order.IdentityType == EIdentityType.Enterprise)
             .WhereIF(IsCenter == false, x => x.VisitOrgCode.StartsWith(_sessionContext.OrgId));
 
         var data = new List<VisitAndOrgSatisfactionStatisticsDto>();
@@ -917,8 +918,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .WhereIF(dto.OrgCode == "001", (x, it) => it.VisitOrgCode == dto.OrgCode)
             .WhereIF(dto.OrgCode != "001", (x, it) => it.VisitOrgCode.StartsWith(dto.OrgCode))
             .WhereIF(!string.IsNullOrEmpty(dto.LineNum), (x, it) => it.OrderVisit.Order.CallRecord.Gateway.Contains(dto.LineNum))
-            .WhereIF(dto.TypeId != null && dto.TypeId == 1, (x, it) => it.OrderVisit.Order.IdentityType == EIdentityType.Citizen)
-            .WhereIF(dto.TypeId != null && dto.TypeId == 2, (x, it) => it.OrderVisit.Order.IdentityType == EIdentityType.Enterprise)
+            .WhereIF(dto.TypeCode != null && dto.TypeCode == 1, (x, it) => it.OrderVisit.Order.IdentityType == EIdentityType.Citizen)
+            .WhereIF(dto.TypeCode != null && dto.TypeCode == 2, (x, it) => it.OrderVisit.Order.IdentityType == EIdentityType.Enterprise)
             .WhereIF(IsCenter == false, (x, it) => it.VisitOrgCode.StartsWith(_sessionContext.OrgId))
              .GroupBy((x, it) => new
              {
@@ -969,8 +970,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .Includes(x => x.OrderVisit, o => o.Order, d => d.CallRecord)
             .Where(x => x.OrderVisit.VisitTime >= dto.StartTime && x.OrderVisit.VisitTime <= dto.EndTime && x.VisitTarget == EVisitTarget.Org && x.OrderVisit.VisitState == EVisitState.Visited)
             .WhereIF(dto.OrgCode == "001", x => x.VisitOrgCode == dto.OrgCode)
-            .WhereIF(dto.TypeId != null && dto.TypeId == 1, x=> x.OrderVisit.Order.IdentityType == EIdentityType.Citizen)
-            .WhereIF(dto.TypeId != null && dto.TypeId == 2, x => x.OrderVisit.Order.IdentityType == EIdentityType.Enterprise)
+            .WhereIF(dto.TypeCode != null && dto.TypeCode == 1, x => x.OrderVisit.Order.IdentityType == EIdentityType.Citizen)
+            .WhereIF(dto.TypeCode != null && dto.TypeCode == 2, x => x.OrderVisit.Order.IdentityType == EIdentityType.Enterprise)
             //.WhereIF(dto.OrgCode != "001", x => x.VisitOrgCode == dto.OrgCode).
             .WhereIF(dto.IsOnlyMy == true, x => x.VisitOrgCode == dto.OrgCode)
             .WhereIF(IsCenter == true && dto.IsOnlyMy == true, x => x.VisitOrgCode == dto.OrgCode)
@@ -1288,8 +1289,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .Where(x => x.OrderVisit.VisitTime >= dto.StartTime.Value && x.OrderVisit.VisitTime <= dto.EndTime.Value && x.VisitTarget == EVisitTarget.Org && x.OrderVisit.VisitState == EVisitState.Visited && !string.IsNullOrEmpty(x.VisitOrgCode))
             .WhereIF(string.IsNullOrEmpty(dto.HotspotName) == false, (x, h) => h.HotSpotName == dto.HotspotName)
             .WhereIF(IsCenter == false, x => x.VisitOrgCode.StartsWith(_sessionContext.OrgId))
-            .WhereIF(dto.TypeId == 1 ,x=>x.OrgProcessingResults != null)
-			.WhereIF(dto.TypeId == 2, x => x.OrgHandledAttitude != null);
+            .WhereIF(dto.TypeId == 1, x => x.OrgProcessingResults != null)
+            .WhereIF(dto.TypeId == 2, x => x.OrgHandledAttitude != null);
 
         var data = new List<VisitAndHotspotSatisfactionStatisticsDto>();
 
@@ -1385,6 +1386,66 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .WhereIF(dto.TypeId is 1, x => SqlFunc.JsonField(x.OrgProcessingResults, "Key") == key)
             .WhereIF(dto.TypeId is 2, x => SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == key);
     }
+
+    /// <summary>
+    /// 话务员办件统计
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    public ISugarQueryable<OrderBiCentreDataListVo> CentreDataList(ReportPagedRequest dto)
+    {
+        if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
+
+        dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+
+        var query = _orderRepository.Queryable(false, false, false)
+            .WhereIF(dto.StartTime.HasValue, it => it.CreationTime >= dto.StartTime)
+            .WhereIF(dto.EndTime.HasValue, it => it.CreationTime <= dto.EndTime)
+            .WhereIF(!string.IsNullOrEmpty(dto.Keyword), it => it.SignerName.Contains(dto.Keyword!))
+            .GroupBy(it => new { it.SignerId, it.SignerName })
+            .Select(it => new OrderBiCentreDataListVo
+            {
+                UserName = it.SignerName,
+                UserId = it.SignerId,
+                //Subtotal = SqlFunc.AggregateCount(x.AcceptorId),
+                CentreArchive = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed && it.ProcessType == EProcessType.Zhiban && it.AcceptType != "无效", 1, 0)), //中心归档件
+                                                                                                                                                                            //CentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed && (it.FileUserRole == EFileUserType.Org || it.FileUserRole == EFileUserType.Dispatch), 1, 0)), //转办信件
+                CentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF(it.AcceptType != "无效" && (it.ProcessType == EProcessType.Jiaoban || (it.ActualHandleStepName == "派单组" && it.Status < EOrderStatus.Filed) || (it.ActualHandleStepName == "班长审批" && it.Status < EOrderStatus.Filed)), 1, 0)),
+                NoCentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF(it.AcceptType != "无效" && (it.Status <= EOrderStatus.SpecialToUnAccept), 1, 0)), //坐席待办 //中心领导?市领导? 是否在统计条件中
+                                                                                                                                                  //CentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed && it.ProcessType == EProcessType.Jiaoban, 1, 0)),
+                                                                                                                                                  //NoCentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF((int)x.Status < 300 && x.ExpiredTime > x.FiledTime, 1, 0)),
+                Invalid = SqlFunc.AggregateSum(SqlFunc.IIF(it.AcceptType == "无效", 1, 0)),
+                Repeat = SqlFunc.AggregateSum(SqlFunc.IIF(it.DuplicateIds != null && SqlFunc.JsonArrayLength(it.DuplicateIds) > 0, 1, 0)),
+                Subtotal = SqlFunc.AggregateSum(SqlFunc.IIF((it.Status >= EOrderStatus.Filed && it.ProcessType == EProcessType.Zhiban && it.AcceptType != "无效") || (it.AcceptType != "无效" && (it.ProcessType == EProcessType.Jiaoban || (it.ActualHandleStepName == "派单组" && it.Status < EOrderStatus.Filed) || (it.ActualHandleStepName == "班长审批" && it.Status < EOrderStatus.Filed))) || (it.Status <= EOrderStatus.SpecialToUnAccept) || it.AcceptType == "无效" || (it.DuplicateIds != null && SqlFunc.JsonArrayLength(it.DuplicateIds) > 0), 1, 0))
+            }).MergeTable();
+        switch (dto.SortField)
+        {
+            case "centreArchive":
+                query = dto.SortRule is 0 ? query.OrderBy(x => x.CentreArchive) : query.OrderByDescending(x => x.CentreArchive);
+                break;
+            case "centreCareOf":
+                query = dto.SortRule is 0 ? query.OrderBy(x => x.CentreCareOf) : query.OrderByDescending(x => x.CentreCareOf);
+                break;
+            case "noCentreCareOf":
+                query = dto.SortRule is 0 ? query.OrderBy(x => x.NoCentreCareOf) : query.OrderByDescending(x => x.NoCentreCareOf);
+                break;
+            case "invalid":
+                query = dto.SortRule is 0 ? query.OrderBy(x => x.Invalid) : query.OrderByDescending(x => x.Invalid);
+                break;
+            case "repeat":
+                query = dto.SortRule is 0 ? query.OrderBy(x => x.Repeat) : query.OrderByDescending(x => x.Repeat);
+                break;
+            case "subtotal":
+                query = dto.SortRule is 0 ? query.OrderBy(x => x.Subtotal) : query.OrderByDescending(x => x.Subtotal);
+                break;
+        }
+
+        if (string.IsNullOrEmpty(dto.SortField))
+        {
+            query = query.OrderByDescending(x => x.Subtotal);
+        }
+        return query;
+    }
     #region private
 
     /// <summary>

+ 8 - 0
src/Hotline/Permissions/EPermission.cs

@@ -817,6 +817,14 @@ namespace Hotline.Permissions
 
         #endregion
 
+        #region 二次办理查询
+        /// <summary>
+        /// 二次办理查询
+        /// </summary>
+        [Display(GroupName = "二次办理", Name = "二次办理查询", Description = "二次办理查询")]
+        SecondHandleQuery = 201507,
+
+        #endregion
         #endregion
         #endregion