田爽 6 дней назад
Родитель
Сommit
2a377ef1ab

+ 42 - 45
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -4877,55 +4877,52 @@ namespace Hotline.Api.Controllers.Bi
             if (!dto.StartTime.HasValue || !dto.EndTime.HasValue)
                 throw UserFriendlyException.SameMessage("请选择时间!");
 
-            var (total, items) = await _workflowTraceRepository.Queryable()
-                //.LeftJoin<Workflow>((x, w) => x.WorkflowId == w.Id)
-                .InnerJoin<SchedulingUser>((x, su) => x.HandlerId == su.UserId)
-                .Where((x, su) => x.ModuleCode == "OrderHandle" && x.BusinessType == EBusinessType.Send)
-                .Where((x, su) => x.CreationTime >= dto.StartTime.Value && x.CreationTime <= dto.EndTime.Value && su.UserId == dto.UserId)
-                .WhereIF(dto.TitleCode.ToUpper() == "NOSENDORDERNUM", (x, su) => x.Status != EWorkflowStepStatus.Handled)
-                .WhereIF(dto.TitleCode.ToUpper() == "SENDORDERNUM", (x, su) => x.Status == EWorkflowStepStatus.Handled)
-                .GroupBy((x, su) => x.ExternalId)
-                .Select((x, su) => new { Id = x.ExternalId })
-                .MergeTable()
-                .LeftJoin<Order>((a, b) => a.Id == b.Id)
-                .Select((a, b) => b)
-                .ToPagedListAsync(dto, HttpContext.RequestAborted);
+            var (total, items) = await _orderApplication.QuerySendOrderDetail(dto).ToPagedListAsync(dto, HttpContext.RequestAborted);
 
-            if (dto.TitleCode.ToUpper() == "RESENDORDERNUM")
-            {
-                (total, items) = await _workflowTraceRepository.Queryable()
-                       .LeftJoin<Workflow>((x, w) => x.WorkflowId == w.Id)
-                       //.LeftJoin<WorkflowStepHandler>((x, w, wfsh) => x.StepId == wfsh.WorkflowStepId && wfsh.IsActualHandler == true)
-                       .InnerJoin<SchedulingUser>((x, w, su) => x.HandlerId == su.UserId)
-                       .Where((x, w, su) => w.ModuleCode == "OrderHandle" && x.BusinessType == EBusinessType.Send && x.Status == EWorkflowStepStatus.Handled
-                                            && !string.IsNullOrEmpty(x.NextMainHandler) && x.NextMainHandler != OrgSeedData.CenterId)
-                       .Where((x, w, su) => x.CreationTime >= dto.StartTime.Value)
-                       .Where((x, w, su) => x.CreationTime <= dto.EndTime.Value)
-                       .GroupBy((x, w, su) => x.WorkflowId)
-                       .Having((x, w, su) => SqlFunc.AggregateCount(x.WorkflowId) > 1)
-                        .Select((x, w, su) => new { Id = x.WorkflowId, CreationTime = SqlFunc.AggregateMin(x.CreationTime) })
-                       .MergeTable()
-                       .LeftJoin<WorkflowTrace>((a, wt) => a.Id == wt.WorkflowId)
-                       .LeftJoin<Workflow>((a, wt, wf) => wt.WorkflowId == wf.Id)
-                       //.LeftJoin<WorkflowStepHandler>((a, wt, wf, wsh) => wt.StepId == wsh.WorkflowStepId && wsh.CreationTime == a.CreationTime)
-                       .InnerJoin<SchedulingUser>((a, wt, wf, su) => wt.HandlerId == su.UserId)
-                       .Where((a, wt, wf, su) => su.UserId == dto.UserId)
-                       .GroupBy((a, wt, wf, su) => wf.ExternalId)
-                       .Select((a, wt, wf, su) => new { Id = wf.ExternalId })
-                       .MergeTable()
-                       .LeftJoin<Order>((a, b) => a.Id == b.Id)
-                       .Select((a, b) => b)
-                       .ToPagedListAsync(dto, HttpContext.RequestAborted);
-            }
             return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
         }
 
