xf 4 months ago
parent
commit
76a8cfcab4

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

@@ -6,4 +6,10 @@
 public class RecallDto : BasicWorkflowDto
 public class RecallDto : BasicWorkflowDto
 {
 {
     public string WorkflowId { get; set; }
     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,
                 currentCountersign.End(currentStep.Id, currentStep.Code, currentStep.BusinessType,
                     operatorInfo.UserId, operatorInfo.UserName,
                     operatorInfo.UserId, operatorInfo.UserName,
-                    operatorInfo.OrgId,operatorInfo.OrgName,
+                    operatorInfo.OrgId, operatorInfo.OrgName,
                     operatorInfo.OrgAreaCode, operatorInfo.OrgAreaName);
                     operatorInfo.OrgAreaCode, operatorInfo.OrgAreaName);
 
 
                 await _workflowCountersignRepository.UpdateAsync(currentCountersign, cancellationToken);
                 await _workflowCountersignRepository.UpdateAsync(currentCountersign, cancellationToken);
@@ -1266,64 +1266,6 @@ namespace Hotline.FlowEngine.Workflows
                 .ToListAsync(cancellationToken);
                 .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>
         /// 批量修改工单办理对象
         /// 批量修改工单办理对象
         /// </summary>
         /// </summary>
@@ -1733,13 +1675,13 @@ namespace Hotline.FlowEngine.Workflows
             FlowAssignInfo flowAssignInfo, EWorkflowTraceType traceType, DateTime? expiredTime, bool isOrderFiled,
             FlowAssignInfo flowAssignInfo, EWorkflowTraceType traceType, DateTime? expiredTime, bool isOrderFiled,
             EHandleMode handleMode, CancellationToken cancellationToken)
             EHandleMode handleMode, CancellationToken cancellationToken)
         {
         {
+            if(dto.ReverseFlowStepAssignInfo is null)
+                throw new UserFriendlyException("参数异常,需传入特提目标节点指派策略信息");
+
             var targetStep = workflow.Steps.FirstOrDefault(d => d.Code == dto.NextStepCode && d.IsOrigin);
             var targetStep = workflow.Steps.FirstOrDefault(d => d.Code == dto.NextStepCode && d.IsOrigin);
             if (targetStep is null)
             if (targetStep is null)
                 throw UserFriendlyException.SameMessage("该流程尚未流转至该节点");
                 throw UserFriendlyException.SameMessage("该流程尚未流转至该节点");
 
 
-            //update uncompleted traces
-            //await RecallTraceAsync(workflow.Traces, dto.Opinion, _sessionContext, cancellationToken);
-
             var isOrgToCenter = await RecallAsync(workflow, dto, flowAssignInfo, targetStepDefine, targetStep,
             var isOrgToCenter = await RecallAsync(workflow, dto, flowAssignInfo, targetStepDefine, targetStep,
                 traceType, expiredTime, isOrderFiled, handleMode, cancellationToken);
                 traceType, expiredTime, isOrderFiled, handleMode, cancellationToken);
 
 
@@ -2298,7 +2240,7 @@ namespace Hotline.FlowEngine.Workflows
         }
         }
 
 
         #region private method
         #region private method
-        
+
         /// <summary>
         /// <summary>
         /// 逆向流程指派节点的办理对象
         /// 逆向流程指派节点的办理对象
         /// </summary>
         /// </summary>
@@ -2327,7 +2269,7 @@ namespace Hotline.FlowEngine.Workflows
                     newStep.Assign(targetStep, EFlowAssignType.Role);
                     newStep.Assign(targetStep, EFlowAssignType.Role);
                     break;
                     break;
                 case EReverseFlowStepCreationPolicy.OriginStepOrgAndRole:
                 case EReverseFlowStepCreationPolicy.OriginStepOrgAndRole:
-                    if(string.IsNullOrEmpty(targetStep?.RoleId) || string.IsNullOrEmpty(targetStep?.HandlerOrgId))
+                    if (string.IsNullOrEmpty(targetStep?.RoleId) || string.IsNullOrEmpty(targetStep?.HandlerOrgId))
                         throw new UserFriendlyException("参数异常:原节点办理角色或部门为空");
                         throw new UserFriendlyException("参数异常:原节点办理角色或部门为空");
                     newStep.Assign(targetStep, EFlowAssignType.OrgAndRole);
                     newStep.Assign(targetStep, EFlowAssignType.OrgAndRole);
                     break;
                     break;
@@ -2890,20 +2832,20 @@ namespace Hotline.FlowEngine.Workflows
             newStep.StepExpiredTime = expiredTime;
             newStep.StepExpiredTime = expiredTime;
             newStep.InitId();
             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;
             return newStep;
         }
         }
@@ -3089,19 +3031,10 @@ namespace Hotline.FlowEngine.Workflows
 
 
             await _workflowTraceRepository.AddAsync(trace, cancellationToken);
             await _workflowTraceRepository.AddAsync(trace, cancellationToken);
             workflow.Traces.Add(trace);
             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,
             StepDefine targetStepDefine, WorkflowStep targetStep, EWorkflowTraceType traceType,
             DateTime? expiredTime, bool isOrderFiled, EHandleMode handleMode, CancellationToken cancellationToken)
             DateTime? expiredTime, bool isOrderFiled, EHandleMode handleMode, CancellationToken cancellationToken)
         {
         {
@@ -3202,6 +3135,12 @@ namespace Hotline.FlowEngine.Workflows
                     null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, true, traceType,
                     null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, true, traceType,
                     null, expiredTime, cancellationToken: cancellationToken)).First();
                     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
             workflow.UpdateActualStepWhenAssign(targetStepNew, new FlowStepHandler
             {
             {