Browse Source

热点受理类型统计

田爽 8 months ago
parent
commit
2a007bc158

+ 71 - 1
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -3398,5 +3398,75 @@ namespace Hotline.Api.Controllers.Bi
 
             return ExcelStreamResult(stream, "热点满意度明细数据");
         }
-    }
+
+        /// <summary>
+        /// 热点受理类型统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("hotspot-accepttype-statistics")]
+        public async Task<object> HotspotAndAcceptTypeStatistics([FromQuery] HotspotAndAcceptTypeStatisticsReq dto)
+        {
+
+	        var (areaList, returnList) = await _orderApplication.HotspotAndAcceptTypeStatistics(dto);
+
+	        return new { AreaList = areaList, Data = returnList };
+        }
+
+		/// <summary>
+		/// 热点受理类型统计导出
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		[HttpPost("hotspot-accepttype-statistics-export")]
+        public async Task<FileStreamResult> HotspotAndAcceptTypeStatisticsExport([FromBody] HotspotAndAcceptTypeStatisticsReq dto)
+        {
+	        var returnList = await _orderApplication.HotspotAndAcceptTypeStatisticsExport(dto);
+	        var table = _orderApplication.InitHotspotTable(returnList, dto.AddColumnName, dto.HotspotLevel);
+	        var stream = ExcelHelper.CreateStream(table);
+	        return ExcelStreamResult(stream, "热点受理类型统计");
+        }
+
+		/// <summary>
+		/// 热点受理类型明细
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		[HttpGet("hotspot-accepttype-statistics-detail")]
+        public async Task<PagedDto<OrderDto>> HotspotAndAcceptTypeStatisticsDetail([FromQuery] HotspotAndAcceptTypeStatisticsDetailReq dto)
+        {
+	        var (total, items) = await _orderApplication.HotspotAndAcceptTypeStatisticsDetail(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+	        return  new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
+		}
+		/// <summary>
+		/// 热点受理类型明细导出
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		[HttpPost("hotspot-accepttype-statistics-detail-export")]
+        public async Task<FileStreamResult> HotspotAndAcceptTypeStatisticsDetailExport([FromBody] ExportExcelDto<HotspotAndAcceptTypeStatisticsDetailReq> dto)
+        {
+	        var query = _orderApplication.HotspotAndAcceptTypeStatisticsDetail(dto.QueryDto);
+
+	        List<Order> orders;
+	        if (dto.IsExportAll)
+	        {
+		        orders = await query.ToListAsync(HttpContext.RequestAborted);
+	        }
+	        else
+	        {
+		        var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+		        orders = items;
+	        }
+	        var ordersDtos = _mapper.Map<ICollection<OrderDto>>(orders);
+	        dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+	        var dtos = ordersDtos
+		        .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
+		        .Cast<object>()
+		        .ToList();
+
+	        var stream = ExcelHelper.CreateStream(dtos);
+	        return ExcelStreamResult(stream, "热点受理类型明细");
+        }
+	}
 }

+ 23 - 1
src/Hotline.Application/Orders/IOrderApplication.cs

@@ -193,5 +193,27 @@ namespace Hotline.Application.Orders
         /// <returns></returns>
         ISugarQueryable<OrderBiCentreDataListVo> CentreDataList(ReportPagedRequest dto);
 
-    }
+		/// <summary>
+		/// 热点受理类型统计
+        /// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		Task<(List<SystemArea> area, object items)> HotspotAndAcceptTypeStatistics(HotspotAndAcceptTypeStatisticsReq dto);
+
+
+		/// <summary>
+		/// 热点受理类型统计--导出
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		Task<DataTable> HotspotAndAcceptTypeStatisticsExport(HotspotAndAcceptTypeStatisticsReq dto);
+
+        /// <summary>
+        /// 热点受理类型明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<Order> HotspotAndAcceptTypeStatisticsDetail(HotspotAndAcceptTypeStatisticsDetailReq dto);
+
+	}
 }

+ 156 - 12
src/Hotline.Application/Orders/OrderApplication.cs

@@ -72,9 +72,10 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     private readonly IRepository<SystemArea> _systemAreaRepository;
     private readonly IRepository<Hotspot> _hotspotRepository;
     private readonly IRepository<WorkflowStep> _workflowStepRepository;
