272 lines
12 KiB
MySQL
272 lines
12 KiB
MySQL
|
|
-- ============================================================
|
|||
|
|
-- 黄精粉健康商城 HJF 数据库迁移脚本
|
|||
|
|
-- 版本:Phase 2
|
|||
|
|
-- 日期:2026-03-15
|
|||
|
|
-- 执行说明:
|
|||
|
|
-- 1. 兼容 MySQL 5.7+,数据库前缀为 eb_
|
|||
|
|
-- 2. 按顺序执行 P2-01 ~ P2-05
|
|||
|
|
-- 3. 所有操作均做幂等处理,可重复执行
|
|||
|
|
-- ============================================================
|
|||
|
|
|
|||
|
|
-- ============================================================
|
|||
|
|
-- P2-01: 公排池表
|
|||
|
|
-- ============================================================
|
|||
|
|
|
|||
|
|
CREATE TABLE IF NOT EXISTS `eb_queue_pool` (
|
|||
|
|
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
|
|||
|
|
`uid` int(11) NOT NULL DEFAULT 0 COMMENT '用户 ID',
|
|||
|
|
`order_id` varchar(50) NOT NULL DEFAULT '' COMMENT '来源订单号(eb_store_order.order_id)',
|
|||
|
|
`amount` decimal(10,2) NOT NULL DEFAULT 3600.00 COMMENT '报单金额(元)',
|
|||
|
|
`queue_no` int(11) NOT NULL DEFAULT 0 COMMENT '全局排队序号(自增,唯一)',
|
|||
|
|
`status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '状态:0=排队中 1=已退款',
|
|||
|
|
`refund_time` int(11) NOT NULL DEFAULT 0 COMMENT '退款时间(Unix 时间戳)',
|
|||
|
|
`trigger_batch` int(11) NOT NULL DEFAULT 0 COMMENT '触发退款的批次号',
|
|||
|
|
`add_time` int(11) NOT NULL DEFAULT 0 COMMENT '入队时间(Unix 时间戳)',
|
|||
|
|
PRIMARY KEY (`id`),
|
|||
|
|
UNIQUE KEY `uniq_queue_no` (`queue_no`),
|
|||
|
|
INDEX `idx_uid` (`uid`),
|
|||
|
|
INDEX `idx_status_add_time` (`status`, `add_time`),
|
|||
|
|
INDEX `idx_trigger_batch` (`trigger_batch`)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='公排池';
|
|||
|
|
|
|||
|
|
|
|||
|
|
-- ============================================================
|
|||
|
|
-- P2-02: 积分释放日志表
|
|||
|
|
-- ============================================================
|
|||
|
|
|
|||
|
|
CREATE TABLE IF NOT EXISTS `eb_points_release_log` (
|
|||
|
|
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
|
|||
|
|
`uid` int(11) NOT NULL DEFAULT 0 COMMENT '用户 ID',
|
|||
|
|
`points` int(11) NOT NULL DEFAULT 0 COMMENT '积分数量(绝对值)',
|
|||
|
|
`pm` tinyint(1) NOT NULL DEFAULT 1 COMMENT '收支方向:1=收入 0=支出',
|
|||
|
|
`type` varchar(50) NOT NULL DEFAULT '' COMMENT '类型:reward_direct/reward_umbrella/release/consume',
|
|||
|
|
`title` varchar(255) NOT NULL DEFAULT '' COMMENT '标题',
|
|||
|
|
`mark` varchar(500) NOT NULL DEFAULT '' COMMENT '备注',
|
|||
|
|
`status` varchar(30) NOT NULL DEFAULT 'frozen' COMMENT '状态:frozen=冻结 released=已释放 consumed=已消费',
|
|||
|
|
`order_id` varchar(50) NOT NULL DEFAULT '' COMMENT '关联订单号(奖励来源),释放记录为空',
|
|||
|
|
`release_date` date DEFAULT NULL COMMENT '释放日期(每日释放时填写)',
|
|||
|
|
`add_time` int(11) NOT NULL DEFAULT 0 COMMENT '记录时间(Unix 时间戳)',
|
|||
|
|
PRIMARY KEY (`id`),
|
|||
|
|
INDEX `idx_uid_type` (`uid`, `type`),
|
|||
|
|
INDEX `idx_uid_add_time` (`uid`, `add_time`),
|
|||
|
|
INDEX `idx_release_date` (`release_date`)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='积分释放明细日志';
|
|||
|
|
|
|||
|
|
|
|||
|
|
-- ============================================================
|
|||
|
|
-- P2-03 / P2-04: eb_user / eb_store_product / eb_store_order 扩展字段
|
|||
|
|
--
|
|||
|
|
-- MySQL 5.7 不支持 "ADD COLUMN IF NOT EXISTS",
|
|||
|
|
-- 改用存储过程 + information_schema 实现幂等检查。
|
|||
|
|
-- ============================================================
|
|||
|
|
|
|||
|
|
DROP PROCEDURE IF EXISTS `hjf_migrate_columns`;
|
|||
|
|
|
|||
|
|
DELIMITER $$
|
|||
|
|
CREATE PROCEDURE `hjf_migrate_columns`()
|
|||
|
|
BEGIN
|
|||
|
|
|
|||
|
|
-- ---- eb_user 字段 ----
|
|||
|
|
IF NOT EXISTS (
|
|||
|
|
SELECT 1 FROM information_schema.COLUMNS
|
|||
|
|
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'eb_user' AND COLUMN_NAME = 'member_level'
|
|||
|
|
) THEN
|
|||
|
|
ALTER TABLE `eb_user`
|
|||
|
|
ADD COLUMN `member_level` tinyint(1) NOT NULL DEFAULT 0 COMMENT '会员等级:0普通 1创客 2云店 3服务商 4分公司';
|
|||
|
|
END IF;
|
|||
|
|
|
|||
|
|
IF NOT EXISTS (
|
|||
|
|
SELECT 1 FROM information_schema.COLUMNS
|
|||
|
|
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'eb_user' AND COLUMN_NAME = 'no_assess'
|
|||
|
|
) THEN
|
|||
|
|
ALTER TABLE `eb_user`
|
|||
|
|
ADD COLUMN `no_assess` tinyint(1) NOT NULL DEFAULT 0 COMMENT '不计入伞下业绩:1=不计入';
|
|||
|
|
END IF;
|
|||
|
|
|
|||
|
|
IF NOT EXISTS (
|
|||
|
|
SELECT 1 FROM information_schema.COLUMNS
|
|||
|
|
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'eb_user' AND COLUMN_NAME = 'frozen_points'
|
|||
|
|
) THEN
|
|||
|
|
ALTER TABLE `eb_user`
|
|||
|
|
ADD COLUMN `frozen_points` int(11) NOT NULL DEFAULT 0 COMMENT '待释放(冻结)积分';
|
|||
|
|
END IF;
|
|||
|
|
|
|||
|
|
IF NOT EXISTS (
|
|||
|
|
SELECT 1 FROM information_schema.COLUMNS
|
|||
|
|
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'eb_user' AND COLUMN_NAME = 'available_points'
|
|||
|
|
) THEN
|
|||
|
|
ALTER TABLE `eb_user`
|
|||
|
|
ADD COLUMN `available_points` int(11) NOT NULL DEFAULT 0 COMMENT '可用积分';
|
|||
|
|
END IF;
|
|||
|
|
|
|||
|
|
-- eb_user 索引:idx_member_level
|
|||
|
|
IF NOT EXISTS (
|
|||
|
|
SELECT 1 FROM information_schema.STATISTICS
|
|||
|
|
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'eb_user' AND INDEX_NAME = 'idx_member_level'
|
|||
|
|
) THEN
|
|||
|
|
ALTER TABLE `eb_user` ADD INDEX `idx_member_level` (`member_level`);
|
|||
|
|
END IF;
|
|||
|
|
|
|||
|
|
-- ---- eb_store_product 字段 ----
|
|||
|
|
IF NOT EXISTS (
|
|||
|
|
SELECT 1 FROM information_schema.COLUMNS
|
|||
|
|
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'eb_store_product' AND COLUMN_NAME = 'is_queue_goods'
|
|||
|
|
) THEN
|
|||
|
|
ALTER TABLE `eb_store_product`
|
|||
|
|
ADD COLUMN `is_queue_goods` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否报单商品:1=是';
|
|||
|
|
END IF;
|
|||
|
|
|
|||
|
|
IF NOT EXISTS (
|
|||
|
|
SELECT 1 FROM information_schema.COLUMNS
|
|||
|
|
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'eb_store_product' AND COLUMN_NAME = 'allow_pay_types'
|
|||
|
|
) THEN
|
|||
|
|
ALTER TABLE `eb_store_product`
|
|||
|
|
ADD COLUMN `allow_pay_types` varchar(255) NOT NULL DEFAULT '' COMMENT '允许积分支付类型(JSON数组)';
|
|||
|
|
END IF;
|
|||
|
|
|
|||
|
|
-- eb_store_product 索引:idx_is_queue_goods
|
|||
|
|
IF NOT EXISTS (
|
|||
|
|
SELECT 1 FROM information_schema.STATISTICS
|
|||
|
|
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'eb_store_product' AND INDEX_NAME = 'idx_is_queue_goods'
|
|||
|
|
) THEN
|
|||
|
|
ALTER TABLE `eb_store_product` ADD INDEX `idx_is_queue_goods` (`is_queue_goods`);
|
|||
|
|
END IF;
|
|||
|
|
|
|||
|
|
-- ---- eb_store_order 字段 ----
|
|||
|
|
IF NOT EXISTS (
|
|||
|
|
SELECT 1 FROM information_schema.COLUMNS
|
|||
|
|
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'eb_store_order' AND COLUMN_NAME = 'is_queue_goods'
|
|||
|
|
) THEN
|
|||
|
|
ALTER TABLE `eb_store_order`
|
|||
|
|
ADD COLUMN `is_queue_goods` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否报单商品订单:1=是';
|
|||
|
|
END IF;
|
|||
|
|
|
|||
|
|
-- eb_store_order 索引:idx_is_queue_goods
|
|||
|
|
IF NOT EXISTS (
|
|||
|
|
SELECT 1 FROM information_schema.STATISTICS
|
|||
|
|
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'eb_store_order' AND INDEX_NAME = 'idx_is_queue_goods'
|
|||
|
|
) THEN
|
|||
|
|
ALTER TABLE `eb_store_order` ADD INDEX `idx_is_queue_goods` (`is_queue_goods`);
|
|||
|
|
END IF;
|
|||
|
|
|
|||
|
|
END$$
|
|||
|
|
DELIMITER ;
|
|||
|
|
|
|||
|
|
CALL `hjf_migrate_columns`();
|
|||
|
|
DROP PROCEDURE IF EXISTS `hjf_migrate_columns`;
|
|||
|
|
|
|||
|
|
|
|||
|
|
-- ============================================================
|
|||
|
|
-- P2-05: eb_system_config 初始化配置项
|
|||
|
|
--
|
|||
|
|
-- 字段说明(与 CRMEB 原表保持一致):
|
|||
|
|
-- menu_name = 配置键名(代码中 SystemConfigService::get() 读取)
|
|||
|
|
-- value = 默认值(字符串)
|
|||
|
|
-- info = 后台显示名称
|
|||
|
|
-- desc = 说明文字
|
|||
|
|
-- config_tab_id = 0(不归属某分组,便于独立管理)
|
|||
|
|
-- status = 1(启用)
|
|||
|
|
-- ============================================================
|
|||
|
|
|
|||
|
|
-- 防止重复执行报错,使用 INSERT IGNORE
|
|||
|
|
INSERT IGNORE INTO `eb_system_config`
|
|||
|
|
(`is_store`, `menu_name`, `type`, `input_type`, `config_tab_id`,
|
|||
|
|
`parameter`, `upload_type`, `required`, `width`, `high`,
|
|||
|
|
`value`, `info`, `desc`, `sort`, `status`)
|
|||
|
|
VALUES
|
|||
|
|
|
|||
|
|
-- 公排触发倍数:每入 N 单退款第1单(默认 4)
|
|||
|
|
(0, 'hjf_trigger_multiple', 'text', 'input', 0,
|
|||
|
|
'', 0, '', 100, 0,
|
|||
|
|
'4', '公排触发倍数', '每进入N单公排触发退款第1单,默认4', 10, 1),
|
|||
|
|
|
|||
|
|
-- 积分每日释放比例(‰,默认 4,即 4‰)
|
|||
|
|
(0, 'hjf_release_rate', 'text', 'input', 0,
|
|||
|
|
'', 0, '', 100, 0,
|
|||
|
|
'4', '积分每日释放比例(‰)', '每日释放:frozen_points × N / 1000,默认4(即4‰)', 20, 1),
|
|||
|
|
|
|||
|
|
-- 提现手续费率(%,默认 7,即 7%)
|
|||
|
|
(0, 'hjf_fee_rate', 'text', 'input', 0,
|
|||
|
|
'', 0, '', 100, 0,
|
|||
|
|
'7', '提现手续费率(%)', '申请提现时收取的手续费比例,默认7%', 30, 1),
|
|||
|
|
|
|||
|
|
-- 等级升级门槛:普通→创客(直推N单)
|
|||
|
|
(0, 'hjf_level_direct_require_1', 'text', 'input', 0,
|
|||
|
|
'', 0, '', 100, 0,
|
|||
|
|
'3', '创客升级所需直推单数', '普通会员直推N单报单商品后升级为创客,默认3', 40, 1),
|
|||
|
|
|
|||
|
|
-- 等级升级门槛:创客→云店(伞下N单)
|
|||
|
|
(0, 'hjf_level_umbrella_require_2', 'text', 'input', 0,
|
|||
|
|
'', 0, '', 100, 0,
|
|||
|
|
'30', '云店升级所需伞下单数', '创客伞下业绩达到N单后升级为云店,默认30', 50, 1),
|
|||
|
|
|
|||
|
|
-- 等级升级门槛:云店→服务商(伞下N单)
|
|||
|
|
(0, 'hjf_level_umbrella_require_3', 'text', 'input', 0,
|
|||
|
|
'', 0, '', 100, 0,
|
|||
|
|
'100', '服务商升级所需伞下单数', '云店伞下业绩达到N单后升级为服务商,默认100', 60, 1),
|
|||
|
|
|
|||
|
|
-- 等级升级门槛:服务商→分公司(伞下N单)
|
|||
|
|
(0, 'hjf_level_umbrella_require_4', 'text', 'input', 0,
|
|||
|
|
'', 0, '', 100, 0,
|
|||
|
|
'1000', '分公司升级所需伞下单数', '服务商伞下业绩达到N单后升级为分公司,默认1000', 70, 1),
|
|||
|
|
|
|||
|
|
-- 直推奖励积分:创客直推可得N积分
|
|||
|
|
(0, 'hjf_reward_direct_1', 'text', 'input', 0,
|
|||
|
|
'', 0, '', 100, 0,
|
|||
|
|
'500', '创客直推奖励积分', '创客等级直推一单报单商品可获得的冻结积分,默认500', 80, 1),
|
|||
|
|
|
|||
|
|
-- 直推奖励积分:云店
|
|||
|
|
(0, 'hjf_reward_direct_2', 'text', 'input', 0,
|
|||
|
|
'', 0, '', 100, 0,
|
|||
|
|
'800', '云店直推奖励积分', '云店等级直推一单报单商品可获得的冻结积分,默认800', 90, 1),
|
|||
|
|
|
|||
|
|
-- 直推奖励积分:服务商
|
|||
|
|
(0, 'hjf_reward_direct_3', 'text', 'input', 0,
|
|||
|
|
'', 0, '', 100, 0,
|
|||
|
|
'1000', '服务商直推奖励积分', '服务商等级直推一单报单商品可获得的冻结积分,默认1000', 100, 1),
|
|||
|
|
|
|||
|
|
-- 直推奖励积分:分公司
|
|||
|
|
(0, 'hjf_reward_direct_4', 'text', 'input', 0,
|
|||
|
|
'', 0, '', 100, 0,
|
|||
|
|
'1300', '分公司直推奖励积分', '分公司等级直推一单报单商品可获得的冻结积分,默认1300', 110, 1),
|
|||
|
|
|
|||
|
|
-- 伞下奖励积分:创客(无伞下奖励)
|
|||
|
|
(0, 'hjf_reward_umbrella_1', 'text', 'input', 0,
|
|||
|
|
'', 0, '', 100, 0,
|
|||
|
|
'0', '创客伞下奖励积分', '创客等级伞下奖励积分(级差),默认0(无伞下奖励)', 120, 1),
|
|||
|
|
|
|||
|
|
-- 伞下奖励积分:云店
|
|||
|
|
(0, 'hjf_reward_umbrella_2', 'text', 'input', 0,
|
|||
|
|
'', 0, '', 100, 0,
|
|||
|
|
'300', '云店伞下奖励积分', '云店等级伞下奖励积分(级差),默认300', 130, 1),
|
|||
|
|
|
|||
|
|
-- 伞下奖励积分:服务商
|
|||
|
|
(0, 'hjf_reward_umbrella_3', 'text', 'input', 0,
|
|||
|
|
'', 0, '', 100, 0,
|
|||
|
|
'200', '服务商伞下奖励积分', '服务商等级伞下奖励积分(级差),默认200', 140, 1),
|
|||
|
|
|
|||
|
|
-- 伞下奖励积分:分公司
|
|||
|
|
(0, 'hjf_reward_umbrella_4', 'text', 'input', 0,
|
|||
|
|
'', 0, '', 100, 0,
|
|||
|
|
'300', '分公司伞下奖励积分', '分公司等级伞下奖励积分(级差),默认300', 150, 1);
|
|||
|
|
|
|||
|
|
|
|||
|
|
-- ============================================================
|
|||
|
|
-- 迁移完成校验(可手动执行检查)
|
|||
|
|
-- ============================================================
|
|||
|
|
|
|||
|
|
-- SELECT TABLE_NAME FROM information_schema.TABLES
|
|||
|
|
-- WHERE TABLE_SCHEMA = DATABASE()
|
|||
|
|
-- AND TABLE_NAME IN ('eb_queue_pool', 'eb_points_release_log');
|
|||
|
|
|
|||
|
|
-- SELECT COLUMN_NAME FROM information_schema.COLUMNS
|
|||
|
|
-- WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'eb_user'
|
|||
|
|
-- AND COLUMN_NAME IN ('member_level','no_assess','frozen_points','available_points');
|
|||
|
|
|
|||
|
|
-- SELECT COLUMN_NAME FROM information_schema.COLUMNS
|
|||
|
|
-- WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'eb_store_product'
|
|||
|
|
-- AND COLUMN_NAME IN ('is_queue_goods','allow_pay_types');
|
|||
|
|
|
|||
|
|
-- SELECT menu_name, value FROM eb_system_config
|
|||
|
|
-- WHERE menu_name LIKE 'hjf_%' ORDER BY sort;
|