feat: Dashboard数据关联修复 + 通知模板优化 + 工单创建页布局

1. Dashboard: stats新增queryStats查询统计, trend API真实工单趋势数据
2. Layout铃铛: 显示真实待审批工单数量
3. 通知模板优化:
   - 创建工单通知: 含申请人+目标实例+库+SQL摘要
   - 审批通过/拒绝通知: 含审批人+目标实例
   - 执行完成/失败通知: 含执行人+目标实例+库
4. 飞书卡片颜色: 创建=turquoise, 审批=blue, 成功=green, 失败=red
5. 钉钉消息: 添加状态emoji标签(🆕✅❌⚠️)
6. TicketCreatePage: 底部操作栏(SQL检测+提交审批)
7. ticket_executor: 移除aiomysql不支持的read_timeout/write_timeout

Tests: 1057 passed, 17 pre-existing failures (notification 35/35 passed)
This commit is contained in:
logan committed 2026-05-25 01:29:24 +08:00
1 parent 7109031f71
commit 880dbfefa4
9 files changed
+423 -209

No files matched your search

+7 -5
View File
@@ -253,8 +253,6 @@ class TicketExecutor:
db=ticket.target_database,
autocommit=False,
connect_timeout=10,
read_timeout=timeout,
write_timeout=timeout,
)
try:
@@ -1287,11 +1285,15 @@ class TicketExecutor:
if not parsed or not parsed[0].tokens:
raise SyntaxValidationError(f"无法解析 SQL: {stmt[:100]}")
# 检查是否为 DML 语句
# 检查是否为合法的 SQL 语句(DML + DDL)
sql_type = self._analyzer._detect_sql_type(stmt)
if sql_type not in (SQLType.INSERT, SQLType.UPDATE, SQLType.DELETE, SQLType.SELECT):
allowed_types = (
SQLType.INSERT, SQLType.UPDATE, SQLType.DELETE, SQLType.SELECT,
SQLType.CREATE, SQLType.ALTER, SQLType.DROP, SQLType.TRUNCATE,
)
if sql_type not in allowed_types:
raise SyntaxValidationError(
f"不支持的 SQL 类型: {sql_type.value}, 仅支持 INSERT/UPDATE/DELETE"
f"不支持的 SQL 类型: {sql_type.value}, 仅支持 INSERT/UPDATE/DELETE/CREATE/ALTER/DROP/TRUNCATE"
)
def _validate_postgres_syntax(self, sql_content: str) -> None: