Files
ai-agent/web/app/dashboard/tickets/_components/ticket-sla-badge.tsx
T
2026-04-24 12:01:30 +08:00

63 lines
1.7 KiB
TypeScript

"use client"
import { Badge } from "@/components/ui/badge"
import type { TicketItem } from "@/lib/api/ticket"
function isClosedStatus(status: string) {
return status === "resolved" || status === "closed" || status === "cancelled"
}
export function TicketSLABadge({ ticket }: { ticket: TicketItem }) {
if (isClosedStatus(ticket.status)) {
return (
<Badge variant="outline" className="border-border bg-muted text-muted-foreground">
已结束
</Badge>
)
}
if (!ticket.resolveDeadlineAt) {
return (
<Badge variant="outline" className="border-border bg-muted text-muted-foreground">
未设置
</Badge>
)
}
const deadline = new Date(ticket.resolveDeadlineAt.replace(" ", "T"))
if (Number.isNaN(deadline.getTime())) {
return (
<Badge variant="outline" className="border-border bg-muted text-muted-foreground">
未设置
</Badge>
)
}
const remainingMinutes = Math.floor((deadline.getTime() - Date.now()) / 60000)
if (remainingMinutes < 0) {
return (
<Badge variant="outline" className="border-red-500/20 bg-red-500/10 text-red-700">
已超时
</Badge>
)
}
if (remainingMinutes <= 60) {
return (
<Badge variant="outline" className="border-red-500/20 bg-red-500/10 text-red-700">
1 小时内
</Badge>
)
}
if (remainingMinutes <= 240) {
return (
<Badge variant="outline" className="border-amber-500/20 bg-amber-500/10 text-amber-700">
今日风险
</Badge>
)
}
return (
<Badge variant="outline" className="border-emerald-500/20 bg-emerald-500/10 text-emerald-700">
正常
</Badge>
)
}