From 4ac8f8b47263b47ed5b98eea418bd7f66c817de3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E8=87=AA=E8=BE=BE?= <980324341@qq.com> Date: Tue, 8 Sep 2026 13:34:08 +0800 Subject: [PATCH] =?UTF-8?q?fix(pricetrack):=20ASIN=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E9=98=B2=E6=9C=AC=E5=9C=B0=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E8=AF=AF=E6=8F=90=E4=BA=A4+fileKey=E5=85=9C=E5=BA=95=E5=8F=8D?= =?UTF-8?q?=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/PriceTrackTaskService.java | 10 +++++- .../brand/components/BrandPriceTrackTab.vue | 35 ++++++++++--------- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/backend-java/src/main/java/com/nanri/aiimage/modules/pricetrack/service/PriceTrackTaskService.java b/backend-java/src/main/java/com/nanri/aiimage/modules/pricetrack/service/PriceTrackTaskService.java index 2d4d141a..c539f5d0 100644 --- a/backend-java/src/main/java/com/nanri/aiimage/modules/pricetrack/service/PriceTrackTaskService.java +++ b/backend-java/src/main/java/com/nanri/aiimage/modules/pricetrack/service/PriceTrackTaskService.java @@ -86,6 +86,7 @@ public class PriceTrackTaskService { private final TaskFileJobService taskFileJobService; private final TaskDistributedLockService taskDistributedLockService; private final TaskProgressLightAssembler taskProgressLightAssembler; + private final com.nanri.aiimage.modules.file.service.LocalFileStorageService localFileStorageService; private FileTaskEntity loadTaskForExecution(Long taskId) { Map cachedTasks = priceTrackTaskCacheService.getTaskCacheBatch(List.of(taskId)); @@ -1463,7 +1464,14 @@ public class PriceTrackTaskService { } File file = new File(rawPath); if (!file.isFile()) { - throw new BusinessException("ASIN file not found: " + rawPath); + // 直接路径不可读时兜底:按上传返回的 fileKey 反查服务器本地临时目录 + File resolved = localFileStorageService.findLocalSourceFile(rawPath); + if (resolved != null) { + file = resolved; + } + } + if (!file.isFile()) { + throw new BusinessException("ASIN 文件不存在或不可读: " + rawPath); } String lowerName = file.getName().toLowerCase(Locale.ROOT); if (lowerName.endsWith(".csv")) { diff --git a/frontend-vue/src/pages/brand/components/BrandPriceTrackTab.vue b/frontend-vue/src/pages/brand/components/BrandPriceTrackTab.vue index 6030796d..4b3a9d0d 100644 --- a/frontend-vue/src/pages/brand/components/BrandPriceTrackTab.vue +++ b/frontend-vue/src/pages/brand/components/BrandPriceTrackTab.vue @@ -491,29 +491,34 @@ function saveActiveLoopRunId() { // ========== 文件上传 ========== async function selectAsinFile() { const api = getPywebviewApi() + let paths: string[] = [] if (api?.select_files) { const result = await api.select_files({ filters: [{ name: 'Excel/CSV', extensions: 'xlsx,xls,csv' }], multiple: true, }) - if (result?.paths?.length) { - if (!(await passGuard(checkSelectedFiles(result.paths, { allowedExtensions: EXCEL_CSV_EXTENSIONS })))) return - asinFiles.value = result.paths - asinUploadedFiles.value = await uploadAsinPathsToJava(result.paths) - ElMessage.success(`已选择 ${result.paths.length} 个ASIN文件`) - } + if (!result?.paths?.length) return + if (!(await passGuard(checkSelectedFiles(result.paths, { allowedExtensions: EXCEL_CSV_EXTENSIONS })))) return + paths = result.paths + } else if (api?.select_brand_xlsx_files) { + const selected = await api.select_brand_xlsx_files() + if (!selected?.length) return + if (!(await passGuard(checkSelectedFiles(selected, { allowedExtensions: EXCEL_CSV_EXTENSIONS })))) return + paths = selected + } else { + ElMessage.warning('当前环境不支持文件选择,请在本地客户端中打开') return } - if (api?.select_brand_xlsx_files) { - const paths = await api.select_brand_xlsx_files() - if (!paths?.length) return - if (!(await passGuard(checkSelectedFiles(paths, { allowedExtensions: EXCEL_CSV_EXTENSIONS })))) return + try { asinFiles.value = paths asinUploadedFiles.value = await uploadAsinPathsToJava(paths) ElMessage.success(`已选择 ${paths.length} 个ASIN文件`) - return + } catch (error) { + // 上传失败时清空选择,避免本地路径残留被当作服务器路径提交给 Java + asinFiles.value = [] + asinUploadedFiles.value = [] + ElMessage.error(error instanceof Error ? error.message : '选择失败') } - ElMessage.warning('当前环境不支持文件选择,请在本地客户端中打开') } async function selectAsinFolder() { @@ -564,10 +569,8 @@ async function uploadAsinPathsToJava(paths: Array item.localPath).filter((path) => !!path) - } - return asinFiles.value + // 只提交上传成功后的服务器本地路径;未上传成功时不兜底本地路径(服务器无法读取) + return asinUploadedFiles.value.map((item) => item.localPath).filter((path) => !!path) } function resolveCountryCodesForRequest() {