文件新增和依赖导入

This commit is contained in:
itzhang 2025-03-26 14:46:13 +08:00
parent d28a4f7303
commit ad542999d8
8 changed files with 494 additions and 10 deletions

View File

@ -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>

View File

@ -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>

View File

@ -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
}

View File

@ -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";
}

View File

@ -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 +
'}';
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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();
}
}