|
@@ -97,35 +97,9 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
{
|
|
|
//1. 创建first节点 (和trace)2.办理开始节点
|
|
|
|
|
|
- ////startstep
|
|
|
- //var nextSteps = _mapper.Map<List<StepSimple>>(startStepDefine.NextSteps);
|
|
|
- //nextSteps.First(d => d.Code == dto.NextStepCode).Selected = true;
|
|
|
- //var startStep = new WorkflowStep
|
|
|
- //{
|
|
|
- // WorkflowId = workflow.Id,
|
|
|
- // Handlers = new List<Kv> { new(_sessionContext.RequiredUserId, _sessionContext.UserName) },
|
|
|
- // NextSteps = nextSteps,
|
|
|
- // IsMain = true,
|
|
|
- // IsOrigin = true,
|
|
|
- // Status = EWorkflowStepStatus.WaitForHandle,
|
|
|
- // PrevChosenStepCode = null,
|
|
|
- //};
|
|
|
- //var startDefine = workflow.WorkflowDefinition.FindStartStepDefine();
|
|
|
- //_mapper.Map(startDefine, startStep);
|
|
|
- //await _workflowStepRepository.AddAsync(startStep, cancellationToken);
|
|
|
- //workflow.Steps.Add(startStep);
|
|
|
-
|
|
|
- ////starttrace
|
|
|
- //var startTrace = _mapper.Map<WorkflowTrace>(startStep);
|
|
|
- //startTrace.StepId = startStep.Id;
|
|
|
- //startTrace.Status = EWorkflowTraceStatus.Normal;
|
|
|
- //_mapper.Map(dto, startTrace);
|
|
|
- //await _workflowTraceRepository.AddAsync(startTrace, cancellationToken);
|
|
|
- //workflow.Traces.Add(startTrace);
|
|
|
-
|
|
|
//firststeps
|
|
|
- var firstSteps = await CreateNextStepsAsync(workflow, firstStepDefine, startStep, dto, workflow.ExpiredTime,
|
|
|
- cancellationToken);
|
|
|
+ var firstSteps = await CreateNextStepsAsync(workflow, firstStepDefine, startStep, dto, flowAssignInfo,
|
|
|
+ workflow.ExpiredTime, cancellationToken);
|
|
|
if (firstSteps.Any())
|
|
|
workflow.Steps.AddRange(firstSteps);
|
|
|
|
|
@@ -390,7 +364,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
workflow.CenterToOrg(CalculateExpiredTime(workflow.WorkflowDefinition.Code));//todo 过期时间
|
|
|
|
|
|
//创建下一/N个节点(会签汇总节点:会签未全部办理时不创建,最后一个会签办理节点创建会签汇总节点)
|
|
|
- var nextSteps = await CreateNextStepsAsync(workflow, nextStepDefine, currentStep, dto, dto.StepExpiredTime, cancellationToken);
|
|
|
+ var nextSteps = await CreateNextStepsAsync(workflow, nextStepDefine, currentStep, dto, flowAssignInfo,
|
|
|
+ dto.StepExpiredTime, cancellationToken);
|
|
|
|
|
|
//赋值当前节点的下级办理节点
|
|
|
if (dto.IsStartCountersign
|
|
@@ -450,7 +425,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
/// 创建下1/N个节点
|
|
|
/// </summary>
|
|
|
private async Task<List<WorkflowStep>> CreateNextStepsAsync(Workflow workflow, StepDefine nextStepDefine,
|
|
|
- WorkflowStep currentStep, BasicWorkflowDto dto, DateTime expiredTime, CancellationToken cancellationToken)
|
|
|
+ WorkflowStep currentStep, BasicWorkflowDto dto, FlowAssignInfo flowAssignInfo, DateTime expiredTime,
|
|
|
+ CancellationToken cancellationToken)
|
|
|
{
|
|
|
List<WorkflowStep> nextSteps = new();
|
|
|
if (currentStep.IsInCountersign())
|
|
@@ -465,12 +441,13 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
{
|
|
|
//todo 依据会签策略创建会签下一级节点
|
|
|
nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
|
|
|
- expiredTime, cancellationToken);
|
|
|
+ flowAssignInfo.FlowAssignType, expiredTime, cancellationToken);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//todo 创建普通节点(根据配置)
|
|
|
- nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto, expiredTime, cancellationToken);
|
|
|
+ nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto,
|
|
|
+ flowAssignInfo, expiredTime, cancellationToken);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
@@ -481,7 +458,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
if (csStartStep is null)
|
|
|
throw new UserFriendlyException("未查询到会签节点");
|
|
|
|
|
|
- nextSteps = await CreateCsEndStepsByPrevStepAsync(workflow, csStartStep, dto, expiredTime, cancellationToken);
|
|
|
+ nextSteps = await CreateCsEndStepsByPrevStepAsync(workflow, csStartStep, dto, expiredTime,
|
|
|
+ cancellationToken);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
@@ -489,33 +467,35 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
if (dto.BackToCountersignEnd)
|
|
|
{
|
|
|
//todo check if cs all complete, create next
|
|
|
- nextSteps = await CreateCsEndStepsByPrevStepAsync(workflow, currentStep, dto, expiredTime, cancellationToken);
|
|
|
+ nextSteps = await CreateCsEndStepsByPrevStepAsync(workflow, currentStep, dto, expiredTime,
|
|
|
+ cancellationToken);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//todo 依据会签策略创建会签下一级节点
|
|
|
nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
|
|
|
- expiredTime, cancellationToken);
|
|
|
+ flowAssignInfo.FlowAssignType, expiredTime, cancellationToken);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- else if (dto.IsStartCountersign)//top
|
|
|
+ else if (dto.IsStartCountersign) //top
|
|
|
{
|
|
|
//todo 依据会签策略创建会签下一级节点
|
|
|
nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
|
|
|
- expiredTime, cancellationToken);
|
|
|
+ flowAssignInfo.FlowAssignType, expiredTime, cancellationToken);
|
|
|
}
|
|
|
else if (currentStep.InstanceMode is EInstanceMode.Dynamic && !currentStep.DynamicShouldTerminal())
|
|
|
{
|
|
|
//todo 创建动态下一级节点
|
|
|
- nextSteps = await CreateStepsAsync(workflow, nextStepDefine, currentStep, dto, dto.NextHandlers,
|
|
|
- null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None,
|
|
|
- expiredTime, false, cancellationToken);
|
|
|
+ nextSteps = await CreateStepsAsync(workflow, nextStepDefine, currentStep, dto,
|
|
|
+ flowAssignInfo.FlowAssignType, dto.NextHandlers, null, EWorkflowStepStatus.WaitForAccept,
|
|
|
+ ECountersignPosition.None, expiredTime, false, cancellationToken);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//todo 创建普通节点(根据配置)
|
|
|
- nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto, expiredTime, cancellationToken);
|
|
|
+ nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto, flowAssignInfo,
|
|
|
+ expiredTime, cancellationToken);
|
|
|
}
|
|
|
|
|
|
return nextSteps;
|
|
@@ -526,13 +506,14 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
StepDefine stepDefine,
|
|
|
WorkflowStep prevStep,
|
|
|
BasicWorkflowDto dto,
|
|
|
+ EFlowAssignType flowAssignType,
|
|
|
DateTime expiredTime,
|
|
|
CancellationToken cancellationToken
|
|
|
)
|
|
|
{
|
|
|
var countersignId = prevStep.IsStartCountersign ? prevStep.StartCountersignId : prevStep.CountersignId;
|
|
|
|
|
|
- return CreateStepsAsync(workflow, stepDefine, prevStep, dto, dto.NextHandlers, countersignId,
|
|
|
+ return CreateStepsAsync(workflow, stepDefine, prevStep, dto, flowAssignType, dto.NextHandlers, countersignId,
|
|
|
EWorkflowStepStatus.WaitForAccept, prevStep.GetNextStepCountersignPosition(),
|
|
|
expiredTime, false, cancellationToken);
|
|
|
}
|
|
@@ -649,7 +630,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
//update uncompleted traces
|
|
|
await RecallTraceAsync(workflow.Id, dto.Opinion, cancellationToken);
|
|
|
|
|
|
- var isOrgToCenter = await RecallAsync(workflow, dto, targetStepDefine, targetStep, EWorkflowTraceStatus.Recall, cancellationToken);
|
|
|
+ var isOrgToCenter = await RecallAsync(workflow, dto, flowAssignInfo, targetStepDefine, targetStep,
|
|
|
+ EWorkflowTraceStatus.Recall, cancellationToken);
|
|
|
|
|
|
workflow.ResetHandlers(flowAssignInfo.FlowAssignType, flowAssignInfo.HandlerObjects);
|
|
|
|
|
@@ -682,7 +664,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
if (lastStep is null || lastStep.StepType is EStepType.End)
|
|
|
throw new UserFriendlyException($"流程流转数据异常,未结束流程出现endStep, flowId: {workflow.Id}", "流程流转数据异常");
|
|
|
|
|
|
- var targetSteps = await CreateConfigStepsAsync(workflow, targetStepDefine, lastStep, dto, workflow.ExpiredTime, cancellationToken);
|
|
|
+ var targetSteps = await CreateConfigStepsAsync(workflow, targetStepDefine, lastStep, dto, flowAssignInfo, workflow.ExpiredTime, cancellationToken);
|
|
|
targetStep = targetSteps.First();
|
|
|
|
|
|
workflow.EndCountersign();
|
|
@@ -724,7 +706,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
else
|
|
|
{
|
|
|
//返回之前节点
|
|
|
- isOrgToCenter = await RecallAsync(workflow, dto, targetStepDefine, targetStep, EWorkflowTraceStatus.Jump, cancellationToken);
|
|
|
+ isOrgToCenter = await RecallAsync(workflow, dto, flowAssignInfo, targetStepDefine, targetStep, EWorkflowTraceStatus.Jump, cancellationToken);
|
|
|
}
|
|
|
|
|
|
workflow.ResetHandlers(flowAssignInfo.FlowAssignType, flowAssignInfo.HandlerObjects);
|
|
@@ -746,7 +728,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
if (targetStepBox is null)
|
|
|
throw UserFriendlyException.SameMessage("未找到该节点配置");
|
|
|
|
|
|
- var isOrgToCenter = await RecallAsync(workflow, dto, 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);
|
|
@@ -1216,7 +1198,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
return parentTrace;
|
|
|
}
|
|
|
|
|
|
- private async Task<bool> RecallAsync(Workflow workflow, BasicWorkflowDto dto, StepDefine targetStepDefine,
|
|
|
+ private async Task<bool> RecallAsync(Workflow workflow, BasicWorkflowDto dto, FlowAssignInfo flowAssignInfo, StepDefine targetStepDefine,
|
|
|
WorkflowStep targetStep, EWorkflowTraceStatus traceStatus, CancellationToken cancellationToken)
|
|
|
{
|
|
|
//get targetStep's previous
|
|
@@ -1239,7 +1221,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
//var targetStepBoxNew = await CreateStepAsync(workflow, targetStepDefine, dto, EWorkflowStepStatus.WaitForAccept,
|
|
|
// targetPrevStepBox, targetPrevStep, traceStatus, workflow.ExpiredTime, cancellationToken);
|
|
|
|
|
|
- var targetStepsNew = await CreateConfigStepsAsync(workflow, targetStepDefine, targetPrevStep, dto, workflow.ExpiredTime, cancellationToken);
|
|
|
+ var targetStepsNew = await CreateConfigStepsAsync(workflow, targetStepDefine, targetPrevStep, dto,
|
|
|
+ flowAssignInfo, workflow.ExpiredTime, cancellationToken);
|
|
|
|
|
|
//更新当前办理节点信息
|
|
|
workflow.UpdateWorkflowCurrentStepInfo(dto.IsStartCountersign, nextStep: targetStepsNew.First());
|
|
@@ -1288,7 +1271,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
|
|
|
var handler = new Kv { Key = _sessionContext.RequiredUserId, Value = _sessionContext.UserName };
|
|
|
|
|
|
- var step = CreateStep(endStepDefine, prevStep, workflow.Id, new List<Kv> { handler },
|
|
|
+ var step = CreateStep(endStepDefine, prevStep, workflow.Id, null, new List<Kv> { handler },
|
|
|
null, null, null,
|
|
|
EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, DateTime.Now, endStepDefine.Name, true);
|
|
|
|
|
@@ -1311,6 +1294,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
StepDefine stepDefine,
|
|
|
WorkflowStep prevStep,
|
|
|
BasicWorkflowDto dto,
|
|
|
+ FlowAssignInfo flowAssignInfo,
|
|
|
DateTime expiredTime,
|
|
|
CancellationToken cancellationToken)
|
|
|
{
|
|
@@ -1326,9 +1310,9 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
handlers = dto.NextHandlers;
|
|
|
}
|
|
|
|
|
|
- return await CreateStepsAsync(workflow, stepDefine, prevStep, dto, handlers, null,
|
|
|
- EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None,
|
|
|
- expiredTime, true, cancellationToken);
|
|
|
+ return await CreateStepsAsync(workflow, stepDefine, prevStep, dto, flowAssignInfo.FlowAssignType, handlers,
|
|
|
+ null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, expiredTime, true,
|
|
|
+ cancellationToken);
|
|
|
}
|
|
|
|
|
|
private async Task<List<WorkflowStep>> CreateStepsAsync(
|
|
@@ -1336,6 +1320,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
StepDefine stepDefine,
|
|
|
WorkflowStep prevStep,
|
|
|
BasicWorkflowDto dto,
|
|
|
+ EFlowAssignType? flowAssignType,
|
|
|
List<Kv> handlers,
|
|
|
string? countersignId,
|
|
|
EWorkflowStepStatus stepStatus,
|
|
@@ -1354,7 +1339,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
{
|
|
|
foreach (var handler in handlers)
|
|
|
{
|
|
|
- var step = CreateStep(stepDefine, prevStep, workflow.Id, new List<Kv> { handler },
|
|
|
+ var step = CreateStep(stepDefine, prevStep, workflow.Id, flowAssignType, new List<Kv> { handler },
|
|
|
dto.NextStepCode, dto.NextMainHandler, countersignId,
|
|
|
stepStatus, csPosition, expiredTime, dto.NextStepName, isOrigin);
|
|
|
|
|
@@ -1363,7 +1348,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- var step = CreateStep(stepDefine, prevStep, workflow.Id, handlers,
|
|
|
+ var step = CreateStep(stepDefine, prevStep, workflow.Id, flowAssignType, handlers,
|
|
|
dto.NextStepCode, dto.NextMainHandler, countersignId,
|
|
|
stepStatus, csPosition, expiredTime, dto.NextStepName, isOrigin);
|
|
|
|
|
@@ -1402,6 +1387,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
StepDefine stepDefine,
|
|
|
WorkflowStep prevStep,
|
|
|
string workflowId,
|
|
|
+ EFlowAssignType? flowAssignType,
|
|
|
List<Kv> handlers,
|
|
|
string nextStepCode,
|
|
|
string? nextMainHandler,
|
|
@@ -1420,6 +1406,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
var isMain = handlers.Count == 1 || (handlers.Count > 1 || handlerIds.First() == nextMainHandler);
|
|
|
|
|
|
step.WorkflowId = workflowId;
|
|
|
+ step.FlowAssignType = flowAssignType;
|
|
|
step.Handlers = handlers;
|
|
|
step.NextStepCode = step.StepType is EStepType.End ? string.Empty : nextStepCode;
|
|
|
step.IsMain = isMain;
|