schema.sql 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606
  1. -- 爱伴·AI之旅 训练营 数据库初始化脚本
  2. -- 数据库: cfc 同库 (zxyj) —— 训练营运营表 train_* 与 cfc 会员/活动/账本同库共存
  3. -- 训练营品牌:爱伴·AI之旅
  4. -- 课程等级:L0/L1/L2/L3/L4;其中 L0 = 「家立方-AI管家成长营」(首期课程)
  5. -- 课程表(L0~L4 课程主数据)
  6. CREATE TABLE IF NOT EXISTS train_course (
  7. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  8. level VARCHAR(20) NOT NULL COMMENT '课程等级:L0/L1/L2/L3/L4',
  9. track VARCHAR(20) COMMENT '学习路径/轨道:wealth/health/growth(模块化方向,空=主线通用课程如 L0)',
  10. name VARCHAR(100) NOT NULL COMMENT '课程名称(如 L0 = 家立方-AI管家成长营)',
  11. description VARCHAR(500) COMMENT '课程简介',
  12. status VARCHAR(20) DEFAULT 'draft' COMMENT '手动覆盖状态:draft(下架)/active(强制上架)/finished(强制结束)',
  13. start_time DATETIME COMMENT '课程开始时间(状态自动切换依据)',
  14. end_time DATETIME COMMENT '课程结束时间(状态自动切换依据)',
  15. price INT DEFAULT 0 COMMENT '课程报名价(分,报名=报课程,价格挂在课程上)',
  16. member_price INT DEFAULT 0 COMMENT '课程会员价(分)',
  17. track VARCHAR(20) COMMENT '学习路径/轨道:wealth/health/growth(模块化方向,空=主线通用课程如L0)',
  18. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  19. updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  20. UNIQUE KEY uk_level (level),
  21. INDEX idx_status (status)
  22. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='训练营课程(L0/L1/L2/L3/L4)';
  23. -- 课程版块表(管理端维护:版块增删改/排序/启用)
  24. CREATE TABLE IF NOT EXISTS train_course_section (
  25. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  26. course_id BIGINT NOT NULL COMMENT '所属课程ID(train_course.id)',
  27. title VARCHAR(100) NOT NULL COMMENT '版块标题(如:课前准备/课中学习/课后跟进)',
  28. description VARCHAR(500) COMMENT '版块说明',
  29. sort INT DEFAULT 0 COMMENT '排序(升序)',
  30. enabled TINYINT DEFAULT 1 COMMENT '1=启用,0=禁用',
  31. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  32. updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  33. INDEX idx_course_id (course_id),
  34. INDEX idx_sort (sort)
  35. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='课程版块(管理端维护)';
  36. -- 课程模块表(模块化教学:课程按模块组织内容,支持学习路径 track 归类与排序)
  37. CREATE TABLE IF NOT EXISTS train_module (
  38. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  39. course_id BIGINT NOT NULL COMMENT '所属课程ID(train_course.id)',
  40. track VARCHAR(20) COMMENT '学习路径/轨道:wealth/health/growth(null=通用/无方向)',
  41. title VARCHAR(100) NOT NULL COMMENT '模块标题',
  42. description VARCHAR(500) COMMENT '模块简介',
  43. sort INT DEFAULT 0 COMMENT '排序(升序)',
  44. enabled TINYINT DEFAULT 1 COMMENT '1=启用,0=禁用',
  45. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  46. updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  47. INDEX idx_course_id (course_id),
  48. INDEX idx_track (track),
  49. INDEX idx_sort (sort)
  50. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='课程模块(模块化教学)';
  51. -- 班次表
  52. CREATE TABLE IF NOT EXISTS train_class (
  53. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  54. activity_id BIGINT COMMENT '关联 cfc 活动 ID(activities.id,cfc 同库)',
  55. course_id BIGINT COMMENT '关联课程 ID(train_course.id,L0/L1/L2…)',
  56. name VARCHAR(100) NOT NULL COMMENT '班次名称',
  57. code VARCHAR(20) UNIQUE COMMENT '班级码(学员进班用)',
  58. time VARCHAR(100) COMMENT '培训时间描述',
  59. place VARCHAR(100) COMMENT '培训地点',
  60. capacity INT DEFAULT 20 COMMENT '容量',
  61. status VARCHAR(20) DEFAULT 'draft' COMMENT 'draft/active/finished',
  62. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  63. updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  64. INDEX idx_code (code),
  65. INDEX idx_activity_id (activity_id),
  66. INDEX idx_course_id (course_id)
  67. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='班次';
  68. -- 学员用户表
  69. CREATE TABLE IF NOT EXISTS train_user (
  70. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  71. cfc_user_id BIGINT COMMENT 'cfc 统一会员 ID(users.id,cfc 同库)',
  72. openid VARCHAR(64) COMMENT '微信openid',
  73. phone VARCHAR(11) COMMENT '手机号',
  74. name VARCHAR(50) COMMENT '姓名',
  75. alumni_verify VARCHAR(50) COMMENT '校友身份校验: accepted/pending/rejected',
  76. invite_code VARCHAR(50) COMMENT '专属邀请码',
  77. grade VARCHAR(50) COMMENT '校友届别',
  78. department VARCHAR(50) COMMENT '院系',
  79. city VARCHAR(50) COMMENT '城市',
  80. family_struct VARCHAR(100) COMMENT '家庭结构',
  81. concern_book VARCHAR(20) COMMENT '最关心的账本: wealth/health/growth',
  82. role VARCHAR(20) DEFAULT 'student' COMMENT 'student/teacher/assistant/admin',
  83. class_id BIGINT COMMENT '所属班次ID',
  84. status VARCHAR(20) DEFAULT 'active' COMMENT 'active/blocked',
  85. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  86. updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  87. INDEX idx_openid (openid),
  88. INDEX idx_phone (phone),
  89. INDEX idx_class_id (class_id),
  90. INDEX idx_cfc_user_id (cfc_user_id)
  91. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学员用户';
  92. -- 兼容存量库:为新版本新增的 cfc 关联列补列(列已存在时静默跳过)
  93. -- 下方语句由 DatabaseInitializer 逐条执行并容错,重复执行不报致命错误
  94. ALTER TABLE train_class ADD COLUMN activity_id BIGINT COMMENT '关联 cfc 活动 ID(activities.id,cfc 同库)';
  95. ALTER TABLE train_class ADD COLUMN course_id BIGINT COMMENT '关联课程 ID(train_course.id,L0/L1/L2…)';
  96. ALTER TABLE train_user ADD COLUMN cfc_user_id BIGINT COMMENT 'cfc 统一会员 ID(users.id,cfc 同库)';
  97. ALTER TABLE train_class ADD COLUMN start_at DATETIME COMMENT '课程开始时间(投屏计时基准,NULL=未开始)';
  98. ALTER TABLE train_course ADD COLUMN start_time DATETIME COMMENT '课程开始时间(状态自动切换依据)';
  99. ALTER TABLE train_course ADD COLUMN end_time DATETIME COMMENT '课程结束时间(状态自动切换依据)';
  100. ALTER TABLE train_course ADD COLUMN price INT DEFAULT 0 COMMENT '课程报名价(分,报名=报课程,价格挂在课程上)';
  101. ALTER TABLE train_course ADD COLUMN member_price INT DEFAULT 0 COMMENT '课程会员价(分)';
  102. ALTER TABLE train_course ADD COLUMN track VARCHAR(20) COMMENT '学习路径/轨道:wealth/health/growth(模块化方向,空=主线通用课程如 L0)';
  103. ALTER TABLE train_course ADD COLUMN track VARCHAR(20) COMMENT '学习路径/轨道:wealth/health/growth(模块化方向,空=主线通用课程如L0)';
  104. ALTER TABLE train_enrollment ADD COLUMN course_id BIGINT COMMENT '报名所属课程 ID(train_course.id,报名=报课程;班次仅确定上课期次)';
  105. -- 小组表
  106. CREATE TABLE IF NOT EXISTS train_group (
  107. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  108. class_id BIGINT NOT NULL COMMENT '班次ID',
  109. name VARCHAR(50) NOT NULL COMMENT '组名(含数字+钱/身体/孩子之一)',
  110. slogan VARCHAR(100) COMMENT '8字口号',
  111. qr_code VARCHAR(255) COMMENT '二维码',
  112. spokesperson_uid BIGINT COMMENT '路演发言人(话最少的人,不可更换)',
  113. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  114. updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  115. INDEX idx_class_id (class_id)
  116. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='小组';
  117. -- 组内成员表
  118. CREATE TABLE IF NOT EXISTS train_group_member (
  119. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  120. group_id BIGINT NOT NULL COMMENT '组ID',
  121. uid BIGINT NOT NULL COMMENT '学员ID',
  122. joined_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  123. INDEX idx_group_id (group_id),
  124. INDEX idx_uid (uid)
  125. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='组内成员';
  126. -- 分工表(三本账)
  127. CREATE TABLE IF NOT EXISTS train_assignment (
  128. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  129. group_id BIGINT NOT NULL COMMENT '组ID',
  130. uid BIGINT NOT NULL COMMENT '学员ID',
  131. book_type VARCHAR(20) NOT NULL COMMENT 'wealth/health/growth',
  132. role VARCHAR(20) DEFAULT 'expert' COMMENT 'expert/support',
  133. use_sample TINYINT DEFAULT 0 COMMENT '1=使用etotem脱敏样本',
  134. status VARCHAR(20) DEFAULT 'pending' COMMENT 'pending/confirmed',
  135. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  136. updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  137. INDEX idx_group_book (group_id, book_type),
  138. INDEX idx_uid (uid)
  139. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='组内分工(三本账)';
  140. -- 成果上传表
  141. CREATE TABLE IF NOT EXISTS train_submission (
  142. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  143. uid BIGINT NOT NULL COMMENT '学员ID',
  144. group_id BIGINT COMMENT '组ID',
  145. book_type VARCHAR(20) COMMENT 'wealth/health/growth',
  146. type VARCHAR(20) DEFAULT 'deep' COMMENT 'deep(深度产出)/taught(互教跑通)',
  147. files TEXT COMMENT '文件列表JSON: [{url,name}]',
  148. image TEXT COMMENT '核心产出截图(脱敏后)',
  149. sample_flag TINYINT DEFAULT 0 COMMENT '1=样本数据非本人',
  150. desensitized TINYINT DEFAULT 0 COMMENT '1=已确认脱敏',
  151. verified_by BIGINT COMMENT '助教/讲师ID',
  152. status VARCHAR(20) DEFAULT 'pending' COMMENT 'pending/approved/rejected',
  153. reject_reason VARCHAR(255) COMMENT '退回原因',
  154. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  155. updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  156. INDEX idx_uid (uid),
  157. INDEX idx_group_id (group_id),
  158. INDEX idx_status (status)
  159. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='成果上传';
  160. -- 教学卡表(互教5步教学卡)
  161. CREATE TABLE IF NOT EXISTS train_teaching_card (
  162. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  163. submission_id BIGINT COMMENT '关联成果ID',
  164. uid BIGINT NOT NULL,
  165. group_id BIGINT,
  166. book_type VARCHAR(20) COMMENT 'wealth/health/growth',
  167. steps TEXT COMMENT '5步教学卡内容JSON',
  168. image VARCHAR(255) COMMENT '教学卡照片',
  169. quality_score INT DEFAULT NULL COMMENT '教学卡质量分0-20',
  170. quality_by BIGINT COMMENT '评分人',
  171. status VARCHAR(20) DEFAULT 'pending' COMMENT 'pending/approved/rejected',
  172. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  173. updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  174. INDEX idx_uid (uid)
  175. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='教学卡';
  176. -- 积分流水表
  177. CREATE TABLE IF NOT EXISTS train_score (
  178. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  179. group_id BIGINT COMMENT '组ID(可为空=个人分)',
  180. uid BIGINT COMMENT '学员ID',
  181. item VARCHAR(50) NOT NULL COMMENT '计分项:install/prep/find/upload/teach/roadmap_quality/roadmap/vote/help',
  182. points INT NOT NULL COMMENT '分值',
  183. by_uid BIGINT COMMENT '打分人(人工评分项)',
  184. remark VARCHAR(255) COMMENT '备注',
  185. ts DATETIME DEFAULT CURRENT_TIMESTAMP,
  186. INDEX idx_group_id (group_id),
  187. INDEX idx_uid (uid),
  188. INDEX idx_item (item)
  189. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='积分流水';
  190. -- 投票表(两轮)
  191. CREATE TABLE IF NOT EXISTS train_vote (
  192. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  193. class_id BIGINT NOT NULL,
  194. round INT NOT NULL COMMENT '1=我学会了(2票,不得投本组);2=最想抄走(1票,可投本组)',
  195. voter_uid BIGINT NOT NULL COMMENT '投票人',
  196. target_group_id BIGINT NOT NULL COMMENT '被投组ID',
  197. ts DATETIME DEFAULT CURRENT_TIMESTAMP,
  198. INDEX idx_class_round (class_id, round),
  199. INDEX idx_voter (voter_uid),
  200. INDEX idx_target (target_group_id)
  201. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='投票';
  202. -- 路演材料表
  203. CREATE TABLE IF NOT EXISTS train_roadmap (
  204. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  205. group_id BIGINT NOT NULL,
  206. proposition VARCHAR(20) COMMENT '命题A-E',
  207. files TEXT COMMENT '路演材料截图/文件',
  208. speaker_uid BIGINT COMMENT '发言人ID',
  209. score INT DEFAULT NULL COMMENT '讲师路演评分0-40',
  210. score_by BIGINT COMMENT '评分人',
  211. status VARCHAR(20) DEFAULT 'pending',
  212. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  213. updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  214. INDEX idx_group_id (group_id)
  215. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='路演材料';
  216. -- 装机打卡表
  217. CREATE TABLE IF NOT EXISTS train_checkin (
  218. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  219. uid BIGINT NOT NULL,
  220. image VARCHAR(255) COMMENT 'WorkBuddy已安装登录截图',
  221. status VARCHAR(20) DEFAULT 'done' COMMENT 'done=已装机',
  222. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  223. INDEX idx_uid (uid)
  224. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='装机打卡';
  225. -- 数据准备自检表
  226. CREATE TABLE IF NOT EXISTS train_prep_check (
  227. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  228. uid BIGINT NOT NULL,
  229. wealth_data TINYINT DEFAULT 0 COMMENT '券商持仓',
  230. health_data TINYINT DEFAULT 0 COMMENT '体检或血压',
  231. growth_data TINYINT DEFAULT 0 COMMENT '孩子成绩或日程',
  232. has_none TINYINT DEFAULT 0 COMMENT '1=选了无',
  233. use_sample TINYINT DEFAULT 0 COMMENT '1=分配到etotem脱敏样本',
  234. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  235. INDEX idx_uid (uid)
  236. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据准备自检';
  237. -- 7天行动计划表
  238. CREATE TABLE IF NOT EXISTS train_plan (
  239. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  240. uid BIGINT NOT NULL,
  241. items TEXT COMMENT '4件事JSON: [补齐账本,固化3用法,第2条自动化,约etotem测评]',
  242. submitted_at DATETIME,
  243. status VARCHAR(20) DEFAULT 'pending' COMMENT 'pending/done',
  244. INDEX idx_uid (uid)
  245. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='7天行动计划';
  246. -- 卡券表
  247. CREATE TABLE IF NOT EXISTS train_coupon (
  248. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  249. uid BIGINT NOT NULL,
  250. type VARCHAR(20) NOT NULL COMMENT 'L1/private/etotem',
  251. code VARCHAR(64) COMMENT '凭证码',
  252. status VARCHAR(20) DEFAULT 'unused' COMMENT 'unused/used/expired',
  253. `trigger` VARCHAR(50) COMMENT '触发来源: vote/finish/research/champion/teaching',
  254. granted_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  255. used_at DATETIME,
  256. INDEX idx_uid (uid),
  257. INDEX idx_type (type)
  258. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='卡券';
  259. -- 测评兴趣调研表
  260. CREATE TABLE IF NOT EXISTS train_survey (
  261. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  262. uid BIGINT NOT NULL,
  263. class_id BIGINT,
  264. interest VARCHAR(100) COMMENT 'interest_health/interest_growth',
  265. submitted_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  266. INDEX idx_uid (uid)
  267. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='测评兴趣调研';
  268. -- 管理后台账号表
  269. CREATE TABLE IF NOT EXISTS train_admin (
  270. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  271. username VARCHAR(50) NOT NULL UNIQUE,
  272. password VARCHAR(128) NOT NULL COMMENT 'BCrypt加密',
  273. role VARCHAR(20) NOT NULL COMMENT 'admin(运营)/lecturer(讲师)/assistant(助教)',
  274. name VARCHAR(50) COMMENT '姓名',
  275. manage_group_ids VARCHAR(255) COMMENT '助教负责的组ID(逗号分隔)',
  276. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  277. INDEX idx_username (username)
  278. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理后台账号';
  279. -- 审核日志表
  280. CREATE TABLE IF NOT EXISTS train_audit_log (
  281. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  282. action VARCHAR(100) NOT NULL COMMENT '操作',
  283. actor_uid BIGINT COMMENT '操作者',
  284. target_type VARCHAR(50) COMMENT '目标类型',
  285. target_id BIGINT COMMENT '目标ID',
  286. detail TEXT COMMENT '详情',
  287. ts DATETIME DEFAULT CURRENT_TIMESTAMP,
  288. INDEX idx_actor (actor_uid),
  289. INDEX idx_target (target_type, target_id)
  290. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='审计日志';
  291. -- 报名单表(报名挂课程;班次确定上课期次)
  292. CREATE TABLE IF NOT EXISTS train_enrollment (
  293. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  294. uid BIGINT COMMENT '学员ID(登录后)',
  295. course_id BIGINT COMMENT '报名所属课程ID(train_course.id,报名=报课程)',
  296. class_id BIGINT COMMENT '所选班次ID(该课程的某一期)',
  297. salon_id BIGINT COMMENT '关联沙龙期次(train_salon.id)',
  298. name VARCHAR(50) COMMENT '姓名',
  299. phone VARCHAR(11) COMMENT '手机号',
  300. bring_laptop TINYINT DEFAULT 0 COMMENT '1=带电脑',
  301. data_ready VARCHAR(50) COMMENT '已备数据类别(逗号分隔)',
  302. top_problems TEXT COMMENT '最想解决的3个问题JSON',
  303. source VARCHAR(20) DEFAULT 'scene' COMMENT '来源:scene/invite',
  304. invite_code VARCHAR(50) COMMENT '邀请码(基于train_user.invite_code)',
  305. status VARCHAR(20) DEFAULT 'pending' COMMENT 'pending(待支付)/paid(已支付)/reviewing(进班待审核)/confirmed(已进班)/rejected(进班被拒)/cancelled(已取消)',
  306. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  307. updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  308. INDEX idx_uid (uid),
  309. INDEX idx_course_id (course_id),
  310. INDEX idx_class_id (class_id),
  311. INDEX idx_status (status)
  312. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='报名单';
  313. -- 支付订单表
  314. CREATE TABLE IF NOT EXISTS train_order (
  315. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  316. order_no VARCHAR(32) NOT NULL UNIQUE COMMENT '订单号',
  317. enrollment_id BIGINT COMMENT '关联报名单',
  318. uid BIGINT COMMENT '学员ID',
  319. class_id BIGINT COMMENT '班次ID',
  320. amount INT NOT NULL COMMENT '实付金额(分)',
  321. original_amount INT COMMENT '原价(分)',
  322. discount_amount INT DEFAULT 0 COMMENT '优惠(分)',
  323. pay_channel VARCHAR(20) DEFAULT 'wechat' COMMENT '支付渠道',
  324. status VARCHAR(20) DEFAULT 'unpaid' COMMENT 'unpaid/paid/refunded/failed/closed',
  325. pay_time DATETIME,
  326. wechat_txn_id VARCHAR(64) COMMENT '微信交易号',
  327. prepay_id VARCHAR(64) COMMENT '预支付ID',
  328. refund_amount INT DEFAULT 0 COMMENT '已退金额(分)',
  329. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  330. updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  331. INDEX idx_uid (uid),
  332. INDEX idx_class_id (class_id),
  333. INDEX idx_status (status),
  334. INDEX idx_enrollment_id (enrollment_id)
  335. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付订单';
  336. -- 转介绍关系表
  337. CREATE TABLE IF NOT EXISTS train_invite (
  338. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  339. inviter_id BIGINT NOT NULL COMMENT '邀请人(train_user.id)',
  340. invitee_id BIGINT COMMENT '被邀请人(train_user.id)',
  341. invite_code VARCHAR(50) COMMENT '邀请码',
  342. order_id BIGINT COMMENT '被邀请人的订单ID',
  343. successful TINYINT DEFAULT 0 COMMENT '1=被邀请人已完成付费',
  344. reward_status VARCHAR(20) DEFAULT 'pending' COMMENT 'pending/granted',
  345. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  346. INDEX idx_inviter (inviter_id),
  347. INDEX idx_invitee (invitee_id),
  348. UNIQUE KEY uk_code_invitee (invite_code, invitee_id)
  349. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='转介绍关系';
  350. -- 课前资料包表(二期)
  351. CREATE TABLE IF NOT EXISTS train_course_material (
  352. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  353. course_id BIGINT COMMENT '所属课程ID(train_course.id,为空=按班次关联的存量资料)',
  354. section_id BIGINT COMMENT '所属课程版块ID(train_course_section.id,空=通用)',
  355. class_id BIGINT COMMENT '班次ID(为空=通用资料)',
  356. title VARCHAR(100) NOT NULL COMMENT '资料标题',
  357. category VARCHAR(20) COMMENT '分类:pre(课前)/course(课中)/after(课后)',
  358. file_url VARCHAR(255) COMMENT 'PDF/附件URL',
  359. sort INT DEFAULT 0,
  360. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  361. INDEX idx_course_id (course_id),
  362. INDEX idx_section_id (section_id),
  363. INDEX idx_class_id (class_id)
  364. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='课前资料包';
  365. -- 课前资料包表补列(存量库幂等迁移:重复执行报错被吞,属预期)
  366. ALTER TABLE train_course_material ADD COLUMN course_id BIGINT COMMENT '所属课程ID(train_course.id)';
  367. ALTER TABLE train_course_material ADD COLUMN section_id BIGINT COMMENT '所属课程版块ID(train_course_section.id)';
  368. ALTER TABLE train_course_material ADD COLUMN category VARCHAR(20) COMMENT '分类:pre(课前)/course(课中)/after(课后)';
  369. -- 班级投屏配置表(每班一条,按下述模块开关控制大屏显示)
  370. CREATE TABLE IF NOT EXISTS train_screen_config (
  371. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  372. class_id BIGINT NOT NULL COMMENT '班次ID',
  373. show_scoreboard TINYINT DEFAULT 1 COMMENT '1=显示小组积分榜',
  374. show_checkin TINYINT DEFAULT 1 COMMENT '1=显示签到情况',
  375. show_progress TINYINT DEFAULT 1 COMMENT '1=显示完课进度',
  376. show_group_progress TINYINT DEFAULT 1 COMMENT '1=显示小组进展矩阵(分工/任务/路演)',
  377. show_vote TINYINT DEFAULT 1 COMMENT '1=显示投票结果',
  378. show_material TINYINT DEFAULT 1 COMMENT '1=显示课程资料',
  379. show_banner TINYINT DEFAULT 1 COMMENT '1=显示公告横幅',
  380. show_timer TINYINT DEFAULT 1 COMMENT '1=显示课程进行时间',
  381. agenda VARCHAR(2000) COMMENT '课程环节JSON: [{"title":"开场","minutes":10},...]',
  382. current_step INT DEFAULT 0 COMMENT '当前环节序号(从0开始,助教切换)',
  383. banner VARCHAR(200) COMMENT '投屏公告',
  384. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  385. updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  386. UNIQUE KEY uk_class_id (class_id)
  387. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='班级投屏配置';
  388. -- 团报订单表(FR-PAY-03:多学员一单 + 企业开票信息采集)
  389. CREATE TABLE IF NOT EXISTS train_group_order (
  390. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  391. group_no VARCHAR(32) NOT NULL UNIQUE COMMENT '团报单号',
  392. class_id BIGINT NOT NULL COMMENT '班次ID',
  393. leader_uid BIGINT NOT NULL COMMENT '发起人(train_user.id)',
  394. member_count INT DEFAULT 1 COMMENT '报名人数',
  395. unit_amount INT COMMENT '单价(分)',
  396. total_amount INT NOT NULL COMMENT '总金额(分)',
  397. order_id BIGINT COMMENT '关联支付订单(train_order.id)',
  398. status VARCHAR(20) DEFAULT 'pending' COMMENT 'pending/paid/closed',
  399. invoice_title VARCHAR(200) COMMENT '发票抬头(企业名称)',
  400. invoice_tax_no VARCHAR(100) COMMENT '税号',
  401. invoice_email VARCHAR(100) COMMENT '电子发票接收邮箱',
  402. invoice_phone VARCHAR(50) COMMENT '收票人电话',
  403. invoice_type VARCHAR(20) COMMENT '普票/专票',
  404. pay_time DATETIME COMMENT '支付时间',
  405. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  406. updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  407. INDEX idx_class_id (class_id),
  408. INDEX idx_leader_uid (leader_uid),
  409. INDEX idx_status (status)
  410. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='团报订单(多学员一单+开票)';
  411. -- 团报成员表(FR-PAY-03:一个团报单下的学员名单,支付成功后逐人生成报名单)
  412. CREATE TABLE IF NOT EXISTS train_group_order_member (
  413. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  414. group_order_id BIGINT NOT NULL COMMENT '团报单ID',
  415. name VARCHAR(50) NOT NULL COMMENT '学员姓名',
  416. phone VARCHAR(11) COMMENT '手机号',
  417. uid BIGINT COMMENT '对应学员ID(已注册则回填)',
  418. enrollment_id BIGINT COMMENT '支付成功后生成的报名单ID',
  419. status VARCHAR(20) DEFAULT 'pending' COMMENT 'pending/paid',
  420. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  421. INDEX idx_group_order_id (group_order_id),
  422. INDEX idx_uid (uid)
  423. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='团报成员';
  424. -- 学员案例表(FR-FISS-04:采集→脱敏→授权→回流)
  425. CREATE TABLE IF NOT EXISTS train_case (
  426. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  427. uid BIGINT NOT NULL COMMENT '案例学员ID',
  428. class_id BIGINT COMMENT '班次ID',
  429. title VARCHAR(100) NOT NULL COMMENT '案例标题',
  430. summary TEXT COMMENT '脱敏后的案例内容(不含真实数据)',
  431. source_submission_id BIGINT COMMENT '来源成果(train_submission.id)',
  432. status VARCHAR(20) DEFAULT 'pending' COMMENT 'pending待授权/authorized已授权/rejected已拒绝/published已发布',
  433. consent_at DATETIME COMMENT '学员授权时间',
  434. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  435. updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  436. INDEX idx_uid (uid),
  437. INDEX idx_status (status)
  438. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学员案例(采集/授权/回流)';
  439. -- 沙龙表(沙龙产品化:一期沙龙 = train_salon 行 + 同步一条 cfc 活动)
  440. CREATE TABLE IF NOT EXISTS train_salon (
  441. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  442. activity_id BIGINT COMMENT '关联 cfc 活动 ID(activities.id,cfc 同库)',
  443. theme VARCHAR(50) COMMENT '主题: ai_basic/wealth/health/growth',
  444. title VARCHAR(100) NOT NULL COMMENT '沙龙标题',
  445. time VARCHAR(100) COMMENT '时间描述',
  446. place VARCHAR(100) COMMENT '地点',
  447. capacity INT DEFAULT 20 COMMENT '容量',
  448. price INT DEFAULT 6800 COMMENT '价格(分)',
  449. status VARCHAR(20) DEFAULT 'active' COMMENT 'draft/active/finished',
  450. start_at DATETIME COMMENT '开始时间',
  451. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  452. updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  453. INDEX idx_status (status),
  454. INDEX idx_activity_id (activity_id)
  455. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='沙龙期次';
  456. -- 沙龙报名补列(存量库幂等迁移:重复执行报错被吞,属预期)
  457. ALTER TABLE train_enrollment ADD COLUMN salon_id BIGINT COMMENT '关联沙龙期次(train_salon.id)';
  458. -- 沙龙现场签到表(一人一期一条,唯一键防重复签到)
  459. CREATE TABLE IF NOT EXISTS train_salon_checkin (
  460. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  461. uid BIGINT NOT NULL COMMENT '学员(train_user.id)',
  462. salon_id BIGINT NOT NULL COMMENT '沙龙期次(train_salon.id)',
  463. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  464. UNIQUE KEY uk_uid_salon (uid, salon_id),
  465. INDEX idx_salon_id (salon_id)
  466. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='沙龙签到';
  467. -- 沙龙会后反馈表(一人一期一条,唯一键防重复提交)
  468. CREATE TABLE IF NOT EXISTS train_salon_feedback (
  469. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  470. uid BIGINT NOT NULL COMMENT '学员(train_user.id)',
  471. salon_id BIGINT NOT NULL COMMENT '沙龙期次(train_salon.id)',
  472. rating INT DEFAULT 5 COMMENT '评分 1-5',
  473. comment VARCHAR(500) COMMENT '留言内容',
  474. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  475. UNIQUE KEY uk_uid_salon (uid, salon_id),
  476. INDEX idx_salon_id (salon_id)
  477. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='沙龙反馈';
  478. -- 完课证书表(编号体系:CM-{课程码}-{年份}-{序号},幂等发号)
  479. CREATE TABLE IF NOT EXISTS train_certificate (
  480. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  481. cert_no VARCHAR(50) NOT NULL COMMENT '证书编号 CM-{课程码}-{年份}-{序号}',
  482. uid BIGINT NOT NULL COMMENT '持有人(train_user.id)',
  483. class_id BIGINT COMMENT '班次ID(train_class.id)',
  484. level VARCHAR(10) COMMENT '课程码 L0/L1/L2/L3',
  485. year INT COMMENT '颁发年份',
  486. seq INT COMMENT '当年序号',
  487. holder_name VARCHAR(50) COMMENT '持有人姓名快照',
  488. issued_at DATETIME COMMENT '颁发时间',
  489. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  490. UNIQUE KEY uk_cert_no (cert_no),
  491. INDEX idx_uid (uid)
  492. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='完课证书';
  493. -- ========== 徽章与成长体系 ==========
  494. -- 徽章目录表(32 枚静态定义,种子数据随表插入)
  495. CREATE TABLE IF NOT EXISTS train_badge (
  496. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  497. badge_key VARCHAR(50) NOT NULL UNIQUE COMMENT '徽章键,如 mod_s1/course_start/skill_pitch/ms_light/lec_t1',
  498. category VARCHAR(20) NOT NULL COMMENT 'module/course/skill/milestone/lecturer',
  499. name VARCHAR(50) NOT NULL COMMENT '徽章名',
  500. color VARCHAR(20) COMMENT '标识色(hex,如 #7C3AED)',
  501. carrier VARCHAR(20) DEFAULT '电子' COMMENT '载体:电子/实体',
  502. condition_desc VARCHAR(200) COMMENT '获得条件描述(前端展示用)',
  503. sort INT DEFAULT 0 COMMENT '排序',
  504. created_at DATETIME DEFAULT CURRENT_TIMESTAMP
  505. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='徽章目录(32枚)';
  506. -- 用户徽章表
  507. CREATE TABLE IF NOT EXISTS train_user_badge (
  508. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  509. uid BIGINT NOT NULL COMMENT '学员ID(train_user.id)',
  510. badge_key VARCHAR(50) NOT NULL COMMENT '徽章键',
  511. proof VARCHAR(200) COMMENT '获得依据(判定结果/手动备注)',
  512. granted_by BIGINT COMMENT '颁发人(train_admin.id,0=系统自动)',
  513. earned_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '获得时间',
  514. UNIQUE KEY uk_uid_badge (uid, badge_key),
  515. INDEX idx_uid (uid)
  516. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户徽章';
  517. -- 徽章目录种子数据(32 条,ON DUPLICATE KEY UPDATE 幂等)
  518. INSERT INTO train_badge(badge_key,category,name,color,carrier,condition_desc,sort) VALUES
  519. ('mod_s1','module','启航·上','#7C3AED','电子','完成 S1 家庭目录树检查',1),
  520. ('mod_s2','module','启航·下','#7C3AED','电子','完成 S2 路演两轮投票',2),
  521. ('mod_a1','module','财富诊断','#F59E0B','电子','完成 L1-A1 提交真实财富报告',3),
  522. ('mod_a2','module','财富系统','#F59E0B','电子','完成 L1-A2 自动化生效',4),
  523. ('mod_h1','module','健康趋势','#10B981','电子','完成 L1-H1 提交风险清单',5),
  524. ('mod_h2','module','健康系统','#10B981','电子','完成 L1-H2 解读菌群报告',6),
  525. ('mod_g1','module','成长拆解','#8B5CF6','电子','完成 L1-G1 习惯实验',7),
  526. ('mod_g2','module','成长系统','#8B5CF6','电子','完成 L1-G2 学期计划',8),
  527. ('mod_b1','module','系统架构','#1D4ED8','电子','完成 L2-B1 ≥5条联动规则',9),
  528. ('mod_b2','module','自动化工厂','#1D4ED8','电子','完成 L2-B2 ≥8条自动化',10),
  529. ('mod_b3','module','仪表盘','#1D4ED8','电子','完成 L2-B3 看板上线',11),
  530. ('mod_b4','module','季度闭环','#1D4ED8','电子','完成 L2-B4 系统体检',12),
  531. ('course_start','course','启航徽章','#7C3AED','实体+证书','L0 完课',13),
  532. ('course_wealth','course','财富专精徽章','#F59E0B','电子','L1-A 完课',14),
  533. ('course_health','course','健康专精徽章','#10B981','电子','L1-B 完课',15),
  534. ('course_growth','course','成长规划专精徽章','#8B5CF6','电子','L1-C 完课',16),
  535. ('course_system','course','系统师徽章','#14B8A6','电子','L2 完课+L3 结业',17),
  536. ('skill_mask','skill','脱敏达人','#64748B','电子','找茬赛满分/脱敏零问题',18),
  537. ('skill_prompt','skill','提示词匠人','#64748B','电子','改编提示词≥10条被采用',19),
  538. ('skill_automation','skill','自动化搭建者','#64748B','电子','自建自动化≥5条稳定1月',20),
  539. ('skill_pitch','skill','路演讲者','#64748B','电子','L0路演获最想抄走票',21),
  540. ('skill_board','skill','看板设计师','#64748B','电子','仪表盘获最佳',22),
  541. ('skill_retest','skill','复测坚持者','#64748B','电子','连续2季度复测',23),
  542. ('ms_21day','milestone','21天全勤','#F59E0B','实体','L3打卡≥21天',24),
  543. ('ms_light','milestone','传灯徽章','#F97316','实体','成功转介≥3人报名',25),
  544. ('ms_repeat','milestone','回炉徽章','#F97316','电子','复训≥3模块',26),
  545. ('ms_share','milestone','分享徽章','#F97316','实体','沙龙案例分享≥1次',27),
  546. ('ms_review','milestone','年度复盘','#F59E0B','电子','完成三本账年度复盘',28),
  547. ('lec_t1','lecturer','讲师·铜','#F97316','实体+讲师证','T1认证',29),
  548. ('lec_t2','lecturer','讲师·银','#D4D4D8','电子','T2认证',30),
  549. ('lec_t3','lecturer','讲师·金','#F59E0B','电子','T3认证',31),
  550. ('lec_t4','lecturer','讲师·珊瑚金','#F97316','电子','T4认证',32)
  551. ON DUPLICATE KEY UPDATE name=VALUES(name);
  552. -- 课程模块表(模块化教学:L1/L2 按三本账方向拆模块 + 插班制)
  553. CREATE TABLE IF NOT EXISTS train_module (
  554. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  555. course_id BIGINT NOT NULL COMMENT '所属课程ID(train_course.id)',
  556. track VARCHAR(20) COMMENT '学习路径/轨道:wealth/health/growth(空=通用模块)',
  557. name VARCHAR(100) NOT NULL COMMENT '模块名称(如:L1-A1 财富诊断)',
  558. description VARCHAR(500) COMMENT '模块说明',
  559. price INT DEFAULT 0 COMMENT '模块报名价(分,插班按模块收费;展示除以100)',
  560. sort INT DEFAULT 0 COMMENT '排序(升序)',
  561. enabled TINYINT DEFAULT 1 COMMENT '1=启用,0=禁用',
  562. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  563. updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  564. INDEX idx_course_id (course_id),
  565. INDEX idx_sort (sort)
  566. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='课程模块(模块化教学/插班)';