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

关键词:OpenAPI、附件字段
一、需求
苍穹平台有一业务单据(kded_lczdemo),单据上存在一个附件字段x。第三方系统上传单据数据到苍穹系统单据a上,同时上传附件到单据a的附件字段x上。
二、场景描述
场景1:固定资产模块实物卡片建卡时上传附件,需要通过接口的方式将该附件进行文件传递至第三方系统,推送时提供URL方式供第三方系统通过URL下载附件。
场景2:从第三方系统批量导出的业务单据的附件,批量导入苍穹系统中对应业务单据中。
三、思路与方案
第三方系统远程上传业务单据数据至苍穹平台内,一般的单据数据的保存可以通过苍穹平台新增一个OpenApi接口(操作服务)给第三方系统调用,但是不能上传附件,因此需要先通过平台对外提供的attachment/uploadFile.do把附件上传到苍穹的缓存中,然后通过自定义服务接口完成附件的持久化、附件字段的赋值。

四、实现过程
下面步骤是苍穹平台相关的主要逻辑,详细代码看文章后面附件中的插件。
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格式
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
上一篇
已经是第一篇



