关键词:
页面开发,附件面板,附件字段
一、需求
在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 实现方案
先获取源附件面板数据,页面前台用AttachmentPanel.getAttachmentData()或者插件后台用AttachmentServiceHelper.getAttachments(String, Object, String),然后对uid、关联单据实体编码、关联单据实体id等进行数据加工处理,调用AttachmentFieldModel.saveAttachments(IDataModel, String, String, List<Map<String, Object>>)将附件数据上传到文件服务器,生成bd_attachment附件对象,再setValue赋值给目标附件字段。
三、实现过程
案例演示单据头附件字段,单据体同理。
1. 获取源附件面板数据并进行数据加工
关键代码:
//通过AttachmentServiceHelper.getAttachments(formId, pkId, attachKey)获取源单据附件面板附件数据 List<Map<String, Object>> attachmentData1 = AttachmentServiceHelper.getAttachments("kded_sourcebill", sourcebill1.getLong("id"), "attachmentpanel"); attachmentData1.forEach(attach -> { //修改附件数据的uid、关联单据实体编码、关联单据实体id attach.put("uid", getUid().toString()); attach.put("entityNum", getView().getEntityId()); attach.put("billPkId", String.valueOf(getModel().getValue("id"))); }); /** * 获取附件uid * @return */ private StringBuffer getUid() { StringBuffer uid = new StringBuffer("rc-upload-"); uid.append((new Date()).getTime()); uid.append("-"); int index = (int)(1.0D + Math.random() * 10.0D); uid.append(index); return uid; }
2. 调用AttachmentFieldModel.saveAttachments(IDataModel, String, String, List<Map<String, Object>>)将附件数据上传到文件服务器
关键代码:
AttachmentEdit attEdit = this.getView().getControl("kded_attachment"); List<DynamicObject> saveAttachments = attEdit.getAttachmentModel().saveAttachments(attEdit.getModel(), this.getView().getPageId(), this.getModel().getDataEntityType().getName(), attachmentData1);
3. 给目标附件字段赋值
关键代码:
List<Long> idSet = new ArrayList<>(); //获取保存后的bd_attachment附件对象id saveAttachments.forEach(save -> idSet.add(save.getLong("id"))); //给目标附件字段赋值 getModel().setValue("kded_attachment", idSet.toArray());
四、效果图
1. 如图1-图3。
图 1 源单据附件面板上传图片
图 2 通过插件将源附件面板图片上传到目标附件字段
图 3 目标附件字段图片可正常浏览
五、开发环境版本
COSMICV4.0.014.0
六、参考资料
七、附件
插件实现附件面板和附件字段的携带转换_元数据.zip(16.25KB)
插件实现附件面板和附件字段的携带转换_代码.zip(2.74KB)
推荐阅读