本文讨论了如何在苍穹平台中通过自定义服务接口实现第三方系统查询指定业务单据及其附件信息的需求。由于平台未直接提供查询附件的OpenAPI,因此通过开发自定义接口,根据单据主键ID查询并返回附件信息。实现步骤包括开发服务接口、获取OpenAPI访问令牌、封装参数并调用服务接口获取附件信息。还提供了开发环境版本要求、注意事项、案例元数据和Java代码源码,以及详细的操作步骤文档和参考资料。
关键词: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; }
四、效果图
五、开发环境版本
V2.0.036(含)以上
六、注意事项
1. 如需复现样例效果,请注意按实际系统配置信息修改代码中相关变量参数。
2. 文章附件包含案例元数据补丁包、Java代码源码。解压之后请在MC中以更新补丁的形式将元数据压缩包导入平台里,Java代码放到本地开发工具(Eclipse/Idea)中,重启服务,运行代码即可查看效果,实际操作请查阅附件内的文档《操作步骤.doc》。
七、参考资料
复制合同模板(基础资料)上的附件并填充数据后重新绑定到业务单据上
第三方系统远程查询苍穹系统内指定单据的附件信息.zip(160.70KB)
推荐阅读