[K/3Cloud] 创建一个操作校验器
概念:
示例:
新建一个类,继承自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] 创建一个操作校验器的更多相关文章
- [K/3Cloud] 创建一个业务单据表单插件
概念 创建一个业务单据插件,处理单据的相关控制逻辑. 示例 新建一个类,继承自单据插件基类Kingdee.BOS.Core.Bill.PlugIn.AbstractBillPlugIn. using ...
- [K/3Cloud] 创建一个单据转换插件
概念: 创建一个业务单据转换插件,在单据转换的各个时点干预单据转换的相关逻辑控制. 示例: 新建一个类,继承自单据转换插件基类Kingdee.BOS.Core.Metadata.ConvertElem ...
- 【Android Developers Training】 93. 创建一个空验证器
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Blazor】在ASP.NET Core中使用Blazor组件 - 创建一个音乐播放器
前言 Blazor正式版的发布已经有一段时间了,.NET社区的各路高手也创建了一个又一个的Blazor组件库,其中就包括了我和其他小伙伴一起参与的AntDesign组件库,于上周终于发布了第一个版本0 ...
- [K/3Cloud]关于"选单"操作
之前有些人对这块有些疑问,比如: 1.选单操作是否和下推基本一样,都是公用同一套单据转换规则,只不过下推是源单推目标单,选单是目标单去选择源单,最终操作结果一样? 2,我想实现选单的时候,选单列表先通 ...
- 【Android Developers Training】 94. 创建一个空内容提供器(Content Provider)
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用
由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...
- 【spring】-- jsr303参数校验器
一.为什么要进行参数校验? 当我们在服务端控制器接受前台数据时,肯定首先要对数据进行参数验证,判断参数是否为空?是否为电话号码?是否为邮箱格式?等等. 这里有个问题要注意: 前端代码一般上会对这些数据 ...
- 用vlc SDK创建一个播放视频文件和RTSP流视频的Demo
#include <stdio.h> #include <tchar.h> #include <time.h> #include <windows.h> ...
随机推荐
- 441 Arranging Coins 排列硬币
你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币.给定一个数字 n,找出可形成完整阶梯行的总行数.n 是一个非负整数,并且在32位有符号整型的范围内.示例 1:n ...
- "言官误国"
"言官误国" 之前读<明朝那些事儿>的时候,了解到了一个全新的概念,确切的说与之前的印象完全不符合的概念:言官.之前我印象中的言官都是魏征那样的人,为国为民.冒死直谏等 ...
- js中,浏览器中不同元素位置属性解析
offset() 只对可见元素有效,获取匹配元素在当前视口的相对偏移,返回的对象有两个整型属性,top和left,像素计算: position() 相对父元素的偏移,position.left ...
- POI导出时,将指定的列设置为下拉列表
本示例设置第2列为下拉框(下拉框内容为:是/否),从第5行开始到5657行结束. 关键代码示例: ComboxList = new String[]{"是","否&quo ...
- swiper4实现的拥有header和footer的全屏滚动demo/swiper fullpage footer
用swiper4实现的拥有header和footer的全屏滚动demo, <!DOCTYPE html> <html lang="en"> <head ...
- python游戏开发:pygame中的IO、数据
一.python输入输出 1.输出 python一次可以打印多个变量,只要用一个逗号将每个变量隔开就可以了.比如: A = 123B = "ABC"C = 456D = " ...
- java将字段映射成另一个字段,关于 接口传参 字段不对应转换
在接口开发中我们经常会遇到一个问题,打个比方,我们的实体类A中有两个字段user和pwd但是接口中需要username和password这怎么办呢,我想到了两种方法:1.新创建一个实体类B或者new一 ...
- cut - 在文件的每一行中提取片断
总览 (SYNOPSIS) ../src/cut [OPTION]... [FILE]... 描述 (DESCRIPTION) 在 每个文件 FILE 的 各行 中, 把 提取的 片断 显示在 标准输 ...
- 测试ip是否可以ping通
7.写一个脚本hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通.如果能ping通,则提示用户“该IP地址可访问”:如果不可ping通,则提示用户“该IP地址不可访问 参考脚本 ...
- 如何优化LIMIT
首先我们先创建个数据表做测试 表名 test (id(int) , name(var char) , content(text) , pid(int) ) 往里面倒几百万条数据进去做测试. 我们都知道 ...