schema.sql 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683
  1. -- ============================================
  2. -- 智价云(药店版)系统 - 数据库初始化脚本
  3. -- ============================================
  4. -- 设置 SQL Mode 以兼容 DATETIME DEFAULT NULL
  5. SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
  6. -- 创建数据库(如果不存在)
  7. CREATE DATABASE IF NOT EXISTS `zhijiayun_pharmacy`
  8. DEFAULT CHARACTER SET utf8mb4
  9. DEFAULT COLLATE utf8mb4_unicode_ci;
  10. USE `zhijiayun_pharmacy`;
  11. -- ============================================
  12. -- 开发阶段注意:生产环境禁止 DROP TABLE,使用 migration-v*.sql 增量迁移
  13. -- 开发环境如需重建表,手动执行 DROP TABLE 后再运行本脚本
  14. -- ============================================
  15. -- 用户表
  16. CREATE TABLE IF NOT EXISTS `t_user` (
  17. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  18. `phone` VARCHAR(20) DEFAULT NULL COMMENT '手机号',
  19. `nickname` VARCHAR(64) DEFAULT NULL COMMENT '昵称',
  20. `avatar` VARCHAR(512) DEFAULT NULL COMMENT '头像URL',
  21. `password` VARCHAR(128) DEFAULT NULL COMMENT '密码(加密存储)',
  22. `wechat_open_id` VARCHAR(64) DEFAULT NULL COMMENT '微信OpenID',
  23. `wechat_union_id` VARCHAR(64) DEFAULT NULL COMMENT '微信UnionID',
  24. `wechat_nickname` VARCHAR(128) DEFAULT NULL COMMENT '微信昵称',
  25. `pharmacy_name` VARCHAR(200) DEFAULT NULL COMMENT '药店名称',
  26. `province` VARCHAR(50) DEFAULT NULL COMMENT '省',
  27. `city` VARCHAR(50) DEFAULT NULL COMMENT '市',
  28. `district` VARCHAR(50) DEFAULT NULL COMMENT '区',
  29. `status` INT NOT NULL DEFAULT 1 COMMENT '账号状态:0-禁用 1-正常',
  30. `role` VARCHAR(20) NOT NULL DEFAULT 'USER' COMMENT '用户角色(管理员角色已迁至 t_admin)',
  31. `membership_level` VARCHAR(20) DEFAULT NULL COMMENT '当前会员等级:PLUS/PRO/ULTRA',
  32. `last_login_time` DATETIME DEFAULT NULL COMMENT '最后登录时间',
  33. `last_login_ip` VARCHAR(45) DEFAULT NULL COMMENT '最后登录IP',
  34. `last_login_device` VARCHAR(100) DEFAULT NULL COMMENT '最后登录设备信息',
  35. `login_source` VARCHAR(20) DEFAULT NULL COMMENT '登录来源:WINDOWS/MINIAPP/ANDROID/IOS/WECHAT',
  36. `token_version` BIGINT DEFAULT 0 COMMENT 'Token版本号(单设备登录控制)',
  37. `refresh_token_hash` VARCHAR(64) DEFAULT NULL COMMENT 'Refresh Token SHA-256哈希',
  38. `refresh_token_status` VARCHAR(10) DEFAULT NULL COMMENT 'Refresh Token状态:ACTIVE/USED',
  39. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  40. `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  41. PRIMARY KEY (`id`),
  42. UNIQUE KEY `uk_phone` (`phone`),
  43. KEY `idx_openid` (`wechat_open_id`),
  44. KEY `idx_unionid` (`wechat_union_id`)
  45. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
  46. -- 管理员表
  47. CREATE TABLE IF NOT EXISTS `t_admin` (
  48. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  49. `username` VARCHAR(64) NOT NULL COMMENT '用户名',
  50. `password` VARCHAR(128) NOT NULL COMMENT '密码(BCrypt加密)',
  51. `phone` VARCHAR(20) DEFAULT NULL COMMENT '手机号',
  52. `role` VARCHAR(20) NOT NULL DEFAULT 'ADMIN' COMMENT '角色:ADMIN/SUPER_ADMIN',
  53. `status` INT NOT NULL DEFAULT 1 COMMENT '状态:0-禁用 1-正常',
  54. `token_version` BIGINT DEFAULT 0 COMMENT 'Token版本号',
  55. `refresh_token_hash` VARCHAR(64) DEFAULT NULL COMMENT 'Refresh Token SHA-256哈希',
  56. `refresh_token_status` VARCHAR(10) DEFAULT NULL COMMENT 'Refresh Token状态:ACTIVE/USED',
  57. `last_login_time` DATETIME DEFAULT NULL COMMENT '最后登录时间',
  58. `last_login_ip` VARCHAR(45) DEFAULT NULL COMMENT '最后登录IP',
  59. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  60. `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  61. PRIMARY KEY (`id`),
  62. UNIQUE KEY `uk_username` (`username`),
  63. UNIQUE KEY `uk_phone` (`phone`)
  64. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='管理员表';
  65. -- 用户会员记录表
  66. CREATE TABLE IF NOT EXISTS `t_user_membership` (
  67. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  68. `user_id` BIGINT NOT NULL COMMENT '用户ID',
  69. `level` VARCHAR(20) NOT NULL COMMENT '会员等级:PLUS/PRO/ULTRA',
  70. `source` VARCHAR(20) NOT NULL DEFAULT 'SYSTEM' COMMENT '来源:SYSTEM-系统默认 RECHARGE-充值购买 INVITE-邀请奖励 ADMIN_GRANT-运营发放 LICENSE-入驻信息',
  71. `effective_from` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '生效开始时间',
  72. `effective_to` DATETIME DEFAULT NULL COMMENT '生效结束时间(NULL表示永久)',
  73. `status` INT NOT NULL DEFAULT 1 COMMENT '状态:1-有效 0-过期/停用',
  74. `remark` VARCHAR(256) DEFAULT NULL COMMENT '备注',
  75. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  76. `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  77. PRIMARY KEY (`id`),
  78. KEY `idx_user_id` (`user_id`),
  79. KEY `idx_level` (`level`),
  80. KEY `idx_status` (`status`)
  81. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户会员记录表';
  82. -- 会员权益配置表
  83. CREATE TABLE IF NOT EXISTS `t_membership_benefit` (
  84. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  85. `level` VARCHAR(20) NOT NULL COMMENT '会员等级:PLUS/PRO/ULTRA',
  86. `benefit_type` VARCHAR(32) NOT NULL COMMENT '权益类型:DAILY_QUOTA-每日加成 MONTHLY_QUOTA-每月加成 YEARLY_QUOTA-每年加成 MAX_CONCURRENT-并发加成',
  87. `benefit_value` INT NOT NULL DEFAULT 0 COMMENT '权益数值',
  88. `description` VARCHAR(256) DEFAULT NULL COMMENT '权益说明',
  89. `status` INT NOT NULL DEFAULT 1 COMMENT '状态:0-禁用 1-启用',
  90. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  91. `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  92. PRIMARY KEY (`id`),
  93. UNIQUE KEY `uk_level_type` (`level`, `benefit_type`),
  94. KEY `idx_level` (`level`),
  95. KEY `idx_status` (`status`)
  96. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='会员权益配置表';
  97. -- 优惠券模板表
  98. CREATE TABLE IF NOT EXISTS `t_coupon` (
  99. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  100. `name` VARCHAR(64) NOT NULL COMMENT '优惠券名称',
  101. `type` VARCHAR(16) NOT NULL COMMENT '类型:CRAWLER-爬虫次数券',
  102. `value` INT NOT NULL COMMENT '券面值(如:爬虫次数+10)',
  103. `total_count` INT NOT NULL DEFAULT -1 COMMENT '发行总量(-1表示不限量)',
  104. `issued_count` INT NOT NULL DEFAULT 0 COMMENT '已发放数量',
  105. `valid_type` INT NOT NULL DEFAULT 1 COMMENT '有效期类型:1-固定天数 2-固定日期',
  106. `valid_days` INT DEFAULT NULL COMMENT '领取后有效天数',
  107. `valid_start` DATETIME DEFAULT NULL COMMENT '固定有效期-开始时间',
  108. `valid_end` DATETIME DEFAULT NULL COMMENT '固定有效期-结束时间',
  109. `min_level_code` VARCHAR(16) DEFAULT NULL COMMENT '最低等级要求(NULL表示不限)',
  110. `status` INT NOT NULL DEFAULT 1 COMMENT '状态:0-下架 1-上架',
  111. `description` VARCHAR(256) DEFAULT NULL COMMENT '使用说明',
  112. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  113. `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  114. PRIMARY KEY (`id`),
  115. KEY `idx_type` (`type`),
  116. KEY `idx_status` (`status`)
  117. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='优惠券模板表';
  118. -- 用户优惠券表
  119. CREATE TABLE IF NOT EXISTS `t_user_coupon` (
  120. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  121. `user_id` BIGINT NOT NULL COMMENT '用户ID',
  122. `coupon_id` BIGINT NOT NULL COMMENT '优惠券模板ID',
  123. `status` INT NOT NULL DEFAULT 0 COMMENT '状态:0-未使用 1-已使用 2-已过期',
  124. `used_time` DATETIME DEFAULT NULL COMMENT '使用时间',
  125. `expire_time` DATETIME NOT NULL COMMENT '过期时间',
  126. `source` VARCHAR(32) NOT NULL DEFAULT 'ISSUE' COMMENT '来源:ISSUE-发放 ACTIVATE-激活码',
  127. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  128. `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  129. PRIMARY KEY (`id`),
  130. KEY `idx_user_id` (`user_id`),
  131. KEY `idx_coupon_id` (`coupon_id`),
  132. KEY `idx_status` (`status`),
  133. KEY `idx_expire_time` (`expire_time`)
  134. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户优惠券表';
  135. -- 爬虫使用记录表
  136. CREATE TABLE IF NOT EXISTS `t_crawler_usage_log` (
  137. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  138. `user_id` BIGINT NOT NULL COMMENT '用户ID',
  139. `usage_date` DATE NOT NULL COMMENT '使用日期',
  140. `usage_count` INT NOT NULL DEFAULT 1 COMMENT '本次使用次数',
  141. `platform` VARCHAR(32) DEFAULT NULL COMMENT '平台代码(如:yaoshibang、yaobangmang)',
  142. `source` VARCHAR(32) NOT NULL DEFAULT 'QUOTA' COMMENT '消耗来源:QUOTA-配额 COUPON-优惠券',
  143. `remark` VARCHAR(128) DEFAULT NULL COMMENT '备注',
  144. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  145. PRIMARY KEY (`id`),
  146. KEY `idx_user_date` (`user_id`, `usage_date`),
  147. KEY `idx_user_id` (`user_id`),
  148. KEY `idx_platform` (`platform`)
  149. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='爬虫使用记录表';
  150. -- ============================================
  151. -- 初始化默认等级数据
  152. -- ============================================
  153. -- 邀请配置表(运营配置邀请奖励)
  154. CREATE TABLE IF NOT EXISTS `t_invite_config` (
  155. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  156. `reward_crawler_count` INT NOT NULL DEFAULT 5 COMMENT '每次邀请奖励爬虫次数(历史字段,已废弃)',
  157. `reward_type` VARCHAR(16) NOT NULL DEFAULT 'MEMBERSHIP' COMMENT '奖励类型:MEMBERSHIP-赠送会员时长 CRAWLER-爬虫次数(历史)',
  158. `reward_months` INT NOT NULL DEFAULT 1 COMMENT '邀请人奖励会员时长(月)',
  159. `max_daily_reward` INT NOT NULL DEFAULT 50 COMMENT '每日最大奖励次数上限',
  160. `invite_code_expire_days` INT NOT NULL DEFAULT 30 COMMENT '邀请码有效天数',
  161. `max_invite_per_day` INT NOT NULL DEFAULT 10 COMMENT '每人每天最大邀请次数',
  162. `max_total_invites` INT NOT NULL DEFAULT 30 COMMENT '单个账号总邀请上限',
  163. -- 多渠道配置
  164. `app_download_url` VARCHAR(512) DEFAULT NULL COMMENT 'Windows客户端下载地址',
  165. `miniapp_path` VARCHAR(256) DEFAULT NULL COMMENT '小程序页面路径(如 /pages/download/index)',
  166. `miniapp_app_id` VARCHAR(64) DEFAULT NULL COMMENT '小程序AppID',
  167. `wechat_redirect_url` VARCHAR(512) DEFAULT NULL COMMENT '微信公众号引导跳转URL',
  168. `dingtalk_app_id` VARCHAR(64) DEFAULT NULL COMMENT '钉钉应用ID',
  169. `feishu_app_id` VARCHAR(64) DEFAULT NULL COMMENT '飞书应用ID',
  170. -- 落地页配置
  171. `landing_title` VARCHAR(128) DEFAULT '邀请你加入智价云(药店版)' COMMENT '落地页标题',
  172. `landing_desc` VARCHAR(512) DEFAULT NULL COMMENT '落地页描述',
  173. `app_name` VARCHAR(64) DEFAULT '智价云(药店版)' COMMENT '应用名称',
  174. `status` INT NOT NULL DEFAULT 1 COMMENT '状态:0-停用 1-启用',
  175. -- 文案模板配置
  176. `share_title_template` VARCHAR(256) DEFAULT '{inviter} 邀请你加入{appName}' COMMENT '分享标题模板(占位符:{inviter}、{appName})',
  177. `copy_text_template` TEXT DEFAULT NULL COMMENT '一键复制文案模板(占位符:{inviter}、{appName}、{inviteLink}、{code})',
  178. `reward_description` VARCHAR(256) DEFAULT '邀请人每成功邀请1家药店注册,赠送1个月高级会员时长' COMMENT '奖励说明文案(占位符:{rewardMonths})',
  179. `summary_text_template` VARCHAR(256) DEFAULT '已邀请{totalInvited}家药店,{registeredCount}家注册,累计获得{totalReward}个月高级会员' COMMENT '邀请统计摘要模板(占位符:{totalInvited}、{registeredCount}、{totalReward})',
  180. -- 各渠道操作提示
  181. `instruction_windows` VARCHAR(256) DEFAULT NULL COMMENT 'Windows渠道提示文案(占位符:{code})',
  182. `instruction_app` VARCHAR(256) DEFAULT NULL COMMENT 'App渠道提示文案(占位符:{code})',
  183. `instruction_miniapp` VARCHAR(256) DEFAULT NULL COMMENT '小程序渠道提示文案(占位符:{code})',
  184. `instruction_wechat` VARCHAR(256) DEFAULT NULL COMMENT '微信公众号渠道提示文案(占位符:{code})',
  185. `instruction_dingtalk` VARCHAR(256) DEFAULT NULL COMMENT '钉钉渠道提示文案(占位符:{code}、{appName})',
  186. `instruction_feishu` VARCHAR(256) DEFAULT NULL COMMENT '飞书渠道提示文案(占位符:{code}、{appName})',
  187. `instruction_default` VARCHAR(256) DEFAULT NULL COMMENT '默认/未知渠道提示文案(占位符:{code})',
  188. `remark` VARCHAR(256) DEFAULT NULL COMMENT '备注',
  189. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  190. `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  191. PRIMARY KEY (`id`)
  192. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='邀请奖励配置表';
  193. -- 邀请码表
  194. CREATE TABLE IF NOT EXISTS `t_invite_code` (
  195. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  196. `user_id` BIGINT NOT NULL COMMENT '所属用户ID',
  197. `code` VARCHAR(16) NOT NULL COMMENT '邀请码(唯一)',
  198. `max_uses` INT NOT NULL DEFAULT -1 COMMENT '最大使用次数(-1不限制)',
  199. `used_count` INT NOT NULL DEFAULT 0 COMMENT '已使用次数(注册)',
  200. `click_count` INT NOT NULL DEFAULT 0 COMMENT '链接被打开次数',
  201. `expire_time` DATETIME DEFAULT NULL COMMENT '过期时间',
  202. `status` INT NOT NULL DEFAULT 1 COMMENT '状态:0-禁用 1-有效',
  203. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  204. `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  205. PRIMARY KEY (`id`),
  206. UNIQUE KEY `uk_code` (`code`),
  207. KEY `idx_user_id` (`user_id`)
  208. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='邀请码表';
  209. -- 邀请关系表
  210. CREATE TABLE IF NOT EXISTS `t_invite_relation` (
  211. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  212. `inviter_id` BIGINT NOT NULL COMMENT '邀请人ID',
  213. `invitee_id` BIGINT NOT NULL COMMENT '被邀请人ID',
  214. `invite_code_id` BIGINT NOT NULL COMMENT '使用的邀请码ID',
  215. `registered` TINYINT NOT NULL DEFAULT 0 COMMENT '是否已注册:0-仅点击 1-已注册',
  216. `reward_granted` INT NOT NULL DEFAULT 0 COMMENT '已发放奖励次数',
  217. `status` INT NOT NULL DEFAULT 1 COMMENT '状态:1-有效',
  218. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  219. `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  220. PRIMARY KEY (`id`),
  221. UNIQUE KEY `uk_invitee` (`invitee_id`),
  222. KEY `idx_inviter` (`inviter_id`)
  223. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='邀请关系表';
  224. -- 爬虫额外配额发放表(邀请奖励 + 运营手动发放 + 购买会员奖励)
  225. CREATE TABLE IF NOT EXISTS `t_crawler_quota_grant` (
  226. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  227. `user_id` BIGINT NOT NULL COMMENT '目标用户ID',
  228. `grant_type` VARCHAR(16) NOT NULL COMMENT '发放类型:INVITE-邀请奖励 ADMIN-运营手动发放 PURCHASE-购买会员奖励',
  229. `quota_count` INT NOT NULL COMMENT '发放爬虫次数',
  230. `used_count` INT NOT NULL DEFAULT 0 COMMENT '已使用次数',
  231. `expire_time` DATETIME DEFAULT NULL COMMENT '过期时间(NULL永不过期)',
  232. `source_user_id` BIGINT DEFAULT NULL COMMENT '来源用户ID(邀请奖励时记录被邀请人)',
  233. `remark` VARCHAR(256) DEFAULT NULL COMMENT '备注',
  234. `status` INT NOT NULL DEFAULT 1 COMMENT '状态:1-有效 2-已用完 3-已过期',
  235. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  236. `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  237. PRIMARY KEY (`id`),
  238. KEY `idx_user_id` (`user_id`),
  239. KEY `idx_grant_type` (`grant_type`)
  240. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='爬虫额外配额发放表';
  241. INSERT INTO `t_membership_benefit` (`level`, `benefit_type`, `benefit_value`, `description`)
  242. VALUES
  243. ('PLUS', 'DAILY_QUOTA', 10, '普通会员:每日有效查询10次'),
  244. ('PLUS', 'MONTHLY_QUOTA', 300, '普通会员:每月查询300次'),
  245. ('PLUS', 'YEARLY_QUOTA', 3650, '普通会员:每年查询3650次(10*365)'),
  246. ('PRO', 'DAILY_QUOTA', 999, '高级会员:每日不限量'),
  247. ('PRO', 'MONTHLY_QUOTA', 29970, '高级会员:每月查询29970次(999*30)'),
  248. ('PRO', 'YEARLY_QUOTA', 364635, '高级会员:每年查询364635次(999*365)'),
  249. ('PRO', 'MAX_CONCURRENT', 5, '高级会员最大并发数'),
  250. ('ULTRA', 'DAILY_QUOTA', 999, '超级会员:每日不限量'),
  251. ('ULTRA', 'MONTHLY_QUOTA', 29970, '超级会员:每月查询29970次(999*30)'),
  252. ('ULTRA', 'YEARLY_QUOTA', 364635, '超级会员:每年查询364635次(999*365)'),
  253. ('ULTRA', 'MAX_CONCURRENT', 10, '超级会员最大并发数')
  254. ON DUPLICATE KEY UPDATE
  255. `benefit_value` = VALUES(`benefit_value`),
  256. `description` = VALUES(`description`),
  257. `status` = 1;
  258. -- ============================================
  259. -- 支付模块表
  260. -- ============================================
  261. -- 支付方案表(套餐定价)
  262. CREATE TABLE IF NOT EXISTS `t_payment_plan` (
  263. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  264. `plan_name` VARCHAR(64) NOT NULL COMMENT '方案名称(如:月卡)',
  265. `plan_code` VARCHAR(20) NOT NULL COMMENT '方案编码(MONTHLY/QUARTERLY/YEARLY)',
  266. `membership_level` VARCHAR(20) NOT NULL COMMENT '对应会员等级:PLUS/PRO/ULTRA',
  267. `price` DECIMAL(10,2) NOT NULL COMMENT '价格(元)',
  268. `original_price` DECIMAL(10,2) DEFAULT NULL COMMENT '原价(元)',
  269. `duration_days` INT NOT NULL COMMENT '会员有效天数',
  270. `sort_order` INT DEFAULT 0 COMMENT '排序号',
  271. `status` INT NOT NULL DEFAULT 1 COMMENT '状态:0-下架 1-上架',
  272. `description` VARCHAR(256) DEFAULT NULL COMMENT '方案描述',
  273. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  274. `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  275. PRIMARY KEY (`id`),
  276. UNIQUE KEY `uk_plan_code` (`plan_code`),
  277. KEY `idx_status` (`status`)
  278. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='支付方案表';
  279. -- 支付订单表
  280. CREATE TABLE IF NOT EXISTS `t_payment_order` (
  281. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  282. `order_no` VARCHAR(32) NOT NULL COMMENT '订单号',
  283. `user_id` BIGINT NOT NULL COMMENT '用户ID',
  284. `plan_id` BIGINT NOT NULL COMMENT '支付方案ID',
  285. `amount` DECIMAL(10,2) NOT NULL COMMENT '实付金额(元)',
  286. `channel` VARCHAR(20) NOT NULL COMMENT '支付渠道:WECHAT/ALIPAY',
  287. `status` VARCHAR(20) NOT NULL DEFAULT 'PENDING' COMMENT '状态:PENDING/PAID/EXPIRED/REFUNDED',
  288. `qr_code_url` VARCHAR(2048) DEFAULT NULL COMMENT '二维码内容/URL(支付宝电脑网站支付为收银台跳转URL)',
  289. `paid_channel` VARCHAR(20) DEFAULT NULL COMMENT '实际支付渠道:第一次支付成功时的渠道(可能与当前channel不同)',
  290. `trade_no` VARCHAR(64) DEFAULT NULL COMMENT '第三方交易号',
  291. `paid_time` DATETIME DEFAULT NULL COMMENT '支付时间',
  292. `expire_time` DATETIME NOT NULL COMMENT '订单过期时间',
  293. `refund_time` DATETIME DEFAULT NULL COMMENT '退款时间',
  294. `refund_amount` DECIMAL(10,2) DEFAULT NULL COMMENT '退款金额(元)',
  295. `membership_record_id` BIGINT DEFAULT NULL COMMENT '关联的会员记录ID',
  296. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  297. `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  298. PRIMARY KEY (`id`),
  299. UNIQUE KEY `uk_order_no` (`order_no`),
  300. KEY `idx_user_id` (`user_id`),
  301. KEY `idx_status_expire_time` (`status`, `expire_time`)
  302. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='支付订单表';
  303. -- 支付订单表补充联合索引(兼容旧库的幂等 ALTER:用 idx_status_expire_time 替代原单列 idx_status / idx_expire_time)
  304. SET @idx_exists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 't_payment_order' AND INDEX_NAME = 'idx_status_expire_time');
  305. SET @sql = IF(@idx_exists = 0, "ALTER TABLE `t_payment_order` ADD KEY `idx_status_expire_time` (`status`, `expire_time`)", 'SELECT 1');
  306. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  307. -- 支付订单表补充字段(自动续费扣款相关)
  308. -- order_type / agreement_id(兼容旧库的幂等 ALTER)
  309. SET @col_exists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 't_payment_order' AND COLUMN_NAME = 'order_type');
  310. SET @sql = IF(@col_exists = 0, "ALTER TABLE `t_payment_order` ADD COLUMN `order_type` VARCHAR(20) NOT NULL DEFAULT 'NORMAL' COMMENT '订单类型:NORMAL/AUTO_DEDUCT' AFTER `qr_code_url`", 'SELECT 1');
  311. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  312. SET @col_exists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 't_payment_order' AND COLUMN_NAME = 'agreement_id');
  313. SET @sql = IF(@col_exists = 0, "ALTER TABLE `t_payment_order` ADD COLUMN `agreement_id` BIGINT DEFAULT NULL COMMENT '关联签约协议ID' AFTER `order_type`", 'SELECT 1');
  314. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  315. SET @col_exists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 't_payment_order' AND COLUMN_NAME = 'paid_channel');
  316. SET @sql = IF(@col_exists = 0, "ALTER TABLE `t_payment_order` ADD COLUMN `paid_channel` VARCHAR(20) DEFAULT NULL COMMENT '实际支付渠道:第一次支付成功时的渠道' AFTER `qr_code_url`", 'SELECT 1');
  317. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  318. -- 支付订单重复支付记录表(切换渠道后多个渠道都支付成功时保留证据)
  319. CREATE TABLE IF NOT EXISTS `t_payment_order_extra_payment` (
  320. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  321. `order_no` VARCHAR(32) NOT NULL COMMENT '订单号',
  322. `channel` VARCHAR(20) NOT NULL COMMENT '实际支付渠道:WECHAT/ALIPAY',
  323. `trade_no` VARCHAR(64) NOT NULL COMMENT '第三方交易号',
  324. `amount` DECIMAL(10,2) NOT NULL COMMENT '支付金额(元)',
  325. `paid_time` DATETIME NOT NULL COMMENT '支付时间',
  326. `refund_status` VARCHAR(20) DEFAULT 'PENDING' COMMENT '退款状态:PENDING/SUCCESS/FAILED',
  327. `refund_trade_no` VARCHAR(64) DEFAULT NULL COMMENT '退款交易号(第三方退款单号)',
  328. `refund_time` DATETIME DEFAULT NULL COMMENT '退款时间',
  329. `refund_fail_reason` VARCHAR(500) DEFAULT NULL COMMENT '退款失败原因',
  330. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  331. `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  332. PRIMARY KEY (`id`),
  333. KEY `idx_order_no` (`order_no`)
  334. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='支付订单重复支付记录表';
  335. -- 签约协议表(周期扣款/委托代扣)
  336. CREATE TABLE IF NOT EXISTS `t_payment_agreement` (
  337. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  338. `user_id` BIGINT NOT NULL COMMENT '用户ID',
  339. `plan_id` BIGINT NOT NULL COMMENT '支付方案ID',
  340. `channel` VARCHAR(20) NOT NULL COMMENT '支付渠道:WECHAT/ALIPAY',
  341. `period_type` VARCHAR(10) NOT NULL COMMENT '周期类型:MONTH/YEAR',
  342. `period_amount` DECIMAL(10,2) NOT NULL COMMENT '每期扣款金额(元)',
  343. `status` VARCHAR(20) NOT NULL DEFAULT 'PENDING' COMMENT '状态:PENDING/SIGNED/UNSIGNED/FAILED',
  344. `agreement_no` VARCHAR(128) DEFAULT NULL COMMENT '第三方协议号(支付宝agreement_no/微信contract_id)',
  345. `external_agreement_no` VARCHAR(64) DEFAULT NULL COMMENT '商家自定义协议号(幂等)',
  346. `sign_time` DATETIME DEFAULT NULL COMMENT '签约时间',
  347. `unsign_time` DATETIME DEFAULT NULL COMMENT '解约时间',
  348. `next_deduct_time` DATETIME DEFAULT NULL COMMENT '下次扣款时间',
  349. `last_deduct_time` DATETIME DEFAULT NULL COMMENT '上次扣款时间',
  350. `consecutive_fail_count` INT NOT NULL DEFAULT 0 COMMENT '连续扣款失败次数',
  351. `unsign_reason` VARCHAR(256) DEFAULT NULL COMMENT '解约原因',
  352. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  353. `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  354. PRIMARY KEY (`id`),
  355. UNIQUE KEY `uk_external_agreement_no` (`external_agreement_no`),
  356. KEY `idx_user_id` (`user_id`),
  357. KEY `idx_agreement_no` (`agreement_no`),
  358. KEY `idx_status_deduct` (`status`, `next_deduct_time`)
  359. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='支付签约协议表';
  360. -- 初始化支付方案(普通会员免费,仅高级会员付费)
  361. INSERT INTO `t_payment_plan` (`plan_code`, `plan_name`, `membership_level`, `price`, `original_price`, `duration_days`, `sort_order`, `status`, `description`)
  362. VALUES
  363. ('MONTHLY_PLUS', '普通会员(免费)', 'PLUS', 0, NULL, 0, 1, 0, '普通会员免费开放,注册即拥有'),
  364. ('YEARLY_PLUS', '普通会员(免费)', 'PLUS', 0, NULL, 0, 2, 0, '普通会员免费开放,注册即拥有'),
  365. ('MONTHLY_PRO', '高级会员·月卡', 'PRO', 29.90, 59.90, 30, 3, 1, '每天不限量· 1个月29.9(原价59.9)'),
  366. ('YEARLY_PRO', '高级会员·年卡', 'PRO', 299.90,599.90, 365, 4, 1, '每天不限量· 1年299.9(原价599.9)'),
  367. ('ULTRA', '超级会员·连锁专享','ULTRA',0, NULL, 0, 5, 0, '连锁专用,多店铺管理,敬请期待')
  368. ON DUPLICATE KEY UPDATE
  369. `plan_name` = VALUES(`plan_name`),
  370. `membership_level` = VALUES(`membership_level`),
  371. `price` = VALUES(`price`),
  372. `original_price` = VALUES(`original_price`),
  373. `duration_days` = VALUES(`duration_days`),
  374. `sort_order` = VALUES(`sort_order`),
  375. `status` = VALUES(`status`),
  376. `description` = VALUES(`description`);
  377. -- ============================================
  378. -- B2B平台账号绑定相关表
  379. -- ============================================
  380. -- B2B平台账号绑定表
  381. CREATE TABLE IF NOT EXISTS `t_platform_account` (
  382. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  383. `user_id` BIGINT NOT NULL COMMENT '用户ID',
  384. `platform_code` VARCHAR(50) NOT NULL COMMENT '平台代码',
  385. `platform_name` VARCHAR(100) NOT NULL COMMENT '平台名称',
  386. `account_encrypted` TEXT NOT NULL COMMENT '平台账号(加密)',
  387. `password_encrypted` TEXT NOT NULL COMMENT '平台密码(加密)',
  388. `enabled` TINYINT(1) DEFAULT 1 COMMENT '是否启用',
  389. `last_verify_time` DATETIME DEFAULT NULL COMMENT '最后验证时间',
  390. `verify_status` VARCHAR(20) DEFAULT 'PENDING' COMMENT '验证状态:PENDING/SUCCESS/FAILED',
  391. `fail_reason` VARCHAR(500) DEFAULT NULL COMMENT '失败原因',
  392. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  393. `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  394. PRIMARY KEY (`id`),
  395. KEY `idx_user_id` (`user_id`),
  396. KEY `idx_platform_code` (`platform_code`),
  397. UNIQUE KEY `uk_user_platform` (`user_id`, `platform_code`)
  398. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='B2B平台账号绑定表';
  399. -- 入驻信息表
  400. CREATE TABLE IF NOT EXISTS `t_business_license` (
  401. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  402. `user_id` BIGINT NOT NULL COMMENT '用户ID',
  403. `license_image_url` VARCHAR(500) DEFAULT NULL COMMENT '营业执照图片URL',
  404. `credit_code` VARCHAR(50) DEFAULT NULL COMMENT '统一社会信用代码',
  405. `pharmacy_name` VARCHAR(200) DEFAULT NULL COMMENT '药店名称',
  406. `legal_person` VARCHAR(50) DEFAULT NULL COMMENT '法人姓名',
  407. `registered_address` VARCHAR(500) DEFAULT NULL COMMENT '注册地址',
  408. `business_scope` TEXT DEFAULT NULL COMMENT '经营范围',
  409. `valid_from` DATETIME DEFAULT NULL COMMENT '有效期起始日期',
  410. `valid_to` DATETIME DEFAULT NULL COMMENT '有效期截止日期(NULL表示长期有效)',
  411. `remark` VARCHAR(500) DEFAULT NULL COMMENT '备注',
  412. `review_status` VARCHAR(20) DEFAULT 'PENDING' COMMENT '审核状态:PENDING/APPROVED/REJECTED',
  413. `reviewer_id` BIGINT DEFAULT NULL COMMENT '审核人ID',
  414. `review_time` DATETIME DEFAULT NULL COMMENT '审核时间',
  415. `reject_reason` VARCHAR(500) DEFAULT NULL COMMENT '驳回原因',
  416. `show_verified_badge` TINYINT(1) DEFAULT 0 COMMENT '是否显示认证标识',
  417. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  418. `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  419. PRIMARY KEY (`id`),
  420. KEY `idx_user_id` (`user_id`),
  421. KEY `idx_review_status` (`review_status`),
  422. UNIQUE KEY `uk_user_id` (`user_id`)
  423. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='入驻信息表';
  424. -- 平台配置表
  425. CREATE TABLE IF NOT EXISTS `t_platform_config` (
  426. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  427. `platform_code` VARCHAR(50) NOT NULL COMMENT '平台代码',
  428. `platform_name` VARCHAR(100) NOT NULL COMMENT '平台名称',
  429. `enabled` TINYINT(1) DEFAULT 1 COMMENT '是否启用',
  430. `requires_recharge` TINYINT(1) DEFAULT 0 COMMENT '是否需要充值',
  431. `query_cost` INT DEFAULT 1 COMMENT '每次查询消耗配额',
  432. `priority` INT DEFAULT 0 COMMENT '优先级',
  433. `under_maintenance` TINYINT(1) DEFAULT 0 COMMENT '是否维护中',
  434. `maintenance_notice` VARCHAR(500) DEFAULT NULL COMMENT '维护公告',
  435. `description` VARCHAR(500) DEFAULT NULL COMMENT '平台描述',
  436. `official_url` VARCHAR(500) DEFAULT NULL COMMENT '平台官网链接',
  437. `binding_instructions` TEXT DEFAULT NULL COMMENT '绑定说明',
  438. `sort_order` INT DEFAULT 0 COMMENT '排序号',
  439. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  440. `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  441. `created_by` BIGINT DEFAULT NULL COMMENT '创建人ID',
  442. `updated_by` BIGINT DEFAULT NULL COMMENT '更新人ID',
  443. PRIMARY KEY (`id`),
  444. UNIQUE KEY `uk_platform_code` (`platform_code`),
  445. KEY `idx_enabled` (`enabled`)
  446. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='平台配置表';
  447. -- ============================================
  448. -- 操作审计日志表
  449. -- ============================================
  450. -- 操作审计日志表
  451. CREATE TABLE IF NOT EXISTS `t_operation_audit_log` (
  452. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  453. `operator_id` BIGINT DEFAULT NULL COMMENT '操作人ID',
  454. `operator_name` VARCHAR(100) DEFAULT NULL COMMENT '操作人姓名/昵称',
  455. `operator_role` VARCHAR(20) DEFAULT NULL COMMENT '操作人角色:USER/ADMIN/SUPER_ADMIN',
  456. `operation_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间',
  457. `ip_address` VARCHAR(50) DEFAULT NULL COMMENT '操作IP地址',
  458. `user_agent` VARCHAR(500) DEFAULT NULL COMMENT '操作设备信息',
  459. `module` VARCHAR(50) DEFAULT NULL COMMENT '操作模块:USER/LEVEL/PLATFORM/LICENSE/INVITE/COUPON/SYSTEM',
  460. `operation_type` VARCHAR(50) DEFAULT NULL COMMENT '操作类型代码',
  461. `operation_source` VARCHAR(20) DEFAULT NULL COMMENT '操作来源:ADMIN_CREATE-管理员新增 USER_SUBMIT-用户自主提交 EXTERNAL-外部系统',
  462. `description` VARCHAR(200) DEFAULT NULL COMMENT '操作描述',
  463. `target_type` VARCHAR(50) DEFAULT NULL COMMENT '目标对象类型',
  464. `target_id` BIGINT DEFAULT NULL COMMENT '目标对象ID',
  465. `target_identifier` VARCHAR(200) DEFAULT NULL COMMENT '目标对象标识',
  466. `before_data` TEXT DEFAULT NULL COMMENT '操作前的数据快照(JSON)',
  467. `after_data` TEXT DEFAULT NULL COMMENT '操作后的数据快照(JSON)',
  468. `result` VARCHAR(20) DEFAULT 'SUCCESS' COMMENT '操作结果:SUCCESS/FAILED/PARTIAL',
  469. `error_message` TEXT DEFAULT NULL COMMENT '错误信息',
  470. `request_url` VARCHAR(500) DEFAULT NULL COMMENT '请求URL',
  471. `request_method` VARCHAR(10) DEFAULT NULL COMMENT '请求方法',
  472. `request_params` TEXT DEFAULT NULL COMMENT '请求参数(脱敏)',
  473. `response_code` INT DEFAULT NULL COMMENT '响应状态码',
  474. `duration` BIGINT DEFAULT NULL COMMENT '耗时(毫秒)',
  475. `remark` VARCHAR(500) DEFAULT NULL COMMENT '备注说明',
  476. `is_sensitive` TINYINT(1) DEFAULT 0 COMMENT '是否敏感操作',
  477. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  478. PRIMARY KEY (`id`),
  479. KEY `idx_operator_id` (`operator_id`),
  480. KEY `idx_operation_time` (`operation_time`),
  481. KEY `idx_module` (`module`),
  482. KEY `idx_operation_type` (`operation_type`),
  483. KEY `idx_operation_source` (`operation_source`),
  484. KEY `idx_target` (`target_type`, `target_id`),
  485. KEY `idx_is_sensitive` (`is_sensitive`),
  486. KEY `idx_result` (`result`)
  487. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='操作审计日志表';
  488. -- ============================================
  489. -- 搜索记录表(完整比价快照)
  490. -- ============================================
  491. CREATE TABLE IF NOT EXISTS `t_search_record` (
  492. `id` BIGINT NOT NULL COMMENT '主键ID(雪花算法)',
  493. `user_id` BIGINT NOT NULL COMMENT '用户ID',
  494. `drug_name` VARCHAR(200) NOT NULL COMMENT '药品名称',
  495. `searched_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '搜索时间',
  496. `status_text` VARCHAR(500) DEFAULT NULL COMMENT '状态文案',
  497. `platform_results` LONGTEXT DEFAULT NULL COMMENT '平台搜索结果(JSON文本)',
  498. `search_log` LONGTEXT DEFAULT NULL COMMENT '搜索日志(JSON文本,可为null)',
  499. `platform_count` INT NOT NULL DEFAULT 0 COMMENT '涉及平台数量(冗余存储,避免列表查询时解析大字段)',
  500. `quote_count` INT NOT NULL DEFAULT 0 COMMENT '总报价条数(冗余存储,避免列表查询时解析大字段)',
  501. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  502. PRIMARY KEY (`id`),
  503. KEY `idx_user_id` (`user_id`),
  504. KEY `idx_user_searched` (`user_id`, `searched_at`)
  505. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='搜索记录表(完整比价快照)';
  506. -- ============================================
  507. -- 平台会话快照表
  508. -- ============================================
  509. CREATE TABLE IF NOT EXISTS `t_platform_session` (
  510. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  511. `user_id` BIGINT NOT NULL COMMENT '用户ID',
  512. `platform_code` VARCHAR(50) NOT NULL COMMENT '平台代码',
  513. `platform_name` VARCHAR(100) DEFAULT NULL COMMENT '平台展示名称',
  514. `login_url` VARCHAR(500) DEFAULT NULL COMMENT '平台登录页地址',
  515. `account_label` VARCHAR(200) DEFAULT NULL COMMENT '账号标签',
  516. `captured_at` DATETIME DEFAULT NULL COMMENT 'Cookie捕获时间',
  517. `updated_at` DATETIME DEFAULT NULL COMMENT '绑定元数据更新时间',
  518. `cookies_encrypted` LONGTEXT DEFAULT NULL COMMENT '加密后的Cookie JSON数组',
  519. `version` INT DEFAULT 1 COMMENT '数据版本号',
  520. `expires_at` DATETIME DEFAULT NULL COMMENT '最早过期的Cookie时间',
  521. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  522. `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  523. PRIMARY KEY (`id`),
  524. UNIQUE KEY `uk_user_platform` (`user_id`, `platform_code`),
  525. KEY `idx_user_id` (`user_id`),
  526. KEY `idx_expires_at` (`expires_at`)
  527. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='平台会话快照表';
  528. -- ============================================
  529. -- 关注/收藏表
  530. -- ============================================
  531. CREATE TABLE IF NOT EXISTS `t_watchlist` (
  532. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  533. `user_id` BIGINT NOT NULL COMMENT '用户ID',
  534. `drug_name` VARCHAR(200) NOT NULL COMMENT '药品通用名',
  535. `spec` VARCHAR(100) DEFAULT NULL COMMENT '规格',
  536. `manufacturer` VARCHAR(200) DEFAULT NULL COMMENT '厂家',
  537. `min_price` DECIMAL(10,2) DEFAULT NULL COMMENT '关注时最低价',
  538. `min_price_platform` VARCHAR(32) DEFAULT NULL COMMENT '最低价平台代码',
  539. `last_price` DECIMAL(10,2) DEFAULT NULL COMMENT '上次查询价格',
  540. `price_change` DECIMAL(10,2) DEFAULT NULL COMMENT '价格变动(正=涨价,负=降价)',
  541. `last_check_time` DATETIME DEFAULT NULL COMMENT '最后价格检查时间',
  542. `status` INT NOT NULL DEFAULT 1 COMMENT '状态:0-取消关注 1-关注中',
  543. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  544. `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  545. PRIMARY KEY (`id`),
  546. KEY `idx_user_id` (`user_id`),
  547. KEY `idx_status` (`status`)
  548. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='关注/收藏表';
  549. -- ============================================
  550. -- 初始化默认数据
  551. -- ============================================
  552. -- 初始化MVP启用的3个核心平台配置
  553. INSERT INTO `t_platform_config` (`platform_code`, `platform_name`, `enabled`, `requires_recharge`, `query_cost`, `priority`, `description`, `official_url`, `binding_instructions`, `sort_order`)
  554. VALUES
  555. ('yaoshibang', '药师帮', 1, 1, 1, 1, '国内最大B2B医药批发平台,覆盖全国药品供应商', 'https://www.yaoshibang.com', '请输入您在药师帮平台的手机号和密码', 1),
  556. ('yaobangmang', '药帮忙', 1, 0, 1, 2, '专业医药B2B采购平台', 'https://www.yaobangmang.com', '请输入您在药帮忙平台的账号和密码', 2),
  557. ('yiyaocheng', '1药城', 1, 0, 1, 3, '1药网旗下B2B医药平台', 'https://www.1yaocheng.com', '请输入您在1药城平台的账号和密码', 3)
  558. ON DUPLICATE KEY UPDATE
  559. `description` = VALUES(`description`),
  560. `official_url` = VALUES(`official_url`);
  561. -- 初始化邀请配置(邀请人30天高级会员,被邀请人30天高级会员,总邀请上限30人)
  562. INSERT 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`)
  563. VALUES
  564. (1, 'MEMBERSHIP', 1, 5, 50, 30, 10, 30, '邀请你加入智价云(药店版)', '登录智价云(药店版)平台,聚合比价查低价', '智价云(药店版)', 1)
  565. ON DUPLICATE KEY UPDATE
  566. `reward_type` = 'MEMBERSHIP',
  567. `landing_desc` = '登录智价云(药店版)平台,聚合比价查低价',
  568. `max_total_invites` = VALUES(`max_total_invites`);
  569. -- ============================================
  570. -- DDL: 支付宝开放能力回调记录表
  571. -- 用于持久化应用网关推送和授权回调信息,便于后续排查和审计
  572. -- ============================================
  573. CREATE TABLE IF NOT EXISTS `t_alipay_callback_record` (
  574. `id` BIGINT NOT NULL COMMENT '主键ID(雪花算法)',
  575. `type` VARCHAR(50) NOT NULL COMMENT '回调类型:gateway(应用网关) / auth_callback(授权回调)',
  576. `app_id` VARCHAR(64) DEFAULT NULL COMMENT '支付宝应用ID',
  577. `msg_method` VARCHAR(128) DEFAULT NULL COMMENT '网关消息方法名',
  578. `auth_code` VARCHAR(256) DEFAULT NULL COMMENT '授权码(已脱敏)',
  579. `source` VARCHAR(64) DEFAULT NULL COMMENT '来源',
  580. `state` VARCHAR(256) DEFAULT NULL COMMENT '状态参数',
  581. `params` TEXT DEFAULT NULL COMMENT '原始请求参数(JSON文本)',
  582. `status` VARCHAR(20) DEFAULT 'RECEIVED' COMMENT '处理状态:RECEIVED/PROCESSED/IGNORED',
  583. `error_msg` VARCHAR(500) DEFAULT NULL COMMENT '错误信息',
  584. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  585. PRIMARY KEY (`id`),
  586. KEY `idx_type_create_time` (`type`, `create_time`),
  587. KEY `idx_app_id` (`app_id`),
  588. KEY `idx_msg_method` (`msg_method`)
  589. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='支付宝开放能力回调记录表';
  590. -- ============================================
  591. -- DDL: 支付宝安心付卡模板表(周期卡)
  592. -- 记录安心付周期卡模板信息,与支付方案一一对应
  593. -- ============================================
  594. CREATE TABLE IF NOT EXISTS `t_alipay_anxin_card` (
  595. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  596. `plan_id` BIGINT NOT NULL COMMENT '关联支付方案ID(t_payment_plan.id)',
  597. `card_id` VARCHAR(128) DEFAULT NULL COMMENT '支付宝卡模板ID',
  598. `card_name` VARCHAR(128) DEFAULT NULL COMMENT '卡名称',
  599. `card_type` VARCHAR(20) DEFAULT 'PERIOD_PAY' COMMENT '卡类型:PERIOD_PAY(周期卡)',
  600. `period_amount` DECIMAL(10,2) DEFAULT NULL COMMENT '每期扣款金额(元)',
  601. `period_days` INT DEFAULT NULL COMMENT '扣款周期天数',
  602. `total_periods` INT DEFAULT NULL COMMENT '总期数(NULL表示无限期)',
  603. `status` VARCHAR(20) DEFAULT 'PENDING' COMMENT '状态:PENDING/EFFECTIVE/FROZEN/INVALID',
  604. `appointment_url` VARCHAR(2048) DEFAULT NULL COMMENT '预约链接(小程序跳转地址)',
  605. `raw_response` TEXT DEFAULT NULL COMMENT '原始创建响应(JSON)',
  606. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  607. `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  608. PRIMARY KEY (`id`),
  609. UNIQUE KEY `uk_plan_id` (`plan_id`),
  610. KEY `idx_card_id` (`card_id`),
  611. KEY `idx_status` (`status`)
  612. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='支付宝安心付卡模板表';
  613. -- ============================================
  614. -- DDL: 支付宝安心付扣款订单记录表
  615. -- 记录每一次安心付周期卡扣款通知信息
  616. -- ============================================
  617. CREATE TABLE IF NOT EXISTS `t_alipay_anxin_order_record` (
  618. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  619. `user_id` BIGINT DEFAULT NULL COMMENT '系统用户ID(通过out_biz_no匹配)',
  620. `plan_id` BIGINT NOT NULL COMMENT '关联支付方案ID',
  621. `card_id` VARCHAR(128) DEFAULT NULL COMMENT '支付宝卡模板ID',
  622. `order_id` VARCHAR(128) DEFAULT NULL COMMENT '支付宝售卖订单ID',
  623. `sub_order_id` VARCHAR(128) DEFAULT NULL COMMENT '核销/扣款子订单ID',
  624. `out_biz_no` VARCHAR(128) DEFAULT NULL COMMENT '商家业务号(存储系统用户ID)',
  625. `alipay_user_id` VARCHAR(128) DEFAULT NULL COMMENT '支付宝用户ID',
  626. `deduct_amount` DECIMAL(10,2) DEFAULT NULL COMMENT '扣款金额(元)',
  627. `deduct_status` VARCHAR(20) DEFAULT NULL COMMENT '扣款状态:SUCCESS/FAIL',
  628. `deduct_time` DATETIME DEFAULT NULL COMMENT '扣款时间',
  629. `membership_activated` TINYINT(1) DEFAULT 0 COMMENT '会员是否已激活',
  630. `order_no` VARCHAR(32) DEFAULT NULL COMMENT '关联支付订单号',
  631. `raw_params` TEXT DEFAULT NULL COMMENT '原始通知参数(JSON)',
  632. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  633. `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  634. PRIMARY KEY (`id`),
  635. KEY `idx_sub_order_id` (`sub_order_id`),
  636. KEY `idx_order_id` (`order_id`),
  637. KEY `idx_user_id` (`user_id`),
  638. KEY `idx_card_id` (`card_id`)
  639. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='支付宝安心付扣款订单记录表';