
【场景】单据转换,属于APP层服务,没有视图和模型等逻辑,不会触发下游的单据的表单插件;
因此当部分逻辑写在表单插件中时,通过自动下推、批量下推等均无法调用表单插件逻辑;
针对各单据实现表单插件和单据转换插件两套逻辑非常繁琐,想在单据转换中直接触发表单插件逻辑
【案例】采购申请单下推采购订单,触发表单插件的创建数据模型事件
<0>通过单据转换插件,创建目标单据视图,触发

```csharp
using Kingdee.BOS;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.Bill;
using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn;
using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn.Args;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
using System;
using System.Linq;
namespace DynamicFormPlugIn.BillConvert
{
[Kingdee.BOS.Util.HotUpdate]
[System.ComponentModel.Description("单据转换插件——触发表单插件")]
public class ConvertServicePlugIn_InvokeBillPlugIn : AbstractConvertPlugIn
{
/*
* 单据转换,属于APP层服务,没有视图和模型等逻辑,不会触发下游的单据的表单插件
* 因此当部分逻辑写在表单插件中时,通过自动下推、批量下推等均无法调用表单插件逻辑
*
* 方案:自建视图,单据转换后触发指定事件
*/
public override void AfterConvert(AfterConvertEventArgs e)
{
base.AfterConvert(e);
if (e.Result == null)
return;
string formId = e.TargetBusinessInfo.GetForm().Id;
var headEntity = e.TargetBusinessInfo.Entrys.FirstOrDefault(x => x != null && x.ElementType == 34);
if (headEntity == null)
return;
var targetBillResults = e.Result.FindByEntityKey(headEntity.Key);
for (int i = 0, sz = targetBillResults.Length; i < sz; ++i)
{
var tgtBillResult = targetBillResults[i];
if (tgtBillResult.DataEntity == null)
{
continue;
}
CreateBillViewModelData(this.Context, formId, tgtBillResult.DataEntity);
}
}
#region 创建视图
/// <summary>
/// 构造视图创建参数
/// </summary>
/// <param name="ctx"></param>
/// <param name="metadata"></param>
/// <returns></returns>
private static BillOpenParameter CreateOpenParameter(Context ctx, FormMetadata metadata)
{
var form = metadata.BusinessInfo.GetForm();
BillOpenParameter openPara = new BillOpenParameter(form.Id, metadata.GetLayoutInfo().Id);
openPara.Context = ctx;
openPara.PageId = Guid.NewGuid().ToString();
//openPara.Status = OperationStatus.VIEW;
//openPara.CreateFrom = CreateFrom.Default;
openPara.DefaultBillTypeId = string.Empty;
openPara.PkValue = null;
openPara.FormMetaData = metadata;
openPara.SetCustomParameter(Kingdee.BOS.Core.FormConst.PlugIns, form.CreateFormPlugIns());
openPara.ServiceName = form.FormServiceName;
return openPara;
}
/// <summary>
/// 创建按照表单视图逻辑加载的数据包(触发表单层的新建模型数据相关事件)
/// </summary>
/// <param name="ctx"></param>
/// <param name="formId"></param>
/// <param name="pkValue"></param>
/// <returns></returns>
private static bool CreateBillViewModelData(Context ctx, string formId, DynamicObject billObj)
{
FormMetadata metadata = MetaDataServiceHelper.Load(ctx, formId) as FormMetadata;
if (metadata == null)
return false;
var parentView = CreateView(ctx, metadata , null);
var billView = CreateView(ctx, metadata, (openParameter) =>
{
//下推的表单层处理逻辑
openParameter.ParentPageId = parentView.PageId;
openParameter.Status = OperationStatus.ADDNEW;
openParameter.CreateFrom = CreateFrom.Push;
openParameter.SetCustomParameter(FormConst.ConvParamKey_OneResultSessionKey, FormConst.ConvParamKey_O