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