/// <summary> /// 实例化审批页面选择对象 /// </summary> /// <param name="instance"></param> public ApproveSelector(WorkflowInstance instance) : this() { var currentActi = instance.GetCurrentActi(); foreach (var choice in currentActi.Transitions.Keys) { var nextActi = currentActi.Transitions[choice]; if (nextActi == null) { throw new NextActivityNotFoundException(instance.InstanceNo, instance.CurrentActivity, choice); } var actor = nextActi.Actor; this.m_NextChoice.Add(choice); this.m_Activities.Add(choice, nextActi.Name); IEnumerable<IUser> users = new List<IUser>(); if (actor != null) { if (choice.Contains("退回")) { actor.RefActivityName = nextActi.Name; users = actor.Resolve(instance); } else { users = actor.Resolve(instance); } } foreach (var user in users) { var organization = SecurityContext.Provider.GetOrganization(user.DeptId); this[choice].Add(new SelectorUser() { id = user.Id, name = user.Name, deptName = organization.FullName }); } } }
/// <summary> /// 提交流程实例 /// </summary> /// <param name="instance">流程实例</param> /// <param name="result">办理操作</param> /// <remarks> /// 验证当办理人,K2办理成功后维护办理记录,流程实例,新增办理记录 /// requireFields: /// instance.CurrentWorkItem /// </remarks> /// <returns></returns> public override bool RunWorkflow(WorkflowInstance instance, ApproveResult result) { if (instance.CurrentWorkItem == null) { throw new ActivityNotFoundException(instance.InstanceNo, instance.CurrentActivity); } // 验证当前办理人员 // 非WorkItem默认用户,非被委托人,未设置委托信息 if (!instance.CurrentWorkItem.PartId.Equals(CurrentUser.Id, StringComparison.OrdinalIgnoreCase) && (!string.IsNullOrEmpty(instance.CurrentWorkItem.MandataryId) && !instance.CurrentWorkItem.MandataryId.Equals(CurrentUser.Id, StringComparison.OrdinalIgnoreCase)) && !DelegateWork.IsDelegate(instance.AppCode, instance.CurrentWorkItem.PartId, CurrentUser.Id)) { throw new UserNotFoundException("当前用户不是该环节的处理人"); } // 计算下一环节处理人 var currentActi = instance.GetCurrentActi(); var nextActi = currentActi.Transitions[result.Choice]; if (nextActi == null) { throw new ChoiceNotFoundException(instance.InstanceNo, currentActi.Name, result.Choice); } // 下一步骤人员 var nextStepUsers = new List<IUser>(); if (!nextActi.Name.Equals("结束", StringComparison.OrdinalIgnoreCase)) { if (result.NextUsers == null) { result.NextUsers = nextActi.Actor.Resolve(instance).Select(p => p.Id).ToList(); } if (result.NextUsers == null || result.NextUsers.Count == 0) { throw new UserNotFoundException(string.Format("未找到下一步骤{0}的处理人", nextActi.Name)); } nextStepUsers.AddRange(result.NextUsers.Select(userid => SecurityContext.Provider.Get(userid))); } // 下一步骤待阅人员 var tobeReadUsers = new List<IUser>(); if (result.NextTobeReadUsers != null && result.NextTobeReadUsers.Count > 0) { tobeReadUsers.AddRange(result.NextTobeReadUsers.Select(userid => SecurityContext.Provider.Get(userid))); } // 提交K2服务器 bool isK2Finished = ServerEngine.RunWorkflow(instance, result, nextStepUsers, null); if (!isK2Finished) { return false; } // 提交数据库更新 bool isDbFinished = DbEngine.RunWorkflow(instance, result, nextStepUsers, tobeReadUsers); if (!isDbFinished) { return false; } return true; }
/// <summary> /// 运行流程 /// </summary> /// <param name="instance">流程实例</param> /// <param name="result">处理结果</param> /// <param name="nextStepUsers">下一环节处理人</param> /// <param name="tobeReadUsers">待阅人员</param> /// <returns></returns> public override bool RunWorkflow(WorkflowInstance instance, ApproveResult result, IList<IUser> nextStepUsers, IList<IUser> tobeReadUsers) { var nextWorkItems = new List<K2WorkflowItem>(); var nextTobeReadWorkItems = new List<K2WorkflowItem>(); IEnumerable<K2WorkflowItem> curWorkItems = new K2WorkflowItem[0]; var currentActi = instance.GetCurrentActi(); var nextActi = currentActi.Transitions[result.Choice]; #region 更新当前环节处理状态 curWorkItems = WorkflowItemFactory.GetAll<K2WorkflowItem>(instance.InstanceNo, instance.CurrentActivity); foreach (var workItem in curWorkItems) { if (workItem.TaskStatus != TaskStatus.Waiting) { continue; } if ((workItem.TaskId == instance.CurrentWorkItem.TaskId)) { workItem.Comment = result.Comment; workItem.AutoFinished = false; workItem.Choice = result.Choice; // 默认处理结果中有以下关键字的为退回,其他都为通过 var rejectWords = new[] { "不同意", "退回", "拒绝" }; var isReject = false; foreach (var word in rejectWords) { isReject = result.Choice.Contains(word); if (isReject) { break; } } workItem.TaskStatus = isReject ? TaskStatus.Reject : TaskStatus.Accept; if (workItem.PartId.Equals(CurrentUser.Id, StringComparison.OrdinalIgnoreCase)) { // 原审核人处理的话,就清空被委托人字段 workItem.Mandatary = null; workItem.MandataryId = null; } else if (workItem.MandataryId == null || !workItem.MandataryId.Equals(CurrentUser.Id, StringComparison.OrdinalIgnoreCase)) { // 先有待办后有委托关系的话,更新WorkItem的被委托人字段为当前用户 workItem.Mandatary = CurrentUser.Name; workItem.MandataryId = CurrentUser.Id; } } else { workItem.AutoFinished = true; //(默认当前办理方式是多选一) workItem.TaskStatus = TaskStatus.Finished; } workItem.FinishTime = DateTime.Now; } #endregion #region 添加下一环节待办流程项 var lastTaskId = this.GetWorkItemLastTaskId(instance.InstanceNo); foreach (var user in nextStepUsers) { var workItem = WorkflowItemFactory.Create<K2WorkflowItem>(); lastTaskId += 1; workItem.TaskId = lastTaskId; workItem.InstanceNo = instance.InstanceNo; workItem.PartId = user.Id; workItem.PartName = user.Name; workItem.PartDeptId = user.DeptId; var dept = SecurityContext.Provider.GetOrganization(user.DeptId); workItem.PartDeptName = (dept == null ? "" : dept.FullName); workItem.ReceTime = DateTime.Now; workItem.TaskStatus = TaskStatus.Waiting; workItem.CurrentActi = nextActi.Name; // 检查有效的委托关系 // 默认将第一个被委托用户添加到WorkItem中,暂时不考虑同时委托给多个人的情况 var delegateRelations = DelegateWork.GetByDeletagor(instance.AppCode, workItem.PartId); if (delegateRelations.Count > 0) { var firstRelation = delegateRelations[0]; workItem.Mandatary = firstRelation.Mandatary; workItem.MandataryId = firstRelation.MandataryId; } nextWorkItems.Add(workItem); } #endregion #region 添加下一环节待阅流程 foreach (var user in tobeReadUsers) { var workItem = WorkflowItemFactory.Create<K2WorkflowItem>(); lastTaskId += 1; workItem.TaskId = lastTaskId; workItem.InstanceNo = instance.InstanceNo; workItem.PartId = user.Id; workItem.PartName = user.Name; workItem.PartDeptId = user.DeptId; var dept = SecurityContext.Provider.GetOrganization(user.DeptId); workItem.PartDeptName = (dept == null ? "" : dept.FullName); workItem.ReceTime = DateTime.Now; workItem.TaskStatus = TaskStatus.ToRead; workItem.CurrentActi = nextActi.Name; nextTobeReadWorkItems.Add(workItem); } #endregion instance.CurrentActivity = nextActi.Name; if (nextActi.Name.Equals("结束", StringComparison.OrdinalIgnoreCase)) { instance.EndTime = DateTime.Now; instance.Status = InstanceStatus.Finished; } // 运行流程 using (var transactionScope = new TransactionScope(TransactionScopeOption.Required)) { //1.更新当前办理环节及其相关环节 foreach (var workItem in curWorkItems) { _dao.UpdateFields<K2WorkflowItem>(workItem, "FinishTime", "AutoFinished", "Choice", "Comment", "TaskStatus", "MandataryId", "Mandatary"); } //2.新增下一批办理环节 foreach (var workitem in nextWorkItems) { _dao.Insert<K2WorkflowItem>(workitem); } //3.新增下一批待阅环节 foreach (var workitem in nextTobeReadWorkItems) { _dao.Insert<K2WorkflowItem>(workitem); } //4.更新流程实例 _dao.UpdateFields<K2WorkflowInstance>(instance, "EndTime", "Status", "CurrentActivity"); transactionScope.Complete(); } // 推送待办已办 using (var transactionScope = new TransactionScope(TransactionScopeOption.Required)) { foreach (var workItem in curWorkItems) { // 结束待办 PendingJob.Finish(workItem.InstanceNo, workItem.TaskId); } //2.新增下一批办理环节 foreach (var workItem in nextWorkItems) { // 增加待办 PendingJob.Todo(workItem.InstanceNo, workItem.TaskId); } transactionScope.Complete(); } try { var opinion = new PersonalOpinion() { UserId = instance.CurrentWorkItem.PartId, Content = result.Comment }; opinion.AddUsedTimes(); } catch (Exception ex) { Logger.LogError("K2Client.DbEngine.RunWorkflow", ex, new {UserId = instance.CurrentWorkItem.PartId, Content = result.Comment}); } return true; }