Dun.Jason 1 년 전
부모
커밋
7c58d986f9

+ 79 - 39
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -4,6 +4,7 @@ using Hotline.FlowEngine.WorkflowModules;
 using Hotline.FlowEngine.Workflows;
 using Hotline.Orders;
 using Hotline.Repository.SqlSugar.Extensions;
+using Hotline.Schedulings;
 using Hotline.Repository.SqlSugar.System;
 using Hotline.Settings;
 using Hotline.Settings.Hotspots;
@@ -49,6 +50,7 @@ namespace Hotline.Api.Controllers.Bi
         private readonly ISystemSettingCacheManager _systemSettingCacheManager;
         private readonly IRepository<OrderSpecialDetail> _orderSpecialDetailRepository;
         private readonly IRepository<WorkflowStepHandler> _workflowStepHandler;
+        private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
 
         public BiOrderController(
             IOrderRepository orderRepository,
@@ -68,6 +70,8 @@ namespace Hotline.Api.Controllers.Bi
             ISystemSettingCacheManager systemSettingCacheManager,
             IRepository<OrderSpecialDetail> orderSpecialDetailRepository,
             IRepository<WorkflowStepHandler> workflowStepHandler
+            IRepository<OrderSpecialDetail> orderSpecialDetailRepository,
+            IRepository<WorkflowTrace> workflowTraceRepository
             )
         {
             _orderRepository = orderRepository;
@@ -87,6 +91,7 @@ namespace Hotline.Api.Controllers.Bi
             _systemSettingCacheManager = systemSettingCacheManager;
             _orderSpecialDetailRepository = orderSpecialDetailRepository;
             _workflowStepHandler = workflowStepHandler;
+            _workflowTraceRepository = workflowTraceRepository;
 
         }
 
@@ -730,7 +735,7 @@ namespace Hotline.Api.Controllers.Bi
                 .Where((it, o) => o.CreationTime >= StartDate && o.CreationTime <= EndDate && o.Id != null)
                 .WhereIF(TypeId == 1, (it, o) => o.IdentityType == EIdentityType.Citizen)
                 .WhereIF(TypeId == 2, (it, o) => o.IdentityType == EIdentityType.Enterprise)
-                .WhereIF(IsCenter == false, (it,o) => o.ActualHandleOrgCode.StartsWith(_sessionContext.RequiredOrgId))
+                .WhereIF(IsCenter == false, (it, o) => o.ActualHandleOrgCode.StartsWith(_sessionContext.RequiredOrgId))
                 .GroupBy((it, o) => new { Id = it.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("2")) })
                 .Select((it, o) => new
                 {
@@ -1236,7 +1241,7 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="TypeCode">0:全部,1:中心,2:部门</param>
         /// <returns></returns>
         [HttpGet("department_acceptance_type_statistics")]
-        public async Task<object> DepartmentAcceptanceTypeStatistics(DateTime StartDate, DateTime EndDate, int TypeCode)
+        public async Task<List<DepartmentAcceptanceTypeStatisticsDto>> DepartmentAcceptanceTypeStatistics(DateTime StartDate, DateTime EndDate, int TypeCode)
         {
             EndDate = EndDate.AddDays(1).AddSeconds(-1);
 
@@ -1300,39 +1305,8 @@ namespace Hotline.Api.Controllers.Bi
                 })
               .ToListAsync();
 
-            var sumModel = new DepartmentAcceptanceTypeStatisticsDto
-            {
-                OrgName = "合计",
-                ZxAllCount = orderData.Sum(x => x.ZxAllCount),
-                ZxAllTimes = orderData.Sum(x => x.ZxAllTimes),
-                ZxAcceptanceTypeCode = "10",
-
-                JyAllCount = orderData.Sum(x => x.JyAllCount),
-                JyAllTimes = orderData.Sum(x => x.JyAllTimes),
-                JyAcceptanceTypeCode = "15",
 
-                QzAllCount = orderData.Sum(x => x.QzAllCount),
-                QzAllTimes = orderData.Sum(x => x.QzAllTimes),
-                QzAcceptanceTypeCode = "20",
-
-                ByAllCount = orderData.Sum(x => x.ByAllCount),
-                ByAllTimes = orderData.Sum(x => x.ByAllTimes),
-                ByAcceptanceTypeCode = "25",
-
-                JbAllCount = orderData.Sum(x => x.JbAllCount),
-                JbAllTimes = orderData.Sum(x => x.JbAllTimes),
-                JbAcceptanceTypeCode = "30",
-
-                TsAllCount = orderData.Sum(x => x.TsAllCount),
-                TsAllTimes = orderData.Sum(x => x.TsAllTimes),
-                TsAcceptanceTypeCode = "35",
-
-                QtAllCount = orderData.Sum(x => x.QtAllCount),
-                QtAllTimes = orderData.Sum(x => x.QtAllTimes),
-                QtAcceptanceTypeCode = "40"
-            };
-
-            return new { DataList = orderData, SumModel = sumModel };
+            return orderData;
         }
 
         /// <summary>
