如何用插件实现操作校验

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

代码段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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值