在开发的过程中,我们难免会遇到需要在插件内使用WebApi的操作,例如,在某张单据审核的时候生成物料、在某张单据保存时删除另一张单据......之前遇到这种业务,我都是通过WebApi功能,先登陆、在调用接口实现。但是,不管是使用账号密码登陆,还是使用第三方登陆授权,都会出现问题,使用账号密码登陆:更改密码后需要调整插件。使用第三方登陆授权:在备份账套的过程中,备份账套的操作,会被第三方登陆授权指向正式账套。
这个时候就需要跳过登陆的步骤,直接使用当前登陆信息实现WebApi的调用,下面找到了几个实例:
首先我们要先知道什么是Web层,什么是app层:
Ø 运行在Web层的插件,包括动态表单插件、单据编辑插件、基础资料编辑插件、列表插件等,控制着交互界面;
Ø 运行在App层的插件,包括操作插件、单据转换插件、反写插件、账表取数插件等,此类插件掌控着某种特定服务的执行过程,与交互界面无关;
1.1.1. 如何调用保存(Save)操作
1.1.1.1. Web层插件,如何调用保存(Save)操作
Ø 实现思路
² 调用BusinessDataServiceHelper类提供的Save方法
Ø 插件准备
² 插件工程引用Kingdee.BOS.ServiceHelper.dll组件
² 类文件引用BusinessDataServiceHelper类所在的命名空间Kingdee.BOS.ServiceHelper
Ø BusinessDataServiceHelper.Save方法介绍
BusinessDataServiceHelper提供4个Save方法,看上去差不多,其实本质有区别,可以将这4个方法区分为2类方法
² 直接调用Orm把数据保存到数据库
n public static DynamicObject Save(Context ctx, DynamicObject dataObject)
n public static DynamicObject[] Save(Context ctx, DynamicObject[] dataObject)
² 模拟保存操作服务端完整过程,调用填充主键、生成单据编号,执行校验器,调用服务端服务与服务端插件,最后调用Orm把数据保存到数据库
n public static DynamicObject[] Save(Context ctx, BusinessInfo businessInfo, DynamicObject[] dataObject, string operationNumber)
n public static IOperationResult Save(Context ctx, BusinessInfo businessInfo, DynamicObject dataObject, OperateOption option = null, string operationNumber = "")
Ø Save方法参数介绍
名称 | 类型 | 说明 |
ctx | Context | 系统全局信息,这里主要使用全局信息中的数据库连接信息 |
dataObject | DynamicObject | 待保存的数据对象 |
businessInfo | BusinessInfo | 待保存数据对象的元数据信息 |
option | OperateOption | 自定义额外参数对象,服务端服务和服务端插件都能持有此对象 |
operationNumber | string | 当前操作的操作码 |
Ø 示例代码
C# | |
using Kingdee.BOS.Core.Bill.PlugIn; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.ServiceHelper; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace MyDynamicFormPlugIn { [System.ComponentModel.Description("区分当前类应用在哪个模型上")] public class Class2 : AbstractBillPlugIn { public override void ButtonClick(ButtonClickEventArgs e) { //直接调用Orm保存,把数据保存到数据库 BusinessDataServiceHelper.Save(this.Context, this.View.Model.DataObject); //执行保存服务端服务和保存操作的服务端插件 BusinessDataServiceHelper.Save(this.Context, this.View.BusinessInfo, this.View.Model.DataObject); } } } |
1.1.1.2. App层插件,如何调用保存(Save)操作
Ø 实现思路
² 通过Kingdee.BOS.App.dll组件提供的ServiceHelper类,调用GetService泛型方法,获取SaveService服务,调用SaveService提供的Save方法
Ø 插件准备
² 插件工程引用Kingdee.BOS.App.dll、Kingdee.BOS.Contracts.dll、Kingdee.BOS.DataEntity.dll
² 类文件引用相关命名空间,详见示例代码
Ø ISaveService.Save接口介绍
同Web层插件介绍,分为两类方法
详见Web层插件、BusinessDataServiceHelper.Save介绍
Ø 示例代码
C# | |
using Kingdee.BOS.Contracts; using Kingdee.BOS.Core.DynamicForm.PlugIn; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.Core.Metadata; using Kingdee.BOS.Orm.DataEntity; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace MyOperaionServicePlugIn { [System.ComponentModel.Description("区分当前类应用在哪个操作上")] public class Class1 : AbstractOperationServicePlugIn { public override void BeforeExecuteOperationTransaction( BeforeExecuteOperationTransaction e) { //例如:保存id为10001的物料 //获取元数据服务 IMetaDataService metadataService = Kingdee.BOS.App.ServiceHelper.GetService<IMetaDataService>(); //获取保存服务 ISaveService saveService = Kingdee.BOS.App.ServiceHelper.GetService<ISaveService>(); //获取加载数据服务 IViewService viewService = Kingdee.BOS.App.ServiceHelper.GetService<IViewService>();
//获取物料元数据 FormMetadata materialMetadata = metadataService.Load(this.Context,"BD_Material") as FormMetadata; //获取id为10001的物料数据 DynamicObject[] objs = viewService.Load( this.Context, new object[] { 10001 }, materialMetadata.BusinessInfo.GetDynamicObjectType()); //保存id为10001的物料 saveService.Save(this.Context, objs); saveService.Save(this.Context, materialMetadata.BusinessInfo, objs); } } } |
1.1.2. 如何调用提交(Submit)操作
1.1.2.1. Web层插件,如何调用提交(Submit)操作
Ø 实现思路
² 调用Kingdee.BOS.ServiceHelper.dll组件的BusinessDataServiceHelper类提供的Submit方法
Ø 插件准备
² 插件工程引用Kingdee.BOS.ServiceHelper.dll
² 插件类引用BusinessDataServiceHelper类所在的命名空间
Ø BusinessDataServiceHelper.Submit方法介绍
BusinessDataServiceHelper类提供了1个Submit方法,调用此方法模拟提交操作的服务端服务全过程,即修改单据状态、执行提交服务端服务,执行提交服务端插件,最后执行Orm保存数据到数据库
Ø Submit方法参数介绍
名称 | 类型 | 说明 |
ctx | Context | 系统上下文全局信息,此处主要使用数据库链接信息 |
businessInfo | BusinessInfo | 待执行提交服务的数据元数据描述信息 |
Ids | object[] | 待执行提交服务的数据主键值数组 |
operationNumber | string | 提交操作编码 |
option | OperateOption | 业务控制额外参数集合,提交服务端服务和服务端插件都能持有此参数 |
Ø 示例代码
C# | |
using Kingdee.BOS.Core.Base.PlugIn; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.ServiceHelper; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace MyDynamicFormPlugIn { [System.ComponentModel.Description("区分当前类应用在哪个模型上")] public class Class3 : AbstractBasePlugIn { public override void ButtonClick(ButtonClickEventArgs e) { //例如:提交当前单据数据 BusinessDataServiceHelper.Submit( this.Context, this.View.BusinessInfo, new object[] { this.View.Model.DataObject["Id"] }, "Submit"); } } } |
1.1.2.2. App层插件,如何调用提交(Submit)操作
Ø 实现思路
² 调用Kingdee.BOS.App.dll组件提供的ServiceHelper类所提供的GetService泛型方法,获取提交服务,调用提交服务的Submit方法
Ø 插件准备
² 插件工程引用Kingdee.BOS.App.dll、Kingdee.BOS.Contracts.dll、Kingdee.BOS.DataEntity.dll
² 类文件引用相关命名空间,详见示例代码
Ø ISubmit.Submit接口介绍
² 同web层插件介绍
Ø 示例代码
C# | |
using Kingdee.BOS.Contracts; using Kingdee.BOS.Core.DynamicForm.PlugIn; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.Core.Metadata; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace MyOperaionServicePlugIn { public class Class2 : AbstractOperationServicePlugIn { public override void BeforeExecuteOperationTransaction( BeforeExecuteOperationTransaction e) { //例如:提交id为10001的物料数据 //获取提交服务 ISubmitService submitService = Kingdee.BOS.App.ServiceHelper.GetService<ISubmitService>(); //获取元数据服务 IMetaDataService metadataService = Kingdee.BOS.App.ServiceHelper.GetService<IMetaDataService>(); //获取物料元数据 FormMetadata materialMetadata = metadataService.Load(this.Context, "BD_Material") as FormMetadata; //执行提交服务 submitService.Submit( this.Context, materialMetadata.BusinessInfo, new object[] { 10001 }, "Submit"); } } } |
1.1.3. 如何调用审核/反审核(Audit/UnAudit)操作
1.1.3.1. Web层插件,如何调用审核/反审核(Audit/UnAudit)操作
Ø 实现思路
² 调用Kingdee.BOS.ServiceHelper.dll组件提供的BusinessDataServiceHelper类提供的SetBillStatus方法
Ø 插件准备
² 插件工程引用Kingdee.BOS.ServiceHelper.dll组件
² 插件类文件引用BusinessDataServiceHelper所在的命名空间
Ø BusinessDataServiceHelper.SetBillStatus方法介绍
SetBillStatus方法与SetStatus方法看上去类似,其实完全不一样,其参数列表也完全不一样,调用单据审核操作的服务端要使用SetBillStatus方法,SetStatus方法后续介绍
Ø SetBillStatus方法参数介绍
名称 | 类型 | 说明 |
ctx | Context | 系统上下文全局信息 |
businessInfo | BusinessInfo | 待审核\反审核数据的元数据描述信息 |
pkEntryIds | List<KeyValuePair<object, object>> | 待审核\反审核数据的id集合,此场景key和value都是id的值 |
paras | List<object> | 审核\反审核时附加的参数,包含两个值,第一个,同意与否,0:驳回;1:通过;2:反审核;第二个,审核意见,此参数默认可以为空 |
operationNumber | string | 审核\反审核操作的操作码 |
option | OperateOption | 额外业务选项,审核\反审核服务端服务和服务端插件都持有此对象 |
Ø 示例代码
C# | |
using Kingdee.BOS.Core.DynamicForm; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.Core.List.PlugIn; using Kingdee.BOS.ServiceHelper; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace MyDynamicFormPlugIn { [System.ComponentModel.Description("区分当前类应用在哪个模型上")] public class Class4 : AbstractListPlugIn { public override void ButtonClick(ButtonClickEventArgs e) { List<KeyValuePair<object,object>> lstKeyValuePairs = new List<KeyValuePair<object,object>>(); KeyValuePair<object, object> keyValuePair = new KeyValuePair<object, object>(10001, ""); lstKeyValuePairs.Add(keyValuePair); //审核id为10001的当前单据 IOperationResult auditResult = BusinessDataServiceHelper.SetBillStatus( this.Context, this.View.BusinessInfo, lstKeyValuePairs, null, "Audit"); //反审核id为10001的当前单据 IOperationResult unAuditResult = BusinessDataServiceHelper.SetBillStatus( this.Context, this.View.BusinessInfo, lstKeyValuePairs, null, "UnAudit"); } } } |
1.1.3.2. App层插件,如何调用审核/反审核(Audit/UnAudit)操作
Ø 实现思路
² 调用Kingdee.BOS.App.dll组件提供的ServiceHelper类提供的GetService泛型方法,获取改变单据状态服务,调用此服务提供的SetBillStatus方法
Ø 插件准备
² 插件工程引用Kingdee.BOS.App.dll、Kingdee.BOS.Contracts.dll、Kingdee.BOS.DataEntity.dll
² 类文件引用相关命名空间,详见示例代码
Ø 接口介绍
² 同Web层插件介绍
Ø 示例代码
C# | |
using Kingdee.BOS.Contracts; using Kingdee.BOS.Core.DynamicForm; using Kingdee.BOS.Core.DynamicForm.PlugIn; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.Core.Metadata; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace MyOperaionServicePlugIn { public class Class3 : AbstractOperationServicePlugIn { public override void BeforeExecuteOperationTransaction( BeforeExecuteOperationTransaction e) { //审核\反审核id为10001的物料数据 //获取单据状态转换服务 ISetStatusService setStatusService = Kingdee.BOS.App.ServiceHelper.GetService<ISetStatusService>(); //获取元数据服务 IMetaDataService metaDataService = Kingdee.BOS.App.ServiceHelper.GetService<IMetaDataService>(); //构建id为10001的数据集合 List<KeyValuePair<object, object>> lstKeyValuePairs = new List<KeyValuePair<object, object>>(); KeyValuePair<object, object> keyValuePair = new KeyValuePair<object, object>(10001, ""); lstKeyValuePairs.Add(keyValuePair); //获取物料元数据 FormMetadata materialMetaData = metaDataService.Load(this.Context, "BD_Material") as FormMetadata;
//审核 IOperationResult auditResult = setStatusService.SetBillStatus( this.Context, materialMetaData.BusinessInfo, lstKeyValuePairs, null, "Audit"); //反审核 IOperationResult unAuditResult = setStatusService.SetBillStatus( this.Context, materialMetaData.BusinessInfo, lstKeyValuePairs, null, "UnAudit"); } } } |
1.1.4. 如何调用禁用(Disabled)操作
1.1.4.1. Web层插件,如何调用禁用(Disabled)操作
Ø 实现思路
² 调用Kingdee.BOS.ServiceHelper.dll组件提供的BusinessDataServiceHelper类所提供的SetState方法
Ø 插件准备
² 插件工程引用Kingdee.BOS.ServiceHelper.dll组件
² 插件类文件引用BusinessDataServiceHelper所在的命名空间
Ø BusinessDataServiceHelper.SetState方法介绍
² SetState方法直接操作数据库,执行update语句,按方法参数构建一条例如update xxx set xxx =’ xxx’ where xxx = xxx的指令
Ø SetState参数介绍
名称 | 类型 | 说明 |
ctx | Context | 系统上下文全局信息 |
tableName | string | 待执行update指令的表名 |
fieldName | string | 待禁用的状态字段的字段名 |
fieldValue | string | 待禁用的状态字段的目标值 |
pkFieldName | string | 当前表的唯一标识字段名 |
pkFieldValues | object[] | 当前表的唯一标示字段值集合 |
Ø 示例代码
C# | |
using Kingdee.BOS.Core.DynamicForm.PlugIn; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.ServiceHelper; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace MyDynamicFormPlugIn { public class Class5 : AbstractDynamicFormPlugIn { public override void ButtonClick(ButtonClickEventArgs e) { //禁用物料id为10001和10002的数据 BusinessDataServiceHelper.SetState( this.Context, "T_BD_Material", "FForbidStatus", "B", "FMaterialdId", new object[] { 10001, 10002 }); } } } |
1.1.4.2. App层插件,如何调用禁用(Disabled)操作
Ø 实现思路
² 调用Kingdee.BOS.App.dll组件提供的ServiceHelper类提供的GetService泛型方法,访问BusinessDataService服务的SetState方法
Ø 插件准备
² 插件工程引用Kingdee.BOS.App.dll、Kingdee.BOS.Contracts.dll、Kingdee.BOS.DataEntity.dll
² 类文件引用相关命名空间,详见示例代码
Ø 接口介绍
² 同Web层插件介绍
Ø 示例代码
C# | |
using Kingdee.BOS.Contracts; using Kingdee.BOS.Core.DynamicForm.PlugIn; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace MyOperaionServicePlugIn { public class Class4 : AbstractOperationServicePlugIn { public override void BeforeExecuteOperationTransaction( BeforeExecuteOperationTransaction e) { //获取数据服务 IBusinessDataService businessDataService = Kingdee.BOS.App.ServiceHelper.GetService<IBusinessDataService>(); businessDataService.SetState( this.Context, "T_BD_Material", "FForbidStatus", "B", "FMaterialId", new object[] { 10001, 10002 }); } } } |
1.1.5. 如何删除(Delete)单据
1.1.5.1. Web层插件,如何删除(Delete)单据
Ø 实现思路
² 调用Kingdee.BOS.ServiceHelper.dll组件的BusinessDataServiceHelper类提供的Delete方法
Ø 插件准备
² 插件工程引用Kingdee.BOS.ServiceHelper.dll组件
² 插件类文件引用BusinessDataServiceHelper所在的命名空间
Ø 方法介绍
BusinessDataServiceHelper提供两个Delete方法,其区别在于
² 参数不带元数据描述信息的,直接执行数据库删除操作,把数据删除
n public static void Delete(Context ctx, object[] Ids, DynamicObjectType dynamicObjectType)
² 参数带元数据描述信息的,执行删除操作的服务端完整服务,如执行删除操作的校验器、删除操作的服务端服务、删除操作的服务端插件
n public static IOperationResult Delete(Context ctx, BusinessInfo businessInfo, object[] Ids, OperateOption option = null, string operationNumber = "")
Ø 参数介绍
名称 | 类型 | 说明 |
ctx | Context | 系统上下文全局信息 |
Ids | object[] | 待删除数据的id集合 |
dynamicObjectType | DynamicObjectType | 待删除数据的动态实体类型 |
businessInfo | BusinessInfo | 待删除数据的元数据描述信息 |
option | OperateOption | 业务控制额外选项,删除的服务端服务和插件都能持有此对象 |
operationNumber | string | 删除操作的操作码 |
Ø 示例代码
C# | |
using Kingdee.BOS.Core.DynamicForm.PlugIn; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.Core.Metadata; using Kingdee.BOS.ServiceHelper; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace MyDynamicFormPlugIn { public class Class6 : AbstractDynamicFormPlugIn { public override void ButtonClick(ButtonClickEventArgs e) { //删除id为10001和10002的物料 //获取物料元数据 FormMetadata materialMetadata = MetaDataServiceHelper.Load(this.Context,"BD_Material") as FormMetadata; // 模拟删除服务端操作完整过程 BusinessDataServiceHelper.Delete( this.Context, materialMetadata.BusinessInfo, new object[] { 10001, 10002 }); } } } |
1.1.5.2. App层插件,如何删除单据
Ø 实现思路
² 调用Kingdee.BOS.App.dll组件的ServiceHelper类提供的GetService泛型方法获取删除服务
Ø 插件准备
² 插件工程引用Kingdee.BOS.App.dll、Kingdee.BOS.Contracts.dll、Kingdee.BOS.DataEntity.dll
² 类文件引用相关命名空间,详见示例代码
Ø 接口介绍
² 同Web层插件介绍
Ø 示例代码
C# | |
using Kingdee.BOS.Contracts; using Kingdee.BOS.Core.DynamicForm.PlugIn; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.Core.Metadata; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace MyOperaionServicePlugIn { public class Class5 : AbstractOperationServicePlugIn { public override void BeforeExecuteOperationTransaction( BeforeExecuteOperationTransaction e) { //获取删除服务 IDeleteService deleteService = Kingdee.BOS.App.ServiceHelper.GetService<IDeleteService>(); //获取元数据服务 IMetaDataService metaDataService = Kingdee.BOS.App.ServiceHelper.GetService<IMetaDataService>(); //获取物料元数据 FormMetadata materialMetadata = metaDataService.Load(this.Context,"BD_Material") as FormMetadata; //执行删除服务的完整过程(推荐方式) deleteService.Delete( this.Context, materialMetadata.BusinessInfo, new object[] { 10001, 10002 });
// 直接执行数据删除 (风险极高,仅适用于未定义单据,只是利用ORM模型存取数据的情况) // 调用此服务会跳过删除校验,仅删除ORM模型内含表格的数据,其他相关数据不会处理,如果有上下游单据及反写,不会撤销关联及回滚反写,从而造成数据错误! deleteService.Delete( this.Context, new object[] { 10001, 10002 }, materialMetadata.BusinessInfo.GetDynamicObjectType()); } } } |
此文章借鉴了总部的文章:《K/3 Cloud BOS 插件开发百问百答》的内容
推荐阅读