Quellcode durchsuchen

话务部数据处理

田爽 vor 9 Monaten
Ursprung
Commit
2204b371bf

+ 104 - 3
src/Hotline.Api/Controllers/TestController.cs

@@ -8,9 +8,11 @@ using Fw.Utility.Client;
 using Google.Protobuf.WellKnownTypes;
 using Hotline.Ai.Visit;
 using Hotline.Application.ExportExcel;
+using Hotline.Application.FlowEngine;
 using Hotline.Application.JudicialManagement;
 using Hotline.Application.Quality;
 using Hotline.Application.StatisticalReport;
+using Hotline.Authentications;
 using Hotline.CallCenter.BlackLists;
 using Hotline.CallCenter.Calls;
 using Hotline.CallCenter.Configs;
@@ -131,6 +133,7 @@ public class TestController : BaseController
     private readonly IRepository<EnforcementOrders> _enforcementOrdersRepository;
     private readonly IRepository<JudicialManagementOrders> _judicialManagementOrdersRepository;
     private readonly IRepository<EnforcementOrdersHandler> _enforcementOrdersHandlerRepository;
+    private readonly IWorkflowApplication _workflowApplication;
 
     //private readonly ITypedCache<List<User>> _cache;
     //private readonly ICacheManager<User> _cache;
@@ -180,8 +183,9 @@ public class TestController : BaseController
    IOrderReportApplication orderReportApplication,
 IRepository<EnforcementOrders> enforcementOrdersRepository,
 IRepository<JudicialManagementOrders> judicialManagementOrdersRepository,
-IRepository<EnforcementOrdersHandler> enforcementOrdersHandlerRepository
-        )
+IRepository<EnforcementOrdersHandler> enforcementOrdersHandlerRepository,
+        IWorkflowApplication workflowApplication
+		)
     {
         _logger = logger;
         _authorizeGenerator = authorizeGenerator;
@@ -223,7 +227,9 @@ IRepository<EnforcementOrdersHandler> enforcementOrdersHandlerRepository
         _enforcementOrdersRepository = enforcementOrdersRepository;
         _judicialManagementOrdersRepository = judicialManagementOrdersRepository;
         _enforcementOrdersHandlerRepository = enforcementOrdersHandlerRepository;
-    }
+        _workflowApplication = workflowApplication;
+
+	}
     /// <summary>
     /// 处理司法工单数据
     /// </summary>
@@ -1004,4 +1010,99 @@ IRepository<EnforcementOrdersHandler> enforcementOrdersHandlerRepository
         return $"{publicKey} \r\n {privateKey}";
     }
 
