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