2 lines
22 KiB
JavaScript
2 lines
22 KiB
JavaScript
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(" 勾选需要处理的站点(可只选 2~3 国);上方勾选区"),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");
|