using System; using System.Collections; using System.Data; using BP.DA; using BP.En; using BP.Difference; using BP.Web; using BP.Sys; using BP.WF.XML; namespace BP.WF { /// /// 流程事件基类 /// 0,集成该基类的子类,可以重写事件的方法与基类交互. /// 1,一个子类必须与一个流程模版绑定. /// 2,基类里有很多流程运行过程中的变量,这些变量可以辅助开发者在编写复杂的业务逻辑的时候使用. /// 3,该基类有一个子类模版,位于:\CCFlow\WF\Admin\AttrFlow\F001Templepte.cs . /// abstract public class FlowEventBase { #region 要求子类强制重写的属性. /// /// 流程编号/流程标记. /// 该参数用于说明要把此事件注册到那一个流程模版上. /// abstract public string FlowMark { get; } #endregion 要求子类重写的属性. #region 属性/内部变量(流程在运行的时候触发各类事件,子类可以访问这些属性来获取引擎内部的信息). /// /// 发送对象 /// public SendReturnObjs SendReturnObjs = null; /// /// 实体,一般是工作实体 /// public Entity HisEn = null; private Node _hisNode = null; /// /// 当前节点 /// public Node HisNode { get { return _hisNode; } set { _hisNode = value; } } /// /// 流程注册表 /// public GenerWorkFlow HisGenerWorkFlow = null; /// /// 参数对象. /// private Row _SysPara = null; /// /// 参数 /// public Row SysPara { get { if (_SysPara == null) _SysPara = new Row(); return _SysPara; } set { _SysPara = value; } } /// /// 成功信息 /// public string SucessInfo = null; #endregion 属性/内部变量(流程在运行的时候触发各类事件,子类可以访问这些属性来获取引擎内部的信息). #region 在发送前的事件里可以改变参数. /// /// 要跳转的节点.(开发人员可以设置该参数,改变发送到的节点转向.) /// private int _JumpToNodeID = 0; public int JumpToNodeID { get { return _JumpToNodeID; } set { this._JumpToNodeID = value; } } /// /// 接受人, (开发人员可以设置该参数,改变接受人的范围.) /// private string _JumpToEmps = null; public string JumpToEmps { get { return _JumpToEmps; } set { this._JumpToEmps = value; } } /// /// 是否停止流程? /// public bool ItIsStopFlow = false; #endregion 在发送前的事件里可以改变参数 #region 系统参数 /// /// 表单ID /// public string FK_Mapdata { get { return this.GetValStr("FK_MapData"); } } #endregion #region 常用属性. /// /// 工作ID /// public int OID { get { return this.GetValInt("OID"); } } /// /// 工作ID /// public Int64 WorkID { get { try { return this.GetValInt64("WorkID"); /*有可能开始节点的WorkID=0*/ } catch (Exception) { return this.OID; } } } /// /// 流程ID /// public Int64 FID { get { return this.GetValInt64("FID"); } } /// /// 传过来的WorkIDs集合,子流程. /// public string WorkIDs { get { return this.GetValStr("WorkIDs"); } } /// /// 编号集合s /// public string Nos { get { return this.GetValStr("Nos"); } } /// /// 项目编号 /// public string PrjNo { get { return this.GetValStr("PrjNo"); } } /// /// 项目名称 /// public string PrjName { get { return this.GetValStr("PrjName"); } } /// /// 流程标题 /// public string Title { get { return this.GetValStr(GERptAttr.Title); } } #endregion 常用属性. #region 获取参数方法 /// /// 事件参数 /// /// 时间字段 /// 根据字段返回一个时间,如果为Null,或者不存在就抛出异常. public DateTime GetValDateTime(string key) { try { string str = this.SysPara.GetValByKey(key).ToString(); return DataType.ParseSysDateTime2DateTime(str); } catch (Exception ex) { throw new Exception("@流程事件实体在获取参数期间出现错误,请确认字段(" + key + ")是否拼写正确,技术信息:" + ex.Message); } } /// /// 获取字符串参数 /// /// key /// 如果为Null,或者不存在就抛出异常 public string GetValStr(string key) { if (this.SysPara.ContainsKey(key) == false) throw new Exception("@流程事件实体在获取参数期间出现错误,请确认字段(" + key + ")是否拼写正确."); return this.SysPara.GetValByKey(key).ToString(); } /// /// 获取Int64的数值 /// /// 键值 /// 如果为Null,或者不存在就抛出异常 public Int64 GetValInt64(string key) { return Int64.Parse(this.GetValStr(key)); } /// /// 获取int的数值 /// /// 键值 /// 如果为Null,或者不存在就抛出异常 public int GetValInt(string key) { return int.Parse(this.GetValStr(key)); } /// /// 获取Boolen值 /// /// 字段 /// 如果为Null,或者不存在就抛出异常 public bool GetValBoolen(string key) { if (int.Parse(this.GetValStr(key)) == 0) return false; return true; } /// /// 获取decimal的数值 /// /// 字段 /// 如果为Null,或者不存在就抛出异常 public decimal GetValDecimal(string key) { return decimal.Parse(this.GetValStr(key)); } #endregion 获取参数方法 #region 构造方法 /// /// 流程事件基类 /// public FlowEventBase() { } #endregion 构造方法 #region 节点表单事件 public virtual string FrmLoadAfter() { return null; } public virtual string FrmLoadBefore() { return null; } #endregion #region 要求子类重写的方法(流程事件). /// /// 当创建WorkID的时候 /// /// 创建WorkID所执行的操作 public virtual string FlowOnCreateWorkID() { return null; } /// /// 流程完成前 /// /// 返回null,不提示信息,返回string提示结束信息,抛出异常就阻止流程删除. public virtual string FlowOverBefore() { return null; } /// /// 流程结束后 /// /// 返回null,不提示信息,返回string提示结束信息,抛出异常不处理。 public virtual string FlowOverAfter() { return null; } /// /// 流程删除前 /// /// 返回null,不提示信息,返回信息,提示删除警告/提示信息, 抛出异常阻止删除操作. public virtual string BeforeFlowDel() { return null; } /// /// 流程删除后 /// /// 返回null,不提示信息,返回信息,提示删除警告/提示信息, 抛出异常不处理. public virtual string AfterFlowDel() { return null; } #endregion 要求子类重写的方法(流程事件). #region 要求子类重写的方法(节点事件). /// /// 保存后 /// public virtual string SaveAfter() { return null; } /// /// 保存前 /// public virtual string SaveBefore() { return null; } /// /// 创建工作ID后的事件 /// /// public virtual string CreateWorkID() { return null; } /// ///发送前 @Info=xxxx@ToNodeID=xxxx@ToEmps=xxxx /// public virtual string SendWhen() { return null; } /// /// 发送成功时 /// public virtual string SendSuccess() { return null; } /// /// 发送失败 /// /// public virtual string SendError() { return null; } /// /// 退回前 /// /// public virtual string ReturnBefore() { return null; } /// /// 退后后 /// /// public virtual string ReturnAfter() { return null; } /// /// 撤销之前 /// /// public virtual string UndoneBefore() { return null; } /// /// 撤销之后 /// /// public virtual string UndoneAfter() { return null; } /// /// 移交后 /// /// public virtual string ShiftAfter() { return null; } /// /// 加签后 /// /// public virtual string AskerAfter() { return null; } /// /// 加签答复后 /// /// public virtual string AskerReAfter() { return null; } /// /// 队列节点发送后 /// /// public virtual string QueueSendAfter() { return null; } /// /// 工作到达的时候 /// /// public virtual string WorkArrive() { return null; } #endregion 要求子类重写的方法(节点事件). #region 基类方法. /// /// 执行事件 /// /// 事件类型 /// 实体参数 public string DoIt(string eventType, Node currNode, Entity en, string atPara, int jumpToNodeID = 0, string toEmps = null,GenerWorkFlow hisGWF=null) { this.HisEn = en; this.HisNode = currNode; this.HisGenerWorkFlow = hisGWF; // this.WorkID = en.GetValInt64ByKey("OID"); this.JumpToEmps = toEmps; this.JumpToNodeID = jumpToNodeID; this.SysPara = null; this.ItIsStopFlow = false; #region 处理参数. Row r = en.Row; //系统参数. if (r.ContainsKey("FK_MapData") == true) r["FK_MapData"] = en.ClassID; else r.Add("FK_MapData", en.ClassID); if (atPara != null) { AtPara ap = new AtPara(atPara); foreach (string s in ap.HisHT.Keys) { try { r.Add(s, ap.GetValStrByKey(s)); } catch { r[s] = ap.GetValStrByKey(s); } } } if (BP.Difference.SystemConfig.isBSsystem == true) { /*如果是bs系统, 就加入外部url的变量.*/ foreach (string key in HttpContextHelper.RequestParamKeys) { if ( key == null) continue; switch (key) { case "WorkID": case "NodeID": case "FrmID": case "IsReadonly": case "__VIEWSTATE": case "__EVENTVALIDATION": case "OID": continue; default: break; } string val = HttpContextHelper.RequestParams(key); //BP.Sys.Base.Glo.Request.QueryString[key]; if (r.ContainsKey(key) == true) r[key] = val; else r.Add(key, val); } } this.SysPara = r; #endregion 处理参数. #region 执行事件. switch (eventType) { case EventListFlow.FlowOnCreateWorkID: // 节点表单事件。 return this.CreateWorkID(); case EventListNode.FrmLoadAfter: // 节点表单事件。 return this.FrmLoadAfter(); case EventListNode.FrmLoadBefore: // 节点表单事件。 return this.FrmLoadBefore(); case EventListNode.NodeFrmSaveAfter: // 节点事件 保存后。 return this.SaveAfter(); case EventListNode.NodeFrmSaveBefore: // 节点事件 - 保存前.。 return this.SaveBefore(); case EventListNode.SendWhen: // 节点事件 - 发送前。 this.ItIsStopFlow = false; string str = this.SendWhen(); if (this.ItIsStopFlow == true) return "@Info=" + str + "@IsStopFlow=1"; if (this.JumpToNodeID == 0 && this.JumpToEmps == null) return str; //返回这个格式, NodeSend 来解析. return "@Info=" + str + "@ToNodeID=" + this.JumpToNodeID + "@ToEmps=" + this.JumpToEmps; case EventListNode.SendSuccess: // 节点事件 - 发送成功时。 return this.SendSuccess(); case EventListNode.SendError: // 节点事件 - 发送失败。 return this.SendError(); case EventListNode.ReturnBefore: // 节点事件 - 退回前。 return this.ReturnBefore(); case EventListNode.ReturnAfter: // 节点事件 - 退回后。 return this.ReturnAfter(); case EventListNode.UndoneBefore: // 节点事件 - 撤销前。 return this.UndoneBefore(); case EventListNode.UndoneAfter: // 节点事件 - 撤销后。 return this.UndoneAfter(); case EventListNode.ShitAfter:// 节点事件-移交后 return this.ShiftAfter(); case EventListNode.AskerAfter://节点事件 加签后 return this.AskerAfter(); case EventListNode.AskerReAfter://节点事件加签回复后 return this.FlowOverBefore(); case EventListNode.QueueSendAfter://队列节点发送后 return this.AskerReAfter(); case EventListFlow.FlowOverBefore: // 流程结束前.。 return this.FlowOverBefore(); case EventListFlow.FlowOverAfter: // 流程结束后。 return this.FlowOverAfter(); case EventListFlow.BeforeFlowDel: // 流程删除前。 return this.BeforeFlowDel(); case EventListFlow.AfterFlowDel: // 删除后. return this.AfterFlowDel(); case EventListNode.WorkArrive: // 工作到达时. return this.WorkArrive(); default: throw new Exception("@没有判断的事件类型:" + eventType); break; } #endregion 执行事件. return null; } #endregion 基类方法. } }