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 基类方法.
}
}