feat:增加伪装方便ios上架

This commit is contained in:
dzc committed 2026-11-12 14:03:09 +08:00
1 parent fc36d1b17a
commit f3acddd021
70 files changed
+3282 -191

No files matched your search

+121
View File
@@ -0,0 +1,121 @@
-- 单店茶室预约、分端 App 类型及人工注销申请。MySQL 5.7 / 8.0。
-- 仅新增表和设置页菜单权限,不更改既有聊天数据,不填入虚构门店、包间或预约。
-- 部署顺序:确认目标库并执行本脚本 -> Java -> 授予设置页权限 -> PC -> 重新打包 App。
-- 读取未配置设置时默认三端均为聊天。所有配置与记录通过既有租户组件访问。
CREATE TABLE IF NOT EXISTS member_app_setting (
id bigint NOT NULL AUTO_INCREMENT,
config_key varchar(32) NOT NULL DEFAULT 'main',
config_json mediumtext NOT NULL COMMENT '经服务端校验的模式与公开门店资料',
creator varchar(64) DEFAULT '',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
updater varchar(64) DEFAULT '',
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted bit(1) NOT NULL DEFAULT b'0',
tenant_id bigint NOT NULL DEFAULT 0,
PRIMARY KEY (id),
UNIQUE KEY uk_app_setting (tenant_id, config_key, deleted)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='App模式和单店设置';
CREATE TABLE IF NOT EXISTS member_tea_room (
id bigint NOT NULL AUTO_INCREMENT,
name varchar(80) NOT NULL,
cover varchar(2048) NOT NULL,
capacity int NOT NULL,
facilities text NOT NULL COMMENT 'JSON字符串数组',
description varchar(2000) NOT NULL DEFAULT '',
price int NOT NULL COMMENT '每个预约时段价格,单位分,到店付款',
sort int NOT NULL DEFAULT 0,
enabled bit(1) NOT NULL DEFAULT b'1',
creator varchar(64) DEFAULT '',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
updater varchar(64) DEFAULT '',
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted bit(1) NOT NULL DEFAULT b'0',
tenant_id bigint NOT NULL DEFAULT 0,
PRIMARY KEY (id),
KEY idx_tea_room_list (tenant_id, enabled, sort)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='茶室包间';
CREATE TABLE IF NOT EXISTS member_tea_booking (
id bigint NOT NULL AUTO_INCREMENT,
booking_no varchar(40) NOT NULL,
member_id bigint NOT NULL,
room_id bigint NOT NULL,
room_name varchar(80) NOT NULL,
room_cover varchar(2048) NOT NULL,
store_name varchar(80) NOT NULL,
store_address varchar(300) NOT NULL,
store_phone varchar(30) NOT NULL,
date date NOT NULL COMMENT '中国标准时间预约日期',
start_time varchar(5) NOT NULL,
end_time varchar(5) NOT NULL,
start_at datetime NOT NULL,
end_at datetime NOT NULL,
persons int NOT NULL,
contact_name varchar(40) NOT NULL,
contact_phone varchar(30) NOT NULL,
remark varchar(500) NOT NULL DEFAULT '',
price int NOT NULL COMMENT '提交时价格快照,单位分',
status varchar(16) NOT NULL DEFAULT 'pending' COMMENT 'pending/confirmed/completed/cancelled/rejected;过时pending对外计算expired',
reason varchar(500) NOT NULL DEFAULT '',
request_id varchar(64) DEFAULT NULL,
request_hash char(64) NOT NULL,
creator varchar(64) DEFAULT '',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
updater varchar(64) DEFAULT '',
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted bit(1) NOT NULL DEFAULT b'0',
tenant_id bigint NOT NULL DEFAULT 0,
PRIMARY KEY (id),
UNIQUE KEY uk_tea_booking_no (tenant_id, booking_no),
UNIQUE KEY uk_tea_booking_request (tenant_id, member_id, request_id),
KEY idx_tea_booking_room_time (tenant_id, room_id, status, start_at, end_at),
KEY idx_tea_booking_member (tenant_id, member_id, id),
KEY idx_tea_booking_admin (tenant_id, date, status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='茶室预约申请与确认';
CREATE TABLE IF NOT EXISTS member_account_closure_request (
id bigint NOT NULL AUTO_INCREMENT,
member_id bigint NOT NULL,
nickname varchar(80) DEFAULT '',
contact_phone varchar(30) DEFAULT '',
reason varchar(500) NOT NULL DEFAULT '',
status varchar(16) NOT NULL DEFAULT 'pending' COMMENT 'pending/processing/resolved/rejected;resolved仅表示申请已人工处理',
process_remark varchar(1000) NOT NULL DEFAULT '',
creator varchar(64) DEFAULT '',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
updater varchar(64) DEFAULT '',
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted bit(1) NOT NULL DEFAULT b'0',
tenant_id bigint NOT NULL DEFAULT 0,
active_flag tinyint GENERATED ALWAYS AS (CASE WHEN deleted = 0 AND status IN ('pending','processing') THEN 1 ELSE NULL END) STORED,
PRIMARY KEY (id),
UNIQUE KEY uk_account_closure_active (tenant_id, member_id, active_flag),
KEY idx_account_closure_page (tenant_id, status, id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='人工注销账号申请,不自动删除账号';
-- 优先复用已配置的设置页面,保持既有角色关联。
SET @tea_setting_menu_id = (SELECT MIN(id) FROM system_menu WHERE component='app/setting/index' AND deleted=0);
SET @tea_app_parent_id = (SELECT parent_id FROM system_menu WHERE id=@tea_setting_menu_id);
SET @tea_app_parent_id = COALESCE(@tea_app_parent_id,
(SELECT MIN(id) FROM system_menu WHERE type=1 AND path IN ('app','/app') AND deleted=0));
INSERT INTO system_menu (name,permission,type,sort,parent_id,path,icon,component,status,visible,keep_alive,always_show,creator,updater,deleted)
SELECT '应用管理','',1,30,0,'app','ep:iphone',NULL,0,b'1',b'1',b'1','1','1',b'0'
WHERE @tea_app_parent_id IS NULL;
SET @tea_app_parent_id = COALESCE(@tea_app_parent_id,
(SELECT MIN(id) FROM system_menu WHERE type=1 AND path IN ('app','/app') AND deleted=0));
INSERT INTO system_menu (name,permission,type,sort,parent_id,path,icon,component,component_name,status,visible,keep_alive,always_show,creator,updater,deleted)
SELECT '应用设置','app:setting:query',2,20,@tea_app_parent_id,'setting','ep:setting','app/setting/index','AppSetting',0,b'1',b'1',b'1','1','1',b'0'
WHERE @tea_setting_menu_id IS NULL;
SET @tea_setting_menu_id = (SELECT MIN(id) FROM system_menu WHERE component='app/setting/index' AND deleted=0);
UPDATE system_menu SET permission='app:setting:query',component_name='AppSetting',update_time=CURRENT_TIMESTAMP WHERE id=@tea_setting_menu_id;
INSERT INTO system_menu (name,permission,type,sort,parent_id,path,status,visible,keep_alive,always_show,creator,updater,deleted)
SELECT buttons.name,buttons.permission,3,buttons.sort,@tea_setting_menu_id,'',0,b'1',b'1',b'1','1','1',b'0'
FROM (
SELECT '设置查询' name,'app:setting:query' permission,1 sort
UNION ALL SELECT '设置与包间维护','app:setting:update',2
UNION ALL SELECT '预约与注销申请处理','app:setting:booking',3
) buttons
WHERE NOT EXISTS (SELECT 1 FROM system_menu m WHERE m.permission=buttons.permission AND m.type=3 AND m.deleted=0);
@@ -0,0 +1,46 @@
-- 在停止旧版本绑定写入及支付回调后执行。先执行本文件,再核对并回填充值首奖。
-- MySQL 5.7 / 8.0,数据库结构升级仅执行一次。新旧分佣实例不能同时运行。
ALTER TABLE trade_brokerage_user ADD COLUMN bind_version BIGINT NOT NULL DEFAULT 0 COMMENT '分销关系版本';
ALTER TABLE trade_brokerage_record ADD COLUMN biz_scene VARCHAR(32) NULL COMMENT '资金来源 ORDER/RECHARGE/MEMBERSHIP';
CREATE TABLE IF NOT EXISTS trade_brokerage_relation_guard (
id BIGINT NOT NULL PRIMARY KEY
) ENGINE=InnoDB COMMENT='分销关系修改互斥锁';
INSERT INTO trade_brokerage_relation_guard (id) VALUES (1) ON DUPLICATE KEY UPDATE id=id;
CREATE TABLE IF NOT EXISTS trade_brokerage_bind_log (
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT NOT NULL,
old_bind_user_id BIGINT NULL,
new_bind_user_id BIGINT NULL,
old_bind_user_time DATETIME NULL,
new_bind_user_time DATETIME NULL,
old_version BIGINT NOT NULL,
new_version BIGINT NOT NULL,
operator_id BIGINT NULL,
source VARCHAR(32) NOT NULL,
reason VARCHAR(500) NOT NULL,
request_id VARCHAR(64) NOT NULL,
creator VARCHAR(64) DEFAULT '',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updater VARCHAR(64) DEFAULT '',
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted BIT(1) NOT NULL DEFAULT b'0',
tenant_id BIGINT NOT NULL DEFAULT 0,
UNIQUE KEY uk_tenant_request (tenant_id, request_id),
KEY idx_user_id (user_id, id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='分销上级变更记录';
CREATE TABLE IF NOT EXISTS trade_brokerage_recharge_reward (
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
source_user_id BIGINT NOT NULL,
recharge_id VARCHAR(64) NOT NULL,
evidence_record_id BIGINT NULL,
creator VARCHAR(64) DEFAULT '',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updater VARCHAR(64) DEFAULT '',
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted BIT(1) NOT NULL DEFAULT b'0',
tenant_id BIGINT NOT NULL DEFAULT 0,
UNIQUE KEY uk_tenant_source (tenant_id, source_user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='永久充值首奖发放凭据,退款或删流水不恢复资格';
@@ -0,0 +1,79 @@
-- 执行前暂停绑定写入和支付回调,并先运行 20261112_brokerage_bind_management.sql。
-- 必须在同一连接明确设置运行中的租户开关(0=关闭,1=开启)。
-- SET @brokerage_tenant_enabled = 0;
-- 默认只生成核对清单。确认清单后,在同一连接设置下面变量再执行本文件以回填。
-- SET @apply_brokerage_reward_backfill = 1;
-- 存在未确认记录时回填会报错。需结合备份及原始凭据核对后形成专门的资格回填语句。
-- 不修改金额、余额和历史收益人。已取消/已软删除的首奖同样占用资格。
DROP PROCEDURE IF EXISTS backfill_brokerage_recharge_reward;
DELIMITER $$
CREATE PROCEDURE backfill_brokerage_recharge_reward()
SQL SECURITY INVOKER
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
RESIGNAL;
END;
IF @brokerage_tenant_enabled IS NULL OR @brokerage_tenant_enabled NOT IN (0, 1) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Set @brokerage_tenant_enabled to the actual runtime value (0 or 1)';
END IF;
DROP TEMPORARY TABLE IF EXISTS brokerage_reward_review;
CREATE TEMPORARY TABLE brokerage_reward_review AS
SELECT b.id AS record_id, b.source_user_id,
CASE WHEN @brokerage_tenant_enabled = 1 THEN b.tenant_id ELSE 0 END AS target_tenant_id,
b.biz_id AS recharge_id, b.create_time,
CASE
WHEN b.biz_scene = 'MEMBERSHIP' THEN 'OTHER'
WHEN b.biz_scene = 'ORDER' THEN 'OTHER'
WHEN b.title REGEXP '^用户\\[.*\\]充值\\[[0-9]+(\\.[0-9]{1,2})?\\]元$'
AND b.source_user_id IS NOT NULL AND b.source_user_id > 0
AND r.id IS NOT NULL AND w.user_id = b.source_user_id
AND CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(b.title, '充值[', -1), ']', 1) AS DECIMAL(18,2)) * 100 = r.pay_price
AND (@brokerage_tenant_enabled = 0 OR (b.tenant_id = r.tenant_id AND r.tenant_id = w.tenant_id))
AND NOT (b.title LIKE '%成功购买%' AND oi.id IS NOT NULL AND oi.user_id = b.source_user_id)
THEN 'RECHARGE'
WHEN (b.title LIKE '%提现%' OR b.description LIKE '%提现%') AND COALESCE(b.biz_scene, '') <> 'RECHARGE' THEN 'OTHER'
WHEN b.title LIKE '%成功购买%' AND oi.id IS NOT NULL AND oi.user_id = b.source_user_id
AND b.title NOT LIKE '%充值[%'
AND (@brokerage_tenant_enabled = 0 OR b.tenant_id = oi.tenant_id) THEN 'OTHER'
ELSE 'REVIEW_REQUIRED'
END AS classification
FROM trade_brokerage_record b
LEFT JOIN pay_wallet_recharge r ON CAST(r.id AS CHAR) = b.biz_id
LEFT JOIN pay_wallet w ON w.id = r.wallet_id
LEFT JOIN trade_order_item oi ON CAST(oi.id AS CHAR) = b.biz_id
WHERE b.biz_type = 1 AND b.price > 0;
SELECT classification, COUNT(*) AS record_count FROM brokerage_reward_review GROUP BY classification;
SELECT record_id, source_user_id, recharge_id, target_tenant_id
FROM brokerage_reward_review WHERE classification = 'REVIEW_REQUIRED' ORDER BY record_id;
IF COALESCE(@apply_brokerage_reward_backfill, 0) = 1 THEN
IF EXISTS (SELECT 1 FROM brokerage_reward_review WHERE classification = 'REVIEW_REQUIRED') THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Unresolved historical brokerage records. Backfill was not applied';
END IF;
DROP TEMPORARY TABLE IF EXISTS brokerage_reward_first;
CREATE TEMPORARY TABLE brokerage_reward_first AS
SELECT target_tenant_id, source_user_id, MIN(record_id) AS first_record_id
FROM brokerage_reward_review WHERE classification = 'RECHARGE'
GROUP BY target_tenant_id, source_user_id;
START TRANSACTION;
INSERT INTO trade_brokerage_recharge_reward
(source_user_id, recharge_id, evidence_record_id, create_time, creator, tenant_id)
SELECT evidence.source_user_id, evidence.recharge_id, evidence.record_id,
COALESCE(evidence.create_time, CURRENT_TIMESTAMP), 'history-backfill', evidence.target_tenant_id
FROM brokerage_reward_review evidence
INNER JOIN brokerage_reward_first first_reward ON first_reward.first_record_id = evidence.record_id
ON DUPLICATE KEY UPDATE source_user_id = trade_brokerage_recharge_reward.source_user_id;
UPDATE trade_brokerage_record b
INNER JOIN brokerage_reward_review evidence ON evidence.record_id = b.id AND evidence.classification = 'RECHARGE'
SET b.biz_scene = 'RECHARGE' WHERE b.biz_scene IS NULL;
COMMIT;
SELECT COUNT(*) AS permanent_reward_count FROM trade_brokerage_recharge_reward;
END IF;
END$$
DELIMITER ;
CALL backfill_brokerage_recharge_reward();
DROP PROCEDURE backfill_brokerage_recharge_reward;