概念
定义了一个校验器对象,通常是添加到业务单据操作服务插件,用于对操作的合法性进行校验。继承自校验器抽象对象AbstractValidator。 
应用场景
校验器 
示例
新建一个类,继承自AbstractValidator。
通常重写方法:

Validate

using Kingdee.BOS;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Validation;
using Kingdee.BOS.Orm.DataEntity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Kingdee.K3.Example.ServicePlugIn.TestService
{/// <summary>/// Test 保存操作服务/// </summary>public class Save : AbstractOperationServicePlugIn{//// Summary://     可以定制加载指定字段到实体里//// Parameters://   e:     public override void OnPreparePropertys(BOS.Core.DynamicForm.PlugIn.Args.PreparePropertysEventArgs e){e.FieldKeys.Add("FMaterialID");base.OnPreparePropertys(e);}//// Summary://     通过此事件,通知插件进行添加自定义数据校验器//// Parameters://   e:public override void OnAddValidators(BOS.Core.DynamicForm.PlugIn.Args.AddValidatorsEventArgs e){TestValidator validator = new TestValidator();validator.AlwaysValidate = true;validator.EntityKey = "FBillHead";e.Validators.Add(validator);}//// Summary://     调用操作事物前触发//// Parameters://   e:public virtual void BeginOperationTransaction(BeginOperationTransactionArgs e){//todo}                //// Summary://     调用操作事物后触发//// Parameters://   e:public override void EndOperationTransaction(EndOperationTransactionArgs e){foreach (DynamicObject item in e.DataEntitys){DynamicObjectCollection entryItems = item["STK_LOTADJUSTENTRY"] as DynamicObjectCollection;//ConvertCommonService.UpdateConvertTo(this.Context, K3.Core.SCM.SCMTableConst.T_STK_LOTADJUSTENTRY, entryItems);}}// Summary://     执行操作事务后事件,通知插件对象执行其它事务无关的业务逻辑//// Parameters://   e:public override void AfterExecuteOperationTransaction(AfterExecuteOperationTransaction e) {//todo}//// Summary://     执行操作事务前事件,通知插件对要处理的数据进行排序等预处理//// Parameters://   e://     e.SelectedRows 准备要处理的扩展实体 e.DataEntitys 处理后的实体public override void BeforeExecuteOperationTransaction(BeforeExecuteOperationTransaction e) { //todo}/// <summary>/// 保存单据头校验器/// </summary>private class TestValidator : AbstractValidator{public override void Validate(ExtendedDataEntity[] dataEntities, ValidateContext validateContext, Context ctx){foreach (ExtendedDataEntity obj in dataEntities){object materialID = obj.DataEntity["MaterialID"];if (materialID == null){validateContext.AddError(obj.DataEntity,new ValidationErrorInfo("", obj.DataEntity["Id"].ToString(), obj.DataEntityIndex, 0,"001","错误信息","标题"));}}}}}
}

