Explorar el Código

IWorkflowDomainService新增接口特提至派单节点

xf hace 9 meses
padre
commit
cdbf95370d

+ 22 - 18
src/Hotline.Application/Subscribers/DatasharingSubscriber.cs

@@ -258,15 +258,17 @@ namespace Hotline.Application.Subscribers
             model.RemindTime = dto.RemindTime;
             model.DsBisId= dto.DsBisId;
 
-            if (!string.IsNullOrEmpty(order.WorkflowId))
-            {
-                var org = await _workflowDomainService.FindActualHandlerAsync(order.WorkflowId, cancellationToken);
-                if (org != null)
-                {
-                    model.OrgId = org.Key;
-                    model.OrgName = org.Value;
-                }
-            }
+            //if (!string.IsNullOrEmpty(order.WorkflowId))
+            //{
+            //    var org = await _workflowDomainService.FindActualHandlerAsync(order.WorkflowId, cancellationToken);
+            //    if (org != null)
+            //    {
+            //        model.OrgId = org.Key;
+            //        model.OrgName = org.Value;
+            //    }
+            //}
+            model.OrgId = order.CurrentHandleOrgId;
+            model.OrgName = order.CurrentHandleOrgName;
 
 
             if (dto.Files.Any())
@@ -298,15 +300,17 @@ namespace Hotline.Application.Subscribers
                 model.OrgId = "001";
                 model.OrgName = "市民热线服务中心";
 
-                if (!string.IsNullOrEmpty(order.WorkflowId))
-                {
-                    var org = await _workflowDomainService.FindActualHandlerAsync(order.WorkflowId, cancellationToken);
-                    if (org != null)
-                    {
-                        model.OrgId = org.Key;
-                        model.OrgName = org.Value;
-                    }
-                }
+                //if (!string.IsNullOrEmpty(order.WorkflowId))
+                //{
+                //    var org = await _workflowDomainService.FindActualHandlerAsync(order.WorkflowId, cancellationToken);
+                //    if (org != null)
+                //    {
+                //        model.OrgId = org.Key;
+                //        model.OrgName = org.Value;
+                //    }
+                //}
+                model.OrgId = order.CurrentHandleOrgId;
+                model.OrgName = order.CurrentHandleOrgName;
 
                 await _orderUrgeRepository.AddAsync(model, cancellationToken);
 

+ 1 - 1
src/Hotline.Share/Enums/FlowEngine/EWorkflowTraceType.cs

@@ -24,7 +24,7 @@ namespace Hotline.Share.Enums.FlowEngine
         /// <summary>
         /// 撤回
         /// </summary>
-        [Description("撤回")]
+        [Description("特提")]
         Recall = 2,
 
         /// <summary>

+ 5 - 8
src/Hotline/FlowEngine/Workflows/IWorkflowDomainService.cs

@@ -74,6 +74,11 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         Task RecallToStartStepAsync(string workflowId, string opinion, ISessionContext current, CancellationToken cancellationToken);
 
+        /// <summary>
+        /// 特提至派单节点(无派单节点会抛异常)
+        /// </summary>
+        Task RecallToSendStepAsync(string workflowId, string opinion, ISessionContext current, CancellationToken cancellationToken);
+
         ///// <summary>
         ///// 跳转(直接将流程跳转至任意节点)
         ///// </summary>
@@ -186,14 +191,6 @@ namespace Hotline.FlowEngine.Workflows
         /// <returns></returns>
         Task<Workflow> TerminalCountersignAsync(string countersignId, CancellationToken cancellationToken);
 
-        /// <summary>
-        /// 查询实际办理对象信息
-        /// </summary>
-        /// <param name="workflowId"></param>
-        /// <param name="cancellationToken"></param>
-        /// <returns></returns>
-        Task<Kv> FindActualHandlerAsync(string workflowId, CancellationToken cancellationToken);
-
         /// <summary>
         /// 办理节点
         /// </summary>

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

@@ -563,9 +563,9 @@ public partial class Workflow
     {
         CurrentStepAcceptTime = step.AcceptTime;
         CurrentHandleTime = step.HandleTime;
-        CurrentHandleOrgLevel ??= handlerOrgLevel;
         CurrentHandleOrgAreaCode = handleOrgAreaCode;
         CurrentHandleOrgAreaName = handleOrgAreaName;
+        CurrentHandleOrgLevel ??= handlerOrgLevel;
 
         //坐席->派单存在不选办理对象的场景,所以要补赋值
         CurrentStepId = step.Id;

+ 70 - 20
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -115,6 +115,9 @@ namespace Hotline.FlowEngine.Workflows
                     current.OrgAreaCode, current.OrgAreaName,
                     current.OrgLevel);
 
