Files
aiops/backend/static/assets/CronJobManager-BMfKpm0z.js
T
attacker 77c234b060 feat(audit): F1+F2 告警静默规则标记完成 + 审计日志CSV导出实现
F1 告警静默规则 [done]:
- 后端 alert_silence.go: CRUD + Toggle (onetime/daily/weekly 三模式)
- 告警引擎 isSilenced 集成 (alert_engine.go)
- 前端 SilenceRuleTab + SilenceDialog
- 路由 /alerts/silences 已注册

F2 审计日志导出 [done]:
- 重写 ExportAuditLogs: 真正的 CSV 导出 (encoding/csv + UTF-8 BOM)
- 支持 module/action/username/startTime/endTime 筛选
- 导出限制 10000 条防溢出,自动记录审计日志
- JSON 格式向后兼容 (format=json)
- 前端 exportLogs 传递查询参数

同时包含累积的前期工作:
- 目录重构 internal/ -> controller/model/router (v0.55-v0.57)
- 后端分层架构 dto/repository/service/utils
- 审计模块全功能 (终端审计/操作审计/登录日志)
- asciicast v2 录制格式
- SFTP 文件浏览器
- StatStrip 紧凑统计条
- 在线会话自动刷新
- LiveMonitor WebSocket 诊断修复

验证: go build ✅ | npm run build ✅ | Docker 部署 ✅ | 10 回归端点 ✅ | CSV 导出 ✅ | 静默 CRUD ✅
2026-06-25 20:16:30 +08:00

3 lines
32 KiB
JavaScript

