开发案例分享-单据转换之多选基础资料下推携带原创
金蝶云社区-Dave身份
Dave
22人赞赏了该文章 4373次浏览 未经作者许可,禁止转载编辑于2021年11月24日 15:58:15

一、问题描述:

如下图,多选部门为多选基础资料,需要通过单据转换由生产订单携带到生产入库单对应的字段,通过单据转换配置无法实现

7.png



8.png

二、解决方法:可通过单据转换插件进行处理。

2.1、插件代码如下:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using Kingdee.BOS.Core.Metadata;

using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn;

using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn.Args;

using Kingdee.BOS.Core.Metadata.EntityElement;

using Kingdee.BOS.Orm.DataEntity;

using Kingdee.BOS.Contracts;

using Kingdee.BOS.App;

using Kingdee.BOS.Core.Metadata.FieldElement;

using System.Linq;

 

namespace Dave.ConvertDemo.ServicePlugIn

{

    /// <summary>

    /// 按顺序输出单据转换-下推过程的插件事件

    /// </summary>

    [Kingdee.BOS.Util.HotUpdate]

    [Description("多选基础资料单据转换插件")]

    public class MulBase : AbstractConvertPlugIn

    {

 

        public override void AfterConvert(AfterConvertEventArgs e)

        {

            // 找到目标单单据关联主实体

            var targetForm = e.TargetBusinessInfo.GetForm();

            if (targetForm.LinkSet == null

                || targetForm.LinkSet.LinkEntitys == null

                || targetForm.LinkSet.LinkEntitys.Count == 0)

            {

                // 目标单未设置关联主实体,无法获取目标单的源单信息,携带不了

                return;

            }

            // 关联主实体

            Entity entity = e.TargetBusinessInfo.GetEntity(

                targetForm.LinkSet.LinkEntitys[0].ParentEntityKey);

            // 关联Link子实体

            Entity linkEntity = e.TargetBusinessInfo.GetEntity(

                targetForm.LinkSet.LinkEntitys[0].Key);

            // 收集全部源单内码

            HashSet<long> srcBillIds = new HashSet<long>();

            // Dictionary(目标单索引, HashSet(源单内码))

            Dictionary<int, HashSet<long>> dctDataIndexToSrcBillId = new Dictionary<int, HashSet<long>>();

            var entryRows = e.Result.FindByEntityKey(entity.Key);

            foreach (var entryRow in entryRows)

            {

                int dataIndex = entryRow.DataEntityIndex;

                if (dctDataIndexToSrcBillId.ContainsKey(dataIndex) == false)

                {

                    dctDataIndexToSrcBillId.Add(dataIndex, new HashSet<long>());

                }

                var linkRows = linkEntity.DynamicProperty.GetValue(entryRow.DataEntity) as DynamicObjectCollection;

                foreach (var linkRow in linkRows)

                {

                    long srcBillId = Convert.ToInt64(linkRow["SBillId"]);

                    if (srcBillIds.Contains(srcBillId) == false)

                    {

                        srcBillIds.Add(srcBillId);

                    }

                    // 记录每条目标单,其引用的源单集合

                    if (dctDataIndexToSrcBillId[dataIndex].Contains(srcBillId) == false)

                    {

                        dctDataIndexToSrcBillId[dataIndex].Add(srcBillId);

                    }

                }

            }

            // 读取源单上的多选辅助资料信息

            IViewService viewService = ServiceHelper.GetService<IViewService>();

            // 仅加载源单内码、多选辅助资料内码

            List<SelectorItemInfo> selectItems = new List<SelectorItemInfo>();

            selectItems.Add(new SelectorItemInfo(e.SourceBusinessInfo.GetForm().PkFieldName));

            selectItems.Add(new SelectorItemInfo("F_QYGN_MulDepartment"));

            string filter = string.Format("{0} IN ({1})",

                            e.SourceBusinessInfo.GetForm().PkFieldName,

                            string.Join(",", srcBillIds));

            var srcObjs = viewService.Load(this.Context,

                        e.SourceBusinessInfo, selectItems,

                        OQLFilter.CreateHeadEntityFilter(filter));

            // 收集源单上全部的辅助资料内码

            MulBaseDataField sourceFld = e.SourceBusinessInfo.GetField("F_QYGN_MulDepartment") as MulBaseDataField;

            HashSet<string> assIds = new HashSet<string>();

            // Dictionary(源单内码, HashSet(辅助资料内码))

            Dictionary<long, HashSet<string>> dctSrcBillIdToAssIds = new Dictionary<long, HashSet<string>>();

            foreach (var srcObj in srcObjs)

            {

                long srcBillId = Convert.ToInt64(srcObj[0]);

                var srcAssiRows = sourceFld.RefEntityDynamicProperty.GetValue(srcObj) as DynamicObjectCollection;

                foreach (var srcAssiRow in srcAssiRows)

                {

                    string assId = Convert.ToString(sourceFld.RefIDDynamicProperty.GetValue(srcAssiRow));

                    if (assIds.Contains(assId) == false)

                    {

                        assIds.Add(assId);

                    }

                    if (dctSrcBillIdToAssIds.ContainsKey(srcBillId) == false)

                    {

                        dctSrcBillIdToAssIds.Add(srcBillId, new HashSet<string>());

                    }

                    if (dctSrcBillIdToAssIds[srcBillId].Contains(assId) == false)

                    {

                        dctSrcBillIdToAssIds[srcBillId].Add(assId);

                    }

                }

            }

            // 加载辅助资料详情

            MulBaseDataField targetFld = e.TargetBusinessInfo.GetField("F_QYGN_MulDepartment") as MulBaseDataField;

            var assObjs = viewService.Load(

                this.Context,

                (from p in assIds select (object)p).ToArray(),

                targetFld.RefFormDynamicObjectType);

            // Dictionary(辅助资料内码, 辅助资料数据包)

            Dictionary<string, DynamicObject> dctAssObjs = new Dictionary<string, DynamicObject>();

            foreach (var assObj in assObjs)

            {

                string assId = Convert.ToString(assObj[0]);

                dctAssObjs.Add(assId, assObj);

            }

            // 向目标单填写辅助资料

            var headObjs = e.Result.FindByEntityKey(targetFld.EntityKey);

            foreach (var item in dctDataIndexToSrcBillId)

            {

                int dataIndex = item.Key;

                DynamicObject headObj = headObjs[dataIndex].DataEntity;

                var mulAssiRows = targetFld.RefEntityDynamicProperty.GetValue(headObj) as DynamicObjectCollection;

                foreach (var srcBillId in item.Value)

                {

                    if (dctSrcBillIdToAssIds.ContainsKey(srcBillId) == false) continue;

                    foreach (var assId in dctSrcBillIdToAssIds[srcBillId])

                    {

                        if (dctAssObjs.ContainsKey(assId) == false) continue;

                        DynamicObject newAssiRow = new DynamicObject(targetFld.RefEntityDynamicObjectType);

                        mulAssiRows.Add(newAssiRow);

                        targetFld.RefIDDynamicProperty.SetValue(newAssiRow, assId);

                        targetFld.DynamicProperty.SetValue(newAssiRow, dctAssObjs[assId]);

                    }

                }

            }

        }

 

    }

}

2.2、将插件注册到单据转换中:

1.png

2.3、启用单据转换规则:

2.png


2.4、实现效果:

 

3.png

4.png


  

发布于 金蝶云星空BOS开发交流圈 社群

赞 22