|
@@ -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
|
|
|
}
|
|
|
}
|