test-schema.sql 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  1. -- ============================================
  2. -- 测试用建表脚本(每次测试前重建所有表)
  3. -- ============================================
  4. DROP TABLE IF EXISTS t_payment_order;
  5. DROP TABLE IF EXISTS t_payment_plan;
  6. DROP TABLE IF EXISTS t_watchlist;
  7. DROP TABLE IF EXISTS t_search_history;
  8. DROP TABLE IF EXISTS t_operation_audit_log;
  9. DROP TABLE IF EXISTS t_trial_quota_config;
  10. DROP TABLE IF EXISTS t_business_license;
  11. DROP TABLE IF EXISTS t_platform_account;
  12. DROP TABLE IF EXISTS t_platform_config;
  13. DROP TABLE IF EXISTS t_crawler_quota_grant;
  14. DROP TABLE IF EXISTS t_crawler_usage_log;
  15. DROP TABLE IF EXISTS t_invite_relation;
  16. DROP TABLE IF EXISTS t_invite_code;
  17. DROP TABLE IF EXISTS t_invite_config;
  18. DROP TABLE IF EXISTS t_user_coupon;
  19. DROP TABLE IF EXISTS t_coupon;
  20. DROP TABLE IF EXISTS t_membership_benefit;
  21. DROP TABLE IF EXISTS t_user_membership;
  22. DROP TABLE IF EXISTS t_user;
  23. CREATE TABLE IF NOT EXISTS t_user (
  24. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  25. phone VARCHAR(20) DEFAULT NULL,
  26. nickname VARCHAR(64) DEFAULT NULL,
  27. avatar VARCHAR(512) DEFAULT NULL,
  28. password VARCHAR(128) DEFAULT NULL,
  29. wechat_open_id VARCHAR(64) DEFAULT NULL,
  30. wechat_union_id VARCHAR(64) DEFAULT NULL,
  31. wechat_nickname VARCHAR(128) DEFAULT NULL,
  32. pharmacy_name VARCHAR(200) DEFAULT NULL,
  33. province VARCHAR(50) DEFAULT NULL,
  34. city VARCHAR(50) DEFAULT NULL,
  35. district VARCHAR(50) DEFAULT NULL,
  36. status INT NOT NULL DEFAULT 1,
  37. role VARCHAR(20) NOT NULL DEFAULT 'USER',
  38. membership_level VARCHAR(20) DEFAULT NULL,
  39. last_login_time TIMESTAMP DEFAULT NULL,
  40. last_login_ip VARCHAR(45) DEFAULT NULL,
  41. last_login_device VARCHAR(100) DEFAULT NULL,
  42. login_source VARCHAR(20) DEFAULT NULL,
  43. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  44. update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  45. CONSTRAINT uk_phone UNIQUE (phone)
  46. );
  47. CREATE TABLE IF NOT EXISTS t_user_membership (
  48. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  49. user_id BIGINT NOT NULL,
  50. level VARCHAR(20) NOT NULL,
  51. source VARCHAR(20) NOT NULL DEFAULT 'ADMIN_GRANT',
  52. effective_from TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  53. effective_to TIMESTAMP DEFAULT NULL,
  54. status INT NOT NULL DEFAULT 1,
  55. remark VARCHAR(256) DEFAULT NULL,
  56. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  57. update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  58. INDEX idx_user_id (user_id),
  59. INDEX idx_level (level),
  60. INDEX idx_status (status)
  61. );
  62. CREATE TABLE IF NOT EXISTS t_membership_benefit (
  63. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  64. level VARCHAR(20) NOT NULL,
  65. benefit_type VARCHAR(32) NOT NULL,
  66. benefit_value INT NOT NULL DEFAULT 0,
  67. description VARCHAR(256) DEFAULT NULL,
  68. status INT NOT NULL DEFAULT 1,
  69. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  70. update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  71. INDEX idx_level (level),
  72. INDEX idx_status (status)
  73. );
  74. -- 会员权益表唯一索引(允许 INSERT ON DUPLICATE KEY UPDATE)
  75. -- 先清理重复数据,再创建唯一索引
  76. DELETE t1 FROM t_membership_benefit t1 INNER JOIN t_membership_benefit t2 WHERE t1.id > t2.id AND t1.level = t2.level AND t1.benefit_type = t2.benefit_type;
  77. SET @idx_exists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 't_membership_benefit' AND INDEX_NAME = 'uk_level_type');
  78. SET @sql = IF(@idx_exists = 0, 'ALTER TABLE t_membership_benefit ADD UNIQUE INDEX uk_level_type (level, benefit_type)', 'SELECT 1');
  79. PREPARE stmt FROM @sql;
  80. EXECUTE stmt;
  81. DEALLOCATE PREPARE stmt;
  82. CREATE TABLE IF NOT EXISTS t_coupon (
  83. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  84. name VARCHAR(64) NOT NULL,
  85. type VARCHAR(16) NOT NULL,
  86. value INT NOT NULL,
  87. total_count INT NOT NULL DEFAULT (-1),
  88. issued_count INT NOT NULL DEFAULT 0,
  89. valid_type INT NOT NULL DEFAULT 1,
  90. valid_days INT DEFAULT NULL,
  91. valid_start TIMESTAMP DEFAULT NULL,
  92. valid_end TIMESTAMP DEFAULT NULL,
  93. min_level_code VARCHAR(16) DEFAULT NULL,
  94. status INT NOT NULL DEFAULT 1,
  95. description VARCHAR(256) DEFAULT NULL,
  96. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  97. update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  98. );
  99. CREATE TABLE IF NOT EXISTS t_user_coupon (
  100. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  101. user_id BIGINT NOT NULL,
  102. coupon_id BIGINT NOT NULL,
  103. status INT NOT NULL DEFAULT 0,
  104. used_time TIMESTAMP DEFAULT NULL,
  105. expire_time TIMESTAMP NOT NULL,
  106. source VARCHAR(32) NOT NULL DEFAULT 'ISSUE',
  107. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  108. update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  109. );
  110. CREATE TABLE IF NOT EXISTS t_crawler_usage_log (
  111. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  112. user_id BIGINT NOT NULL,
  113. usage_date DATE NOT NULL,
  114. usage_count INT NOT NULL DEFAULT 1,
  115. platform VARCHAR(32) DEFAULT NULL,
  116. source VARCHAR(32) NOT NULL DEFAULT 'QUOTA',
  117. remark VARCHAR(128) DEFAULT NULL,
  118. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  119. INDEX idx_user_date (user_id, usage_date),
  120. INDEX idx_user_id (user_id),
  121. INDEX idx_platform (platform)
  122. );
  123. -- 邀请配置表
  124. CREATE TABLE IF NOT EXISTS t_invite_config (
  125. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  126. reward_crawler_count INT NOT NULL DEFAULT 5,
  127. reward_type VARCHAR(16) NOT NULL DEFAULT 'MEMBERSHIP',
  128. reward_months INT NOT NULL DEFAULT 1,
  129. max_daily_reward INT NOT NULL DEFAULT 50,
  130. invite_code_expire_days INT NOT NULL DEFAULT 30,
  131. max_invite_per_day INT NOT NULL DEFAULT 10,
  132. max_total_invites INT NOT NULL DEFAULT 30,
  133. -- 多渠道配置
  134. app_download_url VARCHAR(512) DEFAULT NULL,
  135. miniapp_path VARCHAR(256) DEFAULT NULL,
  136. miniapp_app_id VARCHAR(64) DEFAULT NULL,
  137. wechat_redirect_url VARCHAR(512) DEFAULT NULL,
  138. dingtalk_app_id VARCHAR(64) DEFAULT NULL,
  139. feishu_app_id VARCHAR(64) DEFAULT NULL,
  140. -- 落地页配置
  141. landing_title VARCHAR(128) DEFAULT '邀请你加入智价云(药店端)',
  142. landing_desc VARCHAR(512) DEFAULT NULL,
  143. app_name VARCHAR(64) DEFAULT '智价云(药店端)',
  144. status INT NOT NULL DEFAULT 1,
  145. remark VARCHAR(256) DEFAULT NULL,
  146. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  147. update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  148. );
  149. -- 兼容升级:为已有表添加缺失列
  150. SET @col_exists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 't_invite_config' AND COLUMN_NAME = 'reward_months');
  151. SET @sql = IF(@col_exists = 0, 'ALTER TABLE t_invite_config ADD COLUMN reward_months INT NOT NULL DEFAULT 1 AFTER reward_type', 'SELECT 1');
  152. PREPARE stmt FROM @sql;
  153. EXECUTE stmt;
  154. DEALLOCATE PREPARE stmt;
  155. SET @col_exists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 't_invite_config' AND COLUMN_NAME = 'max_total_invites');
  156. SET @sql = IF(@col_exists = 0, 'ALTER TABLE t_invite_config ADD COLUMN max_total_invites INT NOT NULL DEFAULT 30 AFTER max_invite_per_day', 'SELECT 1');
  157. PREPARE stmt FROM @sql;
  158. EXECUTE stmt;
  159. DEALLOCATE PREPARE stmt;
  160. -- 邀请码表
  161. CREATE TABLE IF NOT EXISTS t_invite_code (
  162. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  163. user_id BIGINT NOT NULL,
  164. code VARCHAR(16) NOT NULL,
  165. max_uses INT NOT NULL DEFAULT (-1),
  166. used_count INT NOT NULL DEFAULT 0,
  167. click_count INT NOT NULL DEFAULT 0,
  168. expire_time TIMESTAMP DEFAULT NULL,
  169. status INT NOT NULL DEFAULT 1,
  170. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  171. update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  172. CONSTRAINT uk_code UNIQUE (code),
  173. INDEX idx_user_id (user_id)
  174. );
  175. -- 邀请关系表
  176. CREATE TABLE IF NOT EXISTS t_invite_relation (
  177. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  178. inviter_id BIGINT NOT NULL,
  179. invitee_id BIGINT NOT NULL,
  180. invite_code_id BIGINT NOT NULL,
  181. registered INT NOT NULL DEFAULT 0,
  182. reward_granted INT NOT NULL DEFAULT 0,
  183. status INT NOT NULL DEFAULT 1,
  184. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  185. update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  186. CONSTRAINT uk_invitee UNIQUE (invitee_id)
  187. );
  188. -- 爬虫额外配额发放表(邀请奖励 + 运营手动发放 + 购买会员奖励)
  189. CREATE TABLE IF NOT EXISTS t_crawler_quota_grant (
  190. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  191. user_id BIGINT NOT NULL,
  192. grant_type VARCHAR(16) NOT NULL,
  193. quota_count INT NOT NULL,
  194. used_count INT NOT NULL DEFAULT 0,
  195. expire_time TIMESTAMP DEFAULT NULL,
  196. source_user_id BIGINT DEFAULT NULL,
  197. remark VARCHAR(256) DEFAULT NULL,
  198. status INT NOT NULL DEFAULT 1,
  199. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  200. update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  201. INDEX idx_user_id (user_id),
  202. INDEX idx_grant_type (grant_type)
  203. );
  204. -- 平台账号表
  205. CREATE TABLE IF NOT EXISTS t_platform_account (
  206. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  207. user_id BIGINT NOT NULL,
  208. platform_code VARCHAR(50) NOT NULL,
  209. platform_name VARCHAR(100) NOT NULL,
  210. account_encrypted VARCHAR(512) NOT NULL,
  211. password_encrypted VARCHAR(512) NOT NULL,
  212. enabled TINYINT(1) NOT NULL DEFAULT 1,
  213. verify_status VARCHAR(16) NOT NULL DEFAULT 'PENDING',
  214. last_verify_time TIMESTAMP DEFAULT NULL,
  215. fail_reason VARCHAR(256) DEFAULT NULL,
  216. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  217. update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  218. INDEX idx_user_id (user_id),
  219. CONSTRAINT uk_user_platform UNIQUE (user_id, platform_code)
  220. );
  221. -- 平台配置表
  222. CREATE TABLE IF NOT EXISTS t_platform_config (
  223. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  224. platform_code VARCHAR(50) NOT NULL,
  225. platform_name VARCHAR(100) NOT NULL,
  226. enabled TINYINT(1) NOT NULL DEFAULT 1,
  227. requires_recharge TINYINT(1) NOT NULL DEFAULT 0,
  228. query_cost INT NOT NULL DEFAULT 1,
  229. priority INT NOT NULL DEFAULT 0,
  230. under_maintenance TINYINT(1) NOT NULL DEFAULT 0,
  231. maintenance_notice VARCHAR(500) DEFAULT NULL,
  232. description VARCHAR(500) DEFAULT NULL,
  233. official_url VARCHAR(500) DEFAULT NULL,
  234. binding_instructions TEXT DEFAULT NULL,
  235. sort_order INT DEFAULT 0,
  236. created_by BIGINT DEFAULT NULL,
  237. updated_by BIGINT DEFAULT NULL,
  238. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  239. update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  240. CONSTRAINT uk_platform_code UNIQUE (platform_code),
  241. INDEX idx_enabled (enabled)
  242. );
  243. -- 初始化平台配置数据
  244. INSERT IGNORE INTO t_platform_config (platform_code, platform_name, enabled, query_cost, priority, binding_instructions, description, official_url, sort_order)
  245. VALUES
  246. ('yaoshibang', '药师帮', 1, 1, 1, '请输入您在药师帮的手机号和密码', '国内最大B2B医药批发平台', 'https://www.yaoshibang.com', 1),
  247. ('yaobangmang', '药帮忙', 1, 1, 2, '请输入您在药帮忙的手机号和密码', '专业医药B2B采购平台', 'https://www.yaobangmang.com', 2),
  248. ('yiyaocheng', '1药城', 1, 1, 3, '请输入您在1药城的手机号和密码', '1药网旗下B2B医药平台', 'https://www.1yaocheng.com', 3);
  249. -- 初始化测试用户(id=1,普通会员 PLUS)
  250. INSERT IGNORE INTO t_user (id, phone, nickname, status, membership_level)
  251. VALUES
  252. (1, '13800138000', '测试用户', 1, 'PLUS')
  253. ON DUPLICATE KEY UPDATE
  254. phone = VALUES(phone),
  255. nickname = VALUES(nickname),
  256. status = VALUES(status),
  257. membership_level = VALUES(membership_level);
  258. -- 搜索测试用户(id=2,高级会员 PRO,日配额20,避免配额耗尽影响其他测试)
  259. INSERT IGNORE INTO t_user (id, phone, nickname, status, membership_level)
  260. VALUES
  261. (2, '13900139000', '搜索测试', 1, 'PRO')
  262. ON DUPLICATE KEY UPDATE
  263. phone = VALUES(phone),
  264. nickname = VALUES(nickname),
  265. status = VALUES(status),
  266. membership_level = VALUES(membership_level);
  267. -- 初始化管理员账号(用于运营后台接口测试)
  268. INSERT IGNORE INTO t_user (id, phone, nickname, status, role, membership_level)
  269. VALUES
  270. (100, '13900000000', '测试管理员', 1, 'ADMIN', 'PLUS')
  271. ON DUPLICATE KEY UPDATE
  272. phone = VALUES(phone),
  273. nickname = VALUES(nickname),
  274. status = VALUES(status),
  275. role = VALUES(role),
  276. membership_level = VALUES(membership_level);
  277. -- 初始化邀请配置
  278. INSERT IGNORE INTO t_invite_config (id, reward_type, reward_months, reward_crawler_count, max_daily_reward, invite_code_expire_days, max_invite_per_day, max_total_invites, landing_title, landing_desc, app_name, status)
  279. VALUES
  280. (1, 'MEMBERSHIP', 1, 5, 50, 30, 10, 30, '邀请你加入智价云(药店端)', '登录智价云(药店端)平台,邀请好友各得好礼', '智价云(药店端)', 1)
  281. ON DUPLICATE KEY UPDATE
  282. reward_type = VALUES(reward_type),
  283. reward_months = VALUES(reward_months),
  284. reward_crawler_count = VALUES(reward_crawler_count),
  285. max_daily_reward = VALUES(max_daily_reward),
  286. invite_code_expire_days = VALUES(invite_code_expire_days),
  287. max_invite_per_day = VALUES(max_invite_per_day),
  288. max_total_invites = VALUES(max_total_invites),
  289. landing_title = VALUES(landing_title),
  290. landing_desc = VALUES(landing_desc),
  291. app_name = VALUES(app_name),
  292. status = VALUES(status);
  293. -- 营业执照表
  294. CREATE TABLE IF NOT EXISTS t_business_license (
  295. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  296. user_id BIGINT NOT NULL,
  297. license_image_url VARCHAR(500) DEFAULT NULL,
  298. credit_code VARCHAR(50) DEFAULT NULL,
  299. pharmacy_name VARCHAR(200) DEFAULT NULL,
  300. legal_person VARCHAR(50) DEFAULT NULL,
  301. registered_address VARCHAR(500) DEFAULT NULL,
  302. business_scope TEXT DEFAULT NULL,
  303. valid_from TIMESTAMP DEFAULT NULL,
  304. valid_to TIMESTAMP DEFAULT NULL,
  305. remark VARCHAR(500) DEFAULT NULL,
  306. review_status VARCHAR(20) NOT NULL DEFAULT 'PENDING',
  307. reviewer_id BIGINT DEFAULT NULL,
  308. review_time TIMESTAMP DEFAULT NULL,
  309. reject_reason VARCHAR(500) DEFAULT NULL,
  310. show_verified_badge TINYINT(1) NOT NULL DEFAULT 0,
  311. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  312. update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  313. INDEX idx_user_id (user_id),
  314. CONSTRAINT uk_user_id UNIQUE (user_id)
  315. );
  316. -- 操作审计日志表
  317. CREATE TABLE IF NOT EXISTS t_operation_audit_log (
  318. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  319. operator_id BIGINT DEFAULT NULL,
  320. operator_name VARCHAR(64) DEFAULT NULL,
  321. operator_role VARCHAR(32) DEFAULT NULL,
  322. operation_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  323. ip_address VARCHAR(45) DEFAULT NULL,
  324. user_agent VARCHAR(512) DEFAULT NULL,
  325. module VARCHAR(32) DEFAULT NULL,
  326. operation_type VARCHAR(64) DEFAULT NULL,
  327. description VARCHAR(256) DEFAULT NULL,
  328. target_type VARCHAR(32) DEFAULT NULL,
  329. target_id BIGINT DEFAULT NULL,
  330. target_identifier VARCHAR(128) DEFAULT NULL,
  331. before_data TEXT DEFAULT NULL,
  332. after_data TEXT DEFAULT NULL,
  333. result VARCHAR(16) NOT NULL DEFAULT 'SUCCESS',
  334. error_message VARCHAR(512) DEFAULT NULL,
  335. request_url VARCHAR(512) DEFAULT NULL,
  336. request_method VARCHAR(8) DEFAULT NULL,
  337. request_params TEXT DEFAULT NULL,
  338. response_code INT DEFAULT NULL,
  339. duration BIGINT DEFAULT NULL,
  340. remark VARCHAR(256) DEFAULT NULL,
  341. is_sensitive TINYINT(1) NOT NULL DEFAULT 0,
  342. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  343. INDEX idx_operator_id (operator_id),
  344. INDEX idx_operation_time (operation_time)
  345. );
  346. -- 体验配额配置表
  347. CREATE TABLE IF NOT EXISTS t_trial_quota_config (
  348. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  349. config_name VARCHAR(64) NOT NULL,
  350. trial_days INT NOT NULL DEFAULT 15,
  351. daily_query_limit INT NOT NULL DEFAULT 20,
  352. monthly_watchlist_limit INT NOT NULL DEFAULT 199,
  353. enabled TINYINT(1) NOT NULL DEFAULT 1,
  354. config_type VARCHAR(16) NOT NULL DEFAULT 'DEFAULT',
  355. applicable_user_type VARCHAR(16) NOT NULL DEFAULT 'NEW_USER',
  356. effective_from TIMESTAMP DEFAULT NULL,
  357. effective_to TIMESTAMP DEFAULT NULL,
  358. max_users INT DEFAULT NULL,
  359. current_users INT NOT NULL DEFAULT 0,
  360. description VARCHAR(256) DEFAULT NULL,
  361. remark VARCHAR(256) DEFAULT NULL,
  362. created_by BIGINT DEFAULT NULL,
  363. updated_by BIGINT DEFAULT NULL,
  364. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  365. update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  366. );
  367. -- 初始化会员权益配置
  368. INSERT IGNORE INTO t_membership_benefit (level, benefit_type, benefit_value, description, status)
  369. VALUES
  370. ('PLUS', 'DAILY_QUOTA', 10, '普通会员:每日有效查询10次', 1),
  371. ('PLUS', 'MONTHLY_QUOTA', 300, '普通会员:每月查询300次', 1),
  372. ('PLUS', 'YEARLY_QUOTA', 3650, '普通会员:每年查询3650次(10*365)', 1),
  373. ('PRO', 'DAILY_QUOTA', 999, '高级会员:每日不限量', 1),
  374. ('PRO', 'MONTHLY_QUOTA', 29970, '高级会员:每月查询29970次(999*30)', 1),
  375. ('PRO', 'YEARLY_QUOTA', 364635, '高级会员:每年查询364635次(999*365)', 1),
  376. ('PRO', 'MAX_CONCURRENT', 5, '高级会员最大并发数', 1),
  377. ('ULTRA', 'DAILY_QUOTA', 999, '超级会员:每日不限量', 1),
  378. ('ULTRA', 'MONTHLY_QUOTA', 29970, '超级会员:每月查询29970次(999*30)', 1),
  379. ('ULTRA', 'YEARLY_QUOTA', 364635, '超级会员:每年查询364635次(999*365)', 1),
  380. ('ULTRA', 'MAX_CONCURRENT', 10, '超级会员最大并发数', 1);
  381. -- 搜索历史表
  382. CREATE TABLE IF NOT EXISTS t_search_history (
  383. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  384. user_id BIGINT NOT NULL,
  385. keyword VARCHAR(200) NOT NULL,
  386. platform VARCHAR(32) DEFAULT NULL,
  387. result_count INT DEFAULT 0,
  388. search_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  389. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  390. INDEX idx_user_id (user_id),
  391. INDEX idx_user_time (user_id, search_time)
  392. );
  393. -- 关注/收藏表
  394. CREATE TABLE IF NOT EXISTS t_watchlist (
  395. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  396. user_id BIGINT NOT NULL,
  397. drug_name VARCHAR(200) NOT NULL,
  398. spec VARCHAR(100) DEFAULT NULL,
  399. manufacturer VARCHAR(200) DEFAULT NULL,
  400. min_price DECIMAL(10,2) DEFAULT NULL,
  401. min_price_platform VARCHAR(32) DEFAULT NULL,
  402. last_price DECIMAL(10,2) DEFAULT NULL,
  403. price_change DECIMAL(10,2) DEFAULT NULL,
  404. last_check_time TIMESTAMP DEFAULT NULL,
  405. status INT NOT NULL DEFAULT 1,
  406. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  407. update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  408. INDEX idx_user_id (user_id)
  409. );
  410. -- 支付方案表
  411. CREATE TABLE IF NOT EXISTS t_payment_plan (
  412. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  413. plan_name VARCHAR(64) NOT NULL,
  414. plan_code VARCHAR(20) NOT NULL,
  415. membership_level VARCHAR(20) NOT NULL,
  416. price DECIMAL(10,2) NOT NULL,
  417. original_price DECIMAL(10,2) DEFAULT NULL,
  418. duration_days INT NOT NULL,
  419. sort_order INT DEFAULT 0,
  420. status INT NOT NULL DEFAULT 1,
  421. description VARCHAR(256) DEFAULT NULL,
  422. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  423. update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  424. CONSTRAINT uk_plan_code UNIQUE (plan_code),
  425. INDEX idx_status (status)
  426. );
  427. -- 支付订单表
  428. CREATE TABLE IF NOT EXISTS t_payment_order (
  429. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  430. order_no VARCHAR(32) NOT NULL,
  431. user_id BIGINT NOT NULL,
  432. plan_id BIGINT NOT NULL,
  433. amount DECIMAL(10,2) NOT NULL,
  434. channel VARCHAR(20) NOT NULL,
  435. status VARCHAR(20) NOT NULL DEFAULT 'PENDING',
  436. qr_code_url VARCHAR(512) DEFAULT NULL,
  437. paid_channel VARCHAR(20) DEFAULT NULL,
  438. trade_no VARCHAR(64) DEFAULT NULL,
  439. paid_time TIMESTAMP DEFAULT NULL,
  440. expire_time TIMESTAMP NOT NULL,
  441. refund_time TIMESTAMP DEFAULT NULL,
  442. refund_amount DECIMAL(10,2) DEFAULT NULL,
  443. membership_record_id BIGINT DEFAULT NULL,
  444. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  445. update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  446. CONSTRAINT uk_order_no UNIQUE (order_no),
  447. INDEX idx_user_id (user_id),
  448. INDEX idx_status (status),
  449. INDEX idx_expire_time (expire_time)
  450. );
  451. -- 支付订单重复支付记录表
  452. CREATE TABLE IF NOT EXISTS t_payment_order_extra_payment (
  453. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  454. order_no VARCHAR(32) NOT NULL,
  455. channel VARCHAR(20) NOT NULL,
  456. trade_no VARCHAR(64) NOT NULL,
  457. amount DECIMAL(10,2) NOT NULL,
  458. paid_time TIMESTAMP NOT NULL,
  459. refund_status VARCHAR(20) DEFAULT 'PENDING',
  460. refund_trade_no VARCHAR(64) DEFAULT NULL,
  461. refund_time TIMESTAMP DEFAULT NULL,
  462. refund_fail_reason VARCHAR(500) DEFAULT NULL,
  463. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  464. update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  465. INDEX idx_order_no (order_no)
  466. );
  467. -- 初始化支付方案(含原价)
  468. INSERT IGNORE INTO t_payment_plan (plan_code, plan_name, membership_level, price, original_price, duration_days, sort_order, status, description) VALUES
  469. ('MONTHLY_PLUS', '普通会员·月卡', 'PLUS', 9.90, 19.90, 30, 1, 1, '每天有效查询10次 · 1个月9.9(原价19.9)'),
  470. ('YEARLY_PLUS', '普通会员·年卡', 'PLUS', 99.00, 199.90, 365, 2, 1, '每天有效查询10次 · 1年99(原价199.9)'),
  471. ('MONTHLY_PRO', '高级会员·月卡', 'PRO', 29.90, 59.90, 30, 3, 1, '每天不限量· 1个月29.9(原价59.9)'),
  472. ('YEARLY_PRO', '高级会员·年卡', 'PRO', 299.90,599.90, 365, 4, 1, '每天不限量· 1年299.9(原价599.9)'),
  473. ('ULTRA', '超级会员·连锁专享','ULTRA',0, NULL, 0, 5, 0, '连锁专用,多店铺管理,敬请期待');