原定时通知仅支持邮箱与 Server 酱,现新增飞书自定义机器人 Webhook 渠道,用户填写机器人地址(可选签名密钥)后即可将账单导入提醒推送到飞书群。消息以 post 富文本发送,标题保留为卡片标题、正文按行分段;开启签名校验的机器人会按飞书规则附带 timestamp 与 HMAC-SHA256 签名。飞书密钥与邮箱授权码一致处理:留空表示不修改,返回前端时脱敏。 变更内容: - 后端新增 NotificationChannelType.FEISHU 与 FeishuNotificationSender(post 富文本、可选加签、兼容 code/StatusCode 响应) - NotificationChannelServiceImpl 将敏感字段抽为 password/secret 集合,统一“留空保留原值”与脱敏逻辑,并补充 FEISHU 默认渠道名 - NotificationChannelVO 新增 hasSecret,返回时移除 secret 并以标记提示是否已配置 - 前端 api/notification.ts 补充 hasSecret,NotificationConfigPanel 增加飞书类型与 Webhook/签名密钥表单项及必填校验 - locales/messages.ts 新增飞书相关 zh/en/ja 文案并更新面板说明文案 - init.sql 同步通知渠道类型注释
348 lines
22 KiB
SQL
348 lines
22 KiB
SQL
-- 用户表:存储系统用户的基本信息和登录凭证
|
||
CREATE TABLE IF NOT EXISTS t_user (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID,主键自增',
|
||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名,唯一标识,用于登录',
|
||
password_hash VARCHAR(255) NOT NULL COMMENT '密码哈希值,使用BCrypt加密存储',
|
||
nickname VARCHAR(50) COMMENT '用户昵称,显示名称'
|
||
);
|
||
|
||
-- 分类表:存储收支分类信息,支持用户自定义
|
||
CREATE TABLE IF NOT EXISTS t_category (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '分类ID,主键自增',
|
||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
user_id BIGINT NOT NULL COMMENT '所属用户ID',
|
||
name VARCHAR(50) NOT NULL COMMENT '分类名称',
|
||
type VARCHAR(10) NOT NULL COMMENT '分类类型:INCOME-收入,EXPENSE-支出',
|
||
icon VARCHAR(50) COMMENT '分类图标,可选',
|
||
sort_order INT NOT NULL DEFAULT 0 COMMENT '排序序号,数值越小越靠前',
|
||
INDEX idx_user_id (user_id) COMMENT '用户ID索引',
|
||
INDEX idx_user_type (user_id, type) COMMENT '用户ID+类型联合索引'
|
||
);
|
||
|
||
-- 收支记录表:存储每一笔收入或支出的详细信息
|
||
CREATE TABLE IF NOT EXISTS t_transaction (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '记录ID,主键自增',
|
||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
user_id BIGINT NOT NULL COMMENT '所属用户ID',
|
||
category_id BIGINT COMMENT '所属分类ID,可为空表示未分类',
|
||
type VARCHAR(10) NOT NULL COMMENT '记录类型:INCOME-收入,EXPENSE-支出',
|
||
amount DECIMAL(12, 2) NOT NULL COMMENT '金额,精确到分',
|
||
channel VARCHAR(30) COMMENT '交易渠道:WECHAT-微信,ALIPAY-支付宝,CASH-现金,BANK-银行卡',
|
||
remark VARCHAR(255) COMMENT '备注说明',
|
||
remark_hidden TINYINT(1) NOT NULL DEFAULT 0 COMMENT '备注是否隐藏:1-隐藏,0-显示',
|
||
external_no VARCHAR(255) COMMENT '外部账单交易号,用于账单导入去重',
|
||
transaction_time DATETIME NOT NULL COMMENT '交易发生时间',
|
||
include_in_stats TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否计入统计:1-计入,0-不计入(如借款、转账等)',
|
||
raw_data JSON COMMENT '账单导入的原始完整数据(结构化JSON),手动记录为空',
|
||
INDEX idx_user_id (user_id) COMMENT '用户ID索引',
|
||
INDEX idx_category_id (category_id) COMMENT '分类ID索引',
|
||
INDEX idx_transaction_time (transaction_time) COMMENT '交易时间索引',
|
||
INDEX idx_user_time (user_id, transaction_time) COMMENT '用户ID+交易时间联合索引',
|
||
UNIQUE INDEX uk_user_external (user_id, external_no) COMMENT '用户ID+外部交易号唯一索引,用于导入去重'
|
||
);
|
||
|
||
-- 标签表:存储用户自定义标签,用于给交易打标签
|
||
CREATE TABLE IF NOT EXISTS t_tag (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '标签ID,主键自增',
|
||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
user_id BIGINT NOT NULL COMMENT '所属用户ID',
|
||
name VARCHAR(50) NOT NULL COMMENT '标签名称',
|
||
color VARCHAR(20) COMMENT '标签颜色,用于前端展示',
|
||
sort_order INT NOT NULL DEFAULT 0 COMMENT '排序序号,数值越小越靠前',
|
||
INDEX idx_user_id (user_id) COMMENT '用户ID索引',
|
||
UNIQUE INDEX uk_user_name (user_id, name) COMMENT '用户ID+标签名唯一索引'
|
||
);
|
||
|
||
-- 交易标签关联表:交易与标签的多对多关系
|
||
CREATE TABLE IF NOT EXISTS t_transaction_tag (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '关联ID,主键自增',
|
||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
transaction_id BIGINT NOT NULL COMMENT '交易记录ID',
|
||
tag_id BIGINT NOT NULL COMMENT '标签ID',
|
||
UNIQUE INDEX uk_transaction_tag (transaction_id, tag_id) COMMENT '交易+标签唯一索引',
|
||
INDEX idx_tag_id (tag_id) COMMENT '标签ID索引'
|
||
);
|
||
|
||
-- 账单关系组表:将多笔账单按父子或同级关系聚合为一个关系组
|
||
CREATE TABLE IF NOT EXISTS t_transaction_group (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '关系组ID,主键自增',
|
||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
user_id BIGINT NOT NULL COMMENT '所属用户ID',
|
||
type VARCHAR(20) NOT NULL COMMENT '关系类型:PARENT_CHILD-父子,SIBLING-同级',
|
||
name VARCHAR(100) COMMENT '关系组名称',
|
||
remark VARCHAR(255) COMMENT '备注',
|
||
INDEX idx_user_id (user_id) COMMENT '用户ID索引'
|
||
);
|
||
|
||
-- 账单关系组成员表:关系组与账单的关联及组内角色
|
||
CREATE TABLE IF NOT EXISTS t_transaction_group_item (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '关联ID,主键自增',
|
||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
group_id BIGINT NOT NULL COMMENT '关系组ID',
|
||
transaction_id BIGINT NOT NULL COMMENT '交易记录ID',
|
||
role VARCHAR(10) NOT NULL COMMENT '组内角色:PARENT-父,CHILD-子,MEMBER-成员',
|
||
sort_order INT NOT NULL DEFAULT 0 COMMENT '排序序号,用于同级链路顺序',
|
||
UNIQUE INDEX uk_group_transaction (group_id, transaction_id) COMMENT '关系组+交易唯一索引',
|
||
INDEX idx_transaction_id (transaction_id) COMMENT '交易记录ID索引'
|
||
);
|
||
|
||
-- AI 配置表:存储每个用户的 AI 智能建议相关配置
|
||
CREATE TABLE IF NOT EXISTS t_ai_config (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '配置ID,主键自增',
|
||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
user_id BIGINT NOT NULL COMMENT '所属用户ID',
|
||
enabled TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否启用AI智能建议:1-启用,0-关闭',
|
||
api_key VARCHAR(255) COMMENT 'DeepSeek API Key(明文存储)',
|
||
base_url VARCHAR(255) NOT NULL DEFAULT 'https://api.deepseek.com' COMMENT 'API 基础地址',
|
||
model VARCHAR(50) NOT NULL DEFAULT 'deepseek-chat' COMMENT '使用的模型名称',
|
||
vision_model VARCHAR(50) NOT NULL DEFAULT 'deepseek-flash' COMMENT '图片记账使用的视觉模型名称',
|
||
UNIQUE INDEX uk_user_id (user_id) COMMENT '用户ID唯一索引,每个用户一条配置'
|
||
);
|
||
|
||
-- AI 使用记录表:记录每次调用 DeepSeek 的用量与结果
|
||
CREATE TABLE IF NOT EXISTS t_ai_usage (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '记录ID,主键自增',
|
||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
user_id BIGINT NOT NULL COMMENT '所属用户ID',
|
||
type VARCHAR(20) NOT NULL COMMENT '调用类型:SUGGEST-生成建议,TEST-测试连接',
|
||
model VARCHAR(50) COMMENT '模型名称',
|
||
transaction_count INT NOT NULL DEFAULT 0 COMMENT '本次分析的记录数',
|
||
prompt_tokens INT NOT NULL DEFAULT 0 COMMENT '输入 token 数',
|
||
completion_tokens INT NOT NULL DEFAULT 0 COMMENT '输出 token 数',
|
||
total_tokens INT NOT NULL DEFAULT 0 COMMENT '总 token 数',
|
||
cached_tokens INT NOT NULL DEFAULT 0 COMMENT '缓存命中的输入 token 数',
|
||
success TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否成功:1-成功,0-失败',
|
||
error_message VARCHAR(500) COMMENT '失败原因',
|
||
duration_ms BIGINT COMMENT '调用耗时(毫秒)',
|
||
INDEX idx_user_created (user_id, created_at) COMMENT '用户ID+创建时间联合索引'
|
||
);
|
||
|
||
-- AI 智能查数历史表:记录用户的自然语言提问,用于历史回看与复制
|
||
CREATE TABLE IF NOT EXISTS t_ai_sql_history (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '记录ID,主键自增',
|
||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
user_id BIGINT NOT NULL COMMENT '所属用户ID',
|
||
query_text VARCHAR(500) NOT NULL COMMENT '用户的自然语言提问',
|
||
INDEX idx_ai_sql_history_user_created (user_id, created_at) COMMENT '用户ID+创建时间联合索引'
|
||
);
|
||
|
||
-- AI 记账图片表:保存用户上传的账单/支付截图及其解析结果摘要
|
||
CREATE TABLE IF NOT EXISTS t_ai_image (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '图片ID,主键自增',
|
||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
user_id BIGINT NOT NULL COMMENT '所属用户ID',
|
||
file_path VARCHAR(500) NOT NULL COMMENT '图片本地存储相对路径',
|
||
mime_type VARCHAR(50) COMMENT '图片 MIME 类型,如 image/jpeg',
|
||
file_size BIGINT NOT NULL DEFAULT 0 COMMENT '图片文件大小(字节)',
|
||
width INT COMMENT '图片宽度(像素)',
|
||
height INT COMMENT '图片高度(像素)',
|
||
model VARCHAR(50) COMMENT '解析使用的视觉模型名称',
|
||
summary VARCHAR(500) COMMENT '解析结果摘要',
|
||
record_count INT NOT NULL DEFAULT 0 COMMENT '解析出的交易记录条数',
|
||
INDEX idx_ai_image_user_created (user_id, created_at) COMMENT '用户ID+创建时间联合索引'
|
||
);
|
||
|
||
-- AI 记账图片与交易记录关联表:记录每张图片解析生成的交易记录
|
||
CREATE TABLE IF NOT EXISTS t_ai_image_transaction (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '关联ID,主键自增',
|
||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
image_id BIGINT NOT NULL COMMENT 'AI 记账图片ID',
|
||
transaction_id BIGINT NOT NULL COMMENT '交易记录ID',
|
||
UNIQUE INDEX uk_ai_image_transaction (image_id, transaction_id) COMMENT '图片+交易唯一索引',
|
||
INDEX idx_ai_image_transaction_transaction_id (transaction_id) COMMENT '交易记录ID索引'
|
||
);
|
||
|
||
-- 通知配置表:存储每个用户的账单导入提醒设置
|
||
CREATE TABLE IF NOT EXISTS t_notification_config (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '配置ID,主键自增',
|
||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
user_id BIGINT NOT NULL COMMENT '所属用户ID',
|
||
enabled TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否启用定时提醒:1-启用,0-关闭',
|
||
frequency VARCHAR(10) NOT NULL DEFAULT 'MONTHLY' COMMENT '提醒周期:DAILY-每天,WEEKLY-每周,MONTHLY-每月',
|
||
day_of_month INT NOT NULL DEFAULT 1 COMMENT '每月提醒日(1-28),frequency=MONTHLY 时生效',
|
||
day_of_week INT NOT NULL DEFAULT 1 COMMENT '每周提醒日(1-7,1为周一),frequency=WEEKLY 时生效',
|
||
send_time VARCHAR(5) NOT NULL DEFAULT '09:00' COMMENT '提醒时间(HH:mm)',
|
||
last_sent_at DATETIME COMMENT '最近一次发送时间,用于避免重复提醒',
|
||
UNIQUE INDEX uk_notification_config_user_id (user_id) COMMENT '用户ID唯一索引,每个用户一条配置'
|
||
);
|
||
|
||
-- 通知渠道表:存储用户配置的邮箱、Server 酱等推送渠道
|
||
CREATE TABLE IF NOT EXISTS t_notification_channel (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '渠道ID,主键自增',
|
||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
user_id BIGINT NOT NULL COMMENT '所属用户ID',
|
||
type VARCHAR(20) NOT NULL COMMENT '渠道类型:EMAIL-邮箱,SERVERCHAN-Server 酱,FEISHU-飞书',
|
||
name VARCHAR(50) COMMENT '渠道名称,便于用户识别',
|
||
enabled TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用:1-启用,0-关闭',
|
||
config TEXT COMMENT '渠道配置(JSON),如 webhook 地址、SMTP 账号等',
|
||
INDEX idx_notification_channel_user_id (user_id) COMMENT '用户ID索引'
|
||
);
|
||
|
||
-- 通知发送日志表:记录每次提醒的发送结果,便于排查问题
|
||
CREATE TABLE IF NOT EXISTS t_notification_log (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '日志ID,主键自增',
|
||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
user_id BIGINT NOT NULL COMMENT '所属用户ID',
|
||
channel_id BIGINT COMMENT '渠道ID,测试或渠道已删除时可能为空',
|
||
channel_type VARCHAR(20) COMMENT '渠道类型',
|
||
success TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否成功:1-成功,0-失败',
|
||
message VARCHAR(500) COMMENT '结果描述或失败原因',
|
||
INDEX idx_notification_log_user_created (user_id, created_at) COMMENT '用户ID+创建时间联合索引'
|
||
);
|
||
|
||
-- HTTP 访问日志表:记录每次接口请求的方法、路径、状态与耗时,便于追溯接口调用
|
||
CREATE TABLE IF NOT EXISTS t_http_log (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '日志ID,主键自增',
|
||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
user_id BIGINT COMMENT '用户ID,未登录或认证失败时为空',
|
||
method VARCHAR(10) COMMENT '请求方法:GET/POST/PUT/DELETE 等',
|
||
path VARCHAR(255) COMMENT '请求路径',
|
||
query_string VARCHAR(1000) COMMENT 'URL 查询参数',
|
||
status INT COMMENT 'HTTP 响应状态码',
|
||
duration_ms BIGINT COMMENT '处理耗时(毫秒)',
|
||
ip VARCHAR(64) COMMENT '客户端IP',
|
||
user_agent VARCHAR(500) COMMENT 'User-Agent',
|
||
INDEX idx_http_log_created (created_at) COMMENT '创建时间索引',
|
||
INDEX idx_http_log_user_created (user_id, created_at) COMMENT '用户ID+创建时间联合索引'
|
||
);
|
||
|
||
-- 登录日志表:记录每次登录尝试的结果,便于审计与排查
|
||
CREATE TABLE IF NOT EXISTS t_login_log (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '日志ID,主键自增',
|
||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
user_id BIGINT COMMENT '用户ID,登录失败或用户不存在时为空',
|
||
username VARCHAR(50) COMMENT '登录用户名',
|
||
success TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否成功:1-成功,0-失败',
|
||
message VARCHAR(500) COMMENT '结果描述或失败原因',
|
||
ip VARCHAR(64) COMMENT '客户端IP',
|
||
user_agent VARCHAR(500) COMMENT 'User-Agent',
|
||
INDEX idx_login_log_created (created_at) COMMENT '创建时间索引',
|
||
INDEX idx_login_log_user_created (user_id, created_at) COMMENT '用户ID+创建时间联合索引'
|
||
);
|
||
|
||
-- 自定义分类与标签规则表:按关键词、收支类型、金额区间自动归类与打标签
|
||
CREATE TABLE IF NOT EXISTS t_rule (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '规则ID,主键自增',
|
||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
user_id BIGINT NOT NULL COMMENT '所属用户ID',
|
||
name VARCHAR(50) NOT NULL COMMENT '规则名称',
|
||
enabled TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用:1-启用,0-停用',
|
||
sort_order INT NOT NULL DEFAULT 0 COMMENT '优先级,数值越小越优先',
|
||
type VARCHAR(10) COMMENT '限定收支类型:INCOME-收入,EXPENSE-支出,为空表示不限',
|
||
keyword VARCHAR(100) COMMENT '关键词,匹配备注/交易对方/商品名称(包含匹配,忽略大小写)',
|
||
min_amount DECIMAL(12, 2) COMMENT '金额下限(含),可为空',
|
||
max_amount DECIMAL(12, 2) COMMENT '金额上限(含),可为空',
|
||
category_id BIGINT COMMENT '命中的目标分类ID,可为空',
|
||
INDEX idx_rule_user_id (user_id) COMMENT '用户ID索引'
|
||
);
|
||
|
||
-- 规则标签关联表:规则与标签的多对多关系
|
||
CREATE TABLE IF NOT EXISTS t_rule_tag (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '关联ID,主键自增',
|
||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
rule_id BIGINT NOT NULL COMMENT '规则ID',
|
||
tag_id BIGINT NOT NULL COMMENT '标签ID',
|
||
UNIQUE INDEX uk_rule_tag (rule_id, tag_id) COMMENT '规则+标签唯一索引',
|
||
INDEX idx_rule_tag_tag_id (tag_id) COMMENT '标签ID索引'
|
||
);
|
||
|
||
-- 邮箱账单配置表:存储用户用于自动拉取账单附件的 IMAP 邮箱连接信息
|
||
CREATE TABLE IF NOT EXISTS t_email_bill_config (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '配置ID,主键自增',
|
||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
user_id BIGINT NOT NULL COMMENT '所属用户ID',
|
||
name VARCHAR(50) NOT NULL COMMENT '配置名称,便于用户识别',
|
||
host VARCHAR(255) NOT NULL COMMENT 'IMAP 服务器地址',
|
||
port INT NOT NULL DEFAULT 993 COMMENT 'IMAP 端口',
|
||
use_ssl TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否使用 SSL:1-是,0-否',
|
||
username VARCHAR(255) NOT NULL COMMENT '邮箱账号',
|
||
password VARCHAR(255) NOT NULL COMMENT '邮箱授权码(明文存储,前端脱敏返回)',
|
||
folder VARCHAR(100) NOT NULL DEFAULT 'INBOX' COMMENT '监听的邮件文件夹',
|
||
enabled TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否启用监听:1-启用,0-关闭',
|
||
status VARCHAR(20) NOT NULL DEFAULT 'DISCONNECTED' COMMENT '连接状态:DISCONNECTED-未连接,CONNECTED-已连接,POLLING-轮询中,ERROR-异常',
|
||
last_error VARCHAR(500) COMMENT '最近一次连接或拉取失败原因',
|
||
last_connected_at DATETIME COMMENT '最近一次成功连接时间',
|
||
last_uid BIGINT COMMENT '已处理的最大邮件 UID,用于增量拉取',
|
||
expense_category_id BIGINT COMMENT '默认支出分类ID,可为空',
|
||
income_category_id BIGINT COMMENT '默认收入分类ID,可为空',
|
||
tag_ids TEXT COMMENT '默认标签ID列表(JSON数组)',
|
||
fetch_scope VARCHAR(20) NOT NULL DEFAULT 'INCREMENT' COMMENT '拉取范围:INCREMENT-仅新邮件,DAYS-最近N天,COUNT-最近N封',
|
||
fetch_limit INT COMMENT '拉取范围数量:DAYS 为天数,COUNT 为封数',
|
||
INDEX idx_email_bill_config_user_id (user_id) COMMENT '用户ID索引'
|
||
);
|
||
|
||
-- 邮箱账单发件人规则表:按邮件发件人匹配账单类型与默认归类
|
||
CREATE TABLE IF NOT EXISTS t_email_bill_sender_rule (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '规则ID,主键自增',
|
||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
user_id BIGINT NOT NULL COMMENT '所属用户ID',
|
||
name VARCHAR(50) NOT NULL COMMENT '规则名称',
|
||
enabled TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用:1-启用,0-停用',
|
||
sort_order INT NOT NULL DEFAULT 0 COMMENT '优先级,数值越小越优先',
|
||
sender_patterns TEXT COMMENT '发件人匹配串列表(JSON数组),包含匹配且忽略大小写',
|
||
bill_type VARCHAR(20) NOT NULL COMMENT '命中的账单类型:ALIPAY/WECHAT/MEITUAN/CMB/BOCOM',
|
||
archive_password VARCHAR(100) COMMENT '该来源账单压缩包解压密码,可为空',
|
||
expense_category_id BIGINT COMMENT '默认支出分类ID,可为空',
|
||
income_category_id BIGINT COMMENT '默认收入分类ID,可为空',
|
||
tag_ids TEXT COMMENT '默认标签ID列表(JSON数组)',
|
||
INDEX idx_email_bill_sender_rule_user_id (user_id) COMMENT '用户ID索引'
|
||
);
|
||
|
||
-- 邮箱账单消息表:记录拉取到的账单附件,解析与入库由用户手动触发
|
||
CREATE TABLE IF NOT EXISTS t_email_bill_message (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '消息ID,主键自增',
|
||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
config_id BIGINT NOT NULL COMMENT '邮箱配置ID',
|
||
user_id BIGINT NOT NULL COMMENT '所属用户ID',
|
||
uid BIGINT NOT NULL COMMENT '邮件 IMAP UID',
|
||
message_id VARCHAR(255) COMMENT '邮件 Message-ID',
|
||
subject VARCHAR(500) COMMENT '邮件主题',
|
||
from_address VARCHAR(255) COMMENT '发件人地址',
|
||
received_at DATETIME COMMENT '邮件接收时间',
|
||
attachment_index INT NOT NULL DEFAULT 0 COMMENT '附件在邮件中的序号(从0开始)',
|
||
attachment_name VARCHAR(255) COMMENT '附件文件名',
|
||
attachment_path VARCHAR(500) COMMENT '附件本地存储相对路径',
|
||
sender_rule_id BIGINT COMMENT '命中的发件人规则ID',
|
||
bill_type VARCHAR(20) COMMENT '命中的账单类型,未命中时为空',
|
||
status VARCHAR(20) NOT NULL DEFAULT 'PULLED' COMMENT '处理状态:PULLED-待解析,CONFIRMED-已导入,IGNORED-已忽略',
|
||
error VARCHAR(500) COMMENT '解析失败原因',
|
||
UNIQUE INDEX uk_email_bill_message (config_id, uid, attachment_index) COMMENT '配置+UID+附件序号唯一索引,用于去重',
|
||
INDEX idx_email_bill_message_user_status (user_id, status) COMMENT '用户ID+状态联合索引'
|
||
);
|
||
|
||
-- 用户偏好表:按用户存储键值形式的偏好配置
|
||
CREATE TABLE IF NOT EXISTS t_user_preference (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '偏好ID,主键自增',
|
||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
user_id BIGINT NOT NULL COMMENT '所属用户ID',
|
||
pref_key VARCHAR(50) NOT NULL COMMENT '偏好键,如 billSourceIncludeInStats / excludedDisplayStyle',
|
||
pref_value TEXT COMMENT '偏好值,标量字符串或 JSON',
|
||
UNIQUE INDEX uk_user_pref (user_id, pref_key) COMMENT '用户+偏好键唯一索引'
|
||
);
|
||
|
||
-- 用户自定义交易渠道表:仅存放用户自建渠道,内置渠道由枚举维护
|
||
CREATE TABLE IF NOT EXISTS t_channel (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '渠道ID,主键自增',
|
||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
user_id BIGINT NOT NULL COMMENT '所属用户ID',
|
||
code VARCHAR(30) NOT NULL COMMENT '渠道编码,后端生成且稳定不变,交易记录按此关联',
|
||
name VARCHAR(50) NOT NULL COMMENT '渠道名称,用户可修改',
|
||
sort_order INT NOT NULL DEFAULT 0 COMMENT '排序序号,数值越小越靠前',
|
||
UNIQUE INDEX uk_channel_user_code (user_id, code) COMMENT '用户+渠道编码唯一索引',
|
||
UNIQUE INDEX uk_channel_user_name (user_id, name) COMMENT '用户+渠道名称唯一索引',
|
||
INDEX idx_channel_user_id (user_id) COMMENT '用户ID索引'
|
||
);
|