|
@@ -22,6 +22,7 @@ using XF.Domain.Entities;
|
|
|
using XF.Domain.Exceptions;
|
|
|
using XF.Domain.Repository;
|
|
|
using System.Reflection.Metadata;
|
|
|
+using System.Security.AccessControl;
|
|
|
|
|
|
namespace Hotline.FlowEngine.Workflows
|
|
|
{
|
|
@@ -627,7 +628,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
//如果有传入期满时间 新节点为传入的期满时间
|
|
|
if (dto.ExpiredTime.HasValue)
|
|
|
prevStep.StepExpiredTime = dto.ExpiredTime;
|
|
|
-
|
|
|
+
|
|
|
//复制上一个节点为待接办
|
|
|
var newPrevStep =
|
|
|
await DuplicateStepWithTraceAsync(workflow, prevStep, EWorkflowTraceType.Previous, cancellationToken);
|
|
@@ -1087,236 +1088,201 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
/// <summary>
|
|
|
/// 撤回至开始节点
|
|
|
/// </summary>
|
|
|
- public async Task RecallToStartStepAsync(string workflowId, string opinion, ISessionContext current,
|
|
|
+ public async Task RecallToStartStepAsync(string workflowId, string opinion, ISessionContext current, bool isOrderFiled,
|
|
|
CancellationToken cancellationToken)
|
|
|
{
|
|
|
//todo 1.当前待办节点删掉 2.当前待办trace更新(status, opinion) 3.复制startStep为待办 4.更新workflow(status, csStatus, handlers) 5.publish event
|
|
|
- var workflow = await GetWorkflowAsync(workflowId, withDefine: true, withSteps: true, withTraces: true,
|
|
|
+ var workflow = await GetWorkflowAsync(workflowId, withDefine: true, withSteps: true, withTraces: true, withCountersigns: true,
|
|
|
cancellationToken: cancellationToken);
|
|
|
var startStep = workflow.Steps.First(d => d.StepType == EStepType.Start);
|
|
|
if (startStep is null)
|
|
|
throw new UserFriendlyException($"数据异常, workflowId: {workflowId}", "该流程无开始节点");
|
|
|
|
|
|
- await RecallToTargetStepAsync(workflow, startStep, opinion, current, cancellationToken);
|
|
|
+ //await RecallToTargetStepAsync(workflow, startStep, opinion, current, cancellationToken);
|
|
|
+
|
|
|
+ var targetStepDefine = workflow.WorkflowDefinition.Steps.FirstOrDefault(d => d.StepType == EStepType.Start);
|
|
|
+ var dto = new RecallDto
|
|
|
+ {
|
|
|
+ Opinion = opinion,
|
|
|
+ NextStepCode = startStep.Code,
|
|
|
+ NextStepName = startStep.Name,
|
|
|
+ BusinessType = startStep.BusinessType,
|
|
|
+ StepType = startStep.StepType,
|
|
|
+ HandlerType = targetStepDefine.HandlerType,
|
|
|
+ NextHandlers = new List<FlowStepHandler>
|
|
|
+ {
|
|
|
+ new FlowStepHandler
|
|
|
+ {
|
|
|
+ Key= startStep.RoleId,
|
|
|
+ Value = startStep.RoleName,
|
|
|
+ RoleId = startStep.RoleId,
|
|
|
+ RoleName = startStep.RoleName
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+ var flowAssignInfo = await GetNextStepFlowAssignInfoByDefineAsync(targetStepDefine, dto.HandlerType, dto.IsStartCountersign,
|
|
|
+ dto.NextHandlers.Select(d => new Kv(d.Key, d.Value)).ToList(), cancellationToken);
|
|
|
+ flowAssignInfo.FlowAssignType = EFlowAssignType.Role;
|
|
|
+ await RecallAsync(workflow, dto, targetStepDefine, flowAssignInfo, EWorkflowTraceType.Recall, null, isOrderFiled, cancellationToken);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 撤回至派单节点
|
|
|
/// </summary>
|
|
|
- public async Task RecallToSendStepAsync(string workflowId, string opinion, ISessionContext current,
|
|
|
+ public async Task RecallToSendStepAsync(string workflowId, string opinion, ISessionContext current, bool isOrderFiled,
|
|
|
CancellationToken cancellationToken)
|
|
|
{
|
|
|
- var workflow = await GetWorkflowAsync(workflowId, withDefine: true, withSteps: true, withTraces: true,
|
|
|
+ var workflow = await GetWorkflowAsync(workflowId, withDefine: true, withSteps: true, withTraces: true, withCountersigns: true,
|
|
|
cancellationToken: cancellationToken);
|
|
|
var sendStep = workflow.Steps.FirstOrDefault(d => d.BusinessType == EBusinessType.Send);
|
|
|
if (sendStep is null)
|
|
|
throw new UserFriendlyException($"未找到派单节点, workflowId: {workflowId}", "该流程无派单节点");
|
|
|
|
|
|
- await RecallToTargetStepAsync(workflow, sendStep, opinion, current, cancellationToken);
|
|
|
+ //await RecallToTargetStepAsync(workflow, sendStep, opinion, current, cancellationToken);
|
|
|
+
|
|
|
+ var targetStepDefine = workflow.WorkflowDefinition.Steps.FirstOrDefault(d => d.BusinessType == EBusinessType.Send);
|
|
|
+ var dto = new RecallDto
|
|
|
+ {
|
|
|
+ Opinion = opinion,
|
|
|
+ NextStepCode = sendStep.Code,
|
|
|
+ NextStepName = sendStep.Name,
|
|
|
+ BusinessType = sendStep.BusinessType,
|
|
|
+ StepType = sendStep.StepType,
|
|
|
+ HandlerType = targetStepDefine.HandlerType,
|
|
|
+ NextHandlers = new List<FlowStepHandler>
|
|
|
+ {
|
|
|
+ new FlowStepHandler
|
|
|
+ {
|
|
|
+ Key= sendStep.RoleId,
|
|
|
+ Value = sendStep.RoleName,
|
|
|
+ RoleId = sendStep.RoleId,
|
|
|
+ RoleName = sendStep.RoleName
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+ var flowAssignInfo = await GetNextStepFlowAssignInfoByDefineAsync(targetStepDefine, dto.HandlerType, dto.IsStartCountersign,
|
|
|
+ dto.NextHandlers.Select(d => new Kv(d.Key, d.Value)).ToList(), cancellationToken);
|
|
|
+ flowAssignInfo.FlowAssignType = EFlowAssignType.Role;
|
|
|
+ await RecallAsync(workflow, dto, targetStepDefine, flowAssignInfo, EWorkflowTraceType.Recall, null, isOrderFiled, cancellationToken);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 特提至中心(优先派单组其次坐席)
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
- public async Task RecallToCenterFirstToSendAsync(string workflowId, string opinion, ISessionContext current,
|
|
|
+ public async Task RecallToCenterFirstToSendAsync(string workflowId, string opinion, ISessionContext current, bool isOrderFiled,
|
|
|
CancellationToken cancellationToken)
|
|
|
{
|
|
|
- var workflow = await GetWorkflowAsync(workflowId, withDefine: true, withSteps: true, withTraces: true,
|
|
|
+ var workflow = await GetWorkflowAsync(workflowId, withDefine: true, withSteps: true, withTraces: true, withCountersigns: true,
|
|
|
cancellationToken: cancellationToken);
|
|
|
var sendStep = workflow.Steps.FirstOrDefault(d => d.BusinessType == EBusinessType.Send);
|
|
|
if (sendStep is not null)
|
|
|
{
|
|
|
- await RecallToTargetStepAsync(workflow, sendStep, opinion, current, cancellationToken);
|
|
|
+ var targetStepDefine = workflow.WorkflowDefinition.Steps.FirstOrDefault(d => d.BusinessType == EBusinessType.Send);
|
|
|
+ var dto = new RecallDto
|
|
|
+ {
|
|
|
+ Opinion = opinion,
|
|
|
+ NextStepCode = sendStep.Code,
|
|
|
+ NextStepName = sendStep.Name,
|
|
|
+ BusinessType = sendStep.BusinessType,
|
|
|
+ StepType = sendStep.StepType,
|
|
|
+ HandlerType = targetStepDefine.HandlerType,
|
|
|
+ NextHandlers = new List<FlowStepHandler>
|
|
|
+ {
|
|
|
+ new FlowStepHandler
|
|
|
+ {
|
|
|
+ Key= sendStep.RoleId,
|
|
|
+ Value= sendStep.RoleName,
|
|
|
+ RoleId = sendStep.RoleId,
|
|
|
+ RoleName = sendStep.RoleName,
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+ var flowAssignInfo = await GetNextStepFlowAssignInfoByDefineAsync(targetStepDefine, dto.HandlerType, dto.IsStartCountersign,
|
|
|
+ dto.NextHandlers.Select(d => new Kv(d.Key, d.Value)).ToList(), cancellationToken);
|
|
|
+ flowAssignInfo.FlowAssignType = EFlowAssignType.Role;
|
|
|
+ await RecallAsync(workflow, dto, targetStepDefine, flowAssignInfo, EWorkflowTraceType.Recall, null, isOrderFiled, cancellationToken);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
var startStep = workflow.Steps.First(d => d.StepType == EStepType.Start);
|
|
|
if (startStep is null)
|
|
|
throw new UserFriendlyException($"数据异常, workflowId: {workflowId}", "该流程无开始节点");
|
|
|
- await RecallToTargetStepAsync(workflow, startStep, opinion, current, cancellationToken);
|
|
|
- }
|
|
|
- }
|
|
|
|
|
|
- private async Task RecallToTargetStepAsync(Workflow workflow, WorkflowStep targetStep, string opinion, ISessionContext current,
|
|
|
- CancellationToken cancellationToken)
|
|
|
- {
|
|
|
- //update uncompleted traces
|
|
|
- await RecallTraceAsync(workflow.Traces, opinion, current, cancellationToken);
|
|
|
-
|
|
|
- await _workflowStepRepository.RemoveRangeAsync(workflow.Steps, cancellationToken);
|
|
|
- workflow.Steps.RemoveAll(_ => true);
|
|
|
-
|
|
|
- workflow.EndCountersign();
|
|
|
- workflow.ResetOption();
|
|
|
- if (workflow.Status is EWorkflowStatus.Completed)
|
|
|
- workflow.SetStatusRunnable();
|
|
|
-
|
|
|
- var newStartStep =
|
|
|
- await DuplicateStepWithTraceAsync(workflow, targetStep, EWorkflowTraceType.Recall, cancellationToken);
|
|
|
-
|
|
|
- workflow.UpdateActualStepWhenAssign(targetStep, new FlowStepHandler
|
|
|
- {
|
|
|
- UserId = targetStep.HandlerId,
|
|
|
- Username = targetStep.HandlerName,
|
|
|
- OrgId = targetStep.HandlerOrgId,
|
|
|
- OrgName = targetStep.HandlerOrgName,
|
|
|
- });
|
|
|
+ //await RecallToTargetStepAsync(workflow, startStep, opinion, current, cancellationToken);
|
|
|
|
|
|
- workflow.UpdateCurrentStepWhenAssign(targetStep, new FlowStepHandler
|
|
|
- {
|
|
|
- UserId = targetStep.HandlerId,
|
|
|
- Username = targetStep.HandlerName,
|
|
|
- OrgId = targetStep.HandlerOrgId,
|
|
|
- OrgName = targetStep.HandlerOrgName,
|
|
|
- });
|
|
|
-
|
|
|
- var isOrgToCenter = CheckIfFlowFromOrgToCenter(workflow, targetStep);
|
|
|
-
|
|
|
- var flowAssignInfo = FlowAssignInfo.Create(targetStep.FlowAssignType.Value, targetStep.Handlers);
|
|
|
- workflow.ResetHandlers(flowAssignInfo.FlowAssignType, flowAssignInfo.HandlerObjects);
|
|
|
-
|
|
|
- await _workflowRepository.UpdateAsync(workflow, cancellationToken);
|
|
|
-
|
|
|
- var dto = _mapper.Map<RecallDto>(targetStep);
|
|
|
- dto.WorkflowId = workflow.Id;
|
|
|
- await _publisher.PublishAsync(new RecallNotify(workflow, targetStep, dto, isOrgToCenter),
|
|
|
- PublishStrategy.ParallelWhenAll, cancellationToken);
|
|
|
+ var targetStepDefine = workflow.WorkflowDefinition.Steps.FirstOrDefault(d => d.StepType == EStepType.Start);
|
|
|
+ var dto = new RecallDto
|
|
|
+ {
|
|
|
+ Opinion = opinion,
|
|
|
+ NextStepCode = startStep.Code,
|
|
|
+ NextStepName = startStep.Name,
|
|
|
+ BusinessType = startStep.BusinessType,
|
|
|
+ StepType = startStep.StepType,
|
|
|
+ HandlerType = targetStepDefine.HandlerType,
|
|
|
+ NextHandlers = new List<FlowStepHandler>
|
|
|
+ {
|
|
|
+ new FlowStepHandler
|
|
|
+ {
|
|
|
+ Key= startStep.RoleId,
|
|
|
+ Value = startStep.RoleName,
|
|
|
+ RoleId = startStep.RoleId,
|
|
|
+ RoleName = startStep.RoleName
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+ var flowAssignInfo = await GetNextStepFlowAssignInfoByDefineAsync(targetStepDefine, dto.HandlerType, dto.IsStartCountersign,
|
|
|
+ dto.NextHandlers.Select(d => new Kv(d.Key, d.Value)).ToList(), cancellationToken);
|
|
|
+ flowAssignInfo.FlowAssignType = EFlowAssignType.Role;
|
|
|
+ await RecallAsync(workflow, dto, targetStepDefine, flowAssignInfo, EWorkflowTraceType.Recall, null, isOrderFiled, cancellationToken);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- ///// <summary>
|
|
|
- ///// 跳转(直接将流程跳转至任意节点)
|
|
|
- ///// </summary>
|
|
|
- //public async Task JumpAsync(Workflow workflow, RecallDto dto, StepDefine targetStepDefine,
|
|
|
- // FlowAssignInfo flowAssignInfo, CancellationToken cancellationToken)
|
|
|
+ //private async Task RecallToTargetStepAsync(Workflow workflow, WorkflowStep targetStep, string opinion, ISessionContext current,
|
|
|
+ // CancellationToken cancellationToken)
|
|
|
//{
|
|
|
- // //todo 跳转至结束节点,(自动办理)
|
|
|
- // //if (targetStepDefine.StepType is EStepType.Start or EStepType.End)
|
|
|
- // // throw UserFriendlyException.SameMessage("开始/结束节点不支持跳转");
|
|
|
-
|
|
|
// //update uncompleted traces
|
|
|
- // await JumpTraceAsync(workflow.Id, dto, cancellationToken);
|
|
|
+ // await RecallTraceAsync(workflow.Traces, opinion, current, cancellationToken);
|
|
|
|
|
|
- // bool isOrgToCenter = false, isCenterToOrg = false;
|
|
|
- // var targetStep = workflow.Steps.FirstOrDefault(d => d.Code == dto.NextStepCode && d.IsOrigin);
|
|
|
- // if (targetStep == null)
|
|
|
- // {
|
|
|
- // //向后跳转
|
|
|
-
|
|
|
- // //此场景并非按配置流转,默认最靠后的节点做为targetStep的prevStep
|
|
|
- // var lastStep = workflow.Steps.Where(d => d.IsOrigin).MaxBy(d => d.CreationTime);
|
|
|
- // if (lastStep is null || lastStep.StepType is EStepType.End)
|
|
|
- // throw new UserFriendlyException($"流程流转数据异常,未结束流程出现endStep, flowId: {workflow.Id}", "流程流转数据异常");
|
|
|
-
|
|
|
- // var targetSteps = await CreateConfigStepsAsync(workflow, targetStepDefine, lastStep, dto,
|
|
|
- // flowAssignInfo, EWorkflowTraceStatus.Jump, cancellationToken);
|
|
|
- // targetStep = targetSteps.First();
|
|
|
-
|
|
|
- // workflow.EndCountersign();
|
|
|
- // workflow.ResetOption();
|
|
|
-
|
|
|
- // ////更新当前办理节点信息
|
|
|
- // //workflow.UpdateWorkflowCurrentStepInfo(dto.IsStartCountersign,
|
|
|
- // // _sessionContext.RequiredUserId, _sessionContext.UserName,
|
|
|
- // // _sessionContext.RequiredOrgId, _sessionContext.OrgName,
|
|
|
- // // _sessionContext.OrgAreaCode, _sessionContext.OrgAreaName,
|
|
|
- // // nextStep: targetStep);
|
|
|
-
|
|
|
- // //calc workflow expired time
|
|
|
- // isCenterToOrg = CheckIfFlowFromCenterToOrg(workflow, targetStep);
|
|
|
- // //if (isCenterToOrg)
|
|
|
- // // workflow.ExpiredTime = CalculateExpiredTime("");//todo calc expiredTime
|
|
|
-
|
|
|
- // #region 补充中间节点处理方案(暂不需要)
|
|
|
-
|
|
|
- // //var completeStepCodes = workflow.StepBoxes.Select(d => d.Code);
|
|
|
- // //var uncompleteStepDefines = workflow.Definition.Steps.Where(d => !completeStepCodes.Contains(d.Code));
|
|
|
- // //创建当前节点与目标节点中间节点
|
|
|
- // //var jumpDto = new BasicWorkflowDto
|
|
|
- // //{
|
|
|
- // // Opinion = "跳转补充"
|
|
|
- // //};
|
|
|
-
|
|
|
- // //foreach (var stepDefine in uncompleteStepDefines)
|
|
|
- // //{
|
|
|
- // // var previousStepId = lastStepBox.Steps.Count > 1 ? lastStepBox.Id : lastStepBox.Steps.First().Id;
|
|
|
- // // if (dto.TargetStepCode == stepDefine.Code)
|
|
|
- // // {
|
|
|
- // // await CreateStepAsync(workflow, stepDefine, dto, lastStepBox.Id, previousStepId, cancellationToken);
|
|
|
- // // break;
|
|
|
- // // }
|
|
|
-
|
|
|
- // // //jump业务下,如果当前节点为会签节点,第一个补充节点的subStep.PreviousId无法确定从哪个子节点跳转过来,统一处理为当前节点的stepBox.Id
|
|
|
- // // lastStepBox = await CreateStepAsync(workflow, stepDefine, dto, lastStepBox.Id, previousStepId, cancellationToken);
|
|
|
- // //}
|
|
|
-
|
|
|
- // #endregion
|
|
|
- // }
|
|
|
- // else
|
|
|
- // {
|
|
|
- // //返回之前节点
|
|
|
- // isOrgToCenter = await RecallAsync(workflow, dto, flowAssignInfo, targetStepDefine, targetStep,
|
|
|
- // EWorkflowTraceStatus.Jump, cancellationToken);
|
|
|
- // }
|
|
|
+ // await _workflowStepRepository.RemoveRangeAsync(workflow.Steps, cancellationToken);
|
|
|
+ // workflow.Steps.RemoveAll(_ => true);
|
|
|
|
|
|
- // workflow.ResetHandlers(flowAssignInfo.FlowAssignType, flowAssignInfo.HandlerObjects);
|
|
|
- // await _workflowRepository.UpdateAsync(workflow, cancellationToken);
|
|
|
+ // workflow.EndCountersign();
|
|
|
+ // workflow.ResetOption();
|
|
|
+ // if (workflow.Status is EWorkflowStatus.Completed)
|
|
|
+ // workflow.SetStatusRunnable();
|
|
|
|
|
|
- // await _mediator.Publish(
|
|
|
- // new JumpNotify(workflow, targetStep, dto, flowAssignInfo, isCenterToOrg, isOrgToCenter),
|
|
|
- // cancellationToken);
|
|
|
- //}
|
|
|
+ // var newStartStep =
|
|
|
+ // await DuplicateStepWithTraceAsync(workflow, targetStep, EWorkflowTraceType.Recall, cancellationToken);
|
|
|
|
|
|
- ///// <summary>
|
|
|
- ///// 重办
|
|
|
- ///// </summary>
|
|
|
- //public async Task RedoAsync(Workflow workflow, RecallDto dto, StepDefine targetStepDefine,
|
|
|
- // FlowAssignInfo flowAssignInfo, CancellationToken cancellationToken)
|
|
|
- //{
|
|
|
- // if (targetStepDefine.StepType is EStepType.Start or EStepType.End)
|
|
|
- // throw UserFriendlyException.SameMessage("开始/结束节点不支持重办");
|
|
|
+ // workflow.UpdateActualStepWhenAssign(targetStep, new FlowStepHandler
|
|
|
+ // {
|
|
|
+ // UserId = targetStep.HandlerId,
|
|
|
+ // Username = targetStep.HandlerName,
|
|
|
+ // OrgId = targetStep.HandlerOrgId,
|
|
|
+ // OrgName = targetStep.HandlerOrgName,
|
|
|
+ // });
|
|
|
|
|
|
- // var targetStepBox = workflow.Steps.FirstOrDefault(d => d.Code == dto.NextStepCode);
|
|
|
- // if (targetStepBox is null)
|
|
|
- // throw UserFriendlyException.SameMessage("未找到该节点配置");
|
|
|
+ // workflow.UpdateCurrentStepWhenAssign(targetStep, new FlowStepHandler
|
|
|
+ // {
|
|
|
+ // UserId = targetStep.HandlerId,
|
|
|
+ // Username = targetStep.HandlerName,
|
|
|
+ // OrgId = targetStep.HandlerOrgId,
|
|
|
+ // OrgName = targetStep.HandlerOrgName,
|
|
|
+ // });
|
|
|
|
|
|
- // var isOrgToCenter = await RecallAsync(workflow, dto, flowAssignInfo, targetStepDefine, targetStepBox,
|
|
|
- // EWorkflowTraceStatus.Redo, cancellationToken);
|
|
|
+ // var isOrgToCenter = CheckIfFlowFromOrgToCenter(workflow, targetStep);
|
|
|
|
|
|
- // workflow.Redo();
|
|
|
+ // var flowAssignInfo = FlowAssignInfo.Create(targetStep.FlowAssignType.Value, targetStep.Handlers);
|
|
|
// workflow.ResetHandlers(flowAssignInfo.FlowAssignType, flowAssignInfo.HandlerObjects);
|
|
|
|
|
|
- // //todo calc expiredTime
|
|
|
- // //dto.Extension.TimeLimitCount
|
|
|
-
|
|
|
-
|
|
|
// await _workflowRepository.UpdateAsync(workflow, cancellationToken);
|
|
|
|
|
|
- // await _mediator.Publish(new RedoNotify(workflow, dto, isOrgToCenter), cancellationToken);
|
|
|
- //}
|
|
|
+ // var dto = _mapper.Map<RecallDto>(targetStep);
|
|
|
+ // dto.WorkflowId = workflow.Id;
|
|
|
+ // await _publisher.PublishAsync(new RecallNotify(workflow, targetStep, dto, isOrgToCenter),
|
|
|
+ // PublishStrategy.ParallelWhenAll, cancellationToken);
|
|
|
|
|
|
- ///// <summary>
|
|
|
- ///// 否决(审批流程不通过)
|
|
|
- ///// </summary>
|
|
|
- ///// <returns></returns>
|
|
|
- //public async Task RejectAsync(Workflow workflow, BasicWorkflowDto dto, CancellationToken cancellationToken)
|
|
|
- //{
|
|
|
- // var currentStep = GetUnHandleStep(workflow.Steps, _sessionContext.RequiredOrgId,
|
|
|
- // _sessionContext.RequiredUserId);
|
|
|
- // await HandleStepAsync(currentStep, workflow, dto, null,
|
|
|
- // null, null, cancellationToken);
|
|
|
- // await _workflowStepRepository.UpdateAsync(currentStep, cancellationToken);
|
|
|
-
|
|
|
- // workflow.UpdateActualStepWhenHandle(currentStep,
|
|
|
- // _sessionContext.RequiredUserId, _sessionContext.UserName,
|
|
|
- // _sessionContext.RequiredOrgId, _sessionContext.OrgName,
|
|
|
- // _sessionContext.OrgAreaCode, _sessionContext.OrgAreaName,
|
|
|
- // _sessionContext.OrgLevel);
|
|
|
-
|
|
|
- // var endStepDefine = workflow.WorkflowDefinition.FindEndStepDefine();
|
|
|
- // var endTrace = await EndAsync(workflow, dto, endStepDefine, currentStep, cancellationToken);
|
|
|
-
|
|
|
- // //await _mediator.Publish(new RejectNotify(workflow, dto), cancellationToken);
|
|
|
//}
|
|
|
|
|
|
/// <summary>
|
|
@@ -1489,7 +1455,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
startStep.IsOrigin = true;
|
|
|
startStep.Status = EWorkflowStepStatus.WaitForAccept;
|
|
|
startStep.PrevChosenStepCode = null;
|
|
|
- startStep.StepExpiredTime = expiredTime;
|
|
|
+ if (expiredTime.HasValue)
|
|
|
+ startStep.StepExpiredTime = expiredTime;
|
|
|
|
|
|
startStep.Assign(handler.UserId, handler.Username,
|
|
|
handler.OrgId, handler.OrgName,
|
|
@@ -2302,9 +2269,6 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
if (removeSteps.Any())
|
|
|
{
|
|
|
await _workflowStepRepository.RemoveRangeAsync(removeSteps, cancellationToken);
|
|
|
- //await _workflowStepRepository.RemoveNav(removeSteps)
|
|
|
- // .Include(d => d.StepHandlers)
|
|
|
- // .ExecuteCommandAsync();
|
|
|
workflow.Steps.RemoveAll(d => removeSteps.Contains(d));
|
|
|
|
|
|
//更新快照对应节点状态
|
|
@@ -2323,6 +2287,21 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
|
|
|
await _workflowTraceRepository.UpdateRangeAsync(updateTraces, cancellationToken);
|
|
|
|
|
|
+ //结束会签
|
|
|
+ var unCompleteCountersigns = workflow.Countersigns.Where(d => !d.IsCompleted()).ToList();
|
|
|
+ if (unCompleteCountersigns.Any())
|
|
|
+ {
|
|
|
+ foreach (var unCompleteCountersign in unCompleteCountersigns)
|
|
|
+ {
|
|
|
+ unCompleteCountersign.End(null, null, EBusinessType.File,
|
|
|
+ _sessionContext.RequiredUserId, _sessionContext.UserName,
|
|
|
+ _sessionContext.RequiredOrgId, _sessionContext.OrgName,
|
|
|
+ _sessionContext.OrgAreaCode, _sessionContext.OrgAreaName);
|
|
|
+ }
|
|
|
+
|
|
|
+ await _workflowCountersignRepository.UpdateRangeAsync(unCompleteCountersigns, cancellationToken);
|
|
|
+ }
|
|
|
+
|
|
|
workflow.EndCountersign();
|
|
|
workflow.ResetOption();
|
|
|
if (workflow.Status is EWorkflowStatus.Completed)
|
|
@@ -2802,7 +2781,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
step.CountersignId = countersignId;
|
|
|
step.Status = stepStatus;
|
|
|
step.CountersignPosition = countersignPosition;
|
|
|
- step.StepExpiredTime = expiredTime;
|
|
|
+ if (expiredTime.HasValue)
|
|
|
+ step.StepExpiredTime = expiredTime;
|
|
|
//step.TimeLimit = GetTimeLimit("");
|
|
|
step.IsOrigin = isOrigin;
|
|
|
step.Name = stepName;
|
|
@@ -2823,6 +2803,41 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
return step;
|
|
|
}
|
|
|
|
|
|
+ private async Task<FlowAssignInfo> GetNextStepFlowAssignInfoByDefineAsync(StepDefine nextStepDefine,
|
|
|
+ EHandlerType handlerType, bool isStartCountersign, List<Kv> handlers, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ switch (handlerType)
|
|
|
+ {
|
|
|
+ case EHandlerType.Role:
|
|
|
+ if (!handlers.Any())
|
|
|
+ {
|
|
|
+ //var roles = await _roleRepository.Queryable()
|
|
|
+ // .Includes(d => d.Accounts, x => x.User)
|
|
|
+ // .Where(d => nextStepDefine.HandlerTypeItems.Select(x => x.Key).Contains(d.Name))
|
|
|
+ // .ToListAsync(cancellationToken);
|
|
|
+ //handlers = roles.SelectMany(d => d.Accounts).Distinct()
|
|
|
+ // .Select(d => new Kv(d.Id, d.User.Name))
|
|
|
+ // .ToList();
|
|
|
+ handlers = nextStepDefine.HandlerTypeItems;
|
|
|
+ return FlowAssignInfo.Create(EFlowAssignType.Role, handlers, isStartCountersign);
|
|
|
+ }
|
|
|
+
|
|
|
+ return FlowAssignInfo.Create(EFlowAssignType.User, handlers, isStartCountersign);
|
|
|
+
|
|
|
+ case EHandlerType.OrgLevel:
|
|
|
+ case EHandlerType.OrgType:
|
|
|
+ case EHandlerType.AssignedOrg:
|
|
|
+ return FlowAssignInfo.Create(EFlowAssignType.Org, handlers, isStartCountersign);
|
|
|
+
|
|
|
+ case EHandlerType.AssignedUser:
|
|
|
+ return FlowAssignInfo.Create(EFlowAssignType.User, handlers, isStartCountersign);
|
|
|
+ case EHandlerType.AssignedOrgOrRole:
|
|
|
+ return FlowAssignInfo.Create(EFlowAssignType.OrgAndRole, handlers, isStartCountersign);
|
|
|
+
|
|
|
+ default:
|
|
|
+ throw new ArgumentOutOfRangeException();
|
|
|
+ }
|
|
|
+ }
|
|
|
#endregion
|
|
|
}
|
|
|
}
|