Browse Source

退回逻辑封装

xf 4 months ago
parent
commit
10ad40331c

+ 58 - 80
src/Hotline.Api/Controllers/OrderController.cs

@@ -543,7 +543,7 @@ public class OrderController : BaseController
             orderVisit.EmployeeId = string.Empty;
         }
 
-        if (order is { FileOrgIsCenter:true, CounterSignType: null } && !order.IsProvince)
+        if (order is { FileOrgIsCenter: true, CounterSignType: null } && !order.IsProvince)
         {
             orderVisit.VisitState = EVisitState.Visited;
             orderVisit.VisitTime = DateTime.Now;
@@ -4684,85 +4684,30 @@ public class OrderController : BaseController
         audit.InitId();
         if (dto.Files.Any())
             audit.FileJson = await _fileRepository.AddFileAsync(dto.Files, audit.Id, "", HttpContext.RequestAborted);
+        FlowStepHandler? handler = null;
         if (_appOptions.Value.IsZiGong && prevStep.BusinessType == EBusinessType.Send)
         {
             // 平均派单
             var averageSendOrder = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.AverageSendOrder).SettingValue[0]);
             if (averageSendOrder)
             {
-                var handler = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
-                dto.Handler = handler;
+                handler = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
+                //dto.Handler = handler;
             }
         }
 
-        //自贡需求:
-        // 1. 工单退回、特提、重办到话务部节点时,所有坐席都可以查看和办理
-        // 2. 退回到派单组时需执行平均分配逻辑
-        //宜宾需求:
-        // 1、退回至话务部:所有坐席都可以查看和办理(除某些场景下本来就需指定办理对象,如:发布时退回……)
-        // 2、退回至派单组:默认退给之前的派单员(除某些场景下本来就需指定办理对象,如:发布时退回……)
-        // 3、话务员特提至话务部:根据特提申请时候选择来,指定的办理对象才能查看和办理
-        // 4、派单员特提至派单组:根据特提申请时候选择来,指定的办理对象才能查看和办理
-        // 5、班长特提至派单组,办理对象必选(已实现)
-        // 6、班长特提至话务部,办理对象非必选,没选择则所有坐席都可以查看和办理
-
-
-        //todo 基本策略:保持原节点
-        //中心领导,部门领导等,原节点策略
-        audit.SendBackData.ReverseFlowStepAssignInfo = new ReverseFlowStepAssignInfo();
-        
-        if (_appOptions.Value.IsZiGong)
-        {
-            if (prevStep.BusinessType == EBusinessType.Seat)
-            {
-                audit.SendBackData.ReverseFlowStepAssignInfo = new ReverseFlowStepAssignInfo
-                {
-                    ReverseFlowStepCreationPolicy = EReverseFlowStepCreationPolicy.OriginStepRole
-                };
-            }
-            else if (prevStep.BusinessType == EBusinessType.Send)
-            {
-                // 平均派单
-                var averageSendOrder = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.AverageSendOrder).SettingValue[0]);
-                if (averageSendOrder)
-                {
-                    var handler = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
-                    audit.SendBackData.ReverseFlowStepAssignInfo.AssignStepHandler = new AssignStepHandler
-                    {
-                        UserId = handler.UserId,
-                        Username = handler.Username,
-                        OrgId = handler.OrgId,
-                        OrgName = handler.OrgName,
-                        RoleId = handler.RoleId,
-                        RoleName = handler.RoleName
-                    };
-                }
-            }
-            else if (prevStep.BusinessType == EBusinessType.Department)
+        dto.ReverseFlowStepAssignInfo =
+            _orderDomainService.GetOrderPreviousAssignInfo(prevStep.BusinessType, handler is null ? null : new AssignStepHandler
             {
-                audit.SendBackData.ReverseFlowStepAssignInfo = new ReverseFlowStepAssignInfo
-                {
-                    ReverseFlowStepCreationPolicy = EReverseFlowStepCreationPolicy.OriginStepOrg
-                };
-            }
-        }
-        else if(_appOptions.Value.IsYiBin)
-        {
-            if (prevStep.BusinessType == EBusinessType.Seat)
-            {
-                audit.SendBackData.ReverseFlowStepAssignInfo = new ReverseFlowStepAssignInfo
-                {
-                    ReverseFlowStepCreationPolicy = EReverseFlowStepCreationPolicy.OriginStepRole
-                };
-            }
-            else if (prevStep.BusinessType == EBusinessType.Send)
-            {
-                audit.SendBackData.ReverseFlowStepAssignInfo = new ReverseFlowStepAssignInfo
-                {
-                    ReverseFlowStepCreationPolicy = EReverseFlowStepCreationPolicy.OriginStepUser
-                };
-            }
-        }
+                FlowAssignType = EFlowAssignType.User,
+                UserId = handler.UserId,
+                Username = handler.Username,
+                OrgId = handler.OrgId,
+                OrgName = handler.OrgName,
+                RoleId = handler.RoleId,
+                RoleName = handler.RoleName
+            });
+        audit.SendBackData.ReverseFlowStepAssignInfo = dto.ReverseFlowStepAssignInfo;
 
         //todo 需整理各个地市退回业务的需求(指派类型及指派对象)
         //if (workflow.FlowType == EFlowType.Handle) //该逻辑需放在退回操作前依据业务判断
