如何将动态表单中附件字段的附件上传到另一个动态表单的附件面板上原创
金蝶云社区-闫方亮
闫方亮
3人赞赏了该文章 2.2万次浏览 未经作者许可,禁止转载编辑于2022年07月14日 14:28:19
summary-icon摘要由AI智能服务提供

本文描述了在一个动态表单系统中,用户如何在父页面点击按钮后弹出子页面上传附件,并将这些附件回传至父页面的功能实现过程。具体步骤包括:在父页面设置按钮并弹出子页面,子页面包含附件字段供用户上传文件,通过文件流和缓存服务处理上传的附件,并将附件信息以特定格式回传至父页面,最终在父页面的附件面板中显示上传的附件。文中还详细展示了实现该功能的代码示例、效果图以及开发环境版本和注意事项。

一、需求背景

        在某动态表单页面(后文简称:父页面)上点击按钮后弹出动态表单页面(后文简称:子页面),子页面上有一【附件字段】控件,用户上传附件文件之后点击“确定”按钮,系统自动将所有附件回传至父页面上的【附件面板】中

二、思路与方案

        在父页面上包含一个【附件字段】按钮,点击按钮后弹出子页面,从动态表单中的附件字段上传的附件是一个放在缓存中的数据,通过文件流从文件缓存服务中获取url,然后将获取的数据拼接为【附件面板】控件对象所需要的数据,将拼接的数据传输到父页面【附件面板】中。

三、实现过程

        3.1首先创建一个动态表单(子页面)子页面名为(附件字段子页面)包含一个附件字段控件如下图3.1所示

image.png

图3.1

        3.2创建一个动态表单(父页面)页面名为(附件面板父页面)包含【附件字段】按钮、【附件面板】控件如下图3.2所示

image.png

图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所示

image.png

图4.1

        4.2子页面点击【确定】按钮关闭后,父页面【附件面板】效果图如图4.2所示

image.png

图4.2

五、开发环境版本 

        不限,本样例采用的轻量级环境,版本是: 苍穹版本号 COSMICV4.0.019.0  星瀚版本号 CONSTELLATIONV4.0.019.0

六、注意事项

        注意按钮标识、回传标识

七、参考资料

开发平台

学习成长中心

参考附件中的代码补丁

  1. 元数据直接在开发平台导入

  2. 源代码直接在开发工具idea/eclipse中导入


图标赞 3
3人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!