xf 2 лет назад
Родитель
Сommit
8877f91c45

+ 1 - 1
src/Hotline.Api/Controllers/WorkflowController.cs

@@ -366,7 +366,7 @@ public class WorkflowController : BaseController
     /// <returns></returns>
     /// <exception cref="ArgumentOutOfRangeException"></exception>
     [HttpGet("handlerclassify/{handlerType}")]
-    public async Task<List<KeyValuePair<string, string>>> GetHanlderClassifies(EHandlerType handlerType)
+    public async Task<List<KeyValuePair<string, string>>> GetHandlerClassifies(EHandlerType handlerType)
     {
         switch (handlerType)
         {

+ 7 - 3
src/Hotline.Share/Enums/FlowEngine/EWorkflowStatus.cs

@@ -3,7 +3,11 @@
 public enum EWorkflowStatus
 {
     Runnable = 0,
-    Suspended = 1,
-    Completed = 2,
-    Terminated = 3,
+    Suspended = 10,
+    /// <summary>
+    /// 流程上所有普通节点都办理完成则标记一下,否则处于runnable状态
+    /// </summary>
+    Marked = 15,
+    Completed = 20,
+    Terminated = 30,
 }

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

@@ -265,7 +265,7 @@ public class Workflow : CreationEntity
     /// </summary>
     /// <returns></returns>
     public bool CanHandle(string userId, string orgCode) =>
-        Status is EWorkflowStatus.Runnable
+        Status is EWorkflowStatus.Runnable or EWorkflowStatus.Marked
         && (HandlerUsers.Any(d => d.Id == userId) || HandlerOrgs.Any(d => d.Id == orgCode));
 
     private void RemoveCurrentHandleGroup(string handlerId, string handlerOrg)

+ 11 - 5
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -178,7 +178,7 @@ namespace Hotline.FlowEngine.Workflows
         {
             if (!workflow.CanHandle(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgCode)) return;
             //工单完成以后查看的场景
-            if (workflow.Status is not EWorkflowStatus.Runnable) return;
+            if (workflow.Status is not EWorkflowStatus.Runnable or EWorkflowStatus.Marked) return;
 
             var (currentStepBox, currentStep) = GetUnCompleteStepOrDefault(workflow.StepBoxes, orgCode, userId);
             if (currentStep is null) return;
@@ -346,17 +346,23 @@ namespace Hotline.FlowEngine.Workflows
                 workflow.AssignTime = DateTime.Now;
             }
 
-            //最终办理意见与时间处理
-            if (currentStep.StepType is EStepType.Normal && nextStepBoxDefine.StepType is EStepType.CountersignEnd)
+            //最终办理意见与时间处理(解决工单业务需求,如果流程配置普通节点后未配置汇总节点则不会运行到此处)
+            var normalSteps = workflow.StepBoxes
+                .Where(d => d.StepType is EStepType.Normal)
+                .SelectMany(d => d.Steps);
+            var isAllCompleted = normalSteps.All(d => d.Status is EWorkflowStepStatus.Completed);
+            if (isAllCompleted)
             {
                 //最终办理
                 workflow.Opinion = dto.Opinion;
+                workflow.Status = EWorkflowStatus.Marked;
                 await _mediator.Publish(new OrderFinalManageNotify(workflow), cancellationToken);
             }
-            else if (currentStep.StepType is EStepType.CountersignEnd && nextStepBoxDefine.StepType is EStepType.Normal)
+            else if (workflow.Status is EWorkflowStatus.Marked)
             {
                 //汇总以后又重新指派到非汇总节点办理
                 workflow.ResetOption();
+                workflow.Status = EWorkflowStatus.Runnable;
                 await _mediator.Publish(new OrderRecallFinalManageNotify(workflow), cancellationToken);
             }
 
@@ -820,7 +826,7 @@ namespace Hotline.FlowEngine.Workflows
 
         private static void CheckWhetherRunnable(EWorkflowStatus status)
         {
-            if (status is not EWorkflowStatus.Runnable)
+            if (status is not EWorkflowStatus.Runnable or EWorkflowStatus.Marked)
                 throw new UserFriendlyException("当前流程状态不可继续流转");
         }