@@ -4804,11 +4749,12 @@ public class OrderController : BaseController
                 audit.State = ESendBackAuditState.End;
                 audit.AuditUser = "默认通过";
                 audit.AuditTime = DateTime.Now;
-                if (prevStep.BusinessType == EBusinessType.Send && dto.Handler != null)
+                if (prevStep.BusinessType == EBusinessType.Send && handler != null)
                 {
-                    await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { CenterToOrgHandlerId = dto.Handler.UserId, CenterToOrgHandlerName = dto.Handler.Username })
+                    await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { CenterToOrgHandlerId = handler.UserId, CenterToOrgHandlerName = handler.Username })
                         .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
                 }
+
                 var flowDirection = await _workflowApplication.PreviousAsync(dto, HttpContext.RequestAborted);
                 var processType = flowDirection == EFlowDirection.OrgToCenter || flowDirection == EFlowDirection.CenterToCenter
                     ? EProcessType.Zhiban
@@ -4825,9 +4771,9 @@ public class OrderController : BaseController
             audit.State = ESendBackAuditState.End;
             audit.AuditUser = "默认通过";
             audit.AuditTime = DateTime.Now;
-            if (prevStep.BusinessType == EBusinessType.Send && dto.Handler != null)
+            if (prevStep.BusinessType == EBusinessType.Send && handler != null)
             {
-                await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { CenterToOrgHandlerId = dto.Handler.UserId, CenterToOrgHandlerName = dto.Handler.Username })
+                await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { CenterToOrgHandlerId = handler.UserId, CenterToOrgHandlerName = handler.Username })
                     .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
             }
             var flowDirection = await _workflowApplication.PreviousAsync(dto, HttpContext.RequestAborted);
@@ -4876,16 +4822,33 @@ public class OrderController : BaseController
                 var (currentStep, prevStep, isOrgToCenter, isSecondToFirstOrgLevel) = await _workflowApplication.GetPreviousInformationAsync(
                     order.WorkflowId, sendBack.WorkflowUserId, sendBack.WorkflowOrgId, sendBack.WorkflowRoleIds.ToArray(),
                     HttpContext.RequestAborted);
+
                 if (prevStep.BusinessType == EBusinessType.Send)
                 {
+                    FlowStepHandler? handler = null;
                     // 平均派单
                     var averageSendOrder = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.AverageSendOrder).SettingValue[0]);
                     if (averageSendOrder)
                     {
-                        var handler = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
-                        sendBack.SendBackData.Handler = handler;
+                        handler = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
+                        //sendBack.SendBackData.Handler = handler;
+                        sendBack.SendBackData.ReverseFlowStepAssignInfo =
+                            _orderDomainService.GetOrderPreviousAssignInfo(prevStep.BusinessType, handler is null ? null : new AssignStepHandler
+                            {
+                                FlowAssignType = EFlowAssignType.User,
+                                UserId = handler.UserId,
+                                Username = handler.Username,
+                                OrgId = handler.OrgId,
+                                OrgName = handler.OrgName,
+                                RoleId = handler.RoleId,
+                                RoleName = handler.RoleName
+                            });
                     }
-                    await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { CenterToOrgHandlerId = sendBack.SendBackData.Handler.UserId, CenterToOrgHandlerName = sendBack.SendBackData.Handler.Username })
+                    await _orderRepository.Updateable().SetColumns(o => new Orders.Order()
+                    {
+                        CenterToOrgHandlerId = handler.UserId,
+                        CenterToOrgHandlerName = handler.Username
+                    })
                         .Where(o => o.Id == sendBack.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
                 }
             }