K/3 Cloud部门删除校验器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Kingdee.BOS.Core.Validation;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.K3.BD.Common.BusinessEntity;
using Kingdee.BOS.Orm.DataEntity;
namespace Kingdee.K3.BD.App.Common.ServicePlugIn.Department
{/// <summary>/// 部门 删除操作 服务端插件/// </summary>public class Delete : AbstractOperationServicePlugIn{public override void OnPreparePropertys(BOS.Core.DynamicForm.PlugIn.Args.PreparePropertysEventArgs e){base.OnPreparePropertys(e);e.FieldKeys.Add("FName");e.FieldKeys.Add("FIsHRDept");e.FieldKeys.Add("FDocumentStatus");e.FieldKeys.Add("FNumber");}public override void OnAddValidators(BOS.Core.DynamicForm.PlugIn.Args.AddValidatorsEventArgs e){base.OnAddValidators(e);AbstractValidator validator;validator = new DeleteValidator();validator.EntityKey = "FBillHead";e.Validators.Add(validator);}}/// <summary>/// 部门删除校验器/// </summary>internal class DeleteValidator : AbstractValidator{public override void Validate(BOS.Core.ExtendedDataEntity[] dataEntities, ValidateContext validateContext, BOS.Context ctx){//获取所有部门的层级码信息IList<LevelCodeTreeNode> nodeList = Kingdee.K3.BD.Contracts.ServiceFactory.GetDepartmentService(Context).InitialLevelCodeTreeNodes(Context,(from dynObj in dataEntitieswhere dynObj.DataEntity["DocumentStatus"].ToString() == "A"select Convert.ToInt64(dynObj.DataEntity["Id"])).ToList());for (int i = 0; i < nodeList.Count; i++){LevelCodeTreeNode currentNode = nodeList[i];if (currentNode.ChildNodes == null || currentNode.ChildNodes.Count == 0){RemoveNode(nodeList, currentNode);}}//获取非删除部门列表IList<LevelCodeTreeNode> unDelNodes = (from item in nodeList where item.ChildNodes != null && item.ChildNodes.Count != 0 select item).ToList();foreach (var unDelNode in unDelNodes){BOS.Core.ExtendedDataEntity dynObj = FindDataObject(dataEntities, unDelNode);validateContext.AddError(dynObj.DataEntity,new ValidationErrorInfo(dynObj.DataEntity["Number"].ToString(),dynObj.DataEntity["Id"].ToString(),dynObj.DataEntityIndex,dynObj.RowIndex,dynObj.DataEntity["Id"].ToString(),string.Format(Kingdee.BOS.Resource.ResManager.LoadKDString("存在下级部门,建议先删除子部门后再删除本部门!","001001000000351",Kingdee.BOS.Resource.SubSystemType.BASE)),dynObj.DataEntity["Number"].ToString()));}}/// <summary>/// 获取当前树节点对应的实体数据/// </summary>/// <param name="dataEntities"></param>/// <param name="currentNode"></param>/// <returns></returns>private BOS.Core.ExtendedDataEntity FindDataObject(BOS.Core.ExtendedDataEntity[] dataEntities, LevelCodeTreeNode currentNode){foreach (var dynObj in dataEntities){if (Convert.ToInt64(dynObj.DataEntity["Id"]) == currentNode.Id){return dynObj;}}//原则上不会到这里return new BOS.Core.ExtendedDataEntity();}/// <summary>/// 清楚已被确认删除的树节点/// </summary>/// <param name="nodeList"></param>/// <param name="removeNode"></param>private void RemoveNode(IList<LevelCodeTreeNode> nodeList, LevelCodeTreeNode removeNode){for (int i = 0; i < nodeList.Count; i++){LevelCodeTreeNode checkNode = nodeList[i];for (int j = checkNode.ChildNodes.Count - 1; j >= 0; j--){LevelCodeTreeNode childNode = checkNode.ChildNodes[j];if (childNode.Id == removeNode.Id){checkNode.ChildNodes.RemoveAt(j);}}}}}
}

转载于:https://www.cnblogs.com/fyq891014/p/3308533.html

