Compare commits

...

2 Commits

Author SHA1 Message Date
gitadmin 24581166bc fix(monitor): OEM维修超时提醒消息格式优化
- 超时提醒格式:第X档已超时,达到第Y档扣XX%
- 提前1小时提醒格式:距离第X档(扣XX%)还剩1小时
- 第四档超时提示:已触发全额扣费(100%)
- 第四档还剩1小时提示:距离全额扣费(100%)还剩1小时
- 静默期积压消息:动态计算剩余时间并显示扣费比例
- 消息内容与空行分隔
2026-06-25 11:49:10 +08:00
gitadmin 3fd09dec25 fix(monitor): OEM维修第五档提醒消息区分扣费比例
- 第四档: 图标 + '距离第四档(扣50%)超时还剩1小时'
- 第五档:🚨 图标 + '距离第五档(扣100%)超时还剩1小时'
- 第五档额外提示:'即将进入全额扣费,请立即处理'
2026-06-25 11:12:45 +08:00
1 changed files with 23 additions and 8 deletions

View File

@ -110,7 +110,7 @@ export class ReminderEngine {
if (r.order_number) text += `工单号:${r.order_number}\n` if (r.order_number) text += `工单号:${r.order_number}\n`
text += `服务器IP${r.server_ip || '未知'}\n服务器SN${r.server_sn}\n` text += `服务器IP${r.server_ip || '未知'}\n服务器SN${r.server_sn}\n`
if (rackH) text += `机架位置:${rackH}\n` if (rackH) text += `机架位置:${rackH}\n`
text += `到期时间:${r.deadline_time}\n服务器尚未录入恢复时间,请及时处理!` text += `到期时间:${r.deadline_time}\n\n服务器尚未录入恢复时间,请及时处理!`
if (await pushText(text)) { if (await pushText(text)) {
this.db.prepare("UPDATE reminder_state SET notification_phase = 'before', notified_at = datetime('now', '+8 hours') WHERE id = ?").run(r.id) this.db.prepare("UPDATE reminder_state SET notification_phase = 'before', notified_at = datetime('now', '+8 hours') WHERE id = ?").run(r.id)
} }
@ -140,13 +140,17 @@ export class ReminderEngine {
// 构建消息 // 构建消息
let text = '' let text = ''
if (p.message_type === 'oem_diag') { if (p.message_type === 'oem_diag') {
text = `OEM诊断工单提醒\n\n` text = `OEM诊断工单提醒\n\n`
if (payload.order_number) text += `工单号:${payload.order_number}\n` if (payload.order_number) text += `工单号:${payload.order_number}\n`
text += `服务器IP${payload.server_ip || '未知'}\n服务器SN${payload.server_sn}\n到期时间${payload.deadline}\n服务器尚未录入恢复时间,请及时处理!` text += `服务器IP${payload.server_ip || '未知'}\n服务器SN${payload.server_sn}\n到期时间${payload.deadline}\n\n服务器尚未录入恢复时间,请及时处理!`
} else if (p.message_type === 'oem_repair' && payload.type === 'repair_before') { } else if (p.message_type === 'oem_repair' && payload.type === 'repair_before') {
text = `⏰ OEM维修工单提醒\n\n` // 重新计算剩余时间
const tierPenaltyMap: Record<string, string> = { '第一档': '10%', '第二档': '25%', '第三档': '50%', '第四档': '100%' }
const penalty = payload.tier_name ? tierPenaltyMap[payload.tier_name] || '' : ''
const tierLabel = payload.tier_name === '第四档' ? '全额扣费100%' : `${payload.tier_name}${penalty}`
text = `OEM维修工单超时提醒距离${tierLabel}还剩1小时\n\n`
if (payload.order_number) text += `工单号:${payload.order_number}\n` if (payload.order_number) text += `工单号:${payload.order_number}\n`
text += `服务器IP${payload.server_ip || '未知'}\n服务器SN${payload.server_sn}\n到期时间${payload.deadline}\n服务器尚未录入恢复时间请及时处理` text += `服务器IP${payload.server_ip || '未知'}\n服务器SN${payload.server_sn}\n到期时间${payload.deadline}\n\n服务器尚未录入恢复时间,请及时处理!`
} }
if (text && await pushText(text)) { if (text && await pushText(text)) {
this.db.prepare('DELETE FROM pending_messages WHERE id = ?').run(p.id) this.db.prepare('DELETE FROM pending_messages WHERE id = ?').run(p.id)
@ -169,7 +173,13 @@ export class ReminderEngine {
if (timeToDeadline <= 0 && r.notification_phase !== 'overdue') { if (timeToDeadline <= 0 && r.notification_phase !== 'overdue') {
const rackRO = getRack ? await getRack(r.server_ip, r.server_sn) : null const rackRO = getRack ? await getRack(r.server_ip, r.server_sn) : null
let text = `⚠️ OEM维修工单已触发${r.tier_name}超时\n\n` // 超时提醒格式第X档已超时达到第Y档扣XX%
const tierPenaltyMap: Record<string, string> = { '第一档': '10%', '第二档': '25%', '第三档': '50%', '第四档': '100%' }
const penalty = tierPenaltyMap[r.tier_name] || ''
const isFinalTier = r.tier_name === '第四档'
let text = isFinalTier
? `OEM维修工单超时提醒${r.tier_name}已超时已触发全额扣费100%\n\n`
: `OEM维修工单超时提醒${r.tier_name}已超时,达到${r.tier_name}${penalty}\n\n`
if (r.order_number) text += `工单号:${r.order_number}\n` if (r.order_number) text += `工单号:${r.order_number}\n`
text += `服务器IP${r.server_ip || '未知'}\n服务器SN${r.server_sn}\n` text += `服务器IP${r.server_ip || '未知'}\n服务器SN${r.server_sn}\n`
if (rackRO) text += `机架位置:${rackRO}\n` if (rackRO) text += `机架位置:${rackRO}\n`
@ -188,11 +198,16 @@ export class ReminderEngine {
continue continue
} }
const rackRB = getRack ? await getRack(r.server_ip, r.server_sn) : null const rackRB = getRack ? await getRack(r.server_ip, r.server_sn) : null
let text = `⏰ OEM维修工单提醒距离${r.tier_name}超时还剩1小时\n\n` // 提前1小时提醒格式距离第X档扣XX%还剩1小时
const tierPenaltyMap: Record<string, string> = { '第一档': '10%', '第二档': '25%', '第三档': '50%', '第四档': '100%' }
const penalty = tierPenaltyMap[r.tier_name] || ''
const isFinalTier = r.tier_name === '第四档'
const tierLabel = isFinalTier ? '全额扣费100%' : `${r.tier_name}${penalty}`
let text = `OEM维修工单超时提醒距离${tierLabel}还剩1小时\n\n`
if (r.order_number) text += `工单号:${r.order_number}\n` if (r.order_number) text += `工单号:${r.order_number}\n`
text += `服务器IP${r.server_ip || '未知'}\n服务器SN${r.server_sn}\n` text += `服务器IP${r.server_ip || '未知'}\n服务器SN${r.server_sn}\n`
if (rackRB) text += `机架位置:${rackRB}\n` if (rackRB) text += `机架位置:${rackRB}\n`
text += `${r.tier_name}到期时间:${r.deadline_time}\n服务器尚未录入恢复时间请及时处理` text += `${r.tier_name}到期时间:${r.deadline_time}\n\n服务器尚未录入恢复时间,请及时处理!`
if (await pushText(text)) { if (await pushText(text)) {
this.db.prepare("UPDATE reminder_state SET notification_phase = 'before', notified_at = datetime('now', '+8 hours') WHERE id = ?").run(r.id) this.db.prepare("UPDATE reminder_state SET notification_phase = 'before', notified_at = datetime('now', '+8 hours') WHERE id = ?").run(r.id)
} }