Преглед изворни кода

Merge branch 'dev' of http://110.188.24.182:10023/Fengwo/hotline into dev

田爽 пре 11 месеци
родитељ
комит
fa2a89d7d7

+ 9 - 9
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -227,20 +227,21 @@ namespace Hotline.Api.Controllers.Bi
                 .WhereIF(dto.StartTime.HasValue, it => it.CreationTime >= dto.StartTime)
                 .WhereIF(dto.EndTime.HasValue, it => it.CreationTime <= dto.EndTime)
                 .WhereIF(!string.IsNullOrEmpty(dto.Keyword), it => it.SignerName.Contains(dto.Keyword!))
-                .GroupBy(it => new { it.SignerId, it.SignerName })
+                .GroupBy(it => new { it.CreatorId, it.CreatorName })
                 .Select(it => new OrderBiCentreDataListVo
                 {
-                    UserName = it.SignerName,
-                    UserId = it.SignerId,
+                    UserName = it.CreatorName,
+                    UserId = it.CreatorId,
                     //Subtotal = SqlFunc.AggregateCount(x.AcceptorId),
                     CentreArchive = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed && it.ProcessType == EProcessType.Zhiban, 1, 0)), //中心归档件
-                    CentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed && (it.FileUserRole == EFileUserType.Org || it.FileUserRole == EFileUserType.Dispatch), 1, 0)), //转办信件
-                    NoCentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.WaitForAccept && it.Status < EOrderStatus.Filed && (it.FileUserRole == EFileUserType.Dispatch || it.ActualHandleStepName == "班长审批"), 1, 0)),
+                    //CentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed && (it.FileUserRole == EFileUserType.Org || it.FileUserRole == EFileUserType.Dispatch), 1, 0)), //转办信件
+                    CentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF(it.ProcessType == EProcessType.Jiaoban || it.FileUserRole == EFileUserType.Dispatch || it.ActualHandleStepName == "派单组",1,0)),
+                    NoCentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status <= EOrderStatus.SpecialToUnAccept || it.ActualHandleStepName == "班长审批", 1, 0)), //坐席待办 //中心领导?市领导? 是否在统计条件中
                     //CentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed && it.ProcessType == EProcessType.Jiaoban, 1, 0)),
                     //NoCentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF((int)x.Status < 300 && x.ExpiredTime > x.FiledTime, 1, 0)),
                     Invalid = SqlFunc.AggregateSum(SqlFunc.IIF(it.AcceptType == "无效", 1, 0)),
                     Repeat = SqlFunc.AggregateSum(SqlFunc.IIF(it.DuplicateIds != null && SqlFunc.JsonArrayLength(it.DuplicateIds) > 0, 1, 0)),
-                    Subtotal = SqlFunc.AggregateSum(SqlFunc.IIF((it.Status >= EOrderStatus.Filed && it.ProcessType == EProcessType.Zhiban) || (it.Status >= EOrderStatus.Filed && (it.FileUserRole == EFileUserType.Org || it.FileUserRole == EFileUserType.Dispatch)) || (it.Status >= EOrderStatus.WaitForAccept && it.Status < EOrderStatus.Filed && (it.FileUserRole == EFileUserType.Dispatch || it.ActualHandleStepName == "班长审批")) || it.AcceptType == "无效" || (it.DuplicateIds != null && SqlFunc.JsonArrayLength(it.DuplicateIds) > 0), 1, 0))
+                    Subtotal = SqlFunc.AggregateSum(SqlFunc.IIF((it.Status >= EOrderStatus.Filed && it.ProcessType == EProcessType.Zhiban) || (it.ProcessType == EProcessType.Jiaoban || it.FileUserRole == EFileUserType.Dispatch || it.ActualHandleStepName == "派单组") || (it.Status <= EOrderStatus.SpecialToUnAccept || it.ActualHandleStepName == "班长审批") || it.AcceptType == "无效" || (it.DuplicateIds != null && SqlFunc.JsonArrayLength(it.DuplicateIds) > 0), 1, 0))
                 }).MergeTable();
             switch (dto.SortField)
             {
@@ -2785,7 +2786,6 @@ namespace Hotline.Api.Controllers.Bi
                     UserName = su.UserName,
                     SendOrderNum = SqlFunc.AggregateDistinctCount(w.ExternalId),
                     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)
@@ -2801,7 +2801,7 @@ namespace Hotline.Api.Controllers.Bi
                 .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, wsh, su) => wsh.UserId == su.UserId)
