7 lines
18 KiB
JavaScript
7 lines
18 KiB
JavaScript
import { d as Se, o as Pe, L as Fe, a as i, c as u, b, B as Te, e as a, F as j, r as O, t as n, w as Ee, G as Ne, f as _, U as Ae, V as Ue, W as Re, X as De, N as xe, n as Ke, g as f, h as B, i as A, E as d, Y as $e, Z as Be, T as oe, $ as Le, a0 as Ge, a1 as He, a2 as Me, a3 as qe, a4 as ze, _ as je, q as Oe, s as Ve } from "./pywebview-BtdhG28Q.js";/* empty css */import { e as Je } from "./brand-Lp7YWffz.js"; import { c as Xe } from "./categorized-timers-JPA-olTr.js"; const Ye = { class: "page-shell module-page" }, Qe = { class: "main-content" }, We = { class: "left-panel" }, Ze = { class: "upload-zone" }, es = { class: "selected-files" }, ss = { key: 0 }, ts = { class: "prompt-card" }, as = { class: "run-row" }, ls = ["disabled"], ns = ["disabled"], os = { key: 0, class: "parse-card" }, rs = { key: 1, class: "queue-payload" }, is = { class: "right-panel" }, us = { class: "task-list-wrap" }, cs = { class: "clean-result-summary" }, ds = { class: "summary-card" }, ps = { class: "summary-card" }, fs = { class: "summary-card" }, vs = { class: "summary-card" }, gs = { class: "result-list-wrap preview-wrap" }, hs = { class: "result-list-header" }, ys = { key: 0, class: "muted" }, _s = { key: 0, class: "empty-tasks" }, ks = { class: "result-list-wrap" }, ms = { key: 0, class: "empty-tasks" }, ws = { key: 1, class: "task-list clean-result-list" }, Is = { class: "left" }, bs = { class: "id" }, Cs = { class: "files" }, Ss = { class: "files" }, Ps = { class: "task-right" }, Fs = { class: "status running" }, Ts = ["onClick"], Es = { class: "result-list-wrap" }, Ns = { key: 0, class: "empty-tasks" }, As = { key: 1, class: "task-list clean-result-list" }, Us = { class: "left" }, Rs = { class: "id" }, Ds = { class: "files" }, xs = { key: 0, class: "files" }, Ks = { key: 1, class: "files result-hint" }, $s = { key: 2, class: "file-progress" }, Bs = { class: "file-progress-meta" }, Ls = { class: "file-progress-track" }, Gs = { class: "file-progress-count" }, Hs = { key: 3, class: "files" }, Ms = { class: "task-right" }, qs = ["onClick"], zs = ["onClick"], re = `请帮我排查以下亚马逊商品在英国及欧洲地区是否存在知识产权侵权风险。
|
||
请直接给出明确结论(有侵权风险 或 未发现明显侵权风险),并严格按照以下三个维度提供精简的排查理由:
|
||
外观维度: 评估产品外形、图案设计是否与欧洲/英国常见外观专利雷同。
|
||
专利维度: 评估产品的核心技术或物理结构是否存在侵权可能。
|
||
标题维度: 排查标题中是否包含大牌商标、敏感词或版权保护词汇。
|
||
结论:XX`, js = 3e3, Os = Se({ __name: "BrandAppearancePatentTab", setup(Js) { const U = f([]), C = f([]), v = f(null), k = f([]), L = f(""), R = f(!1), D = f(!1), m = f(""), p = f([]), c = f([]), g = f(null), G = f(!1); let S = null, V = 0, P = !1; const F = Xe("appearance-patent"), T = f({ pendingTaskCount: 0, processedTaskCount: 0, successTaskCount: 0, failedTaskCount: 0 }), h = f([]), w = B(() => k.value.flatMap(s => s.items || [])), J = B(() => k.value[0]?.items || []), X = B(() => h.value.filter(s => s.taskId != null && p.value.includes(s.taskId))), Y = B(() => h.value.filter(s => { const e = $(s); return e !== "RUNNING" && e !== "PENDING" })); function Q() { return L.value.trim() || re } function ie() { return typeof window < "u" && window.localStorage.getItem("uid") || "0" } function H() { return `appearance-patent:tasks:${ie()}` } function I() { if (typeof window > "u") return; const s = Array.from(new Set([...p.value, ...c.value])); s.length ? window.localStorage.setItem(H(), JSON.stringify(s)) : window.localStorage.removeItem(H()) } function ue() { if (!(typeof window > "u")) try { const s = window.localStorage.getItem(H()), e = s ? JSON.parse(s) : []; p.value = Array.isArray(e) ? e.filter(l => typeof l == "number" && l > 0) : [] } catch { p.value = [] } } async function W(s) { const e = A(); if (!e?.upload_file_to_java) throw new Error("当前桌面端未提供文件上传能力"); const l = []; for (const r of s) { const t = typeof r == "string" ? r : r.absolutePath, o = typeof r == "string" ? void 0 : r.relativePath, y = await e.upload_file_to_java(t, o); if (!y?.success || !y.data) throw new Error(y?.error || y?.message || `上传失败:${t}`); l.push(y.data) } return l } async function ce() { const s = A(); if (!s?.select_brand_xlsx_files || !s.upload_file_to_java) { d.warning("当前环境不支持文件选择或上传"); return } const e = await s.select_brand_xlsx_files(); if (!e?.length) return; const l = await W(e); C.value = l, U.value = l.map(r => r.relativePath || r.originalFilename || r.fileKey), v.value = null, k.value = [], m.value = "" } async function de() { const s = A(); if (!s?.select_brand_folder) { d.warning("当前环境不支持文件夹选择,请在本地客户端中打开"); return } try { const e = await s.select_brand_folder(); if (!e) return; const l = await Je(e); if (!l.success || !l.items?.length) { d.warning(l.error || "该文件夹下没有可用的 xlsx 文件"); return } const r = await W(l.items); C.value = r, U.value = l.items.map(t => t.relativePath || t.absolutePath), v.value = null, k.value = [], m.value = "", d.success(`已选择文件夹内 ${l.items.length} 个 Excel 文件`) } catch (e) { d.error(e instanceof Error ? e.message : "选择失败") } } async function pe() { if (!C.value.length) { d.warning("请先选择 Excel"); return } R.value = !0; try { const s = C.value.map(l => ({ fileKey: l.fileKey, originalFilename: l.originalFilename, relativePath: l.relativePath })), e = await $e(s, Q()); v.value = e, k.value = e.groups?.length ? e.groups : e.items?.length ? [{ sourceFileKey: e.items[0]?.sourceFileKey, sourceFilename: e.items[0]?.sourceFilename, groupKey: e.items[0]?.groupKey, baseId: "", displayId: e.items[0]?.displayId, itemCount: e.items.length, items: e.items }] : [], m.value = "", d.success(`解析完成,共 ${e.groupCount || 0} 组 / ${e.acceptedRows} 条`) } catch (s) { d.error(s instanceof Error ? s.message : "解析失败") } finally { R.value = !1 } } async function fe() { const s = A(), e = v.value?.taskId; if (!e || !w.value.length) { d.warning("请先解析文件"); return } if (!s?.enqueue_json) { d.error("当前环境未启用 pywebview enqueue_json"); return } D.value = !0; try { const l = { type: "appearance-patent-run", ts: Date.now(), data: { taskId: e, prompt: v.value?.aiPrompt || Q(), groups: k.value.map(t => ({ sourceFileKey: t.sourceFileKey || "", sourceFilename: t.sourceFilename || "", groupKey: t.groupKey || "", baseId: t.baseId || "", displayId: t.displayId || "", items: (t.items || []).map(o => ({ sourceFileKey: o.sourceFileKey || "", sourceFilename: o.sourceFilename || "", rowToken: o.rowToken || "", groupKey: o.groupKey || "", id: o.displayId, asin: o.asin, country: o.country, url: o.url || "", title: o.title || "" })) })), rows: w.value.map(t => ({ sourceFileKey: t.sourceFileKey || "", sourceFilename: t.sourceFilename || "", rowToken: t.rowToken || "", groupKey: t.groupKey || "", id: t.displayId, asin: t.asin, country: t.country, url: t.url || "", title: t.title || "" })) } }; m.value = JSON.stringify(l, null, 2), await Be(e); const r = await s.enqueue_json(l); if (!r?.success) { d.error(r?.error || "推送失败"); return } ge(e), ve(), await x(), await K({ force: !0 }), d.success("已推送到 Python 队列") } finally { D.value = !1 } } function ve() { v.value = null, k.value = [], m.value = "" } function ge(s) { p.value.includes(s) || (p.value = [...p.value, s], I()), E() } function M(s) { p.value = p.value.filter(e => e !== s), I() } function he(s) { c.value.includes(s) || (c.value = [...c.value, s], I()), E() } function q(s) { c.value = c.value.filter(e => e !== s), I() } function E() { P || g.value == null && ye(!0) } function Z() { g.value != null && (F.clearTimer("task-poll", g.value), g.value = null) } function ye(s = !1) { if (P) return; if (g.value != null) { if (!s) return; F.clearTimer("task-poll", g.value), g.value = null } const e = async () => { g.value = null, !P && (!p.value.length && !c.value.length || (await _e(), !P && g.value == null && (p.value.length || c.value.length) && (g.value = F.setTimeout("task-poll", e, oe())))) }; s ? e() : g.value = F.setTimeout("task-poll", e, oe()) } async function _e() { if (G.value || !p.value.length && !c.value.length) { !p.value.length && !c.value.length && Z(); return } G.value = !0; try { let s = !1, e = !1; const l = Array.from(new Set([...p.value, ...c.value])); if (l.length) { const r = await ze(l, { force: c.value.length > 0 }); for (const t of r.items || []) { const o = t.task; if (!o?.id) continue; const y = t.items?.[0]; if (y && ke(y), (o.status === "SUCCESS" || o.status === "FAILED") && (M(o.id), s = !0, o.status === "SUCCESS" ? he(o.id) : q(o.id)), y && o.status === "SUCCESS" && c.value.includes(o.id)) { const ne = (y.fileStatus || "").toUpperCase(); (y.fileReady || ne === "SUCCESS" || ne === "FAILED") && (q(o.id), s = !0, e = !0) } } r.missingTaskIds?.length && (r.missingTaskIds.forEach(t => { M(t), q(t) }), e = !0, s = !0) } s && await x(), e && await K(), me() } finally { G.value = !1 } } function ke(s) { if (!s.taskId && !s.resultId) return; const e = h.value.findIndex(l => s.resultId != null && l.resultId === s.resultId || s.taskId != null && l.taskId === s.taskId); e >= 0 ? h.value[e] = { ...h.value[e], ...s } : h.value = [s, ...h.value] } function me() { if (!c.value.length) return; const s = []; for (const e of c.value) { const l = h.value.find(o => o.taskId === e); if (!l) { s.push(e); continue } const r = (l.taskStatus || "").toUpperCase(), t = (l.fileStatus || "").toUpperCase(); r === "FAILED" || l.fileReady || t === "SUCCESS" || t === "FAILED" || r === "SUCCESS" && s.push(e) } c.value = s, I(), c.value.length && E() } function we() { const s = h.value.filter(e => e.taskId != null && N(e)).map(e => e.taskId); c.value = Array.from(new Set(s)), I(), c.value.length && E() } async function x() { T.value = await Le() } async function K(s = {}) { const e = Date.now(); if (!(!s.force && h.value.length && e - V < js)) return S || (S = Ge().then(l => { h.value = l.items || [], V = Date.now() }).finally(() => { S = null }), S) } function ee(s) { const e = $(s); return e === "RUNNING" ? "执行中" : e === "PENDING" ? "已解析待推送" : N(s) ? "结果生成中" : z(s) ? "结果生成失败" : e === "SUCCESS" || s.success ? "已完成" : e === "FAILED" ? "失败" : "等待中" } function Ie(s) { const e = $(s); return e === "RUNNING" || N(s) ? "running" : z(s) || e === "FAILED" ? "failed" : e === "SUCCESS" || s.success ? "success" : "pending" } function N(s) { const e = $(s), l = (s.fileStatus || "").toUpperCase(); return !(e !== "SUCCESS" || te(s) || l === "FAILED" || l === "SUCCESS") } function $(s) { return (s.taskStatus || "").toUpperCase() } function z(s) { return (s.fileStatus || "").toUpperCase() === "FAILED" } function se(s) { if (z(s)) return s.fileError || "结果文件生成失败,请稍后重试或检查后端日志"; if (!N(s)) return ""; const e = (s.fileStatus || "").toUpperCase(); return e === "RUNNING" ? "任务已完成,正在请求 Coze 或组装结果文件,下载按钮稍后出现" : e === "PENDING" ? "任务已完成,结果文件已入队,正在等待后端生成" : "任务已完成,正在生成结果文件,下载按钮稍后出现" } function te(s) { return !!(s.resultId && (s.fileReady || s.downloadUrl)) } function ae(s) { const e = Number(s.fileProgressPercent || 0); return Number.isFinite(e) ? Math.max(0, Math.min(100, Math.round(e))) : 0 } function be(s) { return N(s) && (s.fileProgressTotal || 0) > 0 } async function Ce(s) { if (!s.resultId) return; const e = A(); if (!e?.save_file_from_url_new) { d.error("当前客户端未提供下载能力"); return } const l = s.downloadUrl || He(s.resultId), r = s.resultFilename || `${s.sourceFilename || "appearance-patent"}.xlsx`, t = await e.save_file_from_url_new(l, r); t.success ? d.success(`已保存: ${t.path || r}`) : t.error && t.error !== "用户取消" && d.error(t.error) } async function le(s) { try { s.taskStatus === "RUNNING" && s.taskId ? (await Me(s.taskId), M(s.taskId)) : s.resultId && await qe(s.resultId), await x(), await K({ force: !0 }), d.success("已删除") } catch (e) { d.error(e instanceof Error ? e.message : "删除失败") } } return Pe(async () => { ue(), await Promise.all([x().catch(() => { }), K().catch(() => { })]), we(), (p.value.length || c.value.length) && E() }), Fe(() => { P = !0, Z(), F.clearScope() }), (s, e) => { const l = Re, r = De; return i(), u("div", Ye, [b(Te, { active: "appearance-patent" }), a("div", Qe, [a("aside", We, [e[4] || (e[4] = a("div", { class: "section-title" }, "上传文件", -1)), a("div", Ze, [e[1] || (e[1] = a("div", { class: "hint" }, "选择 Excel 后点击解析,后端会提取 id、ASIN、国家,并保留整数 id 与子数据的第一条。", -1)), a("div", { class: "btns" }, [a("button", { type: "button", class: "opt-btn", onClick: ce }, "选择 Excel"), a("button", { type: "button", class: "opt-btn", onClick: de }, "选择文件夹")]), a("div", es, [U.value.length ? (i(!0), u(j, { key: 1 }, O(U.value, t => (i(), u("span", { key: t }, n(t), 1))), 128)) : (i(), u("span", ss, "暂未选择文件"))])]), a("div", ts, [e[2] || (e[2] = a("div", { class: "section-title" }, "AI 提示词", -1)), Ee(a("textarea", { "onUpdate:modelValue": e[0] || (e[0] = t => L.value = t), class: "prompt-input", rows: "8", placeholder: "可选,留空时使用下方默认提示词" }, null, 512), [[Ne, L.value]]), e[3] || (e[3] = a("div", { class: "prompt-default-label" }, "留空时默认使用以下提示词", -1)), a("div", { class: "prompt-preview" }, n(re))]), a("div", as, [a("button", { type: "button", class: "btn-run", disabled: R.value || !C.value.length, onClick: pe }, n(R.value ? "解析中..." : "解析并创建任务"), 9, ls), a("button", { type: "button", class: "btn-run btn-queue", disabled: D.value || !w.value.length, onClick: fe }, n(D.value ? "推送中..." : "推送到 Python 队列"), 9, ns)]), e[5] || (e[5] = a("p", { class: "loading-msg" }, "Python 回传字段按 asin、国家、url、标题提交;后端接收分片后按 10 条一批调用 Coze。", -1)), v.value ? (i(), u("div", os, [a("div", null, "任务 ID:" + n(v.value.taskId), 1), a("div", null, "总行数:" + n(v.value.totalRows) + ",有效:" + n(v.value.acceptedRows) + ",分组:" + n(v.value.groupCount || 0) + ",过滤:" + n(v.value.droppedRows), 1)])) : _("", !0), m.value ? (i(), u("pre", rs, n(m.value), 1)) : _("", !0)]), a("section", is, [e[14] || (e[14] = a("div", { class: "panel-header" }, "外观专利检测", -1)), a("div", us, [a("div", cs, [a("div", ds, [e[6] || (e[6] = a("span", { class: "summary-label" }, "运行中任务", -1)), a("strong", null, n(T.value.pendingTaskCount), 1)]), a("div", ps, [e[7] || (e[7] = a("span", { class: "summary-label" }, "已结束任务", -1)), a("strong", null, n(T.value.processedTaskCount), 1)]), a("div", fs, [e[8] || (e[8] = a("span", { class: "summary-label" }, "成功任务", -1)), a("strong", null, n(T.value.successTaskCount), 1)]), a("div", vs, [e[9] || (e[9] = a("span", { class: "summary-label" }, "失败任务", -1)), a("strong", null, n(T.value.failedTaskCount), 1)])]), e[13] || (e[13] = a("div", { class: "subsection-title" }, "匹配任务", -1)), a("div", gs, [a("div", hs, [e[10] || (e[10] = a("span", null, "解析结果", -1)), w.value.length ? (i(), u("span", ys, "显示首组 " + n(J.value.length) + " 条 / 共 " + n(v.value?.groupCount || k.value.length) + " 组," + n(w.value.length) + " 条", 1)) : _("", !0)]), w.value.length ? (i(), Ae(r, { key: 1, data: J.value, height: "120", class: "result-table" }, { default: Ue(() => [b(l, { prop: "displayId", label: "ID", width: "90" }), b(l, { prop: "asin", label: "ASIN", width: "130" }), b(l, { prop: "country", label: "国家", width: "100" }), b(l, { prop: "title", label: "标题", "min-width": "160", "show-overflow-tooltip": "" }), b(l, { prop: "url", label: "URL", "min-width": "160", "show-overflow-tooltip": "" })]), _: 1 }, 8, ["data"])) : (i(), u("div", _s, "暂无解析结果"))]), a("div", ks, [e[11] || (e[11] = a("div", { class: "result-list-header" }, [a("span", null, "当前任务")], -1)), X.value.length ? (i(), u("ul", ws, [(i(!0), u(j, null, O(X.value, t => (i(), u("li", { key: `cur-${t.taskId}`, class: "task-item" }, [a("div", Is, [a("span", bs, n(t.sourceFilename || "外观专利检测"), 1), a("div", Cs, "任务 ID:" + n(t.taskId), 1), a("div", Ss, "行数:" + n(t.rowCount ?? "-"), 1)]), a("div", Ps, [a("span", Fs, n(ee(t)), 1), a("button", { type: "button", class: "btn-delete", onClick: o => le(t) }, "删除", 8, Ts)])]))), 128))])) : (i(), u("div", ms, "暂无当前任务"))]), a("div", Es, [e[12] || (e[12] = a("div", { class: "result-list-header" }, [a("span", null, "历史记录")], -1)), Y.value.length ? (i(), u("ul", As, [(i(!0), u(j, null, O(Y.value, t => (i(), u("li", { key: `his-${t.resultId}-${t.taskId}`, class: "task-item" }, [a("div", Us, [a("span", Rs, n(t.sourceFilename || "外观专利检测"), 1), a("div", Ds, "任务 ID:" + n(t.taskId ?? "-"), 1), t.resultFilename ? (i(), u("div", xs, n(t.resultFilename || "下载结果"), 1)) : _("", !0), se(t) ? (i(), u("div", Ks, n(se(t)), 1)) : _("", !0), be(t) ? (i(), u("div", $s, [a("div", Bs, [a("span", null, n(t.fileProgressMessage || "结果生成中"), 1), a("span", null, n(ae(t)) + "%", 1)]), a("div", Ls, [a("div", { class: "file-progress-bar", style: xe({ width: `${ae(t)}%` }) }, null, 4)]), a("div", Gs, n(t.fileProgressCurrent || 0) + "/" + n(t.fileProgressTotal || 0), 1)])) : _("", !0), t.error ? (i(), u("div", Hs, "错误:" + n(t.error), 1)) : _("", !0)]), a("div", Ms, [a("span", { class: Ke(["status", Ie(t)]) }, n(ee(t)), 3), te(t) ? (i(), u("button", { key: 0, type: "button", class: "download", onClick: o => Ce(t) }, "下载", 8, qs)) : _("", !0), t.resultId ? (i(), u("button", { key: 1, type: "button", class: "btn-delete", onClick: o => le(t) }, "删除", 8, zs)) : _("", !0)])]))), 128))])) : (i(), u("div", Ns, "暂无历史记录"))])])])])]) } } }), Vs = je(Os, [["__scopeId", "data-v-c78bd0f0"]]); Oe(Vs).use(Ve).mount("#app");
|