xf 1 year ago
parent
commit
9b9bdb2dbf

+ 7 - 12
src/Hotline/FlowEngine/Workflows/StepBasicEntity.cs

@@ -32,10 +32,10 @@ public abstract class StepBasicEntity : CreationEntity
     [SugarColumn(ColumnDataType = "json", IsJson = true)]
     public List<Kv> Handlers { get; set; } = new();
 
-    // /// <summary>
-    // /// 办理时间限制(如:24小时、7个工作日)
-    // /// </summary>
-    // public string? TimeLimit { get; set; }
+    /// <summary>
+    /// 办理时间限制(如:24小时、7个工作日)
+    /// </summary>
+    public string? TimeLimit { get; set; }
 
     // /// <summary>
     // /// 节点属性配置
@@ -55,17 +55,12 @@ public abstract class StepBasicEntity : CreationEntity
     // [SugarColumn(DefaultValue = "0")]
     // public EPathPolicy PathPolicy { get; set; }
 
-    /// <summary>
-    /// 节点期满时间
-    /// </summary>
-    public DateTime StepExpiredTime { get; set; }
-
     /// <summary>
     /// 上一节点办理时,nextStepCode下拉框中选中的值
     /// config模式:当前节点的difinition.code, dynamic模式:x级部门办理的x:int
     /// </summary>
     public string? PrevChosenStepCode { get; set; }
-    
+
     #region 接办
 
     /// <summary>
@@ -179,9 +174,9 @@ public abstract class StepBasicEntity : CreationEntity
     public List<string> Additions { get; set; } = new();
 
     /// <summary>
-    /// 当前节点到期时间(期满时间)
+    /// 节点期满时间
     /// </summary>
-    public DateTime ExpiredTime { get; set; }
+    public DateTime StepExpiredTime { get; set; }
 
     #endregion
 }

+ 158 - 34
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -519,19 +519,6 @@ namespace Hotline.FlowEngine.Workflows
 
             var updateSteps = new List<WorkflowStep> { currentStep };
 
-            //操作为回到会签汇总时,更新开始会签节点的会签办理状态
-            if (dto.BackToCountersignEnd)
-            {
-                var countersignStartStep = workflow.Steps.FirstOrDefault(d => d.Id == currentStep.PreviousId);
-                if (countersignStartStep is null)
-                    throw new UserFriendlyException("未查询到会签开始节点");
-                if (!countersignStartStep.HasStartedCountersign())
-                    throw new UserFriendlyException("查询到会签开始节点状态异常");
-
-                countersignStartStep.CountersignSteps.First(d => d.StepId == currentStep.Id).Completed = true;
-                updateSteps.Add(countersignStartStep);
-            }
-
             //结束当前会签流程
             if (currentStep.IsCountersignEndStep)
             {
@@ -574,6 +561,19 @@ namespace Hotline.FlowEngine.Workflows
                 }
             }
 
+            //操作为回到会签汇总时,更新开始会签节点的会签办理状态
+            if (currentStep.IsInCountersign() && dto.BackToCountersignEnd)
+            {
+                var countersignStartStep = workflow.Steps.FirstOrDefault(d => d.Id == currentStep.PreviousId);
+                if (countersignStartStep is null)
+                    throw new UserFriendlyException("未查询到会签开始节点");
+                if (!countersignStartStep.HasStartedCountersign())
+                    throw new UserFriendlyException("查询到会签开始节点状态异常");
+
+                countersignStartStep.CountersignSteps.First(d => d.StepId == currentStep.Id).Completed = true;
+                updateSteps.Add(countersignStartStep);
+            }
+
             await _workflowStepRepository.UpdateRangeAsync(updateSteps, cancellationToken);
 
             await NextTraceAsync(workflow, dto, currentStep, cancellationToken);
