Explorar o código

创建endStep,endTrace

xf %!s(int64=2) %!d(string=hai) anos
pai
achega
058307c31d

+ 2 - 1
src/Hotline.CacheManager/RolePermissionsCacheManager.cs

@@ -26,9 +26,10 @@ namespace Hotline.CacheManager
         {
             return _cache.GetOrAdd(GetKey(role), d =>
                 {
+                    //todo 加上全局配置,对未开启模块过滤
                     var systemAuth = _systemAuthorityRepository.GetAsync(d => d.RoleCode == role).GetAwaiter()
                         .GetResult();
-                    return systemAuth.GetAllPermissions();
+                    return systemAuth?.GetAllPermissions() ?? new();
                 }
             );
         }

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

@@ -268,7 +268,7 @@ namespace Hotline.FlowEngine.Workflows
             _mapper.Map(dto, currentStep);
 
             //step办理状态
-            currentStep.StepComplete(
+            currentStep.Complete(
                 _sessionContext.RequiredUserId, _sessionContext.UserName,
                 _sessionContext.RequiredOrgCode, _sessionContext.OrgName,
                 dto.NextStepCode);
@@ -306,29 +306,6 @@ namespace Hotline.FlowEngine.Workflows
                     currentCountersign.Complete(currentStep.Id, currentStep.Code);
                     await _workflowCountersignRepository.UpdateAsync(currentCountersign, cancellationToken);
                 }
-
-                ////old
-                //var countersignStartStepBox =
-                //    workflow.StepBoxes.FirstOrDefault(d => d.Code == currentStep.CountersignStartStepCode);
-                //if (countersignStartStepBox is null)
-                //    throw new UserFriendlyException(
-                //    $"未查询到会签开始stepBox, workflowId: {workflow.Id}, stepCode: {currentStep.CountersignStartStepCode}", "未查询到会签开始节点");
-                //var countersignStartStep =
-                //    countersignStartStepBox.Steps.FirstOrDefault(d => d.HasStartedCountersign && d.StartCountersignId == currentStep.CountersignId);
-                //if (countersignStartStep != null)//如果==null,说明未发起会签是继承的外层会签
-                //{
-                //    //结束step会签信息
-                //    countersignStartStep.CountersignComplete();
-                //    updateSteps.Add(countersignStartStep);
-
-                //    //结束会签
-                //    var currentCountersign = workflow.Countersigns.FirstOrDefault(d => d.Id == currentStep.CountersignId);
-                //    if (currentCountersign is null)
-                //        throw new UserFriendlyException(
-                //            $"未查询到对应会签信息,workflowId:{workflow.Id}, countersignId:{currentStep.CountersignId}", "无效会签编号");
-                //    currentCountersign.Complete(currentStep.Id, currentStep.Code);
-                //    await _workflowCountersignRepository.UpdateAsync(currentCountersign, cancellationToken);
-                //}
             }
 
             await _workflowStepRepository.UpdateRangeAsync(updateSteps, cancellationToken);
@@ -349,9 +326,14 @@ namespace Hotline.FlowEngine.Workflows
             //检查是否流转到流程终点
             if (nextStepBoxDefine.StepType is EStepType.End && !workflow.IsInCountersign())
             {
+                //create endStep
+                var (_, endStep) = await CreateEndStepAsync(workflow, nextStepBoxDefine, currentStepBox, currentStep, cancellationToken);
+                //create endTrace
+                await EndTraceAsync(workflow, dto, endStep, cancellationToken);
+
                 workflow.Complete();
                 await _workflowRepository.UpdateAsync(workflow, cancellationToken);
-
+                
                 await _mediator.Publish(new EndWorkflowNotify(workflow), cancellationToken);
                 return;
             }
@@ -501,7 +483,8 @@ namespace Hotline.FlowEngine.Workflows
                 //向后跳转
                 var nextStepBoxDefine = GetStepBoxDefine(workflow.Definition, dto.NextStepCode);
                 //var isStartCountersign = nextStepBoxDefine.IsStartCountersign(dto.NextHandlers.Count);
