-- 创建数据库，如果不存在
CREATE DATABASE IF NOT EXISTS attendance_system CHARACTER SET utf8 COLLATE utf8_general_ci;

-- 使用创建的数据库
USE attendance_system;

-- 1. 创建员工表（Employee），该表需要先创建
CREATE TABLE IF NOT EXISTS Employee (
    EmployeeID VARCHAR(50) PRIMARY KEY,       -- 员工ID，主键
    Name VARCHAR(100) NOT NULL,               -- 姓名
    Gender VARCHAR(10) NOT NULL,              -- 性别（男/女）
    DateOfBirth DATE NOT NULL DEFAULT '2000-01-01',  -- 出生日期，默认值
    Position VARCHAR(100) NOT NULL,           -- 职位
    DepartmentID VARCHAR(50),                 -- 部门ID
    ContactInfo VARCHAR(50),                  -- 联系方式
    HireDate DATE NOT NULL,                   -- 入职日期
    EmploymentStatus VARCHAR(50) NOT NULL     -- 状态（在职/离职/休假）
);

-- 2. 创建部门表（Department），需要在Employee表后创建，因为Department表需要引用Employee表中的ManagerID
CREATE TABLE IF NOT EXISTS Department (
    DepartmentID VARCHAR(50) PRIMARY KEY,    -- 部门ID，主键
    DepartmentName VARCHAR(100) NOT NULL,     -- 部门名称
    ManagerID VARCHAR(50),                    -- 主管ID，外键，关联到员工表
    FOREIGN KEY (ManagerID) REFERENCES Employee(EmployeeID)  -- 外键，关联到员工表
);

-- 3. 创建考勤记录表（Attendance），该表依赖Employee表
CREATE TABLE IF NOT EXISTS Attendance (
    AttendanceID VARCHAR(50) PRIMARY KEY,    -- 考勤ID，主键
    EmployeeID VARCHAR(50),                   -- 员工ID，外键，关联到员工表
    AttendanceDate DATE NOT NULL,             -- 考勤日期
    CheckInTime DATETIME,                     -- 上班时间
    CheckOutTime DATETIME,                    -- 下班时间
    WorkingHours INT,                         -- 工作时长（小时）
    OvertimeHours INT,                        -- 加班时长（小时）
    AttendanceStatus VARCHAR(20) NOT NULL,    -- 考勤状态（正常/迟到/早退/缺勤）
    FOREIGN KEY (EmployeeID) REFERENCES Employee(EmployeeID)  -- 外键，关联到员工表
);

-- 4. 创建假期申请表（LeaveRequest），该表依赖Employee表
CREATE TABLE IF NOT EXISTS LeaveRequest (
    RequestID VARCHAR(50) PRIMARY KEY,        -- 申请ID，主键
    EmployeeID VARCHAR(50),                   -- 员工ID，外键，关联到员工表
    LeaveType VARCHAR(50) NOT NULL,            -- 假期类型
    StartDate DATE NOT NULL,                  -- 开始日期
    EndDate DATE NOT NULL,                    -- 结束日期
    LeaveDays INT NOT NULL,                   -- 假期天数
    RequestStatus VARCHAR(20) NOT NULL,       -- 申请状态（待审批/已批准/已拒绝）
    ApproverID VARCHAR(50),                   -- 审批人ID，外键，关联到员工表
    Remarks TEXT,                             -- 备注
    FOREIGN KEY (EmployeeID) REFERENCES Employee(EmployeeID),  -- 外键，关联到员工表
    FOREIGN KEY (ApproverID) REFERENCES Employee(EmployeeID)   -- 外键，关联到员工表
);

-- 5. 创建用户角色表（UserRoles）
CREATE TABLE IF NOT EXISTS UserRoles (
    RoleID VARCHAR(50) PRIMARY KEY,           -- 角色ID，主键
    RoleName VARCHAR(100) NOT NULL,           -- 角色名称
    RoleDescription TEXT NOT NULL             -- 角色描述
);

