Phase1 后端核心:
- 新增 fsgx_v1.sql 迁移脚本(is_queue_goods/frozen_points/available_points/no_assess)
- SystemConfigServices 返佣设置扩展(周期人数/分档比例/范围/时机)
- StoreOrderCreateServices 周期循环佣金计算
- StoreOrderTakeServices 佣金发放后同步冻结积分
- StoreProductServices/StoreProduct 保存 is_queue_goods
Phase2 后端接口:
- GET /api/hjf/brokerage/progress 佣金周期进度
- GET /api/hjf/assets/overview 资产总览
- HjfPointsServices 每日 frozen_points 0.4‰ 释放定时任务
- PUT /adminapi/hjf/member/{uid}/no_assess 不考核接口
- GET /adminapi/hjf/points/release_log 积分日志接口
Phase3 前端清理:
- hjfCustom.js 路由精简(仅保留 points/log)
- hjfQueue.js/hjfMember.js API 清理/重定向至 CRMEB 原生接口
- pages.json 公排→推荐佣金/佣金记录/佣金规则
Phase4-5 前端改造:
- queue/status.vue 推荐佣金进度页整体重写
- 商品详情/订单确认/支付结果页文案与逻辑改造
- 个人中心/资产页/引导页/规则页文案改造
- HjfQueueProgress/HjfRefundNotice/HjfAssetCard 组件改造
- 推广中心嵌入佣金进度摘要
- hjfMockData.js 全量更新(公排字段→佣金字段)
Phase6 Admin 增强:
- 用户列表新增 frozen_points/available_points 列及不考核操作按钮
- hjfPoints.js USE_MOCK=false 对接真实积分日志接口
Phase7 配置文档:
- docs/fsgx-phase7-config-checklist.md 后台配置与全链路验收清单
Made-with: Cursor
272 lines
12 KiB
SQL
272 lines
12 KiB
SQL
-- ============================================================
|
||
-- 黄精粉健康商城 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;
|