本文描述了如何在付款申请单到付款单的转换过程中,通过开发插件来携带合同编号和合同类型信息到付款单明细中。具体步骤包括在相关单据中添加合同编号和合同类型字段,设置单据转换规则中的映射,编写并继承标准产品的单据转换插件,并在转换规则中挂载该插件以替换标准插件。提供了代码实例,展示了如何在插件中处理源单明细与付款单明细之间的数据传递。
收付款单、退款单接收上游的信息 是源单明细单据体,如果要携带明细单据体中必须要插件处理才行;以付款申请单上增加合同编号(文本)、合同类型(基础资料)为例子写到到付款单明细中
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
{
/// <summary>
/// 付款申请单到付款单单据转换规则插件:
///
/// </summary>
[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<IMetaDataService>();
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["FHTLX_Id"]);
DynamicObject fhtlxobj = viewService.LoadSingle(this.Context, fhtlxId, mete.BusinessInfo.GetDynamicObjectType());
entryCollection["FHTLX"] = fhtlxId;
entryCollection["FHTLX_Id"] = fhtlxobj;
string fhtbh = Convert.ToString(srcentryCollection["FHTBH"]);
entryCollection["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["FHTLX_Id"]);
// DynamicObject fhtlxobj = viewService.LoadSingle(this.Context, fhtlxId, mete.BusinessInfo.GetDynamicObjectType());
// entryCollection["FHTLX"] = fhtlxId;
// entryCollection["FHTLX_Id"] = fhtlxobj;
// string fhtbh = Convert.ToString(srcentryCollection["FHTBH"]);
// entryCollection["FHTBH"] = fhtbh;
// //下面还要处理应付金额等等其他必录字段,这里就不一一写了
//}
}
}
/// <summary>
/// 获取动态模型
/// </summary>
/// <param name="e"></param>
/// <returns></returns>
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;
}
}
}
推荐阅读