mahjong_group/server/数据库/SqlServer/更新脚本_预约时段优化.sql
2026-01-01 14:35:52 +08:00

251 lines
8.1 KiB
Transact-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.

-- =============================================
-- 预约系统按时段优化 - 数据库迁移脚本
-- 创建时间: 2025-12-06
-- 说明: 新增房间时段价格表,修改现有表结构
-- =============================================
USE [您的数据库名称]
GO
-- =============================================
-- 1. 创建房间时段价格表 SQRoomPricing
-- =============================================
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SQRoomPricing]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[SQRoomPricing](
[id] [int] IDENTITY(1,1) NOT NULL,
[room_id] [int] NOT NULL,
[time_slot_type] [int] NOT NULL,
[standard_price] [decimal](10, 2) NOT NULL,
[member_price] [decimal](10, 2) NOT NULL,
[price_desc_standard] [nvarchar](100) NULL,
[price_desc_member] [nvarchar](100) NULL,
[effective_date_start] [date] NULL,
[effective_date_end] [date] NULL,
[is_active] [bit] NOT NULL DEFAULT 1,
[created_at] [datetime] NOT NULL DEFAULT GETDATE(),
[updated_at] [datetime] NOT NULL DEFAULT GETDATE(),
CONSTRAINT [PK_SQRoomPricing] PRIMARY KEY CLUSTERED ([id] ASC)
)
-- 创建索引
CREATE NONCLUSTERED INDEX [IX_SQRoomPricing_RoomSlot] ON [dbo].[SQRoomPricing]
(
[room_id] ASC,
[time_slot_type] ASC
)
CREATE NONCLUSTERED INDEX [IX_SQRoomPricing_EffectiveDate] ON [dbo].[SQRoomPricing]
(
[effective_date_start] ASC,
[effective_date_end] ASC
)
PRINT '✓ 表 SQRoomPricing 创建成功'
END
ELSE
BEGIN
PRINT '× 表 SQRoomPricing 已存在'
END
GO
-- =============================================
-- 2. 修改 SQRooms 表,添加新字段
-- =============================================
-- 添加 room_type_name 字段
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID(N'[dbo].[SQRooms]') AND name = 'room_type_name')
BEGIN
ALTER TABLE [dbo].[SQRooms] ADD [room_type_name] [nvarchar](50) NULL
PRINT '✓ SQRooms.room_type_name 字段添加成功'
END
ELSE
BEGIN
PRINT '× SQRooms.room_type_name 字段已存在'
END
GO
-- 添加 sort_order 字段
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID(N'[dbo].[SQRooms]') AND name = 'sort_order')
BEGIN
ALTER TABLE [dbo].[SQRooms] ADD [sort_order] [int] NULL DEFAULT 0
PRINT '✓ SQRooms.sort_order 字段添加成功'
END
ELSE
BEGIN
PRINT '× SQRooms.sort_order 字段已存在'
END
GO
-- =============================================
-- 3. 修改 SQRoomUnavailableTimes 表,添加新字段
-- =============================================
-- 添加 time_slot_type 字段
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID(N'[dbo].[SQRoomUnavailableTimes]') AND name = 'time_slot_type')
BEGIN
ALTER TABLE [dbo].[SQRoomUnavailableTimes] ADD [time_slot_type] [int] NULL
PRINT '✓ SQRoomUnavailableTimes.time_slot_type 字段添加成功'
END
ELSE
BEGIN
PRINT '× SQRoomUnavailableTimes.time_slot_type 字段已存在'
END
GO
-- 添加 created_by 字段
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID(N'[dbo].[SQRoomUnavailableTimes]') AND name = 'created_by')
BEGIN
ALTER TABLE [dbo].[SQRoomUnavailableTimes] ADD [created_by] [int] NULL
PRINT '✓ SQRoomUnavailableTimes.created_by 字段添加成功'
END
ELSE
BEGIN
PRINT '× SQRoomUnavailableTimes.created_by 字段已存在'
END
GO
-- =============================================
-- 4. 修改 SQReservations 表,添加新字段
-- =============================================
-- 添加 time_slot_type 字段
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID(N'[dbo].[SQReservations]') AND name = 'time_slot_type')
BEGIN
ALTER TABLE [dbo].[SQReservations] ADD [time_slot_type] [int] NULL
PRINT '✓ SQReservations.time_slot_type 字段添加成功'
END
ELSE
BEGIN
PRINT '× SQReservations.time_slot_type 字段已存在'
END
GO
-- 添加 latest_arrival_time 字段
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID(N'[dbo].[SQReservations]') AND name = 'latest_arrival_time')
BEGIN
ALTER TABLE [dbo].[SQReservations] ADD [latest_arrival_time] [datetime] NULL
PRINT '✓ SQReservations.latest_arrival_time 字段添加成功'
END
ELSE
BEGIN
PRINT '× SQReservations.latest_arrival_time 字段已存在'
END
GO
-- 添加 is_solo_mode 字段
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID(N'[dbo].[SQReservations]') AND name = 'is_solo_mode')
BEGIN
ALTER TABLE [dbo].[SQReservations] ADD [is_solo_mode] [bit] NOT NULL DEFAULT 0
PRINT '✓ SQReservations.is_solo_mode 字段添加成功'
END
ELSE
BEGIN
PRINT '× SQReservations.is_solo_mode 字段已存在'
END
GO
-- 添加 actual_price 字段
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID(N'[dbo].[SQReservations]') AND name = 'actual_price')
BEGIN
ALTER TABLE [dbo].[SQReservations] ADD [actual_price] [decimal](10, 2) NULL
PRINT '✓ SQReservations.actual_price 字段添加成功'
END
ELSE
BEGIN
PRINT '× SQReservations.actual_price 字段已存在'
END
GO
-- =============================================
-- 5. 数据初始化:为现有房间创建默认价格配置
-- =============================================
PRINT ''
PRINT '开始初始化房间价格数据...'
GO
-- 为每个房间创建4个时段的默认价格如果还没有的话
INSERT INTO [dbo].[SQRoomPricing]
([room_id], [time_slot_type], [standard_price], [member_price], [price_desc_standard], [price_desc_member], [is_active], [created_at], [updated_at])
SELECT
r.id as room_id,
slots.time_slot_type,
r.price_per_hour * 6 as standard_price, -- 6小时时段
r.price_per_hour * 6 * 0.8 as member_price, -- 会员价8折
CAST(CAST(r.price_per_hour * 6 AS INT) AS NVARCHAR) + '元/时段' as price_desc_standard,
CAST(CAST(r.price_per_hour * 6 * 0.8 AS INT) AS NVARCHAR) + '元/时段' as price_desc_member,
1 as is_active,
GETDATE() as created_at,
GETDATE() as updated_at
FROM [dbo].[SQRooms] r
CROSS JOIN (
SELECT 0 as time_slot_type UNION ALL -- 凌晨
SELECT 1 UNION ALL -- 上午
SELECT 2 UNION ALL -- 下午
SELECT 3 -- 晚上
) slots
WHERE NOT EXISTS (
SELECT 1 FROM [dbo].[SQRoomPricing] p
WHERE p.room_id = r.id
AND p.time_slot_type = slots.time_slot_type
AND p.effective_date_start IS NULL
AND p.effective_date_end IS NULL
)
PRINT '✓ 房间价格数据初始化完成'
GO
-- =============================================
-- 6. 数据迁移:为历史预约记录填充 time_slot_type
-- =============================================
PRINT ''
PRINT '开始迁移历史预约数据...'
GO
UPDATE [dbo].[SQReservations]
SET [time_slot_type] =
CASE
WHEN DATEPART(HOUR, start_time) >= 0 AND DATEPART(HOUR, start_time) < 6 THEN 0 -- 凌晨
WHEN DATEPART(HOUR, start_time) >= 6 AND DATEPART(HOUR, start_time) < 12 THEN 1 -- 上午
WHEN DATEPART(HOUR, start_time) >= 12 AND DATEPART(HOUR, start_time) < 18 THEN 2 -- 下午
ELSE 3 -- 晚上
END
WHERE [time_slot_type] IS NULL
PRINT '✓ 历史预约数据迁移完成'
GO
-- =============================================
-- 7. 更新 room_type_name 字段(如果 room_type 有值)
-- =============================================
UPDATE [dbo].[SQRooms]
SET [room_type_name] = [room_type]
WHERE [room_type] IS NOT NULL AND [room_type_name] IS NULL
PRINT '✓ room_type_name 数据填充完成'
GO
PRINT ''
PRINT '========================================='
PRINT '数据库迁移脚本执行完成!'
PRINT '========================================='
PRINT ''
PRINT '说明:'
PRINT '1. 时段类型定义:'
PRINT ' 0 = 凌晨 (00:00-05:59)'
PRINT ' 1 = 上午 (06:00-11:59)'
PRINT ' 2 = 下午 (12:00-17:59)'
PRINT ' 3 = 晚上 (18:00-23:59)'
PRINT ''
PRINT '2. 默认价格策略:'
PRINT ' 标准价 = 原price_per_hour × 6'
PRINT ' 会员价 = 标准价 × 0.8'
PRINT ''
PRINT '3. 请在后台管理界面调整各时段的实际价格'
PRINT '========================================='
GO