|
@@ -1,21 +1,15 @@
|
|
|
using Hotline.FlowEngine.Definitions;
|
|
|
using Hotline.FlowEngine.Notifications;
|
|
|
using Hotline.FlowEngine.WfModules;
|
|
|
-using Hotline.Orders;
|
|
|
-using Hotline.SeedData;
|
|
|
using Hotline.Share.Dtos.FlowEngine;
|
|
|
using Hotline.Share.Enums.FlowEngine;
|
|
|
using Hotline.Share.Enums.Order;
|
|
|
-using Hotline.Users;
|
|
|
using MapsterMapper;
|
|
|
using MediatR;
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
-using SqlSugar;
|
|
|
using XF.Domain.Authentications;
|
|
|
using XF.Domain.Dependency;
|
|
|
-using XF.Domain.Entities;
|
|
|
using XF.Domain.Exceptions;
|
|
|
-using XF.Utility.SequentialId;
|
|
|
|
|
|
namespace Hotline.FlowEngine.Workflows
|
|
|
{
|
|
@@ -70,7 +64,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
DefinitionId = definition.Id,
|
|
|
Status = EWorkflowStatus.Runnable,
|
|
|
TimeLimit = GetTimeLimit(definition.Code),
|
|
|
- ExpiredTime = GenerateExpiredTime(definition.Code),
|
|
|
+ ExpiredTime = CalculateExpiredTime(definition.Code),
|
|
|
StepBoxes = new(),
|
|
|
Traces = new(),
|
|
|
Definition = definition,
|
|
@@ -95,50 +89,60 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
public async Task StartAsync(Workflow workflow, BasicWorkflowDto dto, StepDefine nextStepBoxDefine,
|
|
|
bool isStartCountersign, FlowAssignMode flowAssignMode, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- //var nextStepBoxDefine = GetStepBoxDefine(workflow.Definition, dto.NextStepCode);
|
|
|
+ ////var nextStepBoxDefine = GetStepBoxDefine(workflow.Definition, dto.NextStepCode);
|
|
|
|
|
|
- //1. 如果不是按角色指派,handlers必填 2. 如果按角色指派,handlers可以不选
|
|
|
- if (nextStepBoxDefine.HandlerType is not EHandlerType.Role && !dto.NextHandlers.Any())
|
|
|
- throw UserFriendlyException.SameMessage("未指派办理人");
|
|
|
+ ////1. 如果不是按角色指派,handlers必填 2. 如果按角色指派,handlers可以不选
|
|
|
+ //if (nextStepBoxDefine.HandlerType is not EHandlerType.Role && !dto.NextHandlers.Any())
|
|
|
+ // throw UserFriendlyException.SameMessage("未指派办理人");
|
|
|
|
|
|
- //开始节点
|
|
|
- var (startStepBox, startStep) = await CreateStartStepAsync(workflow, dto, cancellationToken);
|
|
|
+ ////开始节点
|
|
|
+ //var (startStepBox, startStep) = await CreateStartStepAsync(workflow, dto, cancellationToken);
|
|
|
|
|
|
- //var isStartCountersign = startStep.ShouldStartCountersign(dto.NextHandlers.Count);
|
|
|
- //检查是否支持会签
|
|
|
- //if (isStartCountersign && startStep.CountersignMode == ECountersignMode.UnSupport)
|
|
|
- // throw new UserFriendlyException($"当前节点不支持发起会签, stepId: {startStep.Id}", "当前节点不支持发起会签");
|
|
|
+ ////var isStartCountersign = startStep.ShouldStartCountersign(dto.NextHandlers.Count);
|
|
|
+ ////检查是否支持会签
|
|
|
+ ////if (isStartCountersign && startStep.CountersignMode == ECountersignMode.UnSupport)
|
|
|
+ //// throw new UserFriendlyException($"当前节点不支持发起会签, stepId: {startStep.Id}", "当前节点不支持发起会签");
|
|
|
|
|
|
- if (isStartCountersign)
|
|
|
- {
|
|
|
- //创建会签数据
|
|
|
- var countersign = await StartCountersignAsync(workflow.Id, startStep, startStepBox.CountersignEndStepCode,
|
|
|
- dto.NextHandlers.Count, startStep.CountersignId, cancellationToken);
|
|
|
- startStep.StartCountersignId = countersign.Id;
|
|
|
- await _workflowStepRepository.UpdateAsync(startStep, cancellationToken);
|
|
|
- }
|
|
|
+ //if (isStartCountersign)
|
|
|
+ //{
|
|
|
+ // //创建会签数据
|
|
|
+ // var countersign = await StartCountersignAsync(workflow.Id, startStep, startStepBox.CountersignEndStepCode,
|
|
|
+ // dto.NextHandlers.Count, startStep.CountersignId, cancellationToken);
|
|
|
+ // startStep.StartCountersignId = countersign.Id;
|
|
|
+ // await _workflowStepRepository.UpdateAsync(startStep, cancellationToken);
|
|
|
+ //}
|
|
|
|
|
|
- ////开始节点trace
|
|
|
- //await AcceptTraceAsync(workflow, startStepBox, startStep, cancellationToken);
|
|
|
- await NextTraceAsync(workflow, dto, startStep, cancellationToken);
|
|
|
+ //////开始节点trace
|
|
|
+ ////await AcceptTraceAsync(workflow, startStepBox, startStep, cancellationToken);
|
|
|
+ //await NextTraceAsync(workflow, dto, startStep, cancellationToken);
|
|
|
|
|
|
- //第二节点(创建即为 已指派/待接办 状态)
|
|
|
- var nextStepBox = await CreateStepAsync(isStartCountersign, workflow, nextStepBoxDefine, dto, EWorkflowStepStatus.Assigned,
|
|
|
- startStepBox, startStep, EWorkflowTraceStatus.Normal, cancellationToken);
|
|
|
+ ////第二节点(创建即为 已指派/待接办 状态)
|
|
|
+ //var nextStepBox = await CreateStepAsync(isStartCountersign, workflow, nextStepBoxDefine, dto, EWorkflowStepStatus.Assigned,
|
|
|
+ // startStepBox, startStep, EWorkflowTraceStatus.Normal, cancellationToken);
|
|
|
|
|
|
- //更新当前节点名称、时间、会签节点code 等字段
|
|
|
- workflow.SetWorkflowCurrentStepInfo(isStartCountersign, nextStepBox);
|
|
|
+ ////更新实际办理节点名称、时间
|
|
|
+ //workflow.SetWorkflowActualHandleInfo(startStepBox, nextStepBox, _sessionContext.OrgName, _sessionContext.RequiredOrgCode);
|
|
|
|
|
|
- workflow.UpdateHandlers(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgCode,
|
|
|
- flowAssignMode.FlowAssignType, flowAssignMode.HandlerObjects);
|
|
|
+ ////发起会签时记录顶层会签节点
|
|
|
+ //if (isStartCountersign)
|
|
|
+ // workflow.SetTopCountersignStepCode(startStepBox.Code);
|
|
|
|
|
|
- //更新指派信息
|
|
|
- workflow.Assign(flowAssignMode.FlowAssignType, flowAssignMode.GetHandlers());
|
|
|
+ //workflow.UpdateHandlers(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgCode,
|
|
|
+ //flowAssignMode.FlowAssignType, flowAssignMode.HandlerObjects);
|
|
|
|
|
|
- await _workflowRepository.UpdateAsync(workflow, cancellationToken);
|
|
|
+ //////更新指派信息
|
|
|
+ ////workflow.Assign(flowAssignMode.FlowAssignType, flowAssignMode.GetHandlers());
|
|
|
+
|
|
|
+ //await _workflowRepository.UpdateAsync(workflow, cancellationToken);
|
|
|
|
|
|
- //publish
|
|
|
- await _mediator.Publish(new StartWorkflowNotify(workflow, dto, isStartCountersign, flowAssignMode), cancellationToken);
|
|
|
+ ////publish
|
|
|
+ //await _mediator.Publish(new StartWorkflowNotify(workflow, dto, isStartCountersign, flowAssignMode), cancellationToken);
|
|
|
+ }
|
|
|
+
|
|
|
+ public async Task StartAsync(Workflow workflow, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ //开始节点
|
|
|
+ await CreateStartStepAsync(workflow, cancellationToken);
|
|
|
}
|
|
|
|
|
|
public async Task<Workflow> GetWorkflowAsync(string workflowId,
|
|
@@ -152,8 +156,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
query = query.Includes(d => d.Definition);
|
|
|
if (withSupplements)
|
|
|
query = query.Includes(d => d.Supplements, d => d.Creator);
|
|
|
- if (withAssigns)
|
|
|
- query = query.Includes(d => d.Assigns);
|
|
|
+ //if (withAssigns)
|
|
|
+ // query = query.Includes(d => d.Assigns);
|
|
|
if (withCountersigns)
|
|
|
query = query.Includes(d => d.Countersigns);
|
|
|
|
|
@@ -183,6 +187,18 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
return workflow;
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 查询工作流包含当前用户办理权限(是否可办理)
|
|
|
+ /// </summary>
|
|
|
+ public async Task<(Workflow, bool)> GetWorkflowHandlePermissionAsync(string workflowId, string userId, string orgCode, bool withDefine = false,
|
|
|
+ bool withSteps = false, bool withTraces = false, bool withSupplements = false, bool withAssigns = false,
|
|
|
+ bool withCountersigns = false, CancellationToken cancellationToken = default)
|
|
|
+ {
|
|
|
+ var workflow = await GetWorkflowAsync(workflowId, withDefine, withSteps, withTraces, withSupplements, withAssigns, withCountersigns, cancellationToken);
|
|
|
+ var canHandle = workflow.CanHandle(userId, orgCode);
|
|
|
+ return (workflow, canHandle);
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 受理(接办)
|
|
|
/// </summary>
|
|
@@ -240,7 +256,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
/// 办理(流转至下一节点)
|
|
|
/// </summary>
|
|
|
public async Task NextAsync(Workflow workflow, BasicWorkflowDto dto, StepDefine nextStepBoxDefine,
|
|
|
- bool isOutFromCallCenter, bool isStartCountersign, FlowAssignMode flowAssignMode, CancellationToken cancellationToken)
|
|
|
+ bool isStartCountersign, FlowAssignMode flowAssignMode, CancellationToken cancellationToken)
|
|
|
{
|
|
|
ValidatePermission(workflow);
|
|
|
CheckWhetherRunnable(workflow.Status);
|
|
@@ -251,12 +267,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
if (currentStep.Status is EWorkflowStepStatus.Completed or EWorkflowStepStatus.Created)
|
|
|
throw UserFriendlyException.SameMessage("当前节点状态无法办理");
|
|
|
|
|
|
- //var isStartCountersign = currentStep.ShouldStartCountersign(dto.NextHandlers.Count);
|
|
|
- //检查是否支持发起会签
|
|
|
- //if (isStartCountersign && currentStep.CountersignMode == ECountersignMode.UnSupport)
|
|
|
- // throw new UserFriendlyException($"当前节点不支持发起会签, stepId: {currentStep.Id}", "当前节点不支持发起会签");
|
|
|
- if (isStartCountersign && nextStepBoxDefine.StepType is EStepType.CountersignEnd)
|
|
|
- throw new UserFriendlyException($"汇总节点不支持办理会签, stepId: {currentStep.Id}", "汇总节点不支持办理会签");
|
|
|
+ //if (isStartCountersign && nextStepBoxDefine.StepType is EStepType.CountersignEnd)
|
|
|
+ // throw new UserFriendlyException($"汇总节点不支持办理会签, stepId: {currentStep.Id}", "汇总节点不支持办理会签");
|
|
|
|
|
|
if (currentStep.Status is EWorkflowStepStatus.Assigned)
|
|
|
await AcceptAsync(workflow,
|
|
@@ -355,10 +367,11 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
}
|
|
|
|
|
|
//是否从中心流转出去,重新计算expiredTime
|
|
|
- if (isOutFromCallCenter)
|
|
|
+ var isFromCenterToOrg = CheckIfFlowFromCenterToOrg(currentStepBox, nextStepBoxDefine);
|
|
|
+ if (isFromCenterToOrg)
|
|
|
{
|
|
|
workflow.ProcessType = EProcessType.Jiaoban;
|
|
|
- workflow.ExpiredTime = GenerateExpiredTime(workflow.Definition.Code);
|
|
|
+ workflow.ExpiredTime = CalculateExpiredTime(workflow.Definition.Code);
|
|
|
workflow.AssignTime = DateTime.Now;
|
|
|
}
|
|
|
|
|
@@ -416,11 +429,15 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
await _mediator.Publish(new CountersignEndAssigned(workflow), cancellationToken);
|
|
|
}
|
|
|
|
|
|
- //更新workflow当前节点名称、时间、会签节点code 等字段
|
|
|
- workflow.SetWorkflowCurrentStepInfo(isStartCountersign, nextStepBox);
|
|
|
+ //更新实际办理节点名称、时间
|
|
|
+ workflow.SetWorkflowActualHandleInfo(currentStepBox, nextStepBox, _sessionContext.OrgName, _sessionContext.RequiredOrgCode);
|
|
|
+
|
|
|
+ //发起会签时记录顶层会签节点
|
|
|
+ if (isStartCountersign)
|
|
|
+ workflow.SetTopCountersignStepCode(currentStepBox.Code);
|
|
|
|
|
|
- //更新指派信息
|
|
|
- workflow.Assign(flowAssignMode.FlowAssignType, flowAssignMode.GetHandlers());
|
|
|
+ ////更新指派信息
|
|
|
+ //workflow.Assign(flowAssignMode.FlowAssignType, flowAssignMode.GetHandlers());
|
|
|
|
|
|
await _workflowRepository.UpdateAsync(workflow, cancellationToken);
|
|
|
|
|
@@ -432,7 +449,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
- await _mediator.Publish(new NextStepNotify(workflow, dto, trace, isStartCountersign, isCountersignOver, flowAssignMode), cancellationToken);
|
|
|
+ await _mediator.Publish(new NextStepNotify(workflow, dto, trace, isFromCenterToOrg, isStartCountersign, isCountersignOver, flowAssignMode), cancellationToken);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -457,22 +474,27 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
if (prevStep == null)
|
|
|
throw UserFriendlyException.SameMessage("未查询到前一节点");
|
|
|
|
|
|
+ //update trace
|
|
|
+ await PreviousTraceAsync(workflow.Id, dto, currentStep, cancellationToken);
|
|
|
+
|
|
|
//检查并重置上级stepbox状态为待接办
|
|
|
await ResetStepBoxStatusAsync(prevStepBox, cancellationToken);
|
|
|
|
|
|
- //复制一个节点为待接办
|
|
|
- var newPrevStep = await CreateByAsync(prevStep, cancellationToken);
|
|
|
+ //复制上一个节点为待接办
|
|
|
+ var newPrevStep = await CreateByAsync(workflow, prevStep, cancellationToken);
|
|
|
|
|
|
//remove workflow.steps
|
|
|
- await _workflowStepRepository.RemoveRangeAsync(new List<WorkflowStep> { prevStep, currentStep },
|
|
|
- cancellationToken);
|
|
|
+ await _workflowStepRepository.RemoveRangeAsync(new List<WorkflowStep> { currentStepBox, currentStep, prevStep }, cancellationToken);
|
|
|
|
|
|
//更新流程可办理对象
|
|
|
workflow.UpdatePreviousHandlers(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgCode, newPrevStep);
|
|
|
- await _workflowRepository.UpdateAsync(workflow, cancellationToken);
|
|
|
|
|
|
- //update trace
|
|
|
- await PreviousTraceAsync(workflow.Id, dto, currentStep, cancellationToken);
|
|
|
+ //orgToCenter会触发重新计算期满时间,1.无需审核按当前时间进行计算 2.需审核按审核通过时间计算
|
|
|
+ var isOrgToCenter = CheckIfFlowFromOrgToCenter(currentStepBox, prevStepBox);
|
|
|
+ if (isOrgToCenter)
|
|
|
+ workflow.ExpiredTime = CalculateExpiredTime("");
|
|
|
+
|
|
|
+ await _workflowRepository.UpdateAsync(workflow, cancellationToken);
|
|
|
|
|
|
await _mediator.Publish(new PreviousNotify(workflow, dto), cancellationToken);
|
|
|
}
|
|
@@ -485,10 +507,6 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
//ValidatePermission(workflow);
|
|
|
CheckWhetherRunnable(workflow.Status);
|
|
|
|
|
|
- //var (currentStepBox, currentStep) = GetUnCompleteStep(workflow.StepBoxes, _sessionContext.RequiredOrgCode, _sessionContext.RequiredUserId);
|
|
|
- //if (currentStepBox.StepType is EStepType.Start)
|
|
|
- // throw UserFriendlyException.SameMessage("当前流程已退回到开始节点");
|
|
|
-
|
|
|
//update uncompleted traces
|
|
|
await RecallTraceAsync(workflow.Id, dto, cancellationToken);
|
|
|
|
|
@@ -499,6 +517,12 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
await RecallAsync(workflow, dto, targetStepDefine, targetStepBox, isStartCountersign, EWorkflowTraceStatus.Recall, cancellationToken);
|
|
|
|
|
|
workflow.ResetHandlers(flowAssignMode.FlowAssignType, flowAssignMode.HandlerObjects);
|
|
|
+
|
|
|
+ //calc workflow expired time
|
|
|
+ var isOrgToCenter = CheckIfFlowFromOrgToCenter(workflow, targetStepBox);
|
|
|
+ if (isOrgToCenter)
|
|
|
+ workflow.ExpiredTime = CalculateExpiredTime("");
|
|
|
+
|
|
|
await _workflowRepository.UpdateAsync(workflow, cancellationToken);
|
|
|
|
|
|
await _mediator.Publish(new RecallNotify(workflow, dto), cancellationToken);
|
|
@@ -512,12 +536,6 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
{
|
|
|
CheckWhetherRunnable(workflow.Status);
|
|
|
|
|
|
- //var (currentStepBox, currentStep) = GetUnCompleteStep(workflow.StepBoxes, _sessionContext.RequiredOrgCode, _sessionContext.RequiredUserId);
|
|
|
- //if (currentStepBox.StepType is EStepType.Start)
|
|
|
- // throw UserFriendlyException.SameMessage("当前流程已退回到开始节点");
|
|
|
- //if (currentStepBox.StepType is EStepType.End)
|
|
|
- // throw UserFriendlyException.SameMessage("当前流程已流转到结束节点");
|
|
|
-
|
|
|
//update uncompleted traces
|
|
|
await JumpTraceAsync(workflow.Id, dto, cancellationToken);
|
|
|
|
|
@@ -536,6 +554,11 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
|
|
|
await ResetWorkflowCurrentStepInfo(workflow, dto, targetStepBox, isStartCountersign, cancellationToken);
|
|
|
|
|
|
+ //calc workflow expired time
|
|
|
+ var isCenterToOrg = CheckIfFlowFromCenterToOrg(workflow, targetStepBox);
|
|
|
+ if (isCenterToOrg)
|
|
|
+ workflow.ExpiredTime = CalculateExpiredTime("");
|
|
|
+
|
|
|
#region 补充中间节点处理方案(暂不需要)
|
|
|
|
|
|
//var completeStepCodes = workflow.StepBoxes.Select(d => d.Code);
|
|
@@ -626,10 +649,70 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
|
|
|
#region private
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 检查是否从中心流转至部门
|
|
|
+ /// </summary>
|
|
|
+ private bool CheckIfFlowFromCenterToOrg(WorkflowStep sourceStepBox, StepDefine targetStepBoxDefine)
|
|
|
+ {
|
|
|
+ var isFromCenter = sourceStepBox.IsCenter();
|
|
|
+ if (!isFromCenter) return false;
|
|
|
+
|
|
|
+ var isToOrg = targetStepBoxDefine.IsOrg();
|
|
|
+ return isFromCenter && isToOrg;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 检查是否从中心流转至部门
|
|
|
+ /// </summary>
|
|
|
+ private bool CheckIfFlowFromCenterToOrg(Workflow workflow, WorkflowStep targetStepBox)
|
|
|
+ {
|
|
|
+ var isToOrg = targetStepBox.IsOrg();
|
|
|
+ if (!isToOrg) return false;
|
|
|
+
|
|
|
+ var isFromCenter = workflow.StepBoxes.All(d => d.BusinessProperty is not EBusinessProperty.Department);
|
|
|
+ return isFromCenter && isToOrg;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 检查是否从部门流转至中心
|
|
|
+ /// </summary>
|
|
|
+ private bool CheckIfFlowFromOrgToCenter(WorkflowStep sourceStepBox, StepDefine targetStepBoxDefine)
|
|
|
+ {
|
|
|
+ var isFromOrg = sourceStepBox.IsOrg();
|
|
|
+ if (!isFromOrg) return false;
|
|
|
+
|
|
|
+ var isToCenter = targetStepBoxDefine.IsCenter();
|
|
|
+ return isFromOrg && isToCenter;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 检查是否从部门流转至中心
|
|
|
+ /// </summary>
|
|
|
+ private bool CheckIfFlowFromOrgToCenter(WorkflowStep sourceStepBox, WorkflowStep targetStepBox)
|
|
|
+ {
|
|
|
+ var isFromOrg = sourceStepBox.IsOrg();
|
|
|
+ if (!isFromOrg) return false;
|
|
|
+
|
|
|
+ var isToCenter = targetStepBox.IsCenter();
|
|
|
+ return isFromOrg && isToCenter;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 检查是否从部门流转至中心
|
|
|
+ /// </summary>
|
|
|
+ private bool CheckIfFlowFromOrgToCenter(Workflow workflow, WorkflowStep targetStepBox)
|
|
|
+ {
|
|
|
+ var isToCenter = targetStepBox.IsCenter();
|
|
|
+ if (!isToCenter) return false;
|
|
|
+
|
|
|
+ var isFromOrg = workflow.StepBoxes.Any(d => d.BusinessProperty is EBusinessProperty.Department);
|
|
|
+ return isFromOrg && isToCenter;
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 复制一个节点为待接办
|
|
|
/// </summary>
|
|
|
- private async Task<WorkflowStep> CreateByAsync(WorkflowStep step, CancellationToken cancellationToken)
|
|
|
+ private async Task<WorkflowStep> CreateByAsync(Workflow workflow, WorkflowStep step, CancellationToken cancellationToken)
|
|
|
{
|
|
|
step.Reset();
|
|
|
var newStep = _mapper.Map<WorkflowStep>(step);
|
|
@@ -642,6 +725,9 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
newStep.CountersignId = step.CountersignId;
|
|
|
newStep.IsStartedCountersignComplete = step.IsStartedCountersignComplete;
|
|
|
await _workflowStepRepository.AddAsync(newStep, cancellationToken);
|
|
|
+
|
|
|
+ await CreateTraceAsync(workflow, newStep, EWorkflowTraceStatus.Back, cancellationToken);
|
|
|
+
|
|
|
return newStep;
|
|
|
}
|
|
|
|
|
@@ -880,7 +966,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
{
|
|
|
//更新当前节点名称、时间、会签节点code
|
|
|
workflow.CloseCountersignStatus();
|
|
|
- workflow.SetWorkflowCurrentStepInfo(isStartCountersign, stepBox);
|
|
|
+ //todo
|
|
|
+ //workflow.SetWorkflowActualHandleInfo(isStartCountersign, stepBox);
|
|
|
await _workflowRepository.UpdateAsync(workflow, cancellationToken);
|
|
|
}
|
|
|
|
|
@@ -921,6 +1008,29 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
return (stepBox, step);
|
|
|
}
|
|
|
|
|
|
+ private async Task<(WorkflowStep stepBox, WorkflowStep step)> CreateStartStepAsync(Workflow workflow, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ if (workflow.StepBoxes.Any())
|
|
|
+ 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 startStepBox = CreateStepBox(workflow.Id, startStepDefinition, string.Empty);
|
|
|
+ await _workflowStepRepository.AddAsync(startStepBox, cancellationToken);
|
|
|
+
|
|
|
+ //start节点的办理人分类默认为用户,即为当前发起流程的操作员
|
|
|
+ var handler = new IdName { Id = _sessionContext.RequiredUserId, Name = _sessionContext.UserName };
|
|
|
+ //开始节点的下一个节点(工单业务:话务员节点)
|
|
|
+ var firstStepCode = workflow.Definition.Steps.First(d => d.StepType == EStepType.Start).NextSteps.First().Code;
|
|
|
+ var firstStep = workflow.Definition.Steps.First(d => d.Code == firstStepCode);
|
|
|
+ var step = await CreateStartSubStepAsync(handler, firstStep, startStepBox, cancellationToken);
|
|
|
+
|
|
|
+ //开始节点trace
|
|
|
+ await CreateTraceAsync(workflow, step, cancellationToken: cancellationToken);
|
|
|
+ return (startStepBox, step);
|
|
|
+ }
|
|
|
+
|
|
|
private async Task<(WorkflowStep stepBox, WorkflowStep step)> CreateEndStepAsync(
|
|
|
Workflow workflow,
|
|
|
StepDefine endStepDefine,
|
|
@@ -985,6 +1095,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
return stepBox;
|
|
|
}
|
|
|
|
|
|
+ //todo obsolete
|
|
|
private async Task<WorkflowStep> CreateStartSubStepAsync(
|
|
|
IdName handler,
|
|
|
BasicWorkflowDto dto,
|
|
@@ -1008,6 +1119,29 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
return subStep;
|
|
|
}
|
|
|
|
|
|
+ private async Task<WorkflowStep> CreateStartSubStepAsync(
|
|
|
+ IdName handler,
|
|
|
+ StepDefine firstStepDefine,
|
|
|
+ WorkflowStep stepBox,
|
|
|
+ CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ //开始节点既不发起会签,也不处于会签中
|
|
|
+ var subStep = CreateSubStep(stepBox, new List<IdName> { handler }, firstStepDefine.Code, null,
|
|
|
+ null, null, EWorkflowStepStatus.Completed, EStepCountersignStatus.None);
|
|
|
+ subStep.Accept(_sessionContext.RequiredUserId, _sessionContext.UserName,
|
|
|
+ _sessionContext.RequiredOrgCode, _sessionContext.OrgName);
|
|
|
+
|
|
|
+ //step办理状态
|
|
|
+ subStep.Complete(
|
|
|
+ _sessionContext.RequiredUserId, _sessionContext.UserName,
|
|
|
+ _sessionContext.RequiredOrgCode, _sessionContext.OrgName,
|
|
|
+ firstStepDefine.Code);
|
|
|
+
|
|
|
+ stepBox.Steps.Add(subStep);
|
|
|
+ await _workflowStepRepository.AddAsync(subStep, cancellationToken);
|
|
|
+ return subStep;
|
|
|
+ }
|
|
|
+
|
|
|
private async Task<WorkflowStep> CreateEndSubStepAsync(
|
|
|
IdName handler,
|
|
|
WorkflowStep currentStepBox,
|
|
@@ -1186,24 +1320,34 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
/// 依据配置生成过期时间
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
- private DateTime GenerateExpiredTime(string defineCode)
|
|
|
+ private DateTime CalculateExpiredTime(string defineCode, DateTime? time = null)
|
|
|
{
|
|
|
- //GetConfig(string defineCode).Time
|
|
|
- return DateTime.Now.AddDays(7); //todo 依据配置生成, Think about 工作日
|
|
|
+ time ??= DateTime.Now;
|
|
|
+ var config = GetConfig(defineCode);
|
|
|
+ return time.Value.AddDays(config.Days);
|
|
|
}
|
|
|
|
|
|
private string GetTimeLimit(string defineCode)
|
|
|
{
|
|
|
- //return GetConfig(string defineCode).Description;
|
|
|
- return "7个工作日";
|
|
|
+ return GetConfig(defineCode).Description;
|
|
|
}
|
|
|
|
|
|
- //private ConfigInCludeDescriptionAndTime GetConfig(string defineCode)
|
|
|
- //{
|
|
|
- // throw new NotImplementedException();
|
|
|
- //}
|
|
|
+ private ConfigIncludeDescriptionAndTime GetConfig(string defineCode)
|
|
|
+ {
|
|
|
+ return new ConfigIncludeDescriptionAndTime
|
|
|
+ {
|
|
|
+ Days = 7,
|
|
|
+ Description = "7个工作日"//todo 依据配置生成, Think about 工作日
|
|
|
+ };
|
|
|
+ }
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
}
|
|
|
+
|
|
|
+ public class ConfigIncludeDescriptionAndTime
|
|
|
+ {
|
|
|
+ public int Days { get; set; }
|
|
|
+ public string Description { get; set; }
|
|
|
+ }
|
|
|
}
|