ソースを参照

fixed: flowAssignType

xf 1 年間 前
コミット
c44c382a48

+ 18 - 5
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -156,9 +156,6 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
 
         await _workflowDomainService.StartAsync(workflow, startStep, dto, firstStepDefine, flowAssignInfo, cancellationToken);
 
-        ////更新接办部门(详情页面展示)
-        //await AddOrUpdateAssignAsync(workflow, dto, nextStepBoxDefine, cancellationToken);
-
         return workflow.Id;
     }
 
@@ -1019,8 +1016,24 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             //按会签策略判断,目前所有策略为org
             return FlowAssignInfo.Create(EFlowAssignType.Org, handlers, isStartCountersign);
 
-        if (currentStep.IsInCountersign() && !currentStep.IsTopCountersignEndStep(workflow.TopCountersignStepId))
-            return FlowAssignInfo.Create(EFlowAssignType.Org, handlers, isStartCountersign);
+        //if (currentStep.IsInCountersign() && !currentStep.IsTopCountersignEndStep(workflow.TopCountersignStepId))
+        //    return FlowAssignInfo.Create(EFlowAssignType.Org, handlers, isStartCountersign);
+
+        if (currentStep.IsInCountersign())
+        {
+            if (dto.BackToCountersignEnd)
+            {
+                var prevStep = workflow.Steps.FirstOrDefault(d => d.Id == currentStep.PrevStepId);
+                if (prevStep is null)
+                    throw new UserFriendlyException($"未查询到当前节点的上级节点");
+                return FlowAssignInfo.Create(prevStep.FlowAssignType.Value, prevStep.Handlers, isStartCountersign);
+            }
+            else
+            {
+                //按会签策略判断,目前所有策略为org
+                return FlowAssignInfo.Create(EFlowAssignType.Org, handlers, isStartCountersign);
+            }
+        }
 
         if (currentStep.InstanceMode is EInstanceMode.Dynamic && !currentStep.DynamicShouldTerminal())
             return FlowAssignInfo.Create(EFlowAssignType.Org, handlers, isStartCountersign);

+ 6 - 0
src/Hotline/FlowEngine/Workflows/StepBasicEntity.cs

@@ -4,6 +4,7 @@ using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Enums.FlowEngine;
 using SqlSugar;
+using XF.Domain.Entities;
 using XF.Domain.Repository;
 
 namespace Hotline.FlowEngine.Workflows;
