You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

372 lines
15 KiB
Plaintext

11 months ago
using System;
using System.Threading;
using System.Collections;
using System.Data;
using
using BP.DTS;
using BP.En;
using BP.Web;
using BP.Sys;
using BP.WF;
namespace BP.FlowEvent
{
/// <summary>
/// @FlowName 事件子类.
/// ccbpm提供了可以让程序员编写代码与流程引擎表单引擎进行交互以处理复杂的业务逻辑。
/// ccbpm预留一个基类 BP.WF.FlowEventBase ,只要从这个基类上集成下来的子类,按照约定的格式重写相关的方法属性,流程引擎就会把这些代码注册到流程引擎中,并在运动中执行。
/// 该功能提供了一个自动生成的代码模版,如果您有编程基础,就很容易明白如何通过该子类实现复杂的业务逻辑。
/// 下载下来该类后您必须把他放入一个以BP.开头的类库里ccflow才能被注册到引擎中去。
/// </summary>
public class F001Templepte : BP.WF.FlowEventBase
{
#region 重写属性.
/// <summary>
/// 重写流程标记
/// </summary>
public override string FlowMark
{
get { return "@FlowNo"; }
}
#endregion 重写属性.
#region 构造 & 变量.
/// <summary>
/// 报销流程事件
/// </summary>
public F001Templepte()
{
}
#endregion 构造 & 变量.
#region 与发送相关事件.
/// <summary>
/// 重写发送前事件
/// </summary>
/// <returns></returns>
public override string SendWhen()
{
/*
* 说明:
* 0. 此事件在发送前触发,如果抛出异常,系统就会把异常信息提示出来,从而阻止向下运动。
* 1, 一般来说,在改事件里填写安全性检查代码与其他的业务逻辑。比如表单校验,校验失败就提示错误。
* 2, 也可以写一些其他的业务逻辑,来组织特定的节点在不符合条件的时候 ,不让其向下发送。
* 3, 也可以更新一些其他系统的数据、状态.
*/
// 当前的节点, 其他的变量请从 this.HisNode .
int nodeID = this.HisNode.NodeID; // int类型的ID.
string nodeName = this.HisNode.Name; // 当前节点名称.
return base.SendWhen();
}
/// <summary>
/// 发送成功事件,发送成功时,把流程的待办写入其他系统里.
/// </summary>
/// <returns>返回执行结果如果返回null就不提示。</returns>
public override string SendSuccess()
{
/*
* 说明:
* 0. 此事件在发送成功的时候触发,系统会把抛出异常的信息提示出来,如果返回一个执行结果的字符串系统就会把它提示出来。
* 1, 一般来说,在改事件里填写与外部数据交互代码,比如:把执行的信息,写入到其他的系统。
* 2, 可以通过访问当前的发送结果对象,来判断到流程实例发送到那个节点,那些接收人。
*/
try
{
// 组织必要的变量.
Int64 workid = this.WorkID; // 工作id.
string flowNo = this.HisNode.FK_Flow; // 流程编号.
int currNodeID = this.SendReturnObjs.VarCurrNodeID; //当前节点id
int toNodeID = this.SendReturnObjs.VarToNodeID; // 到达节点id.
string toNodeName = this.SendReturnObjs.VarToNodeName; // 到达节点名称。
string acceptersID = this.SendReturnObjs.VarAcceptersID; // 接受人员id, 多个人员会用 逗号分看 ,比如 zhangsan,lisi。
string acceptersName = this.SendReturnObjs.VarAcceptersName; // 接受人员名称,多个人员会用逗号分开比如:张三,李四.
//执行向其他系统写入待办.
/*
* 在这里需要编写你的业务逻辑,根据上面组织的变量.
*
*/
return base.SendSuccess();
}
catch (Exception ex)
{
throw new Exception("执行发送失败,执行节点[" + this.HisNode.NodeID + "," + this.HisNode.Name + "],详细信息:" + ex.Message);
}
}
/// <summary>
/// 发送失败事件
/// </summary>
/// <returns>返回空</returns>
public override string SendError()
{
/*
* 说明:
* 0. 此事件在发送失败的时候触发,系统会把抛出异常的信息提示出来,如果返回一个执行结果的字符串系统就会把它提示出来。
* 1, 一般来说,在改事件里填写与外部数据交互回滚代码,比如在发送前,已经写了收款逻辑,在发送失败后就执行退款逻辑。
*/
try
{
// 组织必要的变量.
Int64 workid = this.WorkID; // 工作id.
string flowNo = this.HisNode.FK_Flow; // 流程编号.
int currNodeID = this.SendReturnObjs.VarCurrNodeID; //当前节点id
int toNodeID = this.SendReturnObjs.VarToNodeID; // 到达节点id.
string toNodeName = this.SendReturnObjs.VarToNodeName; // 到达节点名称。
string acceptersID = this.SendReturnObjs.VarAcceptersID; // 接受人员id, 多个人员会用 逗号分看 ,比如 zhangsan,lisi。
string acceptersName = this.SendReturnObjs.VarAcceptersName; // 接受人员名称,多个人员会用逗号分开比如:张三,李四.
//执行向其他系统写入待办.
/*
* 在这里需要编写你的业务逻辑,根据上面组织的变量.
*
*/
return base.SendError();
}
catch (Exception ex)
{
throw new Exception("执行发送失败,执行节点[" + this.HisNode.NodeID + "," + this.HisNode.Name + "],详细信息:" + ex.Message);
}
}
#endregion 与发送相关事件.
#region 与流程相关的操作.
/// <summary>
/// 当创建WorkID的时候.
/// 经常根据当前用户的身份初始化数据.
/// </summary>
/// <returns>返回执行信息.</returns>
public override string FlowOnCreateWorkID()
{
return base.FlowOnCreateWorkID();
}
/// <summary>
/// 流程结束之前
/// </summary>
/// <returns>返回null,不提示信息返回string提示结束信息,抛出异常就阻止流程删除.</returns>
public override string FlowOverBefore()
{
/*
* 说明
* 0, 流程结束之前的操作.
*/
try
{
return null;
}
catch(Exception ex)
{
throw new Exception("@流程不能结束,异常信息:"+ex.Message);
}
}
/// <summary>
/// 流程结束之后
/// </summary>
/// <returns>返回null不提示信息返回string提示结束信息,抛出异常不处理。</returns>
public override string FlowOverAfter()
{
try
{
return null;
//return "流程正常结束.";
}
catch(Exception ex)
{
return ex.Message;
}
}
/// <summary>
/// 流程删除前
/// </summary>
/// <returns>返回null,不提示信息,返回信息,提示删除警告/提示信息, 抛出异常阻止删除操作.</returns>
public override string BeforeFlowDel()
{
/*
* 说明:
* 0该方法在流程删除之前触发。
* 1删除之前首先要检查必要的业务操作如果抛出异常就不能阻止删除动作
* 2, 返回string 就提示删除操作的风险。
* 3返回null, 就不提示。
*/
/*
* 执行退款操作.
*/
if (1 == 2)
throw new Exception("@该流程不能被删除,因为退款不成功。");
return "@退款已经成功了,该订单取消了。";
}
/// <summary>
/// 流程删除后
/// </summary>
/// <returns>返回null,不提示信息,返回信息,提示删除警告/提示信息, 抛出异常不处理.</returns>
public override string AfterFlowDel()
{
/*
* 说明:
* 0该方法在流程成功删除之后触发。
* 1删除之后可以处理相关的业务如果抛出异常系统不处理。
* 2, 返回string 提示删除执行结果。
* 3返回null, 就不提示。
*/
return base.AfterFlowDel();
}
#endregion 与流程相关的操作
#region 与节点表单相关事件 .
/// <summary>
/// 保存后执行的事件
/// </summary>
/// <returns></returns>
public override string SaveAfter()
{
/*
* 说明:
* 0, 该事件仅仅与节点表单有效.
* 1,
* 1, 保存后,可以处理复杂的表单字段之间的关系,比如:把从表的一个数值列求和到主表上去。
*/
try
{
// 当前的节点, 其他的变量请从 this.HisNode .
int nodeID = this.HisNode.NodeID; // int类型的ID.
string nodeName = this.HisNode.Name; // 当前节点名称.
return base.SaveAfter();
}
catch (Exception ex)
{
throw new Exception("执行[保存后执行的事件],执行节点[" + this.HisNode.NodeID + "," + this.HisNode.Name + "],详细信息:" + ex.Message);
}
}
/// <summary>
/// 保存之前
/// </summary>
/// <returns></returns>
public override string SaveBefore()
{
return base.SaveBefore();
}
#endregion 与节点表单相关事件 .
#region 与撤销相关的操作.
/// <summary>
/// 撤销之前的操作
/// </summary>
/// <returns>返回撤销前提示的信息,返回null则不提示,抛出异常则阻止撤销操作.</returns>
public override string UndoneBefore()
{
/*
* 说明:
* 0, 撤销是一个在发送之后,由当前节点之前的发送人执行的收回发送操作.
* 1, 该事件在执行撤销之前触发。
* 2如果返回null, 怎不提示,返回一个字符串则提示撤销前的警告,如果抛出异常则阻止撤销操作。
* 3, 使用该事件,可以灵活的处理撤销前后的一些业务逻辑。
*/
return base.UndoneBefore();
}
/// <summary>
/// 撤销之后的操作
/// </summary>
/// <returns>返回执行撤销成功的信息,返回null则不提示如果抛出异常不处理。</returns>
public override string UndoneAfter()
{
/*
* 说明:
* 0, 撤销后事件是在执行撤销后触发。
* 1如果返回null, 怎不提示,返回一个字符串则提示撤销前的警告,如果抛出异常则阻止撤销操作。
* 2, 使用该事件,可以灵活的处理撤销前后的一些业务逻辑。
*/
return base.UndoneAfter();
}
#endregion 与撤销相关的操作.
#region 与退回相关事件.
/// <summary>
/// 退回前事件
/// </summary>
/// <returns>退回时的提示信息</returns>
public override string ReturnBefore()
{
/*
* 说明:
* 0, 退回前要触发的事件.
* 1, 如果抛出异常,系统就阻止了退回,比如:有一些商品是不允许退货的,有一些商品是可以退货。
* 执行这个事件就抛出异常系统就会把该信息提示出来。
* 2, 返回string信息系统就提示该信息给操作员。
*/
try
{
// 当前的节点, 其他的变量请从 this.HisNode .
int nodeID = this.HisNode.NodeID; // int类型的ID.
string nodeName = this.HisNode.Name; // 当前节点名称.
if (1 == 0)
throw new Exception("该商品不允许退货,您不能退回。");
return null; //返回空就不提示。
}
catch (Exception ex)
{
throw new Exception("执行[退回前事件],执行节点[" + this.HisNode.NodeID + "," + this.HisNode.Name + "],详细信息:" + ex.Message);
}
}
/// <summary>
/// 退回后执行的事件
/// </summary>
/// <returns>退回后的提示信息</returns>
public override string ReturnAfter()
{
/*
* 说明:
* 0, 退回前要触发的事件.
* 1, 如果抛出异常,系统不处理,比如:比如在商城退货后就提示信息,告诉操作员。
* 2, 返回string信息系统就提示该信息给操作员。
*/
try
{
// 当前的节点, 其他的变量请从 this.HisNode .
int nodeID = this.HisNode.NodeID; // int类型的ID.
string nodeName = this.HisNode.Name; // 当前节点名称.
return "退回成功."; //提示退回信息. return null, 不提示信息。
}
catch (Exception ex)
{
return "执行[退回前事件],执行节点[" + this.HisNode.NodeID + "," + this.HisNode.Name + "],详细信息:" + ex.Message;
}
}
#endregion 与退回相关事件.
#region 与加签相关的操作.
/// <summary>
/// 加签之后的操作
/// </summary>
/// <returns>返回执行的信息</returns>
public override string AskerAfter()
{
return base.AskerAfter();
}
/// <summary>
/// 加签答复相关的操作
/// </summary>
/// <returns>返回执行的信息</returns>
public override string AskerReAfter()
{
return base.AskerReAfter();
}
#endregion 与加签相关的操作.
}
}