张洋洋
2025-02-20 4fd3f760a30adf230f85b3e82d9a72af407266e7
src/main/java/com/se/simu/service/Impl/ProjectRelatedServiceImpl.java
@@ -7,19 +7,18 @@
import cn.hutool.crypto.asymmetric.RSA;
import com.alibaba.fastjson.JSONObject;
import com.se.simu.constant.CacheConstants;
import com.se.simu.constant.RedisCache;
import com.se.simu.domain.EntityTypeInfo;
import com.se.simu.domain.LoginParams;
import com.se.simu.helper.CaffeineHelper;
import com.se.simu.service.ProjectRelatedService;
import com.se.simu.utils.CustomWebClient;
import com.se.simu.utils.EntityLibraryUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;
import javax.annotation.Resource;
import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.PublicKey;
@@ -27,18 +26,11 @@
import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
@Slf4j
@Service
public class ProjectRelatedServiceImpl implements ProjectRelatedService {
    @Resource
    private RedisCache redisCache;
    @Resource
    public RedisTemplate redisTemplate;
    // 公钥地址
@@ -75,8 +67,8 @@
                    log.info("statusCode = " + statusCode);
                    String data = postResponseJson.getString("data");
                    // 缓存data,并设置1小时有效期
                    redisCache.deleteObject(CacheConstants.USER_CACHE_KEY + "rsa_data_set");
                    redisCache.setCacheObject(CacheConstants.USER_CACHE_KEY + "rsa_data_set", data, 1, TimeUnit.HOURS);
                    CaffeineHelper.remove(CacheConstants.USER_CACHE_KEY + "rsa_data_set");
                    CaffeineHelper.put(CacheConstants.USER_CACHE_KEY + "rsa_data_set", data);
                    log.info("publicKey = " + data);
                } catch (Exception e) {
                    log.info("Failed to parse JSON: " + e.getMessage());
@@ -97,15 +89,20 @@
    @Override
    public Object loginEntity(LoginParams loginParams) {
        // 判断redis中缓存是否存在(过期)
        Boolean isExists = redisCache.hasKey(CacheConstants.USER_CACHE_KEY + "entity_db_response");
        if (isExists) {
            return JSONObject.parseObject(redisCache.getCacheObject(CacheConstants.USER_CACHE_KEY + "entity_db_response"));
        boolean isExists = Objects.isNull(CaffeineHelper.get(CacheConstants.USER_CACHE_KEY + "entity_db_token"));
        if (!isExists) {
            return JSONObject.parseObject((String) CaffeineHelper.get(CacheConstants.USER_CACHE_KEY + "entity_db_response"));
        } else {
            // 清除所有缓存
            CaffeineHelper.remove(CacheConstants.USER_CACHE_KEY + "entity_db_response");
            CaffeineHelper.remove(CacheConstants.USER_CACHE_KEY + "EntityPublicKey");
            CaffeineHelper.remove(CacheConstants.USER_CACHE_KEY + "entity_db_token");
            CaffeineHelper.remove(CacheConstants.USER_CACHE_KEY + "rsa_data_set");
        }
        // 设置请求体
        // 获取私钥和公钥,长度必须是16、24或32
        String publicKey = redisCache.getCacheObject(CacheConstants.USER_CACHE_KEY + "rsa_data_set");
        String publicKey = (String) CaffeineHelper.get(CacheConstants.USER_CACHE_KEY + "rsa_data_set");
        // 假设从Redis中获取到用户名,判断
        if (!StringUtils.isNotBlank(publicKey)) {
        if (!StringUtils.isNotBlank(publicKey) && Objects.isNull(publicKey)) {
            // 缓存中没有用户名,则进行登录
            getPublicKey();
            log.info("调用了登录获取用户名方法 $= ");
@@ -117,7 +114,7 @@
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        publicKey = redisCache.getCacheObject(CacheConstants.USER_CACHE_KEY + "rsa_data_set");
        publicKey = (String) CaffeineHelper.get(CacheConstants.USER_CACHE_KEY + "rsa_data_set");
        log.info("publicKey = " + publicKey);
        // 公钥加密
        AsymmetricCrypto rsa = SecureUtil.rsa(null, publicKey);
@@ -140,12 +137,13 @@
                // 登录成功后,获取data
                String data = JSONObject.parseObject(response).getString("data");
                String token = JSONObject.parseObject(data).getString("token");
                log.info("token = " + token);
                // 设置data到Redis中
                redisCache.deleteObject(CacheConstants.USER_CACHE_KEY + "entity_db_response");
                redisCache.setCacheObject(CacheConstants.USER_CACHE_KEY + "entity_db_response", response, 1, TimeUnit.HOURS);
                CaffeineHelper.remove(CacheConstants.USER_CACHE_KEY + "entity_db_response");
                CaffeineHelper.put(CacheConstants.USER_CACHE_KEY + "entity_db_response", response);
                // 设置data到Redis中
                redisCache.deleteObject(CacheConstants.USER_CACHE_KEY + "entity_db_token");
                redisCache.setCacheObject(CacheConstants.USER_CACHE_KEY + "entity_db_token", token, 1, TimeUnit.HOURS);
                CaffeineHelper.remove(CacheConstants.USER_CACHE_KEY + "entity_db_token");
                CaffeineHelper.put(CacheConstants.USER_CACHE_KEY + "entity_db_token", token);
            } else {
                // 登录失败
                log.error("登录失败 $= " + response);
@@ -225,9 +223,15 @@
    @Override
    public Object getEntityPublicKey() {
        // 判断redis中缓存是否存在(过期)
        Boolean isExists = redisCache.hasKey(CacheConstants.USER_CACHE_KEY + "EntityPublicKey");
        if (isExists) {
            return JSONObject.parseObject(redisCache.getCacheObject(CacheConstants.USER_CACHE_KEY + "EntityPublicKey"));
        boolean isExists = Objects.isNull(CaffeineHelper.get(CacheConstants.USER_CACHE_KEY + "EntityPublicKey"));
        if (!isExists) {
            return JSONObject.parseObject((String) CaffeineHelper.get(CacheConstants.USER_CACHE_KEY + "EntityPublicKey"));
        } else {
            // 清除所有缓存
            CaffeineHelper.remove(CacheConstants.USER_CACHE_KEY + "entity_db_response");
            CaffeineHelper.remove(CacheConstants.USER_CACHE_KEY + "EntityPublicKey");
            CaffeineHelper.remove(CacheConstants.USER_CACHE_KEY + "entity_db_token");
            CaffeineHelper.remove(CacheConstants.USER_CACHE_KEY + "rsa_data_set");
        }
        HashMap<String, String> headers = new HashMap<>();
        headers.put("Content-Type", "application/json");
@@ -242,8 +246,8 @@
                    log.info("statusCode = " + statusCode);
                    String data = postResponseJson.getString("data");
                    // 缓存data,并设置1小时有效期
                    redisCache.deleteObject(CacheConstants.USER_CACHE_KEY + "EntityPublicKey");
                    redisCache.setCacheObject(CacheConstants.USER_CACHE_KEY + "EntityPublicKey", response, 1, TimeUnit.HOURS);
                    CaffeineHelper.remove(CacheConstants.USER_CACHE_KEY + "EntityPublicKey");
                    CaffeineHelper.put(CacheConstants.USER_CACHE_KEY + "EntityPublicKey", response);
                    log.info("EntityPublicKey = " + data);
                } catch (Exception e) {
                    log.info("Failed to parse JSON: " + e.getMessage());
@@ -265,7 +269,7 @@
    public Object getDbLits() {
        HashMap<String, String> headers = new HashMap<>();
        headers.put("Content-Type", "application/json");
        String token = redisCache.getCacheObject(CacheConstants.USER_CACHE_KEY + "entity_db_token");
        String token = (String) CaffeineHelper.get(CacheConstants.USER_CACHE_KEY + "entity_db_token");
        log.info("token = " + token);
        // 添加form参数
        HashMap<String, Object> params = new HashMap<>();
@@ -282,8 +286,8 @@
                    log.info("statusCode = " + statusCode);
                    String data = postResponseJson.getString("data");
                    // 缓存data,并设置1小时有效期
                    redisCache.deleteObject(CacheConstants.USER_CACHE_KEY + "EntityDbNameList");
                    redisCache.setCacheObject(CacheConstants.USER_CACHE_KEY + "EntityDbNameList", response, 1, TimeUnit.HOURS);
                    CaffeineHelper.remove(CacheConstants.USER_CACHE_KEY + "EntityDbNameList");
                    CaffeineHelper.put(CacheConstants.USER_CACHE_KEY + "EntityDbNameList", response);
                    log.info("EntityDbNameList = " + data);
                } catch (Exception e) {
                    log.info("Failed to parse JSON: " + e.getMessage());
@@ -299,7 +303,20 @@
    public Object getEntityTypeInfo(EntityTypeInfo entityTypeInfo) {
        HashMap<String, String> headers = new HashMap<>();
        headers.put("Content-Type", "application/json");
        String token = redisCache.getCacheObject(CacheConstants.USER_CACHE_KEY + "entity_db_token");
        String token;
        // 判断redis中缓存是否存在(过期)
        boolean isExists = Objects.isNull(CaffeineHelper.get(CacheConstants.USER_CACHE_KEY + "entity_db_token"));
        if (!isExists) {
            token = (String) CaffeineHelper.get(CacheConstants.USER_CACHE_KEY + "entity_db_token");
        } else {
            try {
                token = EntityLibraryUtils.login();
                CaffeineHelper.remove(CacheConstants.USER_CACHE_KEY + "entity_db_token");
                CaffeineHelper.put(CacheConstants.USER_CACHE_KEY + "entity_db_token", token);
            }catch (Exception e){
                return "登录失败!";
            }
        }
        log.info("token = " + token);
        // 添加form参数
        HashMap<String, Object> params = new HashMap<>();
@@ -308,7 +325,59 @@
        params.put("containCount", true);
        params.put("count", Objects.nonNull(entityTypeInfo.getCount()) ? entityTypeInfo.getCount() : 20);
        params.put("dbid", Objects.nonNull(entityTypeInfo.getDbid()) ? entityTypeInfo.getDbid() : "85257774fdb64e5f99f6778696cad02a");
        params.put("layerid", "f6ff4412-4886-4c4b-83f7-13de24ee8353");
        params.put("layerid", Objects.nonNull(entityTypeInfo.getLayerid()) ? entityTypeInfo.getLayerid() : "8208c5be-adc1-4e7b-b952-37362e0bef32");
        params.put("like", "");
        params.put("querytype", "entity");
        CompletableFuture<String> postResponse = CustomWebClient.postAsFuture(queryUrl, params, headers, String.class);
        // 异步处理响应
        postResponse.thenAccept(response -> {
            log.info("response: {}", response);
            if (response.contains("code")) {
                try {
                    JSONObject postResponseJson = JSONObject.parseObject(response);
                    int statusCode = postResponseJson.getIntValue("code");
                    log.info("statusCode = " + statusCode);
                    String data = postResponseJson.getString("data");
                    log.info("getEntityTypeInfo = " + data);
                } catch (Exception e) {
                    log.info("Failed to parse JSON: " + e.getMessage());
                }
            } else {
                log.info("No 'code' field in the response: " + response);
            }
        });
        return JSONObject.parseObject(postResponse.join());
    }
    @Override
    public Object getEntityPipeInfo(EntityTypeInfo entityTypeInfo) {
        HashMap<String, String> headers = new HashMap<>();
        headers.put("Content-Type", "application/json");
        String token;
        // 判断redis中缓存是否存在(过期)
        boolean isExists = Objects.isNull(CaffeineHelper.get(CacheConstants.USER_CACHE_KEY + "entity_db_token"));
        if (!isExists) {
            token = (String) CaffeineHelper.get(CacheConstants.USER_CACHE_KEY + "entity_db_token");
        } else {
            // 获取token
            LoginParams loginParams = new LoginParams();
            loginParams.setUserid("admin");
            loginParams.setPassword("admin");
            loginEntity(loginParams);
            token = (String) CaffeineHelper.get(CacheConstants.USER_CACHE_KEY + "entity_db_token");
        }
        log.info("token = " + token);
        // 添加form参数
        HashMap<String, Object> params = new HashMap<>();
        // e7e2af87096c45e0a14c0a4855cb0b90
        params.put("token", token);
        params.put("start", Objects.nonNull(entityTypeInfo.getStart()) ? entityTypeInfo.getStart() : 1);
        params.put("containCount", true);
        params.put("count", Objects.nonNull(entityTypeInfo.getCount()) ? entityTypeInfo.getCount() : 20);
        params.put("dbid", Objects.nonNull(entityTypeInfo.getDbid()) ? entityTypeInfo.getDbid() : "85257774fdb64e5f99f6778696cad02a");
        params.put("layerid", Objects.nonNull(entityTypeInfo.getLayerid()) ? entityTypeInfo.getLayerid() : "1e677d48-8dff-4975-b9a0-c16500193629");
        params.put("like", "");
        params.put("querytype", "entity");