@@ -4950,14 +4913,29 @@ public class OrderController : BaseController
                         HttpContext.RequestAborted);
                     if (prevStep.BusinessType == EBusinessType.Send)
                     {
+                        FlowStepHandler? handler = null;
                         // 平均派单
                         var averageSendOrder = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.AverageSendOrder).SettingValue[0]);
                         if (averageSendOrder)
                         {
-                            var handler = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
-                            sendBack.SendBackData.Handler = handler;
+                            handler = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
+                            //sendBack.SendBackData.Handler = handler;
+                            sendBack.SendBackData.ReverseFlowStepAssignInfo =
+                                _orderDomainService.GetOrderPreviousAssignInfo(prevStep.BusinessType, handler is null ? null : new AssignStepHandler
+                                {
+                                    FlowAssignType = EFlowAssignType.User,
+                                    UserId = handler.UserId,
+                                    Username = handler.Username,
+                                    OrgId = handler.OrgId,
+                                    OrgName = handler.OrgName,
+                                    RoleId = handler.RoleId,
+                                    RoleName = handler.RoleName
+                                });
                         }
-                        await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { CenterToOrgHandlerId = sendBack.SendBackData.Handler.UserId, CenterToOrgHandlerName = sendBack.SendBackData.Handler.Username })
+                        await _orderRepository.Updateable().SetColumns(o => new Orders.Order()
+                            {
+                                CenterToOrgHandlerId = handler.UserId, CenterToOrgHandlerName = handler.Username
+                            })
                             .Where(o => o.Id == sendBack.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
                     }
                 }

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

@@ -66,6 +66,11 @@ public enum EReverseFlowStepCreationPolicy
     /// </summary>
     OriginStepRole = 4,
 
+    /// <summary>
+    /// 指派给原节点办理部门及角色
+    /// </summary>
+    OriginStepOrgAndRole = 5,
+
     /// <summary>
     /// 指定办理对象
     /// </summary>

+ 3 - 0
src/Hotline.Share/Enums/FlowEngine/EBusinessType.cs

@@ -33,4 +33,7 @@ public enum EBusinessType
     /// </summary>
     [Description("归档节点")]
     File = 99,
+
+    [Description("其他")]
+    Unknown = 100,
 }

+ 5 - 0
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -2326,6 +2326,11 @@ namespace Hotline.FlowEngine.Workflows
                         throw new UserFriendlyException("参数异常:原节点办理角色为空");
                     newStep.Assign(targetStep, EFlowAssignType.Role);
                     break;
+                case EReverseFlowStepCreationPolicy.OriginStepOrgAndRole:
+                    if(string.IsNullOrEmpty(targetStep?.RoleId) || string.IsNullOrEmpty(targetStep?.HandlerOrgId))
+                        throw new UserFriendlyException("参数异常:原节点办理角色或部门为空");
+                    newStep.Assign(targetStep, EFlowAssignType.OrgAndRole);
+                    break;
                 case EReverseFlowStepCreationPolicy.AssignHandler:
                     if (assignInfo.AssignStepHandler is null)
                         throw new UserFriendlyException("参数异常:节点指定办理对象信息为空");

+ 8 - 10
src/Hotline/Orders/OrderDomainService.cs

@@ -434,16 +434,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
                     throw new UserFriendlyException("参数异常,退回派单组需要通过平均派单指定办理人");
 
                 rsp.ReverseFlowStepCreationPolicy = EReverseFlowStepCreationPolicy.AssignHandler;
-                rsp.AssignStepHandler = new AssignStepHandler
-                {
-                    FlowAssignType = EFlowAssignType.User,
-                    UserId = handler.UserId,
-                    Username = handler.Username,
-                    OrgId = handler.OrgId,
-                    OrgName = handler.OrgName,
-                    RoleId = handler.RoleId,
-                    RoleName = handler.RoleName
-                };
+                rsp.AssignStepHandler = handler;
             }
             else if (targetStepBusinessType == EBusinessType.Department)
             {
@@ -452,6 +443,13 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
                     ReverseFlowStepCreationPolicy = EReverseFlowStepCreationPolicy.OriginStepOrg
                 };
             }
+            else if (targetStepBusinessType == EBusinessType.DepartmentLeader)
+            {
+                rsp = new ReverseFlowStepAssignInfo
+                {
+                    ReverseFlowStepCreationPolicy = EReverseFlowStepCreationPolicy.OriginStepOrgAndRole
+                };
+            }
         }
         else if (_appOptions.Value.IsYiBin)
         {