ソースを参照

二次办理统计

田爽 11 ヶ月 前
コミット
6c1ce5867c

+ 250 - 16
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -1,4 +1,5 @@
-using Hotline.Caching.Interfaces;
+using Hotline.Application.Orders;
+using Hotline.Caching.Interfaces;
 using Hotline.CallCenter.Calls;
 using Hotline.FlowEngine.WorkflowModules;
 using Hotline.FlowEngine.Workflows;
@@ -17,6 +18,7 @@ using Hotline.Share.Enums.CallCenter;
 using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Requests;
+using Hotline.Tools;
 using MapsterMapper;
 using Microsoft.AspNetCore.Mvc;
 using NPOI.SS.Formula.Functions;
@@ -49,8 +51,9 @@ namespace Hotline.Api.Controllers.Bi
         private readonly IRepository<OrderSpecialDetail> _orderSpecialDetailRepository;
         private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
         private readonly IRepository<OrderScreen> _orderScreenRepository;
+        private readonly IOrderSecondaryHandlingApplication _orderSecondaryHandlingApplication;
 
-        public BiOrderController(
+		public BiOrderController(
             IOrderRepository orderRepository,
             IRepository<Hotspot> hotspotTypeRepository,
             ISystemDicDataCacheManager sysDicDataCacheManager,
@@ -69,8 +72,9 @@ namespace Hotline.Api.Controllers.Bi
             IRepository<OrderSpecialDetail> orderSpecialDetailRepository,
             IRepository<WorkflowTrace> workflowTraceRepository,
             IRepository<OrderScreen> orderScreenRepository,
-            IRepository<WorkflowStepHandler> workflowStepHandleRepository
-            )
+            IRepository<WorkflowStepHandler> workflowStepHandleRepository,
+            IOrderSecondaryHandlingApplication orderSecondaryHandlingApplication
+			)
         {
             _orderRepository = orderRepository;
             _hotspotTypeRepository = hotspotTypeRepository;
@@ -91,7 +95,9 @@ namespace Hotline.Api.Controllers.Bi
             _workflowTraceRepository = workflowTraceRepository;
             _orderScreenRepository = orderScreenRepository;
             _workflowStepHandleRepository = workflowStepHandleRepository;
-        }
+            _orderSecondaryHandlingApplication = orderSecondaryHandlingApplication;
+
+		}
 
         /// <summary>
         /// 部门超期统计明细
@@ -2845,17 +2851,245 @@ namespace Hotline.Api.Controllers.Bi
         }
 
 
-        ///// <summary>
-        ///// 派单量统计明细
-        ///// </summary>
-        ///// <param name="dto"></param>
-        ///// <returns></returns>
-        //[HttpGet("send_order_detail_report")]
-        //public async Task<List<SecondaryHandlingVo>> SecondaryHandling([FromQuery] QuerySecondaryHandlingRequest dto) { 
-        
-        
-        //}
-
+		/// <summary>
+		/// 二次办理统计
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		[HttpGet("secondary_handling_report")]
+        public async Task<List<SecondaryHandlingVo>> SecondaryHandlingReport([FromQuery] QuerySecondaryHandlingRequest dto)
+        {
+	        var query = _orderSecondaryHandlingApplication.SecondaryHandlingReport(dto, HttpContext.RequestAborted);
+            return await query.ToListAsync();
+		}
+		/// <summary>
+		/// 二次办理统计导出
+		/// </summary>
+		/// <returns></returns>
+		[HttpPost("secondary_handling_report/_export")]
+        public async Task<FileStreamResult> SecondaryHandlingReportExport([FromBody] ExportExcelDto<QuerySecondaryHandlingRequest> dto)
+        {
+	        var query = _orderSecondaryHandlingApplication.SecondaryHandlingReport(dto.QueryDto, HttpContext.RequestAborted);
+	        List<SecondaryHandlingVo> secondaryHandling;
+			secondaryHandling = await query.ToListAsync(HttpContext.RequestAborted);
+	        dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+	        var dtos = secondaryHandling
+				.Select(stu => _mapper.Map(stu, typeof(SecondaryHandlingVo), dynamicClass))
+		        .Cast<object>()
+		        .ToList();
+
+	        var stream = ExcelHelper.CreateStream(dtos);
+
+	        return ExcelStreamResult(stream, "二次办理统计数据");
+        }
 
