Initial commit: HR Performance System

- Database schema with 31 tables for 4-card system
- LLM API integration (Gemini, DeepSeek, OpenAI)
- Error handling system with modal component
- Connection test UI for LLM services
- Environment configuration files
- Complete database documentation

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
donald
2025-12-03 23:34:13 +08:00
commit c24634f4b7
18 changed files with 8179 additions and 0 deletions

581
database/schema.sql Normal file
View File

@@ -0,0 +1,581 @@
-- ============================================
-- HR 績效評核系統 - 資料庫結構
-- Database: db_A102
-- Version: 1.0
-- Created: 2025-12-03
-- ============================================
-- 使用資料庫
USE db_A102;
-- ============================================
-- 一、基礎資料表
-- ============================================
-- 1.1 組織架構表
CREATE TABLE IF NOT EXISTS hr_departments (
id INT AUTO_INCREMENT PRIMARY KEY,
dept_code VARCHAR(20) UNIQUE NOT NULL COMMENT '部門代碼',
dept_name_zh VARCHAR(100) NOT NULL COMMENT '部門名稱(中文)',
dept_name_en VARCHAR(100) COMMENT '部門名稱(英文)',
parent_dept_id INT COMMENT '上級部門ID',
dept_level INT DEFAULT 1 COMMENT '部門層級',
is_active BOOLEAN DEFAULT TRUE COMMENT '是否啟用',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_parent (parent_dept_id),
INDEX idx_active (is_active),
FOREIGN KEY (parent_dept_id) REFERENCES hr_departments(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='部門組織架構';
-- 1.2 職級表
CREATE TABLE IF NOT EXISTS hr_job_levels (
id INT AUTO_INCREMENT PRIMARY KEY,
level_code VARCHAR(20) UNIQUE NOT NULL COMMENT '職級代碼',
level_name_zh VARCHAR(50) NOT NULL COMMENT '職級名稱(中文)',
level_name_en VARCHAR(50) COMMENT '職級名稱(英文)',
level_order INT NOT NULL COMMENT '職級順序(數字越大級別越高)',
is_management BOOLEAN DEFAULT FALSE COMMENT '是否管理職',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_order (level_order)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='職級定義';
-- 1.3 人員表
CREATE TABLE IF NOT EXISTS hr_employees (
id INT AUTO_INCREMENT PRIMARY KEY,
employee_no VARCHAR(20) UNIQUE NOT NULL COMMENT '員工編號',
email VARCHAR(100) UNIQUE NOT NULL COMMENT '電子郵件',
name_zh VARCHAR(50) NOT NULL COMMENT '姓名(中文)',
name_en VARCHAR(50) COMMENT '姓名(英文)',
department_id INT NOT NULL COMMENT '部門ID',
job_level_id INT NOT NULL COMMENT '職級ID',
job_title_zh VARCHAR(100) COMMENT '職稱(中文)',
job_title_en VARCHAR(100) COMMENT '職稱(英文)',
supervisor_id INT COMMENT '直屬主管ID',
hire_date DATE COMMENT '到職日期',
status ENUM('active', 'inactive', 'resigned') DEFAULT 'active' COMMENT '員工狀態',
preferred_language ENUM('zh-TW', 'en-US') DEFAULT 'zh-TW' COMMENT '偏好語言',
password_hash VARCHAR(255) COMMENT '密碼雜湊',
last_login_at TIMESTAMP NULL COMMENT '最後登入時間',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_dept (department_id),
INDEX idx_supervisor (supervisor_id),
INDEX idx_status (status),
INDEX idx_email (email),
FOREIGN KEY (department_id) REFERENCES hr_departments(id),
FOREIGN KEY (job_level_id) REFERENCES hr_job_levels(id),
FOREIGN KEY (supervisor_id) REFERENCES hr_employees(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='員工資料';
-- 1.4 系統角色表
CREATE TABLE IF NOT EXISTS hr_system_roles (
id INT AUTO_INCREMENT PRIMARY KEY,
role_code VARCHAR(20) UNIQUE NOT NULL COMMENT '角色代碼',
role_name_zh VARCHAR(50) NOT NULL COMMENT '角色名稱(中文)',
role_name_en VARCHAR(50) COMMENT '角色名稱(英文)',
permissions JSON COMMENT '權限設定(JSON格式)',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系統角色權限';
-- 1.5 員工角色關聯表
CREATE TABLE IF NOT EXISTS hr_employee_roles (
id INT AUTO_INCREMENT PRIMARY KEY,
employee_id INT NOT NULL COMMENT '員工ID',
role_id INT NOT NULL COMMENT '角色ID',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uk_employee_role (employee_id, role_id),
FOREIGN KEY (employee_id) REFERENCES hr_employees(id) ON DELETE CASCADE,
FOREIGN KEY (role_id) REFERENCES hr_system_roles(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='員工角色關聯';
-- ============================================
-- 二、職能字典
-- ============================================
-- 2.1 職能分類表
CREATE TABLE IF NOT EXISTS hr_competency_categories (
id INT AUTO_INCREMENT PRIMARY KEY,
category_code VARCHAR(20) UNIQUE NOT NULL COMMENT '分類代碼',
category_name_zh VARCHAR(50) NOT NULL COMMENT '分類名稱(中文)',
category_name_en VARCHAR(50) COMMENT '分類名稱(英文)',
category_type ENUM('core', 'management', 'professional') NOT NULL COMMENT '職能類型',
display_order INT DEFAULT 0 COMMENT '顯示順序',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_type (category_type)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='職能分類';
-- 2.2 職能字典表
CREATE TABLE IF NOT EXISTS hr_competency_dictionary (
id INT AUTO_INCREMENT PRIMARY KEY,
competency_code VARCHAR(30) UNIQUE NOT NULL COMMENT '職能代碼',
category_id INT NOT NULL COMMENT '職能分類ID',
competency_name_zh VARCHAR(100) NOT NULL COMMENT '職能名稱(中文)',
competency_name_en VARCHAR(100) COMMENT '職能名稱(英文)',
definition_zh TEXT NOT NULL COMMENT '職能定義(中文)',
definition_en TEXT COMMENT '職能定義(英文)',
is_active BOOLEAN DEFAULT TRUE COMMENT '是否啟用',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_category (category_id),
INDEX idx_active (is_active),
FOREIGN KEY (category_id) REFERENCES hr_competency_categories(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='職能字典';
-- 2.3 職能等級行為指標表
CREATE TABLE IF NOT EXISTS hr_competency_behaviors (
id INT AUTO_INCREMENT PRIMARY KEY,
competency_id INT NOT NULL COMMENT '職能ID',
level_num INT NOT NULL COMMENT '等級(1-5)',
behavior_description_zh TEXT NOT NULL COMMENT '行為指標(中文)',
behavior_description_en TEXT COMMENT '行為指標(英文)',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_comp_level (competency_id, level_num),
FOREIGN KEY (competency_id) REFERENCES hr_competency_dictionary(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='職能行為指標';
-- ============================================
-- 三、角色卡模組
-- ============================================
-- 3.1 角色卡主表
CREATE TABLE IF NOT EXISTS hr_role_cards (
id INT AUTO_INCREMENT PRIMARY KEY,
card_code VARCHAR(30) UNIQUE NOT NULL COMMENT '角色卡編號',
card_type ENUM('template', 'personal') NOT NULL COMMENT '角色卡類型: template職位範本, personal個人角色卡',
department_id INT NOT NULL COMMENT '部門ID',
role_name_zh VARCHAR(100) NOT NULL COMMENT '角色名稱(中文)',
role_name_en VARCHAR(100) COMMENT '角色名稱(英文)',
job_level_id INT NOT NULL COMMENT '職級ID',
employee_id INT COMMENT '綁定員工ID(個人角色卡)',
mission_zh TEXT NOT NULL COMMENT '角色使命(中文)',
mission_en TEXT COMMENT '角色使命(英文)',
supervisor_id INT COMMENT '匯報對象ID',
external_contacts TEXT COMMENT '外部接口',
template_id INT COMMENT '來源範本ID(個人角色卡)',
status ENUM('draft', 'pending_approval', 'approved', 'archived') DEFAULT 'draft' COMMENT '狀態',
version INT DEFAULT 1 COMMENT '版本號',
approved_by INT COMMENT '審批人ID',
approved_at TIMESTAMP NULL COMMENT '審批時間',
created_by INT NOT NULL COMMENT '建立人ID',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_type (card_type),
INDEX idx_employee (employee_id),
INDEX idx_status (status),
INDEX idx_dept (department_id),
FOREIGN KEY (department_id) REFERENCES hr_departments(id),
FOREIGN KEY (job_level_id) REFERENCES hr_job_levels(id),
FOREIGN KEY (employee_id) REFERENCES hr_employees(id) ON DELETE SET NULL,
FOREIGN KEY (supervisor_id) REFERENCES hr_employees(id) ON DELETE SET NULL,
FOREIGN KEY (template_id) REFERENCES hr_role_cards(id) ON DELETE SET NULL,
FOREIGN KEY (approved_by) REFERENCES hr_employees(id),
FOREIGN KEY (created_by) REFERENCES hr_employees(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色卡主表';
-- 3.2 角色卡核心職責表
CREATE TABLE IF NOT EXISTS hr_role_responsibilities (
id INT AUTO_INCREMENT PRIMARY KEY,
role_card_id INT NOT NULL COMMENT '角色卡ID',
responsibility_zh TEXT NOT NULL COMMENT '職責描述(中文)',
responsibility_en TEXT COMMENT '職責描述(英文)',
display_order INT DEFAULT 0 COMMENT '顯示順序',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_role_card (role_card_id),
FOREIGN KEY (role_card_id) REFERENCES hr_role_cards(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色卡職責';
-- 3.3 角色卡督導對象表
CREATE TABLE IF NOT EXISTS hr_role_supervisees (
id INT AUTO_INCREMENT PRIMARY KEY,
role_card_id INT NOT NULL COMMENT '角色卡ID',
supervisee_id INT NOT NULL COMMENT '督導對象ID(員工或角色)',
supervisee_type ENUM('employee', 'role') NOT NULL COMMENT '督導對象類型',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_role_card (role_card_id),
FOREIGN KEY (role_card_id) REFERENCES hr_role_cards(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色卡督導對象';
-- 3.4 角色卡協作夥伴表
CREATE TABLE IF NOT EXISTS hr_role_collaborators (
id INT AUTO_INCREMENT PRIMARY KEY,
role_card_id INT NOT NULL COMMENT '角色卡ID',
collaborator_id INT NOT NULL COMMENT '協作對象ID',
collaborator_type ENUM('employee', 'department', 'role') NOT NULL COMMENT '協作對象類型',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_role_card (role_card_id),
FOREIGN KEY (role_card_id) REFERENCES hr_role_cards(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色卡協作夥伴';
-- 3.5 角色卡 KRA 表
CREATE TABLE IF NOT EXISTS hr_role_kra (
id INT AUTO_INCREMENT PRIMARY KEY,
role_card_id INT NOT NULL COMMENT '角色卡ID',
kra_name_zh VARCHAR(200) NOT NULL COMMENT 'KRA名稱(中文)',
kra_name_en VARCHAR(200) COMMENT 'KRA名稱(英文)',
weight_percentage DECIMAL(5,2) NOT NULL COMMENT '權重百分比',
display_order INT DEFAULT 0 COMMENT '顯示順序',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_role_card (role_card_id),
FOREIGN KEY (role_card_id) REFERENCES hr_role_cards(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色卡KRA';
-- 3.6 角色卡 KPI 表
CREATE TABLE IF NOT EXISTS hr_role_kpi (
id INT AUTO_INCREMENT PRIMARY KEY,
kra_id INT NOT NULL COMMENT 'KRA ID',
kpi_name_zh VARCHAR(200) NOT NULL COMMENT 'KPI指標名稱(中文)',
kpi_name_en VARCHAR(200) COMMENT 'KPI指標名稱(英文)',
measurement_zh TEXT NOT NULL COMMENT '衡量方式(中文)',
measurement_en TEXT COMMENT '衡量方式(英文)',
target_value VARCHAR(100) NOT NULL COMMENT '目標值',
display_order INT DEFAULT 0 COMMENT '顯示順序',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_kra (kra_id),
FOREIGN KEY (kra_id) REFERENCES hr_role_kra(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色卡KPI';
-- ============================================
-- 四、能力卡模組
-- ============================================
-- 4.1 能力卡主表
CREATE TABLE IF NOT EXISTS hr_competency_cards (
id INT AUTO_INCREMENT PRIMARY KEY,
card_code VARCHAR(30) UNIQUE NOT NULL COMMENT '能力卡編號',
role_card_id INT NOT NULL COMMENT '關聯角色卡ID',
employee_id INT NOT NULL COMMENT '員工ID',
status ENUM('draft', 'active', 'archived') DEFAULT 'draft' COMMENT '狀態',
version INT DEFAULT 1 COMMENT '版本號',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_role_card (role_card_id),
INDEX idx_employee (employee_id),
INDEX idx_status (status),
FOREIGN KEY (role_card_id) REFERENCES hr_role_cards(id),
FOREIGN KEY (employee_id) REFERENCES hr_employees(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='能力卡主表';
-- 4.2 能力卡硬性能力表
CREATE TABLE IF NOT EXISTS hr_competency_card_hard_skills (
id INT AUTO_INCREMENT PRIMARY KEY,
competency_card_id INT NOT NULL COMMENT '能力卡ID',
skill_name_zh VARCHAR(100) NOT NULL COMMENT '技能名稱(中文)',
skill_name_en VARCHAR(100) COMMENT '技能名稱(英文)',
skill_category ENUM('knowledge', 'tool', 'certification') NOT NULL COMMENT '技能類別',
is_required BOOLEAN DEFAULT TRUE COMMENT '是否必備',
required_level INT NOT NULL COMMENT '要求熟練度(1-5)',
description_zh TEXT COMMENT '說明(中文)',
description_en TEXT COMMENT '說明(英文)',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_comp_card (competency_card_id),
FOREIGN KEY (competency_card_id) REFERENCES hr_competency_cards(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='能力卡硬性能力';
-- 4.3 能力卡軟性能力表
CREATE TABLE IF NOT EXISTS hr_competency_card_soft_skills (
id INT AUTO_INCREMENT PRIMARY KEY,
competency_card_id INT NOT NULL COMMENT '能力卡ID',
competency_dict_id INT NOT NULL COMMENT '職能字典ID',
required_level INT NOT NULL COMMENT '要求等級(1-5)',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_comp_card (competency_card_id),
INDEX idx_comp_dict (competency_dict_id),
FOREIGN KEY (competency_card_id) REFERENCES hr_competency_cards(id) ON DELETE CASCADE,
FOREIGN KEY (competency_dict_id) REFERENCES hr_competency_dictionary(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='能力卡軟性能力';
-- ============================================
-- 五、績效卡模組
-- ============================================
-- 5.1 評核週期設定表
CREATE TABLE IF NOT EXISTS hr_review_cycles (
id INT AUTO_INCREMENT PRIMARY KEY,
cycle_code VARCHAR(30) UNIQUE NOT NULL COMMENT '週期代碼(如: 2024-Q1, 2024-Annual)',
cycle_year INT NOT NULL COMMENT '年度',
cycle_type ENUM('quarterly', 'annual') NOT NULL COMMENT '週期類型',
cycle_quarter INT COMMENT '季度(1-4)',
start_date DATE NOT NULL COMMENT '開始日期',
end_date DATE NOT NULL COMMENT '結束日期',
review_deadline DATE COMMENT '評核截止日期',
status ENUM('planned', 'active', 'closed') DEFAULT 'planned' COMMENT '狀態',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_year (cycle_year),
INDEX idx_type (cycle_type),
INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='評核週期設定';
-- 5.2 績效卡主表
CREATE TABLE IF NOT EXISTS hr_performance_cards (
id INT AUTO_INCREMENT PRIMARY KEY,
card_code VARCHAR(30) UNIQUE NOT NULL COMMENT '績效卡編號',
review_cycle_id INT NOT NULL COMMENT '評核週期ID',
employee_id INT NOT NULL COMMENT '被評核人ID',
role_card_id INT NOT NULL COMMENT '關聯角色卡ID',
competency_card_id INT NOT NULL COMMENT '關聯能力卡ID',
supervisor_id INT NOT NULL COMMENT '評核主管ID',
self_review_date TIMESTAMP NULL COMMENT '自評完成時間',
supervisor_review_date TIMESTAMP NULL COMMENT '主管評完成時間',
discussion_date DATE COMMENT '績效面談日期',
self_summary TEXT COMMENT '績效自評總結',
supervisor_feedback TEXT COMMENT '主管建議回饋',
goal_score DECIMAL(5,2) COMMENT '目標得分',
behavior_score DECIMAL(5,2) COMMENT '行為得分',
goal_weight DECIMAL(5,2) DEFAULT 70.00 COMMENT '目標佔比',
behavior_weight DECIMAL(5,2) DEFAULT 30.00 COMMENT '行為佔比',
total_score DECIMAL(5,2) COMMENT '總分',
rating ENUM('A+', 'A', 'B+', 'B', 'C') COMMENT '考核等級',
status ENUM('not_started', 'self_review', 'supervisor_review', 'completed', 'archived') DEFAULT 'not_started' COMMENT '狀態',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_cycle (review_cycle_id),
INDEX idx_employee (employee_id),
INDEX idx_supervisor (supervisor_id),
INDEX idx_status (status),
INDEX idx_rating (rating),
FOREIGN KEY (review_cycle_id) REFERENCES hr_review_cycles(id),
FOREIGN KEY (employee_id) REFERENCES hr_employees(id),
FOREIGN KEY (role_card_id) REFERENCES hr_role_cards(id),
FOREIGN KEY (competency_card_id) REFERENCES hr_competency_cards(id),
FOREIGN KEY (supervisor_id) REFERENCES hr_employees(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='績效卡主表';
-- 5.3 績效卡目標評核表
CREATE TABLE IF NOT EXISTS hr_performance_goals (
id INT AUTO_INCREMENT PRIMARY KEY,
performance_card_id INT NOT NULL COMMENT '績效卡ID',
kra_id INT NOT NULL COMMENT 'KRA ID',
weight_percentage DECIMAL(5,2) NOT NULL COMMENT '權重百分比',
actual_output TEXT COMMENT '具體產出描述',
self_completion DECIMAL(5,2) COMMENT '自評完成度(%)',
self_note TEXT COMMENT '自評說明',
supervisor_completion DECIMAL(5,2) COMMENT '主管評完成度(%)',
supervisor_note TEXT COMMENT '主管評說明',
consensus_completion DECIMAL(5,2) COMMENT '共識完成度(%)',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_perf_card (performance_card_id),
INDEX idx_kra (kra_id),
FOREIGN KEY (performance_card_id) REFERENCES hr_performance_cards(id) ON DELETE CASCADE,
FOREIGN KEY (kra_id) REFERENCES hr_role_kra(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='績效卡目標評核';
-- 5.4 績效卡行為評估表
CREATE TABLE IF NOT EXISTS hr_performance_behaviors (
id INT AUTO_INCREMENT PRIMARY KEY,
performance_card_id INT NOT NULL COMMENT '績效卡ID',
competency_dict_id INT NOT NULL COMMENT '職能字典ID',
self_level INT COMMENT '自評等級(1-5)',
self_sbi_situation TEXT COMMENT '自評-情境(S)',
self_sbi_behavior TEXT COMMENT '自評-行為(B)',
self_sbi_impact TEXT COMMENT '自評-影響(I)',
supervisor_level INT COMMENT '主管評等級(1-5)',
supervisor_sbi_situation TEXT COMMENT '主管評-情境(S)',
supervisor_sbi_behavior TEXT COMMENT '主管評-行為(B)',
supervisor_sbi_impact TEXT COMMENT '主管評-影響(I)',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_perf_card (performance_card_id),
INDEX idx_comp_dict (competency_dict_id),
FOREIGN KEY (performance_card_id) REFERENCES hr_performance_cards(id) ON DELETE CASCADE,
FOREIGN KEY (competency_dict_id) REFERENCES hr_competency_dictionary(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='績效卡行為評估';
-- ============================================
-- 六、成長卡模組
-- ============================================
-- 6.1 成長卡主表
CREATE TABLE IF NOT EXISTS hr_growth_cards (
id INT AUTO_INCREMENT PRIMARY KEY,
card_code VARCHAR(30) UNIQUE NOT NULL COMMENT '成長卡編號',
performance_card_id INT NOT NULL COMMENT '關聯績效卡ID',
employee_id INT NOT NULL COMMENT '員工ID',
supervisor_id INT NOT NULL COMMENT '輔導主管ID',
growth_period_start DATE NOT NULL COMMENT '成長週期開始',
growth_period_end DATE NOT NULL COMMENT '成長週期結束',
career_aspiration TEXT COMMENT '職業志向',
employee_commitment TEXT COMMENT '員工承諾',
employee_signed_at TIMESTAMP NULL COMMENT '員工簽署時間',
supervisor_commitment TEXT COMMENT '主管承諾',
supervisor_signed_at TIMESTAMP NULL COMMENT '主管簽署時間',
review_frequency ENUM('monthly', 'quarterly') DEFAULT 'quarterly' COMMENT '檢視節奏',
other_suggestions TEXT COMMENT '其他建議',
status ENUM('draft', 'active', 'completed', 'archived') DEFAULT 'draft' COMMENT '狀態',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_perf_card (performance_card_id),
INDEX idx_employee (employee_id),
INDEX idx_supervisor (supervisor_id),
INDEX idx_status (status),
FOREIGN KEY (performance_card_id) REFERENCES hr_performance_cards(id),
FOREIGN KEY (employee_id) REFERENCES hr_employees(id),
FOREIGN KEY (supervisor_id) REFERENCES hr_employees(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='成長卡主表';
-- 6.2 成長卡發展焦點表
CREATE TABLE IF NOT EXISTS hr_growth_focus_areas (
id INT AUTO_INCREMENT PRIMARY KEY,
growth_card_id INT NOT NULL COMMENT '成長卡ID',
focus_type ENUM('strength', 'development') NOT NULL COMMENT '焦點類型: strength優勢, development待發展',
competency_dict_id INT COMMENT '關聯職能字典ID',
kra_id INT COMMENT '關聯KRA ID',
description TEXT COMMENT '描述',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_growth_card (growth_card_id),
FOREIGN KEY (growth_card_id) REFERENCES hr_growth_cards(id) ON DELETE CASCADE,
FOREIGN KEY (competency_dict_id) REFERENCES hr_competency_dictionary(id),
FOREIGN KEY (kra_id) REFERENCES hr_role_kra(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='成長卡發展焦點';
-- 6.3 成長卡IDP計畫表
CREATE TABLE IF NOT EXISTS hr_growth_idp_goals (
id INT AUTO_INCREMENT PRIMARY KEY,
growth_card_id INT NOT NULL COMMENT '成長卡ID',
goal_title TEXT NOT NULL COMMENT '發展目標(SMART)',
competency_dict_id INT COMMENT '對應能力ID',
timeline_start DATE COMMENT '開始時間',
timeline_end DATE COMMENT '預計完成時間',
success_criteria TEXT COMMENT '成果證據',
status ENUM('pending', 'in_progress', 'completed', 'cancelled') DEFAULT 'pending' COMMENT '狀態',
display_order INT DEFAULT 0 COMMENT '顯示順序',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_growth_card (growth_card_id),
INDEX idx_comp_dict (competency_dict_id),
FOREIGN KEY (growth_card_id) REFERENCES hr_growth_cards(id) ON DELETE CASCADE,
FOREIGN KEY (competency_dict_id) REFERENCES hr_competency_dictionary(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='成長卡IDP目標';
-- 6.4 成長卡行動計畫表
CREATE TABLE IF NOT EXISTS hr_growth_actions (
id INT AUTO_INCREMENT PRIMARY KEY,
idp_goal_id INT NOT NULL COMMENT 'IDP目標ID',
action_description TEXT NOT NULL COMMENT '具體行動',
resources_needed TEXT COMMENT '資源與支持',
display_order INT DEFAULT 0 COMMENT '顯示順序',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_idp_goal (idp_goal_id),
FOREIGN KEY (idp_goal_id) REFERENCES hr_growth_idp_goals(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='成長卡行動計畫';
-- 6.5 成長卡追蹤紀錄表
CREATE TABLE IF NOT EXISTS hr_growth_tracking (
id INT AUTO_INCREMENT PRIMARY KEY,
growth_card_id INT NOT NULL COMMENT '成長卡ID',
review_date DATE NOT NULL COMMENT '檢視日期',
progress_update TEXT NOT NULL COMMENT '進度更新',
adjustments TEXT COMMENT '調整事項',
employee_confirmed BOOLEAN DEFAULT FALSE COMMENT '員工確認',
supervisor_confirmed BOOLEAN DEFAULT FALSE COMMENT '主管確認',
confirmed_at TIMESTAMP NULL COMMENT '確認時間',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_growth_card (growth_card_id),
INDEX idx_review_date (review_date),
FOREIGN KEY (growth_card_id) REFERENCES hr_growth_cards(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='成長卡追蹤紀錄';
-- ============================================
-- 七、審批流程
-- ============================================
-- 7.1 審批記錄表
CREATE TABLE IF NOT EXISTS hr_approval_records (
id INT AUTO_INCREMENT PRIMARY KEY,
entity_type ENUM('role_card', 'competency_card', 'performance_card', 'growth_card') NOT NULL COMMENT '實體類型',
entity_id INT NOT NULL COMMENT '實體ID',
approver_id INT NOT NULL COMMENT '審批人ID',
action ENUM('submit', 'approve', 'reject', 'return') NOT NULL COMMENT '操作',
comments TEXT COMMENT '審批意見',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_entity (entity_type, entity_id),
INDEX idx_approver (approver_id),
FOREIGN KEY (approver_id) REFERENCES hr_employees(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='審批記錄';
-- ============================================
-- 八、系統設定
-- ============================================
-- 8.1 系統配置表
CREATE TABLE IF NOT EXISTS hr_system_settings (
id INT AUTO_INCREMENT PRIMARY KEY,
setting_key VARCHAR(50) UNIQUE NOT NULL COMMENT '設定鍵',
setting_value TEXT COMMENT '設定值',
setting_type ENUM('text', 'number', 'boolean', 'json') DEFAULT 'text' COMMENT '設定類型',
description_zh VARCHAR(200) COMMENT '說明(中文)',
description_en VARCHAR(200) COMMENT '說明(英文)',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
updated_by INT COMMENT '更新人ID',
FOREIGN KEY (updated_by) REFERENCES hr_employees(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系統設定';
-- 8.2 等級分界設定表
CREATE TABLE IF NOT EXISTS hr_rating_thresholds (
id INT AUTO_INCREMENT PRIMARY KEY,
rating ENUM('A+', 'A', 'B+', 'B', 'C') NOT NULL UNIQUE COMMENT '等級',
min_score DECIMAL(5,2) NOT NULL COMMENT '最低分數',
max_score DECIMAL(5,2) NOT NULL COMMENT '最高分數',
suggested_percentage DECIMAL(5,2) COMMENT '建議比例',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='等級分界設定';
-- ============================================
-- 九、版本管理
-- ============================================
-- 9.1 版本快照表
CREATE TABLE IF NOT EXISTS hr_version_snapshots (
id INT AUTO_INCREMENT PRIMARY KEY,
entity_type ENUM('role_card', 'competency_card', 'performance_card', 'growth_card') NOT NULL COMMENT '實體類型',
entity_id INT NOT NULL COMMENT '實體ID',
version_number INT NOT NULL COMMENT '版本號',
snapshot_data JSON NOT NULL COMMENT '快照資料(JSON格式)',
snapshot_reason VARCHAR(200) COMMENT '快照原因',
created_by INT NOT NULL COMMENT '建立人ID',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_entity (entity_type, entity_id),
INDEX idx_version (version_number),
FOREIGN KEY (created_by) REFERENCES hr_employees(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='版本快照';
-- ============================================
-- 十、系統日誌
-- ============================================
-- 10.1 操作日誌表
CREATE TABLE IF NOT EXISTS hr_audit_logs (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id INT COMMENT '操作人ID',
action VARCHAR(50) NOT NULL COMMENT '操作動作',
entity_type VARCHAR(50) COMMENT '實體類型',
entity_id INT COMMENT '實體ID',
ip_address VARCHAR(45) COMMENT 'IP位址',
user_agent TEXT COMMENT '使用者代理',
request_data JSON COMMENT '請求資料',
response_status INT COMMENT '回應狀態',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_user (user_id),
INDEX idx_action (action),
INDEX idx_entity (entity_type, entity_id),
INDEX idx_created_at (created_at),
FOREIGN KEY (user_id) REFERENCES hr_employees(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='操作日誌';
-- ============================================
-- 資料庫結構建立完成
-- ============================================