电脑桌面
添加蚂蚁七词文库到电脑桌面
安装后可以在桌面快捷访问

第三方系统如何上传附件到苍穹已有单据的附件字段

来源:金蝶云社区作者:金蝶2024-09-2317

第三方系统如何上传附件到苍穹已有单据的附件字段

关键词:OpenAPI、附件字段

一、需求

苍穹平台有一业务单据(kded_lczdemo),单据上存在一个附件字段x。第三方系统上传单据数据到苍穹系统单据a上,同时上传附件到单据a的附件字段x上。

二、场景描述

场景1:固定资产模块实物卡片建卡时上传附件,需要通过接口的方式将该附件进行文件传递至第三方系统,推送时提供URL方式供第三方系统通过URL下载附件。

场景2:从第三方系统批量导出的业务单据的附件,批量导入苍穹系统中对应业务单据中。

三、思路与方案

第三方系统远程上传业务单据数据至苍穹平台内,一般的单据数据的保存可以通过苍穹平台新增一个OpenApi接口(操作服务)给第三方系统调用,但是不能上传附件,因此需要先通过平台对外提供的attachment/uploadFile.do把附件上传到苍穹的缓存中,然后通过自定义服务接口完成附件的持久化、附件字段的赋值。

q1.webp

四、实现过程

下面步骤是苍穹平台相关的主要逻辑,详细代码看文章后面附件中的插件。

1、上传附件

调用苍穹的文件上传请求(uploadFile.do)将文件发送至苍穹系统缓存中,并返回临时附件的url。

       /**
        * 将文件发送到苍穹中
        * @param file
        * @param accessToken
        * @return
        * @throws Exception
        */
       private String postFileToCosmic(File file, String accessToken) throws Exception {
              // 第三方系统上传附件到苍穹的请求接口
       StringBuffer url = new StringBuffer();
        url.append(URL_COSMICHOST).append("attachment/uploadFile.do");
        // 上传可能需要传的参数
        Map<String, Object> param = new HashMap<String, Object>();
              // 上传附件,返回该附件在苍穹缓存中的临时存储路径
        return FileUploadService.getService().postFile(url.toString(), param, file, accessToken);
       }

2、封装数据要上传的附件信息到苍穹平台

private Map<String, Object> generateBizData(Map<String, List<File>> allFiles, String accessToken) throws Exception {
              Map<String, Object> allBizBillData = new HashMap<String, Object>();
              // 生成单据数据
              Map<String, Object> billData = new HashMap<String, Object>();
              billData.put("billno", billno);
              billData.put("billstatus", "A");
              allBizBillData.put("billData", billData);
              Map<String, Object> params = new HashMap<String, Object>();
              params.put("appId", KEY_APPNUMBER);
              params.put("entityName", KEY_BILL);
              allBizBillData.put("params", params);
              // 生成单据上所有的附件数据
              Map<String, Object> allAttachmentsData = new HashMap<String, Object>();
              // 单个附件面板中所有附件的信息
              List<Map<String, Object>> attachments = null;
              // 单个附件的信息
              Map<String, Object> attachmentInfo = null;
              StringBuffer uid = new StringBuffer();
              uid.append("rc-upload-").append(new Date().getTime()).append("-");
              int index = (int) (1 + Math.random()*10);
              for (String tempAttaKey : allFiles.keySet()) {
                     List<File> files = allFiles.get(tempAttaKey);
                     attachments = new ArrayList<Map<String, Object>>();
                     for (File tempFile : files) {
                            String tempAttaUrl = this.postFileToCosmic(tempFile, accessToken);
                            attachmentInfo = new HashMap<String, Object>();
                            attachmentInfo.put("entityNum", KEY_BILL);
                            attachmentInfo.put("name", tempFile.getName());
                            attachmentInfo.put("url", tempAttaUrl);
                            attachmentInfo.put("size", tempFile.length());
                            attachmentInfo.put("status", "success");
                            attachmentInfo.put("uid", uid.toString() + index++);
                            attachments.add(attachmentInfo);
                     }
                     allAttachmentsData.put(tempAttaKey, attachments);
              }
              allBizBillData.put("allAttachmentsData", allAttachmentsData);
              return allBizBillData;
       }

3、调用自定义OpenApi上传单据&附件信息到苍穹单据上

/**
     * 远程上传单据数据 & 附件文件到苍穹系统
     * @param cosmicHost               苍穹系统访问地址
     * @param accessToken
     * @param allAttachmentsData  单据数据  & 所有附件数据
     * @return
     * @throws URISyntaxException
     */
    public String bizSaveApi(String cosmicHost, String accessToken, Map<String, Object> allAttachmentsData) throws URISyntaxException {
          // 自定义开放平台接口路径
          StringBuffer url = new StringBuffer();
              url.append(cosmicHost).append(UPLOADATTAPATH);
              System.out.println(">>> " + url.toString());
          // 封装数据
          JSONObject body = new JSONObject();
          body.put("billData", allAttachmentsData.get("billData"));
          body.put("allAttachmentsData", allAttachmentsData.get("allAttachmentsData"));
          body.put("params", allAttachmentsData.get("params"));
              String responseStr = null;
              try {
                     responseStr = HttpService.getService().doGetByHttpClient(url.toString(), accessToken, body);
              } catch (Exception e) {
                     e.printStackTrace();
              }
              return responseStr;
    }

4.、开发自定义服务,插件中实现单据数据保存,并同步持久化缓存中附件到附件服务器上。

       @Override
       public ApiResult doCustomService(Map<String, Object> params) {
              Map<String, Object> resultInfo = new HashMap<String, Object>();
              // 单据数据
              Map<String, Object> bizObject = (Map<String, Object>) params.get("billData");
              logger.info("单据数据: " + bizObject);
              // 附件信息
              Map<String, Object> attachmentInfo = (Map<String, Object>) params.get("allAttachmentsData");
              // 参数信息
              Map<String, Object> paramMap = (Map<String, Object>) params.get("params");
              String entityNumber = paramMap.get("entityName").toString();
              logger.info(">>> 上传附件 <<<");
              // 保存单据数据
              DynamicObject dynamicObject = BusinessDataServiceHelper.newDynamicObject(entityNumber);
              dynamicObject.set("billno", bizObject.get("billno"));
              dynamicObject.set("billstatus", bizObject.get("billstatus"));
              dynamicObject.set("createtime", new Date());
              dynamicObject.set("modifytime", new Date());
 
              List<LinkedHashMap<String, Object>> attmentInfors = (List<LinkedHashMap<java.lang.String, Object>>) attachmentInfo
                            .get("kded_attachmentfieldx");
              DynamicObjectCollection attCol = dynamicObject.getDynamicObjectCollection("kded_attachmentfieldx");
 
              for (LinkedHashMap<String, Object> attmentInfor : attmentInfors) {
                     String name = (String) attmentInfor.get("name");
                   

第三方系统如何上传附件到苍穹已有单据的附件字段

关键词:OpenAPI、附件字段一、需求苍穹平台有一业务单据(kded_lczdemo),单据上存在一个附件字段x。第三方系统上传单据数据到苍穹系统单...
点击下载文档文档为doc格式

声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。

确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息
QQ群
  • 答案:my7c点击这里加入QQ群
支持邮箱
微信
  • 微信