|
@@ -268,7 +268,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
_mapper.Map(dto, currentStep);
|
|
|
|
|
|
//step办理状态
|
|
|
- currentStep.StepComplete(
|
|
|
+ currentStep.Complete(
|
|
|
_sessionContext.RequiredUserId, _sessionContext.UserName,
|
|
|
_sessionContext.RequiredOrgCode, _sessionContext.OrgName,
|
|
|
dto.NextStepCode);
|
|
@@ -306,29 +306,6 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
currentCountersign.Complete(currentStep.Id, currentStep.Code);
|
|
|
await _workflowCountersignRepository.UpdateAsync(currentCountersign, cancellationToken);
|
|
|
}
|
|
|
-
|
|
|
- ////old
|
|
|
- //var countersignStartStepBox =
|
|
|
- // workflow.StepBoxes.FirstOrDefault(d => d.Code == currentStep.CountersignStartStepCode);
|
|
|
- //if (countersignStartStepBox is null)
|
|
|
- // throw new UserFriendlyException(
|
|
|
- // $"未查询到会签开始stepBox, workflowId: {workflow.Id}, stepCode: {currentStep.CountersignStartStepCode}", "未查询到会签开始节点");
|
|
|
- //var countersignStartStep =
|
|
|
- // countersignStartStepBox.Steps.FirstOrDefault(d => d.HasStartedCountersign && d.StartCountersignId == currentStep.CountersignId);
|
|
|
- //if (countersignStartStep != null)//如果==null,说明未发起会签是继承的外层会签
|
|
|
- //{
|
|
|
- // //结束step会签信息
|
|
|
- // countersignStartStep.CountersignComplete();
|
|
|
- // updateSteps.Add(countersignStartStep);
|
|
|
-
|
|
|
- // //结束会签
|
|
|
- // var currentCountersign = workflow.Countersigns.FirstOrDefault(d => d.Id == currentStep.CountersignId);
|
|
|
- // if (currentCountersign is null)
|
|
|
- // throw new UserFriendlyException(
|
|
|
- // $"未查询到对应会签信息,workflowId:{workflow.Id}, countersignId:{currentStep.CountersignId}", "无效会签编号");
|
|
|
- // currentCountersign.Complete(currentStep.Id, currentStep.Code);
|
|
|
- // await _workflowCountersignRepository.UpdateAsync(currentCountersign, cancellationToken);
|
|
|
- //}
|
|
|
}
|
|
|
|
|
|
await _workflowStepRepository.UpdateRangeAsync(updateSteps, cancellationToken);
|
|
@@ -349,9 +326,14 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
//检查是否流转到流程终点
|
|
|
if (nextStepBoxDefine.StepType is EStepType.End && !workflow.IsInCountersign())
|
|
|
{
|
|
|
+ //create endStep
|
|
|
+ var (_, endStep) = await CreateEndStepAsync(workflow, nextStepBoxDefine, currentStepBox, currentStep, cancellationToken);
|
|
|
+ //create endTrace
|
|
|
+ await EndTraceAsync(workflow, dto, endStep, cancellationToken);
|
|
|
+
|
|
|
workflow.Complete();
|
|
|
await _workflowRepository.UpdateAsync(workflow, cancellationToken);
|
|
|
-
|
|
|
+
|
|
|
await _mediator.Publish(new EndWorkflowNotify(workflow), cancellationToken);
|
|
|
return;
|
|
|
}
|
|
@@ -501,7 +483,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
//向后跳转
|
|
|
var nextStepBoxDefine = GetStepBoxDefine(workflow.Definition, dto.NextStepCode);
|
|
|
//var isStartCountersign = nextStepBoxDefine.IsStartCountersign(dto.NextHandlers.Count);
|
|
|
- var nextStepBox = await CreateStepAsync(isStartCountersign, workflow, nextStepBoxDefine, dto, EWorkflowStepStatus.Assigned, currentStepBox, currentStep, cancellationToken);
|
|
|
+ var nextStepBox = await CreateStepAsync(isStartCountersign, workflow, nextStepBoxDefine, dto,
|
|
|
+ EWorkflowStepStatus.Assigned, currentStepBox, currentStep, cancellationToken);
|
|
|
|
|
|
await ResetWorkflowCurrentStepInfo(workflow, dto, nextStepBox, cancellationToken);
|
|
|
|
|
@@ -694,13 +677,20 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
await _workflowTraceRepository.UpdateAsync(trace, cancellationToken);
|
|
|
}
|
|
|
|
|
|
+ private async Task EndTraceAsync(Workflow workflow, BasicWorkflowDto dto, WorkflowStep step, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ var trace = _mapper.Map<WorkflowTrace>(step);
|
|
|
+ trace.Status = EWorkflowTraceStatus.Normal;
|
|
|
+ trace.ExpiredTime = workflow.ExpiredTime;
|
|
|
+ trace.TimeLimit = workflow.TimeLimit;
|
|
|
+ await _workflowTraceRepository.AddAsync(trace, cancellationToken);
|
|
|
+ }
|
|
|
+
|
|
|
private async Task NextTraceAsync(Workflow workflow, BasicWorkflowDto dto, WorkflowStep step, CancellationToken cancellationToken)
|
|
|
{
|
|
|
var trace = await GetWorkflowTraceAsync(workflow.Id, step.Id, cancellationToken);
|
|
|
_mapper.Map(dto, trace);
|
|
|
_mapper.Map(step, trace);
|
|
|
- //trace.ExpiredTime = workflow.ExpiredTime;
|
|
|
- //trace.TimeLimit = workflow.TimeLimit;
|
|
|
await _workflowTraceRepository.UpdateAsync(trace, cancellationToken);
|
|
|
}
|
|
|
|
|
@@ -750,7 +740,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
//recreate targetStep
|
|
|
var nextStepBoxDefine = GetStepBoxDefine(workflow.Definition, dto.NextStepCode);
|
|
|
//var isStartCountersign = nextStepBoxDefine.IsStartCountersign(dto.NextHandlers.Count);
|
|
|
- await CreateStepAsync(isStartCountersign, workflow, nextStepBoxDefine, dto, EWorkflowStepStatus.Assigned, targetStepBox, targetStepBox.Steps.First(), cancellationToken);
|
|
|
+ await CreateStepAsync(isStartCountersign, workflow, nextStepBoxDefine, dto, EWorkflowStepStatus.Assigned,
|
|
|
+ targetStepBox, targetStepBox.Steps.First(), cancellationToken);
|
|
|
|
|
|
//flow manage
|
|
|
if (workflow.IsInCountersign())
|
|
@@ -794,19 +785,37 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
private async Task<(WorkflowStep stepBox, WorkflowStep step)> CreateStartStepAsync(Workflow workflow, BasicWorkflowDto dto, CancellationToken cancellationToken)
|
|
|
{
|
|
|
if (workflow.StepBoxes.Any())
|
|
|
- throw UserFriendlyException.SameMessage("无法反复开始流程");
|
|
|
+ throw UserFriendlyException.SameMessage("无法重复创建开始节点");
|
|
|
|
|
|
var startStepDefinition = workflow.Definition.Steps.FirstOrDefault(d => d.StepType == EStepType.Start);
|
|
|
if (startStepDefinition == null)
|
|
|
throw new UserFriendlyException($"模板未配置开始节点, defineCode: {workflow.Definition.Code}", "模板未配置开始节点");
|
|
|
|
|
|
- var stepBox = CreateStepBox(workflow.Id, startStepDefinition, dto, string.Empty);
|
|
|
+ var stepBox = CreateStepBox(workflow.Id, startStepDefinition, string.Empty);
|
|
|
await _workflowStepRepository.AddAsync(stepBox, cancellationToken);
|
|
|
|
|
|
//start节点的办理人分类默认为用户,即为当前发起流程的操作员
|
|
|
var handler = new IdName { Id = _sessionContext.RequiredUserId, Name = _sessionContext.UserName };
|
|
|
- await CreateStartSubStepAsync(handler, dto, stepBox, cancellationToken);
|
|
|
- return (stepBox, stepBox.Steps.First());
|
|
|
+ var step = await CreateStartSubStepAsync(handler, dto, stepBox, cancellationToken);
|
|
|
+ return (stepBox, step);
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task<(WorkflowStep stepBox, WorkflowStep step)> CreateEndStepAsync(
|
|
|
+ Workflow workflow,
|
|
|
+ StepDefine endStepDefine,
|
|
|
+ WorkflowStep prevStepBox,
|
|
|
+ WorkflowStep preveStep,
|
|
|
+ CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ if (workflow.StepBoxes.Any(d => d.StepType == EStepType.End))
|
|
|
+ throw UserFriendlyException.SameMessage("无法重复创建结束节点");
|
|
|
+
|
|
|
+ var stepBox = CreateStepBox(workflow.Id, endStepDefine, prevStepBox.Id);
|
|
|
+ await _workflowStepRepository.AddAsync(stepBox, cancellationToken);
|
|
|
+
|
|
|
+ var handler = new IdName { Id = _sessionContext.RequiredUserId, Name = _sessionContext.UserName };
|
|
|
+ var step = await CreateEndSubStepAsync(handler, stepBox, preveStep, cancellationToken);
|
|
|
+ return (stepBox, step);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -816,8 +825,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
bool isPrevStartCountersign,
|
|
|
Workflow workflow, StepDefine stepBoxDefine,
|
|
|
BasicWorkflowDto dto, EWorkflowStepStatus status,
|
|
|
- WorkflowStep? prevStepBox = null,
|
|
|
- WorkflowStep? prevStep = null,
|
|
|
+ WorkflowStep prevStepBox,
|
|
|
+ WorkflowStep prevStep,
|
|
|
CancellationToken cancellationToken = default)
|
|
|
{
|
|
|
if (stepBoxDefine.StepType is EStepType.Start or EStepType.End)
|
|
@@ -825,7 +834,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
var stepBox = workflow.StepBoxes.FirstOrDefault(d => d.Code == stepBoxDefine.Code);
|
|
|
if (stepBox == null)
|
|
|
{
|
|
|
- stepBox = CreateStepBox(workflow.Id, stepBoxDefine, dto, prevStepBox?.Id ?? string.Empty);
|
|
|
+ stepBox = CreateStepBox(workflow.Id, stepBoxDefine, prevStepBox.Id);
|
|
|
await _workflowStepRepository.AddAsync(stepBox, cancellationToken);
|
|
|
}
|
|
|
else if (stepBox.Status != EWorkflowStepStatus.Created)
|
|
@@ -848,7 +857,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
return stepBox;
|
|
|
}
|
|
|
|
|
|
- private async Task CreateStartSubStepAsync(
|
|
|
+ private async Task<WorkflowStep> CreateStartSubStepAsync(
|
|
|
IdName handler,
|
|
|
BasicWorkflowDto dto,
|
|
|
WorkflowStep stepBox,
|
|
@@ -860,7 +869,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
subStep.Accept(_sessionContext.RequiredUserId, _sessionContext.UserName,
|
|
|
_sessionContext.RequiredOrgCode, _sessionContext.OrgName);
|
|
|
//step办理状态
|
|
|
- subStep.StepComplete(
|
|
|
+ subStep.Complete(
|
|
|
_sessionContext.RequiredUserId, _sessionContext.UserName,
|
|
|
_sessionContext.RequiredOrgCode, _sessionContext.OrgName,
|
|
|
dto.NextStepCode);
|
|
@@ -868,6 +877,25 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
|
|
|
stepBox.Steps.Add(subStep);
|
|
|
await _workflowStepRepository.AddAsync(subStep, cancellationToken);
|
|
|
+ return subStep;
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task<WorkflowStep> CreateEndSubStepAsync(
|
|
|
+ IdName handler,
|
|
|
+ WorkflowStep currentStepBox,
|
|
|
+ WorkflowStep prevStep,
|
|
|
+ CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ var subStep = CreateSubStep(currentStepBox, new List<IdName> { handler }, null, null, prevStep.Id,
|
|
|
+ null, EWorkflowStepStatus.Completed, EStepCountersignStatus.None);
|
|
|
+ subStep.Accept(_sessionContext.RequiredUserId, _sessionContext.UserName, _sessionContext.RequiredOrgCode,
|
|
|
+ _sessionContext.OrgName);
|
|
|
+ subStep.Complete(_sessionContext.RequiredUserId, _sessionContext.UserName,
|
|
|
+ _sessionContext.RequiredOrgCode, _sessionContext.OrgName, null);
|
|
|
+
|
|
|
+ currentStepBox.Steps.Add(subStep);
|
|
|
+ await _workflowStepRepository.AddAsync(subStep, cancellationToken);
|
|
|
+ return subStep;
|
|
|
}
|
|
|
|
|
|
private async Task CreateSubStepsAsync(
|
|
@@ -880,8 +908,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
CancellationToken cancellationToken = default)
|
|
|
{
|
|
|
var countersignStatus = stepBoxDefine.StepType is EStepType.CountersignEnd
|
|
|
- ? prevStep.IsInCountersign
|
|
|
- ? EStepCountersignStatus.InCountersign
|
|
|
+ ? prevStep.IsInCountersign
|
|
|
+ ? EStepCountersignStatus.InCountersign
|
|
|
: EStepCountersignStatus.None
|
|
|
: prevStep.GetNextStepCountersignStatus();
|
|
|
List<WorkflowStep> subSteps;
|
|
@@ -901,20 +929,6 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
await _workflowStepRepository.AddRangeAsync(subSteps, cancellationToken);
|
|
|
}
|
|
|
|
|
|
- //private (WorkflowStep stepBox, WorkflowStep step) GetStep(List<WorkflowStep> stepBoxes, string stepId)
|
|
|
- //{
|
|
|
- // foreach (var stepBox in stepBoxes)
|
|
|
- // {
|
|
|
- // foreach (var step in stepBox.Steps)
|
|
|
- // {
|
|
|
- // if (step.Id == stepId)
|
|
|
- // return (stepBox, step);
|
|
|
- // }
|
|
|
- // }
|
|
|
-
|
|
|
- // throw new UserFriendlyException("未找到对应节点");
|
|
|
- //}
|
|
|
-
|
|
|
/// <summary>
|
|
|
/// 查询未完成节点
|
|
|
/// </summary>
|
|
@@ -950,7 +964,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
return new();
|
|
|
}
|
|
|
|
|
|
- private WorkflowStep CreateStepBox(string workflowId, StepDefine stepDefine, BasicWorkflowDto dto, string prevStepBoxId)
|
|
|
+ private WorkflowStep CreateStepBox(string workflowId, StepDefine stepDefine, string prevStepBoxId)
|
|
|
{
|
|
|
var stepBox = _mapper.Map<WorkflowStep>(stepDefine);
|
|
|
stepBox.WorkflowId = workflowId;
|
|
@@ -1017,7 +1031,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
|
|
|
step.ParentId = stepBox.Id;
|
|
|
step.HandlerIds = handlerIds;
|
|
|
- step.NextStepCode = nextStepCode;
|
|
|
+ step.NextStepCode = step.StepType is EStepType.End ? string.Empty : nextStepCode;
|
|
|
step.IsMain = isMain;
|
|
|
step.PreviousId = prevStepId;
|
|
|
step.CountersignId = countersignId;
|