/// <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; }
/// <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; }
/// <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); }