ソースを参照

refactor: 流程退回增加返回参数

xf 2 ヶ月 前
コミット
7bcc7a4cb3

+ 52 - 46
src/Hotline.Api/Controllers/OrderController.cs

@@ -4480,6 +4480,7 @@ public class OrderController : BaseController
                         CenterToOrgHandlerName = currentStep.HandlerName
                     }).Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
                 }
+
                 break;
             case EOrderAssignMode.CrossLevel: // 跨级
                 if (!orderHandleFlowDto.CrossSteps.Any())
@@ -5250,17 +5251,17 @@ public class OrderController : BaseController
     {
         var oneSendBack = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.OneOrgSendBack)?.SettingValue[0]);
         var twoSendBack = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.TwoOrgSendBack)?.SettingValue[0]);
-        var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, withSteps: true, cancellationToken: HttpContext.RequestAborted);
+        //var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, withSteps: true, cancellationToken: HttpContext.RequestAborted);
         var order = await _orderRepository
             .Queryable()
             .Includes(d => d.Workflow)
-            .FirstAsync(d => d.Id == workflow.ExternalId);
+            .FirstAsync(d => d.Id == dto.OrderId);
         dto.ExpiredTime = order.ExpiredTime;
         var (currentStep, prevStep, isOrgToCenter, isSecondToFirstOrgLevel) = await _workflowApplication.GetPreviousInformationAsync(
             dto.WorkflowId, _sessionContext.RequiredUserId, _sessionContext.RequiredOrgId, _sessionContext.Roles, HttpContext.RequestAborted);
         var audit = new OrderSendBackAudit
         {
-            OrderId = workflow.ExternalId,
+            OrderId = dto.OrderId,
             State = ESendBackAuditState.Apply,
             Content = dto.Opinion,
             SendBackData = dto,
@@ -5301,7 +5302,7 @@ public class OrderController : BaseController
         if (oneSendBack || twoSendBack)
         {
             var sendBack = await _orderSendBackAuditRepository.Queryable()
-                .Where(x => x.OrderId == workflow.ExternalId && x.State == ESendBackAuditState.Apply).AnyAsync();
+                .Where(x => x.OrderId == dto.OrderId && x.State == ESendBackAuditState.Apply).AnyAsync();
             if (sendBack)
                 throw UserFriendlyException.SameMessage("当前工单已经生成退回记录");
 
@@ -5315,7 +5316,7 @@ public class OrderController : BaseController
                     throw UserFriendlyException.SameMessage("工单截至退回时间【" + order.SendBackAuditEndTime.Value.ToString("yyyy-MM-dd HH:mm:ss") +
                                                             "】,无法进行退回!");
                 var sendBackAgain = await _orderSendBackAuditRepository.Queryable()
-                    .Where(x => x.OrderId == workflow.ExternalId && x.IsReturnAgain == false).AnyAsync();
+                    .Where(x => x.OrderId == dto.OrderId && x.IsReturnAgain == false).AnyAsync();
                 if (sendBackAgain)
                     throw UserFriendlyException.SameMessage("工单已不允许退回!");
             }
@@ -5337,24 +5338,27 @@ public class OrderController : BaseController
                 //         .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
                 // }
 
-                var flowDirection = await _workflowApplication.PreviousAsync(dto,
-                    async (workflow1, prevStepDefine, prevStep1, newStep) =>
-                    {
-                        var stepAssignInfo =
-                            await _orderApplication.GetOrderPreviousAssignInfoAsync(workflow1, prevStepDefine, prevStep1, HttpContext.RequestAborted);
-                        if (stepAssignInfo is null) return;
-                        var validator = new StepAssignInfoValidator();
-                        await validator.ValidateAndThrowAsync(stepAssignInfo);
-                        if (prevStep1.BusinessType == EBusinessType.Send)
+                var (workflow, currentStep1, prevDefine, prevStep1, newStep, flowDirection) =
+                    await _workflowApplication.PreviousAsync(dto,
+                        async (workflow1, prevStepDefine, prevStep1, newStep) =>
                         {
-                            await _orderRepository.Updateable().SetColumns(o => new Order()
-                                    { CenterToOrgHandlerId = stepAssignInfo.UserId, CenterToOrgHandlerName = stepAssignInfo.Username })
-                                .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
-                        }
+                            var stepAssignInfo =
+                                await _orderApplication.GetOrderPreviousAssignInfoAsync(workflow1, prevStepDefine, prevStep1,
+                                    HttpContext.RequestAborted);
+                            if (stepAssignInfo is null) return;
+                            var validator = new StepAssignInfoValidator();
+                            await validator.ValidateAndThrowAsync(stepAssignInfo);
+                            newStep.Assign(stepAssignInfo);
+                        },
+                        HttpContext.RequestAborted);
+
+                if (prevStep.BusinessType == EBusinessType.Send)
+                {
+                    await _orderRepository.Updateable().SetColumns(o => new Order()
+                            { CenterToOrgHandlerId = newStep.HandlerId, CenterToOrgHandlerName = newStep.HandlerName })
+                        .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
+                }
 
-                        newStep.Assign(stepAssignInfo);
-                    },
-                    HttpContext.RequestAborted);
                 var processType = flowDirection == EFlowDirection.OrgToCenter || flowDirection == EFlowDirection.CenterToCenter
                     ? EProcessType.Zhiban
                     : EProcessType.Jiaoban;
