
【场景】webapi 自定义下推接口的返回信息
【参考】
api自定义返回信息案例:[WebApi返回定制结果](https://vip.kingdee.com/article/183606?productLineId=1)
业务流程.常见问题.link实体 源单信息字段:[业务流程.常见问题.link实体 源单信息字段](https://vip.kingdee.com/article/541338415162331392?productLineId=1)
【案例】
在上游单据挂表单插件,干预webapi的返回结果

```language
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.Bill.PlugIn.Args;
using Kingdee.BOS.Util;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.JSON;
using Kingdee.BOS.Core.Metadata.FormElement;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.EntityElement;
using Kingdee.BOS.Orm.DataEntity;
namespace DynamicFormPlugIn.WebApi
{
[Kingdee.BOS.Util.HotUpdate]
[System.ComponentModel.Description("单据 api操作干预案例")]
public class BillApiFormPlugIn : AbstractBillPlugIn
{
/*
* 业务对象 api操作 表单插件干预
*/
/// <summary>
/// api操作前事件
/// </summary>
/// <param name="e"></param>
public override void OnBeforeWebApiOperation(AfterWebApiOperationArgs e)
{
base.OnBeforeWebApiOperation(e);
}
/// <summary>
/// api操作后事件,支持对结果做干预
/// </summary>
/// <param name="e"></param>
public override void OnAfterWebApiOperation(AfterWebApiOperationArgs e)
{
//判断是否下推操作
if (!string.Equals("Push", e.WebContext.FormOperation.Operation, StringComparison.OrdinalIgnoreCase))
return;
var resultDto = e.WebContext.ResponseDTO as Dictionary<string, object>;
if (resultDto == null || !resultDto.ContainsKey("Result"))
return;
var result = resultDto["Result"] as Dictionary<string, object>;
if (result == null || !result.ContainsKey("ResponseStatus"))
return;
var responseStatus = result["ResponseStatus"] as Dictionary<string, object>;
if (responseStatus == null || !responseStatus.ContainsKey("IsSuccess") || !responseStatus.ContainsKey("SuccessEntitys"))
return;
//判断是否成功
bool isSuccess = Convert.ToBoolean(responseStatus["IsSuccess"]);
if (!isSuccess)
return;
//获取成功的下游单据主键
var successEntitys = responseStatus["SuccessEntitys"] as List<object>;
if (successEntitys == null)
return;
List<object> billIds = new List<object>();
foreach (var successItem in successEntitys)
{
var successEntity = successItem as Dictionary<string, object>;
if (successEntity != null && successEntity.ContainsKey("Id"))
{
billIds.Add(successEntity["Id"]);
}
}
//获取下推参数中的目标单业务对象标识
var inputArgs = JSONObject.Parse(Convert.ToString(e.WebContext.RequestDTO));
if (inputArgs == null)
return;
string targetFormId = inputArgs["TargetFormId"].ToString();
List<object> customInfo = new List<object>();
var businessInfo = (Kingdee.BOS.ServiceHelper.MetaDataServiceHelper.Load(this.Context, targetFormId) as FormMetadata).BusinessInfo;
foreach (var billId in billIds)
{
//通过sql或者单据数据包获取link信息追加到api返回结果,通过sql加载最优,自行参考原理实现
var billObj = Kingdee.BOS.ServiceHelper.BusinessDataServiceHelper.LoadSingle(this.Context, billId, businessInfo.GetDynamicObjectType());
var message = DynamicFormPlugIn.Test.LinkHelper.GetSrcLinkInfoByBillObj(businessInfo, billObj);
customInfo.Add(message);
}
resultDto.Add("CustomInfo", customInfo);
}
}
public static class LinkHelper
{
/// <summary>
/// 获取link实体
/// </summary>
/// <param name="businessInfo"></param>
/// <returns></returns>
public static LinkEntity GetLinkEntity(BusinessInfo businessInfo)
{
var billForm = businessInfo.GetForm();
if (billForm.LinkSet == null || billForm.LinkSet.LinkEntitys.Count == 0)
return null;
return billForm.LinkSet.LinkEntitys[0];
}
/// <summary>
/// 获取link实体的关联实体
/// </summary>
/// <param name="businessInfo"></param>
/// <returns></returns>
public static Entity GetLinkParentEntiy(BusinessInfo businessInfo)
{
var linkEntity = GetLinkEntity(businessInfo);
if (linkEntity == null)
return null;
var linkParentEntity = businessInfo.GetEntity(linkEntity.ParentEntityKey);
return linkParentEntity;
}
/// <summary>
/// 输出数据包的关联源单关系
/// </summary>
/// <param name="businessInfo">元数据</param>
/// <param name="billDataObj">数据包</param>
/// <returns></returns>
public static string GetSrcLinkInfoByBillObj(BusinessInfo businessInfo, DynamicObject billDataObj)