Browse Source

未签收统计

田爽 11 tháng trước cách đây
mục cha
commit
8587a57c8d

+ 69 - 6
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -8,6 +8,7 @@ using Hotline.Repository.SqlSugar.Extensions;
 using Hotline.Schedulings;
 using Hotline.Settings;
 using Hotline.Settings.Hotspots;
+using Hotline.Settings.TimeLimits;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.Bi;
 using Hotline.Share.Dtos.Bigscreen;
@@ -52,8 +53,10 @@ namespace Hotline.Api.Controllers.Bi
         private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
         private readonly IRepository<OrderScreen> _orderScreenRepository;
         private readonly IOrderSecondaryHandlingApplication _orderSecondaryHandlingApplication;
+        private readonly IOrderApplication _orderApplication;
+        private readonly ITimeLimitDomainService _timeLimitDomainService;
 
-        public BiOrderController(
+		public BiOrderController(
             IOrderRepository orderRepository,
             IRepository<Hotspot> hotspotTypeRepository,
             ISystemDicDataCacheManager sysDicDataCacheManager,
@@ -73,8 +76,10 @@ namespace Hotline.Api.Controllers.Bi
             IRepository<WorkflowTrace> workflowTraceRepository,
             IRepository<OrderScreen> orderScreenRepository,
             IRepository<WorkflowStepHandler> workflowStepHandleRepository,
-            IOrderSecondaryHandlingApplication orderSecondaryHandlingApplication
-            )
+            IOrderSecondaryHandlingApplication orderSecondaryHandlingApplication,
+            IOrderApplication orderApplication,
+            ITimeLimitDomainService timeLimitDomainService
+			)
         {
             _orderRepository = orderRepository;
             _hotspotTypeRepository = hotspotTypeRepository;
@@ -96,8 +101,9 @@ namespace Hotline.Api.Controllers.Bi
             _orderScreenRepository = orderScreenRepository;
             _workflowStepHandleRepository = workflowStepHandleRepository;
             _orderSecondaryHandlingApplication = orderSecondaryHandlingApplication;
-
-        }
+            _orderApplication = orderApplication;
+            _timeLimitDomainService = timeLimitDomainService;
+		}
 
         /// <summary>
         /// 部门超期统计明细
@@ -3148,5 +3154,62 @@ namespace Hotline.Api.Controllers.Bi
 
             return ExcelStreamResult(stream, "二次办理满意度列表数据");
         }
-    }
+
+
+
+        /// <summary>
+        /// 未签收统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("unsigned_order_report")]
+        public async Task<PagedDto<UnsignedOrderDto>> UnsignedOrderReport([FromQuery] QueryUnsignedOrdersRequest dto)
+        {
+	        var query = _orderApplication.QueryUnsignedOrders(dto);
+	        var (total, items) = await query.Select((x,ws)=> new UnsignedOrder { order = x , workflowStep = ws }).ToPagedListAsync(dto, HttpContext.RequestAborted);
+            var itemsVo = _mapper.Map<IReadOnlyList<UnsignedOrderDto>>(items);
+            foreach (var item in itemsVo)
+            {
+	            item.UnsignedTime = _timeLimitDomainService.CalcWorkTimeToHour(item.workflowStep.CreationTime, item.workflowStep.Status == EWorkflowStepStatus.WaitForAccept ? DateTime.Now : item.workflowStep.AcceptTime!.Value, false);
+            }
+			return new PagedDto<UnsignedOrderDto>(total, itemsVo);
+        }
+		/// <summary>
+		/// 未签收统计导出
+		/// </summary>
+		/// <returns></returns>
+		[HttpPost("unsigned_order_report/_export")]
+        public async Task<FileStreamResult> UnsignedOrdersReportReport([FromBody] ExportExcelDto<QueryUnsignedOrdersRequest> dto)
+        {
+	        var query = _orderApplication.QueryUnsignedOrders(dto.QueryDto).Select((x, ws) => new UnsignedOrder { order = x, workflowStep = ws });
+	        List<UnsignedOrder>  unsignedOrders;
+	        if (dto.IsExportAll)
+	        {
+		        unsignedOrders = await query.ToListAsync(HttpContext.RequestAborted);
+	        }
+	        else
+	        {
+		        var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+		        unsignedOrders = items;
+	        }
+
+	        var secondaryHandlingDtos = _mapper.Map<ICollection<UnsignedOrderDto>>(unsignedOrders);
+
+	        foreach (var item in secondaryHandlingDtos)
+	        {
+		        item.UnsignedTime = _timeLimitDomainService.CalcWorkTimeToHour(item.workflowStep.CreationTime, item.workflowStep.Status == EWorkflowStepStatus.WaitForAccept ? DateTime.Now : item.workflowStep.AcceptTime!.Value, false);
+	        }
+
+			dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+	        var dtos = secondaryHandlingDtos
+		        .Select(stu => _mapper.Map(stu, typeof(UnsignedOrderDto), dynamicClass))
+		        .Cast<object>()
+		        .ToList();
+
+	        var stream = ExcelHelper.CreateStream(dtos);
+
+	        return ExcelStreamResult(stream, "未签收统计列表数据");
+        }
+	}
 }

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