@@ -605,38 +605,59 @@ namespace Hotline.FlowEngine.Workflows
                 workflow.CenterToOrg(CalculateExpiredTime(workflow.WorkflowDefinition.Code));//todo 过期时间
 
             //创建下一/N个节点(会签汇总节点:会签未全部办理时不创建,最后一个会签办理节点创建会签汇总节点)
-            if (dto.BackToCountersignEnd)
+            List<WorkflowStep> nextSteps;
+            if (currentStep.IsInCountersign())
             {
-                var countersignStartStep = workflow.Steps.FirstOrDefault(d => d.Id == currentStep.PreviousId);
-                if (countersignStartStep is null)
-                    throw new UserFriendlyException("未查询到会签开始节点");
-                if (!countersignStartStep.HasStartedCountersign())
-                    throw new UserFriendlyException("查询到会签开始节点状态异常");
-                if (countersignStartStep.StartedCountersignHasAllHandled())
+                if (dto.BackToCountersignEnd)
                 {
-                    //todo 创建会签汇总节点
+                    var countersignStartStep = workflow.Steps.FirstOrDefault(d => d.Id == currentStep.PreviousId);
+                    if (countersignStartStep is null)
+                        throw new UserFriendlyException("未查询到会签开始节点");
+                    if (!countersignStartStep.HasStartedCountersign())
+                        throw new UserFriendlyException("查询到会签开始节点状态异常");
+                    if (countersignStartStep.StartedCountersignHasAllHandled())
+                    {
+                        //todo 创建会签汇总节点
 
 
-                    await _mediator.Publish(new CountersignEndAssigned(workflow), cancellationToken);
+                        await _mediator.Publish(new CountersignEndAssigned(workflow), cancellationToken);
+                    }
+                }
+                else
+                {
+                    //todo 依据会签策略创建会签下一级节点
+                    //考虑没有下级部门情况
                 }
             }
             else if (currentStep.InstanceMode is EInstanceMode.Dynamic && !currentStep.DynamicShouldTerminal())
             {
-                // 创建动态节点
+                //todo 创建动态下一级节点
 
 
             }
             else
             {
-                //todo 创建普通节点
+
+                //todo 创建普通节点(根据配置)
+                if (dto.IsStartCountersign)
+                {
+                    foreach (var nextHandler in dto.NextHandlers)
+                    {
+
+                    }
+                }
+                else
+                {
+                    CreateStepByDefine(nextStepDefine, currentStep, workflow.Id, )
+                }
             }
 
             //更新办理人
             workflow.UpdateHandlers(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgId,
                 flowAssignInfo.FlowAssignType, flowAssignInfo.HandlerObjects);
 
-            //var nextStepBox = await CreateStepAsync(workflow, nextStepDefine, dto, EWorkflowStepStatus.Created,
-            //    currentStepBox, currentStep, EWorkflowTraceStatus.Normal, expiredTime, cancellationToken);
+            var nextStepBox = await CreateStepAsync(workflow, nextStepDefine, dto, EWorkflowStepStatus.Created,
+                currentStepBox, currentStep, EWorkflowTraceStatus.Normal, expiredTime, cancellationToken);
 
             ////下一节点为汇总节点时,检查下一节点是否可办理
             //var nextStepCanHandle = true;
@@ -1143,7 +1164,9 @@ namespace Hotline.FlowEngine.Workflows
             currentStep.StartCountersign(countersign.Id);
         }
 
