文件新增和依赖导入
This commit is contained in:
parent
d28a4f7303
commit
ad542999d8
@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module version="4">
|
||||
<component name="FacetManager">
|
||||
<facet type="Spring" name="Spring">
|
||||
<configuration />
|
||||
</facet>
|
||||
</component>
|
||||
</module>
|
@ -101,8 +101,12 @@
|
||||
<artifactId>mssql-jdbc</artifactId>
|
||||
<version>7.4.1.jre8</version>
|
||||
</dependency>
|
||||
|
||||
|
||||
<!--咖啡因缓存-->
|
||||
<dependency>
|
||||
<groupId>com.github.ben-manes.caffeine</groupId>
|
||||
<artifactId>caffeine</artifactId>
|
||||
<version>2.9.1</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
@ -0,0 +1,16 @@
|
||||
package org.ssssssss.magicboot.constant;
|
||||
|
||||
/**
|
||||
* 创宇CRM的证书常量
|
||||
*
|
||||
* @param
|
||||
* @return null
|
||||
* @Author weiloong_zhang
|
||||
*/
|
||||
public class CertificateConstant {
|
||||
public static final String APP_ID = "FSAID_131e877";//appId
|
||||
public static final String PERMANENT_CODE = "F7D7D42D0459407DE48B27B752650B8C";//永久授权码
|
||||
public static final String APP_SECRET = "a639cc4bc28c48cb986a4faf6badcb00";//appSecret
|
||||
public static final String CORP_ID = "FSCID_1EDEA7F57E23B1E1173B01D4E06B8DD4";//企业Id
|
||||
public static final String CURRENT_OPEN_USERID = "FSUID_86490ECFD2B8AD9EE361E6DA9B3AC83D";//当前登录用户id
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
package org.ssssssss.magicboot.constant;
|
||||
|
||||
/**
|
||||
* 接口地址URL常量
|
||||
*
|
||||
* @param
|
||||
* @return null
|
||||
* @Author weiloong_zhang
|
||||
*/
|
||||
public class URLConstant {
|
||||
public static final String GET_CORPACCESSTOKEN_URL = "https://open.fxiaoke.com/cgi/corpAccessToken/get/V2";//获取token的接口地址
|
||||
public static final String GET_CRM_LIST_URL = "https://open.fxiaoke.com/cgi/crm/v2/data/query";//获取客户列表的接口地址
|
||||
public static final String GET_CUSTOMIZE_LIST_URL = "https://open.fxiaoke.com/cgi/crm/custom/v2/data/query";//获取自定义对象列表的接口地址
|
||||
public static final String UPDATE_CRM_MAIN = "https://open.fxiaoke.com/cgi/crm/v2/data/update";
|
||||
public static final String CREATE_CRM_MAIN = "https://open.fxiaoke.com/cgi/crm/v2/data/create";
|
||||
public static final String CREATE_CRM_CUSTOMER_MAIN = "https://open.fxiaoke.com/cgi/crm/custom/v2/data/create";
|
||||
public static final String UNLOCK_CRM_URL = "https://open.fxiaoke.com/cgi/crm/v2/object/unlock";
|
||||
public static final String LOCK_CRM_URL = "https://open.fxiaoke.com/cgi/crm/v2/object/lock";
|
||||
public static final String UPDATE_CRM_CUSTOMIZE = "https://open.fxiaoke.com/cgi/crm/custom/v2/data/update";
|
||||
public static final String UPLOAD_FILE_URL = "https://open.fxiaoke.com/media/upload";
|
||||
public static final String UPLOAD_ANNEX_URL = "https://open.fxiaoke.com/cgi/crm/custom/v2/data/update";
|
||||
}
|
@ -0,0 +1,56 @@
|
||||
package org.ssssssss.magicboot.entity;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class Filter {
|
||||
@JsonProperty("operator")
|
||||
private String operator;
|
||||
@JsonProperty("field_name")
|
||||
private String fieldName;
|
||||
@JsonProperty("field_values")
|
||||
private List<String> fieldValues;
|
||||
|
||||
// 构造方法
|
||||
public Filter(String operator, String fieldName, List<String> fieldValues) {
|
||||
this.operator = operator;
|
||||
this.fieldName = fieldName;
|
||||
this.fieldValues = fieldValues;
|
||||
}
|
||||
|
||||
// Getter 和 Setter 方法
|
||||
public String getOperator() {
|
||||
return operator;
|
||||
}
|
||||
|
||||
public void setOperator(String operator) {
|
||||
this.operator = operator;
|
||||
}
|
||||
|
||||
public String getFieldName() {
|
||||
return fieldName;
|
||||
}
|
||||
|
||||
public void setFieldName(String fieldName) {
|
||||
this.fieldName = fieldName;
|
||||
}
|
||||
|
||||
public List<String> getFieldValues() {
|
||||
return fieldValues;
|
||||
}
|
||||
|
||||
public void setFieldValues(List<String> fieldValues) {
|
||||
this.fieldValues = fieldValues;
|
||||
}
|
||||
|
||||
// 方便打印的 toString 方法
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Filter{" +
|
||||
"operator='" + operator + '\'' +
|
||||
", field_name='" + fieldName + '\'' +
|
||||
", field_values=" + fieldValues +
|
||||
'}';
|
||||
}
|
||||
}
|
@ -0,0 +1,59 @@
|
||||
package org.ssssssss.magicboot.utils;
|
||||
|
||||
import com.github.benmanes.caffeine.cache.Cache;
|
||||
import com.github.benmanes.caffeine.cache.Caffeine;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public class CaffeineCacheUtil {
|
||||
|
||||
private static final Cache<Object, Object> cache = Caffeine.newBuilder()
|
||||
.maximumSize(100) // 最大缓存容量
|
||||
.expireAfterWrite(120, TimeUnit.MINUTES) // 120分钟后过期
|
||||
.build();
|
||||
|
||||
/**
|
||||
* 存储数据到缓存
|
||||
*
|
||||
* @param key 缓存的键
|
||||
* @param value 缓存的值
|
||||
*/
|
||||
public static void put(Object key, Object value) {
|
||||
cache.put(key, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* 从缓存中获取数据
|
||||
*
|
||||
* @param key 缓存的键
|
||||
* @return 缓存的值,如果不存在则返回null
|
||||
*/
|
||||
public static Object get(Object key) {
|
||||
return cache.getIfPresent(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* 从缓存中删除数据
|
||||
*
|
||||
* @param key 缓存的键
|
||||
*/
|
||||
public static void remove(Object key) {
|
||||
cache.invalidate(key);
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
// 存储数据到缓存
|
||||
put("key1", "value1");
|
||||
|
||||
// 从缓存中获取数据
|
||||
Object value = get("key1");
|
||||
System.out.println("Cached value for key1: " + value);
|
||||
|
||||
// 从缓存中删除数据
|
||||
remove("key1");
|
||||
|
||||
// 尝试获取被删除的数据
|
||||
value = get("key1");
|
||||
System.out.println("Cached value for key1 after removal: " + value);
|
||||
}
|
||||
}
|
@ -0,0 +1,314 @@
|
||||
package org.ssssssss.magicboot.utils;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.web.client.RestTemplate;
|
||||
import org.ssssssss.magicboot.constant.CertificateConstant;
|
||||
import org.ssssssss.magicboot.constant.URLConstant;
|
||||
import org.ssssssss.magicboot.entity.Filter;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 本工具类用于封装向纷享销客发送的请求参数,后续会完善其他的参数方法
|
||||
*
|
||||
* @param
|
||||
* @return null
|
||||
* @Author weiloong_zhang
|
||||
*/
|
||||
@Slf4j
|
||||
public class CrmRequestUtil {
|
||||
|
||||
private RestTemplate restTemplate = new RestTemplate();
|
||||
|
||||
//封装根据条件查询数据列表的请求
|
||||
public JSONObject getCRMList(List<Filter> filters, String dataObjectApiName) {
|
||||
String corpAccessToken = "";
|
||||
//判断咖啡因中是否有数据
|
||||
if (CaffeineCacheUtil.get("corpAccessToken") != null) {
|
||||
log.info("咖啡因中有缓存的token数据");
|
||||
corpAccessToken = CaffeineCacheUtil.get("corpAccessToken").toString();
|
||||
} else {
|
||||
log.info("咖啡因中不存在token缓存");
|
||||
//封装请求
|
||||
Map tokenParams = new HashMap<>();
|
||||
tokenParams.put("appId", CertificateConstant.APP_ID);
|
||||
tokenParams.put("appSecret", CertificateConstant.APP_SECRET);
|
||||
tokenParams.put("permanentCode", CertificateConstant.PERMANENT_CODE);
|
||||
|
||||
JSONObject tokenResponse = restTemplate.postForObject(URLConstant.GET_CORPACCESSTOKEN_URL, tokenParams, JSONObject.class);
|
||||
|
||||
//判断是否获取成功
|
||||
if (tokenResponse.containsKey("errorMessage") && tokenResponse.getString("errorMessage").equals("success")) {
|
||||
corpAccessToken = tokenResponse.getString("corpAccessToken");
|
||||
} else {
|
||||
log.info("获取纷享销客token失败{}", tokenResponse);
|
||||
}
|
||||
}
|
||||
|
||||
Map orderMap = new HashMap<>();
|
||||
orderMap.put("fieldName", "create_time");
|
||||
orderMap.put("isAsc", "false");
|
||||
|
||||
Map searchQueryInfoMap = new HashMap<>();
|
||||
searchQueryInfoMap.put("offset", "0");
|
||||
searchQueryInfoMap.put("limit", "100");
|
||||
searchQueryInfoMap.put("orders", Arrays.asList(orderMap));
|
||||
searchQueryInfoMap.put("filters", filters);
|
||||
|
||||
Map data = new HashMap<>();
|
||||
data.put("search_query_info", searchQueryInfoMap);
|
||||
data.put("dataObjectApiName", dataObjectApiName);
|
||||
|
||||
Map request = new HashMap<>();
|
||||
request.put("corpAccessToken", corpAccessToken);
|
||||
request.put("currentOpenUserId", CertificateConstant.CURRENT_OPEN_USERID);
|
||||
request.put("corpId", CertificateConstant.CORP_ID);
|
||||
request.put("data", data);
|
||||
|
||||
JSONObject requestJSON = new JSONObject(request);
|
||||
return requestJSON;
|
||||
}
|
||||
|
||||
//封装更新单据的请求参数
|
||||
public JSONObject updateCRM(Map data) {
|
||||
String corpAccessToken = "";
|
||||
//判断咖啡因中是否有数据
|
||||
if (CaffeineCacheUtil.get("corpAccessToken") != null) {
|
||||
log.info("咖啡因中有缓存的token数据");
|
||||
corpAccessToken = CaffeineCacheUtil.get("corpAccessToken").toString();
|
||||
} else {
|
||||
log.info("咖啡因中不存在token缓存");
|
||||
//封装请求
|
||||
Map tokenParams = new HashMap<>();
|
||||
tokenParams.put("appId", CertificateConstant.APP_ID);
|
||||
tokenParams.put("appSecret", CertificateConstant.APP_SECRET);
|
||||
tokenParams.put("permanentCode", CertificateConstant.PERMANENT_CODE);
|
||||
|
||||
JSONObject tokenResponse = restTemplate.postForObject(URLConstant.GET_CORPACCESSTOKEN_URL, tokenParams, JSONObject.class);
|
||||
|
||||
//判断是否获取成功
|
||||
if (tokenResponse.containsKey("errorMessage") && tokenResponse.getString("errorMessage").equals("success")) {
|
||||
corpAccessToken = tokenResponse.getString("corpAccessToken");
|
||||
} else {
|
||||
log.info("获取纷享销客token失败{}", tokenResponse);
|
||||
}
|
||||
}
|
||||
|
||||
//封装object_data
|
||||
Map objectData = new HashMap<>();
|
||||
objectData.put("object_data", data);
|
||||
|
||||
// Map rootData = new HashMap<>();
|
||||
// rootData.put("data", objectData);
|
||||
|
||||
Map request = new HashMap<>();
|
||||
request.put("corpAccessToken", corpAccessToken);
|
||||
request.put("currentOpenUserId", CertificateConstant.CURRENT_OPEN_USERID);
|
||||
request.put("corpId", CertificateConstant.CORP_ID);
|
||||
request.put("data", objectData);
|
||||
|
||||
JSONObject requestJSON = new JSONObject(request);
|
||||
return requestJSON;
|
||||
}
|
||||
|
||||
//封装新建单据的请求参数
|
||||
public JSONObject createCRM(Map map) {
|
||||
String corpAccessToken = "";
|
||||
//判断咖啡因中是否有数据
|
||||
if (CaffeineCacheUtil.get("corpAccessToken") != null) {
|
||||
log.info("咖啡因中有缓存的token数据");
|
||||
corpAccessToken = CaffeineCacheUtil.get("corpAccessToken").toString();
|
||||
} else {
|
||||
log.info("咖啡因中不存在token缓存");
|
||||
//封装请求
|
||||
Map tokenParams = new HashMap<>();
|
||||
tokenParams.put("appId", CertificateConstant.APP_ID);
|
||||
tokenParams.put("appSecret", CertificateConstant.APP_SECRET);
|
||||
tokenParams.put("permanentCode", CertificateConstant.PERMANENT_CODE);
|
||||
|
||||
JSONObject tokenResponse = restTemplate.postForObject(URLConstant.GET_CORPACCESSTOKEN_URL, tokenParams, JSONObject.class);
|
||||
|
||||
//判断是否获取成功
|
||||
if (tokenResponse.containsKey("errorMessage") && tokenResponse.getString("errorMessage").equals("success")) {
|
||||
corpAccessToken = tokenResponse.getString("corpAccessToken");
|
||||
} else {
|
||||
log.info("获取纷享销客token失败{}", tokenResponse);
|
||||
}
|
||||
}
|
||||
//封装object_data
|
||||
Map objectData = new HashMap<>();
|
||||
objectData.put("object_data", map);
|
||||
|
||||
//Map rootData = new HashMap<>();
|
||||
//rootData.put("data", objectData);
|
||||
|
||||
Map request = new HashMap<>();
|
||||
request.put("corpAccessToken", corpAccessToken);
|
||||
request.put("currentOpenUserId", CertificateConstant.CURRENT_OPEN_USERID);
|
||||
request.put("corpId", CertificateConstant.CORP_ID);
|
||||
request.put("data", objectData);
|
||||
|
||||
JSONObject requestJSON = new JSONObject(request);
|
||||
return requestJSON;
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成crm请求数据
|
||||
*
|
||||
* @param crmId
|
||||
* @param dataObjectApiName:
|
||||
* @return com.alibaba.fastjson.JSONObject
|
||||
* @Author weiloong_zhang
|
||||
*/
|
||||
public JSONObject unlockCRM(String crmId, String dataObjectApiName) {
|
||||
String corpAccessToken = "";
|
||||
//判断咖啡因中是否有数据
|
||||
if (CaffeineCacheUtil.get("corpAccessToken") != null) {
|
||||
log.info("咖啡因中有缓存的token数据");
|
||||
corpAccessToken = CaffeineCacheUtil.get("corpAccessToken").toString();
|
||||
} else {
|
||||
log.info("咖啡因中不存在token缓存");
|
||||
//封装请求
|
||||
Map tokenParams = new HashMap<>();
|
||||
tokenParams.put("appId", CertificateConstant.APP_ID);
|
||||
tokenParams.put("appSecret", CertificateConstant.APP_SECRET);
|
||||
tokenParams.put("permanentCode", CertificateConstant.PERMANENT_CODE);
|
||||
|
||||
JSONObject tokenResponse = restTemplate.postForObject(URLConstant.GET_CORPACCESSTOKEN_URL, tokenParams, JSONObject.class);
|
||||
|
||||
//判断是否获取成功
|
||||
if (tokenResponse.containsKey("errorMessage") && tokenResponse.getString("errorMessage").equals("success")) {
|
||||
corpAccessToken = tokenResponse.getString("corpAccessToken");
|
||||
} else {
|
||||
log.info("获取纷享销客token失败{}", tokenResponse);
|
||||
}
|
||||
}
|
||||
|
||||
Map data = new HashMap<>();
|
||||
data.put("dataIds", Arrays.asList(crmId));
|
||||
data.put("dataObjectApiName", dataObjectApiName);
|
||||
Map request = new HashMap<>();
|
||||
request.put("corpAccessToken", corpAccessToken);
|
||||
request.put("currentOpenUserId", CertificateConstant.CURRENT_OPEN_USERID);
|
||||
request.put("corpId", CertificateConstant.CORP_ID);
|
||||
request.put("data", data);
|
||||
|
||||
JSONObject requestJSON = new JSONObject(request);
|
||||
return requestJSON;
|
||||
}
|
||||
|
||||
public JSONObject crmWithDetail(Map map, Map details) {
|
||||
String corpAccessToken = "";
|
||||
//判断咖啡因中是否有数据
|
||||
if (CaffeineCacheUtil.get("corpAccessToken") != null) {
|
||||
log.info("咖啡因中有缓存的token数据");
|
||||
corpAccessToken = CaffeineCacheUtil.get("corpAccessToken").toString();
|
||||
} else {
|
||||
log.info("咖啡因中不存在token缓存");
|
||||
//封装请求
|
||||
Map tokenParams = new HashMap<>();
|
||||
tokenParams.put("appId", CertificateConstant.APP_ID);
|
||||
tokenParams.put("appSecret", CertificateConstant.APP_SECRET);
|
||||
tokenParams.put("permanentCode", CertificateConstant.PERMANENT_CODE);
|
||||
|
||||
JSONObject tokenResponse = restTemplate.postForObject(URLConstant.GET_CORPACCESSTOKEN_URL, tokenParams, JSONObject.class);
|
||||
|
||||
//判断是否获取成功
|
||||
if (tokenResponse.containsKey("errorMessage") && tokenResponse.getString("errorMessage").equals("success")) {
|
||||
corpAccessToken = tokenResponse.getString("corpAccessToken");
|
||||
} else {
|
||||
log.info("获取纷享销客token失败{}", tokenResponse);
|
||||
}
|
||||
}
|
||||
//封装object_data
|
||||
Map objectData = new HashMap<>();
|
||||
objectData.put("object_data", map);
|
||||
objectData.put("details", details);
|
||||
|
||||
Map request = new HashMap<>();
|
||||
request.put("corpAccessToken", corpAccessToken);
|
||||
request.put("currentOpenUserId", CertificateConstant.CURRENT_OPEN_USERID);
|
||||
request.put("corpId", CertificateConstant.CORP_ID);
|
||||
request.put("data", objectData);
|
||||
|
||||
JSONObject requestJSON = new JSONObject(request);
|
||||
return requestJSON;
|
||||
}
|
||||
|
||||
public JSONObject uploadFile(String dataId, String dataObjectApiName, String apiName, Map file) {
|
||||
String corpAccessToken = "";
|
||||
//判断咖啡因中是否有数据
|
||||
if (CaffeineCacheUtil.get("corpAccessToken") != null) {
|
||||
log.info("咖啡因中有缓存的token数据");
|
||||
corpAccessToken = CaffeineCacheUtil.get("corpAccessToken").toString();
|
||||
} else {
|
||||
log.info("咖啡因中不存在token缓存");
|
||||
//封装请求
|
||||
Map tokenParams = new HashMap<>();
|
||||
tokenParams.put("appId", CertificateConstant.APP_ID);
|
||||
tokenParams.put("appSecret", CertificateConstant.APP_SECRET);
|
||||
tokenParams.put("permanentCode", CertificateConstant.PERMANENT_CODE);
|
||||
|
||||
JSONObject tokenResponse = restTemplate.postForObject(URLConstant.GET_CORPACCESSTOKEN_URL, tokenParams, JSONObject.class);
|
||||
|
||||
//判断是否获取成功
|
||||
if (tokenResponse.containsKey("errorMessage") && tokenResponse.getString("errorMessage").equals("success")) {
|
||||
corpAccessToken = tokenResponse.getString("corpAccessToken");
|
||||
} else {
|
||||
log.info("获取纷享销客token失败{}", tokenResponse);
|
||||
}
|
||||
}
|
||||
|
||||
Map fileMap = new HashMap<>();
|
||||
fileMap.put("_id", dataId);
|
||||
fileMap.put(apiName, Arrays.asList(file));
|
||||
fileMap.put("dataObjectApiName", dataObjectApiName);
|
||||
|
||||
//封装object_data
|
||||
Map objectData = new HashMap<>();
|
||||
objectData.put("object_data", fileMap);
|
||||
|
||||
Map request = new HashMap<>();
|
||||
request.put("corpAccessToken", corpAccessToken);
|
||||
request.put("currentOpenUserId", CertificateConstant.CURRENT_OPEN_USERID);
|
||||
request.put("corpId", CertificateConstant.CORP_ID);
|
||||
request.put("data", objectData);
|
||||
|
||||
JSONObject requestJSON = new JSONObject(request);
|
||||
return requestJSON;
|
||||
|
||||
}
|
||||
|
||||
public String getCRMToken() {
|
||||
String corpAccessToken = "";
|
||||
//判断咖啡因中是否有数据
|
||||
if (CaffeineCacheUtil.get("corpAccessToken") != null) {
|
||||
log.info("咖啡因中有缓存的token数据");
|
||||
corpAccessToken = CaffeineCacheUtil.get("corpAccessToken").toString();
|
||||
} else {
|
||||
log.info("咖啡因中不存在token缓存");
|
||||
//封装请求
|
||||
Map tokenParams = new HashMap<>();
|
||||
tokenParams.put("appId", CertificateConstant.APP_ID);
|
||||
tokenParams.put("appSecret", CertificateConstant.APP_SECRET);
|
||||
tokenParams.put("permanentCode", CertificateConstant.PERMANENT_CODE);
|
||||
|
||||
JSONObject tokenResponse = restTemplate.postForObject(URLConstant.GET_CORPACCESSTOKEN_URL, tokenParams, JSONObject.class);
|
||||
|
||||
//判断是否获取成功
|
||||
if (tokenResponse.containsKey("errorMessage") && tokenResponse.getString("errorMessage").equals("success")) {
|
||||
corpAccessToken = tokenResponse.getString("corpAccessToken");
|
||||
} else {
|
||||
log.info("获取纷享销客token失败{}", tokenResponse);
|
||||
}
|
||||
}
|
||||
|
||||
return corpAccessToken;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
package org.ssssssss.magicboot.utils;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.client.RestTemplate;
|
||||
|
||||
@Configuration
|
||||
public class PortConfig {
|
||||
|
||||
@Bean
|
||||
public RestTemplate restTemplate() {
|
||||
return new RestTemplate();
|
||||
}
|
||||
|
||||
@Bean
|
||||
public ObjectMapper objectMapper() {
|
||||
return new ObjectMapper();
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user