@@ -4,6 +4,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using Hotline.FlowEngine.Workflows;
 using Hotline.Orders;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.DataSharing.PusherHotlineDto;
@@ -11,6 +12,7 @@ using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Settings;
+using Hotline.Share.Requests;
 using SqlSugar;
 using XF.Domain.Authentications;
 using XF.Domain.Entities;
@@ -65,5 +67,13 @@ namespace Hotline.Application.Orders
         ISugarQueryable<Order> QueryOrders(QueryOrderDto dto);
 
         #endregion
-    }
+
+        /// <summary>
+        /// 未签收统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<Order, WorkflowStep> QueryUnsignedOrders(QueryUnsignedOrdersRequest dto);
+
+	}
 }

+ 28 - 6
src/Hotline.Application/Orders/OrderApplication.cs

@@ -17,6 +17,7 @@ using Hotline.Share.Dtos.Settings;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Quality;
 using Hotline.Share.Enums.Settings;
+using Hotline.Share.Requests;
 using Hotline.Tools;
 using MapsterMapper;
 using SqlSugar;
@@ -444,16 +445,37 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .OrderByDescending(d => d.CreationTime);
     }
 
-
-    #region private
-
     /// <summary>
-    /// 接受外部工单(除省平台)
+    /// 未签收统计
     /// </summary>
     /// <param name="dto"></param>
-    /// <param name="cancellationToken"></param>
     /// <returns></returns>
-    private async Task<AddOrderResponse> ReceiveOrderFromOtherPlatformAsync(AddOrderDto dto, List<FileDto> files,
+    public ISugarQueryable<Order,WorkflowStep> QueryUnsignedOrders(QueryUnsignedOrdersRequest dto) {
+		if (dto.EndTime.HasValue)
+			dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+		var IsCenter = _sessionContext.OrgIsCenter;
+		return _orderRepository.Queryable()
+            .LeftJoin<WorkflowStep>((x,ws)=>x.Id == ws.ExternalId)
+            .WhereIF(dto.StartTime.HasValue, (x,ws) => ws.CreationTime >= dto.StartTime)
+            .WhereIF(dto.EndTime.HasValue, (x, ws) => ws.CreationTime <= dto.EndTime)
+            .WhereIF(dto.Level == 0 && IsCenter == false, (x, ws) => ws.AcceptorOrgId.StartsWith(_sessionContext.OrgId))
+			.WhereIF(dto.Level == 1,(x,ws)=> ws.AcceptorOrgId == _sessionContext.OrgId)
+            .WhereIF(dto.Level == 2, (x, ws) => ws.AcceptorOrgId.StartsWith(_sessionContext.OrgId))
+            .WhereIF(dto.Signed == 0 ,(x,ws)=>ws.Status == Share.Enums.FlowEngine.EWorkflowStepStatus.WaitForAccept)
+            .WhereIF(dto.Signed == 1, (x, ws) => ws.Status != Share.Enums.FlowEngine.EWorkflowStepStatus.WaitForAccept)
+			.OrderByDescending((x,ws) => ws.CreationTime);
+	}
+
+
+	#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))

+ 8 - 2
src/Hotline.Share/Dtos/FlowEngine/Workflow/WorkflowStepDto.cs

@@ -80,7 +80,13 @@ public class WorkflowStepDto
     /// </summary>
     public string? CountersignStartStepId { get; set; }
 
-    #endregion
+	#endregion
 
-    #endregion
+	#endregion
+
+
+	/// <summary>
+	/// 接办时间
+	/// </summary>
+	public DateTime? AcceptTime { get; set; }
 }

+ 9 - 0
src/Hotline.Share/Dtos/Order/OrderDto.cs

