如何在插件中调用WebApi(保存、提交、审核、反审核、禁用、删除)原创
金蝶云社区-new_昵称
new_昵称
4人赞赏了该文章 562次浏览 未经作者许可,禁止转载编辑于2023年10月26日 15:20:37

        在开发的过程中,我们难免会遇到需要在插件内使用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 插件开发百问百答》的内容    

赞 4