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数据失败"); } } }