Files
huangjingfen/pro_v3.5.1/database/hjf_migration.sql
apple 434aa8c69d feat(fsgx): 完成全部24项开发任务 Phase1-7
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
2026-03-23 22:32:19 +08:00

272 lines
12 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- ============================================================
-- 黄精粉健康商城 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;