fs_store_promotion_init.sql 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. -- ============================================================
  2. -- 多店铺阶梯满减活动 - 初始化 / 增量升级 SQL
  3. -- 文档: docs/multi-store-tiered-promotion-design.md v1.2
  4. -- 执行前请备份数据库;菜单 parent_id 请按实际 hisStore 父菜单 ID 调整
  5. --
  6. -- 使用说明:
  7. -- 1. 全新环境:从「一、建表」起顺序执行即可
  8. -- 2. 已建活动表、仅缺订单字段:执行「二、订单表扩展字段(增量)」
  9. -- 3. 增量语句可重复执行,字段/索引已存在时自动跳过
  10. -- ============================================================
  11. -- ============================================================
  12. -- 一、建表(CREATE TABLE IF NOT EXISTS,可重复执行)
  13. -- ============================================================
  14. -- 1. 活动主表
  15. CREATE TABLE IF NOT EXISTS `fs_store_promotion_activity` (
  16. `id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  17. `title` VARCHAR(100) NOT NULL COMMENT '活动名称',
  18. `store_id` BIGINT(20) NOT NULL COMMENT '店铺ID',
  19. `start_time` DATETIME NOT NULL COMMENT '活动开始时间',
  20. `end_time` DATETIME NOT NULL COMMENT '活动结束时间',
  21. `scope_type` TINYINT(2) NOT NULL DEFAULT 1 COMMENT '适用范围:1全场 2指定分类 3指定商品',
  22. `is_stackable` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否可叠加优惠券:0否 1是',
  23. `is_capped` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否上不封顶:0否 1是',
  24. `limit_per_user` INT(11) NOT NULL DEFAULT 0 COMMENT '每人限参与次数,0=不限',
  25. `status` TINYINT(2) NOT NULL DEFAULT 0 COMMENT '状态:0草稿 1启用 3已结束',
  26. `manual_status` TINYINT(1) DEFAULT NULL COMMENT '手动开关:NULL未操作 1启用 0关闭',
  27. `version` INT(11) NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
  28. `remark` VARCHAR(500) DEFAULT NULL COMMENT '备注',
  29. `is_del` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除:0正常 1删除',
  30. `create_by` VARCHAR(64) DEFAULT NULL COMMENT '创建者',
  31. `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  32. `update_by` VARCHAR(64) DEFAULT NULL COMMENT '更新者',
  33. `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  34. PRIMARY KEY (`id`),
  35. KEY `idx_store_id` (`store_id`),
  36. KEY `idx_status_time` (`status`, `manual_status`, `start_time`, `end_time`),
  37. KEY `idx_store_status` (`store_id`, `status`, `manual_status`, `is_del`)
  38. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='店铺阶梯满减活动主表';
  39. -- 2. 满减档位表
  40. CREATE TABLE IF NOT EXISTS `fs_store_promotion_tier` (
  41. `id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  42. `activity_id` BIGINT(20) NOT NULL COMMENT '活动ID',
  43. `sort_order` INT(11) NOT NULL DEFAULT 1 COMMENT '档位序号',
  44. `threshold_amount` DECIMAL(10,2) NOT NULL COMMENT '门槛金额(元)',
  45. `discount_amount` DECIMAL(10,2) NOT NULL COMMENT '减扣金额(元)',
  46. `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  47. `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  48. PRIMARY KEY (`id`),
  49. KEY `idx_activity_id` (`activity_id`)
  50. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='阶梯满减档位表';
  51. -- 3. 适用范围表(指定分类/指定商品写入此表,全场通用不写记录)
  52. CREATE TABLE IF NOT EXISTS `fs_store_promotion_scope` (
  53. `id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  54. `activity_id` BIGINT(20) NOT NULL COMMENT '活动ID',
  55. `scope_type` TINYINT(2) NOT NULL COMMENT '范围类型:2分类 3商品',
  56. `target_id` BIGINT(20) NOT NULL COMMENT '分类ID或商品ID',
  57. `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  58. PRIMARY KEY (`id`),
  59. KEY `idx_activity_id` (`activity_id`),
  60. KEY `idx_target` (`scope_type`, `target_id`)
  61. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='活动适用范围明细表';
  62. -- 4. 用户参与记录表
  63. CREATE TABLE IF NOT EXISTS `fs_store_promotion_usage` (
  64. `id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  65. `activity_id` BIGINT(20) NOT NULL COMMENT '活动ID',
  66. `user_id` BIGINT(20) NOT NULL COMMENT '用户ID',
  67. `order_id` BIGINT(20) NOT NULL COMMENT '订单ID',
  68. `order_amount` DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '订单原金额',
  69. `discount_amount` DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '优惠金额',
  70. `tier_id` BIGINT(20) DEFAULT NULL COMMENT '命中档位ID',
  71. `usage_status` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '0待支付 1已生效 2已回滚',
  72. `usage_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '参与时间',
  73. `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  74. PRIMARY KEY (`id`),
  75. UNIQUE KEY `uk_activity_order` (`activity_id`, `order_id`),
  76. KEY `idx_activity_user` (`activity_id`, `user_id`),
  77. KEY `idx_order_id` (`order_id`),
  78. KEY `idx_usage_time` (`usage_time`)
  79. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户活动参与记录表';
  80. -- ============================================================
  81. -- 二、订单表扩展字段(增量,可重复执行)
  82. -- 表:fs_store_order_scrm
  83. -- ============================================================
  84. SET @db_name = DATABASE();
  85. -- promotion_activity_id
  86. SET @sql_add_promotion_activity_id = (
  87. SELECT IF(
  88. EXISTS(
  89. SELECT 1 FROM information_schema.COLUMNS
  90. WHERE TABLE_SCHEMA = @db_name
  91. AND TABLE_NAME = 'fs_store_order_scrm'
  92. AND COLUMN_NAME = 'promotion_activity_id'
  93. ),
  94. 'SELECT ''skip: promotion_activity_id exists'' AS msg',
  95. 'ALTER TABLE `fs_store_order_scrm` ADD COLUMN `promotion_activity_id` BIGINT(20) DEFAULT NULL COMMENT ''阶梯满减活动ID'' AFTER `user_coupon_id`'
  96. )
  97. );
  98. PREPARE stmt FROM @sql_add_promotion_activity_id;
  99. EXECUTE stmt;
  100. DEALLOCATE PREPARE stmt;
  101. -- promotion_tier_id
  102. SET @sql_add_promotion_tier_id = (
  103. SELECT IF(
  104. EXISTS(
  105. SELECT 1 FROM information_schema.COLUMNS
  106. WHERE TABLE_SCHEMA = @db_name
  107. AND TABLE_NAME = 'fs_store_order_scrm'
  108. AND COLUMN_NAME = 'promotion_tier_id'
  109. ),
  110. 'SELECT ''skip: promotion_tier_id exists'' AS msg',
  111. 'ALTER TABLE `fs_store_order_scrm` ADD COLUMN `promotion_tier_id` BIGINT(20) DEFAULT NULL COMMENT ''命中档位ID'' AFTER `promotion_activity_id`'
  112. )
  113. );
  114. PREPARE stmt FROM @sql_add_promotion_tier_id;
  115. EXECUTE stmt;
  116. DEALLOCATE PREPARE stmt;
  117. -- promotion_discount_amount
  118. SET @sql_add_promotion_discount_amount = (
  119. SELECT IF(
  120. EXISTS(
  121. SELECT 1 FROM information_schema.COLUMNS
  122. WHERE TABLE_SCHEMA = @db_name
  123. AND TABLE_NAME = 'fs_store_order_scrm'
  124. AND COLUMN_NAME = 'promotion_discount_amount'
  125. ),
  126. 'SELECT ''skip: promotion_discount_amount exists'' AS msg',
  127. 'ALTER TABLE `fs_store_order_scrm` ADD COLUMN `promotion_discount_amount` DECIMAL(10,2) DEFAULT NULL COMMENT ''满减优惠金额'' AFTER `promotion_tier_id`'
  128. )
  129. );
  130. PREPARE stmt FROM @sql_add_promotion_discount_amount;
  131. EXECUTE stmt;
  132. DEALLOCATE PREPARE stmt;
  133. -- ============================================================
  134. -- 三、参与记录表索引补全(旧库若已建表但缺 idx_usage_time 可执行)
  135. -- ============================================================
  136. SET @sql_add_idx_usage_time = (
  137. SELECT IF(
  138. EXISTS(
  139. SELECT 1 FROM information_schema.STATISTICS
  140. WHERE TABLE_SCHEMA = @db_name
  141. AND TABLE_NAME = 'fs_store_promotion_usage'
  142. AND INDEX_NAME = 'idx_usage_time'
  143. ),
  144. 'SELECT ''skip: idx_usage_time exists'' AS msg',
  145. 'ALTER TABLE `fs_store_promotion_usage` ADD INDEX `idx_usage_time` (`usage_time`)'
  146. )
  147. );
  148. PREPARE stmt FROM @sql_add_idx_usage_time;
  149. EXECUTE stmt;
  150. DEALLOCATE PREPARE stmt;
  151. -- ============================================================
  152. -- 四、菜单与按钮权限(parent_id 请替换为商城/hisStore 父菜单 ID)
  153. -- 注意:菜单 INSERT 仅首次执行,重复执行会插入重复菜单
  154. -- ============================================================
  155. -- SET @parent_menu_id = (SELECT menu_id FROM sys_menu WHERE menu_name = '商城管理' LIMIT 1);
  156. INSERT INTO `sys_menu` (`menu_name`, `parent_id`, `order_num`, `path`, `component`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
  157. VALUES ('阶梯满减', 0, 1, 'storePromotion', 'hisStore/storePromotion/index', 1, 0, 'C', '0', '0', 'store:storePromotion:list', 'money', 'admin', NOW(), '', NULL, '阶梯满减活动');
  158. SET @promotion_menu_id = LAST_INSERT_ID();
  159. INSERT INTO `sys_menu` (`menu_name`, `parent_id`, `order_num`, `path`, `component`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_by`, `create_time`, `remark`) VALUES
  160. ('阶梯满减查询', @promotion_menu_id, 1, '#', '', 1, 0, 'F', '0', '0', 'store:storePromotion:query', '#', 'admin', NOW(), ''),
  161. ('阶梯满减新增', @promotion_menu_id, 2, '#', '', 1, 0, 'F', '0', '0', 'store:storePromotion:add', '#', 'admin', NOW(), ''),
  162. ('阶梯满减修改', @promotion_menu_id, 3, '#', '', 1, 0, 'F', '0', '0', 'store:storePromotion:edit', '#', 'admin', NOW(), ''),
  163. ('阶梯满减删除', @promotion_menu_id, 4, '#', '', 1, 0, 'F', '0', '0', 'store:storePromotion:remove', '#', 'admin', NOW(), ''),
  164. ('阶梯满减导出', @promotion_menu_id, 5, '#', '', 1, 0, 'F', '0', '0', 'store:storePromotion:export', '#', 'admin', NOW(), ''),
  165. ('阶梯满减启用', @promotion_menu_id, 6, '#', '', 1, 0, 'F', '0', '0', 'store:storePromotion:enable', '#', 'admin', NOW(), ''),
  166. ('阶梯满减停用', @promotion_menu_id, 7, '#', '', 1, 0, 'F', '0', '0', 'store:storePromotion:disable', '#', 'admin', NOW(), '');