如何用插件实现操作校验

来源:互联网 发布:聚富传媒软件 编辑:程序博客网 时间:2024/06/01 16:45
用代码实现操作校验,需要派生操作插件基类,以及实现一个校验器。

代码段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 重载函数    }



0 0
原创粉丝点击