+		/// <summary>
+		/// 二次办理明细
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		[HttpGet("secondary_handling_detail_report")]
+		public async Task<PagedDto<OrderSecondaryHandlingDto>> SecondaryHandlingDetailReport([FromQuery] QuerySecondaryHandlingRequest dto)
+		{
+			var query = _orderSecondaryHandlingApplication.SecondaryHandlingDetailReport(dto, HttpContext.RequestAborted);
+			var (total, items) = await query.ToPagedListAsync(dto, HttpContext.RequestAborted);
+
+			return new PagedDto<OrderSecondaryHandlingDto>(total, _mapper.Map<IReadOnlyList<OrderSecondaryHandlingDto>>(items));
+		}
+		/// <summary>
+		/// 二次办理明细导出
+		/// </summary>
+		/// <returns></returns>
+		[HttpPost("secondary_handling_detail_report/_export")]
+		public async Task<FileStreamResult> SecondaryHandlingDetailReportExport([FromBody] ExportExcelDto<QuerySecondaryHandlingRequest> dto)
+		{
+			var query = _orderSecondaryHandlingApplication.SecondaryHandlingDetailReport(dto.QueryDto, HttpContext.RequestAborted);
+			List<OrderSecondaryHandling> secondaryHandling;
+			if (dto.IsExportAll)
+			{
+				secondaryHandling = await query.ToListAsync(HttpContext.RequestAborted);
+			}
+			else
+			{
+				var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+				secondaryHandling = items;
+			}
+
+			var secondaryHandlingDtos = _mapper.Map<ICollection<OrderSecondaryHandlingDto>>(secondaryHandling);
+
+			dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+			var dtos = secondaryHandlingDtos
+				.Select(stu => _mapper.Map(stu, typeof(OrderSecondaryHandlingDto), dynamicClass))
+				.Cast<object>()
+				.ToList();
+
+			var stream = ExcelHelper.CreateStream(dtos);
+
+			return ExcelStreamResult(stream, "二次办理列表数据");
+		}
+
+
+		/// <summary>
+		/// 二次办理满意度统计
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		[HttpGet("secondary_handling_satisfaction_report")]
+		public async Task<List<SecondaryHandlingSatisfactionVo>> SecondaryHandlingSatisfactionReport([FromQuery] QuerySecondaryHandlingRequest dto)
+		{
+			var query = _orderSecondaryHandlingApplication.SecondaryHandlingSatisfactionReport(dto, HttpContext.RequestAborted);
+			var list = await query.ToListAsync();
+            //总计
+            var total = new SecondaryHandlingSatisfactionVo
+            {
+	            TotalSumCount = list.Select(x => x.TotalSumCount).Sum(),
+	            VerySatisfiedCount = list.Select(x => x.VerySatisfiedCount).Sum(),
+	            SatisfiedCount = list.Select(x => x.SatisfiedCount).Sum(),
+	            RegardedAsSatisfiedCount = list.Select(x => x.RegardedAsSatisfiedCount).Sum(),
+	            DefaultSatisfiedCount = list.Select(x => x.DefaultSatisfiedCount).Sum(),
+	            NoSatisfiedCount = list.Select(x => x.NoSatisfiedCount).Sum(),
+	            NoEvaluateCount = list.Select(x => x.NoEvaluateCount).Sum(),
+	            NoPutThroughCount = list.Select(x => x.NoPutThroughCount).Sum()
+            };
+            list.Add(total);
+            //区县合计
+            var countyList = list.Where(x => x.OrgType == EOrgType.County).ToList();
+			var countyTotal = new SecondaryHandlingSatisfactionVo
+			{
+				TotalSumCount = countyList.Select(x => x.TotalSumCount).Sum(),
+				VerySatisfiedCount = countyList.Select(x => x.VerySatisfiedCount).Sum(),
+				SatisfiedCount = countyList.Select(x => x.SatisfiedCount).Sum(),
+				RegardedAsSatisfiedCount = countyList.Select(x => x.RegardedAsSatisfiedCount).Sum(),
+				DefaultSatisfiedCount = countyList.Select(x => x.DefaultSatisfiedCount).Sum(),
+				NoSatisfiedCount = countyList.Select(x => x.NoSatisfiedCount).Sum(),
+				NoEvaluateCount = countyList.Select(x => x.NoEvaluateCount).Sum(),
+				NoPutThroughCount = countyList.Select(x => x.NoPutThroughCount).Sum()
+			};
+			list.Add(countyTotal);
+			//市直合计
+			var cityList = list.Where(x => x.OrgType == EOrgType.City).ToList();
+			var cityTotal = new SecondaryHandlingSatisfactionVo
+			{
+				TotalSumCount = cityList.Select(x => x.TotalSumCount).Sum(),
+				VerySatisfiedCount = cityList.Select(x => x.VerySatisfiedCount).Sum(),
+				SatisfiedCount = cityList.Select(x => x.SatisfiedCount).Sum(),
+				RegardedAsSatisfiedCount = cityList.Select(x => x.RegardedAsSatisfiedCount).Sum(),
+				DefaultSatisfiedCount = cityList.Select(x => x.DefaultSatisfiedCount).Sum(),
+				NoSatisfiedCount = cityList.Select(x => x.NoSatisfiedCount).Sum(),
+				NoEvaluateCount = cityList.Select(x => x.NoEvaluateCount).Sum(),
+				NoPutThroughCount = cityList.Select(x => x.NoPutThroughCount).Sum()
+			};
+			list.Add(cityTotal);
+			return list;
+		}
+		/// <summary>
+		/// 二次办理满意度统计导出
+		/// </summary>
+		/// <returns></returns>
+		[HttpPost("secondary_handling_satisfaction_report/_export")]
+		public async Task<FileStreamResult> SecondaryHandlingSatisfactionReportExport([FromBody] ExportExcelDto<QuerySecondaryHandlingRequest> dto)
+		{
+			var query = _orderSecondaryHandlingApplication.SecondaryHandlingSatisfactionReport(dto.QueryDto, HttpContext.RequestAborted);
+			List<SecondaryHandlingSatisfactionVo> secondaryHandling;
+			secondaryHandling = await query.ToListAsync(HttpContext.RequestAborted);
+			//总计
+			var total = new SecondaryHandlingSatisfactionVo
+			{
+				TotalSumCount = secondaryHandling.Select(x => x.TotalSumCount).Sum(),
+				VerySatisfiedCount = secondaryHandling.Select(x => x.VerySatisfiedCount).Sum(),
+				SatisfiedCount = secondaryHandling.Select(x => x.SatisfiedCount).Sum(),
+				RegardedAsSatisfiedCount = secondaryHandling.Select(x => x.RegardedAsSatisfiedCount).Sum(),
+				DefaultSatisfiedCount = secondaryHandling.Select(x => x.DefaultSatisfiedCount).Sum(),
+				NoSatisfiedCount = secondaryHandling.Select(x => x.NoSatisfiedCount).Sum(),
+				NoEvaluateCount = secondaryHandling.Select(x => x.NoEvaluateCount).Sum(),
+				NoPutThroughCount = secondaryHandling.Select(x => x.NoPutThroughCount).Sum()
+			};
+			secondaryHandling.Add(total);
+			//区县合计
+			var countyList = secondaryHandling.Where(x => x.OrgType == EOrgType.County).ToList();
+			var countyTotal = new SecondaryHandlingSatisfactionVo
+			{
+				TotalSumCount = countyList.Select(x => x.TotalSumCount).Sum(),
+				VerySatisfiedCount = countyList.Select(x => x.VerySatisfiedCount).Sum(),
+				SatisfiedCount = countyList.Select(x => x.SatisfiedCount).Sum(),
+				RegardedAsSatisfiedCount = countyList.Select(x => x.RegardedAsSatisfiedCount).Sum(),
+				DefaultSatisfiedCount = countyList.Select(x => x.DefaultSatisfiedCount).Sum(),
+				NoSatisfiedCount = countyList.Select(x => x.NoSatisfiedCount).Sum(),
+				NoEvaluateCount = countyList.Select(x => x.NoEvaluateCount).Sum(),
+				NoPutThroughCount = countyList.Select(x => x.NoPutThroughCount).Sum()
+			};
+			secondaryHandling.Add(countyTotal);
+			//市直合计
+			var cityList = secondaryHandling.Where(x => x.OrgType == EOrgType.City).ToList();
+			var cityTotal = new SecondaryHandlingSatisfactionVo
+			{
+				TotalSumCount = cityList.Select(x => x.TotalSumCount).Sum(),
+				VerySatisfiedCount = cityList.Select(x => x.VerySatisfiedCount).Sum(),
+				SatisfiedCount = cityList.Select(x => x.SatisfiedCount).Sum(),
+				RegardedAsSatisfiedCount = cityList.Select(x => x.RegardedAsSatisfiedCount).Sum(),
+				DefaultSatisfiedCount = cityList.Select(x => x.DefaultSatisfiedCount).Sum(),
+				NoSatisfiedCount = cityList.Select(x => x.NoSatisfiedCount).Sum(),
+				NoEvaluateCount = cityList.Select(x => x.NoEvaluateCount).Sum(),
+				NoPutThroughCount = cityList.Select(x => x.NoPutThroughCount).Sum()
+			};
+			secondaryHandling.Add(cityTotal);
+
+			dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+			var dtos = secondaryHandling
+				.Select(stu => _mapper.Map(stu, typeof(SecondaryHandlingSatisfactionVo), dynamicClass))
+				.Cast<object>()
+				.ToList();
+
+			var stream = ExcelHelper.CreateStream(dtos);
+
+			return ExcelStreamResult(stream, "二次办理满意度统计数据");
+		}
+
+		/// <summary>
+		/// 二次办理满意度明细
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		[HttpGet("secondary_handling_satisfaction_detail_report")]
+		public async Task<PagedDto<OrderSecondaryHandlingDto>> SecondaryHandlingSatisfactionDetailReport([FromQuery] QuerySecondaryHandlingRequest dto)
+		{
+			var query = _orderSecondaryHandlingApplication.SecondaryHandlingSatisfactionDetailReport(dto, HttpContext.RequestAborted);
+			var (total, items) = await query.ToPagedListAsync(dto, HttpContext.RequestAborted);
+
+			return new PagedDto<OrderSecondaryHandlingDto>(total, _mapper.Map<IReadOnlyList<OrderSecondaryHandlingDto>>(items));
+		}
+		/// <summary>
+		/// 二次办理满意度明细导出
+		/// </summary>
+		/// <returns></returns>
+		[HttpPost("secondary_handling_satisfaction_detail_report/_export")]
+		public async Task<FileStreamResult> SecondaryHandlingSatisfactionDetailReport([FromBody] ExportExcelDto<QuerySecondaryHandlingRequest> dto)
+		{
+			var query = _orderSecondaryHandlingApplication.SecondaryHandlingSatisfactionDetailReport(dto.QueryDto, HttpContext.RequestAborted);
+			List<OrderSecondaryHandling> secondaryHandling;
+			if (dto.IsExportAll)
+			{
+				secondaryHandling = await query.ToListAsync(HttpContext.RequestAborted);
+			}
+			else
+			{
+				var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+				secondaryHandling = items;
+			}
+
+			var secondaryHandlingDtos = _mapper.Map<ICollection<OrderSecondaryHandlingDto>>(secondaryHandling);
+
+			dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+			var dtos = secondaryHandlingDtos
+				.Select(stu => _mapper.Map(stu, typeof(OrderSecondaryHandlingDto), dynamicClass))
+				.Cast<object>()
+				.ToList();
+
+			var stream = ExcelHelper.CreateStream(dtos);
+
+			return ExcelStreamResult(stream, "二次办理满意度列表数据");
+		}
 	}
 }

