xfe 2 months ago
parent
commit
9ebea5b2df
40 changed files with 549 additions and 394 deletions
  1. 1 0
      src/Hotline.Api/Controllers/KnowledgeController.cs
  2. 1 0
      src/Hotline.Api/Controllers/OrderRevocationController.cs
  3. 1 0
      src/Hotline.Api/Controllers/OrderTerminateController.cs
  4. 1 0
      src/Hotline.Api/Controllers/PbxController.cs
  5. 1 0
      src/Hotline.Application.Contracts/Validators/FlowEngine/BasicWorkflowDtoValidator.cs
  6. 1 0
      src/Hotline.Application.Contracts/Validators/FlowEngine/NextWorkflowDtoValidator.cs
  7. 1 0
      src/Hotline.Application.Contracts/Validators/FlowEngine/RecallDtoValidator.cs
  8. 1 0
      src/Hotline.Application.Contracts/Validators/FlowEngine/StartWorkflowDtoValidator.cs
  9. 1 0
      src/Hotline.Application/Orders/IOrderApplication.cs
  10. 1 0
      src/Hotline.Application/Orders/OrderApplication.cs
  11. 1 0
      src/Hotline.Application/Orders/OrderSecondaryHandlingApplication.cs
  12. 1 0
      src/Hotline.Application/Snapshot/IOrderSnapshotApplication.cs
  13. 1 0
      src/Hotline.Application/Snapshot/SnapshotOrderApplication.cs
  14. 1 0
      src/Hotline.Share/Dtos/CallCenter/TelRestDto.cs
  15. 3 1
      src/Hotline.Share/Dtos/FlowEngine/CancelDto.cs
  16. 0 150
      src/Hotline.Share/Dtos/FlowEngine/PreviousWorkflowDto.cs
  17. 3 1
      src/Hotline.Share/Dtos/FlowEngine/RejectDto.cs
  18. 3 1
      src/Hotline.Share/Dtos/FlowEngine/SupplementDto.cs
  19. 6 8
      src/Hotline.Share/Dtos/FlowEngine/Workflow/BasicWorkflowDto.cs
  20. 1 1
      src/Hotline.Share/Dtos/FlowEngine/Workflow/EndWorkflowDto.cs
  21. 41 0
      src/Hotline.Share/Dtos/FlowEngine/Workflow/ForwardFlowStepAssignInfo.cs
  22. 1 4
      src/Hotline.Share/Dtos/FlowEngine/Workflow/NextWorkflowDto.cs
  23. 76 0
      src/Hotline.Share/Dtos/FlowEngine/Workflow/PreviousWorkflowDto.cs
  24. 1 1
      src/Hotline.Share/Dtos/FlowEngine/Workflow/RecallDto.cs
  25. 67 0
      src/Hotline.Share/Dtos/FlowEngine/Workflow/ReverseFlowStepAssignInfo.cs
  26. 1 1
      src/Hotline.Share/Dtos/FlowEngine/Workflow/StartWorkflowDto.cs
  27. 8 0
      src/Hotline.Share/Dtos/FlowEngine/Workflow/StepAssignInfo.cs
  28. 1 0
      src/Hotline.Share/Dtos/Knowledge/KnowledgeDto.cs
  29. 1 0
      src/Hotline.Share/Dtos/Order/AddRedoDto.cs
  30. 1 0
      src/Hotline.Share/Dtos/Order/OrderPreviousDto.cs
  31. 1 0
      src/Hotline.Share/Dtos/Order/OrderStartFlowDto.cs
  32. 1 0
      src/Hotline.Share/Dtos/Order/SendBackDto.cs
  33. 1 0
      src/Hotline/FlowEngine/Notifications/WorkflowNotify.cs
  34. 20 15
      src/Hotline/FlowEngine/Workflows/IWorkflowDomainService.cs
  35. 293 211
      src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs
  36. 1 0
      src/Hotline/Orders/IOrderDomainService.cs
  37. 1 0
      src/Hotline/Orders/OrderDomainService.cs
  38. 1 0
      src/Hotline/Orders/OrderSendBackAudit.cs
  39. 1 0
      test/Hotline.Tests/Mock/OrderServiceMock.cs
  40. 1 0
      test/Hotline.Tests/Mock/OrderServiceStartWorkflow.cs

+ 1 - 0
src/Hotline.Api/Controllers/KnowledgeController.cs