-        private async Task StartCountersignAsync(Workflow workflow, WorkflowStep startStep, BasicWorkflowDto dto, ECounterSignType counterSignType, CancellationToken cancellationToken)
+        //new
+        private async Task StartCountersignAsync(Workflow workflow, WorkflowStep startStep, BasicWorkflowDto dto,
+            ECounterSignType counterSignType, CancellationToken cancellationToken)
         {
             var countersign = await CreateCountersignAsync(
                 workflow.Id, startStep, dto.NextHandlers.Count,
@@ -1600,6 +1623,22 @@ namespace Hotline.FlowEngine.Workflows
             return stepBox;
         }
 
+        //new
+        public async Task CreateStepsByDefineAsync(StepDefine stepDefine, WorkflowStep prevStep, BasicWorkflowDto dto)
+        {
+            if (dto.IsStartCountersign)
+            {
+                foreach (var nextHandler in dto.NextHandlers)
+                {
+
+                }
+            }
+            else
+            {
+                CreateStepByDefine(nextStepDefine, currentStep, workflow.Id, )
+            }
+        }
+
         private async Task<WorkflowStep> CreateStartSubStepAsync(
             Kv handler,
             string nextStepCode,
@@ -1658,7 +1697,7 @@ namespace Hotline.FlowEngine.Workflows
             CancellationToken cancellationToken = default)
         {
             var countersignStatus = stepBoxDefine.StepType is EStepType.Summary
-                ? prevStep.IsInCountersign
+                ? prevStep.IsInCountersign()
                     ? ECountersignPosition.InCountersign
                     : ECountersignPosition.None
                 : prevStep.GetNextStepCountersignStatus();
@@ -1689,6 +1728,41 @@ namespace Hotline.FlowEngine.Workflows
             }
         }
 
+        //new
+        private async Task CreateStepsAsync(
+            Workflow workflow,
+            StepDefine stepDefine,
+            BasicWorkflowDto dto,
+            WorkflowStep prevStep,
+            EWorkflowStepStatus stepStatus,
+            EWorkflowTraceStatus traceStatus,
+            DateTime expiredTime,
+            CancellationToken cancellationToken = default)
+        {
+            List<WorkflowStep> steps;
+            if (stepDefine.HandlerType is EHandlerType.AssignedUser or EHandlerType.AssignedOrg)
+            {
+                steps = CreateSubSteps(dto.IsStartCountersign, stepBox, stepBox.HandlerClassifies, dto.NextStepCode, dto.NextMainHandler,
+                    prevStep?.Id, countersignId, stepStatus, countersignStatus, expiredTime, stepExtension);
+            }
+            else
+            {
+                if (stepDefine.HandlerType != EHandlerType.Role && !dto.NextHandlers.Any())
+                    throw new UserFriendlyException("未指定节点处理者");
+                steps = CreateSubSteps(dto.IsStartCountersign, stepBox, dto.NextHandlers, dto.NextStepCode, dto.NextMainHandler,
+                    prevStep?.Id, countersignId, stepStatus, countersignStatus, expiredTime, stepExtension);
+            }
+
+            await _workflowStepRepository.AddRangeAsync(steps, cancellationToken);
+
+            //create traces
+            foreach (var step in steps)
+            {
+                await CreateTraceAsync(workflow, step, traceStatus, cancellationToken);
+            }
+        }
+
+
         /// <summary>
         /// 查询未完成节点
         /// </summary>
@@ -1770,7 +1844,7 @@ namespace Hotline.FlowEngine.Workflows
             if (countersignPosition is not ECountersignPosition.None && string.IsNullOrEmpty(countersignId))
                 throw UserFriendlyException.SameMessage("非法参数");
 
-            //依据是否发起会签创建step,发起会签表示一个handler创建一个step,未发起会签表示多人处理同一个节点,只创建一个step
+            //依据是否发起会签创建step,发起会签表示一个handler创建一个step,未发起会签默认作为或签处理,只创建一个step
             var steps = new List<WorkflowStep>();
             if (isPrevStartCountersign)
             {
@@ -1793,8 +1867,9 @@ namespace Hotline.FlowEngine.Workflows
             return steps;
         }
 
