feat(M03-A): 完成门店与房间基础管理

This commit is contained in:
Codex
2026-06-18 14:55:04 +08:00
parent 47094d5309
commit 15139b3962
17 changed files with 1013 additions and 13 deletions
@@ -0,0 +1,26 @@
DELETE FROM qipai_schema_migrations WHERE version = '2026061807';
DROP TABLE IF EXISTS qipai_room_disabled_periods;
ALTER TABLE qipai_rooms
DROP FOREIGN KEY fk_qipai_rooms_category,
DROP COLUMN sort_order,
DROP COLUMN images,
DROP COLUMN tags,
DROP COLUMN operational_status,
DROP COLUMN configuration_status,
DROP COLUMN max_advance_days,
DROP COLUMN max_advance_start_minutes,
DROP COLUMN minimum_minutes,
DROP COLUMN deposit_cents,
DROP COLUMN overnight_price_cents,
DROP COLUMN holiday_price_cents,
DROP COLUMN weekday_price_cents,
DROP COLUMN category_id;
DROP TABLE IF EXISTS qipai_room_categories;
DROP TABLE IF EXISTS qipai_store_business_hours;
ALTER TABLE qipai_stores
DROP COLUMN sort_order,
DROP COLUMN notification_url,
DROP COLUMN wifi_password,
DROP COLUMN wifi_ssid,
DROP COLUMN latitude,
DROP COLUMN longitude;
@@ -0,0 +1,80 @@
ALTER TABLE qipai_stores
ADD COLUMN longitude DECIMAL(10, 7) NULL AFTER address,
ADD COLUMN latitude DECIMAL(10, 7) NULL AFTER longitude,
ADD COLUMN wifi_ssid VARCHAR(128) NOT NULL DEFAULT '' AFTER contact_phone,
ADD COLUMN wifi_password VARCHAR(255) NOT NULL DEFAULT '' AFTER wifi_ssid,
ADD COLUMN notification_url VARCHAR(512) NOT NULL DEFAULT '' AFTER wifi_password,
ADD COLUMN sort_order INT NOT NULL DEFAULT 0 AFTER business_status;
CREATE TABLE IF NOT EXISTS qipai_store_business_hours (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
tenant_id BIGINT UNSIGNED NOT NULL,
store_id BIGINT UNSIGNED NOT NULL,
weekday TINYINT UNSIGNED NOT NULL,
open_minute SMALLINT UNSIGNED NOT NULL,
close_minute SMALLINT UNSIGNED NOT NULL,
is_closed TINYINT(1) NOT NULL DEFAULT 0,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
CONSTRAINT fk_qipai_store_hours_tenant FOREIGN KEY (tenant_id) REFERENCES qipai_tenants(id),
CONSTRAINT fk_qipai_store_hours_store FOREIGN KEY (store_id) REFERENCES qipai_stores(id),
UNIQUE KEY uq_qipai_store_hours_weekday (tenant_id, store_id, weekday),
CONSTRAINT chk_qipai_store_hours_weekday CHECK (weekday BETWEEN 1 AND 7),
CONSTRAINT chk_qipai_store_hours_minute CHECK (open_minute <= 1439 AND close_minute <= 1439)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS qipai_room_categories (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
tenant_id BIGINT UNSIGNED NOT NULL,
store_id BIGINT UNSIGNED NOT NULL,
name VARCHAR(128) NOT NULL,
sort_order INT NOT NULL DEFAULT 0,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
deleted_at DATETIME(3) NULL,
CONSTRAINT fk_qipai_room_categories_tenant FOREIGN KEY (tenant_id) REFERENCES qipai_tenants(id),
CONSTRAINT fk_qipai_room_categories_store FOREIGN KEY (store_id) REFERENCES qipai_stores(id),
UNIQUE KEY uq_qipai_room_categories_name (tenant_id, store_id, name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
ALTER TABLE qipai_rooms
ADD COLUMN category_id BIGINT UNSIGNED NULL AFTER store_id,
ADD COLUMN weekday_price_cents INT UNSIGNED NOT NULL DEFAULT 0 AFTER base_price_cents,
ADD COLUMN holiday_price_cents INT UNSIGNED NOT NULL DEFAULT 0 AFTER weekday_price_cents,
ADD COLUMN overnight_price_cents INT UNSIGNED NOT NULL DEFAULT 0 AFTER holiday_price_cents,
ADD COLUMN deposit_cents INT UNSIGNED NOT NULL DEFAULT 0 AFTER overnight_price_cents,
ADD COLUMN minimum_minutes SMALLINT UNSIGNED NOT NULL DEFAULT 60 AFTER deposit_cents,
ADD COLUMN max_advance_start_minutes SMALLINT UNSIGNED NOT NULL DEFAULT 0 AFTER minimum_minutes,
ADD COLUMN max_advance_days SMALLINT UNSIGNED NOT NULL DEFAULT 30 AFTER max_advance_start_minutes,
ADD COLUMN configuration_status VARCHAR(32) NOT NULL DEFAULT 'ENABLED' AFTER max_advance_days,
ADD COLUMN operational_status VARCHAR(32) NOT NULL DEFAULT 'AVAILABLE' AFTER configuration_status,
ADD COLUMN tags JSON NULL AFTER operational_status,
ADD COLUMN images JSON NULL AFTER tags,
ADD COLUMN sort_order INT NOT NULL DEFAULT 0 AFTER images,
ADD CONSTRAINT fk_qipai_rooms_category FOREIGN KEY (category_id) REFERENCES qipai_room_categories(id);
UPDATE qipai_rooms
SET configuration_status = CASE WHEN status = 'DISABLED' THEN 'DISABLED' ELSE 'ENABLED' END,
operational_status = CASE
WHEN status IN ('MAINTENANCE', 'RESERVED', 'IN_USE', 'CLEANING_REQUIRED') THEN status
ELSE 'AVAILABLE'
END;
CREATE TABLE IF NOT EXISTS qipai_room_disabled_periods (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
tenant_id BIGINT UNSIGNED NOT NULL,
room_id BIGINT UNSIGNED NOT NULL,
starts_at DATETIME(3) NOT NULL,
ends_at DATETIME(3) NOT NULL,
reason VARCHAR(255) NOT NULL DEFAULT '',
created_by BIGINT UNSIGNED NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
CONSTRAINT fk_qipai_room_disabled_tenant FOREIGN KEY (tenant_id) REFERENCES qipai_tenants(id),
CONSTRAINT fk_qipai_room_disabled_room FOREIGN KEY (room_id) REFERENCES qipai_rooms(id),
CONSTRAINT fk_qipai_room_disabled_creator FOREIGN KEY (created_by) REFERENCES qipai_users(id),
KEY idx_qipai_room_disabled_window (tenant_id, room_id, starts_at, ends_at),
CONSTRAINT chk_qipai_room_disabled_window CHECK (ends_at > starts_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT IGNORE INTO qipai_schema_migrations (version, name)
VALUES ('2026061807', 'm03a_store_room_domain');
@@ -0,0 +1,18 @@
SELECT table_name FROM information_schema.tables
WHERE table_schema = DATABASE()
AND table_name IN ('qipai_store_business_hours', 'qipai_room_categories', 'qipai_room_disabled_periods')
ORDER BY table_name;
SELECT column_name FROM information_schema.columns
WHERE table_schema = DATABASE() AND table_name = 'qipai_stores'
AND column_name IN ('longitude', 'latitude', 'wifi_ssid', 'wifi_password', 'notification_url', 'sort_order')
ORDER BY column_name;
SELECT column_name FROM information_schema.columns
WHERE table_schema = DATABASE() AND table_name = 'qipai_rooms'
AND column_name IN ('category_id', 'weekday_price_cents', 'holiday_price_cents',
'overnight_price_cents', 'deposit_cents', 'minimum_minutes', 'max_advance_start_minutes',
'max_advance_days', 'configuration_status', 'operational_status', 'tags', 'images', 'sort_order')
ORDER BY column_name;
SELECT version, name FROM qipai_schema_migrations WHERE version = '2026061807';