-- 单店茶室预约、分端 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);