+ 5 - 0
src/Hotline.Application/Orders/IOrderSecondaryHandlingApplication.cs

@@ -1,5 +1,6 @@
 using Hotline.Orders;
 using Hotline.Share.Dtos.Order;
+using Hotline.Share.Requests;
 using SqlSugar;
 using System;
 using System.Collections.Generic;
@@ -18,5 +19,9 @@ namespace Hotline.Application.Orders
 		ISugarQueryable<OrderVisitDetail> ApplyQuery(MayScreenListDto dto, CancellationToken cancellationToken);
 		Task<OrderSecondaryHandling> Entity(string id, CancellationToken cancellationToken);
 		ISugarQueryable<OrderSecondaryHandling> Query(SecondaryHandlingListDto dto, CancellationToken cancellationToken);
+		ISugarQueryable<SecondaryHandlingVo> SecondaryHandlingReport(QuerySecondaryHandlingRequest dto, CancellationToken cancellationToken);
+		ISugarQueryable<OrderSecondaryHandling> SecondaryHandlingDetailReport(QuerySecondaryHandlingRequest dto, CancellationToken cancellationToken);
+		ISugarQueryable<SecondaryHandlingSatisfactionVo> SecondaryHandlingSatisfactionReport(QuerySecondaryHandlingRequest dto, CancellationToken cancellationToken);
+		ISugarQueryable<OrderSecondaryHandling> SecondaryHandlingSatisfactionDetailReport(QuerySecondaryHandlingRequest dto, CancellationToken cancellationToken);
 	}
 }