@@ -5377,24 +5381,26 @@ public class OrderController : BaseController
             //         .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
             // }
 
-            var flowDirection = await _workflowApplication.PreviousAsync(dto,
-                async (workflow1, prevStepDefine, prevStep1, newStep) =>
-                {
-                    var stepAssignInfo =
-                        await _orderApplication.GetOrderPreviousAssignInfoAsync(workflow1, prevStepDefine, prevStep1, HttpContext.RequestAborted);
-                    if (stepAssignInfo is null) return;
-                    var validator = new StepAssignInfoValidator();
-                    await validator.ValidateAndThrowAsync(stepAssignInfo);
-                    if (prevStep1.BusinessType == EBusinessType.Send)
+            var (workflow, currentStep1, prevDefine, prevStep1, newStep, flowDirection) =
+                await _workflowApplication.PreviousAsync(dto,
+                    async (workflow1, prevStepDefine, prevStep1, newStep) =>
                     {
-                        await _orderRepository.Updateable().SetColumns(o => new Order()
-                                { CenterToOrgHandlerId = stepAssignInfo.UserId, CenterToOrgHandlerName = stepAssignInfo.Username })
-                            .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
-                    }
+                        var stepAssignInfo =
+                            await _orderApplication.GetOrderPreviousAssignInfoAsync(workflow1, prevStepDefine, prevStep1, HttpContext.RequestAborted);
+                        if (stepAssignInfo is null) return;
+                        var validator = new StepAssignInfoValidator();
+                        await validator.ValidateAndThrowAsync(stepAssignInfo);
+                        newStep.Assign(stepAssignInfo);
+                    },
+                    HttpContext.RequestAborted);
+
+            if (prevStep.BusinessType == EBusinessType.Send)
+            {
+                await _orderRepository.Updateable().SetColumns(o => new Order()
+                        { CenterToOrgHandlerId = newStep.HandlerId, CenterToOrgHandlerName = newStep.HandlerName })
+                    .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
+            }
 
-                    newStep.Assign(stepAssignInfo);
-                },
-                HttpContext.RequestAborted);
             var processType = flowDirection == EFlowDirection.OrgToCenter || flowDirection == EFlowDirection.CenterToCenter
                 ? EProcessType.Zhiban
                 : EProcessType.Jiaoban;
@@ -5463,12 +5469,12 @@ public class OrderController : BaseController
             //string applicantId, string applicantOrgId, string[] applicantRoleIds,
             //    ISessionContext current, CancellationToken cancellationToken);
             sendBack.SendBackData.ExpiredTime = order.ExpiredTime;
-            var flowDirection = await _workflowApplication.PreviousAsync(sendBack.SendBackData, sendBack.WorkflowUserId,
+            var result = await _workflowApplication.PreviousAsync(sendBack.SendBackData, sendBack.WorkflowUserId,
                 sendBack.WorkflowOrgId, sendBack.WorkflowRoleIds.ToArray(),
                 cancellationToken: HttpContext.RequestAborted);
             //var flowDirection = await _workflowApplication.PreviousAsync(sendBack.SendBackData, sendBack.WorkflowUserId, HttpContext.RequestAborted);
-            var processType = flowDirection == EFlowDirection.OrgToCenter ||
-                              flowDirection == EFlowDirection.CenterToCenter
+            var processType = result.flowDirection == EFlowDirection.OrgToCenter ||
+                              result.flowDirection == EFlowDirection.CenterToCenter
                 ? EProcessType.Zhiban
                 : EProcessType.Jiaoban;
             if (sendBack.ApplyOrgId != OrgSeedData.CenterId && sendBack.SendBackOrgId == OrgSeedData.CenterId)
@@ -5538,11 +5544,11 @@ public class OrderController : BaseController
                 }
 
                 sendBack.SendBackData.ExpiredTime = order.ExpiredTime;
