|
@@ -485,14 +485,16 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
//if (currentStepBox.StepType is EStepType.Start)
|
|
|
// throw UserFriendlyException.SameMessage("当前流程已退回到开始节点");
|
|
|
|
|
|
+ //update uncompleted traces
|
|
|
+ await RecallTraceAsync(workflow.Id, dto, cancellationToken);
|
|
|
+
|
|
|
var targetStepBox = workflow.StepBoxes.FirstOrDefault(d => d.Code == dto.NextStepCode);
|
|
|
if (targetStepBox is null)
|
|
|
throw UserFriendlyException.SameMessage("该流程尚未流转至该节点");
|
|
|
|
|
|
- await RecallAsync(workflow, dto, targetStepDefine, targetStepBox, isStartCountersign, cancellationToken);
|
|
|
+ await RecallAsync(workflow, dto, targetStepDefine, targetStepBox, isStartCountersign, EWorkflowTraceStatus.Recall, cancellationToken);
|
|
|
|
|
|
- workflow.UpdateHandlers(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgCode,
|
|
|
- flowAssignMode.FlowAssignType, flowAssignMode.HandlerObjects);
|
|
|
+ workflow.ResetHandlers(flowAssignMode.FlowAssignType, flowAssignMode.HandlerObjects);
|
|
|
await _workflowRepository.UpdateAsync(workflow, cancellationToken);
|
|
|
|
|
|
await _mediator.Publish(new RecallNotify(workflow, dto), cancellationToken);
|
|
@@ -558,11 +560,10 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
else
|
|
|
{
|
|
|
//返回之前节点
|
|
|
- await RecallAsync(workflow, dto, targetStepDefine, targetStepBox, isStartCountersign, cancellationToken);
|
|
|
+ await RecallAsync(workflow, dto, targetStepDefine, targetStepBox, isStartCountersign, EWorkflowTraceStatus.Jump, cancellationToken);
|
|
|
}
|
|
|
|
|
|
- workflow.UpdateHandlers(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgCode,
|
|
|
- flowAssignMode.FlowAssignType, flowAssignMode.HandlerObjects);
|
|
|
+ workflow.ResetHandlers(flowAssignMode.FlowAssignType, flowAssignMode.HandlerObjects);
|
|
|
await _workflowRepository.UpdateAsync(workflow, cancellationToken);
|
|
|
|
|
|
await _mediator.Publish(new JumpNotify(workflow, dto, flowAssignMode), cancellationToken);
|
|
@@ -719,7 +720,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
d.WorkflowId == workflowId && string.IsNullOrEmpty(d.UserId));
|
|
|
foreach (var trace in uncompleteTraces)
|
|
|
{
|
|
|
- trace.Recall(
|
|
|
+ trace.Complete(
|
|
|
_sessionContext.RequiredUserId,
|
|
|
_sessionContext.UserName,
|
|
|
_sessionContext.RequiredOrgCode,
|
|
@@ -733,7 +734,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
{
|
|
|
var trace = await GetWorkflowTraceAsync(workflowId, step.Id, cancellationToken);
|
|
|
_mapper.Map(dto, trace);
|
|
|
- trace.Previous(
|
|
|
+ trace.Complete(
|
|
|
_sessionContext.RequiredUserId,
|
|
|
_sessionContext.UserName,
|
|
|
_sessionContext.RequiredOrgCode,
|
|
@@ -821,7 +822,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
}
|
|
|
|
|
|
private async Task RecallAsync(Workflow workflow, NextWorkflowDto dto, StepDefine targetStepDefine, WorkflowStep targetStepBox,
|
|
|
- bool isStartCountersign, CancellationToken cancellationToken)
|
|
|
+ bool isStartCountersign, EWorkflowTraceStatus traceStatus, CancellationToken cancellationToken)
|
|
|
{
|
|
|
//get targetStep's previous
|
|
|
var targetPrevStepBox = workflow.StepBoxes.FirstOrDefault(d => d.Id == targetStepBox.PreviousId);
|
|
@@ -832,32 +833,18 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
if (targetPrevStep == null)
|
|
|
throw new UserFriendlyException($"{nameof(RecallAsync)}, 未找到目标节点的前一节点, flowId: {workflow.Id}");
|
|
|
|
|
|
- ////remove completedSteps include target stepBox
|
|
|
- //var removeSteps = GetStepsIncludeStepBox(targetStepBox);
|
|
|
- //var tempStepBox = currentStepBox;
|
|
|
- //while (tempStepBox.Code != targetStepBox.Code)
|
|
|
- //{
|
|
|
- // 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}");
|
|
|
- // tempStepBox = prevStepBox;
|
|
|
- //}
|
|
|
- //
|
|
|
//查询所有目标节点之后的节点,然后删掉(包括目标节点)
|
|
|
var removeSteps = GetStepsBehindTargetStepBox(workflow.StepBoxes, targetStepBox);
|
|
|
await _workflowStepRepository.RemoveRangeAsync(removeSteps, cancellationToken);
|
|
|
+ workflow.StepBoxes.RemoveAll(d => removeSteps.Contains(d));
|
|
|
|
|
|
//recreate targetStep
|
|
|
await CreateStepAsync(isStartCountersign, workflow, targetStepDefine, dto, EWorkflowStepStatus.Assigned,
|
|
|
- targetPrevStepBox, targetPrevStep, EWorkflowTraceStatus.Recall, cancellationToken);
|
|
|
+ targetPrevStepBox, targetPrevStep, traceStatus, cancellationToken);
|
|
|
|
|
|
//flow manage
|
|
|
await ResetWorkflowCurrentStepInfo(workflow, dto, targetStepBox, isStartCountersign, cancellationToken);
|
|
|
|
|
|
- //update uncompleted traces
|
|
|
- await RecallTraceAsync(workflow.Id, dto, cancellationToken);
|
|
|
-
|
|
|
}
|
|
|
|
|
|
private IEnumerable<WorkflowStep> GetStepsBehindTargetStepBox(List<WorkflowStep> stepBoxes, WorkflowStep currentStepBox)
|
|
@@ -894,13 +881,13 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
private static void CheckWhetherRunnable(EWorkflowStatus status)
|
|
|
{
|
|
|
if (status != EWorkflowStatus.Runnable && status != EWorkflowStatus.Marked)
|
|
|
- throw new UserFriendlyException("当前流程状态不可继续流转");
|
|
|
+ throw UserFriendlyException.SameMessage("当前流程状态不可继续流转");
|
|
|
}
|
|
|
|
|
|
private void ValidatePermission(Workflow workflow)
|
|
|
{
|
|
|
if (!workflow.CanHandle(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgCode))
|
|
|
- throw new UserFriendlyException("无办理权限");
|
|
|
+ throw UserFriendlyException.SameMessage("无办理权限");
|
|
|
}
|
|
|
|
|
|
/// <summary>
|