@@ -1457,12 +1431,12 @@ namespace Hotline.Api.Controllers.Bi
             dto.EndDate = dto.EndDate.AddDays(1).AddSeconds(-1);
             var (total, items) = await _orderRepository.Queryable()
                 .Where(p => p.CreationTime >= dto.StartDate && p.CreationTime <= dto.EndDate && p.Status > EOrderStatus.WaitForAccept)//&& p.Status >= EOrderStatus.Filed
-                .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.OrgCode == "001", p => p.OrgLevelOneCode == dto.OrgCode)
-                .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.OrgCode != "001" && dto.SuperiorOrgCode != dto.OrgCode, p => p.ActualHandleOrgCode.StartsWith(dto.OrgCode))
-                .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.OrgCode != "001" && dto.SuperiorOrgCode == dto.OrgCode, p => p.ActualHandleOrgCode == dto.OrgCode)
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.OrgCode == "001", p => p.ActualHandleOrgCode == dto.OrgCode)
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.OrgCode != "001" && _sessionContext.RequiredOrgId != dto.OrgCode, p => p.ActualHandleOrgCode.StartsWith(dto.OrgCode))
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.OrgCode != "001" && _sessionContext.RequiredOrgId == dto.OrgCode, p => p.ActualHandleOrgCode == dto.OrgCode)
                 .WhereIF(!string.IsNullOrEmpty(dto.AcceptTypeCode), p => p.AcceptTypeCode == dto.AcceptTypeCode)
-                .WhereIF(dto.TypeCode == 1, p => p.OrgLevelOneCode == "001")
-                .WhereIF(dto.TypeCode == 2, p => p.OrgLevelOneCode != "001")
+                .WhereIF(dto.TypeCode == 1, p => p.ActualHandleOrgCode == "001")
+                .WhereIF(dto.TypeCode == 2, p => p.ActualHandleOrgCode != "001")
                 .OrderByDescending(d => d.CreationTime)
                 .ToPagedListAsync(dto, HttpContext.RequestAborted);
 
@@ -1836,5 +1810,71 @@ 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)
+        {
+            if (!dto.StartTime.HasValue || !dto.EndTime.HasValue)
+                throw UserFriendlyException.SameMessage("请选择时间!");
+            dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+			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.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 = SqlFunc.AggregateSum(SqlFunc.IIF(true, 1, 0)),
+                    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 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; 
+        }
+
+
     }
 }

+ 6 - 6
src/Hotline.Api/Controllers/OrderController.cs

@@ -3405,18 +3405,18 @@ public class OrderController : BaseController
 				NextHandlers = dto.NextHandlers,
 				Opinion = dto.Cause
 			};
-            // 计算期满时间
-            if (dto.AlterTime)
+			var expiredTime = _timeLimitDomainService.CalcEndTime(DateTime.Now,
+				ETimeType.WorkDay,
+				dto.TimeLimit.Value, order.AcceptTypeCode);
+			// 计算期满时间
+			if (dto.AlterTime)
             {
-	            var expiredTime = _timeLimitDomainService.CalcEndTime(DateTime.Now,
-		             ETimeType.WorkDay,
-					 dto.TimeLimit.Value, order.AcceptTypeCode);
 				await _orderRepository.Updateable().SetColumns(o => new Order() { ExpiredTime = expiredTime.EndTime, NearlyExpiredTime = expiredTime.NearlyExpiredTime })
                     .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
 				var orderDto = _mapper.Map<OrderDto>(order);
 	            await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,cancellationToken: HttpContext.RequestAborted);
             }
