|
@@ -438,25 +438,11 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
if (prevStep == null)
|
|
|
throw UserFriendlyException.SameMessage("未查询到前一节点");
|
|
|
|
|
|
- //重置上级节点办理数据
|
|
|
- //prevStep.Status = EWorkflowStepStatus.Assigned;
|
|
|
- if (prevStepBox.Status is EWorkflowStepStatus.Completed)
|
|
|
- {
|
|
|
- prevStepBox.Status = EWorkflowStepStatus.Assigned;
|
|
|
- await _workflowStepRepository.UpdateAsync(prevStepBox, cancellationToken);
|
|
|
- }
|
|
|
+ //检查并重置上级stepbox状态为待接办
|
|
|
+ await ResetStepBoxStatusAsync(prevStepBox, cancellationToken);
|
|
|
|
|
|
- prevStep.Reset();
|
|
|
- var newPrevStep = _mapper.Map<WorkflowStep>(prevStep);
|
|
|
- newPrevStep.Status = EWorkflowStepStatus.Assigned;
|
|
|
- newPrevStep.PreviousId = prevStep.PreviousId;
|
|
|
- newPrevStep.IsMain = prevStep.IsMain;
|
|
|
- newPrevStep.ParentId = prevStep.ParentId;
|
|
|
- newPrevStep.Handlers = prevStep.Handlers;
|
|
|
- newPrevStep.StartCountersignId = prevStep.StartCountersignId;
|
|
|
- newPrevStep.CountersignId = prevStep.CountersignId;
|
|
|
- newPrevStep.IsStartedCountersignComplete = prevStep.IsStartedCountersignComplete;
|
|
|
- await _workflowStepRepository.AddAsync(newPrevStep, cancellationToken);
|
|
|
+ //复制一个节点为待接办
|
|
|
+ var newPrevStep = await CreateByAsync(prevStep, cancellationToken);
|
|
|
|
|
|
//remove workflow.steps
|
|
|
await _workflowStepRepository.RemoveRangeAsync(new List<WorkflowStep> { prevStep, currentStep },
|
|
@@ -469,7 +455,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
//update trace
|
|
|
await PreviousTraceAsync(workflow.Id, dto, currentStep, cancellationToken);
|
|
|
|
|
|
- //todo publish
|
|
|
+ await _mediator.Publish(new PreviousNotify(workflow, dto), cancellationToken);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -494,7 +480,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
flowAssignMode.FlowAssignType, flowAssignMode.HandlerObjects);
|
|
|
await _workflowRepository.UpdateAsync(workflow, cancellationToken);
|
|
|
|
|
|
- //todo publish
|
|
|
+ await _mediator.Publish(new RecallNotify(workflow, dto), cancellationToken);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -559,7 +545,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
//update uncompleted traces
|
|
|
await JumpTraceAsync(workflow.Id, dto, cancellationToken);
|
|
|
|
|
|
- //todo publish
|
|
|
+ await _mediator.Publish(new JumpNotify(workflow, dto), cancellationToken);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -606,7 +592,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
/// <summary>
|
|
|
/// 查询当前待办节点的下一级节点配置(办理参数)
|
|
|
/// </summary>
|
|
|
- public IReadOnlyList<StepDefine> GetNextStepOptions(Workflow workflow, CancellationToken cancellationToken)
|
|
|
+ public IReadOnlyList<StepDefine> GetNextStepDefines(Workflow workflow)
|
|
|
{
|
|
|
var (currentStepBox, _) = GetUnCompleteStep(workflow.StepBoxes, _sessionContext.RequiredOrgCode, _sessionContext.RequiredUserId);
|
|
|
return workflow.Definition.FindSteps(currentStepBox.NextSteps);
|
|
@@ -615,6 +601,37 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
|
|
|
#region private
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 复制一个节点为待接办
|
|
|
+ /// </summary>
|
|
|
+ private async Task<WorkflowStep> CreateByAsync(WorkflowStep step, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ step.Reset();
|
|
|
+ var newStep = _mapper.Map<WorkflowStep>(step);
|
|
|
+ newStep.Status = EWorkflowStepStatus.Assigned;
|
|
|
+ newStep.PreviousId = step.PreviousId;
|
|
|
+ newStep.IsMain = step.IsMain;
|
|
|
+ newStep.ParentId = step.ParentId;
|
|
|
+ newStep.Handlers = step.Handlers;
|
|
|
+ newStep.StartCountersignId = step.StartCountersignId;
|
|
|
+ newStep.CountersignId = step.CountersignId;
|
|
|
+ newStep.IsStartedCountersignComplete = step.IsStartedCountersignComplete;
|
|
|
+ await _workflowStepRepository.AddAsync(newStep, cancellationToken);
|
|
|
+ return newStep;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 检查并重置目标stepbox状态为待接办
|
|
|
+ /// </summary>
|
|
|
+ private async Task ResetStepBoxStatusAsync(WorkflowStep stepBox, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ if (stepBox.Status is EWorkflowStepStatus.Completed)
|
|
|
+ {
|
|
|
+ stepBox.Status = EWorkflowStepStatus.Assigned;
|
|
|
+ await _workflowStepRepository.UpdateAsync(stepBox, cancellationToken);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private async Task<WorkflowCountersign> CreateCountersignAsync(string workflowId, string startStepId, string startStepCode, int count, string? parentId = null, CancellationToken cancellationToken = default)
|
|
|
{
|
|
|
var countersign = new WorkflowCountersign
|
|
@@ -792,17 +809,17 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
var targetPrevStepBox = workflow.StepBoxes.FirstOrDefault(d => d.Id == targetStepBox.PreviousId);
|
|
|
if (targetPrevStepBox == null)
|
|
|
throw new UserFriendlyException($"{nameof(RecallAsync)}, 未找到目标节点的前一节点, flowId: {workflow.Id}, targetStepBoxPrevId: {targetPrevStepBox.PreviousId}");
|
|
|
- //真实的前一节点并不存在(非正常流转造成的),所以任意取一个替代
|
|
|
+ //真实的前一节点并不存在(非正常流转造成的),所以取前一stepbox任意一个step替代
|
|
|
var targetPrevStep = targetPrevStepBox.Steps.FirstOrDefault();
|
|
|
if (targetPrevStep == null)
|
|
|
throw new UserFriendlyException($"{nameof(RecallAsync)}, 未找到目标节点的前一节点, flowId: {workflow.Id}");
|
|
|
|
|
|
- //remove completedSteps include target self
|
|
|
- var removeSteps = GetStepsIncludeSelf(targetStepBox);
|
|
|
+ //remove completedSteps include target stepBox
|
|
|
+ var removeSteps = GetStepsIncludeStepBox(targetStepBox);
|
|
|
var tempStepBox = currentStepBox;
|
|
|
while (tempStepBox.Code != targetStepBox.Code)
|
|
|
{
|
|
|
- removeSteps.AddRange(GetStepsIncludeSelf(tempStepBox));
|
|
|
+ removeSteps.AddRange(GetStepsIncludeStepBox(tempStepBox));
|
|
|
var prevStepBox = workflow.StepBoxes.FirstOrDefault(d => d.Id == tempStepBox.PreviousId);
|
|
|
if (prevStepBox is null)
|
|
|
throw new UserFriendlyException($"{nameof(RecallAsync)}, 未查询到节点, workflowId: {workflow.Id}, prevStepBoxId: {tempStepBox.PreviousId}");
|
|
@@ -818,23 +835,12 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
//flow manage
|
|
|
await ResetWorkflowCurrentStepInfo(workflow, dto, targetStepBox, isStartCountersign, cancellationToken);
|
|
|
|
|
|
- //if (workflow.IsInCountersign())
|
|
|
- //{
|
|
|
- // var currentCountersignStepBox =
|
|
|
- // workflow.StepBoxes.First(d => d.Code == workflow.TopCountersignStepCode);
|
|
|
- // //目标节点在初始会签节点之前或正好
|
|
|
-
|
|
|
- // if (targetStepBox.Code == workflow.TopCountersignStepCode || targetStepBox.CreationTime < currentCountersignStepBox.CreationTime)
|
|
|
- // await ResetWorkflowCurrentStepInfo(workflow, dto, targetStepBox, isStartCountersign, cancellationToken);
|
|
|
- //}
|
|
|
-
|
|
|
-
|
|
|
//update uncompleted traces
|
|
|
await RecallTraceAsync(workflow.Id, dto, cancellationToken);
|
|
|
|
|
|
}
|
|
|
|
|
|
- private List<WorkflowStep> GetStepsIncludeSelf(WorkflowStep stepBox)
|
|
|
+ private List<WorkflowStep> GetStepsIncludeStepBox(WorkflowStep stepBox)
|
|
|
{
|
|
|
var steps = new List<WorkflowStep> { stepBox };
|
|
|
steps.AddRange(stepBox.Steps);
|