-                var nextStepBox = await CreateStepAsync(isStartCountersign, workflow, nextStepBoxDefine, dto, EWorkflowStepStatus.Assigned, currentStepBox, currentStep, cancellationToken);
+                var nextStepBox = await CreateStepAsync(isStartCountersign, workflow, nextStepBoxDefine, dto,
+                    EWorkflowStepStatus.Assigned, currentStepBox, currentStep, cancellationToken);
 
                 await ResetWorkflowCurrentStepInfo(workflow, dto, nextStepBox, cancellationToken);
 
@@ -694,13 +677,20 @@ namespace Hotline.FlowEngine.Workflows
             await _workflowTraceRepository.UpdateAsync(trace, cancellationToken);
         }
 
+        private async Task EndTraceAsync(Workflow workflow, BasicWorkflowDto dto, WorkflowStep step, CancellationToken cancellationToken)
+        {
+            var trace = _mapper.Map<WorkflowTrace>(step);
+            trace.Status = EWorkflowTraceStatus.Normal;
+            trace.ExpiredTime = workflow.ExpiredTime;
+            trace.TimeLimit = workflow.TimeLimit;
+            await _workflowTraceRepository.AddAsync(trace, cancellationToken);
+        }
+
         private async Task NextTraceAsync(Workflow workflow, BasicWorkflowDto dto, WorkflowStep step, CancellationToken cancellationToken)
         {
             var trace = await GetWorkflowTraceAsync(workflow.Id, step.Id, cancellationToken);
             _mapper.Map(dto, trace);
             _mapper.Map(step, trace);
-            //trace.ExpiredTime = workflow.ExpiredTime;
-            //trace.TimeLimit = workflow.TimeLimit;
             await _workflowTraceRepository.UpdateAsync(trace, cancellationToken);
         }
 
@@ -750,7 +740,8 @@ namespace Hotline.FlowEngine.Workflows
             //recreate targetStep
             var nextStepBoxDefine = GetStepBoxDefine(workflow.Definition, dto.NextStepCode);
             //var isStartCountersign = nextStepBoxDefine.IsStartCountersign(dto.NextHandlers.Count);
-            await CreateStepAsync(isStartCountersign, workflow, nextStepBoxDefine, dto, EWorkflowStepStatus.Assigned, targetStepBox, targetStepBox.Steps.First(), cancellationToken);
+            await CreateStepAsync(isStartCountersign, workflow, nextStepBoxDefine, dto, EWorkflowStepStatus.Assigned,
+                targetStepBox, targetStepBox.Steps.First(), cancellationToken);
 
             //flow manage
             if (workflow.IsInCountersign())