@@ -12,6 +13,11 @@ public abstract class StepBasicEntity : CreationEntity
 {
     public string WorkflowId { get; set; }
 
+    /// <summary>
+    /// 流程指派类型
+    /// </summary>
+    public EFlowAssignType? FlowAssignType { get; set; }
+
     /// <summary>
     /// 该节点指派办理对象(依据不同指派方式可能为:orgId或userId),该字段subStep才会存在,stepBox不存在
     /// 采用list类型,兼容多个办理对象可以办理同一个节点的场景

+ 41 - 54
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -97,35 +97,9 @@ namespace Hotline.FlowEngine.Workflows
         {
             //1. 创建first节点 (和trace)2.办理开始节点 
 
-            ////startstep
-            //var nextSteps = _mapper.Map<List<StepSimple>>(startStepDefine.NextSteps);
-            //nextSteps.First(d => d.Code == dto.NextStepCode).Selected = true;
-            //var startStep = new WorkflowStep
-            //{
-            //    WorkflowId = workflow.Id,
-            //    Handlers = new List<Kv> { new(_sessionContext.RequiredUserId, _sessionContext.UserName) },
-            //    NextSteps = nextSteps,
-            //    IsMain = true,
-            //    IsOrigin = true,
-            //    Status = EWorkflowStepStatus.WaitForHandle,
-            //    PrevChosenStepCode = null,
-            //};
-            //var startDefine = workflow.WorkflowDefinition.FindStartStepDefine();
-            //_mapper.Map(startDefine, startStep);
-            //await _workflowStepRepository.AddAsync(startStep, cancellationToken);
-            //workflow.Steps.Add(startStep);
-
-            ////starttrace
-            //var startTrace = _mapper.Map<WorkflowTrace>(startStep);
-            //startTrace.StepId = startStep.Id;
-            //startTrace.Status = EWorkflowTraceStatus.Normal;
-            //_mapper.Map(dto, startTrace);
-            //await _workflowTraceRepository.AddAsync(startTrace, cancellationToken);
-            //workflow.Traces.Add(startTrace);
-
             //firststeps
-            var firstSteps = await CreateNextStepsAsync(workflow, firstStepDefine, startStep, dto, workflow.ExpiredTime,
-                cancellationToken);
+            var firstSteps = await CreateNextStepsAsync(workflow, firstStepDefine, startStep, dto, flowAssignInfo,
+                workflow.ExpiredTime, cancellationToken);
             if (firstSteps.Any())
                 workflow.Steps.AddRange(firstSteps);
 
@@ -390,7 +364,8 @@ namespace Hotline.FlowEngine.Workflows
                 workflow.CenterToOrg(CalculateExpiredTime(workflow.WorkflowDefinition.Code));//todo 过期时间
 
             //创建下一/N个节点(会签汇总节点:会签未全部办理时不创建,最后一个会签办理节点创建会签汇总节点)
-            var nextSteps = await CreateNextStepsAsync(workflow, nextStepDefine, currentStep, dto, dto.StepExpiredTime, cancellationToken);
+            var nextSteps = await CreateNextStepsAsync(workflow, nextStepDefine, currentStep, dto, flowAssignInfo,
+                dto.StepExpiredTime, cancellationToken);
 
             //赋值当前节点的下级办理节点
             if (dto.IsStartCountersign
@@ -450,7 +425,8 @@ namespace Hotline.FlowEngine.Workflows
         /// 创建下1/N个节点
         /// </summary>
         private async Task<List<WorkflowStep>> CreateNextStepsAsync(Workflow workflow, StepDefine nextStepDefine,
-            WorkflowStep currentStep, BasicWorkflowDto dto, DateTime expiredTime, CancellationToken cancellationToken)
+            WorkflowStep currentStep, BasicWorkflowDto dto, FlowAssignInfo flowAssignInfo, DateTime expiredTime,
+            CancellationToken cancellationToken)
         {
             List<WorkflowStep> nextSteps = new();
             if (currentStep.IsInCountersign())
@@ -465,12 +441,13 @@ namespace Hotline.FlowEngine.Workflows
                         {
                             //todo 依据会签策略创建会签下一级节点
                             nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
-                                expiredTime, cancellationToken);
+                                flowAssignInfo.FlowAssignType, expiredTime, cancellationToken);
                         }
                         else
                         {
                             //todo 创建普通节点(根据配置)
-                            nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto, expiredTime, cancellationToken);
+                            nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto,
+                                flowAssignInfo, expiredTime, cancellationToken);
                         }
                     }
                     else
@@ -481,7 +458,8 @@ namespace Hotline.FlowEngine.Workflows
                         if (csStartStep is null)
                             throw new UserFriendlyException("未查询到会签节点");
 
-                        nextSteps = await CreateCsEndStepsByPrevStepAsync(workflow, csStartStep, dto, expiredTime, cancellationToken);
+                        nextSteps = await CreateCsEndStepsByPrevStepAsync(workflow, csStartStep, dto, expiredTime,
+                            cancellationToken);
                     }
                 }
                 else
@@ -489,33 +467,35 @@ namespace Hotline.FlowEngine.Workflows
                     if (dto.BackToCountersignEnd)
                     {
                         //todo check if cs all complete, create next
-                        nextSteps = await CreateCsEndStepsByPrevStepAsync(workflow, currentStep, dto, expiredTime, cancellationToken);
+                        nextSteps = await CreateCsEndStepsByPrevStepAsync(workflow, currentStep, dto, expiredTime,
+                            cancellationToken);
                     }
                     else
                     {
                         //todo 依据会签策略创建会签下一级节点
                         nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
-                            expiredTime, cancellationToken);
+                            flowAssignInfo.FlowAssignType, expiredTime, cancellationToken);
                     }
                 }
             }
-            else if (dto.IsStartCountersign)//top
+            else if (dto.IsStartCountersign) //top
             {
                 //todo 依据会签策略创建会签下一级节点
                 nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
-                    expiredTime, cancellationToken);
+                    flowAssignInfo.FlowAssignType, expiredTime, cancellationToken);
             }
             else if (currentStep.InstanceMode is EInstanceMode.Dynamic && !currentStep.DynamicShouldTerminal())
             {
                 //todo 创建动态下一级节点
-                nextSteps = await CreateStepsAsync(workflow, nextStepDefine, currentStep, dto, dto.NextHandlers,
-                    null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None,
-                    expiredTime, false, cancellationToken);
+                nextSteps = await CreateStepsAsync(workflow, nextStepDefine, currentStep, dto,
+                    flowAssignInfo.FlowAssignType, dto.NextHandlers, null, EWorkflowStepStatus.WaitForAccept,
+                    ECountersignPosition.None, expiredTime, false, cancellationToken);
             }
             else
             {
                 //todo 创建普通节点(根据配置)
-                nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto, expiredTime, cancellationToken);
+                nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto, flowAssignInfo,
+                    expiredTime, cancellationToken);
             }
 
             return nextSteps;
