xf 4 ماه پیش
والد
کامیت
76a8cfcab4
2فایلهای تغییر یافته به همراه34 افزوده شده و 89 حذف شده
  1. 6 0
      src/Hotline.Share/Dtos/FlowEngine/RecallDto.cs
  2. 28 89
      src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

+ 6 - 0
src/Hotline.Share/Dtos/FlowEngine/RecallDto.cs

@@ -6,4 +6,10 @@
 public class RecallDto : BasicWorkflowDto
 {
     public string WorkflowId { get; set; }
+
+    /// <summary>
+    /// 逆向流程,节点指派方式
+    /// 退回、特提
+    /// </summary>
+    public ReverseFlowStepAssignInfo ReverseFlowStepAssignInfo { get; set; }
 }

+ 28 - 89
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -1097,7 +1097,7 @@ namespace Hotline.FlowEngine.Workflows
                 //结束会签
                 currentCountersign.End(currentStep.Id, currentStep.Code, currentStep.BusinessType,
                     operatorInfo.UserId, operatorInfo.UserName,
-                    operatorInfo.OrgId,operatorInfo.OrgName,
+                    operatorInfo.OrgId, operatorInfo.OrgName,
                     operatorInfo.OrgAreaCode, operatorInfo.OrgAreaName);
 
                 await _workflowCountersignRepository.UpdateAsync(currentCountersign, cancellationToken);
@@ -1266,64 +1266,6 @@ namespace Hotline.FlowEngine.Workflows
                 .ToListAsync(cancellationToken);
         }
 
-        ///// <summary>
-        ///// 批量改变办理对象
-        ///// </summary>
-        //public async Task<ICollection<string>> ChangeHandlerRangeAsync(string sendPoolId,
-        //    IReadOnlyList<(string userId, string username, string orgId, string orgName, IReadOnlyList<string> stepIds)> handlers,
-        //    CancellationToken cancellationToken)
-        //{
-        //    var stepsIds = handlers.SelectMany(d => d.stepIds).ToList();
-        //    var steps = await _workflowStepRepository.Queryable()
-        //        .Includes(d => d.Workflow)
-        //        .Includes(d => d.WorkflowTrace)
-        //        //.Includes(d => d.StepHandlers)
-        //        .Where(d => stepsIds.Contains(d.Id))
-        //        .ToListAsync(cancellationToken);
-        //    foreach (var handler in handlers)
-        //    {
-        //        var thisHandlers = new List<Kv> { new(handler.userId, handler.username) };
-        //        var thisHandlerGroup = new HandlerGroupItem
-        //        {
-        //            GroupId = Guid.NewGuid().ToString(),
-        //            Key = handler.userId,
-        //            Value = handler.username,
-        //        };
-        //        var thisSteps = steps.Where(d => handler.stepIds.Contains(d.Id)).ToList();
-        //        foreach (var thisStep in thisSteps)
-        //        {
-        //            //var stepHandler = WorkflowStepHandler.Create(thisStep.Workflow.Id, thisStep.Workflow.ExternalId,
-        //            //    thisStep.FlowAssignType ?? EFlowAssignType.User, handler.userId, handler.username, handler.orgId, handler.orgName);
-        //            //thisStep.StepHandlers.Clear();
-        //            //thisStep.StepHandlers.Add(stepHandler);
-
-        //            thisStep.Handlers = thisHandlers;
-
-        //            //update trace
-        //            thisStep.WorkflowTrace.Handlers = thisStep.Handlers;
-
-        //            // update workflow
-        //            thisStep.Workflow.FlowedUserIds.Remove(sendPoolId);
-        //            thisStep.Workflow.FlowedUserIds.Add(handler.userId);
-        //            thisStep.Workflow.UpdateHandlers(sendPoolId, null, EFlowAssignType.User,
-        //                new List<HandlerGroupItem> { thisHandlerGroup }, true);
-
-        //            var handlerUser = thisStep.Workflow.HandlerUsers.FirstOrDefault(d => d.Key == sendPoolId);
-        //            if (handlerUser == null) continue;
-        //            handlerUser.Key = handler.userId;
-        //            handlerUser.Value = handler.username;
-        //        }
-        //    }
-
-        //    await _workflowStepRepository.UpdateNav(steps)
-        //        .Include(d => d.WorkflowTrace)
-        //        .Include(d => d.Workflow)
-        //        //.Include(d => d.StepHandlers)
-        //        .ExecuteCommandAsync();
-
-        //    return steps.Select(d => d.WorkflowId).ToList();
-        //}
-
         /// <summary>
         /// 批量修改工单办理对象
         /// </summary>
@@ -1733,13 +1675,13 @@ namespace Hotline.FlowEngine.Workflows
             FlowAssignInfo flowAssignInfo, EWorkflowTraceType traceType, DateTime? expiredTime, bool isOrderFiled,
             EHandleMode handleMode, CancellationToken cancellationToken)
         {
+            if(dto.ReverseFlowStepAssignInfo is null)
+                throw new UserFriendlyException("参数异常,需传入特提目标节点指派策略信息");
+
             var targetStep = workflow.Steps.FirstOrDefault(d => d.Code == dto.NextStepCode && d.IsOrigin);
             if (targetStep is null)
                 throw UserFriendlyException.SameMessage("该流程尚未流转至该节点");
 
-            //update uncompleted traces
-            //await RecallTraceAsync(workflow.Traces, dto.Opinion, _sessionContext, cancellationToken);
-
             var isOrgToCenter = await RecallAsync(workflow, dto, flowAssignInfo, targetStepDefine, targetStep,
                 traceType, expiredTime, isOrderFiled, handleMode, cancellationToken);
 
@@ -2298,7 +2240,7 @@ namespace Hotline.FlowEngine.Workflows
         }
 
         #region private method
