测试用户
2023-04-13 43393f2bb11cbf9e6af40077bbc5284660e8a754
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
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数据失败");
        }
    }
}