代码实现操作校验,需要派生操作插件基类,以及实现一个校验器。

代码段1:实现操作插件基类,该插件编译通过后,需要到BOS IDE中,打开单据,注册到单据的操作上。

  1. /// <summary>

  2.     /// 操作服务端插件示例

  3.     /// </summary>

  4.     /// <remarks>

  5.     /// 1. 示例如何强制要求加载某字段

  6.     /// 2. 示例如何注入校验器,校验器可以通用,为避免在各操作中重复编码,剥离出来,然后各操作注入剥离出的校验器

  7.     /// 3. 说明一些关键事件的用途

  8.     /// </remarks>

  9.     [System.ComponentModel.Description("操作服务端插件示例")]

  10.     public class OperationPlugSample : Kingdee.BOS.Core.DynamicForm.PlugIn.AbstractOperationServicePlugIn

  11.     {

  12.         /// <summary>

  13.         /// 数据加载前,确保需要的属性被加载

  14.         /// </summary>

  15.         /// <param name="e"></param>

  16.         /// <remarks>

  17.         /// 在列表上执行操作时,单据的字段并没有被完全加载。

  18.         /// 如果操作插件用到了未被加载的字段,一定会中断;

  19.         /// 本事件允许插件,强制要求加载某些字段,避免中断

  20.         /// </remarks>

  21.         public override void OnPreparePropertys(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.PreparePropertysEventArgs e)

  22.         {

  23.             // 如下代码行,指定字段xxxxx的Key,强制要求加载字段

  24.             e.FieldKeys.Add("xxxxx");

  25.         }

  26.         /// <summary>

  27.         /// 操作执行前,加载操作校验器

  28.         /// </summary>

  29.         /// <param name="e"></param>

  30.         /// <remarks>

  31.         /// 在系统开始执行校验前,插件可以追加自己的校验器进入操作校验器集合

  32.         /// </remarks>

  33.         public override void OnAddValidators(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.AddValidatorsEventArgs e)

  34.         {

  35.             // 如下代码行,示例加入自定义的校验器

  36.             // 自定义的校验器,必须从基类 Kingdee.BOS.Core.Validation.AbstractValidator 派生

  37.             e.Validators.Add(new OperationSampleValidator());

  38.         }

  39.         #region 接下来按照事件的执行事件顺序,由前向后逐一介绍各事件

  40.         /// <summary>

  41.         /// 操作执行前,事务开始前事件

  42.         /// </summary>

  43.         /// <param name="e"></param>

  44.         /// <remarks>

  45.         /// 1. 此事件在操作校验之后、操作实现代码之前执行

  46.         /// 2. 此事件在操作事务之前,即此事件中的数据库处理,不受操作的事务保护

  47.         /// 3. 通常此事件,也可以用来进行数据校验

  48.         /// </remarks>

  49.         public override void BeforeExecuteOperationTransaction(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.BeforeExecuteOperationTransaction e)

  50.         {

  51.             // TODO: ....

  52.             // 如下代码,示意校验不通过时,终止操作的执行

  53.             e.CancelMessage = "测试终止操作执行";

  54.             e.Cancel = true;

  55.         }

  56.         /// <summary>

  57.         /// 操作执行前,事务开始后事件

  58.         /// </summary>

  59.         /// <param name="e"></param>

  60.         /// <remarks>

  61.         /// 1. 此事件在操作校验之后

  62.         /// 2. 此事件在操作事务开始之后

  63.         /// 3. 此事件在操作执行代码之前

  64.         /// 4. 此事件中的数据库处理,受操作的事务保护

  65.         /// 5. 通常此事件,可以用来做数据准备,在操作之前,提前写数据到库

  66.         /// </remarks>

  67.         public override void BeginOperationTransaction(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.BeginOperationTransactionArgs e)

  68.         {

  69.             // TODO: 进行数据准备,甚至写预处理数据到数据库

  70.         }

  71.         /// <summary>

  72.         /// 操作执行后,事务结束前

  73.         /// </summary>

  74.         /// <param name="e"></param>

  75.         /// <remarks>

  76.         /// 1. 此事件在操作执行代码之后,操作的内部逻辑已经执行完毕

  77.         /// 2. 此事件在操作事务提交之前

  78.         /// 3. 此事件中的数据库处理,受操作的事务保护

  79.         /// 4. 通常此事件,可以用来做同步数据,如同步生成其他单据,而且需要受事务保护

  80.         /// </remarks>

  81.         public override void EndOperationTransaction(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.EndOperationTransactionArgs e)

  82.         {

  83.             // TODO:进行同步数据处理

  84.         }

  85.         /// <summary>

  86.         /// 操作执行后,事务结束后

  87.         /// </summary>

  88.         /// <param name="e"></param>

  89.         /// <remarks>

  90.         /// 1. 此事件在操作执行后,操作的内部逻辑已经执行完毕;

  91.         /// 2. 此事件在操作事务提交之后;

  92.         /// 3. 此事件中的数据库处理,不受操作的事务保护

  93.         /// 4. 通常此事件,也可以做同步数据,但是此同步数据的成功与否,不需影响操作

  94.         /// </remarks>

  95.         public override void AfterExecuteOperationTransaction(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.AfterExecuteOperationTransaction e)

  96.         {

  97.             // TODO:进行同步数据处理,如果同步失败,不影响操作的结果

  98.         }

  99.         #endregion 

  100.     }



