|
@@ -5,6 +5,7 @@ using Hotline.FlowEngine.WorkflowModules;
|
|
using Hotline.Settings;
|
|
using Hotline.Settings;
|
|
using Hotline.Share.Dtos;
|
|
using Hotline.Share.Dtos;
|
|
using Hotline.Share.Dtos.FlowEngine;
|
|
using Hotline.Share.Dtos.FlowEngine;
|
|
|
|
+using Hotline.Share.Dtos.FlowEngine.Definition;
|
|
using Hotline.Share.Enums.FlowEngine;
|
|
using Hotline.Share.Enums.FlowEngine;
|
|
using Hotline.Share.Enums.Settings;
|
|
using Hotline.Share.Enums.Settings;
|
|
using MapsterMapper;
|
|
using MapsterMapper;
|
|
@@ -766,8 +767,43 @@ namespace Hotline.FlowEngine.Workflows
|
|
await _workflowTraceRepository.AddRangeAsync(traces, cancellationToken);
|
|
await _workflowTraceRepository.AddRangeAsync(traces, cancellationToken);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 创建开始节点
|
|
|
|
+ /// </summary>
|
|
|
|
+ public WorkflowStep CreateStartStep(Workflow workflow, StepDefine startStepDefine, BasicWorkflowDto dto, List<Kv> handles)
|
|
|
|
+ {
|
|
|
|
+ //startstep
|
|
|
|
+ var nextSteps = _mapper.Map<List<StepSimple>>(startStepDefine.NextSteps);
|
|
|
|
+ if (startStepDefine.InstanceMode is EInstanceMode.Config)
|
|
|
|
+ {
|
|
|
|
+ var selectedStep = nextSteps.FirstOrDefault(d => d.Code == dto.NextStepCode);
|
|
|
|
+ if (selectedStep is not null)
|
|
|
|
+ selectedStep.Selected = true;
|
|
|
|
+ }
|
|
|
|
+ var startStep = _mapper.Map<WorkflowStep>(startStepDefine);
|
|
|
|
+ startStep.WorkflowId = workflow.Id;
|
|
|
|
+ startStep.Handlers = handles;
|
|
|
|
+ startStep.NextSteps = nextSteps;
|
|
|
|
+ startStep.IsMain = true;
|
|
|
|
+ startStep.IsOrigin = true;
|
|
|
|
+ startStep.Status = EWorkflowStepStatus.WaitForHandle;
|
|
|
|
+ startStep.PrevChosenStepCode = null;
|
|
|
|
+ startStep.StepExpiredTime = workflow.ExpiredTime;
|
|
|
|
+
|
|
|
|
+ startStep.InitId();
|
|
|
|
+ return startStep;
|
|
|
|
+ }
|
|
|
|
+
|
|
#region private method
|
|
#region private method
|
|
|
|
|
|
|
|
+ public async Task<WorkflowStep> CreateStartStepAsync(Workflow workflow, StepDefine startStepDefine, BasicWorkflowDto dto,
|
|
|
|
+ List<Kv> handles, CancellationToken cancellationToken)
|
|
|
|
+ {
|
|
|
|
+ var startStep = CreateStartStep(workflow, startStepDefine, dto, handles);
|
|
|
|
+ await _workflowStepRepository.AddAsync(startStep, cancellationToken);
|
|
|
|
+ return startStep;
|
|
|
|
+ }
|
|
|
|
+
|
|
//更新目标节点前一节点的会签办理完成状态
|
|
//更新目标节点前一节点的会签办理完成状态
|
|
private void PrevStepCsHandled(Workflow workflow, WorkflowStep targetStep, ref List<WorkflowStep> updateSteps)
|
|
private void PrevStepCsHandled(Workflow workflow, WorkflowStep targetStep, ref List<WorkflowStep> updateSteps)
|
|
{
|
|
{
|
|
@@ -1255,13 +1291,19 @@ namespace Hotline.FlowEngine.Workflows
|
|
}
|
|
}
|
|
|
|
|
|
private async Task<bool> RecallAsync(Workflow workflow, BasicWorkflowDto dto, FlowAssignInfo flowAssignInfo,
|
|
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, CancellationToken cancellationToken)
|
|
{
|
|
{
|
|
|
|
+ var targetIsStartStep = targetStepDefine.StepType is EStepType.Start;
|
|
|
|
+
|
|
//get targetStep's previous
|
|
//get targetStep's previous
|
|
- var targetPrevStep = workflow.Steps.FirstOrDefault(d => d.Id == targetStep.PrevStepId);
|
|
|
|
- if (targetPrevStep == null)
|
|
|
|
- throw new UserFriendlyException($"{nameof(RecallAsync)}, 未找到目标节点的前一节点, flowId: {workflow.Id}");
|
|
|
|
|
|
+ WorkflowStep? targetPrevStep = null;
|
|
|
|
+ if (!targetIsStartStep)
|
|
|
|
+ {
|
|
|
|
+ targetPrevStep = workflow.Steps.FirstOrDefault(d => d.Id == targetStep.PrevStepId);
|
|
|
|
+ if (targetPrevStep == null)
|
|
|
|
+ throw new UserFriendlyException($"{nameof(RecallAsync)}, 未找到目标节点的前一节点, flowId: {workflow.Id}");
|
|
|
|
+ }
|
|
|
|
|
|
//查询所有目标节点之后的节点,然后删掉(包括目标节点)
|
|
//查询所有目标节点之后的节点,然后删掉(包括目标节点)
|
|
var removeSteps = GetStepsBehindTargetStep(workflow.Steps, targetStep);
|
|
var removeSteps = GetStepsBehindTargetStep(workflow.Steps, targetStep);
|
|
@@ -1276,19 +1318,18 @@ namespace Hotline.FlowEngine.Workflows
|
|
if (workflow.Status is EWorkflowStatus.Completed)
|
|
if (workflow.Status is EWorkflowStatus.Completed)
|
|
workflow.SetStatusRunnable();
|
|
workflow.SetStatusRunnable();
|
|
|
|
|
|
- //recreate targetStep
|
|
|
|
- //var targetStepBoxNew = await CreateStepAsync(workflow, targetStepDefine, dto, EWorkflowStepStatus.WaitForAccept,
|
|
|
|
- // targetPrevStepBox, targetPrevStep, traceStatus, workflow.ExpiredTime, cancellationToken);
|
|
|
|
-
|
|
|
|
- var targetStepsNew = await CreateConfigStepsAsync(workflow, targetStepDefine, targetPrevStep, dto,
|
|
|
|
- flowAssignInfo, cancellationToken);
|
|
|
|
|
|
+ var targetStepNew = targetIsStartStep
|
|
|
|
+ ? await CreateStartStepAsync(workflow, targetStepDefine, dto,
|
|
|
|
+ new List<Kv> { new(_sessionContext.RequiredUserId, _sessionContext.UserName) }, cancellationToken)
|
|
|
|
+ : (await CreateConfigStepsAsync(workflow, targetStepDefine, targetPrevStep, dto, flowAssignInfo,
|
|
|
|
+ cancellationToken)).First();
|
|
|
|
|
|
//更新当前办理节点信息
|
|
//更新当前办理节点信息
|
|
workflow.UpdateWorkflowCurrentStepInfo(dto.IsStartCountersign,
|
|
workflow.UpdateWorkflowCurrentStepInfo(dto.IsStartCountersign,
|
|
_sessionContext.RequiredUserId, _sessionContext.UserName,
|
|
_sessionContext.RequiredUserId, _sessionContext.UserName,
|
|
_sessionContext.RequiredOrgId, _sessionContext.OrgName,
|
|
_sessionContext.RequiredOrgId, _sessionContext.OrgName,
|
|
_sessionContext.OrgAreaCode, _sessionContext.OrgAreaName,
|
|
_sessionContext.OrgAreaCode, _sessionContext.OrgAreaName,
|
|
- nextStep: targetStepsNew.First());
|
|
|
|
|
|
+ nextStep: targetStepNew);
|
|
|
|
|
|
//calc workflow expired time
|
|
//calc workflow expired time
|
|
var isOrgToCenter = CheckIfFlowFromOrgToCenter(workflow, targetStep);
|
|
var isOrgToCenter = CheckIfFlowFromOrgToCenter(workflow, targetStep);
|