From 7e065c1a0be46f6068b6cd75bbc47b6d9aef2c25 Mon Sep 17 00:00:00 2001
From: zhangzijienbplus <17738440858@163.com>
Date: Mon, 27 Oct 2025 13:34:25 +0800
Subject: [PATCH] =?UTF-8?q?feat(erp):=20=E5=AE=9E=E7=8E=B0=E6=8C=89?=
=?UTF-8?q?=E7=94=A8=E6=88=B7=E5=9C=B0=E5=8C=BA=E9=9A=94=E7=A6=BB=E7=9A=84?=
=?UTF-8?q?=E6=9C=80=E6=96=B0=E4=BA=A7=E5=93=81=E6=9F=A5=E8=AF=A2=E9=80=BB?=
=?UTF-8?q?=E8=BE=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 修改AmazonController以支持按用户和区域筛选最新会话数据
- 更新AmazonProductRepository中的findLatestProducts方法,增加region参数实现数据隔离
-优化AmazonScrapingServiceImpl的数据处理流程,增强缓存清理机制
- 调整GenmaiServiceImpl的token验证逻辑并改进Chrome启动配置- 升级系统版本至2.5.5并完善相关依赖管理
- 改进前端设置对话框中关于缓存清理描述的信息准确性
-重构SystemController接口,移除不必要的用户名参数传递- 强化GenmaiAccountController和服务层的安全校验逻辑
---
.../components/common/SettingsDialog.vue | 4 +-
erp_client_sb/pom.xml | 2 +-
.../erp/controller/AmazonController.java | 12 ++++-
.../erp/controller/SystemController.java | 10 ++--
.../repository/AmazonProductRepository.java | 6 +--
.../com/tashow/erp/service/CacheService.java | 49 ++++++-------------
.../impl/AmazonScrapingServiceImpl.java | 10 +++-
.../erp/service/impl/GenmaiServiceImpl.java | 24 +++++----
.../tool/GenmaiAccountController.java | 1 +
.../impl/GenmaiAccountServiceImpl.java | 6 ++-
10 files changed, 62 insertions(+), 62 deletions(-)
diff --git a/electron-vue-template/src/renderer/components/common/SettingsDialog.vue b/electron-vue-template/src/renderer/components/common/SettingsDialog.vue
index 7a14d09..e2511d8 100644
--- a/electron-vue-template/src/renderer/components/common/SettingsDialog.vue
+++ b/electron-vue-template/src/renderer/components/common/SettingsDialog.vue
@@ -178,7 +178,7 @@ async function resetAllSettings() {
async function handleClearCache() {
try {
await ElMessageBox.confirm(
- '确定要清理客户端缓存吗?将清除所有缓存数据、更新文件及相关状态(不影响登录状态)',
+ '确定要清理客户端缓存吗?将清除本地设备的所有缓存数据、更新文件及相关状态(不影响登录状态)',
'确认清理',
{
confirmButtonText: '确定',
@@ -503,7 +503,7 @@ onMounted(() => {
-
清理应用缓存数据,不影响登录状态
+
清理本地设备的所有缓存数据,不影响登录状态
com.tashow.erp
erp_client_sb
- 2.5.3
+ 2.5.5
erp_client_sb
erp客户端
diff --git a/erp_client_sb/src/main/java/com/tashow/erp/controller/AmazonController.java b/erp_client_sb/src/main/java/com/tashow/erp/controller/AmazonController.java
index 638ca78..999c70c 100644
--- a/erp_client_sb/src/main/java/com/tashow/erp/controller/AmazonController.java
+++ b/erp_client_sb/src/main/java/com/tashow/erp/controller/AmazonController.java
@@ -42,7 +42,17 @@ public class AmazonController {
@GetMapping("/products/latest")
public JsonData getLatestProducts(HttpServletRequest request) {
String username = JwtUtil.getUsernameFromRequest(request);
- List products = amazonProductRepository.findLatestProducts(username);
+ List recentSessions = amazonProductRepository.findRecentSessionIds(org.springframework.data.domain.PageRequest.of(0, 1));
+ String latestSession = recentSessions.stream()
+ .filter(sid -> sid != null && sid.startsWith(username + "#"))
+ .findFirst()
+ .orElse("");
+
+ if (latestSession.isEmpty()) {
+ return JsonData.buildSuccess(Map.of("products", List.of(), "total", 0));
+ }
+
+ List products = amazonProductRepository.findBySessionIdOrderByCreatedAtDesc(latestSession);
return JsonData.buildSuccess(Map.of("products", products, "total", products.size()));
}
diff --git a/erp_client_sb/src/main/java/com/tashow/erp/controller/SystemController.java b/erp_client_sb/src/main/java/com/tashow/erp/controller/SystemController.java
index 7665989..c0d7d8f 100644
--- a/erp_client_sb/src/main/java/com/tashow/erp/controller/SystemController.java
+++ b/erp_client_sb/src/main/java/com/tashow/erp/controller/SystemController.java
@@ -83,9 +83,10 @@ public class SystemController {
}
@PostMapping("/genmai/open")
- public JsonData openGenmaiWebsite(@RequestParam(required = false) Long accountId) {
+ public JsonData openGenmaiWebsite(@RequestParam(required = false) Long accountId, HttpServletRequest request) {
try {
- genmaiService.openGenmaiWebsite(accountId);
+ String username = com.tashow.erp.utils.JwtUtil.getUsernameFromRequest(request);
+ genmaiService.openGenmaiWebsite(accountId, username);
return JsonData.buildSuccess("跟卖精灵已打开");
} catch (Exception e) {
logger.error("打开跟卖精灵失败", e);
@@ -130,9 +131,8 @@ public class SystemController {
}
@PostMapping("/cache/clear")
- public JsonData clearCache(HttpServletRequest request) {
- String username = com.tashow.erp.utils.JwtUtil.getUsernameFromRequest(request);
- cacheService.clearCache(username);
+ public JsonData clearCache() {
+ cacheService.clearCache();
return JsonData.buildSuccess("缓存清理成功");
}
}
diff --git a/erp_client_sb/src/main/java/com/tashow/erp/repository/AmazonProductRepository.java b/erp_client_sb/src/main/java/com/tashow/erp/repository/AmazonProductRepository.java
index d2cc5b4..6eb0d3b 100644
--- a/erp_client_sb/src/main/java/com/tashow/erp/repository/AmazonProductRepository.java
+++ b/erp_client_sb/src/main/java/com/tashow/erp/repository/AmazonProductRepository.java
@@ -64,10 +64,10 @@ public interface AmazonProductRepository extends JpaRepository findLatestProducts();
/**
- * 获取指定用户最新会话的产品数据(按用户隔离)
+ * 获取指定用户最新会话的产品数据(按用户和地区隔离)
*/
- @Query(value = "SELECT * FROM amazon_products WHERE session_id = (SELECT session_id FROM amazon_products WHERE session_id LIKE :username || '#%' GROUP BY session_id ORDER BY session_id DESC LIMIT 1) ORDER BY updated_at ", nativeQuery = true)
- List findLatestProducts(@Param("username") String username);
+ @Query(value = "SELECT * FROM amazon_products WHERE session_id = (SELECT session_id FROM amazon_products WHERE session_id LIKE :username || '#%' AND region = :region GROUP BY session_id ORDER BY session_id DESC LIMIT 1) ORDER BY updated_at ", nativeQuery = true)
+ List findLatestProducts(@Param("username") String username, @Param("region") String region);
/**
* 删除指定ASIN在指定时间后的数据(用于清理12小时内重复)
diff --git a/erp_client_sb/src/main/java/com/tashow/erp/service/CacheService.java b/erp_client_sb/src/main/java/com/tashow/erp/service/CacheService.java
index 34a72a6..23bcd1e 100644
--- a/erp_client_sb/src/main/java/com/tashow/erp/service/CacheService.java
+++ b/erp_client_sb/src/main/java/com/tashow/erp/service/CacheService.java
@@ -1,9 +1,6 @@
package com.tashow.erp.service;
import com.tashow.erp.entity.AuthTokenEntity;
-import com.tashow.erp.entity.RakutenProductEntity;
-import com.tashow.erp.entity.AmazonProductEntity;
-import com.tashow.erp.entity.BanmaOrderEntity;
import com.tashow.erp.repository.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -11,7 +8,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
-import java.util.List;
import java.util.Optional;
@Service
@@ -49,39 +45,26 @@ public class CacheService {
}
@Transactional
- public void clearCache(String username) {
- if (username == null || username.isEmpty()) {
- logger.warn("尝试清理缓存但未提供用户名,操作已跳过");
- return;
- }
+ public void clearCache() {
+
- logger.info("开始清理用户缓存: {}", username);
+ // 清理所有产品数据
+ rakutenProductRepository.deleteAll();
+
- // 清理当前用户的 Rakuten 产品数据
- List rakutenProducts = rakutenProductRepository.findAll();
- List userRakutenProducts = rakutenProducts.stream()
- .filter(p -> p.getSessionId() != null && p.getSessionId().startsWith(username + "#"))
- .toList();
- rakutenProductRepository.deleteAll(userRakutenProducts);
- logger.info("已清理 {} 条 Rakuten 产品数据", userRakutenProducts.size());
+ amazonProductRepository.deleteAll();
+
- // 清理当前用户的 Amazon 产品数据
- List amazonProducts = amazonProductRepository.findAll();
- List userAmazonProducts = amazonProducts.stream()
- .filter(p -> p.getSessionId() != null && p.getSessionId().startsWith(username + "#"))
- .toList();
- amazonProductRepository.deleteAll(userAmazonProducts);
- logger.info("已清理 {} 条 Amazon 产品数据", userAmazonProducts.size());
+ alibaba1688ProductRepository.deleteAll();
+
- // 清理当前用户的 Banma 订单数据
- List banmaOrders = banmaOrderRepository.findAll();
- List userBanmaOrders = banmaOrders.stream()
- .filter(o -> o.getSessionId() != null && o.getSessionId().startsWith(username + "#"))
- .toList();
- banmaOrderRepository.deleteAll(userBanmaOrders);
- logger.info("已清理 {} 条 Banma 订单数据", userBanmaOrders.size());
-
- logger.info("用户 {} 的缓存清理完成", username);
+ // 清理所有订单数据
+ banmaOrderRepository.deleteAll();
+
+ zebraOrderRepository.deleteAll();
+ // 清理通用缓存和更新状态
+ cacheDataRepository.deleteAll();
+
}
}
diff --git a/erp_client_sb/src/main/java/com/tashow/erp/service/impl/AmazonScrapingServiceImpl.java b/erp_client_sb/src/main/java/com/tashow/erp/service/impl/AmazonScrapingServiceImpl.java
index 621415e..3b27f06 100644
--- a/erp_client_sb/src/main/java/com/tashow/erp/service/impl/AmazonScrapingServiceImpl.java
+++ b/erp_client_sb/src/main/java/com/tashow/erp/service/impl/AmazonScrapingServiceImpl.java
@@ -61,7 +61,6 @@ public class AmazonScrapingServiceImpl implements AmazonScrapingService, PagePro
if (isEmpty(seller)) {
seller = html.xpath("//span[@class='a-size-small offer-display-feature-text-message']/text()").toString();
}
-
// 关键数据为空时重试
if (isEmpty(price) && isEmpty(seller)) {
throw new RuntimeException("Retry this page");
@@ -94,6 +93,8 @@ public class AmazonScrapingServiceImpl implements AmazonScrapingService, PagePro
String sessionId = (batchId != null) ? batchId : "SINGLE_" + UUID.randomUUID();
LocalDateTime batchTime = LocalDateTime.now();
+ resultCache.clear();
+
// 第一步:清理1小时前的所有旧数据
amazonProductRepository.deleteAllDataBefore(LocalDateTime.now().minusHours(1));
@@ -110,7 +111,12 @@ public class AmazonScrapingServiceImpl implements AmazonScrapingService, PagePro
Optional cached = amazonProductRepository.findByAsinAndRegion(cleanAsin, region);
if (cached.isPresent() && !isEmpty(cached.get().getPrice()) && !isEmpty(cached.get().getSeller())) {
- AmazonProductEntity entity = cached.get();
+ AmazonProductEntity cachedEntity = cached.get();
+ AmazonProductEntity entity = new AmazonProductEntity();
+ entity.setAsin(cachedEntity.getAsin());
+ entity.setRegion(cachedEntity.getRegion());
+ entity.setPrice(cachedEntity.getPrice());
+ entity.setSeller(cachedEntity.getSeller());
entity.setSessionId(sessionId);
entity.setUpdatedAt(LocalDateTime.now());
amazonProductRepository.save(entity);
diff --git a/erp_client_sb/src/main/java/com/tashow/erp/service/impl/GenmaiServiceImpl.java b/erp_client_sb/src/main/java/com/tashow/erp/service/impl/GenmaiServiceImpl.java
index df3eff6..2956b14 100644
--- a/erp_client_sb/src/main/java/com/tashow/erp/service/impl/GenmaiServiceImpl.java
+++ b/erp_client_sb/src/main/java/com/tashow/erp/service/impl/GenmaiServiceImpl.java
@@ -19,17 +19,17 @@ public class GenmaiServiceImpl {
private final RestTemplate restTemplate = new RestTemplate();
private final ObjectMapper objectMapper = new ObjectMapper();
- public void openGenmaiWebsite(Long accountId) throws Exception {
- String token = getAndValidateToken(accountId);
+ public void openGenmaiWebsite(Long accountId, String username) throws Exception {
+ String token = getAndValidateToken(accountId, username);
Runtime.getRuntime().exec("taskkill /f /im chrome.exe");
Thread.sleep(1000);
ChromeOptions options = new ChromeOptions();
- String username = System.getProperty("user.name");
- char firstChar = username.charAt(0);
+ String systemUser = System.getProperty("user.name");
+ char firstChar = systemUser.charAt(0);
char flipped = Character.isUpperCase(firstChar) ? Character.toLowerCase(firstChar) : Character.toUpperCase(firstChar);
String chromeUserData = System.getProperty("user.home")
- .replace(username, UrlUtils.urlEncode(flipped + username.substring(1)))
+ .replace(systemUser, UrlUtils.urlEncode(flipped + systemUser.substring(1)))
+ "\\AppData\\Local\\Google\\Chrome\\User Data";
options.addArguments("user-data-dir=" + chromeUserData.toLowerCase(), "profile-directory=Default");
@@ -40,8 +40,9 @@ public class GenmaiServiceImpl {
}
@SuppressWarnings("unchecked")
- private String getAndValidateToken(Long accountId) {
- Map resp = restTemplate.getForObject(serverApiUrl + "/tool/genmai/accounts", Map.class);
+ private String getAndValidateToken(Long accountId, String username) {
+ String url = serverApiUrl + "/tool/genmai/accounts?name=" + username;
+ Map resp = restTemplate.getForObject(url, Map.class);
List