如何在第三方系统远程查询苍穹系统内指定单据的附件信息原创
金蝶云社区-聚宝彭
聚宝彭
26人赞赏了该文章 6394次浏览 未经作者许可,禁止转载编辑于2022年04月15日 18:39:23

关键词:OpenAPI、附件面板


一、需求

苍穹平台内有一业务单据,其中存在多个附件面板控件。现有第三方系统,需从苍穹平台查询该单据中指定的业务数据及其部分附件信息,从而进行其他业务操作(如下载)。


二、思路与方案

2.1 分析思路

第三方系统远程查询指定的单据数据,可通过平台开放的查询操作服务接口完成,但并不能查询到与之相关的附件信息。此外,平台对外暂未提供直接查询单据附件的OpenAPI接口,但是平台底层提供接口通过单据主键去查询与之相关的附件信息,故可考虑通过自定义服务接口来完成单据数据&与之相关的附件信息查询。


2.2 实现方案

开自定义服务接口实现业务逻辑:通过单据主键ID去查询所有附件信息,再进行遍历查找指定附件的信息,完成之后将附件信息集合返回给第三方系统。


三、实现过程

1. 开发自定义服务,实现业务逻辑:根据条件(单据主键ID)查询苍穹平台中指定业务单据上指定附件的信息

	@Override
	public ApiResult doCustomService(Map<String, Object> params) {
		Map<String, Object> resultInfo = new HashMap<String, Object>();
		// 参数信息
		Map<String, Object> paramMap = (Map<String, Object>) params.get("params");
		logger.info("参数: " + paramMap);
		Object entityNumber = paramMap.get("entityname");
		Object pkId = paramMap.get("pkid");
		if (StringUtils.isBlank(entityNumber) || StringUtils.isBlank(pkId)) {
			return ApiResult.fail("查询失败, 参数为空 !");
		}
		Object attachKeyObj = paramMap.get("attachmentpanelkey");
		List<String> attachKeyList = null;
		if (StringUtils.isNotBlank(attachKeyObj)) {
			attachKeyList = ((List<String>) attachKeyObj);
		} else {
			attachKeyList = new ArrayList<String>();
			Map<String, String> attachmentMap = AttachmentServiceHelper.getAttachmentsForApi(entityNumber.toString(), pkId);
			Set<String> attachmentPannelKeys = attachmentMap.keySet();
			attachKeyList.addAll(attachmentPannelKeys);
		}
		Object fileNamesObj = paramMap.get("filenames");
		List<String> fileNameList = StringUtils.isNotBlank(fileNamesObj) ? (List<String>) fileNamesObj : null;
		// 单据上所有附件面板下的所有附件
		Map<String, List<Map<String, Object>>> allAttachments = new HashMap<String, List<Map<String, Object>>>();
		// 某个附件面板下所有的附件
		List<Map<String, Object>> attachments = null;
		for (String tempAttaKey : attachKeyList) {
			attachments = AttachmentServiceHelper.getAttachments(entityNumber.toString(), pkId, tempAttaKey);
			Iterator<Map<String, Object>> iterator = attachments.iterator();
			if (fileNameList != null && !fileNameList.isEmpty()) {
				Map<String, Object> tempAtta = null;
				while (iterator.hasNext()) {
					tempAtta = iterator.next();
					for (String tempFileName : fileNameList) {
						if (!StringUtils.equalsIgnoreCase(tempFileName, tempAtta.get("name").toString())) {
							iterator.remove();
						}
					}
					logger.info("查询到附件面板( " + tempAttaKey + " )下的附件 " + tempAtta.get("name"));
				}
			}
			if (attachments != null && !attachments.isEmpty()) {
				allAttachments.put(tempAttaKey, attachments);
			}
		}
		resultInfo.put("allattachments", allAttachments);
		return ApiResult.success(resultInfo);
	}


2. 在第三方系统中获取访问苍穹OpenAPI接口的accessToken。

	public static void main(String[] args) {
		ThirdSysRemoteOperateAttachmentWithCosmic remoteOperateAtta = new ThirdSysRemoteOperateAttachmentWithCosmic();
		// 获取appToken,需在方法体内修改配置信息
		String appToken = AppLoginService.getService().getAppToken(URL_COSMICHOST);
		// 获取accessToken,需在方法体内修改配置信息
		String accessToken = UserLoginService.getService().getAccessToken(URL_COSMICHOST, appToken);
		try {
			// 查询苍穹系统中指定单据上的所有附件信息
			remoteOperateAtta.remoteGetAttasFromCosmic(accessToken);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}


3. 在第三方系统中封装参数,调用第 1 步中开发的自定义服务接口查询苍穹平台中指定单据上指定附件的信息。

	/**
	 * 远程查询附件信息
	 * @param accessToken
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private Map<String, List<Map<String, Object>>> remoteGetAttasFromCosmic(String accessToken) throws Exception {
		String responseStr = null;
		Map<String, Object> params = this.getParameters();
		// 查询附件信息
		responseStr = BizOperateService.getService().bizGetAttachmentsInfo(URL_COSMICHOST, accessToken, params);
		JSONObject responseJson = JSONObject.parseObject(responseStr);
		Boolean success = (responseJson == null || responseJson.isEmpty()) ? false : Boolean.valueOf(responseJson.getString("success"));
		Map<String, List<Map<String, Object>>> allAttachments = null;
		if (success) {
			// 查询到的附件信息(key:附件面板标识符;value:该附件面板下附件集合)
			allAttachments = (Map<String, List<Map<String, Object>>>) responseJson.getJSONObject("data").get("allattachments");
		} else {
			throw new Exception("远程查询附件信息失败!");
		}
		return allAttachments;
	}


四、效果图

附件查询结果.png


五、开发环境版本

V2.0.036(含)以上


六、注意事项

1. 如需复现样例效果,请注意按实际系统配置信息修改代码中相关变量参数。

2. 文章附件包含案例元数据补丁包、Java代码源码。解压之后请在MC中以更新补丁的形式将元数据压缩包导入平台里,Java代码放到本地开发工具(Eclipse/Idea)中,重启服务,运行代码即可查看效果,实际操作请查阅附件内的文档《操作步骤.doc》。


七、参考资料

开发平台

学习成长中心

开放平台(视频)

开放平台(文档)

插件开发—开放API

附件面板控件

第三方系统远程上传业务单据&多个附件至苍穹系统

第三方系统远程下载苍穹系统内指定单据的所有附件

复制合同模板(基础资料)上的附件并填充数据后重新绑定到业务单据上



赞 26