@@ -41,6 +41,7 @@ using XF.Utility.EnumExtensions;
 using Hotline.Caching.Interfaces;
 using MiniExcelLibs;
 using Hotline.Pdf;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 
 namespace Hotline.Api.Controllers
 {

+ 1 - 0
src/Hotline.Api/Controllers/OrderRevocationController.cs

@@ -7,6 +7,7 @@ using Hotline.Push.Notifies;
 using Hotline.SeedData;
 using Hotline.Settings;
 using Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.Order;

+ 1 - 0
src/Hotline.Api/Controllers/OrderTerminateController.cs

@@ -25,6 +25,7 @@ using Hotline.Application.FlowEngine;
 using Hotline.FlowEngine.Workflows;
 using Hotline.Repository.SqlSugar.Extensions;
 using Hotline.Application.Orders;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Requests;
 using Hotline.Tools;
 

+ 1 - 0
src/Hotline.Api/Controllers/PbxController.cs

@@ -32,6 +32,7 @@ using Microsoft.Extensions.Options;
 using XF.Domain.Repository;
 using Tr.Sdk;
 using Hotline.Configurations;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 
 namespace Hotline.Api.Controllers
 {

+ 1 - 0
src/Hotline.Application.Contracts/Validators/FlowEngine/BasicWorkflowDtoValidator.cs

@@ -6,6 +6,7 @@ using System.Threading.Tasks;
 using FluentValidation;
 using Hotline.Application.Contracts.Validators.Orgs;
 using Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 
 namespace Hotline.Application.Contracts.Validators.FlowEngine
 {

+ 1 - 0
src/Hotline.Application.Contracts/Validators/FlowEngine/NextWorkflowDtoValidator.cs

@@ -5,6 +5,7 @@ using System.Text;
 using System.Threading.Tasks;
 using FluentValidation;
 using Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 
 namespace Hotline.Application.Contracts.Validators.FlowEngine
 {

+ 1 - 0
src/Hotline.Application.Contracts/Validators/FlowEngine/RecallDtoValidator.cs

@@ -1,5 +1,6 @@
 using FluentValidation;
 using Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 
 namespace Hotline.Application.Contracts.Validators.FlowEngine;
 

+ 1 - 0
src/Hotline.Application.Contracts/Validators/FlowEngine/StartWorkflowDtoValidator.cs

@@ -6,6 +6,7 @@ using System.Threading.Tasks;
 using FluentValidation;
 using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Application.Contracts.Validators;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Enums.FlowEngine;
 
 namespace Hotline.Application.Contracts.Validators.FlowEngine;

+ 1 - 0
src/Hotline.Application/Orders/IOrderApplication.cs

@@ -5,6 +5,7 @@ using Hotline.Settings;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.DataSharing.PusherHotlineDto;
 using Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.Order.Publish;
 using Hotline.Share.Enums.Settings;

+ 1 - 0
src/Hotline.Application/Orders/OrderApplication.cs

@@ -46,6 +46,7 @@ using SqlSugar;
 using System.Data;
 using System.Dynamic;
 using Hotline.FlowEngine.Notifications;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 using XF.Domain.Authentications;
 using XF.Domain.Dependency;
 using XF.Domain.Entities;

+ 1 - 0
src/Hotline.Application/Orders/OrderSecondaryHandlingApplication.cs

@@ -28,6 +28,7 @@ using Hotline.Share.Enums.FlowEngine;
 using Hotline.Settings.TimeLimitDomain;
 using Microsoft.Extensions.Options;
 using DocumentFormat.OpenXml.Office2010.Excel;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 
 namespace Hotline.Application.Orders
 {

+ 1 - 0
src/Hotline.Application/Snapshot/IOrderSnapshotApplication.cs

@@ -9,6 +9,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 
 namespace Hotline.Application.Snapshot;
 public interface IOrderSnapshotApplication

+ 1 - 0
src/Hotline.Application/Snapshot/SnapshotOrderApplication.cs

@@ -26,6 +26,7 @@ using System.ComponentModel;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 using XF.Domain.Authentications;
 using XF.Domain.Dependency;
 using XF.Domain.Exceptions;

+ 1 - 0
src/Hotline.Share/Dtos/CallCenter/TelRestDto.cs

@@ -1,4 +1,5 @@
 using Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 
 namespace Hotline.Share.Dtos.CallCenter
 {

+ 3 - 1
src/Hotline.Share/Dtos/FlowEngine/CancelDto.cs

@@ -1,4 +1,6 @@
-namespace Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
+
+namespace Hotline.Share.Dtos.FlowEngine;
 
 public class CancelDto : EndWorkflowIdDto
 {

+ 0 - 150
src/Hotline.Share/Dtos/FlowEngine/PreviousWorkflowDto.cs

@@ -1,150 +0,0 @@
-using Hotline.Share.Enums.FlowEngine;
-using System.Security.Authentication;
-
-namespace Hotline.Share.Dtos.FlowEngine;
-
-public class PreviousWorkflowDto : EndWorkflowIdDto
-{
-    /// <summary>
-    /// 是否短信通知
-    /// </summary>
-    public bool AcceptSms { get; set; }
-
-    /// <summary>
-    /// 期满时间
-    /// </summary>
-    public DateTime? ExpiredTime { get; set; }
-
-    ///// <summary>
-    ///// 指定办理对象
-    ///// </summary>
-    //public FlowStepHandler? Handler { get; set; }
-
-    /// <summary>
-    /// 逆向流程,节点指派方式
-    /// 退回、特提
-    /// </summary>
-    public ReverseFlowStepAssignInfo ReverseFlowStepAssignInfo { get; set; }
-}
-
-/// <summary>
-/// 逆向流程,节点指派方式
-/// </summary>
-public class ReverseFlowStepAssignInfo
-{
-    public ReverseFlowStepAssignInfo()
-    {
-        
-    }
-
-    public ReverseFlowStepAssignInfo(EReverseFlowStepCreationPolicy reverseFlowStepCreationPolicy, StepAssignInfo? stepAssignInfo = null)
-    {
-        ReverseFlowStepCreationPolicy = reverseFlowStepCreationPolicy;
-        StepAssignInfo = stepAssignInfo;
-    }
-
-    public EReverseFlowStepCreationPolicy ReverseFlowStepCreationPolicy { get; set; } =
-        EReverseFlowStepCreationPolicy.OriginStep;
-
-    /// <summary>
-    /// 节点指定办理对象(非指定办理对象时无效)
-    /// </summary>
-    public StepAssignInfo? StepAssignInfo { get; set; }
-}
-
-/// <summary>
-/// 逆向流程,节点创建策略
-/// </summary>
-public enum EReverseFlowStepCreationPolicy
-{
-    /// <summary>
-    /// 保持原节点的办理对象不变
-    /// </summary>
-    OriginStep = 1,
-
-    /// <summary>
-    /// 指派给原节点办理人
-    /// </summary>
-    OriginStepUser = 2,
-
-    /// <summary>
-    /// 指派给原节点办理部门
-    /// </summary>
-    OriginStepOrg = 3,
-
-    /// <summary>
-    /// 指派给原节点办理角色
-    /// </summary>
-    OriginStepRole = 4,
-
-    /// <summary>
-    /// 指派给原节点办理部门及角色
-    /// </summary>
-    OriginStepOrgAndRole = 5,
-
-    /// <summary>
-    /// 指定办理对象
-    /// </summary>
-    AssignHandler = 20,
-
-    /// <summary>
-    /// 保持原节点配置(指派给角色)
-    /// </summary>
-    OriginDefinition = 30,
-}
-
-public class StepAssignInfo : FlowStepHandler
-{
-    public EFlowAssignType FlowAssignType { get; set; }
-}
-
-/// <summary>
-/// 操作人信息
-/// </summary>
-public class OperatorInfo
-{
-    public OperatorInfo()
-    {
-
-    }
-
-    public OperatorInfo(
-        string? userId, string? userName,
-        string? orgId, string? orgName,
-        string? orgAreaCode, string orgAreaName,
-        bool orgIsCenter, string[] roles,
-        int orglevel)
-    {
-        UserId = userId;
-        UserName = userName;
-        OrgId = orgId;
-        OrgName = orgName;
-        OrgLevel = orglevel;
-        OrgIsCenter = orgIsCenter;
-        OrgAreaCode = orgAreaCode;
-        Roles = roles;
-    }
-
-    public string? UserId { get; init; }
-
-    public string? UserName { get; init; }
-
-    public string? OrgId { get; init; }
-
-    public string? OrgName { get; init; }
-    public int OrgLevel { get; init; }
-    public bool OrgIsCenter { get; init; }
-
-    public string? OrgAreaCode { get; init; }
-
-    /// <summary>
-    /// 部门行政区划名称
-    /// </summary>
-    public string? OrgAreaName { get; init; }
-
-    /// <summary>
-    /// Roles
-    /// </summary>
-    public string[] Roles { get; init; }
-
-}

+ 3 - 1
src/Hotline.Share/Dtos/FlowEngine/RejectDto.cs

@@ -1,4 +1,6 @@
-namespace Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
+
+namespace Hotline.Share.Dtos.FlowEngine;
 
 public class RejectDto : EndWorkflowIdDto
 {

+ 3 - 1
src/Hotline.Share/Dtos/FlowEngine/SupplementDto.cs

@@ -1,4 +1,6 @@
-namespace Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
+
+namespace Hotline.Share.Dtos.FlowEngine;
 
 public class SupplementDto : EndWorkflowIdDto
 {

+ 6 - 8
src/Hotline.Share/Dtos/FlowEngine/BasicWorkflowDto.cs → src/Hotline.Share/Dtos/FlowEngine/Workflow/BasicWorkflowDto.cs

@@ -1,7 +1,7 @@
 using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.Settings;
 
-namespace Hotline.Share.Dtos.FlowEngine;
+namespace Hotline.Share.Dtos.FlowEngine.Workflow;
 
 /// <summary>
 /// 工作流流转基础信息
@@ -58,6 +58,11 @@ public class BasicWorkflowDto : EndWorkflowDto
     /// </summary>
     public List<FlowStepHandler> NextHandlers { get; set; } = new();
 
+    /// <summary>
+    /// 指派办理类型
+    /// </summary>
+    public EFlowAssignType? FlowAssignType { get; set; }
+
     /// <summary>
     /// 是否短信通知
     /// </summary>
@@ -68,13 +73,6 @@ public class BasicWorkflowDto : EndWorkflowDto
     /// </summary>
     public string? NextMainHandler { get; set; }
 
-   
-
-    ///// <summary>
-    ///// 办理方式
-    ///// </summary>
-    //public EHandleMode HandleMode => IsStartCountersign ? EHandleMode.StartCountersign : EHandleMode.Normal;
-
     /// <summary>
     /// 外部业务参数
     /// </summary>

+ 1 - 1
src/Hotline.Share/Dtos/FlowEngine/EndWorkflowDto.cs → src/Hotline.Share/Dtos/FlowEngine/Workflow/EndWorkflowDto.cs

@@ -1,6 +1,6 @@
 using Hotline.Share.Dtos.File;
 
-namespace Hotline.Share.Dtos.FlowEngine;
+namespace Hotline.Share.Dtos.FlowEngine.Workflow;
 
 public class EndWorkflowDto
 {

+ 41 - 0
src/Hotline.Share/Dtos/FlowEngine/Workflow/ForwardFlowStepAssignInfo.cs

@@ -0,0 +1,41 @@
+namespace Hotline.Share.Dtos.FlowEngine.Workflow;
+
+/// <summary>
+/// 正向流程,节点指派方式
+/// </summary>
+public class ForwardFlowStepAssignInfo
+{
+    public ForwardFlowStepAssignInfo()
+    {
+        
+    }
+
+    public ForwardFlowStepAssignInfo(EForwardFlowStepCreationPolicy forwardFlowStepCreationPolicy, StepAssignInfo? stepAssignInfo = null)
+    {
+        ForwardFlowStepCreationPolicy = forwardFlowStepCreationPolicy;
+        StepAssignInfo = stepAssignInfo;
+    }
+    
+    public static ForwardFlowStepAssignInfo Default = new ForwardFlowStepAssignInfo();
+
+    public EForwardFlowStepCreationPolicy ForwardFlowStepCreationPolicy { get; set; } =
+        EForwardFlowStepCreationPolicy.Definition;
+    
+    /// <summary>
+    /// 节点指定办理对象(非指定办理对象时无效)
+    /// </summary>
+    public StepAssignInfo? StepAssignInfo { get; set; }
+}
+
+public enum EForwardFlowStepCreationPolicy
+{
+    /// <summary>
+    /// 按配置指派
+    /// </summary>
+    Definition = 0,
+    
+    /// <summary>
+    /// 指定办理对象
+    /// </summary>
+    AssignHandler = 10,
+}

+ 1 - 4
src/Hotline.Share/Dtos/FlowEngine/NextWorkflowDto.cs → src/Hotline.Share/Dtos/FlowEngine/Workflow/NextWorkflowDto.cs

@@ -1,7 +1,4 @@
-using Hotline.Share.Enums.FlowEngine;
-using System.ComponentModel;
-
-namespace Hotline.Share.Dtos.FlowEngine;
+namespace Hotline.Share.Dtos.FlowEngine.Workflow;
 
 /// <summary>
 /// 办理参数

+ 76 - 0
src/Hotline.Share/Dtos/FlowEngine/Workflow/PreviousWorkflowDto.cs

@@ -0,0 +1,76 @@
+namespace Hotline.Share.Dtos.FlowEngine.Workflow;
+
+public class PreviousWorkflowDto : EndWorkflowIdDto
+{
+    /// <summary>
+    /// 是否短信通知
+    /// </summary>
+    public bool AcceptSms { get; set; }
+
+    /// <summary>
+    /// 期满时间
+    /// </summary>
+    public DateTime? ExpiredTime { get; set; }
+
+    ///// <summary>
+    ///// 指定办理对象
+    ///// </summary>
+    //public FlowStepHandler? Handler { get; set; }
+
+    /// <summary>
+    /// 逆向流程,节点指派方式
+    /// 退回、特提
+    /// </summary>
+    public ReverseFlowStepAssignInfo ReverseFlowStepAssignInfo { get; set; }
+}
+
+/// <summary>
+/// 操作人信息
+/// </summary>
+public class OperatorInfo
+{
+    public OperatorInfo()
+    {
+
+    }
+
+    public OperatorInfo(
+        string? userId, string? userName,
+        string? orgId, string? orgName,
+        string? orgAreaCode, string orgAreaName,
+        bool orgIsCenter, string[] roles,
+        int orglevel)
+    {
+        UserId = userId;
+        UserName = userName;
+        OrgId = orgId;
+        OrgName = orgName;
+        OrgLevel = orglevel;
+        OrgIsCenter = orgIsCenter;
+        OrgAreaCode = orgAreaCode;
+        Roles = roles;
+    }
+
+    public string? UserId { get; init; }
+
+    public string? UserName { get; init; }
+
+    public string? OrgId { get; init; }
+
+    public string? OrgName { get; init; }
+    public int OrgLevel { get; init; }
+    public bool OrgIsCenter { get; init; }
+
+    public string? OrgAreaCode { get; init; }
+
+    /// <summary>
+    /// 部门行政区划名称
+    /// </summary>
+    public string? OrgAreaName { get; init; }
+
+    /// <summary>
+    /// Roles
+    /// </summary>
+    public string[] Roles { get; init; }
+
+}

+ 1 - 1
src/Hotline.Share/Dtos/FlowEngine/RecallDto.cs → src/Hotline.Share/Dtos/FlowEngine/Workflow/RecallDto.cs

@@ -1,4 +1,4 @@
-namespace Hotline.Share.Dtos.FlowEngine;
+namespace Hotline.Share.Dtos.FlowEngine.Workflow;
 
 /// <summary>
 /// 特提

+ 67 - 0
src/Hotline.Share/Dtos/FlowEngine/Workflow/ReverseFlowStepAssignInfo.cs

@@ -0,0 +1,67 @@
+namespace Hotline.Share.Dtos.FlowEngine.Workflow;
+
+/// <summary>
+/// 逆向流程,节点指派方式
+/// </summary>
+public class ReverseFlowStepAssignInfo
+{
+    public ReverseFlowStepAssignInfo()
+    {
+        
+    }
+
+    public ReverseFlowStepAssignInfo(EReverseFlowStepCreationPolicy reverseFlowStepCreationPolicy, StepAssignInfo? stepAssignInfo = null)
+    {
+        ReverseFlowStepCreationPolicy = reverseFlowStepCreationPolicy;
+        StepAssignInfo = stepAssignInfo;
+    }
+
+    public EReverseFlowStepCreationPolicy ReverseFlowStepCreationPolicy { get; set; } =
+        EReverseFlowStepCreationPolicy.OriginStep;
+
+    /// <summary>
+    /// 节点指定办理对象(非指定办理对象时无效)
+    /// </summary>
+    public StepAssignInfo? StepAssignInfo { get; set; }
+}
+
+/// <summary>
+/// 逆向流程,节点创建策略
+/// </summary>
+public enum EReverseFlowStepCreationPolicy
+{
+    /// <summary>
+    /// 保持原节点的办理对象不变
+    /// </summary>
+    OriginStep = 1,
+
+    /// <summary>
+    /// 指派给原节点办理人
+    /// </summary>
+    OriginStepUser = 2,
+
+    /// <summary>
+    /// 指派给原节点办理部门
+    /// </summary>
+    OriginStepOrg = 3,
+
+    /// <summary>
+    /// 指派给原节点办理角色
+    /// </summary>
+    OriginStepRole = 4,
+
+    /// <summary>
+    /// 指派给原节点办理部门及角色
+    /// </summary>
+    OriginStepOrgAndRole = 5,
+
+    /// <summary>
+    /// 指定办理对象
+    /// </summary>
+    AssignHandler = 20,
+
+    /// <summary>
+    /// 保持原节点配置(指派给角色)
+    /// </summary>
+    OriginDefinition = 30,
+}

+ 1 - 1
src/Hotline.Share/Dtos/FlowEngine/StartWorkflowDto.cs → src/Hotline.Share/Dtos/FlowEngine/Workflow/StartWorkflowDto.cs

@@ -1,4 +1,4 @@
-namespace Hotline.Share.Dtos.FlowEngine
+namespace Hotline.Share.Dtos.FlowEngine.Workflow
 {
     public class StartWorkflowDto : BasicWorkflowDto
     {

+ 8 - 0
src/Hotline.Share/Dtos/FlowEngine/Workflow/StepAssignInfo.cs

@@ -0,0 +1,8 @@
+using Hotline.Share.Enums.FlowEngine;
+
+namespace Hotline.Share.Dtos.FlowEngine.Workflow;
+
+public class StepAssignInfo : FlowStepHandler
+{
+    public EFlowAssignType FlowAssignType { get; set; }
+}

+ 1 - 0
src/Hotline.Share/Dtos/Knowledge/KnowledgeDto.cs

@@ -8,6 +8,7 @@ using Hotline.Share.Enums.KnowledgeBase;
 using Hotline.Share.Notifications.NewRockCallCenter;
 using Hotline.Share.Requests;
 using System.ComponentModel.DataAnnotations;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 using XF.Utility.EnumExtensions;
 
 namespace Hotline.Share.Dtos.Knowledge

+ 1 - 0
src/Hotline.Share/Dtos/Order/AddRedoDto.cs

@@ -6,6 +6,7 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 
 namespace Hotline.Share.Dtos.Order
 {

+ 1 - 0
src/Hotline.Share/Dtos/Order/OrderPreviousDto.cs

@@ -1,4 +1,5 @@
 using Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 
 namespace Hotline.Share.Dtos.Order;
 

+ 1 - 0
src/Hotline.Share/Dtos/Order/OrderStartFlowDto.cs

@@ -1,5 +1,6 @@
 using System.ComponentModel;
 using Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Dtos.Org;
 using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.Settings;

+ 1 - 0
src/Hotline.Share/Dtos/Order/SendBackDto.cs

@@ -7,6 +7,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 using XF.Utility.EnumExtensions;
 
 namespace Hotline.Share.Dtos.Order

+ 1 - 0
src/Hotline/FlowEngine/Notifications/WorkflowNotify.cs

@@ -1,6 +1,7 @@
 using Hotline.FlowEngine.Definitions;
 using Hotline.FlowEngine.Workflows;
 using Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Enums.FlowEngine;
 using MediatR;
 using XF.Domain.Entities;

+ 20 - 15
src/Hotline/FlowEngine/Workflows/IWorkflowDomainService.cs

@@ -4,6 +4,7 @@ using Hotline.Settings;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.File;
 using Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.Settings;
 using Hotline.Users;
@@ -30,12 +31,14 @@ namespace Hotline.FlowEngine.Workflows
         /// <summary>
         /// new 
         /// </summary>
-        Task<(Workflow, WorkflowStep)> StartAsync(StartWorkflowDto dto, string externalId, DateTime? expiredTime, CancellationToken cancellationToken = default);
+        Task<(Workflow, WorkflowStep)> StartAsync(StartWorkflowDto dto, string externalId,
+            DateTime? expiredTime, CancellationToken cancellationToken = default);
 
         /// <summary>
         /// new
         /// </summary>
         Task<List<WorkflowStep>> NextAsync(ISessionContext current, NextWorkflowDto dto,
+            ForwardFlowStepAssignInfo forwardFlowStepAssignInfo, Action<WorkflowStep>? stepConfig = null,
             DateTime? expiredTime = null, bool isAutoFillSummaryOpinion = false, CancellationToken cancellationToken = default);
 
         /// <summary>
@@ -63,21 +66,22 @@ namespace Hotline.FlowEngine.Workflows
         //Task NextAsync(Workflow workflow, WorkflowStep currentStep, NextWorkflowDto dto, StepDefine nextStepDefine,
         //    bool isNextDynamic, FlowAssignInfo flowAssignInfo, DateTime? expiredTime, CancellationToken cancellationToken);
 
-        /// <summary>
-        /// 退回(返回前一节点)
-        /// </summary>
-        /// <returns></returns>
-        Task<EFlowDirection> PreviousAsync(Workflow workflow, PreviousWorkflowDto dto,
-            string applicantId, string applicantName,
-            string applicantOrgId, string applicantOrgName,
-            string applicantOrgAreaCode, string applicantOrgAreaName,
-            bool applicantIsCenter, string[] applicantRoleIds,
-            CancellationToken cancellationToken);
+        // /// <summary>
+        // /// 退回(返回前一节点)
+        // /// </summary>
+        // /// <returns></returns>
+        // Task<EFlowDirection> PreviousAsync(Workflow workflow, PreviousWorkflowDto dto,
+        //     string applicantId, string applicantName,
+        //     string applicantOrgId, string applicantOrgName,
+        //     string applicantOrgAreaCode, string applicantOrgAreaName,
+        //     bool applicantIsCenter, string[] applicantRoleIds,
+        //     CancellationToken cancellationToken);
 
         /// <summary>
         /// 退回(new)
         /// </summary>
-        Task<EFlowDirection> PreviousAsync(Workflow workflow, PreviousWorkflowDto dto, OperatorInfo operatorInfo, CancellationToken cancellationToken);
+        Task<EFlowDirection> PreviousAsync(Workflow workflow, PreviousWorkflowDto dto, OperatorInfo operatorInfo,
+            CancellationToken cancellationToken);
 
         /// <summary>
         /// 撤回(返回到之前任意节点)
@@ -106,14 +110,15 @@ namespace Hotline.FlowEngine.Workflows
         /// <summary>
         /// 特提至派单节点(无派单节点会抛异常)
         /// </summary>
-        Task RecallToSendStepAsync(Workflow workflow, string opinion, ReverseFlowStepAssignInfo reverseFlowStepAssignInfo, 
-            DateTime? expiredTime, bool isOrderFiled,  EHandleMode handleMode, CancellationToken cancellationToken);
+        Task RecallToSendStepAsync(Workflow workflow, string opinion, ReverseFlowStepAssignInfo reverseFlowStepAssignInfo,
+            DateTime? expiredTime, bool isOrderFiled, EHandleMode handleMode, CancellationToken cancellationToken);
 
         /// <summary>
         /// 特提至中心(优先派单组其次坐席)
         /// </summary>
         /// <returns></returns>
-        Task<(bool, Workflow workflow)> RecallToCenterFirstToSendAsync(string workflowId, string opinion, ReverseFlowStepAssignInfo reverseFlowStepAssignInfo, 
+        Task<(bool, Workflow workflow)> RecallToCenterFirstToSendAsync(string workflowId, string opinion,
+            ReverseFlowStepAssignInfo reverseFlowStepAssignInfo,
             bool isOrderFiled, DateTime? expiredTime, EHandleMode handleMode, CancellationToken cancellationToken);
 
         ///// <summary>

+ 293 - 211
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -22,6 +22,7 @@ using XF.Domain.Repository;
 using System.Text;
 using Hotline.Configurations;
 using Hotline.Share.Dtos.File;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Microsoft.Extensions.Options;
 
 namespace Hotline.FlowEngine.Workflows
@@ -123,6 +124,7 @@ namespace Hotline.FlowEngine.Workflows
                     cancellationToken);
                 return;
             }
+
             var assigner = new UserInfo(
                 _sessionContextProvider.SessionContext.UserId,
                 _sessionContextProvider.SessionContext.UserName,
@@ -217,7 +219,6 @@ namespace Hotline.FlowEngine.Workflows
                 _sessionContextProvider.SessionContext.OrgIsCenter
             );
 
-            //todo 重构为流程开放策略参数,业务决定
             var handler = new FlowStepHandler
             {
                 Key = _sessionContextProvider.SessionContext.RequiredUserId,
@@ -273,7 +274,8 @@ namespace Hotline.FlowEngine.Workflows
         /// new
         /// </summary>
         public async Task<List<WorkflowStep>> NextAsync(ISessionContext current, NextWorkflowDto dto,
-            DateTime? expiredTime = null, bool isAutoFillSummaryOpinion = false, CancellationToken cancellationToken = default)
+            ForwardFlowStepAssignInfo forwardFlowStepAssignInfo, DateTime? expiredTime = null, bool isAutoFillSummaryOpinion = false,
+            Action<WorkflowStep>? stepConfig = null, CancellationToken cancellationToken = default)
         {
             var workflow = await GetWorkflowAsync(dto.WorkflowId, withDefine: true, withSteps: true,
                 withTraces: true, withCountersigns: true, cancellationToken: cancellationToken);
@@ -291,8 +293,8 @@ namespace Hotline.FlowEngine.Workflows
 
             //下一节点是否为动态节点
             var isNextDynamic = (string.IsNullOrEmpty(dto.NextStepCode) || dto.NextStepCode.ToLower() != "end")
-               && currentStepDefine.InstanceMode is EInstanceMode.Dynamic
-                && !DynamicShouldTerminal(currentStepDefine, current.OrgLevel);
+                                && currentStepDefine.InstanceMode is EInstanceMode.Dynamic
+                                && !DynamicShouldTerminal(currentStepDefine, current.OrgLevel);
 
             StepDefine nextStepDefine;
             if (isNextDynamic
@@ -310,13 +312,6 @@ namespace Hotline.FlowEngine.Workflows
                 nextStepDefine = GetStepDefine(workflow.WorkflowDefinition, dto.NextStepCode);
             }
 
-            //普通节点往汇总节点办理时可以不选,不选的场景主动去查之前的办理对象 //todo 按照指派策略生成办理对象
-            if (nextStepDefine.StepType is EStepType.Summary && !dto.NextHandlers.Any())
-            {
-                var handler = GetSummaryTargetFlowStepHandler(workflow, nextStepDefine.SummaryTargetCode);
-                dto.NextHandlers.Add(handler);
-            }
-
             //需求:按角色选择办理人可以不选,表示该角色下所有人都可以办理,同时依据配置:是否本部门人办理显示待选办理人。角色下只要一人办理即可(即:角色下不发起会签)
             if (nextStepDefine.HandlerType != EHandlerType.Role
                 && nextStepDefine.StepType != EStepType.End
@@ -338,6 +333,23 @@ namespace Hotline.FlowEngine.Workflows
             var flowAssignInfo =
                 await GetNextStepFlowAssignInfoAsync(workflow, currentStep, dto, nextStepDefine, isNextDynamic, cancellationToken);
 
+            dto.FlowAssignType ??= SetNextStepAssignInfo(workflow, currentStep, dto, nextStepDefine, isNextDynamic);
+
+            /*
+             0.动态、会签固定指派方式
+             1.普通办理方式:依据配置决定指派对象,结合dto选择的nextHandlers
+             2.下一节点是按角色办理时可以不选办理对象,此时需指派给配置的角色
+             3.下一节点是汇总节点切未选办理对象时:a.依据原节点办理人办理 b.依据原节点配置办理
+             4.开放action,允许按业务逻辑任意指派
+             5.任意场景下优先级:action > dto选择办理对象 > 业务逻辑指定
+             */
+            //普通节点往汇总节点办理时可以不选,不选的场景主动去查之前的办理对象 //todo 按照指派策略生成办理对象
+            if (nextStepDefine.StepType is EStepType.Summary && !dto.NextHandlers.Any())
+            {
+                var handler = GetSummaryTargetFlowStepHandler(workflow, nextStepDefine.SummaryTargetCode);
+                dto.NextHandlers.Add(handler);
+            }
+
             //todo 加入到重构获取办理对象方法中
             if (nextStepDefine.StepType != EStepType.End
                 && nextStepDefine.HandlerType == EHandlerType.Role
@@ -523,14 +535,12 @@ namespace Hotline.FlowEngine.Workflows
             //创建下一/N个节点(会签汇总节点:会签未全部办理时不创建,最后一个会签办理节点创建会签汇总节点)
             var nextSteps = await CreateNextStepsAsync(workflow, currentStep, dto,
                 nextStepDefine, assigner, isNextDynamic, flowAssignInfo.FlowAssignType, expiredTime, dto.IsStartCountersign,
-                isAutoFillSummaryOpinion, cancellationToken);
+                isAutoFillSummaryOpinion, stepConfig, cancellationToken);
 
             // //更新办理对象(nextSteps无元素表示当前节点为会签办理节点且当前会签没有全部办理完成)
             // workflow.UpdateHandlers(current.RequiredUserId, current.RequiredOrgId,
             //     flowAssignInfo.FlowAssignType, flowAssignInfo.HandlerObjects, nextSteps.Any());
 
-            //todo 计算办理工作时长
-
             //指派实际办理节点
             UpdateActualStep(workflow, dto, nextStepDefine, nextSteps);
 
@@ -674,162 +684,162 @@ namespace Hotline.FlowEngine.Workflows
             workflow.ActualHandleStepAcceptTime = currentStep.AcceptTime;
             await _workflowRepository.Updateable(workflow).ExecuteCommandAsync(cancellationToken);
 
-            return workflow.ActualHandleStepAcceptTime; 
-        }
-
-        /// <summary>
-        /// 退回(返回前一节点)
-        /// </summary>
-        /// <returns></returns>
-        public async Task<EFlowDirection> PreviousAsync(Workflow workflow, PreviousWorkflowDto dto,
-            string applicantId, string applicantName,
-            string applicantOrgId, string applicantOrgName,
-            string applicantOrgAreaCode, string applicantOrgAreaName,
-            bool applicantIsCenter, string[] applicantRoleIds,
-            CancellationToken cancellationToken)
-        {
-            //ValidatePermission(workflow, operater.OrgId, operater.Id);
-
-            var (currentStep, prevStep, countersignStartStep) =
-                GetPreviousStep(workflow, applicantId, applicantOrgId, applicantRoleIds);
-
-            //保存附件
-            if (dto.Files.Any())
-                currentStep.FileJson = await _fileRepository.AddFileAsync(
-                    dto.Files, workflow.ExternalId, currentStep.Id, cancellationToken);
-
-            // add prev current to remove list
-            var removeSteps = new List<WorkflowStep> { currentStep, prevStep };
-
-            if (countersignStartStep is not null)
-            {
-                //add cs steps to remove list
-                SearchCountersignSteps(countersignStartStep, workflow.Steps, ref removeSteps);
-
-                //end cs
-                var currentCountersign =
-                    workflow.Countersigns.FirstOrDefault(d => d.Id == countersignStartStep.StartCountersignId);
-                if (currentCountersign is null)
-                    throw new UserFriendlyException(
-                        $"未查询到对应会签信息,workflowId:{workflow.Id}, countersignId:{currentStep.CountersignId}",
-                        "无效会签编号");
-
-                //结束step会签信息
-                countersignStartStep.CountersignEnd();
-                await _workflowStepRepository.UpdateAsync(countersignStartStep, cancellationToken);
-                //updateSteps.Add(countersignStartStep);
-
-                //结束会签
-                //currentCountersign.End(currentStep.Id, currentStep.Code, currentStep.BusinessType,
-                //    current.RequiredUserId, current.UserName,
-                //    current.RequiredOrgId, current.OrgName,
-                //    current.OrgAreaCode, current.OrgAreaName);
-                currentCountersign.End(currentStep.Id, currentStep.Code, currentStep.BusinessType,
-                    applicantId, applicantName,
-                    applicantOrgId, applicantOrgName,
-                    applicantOrgAreaCode, applicantOrgAreaName);
-
-                await _workflowCountersignRepository.UpdateAsync(currentCountersign, cancellationToken);
-
-                //update workflow cs status
-                if (workflow.CheckIfCountersignOver())
-                    workflow.EndCountersign();
-            }
-
-            //update trace
-            //var trace = await PreviousTraceAsync(workflow.Id, dto, currentStep,
-            //    applicantId, applicantName,
-            //    applicantOrgId, applicantOrgName,
-            //    applicantOrgAreaCode, applicantOrgAreaName,
-            //    applicantIsCenter, cancellationToken);
-            var trace = workflow.Traces.First(t => t.StepId == currentStep.Id);
-            // _mapper.Map(dto, trace);
-            trace.FileJson = currentStep.FileJson;
-            trace.IsSms = dto.AcceptSms;
-            trace.Opinion = dto.Opinion;
-
-            //HandleTrace(trace, dto.Opinion, current);
-
-            trace.Handle(applicantId, applicantName,
-                applicantOrgId, applicantOrgName,
-                applicantOrgAreaCode, applicantOrgAreaName,
-                applicantIsCenter, EHandleMode.Previous, dto.Opinion);
-
-            //await _workflowTraceRepository.UpdateAsync(trace, cancellationToken);
-
-            //如果有传入期满时间 新节点为传入的期满时间
-            if (dto.ExpiredTime.HasValue)
-                prevStep.StepExpiredTime = dto.ExpiredTime;
-
-            if (workflow.FlowType == EFlowType.Handle)
-            {
-                prevStep.FlowAssignType = prevStep.BusinessType is EBusinessType.Seat ? EFlowAssignType.Role :
-                    prevStep.BusinessType is EBusinessType.Send ? EFlowAssignType.User : EFlowAssignType.Org;
-            }
-            //甄别退回到最开始节点到部门
-            if (workflow.FlowType == EFlowType.Review && workflow.ModuleCode == WorkflowModuleConsts.OrderScreen)
-            {
-                prevStep.FlowAssignType = prevStep.StepType == EStepType.Start ? EFlowAssignType.Org : prevStep.FlowAssignType;
-            }
-
-            dto.ReverseFlowStepAssignInfo ??= new ReverseFlowStepAssignInfo(EReverseFlowStepCreationPolicy.OriginStepUser);
-            var prevStepDefine = workflow.WorkflowDefinition.FindStepDefine(prevStep.Code);
-            var stepAssignInfo = GetStepAssignInfo(dto.ReverseFlowStepAssignInfo, prevStep, prevStepDefine);
-
-            //复制上一个节点为待接办
-            // var newPrevStep =
-            //     await DuplicateStepWithTraceAsync(workflow, prevStep, EWorkflowTraceType.Previous, cancellationToken);
-            var newPrevStep = DuplicateStep(prevStep, EWorkflowTraceType.Previous, stepAssignInfo, dto.ExpiredTime);
-            ////退给派单组节点,需按照平均分配原则派给一个派单员 禅道299 TODO
-            //if (dto.ReverseFlowStepAssignInfo != null) //todo 改为按策略判断
-            //{
-            //    var handle = dto.ReverseFlowStepAssignInfo.StepAssignInfo;
-            //    newPrevStep.Assign(handle.UserId, handle.Username, handle.OrgId, handle.OrgName, handle.RoleId, handle.RoleName);
-            //}
-
-            await _workflowStepRepository.AddAsync(newPrevStep, cancellationToken);
-            await CreateTraceAsync(workflow, newPrevStep, EWorkflowTraceType.Previous, cancellationToken);
-
-            //remove workflow.steps
-            await _workflowStepRepository.RemoveRangeAsync(removeSteps, cancellationToken);
-
-            var stepIds = removeSteps.Select(d => d.Id).ToList();
-            var updateTraces = workflow.Traces.Where(d => stepIds.Contains(d.StepId)).ToList();
-            await UpdateTracesStateAsync(updateTraces, EWorkflowTraceState.StepRemoveByPrevious, cancellationToken);
-
-            if (workflow.Status is EWorkflowStatus.Completed)
-                workflow.SetStatusRunnable();
-
-            //更新实际办理节点信息
-            workflow.UpdateActualStepWhenAssign(newPrevStep, new FlowStepHandler
-            {
-                UserId = newPrevStep.HandlerId,
-                Username = newPrevStep.HandlerName,
-                OrgId = newPrevStep.HandlerOrgId,
-                OrgName = newPrevStep.HandlerOrgName,
-            });
-
-            workflow.UpdateCurrentStepWhenAssign(newPrevStep, new FlowStepHandler
-            {
-                UserId = newPrevStep.HandlerId,
-                Username = newPrevStep.HandlerName,
-                OrgId = newPrevStep.HandlerOrgId,
-                OrgName = newPrevStep.HandlerOrgName,
-            });
-
-            // //更新流程可办理对象
-            // workflow.UpdatePreviousHandlers(applicantId, applicantOrgId, prevStep);
-
-            //orgToCenter会触发重新计算期满时间,1.无需审核按当前时间进行计算 2.需审核按审核通过时间计算
-            var isOrgToCenter = prevStep.BusinessType is EBusinessType.Send && prevStep.IsOrigin;
-
-            await _workflowRepository.UpdateAsync(workflow, cancellationToken);
-
-            await _publisher.PublishAsync(new PreviousNotify(workflow, newPrevStep, dto, isOrgToCenter),
-                PublishStrategy.ParallelWhenAll, cancellationToken);
-
-            return GetFlowDirection(currentStep.BusinessType, prevStep.BusinessType);
-        }
+            return workflow.ActualHandleStepAcceptTime;
+        }
+
+        // /// <summary>
+        // /// 退回(返回前一节点)
+        // /// </summary>
+        // /// <returns></returns>
+        // public async Task<EFlowDirection> PreviousAsync(Workflow workflow, PreviousWorkflowDto dto,
+        //     string applicantId, string applicantName,
+        //     string applicantOrgId, string applicantOrgName,
+        //     string applicantOrgAreaCode, string applicantOrgAreaName,
+        //     bool applicantIsCenter, string[] applicantRoleIds,
+        //     CancellationToken cancellationToken)
+        // {
+        //     //ValidatePermission(workflow, operater.OrgId, operater.Id);
+        //
+        //     var (currentStep, prevStep, countersignStartStep) =
+        //         GetPreviousStep(workflow, applicantId, applicantOrgId, applicantRoleIds);
+        //
+        //     //保存附件
+        //     if (dto.Files.Any())
+        //         currentStep.FileJson = await _fileRepository.AddFileAsync(
+        //             dto.Files, workflow.ExternalId, currentStep.Id, cancellationToken);
+        //
+        //     // add prev current to remove list
+        //     var removeSteps = new List<WorkflowStep> { currentStep, prevStep };
+        //
+        //     if (countersignStartStep is not null)
+        //     {
+        //         //add cs steps to remove list
+        //         SearchCountersignSteps(countersignStartStep, workflow.Steps, ref removeSteps);
+        //
+        //         //end cs
+        //         var currentCountersign =
+        //             workflow.Countersigns.FirstOrDefault(d => d.Id == countersignStartStep.StartCountersignId);
+        //         if (currentCountersign is null)
+        //             throw new UserFriendlyException(
+        //                 $"未查询到对应会签信息,workflowId:{workflow.Id}, countersignId:{currentStep.CountersignId}",
+        //                 "无效会签编号");
+        //
+        //         //结束step会签信息
+        //         countersignStartStep.CountersignEnd();
+        //         await _workflowStepRepository.UpdateAsync(countersignStartStep, cancellationToken);
+        //         //updateSteps.Add(countersignStartStep);
+        //
+        //         //结束会签
+        //         //currentCountersign.End(currentStep.Id, currentStep.Code, currentStep.BusinessType,
+        //         //    current.RequiredUserId, current.UserName,
+        //         //    current.RequiredOrgId, current.OrgName,
+        //         //    current.OrgAreaCode, current.OrgAreaName);
+        //         currentCountersign.End(currentStep.Id, currentStep.Code, currentStep.BusinessType,
+        //             applicantId, applicantName,
+        //             applicantOrgId, applicantOrgName,
+        //             applicantOrgAreaCode, applicantOrgAreaName);
+        //
+        //         await _workflowCountersignRepository.UpdateAsync(currentCountersign, cancellationToken);
+        //
+        //         //update workflow cs status
+        //         if (workflow.CheckIfCountersignOver())
+        //             workflow.EndCountersign();
+        //     }
+        //
+        //     //update trace
+        //     //var trace = await PreviousTraceAsync(workflow.Id, dto, currentStep,
+        //     //    applicantId, applicantName,
+        //     //    applicantOrgId, applicantOrgName,
+        //     //    applicantOrgAreaCode, applicantOrgAreaName,
+        //     //    applicantIsCenter, cancellationToken);
+        //     var trace = workflow.Traces.First(t => t.StepId == currentStep.Id);
+        //     // _mapper.Map(dto, trace);
+        //     trace.FileJson = currentStep.FileJson;
+        //     trace.IsSms = dto.AcceptSms;
+        //     trace.Opinion = dto.Opinion;
+        //
+        //     //HandleTrace(trace, dto.Opinion, current);
+        //
+        //     trace.Handle(applicantId, applicantName,
+        //         applicantOrgId, applicantOrgName,
+        //         applicantOrgAreaCode, applicantOrgAreaName,
+        //         applicantIsCenter, EHandleMode.Previous, dto.Opinion);
+        //
+        //     //await _workflowTraceRepository.UpdateAsync(trace, cancellationToken);
+        //
+        //     //如果有传入期满时间 新节点为传入的期满时间
+        //     if (dto.ExpiredTime.HasValue)
+        //         prevStep.StepExpiredTime = dto.ExpiredTime;
+        //
+        //     if (workflow.FlowType == EFlowType.Handle)
+        //     {
+        //         prevStep.FlowAssignType = prevStep.BusinessType is EBusinessType.Seat ? EFlowAssignType.Role :
+        //             prevStep.BusinessType is EBusinessType.Send ? EFlowAssignType.User : EFlowAssignType.Org;
+        //     }
+        //     //甄别退回到最开始节点到部门
+        //     if (workflow.FlowType == EFlowType.Review && workflow.ModuleCode == WorkflowModuleConsts.OrderScreen)
+        //     {
+        //         prevStep.FlowAssignType = prevStep.StepType == EStepType.Start ? EFlowAssignType.Org : prevStep.FlowAssignType;
+        //     }
+        //
+        //     dto.ReverseFlowStepAssignInfo ??= new ReverseFlowStepAssignInfo(EReverseFlowStepCreationPolicy.OriginStepUser);
+        //     var prevStepDefine = workflow.WorkflowDefinition.FindStepDefine(prevStep.Code);
+        //     var stepAssignInfo = GetStepAssignInfo(dto.ReverseFlowStepAssignInfo, prevStep, prevStepDefine);
+        //
+        //     //复制上一个节点为待接办
+        //     // var newPrevStep =
+        //     //     await DuplicateStepWithTraceAsync(workflow, prevStep, EWorkflowTraceType.Previous, cancellationToken);
+        //     var newPrevStep = DuplicateStep(prevStep, EWorkflowTraceType.Previous, stepAssignInfo, dto.ExpiredTime);
+        //     ////退给派单组节点,需按照平均分配原则派给一个派单员 禅道299 TODO
+        //     //if (dto.ReverseFlowStepAssignInfo != null) //todo 改为按策略判断
+        //     //{
+        //     //    var handle = dto.ReverseFlowStepAssignInfo.StepAssignInfo;
+        //     //    newPrevStep.Assign(handle.UserId, handle.Username, handle.OrgId, handle.OrgName, handle.RoleId, handle.RoleName);
+        //     //}
+        //
+        //     await _workflowStepRepository.AddAsync(newPrevStep, cancellationToken);
+        //     await CreateTraceAsync(workflow, newPrevStep, EWorkflowTraceType.Previous, cancellationToken);
+        //
+        //     //remove workflow.steps
+        //     await _workflowStepRepository.RemoveRangeAsync(removeSteps, cancellationToken);
+        //
+        //     var stepIds = removeSteps.Select(d => d.Id).ToList();
+        //     var updateTraces = workflow.Traces.Where(d => stepIds.Contains(d.StepId)).ToList();
+        //     await UpdateTracesStateAsync(updateTraces, EWorkflowTraceState.StepRemoveByPrevious, cancellationToken);
+        //
+        //     if (workflow.Status is EWorkflowStatus.Completed)
+        //         workflow.SetStatusRunnable();
+        //
+        //     //更新实际办理节点信息
+        //     workflow.UpdateActualStepWhenAssign(newPrevStep, new FlowStepHandler
+        //     {
+        //         UserId = newPrevStep.HandlerId,
+        //         Username = newPrevStep.HandlerName,
+        //         OrgId = newPrevStep.HandlerOrgId,
+        //         OrgName = newPrevStep.HandlerOrgName,
+        //     });
+        //
+        //     workflow.UpdateCurrentStepWhenAssign(newPrevStep, new FlowStepHandler
+        //     {
+        //         UserId = newPrevStep.HandlerId,
+        //         Username = newPrevStep.HandlerName,
+        //         OrgId = newPrevStep.HandlerOrgId,
+        //         OrgName = newPrevStep.HandlerOrgName,
+        //     });
+        //
+        //     // //更新流程可办理对象
+        //     // workflow.UpdatePreviousHandlers(applicantId, applicantOrgId, prevStep);
+        //
+        //     //orgToCenter会触发重新计算期满时间,1.无需审核按当前时间进行计算 2.需审核按审核通过时间计算
+        //     var isOrgToCenter = prevStep.BusinessType is EBusinessType.Send && prevStep.IsOrigin;
+        //
+        //     await _workflowRepository.UpdateAsync(workflow, cancellationToken);
+        //
+        //     await _publisher.PublishAsync(new PreviousNotify(workflow, newPrevStep, dto, isOrgToCenter),
+        //         PublishStrategy.ParallelWhenAll, cancellationToken);
+        //
+        //     return GetFlowDirection(currentStep.BusinessType, prevStep.BusinessType);
+        // }
 
         /// <summary>
         /// 退回(new)
@@ -920,13 +930,6 @@ namespace Hotline.FlowEngine.Workflows
             //    newPrevStep.Assign(handle.UserId, handle.Username, handle.OrgId, handle.OrgName, handle.RoleId, handle.RoleName);
             //}
 
-            //dto.ReverseFlowStepAssignInfo ??= new ReverseFlowStepAssignInfo
-            //{
-            //    ReverseFlowStepCreationPolicy = EReverseFlowStepCreationPolicy.OriginStepUser
-            //};
-            //var prevStepDefine = workflow.WorkflowDefinition.FindStepDefine(prevStep.Code);
-            //ReverseFlowAssignStepHandler(dto.ReverseFlowStepAssignInfo, newPrevStep, prevStep, prevStepDefine);
-
             await _workflowStepRepository.AddAsync(newPrevStep, cancellationToken);
             await CreateTraceAsync(workflow, newPrevStep, EWorkflowTraceType.Previous, cancellationToken);
 
@@ -1460,7 +1463,7 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         public async Task<bool> RecallAsync(RecallDto dto, ReverseFlowStepAssignInfo reverseFlowStepAssignInfo,
             EWorkflowTraceType traceType, DateTime? expiredTime, bool isOrderFiled, EHandleMode handleMode,
-            CancellationToken cancellationToken)
+            Action<WorkflowStep>? stepConfig = null, CancellationToken cancellationToken = default)
         {
             var workflow = await GetWorkflowAsync(dto.WorkflowId, withDefine: true, withSteps: true,
                 withTraces: true, withCountersigns: true, cancellationToken: cancellationToken);
@@ -1474,7 +1477,7 @@ namespace Hotline.FlowEngine.Workflows
                 throw UserFriendlyException.SameMessage("该流程尚未流转至该节点");
 
             return await RecallAsync(workflow, dto, reverseFlowStepAssignInfo, targetStepDefine, targetStep, traceType,
-                expiredTime, isOrderFiled, handleMode, cancellationToken);
+                expiredTime, isOrderFiled, handleMode, stepConfig, cancellationToken);
         }
 
         /// <summary>
@@ -1482,29 +1485,19 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         public Task<bool> RecallAsync(Workflow workflow, RecallDto dto, ReverseFlowStepAssignInfo reverseFlowStepAssignInfo,
             StepDefine targetStepDefine, EWorkflowTraceType traceType, DateTime? expiredTime, bool isOrderFiled,
-            EHandleMode handleMode, CancellationToken cancellationToken)
+            EHandleMode handleMode, Action<WorkflowStep>? stepConfig = null, CancellationToken cancellationToken = default)
         {
             var targetStep = workflow.Steps.FirstOrDefault(d => d.Code == dto.NextStepCode && d.IsOrigin);
             if (targetStep is null)
                 throw UserFriendlyException.SameMessage("该流程尚未流转至该节点");
 
-            //var isOrgToCenter = await RecallAsync(workflow, dto, reverseFlowStepAssignInfo, targetStepDefine, targetStep,
-            //    traceType, expiredTime, isOrderFiled, handleMode, cancellationToken);
-
-            //await _workflowRepository.UpdateAsync(workflow, cancellationToken);
-
-            //await _publisher.PublishAsync(new RecallNotify(workflow, targetStep, dto, isOrgToCenter),
-            //    PublishStrategy.ParallelWhenAll, cancellationToken);
-
-            //return isOrgToCenter;
-
             return RecallAsync(workflow, dto, reverseFlowStepAssignInfo, targetStepDefine, targetStep,
-                traceType, expiredTime, isOrderFiled, handleMode, cancellationToken);
+                traceType, expiredTime, isOrderFiled, handleMode, stepConfig, cancellationToken);
         }
 
         public Task<bool> RecallAsync(Workflow workflow, RecallDto dto, ReverseFlowStepAssignInfo reverseFlowStepAssignInfo,
             WorkflowStep targetStep, EWorkflowTraceType traceType, DateTime? expiredTime, bool isOrderFiled,
-            EHandleMode handleMode, CancellationToken cancellationToken)
+            EHandleMode handleMode, Action<WorkflowStep>? stepConfig = null, CancellationToken cancellationToken = default)
         {
             var targetStepDefine = GetStepDefine(workflow.WorkflowDefinition, dto.NextStepCode);
             if (targetStepDefine.StepType is EStepType.End)
@@ -1512,12 +1505,13 @@ namespace Hotline.FlowEngine.Workflows
 
             return RecallAsync(workflow, dto, reverseFlowStepAssignInfo,
                 targetStepDefine, targetStep, traceType,
-                expiredTime, isOrderFiled, handleMode, cancellationToken);
+                expiredTime, isOrderFiled, handleMode, stepConfig, cancellationToken);
         }
 
         public async Task<bool> RecallAsync(Workflow workflow, RecallDto dto, ReverseFlowStepAssignInfo reverseFlowStepAssignInfo,
-          StepDefine targetStepDefine, WorkflowStep targetStep, EWorkflowTraceType traceType,
-          DateTime? expiredTime, bool isOrderFiled, EHandleMode handleMode, CancellationToken cancellationToken)
+            StepDefine targetStepDefine, WorkflowStep targetStep, EWorkflowTraceType traceType,
+            DateTime? expiredTime, bool isOrderFiled, EHandleMode handleMode, Action<WorkflowStep>? stepConfig = null,
+            CancellationToken cancellationToken = default)
         {
             var targetIsStartStep = targetStepDefine.StepType is EStepType.Start;
             var updateTraces = new List<WorkflowTrace>();
@@ -1623,7 +1617,7 @@ namespace Hotline.FlowEngine.Workflows
                 : (await CreateStepsAsync(workflow, targetStepDefine, targetPrevStep, dto, assigner,
                     stepAssignInfo.FlowAssignType, [stepAssignInfo],
                     null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, true, traceType,
-                    null, expiredTime, cancellationToken: cancellationToken)).First();
+                    null, expiredTime, stepConfig: stepConfig, cancellationToken: cancellationToken)).First();
 
             //更新实际办理节点信息
             workflow.UpdateActualStepWhenAssign(targetStepNew, new FlowStepHandler
@@ -1757,7 +1751,8 @@ namespace Hotline.FlowEngine.Workflows
         /// 特提至中心(优先派单组其次坐席)
         /// </summary>
         /// <returns>true 派单组  false 话务部</returns>
-        public async Task<(bool, Workflow workflow)> RecallToCenterFirstToSendAsync(string workflowId, string opinion, ReverseFlowStepAssignInfo reverseFlowStepAssignInfo,
+        public async Task<(bool, Workflow workflow)> RecallToCenterFirstToSendAsync(string workflowId, string opinion,
+            ReverseFlowStepAssignInfo reverseFlowStepAssignInfo,
             bool isOrderFiled, DateTime? expiredTime, EHandleMode handleMode, CancellationToken cancellationToken)
         {
             var isPaiDan = false;
@@ -1842,7 +1837,7 @@ namespace Hotline.FlowEngine.Workflows
                 //await RecallAsync(workflow, dto, targetStepDefine, flowAssignInfo, EWorkflowTraceType.Recall, expiredTime, isOrderFiled,
                 //   handleMode, cancellationToken);
                 await RecallToStartStepAsync(workflow, opinion, reverseFlowStepAssignInfo, expiredTime, isOrderFiled,
-                      handleMode, cancellationToken);
+                    handleMode, cancellationToken);
                 //isPaiDan = false;
             }
 
@@ -2161,8 +2156,8 @@ namespace Hotline.FlowEngine.Workflows
             //handle pubtrace
             var pubTrace = await _workflowTraceRepository.Queryable()
                 .FirstAsync(d => d.WorkflowId == workflowId
-                          && d.TraceStyle == ETraceStyle.Publish
-                          && d.Status == EWorkflowStepStatus.WaitForAccept, cancellation);
+                                 && d.TraceStyle == ETraceStyle.Publish
+                                 && d.Status == EWorkflowStepStatus.WaitForAccept, cancellation);
             if (pubTrace is not null)
             {
                 pubTrace.OrderPublishId = orderPublishId;
@@ -2400,7 +2395,8 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         private async Task<List<WorkflowStep>> CreateNextStepsAsync(Workflow workflow, WorkflowStep currentStep,
             BasicWorkflowDto dto, StepDefine nextStepDefine, UserInfo assigner, bool isNextDynamic, EFlowAssignType flowAssignType,
-            DateTime? expiredTime, bool isStartCountersign, bool isAutoFillSummaryOpinion = false, CancellationToken cancellationToken = default)
+            DateTime? expiredTime, bool isStartCountersign, bool isAutoFillSummaryOpinion = false,
+            Action<WorkflowStep>? stepConfig = null, CancellationToken cancellationToken = default)
         {
             List<WorkflowStep> nextSteps = new();
             if (currentStep.IsInCountersign())
@@ -2415,7 +2411,7 @@ namespace Hotline.FlowEngine.Workflows
                         {
                             //依据会签策略创建会签下一级节点
                             nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
-                               assigner, flowAssignType, expiredTime, cancellationToken);
+                                assigner, flowAssignType, expiredTime, cancellationToken);
                         }
                         else
                         {
@@ -2464,7 +2460,7 @@ namespace Hotline.FlowEngine.Workflows
             {
                 //依据会签策略创建会签下一级节点
                 nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
-                   assigner, flowAssignType, expiredTime, cancellationToken);
+                    assigner, flowAssignType, expiredTime, cancellationToken);
             }
             else if (isNextDynamic)
             {
@@ -2503,7 +2499,8 @@ namespace Hotline.FlowEngine.Workflows
             UserInfo assigner,
             EFlowAssignType flowAssignType,
             DateTime? expiredTime,
-            CancellationToken cancellationToken)
+            Action<WorkflowStep>? stepConfig = null,
+            CancellationToken cancellationToken = default)
         {
             var handlerType = nextStepDefine.InstancePolicy switch
             {
@@ -2524,7 +2521,7 @@ namespace Hotline.FlowEngine.Workflows
             return await CreateStepsAsync(workflow, nextStepDefine, prevStep, dto, assigner,
                 flowAssignType, dto.NextHandlers, null, EWorkflowStepStatus.WaitForAccept,
                 ECountersignPosition.None, false, EWorkflowTraceType.Normal, handlerType, expiredTime,
-                cancellationToken: cancellationToken);
+                stepConfig: stepConfig, cancellationToken: cancellationToken);
         }
 
         private Task<List<WorkflowStep>> CreateCountersignStepsAsync(
@@ -2535,6 +2532,7 @@ namespace Hotline.FlowEngine.Workflows
             UserInfo assigner,
             EFlowAssignType flowAssignType,
             DateTime? expiredTime,
+            Action<WorkflowStep>? stepConfig = null,
             CancellationToken cancellationToken = default
         )
         {
@@ -2550,7 +2548,7 @@ namespace Hotline.FlowEngine.Workflows
 
             return CreateStepsAsync(workflow, stepDefine, prevStep, dto, assigner, flowAssignType, dto.NextHandlers,
                 countersignId, EWorkflowStepStatus.WaitForAccept, nextStepCountersignPosition,
-                false, EWorkflowTraceType.Normal, handlerType, expiredTime, cancellationToken: cancellationToken);
+                false, EWorkflowTraceType.Normal, handlerType, expiredTime, stepConfig: stepConfig, cancellationToken: cancellationToken);
         }
 
         /// <summary>
