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