|
@@ -1,6 +1,7 @@
|
|
using Hotline.FlowEngine.Definitions;
|
|
using Hotline.FlowEngine.Definitions;
|
|
using Hotline.FlowEngine.Notifications;
|
|
using Hotline.FlowEngine.Notifications;
|
|
using Hotline.FlowEngine.WfModules;
|
|
using Hotline.FlowEngine.WfModules;
|
|
|
|
+using Hotline.Settings;
|
|
using Hotline.Share.Dtos.FlowEngine;
|
|
using Hotline.Share.Dtos.FlowEngine;
|
|
using Hotline.Share.Enums.FlowEngine;
|
|
using Hotline.Share.Enums.FlowEngine;
|
|
using Hotline.Share.Enums.Order;
|
|
using Hotline.Share.Enums.Order;
|
|
@@ -92,7 +93,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
//创建开始节点
|
|
//创建开始节点
|
|
var (startStepBox, startStep, firstStepBox) = await CreateStartAndFirstStepAsync(workflow, dto, cancellationToken);
|
|
var (startStepBox, startStep, firstStepBox) = await CreateStartAndFirstStepAsync(workflow, dto, cancellationToken);
|
|
|
|
|
|
- //todo 1.创建开始节点trace 2.创建firstStep(开始节点的下一个节点),firstStep为已办理 3.创建sec节点
|
|
|
|
|
|
+ //1.创建开始节点trace 2.创建firstStep(开始节点的下一个节点),办理firstStep 3.创建sec节点
|
|
//办理firstStep
|
|
//办理firstStep
|
|
var firstStep = firstStepBox.Steps.First();
|
|
var firstStep = firstStepBox.Steps.First();
|
|
var counterSignType = GetCounterSignType(firstStep.BusinessProperty);
|
|
var counterSignType = GetCounterSignType(firstStep.BusinessProperty);
|
|
@@ -110,14 +111,20 @@ namespace Hotline.FlowEngine.Workflows
|
|
EWorkflowStepStatus.Created, firstStepBox, firstStep, EWorkflowTraceStatus.Normal,
|
|
EWorkflowStepStatus.Created, firstStepBox, firstStep, EWorkflowTraceStatus.Normal,
|
|
workflow.ExpiredTime, cancellationToken);
|
|
workflow.ExpiredTime, cancellationToken);
|
|
|
|
|
|
- //更新实际办理节点名称、时间
|
|
|
|
- workflow.SetWorkflowActualHandleInfo(firstStepBox, secondStepBox, _sessionContext.OrgName, _sessionContext.RequiredOrgCode);
|
|
|
|
|
|
+ //更新实际办理节点信息
|
|
|
|
+ workflow.UpdateWorkflowActualHandleInfo(firstStepBox, firstStep,
|
|
|
|
+ _sessionContext.RequiredUserId, _sessionContext.UserName,
|
|
|
|
+ _sessionContext.OrgName, _sessionContext.RequiredOrgCode);
|
|
|
|
+
|
|
|
|
+ //更新当前办理节点信息
|
|
|
|
+ workflow.UpdateWorkflowCurrentStepInfo(dto.IsStartCountersign, firstStep, secondStepBox.Steps.First());
|
|
|
|
|
|
//发起会签时记录顶层会签节点
|
|
//发起会签时记录顶层会签节点
|
|
if (dto.IsStartCountersign && !workflow.IsInCountersign())
|
|
if (dto.IsStartCountersign && !workflow.IsInCountersign())
|
|
workflow.StartCountersign(firstStepBox.Code, counterSignType);
|
|
workflow.StartCountersign(firstStepBox.Code, counterSignType);
|
|
|
|
|
|
-
|
|
|
|
|
|
+ //更新受理人信息
|
|
|
|
+ workflow.UpdateAcceptor(_sessionContext.RequiredUserId, _sessionContext.UserName);
|
|
|
|
|
|
workflow.UpdateHandlers(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgCode,
|
|
workflow.UpdateHandlers(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgCode,
|
|
flowAssignInfo.FlowAssignType, flowAssignInfo.HandlerObjects);
|
|
flowAssignInfo.FlowAssignType, flowAssignInfo.HandlerObjects);
|
|
@@ -128,7 +135,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
await _workflowRepository.UpdateAsync(workflow, cancellationToken);
|
|
await _workflowRepository.UpdateAsync(workflow, cancellationToken);
|
|
|
|
|
|
//publish
|
|
//publish
|
|
- await _mediator.Publish(new StartWorkflowNotify(workflow, dto, dto.IsStartCountersign, flowAssignInfo), cancellationToken);
|
|
|
|
|
|
+ await _mediator.Publish(new StartWorkflowNotify(workflow, dto, flowAssignInfo), cancellationToken);
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@@ -193,7 +200,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
{
|
|
{
|
|
if (!workflow.CanHandle(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgCode)) return;
|
|
if (!workflow.CanHandle(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgCode)) return;
|
|
//工单完成以后查看的场景
|
|
//工单完成以后查看的场景
|
|
- if (workflow.Status != EWorkflowStatus.Runnable && workflow.Status != EWorkflowStatus.Marked) return;
|
|
|
|
|
|
+ if (workflow.Status != EWorkflowStatus.Runnable) return;
|
|
|
|
|
|
var (currentStepBox, currentStep) = GetUnCompleteStepOrDefault(workflow.StepBoxes, orgCode, userId);
|
|
var (currentStepBox, currentStep) = GetUnCompleteStepOrDefault(workflow.StepBoxes, orgCode, userId);
|
|
if (currentStep is null) return;
|
|
if (currentStep is null) return;
|
|
@@ -316,6 +323,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
await NextTraceAsync(workflow, dto, endStep, cancellationToken);
|
|
await NextTraceAsync(workflow, dto, endStep, cancellationToken);
|
|
|
|
|
|
workflow.Complete();
|
|
workflow.Complete();
|
|
|
|
+
|
|
await _workflowRepository.UpdateAsync(workflow, cancellationToken);
|
|
await _workflowRepository.UpdateAsync(workflow, cancellationToken);
|
|
|
|
|
|
await _mediator.Publish(new EndWorkflowNotify(workflow), cancellationToken);
|
|
await _mediator.Publish(new EndWorkflowNotify(workflow), cancellationToken);
|
|
@@ -331,25 +339,25 @@ namespace Hotline.FlowEngine.Workflows
|
|
workflow.CenterToOrgTime = DateTime.Now;
|
|
workflow.CenterToOrgTime = DateTime.Now;
|
|
}
|
|
}
|
|
|
|
|
|
- //最终办理意见与时间处理(解决工单业务需求,如果流程配置普通节点后未配置汇总节点则不会运行到此处)
|
|
|
|
- var normalSteps = workflow.StepBoxes
|
|
|
|
- .Where(d => d.StepType is EStepType.Normal)
|
|
|
|
- .SelectMany(d => d.Steps);
|
|
|
|
- var isAllCompleted = normalSteps.All(d => d.Status is EWorkflowStepStatus.Completed);
|
|
|
|
- if (isAllCompleted)
|
|
|
|
- {
|
|
|
|
- //最终办理
|
|
|
|
- workflow.ActualOpinion = dto.Opinion;
|
|
|
|
- workflow.Status = EWorkflowStatus.Marked;
|
|
|
|
- await _mediator.Publish(new OrderFinalManageNotify(workflow), cancellationToken);
|
|
|
|
- }
|
|
|
|
- else if (workflow.Status is EWorkflowStatus.Marked)
|
|
|
|
- {
|
|
|
|
- //汇总以后又重新指派到非汇总节点办理
|
|
|
|
- workflow.ResetOption();
|
|
|
|
- workflow.Status = EWorkflowStatus.Runnable;
|
|
|
|
- await _mediator.Publish(new OrderRecallFinalManageNotify(workflow), cancellationToken);
|
|
|
|
- }
|
|
|
|
|
|
+ ////最终办理意见与时间处理(解决工单业务需求,如果流程配置普通节点后未配置汇总节点则不会运行到此处)
|
|
|
|
+ //var normalSteps = workflow.StepBoxes
|
|
|
|
+ // .Where(d => d.StepType is EStepType.Normal)
|
|
|
|
+ // .SelectMany(d => d.Steps);
|
|
|
|
+ //var isAllCompleted = normalSteps.All(d => d.Status is EWorkflowStepStatus.Completed);
|
|
|
|
+ //if (isAllCompleted)
|
|
|
|
+ //{
|
|
|
|
+ // //最终办理
|
|
|
|
+ // workflow.ActualOpinion = dto.Opinion;
|
|
|
|
+ // workflow.Status = EWorkflowStatus.Marked;
|
|
|
|
+ // await _mediator.Publish(new OrderFinalManageNotify(workflow), cancellationToken);
|
|
|
|
+ //}
|
|
|
|
+ //else if (workflow.Status is EWorkflowStatus.Marked)
|
|
|
|
+ //{
|
|
|
|
+ // //汇总以后又重新指派到非汇总节点办理
|
|
|
|
+ // workflow.ResetOption();
|
|
|
|
+ // workflow.Status = EWorkflowStatus.Runnable;
|
|
|
|
+ // await _mediator.Publish(new OrderRecallFinalManageNotify(workflow), cancellationToken);
|
|
|
|
+ //}
|
|
|
|
|
|
//创建下一节点(会签汇总节点不重复创建)
|
|
//创建下一节点(会签汇总节点不重复创建)
|
|
var nextStepBox = await CreateStepAsync(isStartCountersign, workflow, nextStepBoxDefine, dto, EWorkflowStepStatus.Created,
|
|
var nextStepBox = await CreateStepAsync(isStartCountersign, workflow, nextStepBoxDefine, dto, EWorkflowStepStatus.Created,
|
|
@@ -386,7 +394,12 @@ namespace Hotline.FlowEngine.Workflows
|
|
}
|
|
}
|
|
|
|
|
|
//更新实际办理节点名称、时间
|
|
//更新实际办理节点名称、时间
|
|
- workflow.SetWorkflowActualHandleInfo(currentStepBox, nextStepBox, _sessionContext.OrgName, _sessionContext.RequiredOrgCode);
|
|
|
|
|
|
+ workflow.UpdateWorkflowActualHandleInfo(currentStepBox, currentStep,
|
|
|
|
+ _sessionContext.RequiredUserId, _sessionContext.UserName,
|
|
|
|
+ _sessionContext.RequiredOrgCode, _sessionContext.OrgName);
|
|
|
|
+
|
|
|
|
+ //更新当前办理节点信息
|
|
|
|
+ workflow.UpdateWorkflowCurrentStepInfo(dto.IsStartCountersign, currentStep, nextStepBox.Steps.First());
|
|
|
|
|
|
//发起会签时记录顶层会签节点
|
|
//发起会签时记录顶层会签节点
|
|
if (isStartCountersign && !workflow.IsInCountersign())
|
|
if (isStartCountersign && !workflow.IsInCountersign())
|
|
@@ -448,7 +461,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
//orgToCenter会触发重新计算期满时间,1.无需审核按当前时间进行计算 2.需审核按审核通过时间计算
|
|
//orgToCenter会触发重新计算期满时间,1.无需审核按当前时间进行计算 2.需审核按审核通过时间计算
|
|
var isOrgToCenter = CheckIfFlowFromOrgToCenter(currentStepBox, prevStepBox);
|
|
var isOrgToCenter = CheckIfFlowFromOrgToCenter(currentStepBox, prevStepBox);
|
|
if (isOrgToCenter)
|
|
if (isOrgToCenter)
|
|
- workflow.ExpiredTime = CalculateExpiredTime("");
|
|
|
|
|
|
+ workflow.ExpiredTime = CalculateExpiredTime("");//todo
|
|
|
|
|
|
await _workflowRepository.UpdateAsync(workflow, cancellationToken);
|
|
await _workflowRepository.UpdateAsync(workflow, cancellationToken);
|
|
|
|
|
|
@@ -620,7 +633,16 @@ namespace Hotline.FlowEngine.Workflows
|
|
return (new IdName(workflow.ActualHandleOrgCode, workflow.ActualHandleOrgName), items);
|
|
return (new IdName(workflow.ActualHandleOrgCode, workflow.ActualHandleOrgName), items);
|
|
}
|
|
}
|
|
|
|
|
|
- #region private
|
|
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 更新一级部门信息
|
|
|
|
+ /// </summary>
|
|
|
|
+ public async Task UpdateOrgLevelOneAsync(Workflow workflow, string orgCode, string orgName, CancellationToken cancellationToken)
|
|
|
|
+ {
|
|
|
|
+ workflow.UpdateOrgLevelOne(orgCode, orgName);
|
|
|
|
+ await _workflowRepository.UpdateAsync(workflow, cancellationToken);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ #region private method
|
|
|
|
|
|
/// <summary>
|
|
/// <summary>
|
|
/// 判断会签类型(中心会签或部门会签)
|
|
/// 判断会签类型(中心会签或部门会签)
|
|
@@ -810,7 +832,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
{
|
|
{
|
|
nextStep.SetAssigned();
|
|
nextStep.SetAssigned();
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
await _workflowStepRepository.UpdateRangeAsync(nextSteps, cancellationToken);
|
|
await _workflowStepRepository.UpdateRangeAsync(nextSteps, cancellationToken);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1003,7 +1025,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
|
|
|
private static void CheckWhetherRunnable(EWorkflowStatus status)
|
|
private static void CheckWhetherRunnable(EWorkflowStatus status)
|
|
{
|
|
{
|
|
- if (status != EWorkflowStatus.Runnable && status != EWorkflowStatus.Marked)
|
|
|
|
|
|
+ if (status != EWorkflowStatus.Runnable)
|
|
throw UserFriendlyException.SameMessage("当前流程状态不可继续流转");
|
|
throw UserFriendlyException.SameMessage("当前流程状态不可继续流转");
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1013,31 +1035,6 @@ namespace Hotline.FlowEngine.Workflows
|
|
throw UserFriendlyException.SameMessage("无办理权限");
|
|
throw UserFriendlyException.SameMessage("无办理权限");
|
|
}
|
|
}
|
|
|
|
|
|
- /// <summary>
|
|
|
|
- /// 创建开始节点(保存开始流程的办理意见,对应definition的start节点)
|
|
|
|
- /// </summary>
|
|
|
|
- //private async Task<(WorkflowStep stepBox, WorkflowStep step)> CreateStartStepAsync(Workflow workflow, BasicWorkflowDto dto, 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 stepBox = CreateStepBox(workflow.Id, startStepDefinition, string.Empty);
|
|
|
|
- // await _workflowStepRepository.AddAsync(stepBox, cancellationToken);
|
|
|
|
-
|
|
|
|
- // //start节点的办理人分类默认为用户,即为当前发起流程的操作员
|
|
|
|
- // var handler = new IdName { Id = _sessionContext.RequiredUserId, Name = _sessionContext.UserName };
|
|
|
|
- // var step = await CreateStartSubStepAsync(handler, dto, stepBox, cancellationToken);
|
|
|
|
-
|
|
|
|
- // //开始节点trace
|
|
|
|
- // await CreateTraceAsync(workflow, step, cancellationToken: cancellationToken);
|
|
|
|
-
|
|
|
|
- // return (stepBox, step);
|
|
|
|
- //}
|
|
|
|
-
|
|
|
|
private async Task<(WorkflowStep startStepBox, WorkflowStep startStep, WorkflowStep firstStepBox)> CreateStartAndFirstStepAsync(Workflow workflow, BasicWorkflowDto dto, CancellationToken cancellationToken)
|
|
private async Task<(WorkflowStep startStepBox, WorkflowStep startStep, WorkflowStep firstStepBox)> CreateStartAndFirstStepAsync(Workflow workflow, BasicWorkflowDto dto, CancellationToken cancellationToken)
|
|
{
|
|
{
|
|
if (workflow.StepBoxes.Any())
|
|
if (workflow.StepBoxes.Any())
|