上游新加字段携带到收付款单、退款单 二开处理实例
金蝶云社区-云社区用户721H9385
云社区用户721H9385
7人赞赏了该文章 1万次浏览 未经作者许可,禁止转载编辑于2016年02月01日 17:34:27
summary-icon摘要由AI智能服务提供

本文介绍了在金蝶软件中处理收付款单和退款单时,如何通过插件实现在单据转换过程中携带合同编号和合同类型到付款单明细中的步骤。具体包括在付款申请单、付款单源单明细和付款单明细中添加合同编号和合同类型字段,编写并挂载自定义的单据转换规则插件以继承并扩展标准产品的功能,取消启用标准产品插件,并提供了二开代码实例,展示了如何通过插件在转换过程中处理这些字段的数据。

收付款单、退款单接收上游的信息 是源单明细单据体,如果要携带明细单据体中必须要插件处理才行;以付款申请单上增加合同编号(文本)、合同类型(基础资料)为例子写到到付款单明细中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; } }}