diff --git a/magic-boot/magic-boot.iml b/magic-boot/magic-boot.iml deleted file mode 100644 index 1daccae..0000000 --- a/magic-boot/magic-boot.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/magic-boot/pom.xml b/magic-boot/pom.xml index f4f4773..167c638 100644 --- a/magic-boot/pom.xml +++ b/magic-boot/pom.xml @@ -101,8 +101,12 @@ mssql-jdbc 7.4.1.jre8 - - + + + com.github.ben-manes.caffeine + caffeine + 2.9.1 + diff --git a/magic-boot/src/main/java/org/ssssssss/magicboot/constant/CertificateConstant.java b/magic-boot/src/main/java/org/ssssssss/magicboot/constant/CertificateConstant.java new file mode 100644 index 0000000..f9176f7 --- /dev/null +++ b/magic-boot/src/main/java/org/ssssssss/magicboot/constant/CertificateConstant.java @@ -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 +} diff --git a/magic-boot/src/main/java/org/ssssssss/magicboot/constant/URLConstant.java b/magic-boot/src/main/java/org/ssssssss/magicboot/constant/URLConstant.java new file mode 100644 index 0000000..1aad14e --- /dev/null +++ b/magic-boot/src/main/java/org/ssssssss/magicboot/constant/URLConstant.java @@ -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"; +} diff --git a/magic-boot/src/main/java/org/ssssssss/magicboot/entity/Filter.java b/magic-boot/src/main/java/org/ssssssss/magicboot/entity/Filter.java new file mode 100644 index 0000000..cadcde3 --- /dev/null +++ b/magic-boot/src/main/java/org/ssssssss/magicboot/entity/Filter.java @@ -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 fieldValues; + + // 构造方法 + public Filter(String operator, String fieldName, List 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 getFieldValues() { + return fieldValues; + } + + public void setFieldValues(List fieldValues) { + this.fieldValues = fieldValues; + } + + // 方便打印的 toString 方法 + @Override + public String toString() { + return "Filter{" + + "operator='" + operator + '\'' + + ", field_name='" + fieldName + '\'' + + ", field_values=" + fieldValues + + '}'; + } +} diff --git a/magic-boot/src/main/java/org/ssssssss/magicboot/utils/CaffeineCacheUtil.java b/magic-boot/src/main/java/org/ssssssss/magicboot/utils/CaffeineCacheUtil.java new file mode 100644 index 0000000..dae8be3 --- /dev/null +++ b/magic-boot/src/main/java/org/ssssssss/magicboot/utils/CaffeineCacheUtil.java @@ -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 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); + } +} diff --git a/magic-boot/src/main/java/org/ssssssss/magicboot/utils/CrmRequestUtil.java b/magic-boot/src/main/java/org/ssssssss/magicboot/utils/CrmRequestUtil.java new file mode 100644 index 0000000..ea24c7e --- /dev/null +++ b/magic-boot/src/main/java/org/ssssssss/magicboot/utils/CrmRequestUtil.java @@ -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 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; + } + +} diff --git a/magic-boot/src/main/java/org/ssssssss/magicboot/utils/PortConfig.java b/magic-boot/src/main/java/org/ssssssss/magicboot/utils/PortConfig.java new file mode 100644 index 0000000..0c8b4ab --- /dev/null +++ b/magic-boot/src/main/java/org/ssssssss/magicboot/utils/PortConfig.java @@ -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(); + } +} +