import{g as m,bB as fe,bC as oe,V as ve,d as pe,o as me,a as f,c as v,b as ye,B as he,e as t,F as K,r as Y,t as i,f as B,w as O,H as ae,v as X,n as ne,bD as ke,h as le,bE as ge,E as y,bF as be,i as Q,bG as _e,bH as we,bI as Ce,bJ as Se,bK as Ie,bL as Te,bM as Ne,_ as Pe,q as xe,u as Ee}from"./java-modules-B8c-YG5x.js";import{e as Ae}from"./brand-COze15GJ.js";import{c as re}from"./categorized-timers-JPA-olTr.js";const De=u=>u==="SUCCESS"||u==="FAILED";function Fe(u){if(!u||typeof window>"u")return[];try{const k=window.localStorage.getItem(u);if(!k)return[];const g=JSON.parse(k);return Array.isArray(g)?g.filter(_=>typeof _=="number"&&_>0):[]}catch{return[]}}function Ue(u,k){if(!(!u||typeof window>"u"))try{k.length===0?window.localStorage.removeItem(u):window.localStorage.setItem(u,JSON.stringify(k))}catch{}}function $e(u){const k=re(`task-progress-loop:${u.scope}`),g=u.isTerminal??De,_=u.getIntervalMs??ve,d=m(Fe(u.storageKey)),b=m({}),l=m(!1);let c=null,S=!1;function L(){Ue(u.storageKey,d.value)}function G(n){!Number.isFinite(n)||n<=0||d.value.includes(n)||(d.value=[...d.value,n],L(),A(!0))}function F(n){if(d.value.includes(n)&&(d.value=d.value.filter(o=>o!==n),L(),b.value[n])){const o={...b.value};delete o[n],b.value=o}}function T(n){const o=Array.from(new Set(n.filter(M=>Number.isFinite(M)&&M>0)));d.value=o,L()}function w(n){const o=b.value[n];return!!o&&g(o)}async function N(){if(S)return;const n=d.value.filter(o=>o>0);if(n.length){l.value=!0;try{const M=(await u.fetchProgress(n))?.items||[],z=[],H={...b.value};for(const C of M){const D=u.extractTaskId(C);if(typeof D!="number"||D<=0)continue;const q=u.extractStatus(C)||"";try{u.onUpdate?.(D,C)}catch{}q&&(H[D]=q,g(q)&&z.push({taskId:D,detail:C,status:q}))}b.value=H;for(const C of z){F(C.taskId);try{await u.onTerminal?.(C.taskId,C.detail,C.status)}catch{}}}catch(o){u.onError?.(o)}finally{l.value=!1}}}function R(){c!=null&&(k.clearTimer("task-poll",c),c=null)}function E(n=!1){if(S||c!=null&&!n)return;R();const o=async()=>{if(c=null,!S&&d.value.length){if(l.value){c=k.setTimeout("task-poll",o,500);return}await N(),!S&&d.value.length>0&&(c=k.setTimeout("task-poll",o,_()))}};n?o():c=k.setTimeout("task-poll",o,_())}function A(n=!1){S||d.value.length&&(c!=null&&!n||E(n))}function U(){R()}fe(d,(n,o)=>{if(!S){if(!n.length){U();return}(!o||o.length===0)&&E(!0)}},{flush:"post"});let P=null;typeof document<"u"&&(P=()=>{document.visibilityState==="visible"&&d.value.length>0&&E(!0)},document.addEventListener("visibilitychange",P));function I(){S||(S=!0,U(),k.clearScope(),P&&typeof document<"u"&&(document.removeEventListener("visibilitychange",P),P=null))}return oe(()=>I()),d.value.length>0&&E(!0),{taskIds:d,taskStatuses:b,inFlight:l,add:G,remove:F,reset:T,ensure:A,stop:U,refreshOnce:N,isTerminal:w,dispose:I}}const Be={class:"page-shell module-page"},Le={class:"main-content"},Re={class:"left-panel"},Me={class:"upload-zone"},qe={class:"selected-files"},Ge={key:0,class:"more-line"},Ve={key:1},Ke={class:"filter-zone"},Oe={class:"filter-row"},ze={class:"range-inputs"},He={class:"filter-checks"},Je={class:"filter-check-row"},je={class:"filter-check-row"},Ye={class:"filter-check-row"},Qe={class:"section-title country-section-title"},We={key:0,class:"country-pref-saving"},Xe={class:"country-pref-radios"},Ze=["checked","onChange"],et={class:"country-check-text"},tt={class:"run-row"},st=["disabled"],at=["disabled"],nt={key:0,class:"queue-debug-card"},lt={class:"queue-debug-line"},ot={key:0,class:"queue-debug-payload"},rt={class:"right-panel"},it={class:"task-list-wrap"},ut={class:"clean-result-summary"},ct={class:"summary-card"},dt={class:"summary-card"},ft={class:"summary-card"},vt={class:"summary-card"},pt={class:"result-list-wrap"},mt={key:0,class:"empty-tasks"},yt={key:1,class:"task-list clean-result-list"},ht={class:"left"},kt={class:"id"},gt={class:"files"},bt={class:"files"},_t={class:"files"},wt={class:"task-right"},Ct={class:"status running"},St=["onClick"],It={class:"result-list-wrap"},Tt={key:0,class:"empty-tasks"},Nt={key:1,class:"task-list clean-result-list"},Pt={class:"left"},xt={class:"id"},Et={class:"files"},At={class:"files"},Dt={class:"files"},Ft={key:0,class:"files"},Ut={key:1,class:"files"},$t={class:"task-right"},Bt=["onClick"],Lt="brand:collect-data:polling-task-ids",Rt=pe({__name:"BrandCollectDataTab",setup(u){const k=[{code:"DE",label:"德国"},{code:"UK",label:"英国"},{code:"FR",label:"法国"},{code:"IT",label:"意大利"},{code:"ES",label:"西班牙"}],g=m([]),_=m([]),d=m(!1),b=m(!1),l=ke({minAmount:null,maxAmount:null,rank:!1,fba:!1,fbm:!1}),c=m("DE"),S=le(()=>c.value?[c.value]:[]),L=m(!1),G=m(!1),F=re("collect-data-tab");let T=null;const w=m(null),N=m(null),R=m(""),E=m(""),A=m({pendingTaskCount:0,processedTaskCount:0,successTaskCount:0,failedTaskCount:0}),U=m([]),P=m([]),I=m({}),n=$e({scope:"collect-data-tab",storageKey:Lt,fetchProgress:a=>Ne(a),extractTaskId:a=>a.task?.id??null,extractStatus:a=>a.task?.status??"",onUpdate:(a,e)=>{const s=I.value[a];I.value={...I.value,[a]:s?{...s,task:{...s.task||{},...e.task||{}},items:e.items??s.items}:e}},onTerminal:async a=>{if(I.value[a]){const e={...I.value};delete e[a],I.value=e}await Promise.all([V(),J()])}}),o=le(()=>g.value.slice(0,8));function M(a){k.some(e=>e.code===a)&&c.value!==a&&(L.value=!0,c.value=a,z())}function z(){T!=null&&F.clearTimer("country-pref-save",T),T=F.setTimeout("country-pref-save",()=>{T=null,H()},450)}async function H(){if(c.value){G.value=!0;try{await ge([c.value])}catch(a){y.error(a instanceof Error?a.message:"保存国家顺序失败")}finally{G.value=!1}}}async function C(){try{const a=await be();if(L.value)return;const e=a?.country_codes;Array.isArray(e)&&e.length&&(c.value=String(e[0]||"DE"))}catch{}}async function D(a){const e=Q();if(!e?.upload_file_to_java)throw new Error("当前桌面端未提供文件上传能力");const s=[];for(const p of a){const x=typeof p=="string"?p:p.absolutePath,$=typeof p=="string"?void 0:p.relativePath,r=await e.upload_file_to_java(x,$);if(!r?.success||!r.data)throw new Error(r?.error||r?.message||`上传失败:${x}`);s.push(r.data)}return s}async function q(){const a=Q();if(!a?.select_brand_xlsx_files||!a.upload_file_to_java){y.warning("当前环境不支持文件选择或上传");return}try{const e=await a.select_brand_xlsx_files();if(!e?.length)return;const s=await D(e);_.value=s,g.value=s.map(p=>p.relativePath||p.originalFilename||p.fileKey),w.value=null,N.value=null}catch(e){y.error(e instanceof Error?e.message:"文件选择失败")}}async function ie(){const a=Q();if(!a?.select_brand_folder){y.warning("当前环境不支持文件夹选择,请在本地客户端中打开");return}try{const e=await a.select_brand_folder();if(!e)return;const s=await Ae(e);if(!s.success||!s.items?.length){y.warning(s.error||"该文件夹下没有可用的 xlsx 文件");return}const p=await D(s.items);_.value=p,g.value=s.items.map(x=>x.relativePath||x.absolutePath),w.value=null,N.value=null,y.success(`已选择文件夹内 ${s.items.length} 个 Excel 文件`)}catch(e){y.error(e instanceof Error?e.message:"选择失败")}}function Z(){const a=l.minAmount===null||l.minAmount===void 0||Number.isNaN(l.minAmount)?null:l.minAmount,e=l.maxAmount===null||l.maxAmount===void 0||Number.isNaN(l.maxAmount)?null:l.maxAmount;return{amount:e??a,minAmount:a,maxAmount:e,min_amount:a,max_amount:e,rank:!!l.rank,fba:!!l.fba,fbm:!!l.fbm,countryCodes:[...S.value],countryCode:c.value,country_code:c.value}}async function ue(){if(!_.value.length){y.warning("请先选择 Excel 文件");return}if(!c.value){y.warning("请选择采集国家");return}d.value=!0;try{const a=await _e({files:_.value.map(e=>({fileKey:e.fileKey,originalFilename:e.originalFilename,relativePath:e.relativePath})),task_type:"collect-data",filters:Z()});N.value=a,w.value=a.taskId??null,a.taskId&&n.add(a.taskId),y.success(`提交成功:任务 ${a.taskNo||a.taskId},落库 ${a.acceptedRows??0} 行`),await Promise.all([V(),J()])}catch(a){y.error(a instanceof Error?a.message:"提交失败")}finally{d.value=!1}}async function ce(){if(!w.value){y.warning("请先提交采集任务");return}const a=Q();if(!a?.enqueue_json){y.warning("当前环境未提供 Python 队列能力");return}b.value=!0;try{await we(w.value);const e={type:"collect-data-run",ts:Date.now(),data:{taskId:w.value,taskNo:N.value?.taskNo,taskType:"collect-data",totalRows:N.value?.acceptedRows??0,pageSize:N.value?.pageSize??50,filters:Z()}},s=await a.enqueue_json(e);if(!s?.success)throw new Error(s?.error||"入队失败");R.value=`已推送至 Python 队列(队列长度:${s.queue_size??"-"})`,E.value=JSON.stringify(e,null,2),w.value&&n.add(w.value),y.success("已推送到 Python 队列"),await V()}catch(e){y.error(e instanceof Error?e.message:"推送失败")}finally{b.value=!1}}function W(a){if(!a)return"-";const e=new Date(a);if(Number.isNaN(e.getTime()))return a;const s=e.getFullYear(),p=String(e.getMonth()+1).padStart(2,"0"),x=String(e.getDate()).padStart(2,"0"),$=String(e.getHours()).padStart(2,"0"),r=String(e.getMinutes()).padStart(2,"0"),h=String(e.getSeconds()).padStart(2,"0");return`${s}-${p}-${x} ${$}:${r}:${h}`}function ee(a){return(a.taskStatus||"").toUpperCase()}function te(a){const e=ee(a);return e==="RUNNING"?"执行中":e==="PENDING"?"等待中":e==="SUCCESS"||a.success?"已完成":e==="FAILED"?"失败":"等待中"}function de(a){const e=ee(a);return e==="RUNNING"?"running":e==="FAILED"?"failed":e==="SUCCESS"||a.success?"success":"pending"}async function V(){try{A.value=await Ce()}catch{}}async function J(){try{const e=(await Se(50)).items||[],s=e.filter(r=>{const h=(r.taskStatus||"").toUpperCase();return h==="PENDING"||h==="RUNNING"});P.value=e.filter(r=>{const h=(r.taskStatus||"").toUpperCase();return h==="SUCCESS"||h==="FAILED"});const p=new Set;for(const r of s)r.taskId&&(p.add(r.taskId),n.add(r.taskId));for(const r of[...n.taskIds.value])e.some(j=>j.taskId===r)||n.remove(r);const x=new Set(s.map(r=>r.taskId).filter(r=>typeof r=="number")),$=[...s];for(const r of n.taskIds.value){if(x.has(r))continue;const h=I.value[r],j=h?.items?.[0];j?$.push(j):h?.task&&$.push({taskId:h.task.id,taskNo:h.task.taskNo,taskStatus:h.task.status,startedAt:h.task.createdAt,finishedAt:h.task.finishedAt,sourceFilename:"采集数据"})}U.value=$}catch{}}async function se(a){try{if(a.resultId)await Ie(a.resultId);else if(a.taskId)await Te(a.taskId);else return;a.taskId&&n.remove(a.taskId),y.success("已删除"),await Promise.all([V(),J()])}catch(e){y.error(e instanceof Error?e.message:"删除失败")}}return me(()=>{C(),V(),J()}),oe(()=>{T!=null&&(F.clearTimer("country-pref-save",T),T=null),F.clearScope()}),(a,e)=>(f(),v("div",Be,[ye(he,{active:"collect-data"}),t("div",Le,[t("aside",Re,[e[13]||(e[13]=t("div",{class:"section-title"},"上传文件",-1)),t("div",Me,[e[5]||(e[5]=t("div",{class:"hint"},"选择需要采集的 Excel 文件或文件夹(默认根目录:采集前数据.xlsx),后续将按下方筛选条件交给 Python 端进行数据采集。",-1)),t("div",{class:"btns"},[t("button",{type:"button",class:"opt-btn",onClick:q},"选择 Excel"),t("button",{type:"button",class:"opt-btn",onClick:ie},"选择文件夹")]),t("div",qe,[g.value.length?(f(),v(K,{key:0},[(f(!0),v(K,null,Y(o.value,s=>(f(),v("span",{key:s},i(s),1))),128)),g.value.length>o.value.length?(f(),v("span",Ge," 还有 "+i(g.value.length-o.value.length)+" 个文件未展开显示 ",1)):B("",!0)],64)):(f(),v("span",Ve,"暂未选择文件"))])]),e[14]||(e[14]=t("div",{class:"section-title"},"筛选条件",-1)),t("div",Ke,[t("div",Oe,[e[7]||(e[7]=t("label",{class:"filter-label"},"金额区间",-1)),t("div",ze,[O(t("input",{"onUpdate:modelValue":e[0]||(e[0]=s=>l.minAmount=s),type:"number",step:"0.01",min:"0",class:"filter-input",placeholder:"最低"},null,512),[[ae,l.minAmount,void 0,{number:!0}]]),e[6]||(e[6]=t("span",{class:"range-separator"},"至",-1)),O(t("input",{"onUpdate:modelValue":e[1]||(e[1]=s=>l.maxAmount=s),type:"number",step:"0.01",min:"0",class:"filter-input",placeholder:"最高"},null,512),[[ae,l.maxAmount,void 0,{number:!0}]])])]),t("div",He,[t("label",Je,[O(t("input",{type:"checkbox",class:"filter-check-input","onUpdate:modelValue":e[2]||(e[2]=s=>l.rank=s)},null,512),[[X,l.rank]]),e[8]||(e[8]=t("span",{class:"filter-check-text"},"排名",-1))]),t("label",je,[O(t("input",{type:"checkbox",class:"filter-check-input","onUpdate:modelValue":e[3]||(e[3]=s=>l.fba=s)},null,512),[[X,l.fba]]),e[9]||(e[9]=t("span",{class:"filter-check-text"},"FBA",-1))]),t("label",Ye,[O(t("input",{type:"checkbox",class:"filter-check-input","onUpdate:modelValue":e[4]||(e[4]=s=>l.fbm=s)},null,512),[[X,l.fbm]]),e[10]||(e[10]=t("span",{class:"filter-check-text"},"FBM",-1))])])]),t("div",Qe,[e[11]||(e[11]=t("span",null,"采集国家",-1)),G.value?(f(),v("span",We,"保存中…")):B("",!0)]),e[15]||(e[15]=t("p",{class:"hint country-pref-hint"}," 每次任务只采集一个国家,选择后会自动保存,下次进入默认使用该国家。 ",-1)),t("div",Xe,[(f(),v(K,null,Y(k,s=>t("label",{key:s.code,class:ne(["country-check-row",{selected:c.value===s.code}])},[t("input",{type:"radio",name:"collect-data-country",class:"country-check-input",checked:c.value===s.code,onChange:p=>M(s.code)},null,40,Ze),t("span",et,i(s.label)+"("+i(s.code)+")",1)],2)),64))]),t("div",tt,[t("button",{type:"button",class:"btn-run",disabled:d.value||!_.value.length,onClick:ue},i(d.value?"提交中...":"提交采集任务"),9,st),t("button",{type:"button",class:"btn-run btn-queue",disabled:b.value||!w.value,onClick:ce},i(b.value?"推送中...":"推送到 Python 队列"),9,at)]),e[16]||(e[16]=t("p",{class:"loading-msg"},"提交后由 Java 解析 Excel 并落库为待采集任务(PENDING);推送到 Python 队列将激活任务(RUNNING),Python 端按 50 条/页拉取明细执行采集。",-1)),R.value?(f(),v("div",nt,[e[12]||(e[12]=t("div",{class:"section-title queue-debug-title"},"推送结果",-1)),t("div",lt,i(R.value),1),E.value?(f(),v("pre",ot,i(E.value),1)):B("",!0)])):B("",!0)]),t("section",rt,[e[24]||(e[24]=t("div",{class:"panel-header"},"采集数据",-1)),t("div",it,[t("div",ut,[t("div",ct,[e[17]||(e[17]=t("span",{class:"summary-label"},"运行中任务",-1)),t("strong",null,i(A.value.pendingTaskCount),1)]),t("div",dt,[e[18]||(e[18]=t("span",{class:"summary-label"},"已结束任务",-1)),t("strong",null,i(A.value.processedTaskCount),1)]),t("div",ft,[e[19]||(e[19]=t("span",{class:"summary-label"},"成功任务",-1)),t("strong",null,i(A.value.successTaskCount),1)]),t("div",vt,[e[20]||(e[20]=t("span",{class:"summary-label"},"失败任务",-1)),t("strong",null,i(A.value.failedTaskCount),1)])]),e[23]||(e[23]=t("div",{class:"subsection-title"},"匹配任务",-1)),t("div",pt,[e[21]||(e[21]=t("div",{class:"result-list-header"},[t("span",null,"当前任务")],-1)),U.value.length?(f(),v("ul",yt,[(f(!0),v(K,null,Y(U.value,s=>(f(),v("li",{key:`cur-${s.taskId}`,class:"task-item"},[t("div",ht,[t("span",kt,i(s.sourceFilename||"采集数据"),1),t("div",gt,"任务 ID:"+i(s.taskId),1),t("div",bt,"开始时间:"+i(W(s.startedAt||s.createdAt)),1),t("div",_t,"行数:"+i(s.rowCount??"-"),1)]),t("div",wt,[t("span",Ct,i(te(s)),1),t("button",{type:"button",class:"btn-delete",onClick:p=>se(s)},"删除",8,St)])]))),128))])):(f(),v("div",mt,"暂无当前任务"))]),t("div",It,[e[22]||(e[22]=t("div",{class:"result-list-header"},[t("span",null,"历史记录")],-1)),P.value.length?(f(),v("ul",Nt,[(f(!0),v(K,null,Y(P.value,s=>(f(),v("li",{key:`his-${s.resultId}-${s.taskId}`,class:"task-item"},[t("div",Pt,[t("span",xt,i(s.sourceFilename||"采集数据"),1),t("div",Et,"任务 ID:"+i(s.taskId??"-"),1),t("div",At,"开始时间:"+i(W(s.startedAt||s.createdAt)),1),t("div",Dt,"结束时间:"+i(W(s.finishedAt)),1),s.resultFilename?(f(),v("div",Ft,i(s.resultFilename),1)):B("",!0),s.error?(f(),v("div",Ut,"错误:"+i(s.error),1)):B("",!0)]),t("div",$t,[t("span",{class:ne(["status",de(s)])},i(te(s)),3),s.resultId?(f(),v("button",{key:0,type:"button",class:"btn-delete",onClick:p=>se(s)},"删除",8,Bt)):B("",!0)])]))),128))])):(f(),v("div",Tt,"暂无历史记录"))])])])])]))}}),Mt=Pe(Rt,[["__scopeId","data-v-421c638b"]]);xe(Mt).use(Ee).mount("#app");