-            await _workflowApplication.RecallAsync(recall, order.ExpiredTime, HttpContext.RequestAborted);
+            await _workflowApplication.RecallAsync(recall, expiredTime.EndTime, HttpContext.RequestAborted);
 			var publish = await _orderPublishRepository.GetAsync(x => x.OrderId == dto.OrderId);
 			if (publish != null)
 			{

+ 41 - 13
src/Hotline.Api/Controllers/WorkflowController.cs

@@ -25,6 +25,8 @@ using Hotline.Orders;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.FlowEngine.Definition;
 using Microsoft.AspNetCore.Authorization;
+using Hotline.Caching.Services;
+using Hotline.Settings.TimeLimits;
 
 namespace Hotline.Api.Controllers;
 
@@ -51,6 +53,7 @@ public class WorkflowController : BaseController
     private readonly IMapper _mapper;
     private readonly ISystemDicDataCacheManager _systemDicDataCacheManager;
     private readonly IFileRepository _fileRepository;
+    private readonly ISystemDicDataCacheManager _sysDicDataCacheManager;
 
     public WorkflowController(
         IDefinitionDomainService definitionDomainService,
@@ -70,7 +73,8 @@ public class WorkflowController : BaseController
         IMapper mapper,
         ISystemDicDataCacheManager systemDicDataCacheManager,
         IFileRepository fileRepository,
-        IRepository<WorkflowCountersignMember> workflowCountersignMemberRepository
+        IRepository<WorkflowCountersignMember> workflowCountersignMemberRepository,
+        ISystemDicDataCacheManager sysDicDataCacheManager
     )
     {
         _definitionDomainService = definitionDomainService;
@@ -91,6 +95,7 @@ public class WorkflowController : BaseController
         _systemDicDataCacheManager = systemDicDataCacheManager;
         _fileRepository = fileRepository;
         _workflowCountersignMemberRepository = workflowCountersignMemberRepository;
+        _sysDicDataCacheManager = sysDicDataCacheManager;
     }
 
     #region definition
@@ -553,7 +558,6 @@ public class WorkflowController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpGet("order-countersign")]
-    [AllowAnonymous]
     public async Task<PagedDto<WorkflowCountersignDto>> QueryOrderCountersigns([FromQuery] QueryOrderCountersignDto dto)
     {
         RefAsync<int> total = 0;
@@ -564,15 +568,13 @@ public class WorkflowController : BaseController
             .Includes(x => x.Members)
             .LeftJoin<Workflow>((c, w) => c.WorkflowId == w.Id)
             .InnerJoin<Order>((c, w, o) => w.ExternalId == o.Id)
-            .WhereIF(!_sessionContext.OrgIsCenter, (c, w, o) => c.Members.Any(m => m.Key == _sessionContext.OrgId))
             .WhereIF(!string.IsNullOrEmpty(dto.Title), (c, w, o) => o.Title.Contains(dto.Title))
             .WhereIF(!string.IsNullOrEmpty(dto.OrderNo), (c, w, o) => o.No.Contains(dto.OrderNo))
             .WhereIF(dto.AcceptTypes.Any(), (c, w, o) => dto.AcceptTypes.Contains(o.AcceptTypeCode)) //受理类型
             .WhereIF(dto.Channels.Any(), (c, w, o) => dto.Channels.Contains(o.SourceChannelCode)) //来源渠道
             .WhereIF(dto.HotspotIds.Any(), (c, w, o) => dto.HotspotIds.Contains(o.HotspotId)) //热点类型
-            .WhereIF(dto.OrgCodes.Any(), (c, w, o) => dto.OrgCodes.Contains(c.FinisherOrgAreaCode)) //接办部门
+            .WhereIF(!string.IsNullOrEmpty(dto.OrgName), (c, w, o) => c.FinisherOrgName.Contains(dto.OrgName)) //接办部门
             .WhereIF(dto.CounterSignType != null, (c, w, o) => c.CounterSignType == dto.CounterSignType) //会签类型
-
         ;
 
         //发起会签:班长角色能看所有会签信件;
@@ -580,18 +582,18 @@ public class WorkflowController : BaseController
         //承办部门用户能看到自己发起的和同级部门用户发起的会签件
         if (dto.InitiatedCountersignature.HasValue && dto.InitiatedCountersignature == true)
         {
-            if (_sessionContext.Roles.Select(p => "banzhang") != null)
+            if (_sessionContext.Roles.Any(p => p == "banzhang"))
             {
 
             }
             else
-            if (_sessionContext.Roles.Select(p => "paidanyuan") != null)
+            if (_sessionContext.Roles.Any(p => p == "paidanyuan"))
             {
-
+                query = query.Where((c, w, o) => c.StarterId == _sessionContext.UserId);
             }
             else
             {
-
+                query = query.Where((c, w, o) => c.StarterOrgId == _sessionContext.RequiredOrgId);
             }
         }
 
@@ -601,12 +603,21 @@ public class WorkflowController : BaseController
         //承办部门用户能看到和同级部门用户已办理过的会签件
         if (dto.HandleCountersignature.HasValue && dto.HandleCountersignature == true)
         {
-
+            if (_sessionContext.Roles.Any(p => p == "banzhang"))
+            {
+                query = query.Where((c, w, o) => c.EndTime.HasValue);
+            }
+            else
+           if (_sessionContext.Roles.Any(p => p == "paidanyuan"))
+            {
+                query = query.Where((c, w, o) => c.Members.Any(m => m.Key == _sessionContext.RequiredOrgId) && c.EndTime.HasValue);
+            }
+            else
+            {
+                query = query.Where((c, w, o) => c.Members.Any(m => m.Key == _sessionContext.OrgId || m.Key == _sessionContext.RequiredOrgId) && c.EndTime.HasValue);
+            }
         }
 
-        //if (dto.IsOnlyStarter)
-        //    query = query.Where((c, w, o) => c.StarterId == _sessionContext.RequiredUserId);
-
         var items = await query
             .OrderByDescending((c, w, o) => o.ExpiredTime)
             .Select((c, w, o) => new { c, o })
@@ -616,12 +627,29 @@ public class WorkflowController : BaseController
         {
             var dto = _mapper.Map<WorkflowCountersignDto>(d.c);
             dto.Order = _mapper.Map<OrderDto>(d.o);
+            dto.CounterSignCount = _workflowCountersignRepository.Queryable().Where(p => p.WorkflowId == d.c.WorkflowId).CountAsync().GetAwaiter().GetResult();
             return dto;
         }).ToList();
 
         return new PagedDto<WorkflowCountersignDto>(total, dtos);
     }
 
