Ejemplo n.º 1
0
        public async Task <IActionResult> ApproveOrDisApproveNode([FromBody] WorkFlowInstanceHandleViewModel vm)
        {
            var isSuccess = await _workFlowInstanceService.ApproveOrDisApproveNode(vm);

            if (!isSuccess)
            {
                return(this.BadRequestResult("审批失败!"));
            }
            return(Ok());
        }
Ejemplo n.º 2
0
        public async Task <IActionResult> CancelFlowInstance([FromBody] WorkFlowInstanceHandleViewModel vm)
        {
            var isSuccess = await _workFlowInstanceService.CancelFlowInstance(vm.WorkFlowInstanceId);

            if (!isSuccess)
            {
                return(this.BadRequestResult("取消工作流失败!"));
            }
            return(Ok());
        }
Ejemplo n.º 3
0
        public async Task <IActionResult> SubmitWorkFlowInstance(WorkFlowInstanceHandleViewModel vm)
        {
            var isSuccess = await _workFlowInstanceService.SubmitWorkFlowInstance(vm);

            if (!isSuccess)
            {
                return(this.BadRequestResult("提交工作流失败!"));
            }
            return(Ok());
        }
        /// <summary>
        /// 人员审核流程
        /// </summary>
        public async Task <bool> ApproveOrDisApproveNode(WorkFlowInstanceHandleViewModel viewModel)
        {
            var account = _httpContextAccessor.HttpContext?.User?.GetUserName();

            // 取得当前用户待处理的节点
            var route = _instanceRouteRepository.Get(route =>
                                                     route.WorkFlowInstanceId == viewModel.WorkFlowInstanceId &&
                                                     route.HandlePepleAccount == account &&
                                                     route.HandleState == HandleStateEnum.未处理).FirstOrDefault();

            if (route != null)
            {
                // 取得节点对应的流转中的工作流实例
                var instance = _instanceRepository.Get(i => i.Id == route.WorkFlowInstanceId &&
                                                       i.WorkFlowInstanceState == WorkFlowInstanceStateEnum.CirCulation).FirstOrDefault();
                if (instance != null)
                {
                    try
                    {
                        if (viewModel.IsPass)
                        {
                            route.HandleState   = HandleStateEnum.通过;
                            route.HandleComment = viewModel.HandleComment;

                            var currentNode = await _nodeRepository.GetAsync(instance.CurrentNodeId);

                            // 取得下一个节点
                            var targetIds = from link in _linkRepository.Get()
                                            where link.SourceId == currentNode.DomId &&
                                            link.WorkFlowId == instance.WorkFlowId
                                            select link.TargetId;

                            // 判断是否能够进入下一个节点
                            var haveNext = false;

                            // 循环所有目标节点
                            foreach (var targetId in targetIds.ToList())
                            {
                                // 找出流转到该节点的条件组
                                var conditions = from c in _conditionRepository.Get()
                                                 where c.WorkFlowId == instance.WorkFlowId &&
                                                 c.SourceId == currentNode.DomId &&
                                                 c.TargetId == targetId
                                                 select c;

                                // 比较
                                var isCompare = true;

                                // 无条件,直接进入
                                if (conditions.Count() == 0)
                                {
                                    isCompare = true;
                                    haveNext  = true;
                                }
                                else
                                {
                                    // 有条件,判断条件
                                    foreach (var condition in conditions.ToList())
                                    {
                                        // 取得实例中表单的值
                                        var formValue = (from value in _instanceValueRepository.Get()
                                                         join control in _controlRepository.Get() on value.FormControlDomId equals control.DomId
                                                         where control.Id == condition.FormControlId &&
                                                         value.WorkFlowInstanceId == instance.Id
                                                         select value.Value).FirstOrDefault();

                                        // 对所有条件进行and判断
                                        switch (condition.CompareMode)
                                        {
                                        case CompareModeEnum.Equal:
                                            isCompare = isCompare && (formValue == condition.CompareValue);
                                            break;

                                        case CompareModeEnum.EqualOrGreater:
                                            isCompare = isCompare && (string.Compare(formValue, condition.CompareValue) >= 0);
                                            break;

                                        case CompareModeEnum.EqualOrSmaller:
                                            isCompare = isCompare && (string.Compare(formValue, condition.CompareValue) <= 0);
                                            break;

                                        case CompareModeEnum.Greater:
                                            isCompare = isCompare && (string.Compare(formValue, condition.CompareValue) > 0);
                                            break;

                                        case CompareModeEnum.Smaller:
                                            isCompare = isCompare && (string.Compare(formValue, condition.CompareValue) < 0);
                                            break;
                                        }

                                        // 出现条件不满足的情况直接退出判断
                                        if (!isCompare)
                                        {
                                            break;
                                        }
                                    }
                                }

                                // 条件全部满足则转入到该节点
                                if (isCompare)
                                {
                                    haveNext = true;
                                    var nextNode = _nodeRepository.Get(n => n.DomId == targetId).FirstOrDefault();

                                    instance.CurrentNodeId = nextNode.Id;

                                    if (nextNode.NodeType == NodeTypeEnum.EndNode)
                                    {
                                        instance.WorkFlowInstanceState = WorkFlowInstanceStateEnum.End;

                                        // 添加节点处理记录
                                        var routeInfo = new WorkFlowInstanceRoute
                                        {
                                            NodeId             = nextNode.Id,
                                            NodeName           = nextNode.Name,
                                            HandlePeopleName   = "系统",
                                            HandleState        = HandleStateEnum.通过,
                                            HandleTime         = DateTime.Now,
                                            WorkFlowInstanceId = instance.Id
                                        };
                                        await _instanceRouteRepository.AddAsync(routeInfo);
                                    }
                                    else
                                    {
                                        // 获取处理人员
                                        var users = GetHandleUsers(nextNode, account);

                                        foreach (var u in users.ToList())
                                        {
                                            // 添加节点处理记录
                                            var routeInfo = new WorkFlowInstanceRoute
                                            {
                                                NodeId             = nextNode.Id,
                                                NodeName           = nextNode.Name,
                                                HandlePeopleName   = u.Name,
                                                HandlePepleAccount = u.UserName,
                                                HandleState        = HandleStateEnum.未处理,
                                                HandleTime         = DateTime.Now,
                                                WorkFlowInstanceId = instance.Id
                                            };
                                            await _instanceRouteRepository.AddAsync(routeInfo);
                                        }
                                    }
                                    _instanceRepository.Update(instance);
                                    break;
                                }
                            }

                            if (!haveNext)
                            {
                                // 无法进行,异常结束
                                instance.WorkFlowInstanceState = WorkFlowInstanceStateEnum.BadEnd;
                            }
                        }
                        else
                        {
                            route.HandleState   = HandleStateEnum.拒绝;
                            route.HandleComment = viewModel.HandleComment;

                            // 获取开始节点id
                            var startNode = await _nodeRepository.Get(n => n.WorkFlowId == instance.WorkFlowId &&
                                                                      n.NodeType == NodeTypeEnum.StartNode).FirstOrDefaultAsync();

                            instance.CurrentNodeId         = startNode.Id;
                            instance.WorkFlowInstanceState = WorkFlowInstanceStateEnum.ReturnBack;
                        }
                        _instanceRouteRepository.Update(route);
                        _instanceRepository.Update(instance);
                        await _unitOfWork.SaveAsync();

                        return(true);
                    }
                    catch (Exception e)
                    {
                        _logger.LogError(e.Message);
                        _logger.LogError(e.StackTrace);
                        return(false);
                    }
                }
            }

            return(false);
        }
        /// <summary>
        /// 用户发起工作流进行提交
        /// </summary>
        public async Task <bool> SubmitWorkFlowInstance(WorkFlowInstanceHandleViewModel viewModel)
        {
            var account  = _httpContextAccessor.HttpContext?.User?.GetUserName();
            var instance = _instanceRepository.Get(i =>
                                                   i.Id == viewModel.WorkFlowInstanceId &&
                                                   i.CreatedUserAccount == account &&
                                                   (i.WorkFlowInstanceState == WorkFlowInstanceStateEnum.NoCommitted ||
                                                    i.WorkFlowInstanceState == WorkFlowInstanceStateEnum.ReturnBack)).FirstOrDefault();

            if (instance != null)
            {
                try
                {
                    instance.WorkFlowInstanceState = WorkFlowInstanceStateEnum.CirCulation;

                    var currentNode = await _nodeRepository.GetAsync(instance.CurrentNodeId);

                    // 目标节点
                    var targetNodes = from n in _nodeRepository.Get(false)
                                      where (
                        from link in _linkRepository.Get(false)
                        where link.SourceId == currentNode.DomId &&
                        link.WorkFlowId == instance.WorkFlowId
                        select link.TargetId).Contains(n.DomId)
                                      select n;

                    // 开始节点只有一个后代节点,因此不用判断直接进入
                    var node = targetNodes.First();
                    instance.CurrentNodeId = node.Id;

                    // 获取处理人员
                    var users = GetHandleUsers(node, account);

                    foreach (var user in users.ToList())
                    {
                        // 添加节点处理记录
                        var routeInfo = new WorkFlowInstanceRoute
                        {
                            NodeId             = node.Id,
                            NodeName           = node.Name,
                            HandlePeopleName   = user.Name,
                            HandlePepleAccount = user.UserName,
                            HandleState        = HandleStateEnum.未处理,
                            HandleTime         = DateTime.Now,
                            WorkFlowInstanceId = viewModel.WorkFlowInstanceId
                        };
                        await _instanceRouteRepository.AddAsync(routeInfo);
                    }

                    var route = _instanceRouteRepository.Get(route =>
                                                             route.WorkFlowInstanceId == viewModel.WorkFlowInstanceId &&
                                                             route.HandleState == HandleStateEnum.未处理).FirstOrDefault();
                    route.HandleState = HandleStateEnum.通过;
                    route.HandleTime  = DateTime.Now;
                    _instanceRouteRepository.Update(route);

                    _instanceRepository.Update(instance);
                    await _unitOfWork.SaveAsync();

                    return(true);
                }
                catch (Exception e)
                {
                    _logger.LogError(e.Message);
                    _logger.LogError(e.StackTrace);
                    return(false);
                }
            }
            return(false);
        }