文件服务.二开案例.复制单据时,同时复制附件列表中的附件到目标单据

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

文件服务.二开案例.复制单据时,同时复制附件列表中的附件到目标单据

1、应用场景:

    目前复制单据时,只支持将单据上附件字段或者图片字段的附件复制到新的单据上,并不支持将附件列表的附件一起复制到目标单据。现状如下图:

1)单据编号为123的采购订单,附件字段跟附件列表都挂了附件。

 

2)复制单据保存,生成单据编号为CGDD000511的采购订单,附件字段复制了,但是无法复制附件列表中的附件过来。

 

2、案例演示:

    如果用户有类似需求,可参考本帖通过二开实现。本案例将演示如何将采购订单的附件列表,在复制单据时一起复制到新的单据上。下图为实现后的效果:

 

3、实现步骤:

1拓展采购订单单据,拖文本字段,用以记录源单单据内码

 

2编写表单插件,用以实现复制单据时,将源单单据内码携带到目标单上,使得我们在保存时可以查询得到源单关联附件信息,下图为示例代码:

using System.ComponentModel;
using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.Bill.PlugIn.Args;
using Kingdee.BOS.Util;
 
namespace Running.Sample.PlugIn.BusinessPlugIn.Bill
{
    [Description("复制单据时赋值源单内码"), HotUpdate]
    public class P20200925CopyPkValueEdit : AbstractBillPlugIn
    {
        public override void AfterCopyData(CopyDataEventArgs e)
        {
            //复制单据完毕后,判断存在FSourPkValue实体属性,则为其赋值源单内码。
            if (e.DataObject.DynamicObjectType.Properties.ContainsKey("FSourPkValue"))
            {
                e.DataObject["FSourPkValue"] = e.PrimaryKeyValue;
            }
        }
    }
}

 

3采购订单注册表单插件:

 

4编写保存操作插件,用以实现保存单据时,将源单关联的附件信息一并复制到新增单据上,下图为示例代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using Kingdee.BOS.App;
using Kingdee.BOS.Contracts;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Orm.Metadata.DataEntity;
using Kingdee.BOS.Util;
 
namespace Running.Sample.PlugIn.ServicePlugIn.Operation
{
    [Description("保存单据时复制源单附件列表的附件到当前单据"), HotUpdate]
    public class P20200925CopyFileSavePlugIn : AbstractOperationServicePlugIn
    {
        private const string SourPkPropName = "FSourPkValue"; //源单内码字段实体属性名。
        private string _sourPkValue = string.Empty; //源单内码字段值。
 
        public override void BeginOperationTransaction(BeginOperationTransactionArgs e)
        {
            if (e.DataEntitys == null || e.DataEntitys.Length <= 0
                || !e.DataEntitys[0].DynamicObjectType.Properties.ContainsKey(SourPkPropName))
            {
                return;
            }
 
            //缓存源单内码字段值,并替换数据包值为空,防止重复保存时重复复制附件数据。
            _sourPkValue = e.DataEntitys[0][SourPkPropName].GetString();
            e.DataEntitys[0][SourPkPropName] = string.Empty;
        }
 
        public override void AfterExecuteOperationTransaction(AfterExecuteOperationTransaction e)
        {
            if (_sourPkValue.IsNullOrEmptyOrWhiteSpace())
            {
                return;
            }
 
            //根据FBILLTYPE业务对象标识、FINTERID源单内码加载关联的附件数据,此处加载单据头附件。
            IViewService viewService = ServiceHelper.GetService<IViewService>();
            OQLFilter filter = OQLFilter.CreateHeadEntityFilter(string.Format(
                "FBILLTYPE = '{0}' AND FINTERID = '{1}' AND FENTRYKEY = ' ' AND FENTRYINTERID = '-1'",
                    "PUR_PurchaseOrder", _sourPkValue));
            DynamicObject[] sourDynObjs = viewService.Load(this.Context, "BOS_Attachment", null, filter);
 
            //复制源单据附件的实体数据包,保存至目标单据。
            List<DynamicObject> targDynObjs = new List<DynamicObject>();
            foreach (DynamicObject sourDynObj in sourDynObjs)
            {
                //TODO:此处可加判断条件,只复制满足某些条件的附件到目标单。
                //if (xxx) continue;
 
                DynamicObject targDynObj = new DynamicObject(sourDynObj.DynamicObjectType);
                foreach (DynamicProperty dynProp in sourDynObj.DynamicObjectType.Properties)
                {
                    if (dynProp.IsReadOnly) continue;
                    targDynObj[dynProp.Name] = sourDynObj[dynProp.Name];
                }
                targDynObj["Id"] = 0; //清空附件内码。
                targDynObj["INTERID"] = e.DataEntitys[0]["Id"]; //关联目标单。
                targDynObjs.Add(targDynObj);
            }
 
            if (targDynObjs.Count > 0)
            {
                ISaveService saveService = ServiceHelper.GetService<ISaveService>();
                DynamicObject[] res = saveService.Save(this.Context, targDynObjs.ToArray());
            }
        }
    }
}

 

5采购订单保存操作注册操作服务插件:

 

6操作后刷新源单单据内码字段:

 

7拷贝组件至WebSite/Bin目录下重启IIS,查看效果,由单据123复制得到CGDD000512:

文件服务.二开案例.复制单据时,同时复制附件列表中的附件到目标单据

1、应用场景: 目前复制单据时,只支持将单据上附件字段或者图片字段的附件复制到新的单据上,并不支持将附件列表的附件一起复制到目标...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息