@@ -2627,6 +2625,7 @@ namespace Hotline.FlowEngine.Workflows
             {
                 rsp.AddRange(GetStepsCascade(steps, innerStep));
             }
+
             return rsp;
         }
 
@@ -3072,7 +3071,7 @@ namespace Hotline.FlowEngine.Workflows
             var updateTraces = new List<WorkflowTrace>();
 
             //update uncomplete traces
-            var uncompleteTraces = workflow.Traces.Where(d => d.Status != EWorkflowStepStatus.Handled  && d.TraceStyle == ETraceStyle.Flow).ToList();
+            var uncompleteTraces = workflow.Traces.Where(d => d.Status != EWorkflowStepStatus.Handled && d.TraceStyle == ETraceStyle.Flow).ToList();
             if (uncompleteTraces.Any())
             {
                 foreach (var trace in uncompleteTraces)
@@ -3282,6 +3281,7 @@ namespace Hotline.FlowEngine.Workflows
             EWorkflowTraceType traceType,
             DateTime? expiredTime,
             bool isAutoFillSummaryOpinion = false,
+            Action<WorkflowStep>? stepConfig = null,
             CancellationToken cancellationToken = default)
         {
             List<FlowStepHandler> handlers;
@@ -3307,7 +3307,7 @@ namespace Hotline.FlowEngine.Workflows
             return await CreateStepsAsync(workflow, stepDefine, prevStep, dto,
                 assigner, flowAssignType, handlers, null,
                 EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None,
-                true, traceType, null, expiredTime, opinion, cancellationToken);
+                true, traceType, null, expiredTime, opinion, stepConfig, cancellationToken);
         }
 
         private async Task<List<WorkflowStep>> CreateStepsAsync(
@@ -3327,6 +3327,7 @@ namespace Hotline.FlowEngine.Workflows
             EHandlerType? handlerType = null,
             DateTime? expiredTime = null,
             string? opinion = null,
+            Action<WorkflowStep>? stepConfig = null,
             CancellationToken cancellationToken = default
         )
         {
@@ -3338,6 +3339,7 @@ namespace Hotline.FlowEngine.Workflows
                     handler, assigner, dto.NextStepCode, countersignId, stepStatus, csPosition, expiredTime,
                     dto.NextStepName, isOrigin, isMain, handlerType, dto.BusinessType, dto.FlowDirection, opinion);
 