-        /// <summary>
-        /// 二次办理统计
-        /// </summary>
-        /// <param name="dto"></param>
-        /// <returns></returns>
-        [HttpGet("secondary_handling_report")]
+
+		/// <summary>
+		/// 派单量统计明细
+		/// </summary>
+		/// <returns></returns>
+		[HttpPost("send_order_detail_report/_export")]
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> QuerySendOrderDetailExport([FromBody] ExportExcelDto<QuerySendOrderDetailRequest> dto)
+		{
+			var query =  _orderApplication.QuerySendOrderDetail(dto.QueryDto);
+			List<Order> data;
+			if (dto.IsExportAll)
+			{
+				data = await query.ToListAsync(HttpContext.RequestAborted);
+			}
+			else
+			{
+				var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+				data = items;
+			}
+
+			var secondaryHandlingDtos = _mapper.Map<ICollection<OrderDto>>(data);
+
+			dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderDto>(dto.ColumnInfos);
+
+			var dtos = secondaryHandlingDtos
+				.Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
+				.Cast<object>()
+				.ToList();
+
+			var stream = ExcelHelper.CreateStream(dtos);
+
+			return ExcelStreamResult(stream, "二次办理列表数据");
+		}
+
+		/// <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);

+ 8 - 6
src/Hotline.Application/OrderApp/IOrderApplication.cs

@@ -25,12 +25,14 @@ namespace Hotline.Application.OrderApp
         /// <returns></returns>
         Task<List<SendOrderReportOutDto>> SendOrderReportAsync(QuerySendOrderRequest dto);
 
-        /// <summary>
-        /// 更新工单办理期满时间
-        /// 1.更新工单 2.更新流程
-        /// </summary>
-        /// <returns></returns>
-        Task DelayOrderExpiredTimeAsync(string orderId, int timeCount, ETimeType timeType, bool IsProDelay, CancellationToken cancellationToken);
+        ISugarQueryable<Order> QuerySendOrderDetail(QuerySendOrderDetailRequest dto);
+
+		/// <summary>
+		/// 更新工单办理期满时间
+		/// 1.更新工单 2.更新流程
+		/// </summary>
+		/// <returns></returns>
+		Task DelayOrderExpiredTimeAsync(string orderId, int timeCount, ETimeType timeType, bool IsProDelay, CancellationToken cancellationToken);
 
         // /// <summary>
         // /// 新增工单办理流程记录

+ 181 - 6
src/Hotline.Application/OrderApp/OrderApplication.cs

@@ -64,6 +64,7 @@ using XF.Domain.Authentications;
 using XF.Domain.Dependency;
 using XF.Domain.Exceptions;
 using XF.Domain.Repository;
+using static Org.BouncyCastle.Asn1.Cmp.Challenge;
 using WordInfo = PanGu.WordInfo;
 
 namespace Hotline.Application.OrderApp;
@@ -5508,6 +5509,10 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     /// <returns></returns>
     public async Task<List<SendOrderReportOutDto>> SendOrderReportAsync(QuerySendOrderRequest dto)
     {
+        if (_appOptions.Value.IsLuZhou)
+        {
+           return  await SendOrderReportAsync_LZ(dto);
+        }
         var itemsHandled = _workflowTraceRepository.Queryable()
             .LeftJoin<Workflow>((x, w) => x.WorkflowId == w.Id)
             .InnerJoin<SchedulingUser>((x, w, su) => x.HandlerId == su.UserId)
@@ -5596,13 +5601,183 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         return res;
     }
 
