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