+                workflow.UpdateCurrentStepWhenHandle(startStep, 
+                    current.OrgAreaCode, current.OrgAreaName, current.OrgLevel);
+
                 var endTrace = await EndAsync(workflow, dto, firstStepDefine,
                     startStep, current, expiredTime, cancellationToken);
                 return;
@@ -636,6 +639,14 @@ namespace Hotline.FlowEngine.Workflows
             //更新实际办理节点信息
             workflow.UpdateActualStepWhenAssign(newPrevStep, prevStep.HandlerOrgId, prevStep.HandlerOrgName);
 
+            workflow.UpdateCurrentStepWhenAssign(newPrevStep, new FlowStepHandler
+            {
+                UserId = prevStep.HandlerId,
+                Username = prevStep.HandlerName,
+                OrgId = prevStep.HandlerOrgId,
+                OrgName = prevStep.HandlerOrgName,
+            });
+
             //更新流程可办理对象
             workflow.UpdatePreviousHandlers(applicantId, applicantOrgId, prevStep);
 
@@ -1047,10 +1058,34 @@ namespace Hotline.FlowEngine.Workflows
             //todo 1.当前待办节点删掉 2.当前待办trace更新(status, opinion) 3.复制startStep为待办 4.更新workflow(status, csStatus, handlers) 5.publish event
             var workflow = await GetWorkflowAsync(workflowId, withDefine: true, withSteps: true, withTraces: true,
                 cancellationToken: cancellationToken);
+            var startStep = workflow.Steps.First(d => d.StepType == EStepType.Start);
+
+
+            await RecallToTargetStepAsync(workflow, startStep, opinion, current, cancellationToken);
+        }
+
+        /// <summary>
+        /// 撤回至派单节点
+        /// </summary>
+        public async Task RecallToSendStepAsync(string workflowId, string opinion, ISessionContext current,
+            CancellationToken cancellationToken)
+        {
+            //todo 1.当前待办节点删掉 2.当前待办trace更新(status, opinion) 3.复制startStep为待办 4.更新workflow(status, csStatus, handlers) 5.publish event
+            var workflow = await GetWorkflowAsync(workflowId, withDefine: true, withSteps: true, withTraces: true,
+                cancellationToken: cancellationToken);
+            var startStep = workflow.Steps.FirstOrDefault(d=>d.BusinessType == EBusinessType.Send);
+            if (startStep is null)
+                throw new UserFriendlyException($"未找到派单节点, workflowId: {workflowId}", "该流程无派单节点");
+
+            await RecallToTargetStepAsync(workflow, startStep, opinion, current, cancellationToken);
+        }
+
+        private async Task RecallToTargetStepAsync(Workflow workflow, WorkflowStep targetStep, string opinion, ISessionContext current,
+            CancellationToken cancellationToken)
+        {
             //update uncompleted traces
             await RecallTraceAsync(workflow.Traces, opinion, current, cancellationToken);
 
-            var startStep = workflow.Steps.First(d => d.StepType == EStepType.Start);
             workflow.Steps.RemoveAll(d => true);
             await _workflowStepRepository.RemoveRangeAsync(workflow.Steps, cancellationToken);
 
@@ -1060,26 +1095,28 @@ namespace Hotline.FlowEngine.Workflows
                 workflow.SetStatusRunnable();
 
             var newStartStep =
-                await DuplicateStepWithTraceAsync(workflow, startStep, EWorkflowTraceType.Recall, cancellationToken);
+                await DuplicateStepWithTraceAsync(workflow, targetStep, EWorkflowTraceType.Recall, cancellationToken);
 
-            //更新当前办理节点信息
-            //workflow.UpdateWorkflowCurrentStepInfo(false,
-            //    _sessionContext.RequiredUserId, _sessionContext.UserName,
-            //    _sessionContext.RequiredOrgId, _sessionContext.OrgName,
-            //    _sessionContext.OrgAreaCode, _sessionContext.OrgAreaName,
-            //    nextStep: newStartStep);
-            workflow.UpdateActualStepWhenAssign(startStep, startStep.HandlerOrgId, startStep.HandlerOrgName);
+            workflow.UpdateActualStepWhenAssign(targetStep, targetStep.HandlerOrgId, targetStep.HandlerOrgName);
 
-            var isOrgToCenter = CheckIfFlowFromOrgToCenter(workflow, startStep);
+            workflow.UpdateCurrentStepWhenAssign(targetStep, new FlowStepHandler
+            {
+                UserId = targetStep.HandlerId,
+                Username = targetStep.HandlerName,
+                OrgId = targetStep.HandlerOrgId,
+                OrgName = targetStep.HandlerOrgName,
+            });
 
-            var flowAssignInfo = FlowAssignInfo.Create(startStep.FlowAssignType.Value, startStep.Handlers);
+            var isOrgToCenter = CheckIfFlowFromOrgToCenter(workflow, targetStep);
+
+            var flowAssignInfo = FlowAssignInfo.Create(targetStep.FlowAssignType.Value, targetStep.Handlers);
             workflow.ResetHandlers(flowAssignInfo.FlowAssignType, flowAssignInfo.HandlerObjects);
 
             await _workflowRepository.UpdateAsync(workflow, cancellationToken);
 
-            var dto = _mapper.Map<RecallDto>(startStep);
-            dto.WorkflowId = workflowId;
-            await _mediator.Publish(new RecallNotify(workflow, startStep, dto, isOrgToCenter), cancellationToken);
+            var dto = _mapper.Map<RecallDto>(targetStep);
+            dto.WorkflowId = workflow.Id;
+            await _mediator.Publish(new RecallNotify(workflow, targetStep, dto, isOrgToCenter), cancellationToken);
         }
 
         ///// <summary>
