package com.common.core.service;
|
|
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONObject;
|
import com.common.core.constant.GlobalConst;
|
import com.common.core.exception.BizException;
|
import com.common.core.utils.JsonUtils;
|
import com.common.core.utils.RestUtil;
|
import com.common.core.utils.SecretsManagerUtils;
|
import com.common.core.utils.StringUtils;
|
import com.common.redis.util.RedisUtil;
|
import com.deloitte.system.request.SFTokenDto;
|
import lombok.extern.slf4j.Slf4j;
|
import okhttp3.*;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.core.env.Environment;
|
import org.springframework.http.HttpHeaders;
|
import org.springframework.http.ResponseEntity;
|
import org.springframework.stereotype.Service;
|
|
import java.util.concurrent.TimeUnit;
|
|
|
@Service
|
@Slf4j
|
public class SFService {
|
@Value("${salesforce.tokenUrl}")
|
private String tokenUrl;
|
|
private OkHttpClient okHttpClient;
|
@Autowired
|
private Environment env;
|
@Autowired
|
private SecretsManagerUtils secretsManagerUtils;
|
@Autowired
|
private RedisUtil redisUtil;
|
@Value("${salesforce.baseUrl}")
|
private String baseUrl;
|
|
/**
|
* 获取salesforce token
|
* @return
|
*/
|
public SFTokenDto getToken() {
|
SFTokenDto sfTokenDto = redisUtil.getObject(GlobalConst.SF_TOKEN_KEY,SFTokenDto.class);
|
okHttpClient= new OkHttpClient.Builder()
|
.connectTimeout(60*5, TimeUnit.SECONDS)
|
.readTimeout(60*5, TimeUnit.SECONDS)
|
.build();
|
JSONObject object = secretsManagerUtils.getSecret(env.getProperty("aws.secrets.systemauth"));
|
String sfGrantType = object.getString("sf_grant_type");
|
String sfClientId = object.getString("sf_client_id");
|
String sfClientSecret = object.getString("sf_client_secret");
|
String sfUsername = object.getString("sf_username");
|
String sfPassword = object.getString("sf_password");
|
// 设置请求体
|
RequestBody body = new FormBody.Builder()
|
.add("grant_type",sfGrantType )
|
.add("client_id",sfClientId )
|
.add("username", sfUsername)
|
.add("password", sfPassword)
|
.add("client_secret", sfClientSecret).build();
|
Request.Builder reqBuilder = new Request.Builder()
|
.url(tokenUrl)
|
.post(body)
|
.header("Accept", "application/json");
|
Call call = okHttpClient.newCall(reqBuilder.build());
|
Response response=null;
|
String responseBody =null;
|
try{
|
response = call.execute();
|
responseBody=response.body().string();
|
log.info("salesforce token ->respData: {}", responseBody);
|
if (StringUtils.isBlank(JsonUtils.string2Object(responseBody, SFTokenDto.class).getAccessToken())) {
|
log.error("获取Salesforce token失败, AccessToken为空");
|
}else {
|
sfTokenDto = JsonUtils.string2Object(responseBody, SFTokenDto.class);
|
redisUtil.set(GlobalConst.SF_TOKEN_KEY, sfTokenDto, GlobalConst.SF_TOKEN_EXPIRE);
|
}
|
}catch (Exception e){
|
log.error("获取Salesforce token失败: ",e);
|
}
|
return sfTokenDto;
|
}
|
|
public JSONArray querySFData(String sql) {
|
SFTokenDto tokenDto = getToken();
|
String accessToken = tokenDto.getAccessToken();
|
HttpHeaders header = new HttpHeaders();
|
header.add("Authorization", "Bearer " + accessToken);
|
StringBuilder idString = new StringBuilder();
|
// 拼接URL
|
StringBuilder queryUrl = idString.append(baseUrl).append("services/data/v54.0/query/?q=").append(sql);
|
// 请求数据
|
JSONArray jsonArray = null;
|
try {
|
JSONObject jsonObject = RestUtil.get(queryUrl.toString(),header);
|
Object totalSize = jsonObject.get("totalSize");
|
Boolean done =(Boolean) jsonObject.get("done");
|
String nextRecordsUrl = jsonObject.getString("nextRecordsUrl");
|
jsonArray = jsonObject.getJSONArray("records");
|
if (totalSize == null) {
|
log.warn("请求Salesforce数据失败,result:{}",jsonObject);
|
throw new BizException("请求Salesforce数据失败");
|
}
|
}catch (Exception e){
|
log.error("请求Salesforce数据失败",e);
|
throw e;
|
}
|
return jsonArray;
|
}
|
|
/**
|
* 请求SF更新数据接口
|
*
|
* @param tableName 表名
|
* @param recordId
|
* @param params
|
* @return 更新是否成功
|
*/
|
public void updateSFData(String tableName,String recordId,JSONObject params) {
|
SFTokenDto tokenDto = getToken();
|
String accessToken = tokenDto.getAccessToken();
|
HttpHeaders header = new HttpHeaders();
|
header.add("Authorization", "Bearer " + accessToken);
|
header.add("Content-Type","application/json");
|
StringBuilder idString = new StringBuilder();
|
// 拼接URL
|
StringBuilder url = idString.append(baseUrl).append("services/data/v54.0/sobjects/").append(tableName).append("/").append(recordId);
|
log.info("updateSFData 请求地址:{}",url.toString());
|
// 请求数据
|
ResponseEntity sfRes = RestUtil.patchNative(url.toString(), header, null, params.toJSONString());
|
log.info("更新Salesforce数据,result:{}",sfRes.toString());
|
int statusCodeValue = sfRes.getStatusCodeValue();
|
//请求成功 http status:204
|
if(statusCodeValue!=204){
|
log.error("更新Salesforce数据失败,result:{}",sfRes.toString());
|
throw new BizException("更新Salesforce数据失败");
|
}
|
}
|
}
|