251 lines
8.1 KiB
Transact-SQL
251 lines
8.1 KiB
Transact-SQL
-- =============================================
|
||
-- 预约系统按时段优化 - 数据库迁移脚本
|
||
-- 创建时间: 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
|
||
|