PayrollManagementSystem/db/migration/V23__system_monitor.sql
liuwenxin 1461a8d113 feat(后端): 添加授权体系、系统监控与试用期计提
按 2026-11-02 需求补齐计划交付后端能力:
- 角色授权:权限目录化,接口统一准入校验,未登记默认拒绝;
  管理员判断改为按数据库角色重新判定,防止权限码持有者绕过
- 系统监控:单进程采集资源、请求与异常指标,分钟级聚合,
  阈值配置化;敏感配置增加 repr 保护,Redis 密码 URL 转义
- 试用期计提:按回款日判定并写入快照,年度结清与调整单联动;
  人员模型补试用期、离职日期与工资版本历史字段
- 计提模板:公式骨架受控,页面维护名称与参数绑定
- T+ 采集:自动化配置表与进度查询

内置角色禁停用保护对齐模块注释;核算规则版本提为常量并
补充批量核算失败堆栈日志。

影响范围:后端全部模块、数据库迁移 V22-V28
验证:uv run ruff check 通过;922 个单元测试全部通过;
集成测试因本机 MySQL 数据卷被其他容器锁定暂未运行
2026-11-03 11:20:55 +08:00

59 lines
3.5 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- V23:系统监控,独立新表,不修改业务及审计数据。
INSERT INTO permissions (perm_code,perm_name,perm_type,sort_order,status) VALUES ('system:monitor:view','系统监控:查看',1,100,1);
INSERT INTO role_permissions (role_id,permission_id) SELECT r.id,p.id FROM roles r JOIN permissions p ON p.perm_code='system:monitor:view' WHERE r.role_code='admin';
CREATE TABLE monitor_snapshots (
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
instance_id VARCHAR(32) NOT NULL COMMENT '应用实例标识',
minute DATETIME NOT NULL COMMENT '采集分钟,北京时间',
sample_count INTEGER NOT NULL COMMENT '实际采样次数',
resources JSON NOT NULL COMMENT '资源均值与采集范围,不含配置',
requests JSON NOT NULL COMMENT '请求汇总与固定耗时直方图',
CONSTRAINT pk_monitor_snapshots PRIMARY KEY (id),
CONSTRAINT uk_monitor_snapshots_instance_minute UNIQUE (instance_id, minute)
)ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='分钟级运行监控快照' COLLATE utf8mb4_general_ci;
CREATE INDEX idx_monitor_snapshots_minute ON monitor_snapshots (minute);
CREATE TABLE monitor_request_minutes (
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
instance_id VARCHAR(32) NOT NULL COMMENT '应用实例标识',
minute DATETIME NOT NULL COMMENT '请求分钟,北京时间',
method VARCHAR(8) NOT NULL COMMENT 'HTTP方法,固定集合',
route VARCHAR(256) NOT NULL COMMENT '路由模板,不含原始地址及参数',
metrics JSON NOT NULL COMMENT '请求数、状态分类与固定直方图',
CONSTRAINT pk_monitor_request_minutes PRIMARY KEY (id),
CONSTRAINT uk_monitor_request_minutes_endpoint UNIQUE (instance_id, minute, method, route)
)ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='接口分钟级运行统计' COLLATE utf8mb4_general_ci;
CREATE INDEX idx_monitor_request_minutes_minute ON monitor_request_minutes (minute);
CREATE TABLE monitor_events (
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
instance_id VARCHAR(32) NOT NULL COMMENT '应用实例标识',
kind VARCHAR(24) NOT NULL COMMENT '事件类型,固定集合',
code VARCHAR(64) NOT NULL COMMENT '稳定错误码',
component VARCHAR(128) NOT NULL COMMENT '所属组件或日志模块',
level VARCHAR(16) NOT NULL COMMENT '异常级别',
message VARCHAR(256) NOT NULL COMMENT '通用说明,不保存内部异常文本',
fingerprint VARCHAR(64) COMMENT '同类健康异常合并键',
request_id VARCHAR(32) COMMENT '请求关联编号',
method VARCHAR(8) COMMENT 'HTTP方法',
route VARCHAR(256) COMMENT '路由模板',
status_code INTEGER COMMENT 'HTTP状态码',
duration_ms FLOAT COMMENT '请求耗时,毫秒',
batch_no VARCHAR(32) COMMENT '相关同步批次编号',
first_seen DATETIME NOT NULL COMMENT '首次发生时间',
last_seen DATETIME NOT NULL COMMENT '最近发生时间',
occurrences INTEGER NOT NULL COMMENT '发生或持续采样次数',
resolved_at DATETIME COMMENT '恢复时间,仅用于健康异常',
CONSTRAINT pk_monitor_events PRIMARY KEY (id)
)ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='脱敏诊断事件与异常恢复记录' COLLATE utf8mb4_general_ci;
CREATE INDEX idx_monitor_events_fingerprint ON monitor_events (fingerprint, resolved_at);
CREATE INDEX idx_monitor_events_last_seen ON monitor_events (last_seen);
CREATE INDEX idx_monitor_events_request_id ON monitor_events (request_id);