@@ -1393,12 +1430,6 @@ namespace Hotline.FlowEngine.Workflows
             return startStep;
         }
 
-        public async Task<Kv> FindActualHandlerAsync(string workflowId, CancellationToken cancellationToken)
-        {
-            var workflow = await GetWorkflowAsync(workflowId, cancellationToken: cancellationToken);
-            return new Kv(workflow.ActualHandleOrgCode, workflow.ActualHandleOrgName);
-        }
-
         /// <summary>
         /// 流程结束
         /// </summary>
@@ -2195,6 +2226,14 @@ namespace Hotline.FlowEngine.Workflows
             //更新实际办理节点信息
             workflow.UpdateActualStepWhenAssign(targetStepNew, targetStep.HandlerOrgId, targetStep.HandlerOrgName);
 
+            workflow.UpdateCurrentStepWhenAssign(targetStepNew, new FlowStepHandler
+            {
+                UserId = targetStep.HandlerId,
+                Username = targetStep.HandlerName,
+                OrgId = targetStep.HandlerOrgId,
+                OrgName = targetStep.HandlerOrgName
+            });
+
             workflow.Assign(flowAssignInfo.FlowAssignType, flowAssignInfo.GetHandlerIds());
             workflow.ResetHandlers(flowAssignInfo.FlowAssignType, flowAssignInfo.HandlerObjects);
 
@@ -2488,10 +2527,21 @@ namespace Hotline.FlowEngine.Workflows
 
                 //当topcsStep结束cs时,实际办理节点应该更新为newStep
                 if (startCountersignStep.Id == workflow.TopCountersignStepId)
+                {
                     workflow.UpdateActualStepWhenAssign(newStep,
                         startCountersignStep.HandlerOrgId,
                         startCountersignStep.HandlerOrgName);
 
+                    workflow.UpdateCurrentStepWhenAssign(newStep,
+                        new FlowStepHandler
+                        {
+                            UserId = startCountersignStep.HandlerId,
+                            Username = startCountersignStep.HandlerName,
+                            OrgId = startCountersignStep.HandlerOrgId,
+                            OrgName = startCountersignStep.HandlerOrgName
+                        });
+                }
+
                 //csEndStep又开启了cs,在结束会签时,如果该节点是topcs的end节点, workflow.topcsStep应该更新为前一cs开启stepId
                 if (startCountersignStep.IsTopCountersignEndStep(workflow.TopCountersignStepId))
                     workflow.TopCountersignStepId = startCountersignStep.CountersignStartStepId;