+    /// <summary>
+    /// 处理工单流程错误数据   话务部直接归档件  没有归档节点
+    /// </summary>
+    /// <param name="StartTime"></param>
+    /// <param name="EndTime"></param>
+    /// <returns></returns>
+    [HttpGet("oders_workflow_step")]
+    [AllowAnonymous]
+    public async Task AddJudicialManagementOrders() {
+
+        var steps = await _workflowStepRepository.Queryable()
+            .LeftJoin<Order>((ws, d) => ws.ExternalId == d.Id)
+            .Where((ws, d) => d.Status == EOrderStatus.Handling && ws.NextStepCode == "end" && ws.Status == EWorkflowStepStatus.Handled && ws.StepType == EStepType.Start)
+            .ToListAsync(HttpContext.RequestAborted);
+        foreach (var item in steps)
+        {
+			///组装数据
+			//Workflow workflow
+			Workflow workflow = await _workflowDomainService.GetWorkflowAsync(item.WorkflowId, withDefine: true, withSteps: true,
+				cancellationToken: HttpContext.RequestAborted);
+            //WorkflowStep startStep
+            WorkflowStep startStep = workflow.Steps.First(x=>x.StepType  == EStepType.Start);
+            //BasicWorkflowDto dto
+            BasicWorkflowDto dto = new BasicWorkflowDto
+            {
+                NextStepCode = "end",
+                NextStepName = "结束",
+                BackToCountersignEnd = false,
+                FlowDirection = null,
+                HandlerType = 0,
+                StepType = 0,
+                NextHandlers = new List<FlowStepHandler>(),
+                IsSms = false,
+                NextMainHandler = "",
+                IsStartCountersign = false,
+                External = new External
+                {
+                    TimeLimit = null,
+                    TimeLimitUnit = null,
+                    IsPoliceReturn = false,
+                    IsResolved = false,
+                },
+                BusinessType = EBusinessType.File,
+                ReviewResult = 0,
+                Remark = null,
+                Opinion = startStep.Opinion,
+                Files = new List<Share.Dtos.File.FileDto>()
+            };
+            //ISessionContext current
+            ISessionContext current = new ProvinceSessionContext
+            {
+	            UserId = startStep.HandlerId,
+                UserName = startStep.HandlerName,
+                OrgId  = startStep.HandlerOrgId,
+                OrgName = startStep.HandlerOrgName,
+                OrgAreaCode = startStep.HandlerOrgAreaCode,
+                OrgAreaName = startStep.HandlerOrgAreaName,
+                OrgLevel = 1
+			};
+
+			//StepDefine firstStepDefine
+			StepDefine firstStepDefine = workflow.WorkflowDefinition.FindStepDefine(startStep.NextStepCode);
+			//FlowAssignInfo flowAssignInfo
+			//如果发起会签需检查是否支持发起会签
+			var startStepDefine = workflow.WorkflowDefinition.FindStartStepDefine();
+
+			//下一节点是否为动态节点
+			var isNextDynamic = startStepDefine.InstanceMode is EInstanceMode.Dynamic &&
+			                    !_workflowDomainService.DynamicShouldTerminal(startStepDefine, current.OrgLevel);
+
+			FlowAssignInfo flowAssignInfo =
+				await _workflowApplication.GetNextStepFlowAssignInfoAsync(workflow, startStep, dto, firstStepDefine, isNextDynamic, HttpContext.RequestAborted);
+            //DateTime? expiredTime
+            DateTime? expiredTime = startStep.StepExpiredTime;
+
+            ///
+            await _mediator.Publish(
+				new StartWorkflowNotify(workflow, dto, flowAssignInfo, startStep.WorkflowTrace), HttpContext.RequestAborted);
+
+			//firstStep是否为end,t: 实际办理节点为startStep, 并且handlerId赋值 f: 实际办理节点为firstStep, handlerId未赋值
+			workflow.UpdateActualStepWhenHandle(startStep,
+				current.RequiredUserId, current.UserName,
+				current.RequiredOrgId, current.OrgName,
+				current.OrgAreaCode, current.OrgAreaName,
+				current.OrgLevel);
+
+			workflow.UpdateCurrentStepWhenHandle(startStep,
+				current.OrgAreaCode, current.OrgAreaName, current.OrgLevel);
+
+			var endTrace = await _workflowDomainService.EndAsync(workflow, dto, firstStepDefine,
+				startStep, current, expiredTime, HttpContext.RequestAborted);
+}
+       
+	}
+
 }

+ 10 - 3
src/Hotline.Application/FlowEngine/IWorkflowApplication.cs

@@ -1,4 +1,5 @@
-using Hotline.FlowEngine.Definitions;
+using Hotline.FlowEngine;
+using Hotline.FlowEngine.Definitions;
 using Hotline.FlowEngine.WorkflowModules;
 using Hotline.FlowEngine.Workflows;
 using Hotline.Orders;
@@ -22,9 +23,15 @@ namespace Hotline.Application.FlowEngine
             CancellationToken cancellationToken = default);
 
         /// <summary>
-        /// 流转至下一节点(节点办理)
+        /// 查询下一节点办理对象类型(user or org)及实际办理对象
         /// </summary>
-        Task<Workflow> NextAsync(NextWorkflowDto dto, ISessionContext current, DateTime? expiredTime = null,
+		Task<FlowAssignInfo> GetNextStepFlowAssignInfoAsync(Workflow workflow, WorkflowStep currentStep,
+            BasicWorkflowDto dto, StepDefine nextStepDefine, bool isNextDynamic, CancellationToken cancellationToken);
+
+		/// <summary>
+		/// 流转至下一节点(节点办理)
+		/// </summary>
+		Task<Workflow> NextAsync(NextWorkflowDto dto, ISessionContext current, DateTime? expiredTime = null,
             CancellationToken cancellationToken = default);
 
         /// <summary>

+ 4 - 2
src/Hotline/Authentications/ProvinceSessionContext.cs

@@ -13,17 +13,19 @@ namespace Hotline.Authentications
             OrgLevel = 1;
         }
 
+        //TODO 取消写入
         /// <summary>
         /// Id of current tenant or null for host
         /// </summary>
-        public string? UserId { get; }
+        public string? UserId { get; set; }
 
         /// <summary>
         /// Id of current user or throw Exception for guest
         /// </summary>
         /// <exception cref="AuthenticationException"></exception>
         public string RequiredUserId => UserId ?? throw new ArgumentNullException();
-        public string? UserName { get; }
+        //TODO 取消写入
+		public string? UserName { get; set; }
         public string? Phone { get; }
 
         /// <summary>