+				.InnerJoin<SchedulingUser>((a, wt, wf, wsh, su) => wsh.UserId == su.UserId)
                 .WhereIF(!string.IsNullOrEmpty(dto.UserName), ((a, wt, wf, wsh, su) => su.UserName == dto.UserName))
                 .GroupBy((a, wt, wf, wsh, su) => new { su.UserId, su.UserName })
                 .Select((a, wt, wf, wsh, su) => new BiOrderSendVo
@@ -2820,7 +2820,7 @@ namespace Hotline.Api.Controllers.Bi
                        {
                            UserId = t1.UserId,
                            UserName = t1.UserName,
-                           SendOrderNum = t1.SendOrderNum,
+                           SendOrderNum = t1.SendOrderNum ,
                            NoSendOrderNum = t1.NoSendOrderNum,
                            ReSendOrderNum = t1_t2.Select(x => x.ReSendOrderNum).FirstOrDefault(),
                            ChainRate = t1_t2.Select(x => x.ReSendOrderNum).FirstOrDefault() > 0 ?

+ 3 - 0
src/Hotline.Api/Controllers/Bigscreen/DataScreenController.cs

@@ -496,6 +496,9 @@ namespace Hotline.Api.Controllers.Bigscreen
         {
             EndDate = EndDate.AddDays(1).AddSeconds(-1);
 
+
+
+
             int SumCount = await _orderRepository.Queryable(false, false, false)
                .Where(x => x.StartTime >= StartDate && x.StartTime <= EndDate && x.Status > EOrderStatus.WaitForAccept).CountAsync();
             if (IsSource)

+ 2 - 2
src/Hotline.Api/Controllers/TestController.cs

@@ -292,8 +292,8 @@ public class TestController : BaseController
         //var r = _timeLimitDomainService.CalcWorkTime(DateTime.Parse("2024-3-22 05:00:00"), DateTime.Parse("2024-3-22 06:00:00"), false);
         //var r = _timeLimitDomainService.CalcWorkTime(DateTime.Parse("2024-3-24 17:20:00"), DateTime.Parse("2024-3-24 17:21:00"), false);
         //await _aiVisitService.QueryAiVisitTask(batchId, taskId, HttpContext.RequestAborted);
-        var r = _timeLimitDomainService.CalcWorkTimeReduce(DateTime.Now, 5);
-
+        //var r = _timeLimitDomainService.CalcWorkTimeReduce(DateTime.Now, 5);
+        var r = _timeLimitDomainService.CalcWorkTimeToDecimal(DateTime.Parse("2024-05-14 14:41:42"), DateTime.Parse("2024-05-14 14:50:46"), false);
         return OpenResponse.Ok(DateTime.Now.ToString("F"));
     }
 

+ 2 - 2
src/Hotline.Api/config/appsettings.Development.json

@@ -16,7 +16,7 @@
     }
   },
   "ConnectionStrings": {
-    "Hotline": "PORT=5432;DATABASE=hotline_dev;HOST=110.188.24.182;PASSWORD=fengwo11!!;USER ID=dev;",
+    "Hotline": "PORT=5432;DATABASE=hotline;HOST=110.188.24.182;PASSWORD=fengwo11!!;USER ID=dev;",
     "Redis": "110.188.24.182:50179",
     "MongoDB": "mongodb://192.168.100.121:27017",
     "Wex": "server=222.212.82.225;Port=4509;Database=fs_kft;Uid=root;Pwd=Wex@12345;"
@@ -25,7 +25,7 @@
     "Host": "110.188.24.182",
     "Port": 50179,
     //"Password": "fengwo22@@",
-    "Database": 5
+    "Database": 1
   },
   "Swagger": true,
   "Cors": {

+ 2 - 2
src/Hotline.Api/config/appsettings.json

@@ -16,7 +16,7 @@
     }
   },
   "ConnectionStrings": {
-    "Hotline": "PORT=5432;DATABASE=hotline_dev;HOST=110.188.24.182;PASSWORD=fengwo11!!;USER ID=dev;",
+    "Hotline": "PORT=5432;DATABASE=hotline;HOST=110.188.24.182;PASSWORD=fengwo11!!;USER ID=dev;",
     "Redis": "110.188.24.182:50179,password=fengwo22@@",
     "MongoDB": "mongodb://192.168.100.121:27017",
     "Wex": "server=222.212.82.225;Port=4509;Database=fs_kft;Uid=root;Pwd=Wex@12345;"
@@ -25,7 +25,7 @@
     "Host": "110.188.24.182",
     "Port": 50179,
     "Password": "fengwo22@@",
-    "Database": 5
+    "Database": 1
   },
   "Swagger": true,
   "Cors": {

+ 1 - 1
src/Hotline.Application/Bigscreen/SeatStateDataRefreshService.cs

@@ -20,7 +20,7 @@ namespace Hotline.Application.Bigscreen
 
 		protected override async Task ExecuteAsync(CancellationToken stoppingToken)
 		{
-			using var scope = _serviceScopeFactory.CreateScope();
+			using var scope = _serviceScopeFactory.CreateScope(); 
 			var realtimeService = scope.ServiceProvider.GetRequiredService<IRealtimeService>();
 			var logger = scope.ServiceProvider.GetRequiredService<ILogger<SeatStateDataRefreshService>>();
 			var systemSettingCacheManager = scope.ServiceProvider.GetRequiredService<ISystemSettingCacheManager>();

+ 3 - 1
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -651,7 +651,9 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                 //根据汇总对象id找到被汇总节点
                 var summaryTargetStep = workflow.Steps.FirstOrDefault(d =>
                     d.Status == EWorkflowStepStatus.Handled &&
-                    d.StepType == EStepType.Normal && d.Code == stepDefine.SummaryTargetCode);
+                    d.StepType == EStepType.Normal && 
+                    d.Code == stepDefine.SummaryTargetCode &&
+                    d.IsOrigin);
                 if (summaryTargetStep is null)
                     throw UserFriendlyException.SameMessage("未查询到汇总对象节点");
 

+ 33 - 0
src/Hotline.Application/Handlers/Order/GetOrderDetailNotifyHandler.cs

@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Hotline.FlowEngine.Workflows;
+using Hotline.Orders.Notifications;
+using MediatR;
+
+namespace Hotline.Application.Handlers.Order
+{
+    public class GetOrderDetailNotifyHandler : INotificationHandler<GetOrderDetailNotify>
+    {
+        private readonly IWorkflowDomainService _workflowDomainService;
+
+        public GetOrderDetailNotifyHandler(IWorkflowDomainService workflowDomainService)
+        {
+            _workflowDomainService = workflowDomainService;
+        }
+
+        /// <summary>Handles a notification</summary>
+        /// <param name="notification">The notification</param>
+        /// <param name="cancellationToken">Cancellation token</param>
+        public async Task Handle(GetOrderDetailNotify notification, CancellationToken cancellationToken)
+        {
+            await _workflowDomainService.AcceptAsync(notification.Workflow,
+                notification.UserId, notification.UserName,
+                notification.OrgId, notification.OrgName,
+                notification.OrgAreaCode, notification.OrgAreaName,
+                cancellationToken);
+        }
+    }
+}

+ 1 - 0
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -1153,6 +1153,7 @@ namespace Hotline.FlowEngine.Workflows
 
             var startStep = _mapper.Map<WorkflowStep>(startStepDefine);
             _mapper.Map(workflow, startStep);
+            startStep.FlowAssignType = EFlowAssignType.User;
             startStep.Handlers = handles;
             startStep.StepHandlers = stepHandlers;
             startStep.NextSteps = nextSteps;

+ 67 - 62
src/Hotline/Orders/OrderDomainService.cs

@@ -40,7 +40,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
     private readonly IRepository<Hotspot> _hotspotRepository;
 
 
-	public OrderDomainService(
+    public OrderDomainService(
         IOrderRepository orderRepository,
         IRepository<OrderRedo> orderRedoRepository,
         IRepository<OrderPublish> orderPublishRepository,
@@ -77,7 +77,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         _systemSettingCacheManager = systemSettingCacheManager;
         _workflowDomainService = workflowDomainService;
         _hotspotRepository = hotspotRepository;
-	}
+    }
 
     public async Task<Order> GetOrderAsync(string? orderId, bool withHotspot = false, bool withAcceptor = false,
         bool withExtension = false, CancellationToken cancellationToken = default)
@@ -227,7 +227,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
             {
                 stepIds.Add(stepsList[0]);
                 stepsList.Remove(stepsList[0]);
-			}
+            }
             List<(string, string, string, string, IReadOnlyList<string> stepIds)> handlers = new();
             ; handlers.Add(new ValueTuple<string, string, string, string, IReadOnlyList<string>>(user.Id, user.Name, user.OrgId, user.Organization.Name, stepIds));
             var workflowIds = await _workflowDomainService.ChangeHandlerRangeAsync(OrderDefaults.SourceChannel.SendPoolId, handlers, cancellationToken);
