单据转换--通过插件控制附件携带

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

单据转换--通过插件控制附件携带

一、说明

单据转换附件携带,默认是携带上游来源单据所有附件,没法通过配置进行筛选,只能通过转换插件进行控制,这里提供一个插件代码供参考。

二、示例

单据A下推单据B,单据A有两个附件,只允许携带一个附件到单据B

1、单据A,附件情况,有两个附件

image.webp

2、通过代码控制“文件1.txt”不允许携带到单据B,单据B附件情况。

image.webp

三、插件代码

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>
        /// 单据转换插件最后一个事件
        /// </summary>
        /// <param name="e"></param>
        public override void AfterConvert(AfterConvertEventArgs e)
        {
            base.AfterConvert(e);
            //转换得到的目标单扩展数据包集合
            var tgtExDatas = e.Result.FindByEntityKey("FBillHead");
            //有附件的目标单集合
            var tgtExDatasWithAttachs = tgtExDatas.Where(x => x.DataEntity[ConvertTakeDataInfo.ProperyKey] != null && x.DataEntity[ConvertTakeDataInfo.ProperyKey] is ConvertTakeDataInfo
                && (x.DataEntity[ConvertTakeDataInfo.ProperyKey] as ConvertTakeDataInfo).Attchments.IsEmpty() == false).ToList();
            if (tgtExDatasWithAttachs.Count() > 0)
            {
                List<ConvertAttachmentResultInfo> convertAttachInfos = new List<ConvertAttachmentResultInfo>();
                tgtExDatasWithAttachs.Select(x =>
                {
                    convertAttachInfos.AddRange((x.DataEntity[ConvertTakeDataInfo.ProperyKey] as ConvertTakeDataInfo).Attchments);
                    return x;
                }).ToList();
                //得到所有附件内码
                var attachPks = convertAttachInfos.Select(x => x.AttachmentId).Distinct().Select(x => ObjectUtils.Object2String(x)).ToArray();
                //得到附件元数据
                var attachFormId = "BOS_Attachment"; //附件表单Id
                var mdService = Kingdee.BOS.App.ServiceHelper.GetService<IMetaDataService>();
                var formMetaData = mdService.Load(this.Context, attachFormId) as FormMetadata;
                //得到附件详细信息
                var viewService = Kingdee.BOS.App.ServiceHelper.GetService<IViewService>();
                var attachDatas = viewService.Load(this.Context, attachPks, formMetaData.BusinessInfo.GetDynamicObjectType());
                //不需要携带的附件内码集合,比如:来源的单据编码为:0301001, 来源的文件名为:文件1.txt
                var notTakeAttachPks = attachDatas.Where(x => ObjectUtils.Object2String(x["BillNo"]) == "0301001" &&
                    ObjectUtils.Object2String(x["AttachmentName"]) == "文件1.txt").ToDictionary(x => ObjectUtils.Object2Int(x[0]), null);
                if (notTakeAttachPks.Count == 0) return;
                //对所有有附件的目标单据进行循环处理
                foreach (var exData in tgtExDatasWithAttachs)
                {
                    //需要移除
                    var takeInfo = exData.DataEntity[ConvertTakeDataInfo.ProperyKey] as ConvertTakeDataInfo;
                    takeInfo.Attchments.RemoveAll(x => notTakeAttachPks.ContainsKey(x.AttachmentId));
                }
            }
        }
    }
}


单据转换--通过插件控制附件携带

一、说明单据转换附件携带,默认是携带上游来源单据所有附件,没法通过配置进行筛选,只能通过转换插件进行控制,这里提供一个插件代码供参...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息