@@ -794,19 +785,37 @@ namespace Hotline.FlowEngine.Workflows
         private async Task<(WorkflowStep stepBox, WorkflowStep step)> CreateStartStepAsync(Workflow workflow, BasicWorkflowDto dto, CancellationToken cancellationToken)
         {
             if (workflow.StepBoxes.Any())
-                throw UserFriendlyException.SameMessage("无法反复开始流程");
+                throw UserFriendlyException.SameMessage("无法重复创建开始节点");
 
             var startStepDefinition = workflow.Definition.Steps.FirstOrDefault(d => d.StepType == EStepType.Start);
             if (startStepDefinition == null)
                 throw new UserFriendlyException($"模板未配置开始节点, defineCode: {workflow.Definition.Code}", "模板未配置开始节点");
 
-            var stepBox = CreateStepBox(workflow.Id, startStepDefinition, dto, string.Empty);
+            var stepBox = CreateStepBox(workflow.Id, startStepDefinition, string.Empty);
             await _workflowStepRepository.AddAsync(stepBox, cancellationToken);
 
             //start节点的办理人分类默认为用户,即为当前发起流程的操作员
             var handler = new IdName { Id = _sessionContext.RequiredUserId, Name = _sessionContext.UserName };
-            await CreateStartSubStepAsync(handler, dto, stepBox, cancellationToken);
-            return (stepBox, stepBox.Steps.First());
+            var step = await CreateStartSubStepAsync(handler, dto, stepBox, cancellationToken);
+            return (stepBox, step);
+        }
+
+        private async Task<(WorkflowStep stepBox, WorkflowStep step)> CreateEndStepAsync(
+            Workflow workflow,
+            StepDefine endStepDefine,
+            WorkflowStep prevStepBox,
+            WorkflowStep preveStep,
+            CancellationToken cancellationToken)
+        {
+            if (workflow.StepBoxes.Any(d => d.StepType == EStepType.End))
+                throw UserFriendlyException.SameMessage("无法重复创建结束节点");
+
+            var stepBox = CreateStepBox(workflow.Id, endStepDefine, prevStepBox.Id);
+            await _workflowStepRepository.AddAsync(stepBox, cancellationToken);
+
+            var handler = new IdName { Id = _sessionContext.RequiredUserId, Name = _sessionContext.UserName };
+            var step = await CreateEndSubStepAsync(handler, stepBox, preveStep, cancellationToken);
+            return (stepBox, step);
         }
 
         /// <summary>
@@ -816,8 +825,8 @@ namespace Hotline.FlowEngine.Workflows
             bool isPrevStartCountersign,
             Workflow workflow, StepDefine stepBoxDefine,
             BasicWorkflowDto dto, EWorkflowStepStatus status,
-            WorkflowStep? prevStepBox = null,
-            WorkflowStep? prevStep = null,
+            WorkflowStep prevStepBox,
+            WorkflowStep prevStep,
             CancellationToken cancellationToken = default)
         {
             if (stepBoxDefine.StepType is EStepType.Start or EStepType.End)
@@ -825,7 +834,7 @@ namespace Hotline.FlowEngine.Workflows
             var stepBox = workflow.StepBoxes.FirstOrDefault(d => d.Code == stepBoxDefine.Code);
             if (stepBox == null)
             {
-                stepBox = CreateStepBox(workflow.Id, stepBoxDefine, dto, prevStepBox?.Id ?? string.Empty);
+                stepBox = CreateStepBox(workflow.Id, stepBoxDefine, prevStepBox.Id);
                 await _workflowStepRepository.AddAsync(stepBox, cancellationToken);
             }
             else if (stepBox.Status != EWorkflowStepStatus.Created)
@@ -848,7 +857,7 @@ namespace Hotline.FlowEngine.Workflows
             return stepBox;
         }
 
