xf há 4 meses atrás
pai
commit
c1ad2afc70

+ 3 - 3
src/Hotline.Api/Controllers/OrderController.cs

@@ -4684,7 +4684,7 @@ public class OrderController : BaseController
         }
 
         dto.ReverseFlowStepAssignInfo =
-            _orderDomainService.GetOrderPreviousAssignInfo(prevStep.BusinessType, handler is null ? null : new AssignStepHandler
+            _orderDomainService.GetOrderPreviousAssignInfo(prevStep.BusinessType, handler is null ? null : new StepAssignInfo
             {
                 FlowAssignType = EFlowAssignType.User,
                 UserId = handler.UserId,
@@ -4820,7 +4820,7 @@ public class OrderController : BaseController
                         handler = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
                         //sendBack.SendBackData.Handler = handler;
                         sendBack.SendBackData.ReverseFlowStepAssignInfo =
-                            _orderDomainService.GetOrderPreviousAssignInfo(prevStep.BusinessType, handler is null ? null : new AssignStepHandler
+                            _orderDomainService.GetOrderPreviousAssignInfo(prevStep.BusinessType, handler is null ? null : new StepAssignInfo
                             {
                                 FlowAssignType = EFlowAssignType.User,
                                 UserId = handler.UserId,
@@ -4908,7 +4908,7 @@ public class OrderController : BaseController
                             handler = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
                             //sendBack.SendBackData.Handler = handler;
                             sendBack.SendBackData.ReverseFlowStepAssignInfo =
-                                _orderDomainService.GetOrderPreviousAssignInfo(prevStep.BusinessType, handler is null ? null : new AssignStepHandler
+                                _orderDomainService.GetOrderPreviousAssignInfo(prevStep.BusinessType, handler is null ? null : new StepAssignInfo
                                 {
                                     FlowAssignType = EFlowAssignType.User,
                                     UserId = handler.UserId,

+ 2 - 2
src/Hotline.Share/Dtos/FlowEngine/PreviousWorkflowDto.cs

@@ -38,7 +38,7 @@ public class ReverseFlowStepAssignInfo
     /// <summary>
     /// 节点指定办理对象(非指定办理对象时无效)
     /// </summary>
-    public AssignStepHandler? AssignStepHandler { get; set; }
+    public StepAssignInfo? StepAssignInfo { get; set; }
 }
 
 /// <summary>
@@ -82,7 +82,7 @@ public enum EReverseFlowStepCreationPolicy
     OriginDefinition = 30,
 }
 
-public class AssignStepHandler : FlowStepHandler
+public class StepAssignInfo : FlowStepHandler
 {
     public EFlowAssignType FlowAssignType { get; set; }
 }

+ 0 - 14
src/Hotline/FlowEngine/FlowAssignInfo.cs

@@ -84,18 +84,4 @@ public class FlowAssignInfo
             EHandlerType.AssignedOrg => EFlowAssignType.Org,
             _ => throw new ArgumentOutOfRangeException(nameof(handlerType), handlerType, null)
         };
-}
-
-public class StepAssignInfo
-{
-    /// <summary>
-    /// 流程指派类型
-    /// </summary>
-    public EFlowAssignType FlowAssignType { get; set; }
-
-    /// <summary>
-    /// 办理对象
-    /// </summary>
-    public FlowStepHandler Handler { get; set; }
-    
 }

+ 8 - 8
src/Hotline/FlowEngine/Workflows/StepBasicEntity.cs

@@ -524,15 +524,15 @@ public abstract class StepBasicEntity : CreationEntity
         RoleName = step.RoleName;
     }
 
-    public void Assign(ReverseFlowStepAssignInfo assignInfo)
+    public void Assign(StepAssignInfo stepAssignInfo)
     {
-        FlowAssignType = assignInfo.AssignStepHandler?.FlowAssignType;
-        HandlerId = assignInfo.AssignStepHandler?.UserId;
-        HandlerName = assignInfo.AssignStepHandler?.Username;
-        HandlerOrgId = assignInfo.AssignStepHandler?.OrgId;
-        HandlerOrgName = assignInfo.AssignStepHandler?.OrgName;
-        RoleId = assignInfo.AssignStepHandler?.RoleId;
-        RoleName = assignInfo.AssignStepHandler?.RoleName;
+        FlowAssignType = stepAssignInfo?.FlowAssignType;
+        HandlerId = stepAssignInfo?.UserId;
+        HandlerName = stepAssignInfo?.Username;
+        HandlerOrgId = stepAssignInfo?.OrgId;
+        HandlerOrgName = stepAssignInfo?.OrgName;
+        RoleId = stepAssignInfo?.RoleId;
+        RoleName = stepAssignInfo?.RoleName;
     }
 
     public void Assign(StepDefine stepDefine)

+ 126 - 20
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -999,16 +999,23 @@ namespace Hotline.FlowEngine.Workflows
                     prevStep.BusinessType is EBusinessType.Send ? EFlowAssignType.User : EFlowAssignType.Org;
             }
 
+            dto.ReverseFlowStepAssignInfo ??= new ReverseFlowStepAssignInfo
+            {
+                ReverseFlowStepCreationPolicy = 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, dto.ExpiredTime);
-            //退给派单组节点,需按照平均分配原则派给一个派单员 禅道299 TODO
-            if (dto.ReverseFlowStepAssignInfo != null) //todo 改为按策略判断
-            {
-                var handle = dto.ReverseFlowStepAssignInfo.AssignStepHandler;
-                newPrevStep.Assign(handle.UserId, handle.Username, handle.OrgId, handle.OrgName, handle.RoleId, handle.RoleName);
-            }
+            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);
@@ -1060,9 +1067,6 @@ namespace Hotline.FlowEngine.Workflows
         public async Task<EFlowDirection> PreviousAsync(Workflow workflow, PreviousWorkflowDto dto, OperatorInfo operatorInfo,
             CancellationToken cancellationToken)
         {
-            if (dto.ReverseFlowStepAssignInfo is null)
-                throw new UserFriendlyException("参数异常,需传入退回目标节点指派策略信息");
-
             //ValidatePermission(workflow, operater.OrgId, operater.Id);
             if (string.IsNullOrEmpty(operatorInfo.UserId)
                 && string.IsNullOrEmpty(operatorInfo.OrgId)
@@ -1133,17 +1137,28 @@ namespace Hotline.FlowEngine.Workflows
             //        prevStep.BusinessType is EBusinessType.Send ? EFlowAssignType.User : EFlowAssignType.Org;
             //}
 
+            dto.ReverseFlowStepAssignInfo ??= new ReverseFlowStepAssignInfo
+            {
+                ReverseFlowStepCreationPolicy = EReverseFlowStepCreationPolicy.OriginStepUser
+            };
+            var prevStepDefine = workflow.WorkflowDefinition.FindStepDefine(prevStep.Code);
+            var stepAssignInfo = GetStepAssignInfo(dto.ReverseFlowStepAssignInfo, prevStep, prevStepDefine);
+
             //复制上一个节点为待接办
-            var newPrevStep = DuplicateStep(prevStep, EWorkflowTraceType.Previous, dto.ExpiredTime);
+            var newPrevStep = DuplicateStep(prevStep, EWorkflowTraceType.Previous, stepAssignInfo, dto.ExpiredTime);
             ////退给派单组节点,需按照平均分配原则派给一个派单员 禅道299 TODO
             //if (dto.ReverseFlowStepAssignInfo != null) //todo 改为按策略判断
             //{
-            //    var handle = dto.ReverseFlowStepAssignInfo.AssignStepHandler;
+            //    var handle = dto.ReverseFlowStepAssignInfo.StepAssignInfo;
             //    newPrevStep.Assign(handle.UserId, handle.Username, handle.OrgId, handle.OrgName, handle.RoleId, handle.RoleName);
             //}
 
-            var prevStepDefine = workflow.WorkflowDefinition.FindStepDefine(prevStep.Code);
-            ReverseFlowAssignStepHandler(dto.ReverseFlowStepAssignInfo, newPrevStep, prevStep, prevStepDefine);
+            //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);
@@ -1679,7 +1694,7 @@ namespace Hotline.FlowEngine.Workflows
             FlowAssignInfo flowAssignInfo, EWorkflowTraceType traceType, DateTime? expiredTime, bool isOrderFiled,
             EHandleMode handleMode, CancellationToken cancellationToken)
         {
-            if(dto.ReverseFlowStepAssignInfo is null)
+            if (dto.ReverseFlowStepAssignInfo is null)
                 throw new UserFriendlyException("参数异常,需传入特提目标节点指派策略信息");
 
             var targetStep = workflow.Steps.FirstOrDefault(d => d.Code == dto.NextStepCode && d.IsOrigin);
@@ -2245,10 +2260,96 @@ namespace Hotline.FlowEngine.Workflows
 
         #region private method
 
+        private StepAssignInfo GetStepAssignInfo(ReverseFlowStepAssignInfo assignInfo,
+            WorkflowStep? targetStep = null, StepDefine? targetStepDefine = null)
+        {
+            switch (assignInfo.ReverseFlowStepCreationPolicy)
+            {
+                case EReverseFlowStepCreationPolicy.OriginStep:
+                    if (targetStep is null)
+                        throw new UserFriendlyException("参数异常:原节点信息为空");
+                    return GetStepAssignInfo(targetStep);
+                case EReverseFlowStepCreationPolicy.OriginStepUser:
+                    if (string.IsNullOrEmpty(targetStep?.HandlerId))
+                        throw new UserFriendlyException("参数异常:原节点办理人为空");
+                    return GetStepAssignInfo(targetStep, EFlowAssignType.User);
+                case EReverseFlowStepCreationPolicy.OriginStepOrg:
+                    if (string.IsNullOrEmpty(targetStep?.HandlerOrgId))
+                        throw new UserFriendlyException("参数异常:原节点办理部门为空");
+                    return GetStepAssignInfo(targetStep, EFlowAssignType.Org);
+                case EReverseFlowStepCreationPolicy.OriginStepRole:
+                    if (string.IsNullOrEmpty(targetStep?.RoleId))
+                        throw new UserFriendlyException("参数异常:原节点办理角色为空");
+                    return GetStepAssignInfo(targetStep, EFlowAssignType.Role);
+                case EReverseFlowStepCreationPolicy.OriginStepOrgAndRole:
+                    if (string.IsNullOrEmpty(targetStep?.RoleId) || string.IsNullOrEmpty(targetStep?.HandlerOrgId))
+                        throw new UserFriendlyException("参数异常:原节点办理角色或部门为空");
+                    return GetStepAssignInfo(targetStep, EFlowAssignType.OrgAndRole);
+                case EReverseFlowStepCreationPolicy.AssignHandler:
+                    if (assignInfo?.StepAssignInfo is null)
+                        throw new UserFriendlyException("参数异常:节点指定办理对象信息为空");
+                    return assignInfo.StepAssignInfo;
+                case EReverseFlowStepCreationPolicy.OriginDefinition:
+                    if (targetStepDefine is null)
+                        throw new UserFriendlyException("参数异常:节点配置信息为空");
+                    return GetStepAssignInfo(targetStepDefine);
+                default:
+                    throw new ArgumentOutOfRangeException();
+            }
+        }
+
+        private StepAssignInfo GetStepAssignInfo(StepDefine stepDefine)
+        {
+            var handler = stepDefine.HandlerTypeItems.FirstOrDefault();
+            if (handler is null)
+                throw new UserFriendlyException($"未正确配置节点办理对象, stepcode: {stepDefine.Code}", "未正确配置节点办理对象");
+            var rsp = new StepAssignInfo();
+            switch (stepDefine.HandlerType)
+            {
+                case EHandlerType.Role:
+                    rsp.FlowAssignType = EFlowAssignType.Role;
+                    rsp.RoleId = handler.Key;
+                    rsp.RoleName = handler.Value;
+                    break;
+                case EHandlerType.AssignedUser:
+                    rsp.FlowAssignType = EFlowAssignType.User;
+                    rsp.UserId = handler.Key;
+                    rsp.Username = handler.Value;
+                    break;
+                case EHandlerType.AssignedOrg:
+                    rsp.FlowAssignType = EFlowAssignType.Org;
+                    rsp.OrgId = handler.Key;
+                    rsp.OrgName = handler.Value;
+                    break;
+                case EHandlerType.OrgType:
+                    throw new ArgumentOutOfRangeException("部门类型不支持按配置指派");
+                case EHandlerType.OrgLevel:
+                    throw new ArgumentOutOfRangeException("部门等级不支持按配置指派");
+                default:
+                    throw new ArgumentOutOfRangeException();
+            }
+
+            return rsp;
+        }
+
+        private StepAssignInfo GetStepAssignInfo(WorkflowStep targetStep, EFlowAssignType? flowAssignType = null)
+        {
+            return new StepAssignInfo
+            {
+                FlowAssignType = (flowAssignType ?? targetStep.FlowAssignType) ?? EFlowAssignType.User,
+                UserId = targetStep.HandlerId,
+                Username = targetStep.HandlerName,
+                OrgId = targetStep.HandlerOrgId,
+                OrgName = targetStep.HandlerOrgName,
+                RoleId = targetStep.RoleId,
+                RoleName = targetStep.RoleName,
+            };
+        }
+
         /// <summary>
         /// 逆向流程指派节点的办理对象
         /// </summary>
-        private void ReverseFlowAssignStepHandler(ReverseFlowStepAssignInfo assignInfo, 
+        private void ReverseFlowAssignStepHandler(ReverseFlowStepAssignInfo assignInfo,
             WorkflowStep newStep, WorkflowStep? targetStep = null, StepDefine? targetStepDefine = null)
         {
             switch (assignInfo.ReverseFlowStepCreationPolicy)
@@ -2279,12 +2380,12 @@ namespace Hotline.FlowEngine.Workflows
                     newStep.Assign(targetStep, EFlowAssignType.OrgAndRole);
                     break;
                 case EReverseFlowStepCreationPolicy.AssignHandler:
-                    if (assignInfo.AssignStepHandler is null)
+                    if (assignInfo?.StepAssignInfo is null)
                         throw new UserFriendlyException("参数异常:节点指定办理对象信息为空");
-                    newStep.Assign(assignInfo);
+                    newStep.Assign(assignInfo.StepAssignInfo);
                     break;
                 case EReverseFlowStepCreationPolicy.OriginDefinition:
-                    if(targetStepDefine is null)
+                    if (targetStepDefine is null)
                         throw new UserFriendlyException("参数异常:节点配置信息为空");
                     newStep.Assign(targetStepDefine);
                     break;
@@ -2826,7 +2927,7 @@ namespace Hotline.FlowEngine.Workflows
             return newStep;
         }
 
-        private WorkflowStep DuplicateStep(WorkflowStep step, EWorkflowTraceType traceType, DateTime? expiredTime)
+        private WorkflowStep DuplicateStep(WorkflowStep step, EWorkflowTraceType traceType, StepAssignInfo? stepAssignInfo, DateTime? expiredTime)
         {
             var newStep = _mapper.Map<WorkflowStep>(step);
             newStep.Reset();
@@ -2842,6 +2943,9 @@ namespace Hotline.FlowEngine.Workflows
             newStep.StepExpiredTime = expiredTime;
             newStep.InitId();
 
+            if (stepAssignInfo is not null)
+                newStep.Assign(stepAssignInfo);
+
             ////退回场景:指派给原办理人,其余场景:按照原节点原始指派方式复制 //todo 重构为参数传入办理对象
             //if (traceType is EWorkflowTraceType.Previous)
             //{
@@ -3137,6 +3241,8 @@ namespace Hotline.FlowEngine.Workflows
                 _sessionContextProvider.SessionContext.OrgIsCenter
             );
 
+            var stepAssignInfo = GetStepAssignInfo(dto.ReverseFlowStepAssignInfo, targetStep, targetStepDefine);1
+
             var targetStepNew = targetIsStartStep
                 ? await CreateStartStepAsync(workflow, targetStepDefine, dto, assigner,
                     dto.NextHandlers.First(), traceType, expiredTime, flowAssignInfo.FlowAssignType, cancellationToken)

+ 2 - 2
src/Hotline/Orders/IOrderDomainService.cs

@@ -118,11 +118,11 @@ namespace Hotline.Orders
         /// <summary>
         /// 查询退回操作目标节点的指派方式
         /// </summary>
-        ReverseFlowStepAssignInfo GetOrderPreviousAssignInfo(EBusinessType targetStepBusinessType, AssignStepHandler? handler);
+        ReverseFlowStepAssignInfo GetOrderPreviousAssignInfo(EBusinessType targetStepBusinessType, StepAssignInfo? handler);
 
         /// <summary>
         /// 查询特提操作目标节点的指派方式
         /// </summary>
-        ReverseFlowStepAssignInfo GetOrderRecallAssignInfo(EBusinessType targetStepBusinessType, AssignStepHandler? handler);
+        ReverseFlowStepAssignInfo GetOrderRecallAssignInfo(EBusinessType targetStepBusinessType, StepAssignInfo? handler);
     }
 }

+ 5 - 5
src/Hotline/Orders/OrderDomainService.cs

@@ -403,7 +403,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
     /// <summary>
     /// 查询退回操作目标节点的指派方式
     /// </summary>
-    public ReverseFlowStepAssignInfo GetOrderPreviousAssignInfo(EBusinessType targetStepBusinessType, AssignStepHandler? handler)
+    public ReverseFlowStepAssignInfo GetOrderPreviousAssignInfo(EBusinessType targetStepBusinessType, StepAssignInfo? handler)
     {
         //自贡需求:
         // 1. 工单退回、特提、重办到话务部节点时,所有坐席都可以查看和办理
@@ -444,7 +444,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
                         throw new UserFriendlyException("参数异常,退回派单组需要通过平均派单指定办理人");
 
                     rsp.ReverseFlowStepCreationPolicy = EReverseFlowStepCreationPolicy.AssignHandler;
-                    rsp.AssignStepHandler = handler;
+                    rsp.StepAssignInfo = handler;
                 }
                 break;
             case EBusinessType.Department:
@@ -469,7 +469,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
     /// <summary>
     /// 查询特提操作目标节点的指派方式
     /// </summary>
-    public ReverseFlowStepAssignInfo GetOrderRecallAssignInfo(EBusinessType targetStepBusinessType, AssignStepHandler? handler)
+    public ReverseFlowStepAssignInfo GetOrderRecallAssignInfo(EBusinessType targetStepBusinessType, StepAssignInfo? handler)
     {
         //自贡需求:
         // 1. 工单退回、特提、重办到话务部节点时,所有坐席都可以查看和办理
@@ -501,7 +501,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
                 if (_appOptions.Value.IsYiBin && handler is not null)
                 {
                     rsp.ReverseFlowStepCreationPolicy = EReverseFlowStepCreationPolicy.AssignHandler;
-                    rsp.AssignStepHandler = handler;
+                    rsp.StepAssignInfo = handler;
                 }
                 else
                 {
@@ -514,7 +514,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
                     if(handler is null)
                         throw new UserFriendlyException("参数异常,特提派单组需要指定办理人");
                     rsp.ReverseFlowStepCreationPolicy = EReverseFlowStepCreationPolicy.AssignHandler;
-                    rsp.AssignStepHandler = handler;
+                    rsp.StepAssignInfo = handler;
                 }
                 break;
             case EBusinessType.Department: