业务流程--把一张单据拆分为多张单据原创
4人赞赏了该文章
191次浏览
编辑于2024年03月13日 11:35:23
一、说明
有时候按业务需求把一张单据拆分为多张单据,如果只有一行分录数据使用单据转换配置是无法拆分为多张单据的,只能通过插件处理。
二,示例
按单据A的第一行分录中的数量值,每10个数量拆分为一张单据B,如下图和代码
1、单据A下推
2、得到两张单据B
3、转换插件代码
using System; using System.ComponentModel; using System.Text; using System.Linq; using System.Collections.Generic; using Kingdee.BOS.Core; using Kingdee.BOS.Util; using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn; using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn.Args; using Kingdee.BOS.Orm.DataEntity; using Kingdee.BOS.Core.Metadata.EntityElement; using Kingdee.BOS.Core.Const; using Kingdee.BOS.Orm; namespace Kingdee.BOS.TestPlugIn.BillABillB { [HotUpdate] [Description("单据转换插件")] public class BillConvertPlugIn : AbstractConvertPlugIn { /// <summary> /// 如果新创建的单据数据包要走服务策略,在此处理,如果不需要则可以在AfterConvert处理 /// 注意:这里没有对数据进行任何处理,仅是为了展示如何拆分为多张单据 /// </summary> /// <param name="e"></param> public override void OnAfterCreateLink(CreateLinkEventArgs e) { base.OnAfterCreateLink(e); //生成的新的目标单据数据包集合 List<ExtendedDataEntity > newBillDatas = new List<ExtendedDataEntity >(); //通过转换得到的扩展数据包集合 ExtendedDataEntity[] exBillDatas = e.TargetExtendedDataEntities.FindByEntityKey("FBillHead");//FBillHead固定的 var billDataIndex = exBillDatas.Length; var entryEnttiy = e.TargetBusinessInfo.GetEntity("FEntity"); //FEntity为实体可以 var qtyField = e.TargetBusinessInfo.GetField("FQty1"); //FQty1字段key //对每张目标单据进行克隆,创建新的数据包 foreach (var currExbillData in exBillDatas) { var currBillData = currExbillData.DataEntity; /* * 这里可以增加业务规则,比如按按第一行分录数量值拆分,每10个数量拆分为一张单据 */ var entryDatas = entryEnttiy.DynamicProperty.GetValue(currBillData) as DynamicObjectCollection; if (entryDatas.IsEmpty() == false) { var qtyValue = ObjectUtils.Object2Int(qtyField.DynamicProperty.GetValue(entryDatas[0])); while (qtyValue > 0) { var newBillData = currBillData.Clone() as DynamicObject; qtyValue = qtyValue - 10; ExtendedDataEntity newExBillData = new ExtendedDataEntity(newBillData, billDataIndex, 0); newExBillData[BOSConst.ConvSourceExtKey] = currExbillData[BOSConst.ConvSourceExtKey]; billDataIndex++; newExBillDatas.Add(newExBillData); } } } e.TargetExtendedDataEntities.Parse(newExBillDatas.Select(x => x.DataEntity), e.TargetBusinessInfo); ExtendedDataEntity[] exBillDatas2 = e.TargetExtendedDataEntities.FindByEntityKey("FBillHead");/ //如果不需要转换得到的数据包,则可以先删除 for (int i = 0; i < exBillDatas2 .Length; i++) { e.TargetExtendedDataEntities.RemoveExtendedDataEntity("FBillHead", exBillDatas2 [i]); } e.TargetExtendedDataEntities.AddExtendedDataEntities("FBillHead", newExBillDatas.ToArray()); } } }
推荐阅读