Files
Nexus/web/app/assets/ScriptRunsPage-D8rAgixA.js
T
2026-06-08 07:27:46 +08:00

4 lines
13 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
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{a as e}from"./VDataTable-B0-95xTn.js";import{_ as t,t as n,v as r}from"./VSelect-CTQFqPGK.js";import{n as i,t as a}from"./VRow-GEA7G0tR.js";import{$r as o,Bt as s,Dr as c,Er as l,F as u,Ft as ee,Gt as te,Ht as ne,Ir as d,It as re,N as f,P as ie,Pr as p,Q as m,R as h,Rt as ae,Tr as oe,Ur as g,Ut as se,Vt as _,Wt as ce,Yr as v,Z as le,Zr as y,Zt as b,_r as ue,dr as x,en as de,fr as S,gr as C,hr as w,kr as T,kt as fe,lr as E,lt as pe,or as me,pr as D,pt as he,sr as O,tn as ge,ur as k,z as A,zt as _e}from"./index-ClemoL2X.js";import{n as ve}from"./dataTable-esDY4cOk.js";import{t as ye}from"./VDataTableServer-C96cVg_A.js";import{t as j}from"./apiError-BmRiVE-x.js";import{t as be}from"./useServerList-6ibxoaYy.js";import{t as xe}from"./paginatedFetch-BcTESG-_.js";import{t as Se}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{n as Ce,t as we}from"./execDetailGrouping-CkpsDXoP.js";import{i as Te,n as Ee,r as De,t as Oe}from"./VExpansionPanels-upOh5ouw.js";var ke={class:`d-flex align-center flex-wrap ga-2 mb-4`},Ae={class:`text-h6`},je={class:`text-caption text-medium-emphasis mb-2`},Me={class:`text-body-2 mb-3 pa-3 rounded bg-surface-variant overflow-auto`,style:{"max-height":`100px`}},Ne={key:0,class:`d-flex flex-wrap ga-2 mb-3`},Pe={class:`text-body-2`},Fe={class:`d-flex align-center flex-wrap ga-2 mb-3`},Ie=[`onClick`],Le={class:`font-weight-medium`},Re={key:0,class:`text-caption text-medium-emphasis`},ze=[`title`],Be={key:0},Ve={class:`d-flex align-center ga-2 flex-grow-1 min-width-0`},He=[`title`],Ue={key:0,class:`text-medium-emphasis`},We={class:`d-flex align-center flex-wrap ga-2 mb-4`},M=Se(ue({__name:`ScriptRunsPage`,setup(ue){let Se=de(),M=ge(),N=t(),{servers:Ge,loadServers:Ke}=be(),P=E(()=>{let e=Se.params.id;if(!e)return null;let t=Number(e);return Number.isFinite(t)?t:null}),F=g(!1),I=g([]),L=g(0),R=g(1),z=g(20),B=g(null),qe=[{title:`执行中`,value:`running`},{title:`已完成`,value:`completed`},{title:`部分成功`,value:`partial`},{title:`失败`,value:`failed`},{title:`已取消`,value:`cancelled`}],Je=ve([{title:`ID`,key:`id`,width:72},{title:`脚本/命令`,key:`label`},{title:`状态`,key:`status`,width:100},{title:`进度`,key:`progress`,width:88},{title:`台数`,key:`server_count`,width:72},{title:`操作人`,key:`operator`,width:88},{title:`开始时间`,key:`started_at`,width:168},{title:`操作`,key:`actions`,width:88}]),V=g(null),H=g(!1),U=g(`all`),W=g(`list`),G=g(null),Ye=g([]),K=null,Xe=E(()=>new Map(Ge.value.map(e=>[e.id,e])));function Ze(e){return e||`—`}function Qe(e){if(!e)return 0;try{let t=JSON.parse(e);return Array.isArray(t)?t.length:0}catch{return 0}}function $e(e){if(e.label)return e.label;let t=(e.command||``).replace(/^\[long_task\] /,``);return t.length>48?t.slice(0,48)+`…`:t||`执行 #${e.id}`}function et(e){let t=(e.stderr||``).trim(),n=(e.stdout||``).trim(),r=(e.message||``).trim(),i=t||n||r||`—`;return{summary:(t||r||n||``).slice(0,200)||`—`,full:i}}let q=E(()=>{if(!V.value?.results)return[];let e=Xe.value;return Object.entries(V.value.results).filter(([e])=>e!==`_meta`&&/^\d+$/.test(e)).map(([t,n])=>{let r=Number(t),i=e.get(r),a=String(n.status||``),o=n.phase?String(n.phase):void 0,s=n.exit_code??null,c=et(n);return{serverId:t,serverIdNum:r,serverName:ce(t,V.value?.server_names,i?.name),serverDomain:i?.domain||``,status:a,phase:o,exitCode:s,summary:c.summary,fullOutput:c.full,failed:ne(a,o,s),pending:se(o)}})}),tt=E(()=>U.value===`failed`?q.value.filter(e=>e.failed):U.value===`success`?q.value.filter(e=>!e.failed&&!e.pending):q.value),J=E(()=>te(V.value?.results,V.value?.server_ids)),Y=E(()=>q.value.filter(e=>e.failed).map(e=>e.serverName)),X=E(()=>we(q.value.filter(e=>e.failed)));async function Z(e=!1){e||(F.value=!0);try{let e=await xe(async(e,t)=>{let n={limit:e,offset:t};B.value&&(n.status=B.value);let r=await b.get(`/scripts/executions`,n);return{items:r.items||[],total:r.total||0}},R.value,z.value);I.value=e.items,L.value=e.total}catch(t){e||(I.value=[],L.value=0,N(j(t,`加载失败`),`error`))}finally{e||(F.value=!1)}}function nt(e){R.value=e,Z()}function rt(e){z.value=e,R.value=1,Z()}function it(e){M.push(`/script-runs/${e}`)}async function Q(e=!1,t=!1){if(P.value){t||(H.value=!0);try{let t=e?`?fetch_logs=true`:``;V.value=await b.get(`/scripts/executions/${P.value}${t}`),V.value?.status===`running`?at():$()}catch(e){t||N(j(e,`加载详情失败`),`error`)}finally{t||(H.value=!1)}}}function at(){K||=setInterval(()=>{Q(!1,!0)},3e3)}function $(){K&&=(clearInterval(K),null)}function ot(e){G.value=G.value===e?null:e}function st(e){M.push({path:`/terminal`,query:{server_id:String(e)}})}async function ct(){if(P.value)try{await b.post(`/scripts/executions/${P.value}/stop`),await Q(!1),N(`已发送停止指令`)}catch(e){N(j(e,`停止失败`),`error`)}}async function lt(){if(P.value)try{let e=await b.post(`/scripts/executions/${P.value}/retry`,{}),t=Qe(e.server_ids);re(e.id,`${$e(e)}(重试)`,t,!!e.long_task,e.progress,e.status),fe(`重试已提交 #${e.id}`),M.push(`/script-runs/${e.id}`)}catch(e){N(j(e,`重试失败`),`error`)}}function ut(e){let t=e.serverDomain?` (${e.serverDomain})`:``,n=e.exitCode==null?``:` · exit ${e.exitCode}`,r=e.summary.split(`
`)[0]?.trim()||e.summary,i=r&&r!==`—`?` · ${r.slice(0,120)}`:``;return`- ${e.serverName}${t}${n}${i}`}async function dt(e,t){try{await navigator.clipboard.writeText(e),N(t)}catch{N(`复制失败`,`error`)}}async function ft(){let e=q.value.filter(e=>e.failed);e.length&&await dt([`执行 #${P.value} · 失败 ${e.length} 台`,...e.map(ut)].join(`
`),`已复制失败清单`)}async function pt(){let e=X.value;if(!e.length)return;let t=[`执行 #${P.value} · 失败分组 ${e.length} 类`];for(let n of e){t.push(`\n[${n.count} 台] ${n.errorKey}`);for(let e of n.rows.slice(0,20))t.push(` - ${e.serverName}`);n.rows.length>20&&t.push(` …及其他 ${n.rows.length-20} 台`)}await dt(t.join(`
`),`已复制分组摘要`)}p(B,()=>{R.value=1,Z()}),p(P,e=>{$(),V.value=null,e?(U.value=`all`,W.value=`list`,Q(!1)):Z()},{immediate:!0}),Ce(e=>Z(e),{enabled:()=>!P.value});let mt=ee(()=>{P.value?Q(!1,!0):Z(!0)});return oe(()=>{Ke()}),l(()=>{$(),mt()}),(t,l)=>(c(),x(r,{fluid:``,class:`pa-4`},{default:d(()=>[P.value?(c(),D(O,{key:0},[k(`div`,ke,[C(m,{variant:`text`,"prepend-icon":`mdi-arrow-left`,onClick:l[0]||=e=>v(M).push(`/script-runs`)},{default:d(()=>[...l[7]||=[w(` 返回列表 `,-1)]]),_:1}),k(`h1`,Ae,`执行详情 #`+o(P.value),1),V.value?(c(),x(u,{key:0,color:v(s)(V.value.status),size:`small`,variant:`tonal`,label:``},{default:d(()=>[w(o(v(_)(V.value.status)),1)]),_:1},8,[`color`])):S(``,!0),C(f),V.value?.long_task?(c(),x(m,{key:1,size:`small`,variant:`tonal`,loading:H.value,onClick:l[1]||=e=>Q(!0)},{default:d(()=>[...l[8]||=[w(` 拉取日志 `,-1)]]),_:1},8,[`loading`])):S(``,!0),V.value&&(V.value.status===`running`||V.value.status===`partial`)?(c(),x(m,{key:2,size:`small`,variant:`text`,color:`error`,onClick:ct},{default:d(()=>[...l[9]||=[w(` 停止 `,-1)]]),_:1})):S(``,!0),V.value&&(V.value.status===`failed`||V.value.status===`partial`)?(c(),x(m,{key:3,size:`small`,variant:`tonal`,color:`primary`,onClick:lt},{default:d(()=>[...l[10]||=[w(` 重试失败项 `,-1)]]),_:1})):S(``,!0)]),H.value&&!V.value?(c(),x(h,{key:0,elevation:`0`,border:``,rounded:`lg`,class:`pa-8 text-center`},{default:d(()=>[C(pe,{indeterminate:``,color:`primary`})]),_:1})):V.value?(c(),x(h,{key:1,elevation:`0`,border:``,rounded:`lg`},{default:d(()=>[C(A,null,{default:d(()=>[k(`div`,je,o(Ze(V.value.progress))+` · 操作人 `+o(V.value.operator||`—`),1),k(`pre`,Me,o(V.value.command),1),J.value.total?(c(),D(`div`,Ne,[C(u,{size:`small`,variant:`tonal`,label:``},{default:d(()=>[w(`共 `+o(J.value.total)+` 台`,1)]),_:1}),J.value.success?(c(),x(u,{key:0,color:`success`,size:`small`,variant:`tonal`,label:``},{default:d(()=>[w(` 成功 `+o(J.value.success),1)]),_:1})):S(``,!0),J.value.failed?(c(),x(u,{key:1,color:`error`,size:`small`,variant:`tonal`,label:``},{default:d(()=>[w(` 失败 `+o(J.value.failed),1)]),_:1})):S(``,!0),J.value.pending?(c(),x(u,{key:2,color:`info`,size:`small`,variant:`tonal`,label:``},{default:d(()=>[w(` 进行中 `+o(J.value.pending),1)]),_:1})):S(``,!0)])):S(``,!0),Y.value.length?(c(),x(le,{key:1,type:`error`,variant:`tonal`,density:`compact`,class:`mb-3`,title:`失败 ${Y.value.length} 台`},{default:d(()=>[k(`div`,Pe,o(Y.value.join(`、`)),1)]),_:1},8,[`title`])):S(``,!0),k(`div`,Fe,[l[19]||=k(`span`,{class:`text-caption text-medium-emphasis`},`筛选`,-1),C(he,{modelValue:U.value,"onUpdate:modelValue":l[2]||=e=>U.value=e,mandatory:``,density:`compact`,color:`primary`,variant:`outlined`,divided:``},{default:d(()=>[C(m,{value:`all`,size:`small`},{default:d(()=>[...l[11]||=[w(`全部`,-1)]]),_:1}),C(m,{value:`failed`,size:`small`},{default:d(()=>[...l[12]||=[w(`仅失败`,-1)]]),_:1}),C(m,{value:`success`,size:`small`},{default:d(()=>[...l[13]||=[w(`仅成功`,-1)]]),_:1})]),_:1},8,[`modelValue`]),J.value.failed>0?(c(),D(O,{key:0},[C(ie,{vertical:``,class:`mx-1`}),l[18]||=k(`span`,{class:`text-caption text-medium-emphasis`},`视图`,-1),C(he,{modelValue:W.value,"onUpdate:modelValue":l[3]||=e=>W.value=e,mandatory:``,density:`compact`,color:`primary`,variant:`outlined`,divided:``},{default:d(()=>[C(m,{value:`list`,size:`small`},{default:d(()=>[...l[14]||=[w(`列表`,-1)]]),_:1}),C(m,{value:`group`,size:`small`},{default:d(()=>[...l[15]||=[w(`按错误分组`,-1)]]),_:1})]),_:1},8,[`modelValue`]),C(m,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-content-copy`,onClick:ft},{default:d(()=>[...l[16]||=[w(` 复制失败清单 `,-1)]]),_:1}),W.value===`group`?(c(),x(m,{key:0,size:`small`,variant:`tonal`,"prepend-icon":`mdi-content-copy`,onClick:pt},{default:d(()=>[...l[17]||=[w(` 复制分组摘要 `,-1)]]),_:1})):S(``,!0)],64)):S(``,!0)]),W.value===`list`?(c(),x(e,{key:2,density:`compact`},{default:d(()=>[l[21]||=k(`thead`,null,[k(`tr`,null,[k(`th`,null,`服务器`),k(`th`,null,`状态`),k(`th`,{style:{width:`72px`}},`退出码`),k(`th`,null,`错误摘要`),k(`th`,{style:{width:`120px`},class:`text-end`},`操作`)])],-1),k(`tbody`,null,[(c(!0),D(O,null,T(tt.value,e=>(c(),D(`tr`,{key:e.serverId,class:y([{"exec-detail-row--failed":e.failed},`cursor-pointer`]),onClick:t=>ot(e.serverId)},[k(`td`,null,[k(`div`,Le,o(e.serverName),1),e.serverDomain?(c(),D(`div`,Re,o(e.serverDomain),1)):S(``,!0)]),k(`td`,null,[C(u,{color:v(ae)(e.status,e.phase,e.exitCode),size:`x-small`,variant:`tonal`,label:``},{default:d(()=>[w(o(v(_e)(e.status,e.phase)),1)]),_:2},1032,[`color`])]),k(`td`,{class:y({"text-error font-weight-medium":e.failed})},o(e.exitCode??`—`),3),k(`td`,{class:`text-truncate`,style:{"max-width":`280px`},title:e.summary},o(e.summary),9,ze),k(`td`,{class:`text-end`,onClick:l[4]||=me(()=>{},[`stop`])},[C(m,{size:`x-small`,variant:`text`,icon:`mdi-console`,title:`打开终端`,onClick:t=>st(e.serverIdNum)},null,8,[`onClick`])])],10,Ie))),128)),tt.value.length===0?(c(),D(`tr`,Be,[...l[20]||=[k(`td`,{colspan:`5`,class:`text-center text-medium-emphasis py-4`},`当前筛选无记录`,-1)]])):S(``,!0)])]),_:1})):X.value.length?(c(),x(Oe,{key:3,modelValue:Ye.value,"onUpdate:modelValue":l[5]||=e=>Ye.value=e,multiple:``,variant:`accordion`},{default:d(()=>[(c(!0),D(O,null,T(X.value,(e,t)=>(c(),x(Ee,{key:`${t}-${e.errorKey}`},{default:d(()=>[C(De,null,{default:d(()=>[k(`div`,Ve,[k(`span`,{class:`text-body-2 text-truncate`,title:e.errorKey},o(e.errorKey),9,He),C(u,{color:`error`,size:`x-small`,variant:`tonal`,label:``},{default:d(()=>[w(o(e.count)+` 台`,1)]),_:2},1024)])]),_:2},1024),C(Te,null,{default:d(()=>[(c(!0),D(O,null,T(e.rows,e=>(c(),D(`div`,{key:e.serverId,class:`text-body-2 py-1`},[w(o(e.serverName)+` `,1),e.serverDomain?(c(),D(`span`,Ue,``+o(e.serverDomain)+``,1)):S(``,!0)]))),128))]),_:2},1024)]),_:2},1024))),128))]),_:1},8,[`modelValue`])):S(``,!0)]),_:1})]),_:1})):S(``,!0)],64)):(c(),D(O,{key:1},[k(`div`,We,[l[23]||=k(`h1`,{class:`text-h6`},`脚本执行看板`,-1),C(f),C(m,{variant:`tonal`,"prepend-icon":`mdi-refresh`,loading:F.value,onClick:Z},{default:d(()=>[...l[22]||=[w(` 刷新 `,-1)]]),_:1},8,[`loading`])]),C(h,{elevation:`0`,border:``,rounded:`lg`},{default:d(()=>[C(A,null,{default:d(()=>[C(a,{dense:``,class:`mb-2`},{default:d(()=>[C(i,{cols:`12`,sm:`4`},{default:d(()=>[C(n,{modelValue:B.value,"onUpdate:modelValue":l[6]||=e=>B.value=e,items:qe,label:`状态筛选`,variant:`outlined`,density:`compact`,"hide-details":``,clearable:``},null,8,[`modelValue`])]),_:1})]),_:1}),C(ye,{headers:v(Je),items:I.value,"items-length":L.value,loading:F.value,"items-per-page":z.value,page:R.value,"onUpdate:page":nt,"onUpdate:itemsPerPage":rt},{"item.label":d(({item:e})=>[w(o($e(e)),1)]),"item.status":d(({item:e})=>[C(u,{color:v(s)(e.status),size:`x-small`,variant:`tonal`,label:``},{default:d(()=>[w(o(v(_)(e.status)),1)]),_:2},1032,[`color`])]),"item.progress":d(({item:e})=>[w(o(Ze(e.progress)),1)]),"item.server_count":d(({item:e})=>[w(o(Qe(e.server_ids)),1)]),"item.actions":d(({item:e})=>[C(m,{size:`x-small`,variant:`text`,color:`primary`,onClick:t=>it(e.id)},{default:d(()=>[...l[24]||=[w(` 详情 `,-1)]]),_:1},8,[`onClick`])]),"no-data":d(()=>[...l[25]||=[k(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无执行记录`,-1)]]),_:1},8,[`headers`,`items`,`items-length`,`loading`,`items-per-page`,`page`])]),_:1})]),_:1})],64))]),_:1}))}}),[[`__scopeId`,`data-v-021dd0ac`]]);export{M as default};