收藏 分享(赏)

操作插件示例代码.docx

上传人:nanchangxurui 文档编号:7030654 上传时间:2022-08-28 格式:DOCX 页数:55 大小:557.69KB
下载 相关 举报
操作插件示例代码.docx_第1页
第1页 / 共55页
操作插件示例代码.docx_第2页
第2页 / 共55页
操作插件示例代码.docx_第3页
第3页 / 共55页
操作插件示例代码.docx_第4页
第4页 / 共55页
操作插件示例代码.docx_第5页
第5页 / 共55页
亲,该文档总共55页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、操作插件示例代码修订记录Ver. No日期编制修订校对批准修改的章节号V1.020150420丁振华张晋博赖碧云初始版本问题和意见如果你对文档有任何意见、问题或想法,或者你的问题未在此文档中找到答案,请通过电子邮件联系我们jinbo_zhang目录操作插件示例代码1操作插件概要说明3如何创建一个操作插件3操作插件概览5如何启用操作插件10公共属性13BusinessInfo13语法13案例 单据已经生成凭证则禁止反审核13Context15语法15案例 采购调价表审核时自动生效16FormOperation19语法19案例 - 销售订单保存不做信用检查19OperationResult21语法

2、21案例 检查到负库存,提醒用户确认21Option23语法23案例 寄售结算单只在列表上审核时,需检查价格24基类虚方法,可捕获的事件25OnPrepareOperationServiceOption25语法25案例 初始化库存保存26OnPreparePropertys32语法32案例 采购价目表审核时,同步更新供应商价格33OnAddValidators35语法35案例 单据反审核时,生成凭证校验36BeforeExecuteOperationTransaction40语法41案例 销售价目表保存前更新数量区间价格41BeginOperationTransaction44语法45案例 反

3、审核采购退货单,删除关联的内部交易单据45EndOperationTransaction48语法48案例 采购折扣表审核时,同步更新供应商折扣49AfterExecuteOperationTransaction51语法51案例 消耗汇总审核,提示同步生成的物权转移单编号52操作插件概要说明操作插件,用于对操作的执行过程进行干预、控制,以实现自定义扩展功能;如可以为审核操作,附加插件,在审核前,进行数据检查,只有符合条件的数据才允许审核;审核后,进行自动下推,并与审核操作保持在一个事务,如果自动下推失败,则审核回滚,确保数据的完整性。特别说明:请谨慎使用单据维护界面插件的BeforeDoOper

4、ate事件、AfterDoOperate事件,进行操作前后处理。单据维护界面的这两个事件,与操作本身并不是同一事务,如果在AfterDoOperate进行同步数据处理,如果处理失败,则无法回滚数据,从而造成数据不一致。如何创建一个操作插件 创建类库工程,包含插件类定义 引用如下类库(类库文件在K/3 Cloud站点目录Bin)必选的类库文件包括:Kingdee.BOS.dll;Kingdee.BOS.App.dll;Kingdee.BOS.BusinessEntity.dll;Kingdee.BOS.Contracts.dll;Kingdee.BOS.Core.dll;Kingdee.BOS.

5、DataEntity.dll; 在类库中添加一个插件类操作插件概览如下是一个典型的操作插件定义代码:C#using System;using System.Collections.Generic;using System.Linq;using System.Text;using Kingdee.BOS;using Kingdee.BOS.Util;using Kingdee.BOS.Core.DynamicForm.PlugIn;using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;namespace SamplePlugIn.ServicePlugIn

6、 / / 操作服务端插件示例 / / / 1. 示例如何强制要求加载某字段 / 2. 示例如何注入校验器,校验器可以通用,为避免在各操作中重复编码,剥离出来,然后各操作注入剥离出的校验器 / 3. 说明一些关键事件的用途 / System.ComponentModel.Description(操作服务端插件示例) public class OperationPlugSample : AbstractOperationServicePlugIn / / 操作初始化时,确认操作执行参数 / / public override void OnPrepareOperationServiceOption

