单据附件字段(落库)To单据附件字段(不落库)原创
金蝶云社区-时空蔷薇
时空蔷薇
4人赞赏了该文章 2,155次浏览 未经作者许可,禁止转载编辑于2022年04月11日 13:52:22
summary-icon摘要由AI智能服务提供

本文讨论了在BOTP等业务单据转换场景中,如何实现将一张单据的附件字段附件上传到另一张单据的附件字段。介绍了苍穹系统中附件面板和附件字段的区别及操作方式,包括使用AttachmentServiceHelper和BusinessDataServiceHelper等工具实现附件的获取和赋值。具体实现步骤包括获取源附件字段的id集合,并通过fbasedataid赋值给目标附件字段。同时提醒了附件共用的风险及解决方案,并展示了效果图和开发环境版本。

关键词:

页面开发,附件字段

一、需求

    在BOTP等有业务单据转换的场景,需要把某张单据的附件字段的附件上传到另外一张单据附件字段中,怎么实现?


二、思路与方案

2.1 分析思路

    苍穹系统附件类型有附件面板和附件字段。

    附件面板是面板控件,其附件对象数据存储于bos_attachment,只有控件编程模型,没有数据模型,但我们可以通过AttachmentServiceHelper.getAttachments(String, Object, String)获取附件面板数据、

 

AttachmentServiceHelper.upload(String, Object, String, List<Map<String, Object>>)或者AttachmentServiceHelper.saveTempAttachments(String, Object, String, Map<String, Object>)上传附件面板数据。

    附件字段继承自多选基础资料,具有数据模型,其关联的基础资料类型是bd_attachment,附件字段赋值类似多选基础资料,也可通过fbasedataid实现。

    那么借助这些方法即可随心所欲实现附件面板、附件字段之间的携带转换。

2.2 实现方案

    通过BuinessDataServiceHelper.load*(billType, selectProperties, QFilter[])加载源附件字段值,再通过fbasedataid赋值给目标附件字段。


三、实现过程

1. 获取源附件字段附件对象bd_attachment)的id集合

关键代码:

//获取源附件字段的值
DynamicObject sourceBill2 = BusinessDataServiceHelper.loadSingle("kded_sourcebill", "id,kded_attachment", qFilter2.toArray());
DynamicObjectCollection sourceAttachcol = (DynamicObjectCollection) sourceBill2.get("kded_attachment");
//获取源附件字段附件对象id集合 
List<Long> attchIdSet = new ArrayList<>();
sourceAttachcol.forEach(attach -> {
    attchIdSet.add(attach.getDynamicObject("fbasedataId").getLong("id"));
});

 

2. 给目标附件字段赋值

因为在目标单据页面操作,获取源附件字段附件对象bd_attachmentid通过setValue赋值给目标附件字段即可

关键代码:

getModel().setValue("kded_attachment", attchIdSet.toArray());

注意:案例中此时源字段与目标字段共用同个附件对象数据,有一方删除附件则另一方也同时删除。可通过附件url获取文件流再自行上传至文件服务器创建另一个附件对象。

 

四、效果图

1. 如图1-3

  

图片1.png

1 源单据附件字段上传图片

 

图片2.png

2 通过插件将源附件字段图片上传到目标附件字段

 

图片3.png

目标附件字段图片可正常浏览

  

五、开发环境版本

COSMICV4.0.014.0

 

六、参考资料

【开发平台】指导手册

学习成长中心

 

七、附件

赞 4