文件服务.二开案例.复制单据时,同时复制附件列表中的附件到目标单据
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、应用场景: 目前复制单据时,只支持将单据上附件字段或者图片字段的附件复制到新的单据上,并不支持将附件列表的附件一起复制到目标...
点击下载文档
本文2024-09-23 03:45:31发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-160918.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章