From 9e618a284ccdc4052d89c4332c19d49910d262b5 Mon Sep 17 00:00:00 2001 From: phxk4csow <357827386@qq.com> Date: Sun, 29 Dec 2024 12:58:41 +0800 Subject: [PATCH] ADD file via upload --- hotelmanagementsystem.sql | 600 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 600 insertions(+) create mode 100644 hotelmanagementsystem.sql diff --git a/hotelmanagementsystem.sql b/hotelmanagementsystem.sql new file mode 100644 index 0000000..e07f133 --- /dev/null +++ b/hotelmanagementsystem.sql @@ -0,0 +1,600 @@ +/* + Navicat Premium Dump SQL + + Source Server : local + Source Server Type : MySQL + Source Server Version : 80039 (8.0.39) + Source Host : localhost:3306 + Source Schema : hotelmanagementsystem + + Target Server Type : MySQL + Target Server Version : 80039 (8.0.39) + File Encoding : 65001 + + Date: 29/12/2024 09:31:18 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for customer +-- ---------------------------- +DROP TABLE IF EXISTS `customer`; +CREATE TABLE `customer` ( + `CustomerID` int NOT NULL AUTO_INCREMENT, + `Name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `Gender` enum('Male','Female') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `Age` int NULL DEFAULT NULL, + `ContactInfo` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `Address` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL, + `IDCardNumber` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + PRIMARY KEY (`CustomerID`) USING BTREE, + UNIQUE INDEX `IDCardNumber`(`IDCardNumber` ASC) USING BTREE, + INDEX `idx_customer_name`(`Name` ASC) USING BTREE, + CONSTRAINT `customer_chk_1` CHECK ((`Age` >= 0) and (`Age` <= 120)) +) ENGINE = InnoDB AUTO_INCREMENT = 18 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of customer +-- ---------------------------- +INSERT INTO `customer` VALUES (2, 'Bob Smith', 'Male', 35, 'bob.smith@gmail.com', '456 Elm St, Springfield', '987654321098765432'); +INSERT INTO `customer` VALUES (3, 'Charlie Brown', 'Male', 22, 'charlie.brown@gmail.com', '789 Pine St, Springfield', '123123123123123123'); +INSERT INTO `customer` VALUES (4, 'Diana Prince', 'Female', 30, 'diana.prince@gmail.com', '321 Oak St, Springfield', '321321321321321321'); +INSERT INTO `customer` VALUES (5, 'Eve Adams', 'Female', 40, 'eve.adams@gmail.com', '654 Maple St, Springfield', '654654654654654654'); +INSERT INTO `customer` VALUES (6, 'Frank Miller', 'Male', 29, 'frank.miller@gmail.com', '987 Cedar St, Springfield', '987987987987987987'); +INSERT INTO `customer` VALUES (7, 'Grace Lee', 'Female', 33, 'grace.lee@gmail.com', '147 Birch St, Springfield', '741741741741741741'); +INSERT INTO `customer` VALUES (8, 'Hank Green', 'Male', 45, 'hank.green@gmail.com', '258 Willow St, Springfield', '852852852852852852'); +INSERT INTO `customer` VALUES (9, 'Ivy Wilson', 'Female', 25, 'ivy.wilson@gmail.com', '369 Ash St, Springfield', '963963963963963963'); +INSERT INTO `customer` VALUES (10, 'Jack White', 'Male', 38, 'jack.white@gmail.com', '159 Poplar St, Springfield', '159159159159159159'); +INSERT INTO `customer` VALUES (11, '盖良琛', 'Male', 20, '', 'SDUST', '202211071402'); +INSERT INTO `customer` VALUES (12, '张闰清', 'Male', 20, '', 'China', '202211071430'); +INSERT INTO `customer` VALUES (14, '张三', 'Male', 30, '123456789', 'Beijing', '123456789'); +INSERT INTO `customer` VALUES (15, 'Anna', 'Female', 25, '', '', '370000'); +INSERT INTO `customer` VALUES (16, '李四', 'Female', 58, '', '', '15655'); +INSERT INTO `customer` VALUES (17, 'alice', 'Male', 30, '123@163.com', 'America', '42005'); + +-- ---------------------------- +-- Table structure for customerlog +-- ---------------------------- +DROP TABLE IF EXISTS `customerlog`; +CREATE TABLE `customerlog` ( + `LogID` int NOT NULL AUTO_INCREMENT, + `CustomerID` int NULL DEFAULT NULL, + `Name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `CreatedDate` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`LogID`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of customerlog +-- ---------------------------- +INSERT INTO `customerlog` VALUES (1, 14, '张三', '2024-12-28 14:52:53'); +INSERT INTO `customerlog` VALUES (2, 15, 'Anna', '2024-12-28 15:24:50'); +INSERT INTO `customerlog` VALUES (3, 16, '李四', '2024-12-28 19:05:06'); +INSERT INTO `customerlog` VALUES (4, 17, 'alice', '2024-12-28 19:59:49'); + +-- ---------------------------- +-- Table structure for employee +-- ---------------------------- +DROP TABLE IF EXISTS `employee`; +CREATE TABLE `employee` ( + `EmployeeID` int NOT NULL AUTO_INCREMENT, + `Name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `Gender` enum('Male','Female') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `Age` int NULL DEFAULT NULL, + `ContactInfo` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `Position` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `HireDate` date NOT NULL, + `Salary` decimal(10, 2) NOT NULL, + PRIMARY KEY (`EmployeeID`) USING BTREE, + INDEX `idx_employee_position`(`Position` ASC) USING BTREE, + CONSTRAINT `employee_chk_1` CHECK ((`Age` >= 18) and (`Age` <= 65)), + CONSTRAINT `employee_chk_2` CHECK (`Salary` >= 0) +) ENGINE = InnoDB AUTO_INCREMENT = 24 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of employee +-- ---------------------------- +INSERT INTO `employee` VALUES (1, 'Alice Manager', 'Female', 40, 'alice.manager@hotel.com', 'Manager', '2015-03-01', 6000.00); +INSERT INTO `employee` VALUES (2, 'Bob Cleaner', 'Male', 30, 'bob.cleaner@hotel.com', 'Cleaner', '2018-05-10', 3000.00); +INSERT INTO `employee` VALUES (3, 'Charlie FrontDesk', 'Male', 28, 'charlie.frontdesk@hotel.com', 'Front Desk', '2020-01-15', 3500.00); +INSERT INTO `employee` VALUES (4, 'Diana Waitress', 'Female', 25, 'diana.waitress@hotel.com', 'Waitress', '2019-07-20', 3200.00); +INSERT INTO `employee` VALUES (5, 'Eve Chef', 'Female', 35, 'eve.chef@hotel.com', 'Chef', '2016-11-11', 5000.00); +INSERT INTO `employee` VALUES (6, 'Frank Technician', 'Male', 42, 'frank.technician@hotel.com', 'Technician', '2014-06-25', 4500.00); +INSERT INTO `employee` VALUES (7, 'Grace Supervisor', 'Female', 38, 'grace.supervisor@hotel.com', 'Supervisor', '2013-09-30', 5500.00); +INSERT INTO `employee` VALUES (8, 'Hank Security', 'Male', 50, 'hank.security@hotel.com', 'Security', '2012-02-15', 3300.00); +INSERT INTO `employee` VALUES (9, 'Ivy Receptionist', 'Female', 29, 'ivy.receptionist@hotel.com', 'Receptionist', '2017-12-01', 3400.00); +INSERT INTO `employee` VALUES (10, 'Jack Porter', 'Male', 33, 'jack.porter@hotel.com', 'Porter', '2021-04-20', 3100.00); +INSERT INTO `employee` VALUES (11, 'Kelly IT', 'Female', 26, 'kelly.it@hotel.com', 'IT Support', '2022-01-01', 3600.00); + +-- ---------------------------- +-- Table structure for payment +-- ---------------------------- +DROP TABLE IF EXISTS `payment`; +CREATE TABLE `payment` ( + `PaymentID` int NOT NULL AUTO_INCREMENT, + `StayID` int NOT NULL, + `Amount` decimal(10, 2) NOT NULL, + `PaymentMethod` enum('CreditCard','Cash','Online') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `PaymentDate` date NOT NULL, + PRIMARY KEY (`PaymentID`) USING BTREE, + INDEX `StayID`(`StayID` ASC) USING BTREE, + INDEX `idx_payment_date`(`PaymentDate` ASC) USING BTREE, + CONSTRAINT `payment_ibfk_1` FOREIGN KEY (`StayID`) REFERENCES `stay` (`StayID`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `payment_chk_1` CHECK (`Amount` >= 0) +) ENGINE = InnoDB AUTO_INCREMENT = 45 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of payment +-- ---------------------------- +INSERT INTO `payment` VALUES (3, 3, 600.00, 'CreditCard', '2024-01-07'); +INSERT INTO `payment` VALUES (4, 4, 800.00, 'CreditCard', '2024-01-08'); +INSERT INTO `payment` VALUES (5, 5, 750.00, 'Cash', '2024-01-10'); +INSERT INTO `payment` VALUES (6, 6, 850.00, 'CreditCard', '2024-01-11'); +INSERT INTO `payment` VALUES (7, 7, 700.00, 'Online', '2024-01-12'); +INSERT INTO `payment` VALUES (8, 8, 650.00, 'Cash', '2024-01-13'); +INSERT INTO `payment` VALUES (9, 9, 600.00, 'CreditCard', '2024-01-14'); +INSERT INTO `payment` VALUES (10, 10, 500.00, 'Online', '2024-01-15'); +INSERT INTO `payment` VALUES (44, 10, 20.00, 'Cash', '2025-01-01'); + +-- ---------------------------- +-- Table structure for performance +-- ---------------------------- +DROP TABLE IF EXISTS `performance`; +CREATE TABLE `performance` ( + `PerformanceID` int NOT NULL AUTO_INCREMENT, + `EmployeeID` int NOT NULL, + `EvaluationDate` date NOT NULL, + `Score` int NULL DEFAULT NULL, + `Comments` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL, + PRIMARY KEY (`PerformanceID`) USING BTREE, + INDEX `idx_performance_employeeid`(`EmployeeID` ASC) USING BTREE, + CONSTRAINT `performance_ibfk_1` FOREIGN KEY (`EmployeeID`) REFERENCES `employee` (`EmployeeID`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `performance_chk_1` CHECK (`Score` between 1 and 100) +) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of performance +-- ---------------------------- +INSERT INTO `performance` VALUES (1, 1, '2024-01-05', 95, 'Excellent leadership and management skills'); +INSERT INTO `performance` VALUES (2, 2, '2024-01-05', 85, 'Good work, but needs improvement in punctuality'); +INSERT INTO `performance` VALUES (3, 3, '2024-01-05', 90, 'Great at customer handling'); +INSERT INTO `performance` VALUES (4, 4, '2024-01-05', 88, 'Efficient and polite'); +INSERT INTO `performance` VALUES (5, 5, '2024-01-05', 92, 'Cooks with exceptional quality'); +INSERT INTO `performance` VALUES (6, 6, '2024-01-05', 80, 'Satisfactory technical support'); +INSERT INTO `performance` VALUES (7, 7, '2024-01-05', 89, 'Excellent supervisory skills'); +INSERT INTO `performance` VALUES (8, 8, '2024-01-05', 80, 'Needs improvement in security vigilance'); +INSERT INTO `performance` VALUES (9, 9, '2024-01-05', 88, 'Very friendly and professional'); +INSERT INTO `performance` VALUES (10, 10, '2024-01-05', 86, 'Reliable and helpful porter'); +INSERT INTO `performance` VALUES (11, 11, '2024-01-05', 91, 'Great support for IT issues'); +INSERT INTO `performance` VALUES (12, 11, '2024-12-28', 70, 'Need to work Harder'); + +-- ---------------------------- +-- Table structure for reservation +-- ---------------------------- +DROP TABLE IF EXISTS `reservation`; +CREATE TABLE `reservation` ( + `ReservationID` int NOT NULL AUTO_INCREMENT, + `CustomerID` int NOT NULL, + `RoomID` int NOT NULL, + `CheckInDate` date NOT NULL, + `CheckOutDate` date NOT NULL, + `Status` enum('Pending','Confirmed','CheckedIn','CheckedOut') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT 'Pending', + PRIMARY KEY (`ReservationID`) USING BTREE, + INDEX `CustomerID`(`CustomerID` ASC) USING BTREE, + INDEX `RoomID`(`RoomID` ASC) USING BTREE, + INDEX `idx_reservation_status`(`Status` ASC) USING BTREE, + INDEX `idx_reservation_dates`(`CheckInDate` ASC, `CheckOutDate` ASC) USING BTREE, + CONSTRAINT `reservation_ibfk_1` FOREIGN KEY (`CustomerID`) REFERENCES `customer` (`CustomerID`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `reservation_ibfk_2` FOREIGN KEY (`RoomID`) REFERENCES `room` (`RoomID`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `reservation_chk_1` CHECK (`CheckOutDate` > `CheckInDate`) +) ENGINE = InnoDB AUTO_INCREMENT = 61 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of reservation +-- ---------------------------- +INSERT INTO `reservation` VALUES (2, 2, 3, '2024-01-02', '2024-01-06', 'Confirmed'); +INSERT INTO `reservation` VALUES (3, 3, 4, '2024-01-03', '2024-01-07', 'Confirmed'); +INSERT INTO `reservation` VALUES (4, 4, 5, '2024-01-04', '2024-01-08', 'CheckedIn'); +INSERT INTO `reservation` VALUES (5, 5, 6, '2024-01-05', '2024-01-10', 'Confirmed'); +INSERT INTO `reservation` VALUES (6, 6, 7, '2024-01-06', '2024-01-11', 'Confirmed'); +INSERT INTO `reservation` VALUES (7, 7, 8, '2024-01-07', '2024-01-12', 'Confirmed'); +INSERT INTO `reservation` VALUES (8, 8, 9, '2024-01-08', '2024-01-13', 'Confirmed'); +INSERT INTO `reservation` VALUES (9, 9, 10, '2024-01-09', '2024-01-14', 'CheckedIn'); +INSERT INTO `reservation` VALUES (10, 10, 11, '2024-01-10', '2024-01-15', 'Confirmed'); +INSERT INTO `reservation` VALUES (11, 11, 12, '2024-12-28', '2024-12-31', 'Confirmed'); +INSERT INTO `reservation` VALUES (12, 12, 13, '2024-12-28', '2024-12-31', 'CheckedIn'); + +-- ---------------------------- +-- Table structure for room +-- ---------------------------- +DROP TABLE IF EXISTS `room`; +CREATE TABLE `room` ( + `RoomID` int NOT NULL AUTO_INCREMENT, + `RoomNumber` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `RoomTypeID` int NOT NULL, + `Status` enum('Available','Occupied') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT 'Available', + PRIMARY KEY (`RoomID`) USING BTREE, + UNIQUE INDEX `RoomNumber`(`RoomNumber` ASC) USING BTREE, + INDEX `RoomTypeID`(`RoomTypeID` ASC) USING BTREE, + INDEX `idx_room_status`(`Status` ASC) USING BTREE, + CONSTRAINT `room_ibfk_1` FOREIGN KEY (`RoomTypeID`) REFERENCES `roomtype` (`RoomTypeID`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of room +-- ---------------------------- +INSERT INTO `room` VALUES (1, '101', 2, 'Occupied'); +INSERT INTO `room` VALUES (3, '103', 2, 'Available'); +INSERT INTO `room` VALUES (4, '104', 2, 'Available'); +INSERT INTO `room` VALUES (5, '105', 3, 'Available'); +INSERT INTO `room` VALUES (6, '201', 3, 'Available'); +INSERT INTO `room` VALUES (7, '202', 4, 'Available'); +INSERT INTO `room` VALUES (8, '203', 4, 'Available'); +INSERT INTO `room` VALUES (9, '204', 5, 'Available'); +INSERT INTO `room` VALUES (10, '205', 5, 'Available'); +INSERT INTO `room` VALUES (11, '301', 6, 'Available'); +INSERT INTO `room` VALUES (12, '302', 7, 'Available'); +INSERT INTO `room` VALUES (13, '303', 8, 'Occupied'); + +-- ---------------------------- +-- Table structure for roomtype +-- ---------------------------- +DROP TABLE IF EXISTS `roomtype`; +CREATE TABLE `roomtype` ( + `RoomTypeID` int NOT NULL AUTO_INCREMENT, + `TypeName` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `Description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL, + `BasePrice` decimal(10, 2) NOT NULL, + PRIMARY KEY (`RoomTypeID`) USING BTREE, + UNIQUE INDEX `idx_roomtype_name`(`TypeName` ASC) USING BTREE, + CONSTRAINT `roomtype_chk_1` CHECK (`BasePrice` >= 0) +) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of roomtype +-- ---------------------------- +INSERT INTO `roomtype` VALUES (1, 'Single', 'Single bed room, suitable for 1 person', 88.00); +INSERT INTO `roomtype` VALUES (2, 'Double', 'Double bed room, suitable for 2 people', 132.00); +INSERT INTO `roomtype` VALUES (3, 'Suite', 'Spacious suite with living area', 275.00); +INSERT INTO `roomtype` VALUES (4, 'Deluxe', 'Luxury room with premium facilities', 330.00); +INSERT INTO `roomtype` VALUES (5, 'Family', 'Family room, can accommodate 4 people', 198.00); +INSERT INTO `roomtype` VALUES (6, 'Economy', 'Economical room with basic facilities', 66.00); +INSERT INTO `roomtype` VALUES (7, 'Business', 'Room equipped for business travelers', 220.00); +INSERT INTO `roomtype` VALUES (8, 'Presidential', 'High-end suite with exclusive facilities', 550.00); +INSERT INTO `roomtype` VALUES (9, 'Accessible', 'Room designed for accessibility needs', 110.00); +INSERT INTO `roomtype` VALUES (10, 'Penthouse', 'Top floor luxury room with scenic views', 440.00); + +-- ---------------------------- +-- Table structure for salarychangelog +-- ---------------------------- +DROP TABLE IF EXISTS `salarychangelog`; +CREATE TABLE `salarychangelog` ( + `LogID` int NOT NULL AUTO_INCREMENT, + `EmployeeID` int NULL DEFAULT NULL, + `OldSalary` decimal(10, 2) NULL DEFAULT NULL, + `NewSalary` decimal(10, 2) NULL DEFAULT NULL, + `ChangeDate` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`LogID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of salarychangelog +-- ---------------------------- + +-- ---------------------------- +-- Table structure for service +-- ---------------------------- +DROP TABLE IF EXISTS `service`; +CREATE TABLE `service` ( + `ServiceID` int NOT NULL AUTO_INCREMENT, + `ServiceName` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `Description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL, + `Price` decimal(10, 2) NOT NULL, + PRIMARY KEY (`ServiceID`) USING BTREE, + CONSTRAINT `service_chk_1` CHECK (`Price` >= 0) +) ENGINE = InnoDB AUTO_INCREMENT = 23 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of service +-- ---------------------------- +INSERT INTO `service` VALUES (12, 'Breakfast', 'Buffet breakfast available in the morning', 20.00); +INSERT INTO `service` VALUES (13, 'Laundry', 'Clothes washing and ironing service', 15.00); +INSERT INTO `service` VALUES (14, 'Room Service', 'Food and drinks delivered to room', 25.00); +INSERT INTO `service` VALUES (15, 'Spa', 'Relaxation and massage therapy', 50.00); +INSERT INTO `service` VALUES (16, 'Fitness Center', 'Access to gym and fitness facilities', 30.00); +INSERT INTO `service` VALUES (17, 'Airport Shuttle', 'Transportation to and from the airport', 40.00); +INSERT INTO `service` VALUES (18, 'Car Rental', 'Rental cars for local travel', 60.00); +INSERT INTO `service` VALUES (19, 'Business Center', 'Access to business and meeting facilities', 70.00); +INSERT INTO `service` VALUES (20, 'Daily Cleaning', 'Room cleaning service', 10.00); +INSERT INTO `service` VALUES (21, 'Mini Bar', 'Stocked mini bar in room', 35.00); + +-- ---------------------------- +-- Table structure for shift +-- ---------------------------- +DROP TABLE IF EXISTS `shift`; +CREATE TABLE `shift` ( + `ShiftID` int NOT NULL AUTO_INCREMENT, + `EmployeeID` int NOT NULL, + `ShiftDate` date NOT NULL, + `ShiftStartTime` time NOT NULL, + `ShiftEndTime` time NOT NULL, + PRIMARY KEY (`ShiftID`) USING BTREE, + INDEX `idx_shift_employee_date`(`EmployeeID` ASC, `ShiftDate` ASC) USING BTREE, + CONSTRAINT `shift_ibfk_1` FOREIGN KEY (`EmployeeID`) REFERENCES `employee` (`EmployeeID`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `shift_chk_1` CHECK (`ShiftEndTime` > `ShiftStartTime`) +) ENGINE = InnoDB AUTO_INCREMENT = 34 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of shift +-- ---------------------------- +INSERT INTO `shift` VALUES (23, 1, '2024-01-01', '08:00:00', '16:00:00'); +INSERT INTO `shift` VALUES (24, 2, '2024-01-01', '08:00:00', '16:00:00'); +INSERT INTO `shift` VALUES (25, 3, '2024-01-01', '16:00:00', '23:59:59'); +INSERT INTO `shift` VALUES (26, 4, '2024-01-01', '08:00:00', '16:00:00'); +INSERT INTO `shift` VALUES (27, 5, '2024-01-01', '08:00:00', '16:00:00'); +INSERT INTO `shift` VALUES (28, 6, '2024-01-02', '16:00:00', '23:59:59'); +INSERT INTO `shift` VALUES (29, 7, '2024-01-02', '08:00:00', '16:00:00'); +INSERT INTO `shift` VALUES (30, 8, '2024-01-02', '16:00:00', '23:59:59'); +INSERT INTO `shift` VALUES (31, 9, '2024-01-03', '08:00:00', '16:00:00'); +INSERT INTO `shift` VALUES (32, 10, '2024-01-03', '16:00:00', '23:59:59'); +INSERT INTO `shift` VALUES (33, 11, '2024-12-01', '06:00:00', '18:00:00'); + +-- ---------------------------- +-- Table structure for stay +-- ---------------------------- +DROP TABLE IF EXISTS `stay`; +CREATE TABLE `stay` ( + `StayID` int NOT NULL AUTO_INCREMENT, + `CustomerID` int NOT NULL, + `RoomID` int NOT NULL, + `CheckInDate` date NOT NULL, + `CheckOutDate` date NULL DEFAULT NULL, + `PaymentInfo` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL, + `AdditionalServices` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL, + PRIMARY KEY (`StayID`) USING BTREE, + INDEX `CustomerID`(`CustomerID` ASC) USING BTREE, + INDEX `RoomID`(`RoomID` ASC) USING BTREE, + CONSTRAINT `stay_ibfk_1` FOREIGN KEY (`CustomerID`) REFERENCES `customer` (`CustomerID`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `stay_ibfk_2` FOREIGN KEY (`RoomID`) REFERENCES `room` (`RoomID`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `stay_chk_1` CHECK ((`CheckOutDate` is null) or (`CheckOutDate` >= `CheckInDate`)) +) ENGINE = InnoDB AUTO_INCREMENT = 41 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of stay +-- ---------------------------- +INSERT INTO `stay` VALUES (3, 3, 3, '2024-01-03', '2024-01-07', 'Paid by Online Payment', 'Breakfast'); +INSERT INTO `stay` VALUES (4, 4, 4, '2024-01-04', '2024-01-08', 'Paid by Credit Card', 'Spa, Laundry'); +INSERT INTO `stay` VALUES (5, 5, 5, '2024-01-05', '2024-01-10', 'Paid by Cash', 'Breakfast, Room Service'); +INSERT INTO `stay` VALUES (6, 6, 6, '2024-01-06', '2024-01-11', 'Paid by Credit Card', 'Breakfast'); +INSERT INTO `stay` VALUES (7, 7, 7, '2024-01-07', '2024-01-12', 'Paid by Online Payment', 'Spa'); +INSERT INTO `stay` VALUES (8, 8, 8, '2024-01-08', '2024-01-13', 'Paid by Cash', 'Laundry'); +INSERT INTO `stay` VALUES (9, 9, 9, '2024-01-09', '2024-01-14', 'Paid by Credit Card', 'Room Service'); +INSERT INTO `stay` VALUES (10, 10, 10, '2024-01-10', '2024-01-15', 'Paid by Online Payment', 'Breakfast, Spa'); + +-- ---------------------------- +-- View structure for customerreservationview +-- ---------------------------- +DROP VIEW IF EXISTS `customerreservationview`; +CREATE ALGORITHM = UNDEFINED SQL SECURITY DEFINER VIEW `customerreservationview` AS select `c`.`CustomerID` AS `CustomerID`,`c`.`Name` AS `CustomerName`,`c`.`ContactInfo` AS `ContactInfo`,`ro`.`RoomNumber` AS `RoomNumber`,`rt`.`TypeName` AS `RoomType`,`r`.`CheckInDate` AS `CheckInDate`,`r`.`CheckOutDate` AS `CheckOutDate`,`r`.`Status` AS `ReservationStatus` from (((`customer` `c` join `reservation` `r` on((`c`.`CustomerID` = `r`.`CustomerID`))) join `room` `ro` on((`r`.`RoomID` = `ro`.`RoomID`))) join `roomtype` `rt` on((`ro`.`RoomTypeID` = `rt`.`RoomTypeID`))); + +-- ---------------------------- +-- View structure for employeeshiftstatsview +-- ---------------------------- +DROP VIEW IF EXISTS `employeeshiftstatsview`; +CREATE ALGORITHM = UNDEFINED SQL SECURITY DEFINER VIEW `employeeshiftstatsview` AS select `e`.`EmployeeID` AS `EmployeeID`,`e`.`Name` AS `EmployeeName`,count(`s`.`ShiftID`) AS `TotalShifts`,sum(timestampdiff(HOUR,`s`.`ShiftStartTime`,`s`.`ShiftEndTime`)) AS `TotalHours` from (`employee` `e` join `shift` `s` on((`e`.`EmployeeID` = `s`.`EmployeeID`))) group by `e`.`EmployeeID`,`e`.`Name`; + +-- ---------------------------- +-- View structure for roomstatusview +-- ---------------------------- +DROP VIEW IF EXISTS `roomstatusview`; +CREATE ALGORITHM = UNDEFINED SQL SECURITY DEFINER VIEW `roomstatusview` AS select `ro`.`RoomID` AS `RoomID`,`ro`.`RoomNumber` AS `RoomNumber`,`rt`.`TypeName` AS `RoomType`,`ro`.`Status` AS `RoomStatus` from (`room` `ro` join `roomtype` `rt` on((`ro`.`RoomTypeID` = `rt`.`RoomTypeID`))); + +-- ---------------------------- +-- View structure for roomtyperevenueview +-- ---------------------------- +DROP VIEW IF EXISTS `roomtyperevenueview`; +CREATE ALGORITHM = UNDEFINED SQL SECURITY DEFINER VIEW `roomtyperevenueview` AS select `rt`.`TypeName` AS `RoomType`,count(`s`.`StayID`) AS `TotalStays`,sum(`p`.`Amount`) AS `TotalRevenue` from (((`stay` `s` join `room` `ro` on((`s`.`RoomID` = `ro`.`RoomID`))) join `roomtype` `rt` on((`ro`.`RoomTypeID` = `rt`.`RoomTypeID`))) join `payment` `p` on((`s`.`StayID` = `p`.`StayID`))) group by `rt`.`TypeName`; + +-- ---------------------------- +-- View structure for staydetailsview +-- ---------------------------- +DROP VIEW IF EXISTS `staydetailsview`; +CREATE ALGORITHM = UNDEFINED SQL SECURITY DEFINER VIEW `staydetailsview` AS select `s`.`StayID` AS `StayID`,`c`.`Name` AS `CustomerName`,`ro`.`RoomNumber` AS `RoomNumber`,`rt`.`TypeName` AS `RoomType`,`p`.`Amount` AS `PaymentAmount`,`p`.`PaymentMethod` AS `PaymentMethod`,`s`.`AdditionalServices` AS `AdditionalServices` from ((((`stay` `s` join `customer` `c` on((`s`.`CustomerID` = `c`.`CustomerID`))) join `room` `ro` on((`s`.`RoomID` = `ro`.`RoomID`))) join `roomtype` `rt` on((`ro`.`RoomTypeID` = `rt`.`RoomTypeID`))) join `payment` `p` on((`s`.`StayID` = `p`.`StayID`))); + +-- ---------------------------- +-- Procedure structure for AddOrUpdateCustomer +-- ---------------------------- +DROP PROCEDURE IF EXISTS `AddOrUpdateCustomer`; +delimiter ;; +CREATE DEFINER=`root`@`localhost` PROCEDURE `AddOrUpdateCustomer`( + IN p_Name VARCHAR(100), + IN p_Gender ENUM('Male', 'Female'), + IN p_Age INT, + IN p_ContactInfo VARCHAR(100), + IN p_Address TEXT, + IN p_IDCardNumber VARCHAR(20) +) +BEGIN + -- 检查身份证号是否已存在 + IF EXISTS (SELECT 1 FROM Customer WHERE IDCardNumber = p_IDCardNumber) THEN + -- 更新已存在的顾客信息 + UPDATE Customer + SET Name = p_Name, + Gender = p_Gender, + Age = p_Age, + ContactInfo = p_ContactInfo, + Address = p_Address + WHERE IDCardNumber = p_IDCardNumber; + ELSE + -- 插入新的顾客信息 + INSERT INTO Customer (Name, Gender, Age, ContactInfo, Address, IDCardNumber) + VALUES (p_Name, p_Gender, p_Age, p_ContactInfo, p_Address, p_IDCardNumber); + END IF; +END +;; +delimiter ; + +-- ---------------------------- +-- Procedure structure for DeletePendingReservations +-- ---------------------------- +DROP PROCEDURE IF EXISTS `DeletePendingReservations`; +delimiter ;; +CREATE DEFINER=`root`@`localhost` PROCEDURE `DeletePendingReservations`() +BEGIN + -- 删除所有未确认的预订记录 + DELETE FROM Reservation + WHERE Status = 'Pending'; +END +;; +delimiter ; + +-- ---------------------------- +-- Procedure structure for GetCustomerTotalSpending +-- ---------------------------- +DROP PROCEDURE IF EXISTS `GetCustomerTotalSpending`; +delimiter ;; +CREATE DEFINER=`root`@`localhost` PROCEDURE `GetCustomerTotalSpending`( + IN p_CustomerID INT, + OUT p_TotalSpending DECIMAL(10,2) +) +BEGIN + -- 统计顾客的总消费金额 + SELECT SUM(p.Amount) + INTO p_TotalSpending + FROM Payment p + JOIN Stay s ON p.StayID = s.StayID + WHERE s.CustomerID = p_CustomerID; + + -- 如果没有消费记录,设置为 0 + IF p_TotalSpending IS NULL THEN + SET p_TotalSpending = 0; + END IF; +END +;; +delimiter ; + +-- ---------------------------- +-- Procedure structure for GetStayRecordsByDate +-- ---------------------------- +DROP PROCEDURE IF EXISTS `GetStayRecordsByDate`; +delimiter ;; +CREATE DEFINER=`root`@`localhost` PROCEDURE `GetStayRecordsByDate`( + IN p_StartDate DATE, + IN p_EndDate DATE +) +BEGIN + -- 查询入住记录 + SELECT + s.StayID, + c.Name AS CustomerName, + ro.RoomNumber, + s.CheckInDate, + s.CheckOutDate + FROM Stay s + JOIN Customer c ON s.CustomerID = c.CustomerID + JOIN Room ro ON s.RoomID = ro.RoomID + WHERE s.CheckInDate >= p_StartDate AND s.CheckOutDate <= p_EndDate; +END +;; +delimiter ; + +-- ---------------------------- +-- Procedure structure for UpdateRoomStatus +-- ---------------------------- +DROP PROCEDURE IF EXISTS `UpdateRoomStatus`; +delimiter ;; +CREATE DEFINER=`root`@`localhost` PROCEDURE `UpdateRoomStatus`( + IN p_RoomNumber VARCHAR(10), + IN p_NewStatus ENUM('Available', 'Occupied') +) +BEGIN + -- 更新房间状态 + UPDATE Room + SET Status = p_NewStatus + WHERE RoomNumber = p_RoomNumber; +END +;; +delimiter ; + +-- ---------------------------- +-- Triggers structure for table customer +-- ---------------------------- +DROP TRIGGER IF EXISTS `AfterInsertCustomer_Log`; +delimiter ;; +CREATE TRIGGER `AfterInsertCustomer_Log` AFTER INSERT ON `customer` FOR EACH ROW BEGIN + -- 记录新增顾客信息 + INSERT INTO CustomerLog (CustomerID, Name) + VALUES (NEW.CustomerID, NEW.Name); +END +;; +delimiter ; + +-- ---------------------------- +-- Triggers structure for table employee +-- ---------------------------- +DROP TRIGGER IF EXISTS `BeforeUpdateEmployeeSalary_LogChanges`; +delimiter ;; +CREATE TRIGGER `BeforeUpdateEmployeeSalary_LogChanges` BEFORE UPDATE ON `employee` FOR EACH ROW BEGIN + -- 记录薪资变化日志 + IF OLD.Salary != NEW.Salary THEN + INSERT INTO SalaryChangeLog (EmployeeID, OldSalary, NewSalary) + VALUES (OLD.EmployeeID, OLD.Salary, NEW.Salary); + END IF; +END +;; +delimiter ; + +-- ---------------------------- +-- Triggers structure for table reservation +-- ---------------------------- +DROP TRIGGER IF EXISTS `BeforeInsertReservation_PreventDuplicates`; +delimiter ;; +CREATE TRIGGER `BeforeInsertReservation_PreventDuplicates` BEFORE INSERT ON `reservation` FOR EACH ROW BEGIN + DECLARE duplicate_count INT; + -- 检查是否存在重复预订 + SELECT COUNT(*) + INTO duplicate_count + FROM Reservation + WHERE RoomID = NEW.RoomID + AND NEW.CheckInDate < CheckOutDate + AND NEW.CheckOutDate > CheckInDate; + + -- 如果有重复记录,则抛出错误 + IF duplicate_count > 0 THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'Duplicate reservation detected for the same room and date range'; + END IF; +END +;; +delimiter ; + +-- ---------------------------- +-- Triggers structure for table stay +-- ---------------------------- +DROP TRIGGER IF EXISTS `AfterInsertStay_UpdateRoomStatus`; +delimiter ;; +CREATE TRIGGER `AfterInsertStay_UpdateRoomStatus` AFTER INSERT ON `stay` FOR EACH ROW BEGIN + -- 将房间状态更新为 "Occupied" + UPDATE Room + SET Status = 'Occupied' + WHERE RoomID = NEW.RoomID; +END +;; +delimiter ; + +-- ---------------------------- +-- Triggers structure for table stay +-- ---------------------------- +DROP TRIGGER IF EXISTS `AfterDeleteStay_DeletePayment`; +delimiter ;; +CREATE TRIGGER `AfterDeleteStay_DeletePayment` AFTER DELETE ON `stay` FOR EACH ROW BEGIN + -- 删除与删除的 Stay 记录关联的支付记录 + DELETE FROM Payment + WHERE StayID = OLD.StayID; +END +;; +delimiter ; + +SET FOREIGN_KEY_CHECKS = 1;