35 lines
1.5 KiB
TypeScript
35 lines
1.5 KiB
TypeScript
// src/lib/monitor/resolution-side-effects.ts
|
||
import { getDb } from '@/lib/db'
|
||
|
||
/**
|
||
* 结单副作用:回写 fault_records + 清理 reminder_state。
|
||
* 同步执行(better-sqlite3),对手动/外部/导入工单(无 fault_records)是安全 no-op。
|
||
* 必须在 notifyTicketResolved 之前调用(写 DB 不依赖推送结果)。
|
||
*/
|
||
export function applyResolutionSideEffects(ticketId: number): void {
|
||
const db = getDb()
|
||
const ticket = db.prepare(`
|
||
SELECT ticket_no, close_time, assign_time, device_sn
|
||
FROM tickets WHERE id = ?
|
||
`).get(ticketId) as {
|
||
ticket_no: string; close_time: string | null; assign_time: string; device_sn: string
|
||
} | undefined
|
||
if (!ticket || !ticket.close_time) return
|
||
|
||
// 1. 回写 fault_records(若存在 ongoing 记录)
|
||
const fault = db.prepare(
|
||
"SELECT id FROM fault_records WHERE order_number = ? AND status = 'ongoing'"
|
||
).get(ticket.ticket_no) as { id: number } | undefined
|
||
if (fault) {
|
||
const assignMs = new Date(ticket.assign_time.replace(' ', 'T') + '+08:00').getTime()
|
||
const closeMs = new Date(ticket.close_time.replace(' ', 'T') + '+08:00').getTime()
|
||
const durationSec = Math.floor((closeMs - assignMs) / 1000)
|
||
db.prepare(
|
||
"UPDATE fault_records SET status = 'resolved', recovery_time = ?, duration_seconds = ? WHERE id = ?"
|
||
).run(ticket.close_time, durationSec, fault.id)
|
||
}
|
||
|
||
// 2. 清理 reminder_state(无对应记录时是安全 no-op)
|
||
db.prepare("DELETE FROM reminder_state WHERE order_number = ?").run(ticket.ticket_no)
|
||
}
|