更新外观模块

This commit is contained in:
super
2026-05-06 22:41:26 +08:00
parent c3810fdb7b
commit b746812e23
67 changed files with 13159 additions and 39501 deletions

6323
aiimage-backend-a.log Normal file

File diff suppressed because it is too large Load Diff

5385
aiimage-backend-b.log Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -301,6 +301,44 @@ class SimilarAsinTask(TaskBase):
})
return normalized
def fetch_parsed_payload(self, task_id, user_id=1):
url = f"{DELETE_BRAND_API_BASE}/api/similar-asin/tasks/{task_id}/parsed-payload"
response = requests.get(url, params={"user_id": user_id}, timeout=300, verify=False)
response.raise_for_status()
payload = response.json() if response.text else {}
if isinstance(payload, dict) and payload.get("success"):
return payload.get("data") or {}
raise RuntimeError(f"获取货源查询解析载荷失败: {payload}")
@staticmethod
def _count_payload_rows(data):
rows = data.get("rows") or data.get("items") or []
if isinstance(rows, list) and rows:
return len(rows)
groups = data.get("groups") or []
if not isinstance(groups, list):
return 0
total = 0
for group in groups:
if isinstance(group, dict) and isinstance(group.get("items"), list):
total += len(group.get("items"))
return total
def _merge_parsed_payload(self, data, parsed_payload):
payload_rows = parsed_payload.get("allItems") or parsed_payload.get("items") or []
merged = {
**data,
"groups": parsed_payload.get("groups") or [],
"rows": payload_rows,
}
if parsed_payload.get("aiPrompt"):
merged["prompt"] = parsed_payload.get("aiPrompt")
if parsed_payload.get("apiKey") and not merged.get("api_key"):
merged["api_key"] = parsed_payload.get("apiKey")
return merged
def process_task(self, task_data: dict):
"""处理审批任务主入口
@@ -310,6 +348,21 @@ class SimilarAsinTask(TaskBase):
try:
data = task_data.get("data", {})
task_id = data.get("taskId")
if task_id:
queued_rows = self._count_payload_rows(data)
try:
parsed_payload = self.fetch_parsed_payload(task_id, data.get("user_id") or data.get("userId") or 1)
data = self._merge_parsed_payload(data, parsed_payload)
self.log(
f"similar asin task {task_id} loaded full parsed payload from Java, queuedRows={queued_rows}, fullRows={self._count_payload_rows(data)}"
)
except Exception as e:
if not queued_rows:
raise
self.log(
f"similar asin task {task_id} failed to load full parsed payload, fallback to queued rows={queued_rows}: {e}",
"WARNING"
)
groups = self.normalize_groups(data)
if not task_id:
@@ -447,7 +500,7 @@ class SimilarAsinTask(TaskBase):
"""回传处理结果到API
"""
url = f"{DELETE_BRAND_API_BASE}/api/appearance-patent/tasks/{task_id}/result"
url = f"{DELETE_BRAND_API_BASE}/api/similar-asin/tasks/{task_id}/result"
payload ={
"submissionId": f"{int(time.time())}",

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
.module-page[data-v-6542ed18]{min-height:100vh;background:#1a1a1a}.main-content[data-v-6542ed18]{display:flex;height:calc(100vh - 56px);min-height:calc(100vh - 56px)}.left-panel[data-v-6542ed18]{width:400px;background:#1e1e1e;padding:20px;overflow-y:auto;border-right:1px solid #2a2a2a}.right-panel[data-v-6542ed18]{flex:1;min-width:0;background:#1a1a1a;display:flex;flex-direction:column}.section-title[data-v-6542ed18],.subsection-title[data-v-6542ed18]{font-size:13px;color:#bbb;margin-bottom:10px}.upload-zone[data-v-6542ed18]{border:1px dashed #3a3a3a;border-radius:10px;padding:18px;background:#252525;margin-bottom:18px}.hint[data-v-6542ed18],.loading-msg[data-v-6542ed18],.files[data-v-6542ed18],.muted[data-v-6542ed18]{color:#888;font-size:12px;line-height:1.5}.link[data-v-6542ed18]{color:#6ea8fe;text-decoration:none}.link[data-v-6542ed18]:hover{color:#9fc5ff}.btns[data-v-6542ed18],.run-row[data-v-6542ed18]{display:flex;gap:10px;flex-wrap:wrap}.opt-btn[data-v-6542ed18],.btn-run[data-v-6542ed18],.btn-delete[data-v-6542ed18],.download[data-v-6542ed18]{border:none;cursor:pointer;border-radius:7px}.opt-btn[data-v-6542ed18]{padding:8px 14px;color:#ccc;background:#2a2a2a;border:1px solid #3a3a3a}.btn-run[data-v-6542ed18]{padding:10px 18px;color:#fff;background:#3498db;font-weight:600}.btn-queue[data-v-6542ed18]{background:#27ae60}.btn-run[data-v-6542ed18]:disabled{opacity:.55;cursor:not-allowed}.selected-files[data-v-6542ed18]{margin-top:14px;color:#999;font-size:12px;word-break:break-all}.selected-files span[data-v-6542ed18]{display:block;margin:4px 0}.prompt-card[data-v-6542ed18]{margin-bottom:18px}.prompt-input[data-v-6542ed18]{width:100%;box-sizing:border-box;resize:vertical;min-height:180px;padding:10px 12px;border:1px solid #333;border-radius:8px;background:#202020;color:#d8d8d8;font-size:12px;line-height:1.6;outline:none}.prompt-input[data-v-6542ed18]:focus{border-color:#3498db}.prompt-default-label[data-v-6542ed18]{margin-top:10px;color:#8d8d8d;font-size:12px}.prompt-preview[data-v-6542ed18]{margin-top:10px;padding:12px;border:1px solid #2a2a2a;border-radius:8px;background:#202020;color:#9ea7b3;font-size:12px;line-height:1.6;white-space:pre-wrap}.parse-card[data-v-6542ed18],.queue-payload[data-v-6542ed18]{margin-top:14px;padding:12px;border:1px solid #2a2a2a;border-radius:8px;background:#202020;color:#b8c1cc;font-size:12px}.queue-payload[data-v-6542ed18]{max-height:220px;overflow:auto;color:#8fd3ff;white-space:pre-wrap}.panel-header[data-v-6542ed18]{padding:16px 20px;border-bottom:1px solid #2a2a2a;font-size:15px;font-weight:600;color:#ddd}.task-list-wrap[data-v-6542ed18]{flex:1;padding:16px 20px;overflow:auto}.clean-result-summary[data-v-6542ed18]{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-bottom:16px}.summary-card[data-v-6542ed18]{padding:14px 16px;border:1px solid #2a2a2a;border-radius:8px;background:#1e1e1e}.summary-card strong[data-v-6542ed18]{display:block;margin-top:8px;color:#eaf4ff;font-size:22px}.summary-label[data-v-6542ed18]{color:#8d8d8d;font-size:12px}.result-list-wrap[data-v-6542ed18]{border:1px solid #2a2a2a;border-radius:8px;background:#1e1e1e;min-height:180px;margin:0 0 16px}.result-list-header[data-v-6542ed18]{display:flex;justify-content:space-between;padding:12px 16px;border-bottom:1px solid #2a2a2a;color:#ddd;font-size:14px}.empty-tasks[data-v-6542ed18]{color:#666;font-size:13px;padding:18px;text-align:center}.result-table[data-v-6542ed18]{--el-table-bg-color: #222;--el-table-tr-bg-color: #222;--el-table-header-bg-color: #2a2a2a;--el-table-text-color: #ccc;--el-table-border-color: #333}.task-list[data-v-6542ed18]{list-style:none;margin:0;padding:12px}.task-item[data-v-6542ed18]{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:12px 14px;border:1px solid #2a2a2a;border-radius:8px;margin-bottom:8px;background:#222}.left[data-v-6542ed18]{flex:1;min-width:0}.id[data-v-6542ed18]{color:#e0e0e0;font-size:13px;font-weight:600}.task-right[data-v-6542ed18]{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.status[data-v-6542ed18]{padding:4px 10px;border-radius:6px;font-size:12px}.status.success[data-v-6542ed18]{background:#2ecc712e;color:#2ecc71}.status.failed[data-v-6542ed18]{background:#e74c3c2e;color:#ff6b6b}.status.running[data-v-6542ed18]{background:#3498db2e;color:#3498db}.result-hint[data-v-6542ed18]{margin-top:6px;color:#e0b96d}.download[data-v-6542ed18]{padding:6px 10px;color:#d6ecff;background:#3498db2e}.btn-delete[data-v-6542ed18]{padding:6px 10px;color:#ff8f8f;background:#e74c3c1f}@media(max-width:1100px){.main-content[data-v-6542ed18]{flex-direction:column;height:auto}.left-panel[data-v-6542ed18]{width:100%;border-right:none;border-bottom:1px solid #2a2a2a}.clean-result-summary[data-v-6542ed18]{grid-template-columns:repeat(2,minmax(0,1fr))}}

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
.module-page[data-v-89575b53]{min-height:100vh;background:#1a1a1a}.main-content[data-v-89575b53]{display:flex;height:calc(100vh - 56px);min-height:calc(100vh - 56px)}.left-panel[data-v-89575b53]{width:400px;background:#1e1e1e;padding:20px;overflow-y:auto;border-right:1px solid #2a2a2a}.right-panel[data-v-89575b53]{flex:1;min-width:0;background:#1a1a1a;display:flex;flex-direction:column}.section-title[data-v-89575b53],.subsection-title[data-v-89575b53]{font-size:13px;color:#bbb;margin-bottom:10px}.upload-zone[data-v-89575b53]{border:1px dashed #3a3a3a;border-radius:10px;padding:18px;background:#252525;margin-bottom:18px}.hint[data-v-89575b53],.loading-msg[data-v-89575b53],.files[data-v-89575b53],.muted[data-v-89575b53]{color:#888;font-size:12px;line-height:1.5}.link[data-v-89575b53]{color:#6ea8fe;text-decoration:none}.link[data-v-89575b53]:hover{color:#9fc5ff}.btns[data-v-89575b53],.run-row[data-v-89575b53]{display:flex;gap:10px;flex-wrap:wrap}.opt-btn[data-v-89575b53],.btn-run[data-v-89575b53],.btn-delete[data-v-89575b53],.download[data-v-89575b53]{border:none;cursor:pointer;border-radius:7px}.opt-btn[data-v-89575b53]{padding:8px 14px;color:#ccc;background:#2a2a2a;border:1px solid #3a3a3a}.btn-run[data-v-89575b53]{padding:10px 18px;color:#fff;background:#3498db;font-weight:600}.btn-queue[data-v-89575b53]{background:#27ae60}.btn-run[data-v-89575b53]:disabled{opacity:.55;cursor:not-allowed}.selected-files[data-v-89575b53]{margin-top:14px;color:#999;font-size:12px;word-break:break-all}.selected-files span[data-v-89575b53]{display:block;margin:4px 0}.prompt-card[data-v-89575b53]{margin-bottom:18px}.prompt-input[data-v-89575b53]{width:100%;box-sizing:border-box;resize:vertical;min-height:180px;padding:10px 12px;border:1px solid #333;border-radius:8px;background:#202020;color:#d8d8d8;font-size:12px;line-height:1.6;outline:none}.prompt-input[data-v-89575b53]:focus{border-color:#3498db}.prompt-default-label[data-v-89575b53]{margin-top:10px;color:#8d8d8d;font-size:12px}.prompt-preview[data-v-89575b53]{margin-top:10px;padding:12px;border:1px solid #2a2a2a;border-radius:8px;background:#202020;color:#9ea7b3;font-size:12px;line-height:1.6;white-space:pre-wrap}.parse-card[data-v-89575b53],.queue-payload[data-v-89575b53]{margin-top:14px;padding:12px;border:1px solid #2a2a2a;border-radius:8px;background:#202020;color:#b8c1cc;font-size:12px}.queue-payload[data-v-89575b53]{max-height:220px;overflow:auto;color:#8fd3ff;white-space:pre-wrap}.panel-header[data-v-89575b53]{padding:16px 20px;border-bottom:1px solid #2a2a2a;font-size:15px;font-weight:600;color:#ddd}.task-list-wrap[data-v-89575b53]{flex:1;padding:16px 20px;overflow:auto}.clean-result-summary[data-v-89575b53]{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-bottom:16px}.summary-card[data-v-89575b53]{padding:14px 16px;border:1px solid #2a2a2a;border-radius:8px;background:#1e1e1e}.summary-card strong[data-v-89575b53]{display:block;margin-top:8px;color:#eaf4ff;font-size:22px}.summary-label[data-v-89575b53]{color:#8d8d8d;font-size:12px}.result-list-wrap[data-v-89575b53]{border:1px solid #2a2a2a;border-radius:8px;background:#1e1e1e;min-height:180px;margin:0 0 16px}.result-list-header[data-v-89575b53]{display:flex;justify-content:space-between;padding:12px 16px;border-bottom:1px solid #2a2a2a;color:#ddd;font-size:14px}.empty-tasks[data-v-89575b53]{color:#666;font-size:13px;padding:18px;text-align:center}.result-table[data-v-89575b53]{--el-table-bg-color: #222;--el-table-tr-bg-color: #222;--el-table-header-bg-color: #2a2a2a;--el-table-text-color: #ccc;--el-table-border-color: #333}.task-list[data-v-89575b53]{list-style:none;margin:0;padding:12px}.task-item[data-v-89575b53]{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:12px 14px;border:1px solid #2a2a2a;border-radius:8px;margin-bottom:8px;background:#222}.left[data-v-89575b53]{flex:1;min-width:0}.id[data-v-89575b53]{color:#e0e0e0;font-size:13px;font-weight:600}.task-right[data-v-89575b53]{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.status[data-v-89575b53]{padding:4px 10px;border-radius:6px;font-size:12px}.status.success[data-v-89575b53]{background:#2ecc712e;color:#2ecc71}.status.failed[data-v-89575b53]{background:#e74c3c2e;color:#ff6b6b}.status.running[data-v-89575b53]{background:#3498db2e;color:#3498db}.result-hint[data-v-89575b53]{margin-top:6px;color:#e0b96d}.download[data-v-89575b53]{padding:6px 10px;color:#d6ecff;background:#3498db2e}.btn-delete[data-v-89575b53]{padding:6px 10px;color:#ff8f8f;background:#e74c3c1f}@media(max-width:1100px){.main-content[data-v-89575b53]{flex-direction:column;height:auto}.left-panel[data-v-89575b53]{width:100%;border-right:none;border-bottom:1px solid #2a2a2a}.clean-result-summary[data-v-89575b53]{grid-template-columns:repeat(2,minmax(0,1fr))}}

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
import{b6 as r}from"./pywebview-RBTI4RuH.js";const n="";function s(e){return r(`${n}/api/brand/expand-folder-recursive`,{folder:e})}export{s as e};

View File

@@ -1 +1 @@
import{a_ as r}from"./pywebview-Cz_PRNOK.js";const n="";function a(e){return r(`${n}/api/brand/expand-folder-recursive`,{folder:e})}export{a as e};
import{ba as r}from"./pywebview-C5IohfcY.js";const n="";function a(e){return r(`${n}/api/brand/expand-folder-recursive`,{folder:e})}export{a as e};

View File

@@ -1 +1 @@
import{b6 as r}from"./pywebview-BcagetkZ.js";const n="";function s(e){return r(`${n}/api/brand/expand-folder-recursive`,{folder:e})}export{s as e};
import{b9 as r}from"./pywebview-BIpip8XG.js";const n="";function s(e){return r(`${n}/api/brand/expand-folder-recursive`,{folder:e})}export{s as e};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>格式转换 - 数富AI</title>
<script type="module" crossorigin src="/assets/convert.js"></script>
<link rel="modulepreload" crossorigin href="/assets/pywebview-Cz_PRNOK.js">
<link rel="modulepreload" crossorigin href="/assets/brand-Cs6TxmtW.js">
<link rel="stylesheet" crossorigin href="/assets/pywebview-Dp5dN8OO.css">
<link rel="modulepreload" crossorigin href="/assets/pywebview-BIpip8XG.js">
<link rel="modulepreload" crossorigin href="/assets/brand-D0euV8A2.js">
<link rel="stylesheet" crossorigin href="/assets/pywebview-DkmZpCeB.css">
<link rel="stylesheet" crossorigin href="/assets/convert-BKSNvX8i.css">
</head>
<body>

View File

@@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>数据去重 - 数富AI</title>
<script type="module" crossorigin src="/assets/dedupe.js"></script>
<link rel="modulepreload" crossorigin href="/assets/pywebview-Cz_PRNOK.js">
<link rel="modulepreload" crossorigin href="/assets/brand-Cs6TxmtW.js">
<link rel="stylesheet" crossorigin href="/assets/pywebview-Dp5dN8OO.css">
<link rel="modulepreload" crossorigin href="/assets/pywebview-BIpip8XG.js">
<link rel="modulepreload" crossorigin href="/assets/brand-D0euV8A2.js">
<link rel="stylesheet" crossorigin href="/assets/pywebview-DkmZpCeB.css">
<link rel="stylesheet" crossorigin href="/assets/dedupe-DNlVfFj-.css">
</head>
<body>

View File

@@ -5,10 +5,10 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>删除品牌 - 数富AI</title>
<script type="module" crossorigin src="/assets/delete-brand.js"></script>
<link rel="modulepreload" crossorigin href="/assets/pywebview-Cz_PRNOK.js">
<link rel="modulepreload" crossorigin href="/assets/brand-Cs6TxmtW.js">
<link rel="modulepreload" crossorigin href="/assets/pywebview-BIpip8XG.js">
<link rel="modulepreload" crossorigin href="/assets/brand-D0euV8A2.js">
<link rel="modulepreload" crossorigin href="/assets/categorized-timers-JPA-olTr.js">
<link rel="stylesheet" crossorigin href="/assets/pywebview-Dp5dN8OO.css">
<link rel="stylesheet" crossorigin href="/assets/pywebview-DkmZpCeB.css">
<link rel="stylesheet" crossorigin href="/assets/delete-brand-BJod9K65.css">
</head>
<body>

View File

@@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>数据拆分 - 数富AI</title>
<script type="module" crossorigin src="/assets/split.js"></script>
<link rel="modulepreload" crossorigin href="/assets/pywebview-Cz_PRNOK.js">
<link rel="modulepreload" crossorigin href="/assets/brand-Cs6TxmtW.js">
<link rel="stylesheet" crossorigin href="/assets/pywebview-Dp5dN8OO.css">
<link rel="modulepreload" crossorigin href="/assets/pywebview-BIpip8XG.js">
<link rel="modulepreload" crossorigin href="/assets/brand-D0euV8A2.js">
<link rel="stylesheet" crossorigin href="/assets/pywebview-DkmZpCeB.css">
<link rel="stylesheet" crossorigin href="/assets/split-BoBVrLdC.css">
</head>
<body>

View File

@@ -35,6 +35,7 @@ public class TaskOperationLockConfig implements WebMvcConfigurer {
private static final Pattern TASK_RESULT_PATH = Pattern.compile(".*/api/([^/]+)/tasks/(\\d+)/result/?$");
private static final Set<String> MUTATING_METHODS = Set.of("POST", "PUT", "PATCH", "DELETE");
private static final long RESULT_SUBMIT_WAIT_MILLIS = 10 * 60 * 1000L;
private static final long DELETE_WAIT_MILLIS = 60 * 1000L;
private static final String LOCK_ATTRIBUTE = TaskOperationLockInterceptor.class.getName() + ".LOCK";
private final TaskDistributedLockService taskDistributedLockService;
@@ -71,6 +72,9 @@ public class TaskOperationLockConfig implements WebMvcConfigurer {
if ("POST".equals(method) && TASK_RESULT_PATH.matcher(uri == null ? "" : uri).matches()) {
return RESULT_SUBMIT_WAIT_MILLIS;
}
if ("DELETE".equals(method)) {
return DELETE_WAIT_MILLIS;
}
return TaskDistributedLockService.DEFAULT_WAIT_MILLIS;
}

View File

@@ -15,6 +15,7 @@ import com.nanri.aiimage.modules.shopmatch.service.ShopMatchTaskService;
import com.nanri.aiimage.modules.task.mapper.FileTaskMapper;
import com.nanri.aiimage.modules.task.model.entity.FileTaskEntity;
import com.nanri.aiimage.modules.task.service.TaskDistributedLockService;
import com.nanri.aiimage.modules.task.service.TaskFileJobService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
@@ -60,6 +61,7 @@ public class DeleteBrandStaleTaskService {
private final DeleteBrandProgressProperties deleteBrandProgressProperties;
private final DistributedJobLockService distributedJobLockService;
private final TaskDistributedLockService taskDistributedLockService;
private final TaskFileJobService taskFileJobService;
@Value("${aiimage.temp-dir.retention-hours:24}")
private long tempDirRetentionHours;
@@ -231,6 +233,14 @@ public class DeleteBrandStaleTaskService {
if (!hasStartedProgress) {
hasStartedProgress = productRiskTaskCacheService.hasAnyShopMergedPayload(task.getId());
}
if (hasPendingAssembleJobs(task.getId(), MODULE_TYPE_PRODUCT_RISK)) {
stats.skippedTaskCount++;
log.info("[stale-check] product-risk skip pending-assemble-jobs taskId={} unfinishedJobs={} activeJobs={}",
task.getId(),
taskFileJobService.countUnfinishedAssembleJobs(task.getId(), MODULE_TYPE_PRODUCT_RISK),
taskFileJobService.countActiveAssembleJobs(task.getId(), MODULE_TYPE_PRODUCT_RISK));
continue;
}
if (!hasStartedProgress && isWithinInitialGrace(task, initialThreshold)) {
stats.skippedTaskCount++;
log.info("[stale-check] product-risk skip initial-grace taskId={} createdAt={} initialThreshold={}",
@@ -305,6 +315,14 @@ public class DeleteBrandStaleTaskService {
if (!hasStartedProgress) {
hasStartedProgress = priceTrackTaskCacheService.hasAnyShopMergedPayload(task.getId());
}
if (hasPendingAssembleJobs(task.getId(), MODULE_TYPE_PRICE_TRACK)) {
stats.skippedTaskCount++;
log.info("[stale-check] price-track skip pending-assemble-jobs taskId={} unfinishedJobs={} activeJobs={}",
task.getId(),
taskFileJobService.countUnfinishedAssembleJobs(task.getId(), MODULE_TYPE_PRICE_TRACK),
taskFileJobService.countActiveAssembleJobs(task.getId(), MODULE_TYPE_PRICE_TRACK));
continue;
}
if (!hasStartedProgress && isWithinInitialGrace(task, initialThreshold)) {
stats.skippedTaskCount++;
continue;
@@ -380,6 +398,14 @@ public class DeleteBrandStaleTaskService {
if (!hasStartedProgress) {
hasStartedProgress = shopMatchTaskCacheService.hasAnyShopMergedPayload(task.getId());
}
if (hasPendingAssembleJobs(task.getId(), MODULE_TYPE_SHOP_MATCH)) {
stats.skippedTaskCount++;
log.info("[stale-check] shop-match skip pending-assemble-jobs taskId={} unfinishedJobs={} activeJobs={}",
task.getId(),
taskFileJobService.countUnfinishedAssembleJobs(task.getId(), MODULE_TYPE_SHOP_MATCH),
taskFileJobService.countActiveAssembleJobs(task.getId(), MODULE_TYPE_SHOP_MATCH));
continue;
}
if (!hasStartedProgress && isWithinInitialGrace(task, initialThreshold)) {
stats.skippedTaskCount++;
log.info("[stale-check] shop-match skip initial-grace taskId={} createdAt={} initialThreshold={}",
@@ -453,6 +479,14 @@ public class DeleteBrandStaleTaskService {
if (!hasStartedProgress) {
hasStartedProgress = patrolDeleteTaskCacheService.hasAnyShopMergedPayload(task.getId());
}
if (hasPendingAssembleJobs(task.getId(), MODULE_TYPE_PATROL_DELETE)) {
stats.skippedTaskCount++;
log.info("[stale-check] patrol-delete skip pending-assemble-jobs taskId={} unfinishedJobs={} activeJobs={}",
task.getId(),
taskFileJobService.countUnfinishedAssembleJobs(task.getId(), MODULE_TYPE_PATROL_DELETE),
taskFileJobService.countActiveAssembleJobs(task.getId(), MODULE_TYPE_PATROL_DELETE));
continue;
}
if (!hasStartedProgress && isWithinInitialGrace(task, initialThreshold)) {
stats.skippedTaskCount++;
continue;
@@ -612,6 +646,10 @@ public class DeleteBrandStaleTaskService {
}
}
private boolean hasPendingAssembleJobs(Long taskId, String moduleType) {
return taskFileJobService.countUnfinishedAssembleJobs(taskId, moduleType) > 0;
}
private static final class ProductRiskStaleCheckStats {
private int scannedTaskCount;
private int finalizedTaskCount;

View File

@@ -155,8 +155,10 @@ public class PatrolDeleteController {
@Operation(summary = "查询任务记录", description = "返回当前用户在巡店删除模块中的当前任务和历史任务记录。")
public ApiResponse<PatrolDeleteHistoryVo> history(
@Parameter(name = "user_id", description = "当前用户 ID", required = true, in = ParameterIn.QUERY, example = "1")
@RequestParam("user_id") Long userId) {
return ApiResponse.success(patrolDeleteTaskService.listHistory(userId));
@RequestParam("user_id") Long userId,
@Parameter(description = "history limit, default 30, max 100", example = "30")
@RequestParam(value = "limit", required = false) Integer limit) {
return ApiResponse.success(patrolDeleteTaskService.listHistory(userId, limit));
}
@PostMapping("/tasks/progress/batch")

View File

@@ -25,6 +25,7 @@ import com.nanri.aiimage.modules.task.mapper.FileTaskMapper;
import com.nanri.aiimage.modules.task.model.entity.FileResultEntity;
import com.nanri.aiimage.modules.task.model.entity.FileTaskEntity;
import com.nanri.aiimage.modules.task.model.entity.TaskFileJobEntity;
import com.nanri.aiimage.modules.task.service.TaskDistributedLockService;
import com.nanri.aiimage.modules.task.service.TaskFileJobService;
import com.nanri.aiimage.modules.task.service.TaskProgressSnapshotService;
import com.nanri.aiimage.modules.task.service.TaskResultItemService;
@@ -68,6 +69,7 @@ public class PatrolDeleteTaskService {
private final TaskResultItemService taskResultItemService;
private final TaskProgressSnapshotService taskProgressSnapshotService;
private final TaskScopePayloadStorageService taskScopePayloadStorageService;
private final TaskDistributedLockService taskDistributedLockService;
private FileTaskEntity loadTaskForExecution(Long taskId) {
Map<Long, FileTaskEntity> cachedTasks = taskCacheService.getTaskCacheBatch(List.of(taskId));
@@ -137,8 +139,13 @@ public class PatrolDeleteTaskService {
}
public PatrolDeleteHistoryVo listHistory(Long userId) {
return listHistory(userId, null);
}
public PatrolDeleteHistoryVo listHistory(Long userId, Integer limit) {
long startedAt = System.nanoTime();
validateUserId(userId);
int normalizedLimit = normalizeHistoryLimit(limit);
PatrolDeleteHistoryVo vo = new PatrolDeleteHistoryVo();
List<FileResultEntity> entities = fileResultMapper.selectList(new LambdaQueryWrapper<FileResultEntity>()
.select(FileResultEntity::getId,
@@ -155,7 +162,8 @@ public class PatrolDeleteTaskService {
.eq(FileResultEntity::getModuleType, MODULE_TYPE)
.eq(FileResultEntity::getUserId, userId)
.orderByDesc(FileResultEntity::getCreatedAt)
.last("limit 100"));
.orderByDesc(FileResultEntity::getId)
.last("limit " + normalizedLimit));
long resultRowsLoadedAt = System.nanoTime();
if (entities.isEmpty()) {
vo.setItems(List.of());
@@ -481,10 +489,21 @@ public class PatrolDeleteTaskService {
throw new BusinessException("记录不存在");
}
Long taskId = entity.getTaskId();
if (taskId == null || taskId <= 0) {
fileResultMapper.deleteById(resultId);
cleanupResultAuxiliaryDataFast(taskId, resultId);
return;
}
try (TaskDistributedLockService.LockHandle ignored = acquireTaskLockOrThrow(taskId)) {
FileResultEntity latestEntity = fileResultMapper.selectById(resultId);
if (latestEntity == null || !MODULE_TYPE.equals(latestEntity.getModuleType()) || !userId.equals(latestEntity.getUserId())) {
throw new BusinessException("record not found");
}
fileResultMapper.deleteById(resultId);
cleanupResultAuxiliaryDataFast(taskId, resultId);
reconcileTaskAfterResultRemoval(taskId);
}
}
private void reconcileTaskAfterResultRemoval(Long taskId) {
if (taskId == null || taskId <= 0) {
@@ -560,6 +579,13 @@ public class PatrolDeleteTaskService {
return payloadByShop;
}
private int normalizeHistoryLimit(Integer limit) {
if (limit == null || limit <= 0) {
return 30;
}
return Math.min(limit, 100);
}
private Map<Long, FileTaskEntity> loadTaskMap(List<FileResultEntity> entities) {
List<Long> taskIds = entities.stream()
.map(FileResultEntity::getTaskId)
@@ -760,6 +786,9 @@ public class PatrolDeleteTaskService {
long successCount = rows.stream().filter(row -> Integer.valueOf(RESULT_SUCCESS).equals(row.getSuccess())).count();
long failedCount = rows.stream().filter(row -> Integer.valueOf(RESULT_FAILED).equals(row.getSuccess())).count();
long pendingCount = rows.stream().filter(row -> !isResultFinished(row)).count();
if (pendingCount == 0 && successCount > 0 && isTaskWorkbookPending(task, rows)) {
pendingCount = 1;
}
task.setSuccessFileCount((int) successCount);
task.setFailedFileCount((int) failedCount);
task.setUpdatedAt(LocalDateTime.now());
@@ -975,11 +1004,47 @@ public class PatrolDeleteTaskService {
fileResultMapper.updateById(row);
}
}
updateTaskStatusFromRows(task, rows);
persistSnapshotJson(task, buildSnapshotFromDb(task, rows));
fileTaskMapper.updateById(task);
} finally {
FileUtil.del(xlsx);
}
}
private boolean isTaskWorkbookPending(FileTaskEntity task, List<FileResultEntity> rows) {
if (task == null || task.getId() == null || rows == null || rows.isEmpty()) {
return false;
}
FileResultEntity firstSuccess = rows.stream()
.filter(row -> Integer.valueOf(RESULT_SUCCESS).equals(row.getSuccess()))
.findFirst()
.orElse(null);
if (firstSuccess == null) {
return false;
}
if (!blank(firstSuccess.getResultFileUrl())) {
return false;
}
TaskFileJobEntity job = taskFileJobService.findAssembleJob(task.getId(), MODULE_TYPE, firstSuccess.getId());
return job != null && !"SUCCESS".equals(job.getStatus());
}
private TaskDistributedLockService.LockHandle acquireTaskLockOrThrow(Long taskId) {
TaskDistributedLockService.LockHandle lockHandle = acquireTaskLock(taskId);
if (lockHandle == null) {
throw new BusinessException(40901, "浠诲姟姝e湪澶勭悊涓紝璇风◢鍚庡啀璇?");
}
return lockHandle;
}
private TaskDistributedLockService.LockHandle acquireTaskLock(Long taskId) {
if (taskId == null || taskId <= 0) {
return null;
}
return taskDistributedLockService.acquire(MODULE_TYPE, taskId);
}
private void markResultSuccess(FileResultEntity row) {
row.setSuccess(RESULT_SUCCESS);
row.setErrorMessage(null);

View File

@@ -27,6 +27,7 @@ import com.nanri.aiimage.modules.task.mapper.FileTaskMapper;
import com.nanri.aiimage.modules.task.model.entity.FileResultEntity;
import com.nanri.aiimage.modules.task.model.entity.FileTaskEntity;
import com.nanri.aiimage.modules.task.model.entity.TaskFileJobEntity;
import com.nanri.aiimage.modules.task.service.TaskDistributedLockService;
import com.nanri.aiimage.modules.task.service.TaskFileJobService;
import com.nanri.aiimage.modules.task.service.TaskResultPayloadService;
import com.nanri.aiimage.modules.ziniao.service.ZiniaoShopSwitchService;
@@ -71,6 +72,7 @@ public class PriceTrackTaskService {
private final TaskPressureProperties taskPressureProperties;
private final TaskResultPayloadService taskResultPayloadService;
private final TaskFileJobService taskFileJobService;
private final TaskDistributedLockService taskDistributedLockService;
private FileTaskEntity loadTaskForExecution(Long taskId) {
Map<Long, FileTaskEntity> cachedTasks = priceTrackTaskCacheService.getTaskCacheBatch(List.of(taskId));
@@ -239,8 +241,16 @@ public class PriceTrackTaskService {
throw new BusinessException("记录不存在");
}
Long taskId = entity.getTaskId();
if (taskId == null || taskId <= 0) {
fileResultMapper.deleteById(resultId);
return;
}
try (TaskDistributedLockService.LockHandle ignored = acquireTaskLockOrThrow(taskId)) {
FileResultEntity latestEntity = fileResultMapper.selectById(resultId);
if (latestEntity == null || !MODULE_TYPE.equals(latestEntity.getModuleType()) || !userId.equals(latestEntity.getUserId())) {
throw new BusinessException("record not found");
}
fileResultMapper.deleteById(resultId);
if (taskId != null && taskId > 0) {
reconcileTaskAfterResultRemoval(taskId);
}
}
@@ -281,11 +291,19 @@ public class PriceTrackTaskService {
FileTaskEntity task = loadTaskForExecution(fr.getTaskId());
if (task == null || !MODULE_TYPE.equals(task.getModuleType()) || !userId.equals(task.getUserId())) continue;
if (!"RUNNING".equals(task.getStatus())) continue;
try (TaskDistributedLockService.LockHandle ignored = acquireTaskLock(fr.getTaskId())) {
if (ignored == null) continue;
FileTaskEntity lockedTask = loadTaskForExecution(fr.getTaskId());
if (lockedTask == null || !MODULE_TYPE.equals(lockedTask.getModuleType()) || !userId.equals(lockedTask.getUserId())) continue;
if (!"RUNNING".equals(lockedTask.getStatus())) continue;
FileResultEntity lockedResult = fileResultMapper.selectById(fr.getId());
if (lockedResult == null || !MODULE_TYPE.equals(lockedResult.getModuleType())) continue;
fileResultMapper.deleteById(fr.getId());
reconcileTaskAfterResultRemoval(fr.getTaskId());
vo.setRemoved(true);
return vo;
}
}
return vo;
}
@@ -687,6 +705,15 @@ public class PriceTrackTaskService {
throw new BusinessException("结果文件载荷不存在");
}
assembleShopResult(result, job.getScopeKey(), payload);
FileTaskEntity task = loadTaskForExecution(job.getTaskId());
if (task != null && MODULE_TYPE.equals(task.getModuleType())) {
List<FileResultEntity> latest = fileResultMapper.selectList(
new LambdaQueryWrapper<FileResultEntity>()
.eq(FileResultEntity::getTaskId, job.getTaskId())
.eq(FileResultEntity::getModuleType, MODULE_TYPE)
.orderByAsc(FileResultEntity::getId));
updateTaskStatusFromLatestRows(task, latest);
}
}
private void enqueueResultFileAssembly(FileResultEntity result,
@@ -1280,10 +1307,20 @@ public class PriceTrackTaskService {
int fail = 0;
List<String> allErrors = new ArrayList<>();
boolean allDone = true;
Map<Long, TaskFileJobEntity> jobMap = taskFileJobService.findAssembleJobsByResultIds(
MODULE_TYPE,
latest.stream()
.map(FileResultEntity::getId)
.filter(id -> id != null && id > 0)
.toList());
for (FileResultEntity fr : latest) {
boolean success = fr.getSuccess() != null && fr.getSuccess() == 1;
boolean failed = fr.getErrorMessage() != null && !fr.getErrorMessage().isBlank();
if (success) {
if (isResultAwaitingFileAssembly(fr, jobMap.get(fr.getId()))) {
allDone = false;
continue;
}
ok++;
} else if (failed) {
fail++;
@@ -1327,6 +1364,34 @@ public class PriceTrackTaskService {
}
}
private boolean isResultAwaitingFileAssembly(FileResultEntity result, TaskFileJobEntity job) {
if (result == null) {
return false;
}
if (result.getResultFileUrl() != null && !result.getResultFileUrl().isBlank()) {
return false;
}
if (result.getResultFilename() == null || result.getResultFilename().isBlank()) {
return false;
}
return job == null || !"SUCCESS".equals(job.getStatus());
}
private TaskDistributedLockService.LockHandle acquireTaskLockOrThrow(Long taskId) {
TaskDistributedLockService.LockHandle lockHandle = acquireTaskLock(taskId);
if (lockHandle == null) {
throw new BusinessException(40901, "浠诲姟姝e湪澶勭悊涓紝璇风◢鍚庡啀璇?");
}
return lockHandle;
}
private TaskDistributedLockService.LockHandle acquireTaskLock(Long taskId) {
if (taskId == null || taskId <= 0) {
return null;
}
return taskDistributedLockService.acquire(MODULE_TYPE, taskId);
}
private void cleanupTaskCacheIfTerminal(Long taskId, String taskStatus) {
if (!"SUCCESS".equals(taskStatus) && !"FAILED".equals(taskStatus) && !"DELETE_EMPTY".equals(taskStatus)) {
return;

View File

@@ -25,6 +25,7 @@ import com.nanri.aiimage.modules.task.mapper.FileTaskMapper;
import com.nanri.aiimage.modules.task.model.entity.FileResultEntity;
import com.nanri.aiimage.modules.task.model.entity.FileTaskEntity;
import com.nanri.aiimage.modules.task.model.entity.TaskFileJobEntity;
import com.nanri.aiimage.modules.task.service.TaskDistributedLockService;
import com.nanri.aiimage.modules.task.service.TaskFileJobService;
import com.nanri.aiimage.modules.task.service.TaskProgressSnapshotService;
import com.nanri.aiimage.modules.task.service.TaskResultItemService;
@@ -68,6 +69,7 @@ public class ProductRiskTaskService {
private final TaskFileJobService taskFileJobService;
private final TaskResultItemService taskResultItemService;
private final TaskProgressSnapshotService taskProgressSnapshotService;
private final TaskDistributedLockService taskDistributedLockService;
private FileTaskEntity loadTaskForExecution(Long taskId) {
Map<Long, FileTaskEntity> cachedTasks = productRiskTaskCacheService.getTaskCacheBatch(List.of(taskId));
@@ -243,8 +245,16 @@ public class ProductRiskTaskService {
throw new BusinessException("记录不存在");
}
Long taskId = entity.getTaskId();
if (taskId == null || taskId <= 0) {
fileResultMapper.deleteById(resultId);
return;
}
try (TaskDistributedLockService.LockHandle ignored = acquireTaskLockOrThrow(taskId)) {
FileResultEntity latestEntity = fileResultMapper.selectById(resultId);
if (latestEntity == null || !MODULE_TYPE.equals(latestEntity.getModuleType()) || !userId.equals(latestEntity.getUserId())) {
throw new BusinessException("record not found");
}
fileResultMapper.deleteById(resultId);
if (taskId != null && taskId > 0) {
reconcileTaskAfterResultRemoval(taskId);
}
}
@@ -304,11 +314,27 @@ public class ProductRiskTaskService {
continue;
}
Long tid = fr.getTaskId();
try (TaskDistributedLockService.LockHandle ignored = acquireTaskLock(tid)) {
if (ignored == null) {
continue;
}
FileTaskEntity lockedTask = loadTaskForExecution(tid);
if (lockedTask == null || !MODULE_TYPE.equals(lockedTask.getModuleType()) || !userId.equals(lockedTask.getUserId())) {
continue;
}
if (!"RUNNING".equals(lockedTask.getStatus())) {
continue;
}
FileResultEntity lockedResult = fileResultMapper.selectById(fr.getId());
if (lockedResult == null || !MODULE_TYPE.equals(lockedResult.getModuleType())) {
continue;
}
fileResultMapper.deleteById(fr.getId());
reconcileTaskAfterResultRemoval(tid);
vo.setRemoved(true);
return vo;
}
}
return vo;
}
@@ -631,54 +657,10 @@ public class ProductRiskTaskService {
.eq(FileResultEntity::getModuleType, MODULE_TYPE)
.orderByAsc(FileResultEntity::getId));
int ok = 0;
int fail = 0;
List<String> allErrors = new ArrayList<>();
boolean allDone = true;
for (FileResultEntity fr : latest) {
boolean success = fr.getSuccess() != null && fr.getSuccess() == 1;
boolean failed = fr.getErrorMessage() != null && !fr.getErrorMessage().isBlank();
if (success) {
ok++;
} else if (failed) {
fail++;
allErrors.add(fr.getSourceFilename() + ": " + fr.getErrorMessage());
} else {
allDone = false;
}
}
task.setSuccessFileCount(ok);
task.setFailedFileCount(fail);
task.setUpdatedAt(LocalDateTime.now());
if (!allDone) {
task.setStatus("RUNNING");
task.setErrorMessage(null);
task.setFinishedAt(null);
} else if (ok > 0 && fail == 0) {
task.setStatus("SUCCESS");
task.setErrorMessage(null);
task.setFinishedAt(LocalDateTime.now());
} else if (ok > 0) {
task.setStatus("SUCCESS");
task.setErrorMessage(String.join("; ", allErrors.isEmpty() ? batchErrors : allErrors));
task.setFinishedAt(LocalDateTime.now());
} else {
task.setStatus("FAILED");
task.setErrorMessage(allErrors.isEmpty() ? "全部店铺处理失败" : String.join("; ", allErrors));
task.setFinishedAt(LocalDateTime.now());
}
try {
task.setResultJson(objectMapper.writeValueAsString(buildSnapshotFromDb(taskId, task.getStatus())));
} catch (Exception ex) {
log.warn("[product-risk] compact result json failed: {}", ex.getMessage());
}
fileTaskMapper.updateById(task);
log.warn("[product-risk] submitResult status evaluated taskId={} oldStatus={} newStatus={} ok={} fail={} allDone={} matchedShopCount={} skippedUnmatchedCount={} waitingCount={} assembledCount={} fallbackMatchedCount={} batchErrors={}",
taskId, oldStatus, task.getStatus(), ok, fail, allDone, matchedShopCount, skippedUnmatchedCount,
updateTaskStatusFromLatestRows(task, latest, batchErrors);
log.warn("[product-risk] submitResult status evaluated taskId={} oldStatus={} newStatus={} matchedShopCount={} skippedUnmatchedCount={} waitingCount={} assembledCount={} fallbackMatchedCount={} batchErrors={}",
taskId, oldStatus, task.getStatus(), matchedShopCount, skippedUnmatchedCount,
waitingCount, assembledCount, fallbackMatchedCount, batchErrors);
cleanupTaskCacheIfTerminal(taskId, task.getStatus());
}
public boolean tryFinalizeTask(Long taskId, boolean fromCompensation) {
@@ -855,6 +837,14 @@ public class ProductRiskTaskService {
}
File workRoot = FileUtil.mkdir(FileUtil.file(System.getProperty("java.io.tmpdir"), "product-risk-result", String.valueOf(job.getTaskId())));
assembleShopResult(result, job.getScopeKey(), payload, workRoot);
FileTaskEntity task = loadTaskForExecution(job.getTaskId());
if (task != null && MODULE_TYPE.equals(task.getModuleType())) {
List<FileResultEntity> latest = fileResultMapper.selectList(new LambdaQueryWrapper<FileResultEntity>()
.eq(FileResultEntity::getTaskId, job.getTaskId())
.eq(FileResultEntity::getModuleType, MODULE_TYPE)
.orderByAsc(FileResultEntity::getId));
updateTaskStatusFromLatestRows(task, latest, List.of());
}
}
private void enqueueResultFileAssembly(FileResultEntity result, String shopKey, ProductRiskShopPayloadDto payload) {
@@ -888,10 +878,20 @@ public class ProductRiskTaskService {
int fail = 0;
List<String> allErrors = new ArrayList<>();
boolean allDone = true;
Map<Long, TaskFileJobEntity> jobMap = taskFileJobService.findAssembleJobsByResultIds(
MODULE_TYPE,
latest.stream()
.map(FileResultEntity::getId)
.filter(id -> id != null && id > 0)
.toList());
for (FileResultEntity fr : latest) {
boolean success = fr.getSuccess() != null && fr.getSuccess() == 1;
boolean failed = fr.getErrorMessage() != null && !fr.getErrorMessage().isBlank();
if (success) {
if (isResultAwaitingFileAssembly(fr, jobMap.get(fr.getId()))) {
allDone = false;
continue;
}
ok++;
} else if (failed) {
fail++;
@@ -947,6 +947,34 @@ public class ProductRiskTaskService {
productRiskTaskCacheService.deleteTaskCache(taskId);
}
private boolean isResultAwaitingFileAssembly(FileResultEntity result, TaskFileJobEntity job) {
if (result == null) {
return false;
}
if (result.getResultFileUrl() != null && !result.getResultFileUrl().isBlank()) {
return false;
}
if (result.getResultFilename() == null || result.getResultFilename().isBlank()) {
return false;
}
return job == null || !"SUCCESS".equals(job.getStatus());
}
private TaskDistributedLockService.LockHandle acquireTaskLockOrThrow(Long taskId) {
TaskDistributedLockService.LockHandle lockHandle = acquireTaskLock(taskId);
if (lockHandle == null) {
throw new BusinessException(40901, "浠诲姟姝e湪澶勭悊涓紝璇风◢鍚庡啀璇?");
}
return lockHandle;
}
private TaskDistributedLockService.LockHandle acquireTaskLock(Long taskId) {
if (taskId == null || taskId <= 0) {
return null;
}
return taskDistributedLockService.acquire(MODULE_TYPE, taskId);
}
private ProductRiskTaskDetailVo buildTaskDetail(FileTaskEntity task) {
ProductRiskTaskDetailVo detail = new ProductRiskTaskDetailVo();
detail.setTask(toTaskItemVo(task));

View File

@@ -25,6 +25,7 @@ import com.nanri.aiimage.modules.task.mapper.FileTaskMapper;
import com.nanri.aiimage.modules.task.model.entity.FileResultEntity;
import com.nanri.aiimage.modules.task.model.entity.FileTaskEntity;
import com.nanri.aiimage.modules.task.model.entity.TaskFileJobEntity;
import com.nanri.aiimage.modules.task.service.TaskDistributedLockService;
import com.nanri.aiimage.modules.task.service.TaskFileJobService;
import com.nanri.aiimage.modules.task.service.TaskProgressSnapshotService;
import com.nanri.aiimage.modules.task.service.TaskResultItemService;
@@ -66,6 +67,7 @@ public class QueryAsinTaskService {
private final TaskFileJobService taskFileJobService;
private final TaskResultItemService taskResultItemService;
private final TaskProgressSnapshotService taskProgressSnapshotService;
private final TaskDistributedLockService taskDistributedLockService;
private FileTaskEntity loadTaskForExecution(Long taskId) {
Map<Long, FileTaskEntity> cachedTasks = taskCacheService.getTaskCacheBatch(List.of(taskId));
@@ -468,9 +470,19 @@ public class QueryAsinTaskService {
throw new BusinessException("记录不存在");
}
Long taskId = entity.getTaskId();
if (taskId == null || taskId <= 0) {
fileResultMapper.deleteById(resultId);
return;
}
try (TaskDistributedLockService.LockHandle ignored = acquireTaskLockOrThrow(taskId)) {
FileResultEntity latestEntity = fileResultMapper.selectById(resultId);
if (latestEntity == null || !MODULE_TYPE.equals(latestEntity.getModuleType()) || !userId.equals(latestEntity.getUserId())) {
throw new BusinessException("record not found");
}
fileResultMapper.deleteById(resultId);
reconcileTaskAfterResultRemoval(taskId);
}
}
private void reconcileTaskAfterResultRemoval(Long taskId) {
if (taskId == null || taskId <= 0) {
@@ -719,6 +731,9 @@ public class QueryAsinTaskService {
long successCount = rows.stream().filter(row -> Integer.valueOf(RESULT_SUCCESS).equals(row.getSuccess())).count();
long failedCount = rows.stream().filter(row -> Integer.valueOf(RESULT_FAILED).equals(row.getSuccess())).count();
long pendingCount = rows.stream().filter(row -> !isResultFinished(row)).count();
if (pendingCount == 0 && successCount > 0 && isTaskWorkbookPending(task, rows)) {
pendingCount = 1;
}
task.setSuccessFileCount((int) successCount);
task.setFailedFileCount((int) failedCount);
task.setUpdatedAt(LocalDateTime.now());
@@ -948,11 +963,47 @@ public class QueryAsinTaskService {
fileResultMapper.updateById(row);
}
}
updateTaskStatusFromRows(task, rows);
persistSnapshotJson(task, buildSnapshotFromDb(task, rows));
fileTaskMapper.updateById(task);
} finally {
FileUtil.del(xlsx);
}
}
private boolean isTaskWorkbookPending(FileTaskEntity task, List<FileResultEntity> rows) {
if (task == null || task.getId() == null || rows == null || rows.isEmpty()) {
return false;
}
FileResultEntity firstSuccess = rows.stream()
.filter(row -> Integer.valueOf(RESULT_SUCCESS).equals(row.getSuccess()))
.findFirst()
.orElse(null);
if (firstSuccess == null) {
return false;
}
if (!blank(firstSuccess.getResultFileUrl())) {
return false;
}
TaskFileJobEntity job = taskFileJobService.findAssembleJob(task.getId(), MODULE_TYPE, firstSuccess.getId());
return job != null && !"SUCCESS".equals(job.getStatus());
}
private TaskDistributedLockService.LockHandle acquireTaskLockOrThrow(Long taskId) {
TaskDistributedLockService.LockHandle lockHandle = acquireTaskLock(taskId);
if (lockHandle == null) {
throw new BusinessException(40901, "浠诲姟姝e湪澶勭悊涓紝璇风◢鍚庡啀璇?");
}
return lockHandle;
}
private TaskDistributedLockService.LockHandle acquireTaskLock(Long taskId) {
if (taskId == null || taskId <= 0) {
return null;
}
return taskDistributedLockService.acquire(MODULE_TYPE, taskId);
}
private void markResultSuccess(FileResultEntity row) {
row.setSuccess(RESULT_SUCCESS);
row.setErrorMessage(null);

View File

@@ -29,6 +29,7 @@ import com.nanri.aiimage.modules.task.mapper.FileTaskMapper;
import com.nanri.aiimage.modules.task.model.entity.FileResultEntity;
import com.nanri.aiimage.modules.task.model.entity.FileTaskEntity;
import com.nanri.aiimage.modules.task.model.entity.TaskFileJobEntity;
import com.nanri.aiimage.modules.task.service.TaskDistributedLockService;
import com.nanri.aiimage.modules.task.service.TaskFileJobService;
import com.nanri.aiimage.modules.task.service.TaskResultPayloadService;
import com.nanri.aiimage.modules.ziniao.service.ZiniaoShopSwitchService;
@@ -67,6 +68,7 @@ public class ShopMatchTaskService {
private final TaskPressureProperties taskPressureProperties;
private final TaskResultPayloadService taskResultPayloadService;
private final TaskFileJobService taskFileJobService;
private final TaskDistributedLockService taskDistributedLockService;
private FileTaskEntity loadTaskForExecution(Long taskId) {
Map<Long, FileTaskEntity> cachedTasks = shopMatchTaskCacheService.getTaskCacheBatch(List.of(taskId));
@@ -250,8 +252,16 @@ public class ShopMatchTaskService {
throw new BusinessException("记录不存在");
}
Long taskId = entity.getTaskId();
if (taskId == null || taskId <= 0) {
fileResultMapper.deleteById(resultId);
return;
}
try (TaskDistributedLockService.LockHandle ignored = acquireTaskLockOrThrow(taskId)) {
FileResultEntity latestEntity = fileResultMapper.selectById(resultId);
if (latestEntity == null || !MODULE_TYPE.equals(latestEntity.getModuleType()) || !userId.equals(latestEntity.getUserId())) {
throw new BusinessException("record not found");
}
fileResultMapper.deleteById(resultId);
if (taskId != null && taskId > 0) {
reconcileTaskAfterResultRemoval(taskId);
}
}
@@ -727,6 +737,14 @@ public class ShopMatchTaskService {
}
File workRoot = FileUtil.mkdir(FileUtil.file(System.getProperty("java.io.tmpdir"), "shop-match-result", String.valueOf(job.getTaskId())));
assembleShopResult(result, job.getScopeKey(), payload, workRoot);
FileTaskEntity task = loadTaskForExecution(job.getTaskId());
if (task != null && MODULE_TYPE.equals(task.getModuleType())) {
List<FileResultEntity> latest = fileResultMapper.selectList(new LambdaQueryWrapper<FileResultEntity>()
.eq(FileResultEntity::getTaskId, job.getTaskId())
.eq(FileResultEntity::getModuleType, MODULE_TYPE)
.orderByAsc(FileResultEntity::getId));
updateTaskStatusFromLatestRows(task, latest, List.of());
}
}
private void enqueueResultFileAssembly(FileResultEntity result, String shopKey, ShopMatchShopPayloadDto payload) {
@@ -771,10 +789,20 @@ public class ShopMatchTaskService {
int fail = 0;
List<String> errors = new ArrayList<>();
boolean allDone = true;
Map<Long, TaskFileJobEntity> jobMap = taskFileJobService.findAssembleJobsByResultIds(
MODULE_TYPE,
latest.stream()
.map(FileResultEntity::getId)
.filter(id -> id != null && id > 0)
.toList());
for (FileResultEntity row : latest) {
boolean success = row.getSuccess() != null && row.getSuccess() == 1;
boolean failed = row.getErrorMessage() != null && !row.getErrorMessage().isBlank();
if (success) {
if (isResultAwaitingFileAssembly(row, jobMap.get(row.getId()))) {
allDone = false;
continue;
}
ok++;
} else if (failed) {
fail++;
@@ -818,6 +846,34 @@ public class ShopMatchTaskService {
}
}
private boolean isResultAwaitingFileAssembly(FileResultEntity result, TaskFileJobEntity job) {
if (result == null) {
return false;
}
if (result.getResultFileUrl() != null && !result.getResultFileUrl().isBlank()) {
return false;
}
if (result.getResultFilename() == null || result.getResultFilename().isBlank()) {
return false;
}
return job == null || !"SUCCESS".equals(job.getStatus());
}
private TaskDistributedLockService.LockHandle acquireTaskLockOrThrow(Long taskId) {
TaskDistributedLockService.LockHandle lockHandle = acquireTaskLock(taskId);
if (lockHandle == null) {
throw new BusinessException(40901, "浠诲姟姝e湪澶勭悊涓紝璇风◢鍚庡啀璇?");
}
return lockHandle;
}
private TaskDistributedLockService.LockHandle acquireTaskLock(Long taskId) {
if (taskId == null || taskId <= 0) {
return null;
}
return taskDistributedLockService.acquire(MODULE_TYPE, taskId);
}
private boolean shouldRemainRunningUntilNextStage(FileTaskEntity task) {
ShopMatchCreateTaskRequest request = parseTaskRequestSilently(task);
if (request == null || request.getScheduleTimes() == null || request.getScheduleTimes().isEmpty()) {

View File

@@ -2,10 +2,13 @@ package com.nanri.aiimage.modules.similarasin.controller;
import com.nanri.aiimage.common.api.ApiResponse;
import com.nanri.aiimage.common.util.DownloadHeaderUtil;
import com.nanri.aiimage.modules.similarasin.model.dto.SimilarAsinFilterConditionAddRequest;
import com.nanri.aiimage.modules.similarasin.model.dto.SimilarAsinParseRequest;
import com.nanri.aiimage.modules.similarasin.model.dto.SimilarAsinParsedPayloadDto;
import com.nanri.aiimage.modules.similarasin.model.dto.SimilarAsinSubmitResultRequest;
import com.nanri.aiimage.modules.similarasin.model.dto.SimilarAsinTaskBatchRequest;
import com.nanri.aiimage.modules.similarasin.model.vo.SimilarAsinDashboardVo;
import com.nanri.aiimage.modules.similarasin.model.vo.SimilarAsinFilterConditionVo;
import com.nanri.aiimage.modules.similarasin.model.vo.SimilarAsinHistoryVo;
import com.nanri.aiimage.modules.similarasin.model.vo.SimilarAsinParseVo;
import com.nanri.aiimage.modules.similarasin.model.vo.SimilarAsinTaskBatchVo;
@@ -29,6 +32,7 @@ import org.springframework.web.server.ResponseStatusException;
import java.io.InputStream;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.List;
@RestController
@RequiredArgsConstructor
@@ -38,12 +42,48 @@ public class SimilarAsinController {
private final SimilarAsinTaskService service;
@GetMapping("/filter-conditions")
@Operation(summary = "查询货源查询筛选条件")
public ApiResponse<List<SimilarAsinFilterConditionVo>> listFilterConditions(
@Parameter(description = "当前用户 ID", required = true, example = "1")
@RequestParam("user_id") Long userId) {
return ApiResponse.success(service.listFilterConditions(userId));
}
@PostMapping("/filter-conditions")
@Operation(summary = "保存货源查询筛选条件")
public ApiResponse<SimilarAsinFilterConditionVo> addFilterCondition(
@Valid @RequestBody SimilarAsinFilterConditionAddRequest request) {
return ApiResponse.success(service.addFilterCondition(request));
}
@DeleteMapping("/filter-conditions/{id}")
@Operation(summary = "删除货源查询筛选条件")
public ApiResponse<Void> deleteFilterCondition(
@Parameter(description = "筛选条件主键", example = "10")
@PathVariable Long id,
@Parameter(description = "当前用户 ID", required = true, example = "1")
@RequestParam("user_id") Long userId) {
service.deleteFilterCondition(userId, id);
return ApiResponse.success(null);
}
@PostMapping("/parse")
@Operation(summary = "解析 Excel 并创建任务", description = "解析上传后的 Excel 文件,提取 id、ASIN、国家、URL、标题等字段。返回给前端的数据只包含整数 id 和 n_1 行n_2、n_3 等子行会保存在 OSS 解析载荷中,用于最终结果补齐。创建后的任务状态为 PENDING不会自动推送 Python。")
public ApiResponse<SimilarAsinParseVo> parse(@Valid @RequestBody SimilarAsinParseRequest request) {
return ApiResponse.success(service.parseAndCreateTask(request));
}
@GetMapping("/tasks/{taskId}/parsed-payload")
@Operation(summary = "获取货源查询完整解析载荷", description = "给 Python 队列消费端使用。parse 接口只返回轻量预览,大文件完整行数据通过该接口按 taskId 拉取。")
public ApiResponse<SimilarAsinParsedPayloadDto> parsedPayload(
@Parameter(description = "货源查询任务 ID", required = true, example = "7004")
@PathVariable Long taskId,
@Parameter(description = "当前用户 ID", required = true, example = "1")
@RequestParam("user_id") Long userId) {
return ApiResponse.success(service.parsedPayload(taskId, userId));
}
@GetMapping("/dashboard")
@Operation(summary = "查询相似ASIN检测总览", description = "查询当前用户的运行中、成功、失败和已结束任务数量。页面进入时请求一次即可,不需要持续轮询。")
public ApiResponse<SimilarAsinDashboardVo> dashboard(

View File

@@ -0,0 +1,9 @@
package com.nanri.aiimage.modules.similarasin.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.nanri.aiimage.modules.similarasin.model.entity.SimilarAsinFilterConditionEntity;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SimilarAsinFilterConditionMapper extends BaseMapper<SimilarAsinFilterConditionEntity> {
}

View File

@@ -0,0 +1,24 @@
package com.nanri.aiimage.modules.similarasin.model.dto;
import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@Data
@Schema(description = "货源查询筛选条件新增请求")
public class SimilarAsinFilterConditionAddRequest {
@NotNull
@JsonProperty("user_id")
@Schema(description = "当前用户 ID", example = "1", requiredMode = Schema.RequiredMode.REQUIRED)
private Long userId;
@NotBlank
@JsonProperty("condition_text")
@JsonAlias({"conditionText", "filter_condition", "filterCondition"})
@Schema(description = "筛选条件文本", example = "只筛选有货且不带品牌 logo 的商品", requiredMode = Schema.RequiredMode.REQUIRED)
private String conditionText;
}

View File

@@ -0,0 +1,19 @@
package com.nanri.aiimage.modules.similarasin.model.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName("biz_similar_asin_filter_condition")
public class SimilarAsinFilterConditionEntity {
@TableId(type = IdType.AUTO)
private Long id;
private Long userId;
private String conditionText;
private LocalDateTime createdAt;
}

View File

@@ -0,0 +1,17 @@
package com.nanri.aiimage.modules.similarasin.model.vo;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class SimilarAsinFilterConditionVo {
private Long id;
@JsonProperty("conditionText")
private String conditionText;
private LocalDateTime createdAt;
}

View File

@@ -11,14 +11,18 @@ import com.nanri.aiimage.common.service.DistributedJobLockService;
import com.nanri.aiimage.config.InstanceMetadata;
import com.nanri.aiimage.config.SimilarAsinProperties;
import com.nanri.aiimage.config.StorageProperties;
import com.nanri.aiimage.modules.similarasin.mapper.SimilarAsinFilterConditionMapper;
import com.nanri.aiimage.modules.similarasin.client.SimilarAsinCozeClient;
import com.nanri.aiimage.modules.similarasin.model.dto.SimilarAsinFilterConditionAddRequest;
import com.nanri.aiimage.modules.similarasin.model.dto.SimilarAsinParseRequest;
import com.nanri.aiimage.modules.similarasin.model.dto.SimilarAsinParsedPayloadDto;
import com.nanri.aiimage.modules.similarasin.model.dto.SimilarAsinResultGroupDto;
import com.nanri.aiimage.modules.similarasin.model.dto.SimilarAsinResultRowDto;
import com.nanri.aiimage.modules.similarasin.model.dto.SimilarAsinSourceFileDto;
import com.nanri.aiimage.modules.similarasin.model.dto.SimilarAsinSubmitResultRequest;
import com.nanri.aiimage.modules.similarasin.model.entity.SimilarAsinFilterConditionEntity;
import com.nanri.aiimage.modules.similarasin.model.vo.SimilarAsinDashboardVo;
import com.nanri.aiimage.modules.similarasin.model.vo.SimilarAsinFilterConditionVo;
import com.nanri.aiimage.modules.similarasin.model.vo.SimilarAsinHistoryItemVo;
import com.nanri.aiimage.modules.similarasin.model.vo.SimilarAsinHistoryVo;
import com.nanri.aiimage.modules.similarasin.model.vo.SimilarAsinParsedGroupVo;
@@ -102,6 +106,7 @@ public class SimilarAsinTaskService {
private static final long RESULT_ROWS_READ_RETRY_DELAY_MS = 500L;
private static final Duration TASK_LOCK_TTL = Duration.ofMinutes(5);
private static final long TASK_LOCK_WAIT_MILLIS = 10000L;
private static final int PARSE_RESPONSE_PREVIEW_LIMIT = 100;
private static final List<String> RESULT_HEADERS = List.of(
"id",
"asin",
@@ -118,6 +123,7 @@ public class SimilarAsinTaskService {
private final FileResultMapper fileResultMapper;
private final TaskScopeStateMapper taskScopeStateMapper;
private final TaskChunkMapper taskChunkMapper;
private final SimilarAsinFilterConditionMapper filterConditionMapper;
private final ObjectMapper objectMapper;
private final SimilarAsinCozeClient cozeClient;
private final SimilarAsinTaskCacheService taskCacheService;
@@ -133,6 +139,55 @@ public class SimilarAsinTaskService {
@Qualifier("cozeTaskExecutor")
private TaskExecutor cozeTaskExecutor;
public List<SimilarAsinFilterConditionVo> listFilterConditions(Long userId) {
validateUserId(userId);
List<SimilarAsinFilterConditionEntity> rows = filterConditionMapper.selectList(
new LambdaQueryWrapper<SimilarAsinFilterConditionEntity>()
.eq(SimilarAsinFilterConditionEntity::getUserId, userId)
.orderByDesc(SimilarAsinFilterConditionEntity::getId));
List<SimilarAsinFilterConditionVo> list = new ArrayList<>();
for (SimilarAsinFilterConditionEntity row : rows) {
list.add(toFilterConditionVo(row));
}
return list;
}
@Transactional
public SimilarAsinFilterConditionVo addFilterCondition(SimilarAsinFilterConditionAddRequest request) {
validateUserId(request.getUserId());
String text = normalize(request.getConditionText());
if (text.isBlank()) {
throw new BusinessException("筛选条件不能为空");
}
SimilarAsinFilterConditionEntity existing = filterConditionMapper.selectOne(
new LambdaQueryWrapper<SimilarAsinFilterConditionEntity>()
.eq(SimilarAsinFilterConditionEntity::getUserId, request.getUserId())
.eq(SimilarAsinFilterConditionEntity::getConditionText, text)
.last("limit 1"));
if (existing != null) {
return toFilterConditionVo(existing);
}
SimilarAsinFilterConditionEntity entity = new SimilarAsinFilterConditionEntity();
entity.setUserId(request.getUserId());
entity.setConditionText(text);
entity.setCreatedAt(LocalDateTime.now());
filterConditionMapper.insert(entity);
return toFilterConditionVo(entity);
}
@Transactional
public void deleteFilterCondition(Long userId, Long id) {
validateUserId(userId);
if (id == null || id <= 0) {
throw new BusinessException("id 不合法");
}
SimilarAsinFilterConditionEntity row = filterConditionMapper.selectById(id);
if (row == null || !userId.equals(row.getUserId())) {
throw new BusinessException("记录不存在");
}
filterConditionMapper.deleteById(id);
}
public SimilarAsinParseVo parseAndCreateTask(SimilarAsinParseRequest request) {
long startedAt = System.nanoTime();
if (request.getUserId() == null || request.getUserId() <= 0) {
@@ -240,8 +295,8 @@ public class SimilarAsinTaskService {
vo.setDroppedRows(droppedRows);
vo.setGroupCount(groups.size());
vo.setAiPrompt(normalize(request.getAiPrompt()));
vo.setItems(allRows);
vo.setGroups(groups);
vo.setItems(buildResponsePreviewRows(allRows));
vo.setGroups(List.of());
long finishedAt = System.nanoTime();
log.info("[similar-asin] parse timing taskId={} files={} rows={} groups={} totalMs={} parseMs={} groupMs={} taskInsertMs={} payloadJsonMs={} payloadStoreMs={} persistMs={} responseMs={}",
task.getId(),
@@ -922,6 +977,36 @@ public class SimilarAsinTaskService {
return groups;
}
private List<SimilarAsinParsedRowVo> buildResponsePreviewRows(List<SimilarAsinParsedRowVo> rows) {
if (rows == null || rows.isEmpty()) {
return List.of();
}
int limit = Math.min(PARSE_RESPONSE_PREVIEW_LIMIT, rows.size());
List<SimilarAsinParsedRowVo> preview = new ArrayList<>(limit);
for (int i = 0; i < limit; i++) {
preview.add(copyPreviewRow(rows.get(i)));
}
return preview;
}
private SimilarAsinParsedRowVo copyPreviewRow(SimilarAsinParsedRowVo row) {
SimilarAsinParsedRowVo vo = new SimilarAsinParsedRowVo();
vo.setSourceFileKey(row.getSourceFileKey());
vo.setSourceFilename(row.getSourceFilename());
vo.setRowIndex(row.getRowIndex());
vo.setSourceId(row.getSourceId());
vo.setDisplayId(row.getDisplayId());
vo.setRowToken(row.getRowToken());
vo.setGroupKey(row.getGroupKey());
vo.setAsin(row.getAsin());
vo.setCountry(row.getCountry());
vo.setPrice(row.getPrice());
vo.setUrl(row.getUrl());
vo.setTitle(row.getTitle());
vo.setValues(new LinkedHashMap<>());
return vo;
}
private Map<String, List<SimilarAsinParsedRowVo>> groupRowsByBaseId(List<SimilarAsinParsedRowVo> rows) {
Map<String, List<SimilarAsinParsedRowVo>> result = new LinkedHashMap<>();
if (rows == null) {
@@ -2228,6 +2313,28 @@ public class SimilarAsinTaskService {
return preferred == null || preferred.isBlank() ? fallback : preferred.trim();
}
private void validateUserId(Long userId) {
if (userId == null || userId <= 0) {
throw new BusinessException("user_id 不合法");
}
}
private SimilarAsinFilterConditionVo toFilterConditionVo(SimilarAsinFilterConditionEntity row) {
SimilarAsinFilterConditionVo vo = new SimilarAsinFilterConditionVo();
vo.setId(row.getId());
vo.setConditionText(row.getConditionText());
vo.setCreatedAt(row.getCreatedAt());
return vo;
}
public SimilarAsinParsedPayloadDto parsedPayload(Long taskId, Long userId) {
FileTaskEntity task = fileTaskMapper.selectById(taskId);
if (task == null || !MODULE_TYPE.equals(task.getModuleType()) || userId != null && !Objects.equals(userId, task.getUserId())) {
throw new BusinessException("任务不存在");
}
return readParsedPayload(task);
}
private String normalize(String val) {
return val == null ? "" : val.replace(String.valueOf((char) 0xFEFF), "").replace((char) 0x3000, ' ').trim().replaceAll("\\s+", " ");
}

View File

@@ -0,0 +1,35 @@
SET @schema_name = DATABASE();
SET @idx_file_result_patrol_history_desc_exists := (
SELECT COUNT(1)
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = @schema_name
AND TABLE_NAME = 'biz_file_result'
AND INDEX_NAME = 'idx_file_result_patrol_history_desc'
);
SET @sql_add_file_result_patrol_history_desc_idx := IF(
@idx_file_result_patrol_history_desc_exists = 0,
'ALTER TABLE biz_file_result ADD INDEX idx_file_result_patrol_history_desc (module_type, user_id, created_at DESC, id DESC)',
'SELECT 1'
);
PREPARE stmt_add_file_result_patrol_history_desc_idx FROM @sql_add_file_result_patrol_history_desc_idx;
EXECUTE stmt_add_file_result_patrol_history_desc_idx;
DEALLOCATE PREPARE stmt_add_file_result_patrol_history_desc_idx;
SET @idx_task_file_job_patrol_history_lookup_exists := (
SELECT COUNT(1)
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = @schema_name
AND TABLE_NAME = 'biz_task_file_job'
AND INDEX_NAME = 'idx_task_file_job_patrol_history_lookup'
);
SET @sql_add_task_file_job_patrol_history_lookup_idx := IF(
@idx_task_file_job_patrol_history_lookup_exists = 0,
'ALTER TABLE biz_task_file_job ADD INDEX idx_task_file_job_patrol_history_lookup (module_type, job_type, result_id, status)',
'SELECT 1'
);
PREPARE stmt_add_task_file_job_patrol_history_lookup_idx FROM @sql_add_task_file_job_patrol_history_lookup_idx;
EXECUTE stmt_add_task_file_job_patrol_history_lookup_idx;
DEALLOCATE PREPARE stmt_add_task_file_job_patrol_history_lookup_idx;

View File

@@ -0,0 +1,15 @@
CREATE TABLE IF NOT EXISTS biz_similar_asin_filter_condition (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
condition_text VARCHAR(500) NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uk_similar_asin_filter_condition_user_text (user_id, condition_text),
KEY idx_similar_asin_filter_condition_user_id (user_id)
);
UPDATE `columns`
SET `name` = 'source query',
`menu_type` = 'app',
`route_path` = 'similar-asin',
`sort_order` = 112
WHERE `column_key` = 'similar_asin';

View File

@@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>相似ASIN检测</title>
<title>货源查询</title>
</head>
<body>
<div id="app"></div>

View File

@@ -0,0 +1,337 @@
<template>
<div class="secret-settings-entry">
<button type="button" class="secret-settings-trigger" @click="dialogVisible = true">
<span class="secret-settings-icon" aria-hidden="true"></span>
<span>密钥设置</span>
</button>
<el-dialog v-model="dialogVisible" width="560px" class="secret-settings-dialog" :append-to-body="true">
<template #header>
<div class="dialog-header">
<div class="dialog-title">设置</div>
<div class="dialog-subtitle">按当前登录用户保存在本机可分别管理外观专利和货源查询密钥</div>
</div>
</template>
<div class="secret-settings-body">
<section v-for="item in moduleStates" :key="item.moduleKey" class="secret-card">
<div class="secret-card-head">
<div>
<div class="secret-card-title">{{ item.title }}</div>
<div class="secret-card-desc">{{ item.description }}</div>
</div>
<button
v-if="item.exists"
type="button"
class="link-danger"
@click="clearSecret(item.moduleKey)"
>
清空
</button>
</div>
<input
v-model="item.value"
class="secret-input"
type="password"
:placeholder="`请输入${item.title}密钥`"
autocomplete="off"
spellcheck="false"
/>
<div class="retention-block">
<div class="retention-label">保留时长</div>
<div class="retention-options">
<label v-for="option in retentionOptions" :key="option.value" class="retention-option">
<input v-model="item.retention" type="radio" :value="option.value" />
<span>{{ option.label }}</span>
</label>
</div>
</div>
<div class="secret-meta">
<span v-if="item.exists">{{ formatRetentionText(item.retention, item.expiresAt) }}</span>
<span v-else>当前未保存</span>
</div>
</section>
</div>
<template #footer>
<div class="dialog-footer">
<button type="button" class="footer-btn footer-btn-ghost" @click="dialogVisible = false">取消</button>
<button type="button" class="footer-btn footer-btn-primary" @click="saveAll">保存</button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup lang="ts">
import { ref, watch } from 'vue'
import { ElMessage } from 'element-plus'
import {
clearStoredApiSecret,
getStoredApiSecretSnapshot,
saveStoredApiSecret,
type ApiSecretModuleKey,
type ApiSecretRetention,
} from '@/shared/utils/api-secret-store'
type ModuleState = {
moduleKey: ApiSecretModuleKey
title: string
description: string
value: string
retention: ApiSecretRetention
expiresAt: number | null
exists: boolean
}
const dialogVisible = ref(false)
const retentionOptions: Array<{ value: ApiSecretRetention; label: string }> = [
{ value: 'session', label: '仅本次打开有效' },
{ value: '1d', label: '1天' },
{ value: '7d', label: '7天' },
{ value: '30d', label: '30天' },
{ value: 'forever', label: '长期保留' },
]
const moduleStates = ref<ModuleState[]>([])
function buildModuleState(
moduleKey: ApiSecretModuleKey,
title: string,
description: string,
): ModuleState {
const snapshot = getStoredApiSecretSnapshot(moduleKey)
return {
moduleKey,
title,
description,
value: snapshot.value,
retention: snapshot.retention,
expiresAt: snapshot.expiresAt,
exists: snapshot.exists,
}
}
function loadStates() {
moduleStates.value = [
buildModuleState('appearance-patent', '外观专利', '用于外观专利检测的 Coze 接口密钥。'),
buildModuleState('similar-asin', '货源查询', '用于货源查询的 Coze 接口密钥。'),
]
}
function formatRetentionText(retention: ApiSecretRetention, expiresAt: number | null) {
if (retention === 'session') return '关闭软件后自动清空'
if (retention === 'forever') return '长期保留,直到手动清空'
if (!expiresAt) return '已保存'
const date = new Date(expiresAt)
const year = date.getFullYear()
const month = String(date.getMonth() + 1).padStart(2, '0')
const day = String(date.getDate()).padStart(2, '0')
const hour = String(date.getHours()).padStart(2, '0')
const minute = String(date.getMinutes()).padStart(2, '0')
return `有效期至 ${year}-${month}-${day} ${hour}:${minute}`
}
function clearSecret(moduleKey: ApiSecretModuleKey) {
clearStoredApiSecret(moduleKey)
loadStates()
ElMessage.success('已清空密钥')
}
function saveAll() {
for (const item of moduleStates.value) {
saveStoredApiSecret(item.moduleKey, item.value, item.retention)
}
loadStates()
dialogVisible.value = false
ElMessage.success('密钥设置已保存')
}
watch(dialogVisible, (visible) => {
if (visible) {
loadStates()
}
})
loadStates()
</script>
<style scoped>
.secret-settings-entry {
display: flex;
align-items: center;
justify-content: flex-end;
}
.secret-settings-trigger {
display: inline-flex;
align-items: center;
gap: 8px;
height: 38px;
padding: 0 14px;
border: 1px solid #3c4a58;
border-radius: 10px;
background: linear-gradient(180deg, #2b3239 0%, #242a31 100%);
color: #e7edf4;
font-size: 13px;
font-weight: 700;
cursor: pointer;
}
.secret-settings-trigger:hover {
border-color: #4c647d;
}
.secret-settings-icon {
color: #8dc4ff;
font-size: 14px;
line-height: 1;
}
.dialog-header {
display: flex;
flex-direction: column;
gap: 4px;
}
.dialog-title {
color: #f5f7fa;
font-size: 16px;
font-weight: 700;
}
.dialog-subtitle {
color: #8f9aa7;
font-size: 12px;
line-height: 1.5;
}
.secret-settings-body {
display: flex;
flex-direction: column;
gap: 14px;
}
.secret-card {
padding: 16px;
border: 1px solid #2f363f;
border-radius: 12px;
background: #22272d;
}
.secret-card-head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 12px;
margin-bottom: 12px;
}
.secret-card-title {
color: #eef4fb;
font-size: 15px;
font-weight: 700;
}
.secret-card-desc {
margin-top: 4px;
color: #909ba8;
font-size: 12px;
line-height: 1.5;
}
.secret-input {
width: 100%;
height: 42px;
padding: 0 12px;
box-sizing: border-box;
border: 1px solid #3b4652;
border-radius: 10px;
background: #1b2026;
color: #dce6f0;
font-size: 13px;
outline: none;
}
.secret-input:focus {
border-color: #5b96d6;
}
.retention-block {
margin-top: 12px;
}
.retention-label {
margin-bottom: 8px;
color: #a3afbb;
font-size: 12px;
}
.retention-options {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.retention-option {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 6px 10px;
border-radius: 999px;
background: #1b2026;
color: #dce4ec;
font-size: 12px;
cursor: pointer;
}
.retention-option input {
margin: 0;
}
.secret-meta {
margin-top: 10px;
color: #7f8a96;
font-size: 12px;
}
.link-danger {
border: none;
background: transparent;
color: #ff9b9b;
font-size: 12px;
cursor: pointer;
padding: 0;
}
.dialog-footer {
display: flex;
justify-content: flex-end;
gap: 10px;
}
.footer-btn {
height: 38px;
padding: 0 18px;
border-radius: 10px;
border: 1px solid transparent;
font-size: 13px;
font-weight: 700;
cursor: pointer;
}
.footer-btn-ghost {
border-color: #3a4653;
background: #232a31;
color: #d9e2eb;
}
.footer-btn-primary {
background: #5aa2ea;
color: #fff;
}
</style>

View File

@@ -24,11 +24,6 @@
<div class="prompt-preview">{{ defaultAiPrompt }}</div>
</div>
<div class="secret-card">
<div class="section-title">密钥</div>
<input v-model="cozeApiKey" class="secret-input" type="password" autocomplete="off" spellcheck="false" />
</div>
<div class="run-row">
<button type="button" class="btn-run" :disabled="parsing || !uploadedFiles.length" @click="parseFiles">
{{ parsing ? '解析中...' : '解析并创建任务' }}
@@ -170,6 +165,7 @@ import {
import { expandBrandFolderRecursive, type BrandExpandFolderItem } from '@/shared/api/brand'
import { getPywebviewApi } from '@/shared/bridges/pywebview'
import { getTaskPollIntervalMs } from '@/shared/task-progress-config'
import { getStoredApiSecret } from '@/shared/utils/api-secret-store'
import { createCategorizedTimers } from '@/shared/utils/categorized-timers'
const selectedFileNames = ref<string[]>([])
@@ -185,7 +181,6 @@ const defaultAiPrompt = `请帮我排查以下亚马逊商品在英国及欧洲
标题维度: 排查标题中是否包含大牌商标、敏感词或版权保护词汇。
结论XX`
const aiPrompt = ref('')
const cozeApiKey = ref('')
const parsing = ref(false)
const pushing = ref(false)
const queuePayloadText = ref('')
@@ -225,7 +220,7 @@ function effectiveAiPrompt() {
}
function effectiveCozeApiKey() {
return cozeApiKey.value.trim()
return getStoredApiSecret('appearance-patent').trim()
}
function maskSecret(secret: string) {
@@ -352,7 +347,7 @@ async function parseFiles() {
return
}
if (!effectiveCozeApiKey()) {
ElMessage.warning('请先填写密钥')
ElMessage.warning('请先在左上角设置中填写外观专利密钥')
return
}
parsing.value = true
@@ -399,6 +394,10 @@ async function pushToPythonQueue() {
ElMessage.error('当前环境未启用 pywebview enqueue_json')
return
}
if (!effectiveCozeApiKey()) {
ElMessage.warning('请先在左上角设置中填写外观专利密钥')
return
}
pushing.value = true
try {
const payload = {
@@ -773,6 +772,7 @@ onUnmounted(() => {
.selected-files { margin-top: 14px; color: #999; font-size: 12px; word-break: break-all; }
.selected-files span { display: block; margin: 4px 0; }
.prompt-card, .secret-card { margin-bottom: 18px; }
.secret-card { display: none; }
.prompt-input { width: 100%; box-sizing: border-box; resize: vertical; min-height: 180px; padding: 10px 12px; border: 1px solid #333; border-radius: 8px; background: #202020; color: #d8d8d8; font-size: 12px; line-height: 1.6; outline: none; }
.secret-input { width: 100%; box-sizing: border-box; height: 38px; padding: 0 12px; border: 1px solid #333; border-radius: 8px; background: #202020; color: #d8d8d8; font-size: 12px; outline: none; }
.prompt-input:focus, .secret-input:focus { border-color: #3498db; }

View File

@@ -18,15 +18,30 @@
</div>
<div class="prompt-card">
<div class="section-title">AI 提示词</div>
<textarea v-model="aiPrompt" class="prompt-input" rows="8" placeholder="可选,留空时使用下方默认提示词" />
<div class="prompt-default-label">留空时默认使用以下提示词</div>
<div class="prompt-preview">{{ defaultAiPrompt }}</div>
<div class="section-title">筛选条件</div>
<textarea v-model="filterConditionInput" class="prompt-input" rows="4" placeholder="请输入筛选条件" />
<div class="condition-actions">
<button type="button" class="opt-btn" :disabled="savingCondition" @click="saveFilterCondition">
{{ savingCondition ? '保存中...' : '保存' }}
</button>
</div>
<div class="secret-card">
<div class="section-title">密钥</div>
<input v-model="cozeApiKey" class="secret-input" type="password" autocomplete="off" spellcheck="false" />
<div class="section-title condition-list-title">备选区</div>
<div v-if="!filterConditions.length" class="empty-conditions">暂无筛选条件输入后保存即可加入备选区</div>
<ul v-else class="condition-list">
<li v-for="condition in filterConditions" :key="condition.id" class="condition-item">
<label class="condition-check">
<input
v-model="selectedFilterConditionId"
type="radio"
name="similar-asin-filter-condition"
:value="condition.id"
@change="applySelectedFilterCondition(condition)"
/>
<span :title="condition.conditionText">{{ condition.conditionText }}</span>
</label>
<button type="button" class="link-danger" @click="removeFilterCondition(condition.id)">删除</button>
</li>
</ul>
</div>
<div class="run-row">
@@ -47,7 +62,7 @@
</aside>
<section class="right-panel">
<div class="panel-header">相似ASIN检测</div>
<div class="panel-header">货源查询</div>
<div class="task-list-wrap">
<div class="clean-result-summary">
<div class="summary-card">
@@ -93,7 +108,7 @@
<ul v-else class="task-list clean-result-list">
<li v-for="item in currentItems" :key="`cur-${item.taskId}`" class="task-item">
<div class="left">
<span class="id">{{ item.sourceFilename || '相似ASIN检测' }}</span>
<span class="id">{{ item.sourceFilename || '货源查询' }}</span>
<div class="files">任务 ID{{ item.taskId }}</div>
<div class="files">行数{{ item.rowCount ?? '-' }}</div>
</div>
@@ -113,7 +128,7 @@
<ul v-else class="task-list clean-result-list">
<li v-for="item in historyOnlyItems" :key="`his-${item.resultId}-${item.taskId}`" class="task-item">
<div class="left">
<span class="id">{{ item.sourceFilename || '相似ASIN检测' }}</span>
<span class="id">{{ item.sourceFilename || '货源查询' }}</span>
<div class="files">任务 ID{{ item.taskId ?? '-' }}</div>
<div v-if="item.resultFilename" class="files">
{{ item.resultFilename || '下载结果' }}
@@ -153,13 +168,17 @@ import { ElMessage } from 'element-plus'
import BrandTopBar from '@/pages/brand/components/BrandTopBar.vue'
import {
activateSimilarAsinTask,
addSimilarAsinFilterCondition,
deleteSimilarAsinFilterCondition,
deleteSimilarAsinHistory,
deleteSimilarAsinTask,
getSimilarAsinDashboard,
getSimilarAsinHistory,
getSimilarAsinResultDownloadUrl,
getSimilarAsinTaskProgressBatch,
listSimilarAsinFilterConditions,
parseSimilarAsin,
type SimilarAsinFilterConditionVo,
type SimilarAsinParsedGroup,
type SimilarAsinDashboardVo,
type SimilarAsinHistoryItem,
@@ -171,6 +190,7 @@ import {
import { expandBrandFolderRecursive, type BrandExpandFolderItem } from '@/shared/api/brand'
import { getPywebviewApi } from '@/shared/bridges/pywebview'
import { getTaskPollIntervalMs } from '@/shared/task-progress-config'
import { getStoredApiSecret } from '@/shared/utils/api-secret-store'
import { createCategorizedTimers } from '@/shared/utils/categorized-timers'
const selectedFileNames = ref<string[]>([])
@@ -179,14 +199,12 @@ const parseResult = ref<SimilarAsinParseVo | null>(null)
const parsedGroups = ref<SimilarAsinParsedGroup[]>([])
type TaskSummary = Pick<SimilarAsinParseVo, 'taskId' | 'totalRows' | 'acceptedRows' | 'groupCount' | 'droppedRows'>
const queuedTaskSummary = ref<TaskSummary | null>(null)
const defaultAiPrompt = `1. 图案与形象限制不含各国国旗及类似图案无各国领导人画像不含圣诞老人形象排除迪士尼、漫威、三丽鸥等所有指定动漫IP的图案与关联物品且不涉及知名油画作品图案。
2. 品类排除:非图书、刀具、服装;不含药品、带容器的粉末及液体;与吸烟行为无关,无医疗标志。
3. 功能与配件要求:不可充电且不带电池,无磁吸功能;配件多的情况下需完全匹配。
4. 规格与外观限制不含体积大的家具类物品如椅子、桌子、大镜子、柜子不带任何品牌logo无多种款式可选。`
const aiPrompt = ref('')
const cozeApiKey = ref('')
const filterConditionInput = ref('')
const filterConditions = ref<SimilarAsinFilterConditionVo[]>([])
const selectedFilterConditionId = ref<number | null>(null)
const parsing = ref(false)
const pushing = ref(false)
const savingCondition = ref(false)
const queuePayloadText = ref('')
const pollingTaskIds = ref<number[]>([])
const pendingFileTaskIds = ref<number[]>([])
@@ -206,11 +224,7 @@ const dashboard = ref<SimilarAsinDashboardVo>({
})
const historyItems = ref<SimilarAsinHistoryItem[]>([])
const parsedRows = computed<SimilarAsinParsedRow[]>(() =>
parseResult.value?.items?.length
? parseResult.value.items
: parsedGroups.value.flatMap((group) => group.items || []),
)
const parsedRows = computed<SimilarAsinParsedRow[]>(() => parseResult.value?.items || [])
const previewRows = computed(() => parsedRows.value)
const visibleTaskSummary = computed(() => parseResult.value || queuedTaskSummary.value)
const currentItems = computed(() => historyItems.value.filter((i) => i.taskId != null && pollingTaskIds.value.includes(i.taskId)))
@@ -221,12 +235,18 @@ const historyOnlyItems = computed(() =>
}),
)
function effectiveAiPrompt() {
return aiPrompt.value.trim() || defaultAiPrompt
function selectedFilterConditionText() {
const selectedId = selectedFilterConditionId.value
if (selectedId == null) return ''
return filterConditions.value.find((item) => item.id === selectedId)?.conditionText?.trim() || ''
}
function effectiveFilterCondition() {
return filterConditionInput.value.trim() || selectedFilterConditionText()
}
function effectiveCozeApiKey() {
return cozeApiKey.value.trim()
return getStoredApiSecret('similar-asin').trim()
}
function maskSecret(secret: string) {
@@ -347,13 +367,64 @@ async function selectFolder() {
}
}
async function loadFilterConditions() {
try {
filterConditions.value = await listSimilarAsinFilterConditions()
const ids = new Set(filterConditions.value.map((item) => item.id))
if (selectedFilterConditionId.value != null && !ids.has(selectedFilterConditionId.value)) {
selectedFilterConditionId.value = null
}
} catch (e) {
ElMessage.error(e instanceof Error ? e.message : '加载筛选条件失败')
}
}
async function saveFilterCondition() {
const text = filterConditionInput.value.trim()
if (!text) {
ElMessage.warning('请输入筛选条件')
return
}
savingCondition.value = true
try {
const saved = await addSimilarAsinFilterCondition(text)
await loadFilterConditions()
if (saved?.id) selectedFilterConditionId.value = saved.id
ElMessage.success('筛选条件已保存')
} catch (e) {
ElMessage.error(e instanceof Error ? e.message : '保存筛选条件失败')
} finally {
savingCondition.value = false
}
}
function applySelectedFilterCondition(condition: SimilarAsinFilterConditionVo) {
filterConditionInput.value = condition.conditionText || ''
}
async function removeFilterCondition(id: number) {
try {
await deleteSimilarAsinFilterCondition(id)
if (selectedFilterConditionId.value === id) selectedFilterConditionId.value = null
await loadFilterConditions()
ElMessage.success('筛选条件已删除')
} catch (e) {
ElMessage.error(e instanceof Error ? e.message : '删除筛选条件失败')
}
}
async function parseFiles() {
if (!uploadedFiles.value.length) {
ElMessage.warning('请先选择 Excel')
return
}
const filterCondition = effectiveFilterCondition()
if (!filterCondition) {
ElMessage.warning('请输入筛选条件,或在备选区选择一个筛选条件')
return
}
if (!effectiveCozeApiKey()) {
ElMessage.warning('请先填写密钥')
ElMessage.warning('请先在左上角设置中填写货源查询密钥')
return
}
parsing.value = true
@@ -363,20 +434,10 @@ async function parseFiles() {
originalFilename: f.originalFilename,
relativePath: f.relativePath,
}))
const res = await parseSimilarAsin(files, effectiveAiPrompt(), effectiveCozeApiKey())
const res = await parseSimilarAsin(files, filterCondition, effectiveCozeApiKey())
parseResult.value = res
queuedTaskSummary.value = null
parsedGroups.value = res.items?.length
? [{
sourceFileKey: res.items[0]?.sourceFileKey,
sourceFilename: res.items[0]?.sourceFilename,
groupKey: `similar-asin:${res.taskId}`,
baseId: '',
displayId: res.items[0]?.displayId,
itemCount: res.items.length,
items: res.items,
}]
: []
parsedGroups.value = []
queuePayloadText.value = ''
ElMessage.success(`解析完成,共 ${res.acceptedRows}`)
} catch (e) {
@@ -390,7 +451,7 @@ async function pushToPythonQueue() {
const api = getPywebviewApi()
const currentParseResult = parseResult.value
const taskId = currentParseResult?.taskId
if (!taskId || !parsedRows.value.length) {
if (!taskId) {
ElMessage.warning('请先解析文件')
return
}
@@ -399,7 +460,7 @@ async function pushToPythonQueue() {
return
}
if (!effectiveCozeApiKey()) {
ElMessage.warning('请先填写密钥')
ElMessage.warning('请先在左上角设置中填写货源查询密钥')
return
}
pushing.value = true
@@ -409,41 +470,12 @@ async function pushToPythonQueue() {
ts: Date.now(),
data: {
taskId,
prompt: currentParseResult.aiPrompt || effectiveAiPrompt(),
prompt: currentParseResult.aiPrompt || effectiveFilterCondition(),
api_key: effectiveCozeApiKey(),
groups: parsedGroups.value.map((group) => ({
sourceFileKey: group.sourceFileKey || '',
sourceFilename: group.sourceFilename || '',
groupKey: group.groupKey || '',
baseId: group.baseId || '',
displayId: group.displayId || '',
items: (group.items || []).map((row) => ({
sourceFileKey: row.sourceFileKey || '',
sourceFilename: row.sourceFilename || '',
rowToken: row.rowToken || '',
groupKey: row.groupKey || '',
id: row.displayId,
asin: row.asin,
country: row.country,
price: row.price || '',
url: row.url || '',
title: row.title || '',
target_urls: [],
})),
})),
rows: parsedRows.value.map((row) => ({
sourceFileKey: row.sourceFileKey || '',
sourceFilename: row.sourceFilename || '',
rowToken: row.rowToken || '',
groupKey: row.groupKey || '',
id: row.displayId,
asin: row.asin,
country: row.country,
price: row.price || '',
url: row.url || '',
title: row.title || '',
target_urls: [],
})),
sourceFileCount: currentParseResult.sourceFileCount || 0,
totalRows: currentParseResult.totalRows || 0,
acceptedRows: currentParseResult.acceptedRows || 0,
groupCount: currentParseResult.groupCount || 0,
},
}
queuePayloadText.value = JSON.stringify(payloadForDisplay(payload), null, 2)
@@ -747,6 +779,7 @@ async function deleteTaskRecord(item: SimilarAsinHistoryItem) {
onMounted(async () => {
loadPollingIds()
await Promise.all([
loadFilterConditions().catch(() => undefined),
loadDashboard().catch(() => undefined),
loadHistory().catch(() => undefined),
])
@@ -779,12 +812,20 @@ onUnmounted(() => {
.btn-run:disabled { opacity: .55; cursor: not-allowed; }
.selected-files { margin-top: 14px; color: #999; font-size: 12px; word-break: break-all; }
.selected-files span { display: block; margin: 4px 0; }
.prompt-card, .secret-card { margin-bottom: 18px; }
.prompt-input { width: 100%; box-sizing: border-box; resize: vertical; min-height: 180px; padding: 10px 12px; border: 1px solid #333; border-radius: 8px; background: #202020; color: #d8d8d8; font-size: 12px; line-height: 1.6; outline: none; }
.secret-input { width: 100%; box-sizing: border-box; height: 38px; padding: 0 12px; border: 1px solid #333; border-radius: 8px; background: #202020; color: #d8d8d8; font-size: 12px; outline: none; }
.prompt-input:focus, .secret-input:focus { border-color: #3498db; }
.prompt-default-label { margin-top: 10px; color: #8d8d8d; font-size: 12px; }
.prompt-preview { margin-top: 10px; padding: 12px; border: 1px solid #2a2a2a; border-radius: 8px; background: #202020; color: #9ea7b3; font-size: 12px; line-height: 1.6; white-space: pre-wrap; }
.prompt-card { margin-bottom: 14px; }
.prompt-input { width: 100%; box-sizing: border-box; resize: vertical; min-height: 96px; max-height: 140px; padding: 8px 12px; border: 1px solid #333; border-radius: 8px; background: #202020; color: #d8d8d8; font-size: 12px; line-height: 1.5; outline: none; }
.prompt-input:focus { border-color: #3498db; }
.condition-actions { display: flex; justify-content: flex-end; margin-top: 8px; }
.condition-actions .opt-btn { padding: 6px 14px; }
.condition-list-title { margin-top: 10px; }
.empty-conditions { color: #666; font-size: 12px; padding: 10px 4px; }
.condition-list { list-style: none; margin: 0; padding: 0; max-height: 96px; overflow: auto; display: flex; flex-direction: column; gap: 6px; }
.condition-item { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 6px; border-bottom: 1px solid #303030; }
.condition-item:last-child { border-bottom: none; }
.condition-check { display: flex; align-items: center; gap: 8px; min-width: 0; color: #cfd6df; font-size: 12px; cursor: pointer; }
.condition-check input { width: 16px; height: 16px; margin: 0; flex: 0 0 auto; }
.condition-check span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.link-danger { border: none; background: transparent; color: #ff8f8f; cursor: pointer; font-size: 12px; padding: 2px 0; white-space: nowrap; }
.parse-card, .queue-payload { margin-top: 14px; padding: 12px; border: 1px solid #2a2a2a; border-radius: 8px; background: #202020; color: #b8c1cc; font-size: 12px; }
.queue-payload { max-height: 220px; overflow: auto; color: #8fd3ff; white-space: pre-wrap; }
.panel-header { padding: 16px 20px; border-bottom: 1px solid #2a2a2a; font-size: 15px; font-weight: 600; color: #ddd; }

View File

@@ -34,13 +34,16 @@
</section>
</nav>
<div class="top-right"></div>
<div class="top-right">
<BrandApiSecretSettingsButton />
</div>
</header>
</template>
<script setup lang="ts">
import { computed, onMounted, ref } from 'vue'
import BrandApiSecretSettingsButton from '@/pages/brand/components/BrandApiSecretSettingsButton.vue'
import { getCurrentUserAppColumnKeys } from '@/shared/api/permission'
type ActiveNavKey =
@@ -85,7 +88,7 @@ const navGroups: ReadonlyArray<NavGroup> = [
{ key: 'variant', label: '变体分析' },
{ key: 'brand', label: '品牌检测', href: '/brand' },
{ key: 'appearance-patent', label: '外观专利检测', href: '/new_web_source/appearance-patent.html' },
{ key: 'similar-asin', label: '相似ASIN检测', href: '/new_web_source/similar-asin.html' },
{ key: 'similar-asin', label: '货源查询', href: '/new_web_source/similar-asin.html' },
{ key: 'dedupe', label: '数据去重', href: '/new_web_source/dedupe.html' },
{ key: 'split', label: '数据拆分', href: '/new_web_source/split.html' },
{ key: 'convert', label: '格式转换', href: '/new_web_source/convert.html' },
@@ -248,8 +251,11 @@ onMounted(async () => {
}
.top-right {
width: 60px;
width: 140px;
flex-shrink: 0;
display: flex;
justify-content: flex-end;
padding-top: 8px;
}
@media (max-width: 1200px) {

View File

@@ -1604,7 +1604,13 @@ export function getAppearancePatentResultDownloadUrl(resultId: number) {
return getJavaDownloadUrl(`/appearance-patent/results/${resultId}/download`);
}
// ========== 相似ASIN检测 ==========
// ========== 货源查询 ==========
export interface SimilarAsinFilterConditionVo {
id: number;
conditionText: string;
createdAt?: string;
}
export interface SimilarAsinParsedRow {
rowIndex: number;
@@ -1696,7 +1702,7 @@ export interface SimilarAsinTaskBatchVo {
missingTaskIds?: number[];
}
export function parseSimilarAsin(files: UploadedFileRef[], aiPrompt: string, apiKey?: string) {
export function parseSimilarAsin(files: UploadedFileRef[], filterCondition: string, apiKey?: string) {
return unwrapJavaResponse(
post<
JavaApiResponse<SimilarAsinParseVo>,
@@ -1704,12 +1710,41 @@ export function parseSimilarAsin(files: UploadedFileRef[], aiPrompt: string, api
>(`${JAVA_API_PREFIX}/similar-asin/parse`, {
user_id: getCurrentUserId(),
files,
ai_prompt: aiPrompt,
ai_prompt: filterCondition,
api_key: apiKey,
}),
);
}
export function listSimilarAsinFilterConditions() {
return unwrapJavaResponse(
get<JavaApiResponse<SimilarAsinFilterConditionVo[]>>(
`${JAVA_API_PREFIX}/similar-asin/filter-conditions`,
{ params: { user_id: getCurrentUserId() } },
),
);
}
export function addSimilarAsinFilterCondition(conditionText: string) {
return unwrapJavaResponse(
post<
JavaApiResponse<SimilarAsinFilterConditionVo>,
{ user_id: number; condition_text: string }
>(`${JAVA_API_PREFIX}/similar-asin/filter-conditions`, {
user_id: getCurrentUserId(),
condition_text: conditionText,
}),
);
}
export function deleteSimilarAsinFilterCondition(id: number) {
return unwrapJavaResponse(
del<JavaApiResponse<null>>(`${JAVA_API_PREFIX}/similar-asin/filter-conditions/${id}`, {
params: { user_id: getCurrentUserId() },
}),
);
}
export function getSimilarAsinDashboard() {
return unwrapJavaResponse(
get<JavaApiResponse<SimilarAsinDashboardVo>>(

View File

@@ -0,0 +1,156 @@
export type ApiSecretModuleKey = 'appearance-patent' | 'similar-asin'
export type ApiSecretRetention = 'session' | '1d' | '7d' | '30d' | 'forever'
type ApiSecretRecord = {
value: string
retention: ApiSecretRetention
expiresAt: number | null
updatedAt: number
}
export type ApiSecretSnapshot = {
value: string
retention: ApiSecretRetention
expiresAt: number | null
updatedAt: number | null
exists: boolean
}
const STORAGE_PREFIX = 'brand:api-secret'
function currentUserStorageId() {
if (typeof window === 'undefined') return '0'
return window.localStorage.getItem('uid') || '0'
}
function buildStorageKey(moduleKey: ApiSecretModuleKey) {
return `${STORAGE_PREFIX}:${currentUserStorageId()}:${moduleKey}`
}
function readStorageRecord(storage: Storage, moduleKey: ApiSecretModuleKey): ApiSecretRecord | null {
const raw = storage.getItem(buildStorageKey(moduleKey))
if (!raw) return null
try {
const parsed = JSON.parse(raw) as Partial<ApiSecretRecord>
if (typeof parsed.value !== 'string') return null
const retention = normalizeRetention(parsed.retention)
const expiresAt = typeof parsed.expiresAt === 'number' ? parsed.expiresAt : null
const updatedAt = typeof parsed.updatedAt === 'number' ? parsed.updatedAt : Date.now()
return {
value: parsed.value,
retention,
expiresAt,
updatedAt,
}
} catch {
return null
}
}
function normalizeRetention(value: unknown): ApiSecretRetention {
switch (value) {
case '1d':
case '7d':
case '30d':
case 'forever':
case 'session':
return value
default:
return 'session'
}
}
function retentionToExpiresAt(retention: ApiSecretRetention, now: number) {
switch (retention) {
case '1d':
return now + 24 * 60 * 60 * 1000
case '7d':
return now + 7 * 24 * 60 * 60 * 1000
case '30d':
return now + 30 * 24 * 60 * 60 * 1000
case 'forever':
return null
case 'session':
default:
return null
}
}
function isExpired(record: ApiSecretRecord) {
return record.expiresAt != null && record.expiresAt <= Date.now()
}
function clearStorageRecord(storage: Storage, moduleKey: ApiSecretModuleKey) {
storage.removeItem(buildStorageKey(moduleKey))
}
function getLiveRecord(moduleKey: ApiSecretModuleKey): ApiSecretRecord | null {
if (typeof window === 'undefined') return null
const sessionRecord = readStorageRecord(window.sessionStorage, moduleKey)
if (sessionRecord) {
return sessionRecord
}
const localRecord = readStorageRecord(window.localStorage, moduleKey)
if (!localRecord) return null
if (isExpired(localRecord)) {
clearStorageRecord(window.localStorage, moduleKey)
return null
}
return localRecord
}
export function getStoredApiSecret(moduleKey: ApiSecretModuleKey) {
return getLiveRecord(moduleKey)?.value || ''
}
export function getStoredApiSecretSnapshot(moduleKey: ApiSecretModuleKey): ApiSecretSnapshot {
const record = getLiveRecord(moduleKey)
if (!record) {
return {
value: '',
retention: 'session',
expiresAt: null,
updatedAt: null,
exists: false,
}
}
return {
value: record.value,
retention: record.retention,
expiresAt: record.expiresAt,
updatedAt: record.updatedAt,
exists: true,
}
}
export function saveStoredApiSecret(
moduleKey: ApiSecretModuleKey,
value: string,
retention: ApiSecretRetention,
) {
if (typeof window === 'undefined') return
const trimmedValue = value.trim()
clearStoredApiSecret(moduleKey)
if (!trimmedValue) return
const now = Date.now()
const record: ApiSecretRecord = {
value: trimmedValue,
retention,
expiresAt: retentionToExpiresAt(retention, now),
updatedAt: now,
}
const storage = retention === 'session' ? window.sessionStorage : window.localStorage
storage.setItem(buildStorageKey(moduleKey), JSON.stringify(record))
}
export function clearStoredApiSecret(moduleKey: ApiSecretModuleKey) {
if (typeof window === 'undefined') return
clearStorageRecord(window.sessionStorage, moduleKey)
clearStorageRecord(window.localStorage, moduleKey)
}

View File

@@ -1,732 +0,0 @@
java-server | 08:17:25.47 INFO ==>
java-server | 08:17:25.47 INFO ==> Welcome to the Bitnami java container
java-server | 08:17:25.48 INFO ==> Subscribe to project updates by watching https://github.com/bitnami/containers
java-server | 08:17:25.48 INFO ==> Did you know there are enterprise versions of the Bitnami catalog? For enhanced secure software supply chain features, unlimited pulls from Docker, LTS support, or application customization, see Bitnami Premium or Tanzu Application Catalog. See https://www.arrow.com/globalecs/na/vendors/bitnami/ for more information.
java-server | 08:17:25.48 INFO ==>
java-server |
java-server | Standard Commons Logging discovery in action with spring-jcl: please remove commons-logging.jar from classpath in order to avoid potential conflicts
java-server |
java-server | . ____ _ __ _ _
java-server | /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
java-server | ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
java-server | \\/ ___)| |_)| | | | | || (_| | ) ) ) )
java-server | ' |____| .__|_| |_|_| |_\__, | / / / /
java-server | =========|_|==============|___/=/_/_/_/
java-server |
java-server | :: Spring Boot :: (v3.3.9)
java-server |
java-server | 2026-05-05 16:17:26.296 [background-preinit] INFO o.h.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.2.Final
java-server | 2026-05-05 16:17:26.332 [main] INFO c.nanri.aiimage.AiImageApplication - Starting AiImageApplication v0.0.1-SNAPSHOT using Java 21.0.7 with PID 12 (/app/aiimage-backend-0.0.1-SNAPSHOT.jar started by root in /app)
java-server | 2026-05-05 16:17:26.332 [main] INFO c.nanri.aiimage.AiImageApplication - No active profile set, falling back to 1 default profile: "default"
java-server | 2026-05-05 16:17:27.253 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode
java-server | 2026-05-05 16:17:27.255 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode.
java-server | 2026-05-05 16:17:27.282 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 14 ms. Found 0 Redis repository interfaces.
java-server | 2026-05-05 16:17:27.882 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port 18080 (http)
java-server | 2026-05-05 16:17:27.890 [main] INFO o.a.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-18080"]
java-server | 2026-05-05 16:17:27.891 [main] INFO o.a.catalina.core.StandardService - Starting service [Tomcat]
java-server | 2026-05-05 16:17:27.891 [main] INFO o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.36]
java-server | 2026-05-05 16:17:27.910 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext
java-server | 2026-05-05 16:17:27.910 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 1549 ms
java-server | Standard Commons Logging discovery in action with spring-jcl: please remove commons-logging.jar from classpath in order to avoid potential conflicts
java-server | _ _ |_ _ _|_. ___ _ | _
java-server | | | |\/|_)(_| | |_\ |_)||_|_\
java-server | / |
java-server | 3.5.7
java-server | 2026-05-05 16:17:29.176 [main] WARN c.b.m.core.metadata.TableInfoHelper - Can not find table primary key in Class: "com.nanri.aiimage.modules.permission.model.entity.UserColumnPermissionEntity".
java-server | 2026-05-05 16:17:29.176 [main] WARN c.b.m.c.injector.DefaultSqlInjector - class com.nanri.aiimage.modules.permission.model.entity.UserColumnPermissionEntity ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method.
java-server | 2026-05-05 16:17:29.476 [main] INFO o.a.r.s.s.RocketMQMessageListenerContainerRegistrar - Register the listener to container, listenerBeanName:taskFileJobConsumer, containerBeanName:org.apache.rocketmq.spring.support.DefaultRocketMQListenerContainer_1
java-server | 2026-05-05 16:17:29.569 [main] WARN o.s.b.a.s.s.UserDetailsServiceAutoConfiguration -
java-server |
java-server | Using generated security password: b8933522-c036-4732-bc90-2809f85408b4
java-server |
java-server | This generated password is for development use only. Your security configuration must be updated before running your application in production.
java-server |
java-server | 2026-05-05 16:17:29.582 [main] INFO o.s.s.c.a.a.c.InitializeUserDetailsBeanManagerConfigurer$InitializeUserDetailsManagerConfigurer - Global AuthenticationManager configured with UserDetailsService bean with name inMemoryUserDetailsManager
java-server | 2026-05-05 16:17:29.849 [main] INFO o.a.r.s.a.RocketMQAutoConfiguration - a producer (aiimage-backend-producer) init on namesrv 121.196.149.225:9876
java-server | 2026-05-05 16:17:30.220 [main] INFO o.s.b.a.e.web.EndpointLinksResolver - Exposing 1 endpoint beneath base path '/actuator'
java-server | 2026-05-05 16:17:30.276 [main] INFO o.a.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-18080"]
java-server | 2026-05-05 16:17:30.285 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port 18080 (http) with context path '/'
java-server | 2026-05-05 16:17:30.393 [main] INFO o.a.r.s.s.DefaultRocketMQListenerContainer - running container: DefaultRocketMQListenerContainer{consumerGroup='aiimage-result-file-job-consumer', namespace='', namespaceV2='', nameServer='121.196.149.225:9876', topic='aiimage-result-file-job', consumeMode=CONCURRENTLY, selectorType=TAG, selectorExpression='*', messageModel=CLUSTERING', tlsEnable=false, instanceName=DEFAULT}
java-server | 2026-05-05 16:17:30.407 [main] INFO c.nanri.aiimage.AiImageApplication - Started AiImageApplication in 4.495 seconds (process running for 4.922)
java-server | 2026-05-05 16:17:30.419 [aiimage-scheduling-2] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
java-server | 2026-05-05 16:17:30.569 [aiimage-scheduling-2] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@31f426dd
java-server | 2026-05-05 16:17:30.572 [aiimage-scheduling-2] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.
java-server | 2026-05-05 16:17:30.608 [http-nio-18080-exec-1] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet'
java-server | 2026-05-05 16:17:30.608 [http-nio-18080-exec-1] INFO o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet'
java-server | 2026-05-05 16:17:30.610 [http-nio-18080-exec-1] INFO o.s.web.servlet.DispatcherServlet - Completed initialization in 2 ms
java-server | 2026-05-05 16:17:30.801 [http-nio-18080-exec-1] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6363 status=SUCCESS
java-server | 2026-05-05 16:17:30.831 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6363/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=191
java-server | 2026-05-05 16:17:31.055 [http-nio-18080-exec-3] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6348 status=SUCCESS
java-server | 2026-05-05 16:17:31.061 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6348/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=24
java-server | 2026-05-05 16:17:31.386 [http-nio-18080-exec-5] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6323 status=SUCCESS
java-server | 2026-05-05 16:17:31.391 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6323/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=22
java-server | 2026-05-05 16:17:44.290 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/brand/tasks status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=35
java-server | 2026-05-05 16:17:45.747 [http-nio-18080-exec-10] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=27
java-server | 2026-05-05 16:17:45.752 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/history status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=33
java-server | 2026-05-05 16:17:45.896 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=43
java-server | 2026-05-05 16:17:46.015 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=20
java-server | 2026-05-05 16:17:46.116 [http-nio-18080-exec-7] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6325 status=SUCCESS
java-server | 2026-05-05 16:17:46.122 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6325/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=29
java-server | 2026-05-05 16:17:48.143 [http-nio-18080-exec-10] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/files/upload status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=50
java-server | 2026-05-05 16:17:50.648 [http-nio-18080-exec-1] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] parse timing taskId=6594 files=1 rows=12 groups=8 totalMs=1030 parseMs=380 groupMs=0 taskInsertMs=31 payloadJsonMs=233 payloadStoreMs=335 persistMs=48 responseMs=0
java-server | 2026-05-05 16:17:50.651 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/parse status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=1041
java-server | 2026-05-05 16:17:51.477 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/6594/activate status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=54
java-server | 2026-05-05 16:17:51.592 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=18
java-server | 2026-05-05 16:17:51.712 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/history status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=26
java-server | 2026-05-05 16:17:56.017 [http-nio-18080-exec-10] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=24
java-server | 2026-05-05 16:17:56.134 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=17
java-server | 2026-05-05 16:17:57.289 [http-nio-18080-exec-3] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6329 status=SUCCESS
java-server | 2026-05-05 16:17:57.294 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6329/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=28
java-server | 2026-05-05 16:18:00.005 [aiimage-scheduling-1] INFO c.n.a.m.d.s.DeleteBrandStaleTaskService - [stale-check] skip because another instance holds the distributed lock
java-server | 2026-05-05 16:18:00.013 [aiimage-scheduling-3] INFO c.n.a.m.b.service.BrandTaskService - [brand-stale-check] skip because another instance holds the distributed lock
java-server | 2026-05-05 16:18:03.991 [http-nio-18080-exec-5] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6323 status=SUCCESS
java-server | 2026-05-05 16:18:03.996 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6323/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=29
java-server | 2026-05-05 16:18:06.142 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=24
java-server | 2026-05-05 16:18:06.245 [http-nio-18080-exec-10] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=16
java-server | 2026-05-05 16:18:16.284 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=32
java-server | 2026-05-05 16:18:16.398 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=18
java-server | 2026-05-05 16:18:19.848 [http-nio-18080-exec-5] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6325 status=SUCCESS
java-server | 2026-05-05 16:18:19.854 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6325/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=29
java-server | 2026-05-05 16:18:26.405 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=25
java-server | 2026-05-05 16:18:26.524 [http-nio-18080-exec-10] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=18
java-server | 2026-05-05 16:18:30.008 [aiimage-scheduling-1] INFO c.n.a.m.d.s.DeleteBrandStaleTaskService - [finalize-check] skip because another instance holds the distributed lock
java-server | 2026-05-05 16:18:30.009 [http-nio-18080-exec-1] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6329 status=SUCCESS
java-server | 2026-05-05 16:18:30.014 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6329/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=30
java-server | 2026-05-05 16:18:33.287 [http-nio-18080-exec-3] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6348 status=SUCCESS
java-server | 2026-05-05 16:18:33.293 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6348/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=29
java-server | 2026-05-05 16:18:36.542 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=28
java-server | 2026-05-05 16:18:36.651 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=18
java-server | 2026-05-05 16:18:40.422 [http-nio-18080-exec-10] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6323 status=SUCCESS
java-server | 2026-05-05 16:18:40.427 [http-nio-18080-exec-10] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6323/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=29
java-server | 2026-05-05 16:18:46.686 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=28
java-server | 2026-05-05 16:18:46.802 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=16
java-server | 2026-05-05 16:18:56.826 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=28
java-server | 2026-05-05 16:18:56.959 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=21
java-server | 2026-05-05 16:18:57.163 [http-nio-18080-exec-10] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6325 status=SUCCESS
java-server | 2026-05-05 16:18:57.169 [http-nio-18080-exec-10] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6325/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=29
java-server | 2026-05-05 16:19:06.967 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=33
java-server | 2026-05-05 16:19:07.077 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=18
java-server | 2026-05-05 16:19:07.374 [http-nio-18080-exec-5] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6329 status=SUCCESS
java-server | 2026-05-05 16:19:07.379 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6329/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=29
java-server | 2026-05-05 16:19:17.101 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=29
java-server | 2026-05-05 16:19:17.211 [http-nio-18080-exec-10] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=17
java-server | 2026-05-05 16:19:17.970 [http-nio-18080-exec-1] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6323 status=SUCCESS
java-server | 2026-05-05 16:19:17.976 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6323/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=28
java-server | 2026-05-05 16:19:23.559 [http-nio-18080-exec-3] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6348 status=SUCCESS
java-server | 2026-05-05 16:19:23.565 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6348/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=29
java-server | 2026-05-05 16:19:27.333 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=28
java-server | 2026-05-05 16:19:27.466 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=16
java-server | 2026-05-05 16:19:36.358 [http-nio-18080-exec-10] ERROR c.n.a.c.e.GlobalExceptionHandler - Unhandled exception
java-server | org.springframework.web.servlet.resource.NoResourceFoundException: No static resource .
java-server | at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:586)
java-server | at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)
java-server | at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)
java-server | at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)
java-server | at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
java-server | at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)
java-server | at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)
java-server | at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
java-server | at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
java-server | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)
java-server | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
java-server | at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
java-server | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
java-server | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
java-server | at com.nanri.aiimage.config.RequestTraceFilter.doFilterInternal(RequestTraceFilter.java:48)
java-server | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
java-server | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
java-server | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
java-server | at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
java-server | at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$FilterObservation$SimpleFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:479)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:340)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator.lambda$wrapSecured$0(ObservationFilterChainDecorator.java:82)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:128)
java-server | at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:100)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
java-server | at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:126)
java-server | at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:120)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
java-server | at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
java-server | at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
java-server | at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
java-server | at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilterInternal(BasicAuthenticationFilter.java:181)
java-server | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
java-server | at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107)
java-server | at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
java-server | at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)
java-server | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
java-server | at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)
java-server | at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)
java-server | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
java-server | at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82)
java-server | at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
java-server | at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62)
java-server | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
java-server | at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42)
java-server | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$0(ObservationFilterChainDecorator.java:323)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:224)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
java-server | at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233)
java-server | at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191)
java-server | at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
java-server | at org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$3(HandlerMappingIntrospector.java:195)
java-server | at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
java-server | at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
java-server | at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:230)
java-server | at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:362)
java-server | at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:278)
java-server | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
java-server | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
java-server | at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
java-server | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
java-server | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
java-server | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
java-server | at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
java-server | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
java-server | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
java-server | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
java-server | at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:113)
java-server | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
java-server | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
java-server | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
java-server | at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
java-server | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
java-server | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
java-server | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
java-server | at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)
java-server | at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
java-server | at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483)
java-server | at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)
java-server | at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
java-server | at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
java-server | at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)
java-server | at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397)
java-server | at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
java-server | at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:905)
java-server | at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743)
java-server | at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
java-server | at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)
java-server | at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
java-server | at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
java-server | at java.base/java.lang.Thread.run(Thread.java:1583)
java-server | 2026-05-05 16:19:36.360 [http-nio-18080-exec-10] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/ status=200 remote=59.82.83.216 forwardedHost=121.196.149.225 forwardedProto=http forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.2231.103 Safari/537.36 costMs=4
java-server | 2026-05-05 16:19:36.459 [http-nio-18080-exec-9] ERROR c.n.a.c.e.GlobalExceptionHandler - Unhandled exception
java-server | org.springframework.web.servlet.resource.NoResourceFoundException: No static resource favicon.ico.
java-server | at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:586)
java-server | at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)
java-server | at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)
java-server | at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)
java-server | at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
java-server | at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)
java-server | at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)
java-server | at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
java-server | at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
java-server | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)
java-server | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
java-server | at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
java-server | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
java-server | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
java-server | at com.nanri.aiimage.config.RequestTraceFilter.doFilterInternal(RequestTraceFilter.java:48)
java-server | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
java-server | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
java-server | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
java-server | at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
java-server | at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$FilterObservation$SimpleFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:479)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:340)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator.lambda$wrapSecured$0(ObservationFilterChainDecorator.java:82)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:128)
java-server | at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:100)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
java-server | at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:126)
java-server | at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:120)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
java-server | at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
java-server | at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
java-server | at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
java-server | at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilterInternal(BasicAuthenticationFilter.java:181)
java-server | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
java-server | at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107)
java-server | at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
java-server | at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)
java-server | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
java-server | at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)
java-server | at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)
java-server | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
java-server | at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82)
java-server | at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
java-server | at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62)
java-server | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
java-server | at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42)
java-server | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$0(ObservationFilterChainDecorator.java:323)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:224)
java-server | at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
java-server | at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233)
java-server | at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191)
java-server | at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
java-server | at org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$3(HandlerMappingIntrospector.java:195)
java-server | at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
java-server | at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
java-server | at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:230)
java-server | at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:362)
java-server | at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:278)
java-server | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
java-server | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
java-server | at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
java-server | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
java-server | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
java-server | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
java-server | at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
java-server | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
java-server | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
java-server | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
java-server | at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:113)
java-server | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
java-server | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
java-server | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
java-server | at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
java-server | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
java-server | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
java-server | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
java-server | at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)
java-server | at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
java-server | at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483)
java-server | at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)
java-server | at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
java-server | at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
java-server | at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)
java-server | at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397)
java-server | at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
java-server | at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:905)
java-server | at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743)
java-server | at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
java-server | at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)
java-server | at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
java-server | at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
java-server | at java.base/java.lang.Thread.run(Thread.java:1583)
java-server | 2026-05-05 16:19:36.463 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/favicon.ico status=200 remote=59.82.83.216 forwardedHost=121.196.149.225 forwardedProto=http forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.2231.103 Safari/537.36 costMs=5
java-server | 2026-05-05 16:19:37.465 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=29
java-server | 2026-05-05 16:19:37.606 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=17
java-server | 2026-05-05 16:19:37.877 [http-nio-18080-exec-5] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6384 status=SUCCESS
java-server | 2026-05-05 16:19:37.883 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6384/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=34
java-server | 2026-05-05 16:19:40.514 [http-nio-18080-exec-7] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6325 status=SUCCESS
java-server | 2026-05-05 16:19:40.519 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6325/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=28
java-server | 2026-05-05 16:19:42.757 [http-nio-18080-exec-9] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6329 status=SUCCESS
java-server | 2026-05-05 16:19:42.762 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6329/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=27
java-server | 2026-05-05 16:19:42.765 [http-nio-18080-exec-10] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/6586/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=211
java-server | 2026-05-05 16:19:47.603 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=27
java-server | 2026-05-05 16:19:47.719 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=16
java-server | 2026-05-05 16:19:47.736 [http-nio-18080-exec-6] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6323 status=SUCCESS
java-server | 2026-05-05 16:19:47.741 [http-nio-18080-exec-6] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6323/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=27
java-server | 2026-05-05 16:19:56.837 [http-nio-18080-exec-9] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6348 status=SUCCESS
java-server | 2026-05-05 16:19:56.842 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6348/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=28
java-server | 2026-05-05 16:19:57.745 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=28
java-server | 2026-05-05 16:19:57.860 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=16
java-server | 2026-05-05 16:20:00.005 [aiimage-scheduling-2] INFO c.n.a.m.d.s.DeleteBrandStaleTaskService - [stale-check] skip because another instance holds the distributed lock
java-server | 2026-05-05 16:20:00.005 [aiimage-scheduling-1] INFO c.n.a.m.z.s.ZiniaoShopIndexRefreshService - [ziniao-index] skip refresh because another instance holds the distributed lock
java-server | 2026-05-05 16:20:00.013 [aiimage-scheduling-3] INFO c.n.a.m.b.service.BrandTaskService - [brand-stale-check] skip because another instance holds the distributed lock
java-server | 2026-05-05 16:20:00.472 [http-nio-18080-exec-5] INFO c.n.a.m.t.s.TaskFileJobPublisher - [task-file-job] mq published jobId=1365 taskId=6594 moduleType=APPEARANCE_PATENT topic=aiimage-result-file-job
java-server | 2026-05-05 16:20:00.482 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/6594/result status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=221
java-server | 2026-05-05 16:20:00.585 [coze-task-0] INFO c.n.a.m.a.c.AppearancePatentCozeClient - [appearance-patent] coze request url=https://api.coze.cn/v1/workflow/run body={"workflow_id":"7632683471312355338","parameters":{"title_list":["KOPOX 170PCS Hook and Eye Sewing Kit with Garment Buttons, Hook and Eye Closures, Fabric Snap Buttons, Garment Snap Buttons for Skirts Pants Dresses, Clothing and DIY Crafts","WIRESTER Green Aluminum Round Bike Bell, Classic Ring Bicycle Bell, Bike Accessories Bell Ring for Adults Kids Girls Boys","Motorcycle for Bells - Bicycle Bells for Men, Stainless Steel can Bring Good Luck and Peace to Motorcycle Accessories","Motorcycle Bell - Bicycle Bells for Men, Stainless Steel Bring Good Luck and Peace","Motorcycle for Bells - Bicycle Bells for Men, Stainless Steel can bring good luck and peace to motorcycle accessories","Motorcycle for Bell, Bicycle Bells for Men, Stainless Steel Brings Good Luck and Peace for Motorcycle Accessories, One Size, Metal, Una talla, Metal","Motorcycle for Bells - Bicycle Bells for Men, Stainless Steel Provides Good Treats and Peace for Motorcycle Accessories, Metal, No Gemstone, Metal, No Gemstone","Motorcycle for Bells - Bicycle bells for men, stainless steel can bring good luck and peace to motorcycle accessories"],"url_list":["https://m.media-amazon.com/images/I/91KtKyLQstL._AC_SX425_.jpg","https://m.media-amazon.com/images/I/51dETWpSQXL._AC_SX466_.jpg","https://m.media-amazon.com/images/I/81vJjZcgf5L._AC_SX466_.jpg","https://m.media-amazon.com/images/I/71sGtlqHXzL._AC_SX466_.jpg","https://m.media-amazon.com/images/I/71IzidKhklL._AC_SX385_.jpg","https://m.media-amazon.com/images/I/71ASKPXDUHL._AC_SX385_.jpg","https://m.media-amazon.com/images/I/71jfXEIPGOL._AC_SX385_.jpg","https://m.media-amazon.com/images/I/71tYUk0XWvL._AC_SX466_.jpg"],"items":[{"group_key":"f037a1b87dbf486d940ea2e25f194027::1@2","row_id":"1","asin":"B0D792ND9V","country":"英国","title":"KOPOX 170PCS Hook and Eye Sewing Kit with Garment Buttons, Hook and Eye Closures, Fabric Snap Buttons, Garment Snap Buttons for Skirts Pants Dresses, Clothing and DIY Crafts","url":"https://m.media-amazon.com/images/I/91KtKyLQstL._AC_SX425_.jpg"},{"group_key":"f037a1b87dbf486d940ea2e25f194027::2@3","row_id":"2_1","asin":"B0D14L34S7","country":"英国","title":"WIRESTER Green Aluminum Round Bike Bell, Classic Ring Bicycle Bell, Bike Accessories Bell Ring for Adults Kids Girls Boys","url":"https://m.media-amazon.com/images/I/51dETWpSQXL._AC_SX466_.jpg"},{"group_key":"f037a1b87dbf486d940ea2e25f194027::3@7","row_id":"3_1","asin":"B0CWQFZMGY","country":"英国","title":"Motorcycle for Bells - Bicycle Bells for Men, Stainless Steel can Bring Good Luck and Peace to Motorcycle Accessories","url":"https://m.media-amazon.com/images/I/81vJjZcgf5L._AC_SX466_.jpg"},{"group_key":"f037a1b87dbf486d940ea2e25f194027::4@9","row_id":"4_1","asin":"B0CX87XXWJ","country":"英国","title":"Motorcycle Bell - Bicycle Bells for Men, Stainless Steel Bring Good Luck and Peace","url":"https://m.media-amazon.com/images/I/71sGtlqHXzL._AC_SX466_.jpg"},{"group_key":"f037a1b87dbf486d940ea2e25f194027::5@10","row_id":"5_1","asin":"B0CR3PMR8L","country":"英国","title":"Motorcycle for Bells - Bicycle Bells for Men, Stainless Steel can bring good luck and peace to motorcycle accessories","url":"https://m.media-amazon.com/images/I/71IzidKhklL._AC_SX385_.jpg"},{"group_key":"f037a1b87dbf486d940ea2e25f194027::6@11","row_id":"6","asin":"B0DK3L6FD4","country":"英国","title":"Motorcycle for Bell, Bicycle Bells for Men, Stainless Steel Brings Good Luck and Peace for Motorcycle Accessories, One Size, Metal, Una talla, Metal","url":"https://m.media-amazon.com/images/I/71ASKPXDUHL._AC_SX385_.jpg"},{"group_key":"f037a1b87dbf486d940ea2e25f194027::8@12","row_id":"8","asin":"B0D9QNV6FT","country":"英国","title":"Motorcycle for Bells - Bicycle Bells for Men, Stainless Steel Provides Good Treats and Peace for Motorcycle Accessories, Metal, No Gemstone, Metal, No Gemstone","url":"https://m.media-amazon.com/images/I/71jfXEIPGOL._AC_SX385_.jpg"},{"group_key":"f037a1b87dbf486d940ea2e25f194027::10@13","row_id":"10_1","asin":"B0DBZG716J","country":"英国","title":"Motorcycle for Bells - Bicycle bells for men, stainless steel can bring good luck and peace to motorcycle accessories","url":"https://m.media-amazon.com/images/I/71tYUk0XWvL._AC_SX466_.jpg"}],"prompt":"请帮我排查以下亚马逊商品在英国及欧洲地区是否存在知识产权侵权风险。 请直接给出明确结论(有侵权风险 或 未发现明显侵权风险),并严格按照以下三个维度提供精简的排查理由: 外观维度: 评估产品外形、图案设计是否与欧洲/英国常见外观专利雷同。 专利维度: 评估产品的核心技术或物理结构是否存在侵权可能。 标题维度: 排查标题中是否包含大牌商标、敏感词或版权保护词汇。 结论XX"},"is_async":true}
java-server | 2026-05-05 16:20:00.967 [coze-task-0] INFO c.n.a.m.a.c.AppearancePatentCozeClient - [appearance-patent] coze submit response status=200 OK body={"execute_id":"7636319564359794723","detail":{"logid":"202605051620001443DB557D71573D26D7"},"code":0,"msg":"","debug_url":"https://www.coze.cn/work_flow?execute_id=7636319564359794723&space_id=7519005192466022436&workflow_id=7632683471312355338&execute_mode=2"}
java-server | 2026-05-05 16:20:01.005 [coze-task-0] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze async submitted taskId=6594 jobId=1365 chunk=8 batch=1/1 executeId=7636319564359794723
java-server | 2026-05-05 16:20:01.081 [coze-task-0] INFO c.n.a.m.t.s.TaskResultFileJobWorker - [task-file-job] process deferred jobId=1365 taskId=6594 moduleType=APPEARANCE_PATENT resultId=8943 elapsedMs=580
java-server | 2026-05-05 16:20:01.237 [aiimage-scheduling-4] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:20:01.237 [coze-task-1] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4138 taskId=6594 executeId=7636319564359794723
java-server | 2026-05-05 16:20:01.284 [coze-task-1] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll start taskId=6594 stateId=4138 executeId=7636319564359794723 jobId=1365 chunk=8 batch=1/1
java-server | 2026-05-05 16:20:01.405 [coze-task-1] INFO c.n.a.m.a.c.AppearancePatentCozeClient - [appearance-patent] coze history response executeId=7636319564359794723 status=200 OK body={"code":0,"msg":"","data":[{"debug_url":"https://www.coze.cn/work_flow?execute_id=7636319564359794723&space_id=7519005192466022436&workflow_id=7632683471312355338&execute_mode=2","output":"{\"node_status\":\"{}\",\"Output\":\"\"}","error_code":"","update_time":1777969201,"token":"0","usage":{"token_count":0,"output_count":0,"input_count":0},"connector_id":"1024","create_time":1777969201,"is_output_trimmed":false,"connector_uid":"2939430754097600","run_mode":2,"node_execute_status":{},"execute_id":"7636319564359794723","bot_id":"0","execute_status":"Running","logid":"202605051620001443DB557D71573D26D7"}],"detail":{"logid":"20260505162001F6047AEE90C5EC5A6965"}}
java-server | 2026-05-05 16:20:01.406 [coze-task-1] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll pending taskId=6594 stateId=4138 executeId=7636319564359794723 status=RUNNING
java-server | 2026-05-05 16:20:06.256 [aiimage-scheduling-3] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:20:06.256 [coze-task-2] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4138 taskId=6594 executeId=7636319564359794723
java-server | 2026-05-05 16:20:06.270 [coze-task-2] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6594 stateId=4138 executeId=7636319564359794723 lastPolledAt=2026-05-05T16:20:06
java-server | 2026-05-05 16:20:07.863 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=28
java-server | 2026-05-05 16:20:07.975 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=20
java-server | 2026-05-05 16:20:10.506 [http-nio-18080-exec-1] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6325 status=SUCCESS
java-server | 2026-05-05 16:20:10.512 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6325/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=29
java-server | 2026-05-05 16:20:11.274 [aiimage-scheduling-2] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:20:11.274 [coze-task-3] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4138 taskId=6594 executeId=7636319564359794723
java-server | 2026-05-05 16:20:11.293 [coze-task-3] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6594 stateId=4138 executeId=7636319564359794723 lastPolledAt=2026-05-05T16:20:11
java-server | 2026-05-05 16:20:16.292 [aiimage-scheduling-3] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:20:16.292 [coze-task-4] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4138 taskId=6594 executeId=7636319564359794723
java-server | 2026-05-05 16:20:16.306 [coze-task-4] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6594 stateId=4138 executeId=7636319564359794723 lastPolledAt=2026-05-05T16:20:16
java-server | 2026-05-05 16:20:18.009 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=31
java-server | 2026-05-05 16:20:18.133 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=18
java-server | 2026-05-05 16:20:19.379 [http-nio-18080-exec-7] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6323 status=SUCCESS
java-server | 2026-05-05 16:20:19.385 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6323/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=28
java-server | 2026-05-05 16:20:21.309 [aiimage-scheduling-4] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:20:21.309 [coze-task-5] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4138 taskId=6594 executeId=7636319564359794723
java-server | 2026-05-05 16:20:21.328 [coze-task-5] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6594 stateId=4138 executeId=7636319564359794723 lastPolledAt=2026-05-05T16:20:21
java-server | 2026-05-05 16:20:22.521 [http-nio-18080-exec-9] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6329 status=SUCCESS
java-server | 2026-05-05 16:20:22.527 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6329/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=29
java-server | 2026-05-05 16:20:26.328 [aiimage-scheduling-3] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:20:26.328 [coze-task-6] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4138 taskId=6594 executeId=7636319564359794723
java-server | 2026-05-05 16:20:26.343 [coze-task-6] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6594 stateId=4138 executeId=7636319564359794723 lastPolledAt=2026-05-05T16:20:26
java-server | 2026-05-05 16:20:28.139 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=27
java-server | 2026-05-05 16:20:28.264 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=16
java-server | 2026-05-05 16:20:30.005 [aiimage-scheduling-1] INFO c.n.a.m.d.s.DeleteBrandStaleTaskService - [finalize-check] skip because another instance holds the distributed lock
java-server | 2026-05-05 16:20:31.346 [aiimage-scheduling-1] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:20:31.346 [coze-task-7] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4138 taskId=6594 executeId=7636319564359794723
java-server | 2026-05-05 16:20:31.360 [coze-task-7] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6594 stateId=4138 executeId=7636319564359794723 lastPolledAt=2026-05-05T16:20:31
java-server | 2026-05-05 16:20:35.362 [http-nio-18080-exec-5] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6348 status=SUCCESS
java-server | 2026-05-05 16:20:35.368 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6348/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=29
java-server | 2026-05-05 16:20:36.364 [aiimage-scheduling-4] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:20:36.364 [coze-task-8] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4138 taskId=6594 executeId=7636319564359794723
java-server | 2026-05-05 16:20:36.378 [coze-task-8] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6594 stateId=4138 executeId=7636319564359794723 lastPolledAt=2026-05-05T16:20:36
java-server | 2026-05-05 16:20:38.275 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=28
java-server | 2026-05-05 16:20:38.386 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=20
java-server | 2026-05-05 16:20:41.383 [aiimage-scheduling-2] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:20:41.383 [coze-task-9] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4138 taskId=6594 executeId=7636319564359794723
java-server | 2026-05-05 16:20:41.402 [coze-task-9] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6594 stateId=4138 executeId=7636319564359794723 lastPolledAt=2026-05-05T16:20:41
java-server | 2026-05-05 16:20:44.456 [http-nio-18080-exec-1] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6325 status=SUCCESS
java-server | 2026-05-05 16:20:44.461 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6325/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=28
java-server | 2026-05-05 16:20:46.402 [aiimage-scheduling-3] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:20:46.402 [coze-task-10] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4138 taskId=6594 executeId=7636319564359794723
java-server | 2026-05-05 16:20:46.416 [coze-task-10] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6594 stateId=4138 executeId=7636319564359794723 lastPolledAt=2026-05-05T16:20:46
java-server | 2026-05-05 16:20:48.410 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=30
java-server | 2026-05-05 16:20:48.525 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=21
java-server | 2026-05-05 16:20:51.081 [http-nio-18080-exec-7] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6323 status=SUCCESS
java-server | 2026-05-05 16:20:51.087 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6323/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=29
java-server | 2026-05-05 16:20:51.419 [aiimage-scheduling-4] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:20:51.419 [coze-task-11] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4138 taskId=6594 executeId=7636319564359794723
java-server | 2026-05-05 16:20:51.438 [coze-task-11] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6594 stateId=4138 executeId=7636319564359794723 lastPolledAt=2026-05-05T16:20:51
java-server | 2026-05-05 16:20:56.438 [aiimage-scheduling-3] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:20:56.438 [coze-task-12] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4138 taskId=6594 executeId=7636319564359794723
java-server | 2026-05-05 16:20:56.454 [coze-task-12] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6594 stateId=4138 executeId=7636319564359794723 lastPolledAt=2026-05-05T16:20:56
java-server | 2026-05-05 16:20:58.564 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=34
java-server | 2026-05-05 16:20:58.691 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=22
java-server | 2026-05-05 16:20:59.581 [http-nio-18080-exec-3] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6329 status=SUCCESS
java-server | 2026-05-05 16:20:59.587 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6329/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=29
java-server | 2026-05-05 16:21:01.456 [aiimage-scheduling-4] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:21:01.456 [coze-task-13] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4138 taskId=6594 executeId=7636319564359794723
java-server | 2026-05-05 16:21:01.469 [coze-task-13] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6594 stateId=4138 executeId=7636319564359794723 lastPolledAt=2026-05-05T16:21:01
java-server | 2026-05-05 16:21:03.723 [http-nio-18080-exec-5] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6449 status=FAILED
java-server | 2026-05-05 16:21:03.728 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6449/result status=200 remote=8.139.195.39 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=33
java-server | 2026-05-05 16:21:08.709 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=27
java-server | 2026-05-05 16:21:08.822 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=20
java-server | 2026-05-05 16:21:13.311 [http-nio-18080-exec-1] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6348 status=SUCCESS
java-server | 2026-05-05 16:21:13.316 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6348/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=28
java-server | 2026-05-05 16:21:18.832 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=22
java-server | 2026-05-05 16:21:18.950 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=15
java-server | 2026-05-05 16:21:19.067 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/history status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=17
java-server | 2026-05-05 16:21:22.898 [http-nio-18080-exec-9] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6323 status=SUCCESS
java-server | 2026-05-05 16:21:22.904 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6323/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=28
java-server | 2026-05-05 16:21:24.906 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/results/8943/download status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=142
java-server | 2026-05-05 16:21:26.669 [http-nio-18080-exec-3] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6325 status=SUCCESS
java-server | 2026-05-05 16:21:26.675 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6325/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=28
java-server | 2026-05-05 16:21:28.958 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=18
java-server | 2026-05-05 16:21:29.068 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=17
java-server | 2026-05-05 16:21:31.247 [http-nio-18080-exec-9] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6329 status=SUCCESS
java-server | 2026-05-05 16:21:31.252 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6329/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=28
java-server | 2026-05-05 16:21:35.479 [http-nio-18080-exec-1] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6378 status=SUCCESS
java-server | 2026-05-05 16:21:35.484 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6378/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=28
java-server | 2026-05-05 16:21:39.074 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=19
java-server | 2026-05-05 16:21:39.180 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=17
java-server | 2026-05-05 16:21:43.039 [http-nio-18080-exec-7] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6331 status=SUCCESS
java-server | 2026-05-05 16:21:43.044 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6331/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=28
java-server | 2026-05-05 16:21:45.526 [http-nio-18080-exec-9] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] parse timing taskId=6595 files=1 rows=12 groups=8 totalMs=98 parseMs=20 groupMs=0 taskInsertMs=17 payloadJsonMs=0 payloadStoreMs=4 persistMs=54 responseMs=0
java-server | 2026-05-05 16:21:45.527 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/parse status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=100
java-server | 2026-05-05 16:21:45.768 [http-nio-18080-exec-1] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6403 status=SUCCESS
java-server | 2026-05-05 16:21:45.773 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6403/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=34
java-server | 2026-05-05 16:21:46.730 [http-nio-18080-exec-3] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6348 status=SUCCESS
java-server | 2026-05-05 16:21:46.736 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6348/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=24
java-server | 2026-05-05 16:21:46.811 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/6595/activate status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=47
java-server | 2026-05-05 16:21:46.934 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=18
java-server | 2026-05-05 16:21:47.075 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/history status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=40
java-server | 2026-05-05 16:21:49.205 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=26
java-server | 2026-05-05 16:21:49.313 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=16
java-server | 2026-05-05 16:21:55.237 [http-nio-18080-exec-5] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6323 status=SUCCESS
java-server | 2026-05-05 16:21:55.243 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6323/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=28
java-server | 2026-05-05 16:21:59.346 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=26
java-server | 2026-05-05 16:21:59.460 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=20
java-server | 2026-05-05 16:22:00.004 [aiimage-scheduling-4] INFO c.n.a.m.d.s.DeleteBrandStaleTaskService - [stale-check] skip because another instance holds the distributed lock
java-server | 2026-05-05 16:22:00.013 [aiimage-scheduling-3] INFO c.n.a.m.b.service.BrandTaskService - [brand-stale-check] skip because another instance holds the distributed lock
java-server | 2026-05-05 16:22:01.969 [http-nio-18080-exec-1] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6329 status=SUCCESS
java-server | 2026-05-05 16:22:01.975 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6329/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=29
java-server | 2026-05-05 16:22:05.389 [http-nio-18080-exec-3] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6325 status=SUCCESS
java-server | 2026-05-05 16:22:05.394 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6325/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=27
java-server | 2026-05-05 16:22:09.473 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=26
java-server | 2026-05-05 16:22:09.602 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=17
java-server | 2026-05-05 16:22:19.607 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=27
java-server | 2026-05-05 16:22:19.742 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=20
java-server | 2026-05-05 16:22:20.372 [http-nio-18080-exec-3] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6348 status=SUCCESS
java-server | 2026-05-05 16:22:20.377 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6348/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=28
java-server | 2026-05-05 16:22:20.942 [http-nio-18080-exec-5] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6280 status=SUCCESS
java-server | 2026-05-05 16:22:20.947 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6280/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=25
java-server | 2026-05-05 16:22:25.123 [http-nio-18080-exec-7] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6323 status=SUCCESS
java-server | 2026-05-05 16:22:25.128 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6323/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=27
java-server | 2026-05-05 16:22:29.758 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=26
java-server | 2026-05-05 16:22:29.890 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=20
java-server | 2026-05-05 16:22:30.004 [aiimage-scheduling-2] INFO c.n.a.m.d.s.DeleteBrandStaleTaskService - [finalize-check] skip because another instance holds the distributed lock
java-server | 2026-05-05 16:22:36.061 [http-nio-18080-exec-3] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6329 status=SUCCESS
java-server | 2026-05-05 16:22:36.067 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6329/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=29
java-server | 2026-05-05 16:22:38.294 [http-nio-18080-exec-5] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6325 status=SUCCESS
java-server | 2026-05-05 16:22:38.299 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6325/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=28
java-server | 2026-05-05 16:22:39.882 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=27
java-server | 2026-05-05 16:22:40.013 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=19
java-server | 2026-05-05 16:22:50.019 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=27
java-server | 2026-05-05 16:22:50.132 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=16
java-server | 2026-05-05 16:22:52.102 [http-nio-18080-exec-5] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6348 status=SUCCESS
java-server | 2026-05-05 16:22:52.107 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6348/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=29
java-server | 2026-05-05 16:22:53.681 [http-nio-18080-exec-7] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6323 status=SUCCESS
java-server | 2026-05-05 16:22:53.686 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6323/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=28
java-server | 2026-05-05 16:23:00.157 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=27
java-server | 2026-05-05 16:23:00.271 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=21
java-server | 2026-05-05 16:23:03.853 [http-nio-18080-exec-3] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6356 status=SUCCESS
java-server | 2026-05-05 16:23:03.858 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6356/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=28
java-server | 2026-05-05 16:23:09.399 [http-nio-18080-exec-5] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6325 status=SUCCESS
java-server | 2026-05-05 16:23:09.405 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6325/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=28
java-server | 2026-05-05 16:23:10.306 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=27
java-server | 2026-05-05 16:23:10.427 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=20
java-server | 2026-05-05 16:23:11.669 [http-nio-18080-exec-1] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6329 status=SUCCESS
java-server | 2026-05-05 16:23:11.675 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6329/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=28
java-server | 2026-05-05 16:23:20.447 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=26
java-server | 2026-05-05 16:23:20.568 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=16
java-server | 2026-05-05 16:23:27.437 [http-nio-18080-exec-7] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6323 status=SUCCESS
java-server | 2026-05-05 16:23:27.442 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6323/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=27
java-server | 2026-05-05 16:23:30.501 [http-nio-18080-exec-9] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6348 status=SUCCESS
java-server | 2026-05-05 16:23:30.507 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6348/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=30
java-server | 2026-05-05 16:23:30.580 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=27
java-server | 2026-05-05 16:23:30.706 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=16
java-server | 2026-05-05 16:23:40.719 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=28
java-server | 2026-05-05 16:23:40.897 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=17
java-server | 2026-05-05 16:23:43.488 [http-nio-18080-exec-9] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6325 status=SUCCESS
java-server | 2026-05-05 16:23:43.494 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6325/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=28
java-server | 2026-05-05 16:23:50.892 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=27
java-server | 2026-05-05 16:23:51.027 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=15
java-server | 2026-05-05 16:23:51.651 [http-nio-18080-exec-5] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6329 status=SUCCESS
java-server | 2026-05-05 16:23:51.656 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6329/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=28
java-server | 2026-05-05 16:23:58.091 [http-nio-18080-exec-7] INFO c.n.a.m.t.s.TaskFileJobPublisher - [task-file-job] mq published jobId=1366 taskId=6595 moduleType=APPEARANCE_PATENT topic=aiimage-result-file-job
java-server | 2026-05-05 16:23:58.100 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/6595/result status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=174
java-server | 2026-05-05 16:23:58.178 [coze-task-14] INFO c.n.a.m.a.c.AppearancePatentCozeClient - [appearance-patent] coze request url=https://api.coze.cn/v1/workflow/run body={"workflow_id":"7632683471312355338","parameters":{"title_list":["KOPOX 170PCS Hook and Eye Sewing Kit with Garment Buttons, Hook and Eye Closures, Fabric Snap Buttons, Garment Snap Buttons for Skirts Pants Dresses, Clothing and DIY Crafts","WIRESTER Green Aluminum Round Bike Bell, Classic Ring Bicycle Bell, Bike Accessories Bell Ring for Adults Kids Girls Boys","Motorcycle for Bells - Bicycle Bells for Men, Stainless Steel can Bring Good Luck and Peace to Motorcycle Accessories","Motorcycle Bell - Bicycle Bells for Men, Stainless Steel Bring Good Luck and Peace","Motorcycle for Bells - Bicycle Bells for Men, Stainless Steel can bring good luck and peace to motorcycle accessories","Motorcycle for Bell, Bicycle Bells for Men, Stainless Steel Brings Good Luck and Peace for Motorcycle Accessories, One Size, Metal, Una talla, Metal","Motorcycle for Bells - Bicycle Bells for Men, Stainless Steel Provides Good Treats and Peace for Motorcycle Accessories, Metal, No Gemstone, Metal, No Gemstone","Motorcycle for Bells - Bicycle bells for men, stainless steel can bring good luck and peace to motorcycle accessories"],"url_list":["https://m.media-amazon.com/images/I/91KtKyLQstL._AC_SX425_.jpg","https://m.media-amazon.com/images/I/51dETWpSQXL._AC_SX466_.jpg","https://m.media-amazon.com/images/I/81vJjZcgf5L._AC_SX466_.jpg","https://m.media-amazon.com/images/I/71sGtlqHXzL._AC_SX466_.jpg","https://m.media-amazon.com/images/I/71IzidKhklL._AC_SX385_.jpg","https://m.media-amazon.com/images/I/71ASKPXDUHL._AC_SX385_.jpg","https://m.media-amazon.com/images/I/71jfXEIPGOL._AC_SX385_.jpg","https://m.media-amazon.com/images/I/71tYUk0XWvL._AC_SX466_.jpg"],"items":[{"group_key":"f037a1b87dbf486d940ea2e25f194027::1@2","row_id":"1","asin":"B0D792ND9V","country":"英国","title":"KOPOX 170PCS Hook and Eye Sewing Kit with Garment Buttons, Hook and Eye Closures, Fabric Snap Buttons, Garment Snap Buttons for Skirts Pants Dresses, Clothing and DIY Crafts","url":"https://m.media-amazon.com/images/I/91KtKyLQstL._AC_SX425_.jpg"},{"group_key":"f037a1b87dbf486d940ea2e25f194027::2@3","row_id":"2_1","asin":"B0D14L34S7","country":"英国","title":"WIRESTER Green Aluminum Round Bike Bell, Classic Ring Bicycle Bell, Bike Accessories Bell Ring for Adults Kids Girls Boys","url":"https://m.media-amazon.com/images/I/51dETWpSQXL._AC_SX466_.jpg"},{"group_key":"f037a1b87dbf486d940ea2e25f194027::3@7","row_id":"3_1","asin":"B0CWQFZMGY","country":"英国","title":"Motorcycle for Bells - Bicycle Bells for Men, Stainless Steel can Bring Good Luck and Peace to Motorcycle Accessories","url":"https://m.media-amazon.com/images/I/81vJjZcgf5L._AC_SX466_.jpg"},{"group_key":"f037a1b87dbf486d940ea2e25f194027::4@9","row_id":"4_1","asin":"B0CX87XXWJ","country":"英国","title":"Motorcycle Bell - Bicycle Bells for Men, Stainless Steel Bring Good Luck and Peace","url":"https://m.media-amazon.com/images/I/71sGtlqHXzL._AC_SX466_.jpg"},{"group_key":"f037a1b87dbf486d940ea2e25f194027::5@10","row_id":"5_1","asin":"B0CR3PMR8L","country":"英国","title":"Motorcycle for Bells - Bicycle Bells for Men, Stainless Steel can bring good luck and peace to motorcycle accessories","url":"https://m.media-amazon.com/images/I/71IzidKhklL._AC_SX385_.jpg"},{"group_key":"f037a1b87dbf486d940ea2e25f194027::6@11","row_id":"6","asin":"B0DK3L6FD4","country":"英国","title":"Motorcycle for Bell, Bicycle Bells for Men, Stainless Steel Brings Good Luck and Peace for Motorcycle Accessories, One Size, Metal, Una talla, Metal","url":"https://m.media-amazon.com/images/I/71ASKPXDUHL._AC_SX385_.jpg"},{"group_key":"f037a1b87dbf486d940ea2e25f194027::8@12","row_id":"8","asin":"B0D9QNV6FT","country":"英国","title":"Motorcycle for Bells - Bicycle Bells for Men, Stainless Steel Provides Good Treats and Peace for Motorcycle Accessories, Metal, No Gemstone, Metal, No Gemstone","url":"https://m.media-amazon.com/images/I/71jfXEIPGOL._AC_SX385_.jpg"},{"group_key":"f037a1b87dbf486d940ea2e25f194027::10@13","row_id":"10_1","asin":"B0DBZG716J","country":"英国","title":"Motorcycle for Bells - Bicycle bells for men, stainless steel can bring good luck and peace to motorcycle accessories","url":"https://m.media-amazon.com/images/I/71tYUk0XWvL._AC_SX466_.jpg"}],"prompt":"请帮我排查以下亚马逊商品在英国及欧洲地区是否存在知识产权侵权风险。 请直接给出明确结论(有侵权风险 或 未发现明显侵权风险),并严格按照以下三个维度提供精简的排查理由: 外观维度: 评估产品外形、图案设计是否与欧洲/英国常见外观专利雷同。 专利维度: 评估产品的核心技术或物理结构是否存在侵权可能。 标题维度: 排查标题中是否包含大牌商标、敏感词或版权保护词汇。 结论XX"},"is_async":true}
java-server | 2026-05-05 16:23:58.351 [coze-task-14] INFO c.n.a.m.a.c.AppearancePatentCozeClient - [appearance-patent] coze submit response status=200 OK body={"execute_id":"7636320588616892443","detail":{"logid":"20260505162358630B5DA5EDD272894E15"},"code":0,"msg":"","debug_url":"https://www.coze.cn/work_flow?execute_id=7636320588616892443&space_id=7519005192466022436&workflow_id=7632683471312355338&execute_mode=2"}
java-server | 2026-05-05 16:23:58.377 [coze-task-14] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze async submitted taskId=6595 jobId=1366 chunk=8 batch=1/1 executeId=7636320588616892443
java-server | 2026-05-05 16:23:58.433 [coze-task-14] INFO c.n.a.m.t.s.TaskResultFileJobWorker - [task-file-job] process deferred jobId=1366 taskId=6595 moduleType=APPEARANCE_PATENT resultId=8944 elapsedMs=322
java-server | 2026-05-05 16:23:58.489 [http-nio-18080-exec-9] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6323 status=SUCCESS
java-server | 2026-05-05 16:23:58.494 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6323/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=27
java-server | 2026-05-05 16:24:00.004 [aiimage-scheduling-3] INFO c.n.a.m.d.s.DeleteBrandStaleTaskService - [stale-check] scan started thread=aiimage-scheduling-3
java-server | 2026-05-05 16:24:00.037 [aiimage-scheduling-3] INFO c.n.a.m.d.s.DeleteBrandStaleTaskService - [stale-check] product-risk summary scanned=0 finalized=0 failed=0 skipped=0 elapsedMs=33 thread=aiimage-scheduling-3
java-server | 2026-05-05 16:24:00.037 [aiimage-scheduling-3] INFO c.n.a.m.d.s.DeleteBrandStaleTaskService - [stale-check] price-track summary scanned=0 finalized=0 failed=0 skipped=0 elapsedMs=33 thread=aiimage-scheduling-3
java-server | 2026-05-05 16:24:00.037 [aiimage-scheduling-3] INFO c.n.a.m.d.s.DeleteBrandStaleTaskService - [stale-check] shop-match summary scanned=0 finalized=0 failed=0 skipped=0 elapsedMs=33 thread=aiimage-scheduling-3
java-server | 2026-05-05 16:24:00.037 [aiimage-scheduling-3] INFO c.n.a.m.d.s.DeleteBrandStaleTaskService - [stale-check] patrol-delete summary scanned=0 finalized=0 failed=0 skipped=0 elapsedMs=33 thread=aiimage-scheduling-3
java-server | 2026-05-05 16:24:01.024 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=26
java-server | 2026-05-05 16:24:01.159 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=17
java-server | 2026-05-05 16:24:02.099 [aiimage-scheduling-4] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:24:02.100 [coze-task-15] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4141 taskId=6595 executeId=7636320588616892443
java-server | 2026-05-05 16:24:02.113 [coze-task-15] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6595 stateId=4141 executeId=7636320588616892443 lastPolledAt=2026-05-05T16:24:02
java-server | 2026-05-05 16:24:07.117 [aiimage-scheduling-3] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:24:07.118 [coze-task-16] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4141 taskId=6595 executeId=7636320588616892443
java-server | 2026-05-05 16:24:07.135 [coze-task-16] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6595 stateId=4141 executeId=7636320588616892443 lastPolledAt=2026-05-05T16:24:07
java-server | 2026-05-05 16:24:08.518 [http-nio-18080-exec-5] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6348 status=SUCCESS
java-server | 2026-05-05 16:24:08.523 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6348/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=27
java-server | 2026-05-05 16:24:11.173 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=26
java-server | 2026-05-05 16:24:11.283 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=20
java-server | 2026-05-05 16:24:12.135 [aiimage-scheduling-2] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:24:12.135 [coze-task-17] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4141 taskId=6595 executeId=7636320588616892443
java-server | 2026-05-05 16:24:12.151 [coze-task-17] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6595 stateId=4141 executeId=7636320588616892443 lastPolledAt=2026-05-05T16:24:12
java-server | 2026-05-05 16:24:16.059 [http-nio-18080-exec-1] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6325 status=SUCCESS
java-server | 2026-05-05 16:24:16.064 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6325/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=28
java-server | 2026-05-05 16:24:17.152 [aiimage-scheduling-2] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:24:17.153 [coze-task-18] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4141 taskId=6595 executeId=7636320588616892443
java-server | 2026-05-05 16:24:17.170 [coze-task-18] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6595 stateId=4141 executeId=7636320588616892443 lastPolledAt=2026-05-05T16:24:17
java-server | 2026-05-05 16:24:21.306 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=26
java-server | 2026-05-05 16:24:21.417 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=15
java-server | 2026-05-05 16:24:22.171 [aiimage-scheduling-4] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:24:22.171 [coze-task-19] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4141 taskId=6595 executeId=7636320588616892443
java-server | 2026-05-05 16:24:22.185 [coze-task-19] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6595 stateId=4141 executeId=7636320588616892443 lastPolledAt=2026-05-05T16:24:22
java-server | 2026-05-05 16:24:27.189 [aiimage-scheduling-3] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:24:27.189 [coze-task-20] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4141 taskId=6595 executeId=7636320588616892443
java-server | 2026-05-05 16:24:27.208 [coze-task-20] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6595 stateId=4141 executeId=7636320588616892443 lastPolledAt=2026-05-05T16:24:27
java-server | 2026-05-05 16:24:30.301 [http-nio-18080-exec-7] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6323 status=SUCCESS
java-server | 2026-05-05 16:24:30.306 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6323/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=27
java-server | 2026-05-05 16:24:30.950 [http-nio-18080-exec-9] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6329 status=SUCCESS
java-server | 2026-05-05 16:24:30.955 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6329/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=24
java-server | 2026-05-05 16:24:31.446 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=26
java-server | 2026-05-05 16:24:31.559 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=15
java-server | 2026-05-05 16:24:32.206 [aiimage-scheduling-1] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:24:32.206 [coze-task-21] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4141 taskId=6595 executeId=7636320588616892443
java-server | 2026-05-05 16:24:32.224 [coze-task-21] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6595 stateId=4141 executeId=7636320588616892443 lastPolledAt=2026-05-05T16:24:32
java-server | 2026-05-05 16:24:37.224 [aiimage-scheduling-1] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:24:37.224 [coze-task-22] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4141 taskId=6595 executeId=7636320588616892443
java-server | 2026-05-05 16:24:37.237 [coze-task-22] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6595 stateId=4141 executeId=7636320588616892443 lastPolledAt=2026-05-05T16:24:37
java-server | 2026-05-05 16:24:41.586 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=26
java-server | 2026-05-05 16:24:41.701 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=16
java-server | 2026-05-05 16:24:42.242 [aiimage-scheduling-3] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:24:42.242 [coze-task-23] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4141 taskId=6595 executeId=7636320588616892443
java-server | 2026-05-05 16:24:42.260 [coze-task-23] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6595 stateId=4141 executeId=7636320588616892443 lastPolledAt=2026-05-05T16:24:42
java-server | 2026-05-05 16:24:44.457 [http-nio-18080-exec-9] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6348 status=SUCCESS
java-server | 2026-05-05 16:24:44.462 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6348/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=28
java-server | 2026-05-05 16:24:47.260 [aiimage-scheduling-4] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:24:47.260 [coze-task-24] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4141 taskId=6595 executeId=7636320588616892443
java-server | 2026-05-05 16:24:47.273 [coze-task-24] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6595 stateId=4141 executeId=7636320588616892443 lastPolledAt=2026-05-05T16:24:47
java-server | 2026-05-05 16:24:51.723 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=27
java-server | 2026-05-05 16:24:51.838 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=17
java-server | 2026-05-05 16:24:52.276 [aiimage-scheduling-1] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:24:52.276 [coze-task-25] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4141 taskId=6595 executeId=7636320588616892443
java-server | 2026-05-05 16:24:52.290 [coze-task-25] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6595 stateId=4141 executeId=7636320588616892443 lastPolledAt=2026-05-05T16:24:52
java-server | 2026-05-05 16:24:54.602 [http-nio-18080-exec-5] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6383 status=SUCCESS
java-server | 2026-05-05 16:24:54.607 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6383/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=32
java-server | 2026-05-05 16:24:57.294 [aiimage-scheduling-2] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:24:57.294 [coze-task-26] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4141 taskId=6595 executeId=7636320588616892443
java-server | 2026-05-05 16:24:57.312 [coze-task-26] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6595 stateId=4141 executeId=7636320588616892443 lastPolledAt=2026-05-05T16:24:57
java-server | 2026-05-05 16:24:57.425 [http-nio-18080-exec-7] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6325 status=SUCCESS
java-server | 2026-05-05 16:24:57.430 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6325/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=27
java-server | 2026-05-05 16:25:01.851 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=26
java-server | 2026-05-05 16:25:01.996 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=19
java-server | 2026-05-05 16:25:02.311 [aiimage-scheduling-1] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:25:02.311 [coze-task-27] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4141 taskId=6595 executeId=7636320588616892443
java-server | 2026-05-05 16:25:02.324 [coze-task-27] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6595 stateId=4141 executeId=7636320588616892443 lastPolledAt=2026-05-05T16:25:02
java-server | 2026-05-05 16:25:02.957 [http-nio-18080-exec-3] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6323 status=SUCCESS
java-server | 2026-05-05 16:25:02.963 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6323/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=28
java-server | 2026-05-05 16:25:06.882 [http-nio-18080-exec-5] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6329 status=SUCCESS
java-server | 2026-05-05 16:25:06.887 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6329/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=28
java-server | 2026-05-05 16:25:07.327 [aiimage-scheduling-2] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:25:07.328 [coze-task-28] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4141 taskId=6595 executeId=7636320588616892443
java-server | 2026-05-05 16:25:07.345 [coze-task-28] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6595 stateId=4141 executeId=7636320588616892443 lastPolledAt=2026-05-05T16:25:07
java-server | 2026-05-05 16:25:11.977 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=26
java-server | 2026-05-05 16:25:12.086 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=19
java-server | 2026-05-05 16:25:12.341 [aiimage-scheduling-3] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:25:12.341 [coze-task-29] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4141 taskId=6595 executeId=7636320588616892443
java-server | 2026-05-05 16:25:12.355 [coze-task-29] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6595 stateId=4141 executeId=7636320588616892443 lastPolledAt=2026-05-05T16:25:12
java-server | 2026-05-05 16:25:14.298 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/6586/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=156
java-server | 2026-05-05 16:25:17.359 [aiimage-scheduling-3] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:25:17.360 [coze-task-30] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4141 taskId=6595 executeId=7636320588616892443
java-server | 2026-05-05 16:25:17.377 [coze-task-30] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6595 stateId=4141 executeId=7636320588616892443 lastPolledAt=2026-05-05T16:25:17
java-server | 2026-05-05 16:25:17.937 [http-nio-18080-exec-3] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6348 status=SUCCESS
java-server | 2026-05-05 16:25:17.942 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6348/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=27
java-server | 2026-05-05 16:25:22.123 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=26
java-server | 2026-05-05 16:25:22.227 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=16
java-server | 2026-05-05 16:25:22.376 [aiimage-scheduling-2] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:25:22.376 [coze-task-31] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4141 taskId=6595 executeId=7636320588616892443
java-server | 2026-05-05 16:25:22.390 [coze-task-31] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6595 stateId=4141 executeId=7636320588616892443 lastPolledAt=2026-05-05T16:25:22
java-server | 2026-05-05 16:25:27.394 [aiimage-scheduling-3] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:25:27.394 [coze-task-32] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4141 taskId=6595 executeId=7636320588616892443
java-server | 2026-05-05 16:25:27.411 [coze-task-32] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6595 stateId=4141 executeId=7636320588616892443 lastPolledAt=2026-05-05T16:25:27
java-server | 2026-05-05 16:25:31.413 [http-nio-18080-exec-9] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6325 status=SUCCESS
java-server | 2026-05-05 16:25:31.418 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6325/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=27
java-server | 2026-05-05 16:25:32.266 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=27
java-server | 2026-05-05 16:25:32.396 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=16
java-server | 2026-05-05 16:25:32.411 [aiimage-scheduling-3] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:25:32.411 [coze-task-33] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4141 taskId=6595 executeId=7636320588616892443
java-server | 2026-05-05 16:25:32.425 [coze-task-33] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6595 stateId=4141 executeId=7636320588616892443 lastPolledAt=2026-05-05T16:25:32
java-server | 2026-05-05 16:25:35.252 [http-nio-18080-exec-5] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6323 status=SUCCESS
java-server | 2026-05-05 16:25:35.257 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6323/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=27
java-server | 2026-05-05 16:25:37.429 [aiimage-scheduling-4] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:25:37.429 [coze-task-34] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4141 taskId=6595 executeId=7636320588616892443
java-server | 2026-05-05 16:25:37.442 [coze-task-34] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6595 stateId=4141 executeId=7636320588616892443 lastPolledAt=2026-05-05T16:25:37
java-server | 2026-05-05 16:25:39.554 [http-nio-18080-exec-7] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6435 status=SUCCESS
java-server | 2026-05-05 16:25:39.560 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6435/result status=200 remote=8.139.195.39 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=33
java-server | 2026-05-05 16:25:41.409 [http-nio-18080-exec-9] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6329 status=SUCCESS
java-server | 2026-05-05 16:25:41.414 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6329/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=27
java-server | 2026-05-05 16:25:42.409 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=26
java-server | 2026-05-05 16:25:42.445 [aiimage-scheduling-1] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:25:42.446 [coze-task-35] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4141 taskId=6595 executeId=7636320588616892443
java-server | 2026-05-05 16:25:42.459 [coze-task-35] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6595 stateId=4141 executeId=7636320588616892443 lastPolledAt=2026-05-05T16:25:42
java-server | 2026-05-05 16:25:42.527 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=15
java-server | 2026-05-05 16:25:47.464 [aiimage-scheduling-4] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:25:47.464 [coze-task-36] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4141 taskId=6595 executeId=7636320588616892443
java-server | 2026-05-05 16:25:47.478 [coze-task-36] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6595 stateId=4141 executeId=7636320588616892443 lastPolledAt=2026-05-05T16:25:47
java-server | 2026-05-05 16:25:52.481 [aiimage-scheduling-3] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:25:52.481 [coze-task-37] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4141 taskId=6595 executeId=7636320588616892443
java-server | 2026-05-05 16:25:52.499 [coze-task-37] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6595 stateId=4141 executeId=7636320588616892443 lastPolledAt=2026-05-05T16:25:52
java-server | 2026-05-05 16:25:52.554 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=21
java-server | 2026-05-05 16:25:52.672 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=15
java-server | 2026-05-05 16:25:57.172 [http-nio-18080-exec-9] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6348 status=SUCCESS
java-server | 2026-05-05 16:25:57.177 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6348/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=28
java-server | 2026-05-05 16:25:57.499 [aiimage-scheduling-4] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll picked pending states count=1
java-server | 2026-05-05 16:25:57.499 [coze-task-38] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll worker entered stateId=4141 taskId=6595 executeId=7636320588616892443
java-server | 2026-05-05 16:25:57.512 [coze-task-38] INFO c.n.a.m.a.s.AppearancePatentTaskService - [appearance-patent] coze poll skipped by claim guard taskId=6595 stateId=4141 executeId=7636320588616892443 lastPolledAt=2026-05-05T16:25:57
java-server | 2026-05-05 16:26:00.004 [aiimage-scheduling-3] INFO c.n.a.m.d.s.DeleteBrandStaleTaskService - [stale-check] scan started thread=aiimage-scheduling-3
java-server | 2026-05-05 16:26:00.033 [aiimage-scheduling-3] INFO c.n.a.m.d.s.DeleteBrandStaleTaskService - [stale-check] product-risk summary scanned=0 finalized=0 failed=0 skipped=0 elapsedMs=29 thread=aiimage-scheduling-3
java-server | 2026-05-05 16:26:00.033 [aiimage-scheduling-3] INFO c.n.a.m.d.s.DeleteBrandStaleTaskService - [stale-check] price-track summary scanned=0 finalized=0 failed=0 skipped=0 elapsedMs=29 thread=aiimage-scheduling-3
java-server | 2026-05-05 16:26:00.033 [aiimage-scheduling-3] INFO c.n.a.m.d.s.DeleteBrandStaleTaskService - [stale-check] shop-match summary scanned=0 finalized=0 failed=0 skipped=0 elapsedMs=29 thread=aiimage-scheduling-3
java-server | 2026-05-05 16:26:00.033 [aiimage-scheduling-3] INFO c.n.a.m.d.s.DeleteBrandStaleTaskService - [stale-check] patrol-delete summary scanned=0 finalized=0 failed=0 skipped=0 elapsedMs=29 thread=aiimage-scheduling-3
java-server | 2026-05-05 16:26:02.669 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=23
java-server | 2026-05-05 16:26:02.775 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=15
java-server | 2026-05-05 16:26:06.707 [http-nio-18080-exec-5] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6323 status=SUCCESS
java-server | 2026-05-05 16:26:06.712 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6323/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=27
java-server | 2026-05-05 16:26:08.604 [http-nio-18080-exec-7] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6325 status=SUCCESS
java-server | 2026-05-05 16:26:08.609 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6325/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=28
java-server | 2026-05-05 16:26:12.798 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=22
java-server | 2026-05-05 16:26:12.903 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=20
java-server | 2026-05-05 16:26:13.013 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/history status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=18
java-server | 2026-05-05 16:26:14.912 [http-nio-18080-exec-5] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6329 status=SUCCESS
java-server | 2026-05-05 16:26:14.918 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6329/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=27
java-server | 2026-05-05 16:26:17.829 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/results/8944/download status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=94
java-server | 2026-05-05 16:26:19.674 [http-nio-18080-exec-9] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6269 status=SUCCESS
java-server | 2026-05-05 16:26:19.679 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6269/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=27
java-server | 2026-05-05 16:26:22.908 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=16
java-server | 2026-05-05 16:26:23.021 [http-nio-18080-exec-3] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=16
java-server | 2026-05-05 16:26:29.144 [http-nio-18080-exec-5] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6348 status=SUCCESS
java-server | 2026-05-05 16:26:29.150 [http-nio-18080-exec-5] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6348/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=28
java-server | 2026-05-05 16:26:30.004 [aiimage-scheduling-4] INFO c.n.a.m.d.s.DeleteBrandStaleTaskService - [finalize-check] skip because another instance holds the distributed lock
java-server | 2026-05-05 16:26:33.031 [http-nio-18080-exec-7] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/appearance-patent/tasks/progress/batch status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=11
java-server | 2026-05-05 16:26:33.142 [http-nio-18080-exec-9] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=GET uri=/api/appearance-patent/dashboard status=200 remote=171.222.250.173 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 costMs=20
java-server | 2026-05-05 16:26:38.915 [http-nio-18080-exec-1] WARN c.n.a.m.p.s.PriceTrackTaskService - [price-track] submitResult rejected taskId=6323 status=SUCCESS
java-server | 2026-05-05 16:26:38.920 [http-nio-18080-exec-1] INFO c.n.a.config.RequestTraceFilter - request-trace instance=81fe57de426c host=81fe57de426c method=POST uri=/api/price-track/tasks/6323/result status=200 remote=121.199.179.245 forwardedHost=121.196.149.225:18080 forwardedProto=- forwardedPort=- requestId=- userAgent=python-requests/2.32.5 costMs=27

File diff suppressed because one or more lines are too long