/// <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); }
/// <summary> /// 用途:创建流程实例并返回首个流程活动工作项 /// 约定: /// 1、一个流程有且仅有一个根活动 /// 2、代理人不能发起委托人的新流程,只能处理委托日期后正在流转的流程数据 /// 3、有发起流程模型权限方可以操作 /// </summary> /// <param name="workflowGuid">流程模型guid</param> /// <returns>首个流程活动工作项</returns> public ResponseByWorkitem CreateWorkflowInstance(string workflowGuid, string name = null) { ///创建流程实例 WorkflowInstance wfi = new WorkflowInstance(workflowGuid, name); //wfi.Guid ... //wfi.Name ... //wfi.WorkflowGuid ... wfi.Author = this.Context.CurUser; //wfi.WorkflowState ... //wfi.Participator ... //wfi.Locker ... //wfi.BeginTime ...; //wfi.EndTime ...; //wfi.DataEntity ... wfi.SetContext(this.Context); ///加入权限控制 if (!(this.Context.CurUser.IsAdministrator()//是否大管理员 || wfi.GetWorkflow().IsAdministrators(this.Context.CurUser)//是否流程模型管理员 || wfi.GetWorkflow().IsLegalAuthor(this.Context.CurUser)//流程的合法发起用户 )) { return new ResponseByWorkitem() { CallBackMessage = new ResultMessage() { State = false, Message = "不能发起流程!" } }; } ///开启流程实例服务 wfi.Start(); wfi.Save(); //创建活动实例 WorkitemInstance wii = new WorkitemInstance(wfi.Guid, wfi.GetWorkflow().GetStartNode()); //wii.Guid ... //wii.Name ... //wii.ActivityGuid ... //wii.WorkflowInstanceGuid ... //wii.AduitContent = ""; //wii.AduitSign = ""; //wii.ReadTime = null; //wii.NextActivities = null; wii.User = this.Context.CurUser; //wii.ProxyUser = null; //wii.IsProxy = false; //wii.WorkitemInstanceState ... //wii.FromWorkitemInstanceGuid = ""; //wii.AttachmentTrainsitions = null; //wii.SelectVoteItem = ""; //wii.OtherVoteItemContent = ""; //wii.BeginTime ...; //wii.EndTime ...; //wii.DataEntity ... wii.SetContext(this.Context); ///开启活动实例 wii.Start(); wii.Save(); ///活动前事件处理 var rm = wii.BeforeTrigger(); ResponseByWorkitem response; ///如果不满足 if (!rm.State) { response = new ResponseByWorkitem() { ActivityInstance = wii, //NextMaybeActivities=null, UIRight = this.Context.Config.RightByReadOnly, CallBackMessage = rm, }; } else { response = new ResponseByWorkitem() { ActivityInstance = wii, NextMaybeActivities = wii.GetNextEffectiveActivities(), UIRight = wii.GetActivity().UIRight, CallBackMessage = new ResultMessage() { State = true, Message = "" }, }; } return response; }
/// <summary> /// 用途:创建流程实例并返回首个流程活动工作项 /// 约定: /// 1、一个流程有且仅有一个根活动 /// 2、代理人不能发起委托人的新流程,只能处理委托日期后正在流转的流程数据 /// 3、有发起流程模型权限方可以操作 /// </summary> /// <param name="workflowGuid">流程模型guid</param> /// <returns>首个流程活动工作项</returns> public ResponseByWorkitem CreateWorkflowInstance(string workflowGuid, string name = null) { ///创建流程实例 WorkflowInstance wfi = new WorkflowInstance(workflowGuid, name); //wfi.Guid ... //wfi.Name ... //wfi.WorkflowGuid ... wfi.Author = this.Context.CurUser; //wfi.WorkflowState ... //wfi.Participator ... //wfi.Locker ... //wfi.BeginTime ...; //wfi.EndTime ...; //wfi.DataEntity ... wfi.SetContext(this.Context); ///加入权限控制 if (!(this.Context.CurUser.IsAdministrator() ||//是否大管理员 wfi.GetWorkflow().IsAdministrators(this.Context.CurUser) ||//是否流程模型管理员 wfi.GetWorkflow().IsLegalAuthor(this.Context.CurUser) //流程的合法发起用户 )) { return(new ResponseByWorkitem() { CallBackMessage = new ResultMessage() { State = false, Message = "不能发起流程!" } }); } ///开启流程实例服务 wfi.Start(); wfi.Save(); //创建活动实例 WorkitemInstance wii = new WorkitemInstance(wfi.Guid, wfi.GetWorkflow().GetStartNode()); //wii.Guid ... //wii.Name ... //wii.ActivityGuid ... //wii.WorkflowInstanceGuid ... //wii.AduitContent = ""; //wii.AduitSign = ""; //wii.ReadTime = null; //wii.NextActivities = null; wii.User = this.Context.CurUser; //wii.ProxyUser = null; //wii.IsProxy = false; //wii.WorkitemInstanceState ... //wii.FromWorkitemInstanceGuid = ""; //wii.AttachmentTrainsitions = null; //wii.SelectVoteItem = ""; //wii.OtherVoteItemContent = ""; //wii.BeginTime ...; //wii.EndTime ...; //wii.DataEntity ... wii.SetContext(this.Context); ///开启活动实例 wii.Start(); wii.Save(); ///活动前事件处理 var rm = wii.BeforeTrigger(); ResponseByWorkitem response; ///如果不满足 if (!rm.State) { response = new ResponseByWorkitem() { ActivityInstance = wii, //NextMaybeActivities=null, UIRight = this.Context.Config.RightByReadOnly, CallBackMessage = rm, }; } else { response = new ResponseByWorkitem() { ActivityInstance = wii, NextMaybeActivities = wii.GetNextEffectiveActivities(), UIRight = wii.GetActivity().UIRight, CallBackMessage = new ResultMessage() { State = true, Message = "" }, }; } return(response); }
/// <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; }