+	/// <summary>
+	/// 泸州派单量统计
+	/// </summary>
+	/// <param name="dto"></param>
+	/// <returns></returns>
+	public async Task<List<SendOrderReportOutDto>> SendOrderReportAsync_LZ(QuerySendOrderRequest dto)
+    {
+		var itemsHandled = _workflowTraceRepository.Queryable()
+			   .LeftJoin<Workflow>((x, w) => x.WorkflowId == w.Id)
+			   .Where((x, w) => w.ModuleCode == "OrderHandle" && x.BusinessType == EBusinessType.Send && x.Status == EWorkflowStepStatus.Handled)
+			   .Where((x, w) => x.HandleTime >= dto.StartTime.Value)
+			   .Where((x, w) => x.HandleTime <= dto.EndTime.Value)
+			   .WhereIF(!string.IsNullOrEmpty(dto.UserName), (x, w) => x.HandlerName == dto.UserName)
+			   .GroupBy((x, w) => new { x.HandlerId,x.HandlerName,x.Name})
+			   .Select((x, w) => new BiOrderSendVo
+			   {
+				   UserId = x.HandlerId,
+				   UserName = x.HandlerName,
+                   StepName = x.Name,
+				   SendOrderNum = SqlFunc.AggregateDistinctCount(w.ExternalId),
+				   NoSendOrderNum = 0,
+			   });
+		var itemsNo = _workflowTraceRepository.Queryable()
+			.LeftJoin<Workflow>((x, w) => x.WorkflowId == w.Id)
+			.Where((x, w) => w.ModuleCode == "OrderHandle" && x.BusinessType == EBusinessType.Send && x.Status != EWorkflowStepStatus.Handled)
+			.Where((x, w) => x.CreationTime >= dto.StartTime.Value)
+			.Where((x, w) => x.CreationTime <= dto.EndTime.Value)
+			.WhereIF(!string.IsNullOrEmpty(dto.UserName), (x, w) => x.HandlerName == dto.UserName)
+			.GroupBy((x, w) => new { x.HandlerId, x.HandlerName, x.Name })
+			.Select((x, w) => new BiOrderSendVo
+			{
+				UserId = x.HandlerId,
+				UserName = x.HandlerName,
+				StepName = x.Name,
+				SendOrderNum = 0,
+				NoSendOrderNum = SqlFunc.AggregateDistinctCount(w.ExternalId),
+			});
+        
+		var items2 =  _workflowTraceRepository.Queryable()
+			.LeftJoin<Workflow>((x, w) => x.WorkflowId == w.Id)
+			.Where((x, w) => w.ModuleCode == WorkflowModuleConsts.OrderHandle && x.BusinessType == EBusinessType.Send &&
+								 x.Status == EWorkflowStepStatus.Handled
+								 && !string.IsNullOrEmpty(x.NextMainHandler) && x.NextMainHandler != OrgSeedData.CenterId)
+			.Where((x, w) => x.CreationTime >= dto.StartTime.Value)
+			.Where((x, w) => x.CreationTime <= dto.EndTime.Value)
+			.GroupBy((x, w) => x.WorkflowId)
+			.Having((x, w) => SqlFunc.AggregateCount(x.WorkflowId) > 1)
+			.Select((x, w) => new { Id = x.WorkflowId, CreationTime = SqlFunc.AggregateMin(x.CreationTime) })
+			.MergeTable()
+			.LeftJoin<WorkflowTrace>((a, wt) => a.Id == wt.WorkflowId)
+			.WhereIF(!string.IsNullOrEmpty(dto.UserName), ((a, wt) => wt.HandlerName == dto.UserName))
+			.GroupBy((a, wt) => new { wt.HandlerId, wt.HandlerName ,wt.Name })
+			.Select((a, wt) => new BiOrderSendVo
+			{
+				UserId = wt.HandlerId,
+				UserName = wt.HandlerName,
+				StepName = wt.Name,
+				SendOrderNum = 0,
+				NoSendOrderNum = 0,
+				ReSendOrderNum = SqlFunc.AggregateDistinctCount(wt.ExternalId),
+			});
+
+		var items = await _orderRepository.UnionAll(itemsHandled, itemsNo,itemsHandled)
+		 .GroupBy(x => new { x.UserId, x.UserName, x.StepName })
+		 .Select(x => new BiOrderSendVo
+		 {
+			 UserId = x.UserId,
+			 UserName = x.UserName,
+			 StepName = x.StepName,
+			 SendOrderNum = SqlFunc.AggregateSum(x.SendOrderNum),
+			 NoSendOrderNum = SqlFunc.AggregateSum(x.NoSendOrderNum),
+			 ReSendOrderNum = SqlFunc.AggregateSum(x.ReSendOrderNum)
+		 }).MergeTable().Select(p=> new SendOrderReportOutDto {
+         UserId =p.UserId,
+			 UserName = p.UserName,
+			 StepName = p.StepName,
+			 SendOrderNum = p.SendOrderNum,
+             NoSendOrderNum = p.NoSendOrderNum,
+			 ReSendOrderNum = p.ReSendOrderNum,
+             ChainRate = p.AccuracyRate
+		 }).ToListAsync();
+		return items;
+	}
 
