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