@@ -238,10 +238,10 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
                 _mapper.Map(order.Workflow, order);
             }
             var scheduling = await _schedulingRepository.Queryable().Includes(x => x.SchedulingUser)
-	            .Where(x => x.SchedulingTime == time && x.WorkingTime <= DateTime.Now.TimeOfDay && x.OffDutyTime >= DateTime.Now.TimeOfDay && x.SchedulingUser.UserId == userId).FirstAsync(cancellationToken);
+                .Where(x => x.SchedulingTime == time && x.WorkingTime <= DateTime.Now.TimeOfDay && x.OffDutyTime >= DateTime.Now.TimeOfDay && x.SchedulingUser.UserId == userId).FirstAsync(cancellationToken);
             scheduling.SendOrderNum += sendNum;
             await _schedulingRepository.UpdateAsync(scheduling, cancellationToken);
-			await _orderRepository.UpdateRangeAsync(orders, cancellationToken);
+            await _orderRepository.UpdateRangeAsync(orders, cancellationToken);
         }
     }
 
@@ -306,21 +306,21 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
             }
         }
     }
-	#endregion
-	#region  工单校验- 交通类工单
-
-	/// <summary>
-	/// 工单校验  - 交通类工单
-	/// </summary>
-	/// <returns></returns>
-	public async Task<OrderValidation> OrderValidation(AddOrderDto dto, CancellationToken cancellationToken) 
+    #endregion
+    #region  工单校验- 交通类工单
+
+    /// <summary>
+    /// 工单校验  - 交通类工单
+    /// </summary>
+    /// <returns></returns>
+    public async Task<OrderValidation> OrderValidation(AddOrderDto dto, CancellationToken cancellationToken)
     {
         var valid = new OrderValidation { Validation = false, Result = "" };
         var hotspot = await _hotspotRepository.GetAsync(dto.HotspotId, cancellationToken);
         if (hotspot.TrunkNum.Equals(OrderDefaults.SourceChannel.TrafficTrunkNum))
         {
-	        switch (dto.AcceptTypeCode)
-	        {
+            switch (dto.AcceptTypeCode)
+            {
                 //投诉举报
                 case "30":
                 case "35":
@@ -328,74 +328,74 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
                     valid.Validation = dto.Content.Contains("意见") || dto.Content.Contains("建议") || dto.Content.Contains("信息") || dto.Content.Contains("咨询");
                     if (dto.Content.Length < 25)
                     {
-	                    valid.Validation = true;
-	                    valid.Result = "保存失败,受理内容字数不足!";
+                        valid.Validation = true;
+                        valid.Result = "保存失败,受理内容字数不足!";
                     }
-					break;
+                    break;
                 // 意见
                 case "1":
-	                valid.Validation = dto.Title.Contains("投诉") || dto.Title.Contains("举报") || dto.Title.Contains("信息") || dto.Title.Contains("咨询");
-	                valid.Validation = dto.Content.Contains("投诉") || dto.Content.Contains("举报") || dto.Content.Contains("信息") || dto.Content.Contains("咨询");
-	                if (dto.Content.Length < 5)
-	                {
-		                valid.Validation = true;
-		                valid.Result = "保存失败,受理内容字数不足!";
-	                }
-					break;
-				//建议求助
-				case "15":
+                    valid.Validation = dto.Title.Contains("投诉") || dto.Title.Contains("举报") || dto.Title.Contains("信息") || dto.Title.Contains("咨询");
+                    valid.Validation = dto.Content.Contains("投诉") || dto.Content.Contains("举报") || dto.Content.Contains("信息") || dto.Content.Contains("咨询");
+                    if (dto.Content.Length < 5)
+                    {
+                        valid.Validation = true;
+                        valid.Result = "保存失败,受理内容字数不足!";
+                    }
+                    break;
+                //建议求助
+                case "15":
                 case "20":
-	                valid.Validation = dto.Title.Contains("投诉") || dto.Title.Contains("举报") || dto.Title.Contains("信息") || dto.Title.Contains("咨询");
-	                valid.Validation = dto.Content.Contains("投诉") || dto.Content.Contains("举报") || dto.Content.Contains("信息") || dto.Content.Contains("咨询");
-	                if (dto.Content.Length < 25)
-	                {
-		                valid.Validation = true;
-		                valid.Result = "保存失败,受理内容字数不足!";
-	                }
-					break;
+                    valid.Validation = dto.Title.Contains("投诉") || dto.Title.Contains("举报") || dto.Title.Contains("信息") || dto.Title.Contains("咨询");
+                    valid.Validation = dto.Content.Contains("投诉") || dto.Content.Contains("举报") || dto.Content.Contains("信息") || dto.Content.Contains("咨询");
+                    if (dto.Content.Length < 25)
+                    {
+                        valid.Validation = true;
+                        valid.Result = "保存失败,受理内容字数不足!";
+                    }
+                    break;
                 // 咨询
                 case "10":
-	                valid.Validation = dto.Title.Contains("投诉") || dto.Title.Contains("举报") || dto.Title.Contains("意见") || dto.Title.Contains("建议");
-	                valid.Validation = dto.Content.Contains("投诉") || dto.Content.Contains("举报") || dto.Content.Contains("意见") || dto.Content.Contains("建议");
+                    valid.Validation = dto.Title.Contains("投诉") || dto.Title.Contains("举报") || dto.Title.Contains("意见") || dto.Title.Contains("建议");
+                    valid.Validation = dto.Content.Contains("投诉") || dto.Content.Contains("举报") || dto.Content.Contains("意见") || dto.Content.Contains("建议");
                     if (dto.Content.Length < 5)
                     {
                         valid.Validation = true;
                         valid.Result = "保存失败,受理内容字数不足!";
-					}
-					break;
+                    }
+                    break;
                 // 表扬
                 case "25":
-	                if (dto.Content.Length < 25)
-	                {
-		                valid.Validation = true;
-		                valid.Result = "保存失败,受理内容字数不足!";
-	                }
-					break;
+                    if (dto.Content.Length < 25)
+                    {
+                        valid.Validation = true;
+                        valid.Result = "保存失败,受理内容字数不足!";
+                    }
+                    break;
                 default:
-	                if (dto.Content.Length < 5)
-	                {
-		                valid.Validation = true;
-		                valid.Result = "保存失败,受理内容字数不足!";
-	                }
-					break;
-			}
+                    if (dto.Content.Length < 5)
+                    {
+                        valid.Validation = true;
+                        valid.Result = "保存失败,受理内容字数不足!";
+                    }
+                    break;
+            }
         }
 
         if (valid.Validation && string.IsNullOrEmpty(valid.Result))
             valid.Result = "标题或受理内容出现限制词,请检查!";