-        private WorkflowStep CreateSubStep(
-            WorkflowStep stepBox,
+        //new
+        private List<WorkflowStep> CreateSteps(
+            bool isPrevStartCountersign,
             List<Kv> handlers,
             string nextStepCode,
             string? nextMainHandler,
@@ -1804,6 +1879,20 @@ namespace Hotline.FlowEngine.Workflows
             ECountersignPosition countersignPosition,
             DateTime expiredTime,
             StepExtension extension)
+        {
+        }
+
+        private WorkflowStep CreateSubStep(
+            WorkflowStep stepBox,
+            List<Kv> handlers,
+            string nextStepCode,
+            string? nextMainHandler,
+            string? prevStepId,
+            string? prevStepCode,
+            string? countersignId,
+            EWorkflowStepStatus stepStatus,
+            ECountersignPosition countersignPosition,
+            DateTime expiredTime)
         {
             if (!handlers.Any())
                 throw new UserFriendlyException("非法参数");
@@ -1815,13 +1904,48 @@ namespace Hotline.FlowEngine.Workflows
             step.Handlers = handlers;
             step.NextStepCode = step.StepType is EStepType.End ? string.Empty : nextStepCode;
             step.IsMain = isMain;
-            step.PreviousStepId = prevStepId;
+            step.PreviousId = prevStepId;
+            step.PreviousCode = prevStepCode;
+            step.CountersignId = countersignId;
+            step.Status = stepStatus;
+            step.CountersignPosition = countersignPosition;
+            step.StepExpiredTime = expiredTime;
+            step.TimeLimit = GetTimeLimit("");//todo 过期时间
+
+            return step;
+        }
+
+        private WorkflowStep CreateStepByDefine(
+            StepDefine stepDefine,
+            WorkflowStep prevStep,
+            string workflowId,
+            List<Kv> handlers,
+            string nextStepCode,
+            string? nextMainHandler,
+            string? countersignId,
+            EWorkflowStepStatus stepStatus,
+            ECountersignPosition countersignPosition,
+            DateTime expiredTime
+            )
+        {
+            if (!handlers.Any())
+                throw new UserFriendlyException("非法参数");
+            var step = _mapper.Map<WorkflowStep>(stepDefine);
+            var handlerIds = handlers.Select(d => d.Key).ToList();
+            var isMain = handlers.Count == 1 || (handlers.Count > 1 || handlerIds.First() == nextMainHandler);
+
+            step.WorkflowId = workflowId;
+            step.Handlers = handlers;
+            step.NextStepCode = step.StepType is EStepType.End ? string.Empty : nextStepCode;
+            step.IsMain = isMain;
+            step.PreviousId = prevStep.Id;
+            step.PreviousCode = prevStep.Code;
+            step.PreviousCode = prevStep.NextStepCode;
             step.CountersignId = countersignId;
             step.Status = stepStatus;
             step.CountersignPosition = countersignPosition;
-            step.ExpiredTime = expiredTime;
+            step.StepExpiredTime = expiredTime;
             step.TimeLimit = GetTimeLimit("");//todo 过期时间
-            step.Extension = extension;
 
             return step;
         }

+ 6 - 9
src/Hotline/FlowEngine/Workflows/WorkflowStep.cs

@@ -246,15 +246,12 @@ public class WorkflowStep : StepBasicEntity
     /// 依据当前节点获取下一节点会签状态
     /// </summary>
     /// <returns></returns>
-    public ECountersignPosition GetNextStepCountersignStatus()
-    {
-        if (HasStartedCountersign())
-        {
-            return ECountersignPosition.InCountersign;
-        }
-
-        return IsInCountersign() ? ECountersignPosition.OuterCountersign : ECountersignPosition.None;
-    }
+    public ECountersignPosition GetNextStepCountersignStatus() =>
+        HasStartedCountersign() 
+            ? ECountersignPosition.InCountersign 
+            : IsInCountersign() 
+                ? ECountersignPosition.OuterCountersign 
+                : ECountersignPosition.None;
 
     public bool IsCenter() => BusinessType is EBusinessType.Center or EBusinessType.Send;