电脑桌面
添加蚂蚁七词文库到电脑桌面
安装后可以在桌面快捷访问

开发案例分享-单据转换之多选辅助资料下推携带

来源:金蝶云社区作者:金蝶2024-09-1610

开发案例分享-单据转换之多选辅助资料下推携带

一、问题描述:

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

5.webp

6.webp


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

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 MulAssistant : 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_MulAssistantBrinds"));

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

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

            MulAssistantField sourceFld = e.SourceBusinessInfo.GetField("F_QYGN_MulAssistantBrinds") as MulAssistantField;

            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 sr

开发案例分享-单据转换之多选辅助资料下推携带

一、问题描述:如下图,品牌为多选辅助资料,需要通过单据转换由生产订单携带到生产入库单对应的字段,通过单据转换配置无法实现二、解决方...
点击下载文档文档为doc格式

声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。

已经是第一篇
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息
QQ群
  • 答案:my7c点击这里加入QQ群
支持邮箱
微信
  • 微信