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