单据转换.二开案例.自动下推触发表单插件

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-16浏览:1

单据转换.二开案例.自动下推触发表单插件

【场景】单据转换,属于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层服务,没有视图和模型等逻辑,不会触发下游的单据的表单插件;因此当部分逻辑写在表单插件中时,通过自动下推...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息