+                stepConfig?.Invoke(step);
                 steps.Add(step);
             }
 
@@ -3356,7 +3358,7 @@ namespace Hotline.FlowEngine.Workflows
         private async Task<WorkflowTrace> CreatePublishTraceAsync(WorkflowTrace endTrace, CancellationToken cancellation)
         {
             var pubTrace = _mapper.Map<WorkflowTrace>(endTrace);
-            
+
             pubTrace.TraceStyle = ETraceStyle.Publish;
             pubTrace.Name = "中心发布";
             pubTrace.Status = EWorkflowStepStatus.WaitForAccept;
@@ -3388,7 +3390,8 @@ namespace Hotline.FlowEngine.Workflows
             return pubTrace;
         }
 
-        private async Task<WorkflowTrace> CreateVisitTraceAsync(WorkflowTrace pubTrace, UserInfo acceptor, string orderVisitId, CancellationToken cancellation)
+        private async Task<WorkflowTrace> CreateVisitTraceAsync(WorkflowTrace pubTrace, UserInfo acceptor, string orderVisitId,
+            CancellationToken cancellation)
         {
             if (string.IsNullOrEmpty(orderVisitId))
                 throw new UserFriendlyException($"参数异常,orderVisitId不能为空, pubTraceId: {pubTrace.Id}");
@@ -3609,7 +3612,8 @@ namespace Hotline.FlowEngine.Workflows
                 {
                     ReverseFlowStepCreationPolicy = EReverseFlowStepCreationPolicy.OriginStep
                 }, stepToDuplicate);
