2 lines
17 KiB
JavaScript
2 lines
17 KiB
JavaScript
import{d as Ge,o as He,L as Me,a as o,c as r,b as m,B as qe,e as t,F as O,r as V,t as i,w as fe,G as ze,u as je,f as y,a4 as Ke,a5 as Oe,a6 as Ve,a7 as Je,N as Qe,n as Ye,g as f,h as D,i as $,E as u,a8 as We,a9 as Xe,aa as Ze,ab as es,ac as ss,U as ve,ad as ts,ae as as,af as ls,ag as ns,ah as is,a2 as os,ai as rs,_ as us,q as cs,s as ds}from"./pywebview-CcblbV5J.js";/* empty css */import{e as fs}from"./brand-CEi7uRFN.js";import{c as vs}from"./categorized-timers-JPA-olTr.js";const ps={class:"page-shell module-page"},hs={class:"main-content"},_s={class:"left-panel"},gs={class:"upload-zone"},ys={class:"selected-files"},ks={key:0},ws={class:"prompt-card"},ms={class:"condition-actions"},Cs=["disabled"],Ss={key:0,class:"empty-conditions"},Is={key:1,class:"condition-list"},bs={class:"condition-check"},Ts=["value","onChange"],Fs=["title"],Ps=["onClick"],Es={class:"run-row"},Rs=["disabled"],As=["disabled"],Ns={key:0,class:"parse-card"},xs={key:1,class:"queue-payload"},Us={class:"right-panel"},Ds={class:"task-list-wrap"},$s={class:"clean-result-summary"},Bs={class:"summary-card"},Ls={class:"summary-card"},Gs={class:"summary-card"},Hs={class:"summary-card"},Ms={class:"result-list-wrap preview-wrap"},qs={class:"result-list-header"},zs={key:0,class:"muted"},js={key:0,class:"empty-tasks"},Ks={class:"result-list-wrap"},Os={key:0,class:"empty-tasks"},Vs={key:1,class:"task-list clean-result-list"},Js={class:"left"},Qs={class:"id"},Ys={class:"files"},Ws={class:"files"},Xs={class:"task-right"},Zs={class:"status running"},et=["onClick"],st={class:"result-list-wrap"},tt={key:0,class:"empty-tasks"},at={key:1,class:"task-list clean-result-list"},lt={class:"left"},nt={class:"id"},it={class:"files"},ot={key:0,class:"files"},rt={key:1,class:"files result-hint"},ut={key:2,class:"file-progress"},ct={class:"file-progress-meta"},dt={class:"file-progress-track"},ft={class:"file-progress-count"},vt={key:3,class:"files"},pt={class:"task-right"},ht=["onClick"],_t=["onClick"],gt=3e3,yt=Ge({__name:"BrandSimilarAsinTab",setup(wt){const B=f([]),S=f([]),k=f(null),L=f([]),I=f(null),b=f(""),T=f([]),g=f(null),G=f(!1),H=f(!1),M=f(!1),w=f(""),v=f([]),d=f([]),p=f(null),J=f(!1);let F=null,ee=0,P=!1;const E=vs("similar-asin"),R=f({pendingTaskCount:0,processedTaskCount:0,successTaskCount:0,failedTaskCount:0}),h=f([]),A=D(()=>k.value?.items||[]),pe=D(()=>A.value),N=D(()=>k.value||I.value),se=D(()=>h.value.filter(e=>e.taskId!=null&&v.value.includes(e.taskId))),te=D(()=>h.value.filter(e=>{const s=K(e);return s!=="RUNNING"&&s!=="PENDING"}));function he(){const e=g.value;return e==null?"":T.value.find(s=>s.id===e)?.conditionText?.trim()||""}function ae(){return b.value.trim()||he()}function q(){return os("similar-asin").trim()}function _e(e){return e?e.length<=10?"***":`${e.slice(0,6)}***${e.slice(-4)}`:""}function ge(e){return{...e,data:e.data?{...e.data,api_key:_e(String(e.data.api_key||""))}:e.data}}function ye(){return typeof window<"u"&&window.localStorage.getItem("uid")||"0"}function Q(){return`similar-asin:tasks:${ye()}`}function ke(e){return{taskId:e.taskId,totalRows:e.totalRows,acceptedRows:e.acceptedRows,groupCount:e.groupCount,droppedRows:e.droppedRows}}function C(){if(typeof window>"u")return;const e=Array.from(new Set([...v.value,...d.value]));e.length?window.localStorage.setItem(Q(),JSON.stringify(e)):window.localStorage.removeItem(Q())}function we(){if(!(typeof window>"u"))try{const e=window.localStorage.getItem(Q()),s=e?JSON.parse(e):[];v.value=Array.isArray(s)?s.filter(l=>typeof l=="number"&&l>0):[]}catch{v.value=[]}}async function le(e){const s=$();if(!s?.upload_file_to_java)throw new Error("当前桌面端未提供文件上传能力");const l=[];for(const n of e){const a=typeof n=="string"?n:n.absolutePath,c=typeof n=="string"?void 0:n.relativePath,_=await s.upload_file_to_java(a,c);if(!_?.success||!_.data)throw new Error(_?.error||_?.message||`上传失败:${a}`);l.push(_.data)}return l}async function me(){const e=$();if(!e?.select_brand_xlsx_files||!e.upload_file_to_java){u.warning("当前环境不支持文件选择或上传");return}const s=await e.select_brand_xlsx_files();if(!s?.length)return;const l=await le(s);S.value=l,B.value=l.map(n=>n.relativePath||n.originalFilename||n.fileKey),k.value=null,L.value=[],I.value=null,w.value=""}async function Ce(){const e=$();if(!e?.select_brand_folder){u.warning("当前环境不支持文件夹选择,请在本地客户端中打开");return}try{const s=await e.select_brand_folder();if(!s)return;const l=await fs(s);if(!l.success||!l.items?.length){u.warning(l.error||"该文件夹下没有可用的 xlsx 文件");return}const n=await le(l.items);S.value=n,B.value=l.items.map(a=>a.relativePath||a.absolutePath),k.value=null,L.value=[],I.value=null,w.value="",u.success(`已选择文件夹内 ${l.items.length} 个 Excel 文件`)}catch(s){u.error(s instanceof Error?s.message:"选择失败")}}async function Y(){try{T.value=await We();const e=new Set(T.value.map(s=>s.id));g.value!=null&&!e.has(g.value)&&(g.value=null)}catch(e){u.error(e instanceof Error?e.message:"加载筛选条件失败")}}async function Se(){const e=b.value.trim();if(!e){u.warning("请输入筛选条件");return}M.value=!0;try{const s=await Xe(e);await Y(),s?.id&&(g.value=s.id),u.success("筛选条件已保存")}catch(s){u.error(s instanceof Error?s.message:"保存筛选条件失败")}finally{M.value=!1}}function Ie(e){b.value=e.conditionText||""}async function be(e){try{await Ze(e),g.value===e&&(g.value=null),await Y(),u.success("筛选条件已删除")}catch(s){u.error(s instanceof Error?s.message:"删除筛选条件失败")}}async function Te(){if(!S.value.length){u.warning("请先选择 Excel");return}const e=ae();if(!e){u.warning("请输入筛选条件,或在备选区选择一个筛选条件");return}if(!q()){u.warning("请先在左上角设置中填写货源查询密钥");return}G.value=!0;try{const s=S.value.map(n=>({fileKey:n.fileKey,originalFilename:n.originalFilename,relativePath:n.relativePath})),l=await es(s,e,q());k.value=l,I.value=null,L.value=[],w.value="",u.success(`解析完成,共 ${l.acceptedRows} 条`)}catch(s){u.error(s instanceof Error?s.message:"解析失败")}finally{G.value=!1}}async function Fe(){const e=$(),s=k.value,l=s?.taskId;if(!l){u.warning("请先解析文件");return}if(!e?.enqueue_json){u.error("当前环境未启用 pywebview enqueue_json");return}if(!q()){u.warning("请先在左上角设置中填写货源查询密钥");return}H.value=!0;try{const n={type:"similar-asin-run",ts:Date.now(),data:{taskId:l,prompt:s.aiPrompt||ae(),api_key:q(),sourceFileCount:s.sourceFileCount||0,totalRows:s.totalRows||0,acceptedRows:s.acceptedRows||0,groupCount:s.groupCount||0}};w.value=JSON.stringify(ge(n),null,2),await ss(l);const a=await e.enqueue_json(n);if(!a?.success){u.error(a?.error||"推送失败");return}I.value=ke(s),Ee(l),Pe(),await z(),await j({force:!0}),u.success("已推送到 Python 队列")}finally{H.value=!1}}function Pe(){k.value=null,L.value=[],w.value=""}function Ee(e){v.value.includes(e)||(v.value=[...v.value,e],C()),x()}function W(e){v.value=v.value.filter(s=>s!==e),C()}function Re(e){d.value.includes(e)||(d.value=[...d.value,e],C()),x()}function X(e){d.value=d.value.filter(s=>s!==e),C()}function x(){P||p.value==null&&Ae(!0)}function ne(){p.value!=null&&(E.clearTimer("task-poll",p.value),p.value=null)}function Ae(e=!1){if(P)return;if(p.value!=null){if(!e)return;E.clearTimer("task-poll",p.value),p.value=null}const s=async()=>{p.value=null,!P&&(!v.value.length&&!d.value.length||(await Ne(),!P&&p.value==null&&(v.value.length||d.value.length)&&(p.value=E.setTimeout("task-poll",s,ve()))))};e?s():p.value=E.setTimeout("task-poll",s,ve())}async function Ne(){if(J.value||!v.value.length&&!d.value.length){!v.value.length&&!d.value.length&&ne();return}J.value=!0;try{let e=!1,s=!1;const l=Array.from(new Set([...v.value,...d.value]));if(l.length){const n=await rs(l,{force:d.value.length>0});for(const a of n.items||[]){const c=a.task;if(!c?.id)continue;const _=a.items?.[0];if(_&&xe(_),(c.status==="SUCCESS"||c.status==="FAILED")&&(W(c.id),e=!0,c.status==="SUCCESS"?Re(c.id):X(c.id)),_&&c.status==="SUCCESS"&&d.value.includes(c.id)){const de=(_.fileStatus||"").toUpperCase();(_.fileReady||de==="SUCCESS"||de==="FAILED")&&(X(c.id),e=!0,s=!0)}}n.missingTaskIds?.length&&(n.missingTaskIds.forEach(a=>{W(a),X(a)}),s=!0,e=!0)}e&&await z(),s&&await j(),Ue()}finally{J.value=!1}}function xe(e){if(!e.taskId&&!e.resultId)return;const s=h.value.findIndex(l=>e.resultId!=null&&l.resultId===e.resultId||e.taskId!=null&&l.taskId===e.taskId);s>=0?h.value[s]={...h.value[s],...e}:h.value=[e,...h.value]}function Ue(){if(!d.value.length)return;const e=[];for(const s of d.value){const l=h.value.find(c=>c.taskId===s);if(!l){e.push(s);continue}const n=(l.taskStatus||"").toUpperCase(),a=(l.fileStatus||"").toUpperCase();n==="FAILED"||l.fileReady||a==="SUCCESS"||a==="FAILED"||n==="SUCCESS"&&e.push(s)}d.value=e,C(),d.value.length&&x()}function De(){const e=h.value.filter(s=>s.taskId!=null&&U(s)).map(s=>s.taskId);d.value=Array.from(new Set(e)),C(),d.value.length&&x()}async function z(){R.value=await ts()}async function j(e={}){const s=Date.now();if(!(!e.force&&h.value.length&&s-ee<gt))return F||(F=as().then(l=>{h.value=l.items||[],ee=Date.now()}).finally(()=>{F=null}),F)}function ie(e){const s=K(e);return s==="RUNNING"?"执行中":s==="PENDING"?"已解析待推送":U(e)?"结果生成中":Z(e)?"结果生成失败":s==="SUCCESS"||e.success?"已完成":s==="FAILED"?"失败":"等待中"}function $e(e){const s=K(e);return s==="RUNNING"||U(e)?"running":Z(e)||s==="FAILED"?"failed":s==="SUCCESS"||e.success?"success":"pending"}function U(e){const s=K(e),l=(e.fileStatus||"").toUpperCase();return!(s!=="SUCCESS"||re(e)||l==="FAILED"||l==="SUCCESS")}function K(e){return(e.taskStatus||"").toUpperCase()}function Z(e){return(e.fileStatus||"").toUpperCase()==="FAILED"}function oe(e){if(Z(e))return e.fileError||"结果文件生成失败,请稍后重试或检查后端日志";if(!U(e))return"";const s=(e.fileStatus||"").toUpperCase();return s==="RUNNING"?"任务已完成,正在等待 Coze 回流并组装结果文件,下载按钮稍后出现":s==="PENDING"?"任务已完成,结果文件已入队,正在等待后端开始处理":"任务已完成,正在生成结果文件,下载按钮稍后出现"}function re(e){return!!(e.resultId&&(e.fileReady||e.downloadUrl))}function ue(e){const s=Number(e.fileProgressPercent||0);return Number.isFinite(s)?Math.max(0,Math.min(100,Math.round(s))):0}function Be(e){return U(e)&&(e.fileProgressTotal||0)>0}async function Le(e){if(!e.resultId)return;const s=$();if(!s?.save_file_from_url_new){u.error("当前客户端未提供下载能力");return}const l=e.downloadUrl||ls(e.resultId),n=e.resultFilename||`${e.sourceFilename||"similar-asin"}.xlsx`,a=await s.save_file_from_url_new(l,n);a.success?u.success(`已保存: ${a.path||n}`):a.error&&a.error!=="用户取消"&&u.error(a.error)}async function ce(e){try{e.taskStatus==="RUNNING"&&e.taskId?(await ns(e.taskId),W(e.taskId)):e.resultId&&await is(e.resultId),await z(),await j({force:!0}),u.success("已删除")}catch(s){u.error(s instanceof Error?s.message:"删除失败")}}return He(async()=>{we(),await Promise.all([Y().catch(()=>{}),z().catch(()=>{}),j().catch(()=>{})]),De(),(v.value.length||d.value.length)&&x()}),Me(()=>{P=!0,ne(),E.clearScope()}),(e,s)=>{const l=Ve,n=Je;return o(),r("div",ps,[m(qe,{active:"similar-asin"}),t("div",hs,[t("aside",_s,[s[5]||(s[5]=t("div",{class:"section-title"},"上传文件",-1)),t("div",gs,[s[2]||(s[2]=t("div",{class:"hint"},"选择 Excel 后点击解析,后端会提取 id、ASIN、国家、价格,每一行都会独立送检。",-1)),t("div",{class:"btns"},[t("button",{type:"button",class:"opt-btn",onClick:me},"选择 Excel"),t("button",{type:"button",class:"opt-btn",onClick:Ce},"选择文件夹")]),t("div",ys,[B.value.length?(o(!0),r(O,{key:1},V(B.value,a=>(o(),r("span",{key:a},i(a),1))),128)):(o(),r("span",ks,"暂未选择文件"))])]),t("div",ws,[s[3]||(s[3]=t("div",{class:"section-title"},"筛选条件",-1)),fe(t("textarea",{"onUpdate:modelValue":s[0]||(s[0]=a=>b.value=a),class:"prompt-input",rows:"4",placeholder:"请输入筛选条件"},null,512),[[ze,b.value]]),t("div",ms,[t("button",{type:"button",class:"opt-btn",disabled:M.value,onClick:Se},i(M.value?"保存中...":"保存"),9,Cs)]),s[4]||(s[4]=t("div",{class:"section-title condition-list-title"},"备选区",-1)),T.value.length?(o(),r("ul",Is,[(o(!0),r(O,null,V(T.value,a=>(o(),r("li",{key:a.id,class:"condition-item"},[t("label",bs,[fe(t("input",{"onUpdate:modelValue":s[1]||(s[1]=c=>g.value=c),type:"radio",name:"similar-asin-filter-condition",value:a.id,onChange:c=>Ie(a)},null,40,Ts),[[je,g.value]]),t("span",{title:a.conditionText},i(a.conditionText),9,Fs)]),t("button",{type:"button",class:"link-danger",onClick:c=>be(a.id)},"删除",8,Ps)]))),128))])):(o(),r("div",Ss,"暂无筛选条件,输入后保存即可加入备选区"))]),t("div",Es,[t("button",{type:"button",class:"btn-run",disabled:G.value||!S.value.length,onClick:Te},i(G.value?"解析中...":"解析并创建任务"),9,Rs),t("button",{type:"button",class:"btn-run btn-queue",disabled:H.value||!A.value.length,onClick:Fe},i(H.value?"推送中...":"推送到 Python 队列"),9,As)]),s[6]||(s[6]=t("p",{class:"loading-msg"},"Python 回传字段按 id、asin、国家、价格、标题、图片链接数组提交;后端接收分片后按 10 条一批送检,结果区展示真实 Coze 批次进度。",-1)),N.value?(o(),r("div",Ns,[t("div",null,"任务 ID:"+i(N.value.taskId),1),t("div",null,"总行数:"+i(N.value.totalRows)+",有效:"+i(N.value.acceptedRows)+",过滤:"+i(N.value.droppedRows),1)])):y("",!0),w.value?(o(),r("pre",xs,i(w.value),1)):y("",!0)]),t("section",Us,[s[15]||(s[15]=t("div",{class:"panel-header"},"货源查询",-1)),t("div",Ds,[t("div",$s,[t("div",Bs,[s[7]||(s[7]=t("span",{class:"summary-label"},"运行中任务",-1)),t("strong",null,i(R.value.pendingTaskCount),1)]),t("div",Ls,[s[8]||(s[8]=t("span",{class:"summary-label"},"已结束任务",-1)),t("strong",null,i(R.value.processedTaskCount),1)]),t("div",Gs,[s[9]||(s[9]=t("span",{class:"summary-label"},"成功任务",-1)),t("strong",null,i(R.value.successTaskCount),1)]),t("div",Hs,[s[10]||(s[10]=t("span",{class:"summary-label"},"失败任务",-1)),t("strong",null,i(R.value.failedTaskCount),1)])]),s[14]||(s[14]=t("div",{class:"subsection-title"},"匹配任务",-1)),t("div",Ms,[t("div",qs,[s[11]||(s[11]=t("span",null,"解析结果",-1)),A.value.length?(o(),r("span",zs,"共 "+i(A.value.length)+" 条",1)):y("",!0)]),A.value.length?(o(),Ke(n,{key:1,data:pe.value,height:"120",class:"result-table"},{default:Oe(()=>[m(l,{prop:"displayId",label:"ID",width:"90"}),m(l,{prop:"asin",label:"ASIN",width:"130"}),m(l,{prop:"country",label:"国家",width:"100"}),m(l,{prop:"price",label:"价格",width:"90"}),m(l,{prop:"title",label:"标题","min-width":"160","show-overflow-tooltip":""}),m(l,{prop:"url",label:"URL","min-width":"160","show-overflow-tooltip":""})]),_:1},8,["data"])):(o(),r("div",js,"暂无解析结果"))]),t("div",Ks,[s[12]||(s[12]=t("div",{class:"result-list-header"},[t("span",null,"当前任务")],-1)),se.value.length?(o(),r("ul",Vs,[(o(!0),r(O,null,V(se.value,a=>(o(),r("li",{key:`cur-${a.taskId}`,class:"task-item"},[t("div",Js,[t("span",Qs,i(a.sourceFilename||"货源查询"),1),t("div",Ys,"任务 ID:"+i(a.taskId),1),t("div",Ws,"行数:"+i(a.rowCount??"-"),1)]),t("div",Xs,[t("span",Zs,i(ie(a)),1),t("button",{type:"button",class:"btn-delete",onClick:c=>ce(a)},"删除",8,et)])]))),128))])):(o(),r("div",Os,"暂无当前任务"))]),t("div",st,[s[13]||(s[13]=t("div",{class:"result-list-header"},[t("span",null,"历史记录")],-1)),te.value.length?(o(),r("ul",at,[(o(!0),r(O,null,V(te.value,a=>(o(),r("li",{key:`his-${a.resultId}-${a.taskId}`,class:"task-item"},[t("div",lt,[t("span",nt,i(a.sourceFilename||"货源查询"),1),t("div",it,"任务 ID:"+i(a.taskId??"-"),1),a.resultFilename?(o(),r("div",ot,i(a.resultFilename||"下载结果"),1)):y("",!0),oe(a)?(o(),r("div",rt,i(oe(a)),1)):y("",!0),Be(a)?(o(),r("div",ut,[t("div",ct,[t("span",null,i(a.fileProgressMessage||"结果生成中"),1),t("span",null,i(ue(a))+"%",1)]),t("div",dt,[t("div",{class:"file-progress-bar",style:Qe({width:`${ue(a)}%`})},null,4)]),t("div",ft,i(a.fileProgressCurrent||0)+"/"+i(a.fileProgressTotal||0),1)])):y("",!0),a.error?(o(),r("div",vt,"错误:"+i(a.error),1)):y("",!0)]),t("div",pt,[t("span",{class:Ye(["status",$e(a)])},i(ie(a)),3),re(a)?(o(),r("button",{key:0,type:"button",class:"download",onClick:c=>Le(a)},"下载",8,ht)):y("",!0),a.resultId?(o(),r("button",{key:1,type:"button",class:"btn-delete",onClick:c=>ce(a)},"删除",8,_t)):y("",!0)])]))),128))])):(o(),r("div",tt,"暂无历史记录"))])])])])])}}}),kt=us(yt,[["__scopeId","data-v-d4327c03"]]);cs(kt).use(ds).mount("#app");
|