예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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 }
                });
            }
        }