-		return valid;
-	}
-	#endregion
+        return valid;
+    }
+    #endregion
 
-	#region SchedulingSendOrder
+    #region SchedulingSendOrder
 
 
 
-	#endregion
+    #endregion
 
-	#region private
+    #region private
 
-	private async Task<Order> GetOrderByFlowIdAsync(string workflowId, CancellationToken cancellationToken)
+    private async Task<Order> GetOrderByFlowIdAsync(string workflowId, CancellationToken cancellationToken)
     {
         if (string.IsNullOrEmpty(workflowId))
             throw UserFriendlyException.SameMessage("无效流程编号");
@@ -447,7 +447,12 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         //成员单位标识  99
         //宜宾市 511500  市级
         var today = DateTime.Today;
-        var count = no.Substring(no.Length - 5);
+        //var count = no.Substring(no.Length - 5);
+
+        //todo 双系统并行暂时执行此方案
+        var count = no.Substring(no.Length - 4);
+        count = (Convert.ToInt32(count) + 50000).ToString();
+
         var provinceCodes = new[] { "RGDH", "WX", "WB", "AP", "WZ", "YJ", "SCZWFWW", "XCX", "QT" };
         var prefix = provinceCodes.Any(d => d.Equals(sourceChannelCode))
             ? sourceChannelCode
@@ -469,7 +474,7 @@ public class CacheOrderNO
     public int TotalCount { get; set; }
 }
 
-public class OrderValidation 
+public class OrderValidation
 {
     public bool Validation { get; set; }
 

+ 2 - 2
src/Hotline/Settings/TimeLimits/TimeLimitDomainService.cs

@@ -160,7 +160,7 @@ namespace Hotline.Settings.TimeLimits
             {
                 if (isCenter)
                 {
-                    return Math.Round((decimal)min / 60 / 24, 2);
+                    return Math.Round((decimal)min / 60 / 60 / 24, 2);
                 }
                 else
                 {
@@ -174,7 +174,7 @@ namespace Hotline.Settings.TimeLimits
                         //总时差分钟数
                         int minutes = (int)minuteSpan.TotalMinutes;
 
-                        return Math.Round((decimal)min / minutes, 2);
+                        return Math.Round(((decimal)min/60) / minutes, 2);
                     }
                     return 0;
                 }