+    /// <summary>
+    /// 
+    /// </summary>
+    /// <returns></returns>
+    [HttpGet("order-countersign-base-data")]
+    public async Task<object> QueryOrderCountersignsBaseData()
+    {
+
+        return new
+        {
+            CounterSignType = EnumExts.GetDescriptions<ECounterSignType>(),
+            ChannelOptions = _sysDicDataCacheManager.GetSysDicDataCache(TimeLimitBaseDataConsts.SourceChannel),
+            AcceptTypeOptions = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.AcceptType),
+        };
+    }
+
     #endregion
 
 }

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

@@ -53,9 +53,9 @@ namespace Hotline.Share.Dtos.FlowEngine.Workflow
         public ECounterSignType? CounterSignType { get; set; }
 
         /// <summary>
-        /// 接办部门(√)
+        /// 接办部门
         /// </summary>
-        public List<string> OrgCodes { get; set; } = new();
+        public string? OrgName { get; set; }
 
         /// <summary>
         /// 热点分类(√)

+ 5 - 0
src/Hotline.Share/Dtos/FlowEngine/Workflow/WorkflowCountersignDto.cs

@@ -123,5 +123,10 @@ namespace Hotline.Share.Dtos.FlowEngine.Workflow
         public OrderDto Order { get; set; }
 
         public string? StateText => EndTime.HasValue ? "已结束" : "未结束";
+
+        /// <summary>
+        /// 会签次数
+        /// </summary>
+        public int CounterSignCount { get; set; }
     }
 }

+ 12 - 2
src/Hotline.Share/Dtos/Order/OrderBiDto.cs

@@ -452,8 +452,18 @@ namespace Hotline.Share.Dtos.Order
         }
     }
 
-	public class BiOrderSendDto { 
-	
+	public class BiOrderSendVo
+	{
+		public string UserId { get; set; }
+		public string UserName { get; set; }
+
+		public int SendOrderNum { get; set; }
+
+		public int NoSendOrderNum { get; set; }
+
+		public int ReSendOrderNum { get; set; }
+
+		public string AccuracyRate { get; set; }
 	}
 
 	public class OrderReTransactVo

+ 0 - 5
src/Hotline.Share/Requests/DepartmentKeyWordRequest.cs

@@ -17,11 +17,6 @@
         /// </summary>
         public string? OrgCode { get; set; }
 
-        /// <summary>
-        /// 上级部门编码
-        /// </summary>
-        public string? SuperiorOrgCode { get; set; }
-
         /// <summary>
         /// 受理类型编码
         /// </summary>

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

@@ -150,4 +150,21 @@ public record QueryOrderReTransactDetailRequest : ReportPagedRequest
 
 	public string? No { get; set; }
 
+}
+
+public record QuerySendOrderRequest
+{
+	public string? UserName { get; set; }
+
+
+	/// <summary>
+	/// 开始时间
+	/// </summary>
+	public DateTime? StartTime { get; set; }
+
+	/// <summary>
+	/// 结束时间
+	/// </summary>
+	public DateTime? EndTime { get; set; }
+
 }