xf před 1 rokem
rodič
revize
1983c77167

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

@@ -40,6 +40,7 @@ namespace Hotline.Api.Controllers.Bi
         private readonly IRepository<OrderDelay> _orderDelayRepository;
         private readonly IMapper _mapper;
         private readonly IRepository<WorkflowCountersign> _workflowCountersignRepository;
+        private readonly IRepository<WorkflowStep> _workflowStepRepository;
         private readonly IRepository<OrderSpecial> _orderSpecialRepository;
         private readonly IRepository<OrderVisit> _orderVisitRepository;
         private readonly IRepository<TrCallRecord> _trCallRecordRepository;
@@ -104,7 +105,7 @@ namespace Hotline.Api.Controllers.Bi
         {
             dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
 
-            var (total,items) = await _orderRepository.Queryable()
+            var (total, items) = await _orderRepository.Queryable()
             .Where(x => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime)
             .WhereIF(dto.QueryType == 1, x => x.Status >= EOrderStatus.Filed && x.ExpiredTime < x.FiledTime) //业务已办超期
             //.WhereIF(dto.QueryType== 2,) //会签已办超期
@@ -134,11 +135,11 @@ namespace Hotline.Api.Controllers.Bi
 
 
             var queryOrder = _systemOrganizeRepository.Queryable()
-                .LeftJoin<Order>((x,o)=> x.Id == o.ActualHandleOrgCode)
+                .LeftJoin<Order>((x, o) => x.Id == o.ActualHandleOrgCode)
                 .WhereIF(dto.StartTime.HasValue, (x, o) => o.CreationTime >= dto.StartTime)
                 .WhereIF(dto.EndTime.HasValue, (x, o) => o.CreationTime <= dto.EndTime)
                 .WhereIF(IsCenter == false, (x, o) => o.ActualHandleOrgCode == _sessionContext.RequiredOrgId)
-                .GroupBy((x,o) => new { x.Id, x.Name })
+                .GroupBy((x, o) => new { x.Id, x.Name })
                 .Select((x, o) => new OrderBiOrgDataListVo
                 {
                     OrgName = x.Name,
@@ -807,9 +808,9 @@ namespace Hotline.Api.Controllers.Bi
             if (IsCenter && list != null)
             {
                 data = await list.GroupBy(x => new
-                 {
-                     VisitOrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
-                 })
+                {
+                    VisitOrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
+                })
                 .Select(x => new VisitAndOrgSatisfactionStatisticsDto()
                 {
                     OrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
@@ -843,9 +844,9 @@ namespace Hotline.Api.Controllers.Bi
             else
             {
                 data = await list.GroupBy(x => new
-                 {
-                     x.VisitOrgCode
-                 })
+                {
+                    x.VisitOrgCode
+                })
                 .Select(x => new VisitAndOrgSatisfactionStatisticsDto()
                 {
                     OrgCode = x.VisitOrgCode,
@@ -876,7 +877,7 @@ namespace Hotline.Api.Controllers.Bi
                 })
                 .ToListAsync();
             }
-                
+
 
             var countySumModel = new VisitAndOrgSatisfactionStatisticsDto()
             {
@@ -942,8 +943,8 @@ namespace Hotline.Api.Controllers.Bi
             var list = await _systemOrganizeRepository.Queryable().Where(x => x.Id.StartsWith(OrgCode))
                 .LeftJoin<OrderVisitDetail>((x, it) => x.Id == it.VisitOrgCode)
                 .Where((x, it) => it.OrderVisit.VisitTime >= StartDate && it.OrderVisit.VisitTime <= EndDate && it.VisitTarget == EVisitTarget.Org && it.OrderVisit.VisitState == EVisitState.Visited)
-                .WhereIF(OrgCode == "001", (x,it) => it.VisitOrgCode == OrgCode)
-                .WhereIF(OrgCode != "001", (x,it) => it.VisitOrgCode.StartsWith(OrgCode))
+                .WhereIF(OrgCode == "001", (x, it) => it.VisitOrgCode == OrgCode)
+                .WhereIF(OrgCode != "001", (x, it) => it.VisitOrgCode.StartsWith(OrgCode))
                 .WhereIF(!string.IsNullOrEmpty(LineNum), (x, it) => it.OrderVisit.Order.CallRecord.Gateway.Contains(LineNum))
                 .WhereIF(IsCenter == false, (x, it) => it.VisitOrgCode.StartsWith(_sessionContext.OrgId))
                  .GroupBy((x, it) => new
@@ -1542,7 +1543,7 @@ namespace Hotline.Api.Controllers.Bi
 
 
 
-            //会签
+            //会签(已办超期、待办超期)
             var queryCountersign = _workflowCountersignRepository.Queryable()
                 .LeftJoin<WorkflowCountersignMember>((x, o) => x.Id == o.WorkflowCountersignId)
                  .Where(x => x.CreationTime >= StartDate && x.CreationTime <= EndDate)
@@ -1556,7 +1557,24 @@ namespace Hotline.Api.Controllers.Bi
                     DelayWait = SqlFunc.AggregateSum(SqlFunc.IIF(!o.IsHandled, 1, 0)),
                 }).MergeTable();
 
-
+            _workflowStepRepository.Queryable()
+                .Where(d => d.ModuleCode == WorkflowModuleConsts.OrderHandle &&
+                            d.CountersignPosition == ECountersignPosition.Multi &&
+                            d.CountersignPosition == ECountersignPosition.Single)
+                .Where(x => x.CreationTime >= StartDate && x.CreationTime <= EndDate)
+                .GroupBy(d => new { d.StepHandlers.First().OrgId, d.StepHandlers.First().OrgName })
+                .Select(d => new DepartmentalProcessingStatisticsDataDto
+                {
+                    OrgCode = d.StepHandlers.First().OrgId,
+                    HQYBOverdue =
+                        SqlFunc.AggregateSum(SqlFunc.IIF(
+                            d.Status == EWorkflowStepStatus.Handled && d.HandleTime > d.StepExpiredTime, 1, 0)),
+                    HQZBOverdue =
+                        SqlFunc.AggregateSum(SqlFunc.IIF(
+                            d.Status != EWorkflowStepStatus.Handled && DateTime.Now >= d.StepExpiredTime, 1, 0)),
+                    DelayEnd = SqlFunc.AggregateSum(SqlFunc.IIF(d.Status == EWorkflowStepStatus.Handled, 1, 0)),
+                    DelayWait = SqlFunc.AggregateSum(SqlFunc.IIF(d.Status != EWorkflowStepStatus.Handled, 1, 0)),
+                });
 
 
             var queryPush = query.LeftJoin(queryPublish, (it, o) => it.Id == o.Id).Where(it => it.OrgCode != null);
@@ -1613,7 +1631,7 @@ namespace Hotline.Api.Controllers.Bi
                    .Where((p, o) => p.OverTime >= dto.StartDate && p.OverTime <= dto.EndDate)
                    .Where((p, o) => p.CallOrderType == ECallOrderType.Order)
                    .Where((p, o) => p.ExternalId != null && o.Id != null)
-                   .Where((p,o)=>p.CallDirection== ECallDirection.In)
+                   .Where((p, o) => p.CallDirection == ECallDirection.In)
                     .WhereIF(!string.IsNullOrEmpty(dto.PhoneNum), (p, o) => p.CPN == dto.PhoneNum)
                    .Select((p, o) => new
                    {
@@ -1852,26 +1870,26 @@ namespace Hotline.Api.Controllers.Bi
             return rsp;
         }
 
-		/// <summary>
-		/// 派单量统计
-		/// </summary>
-		/// <param name="dto"></param>
-		/// <returns></returns>
-		[HttpGet("send_order_report")]
-		public async Task<object> SendOrderReport([FromQuery] QuerySendOrderRequest dto)
+        /// <summary>
+        /// 派单量统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("send_order_report")]
+        public async Task<object> SendOrderReport([FromQuery] QuerySendOrderRequest dto)
         {
             if (!dto.StartTime.HasValue || !dto.EndTime.HasValue)
                 throw UserFriendlyException.SameMessage("请选择时间!");
             dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
-			var items = await _workflowTraceRepository.Queryable()
+            var items = await _workflowTraceRepository.Queryable()
                 .LeftJoin<Workflow>((x, w) => x.WorkflowId == w.Id)
                 .LeftJoin<WorkflowStepHandler>((x, w, wsh) => x.StepId == wsh.WorkflowStepId)
                 .InnerJoin<SchedulingUser>((x, w, wsh, su) => wsh.UserId == su.UserId)
                 .Where((x, w, wsh, su) => w.ModuleCode == "OrderHandle" && x.BusinessType == EBusinessType.Send)
-                .Where((x, w, wsh, su) =>x.CreationTime >= dto.StartTime.Value)
+                .Where((x, w, wsh, su) => x.CreationTime >= dto.StartTime.Value)
                 .Where((x, w, wsh, su) => x.CreationTime <= dto.EndTime.Value)
-                .WhereIF(!string.IsNullOrEmpty(dto.UserName),(x, w, wsh, su) => su.UserName == dto.UserName)
-				.GroupBy((x, w, wsh, su) => new { su.UserId, su.UserName})
+                .WhereIF(!string.IsNullOrEmpty(dto.UserName), (x, w, wsh, su) => su.UserName == dto.UserName)
+                .GroupBy((x, w, wsh, su) => new { su.UserId, su.UserName })
                 .Having((x, w, wsh, su) => SqlFunc.AggregateCount(x.WorkflowId) == 1)
                 .Select((x, w, wsh, su) => new BiOrderSendVo
                 {
@@ -1881,40 +1899,40 @@ namespace Hotline.Api.Controllers.Bi
                     NoSendOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(x.HandlerId == null || x.HandlerId == "", 1, 0)),
                     ReSendOrderNum = 0,
                 }).ToListAsync();
-            var items2 =  await _workflowTraceRepository.Queryable()
-	            .LeftJoin<Workflow>((x, w) => x.WorkflowId == w.Id)
-	            .LeftJoin<WorkflowStepHandler>((x, w, wsh) => x.StepId == wsh.WorkflowStepId)
-	            .InnerJoin<SchedulingUser>((x, w, wsh, su) => wsh.UserId == su.UserId)
-	            .Where((x, w, wsh, su) => w.ModuleCode == "OrderHandle" && x.BusinessType == EBusinessType.Send)
-	            .Where((x, w, wsh, su) => x.CreationTime >= dto.StartTime.Value)
-	            .Where((x, w, wsh, su) => x.CreationTime <= dto.EndTime.Value)
-	            .WhereIF(!string.IsNullOrEmpty(dto.UserName), (x, w, wsh, su) => su.UserName == dto.UserName)
-				.GroupBy((x, w, wsh, su) => new { su.UserId, su.UserName })
-	            .Having((x, w, wsh, su) => SqlFunc.AggregateCount(x.WorkflowId) > 1)
-	            .Select((x, w, wsh, su) => new BiOrderSendVo
-	            {
-		            UserId = su.UserId,
-		            UserName = su.UserName,
-		            SendOrderNum = 0,
-		            NoSendOrderNum = 0,
-		            ReSendOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(true, 1, 0)),
-				}).ToListAsync();
+            var items2 = await _workflowTraceRepository.Queryable()
+                .LeftJoin<Workflow>((x, w) => x.WorkflowId == w.Id)
+                .LeftJoin<WorkflowStepHandler>((x, w, wsh) => x.StepId == wsh.WorkflowStepId)
+                .InnerJoin<SchedulingUser>((x, w, wsh, su) => wsh.UserId == su.UserId)
+                .Where((x, w, wsh, su) => w.ModuleCode == "OrderHandle" && x.BusinessType == EBusinessType.Send)
+                .Where((x, w, wsh, su) => x.CreationTime >= dto.StartTime.Value)
+                .Where((x, w, wsh, su) => x.CreationTime <= dto.EndTime.Value)
+                .WhereIF(!string.IsNullOrEmpty(dto.UserName), (x, w, wsh, su) => su.UserName == dto.UserName)
+                .GroupBy((x, w, wsh, su) => new { su.UserId, su.UserName })
+                .Having((x, w, wsh, su) => SqlFunc.AggregateCount(x.WorkflowId) > 1)
+                .Select((x, w, wsh, su) => new BiOrderSendVo
+                {
+                    UserId = su.UserId,
+                    UserName = su.UserName,
+                    SendOrderNum = 0,
+                    NoSendOrderNum = 0,
+                    ReSendOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(true, 1, 0)),
+                }).ToListAsync();
 
             var res = (from t1 in items
-	            join t2 in items2 on t1.UserId equals t2.UserId into t1_t2
-	            from item in t1_t2.DefaultIfEmpty()
-	            select new
-	            {
-		            UserId = t1.UserId,
-		            UserName = t1.UserName,
-		            SendOrderNum = t1.SendOrderNum,
-		            NoSendOrderNum = t1.NoSendOrderNum,
-                    ReSendOrderNum = t1_t2.Select(x => x.NoSendOrderNum).FirstOrDefault(),
-                    ChainRate = t1_t2.Select(x => x.NoSendOrderNum).FirstOrDefault() > 0 ?
-                              ((double.Parse(t1.SendOrderNum.ToString()) - double.Parse(t1_t2.Select(x => x.NoSendOrderNum).FirstOrDefault().ToString())) / double.Parse(t1.SendOrderNum.ToString()) * 100).ToString("F2") + "%" : "100.00%",
-                }).ToList();
-
-			return res; 
+                       join t2 in items2 on t1.UserId equals t2.UserId into t1_t2
+                       from item in t1_t2.DefaultIfEmpty()
+                       select new
+                       {
+                           UserId = t1.UserId,
+                           UserName = t1.UserName,
+                           SendOrderNum = t1.SendOrderNum,
+                           NoSendOrderNum = t1.NoSendOrderNum,
+                           ReSendOrderNum = t1_t2.Select(x => x.NoSendOrderNum).FirstOrDefault(),
+                           ChainRate = t1_t2.Select(x => x.NoSendOrderNum).FirstOrDefault() > 0 ?
+                                     ((double.Parse(t1.SendOrderNum.ToString()) - double.Parse(t1_t2.Select(x => x.NoSendOrderNum).FirstOrDefault().ToString())) / double.Parse(t1.SendOrderNum.ToString()) * 100).ToString("F2") + "%" : "100.00%",
+                       }).ToList();
+
+            return res;
         }
 
 

+ 1 - 1
src/Hotline/FlowEngine/Workflows/StepBasicEntity.cs

@@ -12,7 +12,7 @@ public abstract class StepBasicEntity : CreationEntity
 {
     public string WorkflowId { get; set; }
 
-    public string ExternalId { get; set; }
+    public string? ExternalId { get; set; }
 
     #region 业务模块(冗余)