/// <summary> /// 流程操作 /// </summary> /// <typeparam name="TEntity"></typeparam> /// <param name="entity"></param> /// <param name="flowOperate"></param> /// <returns></returns> public async Task <FlowOperateOutput> HandleFlowOperateAsync <TEntity>(TEntity entity, FlowOperateInput flowOperate) where TEntity : class, IHaveCheck { if (entity is null) { throw new ArgumentNullException(nameof(entity)); } if (flowOperate is null) { throw new ArgumentNullException(nameof(flowOperate)); } var eventBus = serviceProvider.GetService <IEventBus>(); var unitOfWork = serviceProvider.GetService <IUnitOfWork>(); await eventBus.TriggerEventAsync(new FlowOperateBefore <TEntity>(entity, flowOperate)); FlowOperateOutput handleResult = flowOperate.ActionEnum switch { FlowActionEnum.submit => await HandleSubmitActionAsync(entity, flowOperate), FlowActionEnum.unsubmit => await HandleUnSubmitActionAsync(entity, flowOperate), FlowActionEnum.pass => await HandlePassActionAsync(entity, flowOperate), FlowActionEnum.withdraw => await HandleWithdrawActionAsync(entity, flowOperate), FlowActionEnum.refuse => await HandleRefuseActionAsync(entity, flowOperate), FlowActionEnum.uncheck => await HandleUnCheckActionAsync(entity, flowOperate), _ => throw new NotImplementedException(), }; entity.FlowStatus = handleResult.FlowStatus; var entityRepisitory = LoadRepository <TEntity>(); await entityRepisitory.UpdateAsync(entity); await eventBus.TriggerEventAsync(new FlowOperateing <TEntity>(entity, flowOperate, handleResult.FlowProcesses)); await unitOfWork.CommmitAsync(); await eventBus.TriggerEventAsync(new FlowOperated <TEntity>(entity, flowOperate, handleResult.FlowProcesses)); return(handleResult); }
/// <summary> /// 处理审核通过动作 /// </summary> /// <typeparam name="TEntity"></typeparam> /// <param name="entity"></param> /// <param name="flowOperate"></param> /// <returns></returns> public async Task <FlowOperateOutput> HandlePassActionAsync <TEntity>(TEntity entity, FlowOperateInput flowOperate) where TEntity : class, IHaveCheck { var flowInstances = LoadRepository <FlowInstance>(); var flowProcesses = LoadRepository <FlowProcess>(); var flowSteps = LoadRepository <FlowStep>(); var currUser = AppSession.CurrUser; var flowOperateOutput = new FlowOperateOutput(); var flowInstance = await flowInstances .Where(v => v.Bill_Id == entity.Id && v.Enabled == EnabledMark.enabled) .OrderByDescending(v => v.Version) .FirstOrDefaultAsync(); if (flowInstance == null) { throw new MsgException("流程未提交"); } if (!await VerificationCanCheck(entity.Id)) { throw new MsgException("你没有权限处理当前步骤!"); } var currStep = await flowSteps .Where(v => v.Id == flowInstance.CurrStep_Id) .Select(v => new { v.FlowNodeKey, v.NextStepKey, v.NextStep_Id, v.StepName, v.Id }) .FirstOrDefaultAsync(); if (currStep == null) { throw new MsgException("获取审批步骤失败!"); } var flowProcess = await flowProcesses.AddAsync(new FlowProcess { Action = FlowActionEnum.pass, Desc = flowOperate.Desc, FlowInstance_Id = flowInstance.Id, FlowStep_Id = currStep.Id, FlowStepName = currStep.StepName, Id = null, OperaterName = currUser.Name, Operater_Id = currUser.Id, OperateTime = DateTime.Now, NodeKey = currStep.FlowNodeKey }); flowInstance.LastChecker_Id = currUser.Id; flowInstance.LastCheckTime = DateTime.Now; /*当到达最后一步时*/ if (currStep.NextStepKey == -1) { flowInstance.CurrStep_Id = null; flowInstance.CompleteTime = DateTime.Now; flowInstance.IsComlete = true; flowInstance.Status = FlowStatusEnum.finished; await flowInstances.UpdateAsync(flowInstance); var nextStep = await flowSteps .Where(v => v.Id == currStep.NextStep_Id) .Select(v => new { v.StepName, v.Id }) .FirstOrDefaultAsync(); var lastFlowProcess = await flowProcesses.AddAsync(new FlowProcess { Action = FlowActionEnum.pass, Desc = "审批完结", FlowInstance_Id = flowInstance.Id, FlowStep_Id = nextStep.Id, FlowStepName = nextStep.StepName, Id = null, OperaterName = currUser.Name, Operater_Id = currUser.Id, OperateTime = DateTime.Now, NodeKey = currStep.FlowNodeKey }); return(new FlowOperateOutput { FlowStatus = FlowStatusEnum.returned, FlowProcesses = new[] { flowProcess, lastFlowProcess } }); } else { flowInstance.CurrStep_Id = currStep.NextStep_Id; await flowInstances.UpdateAsync(flowInstance); return(new FlowOperateOutput { FlowStatus = FlowStatusEnum.processing, FlowProcesses = new[] { flowProcess } }); } }