+    private readonly IRepository<SystemDicData> _systemDicDataRepository;
 
 
-    public OrderApplication(
+	public OrderApplication(
         IOrderDomainService orderDomainService,
         IOrderRepository orderRepository,
         IWorkflowDomainService workflowDomainService,
@@ -94,8 +95,9 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         IRepository<OrderSpecialDetail> orderSpecialDetailRepository,
         IRepository<SystemArea> systemAreaRepository,
         IRepository<Hotspot> hotspotRepository,
-        IRepository<WorkflowStep> workflowStepRepository
-        )
+        IRepository<WorkflowStep> workflowStepRepository,
+        IRepository<SystemDicData> systemDicDataRepository
+		)
     {
         _orderDomainService = orderDomainService;
         _workflowDomainService = workflowDomainService;
@@ -117,7 +119,9 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         _systemAreaRepository = systemAreaRepository;
         _hotspotRepository = hotspotRepository;
         _workflowStepRepository = workflowStepRepository;
-    }
+        _systemDicDataRepository = systemDicDataRepository;
+
+	}
 
     /// <summary>
     /// 更新工单办理期满时间(延期调用,其他不调用)
@@ -1454,15 +1458,155 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         }
         return query;
     }
-    #region private
 
-    /// <summary>
-    /// 接受外部工单(除省平台)
-    /// </summary>
-    /// <param name="dto"></param>
-    /// <param name="cancellationToken"></param>
-    /// <returns></returns>
-    private async Task<AddOrderResponse> ReceiveOrderFromOtherPlatformAsync(AddOrderDto dto, List<FileDto> files,
+	/// <summary>
+	/// 热点受理类型统计
+	/// </summary>
+	/// <param name="dto"></param>
+	/// <returns></returns>
+	public async Task<(List<SystemDicData> area, object items)> HotspotAndAcceptTypeStatistics(HotspotAndAcceptTypeStatisticsReq dto)
+	{
+		dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
+		var dicList = _systemDicDataRepository.Queryable().Where(x => x.DicTypeCode == "AcceptType").OrderBy(x => x.Sort).MergeTable();
+		var endIndex = (2 * dto.HotspotLevel).ToString();
+		var hotspotList = _hotspotRepository.Queryable().Where(x => SqlFunc.Length(x.Id) == int.Parse(endIndex))
+			.Select(x => new
+			{
+				HotspotId = x.Id,
+				HotspotName = x.HotSpotFullName,
+			}).MergeTable();
+    
+		var orderList = _orderRepository.Queryable().Where(x => x.CreationTime >= dto.StartTime && x.CreationTime < dto.EndTime)
+			.Select(x => new
+			{
+				HotspotId = x.HotspotId.Substring(0, int.Parse(endIndex)),
+				AcceptTypeCode = x.AcceptTypeCode,
+			}).MergeTable();
+
+		var hotListAndOrder = hotspotList.LeftJoin(orderList, (it, o) => it.HotspotId == o.HotspotId)
+			 .GroupBy((it, o) => new
+			 {
+				 it.HotspotId,
+				 it.HotspotName,
+				 AcceptTypeCode = o.AcceptTypeCode,
+			 })
+			 .OrderBy((it, o) => it.HotspotId)
+			 .Select((it, o) => new
+			 {
+				 HotspotId = it.HotspotId,
+				 HotspotName = it.HotspotName,
+				 AcceptTypeCode = o.AcceptTypeCode,
+				 Count = SqlFunc.AggregateCount(it.HotspotId)
+			 }).MergeTable();
+
+		var returnList = await dicList.LeftJoin(hotListAndOrder, (pp, dd) => pp.DicDataValue == dd.AcceptTypeCode)
+		   .GroupBy((pp, dd) => new
+		   {
+			   HotspotId = dd.HotspotId,
+			   HotspotName = dd.HotspotName,
+			   AcceptTypeCode = pp.DicDataValue,
+			   AcceptType = pp.DicDataName,
+		   })
+		   .OrderBy((pp, dd) => dd.HotspotId)
+		   .Select((pp, dd) => new
+		   {
+			   HotspotId = dd.HotspotId,
+			   HotspotName = dd.HotspotName,
+			   AcceptTypeCode = pp.DicDataValue,
+			   AcceptType = pp.DicDataName,
+			   Count = SqlFunc.AggregateSum(dd.Count)
+		   }).ToPivotListAsync(q => q.AcceptTypeCode, q => new { q.HotspotName, q.HotspotId }, q => q.Sum(x => x.Count));
+
+		var titleList = await _systemDicDataRepository.Queryable().Where(x => x.DicTypeCode == "AcceptType").OrderBy(x => x.Sort).ToListAsync();
+		return (titleList, returnList);
+	}
+
+	/// <summary>
+	/// 热点受理类型统计--导出
+	/// </summary>
+	/// <param name="dto"></param>
+	/// <returns></returns>
+	public async Task<DataTable> HotspotAndAcceptTypeStatisticsExport(HotspotAndAcceptTypeStatisticsReq dto)
+	{
+		dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
+		var dicList = _systemDicDataRepository.Queryable().Where(x => x.DicTypeCode == "AcceptType").OrderBy(x => x.Sort).MergeTable();
+		var endIndex = (2 * dto.HotspotLevel).ToString();
+		var hotspotList = _hotspotRepository.Queryable().Where(x => SqlFunc.Length(x.Id) == int.Parse(endIndex))
+			.Select(x => new
+			{
+				HotspotId = x.Id,
+				HotspotName = x.HotSpotFullName,
+			}).MergeTable();
+
+		var orderList = _orderRepository.Queryable().Where(x => x.CreationTime >= dto.StartTime && x.CreationTime < dto.EndTime)
+			.Select(x => new
+			{
+				HotspotId = x.HotspotId.Substring(0, int.Parse(endIndex)),
+				AcceptTypeCode = x.AcceptTypeCode,
+			}).MergeTable();
+
+		var hotListAndOrder = hotspotList.LeftJoin(orderList, (it, o) => it.HotspotId == o.HotspotId)
+			 .GroupBy((it, o) => new
+			 {
+				 it.HotspotId,
+				 it.HotspotName,
+				 AcceptTypeCode = o.AcceptTypeCode,
+			 })
+			 .OrderBy((it, o) => it.HotspotId)
+			 .Select((it, o) => new
+			 {
+				 HotspotId = it.HotspotId,
+				 HotspotName = it.HotspotName,
+				 AcceptTypeCode = o.AcceptTypeCode,
+				 Count = SqlFunc.AggregateCount(it.HotspotId)
+			 }).MergeTable();
+
+
+		var returnList = await dicList.LeftJoin(hotListAndOrder, (pp, dd) => pp.DicDataValue == dd.AcceptTypeCode)
+		   .GroupBy((pp, dd) => new
+		   {
+			   HotspotId = dd.HotspotId,
+			   HotspotName = dd.HotspotName,
+			   AcceptTypeCode = pp.DicDataValue,
+			   AcceptType = pp.DicDataName,
+		   })
+		   .OrderBy((pp, dd) => dd.HotspotId)
+		   .Select((pp, dd) => new
+		   {
+			   HotspotId = dd.HotspotId,
+			   HotspotName = dd.HotspotName,
+			   AcceptTypeCode = pp.DicDataValue,
+			   AcceptType = pp.DicDataName,
+			   Count = SqlFunc.AggregateSum(dd.Count)
+		   }).ToPivotTableAsync(q => q.AcceptTypeCode, q => new { q.HotspotName }, q => q.Sum(x => x.Count));
+		//returnList.Rows.RemoveAt(returnList.Rows.Count-1);
+		return returnList;
+	}
+
+	/// <summary>
+	/// 热点受理类型统计明细
+	/// </summary>
+	/// <param name="dto"></param>
+	/// <returns></returns>
+	public ISugarQueryable<Order> HotspotAndAcceptTypeStatisticsDetail(HotspotAndAcceptTypeStatisticsDetailReq dto)
+	{
+		dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
+		var query = _orderRepository.Queryable()
+			.Where(x => x.HotspotId.StartsWith(dto.HotspotId) && x.CreationTime >= dto.StartTime && x.CreationTime < dto.EndTime)
+			.WhereIF(!string.IsNullOrEmpty(dto.AcceptTypeCode), x => x.AcceptTypeCode.StartsWith(dto.AcceptTypeCode))
+            .OrderByDescending(x => x.CreationTime);
+		return query;
+	}
+
+	#region private
+
+	/// <summary>
+	/// 接受外部工单(除省平台)
+	/// </summary>
+	/// <param name="dto"></param>
+	/// <param name="cancellationToken"></param>
+	/// <returns></returns>
+	private async Task<AddOrderResponse> ReceiveOrderFromOtherPlatformAsync(AddOrderDto dto, List<FileDto> files,
         ISessionContext current, CancellationToken cancellationToken)
     {
         if (string.IsNullOrEmpty(dto.ExternalId))

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

@@ -689,3 +689,29 @@ public class AcceptTypeStatisticsDto
     /// </summary>
     public string SumCountRate { get; set; }
 }
+
+public record HotspotAndAcceptTypeStatisticsReq
+{
+	public int HotspotLevel { get; set; }
+
+	public DateTime StartTime { get; set; }
+
+	public DateTime EndTime { get; set; }
+
+	/// <summary>
+	/// 导出列名
+	/// </summary>
+	public List<string> AddColumnName { get; set; } = new();
+
+}
+
+public record HotspotAndAcceptTypeStatisticsDetailReq : PagedRequest
+{
+	public string? AcceptTypeCode { get; set; }
+
+	public string HotspotId { get; set; }
+
+	public DateTime StartTime { get; set; }
+
+	public DateTime EndTime { get; set; }
+}