本文讨论了在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_attachment的id通过setValue赋值给目标附件字段即可。
关键代码:
getModel().setValue("kded_attachment", attchIdSet.toArray());
注意:案例中此时源字段与目标字段共用同个附件对象数据,有一方删除附件则另一方也同时删除。可通过附件url获取文件流再自行上传至文件服务器创建另一个附件对象。
四、效果图
1. 如图1-图3。
图 1 源单据附件字段上传图片
图 2 通过插件将源附件字段图片上传到目标附件字段
图 3 目标附件字段图片可正常浏览
五、开发环境版本
COSMICV4.0.014.0
六、参考资料
七、附件
插件实现附件面板和附件字段的携带转换_元数据.zip(16.25KB)
插件实现附件面板和附件字段的携带转换_代码.zip(2.74KB)
推荐阅读