7、(OnPrepareOperationServiceEventArgs e) base.OnPrepareOperationServiceOption(e); / / 数据加载前,确保需要的属性被加载 / / / / 在列表上执行操作时,单据的字段并没有被完全加载。 / 如果操作插件用到了未被加载的字段,一定会中断; / 本事件允许插件,强制要求加载某些字段,避免中断 / public override void OnPreparePropertys(PreparePropertysEventArgs e) / 如下代码行,指定字段xxxxx的Key,强制要求加载字段 e.FieldKeys.

8、Add(xxxxx); / / 操作执行前,加载操作校验器 / / / / 在系统开始执行校验前,插件可以追加自己的校验器进入操作校验器集合 / public override void OnAddValidators(AddValidatorsEventArgs e) / 如下代码行,示例加入自定义的校验器 / 自定义的校验器,必须从基类 Kingdee.BOS.Core.Validation.AbstractValidator 派生 e.Validators.Add(new OperationSampleValidator(); #region 接下来按照事件的执行事件顺序,由前向后逐一介

9、绍各事件 / / 操作执行前,事务开始前事件 / / / / 1. 此事件在操作校验之后、操作实现代码之前执行 / 2. 此事件在操作事务之前,即此事件中的数据库处理,不受操作的事务保护 / 3. 通常此事件,也可以用来进行数据校验 / public override void BeforeExecuteOperationTransaction(BeforeExecuteOperationTransaction e) / TODO: . / 如下代码,示意校验不通过时,终止操作的执行 e.CancelMessage = 测试终止操作执行; e.Cancel = true; / / 操作执行前,

10、事务开始后事件 / / / / 1. 此事件在操作校验之后 / 2. 此事件在操作事务开始之后 / 3. 此事件在操作执行代码之前 / 4. 此事件中的数据库处理,受操作的事务保护 / 5. 通常此事件,可以用来做数据准备,在操作之前,提前写数据到库 / public override void BeginOperationTransaction(BeginOperationTransactionArgs e) / TODO: 进行数据准备,甚至写预处理数据到数据库 / / 操作执行后,事务结束前 / / / / 1. 此事件在操作执行代码之后,操作的内部逻辑已经执行完毕 / 2. 此事件在操

11、作事务提交之前 / 3. 此事件中的数据库处理,受操作的事务保护 / 4. 通常此事件,可以用来做同步数据,如同步生成其他单据,而且需要受事务保护 / public override void EndOperationTransaction(EndOperationTransactionArgs e) / TODO:进行同步数据处理 / / 操作执行后,事务结束后 / / / / 1. 此事件在操作执行后,操作的内部逻辑已经执行完毕; / 2. 此事件在操作事务提交之后; / 3. 此事件中的数据库处理,不受操作的事务保护 / 4. 通常此事件,也可以做同步数据,但是此同步数据的成功与否,不需

12、影响操作 / public override void AfterExecuteOperationTransaction(AfterExecuteOperationTransaction e) / TODO:对操作结果进行修订,使提示更加人性化 #endregion / / 操作校验器(示例) / System.ComponentModel.Description(操作校验器(示例)) class OperationSampleValidator : Kingdee.BOS.Core.Validation.AbstractValidator #region 重载函数 / / 校验主实体,以此实

13、体数据包进行循环,逐行校验 / public override string EntityKey get / 根据实际校验要求,返回单据头或者单据体Key return FBillHead; / / 执行校验,把校验结果注入到validateContext中 / / / / public override void Validate( Kingdee.BOS.Core.ExtendedDataEntity dataEntities, Kingdee.BOS.Core.Validation.ValidateContext validateContext, Kingdee.BOS.Context

14、ctx) foreach (var dataEntity in dataEntities) / TODO: 逐个数据包执行校验代码 / 如下代码,示意如何注入校验提示,后续操作,会自动避开校验没通过的数据包 validateContext.AddError(dataEntity.DataEntity, new Kingdee.BOS.Core.Validation.ValidationErrorInfo( 出错字段.Key, / 出错的字段Key,可以空 Convert.ToString(dataEntity.DataEntity0), / 数据包内码,必填,后续操作会据此内码避开此数据包 d

15、ataEntity.DataEntityIndex, / 出错的数据包在全部数据包中的顺序 dataEntity.RowIndex, / 出错的数据行在全部数据行中的顺序,如果校验基于单据头,此为0 E1, / 错误编码,可以任意设定一个字符,主要用于追查错误来源 错误的详细提示信息, / 错误的详细提示信息 错误摘要, / 错误的简明提示信息 Kingdee.BOS.Core.Validation.ErrorLevel.Error); / 错误级别:警告、错误. #endregion 重载函数 如何启用操作插件插件编写完毕,类库编译通过后,把类库文件复制到K/3 Cloud站点目录的Bin子

16、目录;然后进入BOS设计器,打开单据操作配置界面,配置服务插件:公共属性BusinessInfo单据元数据对象。语法属性定义C#public BusinessInfo BusinessInfo get; private set; 备注可以通过此属性对象,获取单据的各种属性配置,以及所含单据体、字段信息。对于一些公用类的操作插件,不能预先知道将要被应用到那种单据、那种操作上,此时从BusinessInfo对象中获取必要的信息就很重要。案例 单据已经生成凭证则禁止反审核代码来源Kingdee.K3.SCM.App.ServicePlugIn.VoucherControl.UnAuditVouche

17、rControl需求背景供应链单据,已经生成凭证,且凭证进行了更改、审核,则禁止反审核单据;如果生成的凭证没有变化,则同步删除凭证;实现方案提供一个供应链反审核通用插件,为全部单据服务,BusinessInfo中的单据FormId属性,作为最关键的参数传递。在操作前,调用一个通用的校验器,判断单据是否已经生成凭证,该校验器要求传入当前单据的FormId,此信息需要到BusinessInfo属性中获取;在标准反审核操作前(事务内),调用一个通用服务,同步删除凭证,此服务要求传入单据FormId以及单据Fid。关键字单据FormId示例代码C#using System.Text;using Sys

18、tem.ComponentModel;using Kingdee.BOS.Core.DynamicForm.PlugIn;using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;using Kingdee.BOS.Core.Validation;using Kingdee.K3.Core.FIN;using Kingdee.BOS.Core;using Kingdee.K3.SCM.App.Validator;using Kingdee.K3.BD.Contracts.FIN;using Kingdee.BOS.Orm.DataEntity;namespa

19、ce Kingdee.K3.SCM.App.ServicePlugIn.VoucherControl Description(反审核插件,处理和凭证有关) public class UnAuditVoucherControl: AbstractOperationServicePlugIn public override void OnAddValidators(AddValidatorsEventArgs e) /添加凭证检查校验器:如果已经生成凭证且凭证已经更改或审核则单据不允许反审核 HasVoucherValidator voucherValidator = new HasVoucher

20、Validator(); voucherValidator.EntityKey = FBillHead; voucherValidator.BillFormId = this.BusinessInfo.GetForm().Id; e.Validators.Add(voucherValidator); public override void BeginOperationTransaction(BeginOperationTransactionArgs e) if (e.DataEntitys.Count() 1) return; string formId = this.BusinessInf

21、o.GetForm().Id; List lstBillID = new List(); List billIdList = new List(); List dataEntitys = new List(); foreach (var item in e.DataEntitys) lstBillID.Add(Convert.ToInt64(itemId); /以下是处理 如果生成的凭证未做任何处理则反审核时删除凭证。 var service = BD.Contracts.ServiceFactory.GetLocalService(); IEnumerable lstBizBillInfor

22、 = service.GetBizBillVoucherInfor(this.Context, formId, lstBillID); DynamicObject obj; foreach (var bizBillInfor in lstBizBillInfor) if (bizBillInfor.CanUnAudit) long pkId = bizBillInfor.BillPKID; billIdList.Add(pkId); obj = (from p in e.DataEntitys where Convert.ToInt64(pId) = pkId select p).FirstO

23、rDefault(); dataEntitys.Add(obj); if (billIdList.Count 0) service.DeleteBizBillBizVoucher(this.Context, formId, billIdList); e.DataEntitys = dataEntitys.ToArray(); Context上下文对象;语法属性定义C#public Context Context get; private set; 备注上下文对象,包含了数据库连接信息,在调用各种读取数据库的接口函数时,需用本对象作为参数。案例 采购调价表审核时自动生效代码来源Kingdee.K

24、3.SCM.App.Pur.ServicePlugIn.PAT.Audit需求背景采购调价表执行审核操作时,需要同步执行生效处理;实现方案在处理操作前,先明确要求加载采购调价表的某些关键字段,后面处理数据时,需要用到。在操作前(事务内),先调用采购调价表的生效操作,自动生效,如果失败,则抛出错误。如果采购调价表生效成功,则继续执行审核操作。在此过程中,有几处需要用到Context属性,如加载采购调价表元数据、调用采购调价表的生效操作、记录错误日志等;关键字加载元数据 状态转换 写日志示例代码C#using System;using System.Collections.Generic;usin

25、g System.Linq;using System.Text;using Kingdee.BOS.Core.DynamicForm.PlugIn;using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;using Kingdee.BOS.Orm.DataEntity;using Kingdee.BOS.Contracts;using Kingdee.BOS.App;using Kingdee.BOS.Core.Metadata;using Kingdee.BOS.Orm.Metadata.DataEntity;using Kingdee.BOS.Core

26、.DynamicForm;using Kingdee.BOS.Core.Validation;using Kingdee.BOS.Core.Log;using Kingdee.BOS;using System.Data;using Kingdee.BOS.App.Data;using Kingdee.K3.Core.SCM;using Kingdee.BOS.ServiceHelper;namespace Kingdee.K3.SCM.App.Pur.ServicePlugIn.PAT public class Audit : AbstractOperationServicePlugIn pu

27、blic override void OnPreparePropertys(PreparePropertysEventArgs e) e.FieldKeys.Add(FDate); e.FieldKeys.Add(FPurchaseOrgId); e.FieldKeys.Add(FBillNo); e.FieldKeys.Add(FPaReason); e.FieldKeys.Add(FName); e.FieldKeys.Add(FAfterPrice); e.FieldKeys.Add(FUpPrice); e.FieldKeys.Add(FDownPrice); e.FieldKeys.

28、Add(FEffectiveDate); e.FieldKeys.Add(FExpiryDate); e.FieldKeys.Add(FMaterialId); e.FieldKeys.Add(FMaterialTypeId); e.FieldKeys.Add(FPriceListId); e.FieldKeys.Add(FBillHead); e.FieldKeys.Add(FIsPriceListPush); e.FieldKeys.Add(FToQty); e.FieldKeys.Add(FPATIdentity); base.OnPreparePropertys(e); public

29、override void EndOperationTransaction(EndOperationTransactionArgs e) ISaveService service = ServiceHelper.GetService(); ISetStatusService setStatusService = Kingdee.BOS.Contracts.ServiceFactory.GetSetStatusService(this.Context); IMetaDataService metaService = ServiceHelper.GetService(); ILogService

30、logService = ServiceHelper.GetService(); FormMetadata meta = (FormMetadata)metaService.Load(this.Context, SCMFormIdConst.PUR_PAT); BusinessInfo info = meta.BusinessInfo; ListKeyValuePair kvp = new ListKeyValuePair(); foreach (DynamicObject item in e.DataEntitys) long fid = Convert.ToInt64(itemId); D

31、ynamicObject dyOrg = itemPurchaseOrgId as DynamicObject; long orgId = dyOrg = null ? 0 : Convert.ToInt64(dyOrgId); bool isEffectWithoutClick = Convert.ToBoolean(SystemParameterServiceHelper.GetParamter(this.Context, orgId, 0, SCMFormIdConst.PUR_PurchaseParameter, AdjustEffectWithoutClick); if (isEff

32、ectWithoutClick) kvp.Add(new KeyValuePair(fid, ); if (kvp.Count 0) IOperationResult result = setStatusService.SetBillStatus(this.Context, info, kvp, null, Effectitve); if (!result.IsSuccess) StringBuilder sb = new StringBuilder(); foreach (ValidationErrorInfo errorInfo in result.ValidationErrors) sb.Append(errorInfo.Message); sb.Append(rn); LogObject logObj = new LogObject() Description = errorInfo.Message, Environment = O

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 传记文集 > 人物传记

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:文库网官方知乎号:文库网

经营许可证编号: 粤ICP备2021046453号世界地图

文库网官网©版权所有2025营业执照举报