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

一、需求背景

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

二、思路与方案

        在父页面上包含一个【附件字段】按钮,点击按钮后弹出子页面,从动态表单中的附件字段上传的附件是一个放在缓存中的数据,通过文件流从文件缓存服务中获取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