-                var flowDirection = await _workflowApplication.PreviousAsync(sendBack.SendBackData,
+                var result = await _workflowApplication.PreviousAsync(sendBack.SendBackData,
                     sendBack.WorkflowUserId, sendBack.WorkflowOrgId, sendBack.WorkflowRoleIds.ToArray(),
                     cancellationToken: HttpContext.RequestAborted);
                 //var flowDirection = await _workflowApplication.PreviousAsync(sendBack.SendBackData, sendBack.WorkflowUserId, HttpContext.RequestAborted);
-                var processType = flowDirection == EFlowDirection.OrgToCenter || flowDirection == EFlowDirection.CenterToCenter
+                var processType = result.flowDirection == EFlowDirection.OrgToCenter || result.flowDirection == EFlowDirection.CenterToCenter
                     ? EProcessType.Zhiban
                     : EProcessType.Jiaoban;
                 if (sendBack.ApplyOrgId != OrgSeedData.CenterId && sendBack.SendBackOrgId == OrgSeedData.CenterId)
@@ -5998,7 +6004,7 @@ public class OrderController : BaseController
             order.NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne;
             order.ProcessType = processType;
             order.Status = EOrderStatus.Special;
-            
+
             var orderDto = _mapper.Map<OrderDto>(order);
             await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,
                 cancellationToken: HttpContext.RequestAborted);
@@ -6086,7 +6092,7 @@ public class OrderController : BaseController
                         cancellationToken: HttpContext.RequestAborted);
                 }
             }
