|
@@ -2,7 +2,6 @@
|
|
|
using Hotline.FlowEngine.Definitions;
|
|
|
using Hotline.FlowEngine.Notifications;
|
|
|
using Hotline.FlowEngine.WorkflowModules;
|
|
|
-using Hotline.Orders;
|
|
|
using Hotline.SeedData;
|
|
|
using Hotline.Settings;
|
|
|
using Hotline.Share.Dtos;
|
|
@@ -98,7 +97,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
/// </summary>
|
|
|
public async Task StartAsync(Workflow workflow, WorkflowStep startStep, BasicWorkflowDto dto,
|
|
|
StepDefine firstStepDefine, bool isNextDynamic, FlowAssignInfo flowAssignInfo,
|
|
|
- ECounterSignType? counterSignType, DateTime? expiredTime, CancellationToken cancellationToken)
|
|
|
+ ECounterSignType? counterSignType, DateTime? expiredTime, List<WorkflowStepHandler> stepHandlers,
|
|
|
+ CancellationToken cancellationToken)
|
|
|
{
|
|
|
//1. 创建first节点 (和trace)2.办理开始节点
|
|
|
|
|
@@ -121,7 +121,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
|
|
|
//firststeps
|
|
|
var firstSteps = await CreateNextStepsAsync(workflow, startStep, dto, firstStepDefine,
|
|
|
- isNextDynamic, flowAssignInfo, expiredTime, cancellationToken);
|
|
|
+ isNextDynamic, flowAssignInfo, expiredTime, stepHandlers, cancellationToken);
|
|
|
if (firstSteps.Any())
|
|
|
workflow.Steps.AddRange(firstSteps);
|
|
|
|
|
@@ -130,9 +130,9 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
//await HandleStepAsync(startStep, workflow, dto, flowAssignInfo.FlowAssignType, counterSignType,
|
|
|
// cancellationToken);
|
|
|
|
|
|
- //赋值当前节点的下级办理节点
|
|
|
- if (dto.IsStartCountersign)
|
|
|
- startStep.CreateCountersignSteps(firstSteps);
|
|
|
+ ////赋值当前节点的下级办理节点
|
|
|
+ //if (dto.IsStartCountersign)
|
|
|
+ // startStep.CreateCountersignSteps(firstSteps);
|
|
|
|
|
|
await _workflowStepRepository.UpdateAsync(startStep, cancellationToken);
|
|
|
|
|
@@ -193,7 +193,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
if (withCountersigns)
|
|
|
query = query.Includes(d => d.Countersigns, x => x.Members);
|
|
|
if (withSteps)
|
|
|
- query = query.Includes(d => d.Steps);
|
|
|
+ query = query.Includes(d => d.Steps, x => x.StepHandlers);
|
|
|
//if (withTraces)
|
|
|
// query = query.Includes(d => d.Traces);
|
|
|
|
|
@@ -313,7 +313,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
/// </summary>
|
|
|
public async Task NextAsync(Workflow workflow, WorkflowStep currentStep, NextWorkflowDto dto,
|
|
|
StepDefine nextStepDefine, bool isNextDynamic, FlowAssignInfo flowAssignInfo,
|
|
|
- DateTime? expiredTime, CancellationToken cancellationToken)
|
|
|
+ DateTime? expiredTime, List<WorkflowStepHandler> stepHandlers, CancellationToken cancellationToken)
|
|
|
{
|
|
|
ValidatePermission(workflow, _sessionContext.RequiredOrgId, _sessionContext.RequiredUserId);
|
|
|
//CheckWhetherRunnable(workflow.Status);
|
|
@@ -367,26 +367,26 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
|
|
|
_mapper.Map(dto, workflow);
|
|
|
|
|
|
- //操作为回到会签汇总时,更新开始会签节点的会签办理状态
|
|
|
- if (currentStep.IsInCountersign() && dto.BackToCountersignEnd)
|
|
|
- {
|
|
|
- if (currentStep.IsCountersignEndStep)
|
|
|
- {
|
|
|
- if (!currentStep.IsTopCountersignEndStep(workflow.TopCountersignStepId))
|
|
|
- {
|
|
|
- //汇总节点(非顶级)
|
|
|
- var csStartStep =
|
|
|
- workflow.Steps.FirstOrDefault(d => d.Id == currentStep.CountersignStartStepId);
|
|
|
- if (csStartStep is null)
|
|
|
- throw new UserFriendlyException("未查询到会签开始节点");
|
|
|
- PrevStepCsHandled(workflow, csStartStep, ref updateSteps);
|
|
|
- }
|
|
|
- }
|
|
|
- else if (currentStep.CountersignPosition is ECountersignPosition.Inner)
|
|
|
- {
|
|
|
- PrevStepCsHandled(workflow, currentStep, ref updateSteps);
|
|
|
- }
|
|
|
- }
|
|
|
+ ////操作为回到会签汇总时,更新开始会签节点的会签办理状态
|
|
|
+ //if (currentStep.IsInCountersign() && dto.BackToCountersignEnd)
|
|
|
+ //{
|
|
|
+ // if (currentStep.IsCountersignEndStep)
|
|
|
+ // {
|
|
|
+ // if (!currentStep.IsTopCountersignEndStep(workflow.TopCountersignStepId))
|
|
|
+ // {
|
|
|
+ // //汇总节点(非顶级)
|
|
|
+ // var csStartStep =
|
|
|
+ // workflow.Steps.FirstOrDefault(d => d.Id == currentStep.CountersignStartStepId);
|
|
|
+ // if (csStartStep is null)
|
|
|
+ // throw new UserFriendlyException("未查询到会签开始节点");
|
|
|
+ // PrevStepCsHandled(workflow, csStartStep, ref updateSteps);
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // else if (currentStep.CountersignPosition is ECountersignPosition.Inner)
|
|
|
+ // {
|
|
|
+ // PrevStepCsHandled(workflow, currentStep, ref updateSteps);
|
|
|
+ // }
|
|
|
+ //}
|
|
|
|
|
|
//会签办理节点办理时更新会签members字段
|
|
|
if (currentStep.CountersignPosition is ECountersignPosition.Inner)
|
|
@@ -405,7 +405,10 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
.ExecuteCommandAsync();
|
|
|
}
|
|
|
|
|
|
- await _workflowStepRepository.UpdateRangeAsync(updateSteps, cancellationToken);
|
|
|
+ //await _workflowStepRepository.UpdateRangeAsync(updateSteps, cancellationToken);
|
|
|
+ await _workflowStepRepository.UpdateNav(updateSteps)
|
|
|
+ .Include(d => d.StepHandlers)
|
|
|
+ .ExecuteCommandAsync();
|
|
|
|
|
|
await NextTraceAsync(workflow, dto, currentStep, cancellationToken);
|
|
|
|
|
@@ -446,25 +449,19 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- ////是否从中心流转出去,重新计算expiredTime
|
|
|
- //var isCenterToOrg = CheckIfFlowFromCenterToOrg(currentStep, nextStepDefine);
|
|
|
- //var isOrgToCenter = false;
|
|
|
- ////if (isCenterToOrg)
|
|
|
- //// workflow.CenterToOrg(CalculateExpiredTime(workflow.WorkflowDefinition.Code));//todo 过期时间
|
|
|
-
|
|
|
//创建下一/N个节点(会签汇总节点:会签未全部办理时不创建,最后一个会签办理节点创建会签汇总节点)
|
|
|
var nextSteps = await CreateNextStepsAsync(workflow, currentStep, dto, nextStepDefine, isNextDynamic,
|
|
|
- flowAssignInfo, expiredTime, cancellationToken);
|
|
|
+ flowAssignInfo, expiredTime, stepHandlers, cancellationToken);
|
|
|
|
|
|
- //赋值当前节点的下级办理节点
|
|
|
- if (dto.IsStartCountersign
|
|
|
- //|| (currentStep.IsInCountersign() &&
|
|
|
- // !currentStep.IsTopCountersignEndStep(workflow.TopCountersignStepId))
|
|
|
- )
|
|
|
- {
|
|
|
- currentStep.CreateCountersignSteps(nextSteps);
|
|
|
- await _workflowStepRepository.UpdateAsync(currentStep, cancellationToken);
|
|
|
- }
|
|
|
+ ////赋值当前节点的下级办理节点
|
|
|
+ //if (dto.IsStartCountersign
|
|
|
+ // //|| (currentStep.IsInCountersign() &&
|
|
|
+ // // !currentStep.IsTopCountersignEndStep(workflow.TopCountersignStepId))
|
|
|
+ // )
|
|
|
+ //{
|
|
|
+ // currentStep.CreateCountersignSteps(nextSteps);
|
|
|
+ // await _workflowStepRepository.UpdateAsync(currentStep, cancellationToken);
|
|
|
+ //}
|
|
|
|
|
|
//更新办理对象(nextSteps无元素表示当前节点为会签办理节点且当前会签没有全部办理完成)
|
|
|
workflow.UpdateHandlers(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgId,
|
|
@@ -472,14 +469,6 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
|
|
|
//todo 计算办理工作时长
|
|
|
|
|
|
- ////更新当前办理节点信息
|
|
|
- //workflow.UpdateWorkflowCurrentStepInfo(dto.IsStartCountersign,
|
|
|
- // _sessionContext.RequiredUserId, _sessionContext.UserName,
|
|
|
- // _sessionContext.RequiredOrgId, _sessionContext.OrgName,
|
|
|
- // _sessionContext.OrgAreaCode, _sessionContext.OrgAreaName,
|
|
|
- // currentStep, nextSteps?.FirstOrDefault());
|
|
|
-
|
|
|
-
|
|
|
//指派实际办理节点
|
|
|
UpdateActualStep(workflow, dto, nextStepDefine, nextSteps);
|
|
|
|
|
@@ -567,7 +556,10 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
await DuplicateStepWithTraceAsync(workflow, prevStep, EWorkflowTraceStatus.Previous, cancellationToken);
|
|
|
|
|
|
//remove workflow.steps
|
|
|
- await _workflowStepRepository.RemoveRangeAsync(removeSteps, cancellationToken);
|
|
|
+ //await _workflowStepRepository.RemoveRangeAsync(removeSteps, cancellationToken);
|
|
|
+ await _workflowStepRepository.RemoveNav(removeSteps)
|
|
|
+ .Include(d => d.StepHandlers)
|
|
|
+ .ExecuteCommandAsync();
|
|
|
|
|
|
if (workflow.Status is EWorkflowStatus.Completed)
|
|
|
workflow.SetStatusRunnable();
|
|
@@ -646,13 +638,14 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
/// 批量改变办理对象
|
|
|
/// </summary>
|
|
|
public async Task<ICollection<string>> ChangeHandlerRangeAsync(string sendPoolId,
|
|
|
- IReadOnlyList<(string userId, string username, IReadOnlyList<string> stepIds)> handlers,
|
|
|
+ IReadOnlyList<(string userId, string username, string orgId, string orgName, IReadOnlyList<string> stepIds)> handlers,
|
|
|
CancellationToken cancellationToken)
|
|
|
{
|
|
|
var stepsIds = handlers.SelectMany(d => d.stepIds).ToList();
|
|
|
var steps = await _workflowStepRepository.Queryable()
|
|
|
.Includes(d => d.Workflow)
|
|
|
.Includes(d => d.WorkflowTrace)
|
|
|
+ .Includes(d => d.StepHandlers)
|
|
|
.Where(d => stepsIds.Contains(d.Id))
|
|
|
.ToListAsync(cancellationToken);
|
|
|
foreach (var handler in handlers)
|
|
@@ -667,6 +660,11 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
var thisSteps = steps.Where(d => handler.stepIds.Contains(d.Id)).ToList();
|
|
|
foreach (var thisStep in thisSteps)
|
|
|
{
|
|
|
+ var stepHandler = WorkflowStepHandler.Create(thisStep.Workflow.Id, thisStep.Workflow.ExternalId,
|
|
|
+ thisStep.FlowAssignType ?? EFlowAssignType.User, handler.userId, handler.username, handler.orgId, handler.orgName);
|
|
|
+ thisStep.StepHandlers.Clear();
|
|
|
+ thisStep.StepHandlers.Add(stepHandler);
|
|
|
+
|
|
|
thisStep.Handlers = thisHandlers;
|
|
|
|
|
|
//update trace
|
|
@@ -688,11 +686,26 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
await _workflowStepRepository.UpdateNav(steps)
|
|
|
.Include(d => d.WorkflowTrace)
|
|
|
.Include(d => d.Workflow)
|
|
|
+ .Include(d=>d.StepHandlers)
|
|
|
.ExecuteCommandAsync();
|
|
|
|
|
|
return steps.Select(d => d.WorkflowId).ToList();
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 查询工单办理中的一级部门
|
|
|
+ /// </summary>
|
|
|
+ public async Task<ICollection<Kv>> GetLevelOneOrgsAsync(string workflowId, CancellationToken cancellation)
|
|
|
+ {
|
|
|
+ var workflow = await GetWorkflowAsync(workflowId, withSteps: true, cancellationToken: cancellation);
|
|
|
+ return workflow.Steps.Where(d => d.BusinessType == EBusinessType.Department &&
|
|
|
+ d.HandlerType == EHandlerType.OrgLevel &&
|
|
|
+ d.StepHandlers.Any(d =>
|
|
|
+ !string.IsNullOrEmpty(d.OrgId) && d.OrgId.CheckIfOrgLevelIs(1)))
|
|
|
+ .Select(d => new Kv(d.StepHandlers.First().OrgId, d.StepHandlers.First().OrgName))
|
|
|
+ .ToList();
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 查找当前会签内所有节点(含start,end)
|
|
|
/// </summary>
|
|
@@ -717,7 +730,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
/// 撤回(返回到之前任意节点)
|
|
|
/// </summary>
|
|
|
public async Task RecallAsync(Workflow workflow, RecallDto dto, StepDefine targetStepDefine,
|
|
|
- FlowAssignInfo flowAssignInfo, DateTime? expiredTime, CancellationToken cancellationToken)
|
|
|
+ FlowAssignInfo flowAssignInfo, List<WorkflowStepHandler> stepHandlers, DateTime? expiredTime,
|
|
|
+ CancellationToken cancellationToken)
|
|
|
{
|
|
|
var targetStep = workflow.Steps.FirstOrDefault(d => d.Code == dto.NextStepCode && d.IsOrigin);
|
|
|
if (targetStep is null)
|
|
@@ -727,7 +741,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
await RecallTraceAsync(workflow.Id, dto.Opinion, cancellationToken);
|
|
|
|
|
|
var isOrgToCenter = await RecallAsync(workflow, dto, flowAssignInfo, targetStepDefine, targetStep,
|
|
|
- EWorkflowTraceStatus.Recall, expiredTime, cancellationToken);
|
|
|
+ EWorkflowTraceStatus.Recall, stepHandlers, expiredTime, cancellationToken);
|
|
|
|
|
|
workflow.ResetHandlers(flowAssignInfo.FlowAssignType, flowAssignInfo.HandlerObjects);
|
|
|
|
|
@@ -1075,7 +1089,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
/// 创建开始节点
|
|
|
/// </summary>
|
|
|
public WorkflowStep CreateStartStep(Workflow workflow, StepDefine startStepDefine,
|
|
|
- BasicWorkflowDto dto, List<Kv> handles, DateTime? expiredTime)
|
|
|
+ BasicWorkflowDto dto, List<Kv> handles, List<WorkflowStepHandler> stepHandlers, DateTime? expiredTime)
|
|
|
{
|
|
|
//startstep
|
|
|
var nextSteps = _mapper.Map<List<StepSimple>>(startStepDefine.NextSteps);
|
|
@@ -1090,6 +1104,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
_mapper.Map(dto, startStep);
|
|
|
_mapper.Map(workflow, startStep);
|
|
|
startStep.Handlers = handles;
|
|
|
+ startStep.StepHandlers = stepHandlers;
|
|
|
startStep.NextSteps = nextSteps;
|
|
|
startStep.IsMain = true;
|
|
|
startStep.IsOrigin = true;
|
|
@@ -1115,8 +1130,15 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
WorkflowStep currentStep, EReviewResult? reviewResult = EReviewResult.Unknown,
|
|
|
CancellationToken cancellationToken = default)
|
|
|
{
|
|
|
+ var endStepHandles = new List<WorkflowStepHandler>
|
|
|
+ {
|
|
|
+ WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId,
|
|
|
+ EFlowAssignType.User, _sessionContext.RequiredUserId, _sessionContext.UserName,
|
|
|
+ _sessionContext.RequiredOrgId, _sessionContext.OrgName)
|
|
|
+ };
|
|
|
+
|
|
|
//create endStep
|
|
|
- var endStep = await CreateEndStepAsync(workflow, endStepDefine, currentStep, cancellationToken);
|
|
|
+ var endStep = await CreateEndStepAsync(workflow, endStepDefine, currentStep, endStepHandles, cancellationToken);
|
|
|
workflow.Steps.Add(endStep);
|
|
|
|
|
|
//update endTrace
|
|
@@ -1222,83 +1244,86 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
}
|
|
|
|
|
|
private async Task<WorkflowStep> CreateStartStepAsync(Workflow workflow, StepDefine startStepDefine,
|
|
|
- BasicWorkflowDto dto, List<Kv> handles, EWorkflowTraceStatus traceStatus, DateTime? expiredTime,
|
|
|
- CancellationToken cancellationToken)
|
|
|
+ BasicWorkflowDto dto, List<Kv> handles, List<WorkflowStepHandler> stepHandlers, EWorkflowTraceStatus traceStatus,
|
|
|
+ DateTime? expiredTime, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- var startStep = CreateStartStep(workflow, startStepDefine, dto, handles, expiredTime);
|
|
|
- await _workflowStepRepository.AddAsync(startStep, cancellationToken);
|
|
|
+ var startStep = CreateStartStep(workflow, startStepDefine, dto, handles, stepHandlers, expiredTime);
|
|
|
+ //await _workflowStepRepository.AddAsync(startStep, cancellationToken);
|
|
|
+ await _workflowStepRepository.AddNav(startStep)
|
|
|
+ .Include(d => d.StepHandlers)
|
|
|
+ .ExecuteCommandAsync();
|
|
|
await CreateTraceAsync(workflow, startStep, traceStatus, cancellationToken);
|
|
|
return startStep;
|
|
|
}
|
|
|
|
|
|
- //更新目标节点前一节点的会签办理完成状态
|
|
|
- private void PrevStepCsHandled(Workflow workflow, WorkflowStep targetStep, ref List<WorkflowStep> updateSteps)
|
|
|
- {
|
|
|
- var prevStep = workflow.Steps.FirstOrDefault(d => d.Id == targetStep.PrevStepId);
|
|
|
- if (prevStep is null)
|
|
|
- throw new UserFriendlyException("未查询到目标节点的前一节点");
|
|
|
-
|
|
|
- var csStep = prevStep.CountersignSteps.FirstOrDefault(d => d.StepId == targetStep.Id);
|
|
|
- if (csStep is null)
|
|
|
- throw new UserFriendlyException("未查询到当前待办节点");
|
|
|
- csStep.Completed = true;
|
|
|
- updateSteps.Add(prevStep);
|
|
|
- }
|
|
|
+ ////更新目标节点前一节点的会签办理完成状态
|
|
|
+ //private void PrevStepCsHandled(Workflow workflow, WorkflowStep targetStep, ref List<WorkflowStep> updateSteps)
|
|
|
+ //{
|
|
|
+ // var prevStep = workflow.Steps.FirstOrDefault(d => d.Id == targetStep.PrevStepId);
|
|
|
+ // if (prevStep is null)
|
|
|
+ // throw new UserFriendlyException("未查询到目标节点的前一节点");
|
|
|
+
|
|
|
+ // var csStep = prevStep.CountersignSteps.FirstOrDefault(d => d.StepId == targetStep.Id);
|
|
|
+ // if (csStep is null)
|
|
|
+ // throw new UserFriendlyException("未查询到当前待办节点");
|
|
|
+ // csStep.Completed = true;
|
|
|
+ // updateSteps.Add(prevStep);
|
|
|
+ //}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 创建下1/N个节点
|
|
|
/// </summary>
|
|
|
private async Task<List<WorkflowStep>> CreateNextStepsAsync(Workflow workflow, WorkflowStep currentStep,
|
|
|
BasicWorkflowDto dto, StepDefine nextStepDefine, bool isNextDynamic, FlowAssignInfo flowAssignInfo,
|
|
|
- DateTime? expiredTime, CancellationToken cancellationToken)
|
|
|
+ DateTime? expiredTime, List<WorkflowStepHandler> stepHandlers, CancellationToken cancellationToken)
|
|
|
{
|
|
|
List<WorkflowStep> nextSteps = new();
|
|
|
if (currentStep.IsInCountersign())
|
|
|
{
|
|
|
if (currentStep.IsCountersignEndStep)
|
|
|
{
|
|
|
- //todo check if current is topend f: csStartStep.prev
|
|
|
- //todo t: check if dto.StartCs t: csconfig f: config
|
|
|
+ // check if current is topend f: csStartStep.prev
|
|
|
+ // t: check if dto.StartCs t: csconfig f: config
|
|
|
if (currentStep.IsTopCountersignEndStep(workflow.TopCountersignStepId))
|
|
|
{
|
|
|
if (dto.IsStartCountersign)
|
|
|
{
|
|
|
//依据会签策略创建会签下一级节点
|
|
|
nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
|
|
|
- flowAssignInfo.FlowAssignType, expiredTime, cancellationToken);
|
|
|
+ flowAssignInfo.FlowAssignType, expiredTime, stepHandlers, cancellationToken);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//创建普通节点(根据配置)
|
|
|
nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto,
|
|
|
- flowAssignInfo, EWorkflowTraceStatus.Normal, expiredTime, cancellationToken);
|
|
|
+ flowAssignInfo, EWorkflowTraceStatus.Normal, expiredTime, stepHandlers, cancellationToken);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- //todo csStartStep.prev
|
|
|
+ // csStartStep.prev
|
|
|
var csStartStep =
|
|
|
workflow.Steps.FirstOrDefault(d => d.Id == currentStep.CountersignStartStepId);
|
|
|
if (csStartStep is null)
|
|
|
throw new UserFriendlyException("未查询到会签节点");
|
|
|
|
|
|
- nextSteps = await CreateCsEndStepsByPrevStepAsync(workflow, csStartStep, dto, expiredTime,
|
|
|
- cancellationToken);
|
|
|
+ nextSteps = await CreateCsEndStepsByTargetPrevAsync(workflow, csStartStep, dto, stepHandlers,
|
|
|
+ expiredTime, cancellationToken);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
if (dto.BackToCountersignEnd)
|
|
|
{
|
|
|
- //todo check if cs all complete, create next
|
|
|
- nextSteps = await CreateCsEndStepsByPrevStepAsync(workflow, currentStep, dto, expiredTime,
|
|
|
- cancellationToken);
|
|
|
+ // check if cs all complete, create next
|
|
|
+ nextSteps = await CreateCsEndStepsByTargetPrevAsync(workflow, currentStep, dto, stepHandlers,
|
|
|
+ expiredTime, cancellationToken);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//依据会签策略创建会签下一级节点
|
|
|
nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
|
|
|
- flowAssignInfo.FlowAssignType, expiredTime, cancellationToken);
|
|
|
+ flowAssignInfo.FlowAssignType, expiredTime, stepHandlers, cancellationToken);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -1306,19 +1331,19 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
{
|
|
|
//依据会签策略创建会签下一级节点
|
|
|
nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
|
|
|
- flowAssignInfo.FlowAssignType, expiredTime, cancellationToken);
|
|
|
+ flowAssignInfo.FlowAssignType, expiredTime, stepHandlers, cancellationToken);
|
|
|
}
|
|
|
else if (isNextDynamic)
|
|
|
{
|
|
|
//创建动态下一级节点
|
|
|
nextSteps = await CreateDynamicStepsAsync(workflow, nextStepDefine, currentStep, dto, flowAssignInfo,
|
|
|
- expiredTime, cancellationToken);
|
|
|
+ expiredTime, stepHandlers, cancellationToken);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//创建普通节点(根据配置)
|
|
|
nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto, flowAssignInfo,
|
|
|
- EWorkflowTraceStatus.Normal, expiredTime, cancellationToken);
|
|
|
+ EWorkflowTraceStatus.Normal, expiredTime, stepHandlers, cancellationToken);
|
|
|
}
|
|
|
|
|
|
return nextSteps;
|
|
@@ -1331,6 +1356,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
BasicWorkflowDto dto,
|
|
|
FlowAssignInfo flowAssignInfo,
|
|
|
DateTime? expiredTime,
|
|
|
+ List<WorkflowStepHandler> stepHandlers,
|
|
|
CancellationToken cancellationToken)
|
|
|
{
|
|
|
var handlerType = nextStepDefine.InstancePolicy switch
|
|
@@ -1344,8 +1370,9 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
};
|
|
|
|
|
|
return await CreateStepsAsync(workflow, nextStepDefine, prevStep, dto,
|
|
|
- flowAssignInfo.FlowAssignType, dto.NextHandlers, null, EWorkflowStepStatus.WaitForAccept,
|
|
|
- ECountersignPosition.None, false, EWorkflowTraceStatus.Normal, handlerType, expiredTime, cancellationToken);
|
|
|
+ flowAssignInfo.FlowAssignType, dto.NextHandlers, stepHandlers, null, EWorkflowStepStatus.WaitForAccept,
|
|
|
+ ECountersignPosition.None, false, EWorkflowTraceStatus.Normal, handlerType, expiredTime,
|
|
|
+ cancellationToken: cancellationToken);
|
|
|
}
|
|
|
|
|
|
private Task<List<WorkflowStep>> CreateCountersignStepsAsync(
|
|
@@ -1355,10 +1382,11 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
BasicWorkflowDto dto,
|
|
|
EFlowAssignType flowAssignType,
|
|
|
DateTime? expiredTime,
|
|
|
- CancellationToken cancellationToken
|
|
|
+ List<WorkflowStepHandler> stepHandlers,
|
|
|
+ CancellationToken cancellationToken = default
|
|
|
)
|
|
|
{
|
|
|
- var countersignId = prevStep.IsStartCountersign ? prevStep.StartCountersignId : prevStep.CountersignId;
|
|
|
+ var countersignId = dto.IsStartCountersign ? prevStep.StartCountersignId : prevStep.CountersignId;
|
|
|
|
|
|
var handlerType = stepDefine.CountersignPolicy switch
|
|
|
{
|
|
@@ -1370,27 +1398,29 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
_ => throw new ArgumentOutOfRangeException()
|
|
|
};
|
|
|
|
|
|
- return CreateStepsAsync(workflow, stepDefine, prevStep, dto, flowAssignType, dto.NextHandlers,
|
|
|
+ return CreateStepsAsync(workflow, stepDefine, prevStep, dto, flowAssignType, dto.NextHandlers, stepHandlers,
|
|
|
countersignId, EWorkflowStepStatus.WaitForAccept, prevStep.GetNextStepCountersignPosition(),
|
|
|
- false, EWorkflowTraceStatus.Normal, handlerType, expiredTime, cancellationToken);
|
|
|
+ false, EWorkflowTraceStatus.Normal, handlerType, expiredTime, cancellationToken: cancellationToken);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 根据传入节点的上一节点创建会签汇总节点(汇总传入节点的前一节点)
|
|
|
/// </summary>
|
|
|
- private async Task<List<WorkflowStep>> CreateCsEndStepsByPrevStepAsync(Workflow workflow, WorkflowStep step,
|
|
|
- BasicWorkflowDto dto, DateTime? expiredTime, CancellationToken cancellationToken)
|
|
|
+ private async Task<List<WorkflowStep>> CreateCsEndStepsByTargetPrevAsync(Workflow workflow, WorkflowStep step,
|
|
|
+ BasicWorkflowDto dto, List<WorkflowStepHandler> stepHandlers, DateTime? expiredTime, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- var prevStep = workflow.Steps.FirstOrDefault(d => d.Id == step.PrevStepId);
|
|
|
- if (prevStep is null)
|
|
|
+ var countersignStartStep = workflow.Steps.FirstOrDefault(d => d.Id == step.PrevStepId);
|
|
|
+ if (countersignStartStep is null)
|
|
|
throw new UserFriendlyException("未查询到当前节点上级节点");
|
|
|
var nextSteps = new List<WorkflowStep>();
|
|
|
//会签未全部办理则不创建汇总节点
|
|
|
- if (prevStep.StartedCountersignHasAllHandled())
|
|
|
+
|
|
|
+ var csInnerSteps = workflow.Steps.Where(d => d.PrevStepId == countersignStartStep.Id).ToList();
|
|
|
+ if (csInnerSteps.All(d => d.Status == EWorkflowStepStatus.Handled))
|
|
|
{
|
|
|
- //todo 创建会签汇总节点
|
|
|
+ // 创建会签汇总节点
|
|
|
var countersignEndStep =
|
|
|
- await CreateCountersignEndStepAsync(prevStep, dto, expiredTime, cancellationToken);
|
|
|
+ await CreateCountersignEndStepAsync(countersignStartStep, dto, stepHandlers, expiredTime, cancellationToken);
|
|
|
nextSteps = new List<WorkflowStep> { countersignEndStep };
|
|
|
|
|
|
//create trace
|
|
@@ -1403,7 +1433,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
}
|
|
|
|
|
|
private async Task<WorkflowStep> CreateCountersignEndStepAsync(WorkflowStep countersignStartStep,
|
|
|
- BasicWorkflowDto dto, DateTime? expiredTime, CancellationToken cancellationToken)
|
|
|
+ BasicWorkflowDto dto, List<WorkflowStepHandler> stepHandlers, DateTime? expiredTime,
|
|
|
+ CancellationToken cancellationToken = default)
|
|
|
{
|
|
|
var csEndStep = _mapper.Map<WorkflowStep>(countersignStartStep);
|
|
|
csEndStep.Status = EWorkflowStepStatus.WaitForAccept;
|
|
@@ -1411,21 +1442,26 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
csEndStep.PrevStepCode = null;
|
|
|
csEndStep.IsOrigin = false;
|
|
|
csEndStep.CountersignId = countersignStartStep.StartCountersignId;
|
|
|
- csEndStep.CountersignPosition = ECountersignPosition.Outer;
|
|
|
- csEndStep.CountersignSteps = new();
|
|
|
+ csEndStep.CountersignPosition = ECountersignPosition.End;
|
|
|
+ //csEndStep.CountersignSteps = new();
|
|
|
csEndStep.IsCountersignEndStep = true;
|
|
|
csEndStep.CountersignStartStepId = countersignStartStep.Id;
|
|
|
csEndStep.Name = dto.NextStepName;
|
|
|
//csEndStep.TimeLimit = GetTimeLimit("");
|
|
|
csEndStep.StepExpiredTime = expiredTime;
|
|
|
+ csEndStep.BusinessType = dto.BusinessType;
|
|
|
csEndStep.Handlers = countersignStartStep.Handlers
|
|
|
.Where(d => d.Key == countersignStartStep.HandlerId || d.Key == countersignStartStep.HandlerOrgId)
|
|
|
.ToList();
|
|
|
+ csEndStep.StepHandlers = stepHandlers;
|
|
|
|
|
|
csEndStep.Reset();
|
|
|
csEndStep.ResetParameters();
|
|
|
|
|
|
- await _workflowStepRepository.AddAsync(csEndStep, cancellationToken);
|
|
|
+ //await _workflowStepRepository.AddAsync(csEndStep, cancellationToken);
|
|
|
+ await _workflowStepRepository.AddNav(csEndStep)
|
|
|
+ .Include(d => d.StepHandlers)
|
|
|
+ .ExecuteCommandAsync();
|
|
|
return csEndStep;
|
|
|
}
|
|
|
|
|
@@ -1456,6 +1492,10 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
_sessionContext.RequiredOrgId, _sessionContext.OrgName,
|
|
|
_sessionContext.OrgAreaCode, _sessionContext.OrgAreaName,
|
|
|
_sessionContext.OrgIsCenter, opinion, nextStepCode);
|
|
|
+
|
|
|
+ var handler = step.FindActualHandler(_sessionContext.Roles, _sessionContext.RequiredUserId, _sessionContext.RequiredOrgId);
|
|
|
+ if (handler is not null)
|
|
|
+ handler.IsActualHandler = true;
|
|
|
}
|
|
|
|
|
|
|
|
@@ -1723,7 +1763,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
|
|
|
private async Task<bool> RecallAsync(Workflow workflow, BasicWorkflowDto dto, FlowAssignInfo flowAssignInfo,
|
|
|
StepDefine targetStepDefine, WorkflowStep targetStep, EWorkflowTraceStatus traceStatus,
|
|
|
- DateTime? expiredTime, CancellationToken cancellationToken)
|
|
|
+ List<WorkflowStepHandler> stepHandlers, DateTime? expiredTime, CancellationToken cancellationToken)
|
|
|
{
|
|
|
var targetIsStartStep = targetStepDefine.StepType is EStepType.Start;
|
|
|
|
|
@@ -1740,7 +1780,10 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
var removeSteps = GetStepsBehindTargetStep(workflow.Steps, targetStep);
|
|
|
if (removeSteps.Any())
|
|
|
{
|
|
|
- await _workflowStepRepository.RemoveRangeAsync(removeSteps, cancellationToken);
|
|
|
+ //await _workflowStepRepository.RemoveRangeAsync(removeSteps, cancellationToken);
|
|
|
+ await _workflowStepRepository.RemoveNav(removeSteps)
|
|
|
+ .Include(d => d.StepHandlers)
|
|
|
+ .ExecuteCommandAsync();
|
|
|
workflow.Steps.RemoveAll(d => removeSteps.Contains(d));
|
|
|
}
|
|
|
|
|
@@ -1750,39 +1793,39 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
workflow.SetStatusRunnable();
|
|
|
|
|
|
var targetStepNew = targetIsStartStep
|
|
|
- ? await CreateStartStepAsync(workflow, targetStepDefine, dto, dto.NextHandlers, traceStatus, expiredTime,
|
|
|
+ ? await CreateStartStepAsync(workflow, targetStepDefine, dto, dto.NextHandlers, stepHandlers, traceStatus, expiredTime,
|
|
|
cancellationToken)
|
|
|
: (await CreateStepsAsync(workflow, targetStepDefine, targetPrevStep, dto,
|
|
|
- flowAssignInfo.FlowAssignType, dto.NextHandlers,
|
|
|
+ flowAssignInfo.FlowAssignType, dto.NextHandlers, stepHandlers,
|
|
|
null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, true, traceStatus,
|
|
|
- null, expiredTime, cancellationToken)).First();
|
|
|
+ null, expiredTime, cancellationToken: cancellationToken)).First();
|
|
|
|
|
|
|
|
|
- //更新当前办理节点信息
|
|
|
- //workflow.UpdateWorkflowCurrentStepInfo(dto.IsStartCountersign,
|
|
|
- // _sessionContext.RequiredUserId, _sessionContext.UserName,
|
|
|
- // _sessionContext.RequiredOrgId, _sessionContext.OrgName,
|
|
|
- // _sessionContext.OrgAreaCode, _sessionContext.OrgAreaName,
|
|
|
- // nextStep: targetStepNew);
|
|
|
+ //更新实际办理节点信息
|
|
|
workflow.UpdateActualStepWhenAssign(targetStepNew, targetStep.HandlerOrgName, targetStep.HandlerOrgId);
|
|
|
|
|
|
//calc workflow expired time
|
|
|
var isOrgToCenter = CheckIfFlowFromOrgToCenter(workflow, targetStep);
|
|
|
- //if (isOrgToCenter)
|
|
|
- // workflow.ExpiredTime = CalculateExpiredTime("");//todo calc expiredTime
|
|
|
-
|
|
|
+
|
|
|
return isOrgToCenter;
|
|
|
}
|
|
|
|
|
|
- private ICollection<WorkflowStep> GetStepsBehindTargetStep(List<WorkflowStep> steps, WorkflowStep targetStep)
|
|
|
+ private List<WorkflowStep> GetStepsBehindTargetStep(List<WorkflowStep> steps, WorkflowStep targetStep)
|
|
|
{
|
|
|
var behindSteps = new List<WorkflowStep> { targetStep };
|
|
|
- var nextSteps = steps.Where(d => d.PrevStepId == targetStep.Id).ToList();
|
|
|
+ if (!steps.Any()) return behindSteps;
|
|
|
+
|
|
|
+ var nextSteps = targetStep.IsStartCountersign
|
|
|
+ ? steps.Where(d => d.CountersignId == targetStep.StartCountersignId).ToList()
|
|
|
+ : steps.Where(d => d.PrevStepId == targetStep.Id).ToList();
|
|
|
+
|
|
|
+ //var nextSteps = steps.Where(d => d.PrevStepId == targetStep.Id).ToList();
|
|
|
if (!nextSteps.Any())
|
|
|
return behindSteps;
|
|
|
foreach (var nextStep in nextSteps)
|
|
|
{
|
|
|
- behindSteps.AddRange(GetStepsBehindTargetStep(steps, nextStep));
|
|
|
+ var leftSteps = steps.Except(behindSteps).ToList();
|
|
|
+ behindSteps.AddRange(GetStepsBehindTargetStep(leftSteps, nextStep));
|
|
|
}
|
|
|
|
|
|
return behindSteps;
|
|
@@ -1804,6 +1847,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
Workflow workflow,
|
|
|
StepDefine endStepDefine,
|
|
|
WorkflowStep prevStep,
|
|
|
+ List<WorkflowStepHandler> stepHandlers,
|
|
|
CancellationToken cancellationToken)
|
|
|
{
|
|
|
if (workflow.Steps.Any(d => d.StepType == EStepType.End))
|
|
@@ -1812,8 +1856,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
var handler = new Kv { Key = _sessionContext.RequiredUserId, Value = _sessionContext.UserName };
|
|
|
|
|
|
var step = CreateStep(workflow, endStepDefine, prevStep, null, new List<Kv> { handler },
|
|
|
- null, null, null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, DateTime.Now,
|
|
|
- endStepDefine.Name, true);
|
|
|
+ stepHandlers, null, null, null, EWorkflowStepStatus.WaitForAccept,
|
|
|
+ ECountersignPosition.None, DateTime.Now, endStepDefine.Name, true);
|
|
|
|
|
|
//step.Accept(_sessionContext.RequiredUserId, _sessionContext.UserName,
|
|
|
// _sessionContext.RequiredOrgId, _sessionContext.OrgName,
|
|
@@ -1837,6 +1881,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
FlowAssignInfo flowAssignInfo,
|
|
|
EWorkflowTraceStatus traceStatus,
|
|
|
DateTime? expiredTime,
|
|
|
+ List<WorkflowStepHandler> stepHandlers,
|
|
|
CancellationToken cancellationToken)
|
|
|
{
|
|
|
List<Kv> handlers;
|
|
@@ -1859,8 +1904,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
}
|
|
|
|
|
|
return await CreateStepsAsync(workflow, stepDefine, prevStep, dto, flowAssignInfo.FlowAssignType, handlers,
|
|
|
- null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, true, traceStatus,
|
|
|
- null, expiredTime, cancellationToken);
|
|
|
+ stepHandlers, null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None,
|
|
|
+ true, traceStatus, null, expiredTime, cancellationToken);
|
|
|
}
|
|
|
|
|
|
private async Task<List<WorkflowStep>> CreateStepsAsync(
|
|
@@ -1870,6 +1915,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
BasicWorkflowDto dto,
|
|
|
EFlowAssignType? flowAssignType,
|
|
|
List<Kv> handlers,
|
|
|
+ List<WorkflowStepHandler> stepHandlers,
|
|
|
string? countersignId,
|
|
|
EWorkflowStepStatus stepStatus,
|
|
|
ECountersignPosition csPosition,
|
|
@@ -1880,18 +1926,18 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
CancellationToken cancellationToken = default
|
|
|
)
|
|
|
{
|
|
|
- //var countersignId = prevStep.IsStartCountersign
|
|
|
- // ? prevStep.StartCountersignId
|
|
|
- // : prevStep.IsInCountersign() ? prevStep.Id : null;
|
|
|
-
|
|
|
List<WorkflowStep> steps = new();
|
|
|
if (dto.IsStartCountersign)
|
|
|
{
|
|
|
foreach (var handler in handlers)
|
|
|
{
|
|
|
- var step = CreateStep(workflow, stepDefine, prevStep, flowAssignType, new List<Kv> { handler },
|
|
|
- dto.NextStepCode, dto.NextMainHandler, countersignId,
|
|
|
- stepStatus, csPosition, expiredTime, dto.NextStepName, isOrigin, handlerType);
|
|
|
+ var step = CreateStep(workflow, stepDefine, prevStep, flowAssignType,
|
|
|
+ new List<Kv> { handler }, new(), dto.NextStepCode,
|
|
|
+ dto.NextMainHandler, countersignId, stepStatus, csPosition, expiredTime,
|
|
|
+ dto.NextStepName, isOrigin, handlerType, dto.BusinessType);
|
|
|
+
|
|
|
+ var stepHandler = stepHandlers.First(d => d.GetHandler().Key == handler.Key);
|
|
|
+ step.StepHandlers = new List<WorkflowStepHandler> { stepHandler };
|
|
|
|
|
|
steps.Add(step);
|
|
|
}
|
|
@@ -1899,13 +1945,16 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
else
|
|
|
{
|
|
|
var step = CreateStep(workflow, stepDefine, prevStep, flowAssignType, handlers,
|
|
|
- dto.NextStepCode, dto.NextMainHandler, countersignId,
|
|
|
- stepStatus, csPosition, expiredTime, dto.NextStepName, isOrigin, handlerType);
|
|
|
+ stepHandlers, dto.NextStepCode, dto.NextMainHandler, countersignId, stepStatus,
|
|
|
+ csPosition, expiredTime, dto.NextStepName, isOrigin, handlerType, dto.BusinessType);
|
|
|
|
|
|
steps.Add(step);
|
|
|
}
|
|
|
|
|
|
- await _workflowStepRepository.AddRangeAsync(steps, cancellationToken);
|
|
|
+ //await _workflowStepRepository.AddRangeAsync(steps, cancellationToken);
|
|
|
+ await _workflowStepRepository.AddNav(steps)
|
|
|
+ .Include(d => d.StepHandlers)
|
|
|
+ .ExecuteCommandAsync();
|
|
|
|
|
|
//create traces todo add range traces
|
|
|
foreach (var step in steps)
|
|
@@ -2011,7 +2060,10 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
|
|
|
HandleStepsByTerminalCs(startCountersignStep, workflow.Steps, workflow.Traces, ref updateSteps, ref updateTraces);
|
|
|
if (updateSteps.Any())
|
|
|
- await _workflowStepRepository.RemoveRangeAsync(updateSteps, cancellationToken);
|
|
|
+ //await _workflowStepRepository.RemoveRangeAsync(updateSteps, cancellationToken);
|
|
|
+ await _workflowStepRepository.RemoveNav(updateSteps)
|
|
|
+ .Include(d => d.StepHandlers)
|
|
|
+ .ExecuteCommandAsync();
|
|
|
if (updateTraces.Any())
|
|
|
await _workflowTraceRepository.UpdateRangeAsync(updateTraces, cancellationToken);
|
|
|
|
|
@@ -2074,10 +2126,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
var isHandled = step.Status is EWorkflowStepStatus.Handled;
|
|
|
var opinion = $"会签未办理完成,由 {_sessionContext.OrgName} 的 {_sessionContext.UserName} 终止办理";
|
|
|
if (step.IsStartCountersign)
|
|
|
- {
|
|
|
- step.CountersignSteps.ForEach(d => d.Completed = true);
|
|
|
step.CountersignEnd();
|
|
|
- }
|
|
|
|
|
|
if (step.Status is not EWorkflowStepStatus.Handled)
|
|
|
{
|
|
@@ -2158,6 +2207,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
WorkflowStep prevStep,
|
|
|
EFlowAssignType? flowAssignType,
|
|
|
List<Kv> handlers,
|
|
|
+ List<WorkflowStepHandler> stepHandlers,
|
|
|
string nextStepCode,
|
|
|
string? nextMainHandler,
|
|
|
string? countersignId,
|
|
@@ -2166,7 +2216,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
DateTime? expiredTime,
|
|
|
string stepName,
|
|
|
bool isOrigin,
|
|
|
- EHandlerType? handlerType = null //动态节点依据动态策略判断
|
|
|
+ EHandlerType? handlerType = null, //动态节点依据动态策略判断
|
|
|
+ EBusinessType? businessType = null
|
|
|
)
|
|
|
{
|
|
|
if (!handlers.Any())
|
|
@@ -2178,6 +2229,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
|
|
|
step.FlowAssignType = flowAssignType;
|
|
|
step.Handlers = handlers;
|
|
|
+ step.StepHandlers = stepHandlers;
|
|
|
step.NextStepCode = step.StepType is EStepType.End ? string.Empty : nextStepCode;
|
|
|
step.IsMain = isMain;
|
|
|
step.PrevStepId = prevStep.Id;
|
|
@@ -2192,6 +2244,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
|
|
|
if (handlerType.HasValue)
|
|
|
step.HandlerType = handlerType.Value;
|
|
|
+ if (businessType.HasValue)
|
|
|
+ step.BusinessType = businessType.Value;
|
|
|
|
|
|
return step;
|
|
|
}
|