[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> ...
随机推荐
- jsp中非空判断
function中uname要和id的值相匹配,但是这样不专业,要显示我的专业性,我将使用document获得name的值来判断是否为空,应为这样是专业的写法,我要时刻记住我是专业的 <scri ...
- Partial(部分方法,局部方法),virtual(虚方法),abstract(抽象方法)
Partial 部分方法顾明思议是方法的一部分,不完整的,在ide编译时候,会将所有部分方法加载到一起统一编译,如果分部方法没有被实现,编译器就不会.对他们进行编译. 局部类型的限制 (1) 局部类型 ...
- 锁 Lock、重入锁、写入锁
ReentrantLock 重入锁 类似于synchronize 区别与写法上,在需要进行同步的代码部分加上锁定,但不要忘记最后一定要释放锁定, 不然会造成锁永远无法释放,其他线程永远进不来的结果.e ...
- git---安装及配置
git官网:https://git-scm.com 安装: 官网下载->一路Next->安装完成 配置git: 1.win+r进入windows命令行 2.注册: git config - ...
- iOS Programming Dynamic Type 2
iOS Programming Dynamic Type 2 You will need to update two parts of this view controller for ...
- Node.js——流的下载
https://cnodejs.org/topic/59d8f43b2543cb3368b1623e var request = require('request'); var fs = requir ...
- webpack2代码分割
代码分割-CSS 要通过webpack打包CSS,像任何其他模块一样将CSS导入JavaScript代码,并使用css-loader(它输出CSS作为JS模块), 并可选地应用ExtractTextW ...
- spring中路径的注入
@RequestMapping("${mgt}/file") //请求的路径的统一添加,需要在mvc层配置<context:property-placeholder loca ...
- TabWight
//修改站号void CDlgParamView::OnPushButton_2_Tab8Clicked(){ // int iSel = m_listStation.GetSelectionMark ...
- 【C语言】控制台窗口图形界面编程(八):键盘事件
目录 00. 目录 01. INPUT_RECORD结构 02. KEY_EVENT_RECORD结构 03. ReadConsoleInput函数 04. 示例程序 00. 目录 01. INPUT ...