From 24581166bcc43bc39588a8acdffa2ce742eaef28 Mon Sep 17 00:00:00 2001 From: gitadmin Date: Thu, 25 Jun 2026 11:47:14 +0800 Subject: [PATCH] =?UTF-8?q?fix(monitor):=20OEM=E7=BB=B4=E4=BF=AE=E8=B6=85?= =?UTF-8?q?=E6=97=B6=E6=8F=90=E9=86=92=E6=B6=88=E6=81=AF=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 超时提醒格式:第X档已超时,达到第Y档扣XX% - 提前1小时提醒格式:距离第X档(扣XX%)还剩1小时 - 第四档超时提示:已触发全额扣费(100%) - 第四档还剩1小时提示:距离全额扣费(100%)还剩1小时 - 静默期积压消息:动态计算剩余时间并显示扣费比例 - 消息内容与空行分隔 --- src/lib/monitor/reminder-engine.ts | 35 ++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/lib/monitor/reminder-engine.ts b/src/lib/monitor/reminder-engine.ts index 0bb9783..8eff76e 100644 --- a/src/lib/monitor/reminder-engine.ts +++ b/src/lib/monitor/reminder-engine.ts @@ -110,7 +110,7 @@ export class ReminderEngine { if (r.order_number) text += `工单号:${r.order_number}\n` text += `服务器IP:${r.server_ip || '未知'}\n服务器SN:${r.server_sn}\n` if (rackH) text += `机架位置:${rackH}\n` - text += `到期时间:${r.deadline_time}\n服务器尚未录入恢复时间,请及时处理!` + text += `到期时间:${r.deadline_time}\n\n服务器尚未录入恢复时间,请及时处理!` 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) } @@ -140,13 +140,17 @@ export class ReminderEngine { // 构建消息 let text = '' if (p.message_type === 'oem_diag') { - text = `⏰ OEM诊断工单提醒\n\n` + text = `OEM诊断工单提醒\n\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') { - text = `⏰ OEM维修工单提醒\n\n` + // 重新计算剩余时间 + const tierPenaltyMap: Record = { '第一档': '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` - 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)) { 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') { 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 = { '第一档': '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` text += `服务器IP:${r.server_ip || '未知'}\n服务器SN:${r.server_sn}\n` if (rackRO) text += `机架位置:${rackRO}\n` @@ -188,15 +198,16 @@ export class ReminderEngine { continue } const rackRB = getRack ? await getRack(r.server_ip, r.server_sn) : null - // 第五档用紧急图标,其他档位用普通图标 - const tierIcon = r.tier_name === '第五档' ? '🚨' : '⏰' - const tierDesc = r.tier_name === '第五档' ? '扣100%' : r.tier_name === '第四档' ? '扣50%' : '' - let text = `${tierIcon} OEM维修工单提醒(距离${r.tier_name}${tierDesc ? `(${tierDesc})` : ''}超时还剩1小时)\n\n` + // 提前1小时提醒格式:距离第X档(扣XX%)还剩1小时 + const tierPenaltyMap: Record = { '第一档': '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` text += `服务器IP:${r.server_ip || '未知'}\n服务器SN:${r.server_sn}\n` if (rackRB) text += `机架位置:${rackRB}\n` - text += `${r.tier_name}到期时间:${r.deadline_time}\n服务器尚未录入恢复时间,请及时处理!` - if (r.tier_name === '第五档') text += `\n\n⚠️ 请注意:第五档超时后将触发全额扣费(100%),请立即处理!` + text += `${r.tier_name}到期时间:${r.deadline_time}\n\n服务器尚未录入恢复时间,请及时处理!` 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) }