单据转换--一张单据拆成多张单据

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-16浏览:1

单据转换--一张单据拆成多张单据

一、说明

下面代码演示的是,根据单据某个数量值,每10拆成一张单据,最后不足10的也算一张单据,并且删除老的数据包。

二、转换插件代码

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.Const;
using Kingdee.BOS.Orm;
using Kingdee.BOS.Core.Metadata.ConvertElement;
using Kingdee.BOS.App.Core;
using Kingdee.BOS.Contracts;
using Kingdee.BOS.Core.Metadata;
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 = onlyNeedNewBillData ? 0 : exBillDatas.Length;
            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++;
                    }
                }
            }
            //如果不需要转换得到的数据包,则可以删除老数据包
            if (onlyNeedNewBillData)
            {
                for (int i = 0; i < exBillDatas.Length; i++)
                {
                    e.TargetExtendedDataEntities.RemoveExtendedDataEntity("FBillHead", exBillDatas[i]);
                }
            }
            //最后把新创建的数据包加到平台变量中,并进行解析,这样后面的服务策略就能使用到
            e.TargetExtendedDataEntities.AddExtendedDataEntities("FBillHead", newExBillDatas.ToArray());
            e.TargetExtendedDataEntities.Parse(newExBillDatas.Select(x => x.DataEntity), e.TargetBusinessInfo);
        }
    }
}



单据转换--一张单据拆成多张单据

一、说明下面代码演示的是,根据单据某个数量值,每10拆成一张单据,最后不足10的也算一张单据,并且删除老的数据包。二、转换插件代码usin...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息