二开案例.WEBAPI.自定义接口返回值
智慧车间接口自定义返回值
1. 背景
智慧车间通过WEBSERVICE接口可从CLOUD服务器获取某些单据的信息,目前标准产品提供了常用的、内置的字段值,在某些现场根据自身项目的特点,需要对返回的字段范围进行扩充。因此需要标准产品提供可扩展的平台,以支持个性化的需求。
本文档旨在指导二次开发人员利用标准产品的智慧车间API接口平台(详见《智慧车间API接口平台介绍》)进行取数返回值扩展。
2. 适用对象
二次开发人员。
3. 基于平台扩展返回值
本文将以已有接口“获取可用工单列表”为例,描述如何通过智慧车间API接口平台扩展接口的返回值。
3.1 建立插件工程
第一次开发智慧车间API接口平台插件,需要新建插件工程,后续再次开发可忽略此步骤。工程名称可以根据自己项目简称来定义。
图 3-1
此工程需要添加如下组件引用:Kingdee.K3.MFG.SFS.App.Core.DLL、Kingdee.K3.MFG.SFS.Common.Core.DLL。
3.2 建立项目文件
3.2.1 查找需要扩展的接口
可以在【车间扫描定义】中查看到目前已有的接口,如本示例中需要扩展的是“获取可用工单列表”接口,找到对应的记录并打开。
图3-2
其中“逻辑实现类”中定义了该接口对应的接口处理器,如本示例中为Kingdee.K3.MFG.SFS.App.Core.Executor.ApiImpl.GetMODataExecutor,Kingdee.K3.MFG.SFS.App.Core,此文本用来表示处理器类的完整路径,逗号前的部分为命名空间+类名,逗号后的部分为插件工程名(见3.1章)。
3.2.2 查找传入参数及返回结果类
根据逻辑实现类名查找标准产品在处理器中使用的传入参数类以及返回结果类,一般规则如下:
l 传入参数类:SFS+逻辑实现类名前缀+Param,如本示例的类名为GetMODataExecutor,其前缀为GetMOData,则其参数类为SFSGetMoDataParam,命名空间为Kingdee.K3.MFG.SFS.Common.Core.ParamValue,特殊情况下,如果不能匹配就需要按照类名关键字匹配。
l 返回结果类:其规则与传入参数类相似,只是后缀为Result,如本示例中返回结果类为SFSGetMODataResult,命名空间为Kingdee.K3.MFG.SFS.Common.Core.ReturnValue。
3.2.3 维护项目文件
在4.1中新建的工程中或已有的工程中添加新的项目文件。
图3-2
此项目文件需继承自:Kingdee.K3.MFG.SFS.App.Core.Executor.PlugIn.AbstractSFSApiReqPlugIn,且需要传入3.2.2章中查找到的传入参数类与返回结果类。
抽象插件类AbstractSFSApiReqPlugIn提供了6个时点,分别对应逻辑实现类中的初始化前、初始化后、校验前、校验后、处理前、处理后。
本文档需要在标准产品返回结果的基础上增加自定义字段,因此需要在标准产品全部处理完成之后再附加逻辑,也就是说要覆盖基类中的AfterExecute方法。插件类代码示例如下:
图3-3
其中,在事件参数AfterExecuteEventArgs中,有两个特殊的属性需要注意区分:
l e.ReturnValue:表示逻辑实现类的返回结果对象,其类型为“返回结果类”,如本示例中应为SFSGetMODataResult。
l e.ReturnListValue:表示逻辑实现类的返回结果对象集合,其类型为“返回结果类”集合,如本示例中应为List<SFSGetMODataResult>。
在插件类中,首先判断e.ReturnListValue是否为空,如果不为空说明返回结果是一个集合对象,需要遍历集合对象并查找其关键字段,再根据关键字段值查找自己需要的数据,最后将其添加到集合中的每个对象上。
如果e.ReturnListValue为空,说明返回的是单个对象,则直接从对象上获取值再做上述类似的处理即可。
关于返回结果类,标准产品在每个类中预留了10个扩展字段,分别为ExtendResult1~ExtendResult10,均为字符串类型,二次开发需要通过这些字段将扩展值返回到接口调用方,如本示例中就是通过ExtendResult1将工序计划编号携带到前端的。
3.3 查看返回结果
返回结果如下图。
图3-4
4. 代码示例
public class GetMoDataPlugIn : AbstractSFSApiReqPlugIn<SFSGetMODataParam, SFSGetMODataResult> { public override void AfterExecute(AfterExecuteEventArgs<SFSGetMODataParam, SFSGetMODataResult> e) { base.AfterExecute(e); //如果e.ReturnListValue不为空,说明现在的返回值是对象集合的方式 if (e.ReturnListValue != null && e.ReturnListValue.Count > 0) { List<SFSGetMODataResult> lstMoDatas = e.ReturnListValue; //获取到返回结果中的工序计划Id集合 var opPlanIds = lstMoDatas.Select(o => o.OpPlanningId); //获取到返回结果中的工序计划单据集合 var opPlanDatas = GetOpPlanDatas(e.Context,opPlanIds); if (opPlanDatas == null) return; //将工序计划编号赋值到返回结果中 foreach (var resultData in e.ReturnListValue) { var opPlanData = opPlanDatas.First(o=>Convert.ToInt64(o["Id"]) == resultData.OpPlanningId); if (opPlanData != null) { resultData.ExtendResult1 = opPlanData["BillNo"].ToString(); } } } //如果e.ReturnValue不为空,说明现在的返回值是单对象的方式 else if (e.ReturnValue != null) { var opPlanDatas = GetOpPlanDatas(e.Context, new List<long>(){e.ReturnValue.OpPlanningId}); if (opPlanDatas == null) return; e.ReturnValue.ExtendResult1 = opPlanDatas.FirstOrDefault()["BillNo"].ToString(); } } private DynamicObject[] GetOpPlanDatas(Context ctx,IEnumerable<long> lstOpPlanId) { object[] bList = Array.ConvertAll<long, object>(lstOpPlanId.ToArray(), delegate(long n) { return n; }); //使用工序计划单据的唯一标识 FormMetadata meta = ServiceHelper.GetService<IMetaDataService>().Load(ctx, "SFC_OperationPlanning") as FormMetadata; //获取到返回结果中的工序计划单据集合 var opPlanDatas = ServiceHelper.GetService<IViewService>().Load(ctx, bList, meta.BusinessInfo.GetDynamicObjectType()); return opPlanDatas; } }
二开案例.WEBAPI.自定义接口返回值
本文2024-09-23 03:26:32发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-158883.html