xf 1 سال پیش
والد
کامیت
7e27f7f844

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

@@ -476,7 +476,7 @@ public class WorkflowController : BaseController
          */
         var workflow = await _workflowDomainService.GetWorkflowAsync(workflowId, withSteps: true,
             cancellationToken: HttpContext.RequestAborted);
-        if (workflow.IsInCountersign() && workflow.CounterSignType is ECounterSignType.Center)
+        if (workflow.IsInCountersign && workflow.CounterSignType is ECounterSignType.Center)
         {
             var handlers = workflow.Steps
                 .Where(d => d.BusinessType == EBusinessType.Send && !d.IsOrigin)

+ 1 - 1
src/Hotline.Application/Mappers/OrderMapperConfigs.cs

@@ -57,7 +57,7 @@ public class OrderMapperConfigs : IRegister
             .Ignore(d => d.Title)
             .AfterMapping((s, d) =>
             {
-                d.UpdateHandlingStatus(s.IsInCountersign());
+                d.UpdateHandlingStatus(s.IsInCountersign);
             })
             ;
 

+ 15 - 9
src/Hotline/FlowEngine/Workflows/Workflow.cs

@@ -184,10 +184,15 @@ public partial class Workflow : CreationEntity
     public ECounterSignType? CounterSignType { get; set; }
 
     /// <summary>
-    /// 会签办理节点Id,嵌套会签为最外层会签办理节点Id(不处于会签状态则无值)
+    /// 当前会签办理节点Id,嵌套会签为最外层会签办理节点Id
     /// </summary>
     public string? TopCountersignStepId { get; set; }
 
+    /// <summary>
+    /// 流程是否处于会签中
+    /// </summary>
+    public bool IsInCountersign { get; set; }
+
     #endregion
 
     /// <summary>
@@ -433,7 +438,7 @@ public partial class Workflow
         WorkflowStep? nextStep = null)
     {
         //非会签:指当前被指派节点,会签:会签发起节点
-        if (IsInCountersign()) return;
+        if (IsInCountersign) return;
 
         if (isStartCountersign && currentStep is null)
             throw new UserFriendlyException("开启会签时,会签发起节点不能为空");
@@ -460,25 +465,26 @@ public partial class Workflow
         return Countersigns.All(d => d.IsCompleted());
     }
 
-    /// <summary>
-    /// 流程是否处于会签中
-    /// </summary>
-    /// <returns></returns>
-    public bool IsInCountersign() => !string.IsNullOrEmpty(TopCountersignStepId);
+    ///// <summary>
+    ///// 流程是否处于会签中
+    ///// </summary>
+    ///// <returns></returns>
+    //public bool IsInCountersign() => !string.IsNullOrEmpty(TopCountersignStepId);
 
     /// <summary>
     /// 开始会签
     /// </summary>
     public void StartCountersign(string startCsStepId, ECounterSignType counterSignType)
     {
+        IsInCountersign = true;
         TopCountersignStepId = startCsStepId;
         CounterSignType = counterSignType;
     }
 
     /// <summary>
-    /// 结束流程会签状态
+    /// 结束流程会签状态(保留topStepId创建节点时判断用,直到下次会签开启时更新)
     /// </summary>
-    public void EndCountersign() => TopCountersignStepId = null;
+    public void EndCountersign() => IsInCountersign = false;
 
     /// <summary>
     /// 重置最终办理意见

+ 53 - 17
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -147,7 +147,7 @@ namespace Hotline.FlowEngine.Workflows
             workflow.UpdateWorkflowCurrentStepInfo(dto.IsStartCountersign, startStep, firstSteps.First());
 
             //发起会签时记录顶层会签节点(必须在update currentStep之后)
-            if (dto.IsStartCountersign && !workflow.IsInCountersign())
+            if (dto.IsStartCountersign && !workflow.IsInCountersign)
                 workflow.StartCountersign(startStep.Id, counterSignType);
 
             //更新实际办理节点信息
@@ -337,28 +337,50 @@ namespace Hotline.FlowEngine.Workflows
             }
 
             //操作为回到会签汇总时,更新开始会签节点的会签办理状态
