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

一、说明

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

二,示例

按单据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> 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人打赏
还没有人打赏,快来当第一个打赏的人吧!