本文描述了在一个动态表单系统中,用户如何在父页面点击按钮后弹出子页面上传附件,并将这些附件回传至父页面的功能实现过程。具体步骤包括:在父页面设置按钮并弹出子页面,子页面包含附件字段供用户上传文件,通过文件流和缓存服务处理上传的附件,并将附件信息以特定格式回传至父页面,最终在父页面的附件面板中显示上传的附件。文中还详细展示了实现该功能的代码示例、效果图以及开发环境版本和注意事项。
一、需求背景
在某动态表单页面(后文简称:父页面)上点击按钮后弹出动态表单页面(后文简称:子页面),子页面上有一【附件字段】控件,用户上传附件文件之后点击“确定”按钮,系统自动将所有附件回传至父页面上的【附件面板】中
二、思路与方案
在父页面上包含一个【附件字段】按钮,点击按钮后弹出子页面,从动态表单中的附件字段上传的附件是一个放在缓存中的数据,通过文件流从文件缓存服务中获取url,然后将获取的数据拼接为【附件面板】控件对象所需要的数据,将拼接的数据传输到父页面【附件面板】中。
三、实现过程
3.1首先创建一个动态表单(子页面)子页面名为(附件字段子页面)包含一个附件字段控件如下图3.1所示
图3.1
3.2创建一个动态表单(父页面)页面名为(附件面板父页面)包含【附件字段】按钮、【附件面板】控件如下图3.2所示
图3.2
3.3编写子页面插件类代码并注册插件在子页面的页面插件中
public class AttachFiledsUploadPlugin extends AbstractFormPlugin { @Override public void registerListener(EventObject e) { super.registerListener(e); this.addClickListeners("btnok"); } @Override public void click(EventObject evt) { super.click(evt); Control source = (Control) evt.getSource(); String sourceKey=source.getKey(); //获取附件字段数据模型 DynamicObjectCollection dynamicObjects= (DynamicObjectCollection) this.getModel().getValue("kdec_attachmentfield"); //根据附件字段数据构造附件面板数据 List<Map<String,Object>> attachmentData = buildAttachmentDataFromEdit(dynamicObjects); HashMap<String, List<Map<String,Object>>> hashMap = new HashMap<>(); hashMap.put("attach", attachmentData); //监听确定按钮 if ("btnok".equals(sourceKey)) { this.getView().returnDataToParent(hashMap); this.getView().close(); } } /** * 根据附件字段数据构造附件面板数据 * @param sourceAttachCol * @return */ public List<Map<String,Object>> buildAttachmentDataFromEdit(DynamicObjectCollection sourceAttachCol){ List<Map<String,Object>>attachDataList= new ArrayList<>(); sourceAttachCol.forEach(attach -> { DynamicObject attachObj = attach.getDynamicObject("fbasedataid"); Map<String,Object>attachMap =new HashMap<>(); //description attachMap.put("description",attachObj.getString("description")); attachMap.put("type",attachObj.getString("type")); //获取附件inputstream上传到缓存服务 InputStream inputStream= FileServiceFactory.getAttachmentFileService().getInputStream(attachObj.getString("url")); String saveUrl=CacheFactory.getCommonCacheFactory().getTempFileCache().saveAsFullUrl(attachObj.getString("name"), new BufferedInputStream(inputStream),2*3600); //url attachMap.put("url", saveUrl); //uid attachMap.put("uid", UUID.randomUUID().toString()); //name attachMap.put("name",attachObj.getString("name")); //size attachMap.put("size",attachObj.get("size")); //lastModified attachMap.put("lastModified",new Date().getTime()); attachMap.put("uploadTime",new Date().getTime()); attachMap.put("status","success"); attachDataList.add(attachMap); }); return attachDataList; }
3.4编写父页面插件类代码并注册插件在父页面的页面插件中
public class AttachmentTransferPlugin extends AbstractFormPlugin { @Override public void registerListener(EventObject e) { super.registerListener(e); this.addItemClickListeners("kdec_toolbarap"); } @Override public void itemClick(ItemClickEvent evt) { super.itemClick(evt); if("kdec_baritemap".equals(evt.getItemKey())){ FormShowParameter ShowParameter = new FormShowParameter(); ShowParameter.setFormId("kdec_entry_enclosure"); ShowParameter.setCloseCallBack(new CloseCallBack(this, "kded_attachfileds")); ShowParameter.getOpenStyle().setShowType(ShowType.Modal); this.getView().showForm(ShowParameter); } } @Override public void closedCallBack(ClosedCallBackEvent closedCallBackEvent) { super.closedCallBack(closedCallBackEvent); if("kded_attachfileds".equals(closedCallBackEvent.getActionId())){ if(closedCallBackEvent.getReturnData()!=null){ HashMap<String, List<Map<String,Object>>> hashMap= (HashMap<String, List<Map<String, Object>>>) closedCallBackEvent.getReturnData(); List<Map<String,Object>> retData=hashMap.get("attach"); if(retData!=null && retData.size()>0){ AttachmentPanel panel = this.getControl("kdec_attachmentpanelap"); panel.upload(retData); //刷新页面 this.getView().updateView("kdec_attachmentpanelap"); } } } } }
四、效果图
4.1通过父页面名为(附件面板父页面)上点击【附件字段】按钮弹出子页面,然后弹出子页面通过页面上【附件字段】控件上传附件后效果图如图4.1所示
图4.1
4.2子页面点击【确定】按钮关闭后,父页面【附件面板】效果图如图4.2所示
图4.2
五、开发环境版本
不限,本样例采用的轻量级环境,版本是: 苍穹版本号 COSMICV4.0.019.0 星瀚版本号 CONSTELLATIONV4.0.019.0
六、注意事项
注意按钮标识、回传标识
七、参考资料
参考附件中的代码补丁
元数据直接在开发平台导入
源代码直接在开发工具idea/eclipse中导入
附件字段回传附件面板 (1).zip(9.87KB)
推荐阅读