-        private async Task CreateStartSubStepAsync(
+        private async Task<WorkflowStep> CreateStartSubStepAsync(
             IdName handler,
             BasicWorkflowDto dto,
             WorkflowStep stepBox,
@@ -860,7 +869,7 @@ namespace Hotline.FlowEngine.Workflows
             subStep.Accept(_sessionContext.RequiredUserId, _sessionContext.UserName,
                 _sessionContext.RequiredOrgCode, _sessionContext.OrgName);
             //step办理状态
-            subStep.StepComplete(
+            subStep.Complete(
                 _sessionContext.RequiredUserId, _sessionContext.UserName,
                 _sessionContext.RequiredOrgCode, _sessionContext.OrgName,
                 dto.NextStepCode);
@@ -868,6 +877,25 @@ namespace Hotline.FlowEngine.Workflows
 
             stepBox.Steps.Add(subStep);
             await _workflowStepRepository.AddAsync(subStep, cancellationToken);
+            return subStep;
+        }
+
+        private async Task<WorkflowStep> CreateEndSubStepAsync(
+            IdName handler,
+            WorkflowStep currentStepBox,
+            WorkflowStep prevStep,
+            CancellationToken cancellationToken)
+        {
+            var subStep = CreateSubStep(currentStepBox, new List<IdName> { handler }, null, null, prevStep.Id,
+                null, EWorkflowStepStatus.Completed, EStepCountersignStatus.None);
+            subStep.Accept(_sessionContext.RequiredUserId, _sessionContext.UserName, _sessionContext.RequiredOrgCode,
+                _sessionContext.OrgName);
+            subStep.Complete(_sessionContext.RequiredUserId, _sessionContext.UserName,
+                _sessionContext.RequiredOrgCode, _sessionContext.OrgName, null);
+
+            currentStepBox.Steps.Add(subStep);
+            await _workflowStepRepository.AddAsync(subStep, cancellationToken);
+            return subStep;
         }
 
         private async Task CreateSubStepsAsync(
@@ -880,8 +908,8 @@ namespace Hotline.FlowEngine.Workflows
             CancellationToken cancellationToken = default)
         {
             var countersignStatus = stepBoxDefine.StepType is EStepType.CountersignEnd
-                ? prevStep.IsInCountersign 
-                    ? EStepCountersignStatus.InCountersign 
+                ? prevStep.IsInCountersign
+                    ? EStepCountersignStatus.InCountersign
                     : EStepCountersignStatus.None
                 : prevStep.GetNextStepCountersignStatus();
             List<WorkflowStep> subSteps;
@@ -901,20 +929,6 @@ namespace Hotline.FlowEngine.Workflows
             await _workflowStepRepository.AddRangeAsync(subSteps, cancellationToken);
         }
 
-        //private (WorkflowStep stepBox, WorkflowStep step) GetStep(List<WorkflowStep> stepBoxes, string stepId)
-        //{
-        //    foreach (var stepBox in stepBoxes)
-        //    {
-        //        foreach (var step in stepBox.Steps)
-        //        {
-        //            if (step.Id == stepId)
-        //                return (stepBox, step);
-        //        }
-        //    }
-
-        //    throw new UserFriendlyException("未找到对应节点");
-        //}
-
         /// <summary>
         /// 查询未完成节点
         /// </summary>
@@ -950,7 +964,7 @@ namespace Hotline.FlowEngine.Workflows
             return new();
         }
 
-        private WorkflowStep CreateStepBox(string workflowId, StepDefine stepDefine, BasicWorkflowDto dto, string prevStepBoxId)
+        private WorkflowStep CreateStepBox(string workflowId, StepDefine stepDefine, string prevStepBoxId)
         {
             var stepBox = _mapper.Map<WorkflowStep>(stepDefine);
             stepBox.WorkflowId = workflowId;
@@ -1017,7 +1031,7 @@ namespace Hotline.FlowEngine.Workflows
 
             step.ParentId = stepBox.Id;
             step.HandlerIds = handlerIds;
-            step.NextStepCode = nextStepCode;
+            step.NextStepCode = step.StepType is EStepType.End ? string.Empty : nextStepCode;
             step.IsMain = isMain;
             step.PreviousId = prevStepId;
             step.CountersignId = countersignId;

+ 3 - 2
src/Hotline/FlowEngine/Workflows/WorkflowStep.cs

@@ -114,7 +114,7 @@ public class WorkflowStep : StepBasicEntity
     /// <param name="userName"></param>
     /// <param name="orgCode"></param>
     /// <param name="orgName"></param>
-    public void StepComplete(string userId, string userName, string orgCode, string orgName, string nextStepCode)
+    public void Complete(string userId, string userName, string orgCode, string orgName, string nextStepCode)
     {
         UserId = userId;
         UserName = userName;
@@ -123,7 +123,8 @@ public class WorkflowStep : StepBasicEntity
         CompleteTime = DateTime.Now;
         Status = EWorkflowStepStatus.Completed;
 
-        NextSteps.First(d => d.Code == nextStepCode).Selected = true;
+        if (StepType is not EStepType.End)
+            NextSteps.First(d => d.Code == nextStepCode).Selected = true;
     }
 
     /// <summary>