上游新加字段携带到收付款单、退款单 二开处理实例
金蝶云社区-云社区用户721H9385
云社区用户721H9385
7人赞赏了该文章 9597次浏览 未经作者许可,禁止转载编辑于2016年02月01日 17:34:27
收付款单、退款单接收上游的信息 是源单明细单据体,如果要携带明细单据体中必须要插件处理才行;以付款申请单上增加合同编号(文本)、合同类型(基础资料)为例子写到到付款单明细中1、付款申请单明细、付款单源单明细、付款单明细中分别添加合同编号、合同类型两个字段;2、付款申请-付款单单据转换规则中,添加映射到付款单的源单明细字段(合同编号、合同类型)上3、编写单据转换规则插件,继承标准产品的单据转换插件就行4、单据转换规则中挂上二开的插件,取消启用标准产品插件以下是二开的代码实例using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ComponentModel;using Kingdee.BOS;using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn.Args;using Kingdee.BOS.Core.Metadata;using Kingdee.BOS.Orm.DataEntity;using Kingdee.BOS.Util;using Kingdee.K3.FIN.CN.App.Core;using Kingdee.K3.FIN.Core;using Kingdee.BOS.Core;using Kingdee.BOS.Contracts;using Kingdee.BOS.App;using Kingdee.BOS.Resource;using Kingdee.BOS.Core.Metadata.EntityElement;using Kingdee.BOS.App.Core.PlugInProxy;using Kingdee.BOS.Core.DynamicForm;using Kingdee.BOS.App.Core.DefaultValueService; namespace Kingdee.K3.FIN.CN.App.ServicePlugIn.BillConvertPlugIn{ /// /// 付款申请单到付款单单据转换规则插件: /// /// [Description("携带分录文本(合同编号 FHTBH)、基础资料(合同类型 FHTLX)到付款单")] public class ApplyToPaybillNew : PayApplyToPayBillConvert { public override void AfterConvert(AfterConvertEventArgs e) { base.AfterConvert(e); //付款单的信息 ExtendedDataEntity[] headEntity = e.Result.FindByEntityKey("FBillHead"); foreach (var extendedDataEntity in headEntity) { //付款单的明细(通过源单明细 汇总(结算方式、付款用途、费用项目)而成) DynamicObjectCollection entryCollection = null; entryCollection = extendedDataEntity.DataEntity["PAYBILLENTRY"] as DynamicObjectCollection; //付款单的源单明细 DynamicObjectCollection srcentryCollection = null; srcentryCollection = extendedDataEntity.DataEntity[this.SourceEntryKey] as DynamicObjectCollection; //为了获取基础资料整个对象 IMetaDataService metaService = ServiceHelper.GetService(); FormMetadata mete = (FormMetadata)metaService.Load(this.Context, "合同类型的FORMID"); IViewService viewService = ServiceFactory.GetViewService(this.Context); // 方案1、这是直接携带,但是有个问题:明细是源单明细的汇总,可能行对应的值不对(存在一行明细对应多行源单明细),如果确定业务没有这种问题,就可以这样写 for (int i = 0; i < entryCollection.Count; i++) { long fhtlxId = Convert.ToInt64(srcentryCollection[i]["FHTLX_Id"]); DynamicObject fhtlxobj = viewService.LoadSingle(this.Context, fhtlxId, mete.BusinessInfo.GetDynamicObjectType()); entryCollection[i]["FHTLX"] = fhtlxId; entryCollection[i]["FHTLX_Id"] = fhtlxobj; string fhtbh = Convert.ToString(srcentryCollection[i]["FHTBH"]); entryCollection[i]["FHTBH"] = fhtbh; } //2、这是第二种方案:把明细的清理掉,然后再处理,这样明细和源单明细都是一一对应的 //DynamicFormModelProxy modelProxy = GetModelProxy(e); //// 明细单据体 //Entity entity = e.TargetBusinessInfo.Entrys.FirstOrDefault( // c => c.EntryName.Equals(this.EntryKey // , StringComparison.OrdinalIgnoreCase)); //for (int i = 0; i < srcentryCollection.Count; i++) //{ // modelProxy.CreateNewEntryRow(entity, i); // long fhtlxId = Convert.ToInt64(srcentryCollection[i]["FHTLX_Id"]); // DynamicObject fhtlxobj = viewService.LoadSingle(this.Context, fhtlxId, mete.BusinessInfo.GetDynamicObjectType()); // entryCollection[i]["FHTLX"] = fhtlxId; // entryCollection[i]["FHTLX_Id"] = fhtlxobj; // string fhtbh = Convert.ToString(srcentryCollection[i]["FHTBH"]); // entryCollection[i]["FHTBH"] = fhtbh; // //下面还要处理应付金额等等其他必录字段,这里就不一一写了 //} } } /// /// 获取动态模型 /// /// /// public DynamicFormModelProxy GetModelProxy(AfterConvertEventArgs e) { DynamicFormModelProxy modelProxy = new DynamicFormModelProxy(); FormServiceProvider provider = new FormServiceProvider(); provider.Add(typeof(IDefaultValueCalculator), new DefaultValueCalculator()); modelProxy.SetContext(this.Context, e.TargetBusinessInfo, provider); modelProxy.BeginIniti(); return modelProxy; } }}