概念:

定义了一个校验器对象,通常是添加到业务单据操作服务插件,用于对操作的合法性进行校验。继承自校验器抽象对象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. 转【Python】Python-skier游戏[摘自.与孩子一起学编程]

    http://www.cnblogs.com/zhaoxd07/p/4914818.html 我遇到的问题 问题1 self.image=pygame.image.load("skier_d ...

  2. Java socket2

    通过socket对象可以获取通信对方的socket信息 客户端: import java.net.*; import java.io.*; public class TestServer { publ ...

  3. paint之Graphics

    在paint方法里面,这个Graphics类就相当于一支画笔.而且就画在那个component里面,比如frame. 看例子代码: import java.awt.*; public class Te ...

  4. 【转】Java中,&&与&,||与|的区别

    转自:http://blog.csdn.net/lishiyuzuji/article/details/8116516 在Java的逻辑运算符中,有这么四类:&&(短路与),& ...

  5. Codeforces Beta Round #98 (Div. 2)(A-E)

    A #include <iostream> #include<cstdio> #include<cstring> #include<algorithm> ...

  6. 阿里云服务器 Access to the path '....' is denied.解决方法

    昨天公司项目迁移服务器,从自己服务器迁移到阿里云服务器,部署完成后发现有一个页面要读取磁盘上的静态文件就报错了... 如图: 解决办法: 在 Web.Config 的 <System.Web&g ...

  7. 大步小步法(BSGS) 学习笔记

    \(\\\) BSGS 用于求解关于 \(x\) 的方程: \[ a^x\equiv b\pmod p\ ,\ (p,a)=1 \] 一般求解的是模意义下的指数,也就是最小非负整数解. \(\\\) ...

  8. Asp.Net 设计模式 之 “简单工厂”模式

    主要思想: public static Operation CreateFactory(string ope)        {            //实例化空父类,让父类指向子类         ...

  9. matlab遗传算法工具箱

    转自http://blog.sina.com.cn/s/blog_5ebcc0240101pnrj.html matlab遗传算法工具箱函数及实例讲解 (2014-01-10 13:03:57)   ...

  10. springMvc(初识+操作步骤)

    1.导入包2.配置web.xml <?xml version="1.0" encoding="UTF-8"?><web-app xmlns:x ...