[K/3Cloud]创建一个操作校验器相关推荐

  1. [K/3Cloud] 创建一个单据转换插件

    概念: 创建一个业务单据转换插件,在单据转换的各个时点干预单据转换的相关逻辑控制. 示例: 新建一个类,继承自单据转换插件基类Kingdee.BOS.Core.Metadata.ConvertElem ...

  2. NDK学习笔记(十二) 原生图形api,使用AVILib创建一个AVI视频播放器

    文章目录 1.练练手,使用AVILib创建一个AVI视频播放器 (1)首先下载transcode,并配置avilib. (2)创建AbstractPlayerActivity并实现native方法 ( ...

  3. 如何使用Foxit Mobile SDK 6.0 快速创建一个PDF阅读器-Android篇

    Foxit MobilePDF SDK是一款用于移动平台的快速开发包,专注于帮助开发人员将强大的Foxit PDF技术轻松地集成到他们的应用程序中.不知不觉,产品的版本已经到了6.0,近期刚刚发布,6 ...

  4. 【Android Developers Training】 93. 创建一个空验证器

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  5. Proxy用法——让我们创建一个API代理器

    什么是Java Proxy? MDN对Proxy 的定义是: Proxy对象用于定义基本操作的自定义行为(如属性查找.赋值.枚举.函数调用等). 通俗的将,Proxy对象是目标对象的一个代理器,任何对 ...

  6. html音乐播放器 利用css和js知识来创建一个音乐播放器(虽然简陋,但是逻辑很容易懂,适合初学者)

    作为初学者,制作一个网页播放器来提高我们编写代码水平很有用 这是css部分,很简单,随便信息样式就行 .musicDiv{width: 250px;height: 70px;background-co ...

  7. 如何使用Python创建一个自定义视频播放器

    目录 1.安装vlc的64位版本. 2.安装python的vlc模块. 3.编写如下代码,包含了播放,暂停,停止.音量控制功能. 4.来看一看运行结果. 5.如果遇到播放不了的问题,解决方式如下: 这 ...

  8. [K/3Cloud]关于选单操作

    之前有些人对这块有些疑问,比如: 1.选单操作是否和下推基本一样,都是公用同一套单据转换规则,只不过下推是源单推目标单,选单是目标单去选择源单,最终操作结果一样? 2,我想实现选单的时候,选单列表先通 ...

  9. NDK学习笔记(十四) 使用AVILib+window创建一个AVI视频播放器

    文章目录 1.window api 2.主要代码 3.实现效果 1.window api (1)从surface对象中检索原生window 从surface中检索对象window ANativeWin ...

  10. 开源:如何优雅的实现一个操作日志组件

    1. 背景 日志几乎存在于所有系统中,开发调试日志的记录我们有log4j,logback等来实现,但对于要展示给用户看的日志,我并没有发现一个简单通用的实现方案.所以决定为之后的开发项目提供一个通用的 ...

最新文章

  1. VSFTP用户目录指定
  2. dedecms上传图片不自动改名,以利于seo图片优化
  3. 通讯录管理系统(C语言)
  4. 怎么改变表单option标签直接字体大小_不起眼却非常重要的表单交互
  5. Windows Print Spooler服务最新漏洞CVE-2021-34527详解
  6. VB 判断当前是否连接网络API实现
  7. HDU 1079 Calendar Game 博弈
  8. linux最新的发布版本号,求问Linux最新内核版本以及发布日期。
  9. vb运行环境linux,VB.Net开发环境安装配置
  10. 微软背叛wintel联盟,Intel似乎正陷入四面楚歌之中
  11. 2021年中国充电桩行业发展环境(PEST)分析:随着新能源汽车的增加,充电桩也随之增加[图]
  12. 数据结构 实验 c/c++ 六度空间 图 图论
  13. Canvas绘制抽奖转盘
  14. 将海康摄像机发布萤石云指南
  15. “智多星”手机销售网
  16. mybatis方法参数是list的批量插入
  17. Python利用selenium简单的爬取网易云歌曲排行榜
  18. **Javase 重要知识点总结 day08
  19. 如何取消Chrome浏览器自动翻译
  20. Python中turtle画n层m个不同方向的圆,送你一朵小黄花

热门文章

  1. Python入门:Dataframe的索引模式
  2. 随记-Git相关操作
  3. slopShell:强大的PHP Webshell
  4. 2020-8-5 Codeforces摸鱼报告
  5. Maria数据库怎么复制到mysql_mysql/mariadb主从复制
  6. jenkins+maven+svn+npm自动发布部署实践
  7. Tp5 写随机数(商品货号)
  8. C# System.Drawing.SystemColors 系统颜色
  9. Linux Unix shell 编程指南学习笔记(第二部分)
  10. webots自学笔记(五)使用物理插件ODE建立铰链