-            
+
             await _orderRepository.Updateable(order)
                 .UpdateColumns(d => new
                 {
@@ -6472,7 +6478,7 @@ public class OrderController : BaseController
                 async (workflow, currentStep, targetStepDefine, targetStep, targetStepNew) =>
                 {
                     var stepAssignInfo = recall.NextHandlers.FirstOrDefault()
-                                         ?? await _orderApplication.GetOrderRecallAssignInfoAsync(workflow,  targetStepDefine, targetStep,
+                                         ?? await _orderApplication.GetOrderRecallAssignInfoAsync(workflow, targetStepDefine, targetStep,
                                              recall, HttpContext.RequestAborted);
                     if (stepAssignInfo is null) return;
                     var validator = new StepAssignInfoValidator();
@@ -6660,7 +6666,7 @@ public class OrderController : BaseController
                     async (workflow, currentStep, targetStepDefine, targetStep, targetStepNew) =>
                     {
                         var stepAssignInfo = recall.NextHandlers.FirstOrDefault()
-                                             ?? await _orderApplication.GetOrderRecallAssignInfoAsync(workflow,  targetStepDefine, targetStep,
+                                             ?? await _orderApplication.GetOrderRecallAssignInfoAsync(workflow, targetStepDefine, targetStep,
                                                  recall, HttpContext.RequestAborted);
                         if (stepAssignInfo is null) return;
                         var validator = new StepAssignInfoValidator();

+ 6 - 2
src/Hotline.Application/FlowEngine/IWorkflowApplication.cs

@@ -46,14 +46,18 @@ namespace Hotline.Application.FlowEngine
         /// <summary>
         /// 退回(返回前一节点)
         /// </summary>
-        Task<EFlowDirection> PreviousAsync(PreviousWorkflowDto dto,
+        Task<(Workflow workflow, WorkflowStep currentStep, StepDefine prevDefine,
+            WorkflowStep prevStep, WorkflowStep newStep, EFlowDirection flowDirection)> 
+            PreviousAsync(PreviousWorkflowDto dto,
             Action<Workflow, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null,
             CancellationToken cancellationToken = default);
 
         /// <summary>
         /// 工单退回(返回前一节点)
         /// </summary>
-        Task<EFlowDirection> PreviousAsync(PreviousWorkflowDto dto, string applicantId, string applicantOrgId, string[] applicantRoleIds,
+        Task<(Workflow workflow, WorkflowStep currentStep, StepDefine prevDefine,
+            WorkflowStep prevStep, WorkflowStep newStep, EFlowDirection flowDirection)> 
+            PreviousAsync(PreviousWorkflowDto dto, string applicantId, string applicantOrgId, string[] applicantRoleIds,
             Action<Workflow, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null,
             CancellationToken cancellationToken = default);
 

+ 6 - 2
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -344,7 +344,9 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     /// <summary>
     /// 退回(返回前一节点)
     /// </summary>
-    public async Task<EFlowDirection> PreviousAsync(PreviousWorkflowDto dto,
+    public async Task<(Workflow workflow, WorkflowStep currentStep, StepDefine prevDefine,
+        WorkflowStep prevStep, WorkflowStep newStep, EFlowDirection flowDirection)> 
+        PreviousAsync(PreviousWorkflowDto dto,
         Action<Workflow, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null,
         CancellationToken cancellationToken = default)
     {
@@ -362,7 +364,9 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     /// <summary>
     /// 工单退回(返回前一节点)
     /// </summary>
-    public async Task<EFlowDirection> PreviousAsync(PreviousWorkflowDto dto, string applicantId, string applicantOrgId, string[] applicantRoleIds,
+    public async Task<(Workflow workflow, WorkflowStep currentStep, StepDefine prevDefine,
+        WorkflowStep prevStep, WorkflowStep newStep, EFlowDirection flowDirection)> 
+        PreviousAsync(PreviousWorkflowDto dto, string applicantId, string applicantOrgId, string[] applicantRoleIds,
         Action<Workflow, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null,
         CancellationToken cancellationToken = default)
     {

+ 3 - 1
src/Hotline/FlowEngine/Workflows/IWorkflowDomainService.cs

@@ -89,7 +89,9 @@ namespace Hotline.FlowEngine.Workflows
         /// <summary>
         /// 退回(new)
         /// </summary>
-        Task<EFlowDirection> PreviousAsync(Workflow workflow, PreviousWorkflowDto dto, OperatorInfo operatorInfo,
+        Task<(Workflow workflow, WorkflowStep currentStep, StepDefine prevDefine, 
+            WorkflowStep prevStep, WorkflowStep newStep, EFlowDirection flowDirection)> 
+            PreviousAsync(Workflow workflow, PreviousWorkflowDto dto, OperatorInfo operatorInfo,
             Action<Workflow, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null,
             CancellationToken cancellationToken = default);
 

+ 16 - 10
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -892,9 +892,11 @@ namespace Hotline.FlowEngine.Workflows
         /// <summary>
         /// 退回(new)
         /// </summary>
-        public async Task<EFlowDirection> PreviousAsync(Workflow workflow, PreviousWorkflowDto dto, OperatorInfo operatorInfo,
-            Action<Workflow, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null,
-            CancellationToken cancellationToken = default)
+        public async Task<(Workflow workflow, WorkflowStep currentStep, StepDefine prevDefine,
+                WorkflowStep prevStep, WorkflowStep newStep, EFlowDirection flowDirection)>
+            PreviousAsync(Workflow workflow, PreviousWorkflowDto dto, OperatorInfo operatorInfo,
+                Action<Workflow, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null,
+                CancellationToken cancellationToken = default)
         {
             //ValidatePermission(workflow, operater.OrgId, operater.Id);
             if (string.IsNullOrEmpty(operatorInfo.UserId)
@@ -1027,7 +1029,9 @@ namespace Hotline.FlowEngine.Workflows
             await _publisher.PublishAsync(new PreviousNotify(workflow, newPrevStep, dto, isOrgToCenter),
                 PublishStrategy.ParallelWhenAll, cancellationToken);
 
-            return GetFlowDirection(currentStep.BusinessType, prevStep.BusinessType);
+            var flowDirection = GetFlowDirection(currentStep.BusinessType, prevStep.BusinessType);
+
+            return (workflow, currentStep, prevStepDefine, prevStep, newPrevStep, flowDirection);
         }
 
         private async Task UpdateTracesStateAsync(List<WorkflowTrace> traces, EWorkflowTraceState traceState,
@@ -1584,12 +1588,14 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         /// <returns>workflow, targetStepDefine, currentStep, targetStep, newStep, isOrgToCenter</returns>
         /// <exception cref="UserFriendlyException"></exception>
-        private async Task<(Workflow, StepDefine, WorkflowStep, WorkflowStep, WorkflowStep, bool)> RecallAsync(
-            Workflow workflow, BasicWorkflowDto dto, StepAssignInfo stepAssignInfo,
-            StepDefine targetStepDefine, WorkflowStep targetStep, EWorkflowTraceType traceType,
-            DateTime? expiredTime, bool isOrderFiled, EHandleMode handleMode,
-            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null,
-            CancellationToken cancellationToken = default)
+        private async Task<(Workflow workflow, StepDefine targetStepDefine,
+                WorkflowStep currentStep, WorkflowStep targetStep, WorkflowStep newStep, bool isOrgToCenter)>
+            RecallAsync(
+                Workflow workflow, BasicWorkflowDto dto, StepAssignInfo stepAssignInfo,
+                StepDefine targetStepDefine, WorkflowStep targetStep, EWorkflowTraceType traceType,
+                DateTime? expiredTime, bool isOrderFiled, EHandleMode handleMode,
+                Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null,
+                CancellationToken cancellationToken = default)
         {
             var targetIsStartStep = targetStepDefine.StepType is EStepType.Start;
             var updateTraces = new List<WorkflowTrace>();