Files
crawler-plugin/app/assets/appearance-patent.js
2026-05-04 19:04:55 +08:00

7 lines
16 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 _,V as Ae,W as Ue,X as Re,Y as De,N as xe,n as Ke,g as f,h as B,i as A,E as d,Z as $e,$ as Be,U as oe,a0 as Le,a1 as Ge,a2 as He,a3 as Me,a4 as qe,a5 as ze,_ as je,q as Oe,s as Ve}from"./pywebview-Cz_PRNOK.js";/* empty css */import{e as Je}from"./brand-Cs6TxmtW.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");