-                var newStep = await DuplicateStepWithTraceAsync(workflow, stepToDuplicate, EWorkflowTraceType.Normal, stepAssignInfo, expireTime, cancellationToken);
+                var newStep = await DuplicateStepWithTraceAsync(workflow, stepToDuplicate, EWorkflowTraceType.Normal, stepAssignInfo, expireTime,
+                    cancellationToken);
 
                 //当topcsStep结束cs时,实际办理节点应该更新为newStep
                 if (startCountersignStep.Id == workflow.TopCountersignStepId)
@@ -3954,6 +3958,84 @@ namespace Hotline.FlowEngine.Workflows
                 cancellationToken);
         }
 
+        private EFlowAssignType SetNextStepAssignInfo(Workflow workflow, WorkflowStep currentStep,
+            BasicWorkflowDto dto, StepDefine nextStepDefine, bool isNextDynamic)
+        {
+            if (nextStepDefine.StepType is EStepType.End) return EFlowAssignType.User;
+
+            if (dto.IsStartCountersign)
+                return GetFlowStepAssignType(dto.HandlerType, dto.NextHandlers.Any());
+
+            if (currentStep.IsInCountersign())
+            {
+                if (currentStep.IsCountersignEndStep)
+                {
+                    //汇总节点(非顶级)
+                    if (!currentStep.IsTopCountersignEndStep(workflow.TopCountersignStepId))
+                    {
+                        if (dto.BackToCountersignEnd)
+                        {
+                            var csStartStep = GetCsLoopStartStep(workflow.Steps, currentStep);
+                            var prevStep = workflow.Steps.FirstOrDefault(d => d.Id == csStartStep.PrevStepId);
+                            if (prevStep is null)
+                                throw new UserFriendlyException("未查询到目标节点的前一节点");
+                            return prevStep.FlowAssignType ?? EFlowAssignType.User;
+                        }
+                    }
+                }
+                else
+                {
+                    if (dto.BackToCountersignEnd)
+                    {
+                        var prevStep = workflow.Steps.FirstOrDefault(d => d.Id == currentStep.PrevStepId);
+                        if (prevStep is null)
+                            throw new UserFriendlyException($"未查询到当前节点的上级节点");
+                        return prevStep.FlowAssignType ?? EFlowAssignType.User;
+                    }
+                    else
+                    {
+                        return GetFlowStepAssignType(dto.HandlerType, dto.NextHandlers.Any());
+                    }
+                }
+            }
+
+            if (isNextDynamic)
+            {
+                switch (currentStep.InstancePolicy)
+                {
+                    case EDynamicPolicy.OrgUpCenterTop:
+                    case EDynamicPolicy.OrgUp:
+                    case EDynamicPolicy.OrgDownCenterTop:
+                    case EDynamicPolicy.OrgDown:
+                    case EDynamicPolicy.ArriveCenter:
+                    case EDynamicPolicy.ArriveOneOrg:
+                        return EFlowAssignType.Org;
+                    case EDynamicPolicy.OrgUpHandleCenterTop:
+                    case EDynamicPolicy.OrgUpHandle:
+                    case EDynamicPolicy.OrgUpLeadCenterTop:
+                    case EDynamicPolicy.OrgUpLead:
+                        return EFlowAssignType.OrgAndRole;
+                    default:
+                        throw new ArgumentOutOfRangeException();
+                }
+            }
+
+            return GetFlowStepAssignType(dto.HandlerType, dto.NextHandlers.Any());
+        }
+
+        public EFlowAssignType GetFlowStepAssignType(EHandlerType handlerType, bool hasNextHandlers)
+        {
+            return handlerType switch
+            {
+                EHandlerType.Role => hasNextHandlers ? EFlowAssignType.User : EFlowAssignType.Role,
+                EHandlerType.OrgLevel => EFlowAssignType.Org,
+                EHandlerType.OrgType => EFlowAssignType.Org,
+                EHandlerType.AssignedUser => EFlowAssignType.User,
+                EHandlerType.AssignedOrg => EFlowAssignType.Org,
+                _ => throw new ArgumentOutOfRangeException(nameof(handlerType), handlerType, null)
+            };
+        }
+
         #endregion
     }
 }

