Files
crawler-plugin/new_web_source/assets/product-risk.js
2026-04-28 21:42:30 +08:00

2 lines
22 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import{d as he,o as pe,L as ye,a as c,c as d,b as k,B as ge,e as n,a5 as ke,a6 as me,t as f,V as I,W as we,X as _e,x as C,F as D,r as B,a7 as Mt,n as W,f as _,a8 as be,U as Lt,a9 as Se,aa as Ie,g as v,h as z,E as u,ab as Ce,ac as Te,ad as Pe,ae as Ee,af as Ne,ag as Re,ah as De,ai as $e,aj as Ot,ak as Fe,al as Me,am as Le,i as Ut,an as Oe,ao as Ue,T as Ae,_ as xe,q as Be,s as qe}from"./pywebview-C66x_2Dh.js";/* empty css */import{L as Ve}from"./listingFilters-BpGOU_pJ.js";/* empty css */const Ke={class:"page-shell module-page"},je={class:"main-content"},He={class:"left-panel"},Je={class:"input-zone"},Ge={class:"input-row"},Qe=["disabled"],We={key:0,class:"empty-candidates"},ze={key:1,class:"candidate-table-scroll"},Xe=["onClick"],Ye={class:"country-pref-checks"},Ze=["checked","disabled","onChange"],ts={class:"country-check-text"},es={key:2,class:"country-order-panel"},ss={class:"country-order-list"},as=["onDragstart","onDrop"],ns={class:"country-drag-label"},os={key:3,class:"country-pref-status"},ls={class:"listing-filter-row"},rs={class:"run-row"},us=["disabled"],is=["disabled"],cs={key:4,class:"queue-debug-card"},ds={class:"queue-debug-line"},fs={key:0,class:"queue-debug-payload"},vs={class:"right-panel"},hs={class:"task-list-wrap"},ps={class:"clean-result-summary pr-summary"},ys={class:"summary-card"},gs={class:"summary-card"},ks={class:"summary-card"},ms={class:"summary-card"},ws={key:0,class:"empty-tasks narrow"},_s=["onClick"],bs={class:"result-list-wrap"},Ss={key:0,class:"empty-tasks"},Is={key:0,class:"result-subsection"},Cs={class:"task-list clean-result-list"},Ts={class:"left split-result-main"},Ps=["title"],Es={class:"files"},Ns={key:0,class:"files"},Rs={key:1,class:"files"},Ds={class:"task-right split-result-actions"},$s=["onClick"],Fs=["onClick"],Ms={key:1,class:"result-subsection"},Ls={class:"task-list clean-result-list"},Os={class:"left split-result-main"},Us=["title"],As={class:"files"},xs={key:0,class:"files"},Bs={key:1,class:"files"},qs={class:"task-right split-result-actions"},Vs=["onClick"],Ks=["onClick"],js=he({__name:"BrandProductRiskTab",setup(Js){const $=v(""),X=v([]),dt=v([]),h=v([]),q=v(!1),V=v(!1),K=v(!1),Y=v(!1),Z=v(!1),g=v(""),j=v(""),ft=[{code:"DE",label:"德国"},{code:"UK",label:"英国"},{code:"FR",label:"法国"},{code:"IT",label:"意大利"},{code:"ES",label:"西班牙"}],p=v(["DE","UK","FR","IT","ES"]),tt=v("SearchSuppressed"),F=v(null),et=v(!1),st=v(!1);let N=null;function vt(t){return ft.find(s=>s.code===t)?.label??t}const At=z(()=>{const t=p.value,e=new Set(t),s=t.map(o=>({code:o,label:vt(o)})),l=ft.filter(o=>!e.has(o.code)).map(o=>({code:o.code,label:o.label}));return[...s,...l]});function xt(t){return p.value.includes(t)}function ht(t){return p.value.length===1&&p.value[0]===t}function Bt(t,e){const s=e.target;if(s){if(!s.checked&&ht(t)){s.checked=!0,u.warning("至少保留 1 个国家");return}qt(t,s.checked)}}function qt(t,e){if(st.value=!0,e)p.value.includes(t)||(p.value=[...p.value,t]);else{if(p.value.length<=1){u.warning("至少保留 1 个国家");return}p.value=p.value.filter(s=>s!==t)}pt()}function Vt(t){F.value=t}function Kt(){F.value=null}function jt(t){const e=F.value;if(F.value=null,e==null||e===t)return;st.value=!0;const s=[...p.value],[l]=s.splice(e,1);s.splice(t,0,l),p.value=s,pt()}function pt(){N&&clearTimeout(N),N=setTimeout(()=>{N=null,Ht()},450)}async function Ht(){if(!(p.value.length<1)){et.value=!0;try{await Ce(p.value)}catch(t){u.error(t instanceof Error?t.message:"保存国家顺序失败")}finally{et.value=!1}}}async function Jt(){try{const t=await Te();if(st.value)return;t?.country_codes?.length&&(p.value=[...t.country_codes])}catch{}}const M=v({candidateCount:0,processedTaskCount:0,successTaskCount:0,failedTaskCount:0}),T=v([]),y=v([]),P=v({}),m=v({}),b=v(null),at=v(!1);function H(){return typeof window<"u"&&window.localStorage.getItem("uid")||"0"}function yt(){return`product-risk:tasks:${H()}`}function gt(){return`product-risk:task-status:${H()}`}function kt(){return`product-risk:tasks-batch-snapshot:${H()}`}function mt(){return`product-risk:matched-items:${H()}`}function J(t,e,s){if(!(typeof window>"u"))try{s?window.localStorage.removeItem(t):window.localStorage.setItem(t,JSON.stringify(e))}catch{}}function Gt(){try{const t=typeof window<"u"?window.localStorage.getItem(gt()):null;if(!t)return;const e=JSON.parse(t),s={};for(const[l,o]of Object.entries(e)){const r=Number(l);r>0&&typeof o=="string"&&(s[r]=o)}P.value=s}catch{}}function nt(){J(gt(),P.value,Object.keys(P.value).length===0)}function Qt(){try{const t=typeof window<"u"?window.localStorage.getItem(kt()):null;if(!t)return;const e=JSON.parse(t),s={};for(const[l,o]of Object.entries(e)){const r=Number(l);r>0&&o&&typeof o=="object"&&(s[r]=o)}m.value=s}catch{}}function G(){J(kt(),m.value,Object.keys(m.value).length===0)}function Wt(){try{const t=typeof window<"u"?window.localStorage.getItem(mt()):null;if(!t)return;const e=JSON.parse(t);Array.isArray(e)&&(h.value=e)}catch{}}function L(){J(mt(),h.value,h.value.length===0)}function O(t){const e=(t.shopName||"").trim(),s=t.shopId??"";return`${e}${s}`}function wt(t){const e=t instanceof Error?t.message:String(t||"");return/记录不存在|任务不存在|不存在|已删除|not\s*found|404/i.test(e)}function U(t){if(!t.length)return;const e=new Set(t.map(s=>O(s)));h.value=h.value.filter(s=>!e.has(O(s))),L()}function zt(t){T.value=T.value.filter(e=>!(t.resultId!=null&&e.resultId===t.resultId||t.taskId!=null&&e.taskId===t.taskId))}async function Xt(t){const e=O(t),s=[...h.value];h.value=h.value.filter(o=>O(o)!==e),L();const l=(t.shopName||"").trim();if(!l){u.success("已从匹配结果中移除");return}try{(await Pe(l))?.removed&&(await E(),await S(),A()),u.success("已从匹配结果中移除")}catch(o){if(wt(o)){await E(),await S(),A(),u.success("后端记录已不存在,已同步移除本地记录");return}h.value=s,L(),u.error(o instanceof Error?o.message:"同步后端失败")}}function A(){for(const t of[...y.value])T.value.some(s=>s.taskId===t)||R(t)}async function _t(t){try{if(t.resultId!=null&&t.resultId>0)await Ee(t.resultId);else if(t.taskId!=null&&t.taskId>0)await Ne(t.taskId);else{u.warning("无法删除:缺少记录标识");return}t.taskId!=null&&t.taskId>0&&R(t.taskId),U([t]),await E(),await S(),A(),u.success("已删除")}catch(e){if(wt(e)){t.taskId!=null&&t.taskId>0&&R(t.taskId),U([t]),zt(t),await S(),A(),u.success("后端记录已不存在,已同步移除本地记录");return}u.error(e instanceof Error?e.message:"删除失败")}}function Yt(){try{const t=typeof window<"u"?window.localStorage.getItem(yt()):null;if(!t){y.value=[];return}const e=JSON.parse(t);y.value=Array.isArray(e)?e.filter(s=>typeof s=="number"):[]}catch{y.value=[]}}function bt(){J(yt(),y.value,y.value.length===0)}function Zt(t){y.value.includes(t)||(y.value=[...y.value,t],bt())}function R(t){if(y.value=y.value.filter(e=>e!==t),bt(),delete P.value[t],nt(),m.value[t]){const e={...m.value};delete e[t],m.value=e,G()}}function te(t){dt.value=t||[]}async function S(){try{M.value=await Re()}catch{}}async function ot(){try{X.value=await De(),await S()}catch(t){u.error(t instanceof Error?t.message:"加载备选失败")}}async function E(){try{T.value=(await $e()).items||[]}catch{T.value=[]}}function St(t){return t&&P.value[t]||""}function It(t){const e=St(t);return e==="SUCCESS"||e==="FAILED"}const lt=z(()=>{const t=T.value.filter(s=>s.taskId&&y.value.includes(s.taskId)&&!It(s.taskId)),e=new Set(t.map(s=>s.taskId).filter(s=>typeof s=="number"));for(const s of y.value){if(e.has(s))continue;const r=(m.value[s]?.items||[])[0];r&&t.push(r)}return t}),rt=z(()=>T.value.filter(t=>!t.taskId||!y.value.includes(t.taskId)||It(t.taskId))),ee=z(()=>lt.value.length>0||rt.value.length>0),se=["无法连接到后端服务","bad gateway","gateway timeout","network error","timeout","502","503","504"];function ut(t){return new Promise(e=>{window.setTimeout(()=>e(),t)})}function Ct(t){const e=(t instanceof Error?t.message:String(t||"")).toLowerCase();return se.some(s=>e.includes(s.toLowerCase()))}async function ae(t,e=10){let s=0;for(;;)try{return await Ue(t)}catch(l){if(s+=1,!Ct(l)||s>=e)throw l;g.value=`后端服务暂时不可用,正在重试创建任务(${s}/${e}...`,await ut(x())}}async function Tt(){const t=y.value.filter(e=>e>0);if(t.length)try{const e=await Ot(t);let s=!1;const l={...m.value};for(const o of e.items||[]){const r=o.task?.id,i=o.task?.status;if(typeof r=="number"&&r>0){const a=l[r];l[r]=a?{...a,task:{...a.task||{},...o.task||{}}}:o,i&&(P.value[r]=i,(i==="SUCCESS"||i==="FAILED")&&(R(r),s=!0))}}m.value=l,G(),nt(),s&&(await E(),await S())}catch{}}function x(){return Ae()}function Pt(t=!1){if(b.value){if(!t)return;window.clearTimeout(b.value),b.value=null}const e=async()=>{if(b.value=null,at.value){Pt();return}if(y.value.length){at.value=!0;try{await Tt()}finally{at.value=!1}y.value.length>0&&(b.value=window.setTimeout(e,x()))}};t?e():b.value=window.setTimeout(e,x())}function it(t=!1){b.value&&!t||Pt(t)}function ne(){b.value&&(window.clearTimeout(b.value),b.value=null)}async function oe(t){let e=0;const s=30;for(;;){try{const l=await Ot([t]);e>0&&(g.value=`任务 ${t} 后端已恢复,继续等待执行结果...`),e=0;const o=(l.items||[]).find(i=>i.task?.id===t),r=o?.task?.status||"";if(o){const i=m.value[t];m.value={...m.value,[t]:i?{...i,task:{...i.task||{},...o.task||{}}}:o},G()}if(r&&(P.value[t]=r,nt()),r==="SUCCESS"||r==="FAILED")return R(t),await E(),await S(),r}catch(l){if(!Ct(l))throw l;if(e+=1,e>=s)throw new Error(`任务 ${t} 等待后端恢复超时,请稍后手动刷新查看状态`);g.value=`任务 ${t} 运行中,正在等待后端服务恢复(${e}/${s}...`,(e===1||e%5===0)&&u.warning(`任务 ${t} 运行中,后端服务暂时不可用,正在自动重试`),await ut(x());continue}await ut(x())}}async function Et(){const t=$.value.trim();if(!t){u.warning("请输入店铺名称");return}q.value=!0;try{await Fe(t),$.value="",await ot(),u.success("已加入备选")}catch(e){u.error(e instanceof Error?e.message:"保存失败")}finally{q.value=!1}}async function le(t){try{await Me(t.id),await ot(),h.value=[],L(),u.success("已删除")}catch(e){u.error(e instanceof Error?e.message:"删除失败")}}function re(){const t=new Set,e=$.value.trim();e&&t.add(e);for(const s of dt.value)s?.shop_name?.trim()&&t.add(s.shop_name.trim());return[...t]}function ue(t,e){const s=new Map;for(const r of e){const i=(r.shopName||"").trim();i&&s.set(i,r)}const l=new Set,o=[];for(const r of t){const i=(r.shopName||"").trim();i&&s.has(i)?(o.push(s.get(i)),l.add(i)):o.push(r)}for(const r of e){const i=(r.shopName||"").trim();if(!i){o.push(r);continue}l.has(i)||(o.push(r),l.add(i))}return o}async function ie(){const t=re();if(!t.length){u.warning("请勾选备选店铺,或在输入框中填写店名(可与勾选合并)");return}V.value=!0;try{const s=(await Le(t)).items||[];h.value=ue(h.value,s),L(),Z.value&&Ft(),s.length?u.success(`本次匹配 ${s.length} 个店铺名,表格共 ${h.value.length}`):u.warning("未返回匹配结果")}catch(e){u.error(e instanceof Error?e.message:"匹配失败")}finally{V.value=!1}}function ct(t){const e=t.taskId;return e?St(e)||t.taskStatus||"":t.taskStatus||""}function Nt(t){const e=ct(t);return e==="SUCCESS"?"已完成":e==="FAILED"?"失败":e==="RUNNING"?"执行中":t.success?"已完成":"等待中"}function Rt(t){const e=ct(t);return e==="SUCCESS"||t.success?"success":e==="FAILED"?"failed":"running"}function Dt(t){return!t.resultId||!t.fileReady&&!t.downloadUrl?!1:ct(t)==="SUCCESS"||t.success===!0}async function $t(t){if(!t.resultId)return;const e=Ut(),s=Oe(t.resultId),l=t.outputFilename||`${t.shopName||"result"}.zip`;if(!e?.save_file_from_url_new){u.error("当前客户端未提供 save_file_from_url_new无法下载文件");return}const o=await e.save_file_from_url_new(s,l);o.success?u.success(`已保存:${o.path||l}`):o.error&&o.error!=="用户取消"&&u.error(o.error)}function ce(t){const e=(t||"").trim();return{MATCHED:"已匹配",PENDING:"待匹配",CONFLICT:"需人工确认",INDEX_STALE:"索引过期"}[e]||e||"—"}function de(t){const e=(t.matchMessage||"").trim();return e||(t.matched&&t.matchStatus==="MATCHED"?"紫鸟索引已命中,可推送队列;打开店铺地址由 Python 侧处理":t.matched?"已关联索引,请结合状态列查看是否可推送":"未命中或未就绪,请检查店铺名与索引刷新")}async function fe(){Z.value=!0,await Ft()}function ve(){return h.value.find(t=>t.matched)}async function Ft(){if(Y.value)return;if(!h.value.length){u.warning("请先匹配店铺");return}const t=Ut();if(!t?.enqueue_json){u.error("当前环境未启用 pywebview enqueue_json");return}if(!h.value.filter(o=>o.matched).length){u.warning("没有已匹配的店铺可推送");return}Y.value=!0,K.value=!0,j.value="";let s=0,l=0;try{let o=0;for(;Z.value;){const r=ve();if(!r)break;o+=1;try{const i=await ae([r]),a=i.taskId;m.value={...m.value,[a]:{task:{id:a,status:"RUNNING"},items:i.items}},G(),Zt(a),it(!0);const w={type:"product-risk-resolve-run",ts:Date.now(),data:{taskId:a,items:[r],country_codes:[...p.value],risk_listing_filter:tt.value}};j.value=JSON.stringify(w,null,2);const Q=await t.enqueue_json(w);if(!Q?.success){R(a),l+=1,g.value="第 "+o+" 条推送失败:"+(Q?.error||"未知错误")+",已自动继续下一条",u.error(g.value),U([r]);continue}if(U([r]),g.value="任务 "+a+" 已入队,等待执行完成...",await oe(a)!=="SUCCESS"){l+=1,g.value="任务 "+a+" 执行失败,已自动继续下一条",u.error(g.value);continue}s+=1,g.value="任务 "+a+" 已完成"}catch(i){l+=1,g.value="第 "+o+" 条任务处理失败,已自动继续下一条:"+(i instanceof Error?i.message:"未知错误"),u.error(g.value),U([r]);continue}}(s>0||l>0)&&u.success("店铺推送已完成:成功 "+s+" 条,失败 "+l+" 条"),await E(),it(!0)}catch(o){g.value=o instanceof Error?o.message:"推送异常",u.error(g.value)}finally{Y.value=!1,K.value=!1}}return pe(()=>{Yt(),Gt(),Qt(),Wt(),ot().catch(()=>{}),Jt().catch(()=>{}),E().then(()=>(A(),Tt())).catch(()=>{}),S().catch(()=>{}),y.value.length&&it(!0)}),ye(()=>{ne(),N&&clearTimeout(N)}),(t,e)=>{const s=me,l=we,o=_e,r=Se,i=Ie;return c(),d("div",Ke,[k(ge,{active:"product-risk"}),n("div",je,[n("aside",He,[e[7]||(e[7]=n("div",{class:"section-title"},"店铺名称",-1)),n("div",Je,[e[3]||(e[3]=n("div",{class:"hint"},"输入店铺名后点「确认」加入下方备选区(按当前登录用户保存)。仅索引可命中的店铺可入库。勾选备选后点「匹配店铺」,再「推送到 Python 队列」。",-1)),n("div",Ge,[k(s,{modelValue:$.value,"onUpdate:modelValue":e[0]||(e[0]=a=>$.value=a),clearable:"",placeholder:"请输入店铺名称",onKeyup:ke(Et,["enter"])},null,8,["modelValue"]),n("button",{type:"button",class:"opt-btn",disabled:q.value,onClick:Et},f(q.value?"保存中…":"确认"),9,Qe)])]),e[8]||(e[8]=n("div",{class:"section-title"},"备选区域",-1)),X.value.length?(c(),d("div",ze,[k(o,{data:X.value,"row-key":"id",height:"240",class:"candidate-table",onSelectionChange:te},{default:I(()=>[k(l,{type:"selection",width:"42"}),k(l,{prop:"shop_name",label:"店铺名","min-width":"120","show-overflow-tooltip":""}),k(l,{label:"操作",width:"72",align:"center"},{default:I(({row:a})=>[n("button",{type:"button",class:"link-danger",onClick:w=>le(a)},"删除",8,Xe)]),_:1})]),_:1},8,["data"])])):(c(),d("div",We,"暂无备选店铺,请先输入并确认")),e[9]||(e[9]=n("div",{class:"section-title"},"处理国家与顺序",-1)),e[10]||(e[10]=n("p",{class:"hint country-pref-hint"},[C(" 勾选需要处理的站点(可只选 23 国);上方勾选区"),n("strong",null,"先按已选顺序"),C("排列,其余未选国家排在后面。拖拽下方列表调整顺序后会与上方同步。设置会按当前登录用户保存。 ")],-1)),n("div",Ye,[(c(!0),d(D,null,B(At.value,a=>(c(),d("label",{key:a.code,class:"country-check-row"},[n("input",{type:"checkbox",class:"country-check-input",checked:xt(a.code),disabled:ht(a.code),onChange:w=>Bt(a.code,w)},null,40,Ze),n("span",ts,f(a.label)+""+f(a.code)+"",1)]))),128))]),p.value.length?(c(),d("div",es,[e[5]||(e[5]=n("div",{class:"country-order-caption"},"已选顺序(拖拽 ⋮⋮ 调整)",-1)),n("div",ss,[(c(!0),d(D,null,B(p.value,(a,w)=>(c(),d("div",{key:a,class:W(["country-drag-row",{dragging:F.value===w}]),draggable:"true",onDragstart:Q=>Vt(w),onDragend:Kt,onDragover:e[1]||(e[1]=Mt(()=>{},["prevent"])),onDrop:Mt(Q=>jt(w),["prevent"])},[e[4]||(e[4]=n("span",{class:"drag-handle",title:"拖动排序"},"⋮⋮",-1)),n("span",ns,f(vt(a))+""+f(a)+"",1)],42,as))),128))])])):_("",!0),et.value?(c(),d("div",os,"保存中…")):_("",!0),e[11]||(e[11]=n("div",{class:"section-title"},"商品列表筛选",-1)),e[12]||(e[12]=n("p",{class:"hint listing-filter-hint"},"与「推送到 Python 队列」一并下发,供 Python 区分处理场景。",-1)),n("div",ls,[k(i,{modelValue:tt.value,"onUpdate:modelValue":e[2]||(e[2]=a=>tt.value=a),class:"listing-filter-select",teleported:"",placeholder:"选择筛选类型"},{default:I(()=>[(c(!0),d(D,null,B(be(Ve),a=>(c(),Lt(r,{key:a.value,label:a.label,value:a.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),n("div",rs,[n("button",{type:"button",class:"btn-run",disabled:V.value,onClick:ie},f(V.value?"匹配中…":"匹配店铺"),9,us),n("button",{type:"button",class:"btn-run btn-queue",disabled:K.value||!h.value.length,onClick:fe},f(K.value?"推送中…":"推送到 Python 队列"),9,is)]),e[13]||(e[13]=n("p",{class:"loading-msg"},[C("与删除 ASIN 品牌相同:先创建任务,再按店铺"),n("strong",null,"逐条"),C("入队(每条 "),n("code",null,"data.items"),C(" 仅含一个店铺。队列串行执行Python 每处理完一店可 POST "),n("code",null,"/api/product-risk-resolve/tasks/{taskId}/result"),C("(可多次,每次可只含已完成的店铺);全部完成后任务结束。前端轮询任务状态。 ")],-1)),g.value?(c(),d("div",cs,[e[6]||(e[6]=n("div",{class:"section-title queue-debug-title"},"推送结果",-1)),n("div",ds,f(g.value),1),j.value?(c(),d("pre",fs,f(j.value),1)):_("",!0)])):_("",!0)]),n("section",vs,[e[22]||(e[22]=n("div",{class:"panel-header"},"匹配与任务",-1)),n("div",hs,[n("div",ps,[n("div",ys,[e[14]||(e[14]=n("span",{class:"summary-label"},"备选店铺数",-1)),n("strong",null,f(M.value.candidateCount),1)]),n("div",gs,[e[15]||(e[15]=n("span",{class:"summary-label"},"已结束任务",-1)),n("strong",null,f(M.value.processedTaskCount),1)]),n("div",ks,[e[16]||(e[16]=n("span",{class:"summary-label"},"成功任务",-1)),n("strong",null,f(M.value.successTaskCount),1)]),n("div",ms,[e[17]||(e[17]=n("span",{class:"summary-label"},"失败任务",-1)),n("strong",null,f(M.value.failedTaskCount),1)])]),e[21]||(e[21]=n("div",{class:"subsection-title"},"匹配结果",-1)),h.value.length?(c(),Lt(o,{key:1,data:h.value,"row-key":O,"highlight-current-row":!1,class:"result-table match-table"},{default:I(()=>[k(l,{prop:"shopName",label:"店铺名","min-width":"100"}),k(l,{label:"匹配",width:"72",align:"center"},{default:I(({row:a})=>[n("span",{class:W(a.matched?"ok":"fail")},f(a.matched?"是":"否"),3)]),_:1}),k(l,{prop:"shopId",label:"店铺ID","min-width":"120","show-overflow-tooltip":""}),k(l,{prop:"platform",label:"平台",width:"88","show-overflow-tooltip":""}),k(l,{prop:"companyName",label:"公司","min-width":"100","show-overflow-tooltip":""}),k(l,{label:"状态",width:"100","show-overflow-tooltip":""},{default:I(({row:a})=>[C(f(ce(a.matchStatus)),1)]),_:1}),k(l,{label:"说明","min-width":"140","show-overflow-tooltip":""},{default:I(({row:a})=>[C(f(de(a)),1)]),_:1}),k(l,{label:"操作",width:"72",align:"center"},{default:I(({row:a})=>[n("button",{type:"button",class:"link-danger",onClick:w=>Xt(a)},"删除",8,_s)]),_:1})]),_:1},8,["data"])):(c(),d("div",ws,"完成「匹配店铺」后,在此展示紫鸟索引匹配结果,供核对后再推送队列。")),n("div",bs,[e[20]||(e[20]=n("div",{class:"result-list-header"},[n("span",null,"处理记录")],-1)),ee.value?(c(),d(D,{key:1},[lt.value.length?(c(),d("div",Is,[e[18]||(e[18]=n("div",{class:"result-subsection-title"},"当前任务",-1)),n("ul",Cs,[(c(!0),d(D,null,B(lt.value,a=>(c(),d("li",{key:`cur-${a.resultId}-${a.taskId}`,class:"task-item split-result-item"},[n("div",Ts,[n("span",{class:"id",title:a.shopName||""},f(a.shopName||"-"),9,Ps),n("div",Es,"任务 ID"+f(a.taskId??"-"),1),a.platform?(c(),d("div",Ns,"平台:"+f(a.platform),1)):_("",!0),a.error?(c(),d("div",Rs,"错误:"+f(a.error),1)):_("",!0)]),n("div",Ds,[n("span",{class:W(["status",Rt(a)])},f(Nt(a)),3),Dt(a)?(c(),d("button",{key:0,type:"button",class:"download",onClick:w=>$t(a)}," 下载 ",8,$s)):_("",!0),n("button",{type:"button",class:"btn-delete",onClick:w=>_t(a)},"删除",8,Fs)])]))),128))])])):_("",!0),rt.value.length?(c(),d("div",Ms,[e[19]||(e[19]=n("div",{class:"result-subsection-title"},"历史记录",-1)),n("ul",Ls,[(c(!0),d(D,null,B(rt.value,a=>(c(),d("li",{key:`his-${a.resultId}-${a.taskId}`,class:"task-item split-result-item"},[n("div",Os,[n("span",{class:"id",title:a.shopName||""},f(a.shopName||"-"),9,Us),n("div",As,"任务 ID"+f(a.taskId??"-"),1),a.outputFilename?(c(),d("div",xs,"文件:"+f(a.outputFilename),1)):_("",!0),a.error?(c(),d("div",Bs,"错误:"+f(a.error),1)):_("",!0)]),n("div",qs,[n("span",{class:W(["status",Rt(a)])},f(Nt(a)),3),Dt(a)?(c(),d("button",{key:0,type:"button",class:"download",onClick:w=>$t(a)}," 下载 ",8,Vs)):_("",!0),n("button",{type:"button",class:"btn-delete",onClick:w=>_t(a)},"删除",8,Ks)])]))),128))])])):_("",!0)],64)):(c(),d("div",Ss,"暂无处理记录。推送队列并等待 Python 回传后,将在此显示下载链接。"))])])])])])}}}),Hs=xe(js,[["__scopeId","data-v-466a311b"]]);Be(Hs).use(qe).mount("#app");