@@ -526,13 +506,14 @@ namespace Hotline.FlowEngine.Workflows
             StepDefine stepDefine,
             WorkflowStep prevStep,
             BasicWorkflowDto dto,
+            EFlowAssignType flowAssignType,
             DateTime expiredTime,
             CancellationToken cancellationToken
         )
         {
             var countersignId = prevStep.IsStartCountersign ? prevStep.StartCountersignId : prevStep.CountersignId;
 
-            return CreateStepsAsync(workflow, stepDefine, prevStep, dto, dto.NextHandlers, countersignId,
+            return CreateStepsAsync(workflow, stepDefine, prevStep, dto, flowAssignType, dto.NextHandlers, countersignId,
                   EWorkflowStepStatus.WaitForAccept, prevStep.GetNextStepCountersignPosition(),
                   expiredTime, false, cancellationToken);
         }
@@ -649,7 +630,8 @@ namespace Hotline.FlowEngine.Workflows
             //update uncompleted traces
             await RecallTraceAsync(workflow.Id, dto.Opinion, cancellationToken);
 
-            var isOrgToCenter = await RecallAsync(workflow, dto, targetStepDefine, targetStep, EWorkflowTraceStatus.Recall, cancellationToken);
+            var isOrgToCenter = await RecallAsync(workflow, dto, flowAssignInfo, targetStepDefine, targetStep,
+                EWorkflowTraceStatus.Recall, cancellationToken);
 
             workflow.ResetHandlers(flowAssignInfo.FlowAssignType, flowAssignInfo.HandlerObjects);
 
@@ -682,7 +664,7 @@ namespace Hotline.FlowEngine.Workflows
                 if (lastStep is null || lastStep.StepType is EStepType.End)
                     throw new UserFriendlyException($"流程流转数据异常,未结束流程出现endStep, flowId: {workflow.Id}", "流程流转数据异常");
 
-                var targetSteps = await CreateConfigStepsAsync(workflow, targetStepDefine, lastStep, dto, workflow.ExpiredTime, cancellationToken);
+                var targetSteps = await CreateConfigStepsAsync(workflow, targetStepDefine, lastStep, dto, flowAssignInfo, workflow.ExpiredTime, cancellationToken);
                 targetStep = targetSteps.First();
 
                 workflow.EndCountersign();
@@ -724,7 +706,7 @@ namespace Hotline.FlowEngine.Workflows
             else
             {
                 //返回之前节点
-                isOrgToCenter = await RecallAsync(workflow, dto, targetStepDefine, targetStep, EWorkflowTraceStatus.Jump, cancellationToken);
+                isOrgToCenter = await RecallAsync(workflow, dto, flowAssignInfo, targetStepDefine, targetStep, EWorkflowTraceStatus.Jump, cancellationToken);
             }
 
             workflow.ResetHandlers(flowAssignInfo.FlowAssignType, flowAssignInfo.HandlerObjects);
@@ -746,7 +728,7 @@ namespace Hotline.FlowEngine.Workflows
             if (targetStepBox is null)
                 throw UserFriendlyException.SameMessage("未找到该节点配置");
 
-            var isOrgToCenter = await RecallAsync(workflow, dto, targetStepDefine, targetStepBox, EWorkflowTraceStatus.Redo, cancellationToken);
+            var isOrgToCenter = await RecallAsync(workflow, dto, flowAssignInfo, targetStepDefine, targetStepBox, EWorkflowTraceStatus.Redo, cancellationToken);
 
             workflow.Redo();
             workflow.ResetHandlers(flowAssignInfo.FlowAssignType, flowAssignInfo.HandlerObjects);
@@ -1216,7 +1198,7 @@ namespace Hotline.FlowEngine.Workflows
             return parentTrace;
         }
 
