Ejemplo n.º 1
0
        /// <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
                    });
                }
            }
        }
Ejemplo n.º 2
0
        /// <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;
        }
Ejemplo n.º 3
0
        /// <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;
        }