代码实现操作校验,需要派生操作插件基类,以及实现一个校验器。
代码段1:实现操作插件基类,该插件编译通过后,需要到BOS IDE中,打开单据,注册到单据的操作上。
/// <summary>
/// 操作服务端插件示例
/// </summary>
/// <remarks>
/// 1. 示例如何强制要求加载某字段
/// 2. 示例如何注入校验器,校验器可以通用,为避免在各操作中重复编码,剥离出来,然后各操作注入剥离出的校验器
/// 3. 说明一些关键事件的用途
/// </remarks>
[System.ComponentModel.Description("操作服务端插件示例")]
public class OperationPlugSample : Kingdee.BOS.Core.DynamicForm.PlugIn.AbstractOperationServicePlugIn
{
/// <summary>
/// 数据加载前,确保需要的属性被加载
/// </summary>
/// <param name="e"></param>
/// <remarks>
/// 在列表上执行操作时,单据的字段并没有被完全加载。
/// 如果操作插件用到了未被加载的字段,一定会中断;
/// 本事件允许插件,强制要求加载某些字段,避免中断
/// </remarks>
public override void OnPreparePropertys(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.PreparePropertysEventArgs e)
{
// 如下代码行,指定字段xxxxx的Key,强制要求加载字段
e.FieldKeys.Add("xxxxx");
}
/// <summary>
/// 操作执行前,加载操作校验器
/// </summary>
/// <param name="e"></param>
/// <remarks>
/// 在系统开始执行校验前,插件可以追加自己的校验器进入操作校验器集合
/// </remarks>
public override void OnAddValidators(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.AddValidatorsEventArgs e)
{
// 如下代码行,示例加入自定义的校验器
// 自定义的校验器,必须从基类 Kingdee.BOS.Core.Validation.AbstractValidator 派生
e.Validators.Add(new OperationSampleValidator());
}
#region 接下来按照事件的执行事件顺序,由前向后逐一介绍各事件
/// <summary>
/// 操作执行前,事务开始前事件
/// </summary>
/// <param name="e"></param>
/// <remarks>
/// 1. 此事件在操作校验之后、操作实现代码之前执行
/// 2. 此事件在操作事务之前,即此事件中的数据库处理,不受操作的事务保护
/// 3. 通常此事件,也可以用来进行数据校验
/// </remarks>
public override void BeforeExecuteOperationTransaction(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.BeforeExecuteOperationTransaction e)
{
// TODO: ....
// 如下代码,示意校验不通过时,终止操作的执行
e.CancelMessage = "测试终止操作执行";
e.Cancel = true;
}
/// <summary>
/// 操作执行前,事务开始后事件
/// </summary>
/// <param name="e"></param>
/// <remarks>
/// 1. 此事件在操作校验之后
/// 2. 此事件在操作事务开始之后
/// 3. 此事件在操作执行代码之前
/// 4. 此事件中的数据库处理,受操作的事务保护
/// 5. 通常此事件,可以用来做数据准备,在操作之前,提前写数据到库
/// </remarks>
public override void BeginOperationTransaction(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.BeginOperationTransactionArgs e)
{
// TODO: 进行数据准备,甚至写预处理数据到数据库
}
/// <summary>
/// 操作执行后,事务结束前
/// </summary>
/// <param name="e"></param>
/// <remarks>
/// 1. 此事件在操作执行代码之后,操作的内部逻辑已经执行完毕
/// 2. 此事件在操作事务提交之前
/// 3. 此事件中的数据库处理,受操作的事务保护
/// 4. 通常此事件,可以用来做同步数据,如同步生成其他单据,而且需要受事务保护
/// </remarks>
public override void EndOperationTransaction(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.EndOperationTransactionArgs e)
{
// TODO:进行同步数据处理
}
/// <summary>
/// 操作执行后,事务结束后
/// </summary>
/// <param name="e"></param>
/// <remarks>
/// 1. 此事件在操作执行后,操作的内部逻辑已经执行完毕;
/// 2. 此事件在操作事务提交之后;
/// 3. 此事件中的数据库处理,不受操作的事务保护
/// 4. 通常此事件,也可以做同步数据,但是此同步数据的成功与否,不需影响操作
/// </remarks>
public override void AfterExecuteOperationTransaction(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.AfterExecuteOperationTransaction e)
{
// TODO:进行同步数据处理,如果同步失败,不影响操作的结果
}
#endregion
}
代码段2:校验器的实现
/// <summary>
/// 操作校验器(示例)
/// </summary>
[System.ComponentModel.Description("操作校验器(示例)")]
class OperationSampleValidator : Kingdee.BOS.Core.Validation.AbstractValidator
{
#region 重载函数
/// <summary>
/// 校验主实体,以此实体数据包进行循环,逐行校验
/// </summary>
public override string EntityKey
{
get
{
// 根据实际校验要求,返回单据头或者单据体Key
return "FBillHead";
}
}
/// <summary>
/// 执行校验,把校验结果注入到validateContext中
/// </summary>
/// <param name="dataEntities"></param>
/// <param name="validateContext"></param>
/// <param name="ctx"></param>
public override void Validate(
Kingdee.BOS.Core.ExtendedDataEntity[] dataEntities,
Kingdee.BOS.Core.Validation.ValidateContext validateContext,
Kingdee.BOS.Context ctx)
{
foreach (var dataEntity in dataEntities)
{
// TODO: 逐个数据包执行校验代码
// 如下代码,示意如何注入校验提示,后续操作,会自动避开校验没通过的数据包
validateContext.AddError(dataEntity.DataEntity,
new Kingdee.BOS.Core.Validation.ValidationErrorInfo(
"出错字段.Key", // 出错的字段Key,可以空
Convert.ToString(dataEntity.DataEntity[0]), // 数据包内码,必填,后续操作会据此内码避开此数据包
dataEntity.DataEntityIndex, // 出错的数据包在全部数据包中的顺序
dataEntity.RowIndex, // 出错的数据行在全部数据行中的顺序,如果校验基于单据头,此为0
"E1", // 错误编码,可以任意设定一个字符,主要用于追查错误来源
"错误的详细提示信息", // 错误的详细提示信息
"错误摘要", // 错误的简明提示信息
Kingdee.BOS.Core.Validation.ErrorLevel.Error)); // 错误级别:警告、错误...
}
}
#endregion 重载函数
}