997 lines
54 KiB
SQL
997 lines
54 KiB
SQL
CREATE TABLE IF NOT EXISTS messages
|
||
(
|
||
id int auto_increment comment '自增主键ID'
|
||
primary key,
|
||
group_id varchar(20) null comment '群ID',
|
||
timestamp varchar(20) not null comment '消息时间戳',
|
||
sender varchar(255) not null comment '发送者微信ID',
|
||
content text null comment '消息内容',
|
||
message_type varchar(50) null comment '消息类型(文本、图片、视频等)',
|
||
attachment_url text null comment '附件URL(图片、视频链接)',
|
||
message_id varchar(32) null comment '消息 id',
|
||
message_xml text null comment '消息 xml 部分',
|
||
raw_payload longtext null comment 'API 原始消息完整负载(完整序列化数据)',
|
||
mentioned_user_ids longtext null comment '消息中被@用户ID清单(JSON数组字符串)',
|
||
message_thumb longtext null comment '视频或图片消息的缩略图路径',
|
||
image_path varchar(255) null comment '图片URL路径'
|
||
)
|
||
comment '微信群消息存储表,记录所有群聊消息';
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_date_timestamp
|
||
on messages (timestamp);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_group_sender_timestamp
|
||
on messages (group_id, sender, timestamp);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_group_timestamp
|
||
on messages (group_id, timestamp);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_group_type_timestamp
|
||
on messages (group_id, message_type, timestamp);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_media_pending_lookup
|
||
on messages (message_type, image_path, timestamp, group_id);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_message_sender
|
||
on messages (sender);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_message_type
|
||
on messages (message_type);
|
||
|
||
CREATE INDEX IF NOT EXISTS messages_message_id_index
|
||
on messages (message_id);
|
||
|
||
CREATE TABLE IF NOT EXISTS speech_counts
|
||
(
|
||
id int auto_increment comment '自增主键ID'
|
||
primary key,
|
||
group_id text null comment '群聊ID',
|
||
wx_id text null comment '用户微信ID',
|
||
date text null comment '统计日期(YYYY-MM-DD格式)',
|
||
count int null comment '发言次数',
|
||
constraint speech_counts_group_id_wx_id_date_uindex
|
||
unique (group_id, wx_id, date) using hash
|
||
)
|
||
comment '群成员每日发言统计表';
|
||
|
||
CREATE TABLE IF NOT EXISTS t_admin_accounts
|
||
(
|
||
id bigint auto_increment
|
||
primary key,
|
||
username varchar(64) not null comment '登录用户名',
|
||
password_hash varchar(255) not null comment '口令哈希',
|
||
display_name varchar(64) null comment '展示名称',
|
||
status tinyint default 1 not null comment '状态:1启用,0禁用',
|
||
last_login_at datetime null comment '最近登录时间',
|
||
last_login_ip varchar(64) null comment '最近登录IP',
|
||
create_time datetime default current_timestamp() null comment '创建时间',
|
||
update_time datetime default current_timestamp() null on update current_timestamp() comment '更新时间',
|
||
constraint uk_admin_username
|
||
unique (username)
|
||
)
|
||
comment '后台管理员账号表';
|
||
|
||
CREATE TABLE IF NOT EXISTS t_chatroom_member
|
||
(
|
||
id int auto_increment
|
||
primary key,
|
||
chatroom_id varchar(64) not null comment '群聊ID',
|
||
wxid varchar(64) not null comment '成员微信ID',
|
||
nick_name varchar(128) null comment '成员昵称',
|
||
display_name varchar(128) null comment '群内显示名称',
|
||
inviter_user_name varchar(64) null comment '邀请人微信ID',
|
||
member_flag int null comment '成员标志,2049表示管理员',
|
||
big_head_img_url text null comment '大头像URL',
|
||
small_head_img_url text null comment '小头像URL',
|
||
is_owner tinyint(1) default 0 null comment '是否群主:0否,1是',
|
||
is_admin tinyint(1) default 0 null comment '是否管理员:0否,1是',
|
||
sex tinyint null comment '性别:1男,2女,0未知',
|
||
signature text null comment '个性签名',
|
||
alias varchar(128) null comment '微信号',
|
||
country varchar(64) null comment '国家',
|
||
province varchar(64) null comment '省份',
|
||
city varchar(64) null comment '城市',
|
||
label_list text null comment '标签列表',
|
||
phone_num_list text null comment '电话号码列表',
|
||
py_initial varchar(128) null comment '拼音首字母',
|
||
quan_pin varchar(256) null comment '全拼',
|
||
remark_py_initial varchar(128) null comment '备注拼音首字母',
|
||
remark_quan_pin varchar(256) null comment '备注全拼',
|
||
create_time datetime default current_timestamp() not null comment '创建时间',
|
||
update_time datetime default current_timestamp() not null on update current_timestamp() comment '更新时间',
|
||
latest_active_time datetime null comment '最后活跃时间',
|
||
status tinyint default 1 null comment '1-在群里,2-已退群',
|
||
constraint idx_chatroom_member
|
||
unique (chatroom_id, wxid)
|
||
)
|
||
comment '微信群成员信息表';
|
||
|
||
CREATE TABLE IF NOT EXISTS t_chatrooms
|
||
(
|
||
id int auto_increment
|
||
primary key,
|
||
chatroom_id varchar(64) not null comment '群聊ID',
|
||
nick_name varchar(128) null comment '群昵称',
|
||
py_initial varchar(128) null comment '群昵称拼音首字母',
|
||
quan_pin varchar(256) null comment '群昵称全拼',
|
||
sex tinyint null comment '性别',
|
||
remark varchar(128) null comment '备注',
|
||
remark_py_initial varchar(128) null comment '备注拼音首字母',
|
||
remark_quan_pin varchar(256) null comment '备注全拼',
|
||
chat_room_notify tinyint null comment '群通知',
|
||
chat_room_owner varchar(64) null comment '群主微信ID',
|
||
small_head_img_url text null comment '群头像URL',
|
||
member_list text null comment '成员列表(JSON)',
|
||
create_time datetime default current_timestamp() not null comment '创建时间',
|
||
update_time datetime default current_timestamp() not null on update current_timestamp() comment '更新时间',
|
||
chat_room_announcement text null comment '群公告内容',
|
||
constraint idx_chatroom_id
|
||
unique (chatroom_id)
|
||
)
|
||
comment '微信群信息表';
|
||
|
||
CREATE TABLE IF NOT EXISTS t_emoji_assets
|
||
(
|
||
md5 varchar(64) not null
|
||
primary key,
|
||
total_length int default 0 not null,
|
||
semantic_text varchar(255) default '' null comment '主语义文本',
|
||
semantic_aliases longtext null comment '语义别名列表(JSON数组)',
|
||
semantic_source varchar(64) default '' null comment '语义来源字段,如 desc/emojiattr',
|
||
preview_url varchar(255) default '' null comment '本地预览图路径',
|
||
sample_message_id varchar(32) default '' null comment '示例消息ID',
|
||
sample_group_id varchar(100) default '' null comment '示例群ID',
|
||
sample_sender varchar(100) default '' null comment '示例发送者',
|
||
first_seen_at datetime default current_timestamp() null,
|
||
last_seen_at datetime default current_timestamp() null on update current_timestamp(),
|
||
created_at datetime default current_timestamp() null,
|
||
updated_at datetime default current_timestamp() null on update current_timestamp()
|
||
);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_emoji_last_seen
|
||
on t_emoji_assets (last_seen_at);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_emoji_preview
|
||
on t_emoji_assets (preview_url);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_encyclopedia_active_tasks
|
||
(
|
||
active_task_id int auto_increment comment '任务ID'
|
||
primary key,
|
||
group_id varchar(50) not null comment '群聊ID',
|
||
question varchar(255) not null comment '问题内容',
|
||
answer varchar(256) not null comment '正确答案',
|
||
score int not null comment '答对可获得的分数',
|
||
description text null comment '问题描述或提示',
|
||
holder_id varchar(50) not null comment '出题人ID',
|
||
assigned_at datetime default current_timestamp() null comment '任务分配时间',
|
||
status enum ('pending', 'completed') default 'pending' null comment '任务状态',
|
||
question_id int null comment '问题ID'
|
||
)
|
||
comment '百科答题游戏活跃任务表';
|
||
|
||
CREATE INDEX IF NOT EXISTS group_id
|
||
on t_encyclopedia_active_tasks (group_id);
|
||
|
||
CREATE INDEX IF NOT EXISTS question_id
|
||
on t_encyclopedia_active_tasks (question_id);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_encyclopedia_groups
|
||
(
|
||
group_id varchar(50) not null comment '群聊ID'
|
||
primary key,
|
||
created_at datetime default current_timestamp() null comment '记录创建时间'
|
||
)
|
||
comment '百科答题游戏群聊表';
|
||
|
||
CREATE TABLE IF NOT EXISTS t_encyclopedia_players
|
||
(
|
||
player_id varchar(50) not null comment '玩家ID(微信ID)',
|
||
group_id varchar(50) not null comment '群聊ID',
|
||
player_name varchar(50) not null comment '玩家名称',
|
||
points int default 0 null comment '玩家积分',
|
||
created_at datetime default current_timestamp() null comment '记录创建时间',
|
||
primary key (player_id, group_id)
|
||
)
|
||
comment '百科答题游戏玩家表';
|
||
|
||
CREATE TABLE IF NOT EXISTS t_encyclopedia_task_history
|
||
(
|
||
history_id int auto_increment comment '历史记录ID'
|
||
primary key,
|
||
group_id varchar(50) not null comment '群聊ID',
|
||
active_task_id int not null comment '关联的任务ID',
|
||
player_id varchar(50) not null comment '回答者ID',
|
||
answer varchar(256) not null comment '玩家的回答',
|
||
is_correct tinyint(1) default 0 null comment '是否回答正确',
|
||
points_earned int default 0 null comment '获得的积分',
|
||
completed_at datetime default current_timestamp() null comment '完成时间'
|
||
)
|
||
comment '百科答题游戏任务历史表';
|
||
|
||
CREATE INDEX IF NOT EXISTS group_id
|
||
on t_encyclopedia_task_history (group_id);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_error_logs
|
||
(
|
||
id bigint auto_increment
|
||
primary key,
|
||
plugin_name varchar(50) not null comment '插件名称',
|
||
command varchar(50) not null comment '触发的命令',
|
||
user_id varchar(50) not null comment '用户ID',
|
||
group_id varchar(50) null comment '群组ID,私聊为NULL',
|
||
error_message text not null comment '错误信息',
|
||
stack_trace text null comment '堆栈跟踪',
|
||
created_at datetime default current_timestamp() not null comment '创建时间'
|
||
)
|
||
comment '错误日志表';
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_created_at
|
||
on t_error_logs (created_at);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_plugin_name
|
||
on t_error_logs (plugin_name);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_fun_command_rule
|
||
(
|
||
id bigint auto_increment
|
||
primary key,
|
||
rule_name varchar(128) not null,
|
||
scope_type varchar(20) default 'global' not null,
|
||
scope_id varchar(100) default '' not null,
|
||
trigger_type varchar(20) default 'exact' not null,
|
||
trigger_text varchar(500) default '' not null,
|
||
event_key varchar(64) default '' not null,
|
||
responses_json longtext collate utf8mb4_bin not null
|
||
check (json_valid(`responses_json`)),
|
||
priority int default 100 not null,
|
||
cooldown_seconds int default 0 not null,
|
||
enabled tinyint(1) default 1 not null,
|
||
updated_by varchar(100) default 'system' not null,
|
||
created_at datetime default current_timestamp() null,
|
||
updated_at datetime default current_timestamp() null on update current_timestamp()
|
||
);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_event_key
|
||
on t_fun_command_rule (event_key);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_scope_enabled_priority
|
||
on t_fun_command_rule (scope_type, scope_id, enabled, priority);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_trigger_type
|
||
on t_fun_command_rule (trigger_type);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_group_command_user_stats
|
||
(
|
||
id bigint auto_increment
|
||
primary key,
|
||
group_id varchar(50) not null comment '群组ID',
|
||
plugin_name varchar(50) not null comment '插件名称',
|
||
command varchar(50) not null comment '触发命令',
|
||
user_id varchar(50) not null comment '用户ID',
|
||
first_used_at datetime not null comment '首次触发时间',
|
||
last_used_at datetime not null comment '最近触发时间',
|
||
constraint uk_group_plugin_command_user
|
||
unique (group_id, plugin_name, command, user_id)
|
||
)
|
||
comment '群命令用户去重追踪表';
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_group_plugin_command
|
||
on t_group_command_user_stats (group_id, plugin_name, command);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_last_used_at
|
||
on t_group_command_user_stats (last_used_at);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_group_plugin_config
|
||
(
|
||
id bigint auto_increment
|
||
primary key,
|
||
group_id varchar(100) not null,
|
||
plugin_name varchar(128) not null,
|
||
config_key varchar(128) default 'default' not null,
|
||
config_json longtext collate utf8mb4_bin not null
|
||
check (json_valid(`config_json`)),
|
||
enabled tinyint(1) default 1 not null,
|
||
version int default 1 not null,
|
||
updated_by varchar(100) default 'system' not null,
|
||
created_at datetime default current_timestamp() null,
|
||
updated_at datetime default current_timestamp() null on update current_timestamp(),
|
||
constraint uk_group_plugin_key
|
||
unique (group_id, plugin_name, config_key)
|
||
);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_group_plugin
|
||
on t_group_plugin_config (group_id, plugin_name);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_plugin_name
|
||
on t_group_plugin_config (plugin_name);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_group_profile_snapshot
|
||
(
|
||
id int auto_increment
|
||
primary key,
|
||
chatroom_id varchar(64) not null comment '群聊ID',
|
||
group_name varchar(128) default '' null comment '群名称',
|
||
profile_json longtext null comment '群画像快照JSON',
|
||
source_summary_latest_at datetime null comment '构建时参考的最近群总结更新时间',
|
||
source_message_latest_at datetime null comment '构建时参考的最近群消息时间',
|
||
source_summary_count int default 0 not null comment '构建时参考的群总结条数',
|
||
source_message_sample_count int default 0 not null comment '构建时参考的消息样本数',
|
||
last_generated_at datetime default current_timestamp() not null comment '最后一次生成时间',
|
||
create_time datetime default current_timestamp() not null comment '创建时间',
|
||
update_time datetime default current_timestamp() not null on update current_timestamp() comment '更新时间',
|
||
constraint idx_group_profile_snapshot
|
||
unique (chatroom_id)
|
||
)
|
||
comment '群画像快照表';
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_group_profile_generated_at
|
||
on t_group_profile_snapshot (last_generated_at);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_group_stats
|
||
(
|
||
id bigint auto_increment
|
||
primary key,
|
||
group_id varchar(50) not null comment '群组ID',
|
||
plugin_name varchar(50) not null comment '插件名称',
|
||
command varchar(512) not null comment '触发的命令',
|
||
total_calls int default 0 not null comment '总调用次数',
|
||
success_calls int default 0 not null comment '成功调用次数',
|
||
failed_calls int default 0 not null comment '失败调用次数',
|
||
unique_users int default 0 not null comment '唯一用户数',
|
||
first_used_at datetime not null comment '首次使用时间',
|
||
last_used_at datetime not null comment '最后使用时间',
|
||
constraint uk_group_plugin_command
|
||
unique (group_id, plugin_name, command)
|
||
)
|
||
comment '群组使用统计表';
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_group_id
|
||
on t_group_stats (group_id);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_last_used_at
|
||
on t_group_stats (last_used_at);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_llm_backends
|
||
(
|
||
name varchar(128) not null
|
||
primary key,
|
||
config_json longtext collate utf8mb4_bin not null
|
||
check (json_valid(`config_json`)),
|
||
enabled tinyint(1) default 1 not null,
|
||
created_at datetime default current_timestamp() null,
|
||
updated_at datetime default current_timestamp() null on update current_timestamp()
|
||
);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_llm_catalog_meta
|
||
(
|
||
meta_key varchar(64) not null
|
||
primary key,
|
||
meta_value varchar(255) not null,
|
||
updated_at datetime default current_timestamp() null on update current_timestamp()
|
||
);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_llm_dify_apps
|
||
(
|
||
name varchar(128) not null
|
||
primary key,
|
||
provider_template varchar(128) not null,
|
||
app_key varchar(255) not null,
|
||
workflow_output_key varchar(128) default 'text' null,
|
||
config_json longtext collate utf8mb4_bin not null
|
||
check (json_valid(`config_json`)),
|
||
enabled tinyint(1) default 1 not null,
|
||
created_at datetime default current_timestamp() null,
|
||
updated_at datetime default current_timestamp() null on update current_timestamp()
|
||
);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_provider_template
|
||
on t_llm_dify_apps (provider_template);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_llm_provider_templates
|
||
(
|
||
name varchar(128) not null
|
||
primary key,
|
||
provider_type varchar(64) not null,
|
||
config_json longtext collate utf8mb4_bin not null
|
||
check (json_valid(`config_json`)),
|
||
enabled tinyint(1) default 1 not null,
|
||
created_at datetime default current_timestamp() null,
|
||
updated_at datetime default current_timestamp() null on update current_timestamp()
|
||
);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_llm_scenes
|
||
(
|
||
name varchar(128) not null
|
||
primary key,
|
||
target_type varchar(32) not null,
|
||
target_ref varchar(128) not null,
|
||
enabled tinyint(1) default 1 not null,
|
||
created_at datetime default current_timestamp() null,
|
||
updated_at datetime default current_timestamp() null on update current_timestamp()
|
||
);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_target
|
||
on t_llm_scenes (target_type, target_ref);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_member_context
|
||
(
|
||
id int auto_increment
|
||
primary key,
|
||
chatroom_id varchar(64) not null comment '群聊ID',
|
||
wxid varchar(64) not null comment '成员微信ID',
|
||
display_name varchar(128) null comment '成员展示名',
|
||
activity_level varchar(32) null comment '活跃等级',
|
||
message_pattern varchar(255) null comment '发言模式',
|
||
response_style_hint varchar(255) null comment '回复建议',
|
||
topics_of_interest text null comment '兴趣主题(JSON)',
|
||
recent_focus text null comment '近期关注(JSON)',
|
||
summary_text text null comment '交互摘要',
|
||
confidence decimal(4, 2) default 0.00 null comment '摘要置信度',
|
||
source_message_count int default 0 null comment '样本消息数',
|
||
source_days int default 30 null comment '采样天数',
|
||
meta_json longtext null comment '附加元数据(JSON)',
|
||
last_profiled_at datetime default current_timestamp() not null comment '最后生成时间',
|
||
create_time datetime default current_timestamp() not null comment '创建时间',
|
||
update_time datetime default current_timestamp() not null on update current_timestamp() comment '更新时间',
|
||
interaction_style varchar(255) null comment '互动风格',
|
||
constraint idx_member_context
|
||
unique (chatroom_id, wxid)
|
||
)
|
||
comment '群成员交互摘要表';
|
||
|
||
CREATE TABLE IF NOT EXISTS t_member_digest
|
||
(
|
||
id int auto_increment
|
||
primary key,
|
||
chatroom_id varchar(64) not null comment '群聊ID',
|
||
wxid varchar(64) not null comment '成员微信ID',
|
||
digest_type varchar(16) not null comment '摘要类型 daily|weekly|monthly',
|
||
period_key varchar(32) not null comment '周期主键',
|
||
period_start datetime null comment '周期开始时间',
|
||
period_end datetime null comment '周期结束时间',
|
||
display_name varchar(128) null comment '成员展示名',
|
||
source_count int default 0 null comment '源数据条数',
|
||
summary_text text null comment '摘要说明',
|
||
structured_json longtext null comment '结构化摘要JSON',
|
||
meta_json longtext null comment '附加元数据JSON',
|
||
last_generated_at datetime default current_timestamp() not null comment '最后生成时间',
|
||
create_time datetime default current_timestamp() not null comment '创建时间',
|
||
update_time datetime default current_timestamp() not null on update current_timestamp() comment '更新时间',
|
||
constraint idx_member_digest
|
||
unique (chatroom_id, wxid, digest_type, period_key)
|
||
)
|
||
comment '成员分层摘要表';
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_digest_lookup
|
||
on t_member_digest (chatroom_id, wxid, digest_type, period_end);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_member_digest_group_state
|
||
(
|
||
id int auto_increment
|
||
primary key,
|
||
chatroom_id varchar(64) not null comment '群聊ID',
|
||
bootstrap_status varchar(16) default 'pending' not null comment '初始化状态 pending|done|empty',
|
||
last_bootstrap_at datetime null comment '最近一次初始化尝试时间',
|
||
bootstrap_days int default 0 not null comment '最近一次初始化窗口天数',
|
||
built_daily_count int default 0 not null comment '最近一次初始化生成的日摘要数量',
|
||
touched_member_count int default 0 not null comment '最近一次初始化触达的成员数量',
|
||
extra_json longtext null comment '附加状态信息',
|
||
create_time datetime default current_timestamp() not null comment '创建时间',
|
||
update_time datetime default current_timestamp() not null on update current_timestamp() comment '更新时间',
|
||
constraint idx_digest_group_state
|
||
unique (chatroom_id)
|
||
)
|
||
comment '成员分层摘要群级状态表';
|
||
|
||
CREATE TABLE IF NOT EXISTS t_message_mentions
|
||
(
|
||
id bigint auto_increment
|
||
primary key,
|
||
message_id varchar(32) not null comment '原始消息ID',
|
||
group_id varchar(100) not null comment '群ID',
|
||
sender_id varchar(100) not null comment '发送者ID(@发起人)',
|
||
mentioned_user_id varchar(100) not null comment '被@用户ID',
|
||
stat_date date not null comment '统计日期',
|
||
msg_time datetime not null comment '消息时间',
|
||
create_time datetime default current_timestamp() null comment '创建时间',
|
||
constraint uk_message_sender_mentioned
|
||
unique (message_id, sender_id, mentioned_user_id)
|
||
)
|
||
comment '消息@关系明细表';
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_group_date
|
||
on t_message_mentions (group_id, stat_date);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_mentioned_group_date
|
||
on t_message_mentions (mentioned_user_id, group_id, stat_date);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_message_summary
|
||
(
|
||
id int auto_increment
|
||
primary key,
|
||
chatroom_id varchar(64) not null comment '群聊ID',
|
||
group_name varchar(128) default '' null comment '群名称',
|
||
summary_type varchar(16) not null comment '总结类型 daily|manual',
|
||
period_key varchar(32) not null comment '周期主键,如 2026-04-01',
|
||
period_start datetime null comment '总结周期开始时间',
|
||
period_end datetime null comment '总结周期结束时间',
|
||
source_message_count int default 0 not null comment '源消息数量',
|
||
summary_text longtext null comment '总结文本',
|
||
image_path varchar(255) null comment '总结图片路径',
|
||
meta_json longtext null comment '附加元数据JSON',
|
||
last_generated_at datetime default current_timestamp() not null comment '最后生成时间',
|
||
create_time datetime default current_timestamp() not null comment '创建时间',
|
||
update_time datetime default current_timestamp() not null on update current_timestamp() comment '更新时间',
|
||
constraint idx_message_summary
|
||
unique (chatroom_id, summary_type, period_key)
|
||
)
|
||
comment '群消息总结表';
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_message_summary_lookup
|
||
on t_message_summary (chatroom_id, period_end);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_plugin_point_config
|
||
(
|
||
id int auto_increment
|
||
primary key,
|
||
plugin_name varchar(100) not null,
|
||
points_required int default 0 null,
|
||
is_enabled tinyint(1) default 1 null,
|
||
description text null,
|
||
constraint plugin_name
|
||
unique (plugin_name)
|
||
);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_plugin_schedule_logs
|
||
(
|
||
id bigint auto_increment
|
||
primary key,
|
||
schedule_id bigint not null,
|
||
triggered_at datetime default current_timestamp() null,
|
||
status varchar(32) not null,
|
||
summary varchar(255) default '' null,
|
||
detail_json longtext collate utf8mb4_bin null
|
||
check (json_valid(`detail_json`))
|
||
);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_schedule_time
|
||
on t_plugin_schedule_logs (schedule_id, triggered_at);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_plugin_schedules
|
||
(
|
||
id bigint auto_increment
|
||
primary key,
|
||
plugin_name varchar(128) not null,
|
||
action_key varchar(64) not null,
|
||
action_name varchar(128) not null,
|
||
description varchar(255) default '' null,
|
||
trigger_type varchar(64) not null,
|
||
trigger_config longtext collate utf8mb4_bin not null
|
||
check (json_valid(`trigger_config`)),
|
||
target_scope varchar(64) default 'all_enabled_groups' not null,
|
||
target_config longtext collate utf8mb4_bin null
|
||
check (json_valid(`target_config`)),
|
||
payload longtext collate utf8mb4_bin null
|
||
check (json_valid(`payload`)),
|
||
enabled tinyint(1) default 0 not null,
|
||
created_at datetime default current_timestamp() null,
|
||
updated_at datetime default current_timestamp() null on update current_timestamp(),
|
||
constraint uk_plugin_action
|
||
unique (plugin_name, action_key)
|
||
);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_plugin_stats
|
||
(
|
||
id bigint auto_increment
|
||
primary key,
|
||
plugin_name varchar(50) not null comment '插件名称',
|
||
command varchar(512) not null comment '触发的命令',
|
||
stat_date date not null comment '统计日期',
|
||
total_calls int default 0 not null comment '总调用次数',
|
||
success_calls int default 0 not null comment '成功调用次数',
|
||
failed_calls int default 0 not null comment '失败调用次数',
|
||
group_calls int default 0 not null comment '群聊调用次数',
|
||
private_calls int default 0 not null comment '私聊调用次数',
|
||
avg_process_time float default 0 not null comment '平均处理时间(毫秒)',
|
||
created_at datetime default current_timestamp() not null comment '创建时间',
|
||
updated_at datetime default current_timestamp() not null on update current_timestamp() comment '更新时间',
|
||
constraint uk_plugin_command_date
|
||
unique (plugin_name, command, stat_date)
|
||
)
|
||
comment '插件统计汇总表';
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_stat_date
|
||
on t_plugin_stats (stat_date);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_point_transactions
|
||
(
|
||
id int auto_increment
|
||
primary key,
|
||
user_id varchar(100) not null,
|
||
group_id varchar(100) not null,
|
||
transaction_type varchar(20) not null,
|
||
points int not null,
|
||
source varchar(50) not null,
|
||
description text null,
|
||
created_at timestamp default current_timestamp() null
|
||
);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_prison_records
|
||
(
|
||
id int auto_increment
|
||
primary key,
|
||
user_id varchar(100) not null,
|
||
group_id varchar(100) not null,
|
||
start_time timestamp default current_timestamp() null,
|
||
end_time timestamp not null,
|
||
reason varchar(255) null,
|
||
status tinyint default 1 null comment '1:在押 0:已释放',
|
||
bailout_user_id varchar(100) null,
|
||
bailout_time timestamp null,
|
||
created_at timestamp default current_timestamp() null
|
||
);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_push_feedback
|
||
(
|
||
feedback_id varchar(36) not null
|
||
primary key,
|
||
task_id varchar(36) not null,
|
||
user_id varchar(50) not null,
|
||
content text not null,
|
||
timestamp datetime default current_timestamp() null
|
||
);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_push_previews
|
||
(
|
||
preview_id varchar(36) not null
|
||
primary key,
|
||
task_id varchar(36) not null,
|
||
content longtext collate utf8mb4_bin not null
|
||
check (json_valid(`content`)),
|
||
recipients longtext collate utf8mb4_bin not null
|
||
check (json_valid(`recipients`)),
|
||
validation longtext collate utf8mb4_bin null
|
||
check (json_valid(`validation`)),
|
||
status enum ('sent', 'confirmed', 'modified') default 'sent' null,
|
||
created_at datetime default current_timestamp() null
|
||
);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_push_task_logs
|
||
(
|
||
log_id varchar(36) not null
|
||
primary key,
|
||
task_id varchar(36) not null,
|
||
action enum ('create', 'update', 'delete', 'pause', 'resume') not null,
|
||
user_id varchar(50) not null,
|
||
changes longtext collate utf8mb4_bin null
|
||
check (json_valid(`changes`)),
|
||
timestamp datetime default current_timestamp() null
|
||
);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_push_tasks
|
||
(
|
||
task_id varchar(36) not null
|
||
primary key,
|
||
name varchar(50) not null,
|
||
schedule_type enum ('once', 'recurring') not null,
|
||
schedule_time datetime not null,
|
||
recurring_interval enum ('daily', 'weekly', 'monthly') null,
|
||
recurring_end datetime null,
|
||
recurring_time time null,
|
||
weekly_days longtext collate utf8mb4_bin null
|
||
check (json_valid(`weekly_days`)),
|
||
monthly_day int null,
|
||
content_text text null,
|
||
content_image varchar(255) null,
|
||
content_link longtext collate utf8mb4_bin null
|
||
check (json_valid(`content_link`)),
|
||
content_voice varchar(255) null comment '语音消息文件路径',
|
||
content_video varchar(255) null comment '视频消息文件路径',
|
||
content_miniprogram longtext collate utf8mb4_bin null
|
||
check (json_valid(`content_miniprogram`)),
|
||
groups longtext collate utf8mb4_bin null
|
||
check (json_valid(`groups`)),
|
||
priority enum ('high', 'medium', 'low') default 'medium' null,
|
||
status enum ('draft', 'scheduled', 'running', 'completed', 'failed', 'paused') default 'draft' null,
|
||
creator_id varchar(50) not null,
|
||
preview_recipients longtext collate utf8mb4_bin null
|
||
check (json_valid(`preview_recipients`)),
|
||
created_at datetime default current_timestamp() null,
|
||
updated_at datetime default current_timestamp() null on update current_timestamp()
|
||
);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_sign_history
|
||
(
|
||
id bigint auto_increment comment '历史记录ID'
|
||
primary key,
|
||
wx_id varchar(100) not null comment '用户微信ID',
|
||
group_id varchar(100) not null comment '群聊ID',
|
||
sign_date date not null comment '签到日期',
|
||
sign_time datetime not null comment '签到时间',
|
||
is_makeup tinyint(1) default 0 null comment '是否为补签',
|
||
points_earned int default 0 null comment '获得的积分',
|
||
streak_count int default 1 null comment '当时的连签天数',
|
||
create_time datetime default current_timestamp() null comment '记录创建时间'
|
||
)
|
||
comment '用户签到历史记录表';
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_sign_date
|
||
on t_sign_history (sign_date);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_user_group
|
||
on t_sign_history (wx_id, group_id);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_sign_record
|
||
(
|
||
id bigint auto_increment comment '自增主键ID'
|
||
primary key,
|
||
wx_id varchar(100) not null comment '用户微信ID',
|
||
group_id varchar(100) not null comment '群聊ID',
|
||
wx_nick_name varchar(100) not null comment '用户昵称',
|
||
points int default 0 null comment '积分数量',
|
||
sign_stat datetime null comment '最近签到时间',
|
||
signin_streak int default 0 null comment '连续签到天数',
|
||
create_time datetime default current_timestamp() null comment '记录创建时间',
|
||
update_time datetime default current_timestamp() null on update current_timestamp() comment '记录更新时间',
|
||
last_sign_date datetime null comment '上一次签到日期',
|
||
streak_start_sign_date datetime null comment '连续签到第一天日期',
|
||
last_continuous_days int default 0 null comment '历史最长连续签到天数',
|
||
total_sign_days int default 0 null comment '总签到天数',
|
||
previous_streak int default 0 null comment '断签前的连签天数',
|
||
constraint unique_sign
|
||
unique (wx_id, group_id)
|
||
)
|
||
comment '用户群内签到记录表';
|
||
|
||
CREATE TABLE IF NOT EXISTS t_social_edges_daily
|
||
(
|
||
id bigint auto_increment
|
||
primary key,
|
||
stat_date date not null comment '统计日期',
|
||
group_id varchar(100) not null comment '群ID',
|
||
from_user_id varchar(100) not null comment '互动发起方',
|
||
to_user_id varchar(100) not null comment '互动接收方',
|
||
mention_count int default 0 not null comment '@次数',
|
||
reply_count int default 0 not null comment '回复次数(预留)',
|
||
interaction_score decimal(10, 2) default 0.00 not null comment '互动强度分(可用于关系网权重)',
|
||
create_time datetime default current_timestamp() null comment '创建时间',
|
||
update_time datetime default current_timestamp() null on update current_timestamp() comment '更新时间',
|
||
constraint uk_day_group_edge
|
||
unique (stat_date, group_id, from_user_id, to_user_id)
|
||
)
|
||
comment '社交关系日边表(用于关系网和搭子榜)';
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_group_day_score
|
||
on t_social_edges_daily (group_id, stat_date, interaction_score);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_system_job_logs
|
||
(
|
||
id bigint auto_increment
|
||
primary key,
|
||
job_key varchar(64) not null,
|
||
triggered_at datetime default current_timestamp() null,
|
||
status varchar(32) not null,
|
||
summary varchar(255) default '' null,
|
||
detail_json longtext collate utf8mb4_bin null
|
||
check (json_valid(`detail_json`)),
|
||
duration_ms int null
|
||
);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_job_time
|
||
on t_system_job_logs (job_key, triggered_at);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_system_jobs
|
||
(
|
||
job_key varchar(64) not null
|
||
primary key,
|
||
name varchar(128) not null,
|
||
description varchar(255) default '' null,
|
||
trigger_type varchar(64) not null,
|
||
trigger_config longtext collate utf8mb4_bin not null
|
||
check (json_valid(`trigger_config`)),
|
||
enabled tinyint(1) default 1 not null,
|
||
created_at datetime default current_timestamp() null,
|
||
updated_at datetime default current_timestamp() null on update current_timestamp()
|
||
);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_user_levels
|
||
(
|
||
id bigint auto_increment
|
||
primary key,
|
||
user_id varchar(100) not null,
|
||
group_id varchar(100) not null,
|
||
exp bigint default 0 null,
|
||
level int default 1 null,
|
||
last_calc datetime default current_timestamp() null,
|
||
last_active_at datetime default current_timestamp() null,
|
||
constraint uniq_user_group
|
||
unique (user_id, group_id)
|
||
);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_user_points
|
||
(
|
||
id int auto_increment
|
||
primary key,
|
||
user_id varchar(100) not null,
|
||
group_id varchar(100) not null,
|
||
total_points int default 0 null,
|
||
checkin_points int default 0 null,
|
||
game_points int default 0 null,
|
||
other_points int default 0 null,
|
||
last_updated timestamp default current_timestamp() null on update current_timestamp(),
|
||
constraint user_id
|
||
unique (user_id, group_id)
|
||
);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_user_stats
|
||
(
|
||
id bigint auto_increment
|
||
primary key,
|
||
user_id varchar(50) not null comment '用户ID',
|
||
plugin_name varchar(50) not null comment '插件名称',
|
||
command varchar(256) not null comment '触发的命令',
|
||
total_calls int default 0 not null comment '总调用次数',
|
||
success_calls int default 0 not null comment '成功调用次数',
|
||
failed_calls int default 0 not null comment '失败调用次数',
|
||
first_used_at datetime not null comment '首次使用时间',
|
||
last_used_at datetime not null comment '最后使用时间',
|
||
constraint uk_user_plugin_command
|
||
unique (user_id, plugin_name, command)
|
||
)
|
||
comment '用户使用统计表';
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_last_used_at
|
||
on t_user_stats (last_used_at);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_user_id
|
||
on t_user_stats (user_id);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_value_rank_snapshot
|
||
(
|
||
id bigint auto_increment
|
||
primary key,
|
||
stat_date date not null comment '统计日期',
|
||
group_id varchar(100) not null comment '群ID',
|
||
user_id varchar(100) not null comment '用户ID',
|
||
score decimal(10, 2) default 0.00 not null comment '身价分',
|
||
rank_no int default 0 not null comment '排名',
|
||
title varchar(50) default '' not null comment '称号',
|
||
points_total int default 0 not null comment '积分存量',
|
||
msg_count_7d int default 0 not null comment '7日发言数',
|
||
active_days_30 int default 0 not null comment '30日活跃天数',
|
||
inactive_days int default 0 not null comment '距今未发言天数',
|
||
score_detail_json longtext collate utf8mb4_bin null comment '分项得分明细'
|
||
check (json_valid(`score_detail_json`)),
|
||
created_at datetime default current_timestamp() not null,
|
||
updated_at datetime default current_timestamp() not null on update current_timestamp(),
|
||
constraint uniq_day_group_user
|
||
unique (stat_date, group_id, user_id)
|
||
)
|
||
comment '身价日快照表';
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_group_day_rank
|
||
on t_value_rank_snapshot (group_id, stat_date, rank_no);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_value_rank_social_daily
|
||
(
|
||
id bigint auto_increment
|
||
primary key,
|
||
stat_date date not null comment '统计日期',
|
||
group_id varchar(100) not null comment '群ID',
|
||
user_id varchar(100) not null comment '用户ID',
|
||
mentioned_count int default 0 not null comment '被@次数(入度)',
|
||
mention_others_count int default 0 not null comment '@他人次数(出度)',
|
||
unique_interactors int default 0 not null comment '与其发生互动的去重人数',
|
||
interaction_score decimal(10, 2) default 0.00 not null comment '社交影响力分',
|
||
create_time datetime default current_timestamp() null comment '创建时间',
|
||
update_time datetime default current_timestamp() null on update current_timestamp() comment '更新时间',
|
||
constraint uk_day_group_user
|
||
unique (stat_date, group_id, user_id)
|
||
)
|
||
comment 'Value Rank 社交日汇总表';
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_group_day_score
|
||
on t_value_rank_social_daily (group_id, stat_date, interaction_score);
|
||
|
||
CREATE TABLE IF NOT EXISTS t_wechat_contacts
|
||
(
|
||
id int auto_increment
|
||
primary key,
|
||
user_name varchar(64) not null comment '微信ID',
|
||
nick_name varchar(128) null comment '昵称',
|
||
py_initial varchar(128) null comment '拼音首字母',
|
||
quan_pin varchar(256) null comment '全拼',
|
||
sex tinyint null comment '性别:1男,2女,0未知',
|
||
remark varchar(128) null comment '备注',
|
||
remark_py_initial varchar(128) null comment '备注拼音首字母',
|
||
remark_quan_pin varchar(256) null comment '备注全拼',
|
||
signature text null comment '个性签名',
|
||
alias varchar(128) null comment '微信号',
|
||
sns_bg_img text null comment '朋友圈背景图',
|
||
country varchar(64) null comment '国家',
|
||
province varchar(64) null comment '省份',
|
||
city varchar(64) null comment '城市',
|
||
big_head_img_url text null comment '大头像URL',
|
||
small_head_img_url text null comment '小头像URL',
|
||
description text null comment '描述',
|
||
card_img_url text null comment '名片图片URL',
|
||
label_list text null comment '标签列表',
|
||
phone_num_list text null comment '电话号码列表',
|
||
type enum ('friends', 'chatrooms', 'ghs') not null comment '联系人类型:好友、群聊、公众号',
|
||
create_time datetime default current_timestamp() not null comment '创建时间',
|
||
update_time datetime default current_timestamp() not null on update current_timestamp() comment '更新时间',
|
||
constraint idx_user_name
|
||
unique (user_name)
|
||
)
|
||
comment '微信联系人信息表';
|
||
|
||
CREATE TABLE IF NOT EXISTS t_xiuxian_clan
|
||
(
|
||
clan_id bigint auto_increment comment '门派ID'
|
||
primary key,
|
||
clan_name varchar(100) not null comment '门派名称',
|
||
group_id varchar(100) not null comment '所属群ID',
|
||
leader_user_id varchar(100) not null comment '掌门ID',
|
||
constraint uk_group_clan_name
|
||
unique (group_id, clan_name)
|
||
)
|
||
comment '门派表' collate = utf8mb4_unicode_ci;
|
||
|
||
CREATE TABLE IF NOT EXISTS t_xiuxian_item
|
||
(
|
||
item_id int auto_increment comment '物品ID'
|
||
primary key,
|
||
name varchar(100) not null comment '物品名称',
|
||
type varchar(50) not null comment '物品类型',
|
||
description text null comment '物品描述',
|
||
constraint uk_name
|
||
unique (name)
|
||
)
|
||
comment '物品定义表' collate = utf8mb4_unicode_ci;
|
||
|
||
CREATE TABLE IF NOT EXISTS t_xiuxian_player
|
||
(
|
||
user_id varchar(100) not null comment '平台用户ID'
|
||
primary key,
|
||
group_id varchar(100) not null comment '主要所在群ID',
|
||
dao_name varchar(100) not null comment '道号',
|
||
realm varchar(50) default '凡人' null comment '境界',
|
||
spirit_root varchar(50) default '凡灵根' null comment '灵根天赋',
|
||
clan_id bigint null comment '所属门派ID',
|
||
cultivation_points bigint default 0 null comment '修为',
|
||
spirit_stone bigint default 0 null comment '灵石',
|
||
status varchar(20) default 'Idle' null comment '玩家状态',
|
||
status_until datetime null comment '状态到期时间',
|
||
last_cultivate_time datetime null comment '上次闭关开始时间',
|
||
constraint fk_clan_id
|
||
foreign key (clan_id) references t_xiuxian_clan (clan_id)
|
||
on delete set null
|
||
)
|
||
comment '玩家核心数据表' collate = utf8mb4_unicode_ci;
|
||
|
||
CREATE TABLE IF NOT EXISTS t_xiuxian_inventory
|
||
(
|
||
id bigint auto_increment comment '背包条目ID'
|
||
primary key,
|
||
user_id varchar(100) not null comment '玩家ID',
|
||
item_id int not null comment '物品ID',
|
||
quantity int default 0 not null comment '数量',
|
||
constraint uk_user_item
|
||
unique (user_id, item_id),
|
||
constraint fk_inv_item
|
||
foreign key (item_id) references t_xiuxian_item (item_id)
|
||
on delete cascade,
|
||
constraint fk_inv_user
|
||
foreign key (user_id) references t_xiuxian_player (user_id)
|
||
on delete cascade
|
||
)
|
||
comment '玩家背包表' collate = utf8mb4_unicode_ci;
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_clan_id
|
||
on t_xiuxian_player (clan_id);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_realm
|
||
on t_xiuxian_player (realm);
|
||
|