+ 127 - 7
src/Hotline.Application/Orders/OrderSecondaryHandlingApplication.cs

@@ -20,6 +20,8 @@ using XF.Domain.Dependency;
 using XF.Domain.Exceptions;
 using XF.Domain.Repository;
 using Hotline.Share.Requests;
+using Hotline.Settings;
+using Novacode;
 
 namespace Hotline.Application.Orders
 {
@@ -289,16 +291,134 @@ namespace Hotline.Application.Orders
 				.FirstAsync(x => x.Id == id, cancellationToken);
 		}
 
-		//public async ISugarQueryable<OrderSecondaryHandling> SecondaryHandlingReport(QuerySecondaryHandlingRequest dto) { 
+		/// <summary>
+		/// 二次办理统计
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		public  ISugarQueryable<SecondaryHandlingVo> SecondaryHandlingReport(QuerySecondaryHandlingRequest dto, CancellationToken cancellationToken)
+		{
+			return _orderSecondaryHandlingRepository.Queryable()
+				.WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
+				.WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
+				.WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.ApplyOrgName.Equals(dto.OrgName))
+				.Where(x => x.State == ESecondaryHandlingState.End)
+				.GroupBy(x => new { x.ApplyOrgId, x.ApplyOrgName })
+				.Select(x => new SecondaryHandlingVo
+				{
+					OrgId = x.ApplyOrgId,
+					OrgName = x.ApplyOrgName,
+					Num = SqlFunc.AggregateCount(x.Id)
+				})
+				.OrderByIF(dto.SortRule == 0, x => x.Num, OrderByType.Asc)
+				.OrderByIF(dto.SortRule == 1, x => x.Num, OrderByType.Desc);
+		}
+
+		/// <summary>
+		/// 二次办理统计明细
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		public ISugarQueryable<OrderSecondaryHandling> SecondaryHandlingDetailReport(QuerySecondaryHandlingRequest dto, CancellationToken cancellationToken)
+		{
+			return _orderSecondaryHandlingRepository.Queryable()
+				.Includes(x=>x.Order)
+				.Includes(x=>x.Visit)
+				.Includes(x=>x.VisitDetail)
+				.WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
+				.WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
+				.WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.ApplyOrgName.Equals(dto.OrgName))
+				.Where(x=>x.ApplyOrgId == dto.OrgId)
+				.Where(x => x.State == ESecondaryHandlingState.End)
+				.GroupBy(x => new { x.ApplyOrgId, x.ApplyOrgName });
+		}
 
