• 服务插件




    校验器服务插件
             校验服务插件开发包括2部分:
    1.       定义校验器
    2.       在服务中增加校验器
    定义校验器命名空间
    Kingdee.BOS.Core.Validation
    继承体系
    所有校验器都应继承自校验器抽象类。
    插件模型
    继承自抽象类
    服务插件
    Kingdee.BOS.Core.Validation.AbstractValidator
    属性


    Name
    Description
     
    返回是否在任何时机点下都校验
     
    上下文
     
    实体数据,根据EntityKey不同实体数据不同
     
    返回此校验器校验哪个实体
     
    此校验将发生在哪些时机点下。  
     
    校验时间点拼接成的字符串;如",Save,"; 赋值时,需要把这个字符串分解成数组到TimingPoints属性  
     
    校验器元数据  
    方法


    Name
    Description
     
    在校验前,校验系统调用此方法,以便能够统一收集任务,并批量执行  
     
    在校验前,校验系统调用此方法,以便初始化校验器的配置信息  
     
    对指定的数据进行校验  
    file:///C:/Users/rd_weixy/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png    Validate
    对指定的数据进行校验。
    下面例子定义一个保存校验器,校验库存是否〉100
    C#


    public class SaveValidator : AbstractValidator
    {
        public override void Validate(ExtendedDataEntity[] dataEntities, ValidateContext validateContext, Kingdee.BOS.Context ctx)
        {
            if (dataEntities == null || dataEntities.Length == 0)
            {
                return;
            }

            Dictionary<long, decimal> dictErrMaterialId = new Dictionary<long, decimal>();

            //取所有物料
            List<long> listMaterialId = new List<long>();
            foreach (ExtendedDataEntity entityObj in dataEntities)
            {
                DynamicObjectCollection collection = (DynamicObjectCollection)entityObj["FEntity"];
                foreach (DynamicObject rowObj in collection)
                {
                    listMaterialId.Add((long)rowObj["FBase_Id"]);
                }
            }
            string sql = " select a.FMATERIALID, sum(a.FBASEQTY) FQTY from  T_STK_INVENTORY a where exists (select 1 from TABLE(fn_StrSplit(@FMATERIALID, ',',1)) t where t.FID = a. FMATERIALID) group by FMATERIALID ";
            SqlParam param = new SqlParam("@FMATERIALID", KDDbType.udt_inttable, listMaterialId.Distinct().ToArray());
            using (IDataReader dr = DBUtils.ExecuteReader(this.Context, sql, param))
            {
                while (dr.Read())
                {
                    decimal qty = Convert.ToDecimal(dr["FQTY"]);
                    if (qty > 100)
                    {
                        dictErrMaterialId.Add(Convert.ToInt64(dr["FMATERIALID"]), qty);
                    }
                }
            }
            foreach (ExtendedDataEntity entityObj in dataEntities)
            {
                DynamicObjectCollection collection = (DynamicObjectCollection)entityObj["FEntity"];
                foreach (DynamicObject rowObj in collection)
                {
                    if (dictErrMaterialId.ContainsKey((long)rowObj["FBase_Id"]))
                    {
                        ValidationErrorInfo errinfo = new ValidationErrorInfo("FMATERIALID", Convert.ToString(entityObj.DataEntity["Id"]),
                            entityObj.DataEntityIndex, Convert.ToInt32(rowObj["Id"]), "SaveValidator", "库存数量大于100", "校验失败", ErrorLevel.Error);
                        validateContext.AddError(entityObj, errinfo);
                    }
                }
            }
        }
    }
    在服务中增加校验器
    在服务插件(继承自AbstractOperationServicePlugIn)中重载OnAddValidators方法增加校验器。
    file:///C:/Users/rd_weixy/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png    OnAddValidators
    增加一个校验器。可以设置校验器属性,如指定校验哪部分数据EntityKey,指定校验的时机点。
    示例:
    C#


    public override void OnAddValidators(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.AddValidatorsEventArgs e)
    {
        base.OnAddValidators(e);
        SaveValidator saveValidator = new SaveValidator();
        saveValidator.EntityKey = "FBillHead";
        e.Validators.Add(saveValidator);
    }
  • 相关阅读:
    【软件构造】第七章第三节 断言和防御性编程
    【软件构造】第七章第二节 错误与异常处理
    【软件构造】第七章第一节 健壮性和正确性的区别
    【软件构造】第六章第三节 面向可维护的构造技术
    【软件构造】第六章第二节 可维护的设计模式
    【软件构造】第六章第一节 可维护性的度量与构造原则
    【软件构造】第五章第三节 可复用的设计模式
    【软件构造】第五章第二节 设计可复用的软件
    【软件构造】第五章第一节 可复用性的度量、形态和外部观察
    【软件构造】第四章第一节 面向可理解性的构造
  • 原文地址:https://www.cnblogs.com/liangyuwen/p/13272851.html
Copyright © 2020-2023  润新知