Ejemplo n.º 1
0
        /// <summary>
        /// 是否可以查看流程
        /// </summary>
        /// <param name="instance">流程实例.</param>
        public override bool CanViewWorkflow(WorkflowInstance instance)
        {
            // 检查历史环节中当前用户是否参与过流程
            var items = instance.GetWorkItems();
            var hasTakePartIn = items.Any(p => p.PartId.Equals(CurrentUser.Id, StringComparison.OrdinalIgnoreCase)
                                || (!string.IsNullOrEmpty(p.MandataryId) && p.MandataryId.Equals(CurrentUser.Id, StringComparison.OrdinalIgnoreCase)));

            if (hasTakePartIn) {
                return true;
            }

            // 检查当前环节
            var hasDelegate = DelegateWork.IsDelegate(instance.AppCode, instance.CurrentWorkItem.PartId, CurrentUser.Id);
            if (hasDelegate) {
                return true;
            }

            return false;
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 初始化流程表单对象
        /// </summary>
        /// <param name="instance">流程实例</param>
        /// <returns></returns>
        public static WorkflowForm Init(WorkflowInstance instance)
        {
            var currentUser = SecurityContext.User;

            var form = new WorkflowForm();
            form.Instance = instance;
            form.AppCode = instance.AppCode;
            form.AppName = instance.AppName;
            form.Description = instance.Description;
            form.VersionStr = instance.Version.ToString(CultureInfo.InvariantCulture);
            form.InstanceNo = instance.InstanceNo;
            #region FormStatus
            switch (instance.Status) {
                case InstanceStatus.Draft:
                    {
                        form.Status = FormStatus.Draft;
                        break;
                    }
                case InstanceStatus.Running:
                    {
                        var currentWorkItem = instance.CurrentWorkItem;
                        // 待办条件:当前环节的审批人为当前登录用户 && 当前环节未结束
                        if ((currentWorkItem.PartId.Equals(currentUser.Id, StringComparison.OrdinalIgnoreCase)
                            || (!string.IsNullOrEmpty(currentWorkItem.MandataryId) && currentWorkItem.MandataryId.Equals(currentUser.Id, StringComparison.OrdinalIgnoreCase))
                            || DelegateWork.IsDelegate(instance.AppCode, currentWorkItem.PartId, currentUser.Id))
                            && currentWorkItem.TaskStatus == TaskStatus.Waiting) {
                            form.Status = FormStatus.Todo;
                        } else {
                            form.Status = FormStatus.Done;
                        }
                        break;
                    }
                case InstanceStatus.Cancel:
                case InstanceStatus.Deleted:
                case InstanceStatus.Finished:
                    {
                        form.Status = FormStatus.Done;
                        break;
                    }
            }
            #endregion
            form.Creator = SecurityContext.Provider.Get(instance.CreatorId);
            form.CreatorDept = SecurityContext.Provider.GetOrganization(form.Creator.DeptId);
            form.CurrentUser = SecurityContext.User;
            form.TaskId = instance.CurrentWorkItem == null ? 1 : instance.CurrentWorkItem.TaskId;
            form.CurrentActi = instance.CurrentWorkItem == null ? instance.CurrentActivity : instance.CurrentWorkItem.CurrentActi;
            form.Controller = FlowFactory.GetWorklfowControllerName(form.AppCode);
            form.Instance = instance;

            // 根据WorkItem中的环节信息计算出历史环节(Distinct)
            // 获取并添加到List中,用于渲染
            var workItems = instance.GetWorkItems();
            if (workItems != null && workItems.Any()) {
                var lastTaskId = workItems.First(p => p.CurrentActi.Equals(form.CurrentActi, StringComparison.OrdinalIgnoreCase)).TaskId;
                var activities = workItems.Where(p => p.TaskId <= lastTaskId).OrderBy(p => p.TaskId);
                foreach (var activity in activities) {
                    if (form.HistoryActivities.Contains(activity.CurrentActi)) {
                        continue;
                    }
                    form.HistoryActivities.Add(activity.CurrentActi);
                }
            }
            if (form.HistoryActivities.Count == 0) {
                form.HistoryActivities.Add(form.CurrentActi);
            }

            return form;
        }
Ejemplo n.º 3
0
 /// <summary>
 /// 启动流程实例
 /// </summary>
 /// <param name="instance">流程实例对象</param>
 /// <remarks>同时新增流程办理历史</remarks>
 /// <returns></returns>
 public override bool SaveWorkflow(WorkflowInstance instance)
 {
     var ret = 0;
     var isInstExists = WorkflowInstanceFactory.IsExists<K2WorkflowInstance>(instance.InstanceNo);
     if (isInstExists) {
         ret = _dao.UpdateFields<K2WorkflowInstance>(instance, new string[] { "Title", "Status", "EndTime" });
     } else {
         using (var transactionScope = new TransactionScope(TransactionScopeOption.Required)) {
             ret = _dao.Insert<WorkflowInstance>(instance);
             _dao.Insert<K2WorkflowItem>(instance.CurrentWorkItem);   //增加一个新的流程办理信息
             transactionScope.Complete();
         }
     }
     // 流程取消或删除时,删除对应的待办记录
     if (instance.Status == InstanceStatus.Cancel || instance.Status == InstanceStatus.Deleted) {
         var workitems = instance.GetWorkItems();
         var effectRows = 0;
         using (var transactionScope = new TransactionScope(TransactionScopeOption.Required)) {
             foreach (var workitem in workitems) {
                 if (!workitem.FinishTime.HasValue && workitem.TaskStatus == TaskStatus.Waiting) {
                     workitem.FinishTime = DateTime.Now;
                     workitem.TaskStatus = TaskStatus.Finished;
                     effectRows = _dao.UpdateFields<K2WorkflowItem>(workitem, new string[]{ "FinishTime", "TaskStatus" });
                     if (effectRows > 0) {
                         PendingJob.Delete(workitem.InstanceNo, workitem.TaskId);
                     }
                 }
             }
             transactionScope.Complete();
         }
     }
     return (ret > 0);
 }