-    /// <summary>
-    /// 扭转信件统计
-    /// </summary>
-    /// <param name="dto"></param>
-    /// <returns></returns>
-    public ISugarQueryable<OrderVisitJudeStatisticsRep> OrderVisitJudeStatistics(OrderVisitJudeStatisticsReq dto)
+
+    public ISugarQueryable<Order> QuerySendOrderDetail(QuerySendOrderDetailRequest dto) 
+    {
+        if (_appOptions.Value.IsLuZhou)
+        {
+            return QuerySendOrderDetail_LZ(dto);
+
+		}
+		if (dto.TitleCode.ToUpper() == "RESENDORDERNUM")
+        {
+           var query = _workflowTraceRepository.Queryable()
+                         .LeftJoin<Workflow>((x, w) => x.WorkflowId == w.Id)
+                         .InnerJoin<SchedulingUser>((x, w, su) => x.HandlerId == su.UserId)
+                         .Where((x, w, su) => w.ModuleCode == "OrderHandle" && x.BusinessType == EBusinessType.Send && x.Status == EWorkflowStepStatus.Handled
+                                              && !string.IsNullOrEmpty(x.NextMainHandler) && x.NextMainHandler != OrgSeedData.CenterId)
+                         .Where((x, w, su) => x.CreationTime >= dto.StartTime.Value)
+                         .Where((x, w, su) => x.CreationTime <= dto.EndTime.Value)
+                         .GroupBy((x, w, su) => x.WorkflowId)
+                         .Having((x, w, su) => SqlFunc.AggregateCount(x.WorkflowId) > 1)
+                          .Select((x, w, su) => new { Id = x.WorkflowId, CreationTime = SqlFunc.AggregateMin(x.CreationTime) })
+                         .MergeTable()
+                         .LeftJoin<WorkflowTrace>((a, wt) => a.Id == wt.WorkflowId)
+                         .LeftJoin<Workflow>((a, wt, wf) => wt.WorkflowId == wf.Id)
+                         .InnerJoin<SchedulingUser>((a, wt, wf, su) => wt.HandlerId == su.UserId)
+                         .Where((a, wt, wf, su) => su.UserId == dto.UserId)
+                         .GroupBy((a, wt, wf, su) => wf.ExternalId)
+                         .Select((a, wt, wf, su) => new { Id = wf.ExternalId })
+                         .MergeTable()
+                         .LeftJoin<Order>((a, b) => a.Id == b.Id)
+                         .Select((a, b) => b);
+            return query;
+        }
+        var  query2 = _workflowTraceRepository.Queryable()
+                .InnerJoin<SchedulingUser>((x, su) => x.HandlerId == su.UserId)
+                .Where((x, su) => x.ModuleCode == "OrderHandle" && x.BusinessType == EBusinessType.Send)
+                .Where((x, su) => x.CreationTime >= dto.StartTime.Value && x.CreationTime <= dto.EndTime.Value && su.UserId == dto.UserId)
+                .WhereIF(dto.TitleCode.ToUpper() == "NOSENDORDERNUM", (x, su) => x.Status != EWorkflowStepStatus.Handled)
+                .WhereIF(dto.TitleCode.ToUpper() == "SENDORDERNUM", (x, su) => x.Status == EWorkflowStepStatus.Handled)
+                .GroupBy((x, su) => x.ExternalId)
+                .Select((x, su) => new { Id = x.ExternalId })
+                .MergeTable()
+                .LeftJoin<Order>((a, b) => a.Id == b.Id)
+                .Select((a, b) => b);
+        return query2;
+	}
+
+	public ISugarQueryable<Order> QuerySendOrderDetail_LZ(QuerySendOrderDetailRequest dto)
+	{
+		if (dto.TitleCode.ToUpper() == "RESENDORDERNUM")
+		{
+			var query = _workflowTraceRepository.Queryable()
+						  .LeftJoin<Workflow>((x, w) => x.WorkflowId == w.Id)
+						  .Where((x, w) => w.ModuleCode == "OrderHandle" && x.BusinessType == EBusinessType.Send && x.Status == EWorkflowStepStatus.Handled
+											   && !string.IsNullOrEmpty(x.NextMainHandler) && x.NextMainHandler != OrgSeedData.CenterId)
+						  .Where((x, w) => x.CreationTime >= dto.StartTime.Value)
+						  .Where((x, w) => x.CreationTime <= dto.EndTime.Value)
+                          .WhereIF(dto.RoleName is "派单组", (x, w) => x.Name == "派单组")
+						  .WhereIF(dto.RoleName is "中心班长", (x, w) => x.Name == "班长审批")
+						  .GroupBy((x, w) => x.WorkflowId)
+						  .Having((x, w) => SqlFunc.AggregateCount(x.WorkflowId) > 1)
+						   .Select((x, w) => new { Id = x.WorkflowId, CreationTime = SqlFunc.AggregateMin(x.CreationTime) })
+						  .MergeTable()
+						  .LeftJoin<WorkflowTrace>((a, wt) => a.Id == wt.WorkflowId)
+						  .LeftJoin<Workflow>((a, wt, wf) => wt.WorkflowId == wf.Id)
+						  .Where((a, wt, wf) => wt.HandlerId == dto.UserId)
+						  .GroupBy((a, wt, wf) => wf.ExternalId)
+						  .Select((a, wt, wf) => new { Id = wf.ExternalId })
+						  .MergeTable()
+						  .LeftJoin<Order>((a, b) => a.Id == b.Id)
+						  .Select((a, b) => b);
+			return query;
+		}
+        var query2 = _workflowTraceRepository.Queryable()
+                .Where(x => x.ModuleCode == "OrderHandle" && x.BusinessType == EBusinessType.Send)
+                .Where(x => x.CreationTime >= dto.StartTime.Value && x.CreationTime <= dto.EndTime.Value && x.HandlerId == dto.UserId)
+                .WhereIF(dto.TitleCode.ToUpper() == "NOSENDORDERNUM", x => x.Status != EWorkflowStepStatus.Handled)
+                .WhereIF(dto.TitleCode.ToUpper() == "SENDORDERNUM", x => x.Status == EWorkflowStepStatus.Handled)
+                .WhereIF(dto.RoleName is "派单组", x => x.Name == "派单组")
+                .WhereIF(dto.RoleName is "中心班长", x => x.Name == "班长审批")
+                .GroupBy(x => x.ExternalId)
+                .Select(x => new { Id = x.ExternalId })
+                .MergeTable()
+                .LeftJoin<Order>((a, b) => a.Id == b.Id)
+                .Select((a, b) => b);
+		return query2;
+	}
+
+	/// <summary>
+	/// 扭转信件统计
+	/// </summary>
+	/// <param name="dto"></param>
+	/// <returns></returns>
+	public ISugarQueryable<OrderVisitJudeStatisticsRep> OrderVisitJudeStatistics(OrderVisitJudeStatisticsReq dto)
     {
         if (!dto.EndTime.HasValue)
         {

+ 23 - 6
src/Hotline.Share/Dtos/Order/OrderBiDto.cs

@@ -914,10 +914,12 @@ namespace Hotline.Share.Dtos.Order
         public string UserId { get; set; }
         public string UserName { get; set; }
 
-        /// <summary>
-        /// 派单量
-        /// </summary>
-        public int SendOrderNum { get; set; }
+        public string StepName { get; set; }
+
+		/// <summary>
+		/// 派单量
+		/// </summary>
+		public int SendOrderNum { get; set; }
 
         /// <summary>
         /// 待派单量
@@ -929,8 +931,23 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public int ReSendOrderNum { get; set; }
 
-        public string AccuracyRate { get; set; }
-    }
+        //public string AccuracyRate { get; set; }
+
+		public string AccuracyRate => GetAccuracyRateRate();
+
+		public string GetAccuracyRateRate()
+		{
+            if (ReSendOrderNum == 0)
+            {
+                return "100%";
+            }
+			if (SendOrderNum > 0 &&  ReSendOrderNum > 0)
+			{
+				return Math.Round(((SendOrderNum- ReSendOrderNum) / (double)SendOrderNum) * 100, 2).ToString() +"%";
+			}
+			return "0%";
+		}
+	}
 
     public class OrderReTransactVo
     {

+ 5 - 0
src/Hotline.Share/Dtos/Order/SendOrderReportOutDto.cs

@@ -27,4 +27,9 @@ public class SendOrderReportOutDto
     public int ReSendOrderNum { get; set; }
 
     public string ChainRate {get;set; }
+
+
+	public string StepName { get; set; }
+
+    public string RoldName => string.IsNullOrEmpty(StepName) ? "" : StepName == "派单组" ? "派单员" : "中心班长";
 }

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

@@ -515,6 +515,8 @@ public record QuerySendOrderDetailRequest : ReportPagedRequest
     public string UserId { get; set; }
 
     public string TitleCode { get; set; }
+
+    public string RoleName { get; set; }
 }
 
 public record QueryUnsignedOrdersRequest : ReportPagedRequest