代码段2:校验器的实现


  1.     /// <summary>

  2.     /// 操作校验器(示例)

  3.     /// </summary>

  4.     [System.ComponentModel.Description("操作校验器(示例)")]

  5.     class OperationSampleValidator : Kingdee.BOS.Core.Validation.AbstractValidator

  6.     {

  7.         #region 重载函数

  8.         /// <summary>

  9.         /// 校验主实体,以此实体数据包进行循环,逐行校验

  10.         /// </summary>

  11.         public override string EntityKey

  12.         {

  13.             get

  14.             {

  15.                 // 根据实际校验要求,返回单据头或者单据体Key

  16.                 return "FBillHead";

  17.             }

  18.         }

  19.         /// <summary>

  20.         /// 执行校验,把校验结果注入到validateContext中

  21.         /// </summary>

  22.         /// <param name="dataEntities"></param>

  23.         /// <param name="validateContext"></param>

  24.         /// <param name="ctx"></param>

  25.         public override void Validate(

  26.             Kingdee.BOS.Core.ExtendedDataEntity[] dataEntities, 

  27.             Kingdee.BOS.Core.Validation.ValidateContext validateContext, 

  28.             Kingdee.BOS.Context ctx)

  29.         {

  30.             foreach (var dataEntity in dataEntities)

  31.             {

  32.                 // TODO: 逐个数据包执行校验代码

  33.                 

  34.                 // 如下代码,示意如何注入校验提示,后续操作,会自动避开校验没通过的数据包

  35.                 validateContext.AddError(dataEntity.DataEntity,

  36.                                         new Kingdee.BOS.Core.Validation.ValidationErrorInfo(

  37.                                             "出错字段.Key",     // 出错的字段Key,可以空

  38.                                             Convert.ToString(dataEntity.DataEntity[0]), // 数据包内码,必填,后续操作会据此内码避开此数据包

  39.                                             dataEntity.DataEntityIndex,     // 出错的数据包在全部数据包中的顺序

  40.                                             dataEntity.RowIndex,            // 出错的数据行在全部数据行中的顺序,如果校验基于单据头,此为0

  41.                                             "E1",                           // 错误编码,可以任意设定一个字符,主要用于追查错误来源

  42.                                             "错误的详细提示信息",            // 错误的详细提示信息 

  43.                                             "错误摘要",                     // 错误的简明提示信息

  44.                                             Kingdee.BOS.Core.Validation.ErrorLevel.Error));     // 错误级别:警告、错误...

  45.             }

  46.         }

  47.         #endregion 重载函数

  48.     }