业务流程--把一张单据拆分为多张单据原创
金蝶云社区-eris
eris
4人赞赏了该文章 191次浏览 未经作者许可,禁止转载编辑于2024年03月13日 11:35:23

一、说明

 有时候按业务需求把一张单据拆分为多张单据,如果只有一行分录数据使用单据转换配置是无法拆分为多张单据的,只能通过插件处理。

二,示例

按单据A的第一行分录中的数量值,每10个数量拆分为一张单据B,如下图和代码

1、单据A下推

image.png

2、得到两张单据B

image.png

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());
        }
   }
}


赞 4