单据转换.二开案例.自动下推触发表单插件
【场景】单据转换,属于APP层服务,没有视图和模型等逻辑,不会触发下游的单据的表单插件;
因此当部分逻辑写在表单插件中时,通过自动下推、批量下推等均无法调用表单插件逻辑;
针对各单据实现表单插件和单据转换插件两套逻辑非常繁琐,想在单据转换中直接触发表单插件逻辑
【案例】采购申请单下推采购订单,触发表单插件的创建数据模型事件
<0>通过单据转换插件,创建目标单据视图,触发
![Image_20230128202833.webp](/download/010020539748c7964e1d84f8ac68c6a77f39.webp)
```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_OneResultSessionName);
//openParameter.SetCustomParameter("_ConvertSessionKey", "ConverOneResult");
});
billView.ParentFormView = parentView;
parentView.Session[FormConst.ConvParamKey_OneResultSessionName] = billObj;
try
{
Kingdee.BOS.Log.Logger.Info("CreateNewModelData Start", string.Empty);
billView.CreateNewModelData();
Kingdee.BOS.Log.Logger.Info("CreateNewModelData End", string.Empty);
return true;
}
catch (Exception ex)
{
//todo 表单插件的异常需要处理
Kingdee.BOS.Log.Logger.Error("Custom", "单据转换触发表单插件", ex);
}
return false;
}
private static IBillView CreateView(Context ctx, FormMetadata metadata, Action<BillOpenParameter> opAct)
{
var openParameter = CreateOpenParameter(ctx, metadata);
if(opAct != null)
{
opAct(openParameter);
}
var provider = metadata.BusinessInfo.GetForm().GetFormServiceProvider();
string importViewClass = "Kingdee.BOS.Web.Import.ImportBillView,Kingdee.BOS.Web";
Type type = Type.GetType(importViewClass);
IDynamicFormViewService billViewService = (IDynamicFormViewService)Activator.CreateInstance(type);
IBillView billView = billViewService as IBillView;
billViewService.Initialize(openParameter, provider);
return billView;
}
#endregion
}
[Kingdee.BOS.Util.HotUpdate]
public class LogBillPlugIn : AbstractBillPlugIn
{
/*
* 验证自动下推触发的表单插件,记录日志
*/
protected override object InvokePluginMethod(string name)
{
Kingdee.BOS.Log.Logger.Info("Call_Method", name);
return base.InvokePluginMethod(name);
}
protected override object InvokePluginMethod(string name, object args)
{
Kingdee.BOS.Log.Logger.Info("Call_Method", name);
return base.InvokePluginMethod(name, args);
}
}
}
```
【效果】为了验证效果,实现一个日志表单插件,触发相关事件时记录日志
![Image_20230128202722.webp](/download/010086d91336ff4a4ef8a65f3cab8ee8e61a.webp)
![Image_20230128202739.webp](/download/0100cc54291450e249b5be55f4bf5a84c4e6.webp)
在单据转换插件中触发表单插件
![Image_20230128201755.webp](/download/01008f2e4339dcc04df18e7f05a6edc32ba8.webp)
根据日志记录触发的事件,触发创建模型数据事件的相关表单插件事件
![Image_20230128202243.webp](/download/01000fbf3452b4e04f229ac9405ee4688146.webp)
【说明】由于仅触发创建模型数据相关事件,需要将表单插件逻辑放到相关事件才会触发
想请问一下,这个自动下推的场景是什么。如果应收管理参数里面设置了自动下推应收单时,这个功能是不生效的
单据转换.二开案例.自动下推触发表单插件
【场景】单据转换,属于APP层服务,没有视图和模型等逻辑,不会触发下游的单据的表单插件;因此当部分逻辑写在表单插件中时,通过自动下推...
点击下载文档
本文2024-09-16 18:32:49发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-22856.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章