/// <summary> /// 用途:当界面里的业务数据变化时,得到下一能达到的下一活动节点集 /// 范围:对当前流程活动可操作的用户 /// 约定:对于查阅权限返回null /// </summary> /// <param name="workitemInstanceGuid">当前流程活动标识</param> /// <returns>下一能达的活动节点集</returns> public IList <MaybeActivity> GetMaybeActivities(string workitemInstanceGuid) { WorkitemInstance wii = this.GetWorkitemInstance(workitemInstanceGuid); ///不在许可范围之内的,直接返回null if (!this.IsEffective(wii)) { return(new List <MaybeActivity>()); } if (wii.User.Guid.Equals(this.Context.CurUser.Guid)) //判断是否是当前流程实例活动的操作人 { return(wii.GetNextEffectiveActivities()); } else if (wii.IsProxy && wii.ProxyUser.Guid.Equals(this.Context.CurUser.Guid)) //判断是否是代理人 { return(wii.GetNextEffectiveActivities()); } else if (wii.IsProxy == false && wii.IsEffectiveByProxyUser()) //判断是否是潜在代理人 { return(wii.GetNextEffectiveActivities()); } else if (wii.GetWorkflowInstance().GetWorkflow().Administrators.Contains(this.Context.CurUser, _uc)) //流程模型管理员,同大管理员,但限于授权的流程模型 { return(wii.GetNextEffectiveActivities()); } else if (this.Context.CurUser.IsAdministrator())//大管理员,什么情况下都可以执行后继操作,可以改变流程状态 { return(wii.GetNextEffectiveActivities()); } return(new List <MaybeActivity>()); }
/// <summary> /// 当前用户是否可以访问该流程实例活动 /// </summary> /// <param name="wii"></param> /// <returns></returns> bool IsEffective(WorkitemInstance wii) { ///是否大管理员 if (this.Context.CurUser.IsAdministrator()) { return(true); } ///是否流程模型管理员 if (wii.GetWorkflowInstance().GetWorkflow().IsAdministrators(this.Context.CurUser)) { return(true); } ///是否当前流程实例活动的操作者 if (wii.GetWorkflowInstance().GetWorkflow().IsLegalAuthor(this.Context.CurUser)) { return(true); } ///是否当前流程实例活动的代理操作者 if (wii.IsProxy && _uc.Equals(wii.ProxyUser, this.Context.CurUser)) { return(true); } ///是否当前流程实例活动的潜在代理操作者 return(wii.IsEffectiveByProxyUser()); }
/// <summary> /// 用途:界面请求初始化至流程服务,用于流程活动审批环节 /// 约定: /// 1、系统管理员、当前流程模型管理员、当前流程实例活动操作者、当前流程实例活动委托人可以访问并打开 /// 2、系统管理员、当前流程模型管理员可以对已经结束的流程实例环节进行处理,可以处理后继流程、修改数据等,但记录为管理员参与修改 /// 3、当前流程实例活动操作者、当前流程实例活动委托人仅能在未处理完成的流程活动进行处理,可以处理后继流程、修改数据等 /// 4、当前流程实例活动操作者、当前流程实例活动委托人对在处理完成的流程活动进行查阅操作 /// </summary> /// <param name="workitemInstanceGuid"></param> /// <returns></returns> public ResponseByWorkitem GetDataByWorkitemInstance(string workitemInstanceGuid) { WorkitemInstance wii = this.GetWorkitemInstance(workitemInstanceGuid); ResponseByWorkitem response = new ResponseByWorkitem(); ///判断是否非激活状态 ///如果是非激活状态直接退出 if (!wii.IsActive()) { response = new ResponseByWorkitem() { ActivityInstance = wii, NextMaybeActivities = null, UIRight = this.Context.Config.RightByReadOnly, CallBackMessage = new ResultMessage() { State = false, Message = "当前流程处理非活动状态" }, }; return(response); } ///锁定处理 bool?el = EncodeLock(wii); if (el.HasValue && el.Value) { if (wii.IsAdministratorProxy) { AdminLock(wii); } else { response.UIRight = this.Context.Config.RightByReadOnly; response.CallBackMessage = new ResultMessage() { State = false, Message = "流程被" + wii.GetWorkflowInstance().GetWorkflowInstanceLock().User.Name + "锁定!" }; return(response); } } #region 可操作状态 if (_uc.Equals(wii.User, this.Context.CurUser)) //判断是否是当前流程实例活动的操作人 { response.ActivityInstance = wii; response.NextMaybeActivities = wii.GetNextEffectiveActivities(); response.UIRight = wii.GetActivity().UIRight; response.CallBackMessage = new ResultMessage() { State = true, Message = "" }; } else if (wii.IsProxy && _uc.Equals(wii.ProxyUser, this.Context.CurUser)) //判断是否是代理人 { response.ActivityInstance = wii; response.NextMaybeActivities = wii.GetNextEffectiveActivities(); response.UIRight = wii.GetActivity().UIRight; response.CallBackMessage = new ResultMessage() { State = true, Message = "代理人:" + this.Context.CurUser.Name + "参与处理!" }; } else if (wii.IsProxy == false && wii.IsEffectiveByProxyUser()) //判断是否是潜在代理人 { wii.IsProxy = true; wii.ProxyUser = this.Context.CurUser; response.ActivityInstance = wii; response.NextMaybeActivities = wii.GetNextEffectiveActivities(); response.UIRight = wii.GetActivity().UIRight; response.CallBackMessage = new ResultMessage() { State = true, Message = "代理人:" + this.Context.CurUser.Name + "首次参与处理!" }; } else if (wii.GetWorkflowInstance().GetWorkflow().Administrators.Contains(this.Context.CurUser, _uc)) //流程模型管理员,同大管理员,但限于授权的流程模型 { wii.IsAdministratorProxy = true; response.ActivityInstance = wii; response.NextMaybeActivities = wii.GetNextEffectiveActivities(); response.UIRight = this.Context.Config.RightByFull; response.CallBackMessage = new ResultMessage() { State = true, Message = "流程管理员:" + this.Context.CurUser.Name + "参与处理!" }; } else if (this.Context.CurUser.IsAdministrator())//大管理员,可以执行后继操作,可以改变流程状态 { wii.IsAdministratorProxy = true; response.ActivityInstance = wii; response.NextMaybeActivities = wii.GetNextEffectiveActivities(); response.UIRight = this.Context.Config.RightByFull; response.CallBackMessage = new ResultMessage() { State = true, Message = "系统管理员:" + this.Context.CurUser.Name + "参与处理!" }; } else { response.ActivityInstance = null; response.NextMaybeActivities = null; response.UIRight = this.Context.Config.RightByReadOnly; response.CallBackMessage = new ResultMessage() { State = false, Message = "非法用户请求!" }; ///设置解锁 this.DecodeLock(wii); return(response); } #endregion var rm = wii.BeforeTrigger(); if (!rm.State) { response.UIRight = this.Context.Config.RightByReadOnly; response.CallBackMessage = new ResultMessage() { State = false, Message = rm.Message }; ///设置解锁 this.DecodeLock(wii); return(response); } switch (wii.GetActivity().ActivityType) { #region ConvergeStart 如果为根结点处理则直接返回 case eActivityType.ConvergeStart: { return(response); } #endregion #region ConvergeWaitLeftComplete 汇聚结点判断[该结点的最近导入活动必须全部完成才允许执行激活本结点] case eActivityType.ConvergeWaitLeftComplete: { ///排除当前结点,默认能到本结点,即认为本结点之前的结点为结束状态 var wiis = wii.GetWorkflowInstance().GetWorkitemInstnces().Where((t) => { return(t.ActivityGuid == wii.ActivityGuid && string.IsNullOrWhiteSpace(t.FromWorkitemInstanceGuid) == false && t.Guid != wii.Guid); }); bool b = true; foreach (var t in wiis) { var pwii = this.GetWorkitemInstance(t.FromWorkitemInstanceGuid); ///上一层次结点如有未完成,则返回false if (pwii != null && pwii.IsActive()) { b = false; break; } } ///之前有未完成处理的结点。则不能处理当前环节 if (!b) { response.UIRight = this.Context.Config.RightByReadOnly; response.CallBackMessage = new ResultMessage() { State = false, Message = "本节点之前还有尚未处理完成之步骤!不能进行后续处理。" }; ///设置解锁 this.DecodeLock(wii); return(response); } ; return(response); } #endregion #region ConvergeWaitConditionComplete 该结点的所有导入活动进行条件判断,只有满足条件的才允许激活本结点 case eActivityType.ConvergeWaitConditionComplete: { break; } #endregion #region ConvergeWaitAllComplete 该结点的所有导入活动必须全部完成才允许执行激活本结点 case eActivityType.ConvergeWaitAllComplete: { break; } #endregion #region ConvergeCoerceComplete 无论该结点的所有导入活动完成与否直接激活本结点,关闭直接导入活动结点 case eActivityType.ConvergeCoerceComplete: { break; } #endregion #region ConvergeEnd 无论该结点的前的所有活动完成与否直接激活本结点,关闭流程运行 case eActivityType.ConvergeEnd: { break; } #endregion #region Concurrency 并发处理,1、该结点可以由多人同时处理,即有多个结点实例存在 2、如果后继无汇聚处理则流程存在散发状态 case eActivityType.Concurrency: { break; } #endregion #region ConcurrencyVote 投票处理 1、投票结点是特殊的并发结点 2、投标结点有相应的扩展字段来实现对投票的显示统计处理 case eActivityType.ConcurrencyVote: { response.VoteItems = ((ActivityByConcurrencyVote)wii.GetActivity()).VoteItems; response.CallBackMessage = new ResultMessage() { State = true, Message = "请参与投票处理!" }; break; } #endregion #region ConcurrencyExclusion 竞争处理[1、竞争结点是更为特殊的并发结点,结点有多个实例,但是实例必须只有一可以处理,其它的实例就为排斥关闭状态 2、多个人让最先见到的人处理] case eActivityType.ConcurrencyExclusion: { var pwii = this.GetWorkitemInstance(wii.FromWorkitemInstanceGuid); foreach (var pna in pwii.NextActivities) { ///同组别的,置为竞争关闭状态 if (!pna.WorkitemInstanceGuid.Equals(wii.Guid) && pna.ActivityGuid == wii.ActivityGuid) { var t = this.GetWorkitemInstance(pna.WorkitemInstanceGuid); t.ConcurrencyExclusion(); t.Save(); } } break; } #endregion default: break; } wii.Save(); return(response); }