bimface 模型集成-后端(java)上传、发起转换、获取转换状态

2024-05-17 16:18

本文主要是介绍bimface 模型集成-后端(java)上传、发起转换、获取转换状态,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 前言
  • 后端架构
  • 流程
    • 存储表结构
    • 全局工具类
    • 先根据appid, appsecret 生成accesstoken, 保存到自己的存储服务器。
    • 利用保存的 accesstoken 上传模型
    • 发起转换
    • 获取转换状态
    • 根据bimface文件ID获取模型viewtoken, 获取到viewtoken就可以利用前端浏览模型或图纸了

前言

之前没有注意官方有个sdk,然后自己就实现了这么个逻辑。建议直接用官方的sdk来嵌入自己的项目。

后端架构

springboot(jeecgboot) + mybatisplus

流程

存储表结构

  • sys_beamface_accesstoken 存储accesstoken. (上传、发起转换、获取转换状态\获取viewtoken 时需要用到accesstoken,)
  • sys_beamface_model_viewtoken 存储viewtoken(流程模型或图纸需要用到)
  • dt_doc中的 bim_file_id 存储模型/图纸上传到bimface后返回的bimface文件ID,
    status 0表示文件未处理,1表示文件已上传,2表示文件已发起转换,3表示文件转换成功
    在这里插入图片描述
    在这里插入图片描述

全局工具类

