feat(erp):优化品牌商标缓存与方舟API调用逻辑

- 品牌商标缓存服务增加一天内去重保存逻辑- 方舟API调用支持TOKEN失效自动重新注册
- 增加证书验证失败重试机制
- 修复代理池API签名密钥
-优化商标检查面板完成状态计算逻辑- 更新应用配置注释格式
This commit is contained in:
2025-11-17 14:34:08 +08:00
parent 937a84bb81
commit d29d4d69da
9 changed files with 112 additions and 24 deletions

View File

@@ -30,11 +30,22 @@ public class BrandTrademarkCacheServiceImpl implements BrandTrademarkCacheServic
@Override
public void saveResults(Map<String, Boolean> results) {
LocalDateTime cutoffTime = LocalDateTime.now().minusDays(1);
results.forEach((brand, registered) -> {
BrandTrademarkCacheEntity entity = new BrandTrademarkCacheEntity();
entity.setBrand(brand);
entity.setRegistered(registered);
repository.save(entity);
repository.findByBrandAndCreatedAtAfter(brand, cutoffTime)
.ifPresentOrElse(
existing -> {
existing.setRegistered(registered);
existing.setCreatedAt(LocalDateTime.now());
repository.save(existing);
},
() -> {
BrandTrademarkCacheEntity entity = new BrandTrademarkCacheEntity();
entity.setBrand(brand);
entity.setRegistered(registered);
repository.save(entity);
}
);
});
}

View File

@@ -14,6 +14,7 @@ import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.ResourceAccessException;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
@@ -97,10 +98,11 @@ public class FangzhouApiServiceImpl implements IFangzhouApiService {
String result = restTemplate.postForObject(FANGZHOU_API_URL, requestEntity, String.class);
JsonNode json = objectMapper.readTree(result);
// 处理 Token 过期,自动刷新重试
if (json.get("S").asInt() == TOKEN_EXPIRED_CODE) {
logger.info("Token 过期,刷新后重试");
String newToken = refreshToken();
// 处理 Token 失效
int statusCode = json.get("S").asInt();
if (statusCode == TOKEN_EXPIRED_CODE || statusCode == -1002) {
String newToken = statusCode == -1002 ? getToken() : refreshToken();
logger.info("Token 失效({}), {}后重试", statusCode, statusCode == -1002 ? "重新注册" : "刷新");
formData.set("t", newToken);
formData.set("s", md5(ts + data + API_SECRET));
requestEntity = new HttpEntity<>(formData, headers);
@@ -109,6 +111,27 @@ public class FangzhouApiServiceImpl implements IFangzhouApiService {
}
return json;
} catch (ResourceAccessException e) {
logger.warn("证书验证失败,尝试重新注册: {}", e.getMessage());
String newToken = refreshToken();
long ts = System.currentTimeMillis();
MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();
formData.add("c", command);
formData.add("d", data);
formData.add("t", newToken);
formData.add("s", md5(ts + data + API_SECRET));
formData.add("ts", String.valueOf(ts));
formData.add("website", "1");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(formData, headers);
try {
String result = restTemplate.postForObject(FANGZHOU_API_URL, requestEntity, String.class);
return objectMapper.readTree(result);
} catch (Exception ex) {
logger.error("重试失败", ex);
throw new RuntimeException("调用 API 失败: " + ex.getMessage());
}
} catch (Exception e) {
logger.error("调用方舟精选 API 失败", e);
throw new RuntimeException("调用 API 失败: " + e.getMessage());
@@ -137,10 +160,11 @@ public class FangzhouApiServiceImpl implements IFangzhouApiService {
String result = restTemplate.postForObject(FANGZHOU_API_URL, requestEntity, String.class);
JsonNode json = objectMapper.readTree(result);
// 处理 Token 过期
if (json.get("S").asInt() == TOKEN_EXPIRED_CODE) {
logger.info("Token 过期,刷新后重试");
String newToken = refreshToken();
// 处理 Token 失效
int statusCode = json.get("S").asInt();
if (statusCode == TOKEN_EXPIRED_CODE || statusCode == -1002) {
String newToken = statusCode == -1002 ? getToken() : refreshToken();
logger.info("Token 失效({}), {}后重试", statusCode, statusCode == -1002 ? "重新注册" : "刷新");
formData.set("t", newToken);
formData.set("s", md5(ts + data + API_SECRET));
requestEntity = new HttpEntity<>(formData, headers);
@@ -149,6 +173,29 @@ public class FangzhouApiServiceImpl implements IFangzhouApiService {
}
return json;
} catch (ResourceAccessException e) {
logger.warn("证书验证失败,尝试重新注册: {}", e.getMessage());
String newToken = refreshToken();
String data = String.format("{\"name\":\"%s\",\"type\":1}", file.getOriginalFilename());
long ts = System.currentTimeMillis();
MultiValueMap<String, Object> formData = new LinkedMultiValueMap<>();
formData.add("c", "Create");
formData.add("t", newToken);
formData.add("ts", ts);
formData.add("d", data);
formData.add("s", md5(ts + data + API_SECRET));
formData.add("website", "1");
formData.add("files", file.getResource());
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(formData, headers);
try {
String result = restTemplate.postForObject(FANGZHOU_API_URL, requestEntity, String.class);
return objectMapper.readTree(result);
} catch (Exception ex) {
logger.error("重试失败", ex);
throw new RuntimeException("上传文件失败: " + ex.getMessage());
}
} catch (Exception e) {
logger.error("上传文件失败", e);
throw new RuntimeException("上传文件失败: " + e.getMessage());

View File

@@ -11,7 +11,7 @@ import java.util.List;
@Component
public class ProxyPool {
private static final String API_URL = "http://api.tianqiip.com/getip?secret=y0thbcco1rgxn9e9&num=%d&type=txt&port=2&time=3&mr=1&sign=a8a42f3cd3f22a7fbf84530deb91c1d8";
private static final String API_URL = "http://api.tianqiip.com/getip?secret=y0thbcco1rgxn9e9&num=%d&type=txt&port=2&time=3&mr=1&sign=9be780c7e27aea815f1e0874446b9e35";
/**
* 获取一个代理IP

View File

@@ -48,7 +48,7 @@ api:
server:
# 主服务器API配置
base-url: "http://8.138.23.49:8085"
# base-url: "http://192.168.1.89:8085"
#base-url: "http://192.168.1.89:8085"
paths:
monitor: "/monitor/client/api"
login: "/monitor/account/login"