-		//	 return _orderSecondaryHandlingRepository.Queryable()
-		//		.WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
-		//		 .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
-		//		 .WhereIF(string.IsNullOrEmpty(dto.OrgName),x=>x.ApplyOrgName.Equals(dto.OrgName))
-		//		 .Where(x=>x.State == ESecondaryHandlingState.End)
 
+		/// <summary>
+		/// 二次办理满意度统计
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		public ISugarQueryable<SecondaryHandlingSatisfactionVo> SecondaryHandlingSatisfactionReport(QuerySecondaryHandlingRequest dto, CancellationToken cancellationToken) 
+		{
+			return _orderSecondaryHandlingRepository.Queryable()
+				.Includes(x => x.Order)
+				.Includes(x => x.Visit)
+				.Includes(x => x.VisitDetail)
+				.Includes(x => x.Order, o => o.CallRecord)
+				.LeftJoin<SystemOrganize>((x, o) => x.ApplyOrgId == o.Id)
+				.WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
+				.WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
+				.WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.ApplyOrgName.Equals(dto.OrgName))
+				.WhereIF(!string.IsNullOrEmpty(dto.CDPN), x => x.Order.CallRecord.CDPN.Contains(dto.CDPN))
+				.GroupBy(x => new { x.ApplyOrgId, x.ApplyOrgName })
+				.Select((x, o) => new SecondaryHandlingSatisfactionVo()
+				{
+					OrgId = x.ApplyOrgId,
+					OrgName = x.ApplyOrgName,
+					OrgType = o.OrgType,
+					TotalSumCount = SqlFunc.AggregateCount(x.Id),
+					VerySatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "5", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "5", 1, 0))),//非常满意数
+					SatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "4", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数
+					RegardedAsSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "-1", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "-1", 1, 0))),//视为满意
+					DefaultSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "0", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "0", 1, 0))),//默认满意
+					NoSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "2", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "2", 1, 0))),//不满意
+					NoEvaluateCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "7", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "7", 1, 0))),//未做评价
+					NoPutThroughCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "6", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "6", 1, 0))),//未接通
+				});
+		}
+
+		/// <summary>
+		///  二次办理满意度统计明细
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		public ISugarQueryable<OrderSecondaryHandling> SecondaryHandlingSatisfactionDetailReport(QuerySecondaryHandlingRequest dto, CancellationToken cancellationToken)
+		{
+			var key = string.Empty;
+			if (!string.IsNullOrEmpty(dto.Header))
+			{
+				switch (dto.Header)
+				{
+					case "verySatisfiedCount":
+						key = "5";
+						break;
+					case "satisfiedCount":
+						key = "4";
+						break;
+					case "regardedAsSatisfiedCount":
+						key = "-1";
+						break;
+					case "defaultSatisfiedCount":
+						key = "0";
+						break;
+					case "noSatisfiedCount":
+						key = "2";
+						break;
+					case "noEvaluateCount":
+						key = "7";
+						break;
+					case "noPutThroughCount":
+						key = "6";
+						break;
+				}
+			}
 
-		//}
+			return _orderSecondaryHandlingRepository.Queryable()
+				.Includes(x => x.Order)
+				.Includes(x => x.Visit)
+				.Includes(x => x.VisitDetail)
+				.Includes(x => x.Order, o => o.CallRecord)
+				.WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
+				.WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
+				.WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.ApplyOrgName.Equals(dto.OrgName))
+				.WhereIF(!string.IsNullOrEmpty(dto.CDPN), x => x.Order.CallRecord.CDPN.Contains(dto.CDPN))
+				.WhereIF(dto.TypeId is 1 && !string.IsNullOrEmpty(key), x=> SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == key)
+				.WhereIF(dto.TypeId is 2 && !string.IsNullOrEmpty(key), x => SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == key)
+				.Where(x => x.ApplyOrgId == dto.OrgId)
+				.Where(x => x.State == ESecondaryHandlingState.End)
+				.GroupBy(x => new { x.ApplyOrgId, x.ApplyOrgName });
+		}
 
 	}
 }

+ 11 - 0
src/Hotline.Share/Requests/PagedKeywordRequest.cs

@@ -157,6 +157,17 @@ public record QuerySecondaryHandlingRequest : ReportPagedRequest
 {
 	public string? OrgName { get; set; }
 
+	public string? OrgId { get; set; }
+
+	/// <summary>
+	///  1  办件结果
+	/// </summary>
+	public int  TypeId { get; set; }
+
+	public string? CDPN { get; set; }
+
+	public string Header { get; set; }
+
 }
 
 public record QueryOrderReTransactDetailRequest : ReportPagedRequest