-            if (currentStep.IsInCountersign() && dto.BackToCountersignEnd)
+            //if (currentStep.IsInCountersign() && dto.BackToCountersignEnd)
+            //{
+            //    var targetStep = currentStep;
+            //    if (currentStep.IsCountersignEndStep)
+            //    {
+            //        var csStartStep = workflow.Steps.FirstOrDefault(d => d.Id == currentStep.CountersignStartStepId);
+            //        if (csStartStep is null)
+            //            throw new UserFriendlyException("未查询到会签开始节点");
+            //        targetStep = csStartStep;
+            //    }
+
+            //    PrevStepCsHandled(workflow, targetStep, ref updateSteps);
+            //}
+
+            if (currentStep.IsInCountersign())
             {
-                var targetStep = currentStep;
                 if (currentStep.IsCountersignEndStep)
                 {
                     var csStartStep = workflow.Steps.FirstOrDefault(d => d.Id == currentStep.CountersignStartStepId);
                     if (csStartStep is null)
                         throw new UserFriendlyException("未查询到会签开始节点");
-                    targetStep = csStartStep;
-                }
-
-                var countersignStartStep = workflow.Steps.FirstOrDefault(d => d.Id == targetStep.PrevStepId);
-                if (countersignStartStep is null)
-                    throw new UserFriendlyException("未查询到目标节点的前一节点");
 
-                var csStep = countersignStartStep.CountersignSteps.FirstOrDefault(d => d.StepId == targetStep.Id);
-                if (csStep is null)
-                    throw new UserFriendlyException("未查询到当前待办节点");
-                csStep.Completed = true;
-                updateSteps.Add(countersignStartStep);
+                    if (currentStep.IsTopCountersignEndStep(workflow.TopCountersignStepId))
+                    {
+                        var csStep = csStartStep.CountersignSteps.FirstOrDefault(d => d.StepId == currentStep.Id);
+                        if (csStep is null)
+                            throw new UserFriendlyException("未查询到当前待办节点");
+                        csStep.Completed = true;
+                        updateSteps.Add(csStartStep);
+                    }
+                    else
+                    {
+                        //汇总节点(非顶级)
+                        PrevStepCsHandled(workflow, csStartStep, ref updateSteps);
+                    }
+                }
+                else if (dto.BackToCountersignEnd)
+                {
+                    //普通节点里面流向汇总节点的
+                    PrevStepCsHandled(workflow, currentStep, ref updateSteps);
+                }
             }
 
+
             await _workflowStepRepository.UpdateRangeAsync(updateSteps, cancellationToken);
 
             await NextTraceAsync(workflow, dto, currentStep, cancellationToken);
@@ -369,7 +391,7 @@ namespace Hotline.FlowEngine.Workflows
 
             //检查会签是否结束,并更新当前会签节点字段
             var isCountersignOver = false;
-            if (workflow.IsInCountersign() && currentStep.IsCountersignEndStep)
+            if (workflow.IsInCountersign && currentStep.IsCountersignEndStep)
             {
                 isCountersignOver = workflow.CheckIfCountersignOver();
                 if (isCountersignOver)
@@ -415,7 +437,7 @@ namespace Hotline.FlowEngine.Workflows
             workflow.UpdateWorkflowCurrentStepInfo(dto.IsStartCountersign, currentStep, nextSteps?.FirstOrDefault());
 
             //发起会签时记录顶层会签节点
-            if (dto.IsStartCountersign && !workflow.IsInCountersign())
+            if (dto.IsStartCountersign && !workflow.IsInCountersign)
                 workflow.StartCountersign(currentStep.Id, counterSignType);
 
             //更新指派信息
@@ -437,6 +459,20 @@ namespace Hotline.FlowEngine.Workflows
 
         }
 
+        //更新目标节点前一节点的会签办理完成状态
+        private void PrevStepCsHandled(Workflow workflow, WorkflowStep targetStep, ref List<WorkflowStep> updateSteps)
+        {
+            var prevStep = workflow.Steps.FirstOrDefault(d => d.Id == targetStep.PrevStepId);
+            if (prevStep is null)
+                throw new UserFriendlyException("未查询到目标节点的前一节点");
+
+            var csStep = prevStep.CountersignSteps.FirstOrDefault(d => d.StepId == targetStep.Id);
+            if (csStep is null)
+                throw new UserFriendlyException("未查询到当前待办节点");
+            csStep.Completed = true;
+            updateSteps.Add(prevStep);
+        }
+
         /// <summary>
         /// 创建下1/N个节点
         /// </summary>
@@ -586,7 +622,7 @@ namespace Hotline.FlowEngine.Workflows
         {
             ValidatePermission(workflow);
             CheckWhetherRunnable(workflow.Status);
-            if (workflow.IsInCountersign())
+            if (workflow.IsInCountersign)
                 throw UserFriendlyException.SameMessage("会签流程不支持退回");
 
             var currentStep = GetUnHandleStep(workflow.Steps, _sessionContext.RequiredOrgId, _sessionContext.RequiredUserId);

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

@@ -244,7 +244,7 @@ public class WorkflowStep : StepBasicEntity
     public bool IsTopCountersignEndStep(string? topCountersignStepId)
     {
         if (string.IsNullOrEmpty(topCountersignStepId))
-            throw new UserFriendlyException($"无效顶级会签节点编号,流程可能未处于会签中, wfId: {WorkflowId}");
+            throw new UserFriendlyException($"无效顶级会签节点编号,wfId: {WorkflowId}");
         return IsCountersignEndStep && CountersignStartStepId == topCountersignStepId;
     }