import{j as t,L,a3 as mt,r as n,D as K,b as U,c as W,d as Y,e as Z,I as $,f as xt,B as p,H as tt,a as pt,S as ht,x as gt,F as ut}from"./index-DfyorCky.js";import{C as w,a as S}from"./card-C55cvSHg.js";import{B as C}from"./badge-xNW8x0G1.js";import{C as B}from"./checkbox-CH0bpj6b.js";import{t as d}from"./index-a3ybMjbR.js";import{s as z,c as y,t as bt}from"./automation-mtL167W_.js";import{C as vt}from"./circle-x-DK79Dhg2.js";import{S as O,a as R,b as A,c as V,d as N}from"./select-D5qUzdAs.js";import{T as Q}from"./textarea-NXY8u32k.js";import{L as J}from"./label-BK0h2apY.js";import{T as yt,a as Ct,b as I,c as E,d as jt,e as f}from"./table-5sHV4Akp.js";import{H as ot}from"./history-D_9jPUQg.js";import{R as Nt}from"./refresh-cw-DUB_tAG-.js";import{P as Jt}from"./plus-CUG-9kpu.js";import{T as q}from"./trash-2-Dx32pOzT.js";import{P as ft}from"./package-open-CUXo2Tda.js";import{P as X}from"./play-cdPayOtJ.js";import{P as Dt}from"./pause-D_famo9P.js";import{S as Mt}from"./square-pen-BxUFAe0F.js";import"./index-CWVNW_qu.js";function et(i){switch(i){case"success":return t.jsxs(C,{"code-path":"src/components/automation/cronJobHelpers.tsx:9:9",variant:"outline",className:"border-emerald-500/30 text-emerald-400 bg-emerald-500/10",children:[t.jsx(mt,{"code-path":"src/components/automation/cronJobHelpers.tsx:10:11",className:"h-3 w-3 mr-1"}),"成功"]});case"failed":return t.jsxs(C,{"code-path":"src/components/automation/cronJobHelpers.tsx:16:9",variant:"outline",className:"border-red-500/30 text-red-400 bg-red-500/10",children:[t.jsx(vt,{"code-path":"src/components/automation/cronJobHelpers.tsx:17:11",className:"h-3 w-3 mr-1"}),"失败"]});case"running":return t.jsxs(C,{"code-path":"src/components/automation/cronJobHelpers.tsx:23:9",variant:"outline",className:"border-blue-500/30 text-blue-400 bg-blue-500/10 animate-pulse",children:[t.jsx(L,{"code-path":"src/components/automation/cronJobHelpers.tsx:24:11",className:"h-3 w-3 mr-1 animate-spin"}),"执行中"]});default:return t.jsx(C,{"code-path":"src/components/automation/cronJobHelpers.tsx:30:9",variant:"outline",className:"border-[var(--dg-border)] text-[var(--dg-text-muted)]",children:"从未执行"})}}function Ft(i){return{"0 2 * * *":"每天 02:00","0 3 * * 0":"每周日 03:00","*/5 * * * *":"每 5 分钟","0 * * * *":"每小时","0 9 * * 1":"每周一 09:00"}[i]||i}const G=[{value:"shell",label:"Shell 脚本",desc:"关联脚本库中的 Shell 脚本"},{value:"python",label:"Python 脚本",desc:"关联脚本库中的 Python 脚本"},{value:"command",label:"自定义命令",desc:"手动输入命令或脚本路径"}];function wt({open:i,onOpenChange:g,editJob:s,onSuccess:D}){const[a,l]=n.useState({name:"",description:"",cron_expr:"",type:"shell",content:"",script_id:null}),[h,v]=n.useState([]),[r,m]=n.useState(null),[H,M]=n.useState(!1);n.useEffect(()=>{i&&(z.getScripts({page_size:200}).then(e=>{v(e?.list||[])}).catch(()=>v([])),s?(l({name:s.name||"",description:s.description||"",cron_expr:s.cron_expr||"",type:s.type||"shell",content:s.content||"",script_id:s.script_id||null}),s.script_id?z.getScript(s.script_id).then(e=>{m(e)}).catch(()=>m(null)):m(null)):(l({name:"",description:"",cron_expr:"",type:"shell",content:"",script_id:null}),m(null)))},[i,s]);const F=a.type==="shell"||a.type==="python"?h.filter(e=>e.type===a.type):[],_=e=>{const x=h.find(j=>String(j.id)===e);x&&(m(x),l(j=>({...j,script_id:x.id,content:x.content})))},P=e=>{l(x=>({...x,type:e,script_id:null,content:e==="command"?x.content:""})),m(null)},k=async()=>{if(!a.name||!a.cron_expr){d.error("请填写任务名称和 Cron 表达式");return}if((a.type==="shell"||a.type==="python")&&!a.script_id){d.error("请选择关联的脚本");return}try{M(!0);const e={name:a.name,description:a.description,cron_expr:a.cron_expr,type:a.type,content:a.content,script_id:a.script_id};s?(await y.updateJob(s.id,e),d.success("任务更新成功")):(await y.createJob(e),d.success("任务创建成功")),g(!1),D()}catch(e){console.error("Failed to save cron job:",e),d.error(s?"更新失败":"创建失败")}finally{M(!1)}};return t.jsx(K,{"code-path":"src/components/automation/CronJobFormDialog.tsx:149:5",open:i,onOpenChange:g,children:t.jsxs(U,{"code-path":"src/components/automation/CronJobFormDialog.tsx:150:7",className:"max-w-2xl bg-[var(--dg-bg-primary)] border-[var(--dg-border)] text-[var(--dg-text-primary)]",children:[t.jsxs(W,{"code-path":"src/components/automation/CronJobFormDialog.tsx:151:9",children:[t.jsx(Y,{"code-path":"src/components/automation/CronJobFormDialog.tsx:152:11",children:s?"编辑定时任务":"新建定时任务"}),t.jsx(Z,{"code-path":"src/components/automation/CronJobFormDialog.tsx:153:11",className:"text-[var(--dg-text-secondary)]",children:"配置 Cron 定时任务"})]}),t.jsxs("div",{"code-path":"src/components/automation/CronJobFormDialog.tsx:155:9",className:"space-y-4 py-4 max-h-[60vh] overflow-y-auto pr-1",children:[t.jsxs("div",{"code-path":"src/components/automation/CronJobFormDialog.tsx:157:11",children:[t.jsx(J,{"code-path":"src/components/automation/CronJobFormDialog.tsx:158:13",className:"text-[var(--dg-text-primary)]",children:"任务名称"}),t.jsx($,{"code-path":"src/components/automation/CronJobFormDialog.tsx:159:13",value:a.name,onChange:e=>l({...a,name:e.target.value}),placeholder:"例如: 数据库备份",className:"bg-[var(--dg-bg-secondary)] border-[var(--dg-border)] text-[var(--dg-text-primary)] mt-1"})]}),t.jsxs("div",{"code-path":"src/components/automation/CronJobFormDialog.tsx:168:11",children:[t.jsx(J,{"code-path":"src/components/automation/CronJobFormDialog.tsx:169:13",className:"text-[var(--dg-text-primary)]",children:"描述"}),t.jsx(Q,{"code-path":"src/components/automation/CronJobFormDialog.tsx:170:13",value:a.description,onChange:e=>l({...a,description:e.target.value}),placeholder:"任务描述...",rows:2,className:"bg-[var(--dg-bg-secondary)] border-[var(--dg-border)] text-[var(--dg-text-primary)] mt-1"})]}),t.jsxs("div",{"code-path":"src/components/automation/CronJobFormDialog.tsx:180:11",children:[t.jsx(J,{"code-path":"src/components/automation/CronJobFormDialog.tsx:181:13",className:"text-[var(--dg-text-primary)]",children:"Cron 表达式"}),t.jsxs("div",{"code-path":"src/components/automation/CronJobFormDialog.tsx:182:13",className:"flex gap-2",children:[t.jsx($,{"code-path":"src/components/automation/CronJobFormDialog.tsx:183:15",value:a.cron_expr,onChange:e=>l({...a,cron_expr:e.target.value}),placeholder:"0 2 * * *",className:"bg-[var(--dg-bg-secondary)] border-[var(--dg-border)] text-[var(--dg-text-primary)] mt-1"}),t.jsxs(O,{"code-path":"src/components/automation/CronJobFormDialog.tsx:189:15",onValueChange:e=>l({...a,cron_expr:e}),children:[t.jsx(R,{"code-path":"src/components/automation/CronJobFormDialog.tsx:190:17",className:"w-48 bg-[var(--dg-bg-secondary)] border-[var(--dg-border)] text-[var(--dg-text-primary)] mt-1",children:t.jsx(A,{"code-path":"src/components/automation/CronJobFormDialog.tsx:191:19",placeholder:"快速选择"})}),t.jsxs(V,{"code-path":"src/components/automation/CronJobFormDialog.tsx:193:17",className:"bg-[var(--dg-bg-secondary)] border-[var(--dg-border)]",children:[t.jsx(N,{"code-path":"src/components/automation/CronJobFormDialog.tsx:194:19",value:"*/5 * * * *",className:"text-[var(--dg-text-primary)]",children:"每 5 分钟"}),t.jsx(N,{"code-path":"src/components/automation/CronJobFormDialog.tsx:195:19",value:"0 * * * *",className:"text-[var(--dg-text-primary)]",children:"每小时"}),t.jsx(N,{"code-path":"src/components/automation/CronJobFormDialog.tsx:196:19",value:"0 2 * * *",className:"text-[var(--dg-text-primary)]",children:"每天 02:00"}),t.jsx(N,{"code-path":"src/components/automation/CronJobFormDialog.tsx:197:19",value:"0 3 * * 0",className:"text-[var(--dg-text-primary)]",children:"每周日 03:00"}),t.jsx(N,{"code-path":"src/components/automation/CronJobFormDialog.tsx:198:19",value:"0 9 * * 1",className:"text-[var(--dg-text-primary)]",children:"每周一 09:00"})]})]})]}),t.jsx("p",{"code-path":"src/components/automation/CronJobFormDialog.tsx:202:13",className:"text-xs text-[var(--dg-text-muted)] mt-1",children:"格式: 分 时 日 月 周"})]}),t.jsxs("div",{"code-path":"src/components/automation/CronJobFormDialog.tsx:206:11",children:[t.jsx(J,{"code-path":"src/components/automation/CronJobFormDialog.tsx:207:13",className:"text-[var(--dg-text-primary)]",children:"执行类型"}),t.jsx("div",{"code-path":"src/components/automation/CronJobFormDialog.tsx:208:13",className:"grid grid-cols-3 gap-2 mt-1",children:G.map(e=>t.jsx("button",{"code-path":"src/components/automation/CronJobFormDialog.tsx:210:17",type:"button",onClick:()=>P(e.value),className:`px-3 py-2 rounded-md border text-sm transition-colors text-left ${a.type===e.value?"border-[var(--dg-blue)] bg-[var(--dg-blue)]/10 text-[var(--dg-blue)]":"border-[var(--dg-border)] text-[var(--dg-text-secondary)] hover:bg-[var(--dg-bg-hover)]"}`,children:t.jsx("div",{"code-path":"src/components/automation/CronJobFormDialog.tsx:220:19",className:"font-medium",children:e.label})},e.value))}),t.jsx("p",{"code-path":"src/components/automation/CronJobFormDialog.tsx:224:13",className:"text-xs text-[var(--dg-text-muted)] mt-1",children:G.find(e=>e.value===a.type)?.desc})]}),a.type==="shell"||a.type==="python"?t.jsxs("div",{"code-path":"src/components/automation/CronJobFormDialog.tsx:231:13",className:"space-y-3",children:[t.jsxs("div",{"code-path":"src/components/automation/CronJobFormDialog.tsx:232:15",children:[t.jsxs(J,{"code-path":"src/components/automation/CronJobFormDialog.tsx:233:17",className:"text-[var(--dg-text-primary)]",children:["选择脚本 ",t.jsx("span",{"code-path":"src/components/automation/CronJobFormDialog.tsx:234:24",className:"text-red-400",children:"*"})]}),F.length===0?t.jsxs("div",{"code-path":"src/components/automation/CronJobFormDialog.tsx:237:19",className:"mt-1 px-3 py-4 rounded-md border border-dashed border-[var(--dg-border)] text-center",children:[t.jsxs("p",{"code-path":"src/components/automation/CronJobFormDialog.tsx:238:21",className:"text-sm text-[var(--dg-text-muted)]",children:["脚本库中没有 ",a.type==="shell"?"Shell":"Python"," 脚本"]}),t.jsxs("p",{"code-path":"src/components/automation/CronJobFormDialog.tsx:241:21",className:"text-xs text-[var(--dg-text-muted)] mt-1",children:["请先到「脚本库」创建 ",a.type==="shell"?"Shell":"Python"," 脚本"]})]}):t.jsxs(O,{"code-path":"src/components/automation/CronJobFormDialog.tsx:246:19",value:a.script_id?String(a.script_id):"",onValueChange:_,children:[t.jsx(R,{"code-path":"src/components/automation/CronJobFormDialog.tsx:250:21",className:"bg-[var(--dg-bg-secondary)] border-[var(--dg-border)] text-[var(--dg-text-primary)] mt-1",children:t.jsx(A,{"code-path":"src/components/automation/CronJobFormDialog.tsx:251:23",placeholder:"选择脚本库中的脚本..."})}),t.jsx(V,{"code-path":"src/components/automation/CronJobFormDialog.tsx:253:21",className:"bg-[var(--dg-bg-secondary)] border-[var(--dg-border)]",children:F.map(e=>t.jsxs(N,{"code-path":"src/components/automation/CronJobFormDialog.tsx:255:25",value:String(e.id),className:"text-[var(--dg-text-primary)]",children:[e.name,e.description?` — ${e.description}`:""]},e.id))})]})]}),r&&t.jsxs("div",{"code-path":"src/components/automation/CronJobFormDialog.tsx:266:17",children:[t.jsxs("div",{"code-path":"src/components/automation/CronJobFormDialog.tsx:267:19",className:"flex items-center gap-2 mb-1",children:[t.jsx(C,{"code-path":"src/components/automation/CronJobFormDialog.tsx:268:21",variant:"outline",className:"border-[var(--dg-border)] text-[var(--dg-text-muted)]",children:r.type==="shell"?"Shell":"Python"}),t.jsxs("span",{"code-path":"src/components/automation/CronJobFormDialog.tsx:271:21",className:"text-xs text-[var(--dg-text-muted)]",children:[(r.content||"").split(`
`).length," 行"]})]}),t.jsx("pre",{"code-path":"src/components/automation/CronJobFormDialog.tsx:275:19",className:"max-h-48 overflow-auto rounded-md bg-[var(--dg-bg-tertiary)] border border-[var(--dg-border)] p-3 text-xs font-mono text-[var(--dg-text-secondary)] whitespace-pre-wrap break-all",children:r.content||"(空脚本)"})]})]}):t.jsxs("div",{"code-path":"src/components/automation/CronJobFormDialog.tsx:282:13",children:[t.jsx(J,{"code-path":"src/components/automation/CronJobFormDialog.tsx:283:15",className:"text-[var(--dg-text-primary)]",children:"执行命令"}),t.jsx(Q,{"code-path":"src/components/automation/CronJobFormDialog.tsx:284:15",value:a.content,onChange:e=>l({...a,content:e.target.value}),placeholder:"/scripts/backup.sh arg1 arg2",rows:4,className:"bg-[var(--dg-bg-secondary)] border-[var(--dg-border)] text-[var(--dg-text-primary)] mt-1 font-mono"})]})]}),t.jsxs(xt,{"code-path":"src/components/automation/CronJobFormDialog.tsx:294:9",children:[t.jsx(p,{"code-path":"src/components/automation/CronJobFormDialog.tsx:295:11",variant:"outline",onClick:()=>g(!1),className:"border-[var(--dg-border)] text-[var(--dg-text-secondary)]",children:"取消"}),t.jsx(p,{"code-path":"src/components/automation/CronJobFormDialog.tsx:298:11",className:"bg-blue-600 hover:bg-blue-700",onClick:k,disabled:H,children:H?"保存中...":s?"保存修改":"创建任务"})]})]})})}function St({open:i,onOpenChange:g}){const[s,D]=n.useState([]),[a,l]=n.useState(!1),[h,v]=n.useState(null);return n.useEffect(()=>{if(!i)return;(async()=>{try{l(!0);const m=await bt.getExecutions({task_type:"cron",page_size:50});D(m.list||[])}catch(m){console.error("Failed to load executions:",m)}finally{l(!1)}})()},[i]),t.jsx(K,{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:51:5",open:i,onOpenChange:g,children:t.jsxs(U,{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:52:7",className:"max-w-4xl bg-[var(--dg-bg-primary)] border-[var(--dg-border)] text-[var(--dg-text-primary)] max-h-[85vh] overflow-y-auto",children:[t.jsxs(W,{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:53:9",children:[t.jsx(Y,{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:54:11",children:"执行历史"}),t.jsx(Z,{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:55:11",className:"text-[var(--dg-text-secondary)]",children:"定时任务执行记录与输出日志"})]}),t.jsx("div",{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:57:9",className:"mt-4",children:a?t.jsx("div",{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:59:13",className:"flex items-center justify-center py-8",children:t.jsx(L,{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:60:15",className:"h-6 w-6 text-[var(--dg-text-secondary)] animate-spin"})}):s.length===0?t.jsxs("div",{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:63:13",className:"flex flex-col items-center justify-center py-12 text-[var(--dg-text-secondary)]",children:[t.jsx(ot,{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:64:15",className:"h-10 w-10 mb-3 opacity-40"}),t.jsx("p",{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:65:15",className:"text-sm",children:"暂无执行记录"})]}):t.jsxs(yt,{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:68:13",children:[t.jsx(Ct,{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:69:15",children:t.jsxs(I,{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:70:17",className:"border-[var(--dg-border)]",children:[t.jsx(E,{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:71:19",className:"text-[var(--dg-text-secondary)]",children:"任务"}),t.jsx(E,{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:72:19",className:"text-[var(--dg-text-secondary)]",children:"状态"}),t.jsx(E,{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:73:19",className:"text-[var(--dg-text-secondary)]",children:"耗时"}),t.jsx(E,{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:74:19",className:"text-[var(--dg-text-secondary)]",children:"执行时间"}),t.jsx(E,{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:75:19",className:"text-[var(--dg-text-secondary)]",children:"输出"})]})}),t.jsx(jt,{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:78:15",children:s.map(r=>t.jsxs(n.Fragment,{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:80:19",children:[t.jsxs(I,{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:81:21",className:"border-[var(--dg-border)] cursor-pointer hover:bg-[var(--dg-bg-hover)]/50",onClick:()=>v(h===r.id?null:r.id),children:[t.jsx(f,{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:82:23",className:"text-[var(--dg-text-primary)]",children:r.task_name}),t.jsx(f,{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:83:23",children:et(r.status)}),t.jsx(f,{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:84:23",className:"text-[var(--dg-text-secondary)]",children:r.duration?`${r.duration}ms`:"--"}),t.jsx(f,{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:85:23",className:"text-[var(--dg-text-secondary)]",children:r.started_at?new Date(r.started_at).toLocaleString():"--"}),t.jsx(f,{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:88:23",className:"text-[var(--dg-text-secondary)]",children:r.output?t.jsxs("span",{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:90:27",className:"text-blue-400 text-xs flex items-center gap-1",children:[t.jsx(tt,{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:91:29",className:"h-3 w-3"}),h===r.id?"收起":"查看"]}):"--"})]}),h===r.id&&r.output&&t.jsx(I,{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:100:23",className:"border-[var(--dg-border)]",children:t.jsx(f,{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:101:25",colSpan:5,className:"bg-[var(--dg-bg-tertiary)] p-0",children:t.jsx("pre",{"code-path":"src/components/automation/ExecutionHistoryDialog.tsx:102:27",className:"p-4 text-xs text-[var(--dg-text-primary)] font-mono whitespace-pre-wrap max-h-64 overflow-y-auto",children:r.output})})},`${r.id}-out`)]},r.id))})]})})]})})}function Ut(){const[i,g]=n.useState(""),[s,D]=n.useState([]),[a,l]=n.useState(!0),[h,v]=n.useState(!1),[r,m]=n.useState(!1),[H,M]=n.useState(!1),[F,_]=n.useState(null),[P,k]=n.useState(null),[e,x]=n.useState([]),j=pt(),at=()=>{k(null),m(!0)},st=o=>{k(o),m(!0)},u=n.useCallback(async()=>{v(!0);try{const o=await y.getJobs();D(o.list||[])}catch(o){console.error("Failed to load cron jobs:",o),d.error("加载失败")}finally{v(!1),l(!1)}},[]);n.useEffect(()=>{u()},[u]);const b=s.filter(o=>(o.name||"").toLowerCase().includes(i.toLowerCase())||(o.description||"").toLowerCase().includes(i.toLowerCase())),rt=async o=>{try{await y.toggleJob(o),d.success("状态已切换"),u()}catch(c){console.error("Failed to toggle job:",c),d.error("操作失败")}},nt=async o=>{_(o);try{const c=await y.executeJob(o);(c?.status||"success")==="success"?d.success("执行成功",{description:`耗时 ${c?.duration||0}ms`}):d.error("执行失败",{description:(c?.output||"").slice(0,100)}),u()}catch(c){console.error("Failed to execute job:",c),d.error("执行失败")}finally{_(null)}},ct=async o=>{if(await j({title:"删除定时任务",description:`确定删除「${o.name}」吗?此操作不可恢复。`,variant:"destructive"}))try{await y.deleteJob(o.id),d.success("任务已删除"),u()}catch(T){console.error("Failed to delete job:",T),d.error("删除失败")}},it=o=>{x(c=>c.includes(o)?c.filter(T=>T!==o):[...c,o])},dt=()=>{e.length===b.length&&b.length>0?x([]):x(b.map(o=>o.id))},lt=async()=>{if(!(e.length===0||!await j({title:"批量删除定时任务",description:`确定删除选中的 ${e.length} 个任务吗?此操作不可恢复。`,confirmText:"批量删除",variant:"destructive"})))try{await y.batchDelete(e),d.success(`已删除 ${e.length} 个任务`),x([]),u()}catch(c){console.error("Failed to batch delete jobs:",c),d.error("批量删除失败")}};return t.jsxs("div",{"code-path":"src/components/automation/CronJobManager.tsx:164:5",className:"space-y-6",children:[t.jsxs("div",{"code-path":"src/components/automation/CronJobManager.tsx:166:7",className:"flex items-center justify-between",children:[t.jsxs("div",{"code-path":"src/components/automation/CronJobManager.tsx:167:9",children:[t.jsx("h1",{"code-path":"src/components/automation/CronJobManager.tsx:168:11",className:"text-2xl font-bold text-[var(--dg-text-primary)]",children:"定时任务"}),t.jsx("p",{"code-path":"src/components/automation/CronJobManager.tsx:169:11",className:"text-sm text-[var(--dg-text-secondary)] mt-1",children:"Cron 任务管理与执行"})]}),t.jsxs("div",{"code-path":"src/components/automation/CronJobManager.tsx:171:9",className:"flex items-center gap-2",children:[t.jsxs(p,{"code-path":"src/components/automation/CronJobManager.tsx:172:11",variant:"outline",className:"border-[var(--dg-border)] text-[var(--dg-text-secondary)]",onClick:()=>M(!0),children:[t.jsx(ot,{"code-path":"src/components/automation/CronJobManager.tsx:177:13",className:"h-4 w-4 mr-2"}),"执行历史"]}),t.jsxs(p,{"code-path":"src/components/automation/CronJobManager.tsx:180:11",variant:"outline",className:"border-[var(--dg-border)] text-[var(--dg-text-secondary)]",onClick:()=>u(),disabled:h,children:[t.jsx(Nt,{"code-path":"src/components/automation/CronJobManager.tsx:186:13",className:`h-4 w-4 mr-2 ${h?"animate-spin":""}`}),"刷新"]}),t.jsxs(p,{"code-path":"src/components/automation/CronJobManager.tsx:189:11",className:"bg-blue-600 hover:bg-blue-700",onClick:at,children:[t.jsx(Jt,{"code-path":"src/components/automation/CronJobManager.tsx:190:13",className:"h-4 w-4 mr-2"}),"新建任务"]})]})]}),t.jsxs("div",{"code-path":"src/components/automation/CronJobManager.tsx:197:7",className:"grid grid-cols-4 gap-4",children:[t.jsx(w,{"code-path":"src/components/automation/CronJobManager.tsx:198:9",className:"bg-[var(--dg-bg-secondary)] border-[var(--dg-border)]",children:t.jsxs(S,{"code-path":"src/components/automation/CronJobManager.tsx:199:11",className:"p-4",children:[t.jsx("p",{"code-path":"src/components/automation/CronJobManager.tsx:200:13",className:"text-[var(--dg-text-secondary)] text-sm",children:"任务总数"}),t.jsx("p",{"code-path":"src/components/automation/CronJobManager.tsx:201:13",className:"text-2xl font-bold text-[var(--dg-text-primary)]",children:s.length})]})}),t.jsx(w,{"code-path":"src/components/automation/CronJobManager.tsx:204:9",className:"bg-[var(--dg-bg-secondary)] border-[var(--dg-border)]",children:t.jsxs(S,{"code-path":"src/components/automation/CronJobManager.tsx:205:11",className:"p-4",children:[t.jsx("p",{"code-path":"src/components/automation/CronJobManager.tsx:206:13",className:"text-[var(--dg-text-secondary)] text-sm",children:"已启用"}),t.jsx("p",{"code-path":"src/components/automation/CronJobManager.tsx:207:13",className:"text-2xl font-bold text-emerald-400",children:s.filter(o=>o.enabled).length})]})}),t.jsx(w,{"code-path":"src/components/automation/CronJobManager.tsx:212:9",className:"bg-[var(--dg-bg-secondary)] border-[var(--dg-border)]",children:t.jsxs(S,{"code-path":"src/components/automation/CronJobManager.tsx:213:11",className:"p-4",children:[t.jsx("p",{"code-path":"src/components/automation/CronJobManager.tsx:214:13",className:"text-[var(--dg-text-secondary)] text-sm",children:"累计成功"}),t.jsx("p",{"code-path":"src/components/automation/CronJobManager.tsx:215:13",className:"text-2xl font-bold text-emerald-400",children:s.reduce((o,c)=>o+(c.success_count||0),0)})]})}),t.jsx(w,{"code-path":"src/components/automation/CronJobManager.tsx:220:9",className:"bg-[var(--dg-bg-secondary)] border-[var(--dg-border)]",children:t.jsxs(S,{"code-path":"src/components/automation/CronJobManager.tsx:221:11",className:"p-4",children:[t.jsx("p",{"code-path":"src/components/automation/CronJobManager.tsx:222:13",className:"text-[var(--dg-text-secondary)] text-sm",children:"累计失败"}),t.jsx("p",{"code-path":"src/components/automation/CronJobManager.tsx:223:13",className:"text-2xl font-bold text-red-400",children:s.reduce((o,c)=>o+(c.fail_count||0),0)})]})})]}),t.jsxs("div",{"code-path":"src/components/automation/CronJobManager.tsx:231:7",className:"flex items-center justify-between flex-wrap gap-4",children:[t.jsxs("div",{"code-path":"src/components/automation/CronJobManager.tsx:232:9",className:"flex items-center gap-3 flex-wrap",children:[t.jsxs("div",{"code-path":"src/components/automation/CronJobManager.tsx:233:11",className:"relative flex-1 max-w-md",children:[t.jsx(ht,{"code-path":"src/components/automation/CronJobManager.tsx:234:13",className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-[var(--dg-text-secondary)]"}),t.jsx($,{"code-path":"src/components/automation/CronJobManager.tsx:235:13",placeholder:"搜索任务...",value:i,onChange:o=>g(o.target.value),className:"pl-10 bg-[var(--dg-bg-secondary)] border-[var(--dg-border)] text-[var(--dg-text-primary)]"})]}),b.length>0&&t.jsxs("label",{"code-path":"src/components/automation/CronJobManager.tsx:243:13",className:"flex items-center gap-2 text-sm text-[var(--dg-text-secondary)] cursor-pointer select-none",children:[t.jsx(B,{"code-path":"src/components/automation/CronJobManager.tsx:244:15",checked:e.length===b.length&&b.length>0,onCheckedChange:dt,className:"border-[var(--dg-border)]"}),"全选"]})]}),e.length>0&&t.jsxs("div",{"code-path":"src/components/automation/CronJobManager.tsx:256:11",className:"flex items-center gap-2",children:[t.jsxs("span",{"code-path":"src/components/automation/CronJobManager.tsx:257:13",className:"text-sm text-[var(--dg-text-secondary)]",children:["已选择 ",e.length," 项"]}),t.jsxs(p,{"code-path":"src/components/automation/CronJobManager.tsx:258:13",variant:"outline",size:"sm",className:"border-red-500/30 text-red-400 hover:bg-red-500/10",onClick:lt,children:[t.jsx(q,{"code-path":"src/components/automation/CronJobManager.tsx:264:15",className:"h-4 w-4 mr-2"}),"批量删除"]})]})]}),a?t.jsx("div",{"code-path":"src/components/automation/CronJobManager.tsx:272:9",className:"flex items-center justify-center py-12",children:t.jsx(L,{"code-path":"src/components/automation/CronJobManager.tsx:273:11",className:"h-6 w-6 text-[var(--dg-text-secondary)] animate-spin"})}):b.length===0?t.jsxs("div",{"code-path":"src/components/automation/CronJobManager.tsx:276:9",className:"flex flex-col items-center justify-center py-16 text-[var(--dg-text-secondary)]",children:[t.jsx(ft,{"code-path":"src/components/automation/CronJobManager.tsx:277:11",className:"h-12 w-12 mb-3 opacity-40"}),t.jsx("p",{"code-path":"src/components/automation/CronJobManager.tsx:278:11",className:"text-sm",children:"暂无定时任务"})]}):null,t.jsx("div",{"code-path":"src/components/automation/CronJobManager.tsx:283:7",className:"space-y-3",children:b.map(o=>t.jsx(w,{"code-path":"src/components/automation/CronJobManager.tsx:285:11",className:"bg-[var(--dg-bg-secondary)] border-[var(--dg-border)]",children:t.jsx(S,{"code-path":"src/components/automation/CronJobManager.tsx:286:13",className:"p-4",children:t.jsxs("div",{"code-path":"src/components/automation/CronJobManager.tsx:287:15",className:"flex items-start justify-between gap-3",children:[t.jsx("div",{"code-path":"src/components/automation/CronJobManager.tsx:288:17",className:"flex items-center pt-1",children:t.jsx(B,{"code-path":"src/components/automation/CronJobManager.tsx:289:19",checked:e.includes(o.id),onCheckedChange:()=>it(o.id),className:"border-[var(--dg-border)]"})}),t.jsxs("div",{"code-path":"src/components/automation/CronJobManager.tsx:295:17",className:"flex-1 min-w-0",children:[t.jsxs("div",{"code-path":"src/components/automation/CronJobManager.tsx:296:19",className:"flex items-center gap-3 flex-wrap",children:[t.jsx("h3",{"code-path":"src/components/automation/CronJobManager.tsx:297:21",className:"font-medium text-[var(--dg-text-primary)]",children:o.name}),t.jsx(C,{"code-path":"src/components/automation/CronJobManager.tsx:298:21",variant:"outline",className:o.enabled?"border-emerald-500/30 text-emerald-400 bg-emerald-500/10":"border-[var(--dg-border)] text-[var(--dg-text-muted)]",children:o.enabled?"已启用":"已禁用"}),et(o.last_status),t.jsx(C,{"code-path":"src/components/automation/CronJobManager.tsx:309:21",variant:"outline",className:"border-[var(--dg-border)] text-[var(--dg-text-secondary)]",children:o.type==="shell"?"Shell":o.type==="python"?"Python":"命令"})]}),t.jsx("p",{"code-path":"src/components/automation/CronJobManager.tsx:313:19",className:"text-sm text-[var(--dg-text-secondary)] mt-1",children:o.description||"—"}),t.jsxs("div",{"code-path":"src/components/automation/CronJobManager.tsx:314:19",className:"flex items-center gap-4 mt-2 text-sm",children:[t.jsxs("span",{"code-path":"src/components/automation/CronJobManager.tsx:315:21",className:"flex items-center gap-1 text-[var(--dg-text-secondary)]",children:[t.jsx(gt,{"code-path":"src/components/automation/CronJobManager.tsx:316:23",className:"h-3 w-3"}),Ft(o.cron_expr)]}),(o.type==="shell"||o.type==="python")&&o.script?.name?t.jsxs("span",{"code-path":"src/components/automation/CronJobManager.tsx:320:23",className:"flex items-center gap-1 text-[var(--dg-text-secondary)]",children:[t.jsx(ut,{"code-path":"src/components/automation/CronJobManager.tsx:321:25",className:"h-3 w-3"}),t.jsx("span",{"code-path":"src/components/automation/CronJobManager.tsx:322:25",className:"text-xs",children:o.script.name})]}):o.content&&t.jsxs("span",{"code-path":"src/components/automation/CronJobManager.tsx:325:23",className:"flex items-center gap-1 text-[var(--dg-text-secondary)]",children:[t.jsx(tt,{"code-path":"src/components/automation/CronJobManager.tsx:326:25",className:"h-3 w-3"}),t.jsx("code",{"code-path":"src/components/automation/CronJobManager.tsx:327:25",className:"text-xs bg-[var(--dg-bg-tertiary)] px-2 py-0.5 rounded truncate max-w-xs",children:o.content})]})]}),t.jsxs("div",{"code-path":"src/components/automation/CronJobManager.tsx:333:19",className:"flex items-center gap-4 mt-2 text-xs text-[var(--dg-text-muted)]",children:[t.jsxs("span",{"code-path":"src/components/automation/CronJobManager.tsx:334:21",children:["上次执行: ",o.last_run_at?new Date(o.last_run_at).toLocaleString():"--"]}),t.jsxs("span",{"code-path":"src/components/automation/CronJobManager.tsx:335:21",children:["成功: ",o.success_count||0," / 失败: ",o.fail_count||0]}),t.jsxs("span",{"code-path":"src/components/automation/CronJobManager.tsx:336:21",children:["累计: ",o.run_count||0," 次"]})]})]}),t.jsxs("div",{"code-path":"src/components/automation/CronJobManager.tsx:340:17",className:"flex items-center gap-2 shrink-0",children:[t.jsxs(p,{"code-path":"src/components/automation/CronJobManager.tsx:341:19",variant:"outline",size:"sm",className:"border-emerald-600 text-emerald-400 hover:bg-emerald-600/20",disabled:F===o.id,onClick:()=>nt(o.id),children:[F===o.id?t.jsx(L,{"code-path":"src/components/automation/CronJobManager.tsx:349:23",className:"h-4 w-4 mr-1 animate-spin"}):t.jsx(X,{"code-path":"src/components/automation/CronJobManager.tsx:351:23",className:"h-4 w-4 mr-1"}),"立即执行"]}),t.jsx(p,{"code-path":"src/components/automation/CronJobManager.tsx:355:19",variant:"ghost",size:"icon",className:"h-8 w-8 text-[var(--dg-text-secondary)] hover:text-blue-400",title:o.enabled?"禁用":"启用",onClick:()=>rt(o.id),children:o.enabled?t.jsx(Dt,{"code-path":"src/components/automation/CronJobManager.tsx:362:36",className:"h-4 w-4"}):t.jsx(X,{"code-path":"src/components/automation/CronJobManager.tsx:362:68",className:"h-4 w-4"})}),t.jsx(p,{"code-path":"src/components/automation/CronJobManager.tsx:364:19",variant:"ghost",size:"icon",className:"h-8 w-8 text-[var(--dg-text-secondary)] hover:text-blue-400",title:"编辑",onClick:()=>st(o),children:t.jsx(Mt,{"code-path":"src/components/automation/CronJobManager.tsx:371:21",className:"h-4 w-4"})}),t.jsx(p,{"code-path":"src/components/automation/CronJobManager.tsx:373:19",variant:"ghost",size:"icon",className:"h-8 w-8 text-[var(--dg-text-secondary)] hover:text-red-400",title:"删除",onClick:()=>ct(o),children:t.jsx(q,{"code-path":"src/components/automation/CronJobManager.tsx:380:21",className:"h-4 w-4"})})]})]})})},o.id))}),t.jsx(wt,{"code-path":"src/components/automation/CronJobManager.tsx:390:7",open:r,onOpenChange:m,editJob:P,onSuccess:u}),t.jsx(St,{"code-path":"src/components/automation/CronJobManager.tsx:398:7",open:H,onOpenChange:M})]})}export{Ut as CronJobManager};