-        private async Task<bool> RecallAsync(Workflow workflow, BasicWorkflowDto dto, StepDefine targetStepDefine,
+        private async Task<bool> RecallAsync(Workflow workflow, BasicWorkflowDto dto, FlowAssignInfo flowAssignInfo, StepDefine targetStepDefine,
             WorkflowStep targetStep, EWorkflowTraceStatus traceStatus, CancellationToken cancellationToken)
         {
             //get targetStep's previous
@@ -1239,7 +1221,8 @@ namespace Hotline.FlowEngine.Workflows
             //var targetStepBoxNew = await CreateStepAsync(workflow, targetStepDefine, dto, EWorkflowStepStatus.WaitForAccept,
             //     targetPrevStepBox, targetPrevStep, traceStatus, workflow.ExpiredTime, cancellationToken);
 
-            var targetStepsNew = await CreateConfigStepsAsync(workflow, targetStepDefine, targetPrevStep, dto, workflow.ExpiredTime, cancellationToken);
+            var targetStepsNew = await CreateConfigStepsAsync(workflow, targetStepDefine, targetPrevStep, dto,
+                flowAssignInfo, workflow.ExpiredTime, cancellationToken);
 
             //更新当前办理节点信息
             workflow.UpdateWorkflowCurrentStepInfo(dto.IsStartCountersign, nextStep: targetStepsNew.First());
@@ -1288,7 +1271,7 @@ namespace Hotline.FlowEngine.Workflows
 
             var handler = new Kv { Key = _sessionContext.RequiredUserId, Value = _sessionContext.UserName };
 
-            var step = CreateStep(endStepDefine, prevStep, workflow.Id, new List<Kv> { handler },
+            var step = CreateStep(endStepDefine, prevStep, workflow.Id, null, new List<Kv> { handler },
                  null, null, null,
                      EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, DateTime.Now, endStepDefine.Name, true);
 
@@ -1311,6 +1294,7 @@ namespace Hotline.FlowEngine.Workflows
             StepDefine stepDefine,
             WorkflowStep prevStep,
             BasicWorkflowDto dto,
+            FlowAssignInfo flowAssignInfo,
             DateTime expiredTime,
             CancellationToken cancellationToken)
         {
@@ -1326,9 +1310,9 @@ namespace Hotline.FlowEngine.Workflows
                 handlers = dto.NextHandlers;
             }
 
-            return await CreateStepsAsync(workflow, stepDefine, prevStep, dto, handlers, null,
-                EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None,
-                expiredTime, true, cancellationToken);
+            return await CreateStepsAsync(workflow, stepDefine, prevStep, dto, flowAssignInfo.FlowAssignType, handlers,
+                null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, expiredTime, true,
+                cancellationToken);
         }
 
         private async Task<List<WorkflowStep>> CreateStepsAsync(
@@ -1336,6 +1320,7 @@ namespace Hotline.FlowEngine.Workflows
             StepDefine stepDefine,
             WorkflowStep prevStep,
             BasicWorkflowDto dto,
+            EFlowAssignType? flowAssignType,
             List<Kv> handlers,
             string? countersignId,
             EWorkflowStepStatus stepStatus,
@@ -1354,7 +1339,7 @@ namespace Hotline.FlowEngine.Workflows
             {
                 foreach (var handler in handlers)
                 {
-                    var step = CreateStep(stepDefine, prevStep, workflow.Id, new List<Kv> { handler },
+                    var step = CreateStep(stepDefine, prevStep, workflow.Id, flowAssignType, new List<Kv> { handler },
                         dto.NextStepCode, dto.NextMainHandler, countersignId,
                         stepStatus, csPosition, expiredTime, dto.NextStepName, isOrigin);
 
@@ -1363,7 +1348,7 @@ namespace Hotline.FlowEngine.Workflows
             }
             else
             {
-                var step = CreateStep(stepDefine, prevStep, workflow.Id, handlers,
+                var step = CreateStep(stepDefine, prevStep, workflow.Id, flowAssignType, handlers,
                     dto.NextStepCode, dto.NextMainHandler, countersignId,
                     stepStatus, csPosition, expiredTime, dto.NextStepName, isOrigin);
 
@@ -1402,6 +1387,7 @@ namespace Hotline.FlowEngine.Workflows
             StepDefine stepDefine,
             WorkflowStep prevStep,
             string workflowId,
+            EFlowAssignType? flowAssignType,
             List<Kv> handlers,
             string nextStepCode,
             string? nextMainHandler,
@@ -1420,6 +1406,7 @@ namespace Hotline.FlowEngine.Workflows
             var isMain = handlers.Count == 1 || (handlers.Count > 1 || handlerIds.First() == nextMainHandler);
 
             step.WorkflowId = workflowId;
+            step.FlowAssignType = flowAssignType;
             step.Handlers = handlers;
             step.NextStepCode = step.StepType is EStepType.End ? string.Empty : nextStepCode;
             step.IsMain = isMain;