|
@@ -62,14 +62,12 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
|
|
|
public async Task<Workflow> CreateWorkflowAsync(WorkflowModule wfModule, string title, string userId,
|
|
|
string userCode,
|
|
|
- string? externalId = null, string? timelimit = null, int? timelimitCount = null, ETimeType? timeType = null,
|
|
|
- DateTime? expiredTime = null, DateTime? nearlyExpiredTime = null,
|
|
|
+ string? externalId = null,
|
|
|
CancellationToken cancellationToken = default)
|
|
|
{
|
|
|
var definition = wfModule.Definition;
|
|
|
if (definition is null)
|
|
|
throw new UserFriendlyException("无效流程模板");
|
|
|
- timelimit ??= "1个自然日";
|
|
|
var workflow = new Workflow
|
|
|
{
|
|
|
Title = title,
|
|
@@ -78,11 +76,11 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
ModuleCode = wfModule.Code,
|
|
|
DefinitionId = definition.Id,
|
|
|
Status = EWorkflowStatus.Runnable,
|
|
|
- TimeLimit = timelimit,
|
|
|
- TimeLimitCount = timelimitCount,
|
|
|
- TimeLimitUnit = timeType,
|
|
|
- ExpiredTime = expiredTime.HasValue ? expiredTime.Value : DateTime.Now.AddDays(1),
|
|
|
- NearlyExpiredTime = nearlyExpiredTime,
|
|
|
+ //TimeLimit = timelimit,
|
|
|
+ //TimeLimitCount = timelimitCount,
|
|
|
+ //TimeLimitUnit = timeType,
|
|
|
+ //ExpiredTime = expiredTime.HasValue ? expiredTime.Value : DateTime.Now.AddDays(1),
|
|
|
+ //NearlyExpiredTime = nearlyExpiredTime,
|
|
|
Steps = new(),
|
|
|
Traces = new(),
|
|
|
WorkflowDefinition = definition,
|
|
@@ -102,7 +100,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
/// </summary>
|
|
|
public async Task StartAsync(Workflow workflow, WorkflowStep startStep, BasicWorkflowDto dto,
|
|
|
StepDefine firstStepDefine, bool isNextDynamic, FlowAssignInfo flowAssignInfo,
|
|
|
- ECounterSignType counterSignType, CancellationToken cancellationToken)
|
|
|
+ ECounterSignType counterSignType, DateTime? expiredTime, CancellationToken cancellationToken)
|
|
|
{
|
|
|
//1. 创建first节点 (和trace)2.办理开始节点
|
|
|
|
|
@@ -124,7 +122,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
}
|
|
|
|
|
|
//firststeps
|
|
|
- var firstSteps = await CreateNextStepsAsync(workflow, startStep, dto, firstStepDefine, isNextDynamic, flowAssignInfo, cancellationToken);
|
|
|
+ var firstSteps = await CreateNextStepsAsync(workflow, startStep, dto, firstStepDefine,
|
|
|
+ isNextDynamic, flowAssignInfo, expiredTime, cancellationToken);
|
|
|
if (firstSteps.Any())
|
|
|
workflow.Steps.AddRange(firstSteps);
|
|
|
|
|
@@ -328,7 +327,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
/// 办理(流转至下一节点)
|
|
|
/// </summary>
|
|
|
public async Task NextAsync(Workflow workflow, WorkflowStep currentStep, NextWorkflowDto dto,
|
|
|
- StepDefine nextStepDefine, bool isNextDynamic, FlowAssignInfo flowAssignInfo, CancellationToken cancellationToken)
|
|
|
+ StepDefine nextStepDefine, bool isNextDynamic, FlowAssignInfo flowAssignInfo,
|
|
|
+ DateTime? expiredTime, CancellationToken cancellationToken)
|
|
|
{
|
|
|
ValidatePermission(workflow, _sessionContext.RequiredOrgId, _sessionContext.RequiredUserId);
|
|
|
//CheckWhetherRunnable(workflow.Status);
|
|
@@ -375,8 +375,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- await HandleStepAsync(currentStep, workflow, dto, flowAssignInfo.FlowAssignType, counterSignType,
|
|
|
- cancellationToken);
|
|
|
+ await HandleStepAsync(currentStep, workflow, dto, flowAssignInfo.FlowAssignType,
|
|
|
+ counterSignType, expiredTime, cancellationToken);
|
|
|
|
|
|
currentStep.IsActualHandled = CheckIsActualHandle(workflow, currentStep, nextStepDefine, dto);
|
|
|
|
|
@@ -476,7 +476,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
|
|
|
//创建下一/N个节点(会签汇总节点:会签未全部办理时不创建,最后一个会签办理节点创建会签汇总节点)
|
|
|
var nextSteps = await CreateNextStepsAsync(workflow, currentStep, dto, nextStepDefine, isNextDynamic,
|
|
|
- flowAssignInfo, cancellationToken);
|
|
|
+ flowAssignInfo, expiredTime, cancellationToken);
|
|
|
|
|
|
//赋值当前节点的下级办理节点
|
|
|
if (dto.IsStartCountersign
|
|
@@ -542,7 +542,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
#endregion
|
|
|
|
|
|
await _mediator.Publish(
|
|
|
- new NextStepNotify(workflow, dto, flowAssignInfo, trace, nextStepDefine, _sessionContext.RequiredOrgId),
|
|
|
+ new NextStepNotify(workflow, dto, flowAssignInfo, trace, nextStepDefine,
|
|
|
+ _sessionContext.RequiredOrgId, expiredTime.HasValue),
|
|
|
cancellationToken);
|
|
|
}
|
|
|
|
|
@@ -703,7 +704,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
/// 撤回(返回到之前任意节点)
|
|
|
/// </summary>
|
|
|
public async Task RecallAsync(Workflow workflow, RecallDto dto, StepDefine targetStepDefine,
|
|
|
- FlowAssignInfo flowAssignInfo, CancellationToken cancellationToken)
|
|
|
+ FlowAssignInfo flowAssignInfo, DateTime? expiredTime, CancellationToken cancellationToken)
|
|
|
{
|
|
|
var targetStep = workflow.Steps.FirstOrDefault(d => d.Code == dto.NextStepCode && d.IsOrigin);
|
|
|
if (targetStep is null)
|
|
@@ -713,7 +714,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
await RecallTraceAsync(workflow.Id, dto.Opinion, cancellationToken);
|
|
|
|
|
|
var isOrgToCenter = await RecallAsync(workflow, dto, flowAssignInfo, targetStepDefine, targetStep,
|
|
|
- EWorkflowTraceStatus.Recall, cancellationToken);
|
|
|
+ EWorkflowTraceStatus.Recall, expiredTime, cancellationToken);
|
|
|
|
|
|
workflow.ResetHandlers(flowAssignInfo.FlowAssignType, flowAssignInfo.HandlerObjects);
|
|
|
|
|
@@ -764,116 +765,116 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
await _mediator.Publish(new RecallNotify(workflow, startStep, dto, isOrgToCenter), cancellationToken);
|
|
|
}
|
|
|
|
|
|
- /// <summary>
|
|
|
- /// 跳转(直接将流程跳转至任意节点)
|
|
|
- /// </summary>
|
|
|
- public async Task JumpAsync(Workflow workflow, RecallDto dto, StepDefine targetStepDefine,
|
|
|
- FlowAssignInfo flowAssignInfo, CancellationToken cancellationToken)
|
|
|
- {
|
|
|
- //todo 跳转至结束节点,(自动办理)
|
|
|
- //if (targetStepDefine.StepType is EStepType.Start or EStepType.End)
|
|
|
- // throw UserFriendlyException.SameMessage("开始/结束节点不支持跳转");
|
|
|
+ ///// <summary>
|
|
|
+ ///// 跳转(直接将流程跳转至任意节点)
|
|
|
+ ///// </summary>
|
|
|
+ //public async Task JumpAsync(Workflow workflow, RecallDto dto, StepDefine targetStepDefine,
|
|
|
+ // FlowAssignInfo flowAssignInfo, CancellationToken cancellationToken)
|
|
|
+ //{
|
|
|
+ // //todo 跳转至结束节点,(自动办理)
|
|
|
+ // //if (targetStepDefine.StepType is EStepType.Start or EStepType.End)
|
|
|
+ // // throw UserFriendlyException.SameMessage("开始/结束节点不支持跳转");
|
|
|
|
|
|
- //update uncompleted traces
|
|
|
- await JumpTraceAsync(workflow.Id, dto, cancellationToken);
|
|
|
+ // //update uncompleted traces
|
|
|
+ // await JumpTraceAsync(workflow.Id, dto, cancellationToken);
|
|
|
|
|
|
- bool isOrgToCenter = false, isCenterToOrg = false;
|
|
|
- var targetStep = workflow.Steps.FirstOrDefault(d => d.Code == dto.NextStepCode && d.IsOrigin);
|
|
|
- if (targetStep == null)
|
|
|
- {
|
|
|
- //向后跳转
|
|
|
-
|
|
|
- //此场景并非按配置流转,默认最靠后的节点做为targetStep的prevStep
|
|
|
- var lastStep = workflow.Steps.Where(d => d.IsOrigin).MaxBy(d => d.CreationTime);
|
|
|
- if (lastStep is null || lastStep.StepType is EStepType.End)
|
|
|
- throw new UserFriendlyException($"流程流转数据异常,未结束流程出现endStep, flowId: {workflow.Id}", "流程流转数据异常");
|
|
|
-
|
|
|
- var targetSteps = await CreateConfigStepsAsync(workflow, targetStepDefine, lastStep, dto,
|
|
|
- flowAssignInfo, EWorkflowTraceStatus.Jump, cancellationToken);
|
|
|
- targetStep = targetSteps.First();
|
|
|
-
|
|
|
- workflow.EndCountersign();
|
|
|
- workflow.ResetOption();
|
|
|
-
|
|
|
- ////更新当前办理节点信息
|
|
|
- //workflow.UpdateWorkflowCurrentStepInfo(dto.IsStartCountersign,
|
|
|
- // _sessionContext.RequiredUserId, _sessionContext.UserName,
|
|
|
- // _sessionContext.RequiredOrgId, _sessionContext.OrgName,
|
|
|
- // _sessionContext.OrgAreaCode, _sessionContext.OrgAreaName,
|
|
|
- // nextStep: targetStep);
|
|
|
-
|
|
|
- //calc workflow expired time
|
|
|
- isCenterToOrg = CheckIfFlowFromCenterToOrg(workflow, targetStep);
|
|
|
- //if (isCenterToOrg)
|
|
|
- // workflow.ExpiredTime = CalculateExpiredTime("");//todo calc expiredTime
|
|
|
-
|
|
|
- #region 补充中间节点处理方案(暂不需要)
|
|
|
-
|
|
|
- //var completeStepCodes = workflow.StepBoxes.Select(d => d.Code);
|
|
|
- //var uncompleteStepDefines = workflow.Definition.Steps.Where(d => !completeStepCodes.Contains(d.Code));
|
|
|
- //创建当前节点与目标节点中间节点
|
|
|
- //var jumpDto = new BasicWorkflowDto
|
|
|
- //{
|
|
|
- // Opinion = "跳转补充"
|
|
|
- //};
|
|
|
-
|
|
|
- //foreach (var stepDefine in uncompleteStepDefines)
|
|
|
- //{
|
|
|
- // var previousStepId = lastStepBox.Steps.Count > 1 ? lastStepBox.Id : lastStepBox.Steps.First().Id;
|
|
|
- // if (dto.TargetStepCode == stepDefine.Code)
|
|
|
- // {
|
|
|
- // await CreateStepAsync(workflow, stepDefine, dto, lastStepBox.Id, previousStepId, cancellationToken);
|
|
|
- // break;
|
|
|
- // }
|
|
|
-
|
|
|
- // //jump业务下,如果当前节点为会签节点,第一个补充节点的subStep.PreviousId无法确定从哪个子节点跳转过来,统一处理为当前节点的stepBox.Id
|
|
|
- // lastStepBox = await CreateStepAsync(workflow, stepDefine, dto, lastStepBox.Id, previousStepId, cancellationToken);
|
|
|
- //}
|
|
|
-
|
|
|
- #endregion
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //返回之前节点
|
|
|
- isOrgToCenter = await RecallAsync(workflow, dto, flowAssignInfo, targetStepDefine, targetStep,
|
|
|
- EWorkflowTraceStatus.Jump, cancellationToken);
|
|
|
- }
|
|
|
+ // bool isOrgToCenter = false, isCenterToOrg = false;
|
|
|
+ // var targetStep = workflow.Steps.FirstOrDefault(d => d.Code == dto.NextStepCode && d.IsOrigin);
|
|
|
+ // if (targetStep == null)
|
|
|
+ // {
|
|
|
+ // //向后跳转
|
|
|
+
|
|
|
+ // //此场景并非按配置流转,默认最靠后的节点做为targetStep的prevStep
|
|
|
+ // var lastStep = workflow.Steps.Where(d => d.IsOrigin).MaxBy(d => d.CreationTime);
|
|
|
+ // if (lastStep is null || lastStep.StepType is EStepType.End)
|
|
|
+ // throw new UserFriendlyException($"流程流转数据异常,未结束流程出现endStep, flowId: {workflow.Id}", "流程流转数据异常");
|
|
|
+
|
|
|
+ // var targetSteps = await CreateConfigStepsAsync(workflow, targetStepDefine, lastStep, dto,
|
|
|
+ // flowAssignInfo, EWorkflowTraceStatus.Jump, cancellationToken);
|
|
|
+ // targetStep = targetSteps.First();
|
|
|
+
|
|
|
+ // workflow.EndCountersign();
|
|
|
+ // workflow.ResetOption();
|
|
|
+
|
|
|
+ // ////更新当前办理节点信息
|
|
|
+ // //workflow.UpdateWorkflowCurrentStepInfo(dto.IsStartCountersign,
|
|
|
+ // // _sessionContext.RequiredUserId, _sessionContext.UserName,
|
|
|
+ // // _sessionContext.RequiredOrgId, _sessionContext.OrgName,
|
|
|
+ // // _sessionContext.OrgAreaCode, _sessionContext.OrgAreaName,
|
|
|
+ // // nextStep: targetStep);
|
|
|
+
|
|
|
+ // //calc workflow expired time
|
|
|
+ // isCenterToOrg = CheckIfFlowFromCenterToOrg(workflow, targetStep);
|
|
|
+ // //if (isCenterToOrg)
|
|
|
+ // // workflow.ExpiredTime = CalculateExpiredTime("");//todo calc expiredTime
|
|
|
+
|
|
|
+ // #region 补充中间节点处理方案(暂不需要)
|
|
|
+
|
|
|
+ // //var completeStepCodes = workflow.StepBoxes.Select(d => d.Code);
|
|
|
+ // //var uncompleteStepDefines = workflow.Definition.Steps.Where(d => !completeStepCodes.Contains(d.Code));
|
|
|
+ // //创建当前节点与目标节点中间节点
|
|
|
+ // //var jumpDto = new BasicWorkflowDto
|
|
|
+ // //{
|
|
|
+ // // Opinion = "跳转补充"
|
|
|
+ // //};
|
|
|
+
|
|
|
+ // //foreach (var stepDefine in uncompleteStepDefines)
|
|
|
+ // //{
|
|
|
+ // // var previousStepId = lastStepBox.Steps.Count > 1 ? lastStepBox.Id : lastStepBox.Steps.First().Id;
|
|
|
+ // // if (dto.TargetStepCode == stepDefine.Code)
|
|
|
+ // // {
|
|
|
+ // // await CreateStepAsync(workflow, stepDefine, dto, lastStepBox.Id, previousStepId, cancellationToken);
|
|
|
+ // // break;
|
|
|
+ // // }
|
|
|
+
|
|
|
+ // // //jump业务下,如果当前节点为会签节点,第一个补充节点的subStep.PreviousId无法确定从哪个子节点跳转过来,统一处理为当前节点的stepBox.Id
|
|
|
+ // // lastStepBox = await CreateStepAsync(workflow, stepDefine, dto, lastStepBox.Id, previousStepId, cancellationToken);
|
|
|
+ // //}
|
|
|
+
|
|
|
+ // #endregion
|
|
|
+ // }
|
|
|
+ // else
|
|
|
+ // {
|
|
|
+ // //返回之前节点
|
|
|
+ // isOrgToCenter = await RecallAsync(workflow, dto, flowAssignInfo, targetStepDefine, targetStep,
|
|
|
+ // EWorkflowTraceStatus.Jump, cancellationToken);
|
|
|
+ // }
|
|
|
|
|
|
- workflow.ResetHandlers(flowAssignInfo.FlowAssignType, flowAssignInfo.HandlerObjects);
|
|
|
- await _workflowRepository.UpdateAsync(workflow, cancellationToken);
|
|
|
+ // workflow.ResetHandlers(flowAssignInfo.FlowAssignType, flowAssignInfo.HandlerObjects);
|
|
|
+ // await _workflowRepository.UpdateAsync(workflow, cancellationToken);
|
|
|
|
|
|
- await _mediator.Publish(
|
|
|
- new JumpNotify(workflow, targetStep, dto, flowAssignInfo, isCenterToOrg, isOrgToCenter),
|
|
|
- cancellationToken);
|
|
|
- }
|
|
|
+ // await _mediator.Publish(
|
|
|
+ // new JumpNotify(workflow, targetStep, dto, flowAssignInfo, isCenterToOrg, isOrgToCenter),
|
|
|
+ // cancellationToken);
|
|
|
+ //}
|
|
|
|
|
|
- /// <summary>
|
|
|
- /// 重办
|
|
|
- /// </summary>
|
|
|
- public async Task RedoAsync(Workflow workflow, RecallDto dto, StepDefine targetStepDefine,
|
|
|
- FlowAssignInfo flowAssignInfo, CancellationToken cancellationToken)
|
|
|
- {
|
|
|
- if (targetStepDefine.StepType is EStepType.Start or EStepType.End)
|
|
|
- throw UserFriendlyException.SameMessage("开始/结束节点不支持重办");
|
|
|
+ ///// <summary>
|
|
|
+ ///// 重办
|
|
|
+ ///// </summary>
|
|
|
+ //public async Task RedoAsync(Workflow workflow, RecallDto dto, StepDefine targetStepDefine,
|
|
|
+ // FlowAssignInfo flowAssignInfo, CancellationToken cancellationToken)
|
|
|
+ //{
|
|
|
+ // if (targetStepDefine.StepType is EStepType.Start or EStepType.End)
|
|
|
+ // throw UserFriendlyException.SameMessage("开始/结束节点不支持重办");
|
|
|
|
|
|
- var targetStepBox = workflow.Steps.FirstOrDefault(d => d.Code == dto.NextStepCode);
|
|
|
- if (targetStepBox is null)
|
|
|
- throw UserFriendlyException.SameMessage("未找到该节点配置");
|
|
|
+ // var targetStepBox = workflow.Steps.FirstOrDefault(d => d.Code == dto.NextStepCode);
|
|
|
+ // if (targetStepBox is null)
|
|
|
+ // throw UserFriendlyException.SameMessage("未找到该节点配置");
|
|
|
|
|
|
- var isOrgToCenter = await RecallAsync(workflow, dto, flowAssignInfo, targetStepDefine, targetStepBox,
|
|
|
- EWorkflowTraceStatus.Redo, cancellationToken);
|
|
|
+ // var isOrgToCenter = await RecallAsync(workflow, dto, flowAssignInfo, targetStepDefine, targetStepBox,
|
|
|
+ // EWorkflowTraceStatus.Redo, cancellationToken);
|
|
|
|
|
|
- workflow.Redo();
|
|
|
- workflow.ResetHandlers(flowAssignInfo.FlowAssignType, flowAssignInfo.HandlerObjects);
|
|
|
+ // workflow.Redo();
|
|
|
+ // workflow.ResetHandlers(flowAssignInfo.FlowAssignType, flowAssignInfo.HandlerObjects);
|
|
|
|
|
|
- //todo calc expiredTime
|
|
|
- //dto.Extension.TimeLimitCount
|
|
|
+ // //todo calc expiredTime
|
|
|
+ // //dto.Extension.TimeLimitCount
|
|
|
|
|
|
|
|
|
- await _workflowRepository.UpdateAsync(workflow, cancellationToken);
|
|
|
+ // await _workflowRepository.UpdateAsync(workflow, cancellationToken);
|
|
|
|
|
|
- await _mediator.Publish(new RedoNotify(workflow, dto, isOrgToCenter), cancellationToken);
|
|
|
- }
|
|
|
+ // await _mediator.Publish(new RedoNotify(workflow, dto, isOrgToCenter), cancellationToken);
|
|
|
+ //}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 否决(审批流程不通过)
|
|
@@ -883,7 +884,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
{
|
|
|
var currentStep = GetUnHandleStep(workflow.Steps, _sessionContext.RequiredOrgId,
|
|
|
_sessionContext.RequiredUserId);
|
|
|
- await HandleStepAsync(currentStep, workflow, dto, null, null, cancellationToken);
|
|
|
+ await HandleStepAsync(currentStep, workflow, dto, null,
|
|
|
+ null, null, cancellationToken);
|
|
|
|
|
|
var endStepDefine = workflow.WorkflowDefinition.FindEndStepDefine();
|
|
|
var endTrace = await EndAsync(workflow, dto, endStepDefine, currentStep, EReviewResult.Failed,
|
|
@@ -1020,20 +1022,20 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
await _mediator.Publish(new CancelWorkflowNotify(workflow), cancellationToken);
|
|
|
}
|
|
|
|
|
|
- /// <summary>
|
|
|
- /// 更新期满时间
|
|
|
- /// </summary>
|
|
|
- public async Task UpdateExpiredTimeAsync(Workflow workflow, DateTime expiredTime, string timelimit,
|
|
|
- int? timelimiteCount,
|
|
|
- ETimeType? timelimitUnit, DateTime nearlyExpiredTime, CancellationToken cancellationToken)
|
|
|
- {
|
|
|
- workflow.ExpiredTime = expiredTime;
|
|
|
- workflow.NearlyExpiredTime = nearlyExpiredTime;
|
|
|
- workflow.TimeLimit = timelimit;
|
|
|
- workflow.TimeLimitUnit = timelimitUnit;
|
|
|
- workflow.TimeLimitCount = timelimiteCount;
|
|
|
- await _workflowRepository.UpdateAsync(workflow, cancellationToken);
|
|
|
- }
|
|
|
+ ///// <summary>
|
|
|
+ ///// 更新期满时间
|
|
|
+ ///// </summary>
|
|
|
+ //public async Task UpdateExpiredTimeAsync(Workflow workflow, DateTime expiredTime, string timelimit,
|
|
|
+ // int? timelimiteCount,
|
|
|
+ // ETimeType? timelimitUnit, DateTime nearlyExpiredTime, CancellationToken cancellationToken)
|
|
|
+ //{
|
|
|
+ // workflow.ExpiredTime = expiredTime;
|
|
|
+ // workflow.NearlyExpiredTime = nearlyExpiredTime;
|
|
|
+ // workflow.TimeLimit = timelimit;
|
|
|
+ // workflow.TimeLimitUnit = timelimitUnit;
|
|
|
+ // workflow.TimeLimitCount = timelimiteCount;
|
|
|
+ // await _workflowRepository.UpdateAsync(workflow, cancellationToken);
|
|
|
+ //}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 新增流程流转记录
|
|
@@ -1051,8 +1053,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
/// <summary>
|
|
|
/// 创建开始节点
|
|
|
/// </summary>
|
|
|
- public WorkflowStep CreateStartStep(Workflow workflow, StepDefine startStepDefine, BasicWorkflowDto dto,
|
|
|
- List<Kv> handles)
|
|
|
+ public WorkflowStep CreateStartStep(Workflow workflow, StepDefine startStepDefine,
|
|
|
+ BasicWorkflowDto dto, List<Kv> handles, DateTime? expiredTime)
|
|
|
{
|
|
|
//startstep
|
|
|
var nextSteps = _mapper.Map<List<StepSimple>>(startStepDefine.NextSteps);
|
|
@@ -1072,7 +1074,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
startStep.IsOrigin = true;
|
|
|
startStep.Status = EWorkflowStepStatus.WaitForHandle;
|
|
|
startStep.PrevChosenStepCode = null;
|
|
|
- startStep.StepExpiredTime = workflow.ExpiredTime;
|
|
|
+ startStep.StepExpiredTime = expiredTime;
|
|
|
|
|
|
startStep.InitId();
|
|
|
return startStep;
|
|
@@ -1087,9 +1089,10 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
#region private method
|
|
|
|
|
|
public async Task<WorkflowStep> CreateStartStepAsync(Workflow workflow, StepDefine startStepDefine,
|
|
|
- BasicWorkflowDto dto, List<Kv> handles, EWorkflowTraceStatus traceStatus, CancellationToken cancellationToken)
|
|
|
+ BasicWorkflowDto dto, List<Kv> handles, EWorkflowTraceStatus traceStatus, DateTime? expiredTime,
|
|
|
+ CancellationToken cancellationToken)
|
|
|
{
|
|
|
- var startStep = CreateStartStep(workflow, startStepDefine, dto, handles);
|
|
|
+ var startStep = CreateStartStep(workflow, startStepDefine, dto, handles, expiredTime);
|
|
|
await _workflowStepRepository.AddAsync(startStep, cancellationToken);
|
|
|
await CreateTraceAsync(workflow, startStep, traceStatus, cancellationToken);
|
|
|
return startStep;
|
|
@@ -1112,8 +1115,9 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
/// <summary>
|
|
|
/// 创建下1/N个节点
|
|
|
/// </summary>
|
|
|
- private async Task<List<WorkflowStep>> CreateNextStepsAsync(Workflow workflow, WorkflowStep currentStep, BasicWorkflowDto dto,
|
|
|
- StepDefine nextStepDefine, bool isNextDynamic, FlowAssignInfo flowAssignInfo, CancellationToken cancellationToken)
|
|
|
+ private async Task<List<WorkflowStep>> CreateNextStepsAsync(Workflow workflow, WorkflowStep currentStep,
|
|
|
+ BasicWorkflowDto dto, StepDefine nextStepDefine, bool isNextDynamic, FlowAssignInfo flowAssignInfo,
|
|
|
+ DateTime? expiredTime, CancellationToken cancellationToken)
|
|
|
{
|
|
|
List<WorkflowStep> nextSteps = new();
|
|
|
if (currentStep.IsInCountersign())
|
|
@@ -1128,13 +1132,13 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
{
|
|
|
//依据会签策略创建会签下一级节点
|
|
|
nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
|
|
|
- flowAssignInfo.FlowAssignType, cancellationToken);
|
|
|
+ flowAssignInfo.FlowAssignType, expiredTime, cancellationToken);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//创建普通节点(根据配置)
|
|
|
nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto,
|
|
|
- flowAssignInfo, EWorkflowTraceStatus.Normal, cancellationToken);
|
|
|
+ flowAssignInfo, EWorkflowTraceStatus.Normal, expiredTime, cancellationToken);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
@@ -1145,8 +1149,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
if (csStartStep is null)
|
|
|
throw new UserFriendlyException("未查询到会签节点");
|
|
|
|
|
|
- nextSteps = await CreateCsEndStepsByPrevStepAsync(workflow, csStartStep, dto,
|
|
|
- cancellationToken);
|
|
|
+ nextSteps = await CreateCsEndStepsByPrevStepAsync(workflow, csStartStep, dto, expiredTime, cancellationToken);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
@@ -1154,14 +1157,13 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
if (dto.BackToCountersignEnd)
|
|
|
{
|
|
|
//todo check if cs all complete, create next
|
|
|
- nextSteps = await CreateCsEndStepsByPrevStepAsync(workflow, currentStep, dto,
|
|
|
- cancellationToken);
|
|
|
+ nextSteps = await CreateCsEndStepsByPrevStepAsync(workflow, currentStep, dto, expiredTime, cancellationToken);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//依据会签策略创建会签下一级节点
|
|
|
nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
|
|
|
- flowAssignInfo.FlowAssignType, cancellationToken);
|
|
|
+ flowAssignInfo.FlowAssignType, expiredTime, cancellationToken);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -1169,19 +1171,19 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
{
|
|
|
//依据会签策略创建会签下一级节点
|
|
|
nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
|
|
|
- flowAssignInfo.FlowAssignType, cancellationToken);
|
|
|
+ flowAssignInfo.FlowAssignType, expiredTime, cancellationToken);
|
|
|
}
|
|
|
else if (isNextDynamic)
|
|
|
{
|
|
|
//创建动态下一级节点
|
|
|
nextSteps = await CreateDynamicStepsAsync(workflow, nextStepDefine, currentStep, dto, flowAssignInfo,
|
|
|
- cancellationToken);
|
|
|
+ expiredTime, cancellationToken);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//创建普通节点(根据配置)
|
|
|
nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto, flowAssignInfo,
|
|
|
- EWorkflowTraceStatus.Normal, cancellationToken);
|
|
|
+ EWorkflowTraceStatus.Normal, expiredTime, cancellationToken);
|
|
|
}
|
|
|
|
|
|
return nextSteps;
|
|
@@ -1193,6 +1195,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
WorkflowStep prevStep,
|
|
|
BasicWorkflowDto dto,
|
|
|
FlowAssignInfo flowAssignInfo,
|
|
|
+ DateTime? expiredTime,
|
|
|
CancellationToken cancellationToken)
|
|
|
{
|
|
|
var handlerType = nextStepDefine.InstancePolicy switch
|
|
@@ -1207,7 +1210,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
|
|
|
return await CreateStepsAsync(workflow, nextStepDefine, prevStep, dto,
|
|
|
flowAssignInfo.FlowAssignType, dto.NextHandlers, null, EWorkflowStepStatus.WaitForAccept,
|
|
|
- ECountersignPosition.None, false, EWorkflowTraceStatus.Normal, handlerType, cancellationToken);
|
|
|
+ ECountersignPosition.None, false, EWorkflowTraceStatus.Normal, handlerType, expiredTime, cancellationToken);
|
|
|
}
|
|
|
|
|
|
private Task<List<WorkflowStep>> CreateCountersignStepsAsync(
|
|
@@ -1216,7 +1219,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
WorkflowStep prevStep,
|
|
|
BasicWorkflowDto dto,
|
|
|
EFlowAssignType flowAssignType,
|
|
|
- //DateTime expiredTime,
|
|
|
+ DateTime? expiredTime,
|
|
|
CancellationToken cancellationToken
|
|
|
)
|
|
|
{
|
|
@@ -1235,14 +1238,14 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
return CreateStepsAsync(workflow, stepDefine, prevStep, dto, flowAssignType, dto.NextHandlers,
|
|
|
countersignId,
|
|
|
EWorkflowStepStatus.WaitForAccept, prevStep.GetNextStepCountersignPosition(),
|
|
|
- false, EWorkflowTraceStatus.Normal, handlerType, cancellationToken);
|
|
|
+ false, EWorkflowTraceStatus.Normal, handlerType, expiredTime, cancellationToken);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 根据传入节点的上一节点创建会签汇总节点(汇总传入节点的前一节点)
|
|
|
/// </summary>
|
|
|
private async Task<List<WorkflowStep>> CreateCsEndStepsByPrevStepAsync(Workflow workflow, WorkflowStep step,
|
|
|
- BasicWorkflowDto dto, CancellationToken cancellationToken)
|
|
|
+ BasicWorkflowDto dto, DateTime? expiredTime, CancellationToken cancellationToken)
|
|
|
{
|
|
|
var prevStep = workflow.Steps.FirstOrDefault(d => d.Id == step.PrevStepId);
|
|
|
if (prevStep is null)
|
|
@@ -1253,7 +1256,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
{
|
|
|
//todo 创建会签汇总节点
|
|
|
var countersignEndStep =
|
|
|
- await CreateCountersignEndStepAsync(prevStep, dto, workflow.ExpiredTime, cancellationToken);
|
|
|
+ await CreateCountersignEndStepAsync(prevStep, dto, expiredTime, cancellationToken);
|
|
|
nextSteps = new List<WorkflowStep> { countersignEndStep };
|
|
|
|
|
|
//create trace
|
|
@@ -1266,7 +1269,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
}
|
|
|
|
|
|
private async Task<WorkflowStep> CreateCountersignEndStepAsync(WorkflowStep countersignStartStep,
|
|
|
- BasicWorkflowDto dto, DateTime expiredTime, CancellationToken cancellationToken)
|
|
|
+ BasicWorkflowDto dto, DateTime? expiredTime, CancellationToken cancellationToken)
|
|
|
{
|
|
|
var csEndStep = _mapper.Map<WorkflowStep>(countersignStartStep);
|
|
|
csEndStep.Status = EWorkflowStepStatus.WaitForAccept;
|
|
@@ -1335,7 +1338,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
/// 办理节点
|
|
|
/// </summary>
|
|
|
public async Task HandleStepAsync(WorkflowStep step, Workflow workflow, BasicWorkflowDto dto,
|
|
|
- EFlowAssignType? flowAssignType, ECounterSignType? counterSignType, CancellationToken cancellationToken)
|
|
|
+ EFlowAssignType? flowAssignType, ECounterSignType? counterSignType, DateTime? expiredTime, CancellationToken cancellationToken)
|
|
|
{
|
|
|
if (step.Status is EWorkflowStepStatus.Handled)
|
|
|
throw UserFriendlyException.SameMessage("当前节点状态已办理");
|
|
@@ -1353,7 +1356,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
!d.IsCompleted() && d.StarterId == _sessionContext.RequiredUserId);
|
|
|
if (exists)
|
|
|
throw new UserFriendlyException("该用户在当前流程存在未结束会签");
|
|
|
- await StartCountersignAsync(workflow, step, dto, flowAssignType, counterSignType, cancellationToken);
|
|
|
+ await StartCountersignAsync(workflow, step, dto, flowAssignType, counterSignType, expiredTime, cancellationToken);
|
|
|
}
|
|
|
|
|
|
//办理参数
|
|
@@ -1396,11 +1399,11 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
/// 开始会签(创建会签数据,更新currentStep会签数据)
|
|
|
/// </summary>
|
|
|
private async Task StartCountersignAsync(Workflow workflow, WorkflowStep startStep, BasicWorkflowDto dto,
|
|
|
- EFlowAssignType? flowAssignType, ECounterSignType? counterSignType, CancellationToken cancellationToken)
|
|
|
+ EFlowAssignType? flowAssignType, ECounterSignType? counterSignType, DateTime? expiredTime, CancellationToken cancellationToken)
|
|
|
{
|
|
|
var countersign = await CreateCountersignAsync(
|
|
|
workflow, startStep, dto.NextHandlers, flowAssignType,
|
|
|
- counterSignType, workflow.ExpiredTime,
|
|
|
+ counterSignType, expiredTime,
|
|
|
startStep.CountersignId, cancellationToken);
|
|
|
startStep.StartCountersign(countersign.Id);
|
|
|
}
|
|
@@ -1491,7 +1494,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
|
|
|
private async Task<WorkflowCountersign> CreateCountersignAsync(
|
|
|
Workflow workflow, WorkflowStep startStep, List<Kv> handlers, EFlowAssignType? flowAssignType,
|
|
|
- ECounterSignType? counterSignType, DateTime expiredTime, string? parentId = null,
|
|
|
+ ECounterSignType? counterSignType, DateTime? expiredTime, string? parentId = null,
|
|
|
CancellationToken cancellationToken = default)
|
|
|
{
|
|
|
var members = handlers.Select(d => new WorkflowCountersignMember
|
|
@@ -1654,8 +1657,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
}
|
|
|
|
|
|
private async Task<bool> RecallAsync(Workflow workflow, BasicWorkflowDto dto, FlowAssignInfo flowAssignInfo,
|
|
|
- StepDefine targetStepDefine, WorkflowStep targetStep,
|
|
|
- EWorkflowTraceStatus traceStatus, CancellationToken cancellationToken)
|
|
|
+ StepDefine targetStepDefine, WorkflowStep targetStep, EWorkflowTraceStatus traceStatus,
|
|
|
+ DateTime? expiredTime, CancellationToken cancellationToken)
|
|
|
{
|
|
|
var targetIsStartStep = targetStepDefine.StepType is EStepType.Start;
|
|
|
|
|
@@ -1682,12 +1685,11 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
workflow.SetStatusRunnable();
|
|
|
|
|
|
var targetStepNew = targetIsStartStep
|
|
|
- ? await CreateStartStepAsync(workflow, targetStepDefine, dto, dto.NextHandlers, traceStatus,
|
|
|
- cancellationToken)
|
|
|
+ ? await CreateStartStepAsync(workflow, targetStepDefine, dto, dto.NextHandlers, traceStatus, expiredTime, cancellationToken)
|
|
|
: (await CreateStepsAsync(workflow, targetStepDefine, targetPrevStep, dto,
|
|
|
flowAssignInfo.FlowAssignType, dto.NextHandlers,
|
|
|
null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, true, traceStatus,
|
|
|
- null, cancellationToken)).First();
|
|
|
+ null, expiredTime, cancellationToken)).First();
|
|
|
|
|
|
|
|
|
//更新当前办理节点信息
|
|
@@ -1767,8 +1769,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
WorkflowStep prevStep,
|
|
|
BasicWorkflowDto dto,
|
|
|
FlowAssignInfo flowAssignInfo,
|
|
|
- //DateTime expiredTime,
|
|
|
EWorkflowTraceStatus traceStatus,
|
|
|
+ DateTime? expiredTime,
|
|
|
CancellationToken cancellationToken)
|
|
|
{
|
|
|
List<Kv> handlers;
|
|
@@ -1792,7 +1794,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
|
|
|
return await CreateStepsAsync(workflow, stepDefine, prevStep, dto, flowAssignInfo.FlowAssignType, handlers,
|
|
|
null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, true, traceStatus,
|
|
|
- null, cancellationToken);
|
|
|
+ null, expiredTime, cancellationToken);
|
|
|
}
|
|
|
|
|
|
private async Task<List<WorkflowStep>> CreateStepsAsync(
|
|
@@ -1805,10 +1807,10 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
string? countersignId,
|
|
|
EWorkflowStepStatus stepStatus,
|
|
|
ECountersignPosition csPosition,
|
|
|
- //DateTime expiredTime,
|
|
|
bool isOrigin,
|
|
|
EWorkflowTraceStatus traceStatus,
|
|
|
EHandlerType? handlerType = null,
|
|
|
+ DateTime? expiredTime = null,
|
|
|
CancellationToken cancellationToken = default
|
|
|
)
|
|
|
{
|
|
@@ -1823,7 +1825,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
{
|
|
|
var step = CreateStep(stepDefine, prevStep, workflow.Id, flowAssignType, new List<Kv> { handler },
|
|
|
dto.NextStepCode, dto.NextMainHandler, countersignId,
|
|
|
- stepStatus, csPosition, workflow.ExpiredTime, dto.NextStepName, isOrigin, handlerType);
|
|
|
+ stepStatus, csPosition, expiredTime, dto.NextStepName, isOrigin, handlerType);
|
|
|
|
|
|
steps.Add(step);
|
|
|
}
|
|
@@ -1832,7 +1834,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
{
|
|
|
var step = CreateStep(stepDefine, prevStep, workflow.Id, flowAssignType, handlers,
|
|
|
dto.NextStepCode, dto.NextMainHandler, countersignId,
|
|
|
- stepStatus, csPosition, workflow.ExpiredTime, dto.NextStepName, isOrigin, handlerType);
|
|
|
+ stepStatus, csPosition, expiredTime, dto.NextStepName, isOrigin, handlerType);
|
|
|
|
|
|
steps.Add(step);
|
|
|
}
|
|
@@ -2089,7 +2091,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
string? countersignId,
|
|
|
EWorkflowStepStatus stepStatus,
|
|
|
ECountersignPosition countersignPosition,
|
|
|
- DateTime expiredTime,
|
|
|
+ DateTime? expiredTime,
|
|
|
string stepName,
|
|
|
bool isOrigin,
|
|
|
EHandlerType? handlerType = null//动态节点依据动态策略判断
|