业务流程--把一张单据拆分为多张单据原创
4人赞赏了该文章
540次浏览
编辑于2024年06月04日 17:04:03
一、说明
有时候按业务需求把一张单据拆分为多张单据,如果只有一行分录数据使用单据转换配置是无法拆分为多张单据的,只能通过插件处理。
二,示例
按单据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> newExBillDatas = new List<ExtendedDataEntity>(); //通过转换得到的扩展数据包集合 ExtendedDataEntity[] exBillDatas = e.TargetExtendedDataEntities.FindByEntityKey("FBillHead");//FBillHead固定的 //如果只需要新创建的数据包,则索引从0开始,否则从已存在的数据包开始 bool onlyNeedNewBillData = true; var billDataIndex = 0; if (onlyNeedNewBillData == false) { billDataIndex = exBillDatas.Length; newExBillDatas = exBillDatas.ToList(); } var entryEnttiy = e.TargetBusinessInfo.GetEntity("FEntity"); //FEntity为实体key //这里假设根据数量,每10拆成一个新单据。 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; ExtendedDataEntity newExBillData = new ExtendedDataEntity(newBillData, billDataIndex, 0); newExBillData[BOSConst.ConvSourceExtKey] = currExbillData[BOSConst.ConvSourceExtKey]; newExBillDatas.Add(newExBillData); qtyValue = qtyValue - 10; billDataIndex++; } } } //最后把新创建的数据包加到平台变量中,并进行解析,这样后面的服务策略就能使用到 e.TargetExtendedDataEntities.Parse(newExBillDatas.Select(x => x.DataEntity), e.TargetBusinessInfo); //得到最新的扩展数据包, 并赋值上携带来源 ExtendedDataEntity[] newParseExDatas = e.TargetExtendedDataEntities.FindByEntityKey("FBillHead"); for (int i = 0; i < newParseExDatas.Length; i++) { newParseExDatas[i][BOSConst.ConvSourceExtKey] = newExBillDatas.ToArray()[i] [BOSConst.ConvSourceExtKey]; } } } }
赞 4
4人点赞
还没有人点赞,快来当第一个点赞的人吧!
打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!
推荐阅读