diff --git a/admin-frontend-vue/diag-role-price.mjs b/admin-frontend-vue/diag-role-price.mjs deleted file mode 100644 index c39bbb6e..00000000 --- a/admin-frontend-vue/diag-role-price.mjs +++ /dev/null @@ -1,42 +0,0 @@ -import { chromium } from '@playwright/test' -const browser = await chromium.launch({ channel: 'msedge', headless: true }) -const page = await browser.newPage({ viewport: { width: 1440, height: 900 } }) -const errors = [] -page.on('pageerror', (e) => errors.push('pageerror: ' + e.message)) -page.on('console', (m) => { if (m.type() === 'error') errors.push('console: ' + m.text().slice(0, 200)) }) -const userReqs = [] -page.on('request', (r) => { if (r.url().includes('/api/admin/users')) userReqs.push(r.url()) }) -await page.goto('http://localhost:5174/admin-vue/', { waitUntil: 'networkidle' }) -await page.waitForTimeout(800) -if (await page.locator('#loginUsername').isVisible().catch(() => false)) { - await page.locator('#loginUsername').fill('admin') - await page.locator('#loginPassword').fill('admin123') - await page.locator('.btn-login').click() - await page.waitForSelector('.admin-shell', { timeout: 25000 }).catch(() => {}) - await page.waitForTimeout(1500) -} -await page.goto('http://localhost:5174/admin-vue/account/users', { waitUntil: 'domcontentloaded' }) -await page.waitForTimeout(2200) -const selects = page.locator('.users-filter-row .el-select') -console.log('筛选行 el-select 数量:', await selects.count()) -await selects.nth(1).click() -await page.waitForTimeout(700) -const items = page.locator('.el-select-dropdown__item:visible') -console.log('选项:', JSON.stringify(await items.allTextContents())) -await items.filter({ hasText: /^管理员$/ }).first().click() -await page.waitForTimeout(1200) -console.log('change 后请求:', JSON.stringify(userReqs.slice(-1))) -await page.locator('.users-filter-row button.btn').first().click() -await page.waitForTimeout(2500) -console.log('点查询后请求:', JSON.stringify(userReqs.slice(-1))) -console.log('选中显示:', (await selects.nth(1).textContent())?.trim()) -console.log('最近 users 请求:', JSON.stringify(userReqs.slice(-2))) -const roles = await page.locator('.table-scroll tbody tr td').nth(2).textContent().catch(() => '?') -console.log('第一行角色:', roles?.trim()) -await page.goto('http://localhost:5174/admin-vue/asin-center/skip-price', { waitUntil: 'domcontentloaded' }) -await page.waitForTimeout(2000) -await page.locator('.price-range-row input').first().fill('1.15') -await page.locator('.skip-filter-row button.btn').first().click() -await page.waitForTimeout(2500) -console.log('errors:', JSON.stringify(errors)) -await browser.close() diff --git a/admin-frontend-vue/rescan.tmp.mjs b/admin-frontend-vue/rescan.tmp.mjs deleted file mode 100644 index 3830ff87..00000000 --- a/admin-frontend-vue/rescan.tmp.mjs +++ /dev/null @@ -1,21 +0,0 @@ -import { chromium } from '@playwright/test' -const BASE = 'http://127.0.0.1:5174' -const browser = await chromium.launch({ channel: 'msedge', headless: true }) -const page = await browser.newPage({ locale: 'zh-CN' }) -await page.goto(`${BASE}/admin-vue/login`) -await page.waitForSelector('#loginUsername', { timeout: 20000 }) -await page.fill('#loginUsername', 'admin') -await page.fill('#loginPassword', 'admin123') -await page.click('button.btn-login') -await page.waitForTimeout(2500) -const ctx = page.context() -console.log('FORCE_SCAN_START') -const resp = await ctx.request.get(`${BASE}/api/admin/shop-data-crawl/duplicate-check-overview?force=1`, { timeout: 300000 }) -console.log('HTTP', resp.status()) -const body = await resp.json() -const data = body?.data || {} -console.log('pending=', data.pending) -console.log('scanned_at=', data.scanned_at) -console.log('shops=', (data.shops || []).map(s => s.shop_name + '(' + s.group_name + ',' + s.asin_count + ')').join(' | ')) -console.log('summary=', JSON.stringify(data.summary)) -await browser.close() diff --git a/backend-java/scripts/hc_report.json b/backend-java/scripts/hc_report.json deleted file mode 100644 index 06ac7a3c..00000000 --- a/backend-java/scripts/hc_report.json +++ /dev/null @@ -1,1266 +0,0 @@ -{ - "timeout_configs": [ - { - "config_class": "AppearancePatentProperties", - "field": "llmConnectTimeoutMillis", - "default": "10000", - "source": "src/main/java/com/nanri/aiimage/config/AppearancePatentProperties.java" - }, - { - "config_class": "AppearancePatentProperties", - "field": "llmReadTimeoutMillis", - "default": "180000", - "source": "src/main/java/com/nanri/aiimage/config/AppearancePatentProperties.java" - }, - { - "config_class": "AppearancePatentProperties", - "field": "llmRetryTimes", - "default": "3", - "source": "src/main/java/com/nanri/aiimage/config/AppearancePatentProperties.java" - }, - { - "config_class": "AppearancePatentProperties", - "field": "staleTimeoutMinutes", - "default": "30", - "source": "src/main/java/com/nanri/aiimage/config/AppearancePatentProperties.java" - }, - { - "config_class": "BrandCheckProperties", - "field": "connectTimeoutMillis", - "default": "10000", - "source": "src/main/java/com/nanri/aiimage/config/BrandCheckProperties.java" - }, - { - "config_class": "BrandCheckProperties", - "field": "readTimeoutMillis", - "default": "60000", - "source": "src/main/java/com/nanri/aiimage/config/BrandCheckProperties.java" - }, - { - "config_class": "BrandProgressProperties", - "field": "heartbeatTimeoutMinutes", - "default": "15", - "source": "src/main/java/com/nanri/aiimage/config/BrandProgressProperties.java" - }, - { - "config_class": "DeleteBrandProgressProperties", - "field": "heartbeatTimeoutMinutes", - "default": "15", - "source": "src/main/java/com/nanri/aiimage/config/DeleteBrandProgressProperties.java" - }, - { - "config_class": "DeleteBrandProgressProperties", - "field": "productRiskStaleTimeoutMinutes", - "default": "30", - "source": "src/main/java/com/nanri/aiimage/config/DeleteBrandProgressProperties.java" - }, - { - "config_class": "DeleteBrandProgressProperties", - "field": "priceTrackStaleTimeoutMinutes", - "default": "30", - "source": "src/main/java/com/nanri/aiimage/config/DeleteBrandProgressProperties.java" - }, - { - "config_class": "DeleteBrandProgressProperties", - "field": "shopMatchStaleTimeoutMinutes", - "default": "30", - "source": "src/main/java/com/nanri/aiimage/config/DeleteBrandProgressProperties.java" - }, - { - "config_class": "DeleteBrandProgressProperties", - "field": "patrolDeleteStaleTimeoutMinutes", - "default": "30", - "source": "src/main/java/com/nanri/aiimage/config/DeleteBrandProgressProperties.java" - }, - { - "config_class": "DeleteBrandProgressProperties", - "field": "queryAsinStaleTimeoutMinutes", - "default": "30", - "source": "src/main/java/com/nanri/aiimage/config/DeleteBrandProgressProperties.java" - }, - { - "config_class": "DeleteBrandProgressProperties", - "field": "withdrawStaleTimeoutMinutes", - "default": "30", - "source": "src/main/java/com/nanri/aiimage/config/DeleteBrandProgressProperties.java" - }, - { - "config_class": "ImageVideoProperties", - "field": "cozeConnectTimeoutMillis", - "default": "10000", - "source": "src/main/java/com/nanri/aiimage/config/ImageVideoProperties.java" - }, - { - "config_class": "ImageVideoProperties", - "field": "cozeReadTimeoutMillis", - "default": "3600000", - "source": "src/main/java/com/nanri/aiimage/config/ImageVideoProperties.java" - }, - { - "config_class": "ImageVideoProperties", - "field": "archiveConnectTimeoutMillis", - "default": "10000", - "source": "src/main/java/com/nanri/aiimage/config/ImageVideoProperties.java" - }, - { - "config_class": "ImageVideoProperties", - "field": "archiveReadTimeoutMillis", - "default": "600000", - "source": "src/main/java/com/nanri/aiimage/config/ImageVideoProperties.java" - }, - { - "config_class": "InstanceRoutingProperties", - "field": "connectTimeoutMillis", - "default": "3000", - "source": "src/main/java/com/nanri/aiimage/config/InstanceRoutingProperties.java" - }, - { - "config_class": "InstanceRoutingProperties", - "field": "readTimeoutMillis", - "default": "300000", - "source": "src/main/java/com/nanri/aiimage/config/InstanceRoutingProperties.java" - }, - { - "config_class": "SimilarAsinProperties", - "field": "staleTimeoutMinutes", - "default": "30", - "source": "src/main/java/com/nanri/aiimage/config/SimilarAsinProperties.java" - }, - { - "config_class": "SimilarAsinProperties", - "field": "imageDownloadTimeoutSeconds", - "default": "5", - "source": "src/main/java/com/nanri/aiimage/config/SimilarAsinProperties.java" - }, - { - "config_class": "SimilarAsinProperties", - "field": "imagePrefetchTimeoutSeconds", - "default": "1800", - "source": "src/main/java/com/nanri/aiimage/config/SimilarAsinProperties.java" - }, - { - "config_class": "SimilarAsinProperties", - "field": "resultFileTimeoutMinutes", - "default": "90", - "source": "src/main/java/com/nanri/aiimage/config/SimilarAsinProperties.java" - }, - { - "config_class": "SimilarAsinProperties", - "field": "llmConnectTimeoutMillis", - "default": "10000", - "source": "src/main/java/com/nanri/aiimage/config/SimilarAsinProperties.java" - }, - { - "config_class": "SimilarAsinProperties", - "field": "llmReadTimeoutMillis", - "default": "180000", - "source": "src/main/java/com/nanri/aiimage/config/SimilarAsinProperties.java" - }, - { - "config_class": "SimilarAsinProperties", - "field": "llmRetryTimes", - "default": "3", - "source": "src/main/java/com/nanri/aiimage/config/SimilarAsinProperties.java" - }, - { - "config_class": "SimilarAsinProperties", - "field": "llmImageDownloadTimeoutSeconds", - "default": "10", - "source": "src/main/java/com/nanri/aiimage/config/SimilarAsinProperties.java" - }, - { - "config_class": "TransientStorageProperties", - "field": "connectTimeoutSeconds", - "default": "10", - "source": "src/main/java/com/nanri/aiimage/config/TransientStorageProperties.java" - }, - { - "config_class": "TransientStorageProperties", - "field": "readTimeoutSeconds", - "default": "60", - "source": "src/main/java/com/nanri/aiimage/config/TransientStorageProperties.java" - }, - { - "config_class": "TransientStorageProperties", - "field": "writeTimeoutSeconds", - "default": "60", - "source": "src/main/java/com/nanri/aiimage/config/TransientStorageProperties.java" - }, - { - "config_class": "TransientStorageProperties", - "field": "callTimeoutSeconds", - "default": "90", - "source": "src/main/java/com/nanri/aiimage/config/TransientStorageProperties.java" - }, - { - "config_class": "TransientStorageProperties", - "field": "operationTimeoutSeconds", - "default": "120", - "source": "src/main/java/com/nanri/aiimage/config/TransientStorageProperties.java" - }, - { - "config_class": "TransientStorageProperties", - "field": "uploadMaxRetries", - "default": "3", - "source": "src/main/java/com/nanri/aiimage/config/TransientStorageProperties.java" - }, - { - "config_class": "TransientStorageProperties", - "field": "readMaxRetries", - "default": "3", - "source": "src/main/java/com/nanri/aiimage/config/TransientStorageProperties.java" - }, - { - "config_class": "TransientStorageProperties", - "field": "deleteMaxRetries", - "default": "3", - "source": "src/main/java/com/nanri/aiimage/config/TransientStorageProperties.java" - }, - { - "config_class": "TransientStorageProperties", - "field": "acquirePermitTimeoutMillis", - "default": "2000", - "source": "src/main/java/com/nanri/aiimage/config/TransientStorageProperties.java" - }, - { - "config_class": "TransientStorageProperties", - "field": "baseRetryDelayMillis", - "default": "500", - "source": "src/main/java/com/nanri/aiimage/config/TransientStorageProperties.java" - }, - { - "config_class": "TransientStorageProperties", - "field": "maxRetryDelayMillis", - "default": "5000", - "source": "src/main/java/com/nanri/aiimage/config/TransientStorageProperties.java" - }, - { - "config_class": "TransientStorageProperties", - "field": "retryJitterMillis", - "default": "250", - "source": "src/main/java/com/nanri/aiimage/config/TransientStorageProperties.java" - }, - { - "config_class": "TransientStorageProperties", - "field": "deleteRetryEnabled", - "default": "true", - "source": "src/main/java/com/nanri/aiimage/config/TransientStorageProperties.java" - }, - { - "config_class": "TransientStorageProperties", - "field": "deleteRetryCron", - "default": "\"0 */5 * * * *\"", - "source": "src/main/java/com/nanri/aiimage/config/TransientStorageProperties.java" - }, - { - "config_class": "TransientStorageProperties", - "field": "deleteRetryQueueCapacity", - "default": "10000", - "source": "src/main/java/com/nanri/aiimage/config/TransientStorageProperties.java" - }, - { - "config_class": "TransientStorageProperties", - "field": "deleteRetryBatchSize", - "default": "200", - "source": "src/main/java/com/nanri/aiimage/config/TransientStorageProperties.java" - }, - { - "config_class": "TransientStorageProperties", - "field": "deleteRetryBatchTimeoutSeconds", - "default": "60", - "source": "src/main/java/com/nanri/aiimage/config/TransientStorageProperties.java" - } - ], - "client_sites": [ - { - "file": "src/main/java/com/nanri/aiimage/common/service/TaskOwnerForwardService.java", - "line": 86, - "snippet": "requestFactory.setConnectTimeout(properties.getConnectTimeoutMillis());" - }, - { - "file": "src/main/java/com/nanri/aiimage/common/service/TaskOwnerForwardService.java", - "line": 87, - "snippet": "requestFactory.setReadTimeout(properties.getReadTimeoutMillis());" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/AppearancePatentProperties.java", - "line": 23, - "snippet": "private int llmConnectTimeoutMillis = 10000;" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/AppearancePatentProperties.java", - "line": 24, - "snippet": "private int llmReadTimeoutMillis = 180000;" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/AppearancePatentProperties.java", - "line": 33, - "snippet": "private int llmRetryTimes = 3;" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/BrandCheckProperties.java", - "line": 13, - "snippet": "private int connectTimeoutMillis = 10000;" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/BrandCheckProperties.java", - "line": 14, - "snippet": "private int readTimeoutMillis = 60000;" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/HttpClientPool.java", - "line": 28, - "snippet": "sharedHttpClient = HttpClient.newBuilder()" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/HttpClientPool.java", - "line": 29, - "snippet": ".connectTimeout(Duration.ofSeconds(10))" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/HttpClientPool.java", - "line": 37, - "snippet": "/** 按 readTimeout(毫秒)创建共享连接池工厂;非法值钳制到最小正数。 */" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/HttpClientPool.java", - "line": 38, - "snippet": "public static ClientHttpRequestFactory requestFactory(int readTimeoutMillis) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/HttpClientPool.java", - "line": 39, - "snippet": "int safeReadTimeout = Math.max(1, readTimeoutMillis);" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/HttpClientPool.java", - "line": 42, - "snippet": "factory.setReadTimeout(Duration.ofMillis(safeReadTimeout));" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/ImageVideoProperties.java", - "line": 19, - "snippet": "private int cozeConnectTimeoutMillis = 10000;" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/ImageVideoProperties.java", - "line": 20, - "snippet": "private int cozeReadTimeoutMillis = 3600000;" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/ImageVideoProperties.java", - "line": 23, - "snippet": "private int archiveConnectTimeoutMillis = 10000;" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/ImageVideoProperties.java", - "line": 24, - "snippet": "private int archiveReadTimeoutMillis = 600000;" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/InstanceRoutingProperties.java", - "line": 14, - "snippet": "private int connectTimeoutMillis = 3000;" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/InstanceRoutingProperties.java", - "line": 15, - "snippet": "private int readTimeoutMillis = 300000;" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/SimilarAsinProperties.java", - "line": 162, - "snippet": "private int llmConnectTimeoutMillis = 10000;" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/SimilarAsinProperties.java", - "line": 163, - "snippet": "private int llmReadTimeoutMillis = 180000;" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/SimilarAsinProperties.java", - "line": 164, - "snippet": "private int llmRetryTimes = 3;" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/TransientStorageProperties.java", - "line": 15, - "snippet": "private int connectTimeoutSeconds = 10;" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/TransientStorageProperties.java", - "line": 16, - "snippet": "private int readTimeoutSeconds = 60;" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/TransientStorageProperties.java", - "line": 17, - "snippet": "private int writeTimeoutSeconds = 60;" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/TransientStorageProperties.java", - "line": 18, - "snippet": "private int callTimeoutSeconds = 90;" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/TransientStorageProperties.java", - "line": 19, - "snippet": "private int operationTimeoutSeconds = 120;" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/TransientStorageProperties.java", - "line": 32, - "snippet": "private long baseRetryDelayMillis = 500;" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/TransientStorageProperties.java", - "line": 33, - "snippet": "private long maxRetryDelayMillis = 5000;" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/TransientStorageProperties.java", - "line": 51, - "snippet": "private boolean deleteRetryEnabled = true;" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/TransientStorageProperties.java", - "line": 52, - "snippet": "private String deleteRetryCron = \"0 */5 * * * *\";" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/TransientStorageProperties.java", - "line": 53, - "snippet": "private int deleteRetryQueueCapacity = 10000;" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/TransientStorageProperties.java", - "line": 54, - "snippet": "private int deleteRetryBatchSize = 200;" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/TransientStorageProperties.java", - "line": 55, - "snippet": "private int deleteRetryBatchTimeoutSeconds = 60;" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/ZiniaoProperties.java", - "line": 29, - "snippet": "private int connectTimeoutSeconds;" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/ZiniaoProperties.java", - "line": 30, - "snippet": "private int readTimeoutSeconds;" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/appearancepatent/client/AppearancePatentLlmClient.java", - "line": 264, - "snippet": "int attempts = Math.max(1, properties.getLlmRetryTimes());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/appearancepatent/client/AppearancePatentLlmClient.java", - "line": 276, - "snippet": "sleepBeforeRetry(attempt);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/appearancepatent/client/AppearancePatentLlmClient.java", - "line": 728, - "snippet": ".requestFactory(HttpClientPool.requestFactory(properties.getLlmReadTimeoutMillis()));" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/appearancepatent/client/AppearancePatentLlmClient.java", - "line": 816, - "snippet": "private void sleepBeforeRetry(int attemptIndex) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/appearancepatent/service/AppearancePatentTaskService.java", - "line": 1858, - "snippet": "loadPersistedResultRowsForRowsWithRetry(task.getId(), item.rows());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/appearancepatent/service/AppearancePatentTaskService.java", - "line": 2103, - "snippet": "private Map loadPersistedResultRowsForRowsWithRetry(" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/appearancepatent/service/AppearancePatentTaskService.java", - "line": 2112, - "snippet": "sleepBeforeResultRowsRetry(attempt);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/appearancepatent/service/AppearancePatentTaskService.java", - "line": 2218, - "snippet": "private void sleepBeforeResultRowsRetry(int attempt) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/brand/client/BrandCheckClient.java", - "line": 171, - "snippet": ".requestFactory(HttpClientPool.requestFactory(properties.getReadTimeoutMillis()));" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandRunService.java", - "line": 1641, - "snippet": "&& assembleJob.getRetryCount() != null" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandRunService.java", - "line": 1642, - "snippet": "&& assembleJob.getRetryCount() >= TaskFileJobService.MAX_RETRY_COUNT;" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsDeleteRetryService.java", - "line": 22, - "snippet": "public class RustfsDeleteRetryService {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsDeleteRetryService.java", - "line": 26, - "snippet": "private final ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue<>();" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsDeleteRetryService.java", - "line": 27, - "snippet": "private final ConcurrentHashMap pending = new ConcurrentHashMap<>();" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsDeleteRetryService.java", - "line": 31, - "snippet": "if (!properties.isDeleteRetryEnabled() || objectKey == null || objectKey.isBlank()) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsDeleteRetryService.java", - "line": 35, - "snippet": "RetryItem item = findOrAdmit(objectKey, cause);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsDeleteRetryService.java", - "line": 54, - "snippet": "if (!properties.isDeleteRetryEnabled()) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsDeleteRetryService.java", - "line": 57, - "snippet": "int batchSize = Math.max(1, properties.getDeleteRetryBatchSize());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsDeleteRetryService.java", - "line": 59, - "snippet": "Math.max(1L, properties.getDeleteRetryBatchTimeoutSeconds()));" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsDeleteRetryService.java", - "line": 65, - "snippet": "List retryNextInvocation = new ArrayList<>();" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsDeleteRetryService.java", - "line": 71, - "snippet": "RetryAttempt attempt = nextAttempt();" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsDeleteRetryService.java", - "line": 75, - "snippet": "RetryItem item = attempt.item;" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsDeleteRetryService.java", - "line": 88, - "snippet": "rustfsObjectStorageService.deleteObjectFromRetry(objectKey, remainingNanos);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsDeleteRetryService.java", - "line": 109, - "snippet": "private RetryItem findOrAdmit(String objectKey, Throwable cause) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsDeleteRetryService.java", - "line": 110, - "snippet": "RetryItem item = pending.get(objectKey);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsDeleteRetryService.java", - "line": 114, - "snippet": "int capacity = Math.max(1, properties.getDeleteRetryQueueCapacity());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsDeleteRetryService.java", - "line": 125, - "snippet": "item = new RetryItem(objectKey);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsDeleteRetryService.java", - "line": 131, - "snippet": "private RetryAttempt nextAttempt() {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsDeleteRetryService.java", - "line": 133, - "snippet": "RetryItem item = queue.poll();" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsDeleteRetryService.java", - "line": 142, - "snippet": "return new RetryAttempt(item, item.generation);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsDeleteRetryService.java", - "line": 147, - "snippet": "private void removeIfUnchanged(RetryAttempt attempt) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsDeleteRetryService.java", - "line": 148, - "snippet": "RetryItem item = attempt.item;" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsDeleteRetryService.java", - "line": 159, - "snippet": "private int recordFailureIfUnchanged(RetryAttempt attempt, Exception ex) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsDeleteRetryService.java", - "line": 160, - "snippet": "RetryItem item = attempt.item;" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsDeleteRetryService.java", - "line": 172, - "snippet": "private void requeue(RetryItem item) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsDeleteRetryService.java", - "line": 180, - "snippet": "private void enqueueItemLocked(RetryItem item) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsDeleteRetryService.java", - "line": 187, - "snippet": "private record RetryAttempt(RetryItem item, long generation) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsDeleteRetryService.java", - "line": 190, - "snippet": "private static class RetryItem {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsDeleteRetryService.java", - "line": 198, - "snippet": "private RetryItem(String objectKey) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 42, - "snippet": "private final ObjectProvider deleteRetryServiceProvider;" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 61, - "snippet": "ObjectProvider deleteRetryServiceProvider) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 62, - "snippet": "this(properties, meterRegistryProvider, deleteRetryServiceProvider, null);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 67, - "snippet": "ObjectProvider deleteRetryServiceProvider," - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 71, - "snippet": "this.deleteRetryServiceProvider = deleteRetryServiceProvider;" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 111, - "snippet": "String uploadedObjectKey = executeWithRetry(OP_UPLOAD, objectKey, bytes.length," - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 132, - "snippet": "enqueueDeleteRetry(objectKey, ex);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 149, - "snippet": "return executeWithRetry(OP_READ, objectKey, 0, Math.max(1, properties.getReadMaxRetries())," - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 164, - "snippet": "void deleteObjectFromRetry(String objectKey) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 168, - "snippet": "void deleteObjectFromRetry(String objectKey, long timeoutNanos) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 172, - "snippet": "private void deleteObject(String objectKey, boolean enqueueRetryOnFailure, long deadlineNanos) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 177, - "snippet": "executeWithRetry(OP_DELETE, objectKey, 0, Math.max(1, properties.getDeleteMaxRetries())," - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 186, - "snippet": "if (enqueueRetryOnFailure && properties.isDeleteRetryEnabled()) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 187, - "snippet": "enqueueDeleteRetry(objectKey, ex);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 193, - "snippet": "private T executeWithRetry(String operation," - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 239, - "snippet": "if (last instanceof OperationTimeoutException timeoutException) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 312, - "snippet": ".connectTimeout(Math.max(1, properties.getConnectTimeoutSeconds()), TimeUnit.SECONDS)" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 313, - "snippet": ".readTimeout(Math.max(1, properties.getReadTimeoutSeconds()), TimeUnit.SECONDS)" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 314, - "snippet": ".writeTimeout(Math.max(1, properties.getWriteTimeoutSeconds()), TimeUnit.SECONDS)" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 315, - "snippet": ".callTimeout(Math.max(1, properties.getCallTimeoutSeconds()), TimeUnit.SECONDS)" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 332, - "snippet": "long configuredTimeoutNanos = TimeUnit.SECONDS.toNanos(Math.max(1, properties.getCallTimeoutSeconds()));" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 333, - "snippet": "long callTimeoutMillis = TimeUnit.NANOSECONDS.toMillis(" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 335, - "snippet": "if (callTimeoutMillis <= 0L) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 336, - "snippet": "throw new OperationTimeoutException(\"rustfs operation timeout before HTTP call\");" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 339, - "snippet": ".callTimeout(callTimeoutMillis, TimeUnit.MILLISECONDS)" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 358, - "snippet": "if (ex instanceof OperationTimeoutException timeoutException) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 425, - "snippet": "long baseDelay = Math.max(0L, properties.getBaseRetryDelayMillis());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 426, - "snippet": "long maxDelay = Math.max(baseDelay, properties.getMaxRetryDelayMillis());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 428, - "snippet": "long jitter = Math.max(0L, properties.getRetryJitterMillis());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 455, - "snippet": "long timeoutSeconds = properties.getOperationTimeoutSeconds();" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 472, - "snippet": "throw new OperationTimeoutException(" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 485, - "snippet": "private void enqueueDeleteRetry(String objectKey, RuntimeException failure) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 486, - "snippet": "if (!properties.isDeleteRetryEnabled() || deleteRetryServiceProvider == null) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 489, - "snippet": "RustfsDeleteRetryService retryService = deleteRetryServiceProvider.getIfAvailable();" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 555, - "snippet": "private static class OperationTimeoutException extends IllegalStateException {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/object/RustfsObjectStorageService.java", - "line": 556, - "snippet": "private OperationTimeoutException(String message) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/imagevideo/service/ImageVideoArchiveService.java", - "line": 225, - "snippet": "connection.setConnectTimeout(Math.max(1000, properties.getArchiveConnectTimeoutMillis()));" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/imagevideo/service/ImageVideoArchiveService.java", - "line": 226, - "snippet": "connection.setReadTimeout(Math.max(1000, properties.getArchiveReadTimeoutMillis()));" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/imagevideo/service/ImageVideoCozeService.java", - "line": 590, - "snippet": ".timeout(Duration.ofMillis(Math.max(1000, properties.getCozeReadTimeoutMillis())))" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/imagevideo/service/ImageVideoCozeService.java", - "line": 620, - "snippet": ".timeout(Duration.ofMillis(Math.max(1000, properties.getCozeReadTimeoutMillis())))" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/imagevideo/service/ImageVideoCozeService.java", - "line": 682, - "snippet": "sharedHttpClient = HttpClient.newBuilder()" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/imagevideo/service/ImageVideoCozeService.java", - "line": 683, - "snippet": ".connectTimeout(Duration.ofMillis(Math.max(1000, properties.getCozeConnectTimeoutMillis())))" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/publish/model/vo/PublishResultVo.java", - "line": 22, - "snippet": "private Integer fileJobRetryCount;" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/publish/service/PublishTaskService.java", - "line": 1010, - "snippet": "response.setFileJobRetryCount(job.getRetryCount());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/publish/service/PublishTaskService.java", - "line": 1690, - "snippet": "int retryCount = latest == null ? safeInt(job.getRetryCount()) : safeInt(latest.getRetryCount());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/client/SimilarAsinLlmClient.java", - "line": 65, - "snippet": "int attempts = Math.max(1, properties.getLlmRetryTimes());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/client/SimilarAsinLlmClient.java", - "line": 77, - "snippet": "sleepBeforeRetry(attempt);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/client/SimilarAsinLlmClient.java", - "line": 281, - "snippet": ".requestFactory(HttpClientPool.requestFactory(properties.getLlmReadTimeoutMillis()));" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/client/SimilarAsinLlmClient.java", - "line": 291, - "snippet": "private void sleepBeforeRetry(int attemptIndex) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinLlmService.java", - "line": 558, - "snippet": "downloadHttpClient = HttpClient.newBuilder()" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinLlmService.java", - "line": 559, - "snippet": ".connectTimeout(Duration.ofSeconds(10))" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 470, - "snippet": "boolean categoryRetryRequired = false;" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 491, - "snippet": "categoryRetryRequired |= parsed.categoryRetryRequired();" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 501, - "snippet": "request.setCategorySwitch(requestedCategorySwitch || categoryRetryRequired);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 502, - "snippet": "if (!requestedCategorySwitch && categoryRetryRequired) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 2916, - "snippet": "if (taskFileJobService.isRetryExhausted(job.getId())) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 2942, - "snippet": "if (taskFileJobService.isRetryExhausted(job.getId())) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 2967, - "snippet": "} else if (taskFileJobService.isRetryExhausted(job.getId())) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 3500, - "snippet": "context.submitRetryCount()," - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 3925, - "snippet": "loadPersistedResultRowsForRowsWithRetry(task.getId(), captured.rows());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 4044, - "snippet": "Map resultMap = loadPersistedResultRowsWithRetry(task.getId(), parsedRows.siz" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 4324, - "snippet": "private Map loadPersistedResultRowsForRowsWithRetry(" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 4333, - "snippet": "sleepBeforeResultRowsRetry(attempt);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 4507, - "snippet": "private Map loadPersistedResultRowsWithRetry(Long taskId, int expectedParsedR" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 4513, - "snippet": "sleepBeforeResultRowsRetry(attempt);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 4526, - "snippet": "private void sleepBeforeResultRowsRetry(int attempt) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 4810, - "snippet": "boolean categoryRetryRequired = shouldEnableCategorySwitchForRetry(" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 4818, - "snippet": "return new ParsedWorkbook(total, dropped, headers, allRows, categoryRetryRequired);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 5597, - "snippet": "static boolean shouldEnableCategorySwitchForRetry(List headers," - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 5788, - "snippet": "Integer submitRetryCount," - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 5847, - "snippet": "boolean categoryRetryRequired) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/util/PuzzleImageMerger.java", - "line": 241, - "snippet": "sharedHttpClient = HttpClient.newBuilder()" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/util/PuzzleImageMerger.java", - "line": 242, - "snippet": ".connectTimeout(Duration.ofSeconds(10))" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/util/SimilarAsinImageEmbedder.java", - "line": 169, - "snippet": ".connectTimeout(Duration.ofSeconds(downloadTimeoutSeconds))" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/util/SimilarAsinImageEmbedder.java", - "line": 170, - "snippet": ".readTimeout(Duration.ofSeconds(downloadTimeoutSeconds))" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/util/SimilarAsinImageEmbedder.java", - "line": 171, - "snippet": ".writeTimeout(Duration.ofSeconds(downloadTimeoutSeconds))" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/util/SimilarAsinImageEmbedder.java", - "line": 172, - "snippet": ".callTimeout(Duration.ofSeconds(downloadTimeoutSeconds * 2L))" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/util/SimilarAsinImageEmbedder.java", - "line": 798, - "snippet": "logRetry(attemptUrl, attempt, ex);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/util/SimilarAsinImageEmbedder.java", - "line": 878, - "snippet": "private void logRetry(String url, int attempt, Exception ex) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ResultFileJobHandler.java", - "line": 11, - "snippet": "* onFailure 在重试耗尽时调用(原 notifyRetryExhausted 分支);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 47, - "snippet": "entity.setRetryCount(0);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 73, - "snippet": "int existingRetry = existing.getRetryCount() == null ? 0 : existing.getRetryCount();" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 74, - "snippet": "if (\"FAILED\".equals(existing.getStatus()) && existingRetry >= MAX_RETRY_COUNT) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 94, - "snippet": ".lt(TaskFileJobEntity::getRetryCount, MAX_RETRY_COUNT)" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 120, - "snippet": ".lt(TaskFileJobEntity::getRetryCount, MAX_RETRY_COUNT)" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 130, - "snippet": ".lt(TaskFileJobEntity::getRetryCount, MAX_RETRY_COUNT)" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 178, - "snippet": ".lt(TaskFileJobEntity::getRetryCount, MAX_RETRY_COUNT)" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 190, - "snippet": ".lt(TaskFileJobEntity::getRetryCount, MAX_RETRY_COUNT)" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 226, - "snippet": ".set(TaskFileJobEntity::getRetryCount, 0)" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 257, - "snippet": ".ne(TaskFileJobEntity::getRetryCount, MAX_RETRY_COUNT)" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 264, - "snippet": ".ge(TaskFileJobEntity::getRetryCount, MAX_RETRY_COUNT)" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 277, - "snippet": "&& job.getRetryCount() != null && job.getRetryCount() >= MAX_RETRY_COUNT) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 286, - "snippet": "int retryCount = job.getRetryCount() == null ? 0 : job.getRetryCount();" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 287, - "snippet": "int nextRetryCount = Math.min(MAX_RETRY_COUNT - 1, retryCount + 1);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 293, - "snippet": ".set(TaskFileJobEntity::getRetryCount, nextRetryCount)" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 300, - "snippet": "int retryCount = job.getRetryCount() == null ? 0 : job.getRetryCount();" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 301, - "snippet": "int nextRetryCount = Math.min(MAX_RETRY_COUNT, retryCount + 1);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 308, - "snippet": ".set(TaskFileJobEntity::getRetryCount, nextRetryCount)" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 310, - "snippet": "if (nextRetryCount >= MAX_RETRY_COUNT) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 372, - "snippet": ".and(wrapper -> wrapper.isNull(TaskFileJobEntity::getRetryCount)" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 374, - "snippet": ".lt(TaskFileJobEntity::getRetryCount, MAX_RETRY_COUNT))" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 401, - "snippet": ".eq(claim.getRetryCount() != null, TaskFileJobEntity::getRetryCount, claim.getRetryCount())" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 402, - "snippet": ".isNull(claim.getRetryCount() == null, TaskFileJobEntity::getRetryCount)" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 472, - "snippet": ".and(wrapper -> wrapper.isNull(TaskFileJobEntity::getRetryCount)" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 474, - "snippet": ".lt(TaskFileJobEntity::getRetryCount, MAX_RETRY_COUNT))" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 511, - "snippet": "public boolean isRetryExhausted(Long jobId) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 515, - "snippet": "&& job.getRetryCount() != null" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 516, - "snippet": "&& job.getRetryCount() >= MAX_RETRY_COUNT;" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 526, - "snippet": "int currentRetryCount = current.getRetryCount() == null ? 0 : current.getRetryCount();" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 527, - "snippet": "int retryCount = Math.min(MAX_RETRY_COUNT, currentRetryCount + 1);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 531, - "snippet": ".eq(current.getRetryCount() != null, TaskFileJobEntity::getRetryCount, current.getRetryCount())" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 532, - "snippet": ".isNull(current.getRetryCount() == null, TaskFileJobEntity::getRetryCount)" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 534, - "snippet": ".set(TaskFileJobEntity::getRetryCount, retryCount)" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 551, - "snippet": ".ge(TaskFileJobEntity::getRetryCount, MAX_RETRY_COUNT)" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 570, - "snippet": ".set(TaskFileJobEntity::getRetryCount, MAX_RETRY_COUNT)" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskFileJobService.java", - "line": 643, - "snippet": ".lt(TaskFileJobEntity::getRetryCount, MAX_RETRY_COUNT)));" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskResultFileJobWorker.java", - "line": 106, - "snippet": "finalizeRetryExhausted(job, message);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskResultFileJobWorker.java", - "line": 259, - "snippet": "if (taskFileJobService.isRetryExhausted(job.getId())) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskResultFileJobWorker.java", - "line": 260, - "snippet": "finalizeRetryExhausted(job, message);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskResultFileJobWorker.java", - "line": 265, - "snippet": "private void finalizeRetryExhausted(TaskFileJobEntity job, String message) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskResultFileJobWorker.java", - "line": 267, - "snippet": "notifyRetryExhausted(job, message);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskResultFileJobWorker.java", - "line": 279, - "snippet": "private void notifyRetryExhausted(TaskFileJobEntity job, String message) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/ziniao/client/ZiniaoClientImpl.java", - "line": 275, - "snippet": ".requestFactory(HttpClientPool.requestFactory(ziniaoProperties.getReadTimeoutSeconds() * 1000));" - } - ] -} \ No newline at end of file diff --git a/backend-java/scripts/n1_report.json b/backend-java/scripts/n1_report.json deleted file mode 100644 index 519aae9c..00000000 --- a/backend-java/scripts/n1_report.json +++ /dev/null @@ -1,317 +0,0 @@ -{ - "scanned_files": 640, - "modules": [ - "admin", - "appearancepatent", - "auth", - "brand", - "collectdata", - "convert", - "debug", - "dedupe", - "deletebrand", - "digitalhuman", - "file", - "filetemplate", - "imagehistory", - "imagevideo", - "invalidasin", - "patroldelete", - "permission", - "pricetrack", - "productcategory", - "productrisk", - "publish", - "queryasin", - "shopdatacrawl", - "shopkey", - "shopmatch", - "similarasin", - "split", - "task", - "withdraw", - "ziniao" - ], - "findings": [ - { - "file": "deletebrand\\service\\DeleteBrandStaleTaskService.java", - "line": 209, - "statement": "FileTaskEntity refreshed = fileTaskMapper.selectById(task.getId());", - "loop_type": "for", - "impact": "HIGH", - "module": "deletebrand" - }, - { - "file": "pricetrack\\service\\PriceTrackTaskService.java", - "line": 354, - "statement": "FileResultEntity lockedResult = fileResultMapper.selectById(fr.getId());", - "loop_type": "for", - "impact": "HIGH", - "module": "pricetrack" - }, - { - "file": "productrisk\\service\\ProductRiskTaskService.java", - "line": 339, - "statement": "FileResultEntity lockedResult = fileResultMapper.selectById(fr.getId());", - "loop_type": "for", - "impact": "HIGH", - "module": "productrisk" - }, - { - "file": "task\\service\\TaskFileJobService.java", - "line": 282, - "statement": "publishDispatchEvent(taskFileJobMapper.selectById(job.getId()));", - "loop_type": "for", - "impact": "HIGH", - "module": "task" - }, - { - "file": "task\\service\\TaskFileJobService.java", - "line": 303, - "statement": "TaskFileJobEntity exhausted = taskFileJobMapper.selectById(job.getId());", - "loop_type": "for", - "impact": "HIGH", - "module": "task" - }, - { - "file": "task\\service\\TaskFileJobService.java", - "line": 315, - "statement": "publishDispatchEvent(taskFileJobMapper.selectById(job.getId()));", - "loop_type": "for", - "impact": "HIGH", - "module": "task" - }, - { - "file": "appearancepatent\\service\\AppearancePatentTaskService.java", - "line": 1094, - "statement": "TaskChunkEntity chunk = taskChunkMapper.selectOne(new LambdaQueryWrapper()", - "loop_type": "for", - "impact": "LOW", - "module": "appearancepatent" - }, - { - "file": "appearancepatent\\service\\AppearancePatentTaskService.java", - "line": 2112, - "statement": "List page = taskChunkMapper.selectList(query);", - "loop_type": "while", - "impact": "LOW", - "module": "appearancepatent" - }, - { - "file": "dedupe\\service\\DedupeTotalDataService.java", - "line": 279, - "statement": "List rows = dedupeTotalDataMapper.selectList(", - "loop_type": "while", - "impact": "LOW", - "module": "dedupe" - }, - { - "file": "deletebrand\\service\\DeleteBrandRunService.java", - "line": 1234, - "statement": "tasks.addAll(fileTaskMapper.selectList(new LambdaQueryWrapper()", - "loop_type": "for", - "impact": "LOW", - "module": "deletebrand" - }, - { - "file": "deletebrand\\service\\DeleteBrandRunService.java", - "line": 1252, - "statement": "rows.addAll(fileResultMapper.selectList(historyResultQuery()", - "loop_type": "for", - "impact": "LOW", - "module": "deletebrand" - }, - { - "file": "deletebrand\\service\\DeleteBrandRunService.java", - "line": 1268, - "statement": "List rows = fileResultMapper.selectList(historyResultQuery()", - "loop_type": "for", - "impact": "LOW", - "module": "deletebrand" - }, - { - "file": "patroldelete\\service\\PatrolDeleteTaskService.java", - "line": 638, - "statement": "List tasks = fileTaskMapper.selectList(new LambdaQueryWrapper()", - "loop_type": "for", - "impact": "LOW", - "module": "patroldelete" - }, - { - "file": "permission\\service\\PermissionMenuService.java", - "line": 676, - "statement": "cursor = permissionMenuMapper.selectById(ancestorId);", - "loop_type": "while", - "impact": "LOW", - "module": "permission" - }, - { - "file": "pricetrack\\service\\PriceTrackTaskService.java", - "line": 153, - "statement": "tasks.addAll(fileTaskMapper.selectList(new LambdaQueryWrapper()", - "loop_type": "for", - "impact": "LOW", - "module": "pricetrack" - }, - { - "file": "pricetrack\\service\\PriceTrackTaskService.java", - "line": 418, - "statement": "List tasks = fileTaskMapper.selectList(new LambdaQueryWrapper()", - "loop_type": "for", - "impact": "LOW", - "module": "pricetrack" - }, - { - "file": "productcategory\\service\\ProductCategoryService.java", - "line": 465, - "statement": "ProductCategoryEntity parent = productCategoryMapper.selectById(cursor.getParentId());", - "loop_type": "while", - "impact": "LOW", - "module": "productcategory" - }, - { - "file": "productcategory\\service\\ProductCategoryService.java", - "line": 481, - "statement": "cursor = cursor.getParentId() == null ? null : productCategoryMapper.selectById(cursor.getParentId());", - "loop_type": "while", - "impact": "LOW", - "module": "productcategory" - }, - { - "file": "productcategory\\service\\ProductCategoryService.java", - "line": 518, - "statement": "ProductCategoryEntity row = productCategoryMapper.selectById(cursor);", - "loop_type": "while", - "impact": "LOW", - "module": "productcategory" - }, - { - "file": "productrisk\\service\\ProductRiskTaskService.java", - "line": 144, - "statement": "tasks.addAll(fileTaskMapper.selectList(new LambdaQueryWrapper()", - "loop_type": "for", - "impact": "LOW", - "module": "productrisk" - }, - { - "file": "queryasin\\service\\QueryAsinTaskService.java", - "line": 587, - "statement": "List tasks = fileTaskMapper.selectList(new LambdaQueryWrapper()", - "loop_type": "for", - "impact": "LOW", - "module": "queryasin" - }, - { - "file": "shopdatacrawl\\service\\ShopDataCrawlTaskService.java", - "line": 1085, - "statement": "List tasks = fileTaskMapper.selectList(new LambdaQueryWrapper()", - "loop_type": "for", - "impact": "LOW", - "module": "shopdatacrawl" - }, - { - "file": "shopdatacrawl\\service\\ShopDataCrawlTaskService.java", - "line": 1940, - "statement": "FileResultEntity result = fileResultMapper.selectById(member.getResultId());", - "loop_type": "for", - "impact": "LOW", - "module": "shopdatacrawl" - }, - { - "file": "shopdatacrawl\\service\\ShopDataCrawlTaskService.java", - "line": 2497, - "statement": "FileResultEntity result = fileResultMapper.selectById(member.getResultId());", - "loop_type": "for", - "impact": "LOW", - "module": "shopdatacrawl" - }, - { - "file": "shopdatacrawl\\service\\ShopDataCrawlTaskService.java", - "line": 2575, - "statement": "FileTaskEntity task = fileTaskMapper.selectById(member.getTaskId());", - "loop_type": "for", - "impact": "LOW", - "module": "shopdatacrawl" - }, - { - "file": "shopmatch\\service\\ShopMatchTaskService.java", - "line": 179, - "statement": "tasks.addAll(fileTaskMapper.selectList(new LambdaQueryWrapper()", - "loop_type": "for", - "impact": "LOW", - "module": "shopmatch" - }, - { - "file": "similarasin\\service\\SimilarAsinTaskService.java", - "line": 1499, - "statement": "page = mapper.selectList(new com.baomidou.mybatisplus.core.conditions.query.QueryWrapper()", - "loop_type": "while", - "impact": "LOW", - "module": "similarasin" - }, - { - "file": "similarasin\\service\\SimilarAsinTaskService.java", - "line": 1646, - "statement": "TaskChunkEntity chunk = taskChunkMapper.selectOne(new LambdaQueryWrapper()", - "loop_type": "for", - "impact": "LOW", - "module": "similarasin" - }, - { - "file": "similarasin\\service\\SimilarAsinTaskService.java", - "line": 2346, - "statement": "FileTaskEntity task = fileTaskMapper.selectById(taskId);", - "loop_type": "for", - "impact": "LOW", - "module": "similarasin" - }, - { - "file": "similarasin\\service\\SimilarAsinTaskService.java", - "line": 2356, - "statement": "List chunks = taskChunkMapper.selectList(new LambdaQueryWrapper()", - "loop_type": "for", - "impact": "LOW", - "module": "similarasin" - }, - { - "file": "similarasin\\service\\SimilarAsinTaskService.java", - "line": 2379, - "statement": "TaskScopeStateEntity state = taskScopeStateMapper.selectById(stateId);", - "loop_type": "for", - "impact": "LOW", - "module": "similarasin" - }, - { - "file": "similarasin\\service\\SimilarAsinTaskService.java", - "line": 4364, - "statement": "List page = taskChunkMapper.selectList(query);", - "loop_type": "while", - "impact": "LOW", - "module": "similarasin" - }, - { - "file": "similarasin\\service\\SimilarAsinTaskService.java", - "line": 4437, - "statement": "List page = taskScopeStateMapper.selectList(query);", - "loop_type": "while", - "impact": "LOW", - "module": "similarasin" - }, - { - "file": "task\\service\\ModuleHistoryCleanupService.java", - "line": 131, - "statement": "List page = fileTaskMapper.selectList(new LambdaQueryWrapper()", - "loop_type": "while", - "impact": "LOW", - "module": "task" - }, - { - "file": "task\\service\\TaskFileJobService.java", - "line": 153, - "statement": "TaskFileJobEntity claim = taskFileJobMapper.selectById(candidate.getId());", - "loop_type": "for", - "impact": "LOW", - "module": "task" - } - ] -} \ No newline at end of file diff --git a/backend-java/scripts/tc_report.json b/backend-java/scripts/tc_report.json deleted file mode 100644 index 5b3050c0..00000000 --- a/backend-java/scripts/tc_report.json +++ /dev/null @@ -1,1712 +0,0 @@ -{ - "configs": [ - { - "key": "upload-max-retries", - "value": "${AIIMAGE_TRANSIENT_STORAGE_UPLOAD_MAX_RETRIES:3}", - "line": 119, - "source": "application.yml" - }, - { - "key": "warn-payload-bytes", - "value": "${AIIMAGE_TRANSIENT_STORAGE_WARN_PAYLOAD_BYTES:5242880}", - "line": 136, - "source": "application.yml" - }, - { - "key": "max-payload-bytes", - "value": "${AIIMAGE_TRANSIENT_STORAGE_MAX_PAYLOAD_BYTES:52428800}", - "line": 137, - "source": "application.yml" - }, - { - "key": "max-stored-payload-bytes", - "value": "${AIIMAGE_TRANSIENT_STORAGE_MAX_STORED_PAYLOAD_BYTES:52428800}", - "line": 138, - "source": "application.yml" - }, - { - "key": "local-temp-dir", - "value": "${AIIMAGE_STORAGE_LOCAL_TEMP_DIR:./data/tmp}", - "line": 146, - "source": "application.yml" - }, - { - "key": "source-retention-hours", - "value": "${AIIMAGE_STORAGE_SOURCE_RETENTION_HOURS:24}", - "line": 149, - "source": "application.yml" - }, - { - "key": "result-retention-hours", - "value": "${AIIMAGE_STORAGE_RESULT_RETENTION_HOURS:24}", - "line": 150, - "source": "application.yml" - }, - { - "key": "transient-payload-retention-hours", - "value": "${AIIMAGE_STORAGE_TRANSIENT_PAYLOAD_RETENTION_HOURS:72}", - "line": 151, - "source": "application.yml" - }, - { - "key": "temp-dir", - "value": "", - "line": 152, - "source": "application.yml" - }, - { - "key": "retention-hours", - "value": "${AIIMAGE_TEMP_DIR_RETENTION_HOURS:24}", - "line": 153, - "source": "application.yml" - }, - { - "key": "retention-days", - "value": "${AIIMAGE_MODULE_CLEANUP_RETENTION_DAYS:7}", - "line": 183, - "source": "application.yml" - }, - { - "key": "scope-payload-flush-interval-millis", - "value": "${AIIMAGE_TASK_SCOPE_PAYLOAD_FLUSH_INTERVAL_MILLIS:15000}", - "line": 190, - "source": "application.yml" - }, - { - "key": "scope-payload-buffer-retention-hours", - "value": "${AIIMAGE_TASK_SCOPE_PAYLOAD_BUFFER_RETENTION_HOURS:24}", - "line": 191, - "source": "application.yml" - }, - { - "key": "scope-payload-recovery-max-files", - "value": "${AIIMAGE_TASK_SCOPE_PAYLOAD_RECOVERY_MAX_FILES:200}", - "line": 192, - "source": "application.yml" - }, - { - "key": "scope-payload-cleanup-cron", - "value": "${AIIMAGE_TASK_SCOPE_PAYLOAD_CLEANUP_CRON:15 */30 * * * *}", - "line": 193, - "source": "application.yml" - }, - { - "key": "retention-days", - "value": "${AIIMAGE_TASK_IMAGE_CACHE_RETENTION_DAYS:3}", - "line": 197, - "source": "application.yml" - } - ], - "cleanup_calls": [ - { - "file": "src/main/java/com/nanri/aiimage/config/ModuleCleanupProperties.java", - "line": 10, - "snippet": "@ConfigurationProperties(prefix = \"aiimage.module-cleanup\")" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/ModuleCleanupProperties.java", - "line": 11, - "snippet": "public class ModuleCleanupProperties {" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/PropertiesConfig.java", - "line": 7, - "snippet": "@EnableConfigurationProperties({OssProperties.class, TransientStorageProperties.class, StorageProper" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/StorageProperties.java", - "line": 11, - "snippet": "private String localTempDir;" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/StorageProperties.java", - "line": 12, - "snippet": "private boolean cleanupEnabled = true;" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/StorageProperties.java", - "line": 13, - "snippet": "private String cleanupCron = \"0 0 * * * *\";" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/StorageProperties.java", - "line": 18, - "snippet": "public String getLocalTempDir() {" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/StorageProperties.java", - "line": 19, - "snippet": "String configured = localTempDir == null ? \"\" : localTempDir.trim();" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/TaskImageCacheCleanupProperties.java", - "line": 7, - "snippet": "@ConfigurationProperties(prefix = \"aiimage.task-image-cache-cleanup\")" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/TaskImageCacheCleanupProperties.java", - "line": 8, - "snippet": "public class TaskImageCacheCleanupProperties {" - }, - { - "file": "src/main/java/com/nanri/aiimage/config/TaskPressureProperties.java", - "line": 18, - "snippet": "private String scopePayloadCleanupCron = \"15 */30 * * * *\";" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/appearancepatent/service/AppearancePatentTaskService.java", - "line": 1163, - "snippet": "transientPayloadStorageService.deleteReplacedPayloadIfNeeded(oldPayload, storedPayload);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/appearancepatent/service/AppearancePatentTaskService.java", - "line": 1166, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(storedPayload);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/appearancepatent/service/AppearancePatentTaskService.java", - "line": 1824, - "snippet": "public void cleanupResultFileJob(TaskFileJobEntity job) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/appearancepatent/service/AppearancePatentTaskService.java", - "line": 1849, - "snippet": "File outputDir = new File(storageProperties.getLocalTempDir(), \"appearance-patent-result\");" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/appearancepatent/service/AppearancePatentTaskService.java", - "line": 2919, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(scope.getParsedPayloadJson());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/appearancepatent/service/AppearancePatentTaskService.java", - "line": 2920, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(scope.getStateJson());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/appearancepatent/service/AppearancePatentTaskService.java", - "line": 2929, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(chunk.getPayloadJson());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/brand/service/BrandTaskService.java", - "line": 674, - "snippet": "File outputDir = FileUtil.mkdir(FileUtil.file(storageProperties.getLocalTempDir(), \"brand-result\", S" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/brand/service/BrandTaskService.java", - "line": 725, - "snippet": "cleanupBrandResultTempFiles(outputEntries, outputDir);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/brand/service/BrandTaskService.java", - "line": 822, - "snippet": "File downloadDir = FileUtil.mkdir(FileUtil.file(storageProperties.getLocalTempDir(), \"brand-source-d" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/brand/service/BrandTaskService.java", - "line": 1097, - "snippet": "File zipDir = FileUtil.mkdir(FileUtil.file(storageProperties.getLocalTempDir(), \"brand-result\", Stri" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/brand/service/BrandTaskService.java", - "line": 1110, - "snippet": "private void cleanupBrandResultTempFiles(List entries, File outputDir) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/brand/service/BrandTaskService.java", - "line": 1129, - "snippet": "File managedDir = FileUtil.file(storageProperties.getLocalTempDir(), \"brand-source-download\");" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/brand/service/BrandTaskService.java", - "line": 1142, - "snippet": "FileUtil.del(file);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/brand/service/BrandTaskStorageService.java", - "line": 75, - "snippet": "transientPayloadStorageService.deleteReplacedPayloadIfNeeded(state.getParsedPayloadJson(), parsedJso" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/brand/service/BrandTaskStorageService.java", - "line": 157, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(storedPayload);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/brand/service/BrandTaskStorageService.java", - "line": 162, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(storedPayload);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/brand/service/BrandTaskStorageService.java", - "line": 250, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(state.getParsedPayloadJson());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/brand/service/BrandTaskStorageService.java", - "line": 251, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(state.getStateJson());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/brand/service/BrandTaskStorageService.java", - "line": 260, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(chunk.getPayloadJson());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/brand/service/BrandTaskStorageService.java", - "line": 301, - "snippet": "transientPayloadStorageService.deleteReplacedPayloadIfNeeded(state.getStateJson(), storedAggregate);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/brand/service/BrandTaskStorageService.java", - "line": 303, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(storedAggregate);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/collectdata/service/CollectDataExcelAssemblyService.java", - "line": 89, - "snippet": "Files.deleteIfExists(file.toPath());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/collectdata/service/CollectDataService.java", - "line": 827, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(storedPayload);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/collectdata/service/CollectDataService.java", - "line": 933, - "snippet": "FileUtil.del(xlsx);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/collectdata/service/CollectDataService.java", - "line": 1004, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(storedPayload);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/collectdata/service/CollectDataService.java", - "line": 1198, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(chunk.getPayloadJson());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/collectdata/service/CollectDataService.java", - "line": 1215, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(ref.pointer());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/collectdata/service/CollectDataService.java", - "line": 1218, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(item.getPayloadJson());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/collectdata/util/CollectDataResultItemBatchWriter.java", - "line": 103, - "snippet": "// (deletePayloadIfPresent 内部带全局引用计数兜底)。" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/collectdata/util/CollectDataResultItemBatchWriter.java", - "line": 106, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(existing.getPayloadJson());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/convert/controller/ConvertTemplateController.java", - "line": 70, - "snippet": "convertTemplateService.deleteTemplate(templateCode);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/convert/service/ConvertRunService.java", - "line": 241, - "snippet": "File outputDir = FileUtil.mkdir(FileUtil.file(storageProperties.getLocalTempDir(), \"convert-result\")" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/convert/service/ConvertRunService.java", - "line": 388, - "snippet": "File outputDir = FileUtil.mkdir(FileUtil.file(storageProperties.getLocalTempDir(), \"convert-result\")" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/convert/service/ConvertRunService.java", - "line": 404, - "snippet": "File outputDir = FileUtil.mkdir(FileUtil.file(storageProperties.getLocalTempDir(), \"convert-result\")" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/convert/service/ConvertRunService.java", - "line": 458, - "snippet": "File baseDir = FileUtil.file(storageProperties.getLocalTempDir());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/convert/service/ConvertTemplateService.java", - "line": 79, - "snippet": "public void deleteTemplate(String templateCode) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/dedupe/service/DedupeRunService.java", - "line": 97, - "snippet": "File outputDir = FileUtil.mkdir(FileUtil.file(storageProperties.getLocalTempDir(), \"dedupe-result\"))" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/dedupe/service/DedupeRunService.java", - "line": 495, - "snippet": "File outputDir = FileUtil.mkdir(FileUtil.file(storageProperties.getLocalTempDir(), \"dedupe-result\"))" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/dedupe/service/DedupeRunService.java", - "line": 572, - "snippet": "File baseDir = FileUtil.file(storageProperties.getLocalTempDir());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/dedupe/service/DedupeTotalDataService.java", - "line": 410, - "snippet": "cleanupExpiredProgress();" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/dedupe/service/DedupeTotalDataService.java", - "line": 446, - "snippet": "cleanupExpiredProgress();" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/dedupe/service/DedupeTotalDataService.java", - "line": 462, - "snippet": "cleanupExpiredProgress();" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/dedupe/service/DedupeTotalDataService.java", - "line": 498, - "snippet": "cleanupExpiredProgress();" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/dedupe/service/DedupeTotalDataService.java", - "line": 579, - "snippet": "Files.deleteIfExists(file.toPath());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/dedupe/service/DedupeTotalDataService.java", - "line": 1095, - "snippet": "private void cleanupExpiredProgress() {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/dedupe/service/DedupeTotalDataService.java", - "line": 1097, - "snippet": "cleanupExpiredProgressEntries(" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/dedupe/service/DedupeTotalDataService.java", - "line": 1099, - "snippet": "cleanupExpiredProgressEntries(" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/dedupe/service/DedupeTotalDataService.java", - "line": 1104, - "snippet": "private void cleanupExpiredProgressEntries(" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandRunService.java", - "line": 1701, - "snippet": "cleanupCompletedTaskDataIfNoPendingFileJobs(task.getId());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandRunService.java", - "line": 1774, - "snippet": "public void cleanupResultFileJob(TaskFileJobEntity job) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandRunService.java", - "line": 1782, - "snippet": "cleanupCompletedTaskDataIfNoPendingFileJobs(job.getTaskId());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandRunService.java", - "line": 1785, - "snippet": "private void cleanupCompletedTaskDataIfNoPendingFileJobs(Long taskId) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandRunService.java", - "line": 1958, - "snippet": "FileUtil.del(file);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandStaleTaskService.java", - "line": 58, - "snippet": "private static final Duration TEMP_DIR_CLEANUP_LOCK_TTL = Duration.ofMinutes(10);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandStaleTaskService.java", - "line": 85, - "snippet": "private long tempDirRetentionHours;" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandStaleTaskService.java", - "line": 747, - "snippet": "@Scheduled(cron = \"${aiimage.temp-dir.cleanup-cron:15 */30 * * * *}\")" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandStaleTaskService.java", - "line": 748, - "snippet": "public void cleanupExpiredTempDirs() {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandStaleTaskService.java", - "line": 750, - "snippet": "distributedJobLockService.tryLock(\"temp-dir:cleanup\", TEMP_DIR_CLEANUP_LOCK_TTL);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandStaleTaskService.java", - "line": 752, - "snippet": "log.info(\"[temp-dir-cleanup] skip because another instance holds the distributed lock\");" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandStaleTaskService.java", - "line": 756, - "snippet": "Instant cutoff = Instant.now().minus(Duration.ofHours(Math.max(1L, tempDirRetentionHours)));" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandStaleTaskService.java", - "line": 770, - "snippet": "cleanupTempRoot(dirName, cutoff);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandStaleTaskService.java", - "line": 775, - "snippet": "private void cleanupTempRoot(String dirName, Instant cutoff) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandStaleTaskService.java", - "line": 788, - "snippet": "log.info(\"[temp-dir-cleanup] deleted expired temp path dir={} path={}\", dirName, child);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandStaleTaskService.java", - "line": 790, - "snippet": "log.warn(\"[temp-dir-cleanup] delete failed dir={} path={} msg={}\", dirName, child, ex.getMessage());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandStaleTaskService.java", - "line": 794, - "snippet": "log.warn(\"[temp-dir-cleanup] scan failed dir={} msg={}\", dirName, ex.getMessage());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandStaleTaskService.java", - "line": 805, - "snippet": "Files.deleteIfExists(item);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandTaskStorageService.java", - "line": 83, - "snippet": "transientPayloadStorageService.deleteReplacedPayloadIfNeeded(existing.getParsedPayloadJson(), parsed" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandTaskStorageService.java", - "line": 194, - "snippet": "transientPayloadStorageService.deleteReplacedPayloadIfNeeded(concurrentChunk.getPayloadJson(), store" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandTaskStorageService.java", - "line": 200, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(storedPayload);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandTaskStorageService.java", - "line": 209, - "snippet": "transientPayloadStorageService.deleteReplacedPayloadIfNeeded(existingChunk.getPayloadJson(), storedP" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandTaskStorageService.java", - "line": 266, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(state.getParsedPayloadJson());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandTaskStorageService.java", - "line": 267, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(state.getStateJson());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandTaskStorageService.java", - "line": 276, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(chunk.getPayloadJson());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/LocalFileStorageService.java", - "line": 41, - "snippet": "File tempDir = FileUtil.file(storageProperties.getLocalTempDir());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/LocalFileStorageService.java", - "line": 42, - "snippet": "File parentDir = tempDir.getParentFile();" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/LocalFileStorageService.java", - "line": 46, - "snippet": "FileUtil.mkdir(tempDir);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/LocalFileStorageService.java", - "line": 50, - "snippet": "File target = FileUtil.file(tempDir, filename);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/LocalFileStorageService.java", - "line": 118, - "snippet": "File baseDir = FileUtil.file(storageProperties.getLocalTempDir());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/LocalTempCleanupService.java", - "line": 19, - "snippet": "public class LocalTempCleanupService {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/LocalTempCleanupService.java", - "line": 35, - "snippet": "@Scheduled(cron = \"${aiimage.storage.cleanup-cron:0 0 */6 * * *}\")" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/LocalTempCleanupService.java", - "line": 36, - "snippet": "public void cleanupLocalTempDir() {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/LocalTempCleanupService.java", - "line": 37, - "snippet": "if (!storageProperties.isCleanupEnabled()) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/LocalTempCleanupService.java", - "line": 40, - "snippet": "File tempDir = FileUtil.file(storageProperties.getLocalTempDir());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/LocalTempCleanupService.java", - "line": 41, - "snippet": "if (!tempDir.exists() || !tempDir.isDirectory()) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/LocalTempCleanupService.java", - "line": 53, - "snippet": "File[] children = tempDir.listFiles();" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/LocalTempCleanupService.java", - "line": 61, - "snippet": "if (FileUtil.del(child)) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/LocalTempCleanupService.java", - "line": 68, - "snippet": "deleteEmptyDirectories(child, tempDir);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/LocalTempCleanupService.java", - "line": 73, - "snippet": "deleteEmptyDirectories(child, tempDir);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/LocalTempCleanupService.java", - "line": 76, - "snippet": "log.warn(\"local temp cleanup failed: path={}\", child.getAbsolutePath(), ex);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/LocalTempCleanupService.java", - "line": 81, - "snippet": "log.info(\"local temp cleanup completed: sourceDeleted={}, resultDeleted={}, transientPayloadDeleted=" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/LocalTempCleanupService.java", - "line": 82, - "snippet": "deletedSourceCount, deletedResultCount, deletedTransientPayloadCount, tempDir.getAbsolutePath());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/LocalTempCleanupService.java", - "line": 95, - "snippet": "if (isExpired(file, expireBefore) && isDirectoryEmpty(file) && FileUtil.del(file)) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/LocalTempCleanupService.java", - "line": 100, - "snippet": "if (isExpired(file, expireBefore) && FileUtil.del(file)) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/file/service/LocalTempCleanupService.java", - "line": 109, - "snippet": "if (!FileUtil.del(current)) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/imagevideo/service/ImageVideoArchiveService.java", - "line": 38, - "snippet": "private static final int RETENTION_CLEANUP_BATCH_SIZE = 200;" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/imagevideo/service/ImageVideoArchiveService.java", - "line": 108, - "snippet": "@Scheduled(fixedDelayString = \"${aiimage.image-video.retention-cleanup-delay-ms:600000}\")" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/imagevideo/service/ImageVideoArchiveService.java", - "line": 109, - "snippet": "public void cleanupExpiredWorkflowTasks() {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/imagevideo/service/ImageVideoArchiveService.java", - "line": 116, - "snippet": ".last(\"LIMIT \" + RETENTION_CLEANUP_BATCH_SIZE));" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/imagevideo/service/ImageVideoArchiveService.java", - "line": 125, - "snippet": "log.info(\"[image-video] expired workflow task cleanup deleted={} cutoff={}\", deleted, cutoff);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/imagevideo/service/ImageVideoArchiveService.java", - "line": 141, - "snippet": "log.warn(\"[image-video] expired task OSS cleanup failed taskId={} objectKey={} error={}\"," - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/imagevideo/service/ImageVideoAsyncTaskService.java", - "line": 164, - "snippet": "@Scheduled(fixedDelayString = \"${aiimage.image-video.failed-task-cleanup-delay-ms:60000}\")" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/imagevideo/service/ImageVideoAsyncTaskService.java", - "line": 165, - "snippet": "public void cleanupFailedTasks() {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/patroldelete/service/PatrolDeleteTaskService.java", - "line": 484, - "snippet": "cleanupTaskAuxiliaryDataFast(taskId);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/patroldelete/service/PatrolDeleteTaskService.java", - "line": 512, - "snippet": "cleanupResultAuxiliaryDataFast(taskId, resultId);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/patroldelete/service/PatrolDeleteTaskService.java", - "line": 521, - "snippet": "cleanupResultAuxiliaryDataFast(taskId, resultId);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/patroldelete/service/PatrolDeleteTaskService.java", - "line": 536, - "snippet": "cleanupTaskAuxiliaryDataFast(taskId);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/patroldelete/service/PatrolDeleteTaskService.java", - "line": 546, - "snippet": "private void cleanupTaskAuxiliaryData(Long taskId) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/patroldelete/service/PatrolDeleteTaskService.java", - "line": 552, - "snippet": "private void cleanupTaskAuxiliaryDataFast(Long taskId) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/patroldelete/service/PatrolDeleteTaskService.java", - "line": 559, - "snippet": "private void cleanupResultAuxiliaryData(Long taskId, Long resultId) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/patroldelete/service/PatrolDeleteTaskService.java", - "line": 564, - "snippet": "private void cleanupResultAuxiliaryDataFast(Long taskId, Long resultId) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/patroldelete/service/PatrolDeleteTaskService.java", - "line": 1029, - "snippet": "FileUtil.del(xlsx);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/pricetrack/service/PriceTrackTaskService.java", - "line": 312, - "snippet": "cleanupTaskCacheIfTerminal(taskId, task.getStatus());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/pricetrack/service/PriceTrackTaskService.java", - "line": 639, - "snippet": "cleanupTaskCacheIfTerminal(taskId, task.getStatus());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/pricetrack/service/PriceTrackTaskService.java", - "line": 653, - "snippet": "cleanupTaskCacheIfTerminal(taskId, task.getStatus());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/pricetrack/service/PriceTrackTaskService.java", - "line": 749, - "snippet": "cleanupTaskCacheIfTerminal(taskId, \"DELETE_EMPTY\");" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/pricetrack/service/PriceTrackTaskService.java", - "line": 793, - "snippet": "cn.hutool.core.io.FileUtil.del(xlsx);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/pricetrack/service/PriceTrackTaskService.java", - "line": 2092, - "snippet": "cleanupTaskCacheIfTerminal(task.getId(), task.getStatus());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/pricetrack/service/PriceTrackTaskService.java", - "line": 2130, - "snippet": "private void cleanupTaskCacheIfTerminal(Long taskId, String taskStatus) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/productrisk/service/ProductRiskTaskService.java", - "line": 288, - "snippet": "cleanupTaskCacheIfTerminal(taskId, \"DELETE_EMPTY\");" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/productrisk/service/ProductRiskTaskService.java", - "line": 367, - "snippet": "cleanupTaskCacheIfTerminal(taskId, \"DELETE_EMPTY\");" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/productrisk/service/ProductRiskTaskService.java", - "line": 420, - "snippet": "cleanupTaskCacheIfTerminal(taskId, task.getStatus());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/productrisk/service/ProductRiskTaskService.java", - "line": 833, - "snippet": "FileUtil.del(xlsx);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/productrisk/service/ProductRiskTaskService.java", - "line": 834, - "snippet": "FileUtil.del(zip);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/productrisk/service/ProductRiskTaskService.java", - "line": 951, - "snippet": "cleanupTaskCacheIfTerminal(task.getId(), task.getStatus());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/productrisk/service/ProductRiskTaskService.java", - "line": 954, - "snippet": "private void cleanupTaskCacheIfTerminal(Long taskId, String taskStatus) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/publish/service/PublishTaskService.java", - "line": 283, - "snippet": "if (committed != null && committed.cleanupAfterCommit()) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/publish/service/PublishTaskService.java", - "line": 287, - "snippet": "log.warn(\"[publish] failed-task chunk cleanup failed taskId={} msg={}\"," - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/publish/service/PublishTaskService.java", - "line": 447, - "snippet": "log.warn(\"[publish] stale task cleanup failed taskId={} msg={}\"," - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/publish/service/PublishTaskService.java", - "line": 532, - "snippet": "FileUtil.del(workDirectory);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/publish/service/PublishTaskService.java", - "line": 549, - "snippet": "log.warn(\"[publish] OSS cleanup failed taskId={} resultId={} msg={}\"," - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/publish/service/PublishTaskService.java", - "line": 575, - "snippet": "public void cleanupResultFileJob(TaskFileJobEntity job) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/publish/service/PublishTaskService.java", - "line": 592, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(chunk.getPayloadJson());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/publish/service/PublishTaskService.java", - "line": 610, - "snippet": "log.info(\"[publish] skip uncommitted payload cleanup because it is referenced pointer={}\"," - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/publish/service/PublishTaskService.java", - "line": 614, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(storedPayload);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/publish/service/PublishTaskService.java", - "line": 616, - "snippet": "log.warn(\"[publish] uncommitted RustFS payload cleanup failed pointer={} msg={}\"," - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/publish/service/PublishTaskService.java", - "line": 682, - "snippet": "ensureTaskOwnedByCurrentInstance(task, \"cleanup stale publish task\");" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/publish/service/PublishTaskService.java", - "line": 1516, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(storedPayload);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/publish/service/PublishTaskService.java", - "line": 1917, - "snippet": "private record SubmitResultCommit(boolean cleanupAfterCommit," - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/queryasin/service/QueryAsinTaskService.java", - "line": 988, - "snippet": "FileUtil.del(xlsx);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/shopdatacrawl/service/ShopDataCrawlTaskService.java", - "line": 158, - "snippet": "cleanupResultChunksQuietly(task.getId(), \"stale task failure\");" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/shopdatacrawl/service/ShopDataCrawlTaskService.java", - "line": 690, - "snippet": "// A task deletion is only a frontend task-record cleanup. The daily" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/shopdatacrawl/service/ShopDataCrawlTaskService.java", - "line": 863, - "snippet": "registerRollbackObjectCleanup(uploadedObjectKeys);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/shopdatacrawl/service/ShopDataCrawlTaskService.java", - "line": 999, - "snippet": "FileUtil.del(outputXlsx);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/shopdatacrawl/service/ShopDataCrawlTaskService.java", - "line": 1000, - "snippet": "FileUtil.del(workRoot);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/shopdatacrawl/service/ShopDataCrawlTaskService.java", - "line": 1350, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(storedPayload);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/shopdatacrawl/service/ShopDataCrawlTaskService.java", - "line": 1358, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(storedPayload);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/shopdatacrawl/service/ShopDataCrawlTaskService.java", - "line": 1373, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(storedPayload);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/shopdatacrawl/service/ShopDataCrawlTaskService.java", - "line": 1598, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(storedPayload);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/shopdatacrawl/service/ShopDataCrawlTaskService.java", - "line": 1752, - "snippet": "cleanupResultChunksQuietly(task.getId(), \"terminal task without workbook\");" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/shopdatacrawl/service/ShopDataCrawlTaskService.java", - "line": 1942, - "snippet": "FileUtil.del(outputXlsx);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/shopdatacrawl/service/ShopDataCrawlTaskService.java", - "line": 1943, - "snippet": "FileUtil.del(workRoot);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/shopdatacrawl/service/ShopDataCrawlTaskService.java", - "line": 2277, - "snippet": "private void registerRollbackObjectCleanup(List uploadedObjectKeys) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/shopdatacrawl/service/ShopDataCrawlTaskService.java", - "line": 2319, - "snippet": "log.warn(\"[shop-data-crawl] daily object cleanup failed object={} msg={}\", objectKey, safeMessage(ex" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/shopdatacrawl/service/ShopDataCrawlTaskService.java", - "line": 2421, - "snippet": "public void cleanupResultFileJob(TaskFileJobEntity job) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/shopdatacrawl/service/ShopDataCrawlTaskService.java", - "line": 2458, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(chunk.getPayloadJson());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/shopdatacrawl/service/ShopDataCrawlTaskService.java", - "line": 2470, - "snippet": "private void cleanupResultChunksQuietly(Long taskId, String reason) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/shopdatacrawl/service/ShopDataCrawlTaskService.java", - "line": 2474, - "snippet": "log.warn(\"[shop-data-crawl] result chunk cleanup failed taskId={} reason={} msg={}\"," - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/shopdatacrawl/service/ShopDataCrawlTaskService.java", - "line": 2581, - "snippet": "FileUtil.del(outputXlsx);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/shopdatacrawl/service/ShopDataCrawlTaskService.java", - "line": 2582, - "snippet": "FileUtil.del(workRoot);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/shopdatacrawl/service/ShopDataCrawlTaskService.java", - "line": 2844, - "snippet": "cleanupResultChunksQuietly(task.getId(), \"result file job exhausted\");" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/shopkey/service/QueryAsinService.java", - "line": 397, - "snippet": "Files.deleteIfExists(file.toPath());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/shopkey/service/SkipPriceAsinService.java", - "line": 782, - "snippet": "Files.deleteIfExists(file.toPath());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/shopmatch/service/ShopMatchTaskCacheService.java", - "line": 146, - "snippet": "Files.deleteIfExists(buildTaskEntityFile(taskId));" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/shopmatch/service/ShopMatchTaskCacheService.java", - "line": 152, - "snippet": "Files.deleteIfExists(path);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/shopmatch/service/ShopMatchTaskCacheService.java", - "line": 163, - "snippet": "Files.deleteIfExists(buildTaskEntityFile(taskId));" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/shopmatch/service/ShopMatchTaskCacheService.java", - "line": 216, - "snippet": "Files.deleteIfExists(file);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/shopmatch/service/ShopMatchTaskService.java", - "line": 790, - "snippet": "FileUtil.del(xlsx);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 788, - "snippet": "// that candidate; cleanup is only safe after a successful transaction" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 791, - "snippet": "cleanupPreparedSubmittedChunkIfUnreferenced(prepared);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 854, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(payload);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 1161, - "snippet": "log.info(\"[similar-asin] duplicate chunk inserted concurrently taskId={} scope={} chunk={} cleanupLo" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 1190, - "snippet": "private void cleanupPreparedSubmittedChunkIfUnreferenced(PreparedSubmittedChunk prepared) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 1200, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(prepared.storedPayload());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 1202, - "snippet": "log.warn(\"[similar-asin] cleanup uncommitted chunk payload failed taskId={} chunk={} err={}\"," - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 1703, - "snippet": "transientPayloadStorageService.deleteReplacedPayloadIfNeeded(oldPayload, storedPayload);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 1706, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(storedPayload);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 3251, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(pointer);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 3283, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(pointer);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 3868, - "snippet": "public void cleanupResultFileJob(TaskFileJobEntity job) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 3896, - "snippet": "File outputDir = new File(storageProperties.getLocalTempDir(), \"similar-asin-result\");" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 4076, - "snippet": "File outputDir = new File(storageProperties.getLocalTempDir(), \"similar-asin-result\");" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 4544, - "snippet": "Path spoolDir = Files.createTempDirectory(xlsx.getParentFile().toPath(), \"similar-asin-images-\");" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/service/SimilarAsinTaskService.java", - "line": 5409, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(storedPayload);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/util/ExcelCellImageWriter.java", - "line": 154, - "snippet": "Files.deleteIfExists(tmp);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/util/SimilarAsinImageEmbedder.java", - "line": 681, - "snippet": "Files.deleteIfExists(path);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/util/SimilarAsinImageEmbedder.java", - "line": 686, - "snippet": "Files.deleteIfExists(path);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/util/SimilarAsinImageEmbedder.java", - "line": 732, - "snippet": "Files.deleteIfExists(temp);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/util/SimilarAsinImageEmbedder.java", - "line": 734, - "snippet": "// Best-effort cleanup of a failed cache write." - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/util/SimilarAsinImageEmbedder.java", - "line": 1286, - "snippet": "Files.deleteIfExists(file);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/util/SimilarAsinImageEmbedder.java", - "line": 1306, - "snippet": "Files.deleteIfExists(path);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/similarasin/util/WpsCellImageWriter.java", - "line": 165, - "snippet": "Files.deleteIfExists(tmp);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/split/service/SplitRunService.java", - "line": 213, - "snippet": "File outputDir = FileUtil.mkdir(FileUtil.file(storageProperties.getLocalTempDir(), \"split-result\"));" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/split/service/SplitRunService.java", - "line": 362, - "snippet": "File baseDir = FileUtil.file(storageProperties.getLocalTempDir());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/split/service/SplitRunService.java", - "line": 395, - "snippet": "File outputDir = FileUtil.mkdir(FileUtil.file(storageProperties.getLocalTempDir(), \"split-result\"));" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/AppearancePatentResultFileJobHandler.java", - "line": 9, - "snippet": "* cleanup 委托 cleanupResultFileJob;支持异步 offload;owner scoped。" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/AppearancePatentResultFileJobHandler.java", - "line": 30, - "snippet": "public void cleanup(TaskFileJobEntity job) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/AppearancePatentResultFileJobHandler.java", - "line": 31, - "snippet": "appearancePatentTaskService.cleanupResultFileJob(job);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/BrandResultFileJobHandler.java", - "line": 10, - "snippet": "* cleanup 为空(原 cleanupAfterSuccess 无 BRAND 分支)。" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/CollectDataResultFileJobHandler.java", - "line": 8, - "snippet": "* cleanup 为空(原 cleanupAfterSuccess 无 COLLECT_DATA 分支)。" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/DeleteBrandResultFileJobHandler.java", - "line": 29, - "snippet": "public void cleanup(TaskFileJobEntity job) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/DeleteBrandResultFileJobHandler.java", - "line": 30, - "snippet": "deleteBrandRunService.cleanupResultFileJob(job);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 41, - "snippet": "public class ModuleHistoryCleanupService {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 44, - "snippet": "private static final Duration CLEANUP_LOCK_TTL = Duration.ofHours(2);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 49, - "snippet": "private final ModuleCleanupProperties moduleCleanupProperties;" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 67, - "snippet": "@Value(\"${aiimage.module-cleanup.max-collect-payloads:10000}\")" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 70, - "snippet": "public ModuleHistoryCleanupService(ModuleCleanupProperties moduleCleanupProperties," - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 83, - "snippet": "this.moduleCleanupProperties = moduleCleanupProperties;" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 102, - "snippet": "@Scheduled(cron = \"${aiimage.module-cleanup.cron:0 0 0 * * *}\")" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 103, - "snippet": "public void cleanupConfiguredModules() {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 105, - "snippet": "distributedJobLockService.tryLock(\"module-history:cleanup\", CLEANUP_LOCK_TTL);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 107, - "snippet": "log.info(\"[module-cleanup] skip because another instance holds the distributed lock\");" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 111, - "snippet": "if (!moduleCleanupProperties.isEnabled()) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 114, - "snippet": "List moduleTypes = moduleCleanupProperties.getModuleTypes();" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 118, - "snippet": "LocalDateTime cutoff = LocalDateTime.now().minusDays(Math.max(0, moduleCleanupProperties.getRetentio" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 119, - "snippet": "int batchSize = moduleCleanupProperties.getBatchSize();" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 169, - "snippet": "log.info(\"[module-cleanup] batch: taskIds={}, deletedRows={}, collectedPointers={}\"," - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 177, - "snippet": "log.warn(\"[module-cleanup] keyset cursor did not advance, abort loop cursor={}\", cursor);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 182, - "snippet": "log.info(\"[module-cleanup] completed: moduleTypes={}, retentionDays={}, cutoff={}, batches={}, delet" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 183, - "snippet": "moduleTypes, moduleCleanupProperties.getRetentionDays(), cutoff," - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 191, - "snippet": "private int deleteRows(List moduleTypes, List cleanupTaskIds, List collectDataTa" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 194, - "snippet": ".in(TaskFileJobEntity::getTaskId, cleanupTaskIds));" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 198, - "snippet": ".in(TaskResultItemEntity::getTaskId, cleanupTaskIds));" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 202, - "snippet": ".in(TaskProgressSnapshotEntity::getTaskId, cleanupTaskIds));" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 206, - "snippet": ".in(TaskResultPayloadEntity::getTaskId, cleanupTaskIds));" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 210, - "snippet": ".in(TaskScopeStateEntity::getTaskId, cleanupTaskIds));" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 214, - "snippet": ".in(TaskChunkEntity::getTaskId, cleanupTaskIds));" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 223, - "snippet": ".in(FileResultEntity::getTaskId, cleanupTaskIds));" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 226, - "snippet": ".in(FileTaskEntity::getId, cleanupTaskIds)" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 232, - "snippet": ".in(FileTaskEntity::getId, cleanupTaskIds));" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 260, - "snippet": "private List collectPayloadPointers(List moduleTypes, List cleanupTaskIds, int" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 264, - "snippet": ".in(TaskChunkEntity::getTaskId, cleanupTaskIds));" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 270, - "snippet": ".in(TaskScopeStateEntity::getTaskId, cleanupTaskIds));" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ModuleHistoryCleanupService.java", - "line": 276, - "snippet": "log.warn(\"[module-cleanup] payload pointer collection truncated at max={}\", max);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/PatrolDeleteResultFileJobHandler.java", - "line": 32, - "snippet": "public void cleanup(TaskFileJobEntity job) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/PriceTrackResultFileJobHandler.java", - "line": 32, - "snippet": "public void cleanup(TaskFileJobEntity job) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ProductRiskResultFileJobHandler.java", - "line": 32, - "snippet": "public void cleanup(TaskFileJobEntity job) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/PublishResultFileJobHandler.java", - "line": 8, - "snippet": "* cleanup 委托 PublishTaskService.cleanupResultFileJob(不走 payload.deleteLatest);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/PublishResultFileJobHandler.java", - "line": 31, - "snippet": "public void cleanup(TaskFileJobEntity job) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/PublishResultFileJobHandler.java", - "line": 32, - "snippet": "publishTaskService.cleanupResultFileJob(job);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/QueryAsinResultFileJobHandler.java", - "line": 32, - "snippet": "public void cleanup(TaskFileJobEntity job) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ResultFileJobHandler.java", - "line": 10, - "snippet": "* cleanup 在 Job 成功后调用(原 cleanupAfterSuccess 分支);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ResultFileJobHandler.java", - "line": 24, - "snippet": "default void cleanup(TaskFileJobEntity job) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ShopDataCrawlResultFileJobHandler.java", - "line": 8, - "snippet": "* cleanup 两处:payload.deleteLatest + 服务内 cleanupResultFileJob(原分支语义);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ShopDataCrawlResultFileJobHandler.java", - "line": 34, - "snippet": "public void cleanup(TaskFileJobEntity job) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ShopDataCrawlResultFileJobHandler.java", - "line": 36, - "snippet": "shopDataCrawlTaskService.cleanupResultFileJob(job);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ShopMatchResultFileJobHandler.java", - "line": 9, - "snippet": "* cleanup 删除该任务最新 payload(原 cleanupAfterSuccess 分支语义)。" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/ShopMatchResultFileJobHandler.java", - "line": 34, - "snippet": "public void cleanup(TaskFileJobEntity job) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/SimilarAsinResultFileJobHandler.java", - "line": 30, - "snippet": "public void cleanup(TaskFileJobEntity job) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/SimilarAsinResultFileJobHandler.java", - "line": 31, - "snippet": "similarAsinTaskService.cleanupResultFileJob(job);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskImageCacheCleanupService.java", - "line": 17, - "snippet": "public class TaskImageCacheCleanupService {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskImageCacheCleanupService.java", - "line": 19, - "snippet": "private static final Duration CLEANUP_LOCK_TTL = Duration.ofMinutes(30);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskImageCacheCleanupService.java", - "line": 22, - "snippet": "private final TaskImageCacheCleanupProperties cleanupProperties;" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskImageCacheCleanupService.java", - "line": 25, - "snippet": "@Scheduled(cron = \"${aiimage.task-image-cache-cleanup.cron:0 30 2 * * *}\")" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskImageCacheCleanupService.java", - "line": 26, - "snippet": "public void cleanupExpiredImageCache() {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskImageCacheCleanupService.java", - "line": 27, - "snippet": "if (!cleanupProperties.isEnabled()) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskImageCacheCleanupService.java", - "line": 31, - "snippet": "distributedJobLockService.tryLock(\"task-image-cache:cleanup\", CLEANUP_LOCK_TTL);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskImageCacheCleanupService.java", - "line": 33, - "snippet": "log.info(\"[task-image-cache-cleanup] skip because another instance holds the distributed lock\");" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskImageCacheCleanupService.java", - "line": 37, - "snippet": "int retentionDays = Math.max(1, cleanupProperties.getRetentionDays());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskImageCacheCleanupService.java", - "line": 38, - "snippet": "int batchSize = Math.max(1, cleanupProperties.getBatchSize());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskImageCacheCleanupService.java", - "line": 39, - "snippet": "int maxBatches = Math.max(1, cleanupProperties.getMaxBatchesPerRun());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskImageCacheCleanupService.java", - "line": 51, - "snippet": "if (!lockHandle.renew(CLEANUP_LOCK_TTL)) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskImageCacheCleanupService.java", - "line": 52, - "snippet": "log.warn(\"[task-image-cache-cleanup] stop because lock renew failed deletedTotal={} batches={}\"," - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskImageCacheCleanupService.java", - "line": 61, - "snippet": "long maxBytes = cleanupProperties.getMaxBytes();" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskImageCacheCleanupService.java", - "line": 62, - "snippet": "long targetBytes = cleanupProperties.getTargetBytes();" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskImageCacheCleanupService.java", - "line": 81, - "snippet": "if (!lockHandle.renew(CLEANUP_LOCK_TTL)) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskImageCacheCleanupService.java", - "line": 82, - "snippet": "log.warn(\"[task-image-cache-cleanup] stop capacity cleanup because lock renew failed deletedTotal={}" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskImageCacheCleanupService.java", - "line": 94, - "snippet": "log.info(\"[task-image-cache-cleanup] finished cutoff={} retentionDays={} expiredDeleted={} expiredBa" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskImageCacheCleanupService.java", - "line": 99, - "snippet": "log.warn(\"[task-image-cache-cleanup] failed msg={}\", ex.getMessage(), ex);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskResultFileJobWorker.java", - "line": 225, - "snippet": "cleanupAfterSuccess(job);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskResultFileJobWorker.java", - "line": 351, - "snippet": "private void cleanupAfterSuccess(TaskFileJobEntity job) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskResultFileJobWorker.java", - "line": 354, - "snippet": "handler.cleanup(job);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskResultItemService.java", - "line": 109, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(row.getPayloadJson());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskResultItemService.java", - "line": 140, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(row.getPayloadJson());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskResultItemService.java", - "line": 206, - "snippet": "transientPayloadStorageService.deleteReplacedPayloadIfNeeded(storedPayload, existing.getPayloadJson(" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskResultItemService.java", - "line": 209, - "snippet": "transientPayloadStorageService.deleteReplacedPayloadIfNeeded(existing.getPayloadJson(), storedPayloa" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskResultPayloadService.java", - "line": 64, - "snippet": "transientPayloadStorageService.deleteReplacedPayloadIfNeeded(existing.getPayloadJson(), storedPayloa" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskResultPayloadService.java", - "line": 99, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(existing.getPayloadJson());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskScopePayloadBufferMaintenanceService.java", - "line": 27, - "snippet": "private static final Duration CLEANUP_LOCK_TTL = Duration.ofMinutes(10);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskScopePayloadBufferMaintenanceService.java", - "line": 57, - "snippet": "Files.deleteIfExists(file);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskScopePayloadBufferMaintenanceService.java", - "line": 73, - "snippet": "@Scheduled(cron = \"${aiimage.task-pressure.scope-payload-cleanup-cron:15 */30 * * * *}\")" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskScopePayloadBufferMaintenanceService.java", - "line": 74, - "snippet": "public void cleanupExpiredBufferedPayloads() {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskScopePayloadBufferMaintenanceService.java", - "line": 76, - "snippet": "distributedJobLockService.tryLock(\"task-scope-buffer:cleanup\", CLEANUP_LOCK_TTL);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskScopePayloadBufferMaintenanceService.java", - "line": 78, - "snippet": "log.info(\"[task-scope-buffer] skip cleanup because another instance holds the lock\");" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskScopePayloadBufferMaintenanceService.java", - "line": 94, - "snippet": "Files.deleteIfExists(file);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskScopePayloadBufferMaintenanceService.java", - "line": 98, - "snippet": "log.warn(\"[task-scope-buffer] cleanup failed path={} msg={}\", file, ex.getMessage());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskScopePayloadBufferMaintenanceService.java", - "line": 102, - "snippet": "log.info(\"[task-scope-buffer] cleanup finished deleted={} root={}\", deleted, root);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskScopePayloadBufferMaintenanceService.java", - "line": 163, - "snippet": "Files.deleteIfExists(current);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskScopePayloadStorageService.java", - "line": 54, - "snippet": "transientPayloadStorageService.deleteReplacedPayloadIfNeeded(replacedPayload, stateJson);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskScopePayloadStorageService.java", - "line": 67, - "snippet": "log.warn(\"[task-scope-payload] skip failed-save cleanup because reference check failed taskId={} mod" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskScopePayloadStorageService.java", - "line": 71, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(uploadedPayload);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskScopePayloadStorageService.java", - "line": 84, - "snippet": "log.warn(\"[task-scope-payload] skip failed-save cleanup because current state pointer is unreadable " - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskScopePayloadStorageService.java", - "line": 184, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(state.getStateJson());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskScopePayloadStorageService.java", - "line": 233, - "snippet": "transientPayloadStorageService.deletePayloadIfPresent(state.getStateJson());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TaskScopePayloadStorageService.java", - "line": 294, - "snippet": "transientPayloadStorageService.deleteReplacedPayloadIfNeeded(state.getParsedPayloadJson(), storedPar" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TransientPayloadStorageService.java", - "line": 86, - "snippet": "&& (rustfsObjectStorageService.isConfigured() || storageProperties.getLocalTempDir() != null);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TransientPayloadStorageService.java", - "line": 165, - "snippet": "public void deletePayloadIfPresent(String value) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TransientPayloadStorageService.java", - "line": 203, - "snippet": "* 老路径 caller 把自己那行覆盖/删除后立即调用 {@link #deletePayloadIfPresent}," - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TransientPayloadStorageService.java", - "line": 265, - "snippet": "deletePayloadIfPresent(oldPointer);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TransientPayloadStorageService.java", - "line": 526, - "snippet": "Files.deleteIfExists(resolveLocalPayloadPath(objectKey));" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/TransientPayloadStorageService.java", - "line": 542, - "snippet": "String configuredRoot = storageProperties.getLocalTempDir();" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/WithdrawResultFileJobHandler.java", - "line": 9, - "snippet": "* cleanup 走 payload.deleteLatest。" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/service/WithdrawResultFileJobHandler.java", - "line": 42, - "snippet": "public void cleanup(TaskFileJobEntity job) {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/util/TaskEntityLocalCache.java", - "line": 88, - "snippet": "@Scheduled(fixedDelayString = \"${aiimage.task-pressure.local-task-entity-cache-cleanup-delay-ms:6000" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/task/util/TaskEntityLocalCache.java", - "line": 89, - "snippet": "public void cleanup() {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/withdraw/service/WithdrawTaskService.java", - "line": 432, - "snippet": "FileUtil.del(xlsx);" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/ziniao/memory/service/ZiniaoTransientCacheService.java", - "line": 92, - "snippet": "cleanupExpiredEntries(LocalDateTime.now());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/ziniao/memory/service/ZiniaoTransientCacheService.java", - "line": 121, - "snippet": "@Scheduled(fixedDelayString = \"${aiimage.ziniao.transient-cache-cleanup-delay-ms:60000}\")" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/ziniao/memory/service/ZiniaoTransientCacheService.java", - "line": 122, - "snippet": "void cleanupExpiredEntriesScheduled() {" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/ziniao/memory/service/ZiniaoTransientCacheService.java", - "line": 123, - "snippet": "cleanupExpiredEntries(LocalDateTime.now());" - }, - { - "file": "src/main/java/com/nanri/aiimage/modules/ziniao/memory/service/ZiniaoTransientCacheService.java", - "line": 127, - "snippet": "private void cleanupExpiredEntries(LocalDateTime now) {" - } - ] -} \ No newline at end of file diff --git a/backend-java/scripts/tx_report.json b/backend-java/scripts/tx_report.json deleted file mode 100644 index ae655ce3..00000000 --- a/backend-java/scripts/tx_report.json +++ /dev/null @@ -1,3186 +0,0 @@ -{ - "scanned_files": 640, - "modules": [ - "admin", - "appearancepatent", - "auth", - "brand", - "collectdata", - "convert", - "debug", - "dedupe", - "deletebrand", - "digitalhuman", - "file", - "filetemplate", - "imagehistory", - "imagevideo", - "invalidasin", - "patroldelete", - "permission", - "pricetrack", - "productcategory", - "productrisk", - "publish", - "queryasin", - "shopdatacrawl", - "shopkey", - "shopmatch", - "similarasin", - "split", - "task", - "withdraw", - "ziniao" - ], - "findings": [ - { - "file": "digitalhuman\\service\\DigitalHumanVersionService.java", - "line": 38, - "method": "uploadVersion", - "signature": "public DigitalHumanVersionVo uploadVersion(String version, MultipartFile file, String changelog, Str", - "class_level": false, - "python_facing": true, - "must_stay": [ - "write" - ], - "movable": [ - "assembly", - "cleanup", - "log" - ], - "counts": { - "write": 1, - "compute": 0, - "assembly": 1, - "cleanup": 12, - "log": 8 - }, - "priority": 21, - "module": "digitalhuman" - }, - { - "file": "shopdatacrawl\\service\\ShopDataCrawlTaskService.java", - "line": 677, - "method": "deleteTask", - "signature": "public void deleteTask(Long taskId, Long userId", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write", - "lock" - ], - "movable": [ - "compute" - ], - "counts": { - "write": 1, - "lock": 2, - "compute": 12, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 12, - "module": "shopdatacrawl" - }, - { - "file": "pricetrack\\service\\PriceTrackLoopRunService.java", - "line": 85, - "method": "dispatchNext", - "signature": "public PriceTrackLoopRunDispatchVo dispatchNext(Long loopRunId, Long userId", - "class_level": false, - "python_facing": false, - "must_stay": [], - "movable": [ - "assembly" - ], - "counts": { - "compute": 0, - "assembly": 9, - "cleanup": 0, - "log": 0 - }, - "priority": 9, - "module": "pricetrack" - }, - { - "file": "permission\\service\\PermissionMenuService.java", - "line": 333, - "method": "updateUserColumnPermissions", - "signature": "public void updateUserColumnPermissions(AdminUserEntity operator, Long userId, UserColumnPermissionU", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "compute" - ], - "counts": { - "write": 1, - "compute": 8, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 8, - "module": "permission" - }, - { - "file": "deletebrand\\service\\DeleteBrandRunService.java", - "line": 1285, - "method": "submitResult", - "signature": "public void submitResult(Long taskId, DeleteBrandSubmitResultRequest request", - "class_level": false, - "python_facing": true, - "must_stay": [ - "write", - "lock" - ], - "movable": [ - "log" - ], - "counts": { - "write": 1, - "lock": 2, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 6 - }, - "priority": 6, - "module": "deletebrand" - }, - { - "file": "permission\\service\\PermissionMenuService.java", - "line": 233, - "method": "updateImageVideoDataPermissionUsers", - "signature": "public int updateImageVideoDataPermissionUsers(AdminUserEntity operator, List userIds", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "compute" - ], - "counts": { - "write": 1, - "compute": 5, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 5, - "module": "permission" - }, - { - "file": "permission\\service\\PermissionMenuService.java", - "line": 273, - "method": "updateShopDataCrawlDataPermissionUsers", - "signature": "public int updateShopDataCrawlDataPermissionUsers(AdminUserEntity operator, List userIds", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "compute" - ], - "counts": { - "write": 1, - "compute": 5, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 5, - "module": "permission" - }, - { - "file": "task\\service\\TaskFileJobService.java", - "line": 244, - "method": "resetStuckRunningJobsDetailed", - "signature": "public StuckJobResetResult resetStuckRunningJobsDetailed(int stuckMinutes, int limit", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "compute" - ], - "counts": { - "write": 3, - "compute": 5, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 5, - "module": "task" - }, - { - "file": "shopkey\\service\\ShopCredentialCheckService.java", - "line": 45, - "method": "create", - "signature": "public ShopCredentialCheckVo create(String shopName", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "assembly", - "log" - ], - "counts": { - "write": 1, - "compute": 0, - "assembly": 2, - "cleanup": 0, - "log": 1 - }, - "priority": 3, - "module": "shopkey" - }, - { - "file": "shopkey\\service\\ShopCredentialCheckService.java", - "line": 71, - "method": "claimForClient", - "signature": "public ShopCredentialCheckClaimVo claimForClient(String clientHost", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "assembly", - "log" - ], - "counts": { - "write": 1, - "compute": 0, - "assembly": 1, - "cleanup": 0, - "log": 2 - }, - "priority": 3, - "module": "shopkey" - }, - { - "file": "shopmatch\\service\\ShopMatchTaskService.java", - "line": 423, - "method": "createTask", - "signature": "public ShopMatchCreateTaskVo createTask(ShopMatchCreateTaskRequest request", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "compute", - "assembly" - ], - "counts": { - "write": 2, - "compute": 2, - "assembly": 1, - "cleanup": 0, - "log": 0 - }, - "priority": 3, - "module": "shopmatch" - }, - { - "file": "pricetrack\\service\\PriceTrackService.java", - "line": 70, - "method": "addCandidate", - "signature": "public PriceTrackCandidateVo addCandidate(PriceTrackCandidateAddRequest request", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "assembly" - ], - "counts": { - "write": 1, - "compute": 0, - "assembly": 2, - "cleanup": 0, - "log": 0 - }, - "priority": 2, - "module": "pricetrack" - }, - { - "file": "pricetrack\\service\\PriceTrackTaskService.java", - "line": 438, - "method": "createTask", - "signature": "public PriceTrackCreateTaskVo createTask(PriceTrackCreateTaskRequest request", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "assembly", - "log" - ], - "counts": { - "write": 3, - "compute": 0, - "assembly": 1, - "cleanup": 0, - "log": 1 - }, - "priority": 2, - "module": "pricetrack" - }, - { - "file": "productrisk\\service\\ProductRiskResolveService.java", - "line": 68, - "method": "addCandidate", - "signature": "public ProductRiskCandidateVo addCandidate(ProductRiskCandidateAddRequest request", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "assembly" - ], - "counts": { - "write": 1, - "compute": 0, - "assembly": 2, - "cleanup": 0, - "log": 0 - }, - "priority": 2, - "module": "productrisk" - }, - { - "file": "shopdatacrawl\\service\\ShopDataCrawlResolveService.java", - "line": 77, - "method": "addCandidate", - "signature": "public ProductRiskCandidateVo addCandidate(ProductRiskCandidateAddRequest request", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "assembly" - ], - "counts": { - "write": 1, - "compute": 0, - "assembly": 2, - "cleanup": 0, - "log": 0 - }, - "priority": 2, - "module": "shopdatacrawl" - }, - { - "file": "shopkey\\service\\ShopCredentialCheckService.java", - "line": 106, - "method": "report", - "signature": "public void report(Long id, ShopCredentialCheckReportRequest request", - "class_level": false, - "python_facing": true, - "must_stay": [ - "write" - ], - "movable": [ - "log" - ], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 2 - }, - "priority": 2, - "module": "shopkey" - }, - { - "file": "shopmatch\\service\\ShopMatchResolveService.java", - "line": 62, - "method": "addCandidate", - "signature": "public ProductRiskCandidateVo addCandidate(ProductRiskCandidateAddRequest request", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "assembly" - ], - "counts": { - "write": 1, - "compute": 0, - "assembly": 2, - "cleanup": 0, - "log": 0 - }, - "priority": 2, - "module": "shopmatch" - }, - { - "file": "shopmatch\\service\\ShopMatchTaskService.java", - "line": 504, - "method": "activateTask", - "signature": "public void activateTask(Long taskId, Long userId, Integer stageIndex", - "class_level": false, - "python_facing": false, - "must_stay": [ - "lock" - ], - "movable": [ - "log" - ], - "counts": { - "lock": 2, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 2 - }, - "priority": 2, - "module": "shopmatch" - }, - { - "file": "ziniao\\memory\\service\\ZiniaoMemoryStoreService.java", - "line": 109, - "method": "put", - "signature": "public void put(String cacheType, String cacheKey, Object payload, Duration ttl", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "log" - ], - "counts": { - "write": 2, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 2 - }, - "priority": 2, - "module": "ziniao" - }, - { - "file": "collectdata\\service\\CollectDataService.java", - "line": 1315, - "method": "saveCountryPreference", - "signature": "public CollectDataCountryPreferenceVo saveCountryPreference(CollectDataCountryPreferenceSaveRequest ", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "assembly" - ], - "counts": { - "write": 2, - "compute": 0, - "assembly": 1, - "cleanup": 0, - "log": 0 - }, - "priority": 1, - "module": "collectdata" - }, - { - "file": "convert\\service\\ConvertTemplateService.java", - "line": 43, - "method": "importTemplate", - "signature": "public ConvertTemplateVo importTemplate(ConvertTemplateImportRequest request", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "assembly" - ], - "counts": { - "write": 1, - "compute": 0, - "assembly": 1, - "cleanup": 0, - "log": 0 - }, - "priority": 1, - "module": "convert" - }, - { - "file": "deletebrand\\service\\DeleteBrandTaskStorageService.java", - "line": 41, - "method": "saveParsedPayload", - "signature": "public void saveParsedPayload(Long taskId, Map parsedPayloadB", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "log" - ], - "counts": { - "write": 2, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 1 - }, - "priority": 1, - "module": "deletebrand" - }, - { - "file": "digitalhuman\\service\\DigitalHumanVersionService.java", - "line": 141, - "method": "releaseVersion", - "signature": "public DigitalHumanVersionVo releaseVersion(String version", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "assembly" - ], - "counts": { - "write": 1, - "compute": 0, - "assembly": 1, - "cleanup": 0, - "log": 0 - }, - "priority": 1, - "module": "digitalhuman" - }, - { - "file": "digitalhuman\\service\\DigitalHumanVersionService.java", - "line": 163, - "method": "setLatest", - "signature": "public DigitalHumanVersionVo setLatest(String version", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "assembly" - ], - "counts": { - "write": 2, - "compute": 0, - "assembly": 1, - "cleanup": 0, - "log": 0 - }, - "priority": 1, - "module": "digitalhuman" - }, - { - "file": "digitalhuman\\service\\DigitalHumanVersionService.java", - "line": 190, - "method": "deleteVersion", - "signature": "public void deleteVersion(String version", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "log" - ], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 1 - }, - "priority": 1, - "module": "digitalhuman" - }, - { - "file": "patroldelete\\service\\PatrolDeleteTaskService.java", - "line": 277, - "method": "createTask", - "signature": "public PatrolDeleteCreateTaskVo createTask(PatrolDeleteCreateTaskRequest request", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "assembly" - ], - "counts": { - "write": 2, - "compute": 0, - "assembly": 1, - "cleanup": 0, - "log": 0 - }, - "priority": 1, - "module": "patroldelete" - }, - { - "file": "patroldelete\\service\\PatrolDeleteTaskService.java", - "line": 470, - "method": "deleteTask", - "signature": "public void deleteTask(Long taskId, Long userId", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write", - "lock" - ], - "movable": [ - "log" - ], - "counts": { - "write": 1, - "lock": 2, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 1 - }, - "priority": 1, - "module": "patroldelete" - }, - { - "file": "pricetrack\\service\\PriceTrackLoopRunService.java", - "line": 47, - "method": "createLoopRun", - "signature": "public PriceTrackLoopRunVo createLoopRun(PriceTrackLoopRunCreateRequest request", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "assembly" - ], - "counts": { - "write": 1, - "compute": 0, - "assembly": 1, - "cleanup": 0, - "log": 0 - }, - "priority": 1, - "module": "pricetrack" - }, - { - "file": "pricetrack\\service\\PriceTrackLoopRunService.java", - "line": 137, - "method": "childFinished", - "signature": "public PriceTrackLoopRunVo childFinished(Long loopRunId, Long userId, PriceTrackLoopRunChildFinished", - "class_level": false, - "python_facing": false, - "must_stay": [], - "movable": [ - "assembly" - ], - "counts": { - "compute": 0, - "assembly": 1, - "cleanup": 0, - "log": 0 - }, - "priority": 1, - "module": "pricetrack" - }, - { - "file": "pricetrack\\service\\PriceTrackLoopRunService.java", - "line": 144, - "method": "requestStop", - "signature": "public PriceTrackLoopRunVo requestStop(Long loopRunId, Long userId", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "assembly" - ], - "counts": { - "write": 1, - "compute": 0, - "assembly": 1, - "cleanup": 0, - "log": 0 - }, - "priority": 1, - "module": "pricetrack" - }, - { - "file": "pricetrack\\service\\PriceTrackLoopRunService.java", - "line": 157, - "method": "bindChildTask", - "signature": "public void bindChildTask(Long loopRunId, Long childTaskId, Integer roundIndex, Integer shopIndex", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "log" - ], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 1 - }, - "priority": 1, - "module": "pricetrack" - }, - { - "file": "pricetrack\\service\\PriceTrackService.java", - "line": 186, - "method": "saveCountryPreference", - "signature": "public PriceTrackCountryPreferenceVo saveCountryPreference(PriceTrackCountryPreferenceSaveRequest re", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "assembly" - ], - "counts": { - "write": 2, - "compute": 0, - "assembly": 1, - "cleanup": 0, - "log": 0 - }, - "priority": 1, - "module": "pricetrack" - }, - { - "file": "pricetrack\\service\\PriceTrackTaskService.java", - "line": 288, - "method": "markDispatchFailed", - "signature": "public void markDispatchFailed(Long taskId, Long userId, String errorMessage", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write", - "lock" - ], - "movable": [ - "log" - ], - "counts": { - "write": 1, - "lock": 2, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 1 - }, - "priority": 1, - "module": "pricetrack" - }, - { - "file": "pricetrack\\service\\PriceTrackTaskService.java", - "line": 328, - "method": "deletePendingShopResult", - "signature": "public PriceTrackPendingDeleteVo deletePendingShopResult(Long userId, String shopName", - "class_level": false, - "python_facing": true, - "must_stay": [ - "write", - "lock" - ], - "movable": [ - "assembly" - ], - "counts": { - "write": 1, - "lock": 2, - "compute": 0, - "assembly": 1, - "cleanup": 0, - "log": 0 - }, - "priority": 1, - "module": "pricetrack" - }, - { - "file": "productrisk\\service\\ProductRiskResolveService.java", - "line": 167, - "method": "saveCountryPreference", - "signature": "public ProductRiskCountryPreferenceVo saveCountryPreference(ProductRiskCountryPreferenceSaveRequest ", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "assembly" - ], - "counts": { - "write": 2, - "compute": 0, - "assembly": 1, - "cleanup": 0, - "log": 0 - }, - "priority": 1, - "module": "productrisk" - }, - { - "file": "productrisk\\service\\ProductRiskTaskService.java", - "line": 296, - "method": "deletePendingShopResult", - "signature": "public ProductRiskPendingDeleteVo deletePendingShopResult(Long userId, String shopName", - "class_level": false, - "python_facing": true, - "must_stay": [ - "write", - "lock" - ], - "movable": [ - "assembly" - ], - "counts": { - "write": 1, - "lock": 2, - "compute": 0, - "assembly": 1, - "cleanup": 0, - "log": 0 - }, - "priority": 1, - "module": "productrisk" - }, - { - "file": "productrisk\\service\\ProductRiskTaskService.java", - "line": 487, - "method": "createTask", - "signature": "public ProductRiskCreateTaskVo createTask(ProductRiskCreateTaskRequest request", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "assembly" - ], - "counts": { - "write": 3, - "compute": 0, - "assembly": 1, - "cleanup": 0, - "log": 0 - }, - "priority": 1, - "module": "productrisk" - }, - { - "file": "publish\\service\\PublishTaskService.java", - "line": 538, - "method": "deleteTask", - "signature": "public void deleteTask(Long taskId, Long userId", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "log" - ], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 1 - }, - "priority": 1, - "module": "publish" - }, - { - "file": "queryasin\\service\\QueryAsinTaskService.java", - "line": 264, - "method": "createTask", - "signature": "public QueryAsinCreateTaskVo createTask(QueryAsinCreateTaskRequest request", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "assembly" - ], - "counts": { - "write": 2, - "compute": 0, - "assembly": 1, - "cleanup": 0, - "log": 0 - }, - "priority": 1, - "module": "queryasin" - }, - { - "file": "shopdatacrawl\\service\\ShopDataCrawlResolveService.java", - "line": 191, - "method": "saveCountryPreference", - "signature": "public ProductRiskCountryPreferenceVo saveCountryPreference(ProductRiskCountryPreferenceSaveRequest ", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "assembly" - ], - "counts": { - "write": 2, - "compute": 0, - "assembly": 1, - "cleanup": 0, - "log": 0 - }, - "priority": 1, - "module": "shopdatacrawl" - }, - { - "file": "shopdatacrawl\\service\\ShopDataCrawlTaskService.java", - "line": 430, - "method": "createTask", - "signature": "public ShopDataCrawlCreateTaskVo createTask(ShopDataCrawlCreateTaskRequest request", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "assembly" - ], - "counts": { - "write": 2, - "compute": 0, - "assembly": 1, - "cleanup": 0, - "log": 0 - }, - "priority": 1, - "module": "shopdatacrawl" - }, - { - "file": "shopkey\\service\\ShopManageGroupService.java", - "line": 124, - "method": "create", - "signature": "public ShopManageGroupItemVo create(ShopManageGroupCreateRequest request, Long operatorId, boolean s", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "assembly" - ], - "counts": { - "write": 1, - "compute": 0, - "assembly": 1, - "cleanup": 0, - "log": 0 - }, - "priority": 1, - "module": "shopkey" - }, - { - "file": "shopkey\\service\\ShopManageGroupService.java", - "line": 139, - "method": "update", - "signature": "public ShopManageGroupItemVo update(Long id, Long operatorId, boolean superAdmin, ShopManageGroupUpd", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "assembly" - ], - "counts": { - "write": 1, - "compute": 0, - "assembly": 1, - "cleanup": 0, - "log": 0 - }, - "priority": 1, - "module": "shopkey" - }, - { - "file": "shopmatch\\service\\ShopMatchResolveService.java", - "line": 163, - "method": "saveCountryPreference", - "signature": "public ProductRiskCountryPreferenceVo saveCountryPreference(ProductRiskCountryPreferenceSaveRequest ", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "assembly" - ], - "counts": { - "write": 2, - "compute": 0, - "assembly": 1, - "cleanup": 0, - "log": 0 - }, - "priority": 1, - "module": "shopmatch" - }, - { - "file": "withdraw\\service\\WithdrawResolveService.java", - "line": 49, - "method": "addCandidate", - "signature": "public ProductRiskCandidateVo addCandidate(ProductRiskCandidateAddRequest request", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "assembly" - ], - "counts": { - "write": 1, - "compute": 0, - "assembly": 1, - "cleanup": 0, - "log": 0 - }, - "priority": 1, - "module": "withdraw" - }, - { - "file": "withdraw\\service\\WithdrawTaskService.java", - "line": 164, - "method": "createTask", - "signature": "public WithdrawCreateTaskVo createTask(WithdrawCreateTaskRequest request", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "assembly" - ], - "counts": { - "write": 2, - "compute": 0, - "assembly": 1, - "cleanup": 0, - "log": 0 - }, - "priority": 1, - "module": "withdraw" - }, - { - "file": "ziniao\\memory\\service\\ZiniaoMemoryStoreService.java", - "line": 154, - "method": "delete", - "signature": "public void delete(String cacheType, String cacheKey", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "log" - ], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 1 - }, - "priority": 1, - "module": "ziniao" - }, - { - "file": "ziniao\\memory\\service\\ZiniaoMemoryStoreService.java", - "line": 191, - "method": "updateStaleMarks", - "signature": "public int updateStaleMarks(List rows", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [ - "log" - ], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 1 - }, - "priority": 1, - "module": "ziniao" - }, - { - "file": "admin\\service\\AdminUserService.java", - "line": 104, - "method": "createUser", - "signature": "public Long createUser(AdminUserEntity currentUser, AdminUserCreateRequest request", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "admin" - }, - { - "file": "admin\\service\\AdminUserService.java", - "line": 162, - "method": "updateUser", - "signature": "public void updateUser(AdminUserEntity currentUser, Long uid, AdminUserUpdateRequest request", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "admin" - }, - { - "file": "appearancepatent\\service\\AppearancePatentTaskService.java", - "line": 265, - "method": "activateTask", - "signature": "public void activateTask(Long taskId, Long userId", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "appearancepatent" - }, - { - "file": "appearancepatent\\service\\AppearancePatentTaskService.java", - "line": 502, - "method": "deleteTask", - "signature": "public void deleteTask(Long taskId, Long userId", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "appearancepatent" - }, - { - "file": "brand\\service\\BrandTaskStorageService.java", - "line": 39, - "method": "saveParsedPayload", - "signature": "public void saveParsedPayload(Long taskId, List payload", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 2, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "brand" - }, - { - "file": "brand\\service\\BrandTaskStorageService.java", - "line": 111, - "method": "storeChunk", - "signature": "public ChunkStoreResult storeChunk(Long taskId, BrandCrawlResultFileDto file", - "class_level": false, - "python_facing": true, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "brand" - }, - { - "file": "brand\\service\\BrandTaskStorageService.java", - "line": 223, - "method": "refreshFileAggregate", - "signature": "public ChunkStoreResult refreshFileAggregate(Long taskId, String fileUrl", - "class_level": false, - "python_facing": false, - "must_stay": [], - "movable": [], - "counts": { - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "brand" - }, - { - "file": "brand\\service\\BrandTaskStorageService.java", - "line": 239, - "method": "deleteTaskData", - "signature": "public void deleteTaskData(Long taskId", - "class_level": false, - "python_facing": false, - "must_stay": [], - "movable": [], - "counts": { - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "brand" - }, - { - "file": "collectdata\\service\\CollectDataService.java", - "line": 365, - "method": "activateTask", - "signature": "public void activateTask(Long taskId, Long userId", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "collectdata" - }, - { - "file": "collectdata\\service\\CollectDataService.java", - "line": 376, - "method": "failTask", - "signature": "public void failTask(Long taskId, Long userId, String error", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 2, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "collectdata" - }, - { - "file": "collectdata\\service\\CollectDataService.java", - "line": 398, - "method": "updateProgress", - "signature": "public void updateProgress(Long taskId, TaskHeartbeatRequest request", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write", - "lock" - ], - "movable": [], - "counts": { - "write": 1, - "lock": 2, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "collectdata" - }, - { - "file": "collectdata\\service\\CollectDataService.java", - "line": 1243, - "method": "deleteTask", - "signature": "public void deleteTask(Long taskId, Long userId", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "collectdata" - }, - { - "file": "convert\\service\\ConvertTemplateService.java", - "line": 67, - "method": "setDefaultTemplate", - "signature": "public void setDefaultTemplate(String templateCode", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "convert" - }, - { - "file": "convert\\service\\ConvertTemplateService.java", - "line": 78, - "method": "deleteTemplate", - "signature": "public void deleteTemplate(String templateCode", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "convert" - }, - { - "file": "dedupe\\service\\DedupeTotalDataService.java", - "line": 357, - "method": "create", - "signature": "public DedupeTotalDataItemVo create(DedupeTotalDataCreateRequest request, Long operatorId", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "dedupe" - }, - { - "file": "dedupe\\service\\DedupeTotalDataService.java", - "line": 915, - "method": "update", - "signature": "public DedupeTotalDataItemVo update(Long id, DedupeTotalDataUpdateRequest request, Long operatorId", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "dedupe" - }, - { - "file": "dedupe\\service\\DedupeTotalDataService.java", - "line": 928, - "method": "delete", - "signature": "public void delete(Long id, Long operatorId", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "dedupe" - }, - { - "file": "deletebrand\\service\\DeleteBrandTaskStorageService.java", - "line": 144, - "method": "storeResultChunkIfChanged", - "signature": "public boolean storeResultChunkIfChanged(Long taskId, String scopeKey, Integer chunkIndex, DeleteBra", - "class_level": false, - "python_facing": true, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 3, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "deletebrand" - }, - { - "file": "deletebrand\\service\\DeleteBrandTaskStorageService.java", - "line": 255, - "method": "deleteTaskData", - "signature": "public void deleteTaskData(Long taskId", - "class_level": false, - "python_facing": false, - "must_stay": [], - "movable": [], - "counts": { - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "deletebrand" - }, - { - "file": "imagevideo\\service\\ImageVideoSecretService.java", - "line": 35, - "method": "save", - "signature": "public ImageVideoSecretStatusVo save(ImageVideoSecretSaveRequest request", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 2, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "imagevideo" - }, - { - "file": "invalidasin\\service\\InvalidAsinDataService.java", - "line": 79, - "method": "create", - "signature": "public InvalidAsinDataItemVo create(InvalidAsinDataCreateRequest request, Long operatorId, boolean s", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "invalidasin" - }, - { - "file": "invalidasin\\service\\InvalidAsinDataService.java", - "line": 94, - "method": "update", - "signature": "public InvalidAsinDataItemVo update(Long id, InvalidAsinDataUpdateRequest request, Long operatorId, ", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "invalidasin" - }, - { - "file": "invalidasin\\service\\InvalidAsinDataService.java", - "line": 119, - "method": "delete", - "signature": "public void delete(Long id, Long operatorId, boolean superAdmin", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "invalidasin" - }, - { - "file": "patroldelete\\service\\PatrolDeleteResolveService.java", - "line": 113, - "method": "deleteCandidate", - "signature": "public void deleteCandidate(Long userId, Long id", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "patroldelete" - }, - { - "file": "patroldelete\\service\\PatrolDeleteResolveService.java", - "line": 165, - "method": "addCondition", - "signature": "public PatrolDeleteConditionVo addCondition(PatrolDeleteConditionAddRequest request", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "patroldelete" - }, - { - "file": "patroldelete\\service\\PatrolDeleteResolveService.java", - "line": 188, - "method": "deleteCondition", - "signature": "public void deleteCondition(Long userId, Long id", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "patroldelete" - }, - { - "file": "patroldelete\\service\\PatrolDeleteTaskService.java", - "line": 502, - "method": "deleteHistory", - "signature": "public void deleteHistory(Long resultId, Long userId", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write", - "lock" - ], - "movable": [], - "counts": { - "write": 2, - "lock": 2, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "patroldelete" - }, - { - "file": "permission\\service\\PermissionMenuService.java", - "line": 61, - "method": "create", - "signature": "public PermissionMenuItemVo create(PermissionMenuCreateRequest request", - "class_level": false, - "python_facing": false, - "must_stay": [], - "movable": [], - "counts": { - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "permission" - }, - { - "file": "permission\\service\\PermissionMenuService.java", - "line": 67, - "method": "create", - "signature": "public PermissionMenuItemVo create(AdminUserEntity operator, PermissionMenuCreateRequest request", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "permission" - }, - { - "file": "permission\\service\\PermissionMenuService.java", - "line": 93, - "method": "update", - "signature": "public PermissionMenuItemVo update(Long id, PermissionMenuUpdateRequest request", - "class_level": false, - "python_facing": false, - "must_stay": [], - "movable": [], - "counts": { - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "permission" - }, - { - "file": "permission\\service\\PermissionMenuService.java", - "line": 99, - "method": "update", - "signature": "public PermissionMenuItemVo update(AdminUserEntity operator, Long id, PermissionMenuUpdateRequest re", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "permission" - }, - { - "file": "permission\\service\\PermissionMenuService.java", - "line": 126, - "method": "delete", - "signature": "public void delete(Long id", - "class_level": false, - "python_facing": false, - "must_stay": [], - "movable": [], - "counts": { - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "permission" - }, - { - "file": "permission\\service\\PermissionMenuService.java", - "line": 135, - "method": "delete", - "signature": "public void delete(AdminUserEntity operator, Long id", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "permission" - }, - { - "file": "permission\\service\\PermissionMenuService.java", - "line": 315, - "method": "updateUserColumnPermissions", - "signature": "public void updateUserColumnPermissions(Long userId, UserColumnPermissionUpdateRequest request", - "class_level": false, - "python_facing": false, - "must_stay": [], - "movable": [], - "counts": { - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "permission" - }, - { - "file": "permission\\service\\PermissionMenuService.java", - "line": 325, - "method": "updateUserColumnPermissions", - "signature": "public void updateUserColumnPermissions(AdminUserEntity operator, Long userId, UserColumnPermissionU", - "class_level": false, - "python_facing": false, - "must_stay": [], - "movable": [], - "counts": { - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "permission" - }, - { - "file": "pricetrack\\service\\PriceTrackLoopRunService.java", - "line": 182, - "method": "syncLoopRunAfterChildTerminal", - "signature": "public void syncLoopRunAfterChildTerminal(Long childTaskId", - "class_level": false, - "python_facing": false, - "must_stay": [], - "movable": [], - "counts": { - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "pricetrack" - }, - { - "file": "pricetrack\\service\\PriceTrackLoopRunService.java", - "line": 190, - "method": "syncLoopRunAfterChildRemoved", - "signature": "public void syncLoopRunAfterChildRemoved(Long childTaskId", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "pricetrack" - }, - { - "file": "pricetrack\\service\\PriceTrackService.java", - "line": 117, - "method": "deleteCandidate", - "signature": "public void deleteCandidate(Long userId, Long id", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "pricetrack" - }, - { - "file": "pricetrack\\service\\PriceTrackTaskService.java", - "line": 249, - "method": "deleteHistory", - "signature": "public void deleteHistory(Long resultId, Long userId", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write", - "lock" - ], - "movable": [], - "counts": { - "write": 2, - "lock": 2, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "pricetrack" - }, - { - "file": "pricetrack\\service\\PriceTrackTaskService.java", - "line": 271, - "method": "deleteTask", - "signature": "public void deleteTask(Long taskId, Long userId", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write", - "lock" - ], - "movable": [], - "counts": { - "write": 1, - "lock": 2, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "pricetrack" - }, - { - "file": "productcategory\\service\\ProductCategoryService.java", - "line": 86, - "method": "create", - "signature": "public ProductCategoryItemVo create(ProductCategorySaveRequest request", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "productcategory" - }, - { - "file": "productcategory\\service\\ProductCategoryService.java", - "line": 104, - "method": "update", - "signature": "public ProductCategoryItemVo update(Long id, ProductCategorySaveRequest request", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "productcategory" - }, - { - "file": "productcategory\\service\\ProductCategoryService.java", - "line": 120, - "method": "delete", - "signature": "public void delete(Long id", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "productcategory" - }, - { - "file": "productrisk\\service\\ProductRiskResolveService.java", - "line": 111, - "method": "deleteCandidate", - "signature": "public void deleteCandidate(Long userId, Long id", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "productrisk" - }, - { - "file": "productrisk\\service\\ProductRiskTaskService.java", - "line": 245, - "method": "deleteHistory", - "signature": "public void deleteHistory(Long resultId, Long userId", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write", - "lock" - ], - "movable": [], - "counts": { - "write": 2, - "lock": 2, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "productrisk" - }, - { - "file": "productrisk\\service\\ProductRiskTaskService.java", - "line": 273, - "method": "deleteTask", - "signature": "public void deleteTask(Long taskId, Long userId", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write", - "lock" - ], - "movable": [], - "counts": { - "write": 1, - "lock": 2, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "productrisk" - }, - { - "file": "queryasin\\service\\QueryAsinResolveService.java", - "line": 115, - "method": "deleteCandidate", - "signature": "public void deleteCandidate(Long userId, Long id", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "queryasin" - }, - { - "file": "queryasin\\service\\QueryAsinTaskService.java", - "line": 467, - "method": "deleteTask", - "signature": "public void deleteTask(Long taskId, Long userId", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write", - "lock" - ], - "movable": [], - "counts": { - "write": 1, - "lock": 2, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "queryasin" - }, - { - "file": "queryasin\\service\\QueryAsinTaskService.java", - "line": 483, - "method": "deleteHistory", - "signature": "public void deleteHistory(Long resultId, Long userId", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write", - "lock" - ], - "movable": [], - "counts": { - "write": 2, - "lock": 2, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "queryasin" - }, - { - "file": "shopdatacrawl\\service\\ShopDataCrawlResolveService.java", - "line": 121, - "method": "deleteCandidate", - "signature": "public void deleteCandidate(Long userId, Long id", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "shopdatacrawl" - }, - { - "file": "shopdatacrawl\\service\\ShopDataCrawlTaskService.java", - "line": 734, - "method": "deleteHistory", - "signature": "public void deleteHistory(Long resultId, Long userId", - "class_level": false, - "python_facing": false, - "must_stay": [ - "lock" - ], - "movable": [], - "counts": { - "lock": 2, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "shopdatacrawl" - }, - { - "file": "shopdatacrawl\\service\\ShopDataCrawlTaskService.java", - "line": 760, - "method": "deleteAdminHistory", - "signature": "public void deleteAdminHistory(Long resultId", - "class_level": false, - "python_facing": false, - "must_stay": [], - "movable": [], - "counts": { - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "shopdatacrawl" - }, - { - "file": "shopkey\\service\\QueryAsinService.java", - "line": 214, - "method": "createOrUpdate", - "signature": "public QueryAsinItemVo createOrUpdate(QueryAsinCreateRequest request, Long operatorId, boolean super", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "shopkey" - }, - { - "file": "shopkey\\service\\QueryAsinService.java", - "line": 238, - "method": "deleteCountry", - "signature": "public void deleteCountry(Long id, String country, Long operatorId, boolean superAdmin", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 2, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "shopkey" - }, - { - "file": "shopkey\\service\\QueryAsinService.java", - "line": 250, - "method": "updateCountry", - "signature": "public QueryAsinItemVo updateCountry(Long id, String country, String asin, Long operatorId, boolean ", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "shopkey" - }, - { - "file": "shopkey\\service\\ShopKeyService.java", - "line": 50, - "method": "create", - "signature": "public ShopKeyItemVo create(ShopKeyCreateRequest request", - "class_level": false, - "python_facing": false, - "must_stay": [], - "movable": [], - "counts": { - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "shopkey" - }, - { - "file": "shopkey\\service\\ShopKeyService.java", - "line": 67, - "method": "update", - "signature": "public ShopKeyItemVo update(Long id, ShopKeyUpdateRequest request", - "class_level": false, - "python_facing": false, - "must_stay": [], - "movable": [], - "counts": { - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "shopkey" - }, - { - "file": "shopkey\\service\\ShopKeyService.java", - "line": 89, - "method": "delete", - "signature": "public void delete(Long id", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "shopkey" - }, - { - "file": "shopkey\\service\\ShopManageGroupService.java", - "line": 151, - "method": "delete", - "signature": "public void delete(Long id, Long operatorId, boolean superAdmin", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "shopkey" - }, - { - "file": "shopkey\\service\\ShopManageService.java", - "line": 94, - "method": "create", - "signature": "public ShopManageItemVo create(ShopManageCreateRequest request, Long operatorId, boolean superAdmin", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "shopkey" - }, - { - "file": "shopkey\\service\\ShopManageService.java", - "line": 116, - "method": "update", - "signature": "public ShopManageItemVo update(Long id, Long operatorId, boolean superAdmin, ShopManageUpdateRequest", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "shopkey" - }, - { - "file": "shopkey\\service\\ShopManageService.java", - "line": 139, - "method": "delete", - "signature": "public void delete(Long id, Long operatorId, boolean superAdmin", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "shopkey" - }, - { - "file": "shopkey\\service\\SkipPriceAsinService.java", - "line": 269, - "method": "create", - "signature": "public SkipPriceAsinItemVo create(SkipPriceAsinCreateRequest request, Long operatorId, boolean super", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "shopkey" - }, - { - "file": "shopkey\\service\\SkipPriceAsinService.java", - "line": 306, - "method": "deleteCountry", - "signature": "public void deleteCountry(Long id, String country, Long operatorId, boolean superAdmin", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 2, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "shopkey" - }, - { - "file": "shopkey\\service\\SkipPriceAsinService.java", - "line": 319, - "method": "updateCountry", - "signature": "public SkipPriceAsinItemVo updateCountry(Long id, String country, String asin, BigDecimal minimumPri", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "shopkey" - }, - { - "file": "shopkey\\service\\SkipPriceAsinService.java", - "line": 1367, - "method": "removeByShopCountryAndAsin", - "signature": "public boolean removeByShopCountryAndAsin(String shopName, String country, String asin", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 2, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "shopkey" - }, - { - "file": "shopmatch\\service\\ShopMatchResolveService.java", - "line": 108, - "method": "deleteCandidate", - "signature": "public void deleteCandidate(Long userId, Long id", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "shopmatch" - }, - { - "file": "shopmatch\\service\\ShopMatchTaskService.java", - "line": 279, - "method": "deleteHistory", - "signature": "public void deleteHistory(Long resultId, Long userId", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write", - "lock" - ], - "movable": [], - "counts": { - "write": 2, - "lock": 2, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "shopmatch" - }, - { - "file": "shopmatch\\service\\ShopMatchTaskService.java", - "line": 303, - "method": "deleteTask", - "signature": "public void deleteTask(Long taskId, Long userId", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write", - "lock" - ], - "movable": [], - "counts": { - "write": 1, - "lock": 2, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "shopmatch" - }, - { - "file": "shopmatch\\service\\ShopMatchTaskService.java", - "line": 555, - "method": "completeStage", - "signature": "public void completeStage(Long taskId, Long userId, ShopMatchStageCompleteRequest request", - "class_level": false, - "python_facing": false, - "must_stay": [], - "movable": [], - "counts": { - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "shopmatch" - }, - { - "file": "similarasin\\service\\SimilarAsinTaskService.java", - "line": 400, - "method": "addFilterCondition", - "signature": "public SimilarAsinFilterConditionVo addFilterCondition(SimilarAsinFilterConditionAddRequest request", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "similarasin" - }, - { - "file": "similarasin\\service\\SimilarAsinTaskService.java", - "line": 439, - "method": "deleteFilterCondition", - "signature": "public void deleteFilterCondition(Long userId, Long id", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "similarasin" - }, - { - "file": "similarasin\\service\\SimilarAsinTaskService.java", - "line": 597, - "method": "activateTask", - "signature": "public void activateTask(Long taskId, Long userId", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write", - "lock" - ], - "movable": [], - "counts": { - "write": 1, - "lock": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "similarasin" - }, - { - "file": "similarasin\\service\\SimilarAsinTaskService.java", - "line": 2237, - "method": "handleResultFileJobFailure", - "signature": "public void handleResultFileJobFailure(TaskFileJobEntity job, String message", - "class_level": false, - "python_facing": true, - "must_stay": [ - "lock" - ], - "movable": [], - "counts": { - "lock": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "similarasin" - }, - { - "file": "task\\service\\TaskFileJobService.java", - "line": 217, - "method": "retry", - "signature": "public boolean retry(Long jobId", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "task" - }, - { - "file": "task\\service\\TaskFileJobService.java", - "line": 239, - "method": "resetStuckRunningJobs", - "signature": "public int resetStuckRunningJobs(int stuckMinutes, int limit", - "class_level": false, - "python_facing": false, - "must_stay": [], - "movable": [], - "counts": { - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "task" - }, - { - "file": "task\\service\\TaskFileJobService.java", - "line": 461, - "method": "requeue", - "signature": "public boolean requeue(Long jobId, String message", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "task" - }, - { - "file": "task\\service\\TaskFileJobService.java", - "line": 659, - "method": "deleteTaskJobs", - "signature": "public void deleteTaskJobs(Long taskId, String moduleType", - "class_level": false, - "python_facing": false, - "must_stay": [], - "movable": [], - "counts": { - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "task" - }, - { - "file": "task\\service\\TaskFileJobService.java", - "line": 669, - "method": "deleteResultJobs", - "signature": "public void deleteResultJobs(Long taskId, String moduleType, Long resultId", - "class_level": false, - "python_facing": true, - "must_stay": [], - "movable": [], - "counts": { - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "task" - }, - { - "file": "task\\service\\TaskProgressSnapshotService.java", - "line": 33, - "method": "save", - "signature": "public void save(Long taskId, String moduleType, String status, int totalCount, int successCount, in", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 2, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "task" - }, - { - "file": "task\\service\\TaskProgressSnapshotService.java", - "line": 149, - "method": "delete", - "signature": "public void delete(Long taskId, String moduleType", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "task" - }, - { - "file": "task\\service\\TaskResultItemService.java", - "line": 97, - "method": "deleteResultItem", - "signature": "public void deleteResultItem(Long taskId, String moduleType, Long resultId", - "class_level": false, - "python_facing": true, - "must_stay": [], - "movable": [], - "counts": { - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "task" - }, - { - "file": "task\\service\\TaskResultItemService.java", - "line": 118, - "method": "deleteResultItemRowsOnly", - "signature": "public void deleteResultItemRowsOnly(Long taskId, String moduleType, Long resultId", - "class_level": false, - "python_facing": true, - "must_stay": [], - "movable": [], - "counts": { - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "task" - }, - { - "file": "task\\service\\TaskResultItemService.java", - "line": 129, - "method": "deleteTaskItems", - "signature": "public void deleteTaskItems(Long taskId, String moduleType", - "class_level": false, - "python_facing": false, - "must_stay": [], - "movable": [], - "counts": { - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "task" - }, - { - "file": "task\\service\\TaskResultItemService.java", - "line": 148, - "method": "deleteTaskItemsRowsOnly", - "signature": "public void deleteTaskItemsRowsOnly(Long taskId, String moduleType", - "class_level": false, - "python_facing": false, - "must_stay": [], - "movable": [], - "counts": { - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "task" - }, - { - "file": "task\\service\\TaskResultPayloadService.java", - "line": 92, - "method": "deleteLatest", - "signature": "public void deleteLatest(Long taskId, String moduleType, String scopeKey", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "task" - }, - { - "file": "task\\service\\TaskScopePayloadStorageService.java", - "line": 175, - "method": "removeScopePayload", - "signature": "public void removeScopePayload(Long taskId, String moduleType, String scopeKey", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 2, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "task" - }, - { - "file": "task\\service\\TaskScopePayloadStorageService.java", - "line": 218, - "method": "deleteTaskScopePayloads", - "signature": "public void deleteTaskScopePayloads(Long taskId, String moduleType", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 2, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "task" - }, - { - "file": "task\\service\\TaskScopePayloadStorageService.java", - "line": 245, - "method": "deleteTaskScopePayloadRowsOnly", - "signature": "public void deleteTaskScopePayloadRowsOnly(Long taskId, String moduleType", - "class_level": false, - "python_facing": false, - "must_stay": [], - "movable": [], - "counts": { - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "task" - }, - { - "file": "task\\service\\TaskScopePayloadStorageService.java", - "line": 255, - "method": "saveParsedPayloadMap", - "signature": "public void saveParsedPayloadMap(Long taskId, String moduleType, Map payloadByScope", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 2, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "task" - }, - { - "file": "task\\service\\TaskScopePayloadStorageService.java", - "line": 331, - "method": "recoverBufferedScopePayload", - "signature": "public boolean recoverBufferedScopePayload(Long taskId, String moduleType, String scopeHash", - "class_level": false, - "python_facing": false, - "must_stay": [], - "movable": [], - "counts": { - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "task" - }, - { - "file": "withdraw\\service\\WithdrawResolveService.java", - "line": 84, - "method": "deleteCandidate", - "signature": "public void deleteCandidate(Long userId, Long id", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "withdraw" - }, - { - "file": "withdraw\\service\\WithdrawResolveService.java", - "line": 97, - "method": "deleteCandidatesByShopNames", - "signature": "public void deleteCandidatesByShopNames(Long userId, List shopNames", - "class_level": false, - "python_facing": false, - "must_stay": [], - "movable": [], - "counts": { - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "withdraw" - }, - { - "file": "withdraw\\service\\WithdrawTaskService.java", - "line": 352, - "method": "deleteTask", - "signature": "public void deleteTask(Long taskId, Long userId", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write", - "lock" - ], - "movable": [], - "counts": { - "write": 1, - "lock": 2, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "withdraw" - }, - { - "file": "withdraw\\service\\WithdrawTaskService.java", - "line": 371, - "method": "deleteHistory", - "signature": "public void deleteHistory(Long resultId, Long userId", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write", - "lock" - ], - "movable": [], - "counts": { - "write": 2, - "lock": 2, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "withdraw" - }, - { - "file": "ziniao\\memory\\service\\ZiniaoMemoryStoreService.java", - "line": 168, - "method": "deleteByType", - "signature": "public int deleteByType(String cacheType, int limit", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "ziniao" - }, - { - "file": "ziniao\\memory\\service\\ZiniaoMemoryStoreService.java", - "line": 215, - "method": "touchExpiryBatch", - "signature": "public void touchExpiryBatch(List rows, Duration ttl", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "ziniao" - }, - { - "file": "ziniao\\memory\\service\\ZiniaoMemoryStoreService.java", - "line": 235, - "method": "deleteAllByType", - "signature": "public int deleteAllByType(String cacheType", - "class_level": false, - "python_facing": false, - "must_stay": [], - "movable": [], - "counts": { - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "ziniao" - }, - { - "file": "ziniao\\memory\\service\\ZiniaoMemoryStoreService.java", - "line": 242, - "method": "deleteExpired", - "signature": "public int deleteExpired(int limit", - "class_level": false, - "python_facing": false, - "must_stay": [ - "write" - ], - "movable": [], - "counts": { - "write": 1, - "compute": 0, - "assembly": 0, - "cleanup": 0, - "log": 0 - }, - "priority": 0, - "module": "ziniao" - } - ] -} \ No newline at end of file diff --git a/backend-java/src/main/java/com/nanri/aiimage/modules/appearancepatent/model/dto/AppearancePatentParsedGroupManifestDto.java b/backend-java/src/main/java/com/nanri/aiimage/modules/appearancepatent/model/dto/AppearancePatentParsedGroupManifestDto.java deleted file mode 100644 index c3d2250a..00000000 --- a/backend-java/src/main/java/com/nanri/aiimage/modules/appearancepatent/model/dto/AppearancePatentParsedGroupManifestDto.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.nanri.aiimage.modules.appearancepatent.model.dto; - -import lombok.Data; - -import java.util.ArrayList; -import java.util.List; - -@Data -public class AppearancePatentParsedGroupManifestDto { - private String aiPrompt; - private String apiKey; - private String patentToken; - private Integer pageSize; - private Integer totalGroups; - private Integer totalRows; - private List pages = new ArrayList<>(); - - @Data - public static class PageRef { - private Integer page; - private Integer groupCount; - private String ref; - } -} diff --git a/backend-java/src/main/java/com/nanri/aiimage/modules/brand/model/dto/BrandTaskRunRequest.java b/backend-java/src/main/java/com/nanri/aiimage/modules/brand/model/dto/BrandTaskRunRequest.java deleted file mode 100644 index 63f90688..00000000 --- a/backend-java/src/main/java/com/nanri/aiimage/modules/brand/model/dto/BrandTaskRunRequest.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.nanri.aiimage.modules.brand.model.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.List; - -@Data -@Schema(description = "品牌任务兼容立即执行请求") -public class BrandTaskRunRequest { - - @Schema(description = "旧页面传入的本地路径列表,仅兼容旧接口") - private List paths; - - @Schema(description = "品牌匹配方式: Terms/Simple") - private String strategy = "Terms"; - - @Schema(description = "任务类型: 1=立即执行") - private Integer taskType = 1; -} diff --git a/backend-java/src/main/java/com/nanri/aiimage/modules/brand/model/vo/LegacyBrandTaskCreateVo.java b/backend-java/src/main/java/com/nanri/aiimage/modules/brand/model/vo/LegacyBrandTaskCreateVo.java deleted file mode 100644 index 67b1c253..00000000 --- a/backend-java/src/main/java/com/nanri/aiimage/modules/brand/model/vo/LegacyBrandTaskCreateVo.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.nanri.aiimage.modules.brand.model.vo; - -import lombok.Data; - -@Data -public class LegacyBrandTaskCreateVo { - - private Long task_id; -} diff --git a/backend-java/src/main/java/com/nanri/aiimage/modules/ziniao/model/dto/ZiniaoSwitchShopRequest.java b/backend-java/src/main/java/com/nanri/aiimage/modules/ziniao/model/dto/ZiniaoSwitchShopRequest.java deleted file mode 100644 index 0d2cd0c9..00000000 --- a/backend-java/src/main/java/com/nanri/aiimage/modules/ziniao/model/dto/ZiniaoSwitchShopRequest.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.nanri.aiimage.modules.ziniao.model.dto; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -@Data -public class ZiniaoSwitchShopRequest { - @NotBlank(message = "sessionId 不能为空") - private String sessionId; - - @NotNull(message = "userId 不能为空") - private Long userId; - - @NotBlank(message = "shopId 不能为空") - private String shopId; -} diff --git a/backend-java/src/main/java/com/nanri/aiimage/modules/ziniao/model/vo/ZiniaoCurrentShopVo.java b/backend-java/src/main/java/com/nanri/aiimage/modules/ziniao/model/vo/ZiniaoCurrentShopVo.java deleted file mode 100644 index 9eac55c2..00000000 --- a/backend-java/src/main/java/com/nanri/aiimage/modules/ziniao/model/vo/ZiniaoCurrentShopVo.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.nanri.aiimage.modules.ziniao.model.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Data -@Schema(description = "当前紫鸟店铺") -public class ZiniaoCurrentShopVo { - @Schema(description = "店铺 ID") - private String shopId; - - @Schema(description = "店铺名称") - private String shopName; - - @Schema(description = "平台") - private String platform; - - @Schema(description = "选中时间戳(毫秒)") - private Long selectedAt; -} diff --git a/backend-java/src/main/java/com/nanri/aiimage/modules/ziniao/model/vo/ZiniaoLoginUrlVo.java b/backend-java/src/main/java/com/nanri/aiimage/modules/ziniao/model/vo/ZiniaoLoginUrlVo.java deleted file mode 100644 index e44525c8..00000000 --- a/backend-java/src/main/java/com/nanri/aiimage/modules/ziniao/model/vo/ZiniaoLoginUrlVo.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.nanri.aiimage.modules.ziniao.model.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Data -@Schema(description = "紫鸟登录地址") -public class ZiniaoLoginUrlVo { - @Schema(description = "登录链接") - private String loginUrl; - - @Schema(description = "登录 state") - private String state; - - @Schema(description = "state 过期时间戳(毫秒)") - private Long expireAt; -} diff --git a/backend-java/src/main/java/com/nanri/aiimage/modules/ziniao/model/vo/ZiniaoSwitchShopVo.java b/backend-java/src/main/java/com/nanri/aiimage/modules/ziniao/model/vo/ZiniaoSwitchShopVo.java deleted file mode 100644 index 5691cd06..00000000 --- a/backend-java/src/main/java/com/nanri/aiimage/modules/ziniao/model/vo/ZiniaoSwitchShopVo.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.nanri.aiimage.modules.ziniao.model.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Data -@Schema(description = "切换紫鸟店铺结果") -public class ZiniaoSwitchShopVo { - @Schema(description = "是否切换成功") - private Boolean success; - - @Schema(description = "当前店铺 ID") - private String currentShopId; - - @Schema(description = "当前店铺名称") - private String currentShopName; - - @Schema(description = "紫鸟启动链接") - private String openStoreUrl; -} diff --git a/backend/.device_id b/backend/.device_id deleted file mode 100644 index 6e07d8fa..00000000 --- a/backend/.device_id +++ /dev/null @@ -1 +0,0 @@ -8cecee3bc02a178bf372ca1c3d02fc5cae3c0a51c8346f6e6a710988599c08be \ No newline at end of file diff --git a/backend/requirement.txt b/backend/requirement.txt index c7e9b685..27213ce4 100644 --- a/backend/requirement.txt +++ b/backend/requirement.txt @@ -1,63 +1,15 @@ -alibabacloud-oss-v2==1.2.4 -annotated-types==0.7.0 -anyio==4.12.1 -Authlib==1.6.8 -blinker==1.9.0 -boto3==1.43.65 -botocore==1.43.65 -bottle==0.13.4 -certifi==2026.1.4 -cffi==2.0.0 -charset-normalizer==3.4.4 -click==8.1.8 -clr_loader==0.2.10 -colorama==0.4.6 -crcmod-plus==2.3.1 -cryptography==41.0.0 -distro==1.9.0 -et_xmlfile==2.0.0 -exceptiongroup==1.3.1 +# Flask 版本公开 API 服务依赖(2026-09-11 由 pip freeze 全量清单裁剪) +# +# 原文件是 63 条的 pip freeze 快照,含 Nuitka/PyQt5/pywebview/pandas/numpy/bottle/websockets +# 等桌面端与旧后台打包遗留,本服务实际一个都不用。此处只保留真实 import 到的包: +# app.py / blueprints/version.py -> flask, flask-cors +# utils/db.py -> pymysql, werkzeug(security.generate_password_hash) +# config.py -> python-dotenv(可选,import 失败时走环境变量) +# +# 注意:run.sh 会检查本文件是否存在(缺失直接报错退出),并在关键依赖缺失时 +# 执行 `pip install -r requirement.txt`,因此不要删除本文件。 Flask==3.1.3 flask-cors==6.0.2 -h11==0.16.0 -httpcore==1.0.9 -httpx==0.28.1 -idna==3.11 -importlib_metadata==8.7.1 -itsdangerous==2.2.0 -Jinja2==3.1.6 -MarkupSafe==3.0.3 -Nuitka==2.8.6 -numpy==1.25.2 -openpyxl==3.1.5 -ordered-set==4.1.0 -pandas==2.3.3 -pillow==11.3.0 -pip==26.0.1 -proxy_tools==0.1.0 -psutil==7.2.2 -pycparser==2.23 -pycryptodome==3.23.0 -pydantic==2.12.5 -pydantic_core==2.41.5 PyMySQL==1.1.2 -PyQt5==5.15.11 -PyQt5-Qt5==5.15.2 -PyQt5_sip==12.17.1 -python-dateutil==2.9.0.post0 -python-dotenv==1.0.1 -pythonnet==3.0.5 -pytz==2026.1.post1 -pywebview==6.1 -requests==2.32.5 -setuptools==80.9.0 -six==1.17.0 -typing_extensions==4.15.0 -typing-inspection==0.4.2 -tzdata==2025.3 -urllib3==2.6.3 -websockets==14.2 Werkzeug==3.1.6 -wheel==0.45.1 -zipp==3.23.0 -zstandard==0.25.0 +python-dotenv==1.0.1 diff --git a/backend/tool/devices.py b/backend/tool/devices.py deleted file mode 100644 index a82b5d5b..00000000 --- a/backend/tool/devices.py +++ /dev/null @@ -1,249 +0,0 @@ -import hashlib -import platform -import subprocess -import uuid -import os -from typing import Optional - - -class DeviceIDGenerator: - """ - Windows设备唯一ID生成器 - 通过收集多个硬件特征来生成稳定的设备唯一标识符 - """ - - def __init__(self, use_cache: bool = True, cache_file: str = ".device_id"): - """ - 初始化设备ID生成器 - - Args: - use_cache: 是否使用本地缓存 - cache_file: 缓存文件名 - """ - self.use_cache = use_cache - self.cache_file = cache_file - - def _run_wmic_command(self, command: str) -> Optional[str]: - """ - 执行WMIC命令并返回结果 - - Args: - command: WMIC命令 - - Returns: - 命令执行结果,失败则返回None - """ - try: - result = subprocess.run( - command, - shell=True, - capture_output=True, - text=True, - timeout=10 - ) - if result.returncode == 0 and result.stdout.strip(): - return result.stdout.strip() - except (subprocess.TimeoutExpired, Exception): - pass - return None - - def _get_motherboard_serial(self) -> Optional[str]: - """获取主板序列号""" - return self._run_wmic_command("wmic baseboard get serialnumber /value") - - def _get_cpu_id(self) -> Optional[str]: - """获取CPU ID""" - return self._run_wmic_command("wmic cpu get processorid /value") - - def _get_bios_serial(self) -> Optional[str]: - """获取BIOS序列号""" - return self._run_wmic_command("wmic bios get serialnumber /value") - - def _get_disk_serial(self) -> Optional[str]: - """获取系统盘序列号""" - return self._run_wmic_command("wmic diskdrive get serialnumber /value") - - def _get_machine_guid(self) -> Optional[str]: - """获取Windows机器GUID""" - try: - result = subprocess.run( - 'reg query "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography" /v MachineGuid', - shell=True, - capture_output=True, - text=True, - timeout=10 - ) - if result.returncode == 0: - for line in result.stdout.split('\n'): - if 'MachineGuid' in line: - return line.split()[-1] - except Exception: - pass - return None - - def _extract_value(self, wmic_output: str) -> str: - """从WMIC输出中提取实际值""" - if not wmic_output: - return "" - - lines = wmic_output.split('\n') - for line in lines: - if '=' in line and not line.strip().endswith('='): - return line.split('=', 1)[1].strip() - return "" - - def _collect_hardware_info(self) -> dict: - """ - 收集硬件信息 - - Returns: - 包含各种硬件信息的字典 - """ - hardware_info = {} - - # 主板序列号 - motherboard = self._get_motherboard_serial() - hardware_info['motherboard'] = self._extract_value(motherboard) if motherboard else "" - - # CPU ID - cpu_id = self._get_cpu_id() - hardware_info['cpu'] = self._extract_value(cpu_id) if cpu_id else "" - - # BIOS序列号 - bios = self._get_bios_serial() - hardware_info['bios'] = self._extract_value(bios) if bios else "" - - # 硬盘序列号 - disk = self._get_disk_serial() - hardware_info['disk'] = self._extract_value(disk) if disk else "" - - # Windows机器GUID - machine_guid = self._get_machine_guid() - hardware_info['machine_guid'] = machine_guid if machine_guid else "" - - # 计算机名称 - hardware_info['computer_name'] = platform.node() - - # MAC地址(作为备用) - hardware_info['mac_address'] = ':'.join(['{:02x}'.format((uuid.getnode() >> elements) & 0xff) - for elements in range(0, 2*6, 2)][::-1]) - - return hardware_info - - def _generate_device_id(self, hardware_info: dict) -> str: - """ - 基于硬件信息生成设备ID - - Args: - hardware_info: 硬件信息字典 - - Returns: - 32位十六进制设备ID - """ - # 过滤掉空值,并按键排序确保一致性 - filtered_info = {k: v for k, v in hardware_info.items() if v and v.strip()} - - # 如果没有任何硬件信息,使用MAC地址作为后备方案 - if not filtered_info: - filtered_info = {'mac_address': hardware_info.get('mac_address', str(uuid.getnode()))} - - # 将所有信息连接成字符串 - info_string = '|'.join(f"{k}:{v}" for k, v in sorted(filtered_info.items())) - - # 使用SHA256生成哈希值 - hash_object = hashlib.sha256(info_string.encode('utf-8')) - device_id = hash_object.hexdigest() - - return device_id - - def _load_cached_device_id(self) -> Optional[str]: - """从缓存文件加载设备ID""" - try: - if os.path.exists(self.cache_file): - with open(self.cache_file, 'r', encoding='utf-8') as f: - cached_id = f.read().strip() - if len(cached_id) == 64: # SHA256哈希长度 - return cached_id - except Exception: - pass - return None - - def _save_device_id_to_cache(self, device_id: str) -> None: - """将设备ID保存到缓存文件""" - try: - with open(self.cache_file, 'w', encoding='utf-8') as f: - f.write(device_id) - except Exception: - pass - - def get_device_id(self) -> str: - """ - 获取设备唯一ID - - Returns: - 64字符的十六进制设备ID - """ - # 如果启用缓存,先尝试从缓存加载 - if self.use_cache: - cached_id = self._load_cached_device_id() - if cached_id: - return cached_id - - # 收集硬件信息 - hardware_info = self._collect_hardware_info() - - # 生成设备ID - device_id = self._generate_device_id(hardware_info) - - # 保存到缓存 - if self.use_cache: - self._save_device_id_to_cache(device_id) - - return device_id - - def get_device_id_short(self, length: int = 16) -> str: - """ - 获取短版本的设备ID - - Args: - length: 返回ID的长度 - - Returns: - 指定长度的设备ID - """ - full_id = self.get_device_id() - return full_id[:length] - - def get_hardware_info(self) -> dict: - """ - 获取硬件信息(用于调试) - - Returns: - 硬件信息字典 - """ - return self._collect_hardware_info() - - -# 使用示例 -def main(): - """使用示例""" - # 创建设备ID生成器实例 - device_generator = DeviceIDGenerator() - - # 获取完整设备ID(64字符) - device_id = device_generator.get_device_id() - print(f"完整设备ID: {device_id}") - - # 获取短版本设备ID(16字符) - short_id = device_generator.get_device_id_short(16) - print(f"短设备ID: {short_id}") - - # 查看硬件信息(调试用) - hardware_info = device_generator.get_hardware_info() - print("\n硬件信息:") - for key, value in hardware_info.items(): - print(f" {key}: {value}") - - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/frontend-vue/DESIGN.md b/frontend-vue/DESIGN.md deleted file mode 100644 index 72249bec..00000000 --- a/frontend-vue/DESIGN.md +++ /dev/null @@ -1,177 +0,0 @@ -# Design - -## Source of truth -- Status: Active -- Last refreshed: 2026-06-09 -- Primary product surfaces: - - `image-video.html` - - `src/pages/image-video/ImageVideoPage.vue` -- Evidence reviewed: - - `src/pages/image-video/ImageVideoPage.vue` - - `src/styles/main.css` - - `src/styles/tokens.css` - - `src/components/layout/PageShell.vue` - - `../yaoyaoAI/aiclientpureui/src/styles/main.css` - - `../yaoyaoAI/aiclientpureui/src/components/dashboard/DashboardCard.vue` - - `../yaoyaoAI/aiclientpureui/src/components/workflow/Step02AudioVideo.vue` - - `../yaoyaoAI/aiclientpureui/src/components/workflow/Step03VideoEdit.vue` - -## Brand -- Personality: - - Quiet, tool-oriented, high-density AI workflow workspace - - Dark professional console rather than marketing landing page -- Trust signals: - - Structured step cards - - Stable layout grid - - Clear state summaries and output preview areas -- Avoid: - - Light hero-page styling - - Decorative floating cards wrapped inside larger cards - - Tailwind or PrimeVue-specific visual copies that do not fit Element Plus - -## Product goals -- Goals: - - Add a real `带货视频` module inside `frontend-vue` - - Put `视频复刻` and `图生视频` on one page with tab switching - - Match the visual tone of `aiclientpureui` - - Extract reusable workflow components for future media modules -- Non-goals: - - Backend API integration in this phase - - Rebuilding the entire `aiclientpureui` navigation shell -- Success signals: - - The page is screenshot-ready - - Form sections are organized and legible at desktop widths - - Shared components are reusable beyond this one page - -## Personas and jobs -- Primary personas: - - Internal operators creating or editing commerce videos - - Content operations staff iterating scripts, scenes, and avatars quickly -- User jobs: - - Upload source material - - Configure video generation parameters - - Adjust scene, face, script, and product settings - - Review an output summary before starting generation -- Key contexts of use: - - Desktop-heavy internal tool usage - - Repeated daily workflows with dense settings - -## Information architecture -- Primary navigation: - - Keep a lightweight page header with module switch and back link -- Core routes/screens: - - `image-video.html` as the image/video workspace entry -- Content hierarchy: - - Page header and module switch - - Delivery-video tabs - - Step-oriented configuration grid - - Preview and submission area - -## Design principles -- Principle 1: - - Reuse structure, not framework-specific implementation. Port the dashboard/card language from `aiclientpureui` into Element Plus-native components. -- Principle 2: - - Keep the screen directly operable. The first viewport should show the active workflow, not a placeholder entrance. -- Tradeoffs: - - Prefer a compact dark console layout over a literal flowchart reconstruction from the requirement images. - -## Visual language -- Color: - - Deep neutral background with restrained blue-indigo highlights - - High-contrast text, low-contrast secondary copy -- Typography: - - Existing sans-serif stack from `tokens.css` - - Compact section headings and dense form labels -- Spacing/layout rhythm: - - 20px to 24px outer spacing - - 16px card padding - - Multi-column grid with stable min widths -- Shape/radius/elevation: - - 14px to 18px radii - - Soft border glow, minimal shadow depth -- Motion: - - Short hover and focus transitions only -- Imagery/iconography: - - Use media preview boxes and upload placeholders - - Avoid decorative illustrations - -## Components -- Existing components to reuse: - - `src/components/layout/PageShell.vue` -- New/changed components: - - Shared dark workflow shell - - Shared module switch - - Shared section card - - Shared choice-pill selector - - Shared asset dropzone / preview block -- Variants and states: - - Active/inactive tabs - - Active/inactive pills - - Empty vs selected asset states - - Hover/focus for cards and action buttons -- Token/component ownership: - - Theme tokens in `src/styles/tokens.css` - - Global workflow styles in `src/styles/main.css` - - Shared components under `src/shared/components/ai-workflow/` - -## Accessibility -- Target standard: - - Practical keyboard and screen-readable form semantics for internal desktop usage -- Keyboard/focus behavior: - - Visible focus ring on pills, buttons, upload areas, and tabs -- Contrast/readability: - - Maintain strong foreground/background contrast in dark mode -- Screen-reader semantics: - - Preserve labels for upload regions and tab panels -- Reduced motion and sensory considerations: - - No large-scale animation - -## Responsive behavior -- Supported breakpoints/devices: - - Primary target desktop >= 1280px - - Secondary support tablet widths >= 768px -- Layout adaptations: - - Collapse multi-column workspace into two columns, then one column - - Preview area stops being sticky on narrow screens -- Touch/hover differences: - - Controls remain usable without hover-only affordances - -## Interaction states -- Loading: - - Reserved for future backend integration -- Empty: - - Show upload placeholders and muted guidance text -- Error: - - Use Element Plus messaging if upload type or action constraints fail -- Success: - - Local draft actions can confirm save/export interactions -- Disabled: - - Non-active modules appear disabled but visible -- Offline/slow network, if applicable: - - Not applicable in the current local-only draft - -## Content voice -- Tone: - - Direct and operational -- Terminology: - - Prefer commerce-video workflow language: 素材, 场景, 人脸, 话术, 产品, 输出 -- Microcopy rules: - - Short labels - - Guidance belongs in helper text, not long paragraphs - -## Implementation constraints -- Framework/styling system: - - Vue 3 + TypeScript + Element Plus -- Design-token constraints: - - Extend current CSS variables instead of introducing Tailwind -- Performance constraints: - - Keep the page static and local-first until API wiring is required -- Compatibility constraints: - - Must work within the existing Vite multi-page build -- Test/screenshot expectations: - - Build must pass - - Local dev server should render a screenshot-ready page at `image-video.html` - -## Open questions -- [ ] 图二和图三的字段是否需要完全一致,目前按“共用主流程 + 源素材差异化”实现 -- [ ] 后续是否需要直接接入生成任务接口,目前仅实现本地工作台和交互草稿 diff --git a/frontend-vue/src/pages/image-video/ImageVideoPage.vue b/frontend-vue/src/pages/image-video/ImageVideoPage.vue index cb4f8b7a..7e32a106 100644 --- a/frontend-vue/src/pages/image-video/ImageVideoPage.vue +++ b/frontend-vue/src/pages/image-video/ImageVideoPage.vue @@ -21,9 +21,6 @@ - - 图片 -
diff --git a/frontend-vue/src/pages/image/ImageWorkbenchPage.vue b/frontend-vue/src/pages/image/ImageWorkbenchPage.vue deleted file mode 100644 index a31e16e2..00000000 --- a/frontend-vue/src/pages/image/ImageWorkbenchPage.vue +++ /dev/null @@ -1,1514 +0,0 @@ - - - diff --git a/frontend-vue/src/pages/image/components/ImageListField.vue b/frontend-vue/src/pages/image/components/ImageListField.vue deleted file mode 100644 index 0ff10328..00000000 --- a/frontend-vue/src/pages/image/components/ImageListField.vue +++ /dev/null @@ -1,122 +0,0 @@ - - - diff --git a/frontend-vue/src/pages/image/components/ModelImagesUploader.vue b/frontend-vue/src/pages/image/components/ModelImagesUploader.vue deleted file mode 100644 index e6d68a74..00000000 --- a/frontend-vue/src/pages/image/components/ModelImagesUploader.vue +++ /dev/null @@ -1,16 +0,0 @@ - - - diff --git a/frontend-vue/src/pages/image/components/SingleImageField.vue b/frontend-vue/src/pages/image/components/SingleImageField.vue deleted file mode 100644 index dba30924..00000000 --- a/frontend-vue/src/pages/image/components/SingleImageField.vue +++ /dev/null @@ -1,93 +0,0 @@ - - - diff --git a/frontend-vue/src/pages/image/components/SpecifyTextList.vue b/frontend-vue/src/pages/image/components/SpecifyTextList.vue deleted file mode 100644 index 941235fc..00000000 --- a/frontend-vue/src/pages/image/components/SpecifyTextList.vue +++ /dev/null @@ -1,36 +0,0 @@ - - - diff --git a/frontend-vue/src/pages/image/components/panels/CloneDetailPanel.vue b/frontend-vue/src/pages/image/components/panels/CloneDetailPanel.vue deleted file mode 100644 index 5c354298..00000000 --- a/frontend-vue/src/pages/image/components/panels/CloneDetailPanel.vue +++ /dev/null @@ -1,109 +0,0 @@ - - - diff --git a/frontend-vue/src/pages/image/components/panels/ClonePosterPanel.vue b/frontend-vue/src/pages/image/components/panels/ClonePosterPanel.vue deleted file mode 100644 index 1c2cd170..00000000 --- a/frontend-vue/src/pages/image/components/panels/ClonePosterPanel.vue +++ /dev/null @@ -1,85 +0,0 @@ - - - diff --git a/frontend-vue/src/pages/image/components/panels/ClothingDetailPanel.vue b/frontend-vue/src/pages/image/components/panels/ClothingDetailPanel.vue deleted file mode 100644 index 35e5cd89..00000000 --- a/frontend-vue/src/pages/image/components/panels/ClothingDetailPanel.vue +++ /dev/null @@ -1,120 +0,0 @@ - - - diff --git a/frontend-vue/src/pages/image/components/panels/ExtremeDetailPanel.vue b/frontend-vue/src/pages/image/components/panels/ExtremeDetailPanel.vue deleted file mode 100644 index 74e726c5..00000000 --- a/frontend-vue/src/pages/image/components/panels/ExtremeDetailPanel.vue +++ /dev/null @@ -1,143 +0,0 @@ - - - diff --git a/frontend-vue/src/pages/image/components/panels/MainImagePanel.vue b/frontend-vue/src/pages/image/components/panels/MainImagePanel.vue deleted file mode 100644 index 0a0d50df..00000000 --- a/frontend-vue/src/pages/image/components/panels/MainImagePanel.vue +++ /dev/null @@ -1,128 +0,0 @@ - - - diff --git a/frontend-vue/src/pages/image/components/panels/ProductPosterPanel.vue b/frontend-vue/src/pages/image/components/panels/ProductPosterPanel.vue deleted file mode 100644 index 522b54f3..00000000 --- a/frontend-vue/src/pages/image/components/panels/ProductPosterPanel.vue +++ /dev/null @@ -1,104 +0,0 @@ - - - diff --git a/frontend-vue/src/pages/image/components/panels/TextToImagePanel.vue b/frontend-vue/src/pages/image/components/panels/TextToImagePanel.vue deleted file mode 100644 index 5398da31..00000000 --- a/frontend-vue/src/pages/image/components/panels/TextToImagePanel.vue +++ /dev/null @@ -1,53 +0,0 @@ - - - diff --git a/frontend-vue/src/pages/image/image-utils.ts b/frontend-vue/src/pages/image/image-utils.ts deleted file mode 100644 index fa112c2e..00000000 --- a/frontend-vue/src/pages/image/image-utils.ts +++ /dev/null @@ -1,36 +0,0 @@ -export const ALLOWED_IMAGE_TYPES = ['image/jpeg', 'image/jpg', 'image/png', 'image/bmp'] - -/** 读取多个文件为 data URL,返回解析完的数组。 */ -export function readFilesAsDataUrls(files: Blob[] | FileList): Promise { - const list = Array.from(files) - return Promise.all( - list.map( - (file) => - new Promise((resolve, reject) => { - const reader = new FileReader() - reader.onload = () => resolve(String(reader.result || '')) - reader.onerror = () => reject(reader.error || new Error('读取文件失败')) - reader.readAsDataURL(file) - }), - ), - ) -} - -/** 从剪贴板读取图片文件。 */ -export async function pasteClipboardImages(): Promise { - try { - const items = await navigator.clipboard.read() - const images: Blob[] = [] - for (const item of items) { - if (item.types.includes('image/png')) { - images.push(await item.getType('image/png')) - } else if (item.types.includes('image/jpeg')) { - images.push(await item.getType('image/jpeg')) - } - } - return images - } catch (err) { - console.warn('粘贴图片失败:', err) - return [] - } -} diff --git a/frontend-vue/src/pages/image/index.css b/frontend-vue/src/pages/image/index.css deleted file mode 100644 index c51d85fc..00000000 --- a/frontend-vue/src/pages/image/index.css +++ /dev/null @@ -1,2021 +0,0 @@ - * { - margin: 0; - padding: 0; - box-sizing: border-box; - } - - body { - font-family: "Microsoft YaHei", "Noto Serif SC", "SimSun", "Songti SC", "Times New Roman", serif; - background: rgba(13, 13, 13, 1); - color: #e0e0e0; - overflow: hidden; - height: 100vh; - user-select: none; - font-weight: bold; - } - - /* 顶部栏 */ - .top-bar { - height: 56px; - /*background: #1a1a1a;*/ - display: flex; - align-items: center; - justify-content: space-between; - padding: 0 16px; - border-bottom: 1px solid #2a2a2a; - -webkit-app-region: drag; - app-region: drag; - } - - .logo-area { - display: flex; - align-items: center; - gap: 10px; - } - - .logo { - width: 36px; - height: 36px; - border-radius: 8px; - object-fit: cover; /* 或 contain,根据需要选择 */ - } - - .app-name { - font-size: 18px; - font-weight: 600; - color: #fff; - } - - .btn-home { - font-size: 13px; - color: #999; - text-decoration: none; - padding: 8px 12px; - margin-right: 8px; - border-radius: 6px; - transition: all 0.2s; - -webkit-app-region: no-drag; - app-region: no-drag; - } - .btn-home:hover { - color: #fff; - background: #2a2a2a; - font-size: medium; - } - - .nav-tabs { - display: flex; - align-items: center; - gap: 0; - -webkit-app-region: no-drag; - app-region: no-drag; - } - - .nav-tab-group { - display: flex; - align-items: center; - gap: 6px; - background: rgba(77, 72, 72, 0.99); - border-radius: 10px; - } - - .nav-tab-sep { - width: 1px; - height: 20px; - background: linear-gradient(to bottom, transparent, #444 15%, #444 85%, transparent); - margin: 0 10px; - flex-shrink: 0; - opacity: 0.9; - } - - .nav-tab { - padding: 8px 14px; - font-size: 13px; - color: #999; - background: transparent; - border: none; - border-radius: 6px; - cursor: pointer; - transition: all 0.2s; - } - - .nav-tab:hover { - color: #fff; - background: #2a2a2a; - } - - .nav-tab.active { - color: #3498db; - background: rgba(52, 152, 219, 0.2); - } - - .top-right { - display: flex; - align-items: center; - gap: 16px; - -webkit-app-region: no-drag; - app-region: no-drag; - } - - .vx-text { - font-size: 12px; - color: #888; - } - - .icon-btn { - width: 32px; - height: 32px; - background: transparent; - border: none; - border-radius: 6px; - color: #999; - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; - font-size: 16px; - transition: all 0.2s; - } - - .icon-btn:hover { - color: #fff; - background: #2a2a2a; - } - - .window-controls { - display: flex; - gap: 2px; - } - - .window-btn { - width: 46px; - height: 32px; - background: transparent; - border: none; - color: #999; - cursor: pointer; - font-size: 10px; - transition: all 0.2s; - } - - .window-btn:hover { - background: #2a2a2a; - color: #fff; - } - - .window-btn.close:hover { - background: #e74c3c; - color: #fff; - } - - .btn-settings { - width: 32px; - height: 32px; - background: transparent; - border: none; - border-radius: 6px; - color: #999; - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; - font-size: 18px; - transition: all 0.2s; - } - .btn-settings:hover { - color: #3498db; - background: rgba(52, 152, 219, 0.15); - } - - /* 设置弹窗 */ - .settings-overlay { - display: none; - position: fixed; - inset: 0; - background: rgba(0,0,0,0.6); - z-index: 10000; - align-items: center; - justify-content: center; - } - .settings-overlay.show { display: flex; } - .settings-modal { - background: #1e1e1e; - border-radius: 12px; - width: 90%; - max-width: 480px; - max-height: 85vh; - overflow: hidden; - display: flex; - flex-direction: column; - box-shadow: 0 8px 32px rgba(0,0,0,0.4); - } - .settings-modal-header { - padding: 16px 20px; - border-bottom: 1px solid #2a2a2a; - display: flex; - align-items: center; - justify-content: space-between; - } - .settings-modal-title { - font-size: 18px; - font-weight: 600; - color: #fff; - } - .settings-modal-close { - width: 32px; - height: 32px; - background: transparent; - border: none; - color: #999; - cursor: pointer; - font-size: 20px; - line-height: 1; - border-radius: 6px; - transition: all 0.2s; - } - .settings-modal-close:hover { - color: #fff; - background: #2a2a2a; - } - .settings-modal-body { - padding: 20px; - overflow-y: auto; - } - .settings-section { - margin-bottom: 24px; - } - .settings-section:last-child { margin-bottom: 0; } - .settings-section-title { - font-size: 14px; - color: #ddd; - margin-bottom: 8px; - display: flex; - align-items: center; - gap: 6px; - } - .settings-section-title .icon { font-size: 16px; opacity: 0.9; } - .settings-section-desc { - font-size: 12px; - color: #888; - margin-bottom: 10px; - } - .settings-input-wrap { - display: flex; - gap: 8px; - align-items: center; - margin-bottom: 6px; - } - .settings-input { - flex: 1; - padding: 10px 12px; - font-size: 13px; - border: 1px solid #3a3a3a; - border-radius: 8px; - background: #252525; - color: #e0e0e0; - } - .settings-input::placeholder { color: #666; } - .settings-input:focus { - outline: none; - border-color: #3498db; - } - .settings-path-display { - flex: 1; - padding: 10px 12px; - font-size: 13px; - border: 1px solid #3a3a3a; - border-radius: 8px; - background: #252525; - color: #888; - min-height: 40px; - } - .settings-path-display.has-path { color: #b0b0b0; } - .btn-choose-folder { - padding: 10px 16px; - font-size: 13px; - background: #2a2a2a; - color: #e0e0e0; - border: 1px solid #3a3a3a; - border-radius: 8px; - cursor: pointer; - white-space: nowrap; - transition: all 0.2s; - } - .btn-choose-folder:hover { - background: #333; - border-color: #3498db; - color: #3498db; - } - .settings-update-block { - display: flex; - align-items: center; - justify-content: space-between; - padding: 12px 16px; - background: #252525; - border-radius: 8px; - border: 1px solid #3a3a3a; - } - .settings-version-text { - font-size: 13px; - color: #aaa; - } - .btn-check-update { - padding: 8px 14px; - font-size: 13px; - background: #2a2a2a; - color: #3498db; - border: 1px solid #3498db; - border-radius: 6px; - cursor: pointer; - display: flex; - align-items: center; - gap: 6px; - transition: all 0.2s; - } - .btn-check-update:hover { - background: rgba(52, 152, 219, 0.2); - } - .settings-modal-footer { - padding: 16px 20px; - border-top: 1px solid #2a2a2a; - display: flex; - justify-content: flex-end; - } - .btn-settings-close { - padding: 10px 20px; - font-size: 13px; - background: #3498db; - color: #fff; - border: none; - border-radius: 8px; - cursor: pointer; - transition: all 0.2s; - } - .btn-settings-close:hover { - background: #2980b9; - } - - /* 主内容区 */ - .main-content { - display: flex; - height: calc(100vh - 56px); - } - - /* 左侧面板 */ - .left-panel { - width: 320px; - background: #1e1e1e; - padding: 20px; - overflow-y: auto; - border-right: 1px solid #2a2a2a; - } - - .section-title { - font-size: 13px; - color: #bbb; - margin-bottom: 10px; - } - - .section-title .title-icon { - margin-left: 4px; - font-size: 12px; - opacity: 0.9; - } - - .option-group { - margin-bottom: 20px; - } - - .btn-group { - display: flex; - flex-wrap: wrap; - gap: 8px; - } - .btn-group-ratio-grid { - display: grid; - grid-template-columns: repeat(3, 1fr); - } - .btn-group-ratio-4col { - grid-template-columns: repeat(4, 1fr); - } - - .opt-btn { - padding: 8px 14px; - font-size: 13px; - color: #ccc; - background: #2a2a2a; - border: 1px solid #3a3a3a; - border-radius: 6px; - cursor: pointer; - transition: all 0.2s; - } - - .opt-btn:hover { - color: #fff; - background: #333; - } - - .opt-btn.active { - background: #3498db; - border-color: #2980b9; - color: #fff; - box-shadow: 0 0 0 1px #2980b9; - } - - .form-input, - .form-textarea, - .form-select { - width: 100%; - padding: 10px 12px; - font-size: 13px; - color: #e0e0e0; - background: #2a2a2a; - border: 1px solid #3a3a3a; - border-radius: 6px; - font-family: inherit; - } - .form-input::placeholder, - .form-textarea::placeholder { - color: #666; - } - .form-textarea { - min-height: 80px; - resize: vertical; - } - .form-select { - cursor: pointer; - appearance: none; - /*background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23999' d='M6 8L1 3h10z'/%3E%3C/svg%3E");*/ - background-repeat: no-repeat; - background-position: right 12px center; - padding-right: 32px; - } - - .btn-paste-alone { - width: 100%; - padding: 10px 14px; - font-size: 13px; - color: #fff; - background: #27ae60; - border: none; - border-radius: 6px; - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; - gap: 8px; - margin-top: 8px; - transition: all 0.2s; - } - .btn-paste-alone:hover { - background: #2ecc71; - } - - .upload-zone { - margin-top: 10px; - padding: 24px 16px; - border: 2px dashed #3a3a3a; - border-radius: 8px; - text-align: center; - cursor: pointer; - transition: all 0.2s; - background: #252525; - } - .upload-zone:hover { - border-color: #3498db; - background: #2a2a2a; - } - .upload-zone-icon { - font-size: 24px; - color: #666; - margin-bottom: 8px; - } - .upload-zone-text { - font-size: 13px; - color: #999; - } - .upload-zone-hint { - font-size: 11px; - color: #555; - margin-top: 4px; - } - .product-detail-preview { - margin-top: 10px; - min-height: 0; - } - - .hint-text { - font-size: 11px; - color: #666; - margin-top: 8px; - line-height: 1.5; - } - - .section-title-row { - display: flex; - align-items: center; - justify-content: space-between; - margin-bottom: 8px; - } - .section-title-row .section-title { - margin-bottom: 0; - } - .btn-paste-right { - width: auto; - padding: 8px 14px; - margin-top: 0; - } - .btn-add-color-slot { - width: 32px; - height: 32px; - background: #27ae60; - border: none; - border-radius: 6px; - color: #fff; - font-size: 20px; - line-height: 1; - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; - transition: all 0.2s; - flex-shrink: 0; - } - .btn-add-color-slot:hover { - background: #2ecc71; - } - .btn-add-color-slot:disabled { - background: #3a3a3a; - color: #666; - cursor: not-allowed; - } - .color-slots-container { - margin-top: 10px; - display: flex; - flex-direction: column; - gap: 12px; - } - .color-slot-item { - background: #252525; - border: 1px solid #3a3a3a; - border-radius: 8px; - padding: 12px; - } - .color-slot-header { - display: flex; - align-items: center; - gap: 8px; - margin-bottom: 10px; - } - .color-slot-item input[type="text"].color-name-input { - flex: 1; - padding: 6px 10px; - font-size: 12px; - background: #2a2a2a; - border: 1px solid #3a3a3a; - border-radius: 4px; - color: #e0e0e0; - } - .color-slot-item input[type="text"].color-name-input::placeholder { - color: #666; - } - .btn-remove-color-slot { - width: 24px; - height: 24px; - background: #c0392b; - border: none; - border-radius: 4px; - color: #fff; - font-size: 14px; - line-height: 1; - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; - flex-shrink: 0; - } - .btn-remove-color-slot:hover { - background: #e74c3c; - } - .color-slot-upload { - display: grid; - grid-template-columns: repeat(4, 1fr); - gap: 6px; - min-height: 40px; - padding: 4px; - border-radius: 4px; - border: 1px solid transparent; - transition: border-color 0.2s; - } - .color-slot-upload-item { - aspect-ratio: 1; - background: #2a2a2a; - border-radius: 6px; - overflow: hidden; - position: relative; - border: 2px dashed #3a3a3a; - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; - transition: all 0.2s; - } - .color-slot-upload-item:hover { - border-color: #3498db; - } - .color-slot-upload-item.add-btn { - color: #666; - font-size: 18px; - } - .color-slot-upload-item img { - width: 100%; - height: 100%; - object-fit: cover; - } - .color-slot-upload-item .remove-btn { - position: absolute; - top: 2px; - right: 2px; - width: 18px; - height: 18px; - background: rgba(231, 76, 60, 0.9); - border: none; - border-radius: 4px; - color: #fff; - font-size: 11px; - cursor: pointer; - line-height: 1; - display: flex; - align-items: center; - justify-content: center; - } - .feature-example-label { - font-size: 13px; - color: #bbb; - margin-bottom: 8px; - } - .feature-mode-content { - margin-top: 10px; - } - .feature-mode-tabs { - margin-bottom: 0; - } - - /* 指定文案 - 第X屏文案 */ - .specify-screen-list { - display: flex; - flex-direction: column; - gap: 12px; - max-height: 280px; - overflow-y: auto; - } - .specify-screen-item { - display: flex; - flex-direction: column; - gap: 4px; - } - .specify-screen-item label { - font-size: 12px; - color: #999; - } - .specify-screen-item .form-input { - margin: 0; - } - .btn-add-screen { - margin-top: 8px; - padding: 8px 14px; - font-size: 13px; - color: #7ab8ff; - background: transparent; - border: 1px dashed #3a3a3a; - border-radius: 6px; - cursor: pointer; - } - .btn-add-screen:hover { - border-color: #5a5a5a; - color: #9ac8ff; - } - - /* 默认面板 - 分批提示词:每行 提示词 + 生成张数 */ - .batch-prompt-list { - display: flex; - flex-direction: column; - gap: 12px; - max-height: 280px; - overflow-y: auto; - } - .batch-prompt-row { - display: flex; - align-items: center; - gap: 8px; - flex-wrap: wrap; - } - .batch-prompt-row .batch-prompt-input { - flex: 1; - min-width: 120px; - margin: 0; - } - .batch-prompt-row .batch-count-input { - width: 72px; - margin: 0; - padding: 6px 8px; - } - .batch-prompt-row .batch-prompt-label { - font-size: 12px; - color: #999; - min-width: 40px; - } - .batch-prompt-row .batch-remove-btn { - padding: 6px 10px; - font-size: 14px; - color: #999; - background: transparent; - border: 1px solid #3a3a3a; - border-radius: 6px; - cursor: pointer; - } - .batch-prompt-row .batch-remove-btn:hover { - color: #e74c3c; - border-color: #5a3a3a; - } - - .textarea-wrap { - position: relative; - } - - .prompt-textarea { - width: 100%; - min-height: 80px; - padding: 10px 12px 24px; - font-size: 13px; - color: #e0e0e0; - background: #2a2a2a; - border: 1px solid #3a3a3a; - border-radius: 6px; - resize: vertical; - font-family: inherit; - } - - .prompt-textarea::placeholder { - color: #666; - } - .prompt-textarea-large { - min-height: 120px; - } - - .char-count { - position: absolute; - bottom: 8px; - right: 12px; - font-size: 11px; - color: #666; - } - .char-count-top-right { - bottom: auto; - top: 8px; - right: 12px; - } - - .upload-btns { - display: flex; - gap: 10px; - margin-top: 10px; - } - - .btn-paste { - flex: 1; - padding: 10px; - font-size: 13px; - color: #fff; - background: #27ae60; - border: none; - border-radius: 6px; - cursor: pointer; - transition: all 0.2s; - } - - .btn-paste:hover { - background: #2ecc71; - } - - .btn-clear { - flex: 1; - padding: 10px; - font-size: 13px; - color: #fff; - background: #c0392b; - border: none; - border-radius: 6px; - cursor: pointer; - transition: all 0.2s; - } - - .btn-clear:hover { - background: #e74c3c; - } - - .btn-upload { - flex: 1; - padding: 10px; - font-size: 13px; - color: #fff; - background: #3498db; - border: none; - border-radius: 6px; - cursor: pointer; - transition: all 0.2s; - } - - .btn-upload:hover { - background: #2980b9; - } - - .upload-preview { - display: grid; - grid-template-columns: repeat(4, 1fr); - gap: 8px; - margin-top: 10px; - min-height: 60px; - } - - .upload-preview-item { - aspect-ratio: 1; - background: #2a2a2a; - border-radius: 6px; - overflow: hidden; - position: relative; - border: 2px solid #3a3a3a; - } - - .upload-preview-item img { - width: 100%; - height: 100%; - object-fit: cover; - } - - .upload-preview-item .remove-btn { - position: absolute; - top: 2px; - right: 2px; - width: 20px; - height: 20px; - background: rgba(231, 76, 60, 0.9); - border: none; - border-radius: 4px; - color: #fff; - font-size: 12px; - cursor: pointer; - line-height: 1; - display: flex; - align-items: center; - justify-content: center; - } - - .upload-option-hidden { - display: none; - } - - .btn-generate { - width: 100%; - padding: 14px; - font-size: 16px; - font-weight: 600; - color: #fff; - background: #3498db; - border: none; - border-radius: 8px; - cursor: pointer; - margin-top: 24px; - display: flex; - align-items: center; - justify-content: center; - gap: 8px; - transition: all 0.2s; - } - - .btn-generate:hover { - background: #2980b9; - } - .btn-generate.generating { - background: #e74c3c; - } - .btn-generate.generating:hover { - background: #c0392b; - } - - /* 中央区域 - 工作台 */ - .center-area { - flex: 1; - background: #0d0d0d; - display: flex; - flex-direction: column; - overflow: hidden; - position: relative; - } - - .center-toolbar { - padding: 12px 16px; - display: flex; - align-items: center; - gap: 10px; - border-bottom: 1px solid #2a2a2a; - background: #1a1a1a; - flex-shrink: 0; - } - - .btn-manual-stitch { - padding: 8px 16px; - font-size: 13px; - color: #e0e0e0; - background: #2a2a2a; - border: none; - border-radius: 6px; - cursor: pointer; - display: flex; - align-items: center; - gap: 6px; - transition: all 0.2s; - } - .btn-manual-stitch:hover { - background: #333; - color: #fff; - } - .btn-refresh { - padding: 8px 16px; - font-size: 13px; - color: #fff; - background: #e67e22; - border: none; - border-radius: 6px; - cursor: pointer; - display: flex; - align-items: center; - gap: 6px; - transition: all 0.2s; - } - .btn-refresh:hover { - background: #d35400; - } - .btn-download { - padding: 8px 16px; - font-size: 13px; - color: #fff; - background: #3498db; - border: none; - border-radius: 6px; - cursor: pointer; - display: flex; - align-items: center; - gap: 6px; - transition: all 0.2s; - } - .btn-download:hover { - background: #2980b9; - } - .center-toolbar-spacer { - flex: 1; - } - .btn-close-preview { - width: 32px; - height: 32px; - background: transparent; - border: none; - border-radius: 6px; - color: #999; - cursor: pointer; - font-size: 18px; - transition: all 0.2s; - } - .btn-close-preview:hover { - background: #2a2a2a; - color: #fff; - } - - /* 工作台主体:左图列表 + 右拼接预览 */ - .workspace-body { - flex: 1; - display: flex; - overflow: hidden; - min-height: 0; - position: relative; - } - /* 拼接中蒙版:覆盖工作台左右区域,禁止操作 */ - .workspace-stitch-loading { - position: absolute; - inset: 0; - z-index: 9999; - display: flex; - align-items: center; - justify-content: center; - background: rgba(0, 0, 0, 0.75); - pointer-events: auto; - } - .workspace-stitch-loading .workspace-stitch-loading-content { - padding: 32px 48px; - text-align: center; - color: #fff; - background: rgba(0, 0, 0, 0.88); - border-radius: 16px; - box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5); - border: 1px solid rgba(255, 255, 255, 0.1); - } - .workspace-stitch-loading .spinner { - display: inline-block; - width: 48px; - height: 48px; - border: 4px solid rgba(255, 255, 255, 0.25); - border-top-color: #3498db; - border-radius: 50%; - animation: spin 0.8s linear infinite; - } - .workspace-stitch-loading .loading-text { - margin-top: 16px; - font-size: 16px; - font-weight: 600; - color: #fff; - letter-spacing: 0.5px; - animation: loading-pulse 1.2s ease-in-out infinite; - } - .workspace-left { - flex: 1; - min-width: 0; - padding: 20px; - overflow-y: auto; - overflow-x: hidden; - background: #0d0d0d; - } - .workspace-left-inner { - column-count: 2; - column-gap: 16px; - min-height: 200px; - } - @media (min-width: 1200px) { - .workspace-left-inner { column-count: 3; } - } - .workspace-thumb { - break-inside: avoid; - margin-bottom: 16px; - width: 100%; - background: #1a1a1a; - border-radius: 8px; - overflow: hidden; - cursor: pointer; - border: 2px solid transparent; - transition: all 0.2s; - position: relative; - } - .workspace-thumb:hover { - border-color: #3498db; - } - .workspace-thumb-in-stitch { - border-color: #3498db; - } - .workspace-thumb-badge { - position: absolute; - left: 8px; - top: 8px; - width: 24px; - height: 24px; - border-radius: 50%; - background: #3498db; - color: #fff; - font-size: 12px; - font-weight: 600; - display: flex; - align-items: center; - justify-content: center; - z-index: 1; - } - .workspace-stitch-bar { - display: flex; - align-items: center; - gap: 12px; - margin-bottom: 16px; - flex-shrink: 0; - } - .workspace-stitch-count { - font-size: 14px; - color: #ccc; - } - .workspace-stitch-cancel { - padding: 6px 14px; - font-size: 13px; - color: #fff; - background: #e74c3c; - border: none; - border-radius: 6px; - cursor: pointer; - } - .workspace-stitch-cancel:hover { - background: rgba(202, 81, 67, 0.99); - } - .workspace-stitch-start { - padding: 6px 14px; - font-size: 13px; - color: #fff; - background: #27ae60; - border: none; - border-radius: 6px; - cursor: pointer; - } - .workspace-stitch-start:hover { - background: #219a52; - } - .workspace-thumb-loading { - position: absolute; - inset: 0; - background: rgba(0,0,0,0.7); - border-radius: 8px; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - z-index: 2; - color: #fff; - font-size: 12px; - } - .workspace-thumb-loading .spinner { - width: 28px; - height: 28px; - border: 3px solid rgba(255,255,255,0.3); - border-top-color: #3498db; - border-radius: 50%; - animation: spin 0.8s linear infinite; - } - .workspace-thumb-loading .txt { - margin-top: 10px; - font-size: 14px; - font-weight: 600; - color: #fff; - } - .workspace-thumb img { - width: 100%; - height: auto; - display: block; - object-fit: contain; - vertical-align: top; - } - .workspace-left-empty { - color: #555; - font-size: 14px; - align-self: center; - padding: 40px; - } - .workspace-right { - width: 38%; - min-width: 260px; - border-left: 1px solid #2a2a2a; - padding: 20px; - overflow: auto; - display: flex; - align-items: center; - justify-content: center; - background: #0d0d0d; - } - .workspace-stitched-wrap { - width: 100%; - cursor: pointer; - border-radius: 8px; - overflow: hidden; - border: 2px solid transparent; - transition: border-color 0.2s; - } - .workspace-stitched-wrap:hover { - border-color: #3498db; - } - .workspace-stitched-wrap img { - width: 100%; - height: auto; - display: block; - vertical-align: top; - } - .workspace-right-empty { - color: #555; - font-size: 14px; - text-align: center; - padding: 40px; - } - - /* 手动拼接顺序弹窗 */ - .stitch-order-overlay { - display: none; - position: fixed; - top: 0; left: 0; right: 0; bottom: 0; - background: rgba(0,0,0,0.7); - z-index: 999; - align-items: center; - justify-content: center; - } - .stitch-order-overlay.show { - display: flex; - } - .stitch-order-modal { - background: #1e1e1e; - border-radius: 12px; - padding: 24px; - max-width: 90vw; - max-height: 85vh; - overflow: hidden; - display: flex; - flex-direction: column; - border: 1px solid #2a2a2a; - } - .stitch-order-title { - font-size: 16px; - font-weight: 600; - color: #fff; - margin-bottom: 16px; - } - .stitch-order-list { - overflow-y: auto; - display: flex; - flex-direction: column; - gap: 8px; - margin-bottom: 16px; - } - .stitch-order-item { - display: flex; - align-items: center; - gap: 12px; - padding: 10px 12px; - background: #2a2a2a; - border-radius: 8px; - cursor: grab; - } - .stitch-order-item:active { - cursor: grabbing; - } - .stitch-order-item .thumb { - width: 60px; - height: 60px; - object-fit: cover; - border-radius: 6px; - } - .stitch-order-item .idx { - font-size: 13px; - color: #999; - min-width: 24px; - } - .stitch-order-item .drag-handle { - color: #666; - font-size: 18px; - } - .stitch-order-item .stitch-remove-btn { - margin-left: auto; - padding: 4px 10px; - font-size: 12px; - color: #e74c3c; - background: transparent; - border: 1px solid #e74c3c; - border-radius: 4px; - cursor: pointer; - } - .stitch-order-item .stitch-remove-btn:hover { - background: rgba(231, 76, 60, 0.2); - } - .stitch-order-add-title { - font-size: 12px; - color: #999; - margin-bottom: 8px; - } - .stitch-order-add-list { - display: flex; - flex-wrap: wrap; - gap: 8px; - margin-bottom: 16px; - } - .stitch-order-add-item { - width: 56px; - height: 56px; - border-radius: 6px; - overflow: hidden; - cursor: pointer; - border: 2px solid #2a2a2a; - transition: border-color 0.2s; - } - .stitch-order-add-item:hover { - border-color: #3498db; - } - .stitch-order-add-item img { - width: 100%; - height: 100%; - object-fit: cover; - } - .stitch-order-actions { - display: flex; - justify-content: flex-end; - gap: 10px; - } - .stitch-order-actions button { - padding: 8px 20px; - font-size: 13px; - border: none; - border-radius: 6px; - cursor: pointer; - } - .stitch-order-cancel { - background: #333; - color: #e0e0e0; - } - .stitch-order-ok { - background: #3498db; - color: #fff; - } - - .preview-placeholder { - display: none; - } - .preview-image { - display: none; - } - - /* 反推词 - 提示词卡片(工作台区域可纵向滚动,避免多卡片显示不全) */ - .preview-prompt-cards { - display: flex; - flex-direction: column; - gap: 12px; - width: 100%; - max-width: 700px; - position: absolute; - top: 56px; - left: 0; - right: 0; - bottom: 0; - overflow-y: auto; - overflow-x: hidden; - padding: 20px; - } - .prompt-card { - background: #1e1e1e; - border: 1px solid #2a2a2a; - border-radius: 8px; - padding: 14px 16px; - display: flex; - align-items: flex-start; - gap: 12px; - } - .prompt-card-content { - flex: 1; - font-size: 13px; - color: #e0e0e0; - line-height: 1.6; - word-break: break-word; - } - .prompt-card-copy { - flex-shrink: 0; - padding: 6px 12px; - font-size: 12px; - color: #3498db; - background: rgba(52, 152, 219, 0.15); - border: 1px solid #3498db; - border-radius: 6px; - cursor: pointer; - transition: all 0.2s; - } - .prompt-card-copy:hover { - background: rgba(52, 152, 219, 0.25); - } - .prompt-card-copy.copied { - color: #27ae60; - border-color: #27ae60; - background: rgba(39, 174, 96, 0.15); - } - - /* 生成中蒙版:铺满整个工作台,最高层,禁止操作 */ - .preview-loading { - position: absolute; - inset: 0; - z-index: 9999; - display: flex; - align-items: center; - justify-content: center; - background: rgba(0, 0, 0, 0.75); - pointer-events: auto; - } - .preview-loading .preview-loading-content { - padding: 32px 48px; - text-align: center; - color: #fff; - background: rgba(0, 0, 0, 0.88); - border-radius: 16px; - box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5); - border: 1px solid rgba(255, 255, 255, 0.1); - } - .preview-loading .spinner { - display: inline-block; - width: 48px; - height: 48px; - border: 4px solid rgba(255, 255, 255, 0.25); - border-top-color: #3498db; - border-radius: 50%; - animation: spin 0.8s linear infinite; - } - .preview-loading .preview-loading-content .loading-text { - margin-top: 16px; - font-size: 16px; - font-weight: 600; - color: #fff; - letter-spacing: 0.5px; - animation: loading-pulse 1.2s ease-in-out infinite; - } - @keyframes loading-pulse { - 0%, 100% { opacity: 1; } - 50% { opacity: 0.7; } - } - - @keyframes spin { - to { transform: rotate(360deg); } - } - - /* 右侧面板 */ - .right-panel { - width: 280px; - background: #1e1e1e; - display: flex; - flex-direction: column; - border-left: 1px solid #2a2a2a; - } - - .history-header { - padding: 16px; - border-bottom: 1px solid #2a2a2a; - } - - .history-title { - font-size: 15px; - font-weight: 600; - margin-bottom: 12px; - color: #fff; - } - - .history-tabs { - display: flex; - flex-wrap: wrap; - gap: 6px; - margin-bottom: 12px; - } - - .history-tab { - padding: 6px 12px; - font-size: 12px; - color: #999; - background: #2a2a2a; - border: none; - border-radius: 6px; - cursor: pointer; - transition: all 0.2s; - } - - .history-tab:hover { - color: #fff; - } - - .history-tab.active { - color: #3498db; - background: rgba(52, 152, 219, 0.2); - } - - .btn-clean { - width: 100%; - padding: 8px; - font-size: 12px; - color: #999; - background: #2a2a2a; - border: 1px solid #3a3a3a; - border-radius: 6px; - cursor: pointer; - transition: all 0.2s; - } - - .btn-clean:hover { - color: #fff; - background: #333; - } - - .history-content { - flex: 1; - overflow-y: auto; - padding: 12px; - } - - .history-grid { - display: flex; - flex-direction: column; - gap: 0; - } - .history-load-more { - padding: 12px; - text-align: center; - } - .btn-load-more { - padding: 8px 20px; - font-size: 13px; - color: #999; - background: #2a2a2a; - border: 1px solid #3a3a3a; - border-radius: 6px; - cursor: pointer; - transition: all 0.2s; - } - .btn-load-more:hover { - color: #fff; - background: #333; - } - - /* 历史图库条目:时间叠在图片右下角半透明,长图缩小显示全图 */ - .history-item { - padding: 10px 0; - border-bottom: 1px solid #2a2a2a; - cursor: pointer; - transition: background 0.2s; - } - .history-item:last-child { - border-bottom: none; - } - .history-item:hover { - background: rgba(255, 255, 255, 0.03); - } - .history-item-img-wrap { - position: relative; - width: 100%; - max-height: 360px; - aspect-ratio: 3 / 4; - border-radius: 8px; - overflow: hidden; - background: #2a2a2a; - } - .history-item:hover .history-item-img-wrap { - outline: 1px solid rgba(52, 152, 219, 0.5); - } - .history-item img { - width: 100%; - height: 100%; - object-fit: contain; - display: block; - } - .history-item-time { - position: absolute; - right: 6px; - bottom: 6px; - padding: 2px 6px; - font-size: 12px; - color: #fff; - background: rgba(0, 0, 0, 0.5); - border-radius: 4px; - } - - /* 无边框窗口样式 - Windows */ - .no-drag { - -webkit-app-region: no-drag; - app-region: no-drag; - } - - /* 图片查看模态框 */ - .image-modal-overlay { - display: none; - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: rgba(0, 0, 0, 0.85); - z-index: 1000; - align-items: center; - justify-content: center; - } - .image-modal-overlay.show { - display: flex; - } - .image-modal { - background: #1e1e1e; - border-radius: 12px; - max-width: 90vw; - max-height: 90vh; - display: flex; - flex-direction: column; - overflow: hidden; - border: 1px solid #3a3a3a; - } - .image-modal-header { - padding: 16px 24px; - text-align: center; - border-bottom: 1px solid #2a2a2a; - } - .image-modal-title { - font-size: 18px; - font-weight: 600; - color: #fff; - margin-bottom: 4px; - } - .image-modal-subtitle { - font-size: 13px; - color: #999; - } - .image-modal-body { - flex: 1; - display: flex; - align-items: center; - justify-content: center; - padding: 24px; - min-height: 300px; - position: relative; - } - .image-modal-body img { - max-width: 100%; - max-height: 60vh; - object-fit: contain; - border-radius: 8px; - } - .image-modal-arrow { - position: absolute; - top: 50%; - transform: translateY(-50%); - width: 40px; - height: 40px; - background: rgba(42, 42, 42, 0.9); - border: 1px solid #3a3a3a; - border-radius: 8px; - color: #fff; - font-size: 20px; - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; - transition: all 0.2s; - } - .image-modal-arrow:hover { - background: #3498db; - border-color: #2980b9; - } - .image-modal-arrow.prev { - left: 16px; - } - .image-modal-arrow.next { - right: 16px; - } - .image-modal-footer { - padding: 16px 24px; - border-top: 1px solid #2a2a2a; - display: flex; - align-items: center; - justify-content: center; - gap: 12px; - flex-wrap: wrap; - } - .image-modal-btn { - padding: 10px 18px; - font-size: 13px; - border: none; - border-radius: 6px; - cursor: pointer; - display: flex; - align-items: center; - gap: 8px; - transition: all 0.2s; - } - .image-modal-btn.restore { - background: #27ae60; - color: #fff; - } - .image-modal-btn.restore:hover { - background: #2ecc71; - } - .image-modal-btn.batch-download { - background: #9b59b6; - color: #fff; - } - .image-modal-btn.batch-download:hover { - background: #8e44ad; - } - .image-modal-btn.copy, - .image-modal-btn.download-long { - background: #3498db; - color: #fff; - } - .image-modal-btn.copy:hover, - .image-modal-btn.download-long:hover { - background: #2980b9; - } - .image-modal-btn.close { - background: #555; - color: #fff; - } - .image-modal-btn.close:hover { - background: #666; - } - .image-modal-btn.workspace-download, - .image-modal-btn.workspace-edit, - .image-modal-btn.workspace-regenerate { - background: #3498db; - color: #fff; - } - .image-modal-btn.workspace-edit { background: #27ae60; } - .image-modal-btn.workspace-edit:hover { background: #2ecc71; } - .image-modal-btn.workspace-regenerate { background: #e67e22; } - .image-modal-btn.workspace-regenerate:hover { background: #d35400; } - - /* 图片编辑弹窗(工作台大图内“图片编辑”触发) */ - .image-edit-modal-overlay { - display: none; - position: fixed; - top: 0; left: 0; right: 0; bottom: 0; - background: rgba(0, 0, 0, 0.85); - z-index: 1001; - align-items: center; - justify-content: center; - } - .image-edit-modal-overlay.show { display: flex; } - .image-edit-modal { - background: #1e1e1e; - border-radius: 12px; - max-width: 90vw; - max-height: 90vh; - width: 720px; - display: flex; - flex-direction: column; - overflow: hidden; - border: 1px solid #3a3a3a; - } - .image-edit-modal .edit-image-wrap { - padding: 16px; - background: #252525; - border-radius: 8px 8px 0 0; - display: flex; - align-items: center; - justify-content: center; - min-height: 280px; - position: relative; - } - .image-edit-modal .edit-image-wrap img { - max-width: 100%; - max-height: 50vh; - object-fit: contain; - border-radius: 8px; - } - .image-edit-modal .edit-canvas-wrap { - position: absolute; - top: 16px; left: 16px; right: 16px; bottom: 16px; - display: flex; - align-items: center; - justify-content: center; - pointer-events: none; - } - .image-edit-modal .edit-canvas-wrap canvas { - pointer-events: auto; - max-width: 100%; - max-height: 100%; - } - .image-edit-toolbar { - padding: 12px 16px; - display: flex; - align-items: center; - gap: 12px; - flex-wrap: wrap; - border-bottom: 1px solid #2a2a2a; - background: #1e1e1e; - } - .image-edit-toolbar .tool-btn { - padding: 8px 14px; - font-size: 12px; - border: 1px solid #27ae60; - background: rgba(39, 174, 96, 0.2); - color: #27ae60; - border-radius: 6px; - cursor: pointer; - display: inline-flex; - align-items: center; - gap: 6px; - } - .image-edit-toolbar .tool-btn.active { - background: #27ae60; - color: #fff; - } - .image-edit-toolbar .tool-btn.secondary { - border-color: #555; - background: #2a2a2a; - color: #999; - } - .image-edit-toolbar .brush-label { - font-size: 12px; - color: #999; - margin-left: 8px; - } - .image-edit-toolbar .brush-slider { - width: 120px; - height: 6px; - -webkit-appearance: none; - background: #333; - border-radius: 3px; - } - .image-edit-toolbar .brush-slider::-webkit-slider-thumb { - -webkit-appearance: none; - width: 16px; - height: 16px; - background: #3498db; - border-radius: 50%; - cursor: pointer; - } - .image-edit-hints { - padding: 8px 16px; - font-size: 11px; - color: #666; - line-height: 1.5; - border-bottom: 1px solid #2a2a2a; - } - .image-edit-prompt-row { - padding: 12px 16px; - display: flex; - gap: 12px; - align-items: flex-start; - border-bottom: 1px solid #2a2a2a; - } - .image-edit-prompt-row .prompt-textarea { - flex: 1; - min-height: 80px; - padding: 10px 12px; - font-size: 13px; - color: #fff; - background: #2a2a2a; - border: 1px solid #3a3a3a; - border-radius: 6px; - resize: vertical; - } - .image-edit-prompt-row .prompt-textarea::placeholder { - color: #666; - } - .image-edit-prompt-row .btn-ref-image { - flex-shrink: 0; - padding: 10px 16px; - font-size: 13px; - color: #fff; - background: #3498db; - border: none; - border-radius: 6px; - cursor: pointer; - display: inline-flex; - align-items: center; - gap: 8px; - } - .image-edit-prompt-row .btn-ref-image:hover { background: #2980b9; } - .image-edit-modal-footer { - padding: 16px 24px; - display: flex; - justify-content: flex-end; - gap: 12px; - border-top: 1px solid #2a2a2a; - } - .image-edit-modal-footer .btn-cancel { - padding: 10px 20px; - font-size: 13px; - color: #999; - background: #2a2a2a; - border: 1px solid #3a3a3a; - border-radius: 6px; - cursor: pointer; - } - .image-edit-modal-footer .btn-cancel:hover { color: #fff; background: #333; } - .image-edit-modal-footer .btn-confirm { - padding: 10px 20px; - font-size: 13px; - color: #fff; - background: #3498db; - border: none; - border-radius: 6px; - cursor: pointer; - } - .image-edit-modal-footer .btn-confirm:hover { background: #2980b9; } - - /* 重新生成弹窗(查看大图内“重新生成”触发) */ - .regenerate-modal-overlay { - display: none; - position: fixed; - top: 0; left: 0; right: 0; bottom: 0; - background: rgba(0, 0, 0, 0.7); - z-index: 1002; - align-items: center; - justify-content: center; - } - .regenerate-modal-overlay.show { display: flex; } - .regenerate-modal { - background: #fff; - border-radius: 12px; - max-width: 90vw; - max-height: 90vh; - width: 560px; - display: flex; - flex-direction: column; - overflow: hidden; - box-shadow: 0 8px 32px rgba(0,0,0,0.3); - } - .regenerate-modal-top { - background: #f5f0e8; - padding: 20px 24px 24px; - flex-shrink: 0; - } - .regenerate-preview-title { - font-size: 18px; - font-weight: 700; - color: #1a1a1a; - margin-bottom: 8px; - line-height: 1.3; - } - .regenerate-preview-subtitle { - font-size: 13px; - color: #333; - margin-bottom: 16px; - line-height: 1.4; - } - .regenerate-preview-img-wrap { - display: flex; - align-items: center; - justify-content: center; - min-height: 200px; - background: #ebe5dc; - border-radius: 8px; - overflow: hidden; - } - .regenerate-preview-img-wrap img { - max-width: 100%; - max-height: 42vh; - object-fit: contain; - } - .regenerate-modal-bottom { - background: #2c2c2c; - padding: 16px 24px 20px; - color: #e0e0e0; - flex-shrink: 0; - } - .regenerate-desc { - font-size: 12px; - line-height: 1.6; - margin-bottom: 8px; - color: #ccc; - } - .regenerate-style { - font-size: 12px; - margin-bottom: 12px; - color: #aaa; - } - .regenerate-prompt-row { - margin-bottom: 14px; - display: flex; - align-items: center; - gap: 10px; - } - .regenerate-prompt-label { - font-size: 13px; - color: #ccc; - flex-shrink: 0; - } - .regenerate-prompt-input { - flex: 1; - padding: 8px 12px; - font-size: 13px; - color: #fff; - background: #3a3a3a; - border: 1px solid #4a4a4a; - border-radius: 6px; - } - .regenerate-prompt-input::placeholder { color: #888; } - .regenerate-actions { - display: flex; - justify-content: flex-end; - gap: 12px; - margin-bottom: 14px; - } - .regenerate-btn { - padding: 10px 20px; - font-size: 13px; - border: none; - border-radius: 6px; - cursor: pointer; - } - .regenerate-btn.cancel { - background: #555; - color: #fff; - } - .regenerate-btn.cancel:hover { background: #666; } - .regenerate-btn.confirm { - background: #3498db; - color: #fff; - } - .regenerate-btn.confirm:hover { background: #2980b9; } - .regenerate-footer-actions { - display: flex; - align-items: center; - gap: 12px; - } - .regenerate-footer-btn { - display: inline-flex; - align-items: center; - gap: 6px; - padding: 8px 14px; - font-size: 13px; - color: #fff; - background: transparent; - border: none; - cursor: pointer; - border-radius: 4px; - } - .regenerate-footer-btn:hover { background: rgba(255,255,255,0.1); } - .regenerate-footer-btn.close { margin-left: auto; } diff --git a/frontend-vue/src/pages/image/panel-options.ts b/frontend-vue/src/pages/image/panel-options.ts deleted file mode 100644 index ca3a4e0b..00000000 --- a/frontend-vue/src/pages/image/panel-options.ts +++ /dev/null @@ -1,21 +0,0 @@ -export const RES_OPTIONS = [ - { label: '2K', value: '2k' }, - { label: '4K', value: '4k' }, -] - -/** 不含 auto 的常规画幅比例 */ -export const RATIO_OPTIONS = ['3:4', '1:1', '16:9', '9:16', '4:3', '2:3', '3:2', '21:9'] - -/** 含 auto 的画幅比例 */ -export const RATIO_OPTIONS_AUTO = ['auto', ...RATIO_OPTIONS] - -/** 产品主图/买家秀仅三种比例,默认 3:4 */ -export const RATIO_OPTIONS_MAIN = ['1:1', '3:4', '4:3'] - -export const COUNT_MAIN = [1, 3, 5, 7, 9] - -export const COUNT_DETAIL = [3, 5, 9, 14] - -export function collectSpecify(list: string[]): string[] { - return (Array.isArray(list) ? list : []).map((s) => String(s || '').trim()).filter(Boolean) -} diff --git a/frontend-vue/src/pages/image/workbench-shared.ts b/frontend-vue/src/pages/image/workbench-shared.ts deleted file mode 100644 index 2e8de1c8..00000000 --- a/frontend-vue/src/pages/image/workbench-shared.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { ref } from 'vue' - -/** 多模特图:除反推词外所有栏目共享同一组上传 */ -export const modelImages = ref([]) - -export const STORAGE_API_KEY = 'maixiang_api_key' -export const STORAGE_AUTO_SAVE_PATH = 'maixiang_auto_save_path' diff --git a/frontend-vue/src/router/index.ts b/frontend-vue/src/router/index.ts index 1a2c9ba6..b6f19c38 100644 --- a/frontend-vue/src/router/index.ts +++ b/frontend-vue/src/router/index.ts @@ -24,11 +24,6 @@ const routes = [ name: 'amazon-console', component: () => import('@/pages/amazon/AmazonConsolePage.vue'), }, - { - path: '/image', - name: 'image', - component: () => import('@/pages/image/ImageWorkbenchPage.vue'), - }, { path: '/image-video', name: 'image-video', diff --git a/frontend-vue/src/shared/components/ai-workflow/AiModuleSwitch.vue b/frontend-vue/src/shared/components/ai-workflow/AiModuleSwitch.vue deleted file mode 100644 index dcbc7c5c..00000000 --- a/frontend-vue/src/shared/components/ai-workflow/AiModuleSwitch.vue +++ /dev/null @@ -1,105 +0,0 @@ - - - - - diff --git a/frontend-vue/src/shared/components/ai-workflow/AiWorkflowShell.vue b/frontend-vue/src/shared/components/ai-workflow/AiWorkflowShell.vue deleted file mode 100644 index a48b404a..00000000 --- a/frontend-vue/src/shared/components/ai-workflow/AiWorkflowShell.vue +++ /dev/null @@ -1,94 +0,0 @@ - - -