#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 通知模板資料模型 用於管理 n8n 和系統通知的訊息模板 """ from sqlalchemy import Column, Integer, String, Text, Boolean, DateTime from sqlalchemy.ext.declarative import declarative_base from datetime import datetime, timezone, timedelta Base = declarative_base() TAIPEI_TZ = timezone(timedelta(hours=8)) class NotificationTemplate(Base): """通知模板""" __tablename__ = 'notification_templates' id = Column(Integer, primary_key=True) code = Column(String(50), unique=True, nullable=False) # 模板代碼,如 'disk_alert' name = Column(String(100), nullable=False) # 顯示名稱 category = Column(String(50), nullable=False) # 分類:system, business, report channel = Column(String(20), default='telegram') # 通知渠道:telegram, line, both # 模板內容 title = Column(String(200)) # 標題 body = Column(Text, nullable=False) # 訊息內容(支援變數) emoji_prefix = Column(String(10)) # 前綴 emoji # 狀態 is_active = Column(Boolean, default=True) # 時間戳 created_at = Column(DateTime, default=lambda: datetime.now(TAIPEI_TZ).replace(tzinfo=None)) updated_at = Column(DateTime, onupdate=lambda: datetime.now(TAIPEI_TZ).replace(tzinfo=None)) def to_dict(self): return { 'id': self.id, 'code': self.code, 'name': self.name, 'category': self.category, 'channel': self.channel, 'title': self.title, 'body': self.body, 'emoji_prefix': self.emoji_prefix, 'is_active': self.is_active, 'created_at': self.created_at.isoformat() if self.created_at else None, 'updated_at': self.updated_at.isoformat() if self.updated_at else None } # 預設模板 DEFAULT_TEMPLATES = [ { 'code': 'disk_warning', 'name': '磁碟空間警告', 'category': 'system', 'channel': 'telegram', 'emoji_prefix': '🟠', 'title': '磁碟空間警告', 'body': '''📊 使用率: {usage_percent}% 💾 剩餘: {free_gb} GB / {total_gb} GB 🔧 正在執行自動清理...''' }, { 'code': 'disk_critical', 'name': '磁碟空間嚴重不足', 'category': 'system', 'channel': 'telegram', 'emoji_prefix': '🔴', 'title': '磁碟空間嚴重不足', 'body': '''📊 使用率: {usage_percent}% 💾 剩餘: {free_gb} GB / {total_gb} GB ⚠️ 立即執行緊急清理!''' }, { 'code': 'cleanup_complete', 'name': '自動清理完成', 'category': 'system', 'channel': 'telegram', 'emoji_prefix': '✅', 'title': '自動清理完成', 'body': '''🧹 清理結果: {results} 📊 清理後使用率: {new_usage_percent}%''' }, { 'code': 'ssl_warning', 'name': 'SSL 證書即將到期', 'category': 'system', 'channel': 'telegram', 'emoji_prefix': '🟡', 'title': 'SSL 證書警告', 'body': '''{issues} 💡 執行: sudo certbot renew --nginx''' }, { 'code': 'pod_unhealthy', 'name': 'K8s Pod 異常', 'category': 'system', 'channel': 'telegram', 'emoji_prefix': '🔴', 'title': 'K8s Pod 異常', 'body': '''📍 狀態: {status} 🗄️ 資料庫: {database} 🔧 正在嘗試重啟...''' }, { 'code': 'pod_restart_result', 'name': 'Pod 重啟結果', 'category': 'system', 'channel': 'telegram', 'emoji_prefix': '✅', 'title': 'Pod 重啟完成', 'body': '''{deployment} 已重啟,等待恢復中...''' }, { 'code': 'crawler_warning', 'name': '爬蟲執行警告', 'category': 'system', 'channel': 'telegram', 'emoji_prefix': '🟠', 'title': '爬蟲監控警告', 'body': '''{issues} 🔧 正在嘗試重啟 scheduler...''' }, { 'code': 'harbor_unhealthy', 'name': 'Harbor Registry 異常', 'category': 'system', 'channel': 'telegram', 'emoji_prefix': '🟠', 'title': 'Harbor Registry 異常', 'body': '''📍 狀態: {status} ❌ 錯誤: {error} 💡 請檢查 Harbor 服務 執行: docker restart harbor-core harbor-nginx''' }, { 'code': 'backup_warning', 'name': '備份監控警告', 'category': 'system', 'channel': 'telegram', 'emoji_prefix': '🟠', 'title': '備份監控警告', 'body': '''{error} 💡 請檢查備份排程''' }, { 'code': 'cicd_success', 'name': 'CI/CD 成功', 'category': 'system', 'channel': 'telegram', 'emoji_prefix': '✅', 'title': 'CI/CD Pipeline SUCCESS', 'body': '''📦 專案: {project} 🌿 分支: {branch} 🆔 Pipeline: #{pipeline_id} 💬 Commit: {commit_message} 👤 作者: {author} ⏱️ 耗時: {duration} 🔗 查看詳情: {url}''' }, { 'code': 'cicd_failed', 'name': 'CI/CD 失敗', 'category': 'system', 'channel': 'telegram', 'emoji_prefix': '❌', 'title': 'CI/CD Pipeline FAILED', 'body': '''📦 專案: {project} 🌿 分支: {branch} 🆔 Pipeline: #{pipeline_id} 💬 Commit: {commit_message} 👤 作者: {author} 🔗 查看詳情: {url}''' }, { 'code': 'daily_report', 'name': '每日系統狀態報告', 'category': 'report', 'channel': 'telegram', 'emoji_prefix': '📊', 'title': '每日系統狀態報告', 'body': '''📅 日期: {date} 🖥️ 應用程式: {app_status} 💾 資料備份: {backup_status} 🕷️ 爬蟲排程: {crawler_status} 📦 最新備份: {last_backup}''' }, { 'code': 'weekly_sales', 'name': '每週業績摘要', 'category': 'business', 'channel': 'telegram', 'emoji_prefix': '📈', 'title': '每週業績摘要', 'body': '''📅 週期: {week_start} ~ {week_end} 💰 總業績: ${total_sales} 📦 訂單數: {order_count} 📈 成長率: {growth_rate}% 詳細報表請登入系統查看''' }, { 'code': 'monthly_reminder', 'name': '月初作業提醒', 'category': 'business', 'channel': 'telegram', 'emoji_prefix': '📅', 'title': '{month}月初作業提醒', 'body': '''✅ 待辦事項: 1️⃣ 匯出上月 ({prev_month}) 月結報表 2️⃣ 檢查 Google Drive 自動匯入設定 3️⃣ 確認爬蟲排程正常運作 4️⃣ 備份資料庫 5️⃣ 檢查系統日誌 💡 登入系統: https://mo.wooo.work''' } ]