@@ -781,4 +781,13 @@ namespace Hotline.Share.Dtos.Order
     {
 	    public string OrderId { get; set; }
 	}
+
+    public class UnsignedOrderDto { 
+    
+        public OrderDto order { get; set; }
+
+        public WorkflowStepDto workflowStep { get; set; }
+
+        public decimal UnsignedTime { get; set; }
+	}
 }

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

@@ -202,4 +202,17 @@ public record QuerySendOrderDetailRequest : ReportPagedRequest
 	public string UserId { get; set; }
 
 	public string TitleCode { get; set; }
+}
+
+public record QueryUnsignedOrdersRequest : ReportPagedRequest 
+{ 
+	/// <summary>
+	///  0 全部  1 本级  2 下级
+	/// </summary>
+	public int Level { get; set; }
+
+	/// <summary>
+	///  0 未签收  1 签收
+	/// </summary>
+	public int Signed { get; set; }
 }

+ 7 - 0
src/Hotline/Orders/Order.cs

@@ -980,4 +980,11 @@ namespace Hotline.Orders
 
         #endregion
     }
+
+    public class UnsignedOrder
+    {
+	    public Order order { get; set; }
+
+	    public WorkflowStep workflowStep { get; set; }
+    }
 }

+ 12 - 3
src/Hotline/Settings/TimeLimits/ITimeLimitDomainService.cs

@@ -86,11 +86,20 @@ namespace Hotline.Settings.TimeLimits
         string CalcTimeInterval(DateTime beginTime, DateTime endTime, bool isCenter);
 
         /// <summary>
-        /// 判断是否工作日
+        /// 时间间隔 小时
         /// </summary>
-        /// <param name="date"></param>
+        /// <param name="beginTime"></param>
+        /// <param name="endTime"></param>
+        /// <param name="isCenter"></param>
         /// <returns></returns>
-        bool IsWorkDay(DateTime date);
+        decimal CalcWorkTimeToHour(DateTime beginTime, DateTime endTime, bool isCenter);
+
+		/// <summary>
+		/// 判断是否工作日
+		/// </summary>
+		/// <param name="date"></param>
+		/// <returns></returns>
+		bool IsWorkDay(DateTime date);
 
         /// <summary>
         /// 获取工作日

+ 40 - 3
src/Hotline/Settings/TimeLimits/TimeLimitDomainService.cs

@@ -183,15 +183,52 @@ namespace Hotline.Settings.TimeLimits
 
         }
 
-
         /// <summary>
-        /// 计算工作时间分钟数
+        /// 计算工作时间小时
         /// </summary>
         /// <param name="beginTime"></param>
         /// <param name="endTime"></param>
         /// <param name="isCenter"></param>
         /// <returns></returns>
-        public int CalcWorkTime(DateTime beginTime, DateTime endTime, bool isCenter)
+        public decimal CalcWorkTimeToHour(DateTime beginTime, DateTime endTime, bool isCenter)
+        {
+	        var min = CalcWorkTime(beginTime, endTime, isCenter);
+	        if (min != 0)
+	        {
+		        if (isCenter)
+		        {
+			        return Math.Round((decimal)min / 60 / 60 / 24, 2);
+		        }
+		        else
+		        {
+			        var workTime = _systemSettingRepository.Get(x => x.Code == SettingConstants.WorkTime);
+			        if (workTime != null)
+			        {
+				        //DateTime WorkBeginTime = DateTime.Parse(beginTime.ToShortDateString() + " " + workTime.SettingValue[0] + ":00");
+				        //DateTime WorkEndTime = DateTime.Parse(beginTime.ToShortDateString() + " " + workTime.SettingValue[1] + ":00");
+
+				        //TimeSpan minuteSpan = new TimeSpan(WorkEndTime.Ticks - WorkBeginTime.Ticks);
+				        ////总时差分钟数
+				        //int minutes = (int)minuteSpan.TotalMinutes;
+
+				        return Math.Round((decimal)min / 60 , 2);
+			        }
+			        return 0;
+		        }
+	        }
+	        return 0;
+
+        }
+
+
+		/// <summary>
+		/// 计算工作时间分钟数
+		/// </summary>
+		/// <param name="beginTime"></param>
+		/// <param name="endTime"></param>
+		/// <param name="isCenter"></param>
+		/// <returns></returns>
+		public int CalcWorkTime(DateTime beginTime, DateTime endTime, bool isCenter)
         {
             if (isCenter)
             {