服务插件



校验器服务插件
         校验服务插件开发包括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