2.1 服务插件 - 校验器服务插件
金蝶云社区-云小爱
云小爱
3人赞赏了该文章 7,883次浏览 未经作者许可,禁止转载编辑于2014年09月27日 17:18:50

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


[tr][td=89]插件模型
[td=463]继承自抽象类

[tr][td=89]服务插件
[td=463]Kingdee.BOS.Core.Validation.AbstractValidator

属性
[tr][td=18]

[td=163]Name
[td=379]Description

[tr][td=18][td=163]AlwaysValidate
[td=379]返回是否在任何时机点下都校验

[tr][td=18][td=163]Context
[td=379]上下文

[tr][td=18][td=163]DataEntities
[td=379]实体数据,根据EntityKey不同实体数据不同

[tr][td=18][td=163]EntityKey
[td=379]返回此校验器校验哪个实体

[tr][td=18][td=163]TimingPoints
[td=379]此校验将发生在哪些时机点下。

[tr][td=18][td=163]TimingPointString
[td=379]校验时间点拼接成的字符串;如",Save,"; 赋值时,需要把这个字符串分解成数组到TimingPoints属性

[tr][td=18][td=163]Validation
[td=379]校验器元数据

方法
[tr][td=18]

[td=163]Name
[td=379]Description

[tr][td=18][td=163]Initialize
[td=379]在校验前,校验系统调用此方法,以便能够统一收集任务,并批量执行

[tr][td=18][td=163]InitializeConfiguration
[td=379]在校验前,校验系统调用此方法,以便初始化校验器的配置信息

[tr][td=18][td=163]Validate
[td=379]对指定的数据进行校验

Validate
对指定的数据进行校验。下面例子定义一个保存校验器,校验库存是否〉100
[tr][td=375]C#
[td=189]


[tr][td=2,1,564]public class SaveValidator : AbstractValidator{ public override void Validate(ExtendedDataEntity[] dataEntities, ValidateContext validateContext, Kingdee.BOS.Context ctx) { if (dataEntities == null || dataEntities.Length == 0) { return; }
Dictionary dictErrMaterialId = new Dictionary();
//取所有物料 List listMaterialId = new List(); 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方法增加校验器。

OnAddValidators
增加一个校验器。可以设置校验器属性,如指定校验哪部分数据EntityKey,指定校验的时机点。示例:
[tr][td=379]C#
[td=191]


[tr][td=2,1,569]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);}