概念:

定义了一个校验器对象,通常是添加到业务单据操作服务插件,用于对操作的合法性进行校验。继承自校验器抽象对象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",
"错误信息",
"标题"
));
}
}
}
}
}
}

K3Cloud案例

部门删除的校验器:

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 dataEntities
where 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);
}
}
}
}
}
}

[K/3Cloud] 创建一个操作校验器的更多相关文章

  1. [K/3Cloud] 创建一个业务单据表单插件

    概念 创建一个业务单据插件,处理单据的相关控制逻辑. 示例 新建一个类,继承自单据插件基类Kingdee.BOS.Core.Bill.PlugIn.AbstractBillPlugIn. using ...

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

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

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

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

  4. 【Blazor】在ASP.NET Core中使用Blazor组件 - 创建一个音乐播放器

    前言 Blazor正式版的发布已经有一段时间了,.NET社区的各路高手也创建了一个又一个的Blazor组件库,其中就包括了我和其他小伙伴一起参与的AntDesign组件库,于上周终于发布了第一个版本0 ...

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

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

  6. 【Android Developers Training】 94. 创建一个空内容提供器(Content Provider)

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

  7. 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用

    由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...

  8. 【spring】-- jsr303参数校验器

    一.为什么要进行参数校验? 当我们在服务端控制器接受前台数据时,肯定首先要对数据进行参数验证,判断参数是否为空?是否为电话号码?是否为邮箱格式?等等. 这里有个问题要注意: 前端代码一般上会对这些数据 ...

  9. 用vlc SDK创建一个播放视频文件和RTSP流视频的Demo

    #include <stdio.h> #include <tchar.h> #include <time.h> #include <windows.h> ...

随机推荐

  1. CentOS 6.5上安装GlassFish4.0 过程笔记

    CentOS 6.5上安装GlassFish4.0 过程笔记 1.安装JDK, 注意操作系统的位数, 64 or 32: [root@linuxidc ~]# mkdir /usr/java  [ro ...

  2. eclipse控制台不显示输出的解决办法

    1.进windows菜单 -> show view -> console2.还是windows菜单里面 -> preferences -> 打开左边的run/debug -&g ...

  3. iOS生成PDF的关键代码-备忘

    //此方法只是把当前页面的内容生成PDF并保存在沙盒中. //还需要做:把当前面没有显示的内容以分页的形式生成PDF,并把PDF读取并显示出来 //关于显示可以参考:念茜的博客 iOS开发笔记——PD ...

  4. 转: ORA-06508 could not find program unit being called: "DBSNMP.BSLN_INTERNAL

    告警日志中出现错误 Sun Jul 28 00:00:00 2013Errors in file /oracle/app/db/diag/rdbms/mis/MIS1/trace/MIS1_j001_ ...

  5. 190 Reverse Bits 颠倒二进制位

    颠倒给定的32位无符号整数的二进制位.例如,给定输入 43261596(二进制表示为 00000010100101000001111010011100 ),返回 964176192(二进制表示为 00 ...

  6. APP多渠道打包

    多渠道打包的概念: 打包是指使用证书文件对app签名生成一个apk文件. 多渠道打包指的就是我们的app在开发完成之后需要投放到不同的市场,比如说Google市场.百度市场等,为了统计应用在各个市场的 ...

  7. Javascript数据结构之栈

    作者原文:http://hawkzz.com/blog/blog/1515054561771 定义 栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶.栈被称为一种先入后出的数据结构 ...

  8. 【CSS】3种CSS方法设置元素垂直水平居中

    1. 宽高固定 设置要水平垂直居中的 div 的 position 为 absolute,left:50%; margin-left为负的这个元素宽度的一半,同理,top:50%;margin-top ...

  9. Hadoop YARN学习监控JVM和实时监控Ganglia、Ambari(5)

    Hadoop YARN学习监控JVM和实时监控Ganglia.Ambari(5) 1.0 监控ResourceManager进程Java虚拟机中堆空间的特定部分. jstat工具,在JDK的bin目录 ...

  10. Scala基础篇-04 try表达式

    1.try表达式 定义 try{} catch{} finally{} //例子 try{ Integer.parseInt("dog") }catch { }finally { ...