package org.jeecg.business.util;import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URISyntaxException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Date;
import java.util.Map;
import java.util.Map.Entry;import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.ContentBody;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;/*** HTTP工具类 单例模式**/
public class HttpClientUtil {private static Logger log = LoggerFactory.getLogger(HttpClientUtil.class);private static PoolingHttpClientConnectionManager cm;private static String EMPTY_STR = null;private static String UTF_8 = "utf-8";private static void init() {if (cm == null) {cm = new PoolingHttpClientConnectionManager();cm.setMaxTotal(1000);// 整个连接池最大连接数cm.setDefaultMaxPerRoute(500);// 每路由最大连接数}}/*** 通过连接池获取HttpClient* * @return*/private static CloseableHttpClient getHttpClient() {init();return HttpClients.custom().setConnectionManager(cm).build();}/*** Get请求 不带参数* * @param url* @return*/public static String httpGetRequest(String url) {HttpGet httpGet = new HttpGet(url);httpGet.setConfig(setTimedOut());return getResult(httpGet);}/*** Get请求 带参数* * @param url* @param params map* @return* @throws URISyntaxException*/public static String httpGetRequest(String url, Map<String, Object> params) throws URISyntaxException {URIBuilder ub = new URIBuilder();ub.setPath(url);ArrayList<NameValuePair> pairs = covertParams2NVPS(params);ub.setParameters(pairs);HttpGet httpGet = new HttpGet(ub.build());httpGet.setConfig(setTimedOut());return getResult(httpGet);}/*** Get请求 带头域与带参数* * @param url* @param headers 页面头域* @param params  map* @return* @throws URISyntaxException*/public static String httpGetRequest(String url, Map<String, Object> headers, Map<String, Object> params)throws URISyntaxException {URIBuilder ub = new URIBuilder();ub.setPath(url);if (!ObjectUtils.isEmpty(params)) {ArrayList<NameValuePair> pairs = covertParams2NVPS(params);ub.setParameters(pairs);}HttpGet httpGet = new HttpGet(ub.build());httpGet.setConfig(setTimedOut());for (Map.Entry<String, Object> param : headers.entrySet()) {httpGet.addHeader(param.getKey(), String.valueOf(param.getValue()));}return getResult(httpGet);}/*** Post请求 不带参数* * @param url* @return*/public static String httpPostRequest(String url) {HttpPost httpPost = new HttpPost(url);httpPost.setConfig(setTimedOut());return getResult(httpPost);}/*** Post请求 带参数* * @param url* @param params map* @return* @throws UnsupportedEncodingException*/public static String httpPostRequest(String url, Map<String, Object> params) throws UnsupportedEncodingException {HttpPost httpPost = new HttpPost(url);httpPost.setConfig(setTimedOut());ArrayList<NameValuePair> pairs = covertParams2NVPS(params);httpPost.setEntity(new UrlEncodedFormEntity(pairs, UTF_8));return getResult(httpPost);}/*** Post请求 带头域与带参数* * @param url* @param headers 头域* @param params  map* @return* @throws UnsupportedEncodingException*/public static String httpPostRequest(String url, Map<String, Object> headers, Map<String, Object> params)throws UnsupportedEncodingException {HttpPost httpPost = new HttpPost(url);httpPost.setConfig(setTimedOut());for (Map.Entry<String, Object> param : headers.entrySet()) {httpPost.addHeader(param.getKey(), String.valueOf(param.getValue()));}if (!ObjectUtils.isEmpty(params)) {ArrayList<NameValuePair> pairs = covertParams2NVPS(params);httpPost.setEntity(new UrlEncodedFormEntity(pairs, UTF_8));}return getResult(httpPost);}public static String httpPutRequestByRb(String url,  Map<String, Object> headers, String josnString) throws UnsupportedEncodingException {HttpPut httpPut = new HttpPut(url);httpPut.setConfig(setTimedOut());httpPut.setHeader("Content-Type", "application/json;charset=UTF-8");httpPut.setHeader("Date", new Date() + "");httpPut.setHeader("Accept", "application/json");httpPut.setHeader("Cache-Control", "no-store");for (Map.Entry<String, Object> param : headers.entrySet()) {httpPut.addHeader(param.getKey(), String.valueOf(param.getValue()));}StringEntity s = new StringEntity(josnString);s.setContentEncoding(UTF_8);s.setContentType("application/json");// 发送json数据需要设置contentTypehttpPut.setEntity(s);return getResult(httpPut);}public static String postFileMultiPart(String url, Map<String, ContentBody> params, String fileParamName) {HttpPost httpPost = new HttpPost(url);RequestConfig defaultRequestConfig = RequestConfig.custom().setConnectTimeout(5000).setConnectionRequestTimeout(5000).setSocketTimeout(15000).build();httpPost.setConfig(defaultRequestConfig);MultipartEntityBuilder builder = MultipartEntityBuilder.create();for (Entry<String, ContentBody> entry : params.entrySet()) {if (fileParamName.equals(entry.getKey())) continue;builder.addPart(entry.getKey(), entry.getValue());}builder.addPart(fileParamName, params.get(fileParamName));HttpEntity reqEntity = builder.build();httpPost.setEntity(reqEntity);return getResult(httpPost);}/*** map 处理方法* * @param params* @return*/private static ArrayList<NameValuePair> covertParams2NVPS(Map<String, Object> params) {ArrayList<NameValuePair> pairs = new ArrayList<NameValuePair>();for (Map.Entry<String, Object> param : params.entrySet()) {pairs.add(new BasicNameValuePair(param.getKey(), String.valueOf(param.getValue())));}return pairs;}/*** POST请求 带json格式的字符串参数* * @param url* @param json json格式的字符串* @return* @throws UnsupportedEncodingException*/public static String httpPostRequest(String url, String josnString) throws UnsupportedEncodingException {HttpPost httpPost = new HttpPost(url);httpPost.setConfig(setTimedOut());StringEntity s = new StringEntity(josnString);s.setContentEncoding(UTF_8);s.setContentType("application/json");// 发送json数据需要设置contentTypehttpPost.setEntity(s);return getResult(httpPost);}/*** POST请求 带json格式的字符串参数* * @param url* @param json json格式的字符串* @return* @throws UnsupportedEncodingException*/public static String httpPostRequest4Urlencoded(String url, String urlencoded) throws UnsupportedEncodingException {HttpPost httpPost = new HttpPost(url);httpPost.setConfig(setTimedOut());StringEntity s = new StringEntity(urlencoded);s.setContentEncoding(UTF_8);s.setContentType("application/x-www-form-urlencoded");httpPost.setEntity(s);return getResult(httpPost);}/*** 使用POSt方式通过Xml发送HTTP请求* * @param url 请求的URL地址* @param Xml 请求的Xml内容* @return 请求返回的内容体* @throws UnsupportedEncodingException*/public static String httpPostXmlRequest(String url, String xmlBody) throws UnsupportedEncodingException {HttpPost httpPost = new HttpPost(url);httpPost.setConfig(setTimedOut());httpPost.addHeader("content-type", "application/xml");StringEntity s = new StringEntity(xmlBody);s.setContentEncoding(UTF_8);s.setContentType("application/xml");// 设置contentTypehttpPost.setEntity(s);return getResult(httpPost);}/*** 使用PUT方式通过Xml发送HTTP请求* * @param url 请求的URL地址* @param Xml 请求的Xml内容* @return 请求返回的内容体* @throws UnsupportedEncodingException*/public static String httpPutXmlRequest(String url, String xmlBody) throws UnsupportedEncodingException {HttpPut httpPut = new HttpPut(url);httpPut.setConfig(setTimedOut());// httpPut.setHeader("Content-Type", "application/xml");// httpPut.addHeader("content-type", "application/xml");httpPut.setHeader("Content-Type", "application/xml;charset=UTF-8");StringEntity s = new StringEntity(xmlBody, Charset.forName("UTF-8"));s.setContentEncoding(UTF_8);s.setContentType("application/xml");// 设置contentTypehttpPut.setEntity(s);return getResult(httpPut);}/*** 设置Http连接超时间 单位毫秒 setConnectTimeout:设置连接超时时间,单位毫秒* setConnectionRequestTimeout:设置从connect Manager获取Connection 超时时间,单位毫秒* setSocketTimeout:请求获取数据的超时时间,单位毫秒* * @return*/public static RequestConfig setTimedOut() {RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(50000).setConnectionRequestTimeout(20000).setSocketTimeout(50000).build();return requestConfig;}/*** 红包充值新增 POST请求 带json格式的字符串参数* * @param url* @param json json格式的字符串* @return* @throws UnsupportedEncodingException*/public static String httpPostRequestByRb(String url, String josnString) throws UnsupportedEncodingException {HttpPost httpPost = new HttpPost(url);httpPost.setConfig(setTimedOut());httpPost.setHeader("Content-Type", "application/json;charset=UTF-8");httpPost.setHeader("Date", new Date() + "");httpPost.setHeader("Accept", "application/json");httpPost.setHeader("Cache-Control", "no-store");StringEntity s = new StringEntity(josnString);s.setContentEncoding(UTF_8);s.setContentType("application/json");// 发送json数据需要设置contentTypehttpPost.setEntity(s);return getResult(httpPost);}/*** 处理Http请求** @param request* @return* @throws Exception*/private static String getResult(HttpRequestBase request) {CloseableHttpClient httpClient = getHttpClient();CloseableHttpResponse response = null;int code = 0;// 状态码try {response = httpClient.execute(request);code = response.getStatusLine().getStatusCode();log.info("{}", response.getStatusLine());HttpEntity entity = response.getEntity();if (code != 200) {if (entity != null) {// 打印响应内容log.info("*****************response*****************");log.info("响应结果: " + EntityUtils.toString(entity));}return EMPTY_STR;}if (entity != null) {return EntityUtils.toString(entity);}} catch (Exception e) {log.error("调用接口异常: " + request, e);} finally {try {response.close();} catch (IOException e1) {log.error("response关闭异常", e1);}log.info("状态码[" + code + "]调用接口:" + request);}return EMPTY_STR;}}

先根据appid, appsecret 生成accesstoken, 保存到自己的存储服务器。

@Value("${beamface.appKey}")private String beamfaceAppKey;@Value("${beamface.appSecret}")private String beamfaceAppSecret;public static final String GET_ACCESS_TOKEN_URL = "https://api.bimface.com/oauth2/token";
// 获取token逻辑
public String getAccesstoken() {// 检查当前系统的accesstoken是否过期List<SysBeamfaceAccesstoken> accesstokens = list();if (CollectionUtils.isEmpty(accesstokens)) {SysBeamfaceAccesstoken accesstoken = new SysBeamfaceAccesstoken();Map<String, Object> result = getToken();accesstoken.setAcessToken(result.get("token").toString());try {Date date = DateUtils.parseDate(result.get("expireTime").toString(), "yyyy-MM-dd hh:mm:ss");// 保留10分钟误差long l = DateUtils.getMillis(date) - 600 * 1000;accesstoken.setExpiretimets(Long.toString(l));} catch (ParseException e) {throw new JeecgBootException(e.getMessage());}save(accesstoken);return accesstoken.getAcessToken();} else {// 判断时间是否过期SysBeamfaceAccesstoken accesstoken = accesstokens.get(0);long expireDate = DateUtils.getMillis();long old = Long.valueOf(accesstoken.getExpiretimets());// 没过期if (expireDate < old) {return accesstoken.getAcessToken();} else {Map<String, Object> result = getToken();accesstoken.setAcessToken(result.get("token").toString());try {Date date = DateUtils.parseDate(result.get("expireTime").toString(), "yyyy-MM-dd hh:mm:ss");// 保留10分钟误差long l = DateUtils.getMillis(date) - 600 * 1000;accesstoken.setExpiretimets(Long.toString(l));} catch (ParseException e) {throw new JeecgBootException(e.getMessage());}updateById(accesstoken);return accesstoken.getAcessToken();}}}// 请求accesstoken@SuppressWarnings("unchecked")public Map<String, Object> getToken() {if (StringUtils.isEmpty(beamfaceAppKey) || StringUtils.isEmpty(beamfaceAppSecret)) {logger.info("未配置beamface.appKey 或者  beamface.appSecret");return null;}// 将字符串 appKey:appSecret 拼接后(中间用冒号连接),对其进行BASE64编码, 然后在编码后的字符串前添加字符串Basic和一个空格, 即:“Basic” + “ ” + Base64Encode(appKey + “:” + appSecret)String key = this.beamfaceAppKey + ":" + this.beamfaceAppSecret;String authorization = String.format("%s %s", "Basic", Base64Utils.encodeToString(key.getBytes()));Map<String, Object> headers = new HashMap<>();headers.put("Authorization", authorization);try {String result = HttpClientUtil.httpPostRequest(GET_ACCESS_TOKEN_URL, headers, null);Map<String, Object> map = (Map<String, Object>) JSONUtils.parse(result);logger.info("{}", map);String success = (String) map.get("code");if (!"success".equals(success)) {logger.info("请求token失败");throw new JeecgBootException("请求access token失败");} else {return (Map<String, Object>) map.get("data");}} catch (UnsupportedEncodingException e) {throw new JeecgBootException(e.getMessage());}}

利用保存的 accesstoken 上传模型

思路: 利用保存的 accesstoken,构件定时任务:根据文件后缀格式,获取系统文件转台为0的模型文件流,进行上传。上传后 更新文件状态为 1,然后记录bimface文件ID。

String GET_POLICY_URL = "https://file.bimface.com/upload/policy";IDtDocService docService = SpringContextUtils.getBean(IDtDocService.class);Environment evn = SpringContextUtils.getBean(Environment.class);String uploadPath = evn.getProperty("jeecg.path.upload");// 查询状态为0的文件QueryWrapper<DtDoc> queryWrapper = new QueryWrapper<>();queryWrapper.and(i -> i.eq("status", 0).and(j -> j.like("doc_name", "%.rvt").or(s -> s.like("doc_name", "%.dwg")).or(s -> s.like("doc_name", "%.rfa")).or(s -> s.like("doc_name", "%.fbx")).or(s -> s.like("doc_name", "%.dxf")).or(s -> s.like("doc_name", "%.skp")).or(s -> s.like("doc_name", "%.ifc")).or(s -> s.like("doc_name", "%.dgn")).or(s -> s.like("doc_name", "%.obj")).or(s -> s.like("doc_name", "%.stl")).or(s -> s.like("doc_name", "%.3ds")).or(s -> s.like("doc_name", "%.dae")).or(s -> s.like("doc_name", "%.ply")).or(s -> s.like("doc_name", "%.igms"))));List<DtDoc> docList = docService.list(queryWrapper);LOGGER.info("扫描到{}个文件需要上传", docList.size());for (DtDoc dtDoc : docList) {LOGGER.info("开始处理{}", dtDoc.getDocName());String id = UUID.randomUUID().toString().replace("-", "").substring(0, 20);String token = beamfaceAccesstokenService.getAccesstoken();String docName = null;// 根据policy凭证上传文件String docUrl = dtDoc.getDocUrl();try {docName = URLEncoder.encode(dtDoc.getDocName(), "UTF-8");} catch (UnsupportedEncodingException e) {LOGGER.error("编码失败");LOGGER.error(e.getMessage(), e);continue;}if (StringUtils.isEmpty(docUrl)) {LOGGER.error("{} 文件路径不存在", docName);continue;}String filePath = uploadPath + File.separator + docUrl;File wlkxFile = new File(filePath);if (!wlkxFile.exists()) {LOGGER.error("{} 文件不存在", docName);continue;}// 获取policyMap<String, Object> headers = new HashMap<>();headers.put("Authorization", String.format("%s %s", "bearer", token));Map<String, Object> params = new HashMap<>();params.put("name", docName);params.put("sourceId", id);String policyResult = null;try {policyResult = HttpClientUtil.httpGetRequest(GET_POLICY_URL, headers, params);} catch (URISyntaxException e) {LOGGER.error("获取policy失败");LOGGER.error(e.getMessage(), e);continue;}if (policyResult == null) {LOGGER.error("{}, 获取policy失败", dtDoc.getDocName());continue;}LOGGER.info("{} {}, 获取policy成功", dtDoc.getDocName(), policyResult);Map<String, Object> policyResult2 = (Map<String, Object>) JSONUtils.parse(policyResult);if ("success".equals(policyResult2.get("code").toString())) {Map<String, Object> dataMap = (Map<String, Object>) policyResult2.get("data");String policy = dataMap.get("policy").toString();String host = dataMap.get("host").toString();String objectKey = dataMap.get("objectKey").toString();String accessId = dataMap.get("accessId").toString();String callbackBody = dataMap.get("callbackBody").toString();String signature = dataMap.get("signature").toString();Map<String,ContentBody> reqParam = new HashMap<String,ContentBody>();reqParam.put("name", new StringBody(docName, ContentType.MULTIPART_FORM_DATA));reqParam.put("key", new StringBody(objectKey, ContentType.MULTIPART_FORM_DATA));reqParam.put("policy", new StringBody(policy, ContentType.MULTIPART_FORM_DATA));reqParam.put("OSSAccessKeyId", new StringBody(accessId, ContentType.MULTIPART_FORM_DATA));reqParam.put("callback", new StringBody(callbackBody, ContentType.MULTIPART_FORM_DATA));reqParam.put("success_action_status", new StringBody("200", ContentType.MULTIPART_FORM_DATA));reqParam.put("signature", new StringBody(signature, ContentType.MULTIPART_FORM_DATA));ByteArrayOutputStream output = new ByteArrayOutputStream();try {FileUtils.copyFile(new File(filePath), output);} catch (IOException e) {LOGGER.error("读取文件失败");}reqParam.put("file", new ByteArrayBody(output.toByteArray(), docName));String uploadResult = HttpClientUtil.postFileMultiPart(host, reqParam, "file");if (uploadResult == null) {LOGGER.error("{}, upload失败", dtDoc.getDocName());continue;}Map<String, Object> uploadResult2 = (Map<String, Object>) JSONUtils.parse(uploadResult);if ("success".equals(uploadResult2.get("code").toString())) {dataMap = (Map<String, Object>) uploadResult2.get("data");LOGGER.info("{}, upload成功", dtDoc.getDocName());String bimfaceId = dataMap.get("fileId").toString();dtDoc.setBimFileId(bimfaceId);dtDoc.setStatus(1);docService.updateById(dtDoc);}} else {LOGGER.error("上传失败");continue;}}

发起转换

思路:获取文件状态为1的文件,定时获取文件转台,发起转换成功后更新为2.

String CONVERT_URL = "https://api.bimface.com/translate";// 查询状态为1的文件QueryWrapper<DtDoc> queryWrapper = new QueryWrapper<>();queryWrapper.and(i -> i.eq("status", 1).isNotNull("bim_file_id").and(j -> j.like("doc_name", "%.rvt").or(s -> s.like("doc_name", "%.dwg")).or(s -> s.like("doc_name", "%.fbx")).or(s -> s.like("doc_name", "%.rfa")).or(s -> s.like("doc_name", "%.dxf")).or(s -> s.like("doc_name", "%.skp")).or(s -> s.like("doc_name", "%.ifc")).or(s -> s.like("doc_name", "%.dgn")).or(s -> s.like("doc_name", "%.obj")).or(s -> s.like("doc_name", "%.stl")).or(s -> s.like("doc_name", "%.3ds")).or(s -> s.like("doc_name", "%.dae")).or(s -> s.like("doc_name", "%.ply")).or(s -> s.like("doc_name", "%.igms"))));List<DtDoc> docList = docService.list(queryWrapper);LOGGER.info("扫描到{}个文件需要解析", docList.size());Map<String, Object> headersMap = new HashMap<>();headersMap.put("Authorization", String.format("%s %s", "bearer", beamfaceAccesstokenService.getAccesstoken()));for (DtDoc dtDoc : docList) {LOGGER.info("开始处理{}", dtDoc.getDocName());String bimFileId = dtDoc.getBimFileId();Map<String, Object> sourceMap = new HashMap<>();sourceMap.put("fileId", bimFileId);sourceMap.put("compressed", null);sourceMap.put("rootName", null);JSONObject paramMap = new JSONObject();paramMap.put("callback", null);paramMap.put("config", null);paramMap.put("source", sourceMap);try {String converResult = HttpClientUtil.httpPutRequestByRb(CONVERT_URL, headersMap, paramMap.toJSONString());if (converResult == null) {LOGGER.error("调用转换服务失败");continue;}Map<String, Object> converResultJson = (Map<String, Object>) JSONUtils.parse(converResult);String code = converResultJson.get("code").toString();if ("success".equals(code)) {LOGGER.info("调用转换服务成功");dtDoc.setStatus(2);docService.updateById(dtDoc);continue;} else {LOGGER.error("调用转换服务失败");continue;}} catch (UnsupportedEncodingException e) {LOGGER.error("调用转换服务失败");LOGGER.error(e.getMessage(), e);continue;}}

获取转换状态

思路:定时查询文件状态为2的模型,查询bimface的转换状态,成功后转换为3

String GET_CONVERT_URL = "https://api.bimface.com/translate";IDtDocService docService = SpringContextUtils.getBean(IDtDocService.class);// 查询状态为2的文件QueryWrapper<DtDoc> queryWrapper = new QueryWrapper<>();queryWrapper.and(i -> i.eq("status", 2).isNotNull("bim_file_id").and(j -> j.like("doc_name", "%.rvt").or(s -> s.like("doc_name", "%.dwg")).or(s -> s.like("doc_name", "%.rfa")).or(s -> s.like("doc_name", "%.fbx")).or(s -> s.like("doc_name", "%.dxf")).or(s -> s.like("doc_name", "%.skp")).or(s -> s.like("doc_name", "%.ifc")).or(s -> s.like("doc_name", "%.dgn")).or(s -> s.like("doc_name", "%.obj")).or(s -> s.like("doc_name", "%.stl")).or(s -> s.like("doc_name", "%.3ds")).or(s -> s.like("doc_name", "%.dae")).or(s -> s.like("doc_name", "%.ply")).or(s -> s.like("doc_name", "%.igms"))));List<DtDoc> docList = docService.list(queryWrapper);LOGGER.info("扫描到{}个文件需要获取解析状态", docList.size());Map<String, Object> headers = new HashMap<>();headers.put("Authorization", String.format("%s %s", "bearer", beamfaceAccesstokenService.getAccesstoken()));for (DtDoc dtDoc : docList) {String bimFileId = dtDoc.getBimFileId();Map<String, Object> params = new HashMap<>();params.put("fileId", bimFileId);try {String convertResult = HttpClientUtil.httpGetRequest(GET_CONVERT_URL, headers, params);if (convertResult == null) {LOGGER.error("获取转换状态失败");continue;}Map<String, Object> converResultJson = (Map<String, Object>) JSONUtils.parse(convertResult);String code = converResultJson.get("code").toString();if ("success".equals(code)) {LOGGER.info("获取转换状态成功");Map<String, Object> dataMap = (Map<String, Object>) converResultJson.get("data");String status = dataMap.get("status").toString();if ("success".equals(status)) {LOGGER.info("模型{}的状态:成功", dtDoc.getDocName());dtDoc.setStatus(3);docService.updateById(dtDoc);continue;}} else {LOGGER.error("获取转换状态失败");continue;}} catch (URISyntaxException e) {LOGGER.error("获取转换状态失败");LOGGER.error(e.getMessage(), e);continue;}}

根据bimface文件ID获取模型viewtoken, 获取到viewtoken就可以利用前端浏览模型或图纸了

public static final String GET_VIEW_TOKEN_URL = "https://api.bimface.com/view/token";public String getViewToken(SysBeamfaceModelViewtoken beamfaceModelViewtoken) {QueryWrapper<SysBeamfaceModelViewtoken> queryWrapper = new QueryWrapper<>(beamfaceModelViewtoken);SysBeamfaceModelViewtoken sysBeamfaceModelViewtoken = getOne(queryWrapper);if (sysBeamfaceModelViewtoken == null) {sysBeamfaceModelViewtoken = new SysBeamfaceModelViewtoken();String viewToken = getToken(beamfaceModelViewtoken);sysBeamfaceModelViewtoken.setViewToken(viewToken);sysBeamfaceModelViewtoken.setCompareid(beamfaceModelViewtoken.getCompareid());sysBeamfaceModelViewtoken.setFileid(beamfaceModelViewtoken.getFileid());sysBeamfaceModelViewtoken.setIntegrateid(beamfaceModelViewtoken.getIntegrateid());// 过期时间为12个小时 保留10分钟误差long ts = DateUtils.getMillis() + 60 * 1000 * 60 * 12 - 60 * 1000 * 10;sysBeamfaceModelViewtoken.setExpiretimets(Long.toString(ts));save(sysBeamfaceModelViewtoken);} else {long ts = Long.valueOf(sysBeamfaceModelViewtoken.getExpiretimets());long currentTs = DateUtils.getMillis();if (currentTs > ts) {String viewToken = getToken(beamfaceModelViewtoken);sysBeamfaceModelViewtoken.setViewToken(viewToken);long nts = DateUtils.getMillis() + 60 * 1000 * 60 * 12 - 60 * 1000 * 10;sysBeamfaceModelViewtoken.setExpiretimets(Long.toString(nts));updateById(sysBeamfaceModelViewtoken);}}return sysBeamfaceModelViewtoken.getViewToken();}@SuppressWarnings("unchecked")public String getToken(SysBeamfaceModelViewtoken beamfaceModelViewtoken) {// "Authorization: Bearer dc671840-bacc-4dc5-a134-97c1918d664b"String accessToken = beamfaceAccesstokenService.getAccesstoken();String authorization = String.format("%s %s", "Bearer", accessToken);Map<String, Object> headers = new HashMap<>();headers.put("Authorization", authorization);Map<String, Object> params = new HashMap<>();if (!StringUtils.isEmpty(beamfaceModelViewtoken.getCompareid())) {params.put("compareId", beamfaceModelViewtoken.getCompareid());}if (!StringUtils.isEmpty(beamfaceModelViewtoken.getFileid())) {params.put("fileId", beamfaceModelViewtoken.getFileid());}if (!StringUtils.isEmpty(beamfaceModelViewtoken.getIntegrateid())) {params.put("integrateId", beamfaceModelViewtoken.getIntegrateid());}String result = null;try {result = HttpClientUtil.httpGetRequest(GET_VIEW_TOKEN_URL, headers, params);} catch (URISyntaxException e) {logger.error(e.getMessage(), e);logger.error("获取view token失败");}if (result == null) {logger.error("获取view token失败");return null;}Map<String, Object> map = (Map<String, Object>) JSONUtils.parse(result);logger.info("{}", map);String success = (String) map.get("code");if (!"success".equals(success)) {logger.info("请求token失败");throw new JeecgBootException("请求模型 view token失败");} else {return map.get("data").toString();}}

这篇关于bimface 模型集成-后端(java)上传、发起转换、获取转换状态的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/995577

相关文章

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF