public async Task <bool> CreateWorkFlowInstance(int workflowId) { var account = _httpContextAccessor.HttpContext?.User?.GetUserName(); var userName = _httpContextAccessor.HttpContext?.User?.GetName(); // 获取开始节点id var startNode = await _nodeRepository.Get(n => n.WorkFlowId == workflowId && n.NodeType == NodeTypeEnum.StartNode) .FirstOrDefaultAsync(); // 工作流定义 var workflow = await _workflowRepository.GetAsync(workflowId); // 创建工作流实例 var instance = new WorkFlowInstance() { WorkFlowInstanceState = WorkFlowInstanceStateEnum.NoCommitted, CurrentNodeId = startNode.Id, CreatedTime = DateTime.Now, CreatedUserAccount = account, CreatedUserName = userName, WorkFlowName = workflow.Name, WorkFlowId = workflowId, }; // 添加节点处理记录 var routeInfo = new WorkFlowInstanceRoute { NodeId = startNode.Id, NodeName = startNode.Name, HandlePeopleName = userName, HandlePepleAccount = account, HandleState = HandleStateEnum.未处理, HandleTime = DateTime.Now, }; try { var entity = await _instanceRepository.AddAsync(instance); await _unitOfWork.SaveAsync(); routeInfo.WorkFlowInstanceId = entity.Id; await _instanceRouteRepository.AddAsync(routeInfo); await _unitOfWork.SaveAsync(); return(true); } catch (Exception e) { _logger.LogError(e.Message); _logger.LogError(e.StackTrace); return(false); } }
/// <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); }