import{d as es,o as ts,L as ss,a as i,c,b as C,B as as,e as n,w as ct,u as dt,aQ as ns,f as y,F as $,x as fe,r as pe,t as v,ac as os,ad as ls,ae as z,af as rs,ag as us,ah as vt,n as _e,aj as is,g as f,h as q,i as te,E as r,aR as cs,aS as ds,aT as vs,aU as fs,aV as ps,aW as ms,aX as hs,aY as ys,aZ as ks,a_ as ft,a$ as gs,b0 as ws,b1 as _s,b2 as bs,b3 as Is,U as Ss,b4 as Cs,b5 as Ts,b6 as Ns,b7 as pt,_ as Es,q as Ps,s as As}from"./pywebview-3bFwh9Cg.js";/* empty css */import{e as Rs}from"./brand-D__LhhPM.js";import{c as xs}from"./categorized-timers-JPA-olTr.js";const Ls={class:"page-shell module-page"},Ds={class:"main-content"},Ms={class:"left-panel"},$s={class:"mode-zone"},Fs={class:"mode-check-row"},Us=["checked"],Bs={class:"mode-check-row"},Os=["checked"],qs={class:"mode-zone"},js={class:"mode-check-row"},Js={class:"mode-check-row"},Ks={key:0,class:"loop-round-input"},Vs={class:"upload-zone"},Ws={class:"selected-files clean-placeholder"},Hs={key:1,class:"text-muted"},zs={class:"input-zone"},Gs={class:"input-row"},Qs=["disabled"],Xs={key:0,class:"empty-candidates"},Ys={key:1,class:"candidate-table-scroll"},Zs=["onClick"],ea={class:"country-pref-checks"},ta=["checked","disabled","onChange"],sa={class:"country-check-text"},aa={key:0,class:"country-order-panel"},na={class:"country-order-list"},oa=["onDragstart","onDrop"],la={class:"country-drag-label"},ra={key:1,class:"country-pref-status"},ua={key:3,class:"mode-status-bar"},ia={class:"run-row"},ca=["disabled"],da=["disabled"],va={key:4,class:"loop-status-card"},fa={class:"loop-status-line"},pa={class:"loop-status-line"},ma={class:"loop-status-line"},ha={class:"loop-status-line"},ya={key:0,class:"loop-status-line loop-error"},ka=["disabled"],ga={key:5,class:"queue-debug-card"},wa={class:"queue-debug-line"},_a={key:0,class:"queue-debug-payload"},ba={class:"right-panel"},Ia={class:"task-list-wrap"},Sa={class:"clean-result-summary pr-summary"},Ca={class:"summary-card"},Ta={class:"summary-card"},Na={class:"summary-card"},Ea={class:"summary-card"},Pa={key:0,class:"empty-tasks narrow"},Aa=["onClick"],Ra={class:"result-list-wrap"},xa={key:0,class:"empty-tasks"},La={key:0,class:"result-subsection"},Da={class:"task-list clean-result-list"},Ma={class:"left split-result-main"},$a={key:0,class:"files"},Fa=["title"],Ua={class:"files"},Ba={key:1,class:"files"},Oa={key:2,class:"files"},qa={class:"task-right split-result-actions"},ja=["onClick"],Ja=["onClick"],Ka={key:1,class:"result-subsection"},Va={class:"task-list clean-result-list"},Wa={class:"left split-result-main"},Ha={key:0,class:"files"},za=["title"],Ga={class:"files"},Qa={key:1,class:"files"},Xa={key:2,class:"files"},Ya={class:"task-right split-result-actions"},Za=["onClick"],en=["onClick"],tn=es({__name:"BrandPriceTrackTab",setup(an){const be=[{code:"DE",label:"德国"},{code:"UK",label:"英国"},{code:"FR",label:"法国"},{code:"IT",label:"意大利"},{code:"ES",label:"西班牙"}],se=f(""),Ie=f([]),qe=f([]),I=f([]),me=f(!1),he=f(!1),j=f(!1),Se=f(!1),je=f(!1),p=f(""),G=f(""),Ce=f({}),J=f("FINITE"),ye=f(1),m=f(null),k=f(null),Te=f(!1),ae=f(!1),A=f(!0),S=f(!1),R=f([]),ne=f([]),Ne=q(()=>A.value||S.value),mt=q(()=>{const e=k.value?.status||"";return e==="SUCCESS"||e==="FAILED"||e==="STOPPED"}),Ee=q(()=>!!m.value&&!mt.value),ht=q(()=>{const e=k.value;if(!e)return"";const t=e.currentRound||1;if(e.executionMode==="INFINITE")return`第 ${t} 轮(无限)`;const s=Math.max(1,e.targetRounds||ye.value||1);return`第 ${t}/${s} 轮`}),g=f(["DE","UK","FR","IT","ES"]),oe=f(null),Pe=f(!1),Je=f(!1);let Q=null;const le=f({candidateCount:0,processedTaskCount:0,successTaskCount:0,failedTaskCount:0}),K=f([]),w=f([]),N=f({}),_=f({}),L=f(null),Ae=f(!1);let b=!1;const x=xs("price-track");function X(e){return b?Promise.resolve():x.sleep("queue-wait",e)}function yt(){x.clearCategory("queue-wait")}function re(){return typeof window<"u"&&window.localStorage.getItem("uid")||"0"}function Ke(){return`price-track:tasks:${re()}`}function Ve(){return`price-track:task-status:${re()}`}function We(){return`price-track:tasks-batch-snapshot:${re()}`}function He(){return`price-track:matched-items:${re()}`}function ze(){return`price-track:active-loop:${re()}`}function ue(e,t,s){if(!(typeof window>"u"))try{s?window.localStorage.removeItem(e):window.localStorage.setItem(e,JSON.stringify(t))}catch{}}function kt(){try{const e=typeof window<"u"?window.localStorage.getItem(Ke()):null;if(!e){w.value=[];return}const t=JSON.parse(e);w.value=Array.isArray(t)?t.filter(s=>typeof s=="number"&&s>0):[]}catch{w.value=[]}}function Ge(){ue(Ke(),w.value,w.value.length===0)}function gt(){try{const e=typeof window<"u"?window.localStorage.getItem(Ve()):null;if(!e)return;const t=JSON.parse(e),s={};for(const[l,o]of Object.entries(t)){const u=Number(l);u>0&&typeof o=="string"&&(s[u]=o)}N.value=s}catch{}}function ie(){ue(Ve(),N.value,Object.keys(N.value).length===0)}function wt(){try{const e=typeof window<"u"?window.localStorage.getItem(We()):null;if(!e)return;const t=JSON.parse(e),s={};for(const[l,o]of Object.entries(t)){const u=Number(l);u>0&&o&&typeof o=="object"&&(s[u]=o)}_.value=s}catch{}}function ce(){ue(We(),_.value,Object.keys(_.value).length===0)}function _t(){try{const e=typeof window<"u"?window.localStorage.getItem(He()):null;if(!e)return;const t=JSON.parse(e);Array.isArray(t)&&(I.value=t)}catch{}}function ke(){ue(He(),I.value,I.value.length===0)}function bt(){try{const e=typeof window<"u"?window.localStorage.getItem(ze()):null;if(!e){m.value=null;return}const t=Number(JSON.parse(e));m.value=Number.isFinite(t)&&t>0?t:null}catch{m.value=null}}function Y(){ue(ze(),m.value,!m.value)}async function It(){const e=te();if(e?.select_files){const t=await e.select_files({filters:[{name:"Excel/CSV",extensions:"xlsx,xls,csv"}],multiple:!0});t?.paths?.length&&(R.value=t.paths,ne.value=await Re(t.paths),r.success(`已选择 ${t.paths.length} 个ASIN文件`));return}if(e?.select_brand_xlsx_files){const t=await e.select_brand_xlsx_files();if(!t?.length)return;R.value=t,ne.value=await Re(t),r.success(`已选择 ${t.length} 个ASIN文件`);return}r.warning("当前环境不支持文件选择,请在本地客户端中打开")}async function St(){const e=te();if(!e?.select_brand_folder){r.warning("当前环境不支持文件夹选择,请在本地客户端中打开");return}try{const t=await e.select_brand_folder();if(!t)return;const s=await Rs(t);if(!s.success||!s.items?.length){r.warning(s.error||"该文件夹下没有可用的 xlsx 文件");return}R.value=s.items.map(l=>l.relativePath||l.absolutePath),ne.value=await Re(s.items),r.success(`已选择文件夹内 ${s.items.length} 个ASIN文件`)}catch(t){r.error(t instanceof Error?t.message:"选择失败")}}async function Re(e){const t=te();if(!t?.upload_file_to_java)return[];const s=[];for(const l of e){const o=typeof l=="string"?l:l.absolutePath,u=typeof l=="string"?void 0:l.relativePath,a=await t.upload_file_to_java(o,u);if(!a?.success||!a.data)throw new Error(a?.error||a?.message||`上传失败:${o}`);s.push(a.data)}return s}function xe(){return ne.value.length?ne.value.map(e=>e.localPath).filter(e=>!!e):R.value}function ge(){return S.value?be.map(e=>e.code):[...g.value]}function Le(e){A.value=e==="status",S.value=e==="asin"}function Qe(e){return be.find(s=>s.code===e)?.label??e}const Ct=q(()=>{const e=g.value,t=new Set(e),s=e.map(o=>({code:o,label:Qe(o)})),l=be.filter(o=>!t.has(o.code)).map(o=>({code:o.code,label:o.label}));return[...s,...l]});function Tt(e){return g.value.includes(e)}function Xe(e){return g.value.length===1&&g.value[0]===e}function Nt(e,t){const s=t.target;if(s){if(!s.checked&&Xe(e)){s.checked=!0,r.warning("至少保留 1 个国家");return}Et(e,s.checked)}}function Et(e,t){if(Je.value=!0,t)g.value.includes(e)||(g.value=[...g.value,e]);else{if(g.value.length<=1){r.warning("至少保留 1 个国家");return}g.value=g.value.filter(s=>s!==e)}Ye()}function Pt(e){oe.value=e}function At(){oe.value=null}function Rt(e){const t=oe.value;if(oe.value=null,t==null||t===e)return;Je.value=!0;const s=[...g.value],[l]=s.splice(t,1);s.splice(e,0,l),g.value=s,Ye()}function Ye(){Q&&x.clearTimer("preference-save",Q),Q=x.setTimeout("preference-save",()=>{Q=null,xt()},450)}async function xt(){if(!(g.value.length<1)){Pe.value=!0;try{await cs(g.value)}catch(e){r.error(e instanceof Error?e.message:"保存国家顺序失败")}finally{Pe.value=!1}}}async function Lt(){try{const e=await ds();e?.countryCodes?.length&&(g.value=[...e.countryCodes])}catch{}}async function De(){try{Ie.value=await vs()}catch(e){r.error(e instanceof Error?e.message:"加载备选失败")}}async function D(){try{le.value=await fs()}catch{}}async function F(){try{const e=await ps();K.value=e.items||[]}catch{K.value=[]}}function U(){for(const e of[...w.value])!K.value.some(s=>s.taskId===e)&&!_.value[e]&&W(e)}function Dt(e){qe.value=e||[]}async function Ze(){const e=se.value.trim();if(!e){r.warning("请输入店铺名称");return}me.value=!0;try{await ms(e),se.value="",await De(),r.success("已加入备选")}catch(t){r.error(t instanceof Error?t.message:"保存失败")}finally{me.value=!1}}async function Mt(e){try{await hs(e.id),await De(),I.value=[],ke(),r.success("已删除")}catch(t){r.error(t instanceof Error?t.message:"删除失败")}}function $t(){const e=new Set,t=se.value.trim();t&&e.add(t);for(const s of qe.value)s?.shopName?.trim()&&e.add(s.shopName.trim());if(S.value)for(const s of R.value){const l=(s||"").trim();if(!l)continue;const u=(l.split(/[/\\]/).filter(Boolean).pop()||"").replace(/\.[^.]+$/,"").trim();u&&e.add(u)}return[...e]}async function Ft(){const e=$t();if(!e.length){r.warning("请勾选备选店铺,或在输入框中填写店名");return}if(S.value&&!R.value.length){r.warning("请先选择 ASIN 文件");return}he.value=!0;try{const t=await ys(e,{asinFiles:S.value?xe():[],countryCodes:ge()}),s=t.items||[];Ce.value=t.asinRowsByCountry||{};const l=new Map(I.value.map(o=>[(o.shopName||"").trim(),o]));for(const o of s)l.set((o.shopName||"").trim(),o);I.value=[...l.values()],ke(),je.value&&Kt(),r.success(`匹配 ${s.length} 个店铺`)}catch(t){r.error(t instanceof Error?t.message:"匹配失败")}finally{he.value=!1}}function Ut(e){const t=(e||"").trim();return{MATCHED:"已匹配",PENDING:"待匹配",CONFLICT:"需人工确认",INDEX_STALE:"索引过期"}[t]||t||"—"}function Bt(e){const t=(e.matchMessage||"").trim();return t||(e.matched&&e.matchStatus==="MATCHED"?"紫鸟索引已命中,可推送队列":e.matched?"已关联索引,请结合状态列查看是否可推送":"未命中或未就绪,请检查店铺名与索引刷新")}function Me(e){return`${(e.shopName||"").trim()}${e.shopId??""}`}function et(e){const t=e instanceof Error?e.message:String(e||"");return/记录不存在|不存在|已删除|not\s*found|404/i.test(t)}function Ot(){const e=A.value&&!S.value;return{enabled:e,mode:e?"DELETE_WHEN_PRICE_BELOW_MINIMUM":"NONE",deleteWhenPriceBelowMinimum:e,compareField:"price",thresholdField:"minimumPrice",target:"skip_asin",source:"frontend-price-track"}}function V(e){if(!e.length)return;const t=new Set(e.map(l=>Me(l))),s=new Set(e.map(l=>(l.shopName||"").trim()).filter(l=>!!l));I.value=I.value.filter(l=>{const o=Me(l),u=(l.shopName||"").trim();return!t.has(o)&&(!u||!s.has(u))}),ke()}function qt(e){K.value=K.value.filter(t=>!(e.resultId!=null&&t.resultId===e.resultId||e.taskId!=null&&t.taskId===e.taskId))}async function jt(e){const t=[...I.value];V([e]);const s=(e.shopName||"").trim();if(!s){r.success("已从匹配结果中移除");return}try{(await ks(s))?.removed&&(await F(),await D(),U()),r.success("已从匹配结果中移除")}catch(l){if(et(l)){await F(),await D(),U(),r.success("后端记录已不存在,已同步移除本地记录");return}I.value=t,ke(),r.error(l instanceof Error?l.message:"同步后端失败")}}function tt(e,t){const s=e.items?.[0],l=(t.shopName||"").trim(),o=t.skipAsins||e.skipAsinsByCountry||{},u=e.skipAsinDetailsByCountry||{},a=e.minimumPriceByCountryAndAsin||{},d=Ot(),T=s?.resultId??null,O=s?.loopRunId??null,ee=s?.roundIndex??null,h=s?.taskStatus||"RUNNING",M=s?.success??!1,E=s?.error||null,P=s?.outputFilename||null,H=s?.downloadUrl||null;return{type:"price-track-run",ts:Date.now(),data:{task_id:e.taskId,result_id:T,shop_name:l,shop_id:t.shopId??null,platform:t.platform||"",company_name:t.companyName||"",shop_mall_name:t.shopMallName||"",matched:!!t.matched,match_status:t.matchStatus||"",match_message:t.matchMessage||null,success:M,error:E,output_filename:P,download_url:H,task_status:h,loop_run_id:O,round_index:ee,country_codes:ge(),mode:A.value?"status":"asin",skip_asins:o,skip_asins_by_country:o,skip_asin_details_by_country:u,minimum_price_by_country_and_asin:a,skip_asin_delete_policy:d,delete_skip_asin_when_price_below_minimum:d.deleteWhenPriceBelowMinimum,deleteSkipAsinWhenPriceBelowMinimum:d.deleteWhenPriceBelowMinimum,asin_rows_by_country:Object.keys(Ce.value).length?Ce.value:e.asinRowsByCountry||{},taskId:e.taskId,resultId:T,shopName:l,shopId:t.shopId??null,platformName:t.platform||"",companyName:t.companyName||"",shopMallName:t.shopMallName||"",matchStatus:t.matchStatus||"",matchMessage:t.matchMessage||null,outputFilename:P,downloadUrl:H,taskStatus:h,loopRunId:O,roundIndex:ee}}}async function st(e){let t=0;const s=30;for(;;){if(b)return"STOPPED";try{const l=await pt([e]);if(t>0&&(p.value=`任务 ${e} 后端已恢复,继续等待执行结果...`),t=0,(l.missingTaskIds||[]).includes(e))return W(e),await F(),await D(),U(),"FAILED";const o=(l.items||[]).find(a=>a.task?.id===e),u=o?.task?.status||"";if(o){const a=_.value[e];_.value={..._.value,[e]:a?{...a,task:{...a.task||{},...o.task||{}}}:o},ce()}if(u&&(N.value={...N.value,[e]:u},ie()),u==="SUCCESS"||u==="FAILED")return W(e),await F(),await D(),U(),u}catch(l){const o=(l instanceof Error?l.message:String(l||"")).toLowerCase();if(!["无法连接到后端服务","bad gateway","gateway timeout","network error","timeout","502","503","504"].some(a=>o.includes(a.toLowerCase())))throw l;if(t+=1,t>=s)throw new Error(`任务 ${e} 等待后端恢复超时,请稍后手动刷新查看状态`);p.value=`任务 ${e} 运行中,正在等待后端服务恢复(${t}/${s})...`,(t===1||t%5===0)&&r.warning(`任务 ${e} 运行中,后端服务暂时不可用,正在自动重试`),await X(B());continue}await X(B())}}function Jt(){return I.value.find(e=>e.matched)}async function Kt(){if(b||Se.value)return;if(!Ne.value){r.warning("请至少选择一个跟价模式");return}if(S.value&&!R.value.length){r.warning("请先选择 ASIN 文件");return}const e=te();if(!e?.enqueue_json){r.error("当前环境未启用 pywebview enqueue_json");return}if(!I.value.filter(o=>o.matched).length){r.warning("无可用匹配店铺");return}Se.value=!0,j.value=!0,G.value="";let s=0,l=0;try{let o=0;for(;!b&&je.value;){const u=Jt();if(!u)break;o+=1;try{let a=0;const d=await(async()=>{for(;;){if(b)throw new Error("component disposed");try{return await ft({userId:0,statusMode:A.value,asinMode:S.value,items:[u],asinFiles:xe(),countryCodes:ge()})}catch(h){const M=(h instanceof Error?h.message:String(h||"")).toLowerCase(),E=["无法连接到后端服务","bad gateway","gateway timeout","network error","timeout","502","503","504"].some(P=>M.includes(P.toLowerCase()));if(a+=1,!E||a>=10)throw h;p.value="后端服务暂时不可用,正在重试创建任务("+a+"/10)...",await X(B())}}})();_.value={..._.value,[d.taskId]:{task:{id:d.taskId,status:"RUNNING"},items:d.items}},N.value={...N.value,[d.taskId]:"RUNNING"},ce(),ie();const T=tt(d,u);G.value=JSON.stringify(T,null,2);const O=await e.enqueue_json(T);if(!O?.success){l+=1,p.value="任务 "+d.taskId+" 推送失败,已自动继续下一条:"+(O?.error||"未知错误"),r.error(p.value),V([u]);continue}if(we(d.taskId),Z(!0),V([u]),p.value="任务 "+d.taskId+" 已入队,等待执行完成",await st(d.taskId)!=="SUCCESS"){l+=1,p.value="任务 "+d.taskId+" 执行失败,已自动继续下一条",r.error(p.value);continue}s+=1,p.value="任务 "+d.taskId+" 已完成"}catch(a){if(b)break;l+=1,p.value="第 "+o+" 条任务处理失败,已自动继续下一条:"+(a instanceof Error?a.message:"未知错误"),r.error(p.value),V([u]);continue}}(s>0||l>0)&&r.success("店铺任务推送已完成:成功 "+s+" 条,失败 "+l+" 条")}catch(o){if(b)return;p.value=o instanceof Error?o.message:"推送异常",r.error(p.value)}finally{Se.value=!1,j.value=!1}}function de(e){k.value=e,m.value=e?.id??null,Y()}function ve(){if(!k.value)return;const e=k.value.status||"";(e==="SUCCESS"||e==="FAILED"||e==="STOPPED")&&(k.value=null,m.value=null,Y())}async function $e(){if(!m.value)return null;try{const e=await gs(m.value);return de(e),ve(),k.value}catch(e){const t=(e instanceof Error?e.message:String(e||"")).toLowerCase();return["无法连接到后端服务","bad gateway","gateway timeout","network error","timeout","502","503","504"].some(l=>t.includes(l.toLowerCase()))?k.value:(k.value=null,m.value=null,Y(),null)}}function Vt(e){_.value={..._.value,[e.taskId]:{task:{id:e.taskId,status:"RUNNING"},items:e.items}},N.value={...N.value,[e.taskId]:"RUNNING"},ce(),ie()}async function Wt(){if(!(!m.value||ae.value)){ae.value=!0;try{const e=await ws(m.value);de(e),ve(),r.success(e.status==="STOPPED"?"循环已停止":"已请求停止,当前子任务完成后将收尾")}catch(e){r.error(e instanceof Error?e.message:"停止循环失败")}finally{ae.value=!1}}}async function Fe(e){if(b||Te.value||(e&&m.value!==e&&(m.value=e,Y()),!m.value))return;const t=te();if(!t?.enqueue_json)throw new Error("当前环境未启用 pywebview enqueue_json");Te.value=!0;try{for(;!b&&m.value;){const s=await $e();if(!s||s.status==="SUCCESS"||s.status==="FAILED"||s.status==="STOPPED")break;if(s.activeTaskId){const h=s.activeTaskId;we(h),Z(!0);const M=await st(h);let E=0;const P=await(async()=>{for(;;){if(b)throw new Error("component disposed");try{return await _s(s.id,h)}catch(H){const Xt=(H instanceof Error?H.message:String(H||"")).toLowerCase(),Yt=["无法连接到后端服务","bad gateway","gateway timeout","network error","timeout","502","503","504"].some(Zt=>Xt.includes(Zt.toLowerCase()));if(E+=1,!Yt||E>=10)throw H;p.value=`循环任务 ${s.id} 等待后端恢复后确认子任务完成(${E}/10)...`,await X(B())}}})();if(de(P),await F(),await D(),U(),ve(),M!=="SUCCESS")throw new Error(P.errorMessage||`任务 ${s.activeTaskId} 执行失败`);continue}let l=0;const o=await(async()=>{for(;;){if(b)throw new Error("component disposed");try{return await bs(s.id)}catch(h){const M=(h instanceof Error?h.message:String(h||"")).toLowerCase(),E=["无法连接到后端服务","bad gateway","gateway timeout","network error","timeout","502","503","504"].some(P=>M.includes(P.toLowerCase()));if(l+=1,!E||l>=10)throw h;p.value=`循环任务 ${s.id} 等待后端恢复后继续派发(${l}/10)...`,await X(B())}}})();if(de(o.loopRun||s),!o.childTaskRequest){ve();break}const u=o.childTaskRequest,a=u.items?.[0];if(!a)throw new Error("循环任务缺少待执行店铺");let d=0;const T=await(async()=>{for(;;){if(b)throw new Error("component disposed");try{return await ft(u)}catch(h){const M=(h instanceof Error?h.message:String(h||"")).toLowerCase(),E=["无法连接到后端服务","bad gateway","gateway timeout","network error","timeout","502","503","504"].some(P=>M.includes(P.toLowerCase()));if(d+=1,!E||d>=10)throw h;p.value=`循环任务 ${s.id} 等待后端恢复后重试创建子任务(${d}/10)...`,await X(B())}}})();Vt(T);const O=tt(T,a);G.value=JSON.stringify(O,null,2);const ee=await t.enqueue_json(O);if(!ee?.success)throw new Error(ee?.error||`任务 ${T.taskId} 推送失败`);we(T.taskId),Z(!0),V([a]),p.value=`循环任务 ${s.id} 第 ${o.childTaskRequest.roundIndex||1} 轮已推送:${a.shopName||T.taskId}`}}finally{Te.value=!1}}async function Ht(){if(Ee.value){try{await Fe(m.value||void 0)}catch(t){t instanceof Error&&/子任务不存在|循环任务不存在|404/.test(t.message)&&(k.value=null,m.value=null,Y());const s=t instanceof Error?t.message:"循环执行失败";p.value=s,r.error(s)}return}if(!Ne.value){r.warning("请至少选择一个跟价模式");return}if(S.value&&!R.value.length){r.warning("请先选择 ASIN 文件");return}const e=I.value.filter(t=>t.matched);if(!e.length){r.warning("请先匹配可用店铺");return}j.value=!0,G.value="";try{const t=await Is({userId:0,statusMode:A.value,asinMode:S.value,items:e,asinFiles:xe(),countryCodes:ge(),executionMode:J.value,targetRounds:J.value==="FINITE"?Math.max(1,Number(ye.value)||1):void 0});de(t),p.value=`循环任务 ${t.id} 已创建`,await Fe(t.id),ve(),m.value||r.success("跟价循环已启动")}catch(t){const s=t instanceof Error?t.message:"启动循环失败";p.value=s,r.error(s)}finally{j.value=!1}}function B(){return Ss()}async function zt(){const e=w.value.filter(t=>t>0);if(e.length)try{const t=await pt(e);let s=!1;const l={..._.value};for(const o of t.missingTaskIds||[])W(o),delete l[o];for(const o of t.items||[]){const u=o.task?.id,a=o.task?.status;if(typeof u!="number"||u<=0)continue;const d=l[u];l[u]=d?{...d,task:{...d.task||{},...o.task||{}}}:o,a&&(N.value[u]=a,(a==="SUCCESS"||a==="FAILED")&&(W(u),s=!0))}_.value=l,ce(),ie(),await F(),U(),s&&await D()}catch{}}function Z(e=!1){if(b)return;if(L.value){if(!e)return;x.clearTimer("task-poll",L.value),L.value=null}const t=async()=>{if(L.value=null,!b){if(Ae.value){Z();return}if(w.value.length){Ae.value=!0;try{await zt()}finally{Ae.value=!1}!b&&w.value.length>0&&(L.value=x.setTimeout("task-poll",t,B()))}}};e?t():L.value=x.setTimeout("task-poll",t,B())}function Gt(){L.value&&(x.clearTimer("task-poll",L.value),L.value=null)}function we(e){w.value.includes(e)||(w.value=[...w.value,e],Ge())}function W(e){if(w.value=w.value.filter(t=>t!==e),Ge(),delete N.value[e],ie(),_.value[e]){const t={..._.value};delete t[e],_.value=t,ce()}}const Ue=q(()=>{const e=K.value.filter(s=>s.taskId&&w.value.includes(s.taskId)&&!nt(s.taskId)),t=new Set(e.map(s=>s.taskId).filter(s=>typeof s=="number"));for(const s of w.value){if(t.has(s))continue;const l=_.value[s]?.items?.[0];l&&e.push(l)}return e}),Be=q(()=>K.value.filter(e=>!e.taskId||!w.value.includes(e.taskId)||nt(e.taskId))),Qt=q(()=>Ue.value.length>0||Be.value.length>0);function at(e){return e&&(N.value[e]||_.value[e]?.task?.status)||""}function nt(e){const t=at(e);return t==="SUCCESS"||t==="FAILED"}function Oe(e){const t=e.taskId;return t?at(t)||e.taskStatus||"":e.taskStatus||""}function ot(e){const t=Oe(e);return t==="SUCCESS"?"已完成":t==="FAILED"?"失败":t==="RUNNING"?"执行中":e.success?"已完成":"等待中"}function lt(e){const t=Oe(e);return t==="SUCCESS"||e.success?"success":t==="FAILED"?"failed":"running"}function rt(e){return!e.resultId||!e.fileReady&&!e.downloadUrl?!1:Oe(e)==="SUCCESS"||e.success===!0}async function ut(e){if(!e.resultId)return;const t=te(),s=e.outputFilename||`${e.shopName||"result"}.xlsx`;if(!t?.save_file_from_url_new){r.error("当前客户端未提供 save_file_from_url_new,无法下载文件");return}const l=Cs(e.resultId),o=await t.save_file_from_url_new(l,s);o.success?r.success(`已保存:${o.path||s}`):o.error&&o.error!=="用户取消"&&r.error(o.error)}async function it(e){try{e.resultId!=null?await Ts(e.resultId):e.taskId!=null&&await Ns(e.taskId),k.value&&(e.loopRunId!=null&&e.loopRunId===k.value.id||e.taskId!=null&&e.taskId===k.value.activeTaskId)&&await $e(),e.taskId!=null&&W(e.taskId),V([e]),await F(),await D(),U(),r.success("已删除")}catch(t){if(et(t)){e.taskId!=null&&W(e.taskId),V([e]),qt(e),await D(),U(),r.success("后端记录已不存在,已同步移除本地记录");return}r.error(t instanceof Error?t.message:"删除失败")}}return ts(()=>{!A.value&&!S.value&&Le("status"),kt(),gt(),wt(),_t(),bt(),De().catch(()=>{}),Lt().catch(()=>{}),F().catch(()=>{}),D().catch(()=>{}),w.value.length&&Z(!0),m.value&&$e().then(e=>{e?.activeTaskId&&(we(e.activeTaskId),Z(!0)),e&&e.status!=="SUCCESS"&&e.status!=="FAILED"&&e.status!=="STOPPED"&&Fe(e.id)}).catch(()=>{m.value=null,Y()})}),ss(()=>{b=!0,Gt(),yt(),x.clearScope(),Q&&x.clearTimer("preference-save",Q)}),(e,t)=>{const s=ns,l=ls,o=rs,u=us;return i(),c("div",Ls,[C(as,{active:"pricing"}),n("div",Ds,[n("aside",Ms,[t[27]||(t[27]=n("div",{class:"section-title"},"跟价模式",-1)),n("div",$s,[n("label",Fs,[n("input",{type:"radio",name:"price-track-mode",class:"mode-check-input",checked:A.value,onChange:t[0]||(t[0]=a=>Le("status"))},null,40,Us),t[7]||(t[7]=n("span",{class:"mode-check-text"},"按商品状态(全量)",-1)),t[8]||(t[8]=n("span",{class:"mode-hint-inline"},"— 获取店铺所有在售ASIN跑跟价",-1))]),n("label",Bs,[n("input",{type:"radio",name:"price-track-mode",class:"mode-check-input",checked:S.value,onChange:t[1]||(t[1]=a=>Le("asin"))},null,40,Os),t[9]||(t[9]=n("span",{class:"mode-check-text"},"按指定ASIN文档(自定义)",-1)),t[10]||(t[10]=n("span",{class:"mode-hint-inline"},"— 上传ASIN表格,按文档内ASIN跑跟价",-1))])]),t[28]||(t[28]=n("div",{class:"section-title"},"执行配置",-1)),n("div",qs,[n("label",js,[ct(n("input",{"onUpdate:modelValue":t[2]||(t[2]=a=>J.value=a),type:"radio",class:"mode-check-input",value:"FINITE"},null,512),[[dt,J.value]]),t[11]||(t[11]=n("span",{class:"mode-check-text"},"执行固定轮次",-1)),t[12]||(t[12]=n("span",{class:"mode-hint-inline"},"按整批店铺重复执行指定次数",-1))]),n("label",Js,[ct(n("input",{"onUpdate:modelValue":t[3]||(t[3]=a=>J.value=a),type:"radio",class:"mode-check-input",value:"INFINITE"},null,512),[[dt,J.value]]),t[13]||(t[13]=n("span",{class:"mode-check-text"},"无限执行",-1)),t[14]||(t[14]=n("span",{class:"mode-hint-inline"},"上一轮全部成功后立即开始下一轮",-1))]),J.value==="FINITE"?(i(),c("div",Ks,[t[15]||(t[15]=n("span",{class:"hint"},"轮次",-1)),C(s,{modelValue:ye.value,"onUpdate:modelValue":t[4]||(t[4]=a=>ye.value=a),min:1,max:9999,disabled:Ee.value||j.value},null,8,["modelValue","disabled"])])):y("",!0)]),S.value?(i(),c($,{key:0},[t[17]||(t[17]=n("div",{class:"section-title"},[fe("ASIN文档 "),n("span",{class:"tag-badge"},"自定义模式")],-1)),n("div",Vs,[t[16]||(t[16]=n("div",{class:"hint"},"上传包含ASIN的表格文件,按文档内的ASIN进行跟价。",-1)),n("div",{class:"btns"},[n("button",{type:"button",class:"opt-btn",onClick:It},"选择ASIN文件"),n("button",{type:"button",class:"opt-btn",onClick:St},"选择文件夹")]),n("div",Ws,[R.value.length?(i(!0),c($,{key:0},pe(R.value,(a,d)=>(i(),c("span",{key:d},v(a),1))),128)):(i(),c("span",Hs,"暂未选择"))])])],64)):y("",!0),A.value?(i(),c($,{key:1},[t[19]||(t[19]=n("div",{class:"section-title"},"店铺名称",-1)),n("div",zs,[t[18]||(t[18]=n("div",{class:"hint"},"输入店铺名后点「确认」加入下方备选区。可同时配合上方模式使用。",-1)),n("div",Gs,[C(l,{modelValue:se.value,"onUpdate:modelValue":t[5]||(t[5]=a=>se.value=a),clearable:"",placeholder:"请输入店铺名称",onKeyup:os(Ze,["enter"])},null,8,["modelValue"]),n("button",{type:"button",class:"opt-btn",disabled:me.value,onClick:Ze},v(me.value?"保存中…":"确认"),9,Qs)])]),t[20]||(t[20]=n("div",{class:"section-title"},"备选店铺",-1)),Ie.value.length?(i(),c("div",Ys,[C(u,{data:Ie.value,"row-key":"id",height:"160",class:"candidate-table",onSelectionChange:Dt},{default:z(()=>[C(o,{type:"selection",width:"42"}),C(o,{prop:"shopName",label:"店铺名","min-width":"120","show-overflow-tooltip":""}),C(o,{label:"操作",width:"72",align:"center"},{default:z(({row:a})=>[n("button",{type:"button",class:"link-danger",onClick:d=>Mt(a)},"删除",8,Zs)]),_:1})]),_:1},8,["data"])])):(i(),c("div",Xs,"暂无备选店铺,请先输入并确认"))],64)):y("",!0),S.value?y("",!0):(i(),c($,{key:2},[t[23]||(t[23]=n("div",{class:"section-title"},"处理国家与顺序",-1)),t[24]||(t[24]=n("p",{class:"hint country-pref-hint"}," 勾选需要处理的站点;拖拽调整顺序。设置会按当前登录用户保存。 ",-1)),n("div",ea,[(i(!0),c($,null,pe(Ct.value,a=>(i(),c("label",{key:a.code,class:"country-check-row"},[n("input",{type:"checkbox",class:"country-check-input",checked:Tt(a.code),disabled:Xe(a.code),onChange:d=>Nt(a.code,d)},null,40,ta),n("span",sa,v(a.label)+"("+v(a.code)+")",1)]))),128))]),g.value.length?(i(),c("div",aa,[t[22]||(t[22]=n("div",{class:"country-order-caption"},"已选顺序(拖拽 ⋮⋮ 调整)",-1)),n("div",na,[(i(!0),c($,null,pe(g.value,(a,d)=>(i(),c("div",{key:a,class:_e(["country-drag-row",{dragging:oe.value===d}]),draggable:"true",onDragstart:T=>Pt(d),onDragend:At,onDragover:t[6]||(t[6]=vt(()=>{},["prevent"])),onDrop:vt(T=>Rt(d),["prevent"])},[t[21]||(t[21]=n("span",{class:"drag-handle",title:"拖动排序"},"⋮⋮",-1)),n("span",la,v(Qe(a))+"("+v(a)+")",1)],42,oa))),128))])])):y("",!0),Pe.value?(i(),c("div",ra,"保存中…")):y("",!0)],64)),A.value?(i(),c("div",ua,[...t[25]||(t[25]=[n("span",{class:"mode-status-dot active"},null,-1),n("span",{class:"mode-status-text"},"商品状态模式:将在售(Active)ASIN纳入跟价,跳过ASIN由后台配置的店铺维度数据提供",-1)])])):y("",!0),n("div",ia,[n("button",{type:"button",class:"btn-run",disabled:he.value,onClick:Ft},v(he.value?"匹配中…":"匹配店铺"),9,ca),n("button",{type:"button",class:"btn-run btn-queue",disabled:j.value||!Ne.value,onClick:Ht},v(j.value?"推送中…":"推送到 Python 队列"),9,da)]),t[29]||(t[29]=n("p",{class:"loading-msg"},[fe("上传ASIN文档和多选店铺"),n("strong",null,"可同时生效"),fe(",跟价结果合并输出。全量和自定义的区别仅在于ASIN来源不同。")],-1)),k.value?(i(),c("div",va,[n("div",fa,"循环任务 ID:"+v(k.value.id),1),n("div",pa,"状态:"+v(k.value.status||"-"),1),n("div",ma,"进度:"+v(ht.value),1),n("div",ha,"当前店铺:"+v((k.value.currentShopIndex||0)+1)+"/"+v(k.value.totalShopCount||0),1),k.value.errorMessage?(i(),c("div",ya,v(k.value.errorMessage),1)):y("",!0),n("button",{type:"button",class:"opt-btn loop-stop-btn",disabled:!Ee.value||ae.value,onClick:Wt},v(ae.value?"停止中...":"停止循环"),9,ka)])):y("",!0),p.value?(i(),c("div",ga,[t[26]||(t[26]=n("div",{class:"section-title queue-debug-title"},"推送结果",-1)),n("div",wa,v(p.value),1),G.value?(i(),c("pre",_a,v(G.value),1)):y("",!0)])):y("",!0)]),n("section",ba,[t[38]||(t[38]=n("div",{class:"panel-header"},"匹配与任务",-1)),n("div",Ia,[n("div",Sa,[n("div",Ca,[t[30]||(t[30]=n("span",{class:"summary-label"},"备选店铺数",-1)),n("strong",null,v(le.value.candidateCount),1)]),n("div",Ta,[t[31]||(t[31]=n("span",{class:"summary-label"},"已结束任务",-1)),n("strong",null,v(le.value.processedTaskCount),1)]),n("div",Na,[t[32]||(t[32]=n("span",{class:"summary-label"},"成功任务",-1)),n("strong",null,v(le.value.successTaskCount),1)]),n("div",Ea,[t[33]||(t[33]=n("span",{class:"summary-label"},"失败任务",-1)),n("strong",null,v(le.value.failedTaskCount),1)])]),t[37]||(t[37]=n("div",{class:"subsection-title"},"匹配结果",-1)),I.value.length?(i(),is(u,{key:1,data:I.value,"row-key":Me,"highlight-current-row":!1,class:"result-table match-table"},{default:z(()=>[C(o,{prop:"shopName",label:"店铺名","min-width":"100"}),C(o,{label:"匹配",width:"72",align:"center"},{default:z(({row:a})=>[n("span",{class:_e(a.matched?"ok":"fail")},v(a.matched?"是":"否"),3)]),_:1}),C(o,{prop:"shopId",label:"店铺ID","min-width":"120","show-overflow-tooltip":""}),C(o,{prop:"platform",label:"平台",width:"88","show-overflow-tooltip":""}),C(o,{prop:"companyName",label:"公司","min-width":"100","show-overflow-tooltip":""}),C(o,{label:"状态",width:"100","show-overflow-tooltip":""},{default:z(({row:a})=>[fe(v(Ut(a.matchStatus)),1)]),_:1}),C(o,{label:"说明","min-width":"140","show-overflow-tooltip":""},{default:z(({row:a})=>[fe(v(Bt(a)),1)]),_:1}),C(o,{label:"操作",width:"72",align:"center"},{default:z(({row:a})=>[n("button",{type:"button",class:"link-danger",onClick:d=>jt(a)},"删除",8,Aa)]),_:1})]),_:1},8,["data"])):(i(),c("div",Pa,"完成「匹配店铺」后,在此展示紫鸟索引匹配结果,供核对后再推送队列。")),n("div",Ra,[t[36]||(t[36]=n("div",{class:"result-list-header"},[n("span",null,"处理记录")],-1)),Qt.value?(i(),c($,{key:1},[Ue.value.length?(i(),c("div",La,[t[34]||(t[34]=n("div",{class:"result-subsection-title"},"当前任务",-1)),n("ul",Da,[(i(!0),c($,null,pe(Ue.value,a=>(i(),c("li",{key:`cur-${a.resultId}-${a.taskId}`,class:"task-item split-result-item"},[n("div",Ma,[a.roundIndex?(i(),c("div",$a,"轮次:第 "+v(a.roundIndex)+" 轮",1)):y("",!0),n("span",{class:"id",title:a.shopName||""},v(a.shopName||"-"),9,Fa),n("div",Ua,"任务 ID:"+v(a.taskId??"-"),1),a.platform?(i(),c("div",Ba,"平台:"+v(a.platform),1)):y("",!0),a.error?(i(),c("div",Oa,"错误:"+v(a.error),1)):y("",!0)]),n("div",qa,[n("span",{class:_e(["status",lt(a)])},v(ot(a)),3),rt(a)?(i(),c("button",{key:0,type:"button",class:"download",onClick:d=>ut(a)}," 下载 ",8,ja)):y("",!0),n("button",{type:"button",class:"btn-delete",onClick:d=>it(a)},"删除",8,Ja)])]))),128))])])):y("",!0),Be.value.length?(i(),c("div",Ka,[t[35]||(t[35]=n("div",{class:"result-subsection-title"},"历史记录",-1)),n("ul",Va,[(i(!0),c($,null,pe(Be.value,a=>(i(),c("li",{key:`his-${a.resultId}-${a.taskId}`,class:"task-item split-result-item"},[n("div",Wa,[a.roundIndex?(i(),c("div",Ha,"轮次:第 "+v(a.roundIndex)+" 轮",1)):y("",!0),n("span",{class:"id",title:a.shopName||""},v(a.shopName||"-"),9,za),n("div",Ga,"任务 ID:"+v(a.taskId??"-"),1),a.outputFilename?(i(),c("div",Qa,"文件:"+v(a.outputFilename),1)):y("",!0),a.error?(i(),c("div",Xa,"错误:"+v(a.error),1)):y("",!0)]),n("div",Ya,[n("span",{class:_e(["status",lt(a)])},v(ot(a)),3),rt(a)?(i(),c("button",{key:0,type:"button",class:"download",onClick:d=>ut(a)}," 下载 ",8,Za)):y("",!0),n("button",{type:"button",class:"btn-delete",onClick:d=>it(a)},"删除",8,en)])]))),128))])])):y("",!0)],64)):(i(),c("div",xa,"暂无处理记录。推送队列并等待 Python 回传后,将在此显示下载链接。"))])])])])])}}}),sn=Es(tn,[["__scopeId","data-v-08a3fd7b"]]);Ps(sn).use(As).mount("#app");