Files
hfb_sys/backend/migrations/000095_points_mall.sql
T

115 lines
5.5 KiB
SQL

-- +goose Up
ALTER TABLE users
ADD COLUMN points_available BIGINT NOT NULL DEFAULT 0 COMMENT '积分商城可用积分' AFTER renter_growth_level;
UPDATE users
SET points_available = renter_growth_points
WHERE points_available = 0 AND renter_growth_points > 0;
ALTER TABLE renter_growth_ledger
DROP KEY uk_renter_growth_order_source,
ADD COLUMN role VARCHAR(16) NOT NULL DEFAULT 'renter' COMMENT '积分角色: renter/owner/admin' AFTER user_id,
ADD COLUMN points_multiplier_bps INT NOT NULL DEFAULT 10000 COMMENT '积分倍率基点' AFTER points_per_yuan,
ADD COLUMN available_before BIGINT NOT NULL DEFAULT 0 COMMENT '变动前可用积分' AFTER after_points,
ADD COLUMN available_after BIGINT NOT NULL DEFAULT 0 COMMENT '变动后可用积分' AFTER available_before,
ADD COLUMN redemption_id BIGINT NOT NULL DEFAULT 0 COMMENT '积分商城兑换单 ID' AFTER order_id,
ADD COLUMN biz_key VARCHAR(128) NULL COMMENT '幂等业务键' AFTER source,
ADD UNIQUE KEY uk_renter_growth_biz_key (biz_key),
ADD UNIQUE KEY uk_renter_growth_order_role_source (order_id, source, role),
ADD KEY idx_renter_growth_user_role_created (user_id, role, created_at);
ALTER TABLE rental_orders
ADD COLUMN growth_points_multiplier_bps INT NOT NULL DEFAULT 10000 COMMENT '租客积分倍率基点' AFTER growth_points_per_yuan,
ADD COLUMN owner_growth_points_basis_cent BIGINT NOT NULL DEFAULT 0 COMMENT '卖家积分基数(分)' AFTER growth_points_awarded_at,
ADD COLUMN owner_growth_points_per_yuan BIGINT NOT NULL DEFAULT 0 COMMENT '卖家基础每元积分' AFTER owner_growth_points_basis_cent,
ADD COLUMN owner_growth_points_multiplier_bps INT NOT NULL DEFAULT 10000 COMMENT '卖家积分倍率基点' AFTER owner_growth_points_per_yuan,
ADD COLUMN owner_growth_points_awarded BIGINT NOT NULL DEFAULT 0 COMMENT '卖家已发放积分' AFTER owner_growth_points_multiplier_bps,
ADD COLUMN owner_growth_points_awarded_at DATETIME NULL COMMENT '卖家积分发放时间' AFTER owner_growth_points_awarded;
CREATE TABLE IF NOT EXISTS points_mall_products (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
title VARCHAR(128) NOT NULL,
subtitle VARCHAR(255) NOT NULL DEFAULT '',
description TEXT NOT NULL,
cover_url VARCHAR(512) NOT NULL DEFAULT '',
redemption_instructions TEXT NOT NULL,
points_price BIGINT NOT NULL DEFAULT 0,
stock BIGINT NOT NULL DEFAULT 0,
redeemed_count BIGINT NOT NULL DEFAULT 0,
per_user_limit INT NOT NULL DEFAULT 1,
status VARCHAR(16) NOT NULL DEFAULT 'offline',
sort_order INT NOT NULL DEFAULT 0,
created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
updated_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY (id),
KEY idx_points_mall_products_status_sort (status, sort_order, id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='积分商城虚拟商品';
CREATE TABLE IF NOT EXISTS points_mall_redemptions (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
redemption_no VARCHAR(32) NOT NULL,
user_id BIGINT UNSIGNED NOT NULL,
product_id BIGINT UNSIGNED NOT NULL,
product_title VARCHAR(128) NOT NULL,
product_cover_url VARCHAR(512) NOT NULL DEFAULT '',
redemption_instructions TEXT NOT NULL,
points_price BIGINT NOT NULL DEFAULT 0,
quantity INT NOT NULL DEFAULT 1,
total_points BIGINT NOT NULL DEFAULT 0,
status VARCHAR(16) NOT NULL DEFAULT 'pending',
admin_remark VARCHAR(255) NOT NULL DEFAULT '',
completed_by BIGINT UNSIGNED NULL,
completed_at DATETIME NULL,
created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
updated_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY (id),
UNIQUE KEY uk_points_mall_redemption_no (redemption_no),
KEY idx_points_mall_redemptions_user (user_id, created_at),
KEY idx_points_mall_redemptions_status (status, created_at),
KEY idx_points_mall_redemptions_product (product_id, user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='积分商城兑换记录';
INSERT INTO permissions (code, name, resource, action)
VALUES
('points_mall:view', '查看积分商城', 'points_mall', 'view'),
('points_mall:manage', '管理积分商城', 'points_mall', 'manage')
ON DUPLICATE KEY UPDATE name = VALUES(name), resource = VALUES(resource), action = VALUES(action);
INSERT IGNORE INTO role_permissions (role_id, permission_id)
SELECT r.id, p.id
FROM roles r
JOIN permissions p ON p.code IN ('points_mall:view', 'points_mall:manage')
WHERE r.code IN ('super_admin', 'ops');
-- +goose Down
DELETE FROM role_permissions
WHERE permission_id IN (
SELECT id FROM permissions WHERE code IN ('points_mall:view', 'points_mall:manage')
);
DELETE FROM permissions WHERE code IN ('points_mall:view', 'points_mall:manage');
DROP TABLE IF EXISTS points_mall_redemptions;
DROP TABLE IF EXISTS points_mall_products;
ALTER TABLE rental_orders
DROP COLUMN owner_growth_points_awarded_at,
DROP COLUMN owner_growth_points_awarded,
DROP COLUMN owner_growth_points_multiplier_bps,
DROP COLUMN owner_growth_points_per_yuan,
DROP COLUMN owner_growth_points_basis_cent,
DROP COLUMN growth_points_multiplier_bps;
ALTER TABLE renter_growth_ledger
DROP KEY idx_renter_growth_user_role_created,
DROP KEY uk_renter_growth_order_role_source,
DROP KEY uk_renter_growth_biz_key,
DROP COLUMN biz_key,
DROP COLUMN redemption_id,
DROP COLUMN available_after,
DROP COLUMN available_before,
DROP COLUMN points_multiplier_bps,
DROP COLUMN role,
ADD UNIQUE KEY uk_renter_growth_order_source (order_id, source);
ALTER TABLE users
DROP COLUMN points_available;