-        
+
         /// <summary>
         /// 逆向流程指派节点的办理对象
         /// </summary>
@@ -2327,7 +2269,7 @@ namespace Hotline.FlowEngine.Workflows
                     newStep.Assign(targetStep, EFlowAssignType.Role);
                     break;
                 case EReverseFlowStepCreationPolicy.OriginStepOrgAndRole:
-                    if(string.IsNullOrEmpty(targetStep?.RoleId) || string.IsNullOrEmpty(targetStep?.HandlerOrgId))
+                    if (string.IsNullOrEmpty(targetStep?.RoleId) || string.IsNullOrEmpty(targetStep?.HandlerOrgId))
                         throw new UserFriendlyException("参数异常:原节点办理角色或部门为空");
                     newStep.Assign(targetStep, EFlowAssignType.OrgAndRole);
                     break;
@@ -2890,20 +2832,20 @@ namespace Hotline.FlowEngine.Workflows
             newStep.StepExpiredTime = expiredTime;
             newStep.InitId();
 
-            //退回场景:指派给原办理人,其余场景:按照原节点原始指派方式复制 //todo 重构为参数传入办理对象
-            if (traceType is EWorkflowTraceType.Previous)
-            {
-                newStep.FlowAssignType = step.FlowAssignType;
-                //newStep.FlowAssignType = EFlowAssignType.User;
-                // 是否中心  临时紧急修改 后续在流程模版定义是否原办理人退回类型 来实现流程 禅道200
-                //newStep.FlowAssignType = step.BusinessType is EBusinessType.Seat or EBusinessType.Send
-                //    ? step.BusinessType is EBusinessType.Send ? EFlowAssignType.User : EFlowAssignType.Role
-                //    : EFlowAssignType.Org;
-                //if (newStep is { FlowAssignType: EFlowAssignType.Role, BusinessType: EBusinessType.Send })
-                //    newStep.FlowAssignType = EFlowAssignType.User;
-
-                newStep.Assign(step.HandlerId, step.HandlerName, step.HandlerOrgId, step.HandlerOrgName, step.RoleId, step.RoleName);
-            }
+            ////退回场景:指派给原办理人,其余场景:按照原节点原始指派方式复制 //todo 重构为参数传入办理对象
+            //if (traceType is EWorkflowTraceType.Previous)
+            //{
+            //    newStep.FlowAssignType = step.FlowAssignType;
+            //    //newStep.FlowAssignType = EFlowAssignType.User;
+            //    // 是否中心  临时紧急修改 后续在流程模版定义是否原办理人退回类型 来实现流程 禅道200
+            //    //newStep.FlowAssignType = step.BusinessType is EBusinessType.Seat or EBusinessType.Send
+            //    //    ? step.BusinessType is EBusinessType.Send ? EFlowAssignType.User : EFlowAssignType.Role
+            //    //    : EFlowAssignType.Org;
+            //    //if (newStep is { FlowAssignType: EFlowAssignType.Role, BusinessType: EBusinessType.Send })
+            //    //    newStep.FlowAssignType = EFlowAssignType.User;
+
+            //    newStep.Assign(step.HandlerId, step.HandlerName, step.HandlerOrgId, step.HandlerOrgName, step.RoleId, step.RoleName);
+            //}
 
             return newStep;
         }
@@ -3089,19 +3031,10 @@ namespace Hotline.FlowEngine.Workflows
 
             await _workflowTraceRepository.AddAsync(trace, cancellationToken);
             workflow.Traces.Add(trace);
+            step.WorkflowTrace = trace;
         }
 
-        private async Task<WorkflowTrace> GetWorkflowTraceAsync(string workflowId, string stepId,
-            CancellationToken cancellationToken)
-        {
-            var parentTrace = await _workflowTraceRepository.GetAsync(d =>
-                d.WorkflowId == workflowId && d.StepId == stepId, cancellationToken);
-            if (parentTrace == null)
-                throw new UserFriendlyException($"未找到对应trace, workflowId: {workflowId}, stepId: {stepId}");
-            return parentTrace;
-        }
-
-        private async Task<bool> RecallAsync(Workflow workflow, BasicWorkflowDto dto, FlowAssignInfo flowAssignInfo,
+        private async Task<bool> RecallAsync(Workflow workflow, RecallDto dto, FlowAssignInfo flowAssignInfo,
             StepDefine targetStepDefine, WorkflowStep targetStep, EWorkflowTraceType traceType,
             DateTime? expiredTime, bool isOrderFiled, EHandleMode handleMode, CancellationToken cancellationToken)
         {
@@ -3202,6 +3135,12 @@ namespace Hotline.FlowEngine.Workflows
                     null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, true, traceType,
                     null, expiredTime, cancellationToken: cancellationToken)).First();
 
+            ReverseFlowAssignStepHandler(dto.ReverseFlowStepAssignInfo, targetStepNew, targetStep);
+            _mapper.Map(targetStepNew, targetStepNew.WorkflowTrace);
+            await _workflowStepRepository.UpdateNav(targetStepNew)
+                .Include(d => d.WorkflowTrace)
+                .ExecuteCommandAsync();
+
             //更新实际办理节点信息
             workflow.UpdateActualStepWhenAssign(targetStepNew, new FlowStepHandler
             {