+ 1 - 0
src/Hotline/Orders/IOrderDomainService.cs

@@ -1,6 +1,7 @@
 using Hotline.FlowEngine.Definitions;
 using Hotline.Schedulings;
 using Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Enums.FlowEngine;
 

+ 1 - 0
src/Hotline/Orders/OrderDomainService.cs

@@ -37,6 +37,7 @@ using Hotline.Orders.Notifications;
 using Hotline.Share.Mq;
 using System.Security.Cryptography;
 using Hotline.FlowEngine.Definitions;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Snapshot.Interfaces;
 
 namespace Hotline.Orders;

+ 1 - 0
src/Hotline/Orders/OrderSendBackAudit.cs

@@ -8,6 +8,7 @@ using System.ComponentModel;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 using XF.Domain.Repository;
 
 namespace Hotline.Orders

+ 1 - 0
test/Hotline.Tests/Mock/OrderServiceMock.cs

@@ -9,6 +9,7 @@ using Hotline.Orders;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.File;
 using Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.Snapshot;
 using Hotline.Share.Enums.FlowEngine;

+ 1 - 0
test/Hotline.Tests/Mock/OrderServiceStartWorkflow.cs

@@ -2,6 +2,7 @@
 using Hotline.Api.Controllers;
 using Hotline.Api.Controllers.Snapshot;
 using Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Tools;