-- 6. 创建用户账号表（UserLogin），该表依赖Employee表和UserRoles表
CREATE TABLE IF NOT EXISTS UserLogin (
    UserID VARCHAR(50) PRIMARY KEY,           -- 用户ID，主键
    EmployeeID VARCHAR(50),                   -- 员工ID，外键，关联到员工表
    RoleID VARCHAR(50),                       -- 角色ID，外键，关联到用户角色表
    Username VARCHAR(50) NOT NULL,            -- 用户名
    Password VARCHAR(255) NOT NULL,           -- 密码（加密存储）
    LastLoginTime DATETIME,                   -- 最后登录时间
    AccountStatus VARCHAR(20) NOT NULL,       -- 账号状态（有效/禁用）
    FOREIGN KEY (EmployeeID) REFERENCES Employee(EmployeeID),  -- 外键，关联到员工表
    FOREIGN KEY (RoleID) REFERENCES UserRoles(RoleID)          -- 外键，关联到用户角色表
);

-- 7. 创建考勤统计表（AttendanceSummary），该表依赖Employee表
CREATE TABLE IF NOT EXISTS AttendanceSummary (
    SummaryID VARCHAR(50) PRIMARY KEY,        -- 统计ID，主键
    EmployeeID VARCHAR(50),                   -- 员工ID，外键，关联到员工表
    Month DATE NOT NULL,                      -- 统计月份
    PresentDays INT,                          -- 出勤天数
    LateCount INT,                            -- 迟到次数
    EarlyLeaveCount INT,                      -- 早退次数
    AbsentDays INT,                           -- 缺勤天数
    TotalOvertimeHours INT,                   -- 加班总时长（小时）
    FOREIGN KEY (EmployeeID) REFERENCES Employee(EmployeeID)  -- 外键，关联到员工表
);

-- 8. 创建系统日志表（SystemLogs），该表依赖UserLogin表
CREATE TABLE IF NOT EXISTS SystemLogs (
    LogID VARCHAR(50) PRIMARY KEY,            -- 日志ID，主键
    UserID VARCHAR(50),                       -- 用户ID，外键，关联到用户账号表
    ActionType VARCHAR(50) NOT NULL,          -- 操作类型
    ActionTime DATETIME NOT NULL,             -- 操作时间
    Description TEXT,                         -- 操作描述
    FOREIGN KEY (UserID) REFERENCES UserLogin(UserID)  -- 外键，关联到用户账号表
);

-- 9. 创建培训记录表（TrainingRecords），该表依赖Employee表
CREATE TABLE IF NOT EXISTS TrainingRecords (
    TrainingID VARCHAR(50) PRIMARY KEY,       -- 培训ID，主键
    EmployeeID VARCHAR(50),                   -- 员工ID，外键，关联到员工表
    TrainingName VARCHAR(100) NOT NULL,       -- 培训名称
    TrainingDate DATE NOT NULL,               -- 培训日期
    TrainingHours INT,                        -- 培训时长（小时）
    TrainingStatus VARCHAR(50) NOT NULL,      -- 培训状态（已完成/进行中/未完成）
    FOREIGN KEY (EmployeeID) REFERENCES Employee(EmployeeID)  -- 外键，关联到员工表
);

-- 10. 创建绩效考核表（PerformanceAppraisal），该表依赖Employee表
CREATE TABLE IF NOT EXISTS PerformanceAppraisal (
    ReviewID VARCHAR(50) PRIMARY KEY,         -- 考核ID，主键
    EmployeeID VARCHAR(50),                   -- 员工ID，外键，标识被考核的员工
    ReviewDate DATE NOT NULL,                 -- 考核日期
    ReviewPeriod VARCHAR(50) NOT NULL,        -- 考核周期（季度/年度）
    ReviewScore INT,                          -- 考核评分
    ReviewGrade VARCHAR(50),                  -- 考核等级（A/B/C等）
    ReviewerID VARCHAR(50),                   -- 考核人ID，外键，标识考核主管
    FOREIGN KEY (EmployeeID) REFERENCES Employee(EmployeeID),   -- 外键，关联到员工表
    FOREIGN KEY (ReviewerID) REFERENCES Employee(EmployeeID)    -- 外键，关联到员工表
);

-- 提示：所有的表创建完成后，可以执行数据插入脚本（如 `initialize_data.sql`）。
