commit c24634f4b75e4134393dbfdb698d9142777d9425 Author: donald Date: Wed Dec 3 23:34:13 2025 +0800 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 diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..993e633 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,12 @@ +{ + "permissions": { + "allow": [ + "Bash(git init:*)", + "Bash(git remote add:*)", + "Bash(git config:*)", + "Bash(git add:*)" + ], + "deny": [], + "ask": [] + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..56ec98b --- /dev/null +++ b/.gitignore @@ -0,0 +1,73 @@ +# Environment variables +.env +.env.local +.env.development +.env.production +.env.test + +# Dependencies +node_modules/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +package-lock.json +yarn.lock +pnpm-lock.yaml + +# Build outputs +dist/ +build/ +out/ +.next/ +.nuxt/ +.cache/ + +# IDE and Editor files +.vscode/ +.idea/ +*.swp +*.swo +*~ +.DS_Store +*.sublime-project +*.sublime-workspace + +# Logs +logs/ +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +pids +*.pid +*.seed +*.pid.lock + +# Testing +coverage/ +.nyc_output/ +*.lcov +.jest/ + +# Uploads and temporary files +uploads/ +temp/ +tmp/ +*.tmp + +# Database +*.sqlite +*.sqlite3 +*.db + +# OS files +Thumbs.db +.DS_Store +desktop.ini + +# Misc +.env.backup +*.bak +*.swp +.vscode-test/ diff --git a/HR瞟效評栞系統_功胜芏栌曞_v1.1.md b/HR瞟效評栞系統_功胜芏栌曞_v1.1.md new file mode 100644 index 0000000..52c9ddd --- /dev/null +++ b/HR瞟效評栞系統_功胜芏栌曞_v1.1.md @@ -0,0 +1,692 @@ +# HR 瞟效評栞系統 - 功胜芏栌曞 + +**文件版本**v1.1 正匏版 +**建立日期**2024幎12月 +**文件狀態**需求確認完成 + +--- + +## 䞀、系統抂述 + +### 1.1 栞心抂念 + +本系統以「四卡埪環」為栞心架構建立完敎的瞟效管理生呜週期 + +``` +┌─────────────────────────────────────────────────────────────────────┐ +│ 瞟效管理四卡埪環 │ +├────────────────────────────────────────────────────────────────────── +│ │ +│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐│ +│ │ 角色卡 │ ───▶ │ 胜力卡 │ ───▶ │ 瞟效卡 │ ───▶ │ 成長卡 ││ +│ │ Role Card│ │Competency│ │Performance│ │Growth Card││ +│ └──────────┘ └──────────┘ └──────────┘ └──────────┘│ +│ │ │ │ +│ └─────────────── 回饋埪環 ◀───────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────┘ +``` + +### 1.2 四卡定䜍與關聯 + +| 卡片 | 定䜍 | 回答的問題 | 䞻芁產出 | +|------|------|------------|----------| +| **角色卡** | 厗䜍定矩 | 我是誰做什麌 | 職責、KRA/KPI | +| **胜力卡** | 胜力基準 | 需芁什麌胜力 | 技胜枅單、熟緎床芁求 | +| **瞟效卡** | 週期評栞 | 做埗劂䜕 | 目暙達成率、行為評分 | +| **成長卡** | 癌展芏劃 | 劂䜕提升 | IDP蚈畫、远蹀玀錄 | + +### 1.3 確認的系統配眮 + +| 項目 | 確認遞項 | 說明 | +|------|----------|------| +| 角色卡管理暡匏 | **B 職䜍+人員暡匏** | 角色卡可為空癜職䜍也可綁定特定人員 | +| 胜力卡類型 | **D 職胜字兞** | 建立公叞玚職胜字兞初期埞通甚軟性胜力開始 | +| 評栞週期 | **C 季床+幎床** | 季床茕量評栞幎床完敎評栞 | +| 評分機制 | **B 自評+䞻管評** | 員工先自評䞻管埌評成熟埌擎展 360 | +| 等玚分䜈 | **B 建議分䜈** | 系統提瀺理想分䜈比䟋䜆䞍匷制 | +| 培蚓敎合 | **A 獚立運䜜** | Phase 1 獚立Phase 2 擎展課皋掚薊 | +| 四卡連動 | **B 單向連動** | 角色→胜力→瞟效→成長資料自動垶入 | +| 審批流皋 | **B 單局審批** | 盎屬䞻管審批 | +| 版本管理 | **C 週期保留** | 每個評栞週期保留䞀個快照 | +| 報衚功胜 | **A+B 基瀎+儀衚板** | 個人四卡檢芖 + 瞟效分䜈儀衚板 | +| 倚語系 | **B 繁䞭+英文** | 支揎繁體䞭文與英文切換 | +| 行動支揎 | **B 響應匏網頁** | 自適應桌面與行動裝眮 | + +--- + +## 二、功胜暡組芏栌 + +### 2.1 角色卡暡組 (Role Card) + +#### 2.1.1 功胜說明 + +- **職䜍+人員暡匏**角色卡可為「職䜍範本」或「個人角色卡」 +- 職䜍範本定矩暙準職責䟛新進人員認領 +- 個人角色卡綁定特定員工可埮調職責內容 + +#### 2.1.2 資料欄䜍 + +| 區塊 | 欄䜍 | 類型 | 必填 | 說明 | +|------|------|------|------|------| +| **基本資蚊** | 角色卡類型 | 遞單 | ✓ | 職䜍範本/個人角色卡 | +| | 郚門名皱 | 遞單 | ✓ | 連動組織架構 | +| | 角色名皱 | 文字 | ✓ | 職䜍/角色暙準名皱 | +| | 職玚 | 遞單 | ✓ | 職等玚別 | +| | 綁定人員 | 遞單 | | 個人角色卡時必填 | +| **角色䜿呜** | 䜿呜描述 | 長文字 | ✓ | 䞀句話說明厗䜍栞心價倌 | +| **栞心職責** | 職責枅單 | 倚筆文字 | ✓ | 4-8項動詞開頭 | +| **組織關聯** | 匯報對象 | 遞單 | ✓ | 連動人員資料 | +| | 督導對象 | 倚遞 | | 盎接管理的人員/角色 | +| | 內郚協䜜倥䌎 | 倚遞 | | 跚郚門協䜜對象 | +| | 倖郚接口 | 文字 | | 對倖聯繫窗口 | +| **KRA/KPI** | KRA | 文字 | ✓ | 關鍵成果領域3-6項 | +| | KPI 指暙 | 文字 | ✓ | 關鍵瞟效指暙名皱 | +| | 衡量方匏 | 文字 | ✓ | 蚈算公匏/刀斷暙準 | +| | 目暙倌 | 文字 | ✓ | 達暙基準倌 | +| | 權重 | 敞字 | ✓ | 䜔比 %瞜和須為 100% | + +#### 2.1.3 業務芏則 + +1. 職䜍範本可被倚人認領系統自動建立個人角色卡副本 +2. 個人角色卡修改䞍圱響原職䜍範本 +3. KRA 權重瞜和必須等斌 100% +4. 角色卡變曎需䞻管審批埌生效 + +--- + +### 2.2 胜力卡暡組 (Competency Card) + +#### 2.2.1 功胜說明 + +- **職胜字兞架構**建立公叞玚職胜字兞各角色遞甚適甚項目 +- 初期先建立通甚管理職胜軟性胜力 +- 各郚門可擎充專業技胜硬性胜力 + +#### 2.2.2 職胜字兞結構 + +``` +職胜字兞 +├── 通甚職胜 (Core Competencies) +│ ├── 溝通協調 +│ ├── 團隊合䜜 +│ ├── 問題解決 +│ ├── 執行力 +│ └── 孞習成長 +├── 管理職胜 (Management Competencies) +│ ├── 策略思維 +│ ├── 團隊領導 +│ ├── 橫向敎合力 +│ ├── 決策刀斷 +│ └── 人才培育 +└── 專業職胜 (Professional Competencies) + ├── [䟝郚門/職類定矩] + └── ... +``` + +#### 2.2.3 資料欄䜍 + +| 區塊 | 欄䜍 | 類型 | 必填 | 說明 | +|------|------|------|------|------| +| **基本資蚊** | 連動角色卡 | 關聯 | ✓ | 自動垶入角色資蚊 | +| **硬性胜力** | 技胜/證照名皱 | 文字 | ✓ | 專業技胜或認證項目 | +| | 技胜類別 | 遞單 | ✓ | 專業知識/工具䜿甚/證照資質 | +| | 是吊必備 | 開關 | ✓ | 必須具備或加分項 | +| | 芁求熟緎床 | 遞單 | ✓ | 1-5 箚 | +| | 說明 | 文字 | | 具體應甚情境 | +| **軟性胜力** | 職胜項目 | 遞單 | ✓ | 埞職胜字兞遞取 | +| | 職胜定矩 | 文字 | 自動 | 系統垶入 | +| | 芁求等玚 | 遞單 | ✓ | L1-L5 | +| | 行為指暙 | 文字 | 自動 | 系統䟝等玚垶入 | + +#### 2.2.4 熟緎床/等玚定矩 + +| 等箚 | 硬性胜力定矩 | 軟性胜力定矩 | +|------|-------------|-------------| +| **L1** | 了解抂念需指導操䜜 | 初孞新手需指導才胜展珟 | +| **L2** | 基瀎應甚可完成暙準任務 | 基瀎應甚圚簡單情境䞭展珟 | +| **L3** | 獚立操䜜處理䞀般問題 | 獚立勝任穩定展珟斌日垞工䜜 | +| **L4** | 粟通深化可指導初孞者 | 粟通深化圚耇雜情境䞭展珟 | +| **L5** | 專家創新可培蚓/優化流皋 | 專家匕領可指導他人䞊創新 | + +--- + +### 2.3 瞟效卡暡組 (Performance Card) + +#### 2.3.1 功胜說明 + +- **評栞週期**季床茕量評栞 + 幎床完敎評栞 +- **評分機制**員工自評 → 䞻管評栞 → 瞟效面談 +- **等玚分䜈**系統顯瀺建議分䜈比䟋䞍匷制執行 + +#### 2.3.2 評栞週期蚭蚈 + +| 週期 | 類型 | 內容 | 時間點 | +|------|------|------|--------| +| Q1 | 季床茕量 | 目暙远蹀、簡芁回饋 | 4月 | +| Q2 | 季床茕量 | 目暙远蹀、簡芁回饋 | 7月 | +| Q3 | 季床茕量 | 目暙远蹀、簡芁回饋 | 10月 | +| Q4 | 幎床完敎 | 完敎目暙+行為評䌰 | 1月 | + +#### 2.3.3 資料欄䜍 + +| 區塊 | 欄䜍 | 類型 | 說明 | +|------|------|------|------| +| **基本資蚊** | 評栞週期 | 遞單 | 季床/幎床 | +| | 考栞幎床 | 遞單 | 連動幎床蚭定 | +| | 考栞期間 | 日期 | 起迄日期 | +| | 被評栞人 | 關聯 | 連動角色卡 | +| | 填寫日期 | 日期 | 系統自動蚘錄 | +| **目暙與成果** | KRA | 關聯 | 連動角色卡 KRA | +| | 權重 | 敞字 | 連動角色卡權重 | +| | 具體產出 | 長文字 | 寊際完成事項描述 | +| | 自評完成床 | 癟分比 | 員工自評 | +| | 自評說明 | 文字 | 自評䟝據 | +| | 䞻管評完成床 | 癟分比 | 䞻管確認 | +| | 䞻管評說明 | 文字 | 䞻管回饋 | +| | 共識完成床 | 癟分比 | 面談埌確認 | +| **行為胜力評䌰** | 職胜項目 | 關聯 | 連動胜力卡 | +| | 職胜定矩 | 文字 | 系統垶入 | +| | 自評等玚 | 遞單 | L1-L5 | +| | 自評舉䟋 | 長文字 | SBI 栌匏 | +| | 䞻管評等玚 | 遞單 | L1-L5 | +| | 䞻管評舉䟋 | 長文字 | SBI 栌匏 | +| **瞟效自評** | 自述 | 長文字 | 員工敎體自我評價 | +| **䞻管建議** | 回饋 | 長文字 | 絊受評人建議 | +| **綜合評價** | 目暙埗分 | 蚈算 | 加權平均 | +| | 行為埗分 | 蚈算 | 平均等玚蜉換 | +| | 目暙䜔比 | 蚭定 | 預蚭 70% | +| | 行為䜔比 | 蚭定 | 預蚭 30% | +| | 瞜分 | 蚈算 | 加權瞜分 | +| | 考栞等玚 | 遞單 | A+/A/B+/B/C | + +#### 2.3.4 建議等玚分䜈 + +| 等箚 | 定矩 | 建議比䟋 | +|------|------|----------| +| **A+** | 卓越超矀 | ≀ 10% | +| **A** | 優秀達暙 | 20-25% | +| **B+** | 良奜穩定 | 30-40% | +| **B** | 合栌埅進 | 20-25% | +| **C** | 需芁改善 | ≀ 10% | + +#### 2.3.5 評栞原則系統呈珟 + +1. **證據導向 (Evidence-Based)**所有評栞須有量化敞據或行為事䟋䜐證 +2. **雙向對話 (Two-Way Dialogue)**先員工自評 → 䞻管評栞 → 瞟效面談共識 +3. **癌展導向 (Development Oriented)**瞟效卡茞出是胜力卡的茞入非僅為評分 +4. **持續蚘錄 (Continuous Process)**党週期持續蚘錄非期末才填寫 +5. **SBI 栌匏**情境(Situation)-行為(Behavior)-圱響(Impact) 的具體描述 + +--- + +### 2.4 成長卡暡組 (Growth Card) + +#### 2.4.1 功胜說明 + +- 承接瞟效卡茞出自動垶入優勢項與埅癌展領域 +- 制定個人癌展蚈畫 (IDP)採 SMART 原則 +- Phase 1 獚立運䜜Phase 2 連結培蚓系統 + +#### 2.4.2 資料欄䜍 + +| 區塊 | 欄䜍 | 類型 | 說明 | +|------|------|------|------| +| **基本資蚊** | 連動瞟效卡 | 關聯 | 自動垶入 | +| | 成長週期 | 日期 | IDP 適甚期間 | +| | 䞻管 | 關聯 | 茔導䞻管 | +| **癌展焊點** | 優勢項 | 倚遞 | 連動瞟效卡高分項 | +| | 埅癌展領域 | 倚遞 | 連動瞟效卡埅改善項 | +| | 職業志向 | 文字 | 員工職涯期望 | +| **IDP 蚈畫** | 癌展目暙 | 文字 | SMART 原則 | +| | 對應胜力 | 遞單 | 連動胜力卡項目 | +| | 具體行動 | 倚筆文字 | 做什麌 | +| | 資源與支持 | 文字 | 需芁什麌協助 | +| | 時間線 | 日期 | 預蚈完成時間 | +| | 成果證據 | 文字 | 劂䜕證明達成 | +| **支持與承諟** | 員工承諟 | 簜栞 | 員工簜眲+日期 | +| | 䞻管承諟 | 簜栞 | 䞻管簜眲+日期 | +| | 檢芖節奏 | 遞單 | 月檢芖/季回顧 | +| **远蹀玀錄** | 日期 | 日期 | 檢芖日期 | +| | 進床曎新 | 長文字 | 寊際進展描述 | +| | 調敎事項 | 文字 | 蚈畫調敎內容 | +| | 簜名確認 | 簜栞 | 雙方確認 | +| **其他建議** | 建議內容 | 長文字 | 對郚門/公叞建議 | + +#### 2.4.3 IDP 目暙建議敞量 + +- 每䜍員工建議聚焊 **3-4 個**癌展目暙 +- 避免資源分散確保專泚與萜地 + +--- + +## 䞉、流皋蚭蚈 + +### 3.1 幎床䞻流皋 + +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 幎床瞟效管理流皋 │ +├────────────────────────────────────────────────────────────────────────────── +│ │ +│ 12月-1月 Q1-Q3 Q4 幎末 次幎 1月 │ +│ │ │ │ │ │ +│ â–Œ â–Œ â–Œ â–Œ │ +│ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │ +│ │角色卡│──確認──▶│瞟效卡│──季床──▶│瞟效卡│──產出──▶│成長卡│ │ +│ │胜力卡│ 幎床目暙 │季床版│ 茕量远蹀 │幎床版│ 完敎評栞 │ IDP │ │ +│ └──────┘ └──────┘ └──────┘ └──────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────────┘ +``` + +### 3.2 單向連動資料流 + +``` +角色卡 胜力卡 瞟效卡 成長卡 +┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ +│ • 郹門/職玚 │ │ • 基本資蚊 │ │ • 基本資蚊 │ │ • 基本資蚊 │ +│ • 角色/人員 │──────▶│ • 硬性胜力 │──────▶│ • KRA æž…å–® │──────▶│ • 優勢項 │ +│ • KRA/KPI │ │ • 軟性胜力 │ │ • 職胜項目 │ │ • 埅癌展 │ +│ • 權重 │ │ • 芁求等玚 │ │ • 評栞結果 │ │ • IDP 蚈畫 │ +└────────────┘ └────────────┘ └────────────┘ └────────────┘ + │ │ │ │ + │ │ │ │ + └────────────────────┮────────────────────┮────────────────────┘ + 基本資蚊自動垶入連動 +``` + +### 3.3 審批流皋 + +採甚**單局審批**盎屬䞻管審批即可 + +``` +┌─────────┐ ┌─────────┐ ┌─────────┐ +│ 員工 │─────▶│ 盎屬䞻管 │─────▶│ 生效 │ +│ 填寫 │ 送審 │ 審批 │ 栞准 │ 歞檔 │ +└─────────┘ └─────────┘ └─────────┘ + │ + │ 退回 + â–Œ + ┌─────────┐ + │ 員工 │ + │ 修改 │ + └─────────┘ +``` + +### 3.4 版本管理 + +採甚**週期保留快照**策略 + +| 事件 | 動䜜 | 保留內容 | +|------|------|----------| +| 季床評栞完成 | 建立快照 | 該季瞟效卡完敎內容 | +| 幎床評栞完成 | 建立快照 | 幎床瞟效卡 + 成長卡 | +| 角色卡變曎 | 建立快照 | 變曎前埌版本比對 | + +--- + +## 四、報衚功胜芏栌 + +### 4.1 基瀎報衚 + +| 報衚名皱 | 說明 | 䜿甚者 | +|----------|------|--------| +| 個人四卡瞜芜 | 員工檢芖自己的四卡完敎資蚊 | å…šå“¡ | +| 郚門人員枅單 | 郚門內所有人員四卡狀態 | 䞻管 | +| 埅審批枅單 | 等埅審批的卡片列衚 | 䞻管 | +| 評栞進床远蹀 | 各週期評栞完成率 | HR/䞻管 | + +### 4.2 儀衚板 + +| 儀衚板名皱 | 圖衚類型 | 說明 | +|------------|----------|------| +| 瞟效等玚分䜈 | 圓逅圖/長條圖 | 顯瀺 A+/A/B+/B/C 分䜈 | +| 郚門瞟效比范 | 長條圖 | 跚郚門瞟效平均比范 | +| 胜力猺口分析 | 雷達圖 | 胜力芁求 vs 寊際評䌰差距 | +| 目暙達成率 | 儀衚板 | KRA 敎體達成癟分比 | +| 評栞完成進床 | 進床條 | 各階段完成率 | + +--- + +## 五、系統蚭定 + +### 5.1 基瀎蚭定 + +| 蚭定項目 | 說明 | 預蚭倌 | +|----------|------|--------| +| 目暙䜔比 | 目暙成果圚瞜分的權重 | 70% | +| 行為䜔比 | 行為胜力圚瞜分的權重 | 30% | +| 等玚分界 | A+/A/B+/B/C 的分敞區間 | 可調敎 | +| 評栞週期 | 季床/幎床時間蚭定 | 䟝公叞日曆 | +| 語系蚭定 | 預蚭語蚀 | 繁體䞭文 | + +### 5.2 權限蚭定 + +| 角色 | 角色卡 | 胜力卡 | 瞟效卡 | 成長卡 | 報衚 | +|------|--------|--------|--------|--------|------| +| 員工 | 檢芖(自己) | 檢芖(自己) | 自評+檢芖 | 填寫+檢芖 | 個人 | +| 䞻管 | 檢芖(郚屬) | 檢芖(郚屬) | è©•æ ž+審批 | 審批+远蹀 | 郹門 | +| HR | 党郚 | 党郚 | 党郚 | 党郚 | 党郚 | +| 管理員 | 党郚+蚭定 | 党郚+å­—å…ž | 党郚+蚭定 | 党郚 | 党郚 | + +--- + +## 六、倚語系支揎 + +### 6.1 支揎語蚀 + +- **繁體䞭文** (zh-TW) - 預蚭 +- **英文** (en-US) + +### 6.2 翻譯範圍 + +| 項目 | 說明 | +|------|------| +| 系統介面 | 遞單、按鈕、暙籀、提瀺蚊息 | +| 固定欄䜍 | 欄䜍名皱、遞項倌 | +| 職胜字兞 | 職胜名皱、定矩、行為指暙 | +| 報衚暙題 | 報衚名皱、圖衚暙籀 | + +### 6.3 䜿甚者資料 + +䜿甚者填寫的內容劂具體產出、自評說明䞍做自動翻譯保持原始語蚀。 + +--- + +## 䞃、響應匏蚭蚈芏栌 + +### 7.1 斷點蚭蚈 + +| 裝眮類型 | 寬床範圍 | 䜈局調敎 | +|----------|----------|----------| +| Desktop | ≥ 1280px | 䞉欄偎邊欄 + 䞻內容 + 茔助面板 | +| Tablet | 768-1279px | 雙欄可收合偎邊欄 + 䞻內容 | +| Mobile | < 768px | 單欄底郚導航 + 䞻內容 | + +### 7.2 行動版優化 + +| 元件 | 桌面版 | 行動版 | +|------|--------|--------| +| 四卡進床條 | 氎平展開 | 可橫向捲動 | +| Tab 切換 | 氎平暙籀 | 䞋拉遞單 | +| 衚栌 | 完敎顯瀺 | 卡片匏呈珟 | +| 按鈕組 | 氎平排列 | 垂盎堆疊 | + +--- + +## 八、開癌階段芏劃 + +### Phase 1 - MVP (8-10 週) + +| 週次 | 亀付項目 | +|------|----------| +| W1-2 | 資料庫蚭蚈、API 架構、基瀎 UI 框架 | +| W3-4 | 角色卡暡組完敎功胜 | +| W5-6 | 胜力卡暡組 + 職胜字兞基瀎版 | +| W7-8 | 瞟效卡暡組幎床版 | +| W9-10 | 成長卡暡組 + 審批流皋 + 基瀎報衚 | + +### Phase 2 - 擎展 (4-6 週) + +| 週次 | 亀付項目 | +|------|----------| +| W11-12 | 季床評栞流皋 + 儀衚板報衚 | +| W13-14 | 倚語系支揎 + 響應匏優化 | +| W15-16 | 培蚓系統敎合課皋掚薊 | + +### Phase 3 - 進階 (芏劃䞭) + +- 360 床評䌰擎展 +- AI 分析與建議 +- 與 HR 系統敎合 + +--- + +## 十、Help Me AI 智胜填寫功胜 + +### 10.1 功胜抂述 + +| 項目 | 說明 | +|------|------| +| 功胜名皱 | Help Me - AI 智胜填寫 | +| 功胜定䜍 | 茔助䜿甚者快速完成衚單填寫 | +| 觞癌方匏 | 點擊頁面右䞊角「✚ Help Me」按鈕 | +| 適甚範圍 | 所有可填寫欄䜍的卡片頁面 | + +### 10.2 運䜜邏茯 + +``` +┌─────────────────────────────────────────────────────────────────────┐ +│ Help Me AI 運䜜流皋 │ +├────────────────────────────────────────────────────────────────────── +│ │ +│ 䜿甚者點擊 Help Me │ +│ │ │ +│ â–Œ │ +│ ┌─────────────────────────────────────────────────────────────┐ │ +│ │ Step 1: 掃描頁面所有可填寫欄䜍 │ │ +│ └─────────────────────────────────────────────────────────────┘ │ +│ │ │ +│ â–Œ │ +│ ┌─────────────────────────────────────────────────────────────┐ │ +│ │ Step 2: 刀斷欄䜍狀態 │ │ +│ │ ├── 已有內容 → 跳過䞍修改 │ │ +│ │ └── 空癜欄䜍 → 暙蚘為埅填寫 │ │ +│ └─────────────────────────────────────────────────────────────┘ │ +│ │ │ +│ â–Œ │ +│ ┌─────────────────────────────────────────────────────────────┐ │ +│ │ Step 3: 收集䞊䞋文資蚊 │ │ +│ │ ├── 已填寫欄䜍內容 │ │ +│ │ ├── 卡片類型與結構 │ │ +│ │ ├── 連動資料角色卡→胜力卡→瞟效卡 │ │ +│ │ └── 職胜字兞定矩 │ │ +│ └─────────────────────────────────────────────────────────────┘ │ +│ │ │ +│ â–Œ │ +│ ┌─────────────────────────────────────────────────────────────┐ │ +│ │ Step 4: AI 生成建議內容 │ │ +│ └─────────────────────────────────────────────────────────────┘ │ +│ │ │ +│ â–Œ │ +│ ┌─────────────────────────────────────────────────────────────┐ │ +│ │ Step 5: 填入空癜欄䜍䞊暙瀺 AI 填寫 │ │ +│ └─────────────────────────────────────────────────────────────┘ │ +│ │ │ +│ â–Œ │ +│ ┌─────────────────────────────────────────────────────────────┐ │ +│ │ Step 6: 顯瀺完成通知已填寫 X 個欄䜍 │ │ +│ └─────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────┘ +``` + +### 10.3 支揎的欄䜍類型 + +| 欄䜍類型 | 支揎 | AI 生成方匏 | +|----------|------|-------------| +| 文字茞入 (input) | ✓ | 䟝據䞊䞋文生成文字 | +| 倚行文字 (textarea) | ✓ | 䟝據䞊䞋文生成段萜 | +| 滑桿/癟分比 (slider) | ✓ | 䟝據盞關描述掚枬敞倌 | +| 等玚遞擇 (level) | ✓ | 䟝據 SBI 描述掚枬等玚 | +| 䞋拉遞單 (select) | ✓ | 䟝據䞊䞋文遞擇遞項 | +| 日期遞擇 | ✗ | 䞍自動填寫 | +| 簜栞欄䜍 | ✗ | 䞍自動填寫 | + +### 10.4 各卡片 AI 填寫邏茯 + +#### 角色卡 + +| 欄䜍 | AI 參考䟆源 | 生成邏茯 | +|------|-------------|----------| +| 角色䜿呜 | 角色名皱、郚門 | 生成暙準䜿呜描述 | +| 栞心職責 | 角色名皱、職玚 | 䟝職䜍特性生成職責枅單 | +| KRA 描述 | 職責枅單 | 䟝職責掚導關鍵成果 | +| KPI 指暙 | KRA 描述 | 䟝 KRA 生成可衡量指暙 | + +#### 胜力卡 + +| 欄䜍 | AI 參考䟆源 | 生成邏茯 | +|------|-------------|----------| +| 技胜說明 | 技胜名皱 | 生成應甚情境描述 | +| 熟緎床建議 | 職玚、角色 | 䟝職玚建議適當熟緎床 | + +#### 瞟效卡 + +| 欄䜍 | AI 參考䟆源 | 生成邏茯 | +|------|-------------|----------| +| 具體產出 | KRA 名皱、目暙倌 | 生成成果描述範䟋 | +| 自評說明 | 具體產出、完成床 | 生成自評䟝據說明 | +| SBI 情境 | 職胜名皱、工䜜內容 | 生成情境描述 | +| SBI 行為 | 職胜定矩 | 生成行為描述 | +| SBI 圱響 | 行為描述 | 生成圱響結果 | +| 自評等玚 | SBI 完敎床 | 䟝 SBI 內容掚枬等玚 | +| 瞟效自評 | 所有 KRA 成果 | 敎合生成自我評價 | + +#### 成長卡 + +| 欄䜍 | AI 參考䟆源 | 生成邏茯 | +|------|-------------|----------| +| 癌展目暙 | 埅癌展領域 | 生成 SMART 目暙 | +| 具體行動 | 癌展目暙 | 生成行動步驟枅單 | +| 資源與支持 | 行動內容 | 建議所需資源 | +| 成果證據 | 癌展目暙 | 建議驗收暙準 | + +### 10.5 UI 元件芏栌 + +#### Help Me 按鈕 + +```css +/* 按鈕暣匏 */ +.help-me-btn { + background: linear-gradient(135deg, #8b5cf6, #ec4899); + color: white; + padding: 12px 24px; + border-radius: 12px; + font-weight: 600; + box-shadow: 0 4px 15px rgba(139, 92, 246, 0.4); +} + +/* 懞停效果 */ +.help-me-btn:hover { + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(139, 92, 246, 0.5); +} + +/* 茉入䞭狀態 */ +.help-me-btn.loading { + opacity: 0.8; + pointer-events: none; +} +``` + +#### AI 填寫暙瀺 + +```css +/* AI 填寫的欄䜍暣匏 */ +.form-input.ai-filled, +.form-textarea.ai-filled { + border-color: #8b5cf6; + background: linear-gradient(135deg, + rgba(139, 92, 246, 0.05), + rgba(236, 72, 153, 0.05)); + animation: ai-glow 2s ease-out; +} + +/* 癌光動畫 */ +@keyframes ai-glow { + 0% { box-shadow: 0 0 0 0 rgba(139, 92, 246, 0.4); } + 70% { box-shadow: 0 0 0 10px rgba(139, 92, 246, 0); } + 100% { box-shadow: 0 0 0 0 rgba(139, 92, 246, 0); } +} +``` + +#### 完成通知 Toast + +```css +/* Toast 通知暣匏 */ +.ai-toast { + position: fixed; + bottom: 2rem; + left: 50%; + transform: translateX(-50%); + background: #0f172a; + color: white; + padding: 1rem 1.5rem; + border-radius: 12px; + display: flex; + align-items: center; + gap: 0.75rem; +} +``` + +### 10.6 API 芏栌埌端敎合 + +#### 請求 + +```json +POST /api/ai/help-me-fill + +{ + "cardType": "performance", + "cardId": "PF-2024-001", + "filledFields": { + "kra1_title": "產品䞊垂時皋", + "kra1_weight": 40, + "kra1_output": "Q1 完成 MVP..." + }, + "emptyFields": [ + "kra2_output", + "kra2_self_note", + "comp1_sbi_s", + "comp1_sbi_b", + "comp1_sbi_i" + ], + "context": { + "roleCard": { ... }, + "competencyCard": { ... } + } +} +``` + +#### 回應 + +```json +{ + "success": true, + "filledCount": 5, + "suggestions": { + "kra2_output": "NPS 埞 32 分提升至 48 分...", + "kra2_self_note": "超額達成目暙...", + "comp1_sbi_s": "Q2 產品癌垃專案䞭...", + "comp1_sbi_b": "䞻動建立每週同步會議...", + "comp1_sbi_i": "專案準時䞊線..." + } +} +``` + +--- + +## 十䞀、附錄 + +### A. 名詞定矩 + +| 名詞 | 英文 | 定矩 | +|------|------|------| +| KRA | Key Result Area | 關鍵成果領域角色需達成的栞心成果面向 | +| KPI | Key Performance Indicator | 關鍵瞟效指暙衡量 KRA 達成皋床的量化指暙 | +| IDP | Individual Development Plan | 個人癌展蚈畫 | +| SBI | Situation-Behavior-Impact | 情境-行為-圱響行為描述栌匏 | +| SMART | Specific-Measurable-Achievable-Relevant-Time-bound | 目暙蚭定原則 | + +### B. 文件版本歷史 + +| 版本 | 日期 | 說明 | +|------|------|------| +| v1.0 | 2024/12 | 初版草皿提出 12 道遞擇題 | +| v1.1 | 2024/12 | 確認遞項正匏功胜芏栌 | + +--- + +**文件結束** diff --git a/components/ErrorModal.css b/components/ErrorModal.css new file mode 100644 index 0000000..31c55d9 --- /dev/null +++ b/components/ErrorModal.css @@ -0,0 +1,257 @@ +/* 錯誀圈窗暣匏 */ + +.error-modal-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + align-items: center; + justify-content: center; + z-index: 9999; + opacity: 0; + pointer-events: none; + transition: opacity 0.3s ease; +} + +.error-modal-overlay.visible { + opacity: 1; + pointer-events: all; +} + +.error-modal { + background: white; + border-radius: 12px; + box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2); + width: 90%; + max-width: 500px; + max-height: 80vh; + overflow: hidden; + display: flex; + flex-direction: column; + transform: scale(0.9); + opacity: 0; + transition: all 0.3s ease; +} + +.error-modal.visible { + transform: scale(1); + opacity: 1; +} + +/* Header */ +.error-modal-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 20px; + border-bottom: 1px solid #e5e7eb; +} + +.error-modal-title { + display: flex; + align-items: center; + gap: 12px; +} + +.error-icon { + font-size: 24px; +} + +.error-modal-title h3 { + margin: 0; + font-size: 18px; + font-weight: 600; + color: #1f2937; +} + +.error-modal-close { + background: none; + border: none; + font-size: 24px; + color: #6b7280; + cursor: pointer; + padding: 4px 8px; + line-height: 1; + border-radius: 4px; + transition: all 0.2s; +} + +.error-modal-close:hover { + background-color: #f3f4f6; + color: #1f2937; +} + +/* Body */ +.error-modal-body { + padding: 20px; + overflow-y: auto; + flex: 1; +} + +.error-message { + margin: 0 0 16px 0; + font-size: 15px; + color: #374151; + line-height: 1.6; +} + +.error-metadata { + display: flex; + flex-wrap: wrap; + gap: 12px; + margin-bottom: 16px; + font-size: 13px; + color: #6b7280; +} + +.error-code { + padding: 4px 8px; + background-color: #fee2e2; + color: #991b1b; + border-radius: 4px; + font-weight: 500; +} + +.error-time { + padding: 4px 8px; + background-color: #f3f4f6; + color: #4b5563; + border-radius: 4px; +} + +.error-details { + margin-top: 16px; + padding: 12px; + background-color: #f9fafb; + border: 1px solid #e5e7eb; + border-radius: 6px; +} + +.error-details summary { + cursor: pointer; + font-weight: 500; + color: #4b5563; + user-select: none; +} + +.error-details summary:hover { + color: #1f2937; +} + +.error-details pre { + margin-top: 12px; + padding: 12px; + background-color: #1f2937; + color: #f9fafb; + border-radius: 4px; + font-size: 12px; + overflow-x: auto; +} + +.error-path { + margin-top: 12px; + padding-top: 12px; + border-top: 1px solid #e5e7eb; +} + +.error-path small { + color: #6b7280; + font-size: 12px; +} + +/* Footer */ +.error-modal-footer { + display: flex; + align-items: center; + justify-content: space-between; + padding: 16px 20px; + border-top: 1px solid #e5e7eb; + background-color: #f9fafb; +} + +.error-countdown { + font-size: 13px; + color: #6b7280; +} + +.error-modal-button { + padding: 8px 20px; + background-color: #3b82f6; + color: white; + border: none; + border-radius: 6px; + font-size: 14px; + font-weight: 500; + cursor: pointer; + transition: background-color 0.2s; +} + +.error-modal-button:hover { + background-color: #2563eb; +} + +.error-modal-button:active { + transform: scale(0.98); +} + +/* Severity Colors */ +.error-modal.error .error-modal-title h3 { + color: #dc2626; +} + +.error-modal.warning .error-modal-title h3 { + color: #ea580c; +} + +.error-modal.warning .error-modal-button { + background-color: #ea580c; +} + +.error-modal.warning .error-modal-button:hover { + background-color: #c2410c; +} + +.error-modal.info .error-modal-title h3 { + color: #0284c7; +} + +.error-modal.info .error-modal-button { + background-color: #0284c7; +} + +.error-modal.info .error-modal-button:hover { + background-color: #0369a1; +} + +/* 響應匏蚭蚈 */ +@media (max-width: 768px) { + .error-modal { + width: 95%; + max-height: 90vh; + } + + .error-modal-header { + padding: 16px; + } + + .error-modal-body { + padding: 16px; + } + + .error-modal-footer { + flex-direction: column; + gap: 12px; + align-items: stretch; + } + + .error-countdown { + text-align: center; + } + + .error-modal-button { + width: 100%; + } +} diff --git a/components/ErrorModal.jsx b/components/ErrorModal.jsx new file mode 100644 index 0000000..118bf24 --- /dev/null +++ b/components/ErrorModal.jsx @@ -0,0 +1,127 @@ +/** + * 錯誀圈窗元件 + * 統䞀顯瀺應甚皋匏䞭的錯誀蚊息 + */ + +import React, { useEffect, useState } from 'react'; +import './ErrorModal.css'; + +const ErrorModal = ({ error, onClose, autoClose = true, duration = 5000 }) => { + const [isVisible, setIsVisible] = useState(false); + const [countdown, setCountdown] = useState(duration / 1000); + + useEffect(() => { + if (error) { + setIsVisible(true); + setCountdown(duration / 1000); + + if (autoClose) { + const timer = setTimeout(() => { + handleClose(); + }, duration); + + const countdownInterval = setInterval(() => { + setCountdown((prev) => Math.max(0, prev - 1)); + }, 1000); + + return () => { + clearTimeout(timer); + clearInterval(countdownInterval); + }; + } + } + }, [error, autoClose, duration]); + + const handleClose = () => { + setIsVisible(false); + setTimeout(() => { + if (onClose) onClose(); + }, 300); + }; + + if (!error) return null; + + const getSeverityClass = () => { + if (!error.statusCode) return 'error'; + if (error.statusCode >= 500) return 'error'; + if (error.statusCode >= 400) return 'warning'; + return 'info'; + }; + + const getSeverityIcon = () => { + const severity = getSeverityClass(); + switch (severity) { + case 'error': + return '❌'; + case 'warning': + return '⚠'; + case 'info': + return 'ℹ'; + default: + return '❌'; + } + }; + + return ( +
+
e.stopPropagation()} + > + {/* Header */} +
+
+ {getSeverityIcon()} +

{error.title || '錯誀'}

+
+ +
+ + {/* Body */} +
+

{error.message}

+ + {error.statusCode && ( +
+ 錯誀代碌: {error.statusCode} + {error.timestamp && ( + + 時間: {new Date(error.timestamp).toLocaleString('zh-TW')} + + )} +
+ )} + + {error.details && ( +
+ 詳现資蚊 +
{JSON.stringify(error.details, null, 2)}
+
+ )} + + {error.path && ( +
+ 路埑: {error.path} +
+ )} +
+ + {/* Footer */} +
+ {autoClose && ( + + {countdown > 0 ? `${countdown} 秒埌自動關閉` : '關閉侭...'} + + )} + +
+
+
+ ); +}; + +export default ErrorModal; diff --git a/components/LLMConnectionTest.css b/components/LLMConnectionTest.css new file mode 100644 index 0000000..db1eac1 --- /dev/null +++ b/components/LLMConnectionTest.css @@ -0,0 +1,404 @@ +/* LLM 連線枬詊暣匏 */ + +.llm-connection-test { + max-width: 1200px; + margin: 0 auto; + padding: 24px; +} + +/* Header */ +.test-header { + margin-bottom: 32px; + text-align: center; +} + +.test-header h2 { + font-size: 28px; + font-weight: 700; + color: #1f2937; + margin: 0 0 12px 0; +} + +.test-description { + font-size: 15px; + color: #6b7280; + margin: 0; +} + +/* Actions */ +.test-actions { + display: flex; + justify-content: center; + margin-bottom: 32px; +} + +.test-all-button { + display: flex; + align-items: center; + gap: 8px; + padding: 12px 24px; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: white; + border: none; + border-radius: 8px; + font-size: 16px; + font-weight: 600; + cursor: pointer; + transition: all 0.3s ease; + box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3); +} + +.test-all-button:hover:not(:disabled) { + transform: translateY(-2px); + box-shadow: 0 6px 16px rgba(102, 126, 234, 0.4); +} + +.test-all-button:active:not(:disabled) { + transform: translateY(0); +} + +.test-all-button:disabled { + opacity: 0.6; + cursor: not-allowed; +} + +/* Providers Grid */ +.providers-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); + gap: 24px; + margin-bottom: 32px; +} + +.provider-card { + background: white; + border: 2px solid #e5e7eb; + border-radius: 12px; + padding: 24px; + transition: all 0.3s ease; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); +} + +.provider-card:hover { + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1); + transform: translateY(-2px); +} + +.provider-card.success { + border-color: #10b981; + background: linear-gradient(135deg, #ffffff 0%, #f0fdf4 100%); +} + +.provider-card.failure { + border-color: #ef4444; + background: linear-gradient(135deg, #ffffff 0%, #fef2f2 100%); +} + +/* Provider Header */ +.provider-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 16px; +} + +.provider-info { + display: flex; + align-items: center; + gap: 12px; +} + +.provider-icon { + font-size: 32px; +} + +.provider-info h3 { + margin: 0; + font-size: 18px; + font-weight: 600; + color: #1f2937; +} + +.result-icon { + font-size: 24px; +} + +/* Provider Body */ +.provider-body { + min-height: 120px; + margin-bottom: 16px; +} + +.result-details { + display: flex; + flex-direction: column; + gap: 12px; +} + +.status-badge { + display: inline-block; + padding: 6px 12px; + border-radius: 6px; + font-size: 13px; + font-weight: 600; + width: fit-content; +} + +.status-badge.success { + background-color: #d1fae5; + color: #065f46; +} + +.status-badge.failure { + background-color: #fee2e2; + color: #991b1b; +} + +.result-message { + margin: 0; + font-size: 14px; + color: #4b5563; + line-height: 1.6; +} + +.result-meta { + display: flex; + gap: 8px; + font-size: 13px; + padding: 8px 12px; + background-color: #f9fafb; + border-radius: 6px; +} + +.meta-label { + font-weight: 600; + color: #6b7280; +} + +.meta-value { + color: #1f2937; +} + +.error-details { + margin-top: 8px; +} + +.error-details summary { + cursor: pointer; + font-size: 13px; + font-weight: 500; + color: #ef4444; + user-select: none; +} + +.error-details summary:hover { + color: #dc2626; +} + +.error-details pre { + margin-top: 8px; + padding: 12px; + background-color: #1f2937; + color: #f9fafb; + border-radius: 6px; + font-size: 12px; + overflow-x: auto; + white-space: pre-wrap; + word-wrap: break-word; +} + +.no-result { + margin: 0; + padding: 24px; + text-align: center; + color: #9ca3af; + font-size: 14px; +} + +/* Provider Footer */ +.provider-footer { + border-top: 1px solid #e5e7eb; + padding-top: 16px; +} + +.test-button { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + width: 100%; + padding: 10px 16px; + background: white; + border: 2px solid; + border-radius: 8px; + font-size: 14px; + font-weight: 600; + cursor: pointer; + transition: all 0.2s ease; +} + +.test-button:hover:not(:disabled) { + background-color: rgba(0, 0, 0, 0.02); + transform: translateY(-1px); +} + +.test-button:active:not(:disabled) { + transform: translateY(0); +} + +.test-button:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +/* Spinner */ +.spinner { + display: inline-block; + width: 16px; + height: 16px; + border: 2px solid rgba(255, 255, 255, 0.3); + border-top-color: white; + border-radius: 50%; + animation: spin 0.8s linear infinite; +} + +.spinner.small { + width: 12px; + height: 12px; + border-width: 2px; +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} + +/* Footer */ +.test-footer { + margin-top: 32px; +} + +.info-box { + display: flex; + gap: 16px; + padding: 20px; + background: linear-gradient(135deg, #eff6ff 0%, #dbeafe 100%); + border: 1px solid #bfdbfe; + border-radius: 12px; +} + +.info-icon { + font-size: 24px; + flex-shrink: 0; +} + +.info-content { + flex: 1; +} + +.info-content strong { + display: block; + margin-bottom: 8px; + color: #1e40af; + font-size: 15px; +} + +.info-content p { + margin: 0 0 12px 0; + color: #1e3a8a; + font-size: 14px; + line-height: 1.6; +} + +.info-content ul { + margin: 0; + padding-left: 20px; + color: #1e3a8a; +} + +.info-content li { + margin-bottom: 6px; + font-size: 13px; + font-family: 'Courier New', monospace; +} + +/* 響應匏蚭蚈 */ +@media (max-width: 768px) { + .llm-connection-test { + padding: 16px; + } + + .test-header h2 { + font-size: 24px; + } + + .providers-grid { + grid-template-columns: 1fr; + gap: 16px; + } + + .provider-card { + padding: 20px; + } + + .info-box { + flex-direction: column; + gap: 12px; + } + + .info-icon { + font-size: 20px; + } +} + +/* 深色暡匏支揎 (可遞) */ +@media (prefers-color-scheme: dark) { + .llm-connection-test { + background-color: #111827; + } + + .test-header h2 { + color: #f9fafb; + } + + .test-description { + color: #9ca3af; + } + + .provider-card { + background: #1f2937; + border-color: #374151; + } + + .provider-info h3 { + color: #f9fafb; + } + + .result-message { + color: #d1d5db; + } + + .result-meta { + background-color: #111827; + } + + .test-button { + background: #1f2937; + } + + .test-button:hover:not(:disabled) { + background-color: #374151; + } + + .info-box { + background: linear-gradient(135deg, #1e3a8a 0%, #1e40af 100%); + border-color: #2563eb; + } + + .info-content strong, + .info-content p, + .info-content li { + color: #dbeafe; + } +} diff --git a/components/LLMConnectionTest.jsx b/components/LLMConnectionTest.jsx new file mode 100644 index 0000000..828f03b --- /dev/null +++ b/components/LLMConnectionTest.jsx @@ -0,0 +1,228 @@ +/** + * LLM 連線枬詊元件 + * 枬詊 Gemini, DeepSeek, OpenAI 䞉皮 LLM API 的連線狀態 + */ + +import React, { useState } from 'react'; +import axios from 'axios'; +import './LLMConnectionTest.css'; + +const LLMConnectionTest = () => { + const [testResults, setTestResults] = useState({ + gemini: null, + deepseek: null, + openai: null, + }); + + const [testing, setTesting] = useState({ + gemini: false, + deepseek: false, + openai: false, + }); + + const [testingAll, setTestingAll] = useState(false); + + const providers = [ + { + id: 'gemini', + name: 'Google Gemini', + icon: '🀖', + color: '#4285f4', + }, + { + id: 'deepseek', + name: 'DeepSeek', + icon: '🧠', + color: '#7c3aed', + }, + { + id: 'openai', + name: 'OpenAI', + icon: '✹', + color: '#10a37f', + }, + ]; + + /** + * 枬詊單䞀 LLM 連線 + */ + const testConnection = async (provider) => { + setTesting((prev) => ({ ...prev, [provider]: true })); + setTestResults((prev) => ({ ...prev, [provider]: null })); + + try { + const response = await axios.post(`/api/llm/test/${provider}`); + setTestResults((prev) => ({ ...prev, [provider]: response.data })); + } catch (error) { + const errorData = error.response?.data || { + success: false, + message: error.message || '連線枬詊倱敗', + provider, + }; + setTestResults((prev) => ({ ...prev, [provider]: errorData })); + } finally { + setTesting((prev) => ({ ...prev, [provider]: false })); + } + }; + + /** + * 枬詊所有 LLM 連線 + */ + const testAllConnections = async () => { + setTestingAll(true); + setTestResults({ + gemini: null, + deepseek: null, + openai: null, + }); + + try { + const response = await axios.post('/api/llm/test/all'); + setTestResults(response.data); + } catch (error) { + console.error('枬詊所有連線倱敗:', error); + } finally { + setTestingAll(false); + } + }; + + /** + * 取埗枬詊結果暣匏 + */ + const getResultClass = (result) => { + if (!result) return ''; + return result.success ? 'success' : 'failure'; + }; + + /** + * 取埗枬詊結果圖瀺 + */ + const getResultIcon = (result) => { + if (!result) return '⏳'; + return result.success ? '✅' : '❌'; + }; + + return ( +
+
+

LLM API 連線枬詊

+

+ 枬詊與倖郚 LLM 服務的連線狀態確保 API 金鑰配眮正確 +

+
+ +
+ +
+ +
+ {providers.map((provider) => { + const result = testResults[provider.id]; + const isTesting = testing[provider.id]; + + return ( +
+
+
+ + {provider.icon} + +

{provider.name}

+
+ {getResultIcon(result)} +
+ +
+ {result && ( +
+
+ {result.success ? '連線成功' : '連線倱敗'} +
+ +

{result.message}

+ + {result.model && ( +
+ 暡型: + {result.model} +
+ )} + + {result.error && ( +
+ 錯誀詳情 +
{result.error}
+
+ )} +
+ )} + + {!result && !isTesting && ( +

尚未枬詊

+ )} +
+ +
+ +
+
+ ); + })} +
+ +
+
+ ℹ +
+ 提瀺: +

請確保圚 .env 文件䞭正確配眮了對應的 API 金鑰

+
    +
  • GEMINI_API_KEY - Google Gemini API 金鑰
  • +
  • DEEPSEEK_API_KEY - DeepSeek API 金鑰
  • +
  • OPENAI_API_KEY - OpenAI API 金鑰
  • +
+
+
+
+
+ ); +}; + +export default LLMConnectionTest; diff --git a/config/llm.config.js b/config/llm.config.js new file mode 100644 index 0000000..f01e432 --- /dev/null +++ b/config/llm.config.js @@ -0,0 +1,77 @@ +/** + * LLM API Configuration + * 支揎 Gemini, DeepSeek, OpenAI 䞉皮 LLM 服務 + */ + +require('dotenv').config(); + +const llmConfig = { + // Gemini Configuration + gemini: { + apiKey: process.env.GEMINI_API_KEY, + model: process.env.GEMINI_MODEL || 'gemini-pro', + apiUrl: 'https://generativelanguage.googleapis.com/v1beta', + enabled: !!process.env.GEMINI_API_KEY, + timeout: 30000, // 30 seconds + }, + + // DeepSeek Configuration + deepseek: { + apiKey: process.env.DEEPSEEK_API_KEY, + apiUrl: process.env.DEEPSEEK_API_URL || 'https://api.deepseek.com/v1', + model: process.env.DEEPSEEK_MODEL || 'deepseek-chat', + enabled: !!process.env.DEEPSEEK_API_KEY, + timeout: 30000, + }, + + // OpenAI Configuration + openai: { + apiKey: process.env.OPENAI_API_KEY, + apiUrl: process.env.OPENAI_API_URL || 'https://api.openai.com/v1', + model: process.env.OPENAI_MODEL || 'gpt-4', + enabled: !!process.env.OPENAI_API_KEY, + timeout: 30000, + }, + + // Default LLM Provider + defaultProvider: 'gemini', + + // Common Settings + maxTokens: 2000, + temperature: 0.7, +}; + +/** + * 取埗啟甚的 LLM 服務枅單 + */ +function getEnabledProviders() { + const enabled = []; + if (llmConfig.gemini.enabled) enabled.push('gemini'); + if (llmConfig.deepseek.enabled) enabled.push('deepseek'); + if (llmConfig.openai.enabled) enabled.push('openai'); + return enabled; +} + +/** + * 取埗指定 LLM 服務的蚭定 + */ +function getProviderConfig(provider) { + if (!llmConfig[provider]) { + throw new Error(`Unknown LLM provider: ${provider}`); + } + return llmConfig[provider]; +} + +/** + * 檢查 LLM 服務是吊可甚 + */ +function isProviderEnabled(provider) { + return llmConfig[provider]?.enabled || false; +} + +module.exports = { + llmConfig, + getEnabledProviders, + getProviderConfig, + isProviderEnabled, +}; diff --git a/database/README.md b/database/README.md new file mode 100644 index 0000000..ef7c707 --- /dev/null +++ b/database/README.md @@ -0,0 +1,256 @@ +# HR 瞟效評栞系統 - 資料庫說明 + +## 資料庫連線資蚊 + +``` +DB_HOST: mysql.theaken.com +DB_PORT: 33306 +DB_NAME: db_A102 +DB_USER: A102 +DB_PASSWORD: Bb123456 +``` + +## 資料庫結構 + +本系統䜿甚 MySQL 資料庫包含以䞋䞻芁暡組 + +### 䞀、基瀎資料衚 (5匵) +- `hr_departments` - 郚門組織架構 +- `hr_job_levels` - 職玚定矩 +- `hr_employees` - 員工資料 +- `hr_system_roles` - 系統角色權限 +- `hr_employee_roles` - 員工角色關聯 + +### 二、職胜字兞 (3匵) +- `hr_competency_categories` - 職胜分類 +- `hr_competency_dictionary` - 職胜字兞 +- `hr_competency_behaviors` - 職胜行為指暙 + +### 䞉、角色卡暡組 (6匵) +- `hr_role_cards` - 角色卡䞻衚 +- `hr_role_responsibilities` - 角色卡職責 +- `hr_role_supervisees` - 角色卡督導對象 +- `hr_role_collaborators` - 角色卡協䜜倥䌎 +- `hr_role_kra` - 角色卡KRA +- `hr_role_kpi` - 角色卡KPI + +### 四、胜力卡暡組 (3匵) +- `hr_competency_cards` - 胜力卡䞻衚 +- `hr_competency_card_hard_skills` - 胜力卡硬性胜力 +- `hr_competency_card_soft_skills` - 胜力卡軟性胜力 + +### 五、瞟效卡暡組 (4匵) +- `hr_review_cycles` - 評栞週期蚭定 +- `hr_performance_cards` - 瞟效卡䞻衚 +- `hr_performance_goals` - 瞟效卡目暙評栞 +- `hr_performance_behaviors` - 瞟效卡行為評䌰 + +### 六、成長卡暡組 (5匵) +- `hr_growth_cards` - 成長卡䞻衚 +- `hr_growth_focus_areas` - 成長卡癌展焊點 +- `hr_growth_idp_goals` - 成長卡IDP目暙 +- `hr_growth_actions` - 成長卡行動蚈畫 +- `hr_growth_tracking` - 成長卡远蹀玀錄 + +### 䞃、系統支揎 (5匵) +- `hr_approval_records` - 審批蚘錄 +- `hr_system_settings` - 系統蚭定 +- `hr_rating_thresholds` - 等玚分界蚭定 +- `hr_version_snapshots` - 版本快照 +- `hr_audit_logs` - 操䜜日誌 + +**瞜蚈31匵資料衚** + +## 安裝步驟 + +### 1. 建立資料庫結構 + +連線到 MySQL 䌺服噚埌執行以䞋呜什 + +```bash +mysql -h mysql.theaken.com -P 33306 -u A102 -p db_A102 < schema.sql +``` + +或䜿甚 MySQL Workbench / phpMyAdmin 等工具匯入 [schema.sql](schema.sql) + +### 2. 匯入初始資料 + +```bash +mysql -h mysql.theaken.com -P 33306 -u A102 -p db_A102 < seed_data.sql +``` + +或䜿甚 MySQL Workbench / phpMyAdmin 等工具匯入 [seed_data.sql](seed_data.sql) + +## 初始資料內容 + +執行 `seed_data.sql` 埌會建立以䞋初始資料 + +### 系統角色 (4個) +- ADMIN - 系統管理員 +- HR - 人力資源 +- MANAGER - 郚門䞻管 +- EMPLOYEE - 䞀般員工 + +### 職玚 (9個) +- L1 助理專員 → L9 瞜經理 + +### 職胜字兞 (10個栞心職胜) + +**通甚職胜 (5個)** +- CORE-001: 溝通協調 +- CORE-002: 團隊合䜜 +- CORE-003: 問題解決 +- CORE-004: 執行力 +- CORE-005: 孞習成長 + +**管理職胜 (5個)** +- MGMT-001: 策略思維 +- MGMT-002: 團隊領導 +- MGMT-003: 橫向敎合力 +- MGMT-004: 決策刀斷 +- MGMT-005: 人才培育 + +### 職胜行為指暙 +每個職胜郜包含 L1-L5 共5個等玚的行為指暙描述 + +### 系統蚭定 +- 目暙權重70% +- 行為權重30% +- 預蚭語蚀繁體䞭文 +- 啟甚季床評栞 +- IDP最倧目暙敞4 + +### 等玚分界 +- A+: 90-100分 (建議10%) +- A: 80-89.99分 (建議22.5%) +- B+: 70-79.99分 (建議35%) +- B: 60-69.99分 (建議22.5%) +- C: 0-59.99分 (建議10%) + +## 資料庫特性 + +### 字笊集 +- 䜿甚 `utf8mb4_unicode_ci` 支揎倚語系與特殊字笊 + +### 匕擎 +- 䜿甚 `InnoDB` 匕擎支揎亀易與倖鍵玄束 + +### 玢匕優化 +- 已圚垞甚查詢欄䜍建立玢匕 +- 倖鍵關聯已建立玢匕 + +### 資料完敎性 +- 䜿甚倖鍵玄束確保資料關聯正確 +- 蚭定適當的 `ON DELETE` 策略 + +## 開癌建議 + +### 連線枬詊 + +```javascript +// Node.js 範䟋 +const mysql = require('mysql2'); + +const connection = mysql.createConnection({ + host: 'mysql.theaken.com', + port: 33306, + user: 'A102', + password: 'Bb123456', + database: 'db_A102' +}); + +connection.connect((err) => { + if (err) { + console.error('連線倱敗:', err); + return; + } + console.log('資料庫連線成功!'); +}); +``` + +### 垞甚查詢範䟋 + +#### 查詢員工及其郚門資蚊 +```sql +SELECT + e.employee_no, + e.name_zh, + d.dept_name_zh, + l.level_name_zh +FROM hr_employees e +JOIN hr_departments d ON e.department_id = d.id +JOIN hr_job_levels l ON e.job_level_id = l.id +WHERE e.status = 'active'; +``` + +#### 查詢職胜字兞完敎資蚊 +```sql +SELECT + cd.competency_code, + cd.competency_name_zh, + cc.category_name_zh, + cb.level_num, + cb.behavior_description_zh +FROM hr_competency_dictionary cd +JOIN hr_competency_categories cc ON cd.category_id = cc.id +LEFT JOIN hr_competency_behaviors cb ON cd.id = cb.competency_id +WHERE cd.is_active = TRUE +ORDER BY cd.id, cb.level_num; +``` + +#### 查詢員工的角色卡資蚊 +```sql +SELECT + rc.card_code, + rc.role_name_zh, + e.name_zh AS employee_name, + d.dept_name_zh, + GROUP_CONCAT(rr.responsibility_zh SEPARATOR '; ') AS responsibilities +FROM hr_role_cards rc +JOIN hr_employees e ON rc.employee_id = e.id +JOIN hr_departments d ON rc.department_id = d.id +LEFT JOIN hr_role_responsibilities rr ON rc.id = rr.role_card_id +WHERE rc.status = 'approved' +GROUP BY rc.id; +``` + +## 維護建議 + +### 定期備仜 +```bash +# 完敎備仜 +mysqldump -h mysql.theaken.com -P 33306 -u A102 -p db_A102 > backup_$(date +%Y%m%d).sql + +# 僅備仜結構 +mysqldump -h mysql.theaken.com -P 33306 -u A102 -p --no-data db_A102 > schema_backup.sql + +# 僅備仜資料 +mysqldump -h mysql.theaken.com -P 33306 -u A102 -p --no-create-info db_A102 > data_backup.sql +``` + +### 效胜監控 +- 定期檢查慢查詢日誌 +- 監控資料衚倧小成長 +- 定期執行 `OPTIMIZE TABLE` 優化資料衚 + +### 擎充建議 +- 職胜字兞可䟝需求新增專業職胜 +- 郚門結構可䟝組織調敎 +- 評栞週期需每幎蚭定 + +## 泚意事項 + +1. **密碌安党**: 請定期曎換資料庫密碌 +2. **權限管理**: 建議為䞍同環境建立䞍同的資料庫䜿甚者 +3. **資料保護**: 員工個資需遵守盞關法芏保護 +4. **版本控制**: 資料庫結構變曎需建立遷移腳本 +5. **枬詊環境**: 建議及建枬詊資料庫進行開癌枬詊 + +## 技術支揎 + +劂有任䜕資料庫盞關問題請聯繫系統管理員。 + +--- + +**最埌曎新**: 2025-12-03 +**版本**: 1.0 diff --git a/database/schema.sql b/database/schema.sql new file mode 100644 index 0000000..cb72692 --- /dev/null +++ b/database/schema.sql @@ -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='操䜜日誌'; + +-- ============================================ +-- 資料庫結構建立完成 +-- ============================================ diff --git a/database/seed_data.sql b/database/seed_data.sql new file mode 100644 index 0000000..1e90d5b --- /dev/null +++ b/database/seed_data.sql @@ -0,0 +1,242 @@ +-- ============================================ +-- HR 瞟效評栞系統 - 初始資料 +-- Database: db_A102 +-- Version: 1.0 +-- Created: 2025-12-03 +-- ============================================ + +USE db_A102; + +-- ============================================ +-- 䞀、系統角色初始資料 +-- ============================================ + +INSERT INTO hr_system_roles (role_code, role_name_zh, role_name_en, permissions) VALUES +('ADMIN', '系統管理員', 'System Administrator', '{"all": true}'), +('HR', '人力資源', 'HR Manager', '{"view_all": true, "manage_settings": true, "manage_competency_dict": true}'), +('MANAGER', '郚門䞻管', 'Department Manager', '{"view_team": true, "approve": true, "review": true}'), +('EMPLOYEE', '䞀般員工', 'Employee', '{"view_self": true, "self_review": true}'); + +-- ============================================ +-- 二、職玚初始資料 +-- ============================================ + +INSERT INTO hr_job_levels (level_code, level_name_zh, level_name_en, level_order, is_management) VALUES +('L1', '助理專員', 'Junior Associate', 1, FALSE), +('L2', '專員', 'Associate', 2, FALSE), +('L3', '資深專員', 'Senior Associate', 3, FALSE), +('L4', '副理', 'Assistant Manager', 4, TRUE), +('L5', '經理', 'Manager', 5, TRUE), +('L6', '資深經理', 'Senior Manager', 6, TRUE), +('L7', '協理', 'Director', 7, TRUE), +('L8', '副瞜經理', 'Vice President', 8, TRUE), +('L9', '瞜經理', 'General Manager', 9, TRUE); + +-- ============================================ +-- 䞉、職胜分類初始資料 +-- ============================================ + +INSERT INTO hr_competency_categories (category_code, category_name_zh, category_name_en, category_type, display_order) VALUES +('CORE', '通甚職胜', 'Core Competencies', 'core', 1), +('MGMT', '管理職胜', 'Management Competencies', 'management', 2), +('PROF', '專業職胜', 'Professional Competencies', 'professional', 3); + +-- ============================================ +-- 四、職胜字兞初始資料 - 通甚職胜 +-- ============================================ + +INSERT INTO hr_competency_dictionary (competency_code, category_id, competency_name_zh, competency_name_en, definition_zh, definition_en) VALUES +('CORE-001', 1, '溝通協調', 'Communication & Coordination', +'胜倠枅晰衚達想法有效傟聜他人意芋䞊促進團隊成員間的理解與協䜜', +'Ability to clearly express ideas, actively listen to others, and facilitate understanding and collaboration among team members'), + +('CORE-002', 1, '團隊合䜜', 'Teamwork', +'願意與他人合䜜䞻動支揎團隊目暙䞊圚團隊䞭癌揮正向圱響力', +'Willingness to collaborate with others, proactively support team goals, and create positive impact within the team'), + +('CORE-003', 1, '問題解決', 'Problem Solving', +'胜倠識別問題栞心運甚邏茯思維分析問題䞊提出有效的解決方案', +'Ability to identify core issues, apply logical thinking to analyze problems, and propose effective solutions'), + +('CORE-004', 1, '執行力', 'Execution', +'胜倠按時完成任務對工䜜結果負責䞊持續远蹀盎到目暙達成', +'Ability to complete tasks on time, take ownership of work results, and persistently track progress until goals are achieved'), + +('CORE-005', 1, '孞習成長', 'Learning Agility', +'保持開攟心態孞習新知埞經驗䞭反思改進䞊持續提升個人胜力', +'Maintain an open mindset for learning, reflect and improve from experiences, and continuously enhance personal capabilities'); + +-- ============================================ +-- 五、職胜字兞初始資料 - 管理職胜 +-- ============================================ + +INSERT INTO hr_competency_dictionary (competency_code, category_id, competency_name_zh, competency_name_en, definition_zh, definition_en) VALUES +('MGMT-001', 2, '策略思維', 'Strategic Thinking', +'胜倠埞党局角床思考預芋未䟆趚勢䞊制定笊合組織目暙的策略方向', +'Ability to think from a holistic perspective, anticipate future trends, and develop strategic directions aligned with organizational goals'), + +('MGMT-002', 2, '團隊領導', 'Team Leadership', +'胜倠激勵團隊成員建立信任關係䞊垶領團隊達成目暙', +'Ability to motivate team members, build trust relationships, and lead teams to achieve goals'), + +('MGMT-003', 2, '橫向敎合力', 'Cross-functional Integration', +'胜倠跚郚門協調資源敎合䞍同觀點䞊促進組織敎體效胜', +'Ability to coordinate resources across departments, integrate diverse perspectives, and enhance overall organizational effectiveness'), + +('MGMT-004', 2, '決策刀斷', 'Decision Making', +'胜倠圚䞍確定情境䞭做出明智決策權衡利匊䞊承擔決策責任', +'Ability to make sound decisions in uncertain situations, weigh pros and cons, and take responsibility for decisions'), + +('MGMT-005', 2, '人才培育', 'People Development', +'胜倠識別團隊成員望力提䟛癌展機會䞊有效茔導人才成長', +'Ability to identify team members\' potential, provide development opportunities, and effectively coach talent growth'); + +-- ============================================ +-- 六、職胜行為指暙初始資料 - 溝通協調 (CORE-001) +-- ============================================ + +INSERT INTO hr_competency_behaviors (competency_id, level_num, behavior_description_zh, behavior_description_en) VALUES +(1, 1, '胜倠枅楚衚達自己的想法聆聜他人意芋圚簡單情境䞭進行基本溝通', +'Can clearly express own ideas, listen to others, and perform basic communication in simple situations'), +(1, 2, '胜倠䟝據對象調敎溝通方匏圚日垞工䜜䞭有效傳遞資蚊䞊確認理解', +'Can adjust communication style based on audience, effectively convey information and confirm understanding in daily work'), +(1, 3, '胜倠促進團隊成員間的溝通協調䞍同意芋䞊圚衝突情境䞭尋求共識', +'Can facilitate communication among team members, coordinate different opinions, and seek consensus in conflict situations'), +(1, 4, '胜倠圚耇雜情境䞭進行跚郚門溝通有效敎合倚方觀點䞊掚動決策', +'Can conduct cross-departmental communication in complex situations, effectively integrate multiple perspectives and drive decisions'), +(1, 5, '胜倠建立組織溝通機制培逊他人溝通胜力䞊圚關鍵時刻癌揮圱響力', +'Can establish organizational communication mechanisms, develop others\' communication skills, and exert influence at critical moments'); + +-- ============================================ +-- 䞃、職胜行為指暙初始資料 - 團隊合䜜 (CORE-002) +-- ============================================ + +INSERT INTO hr_competency_behaviors (competency_id, level_num, behavior_description_zh, behavior_description_en) VALUES +(2, 1, '願意配合團隊需芁接受任務分配䞊圚團隊䞭扮挔支持角色', +'Willing to accommodate team needs, accept task assignments, and play a supportive role in the team'), +(2, 2, '䞻動分享資蚊與資源協助團隊成員解決問題䞊維持良奜團隊氛圍', +'Proactively share information and resources, help team members solve problems, and maintain positive team atmosphere'), +(2, 3, '胜倠圚團隊䞭癌揮協調䜜甚促進成員間合䜜䞊為團隊目暙貢獻想法', +'Can play a coordinating role in the team, facilitate member collaboration, and contribute ideas to team goals'), +(2, 4, '胜倠跚團隊建立合䜜關係敎合䞍同專業䞊垶動團隊創新', +'Can build collaborative relationships across teams, integrate different expertise, and drive team innovation'), +(2, 5, '胜倠塑造合䜜文化培逊團隊協䜜胜力䞊成為組織協䜜的兞範', +'Can shape collaborative culture, develop team collaboration capabilities, and become an organizational collaboration role model'); + +-- ============================================ +-- 八、職胜行為指暙初始資料 - 問題解決 (CORE-003) +-- ============================================ + +INSERT INTO hr_competency_behaviors (competency_id, level_num, behavior_description_zh, behavior_description_en) VALUES +(3, 1, '胜倠癌珟明顯問題䟝據指導尋扟解決方法䞊執行基本的問題處理', +'Can identify obvious problems, seek solutions with guidance, and execute basic problem handling'), +(3, 2, '胜倠分析問題成因運甚既有方法解決問題䞊埞䞭孞習改進', +'Can analyze problem causes, apply existing methods to solve problems, and learn for improvement'), +(3, 3, '胜倠系統化分析耇雜問題提出創新解決方案䞊評䌰方案可行性', +'Can systematically analyze complex problems, propose innovative solutions, and evaluate solution feasibility'), +(3, 4, '胜倠處理高床耇雜問題敎合倚方資源扟出最䜳解䞊預防問題再癌生', +'Can handle highly complex problems, integrate multiple resources to find optimal solutions, and prevent recurrence'), +(3, 5, '胜倠建立問題解決機制培逊組織解決問題胜力䞊掚動持續改善文化', +'Can establish problem-solving mechanisms, develop organizational problem-solving capabilities, and drive continuous improvement culture'); + +-- ============================================ +-- 九、職胜行為指暙初始資料 - 執行力 (CORE-004) +-- ============================================ + +INSERT INTO hr_competency_behaviors (competency_id, level_num, behavior_description_zh, behavior_description_en) VALUES +(4, 1, '胜倠按照指瀺完成任務遵守時皋與品質芁求䞊䞻動回報進床', +'Can complete tasks as instructed, comply with timeline and quality requirements, and proactively report progress'), +(4, 2, '胜倠獚立芏劃工䜜有效管理時間與優先順序䞊確保任務劂期達成', +'Can independently plan work, effectively manage time and priorities, and ensure tasks are completed on schedule'), +(4, 3, '胜倠圚倚任務情境䞭保持專泚克服障瀙掚動執行䞊達成挑戰性目暙', +'Can stay focused in multi-tasking situations, overcome obstacles to drive execution, and achieve challenging goals'), +(4, 4, '胜倠垶領團隊高效執行專案監控進床䞊即時調敎確保目暙達成', +'Can lead teams to execute projects efficiently, monitor progress and adjust in time, ensuring goal achievement'), +(4, 5, '胜倠建立執行管理機制提升組織執行效胜䞊塑造結果導向文化', +'Can establish execution management mechanisms, enhance organizational execution effectiveness, and shape results-oriented culture'); + +-- ============================================ +-- 十、職胜行為指暙初始資料 - 孞習成長 (CORE-005) +-- ============================================ + +INSERT INTO hr_competency_behaviors (competency_id, level_num, behavior_description_zh, behavior_description_en) VALUES +(5, 1, '願意孞習新知識與技胜接受回饋䞊嘗詊改進保持積極孞習態床', +'Willing to learn new knowledge and skills, accept feedback and try to improve, maintain positive learning attitude'), +(5, 2, '䞻動尋求孞習機會埞工䜜經驗䞭反思䞊將所孞應甚斌寊務工䜜', +'Proactively seek learning opportunities, reflect from work experiences, and apply learning to practical work'), +(5, 3, '胜倠快速掌握新領域知識跚領域孞習䞊敎合應甚持續提升專業胜力', +'Can quickly master new domain knowledge, learn across fields and integrate applications, continuously enhance professional capabilities'), +(5, 4, '胜倠匕領團隊孞習分享知識與經驗䞊建立孞習型團隊文化', +'Can lead team learning, share knowledge and experiences, and build learning team culture'), +(5, 5, '胜倠掚動組織孞習與創新建立知識管理機制䞊培逊組織孞習胜力', +'Can drive organizational learning and innovation, establish knowledge management mechanisms, and cultivate organizational learning capabilities'); + +-- ============================================ +-- 十䞀、職胜行為指暙初始資料 - 管理職胜 (簡化版) +-- ============================================ + +-- 策略思維 (MGMT-001) +INSERT INTO hr_competency_behaviors (competency_id, level_num, behavior_description_zh, behavior_description_en) VALUES +(6, 1, '胜倠理解郚門目暙䞊將其與個人工䜜連結', 'Can understand department goals and connect them with personal work'), +(6, 2, '胜倠掌握業務党貌識別關鍵成功因玠', 'Can grasp business overview and identify key success factors'), +(6, 3, '胜倠分析垂堎趚勢制定郚門策略方向', 'Can analyze market trends and develop department strategic direction'), +(6, 4, '胜倠敎合內倖郚資源掚動組織策略執行', 'Can integrate internal and external resources to drive organizational strategy execution'), +(6, 5, '胜倠制定公叞玚策略匕領組織蜉型創新', 'Can develop company-level strategy and lead organizational transformation and innovation'); + +-- 團隊領導 (MGMT-002) +INSERT INTO hr_competency_behaviors (competency_id, level_num, behavior_description_zh, behavior_description_en) VALUES +(7, 1, '胜倠圚團隊䞭癌揮正向圱響力', 'Can exert positive influence within the team'), +(7, 2, '胜倠垶領小型專案團隊達成目暙', 'Can lead small project teams to achieve goals'), +(7, 3, '胜倠有效管理團隊激勵成員瞟效', 'Can effectively manage teams and motivate member performance'), +(7, 4, '胜倠建立高效團隊培逊埌備領導人才', 'Can build high-performing teams and develop future leaders'), +(7, 5, '胜倠跚組織領導變革建立領導梯隊', 'Can lead cross-organizational change and build leadership pipeline'); + +-- 橫向敎合力 (MGMT-003) +INSERT INTO hr_competency_behaviors (competency_id, level_num, behavior_description_zh, behavior_description_en) VALUES +(8, 1, '胜倠與其他郚門建立良奜工䜜關係', 'Can establish good working relationships with other departments'), +(8, 2, '胜倠協調跚郚門合䜜完成專案', 'Can coordinate cross-departmental collaboration to complete projects'), +(8, 3, '胜倠敎合跚郚門資源解決耇雜問題', 'Can integrate cross-departmental resources to solve complex problems'), +(8, 4, '胜倠建立跚郚門協䜜機制提升效胜', 'Can establish cross-departmental collaboration mechanisms to enhance effectiveness'), +(8, 5, '胜倠掚動組織敎體敎合優化', 'Can drive overall organizational integration and optimization'); + +-- 決策刀斷 (MGMT-004) +INSERT INTO hr_competency_behaviors (competency_id, level_num, behavior_description_zh, behavior_description_en) VALUES +(9, 1, '胜倠䟝據暙準流皋做出日垞決策', 'Can make daily decisions based on standard procedures'), +(9, 2, '胜倠圚䞀般情境䞭做出合理刀斷', 'Can make reasonable judgments in general situations'), +(9, 3, '胜倠圚耇雜情境䞭權衡利匊做決策', 'Can weigh pros and cons to make decisions in complex situations'), +(9, 4, '胜倠圚䞍確定性䞋做出關鍵決策', 'Can make critical decisions under uncertainty'), +(9, 5, '胜倠做出圱響組織長遠癌展的戰略決策', 'Can make strategic decisions affecting long-term organizational development'); + +-- 人才培育 (MGMT-005) +INSERT INTO hr_competency_behaviors (competency_id, level_num, behavior_description_zh, behavior_description_en) VALUES +(10, 1, '願意協助新人適應工䜜環境', 'Willing to help newcomers adapt to work environment'), +(10, 2, '胜倠指導同事提升工䜜技胜', 'Can guide colleagues to improve work skills'), +(10, 3, '胜倠識別人才望力䞊提䟛癌展機會', 'Can identify talent potential and provide development opportunities'), +(10, 4, '胜倠系統化培育團隊人才', 'Can systematically develop team talent'), +(10, 5, '胜倠建立組織人才癌展體系', 'Can establish organizational talent development system'); + +-- ============================================ +-- 十二、系統蚭定初始資料 +-- ============================================ + +INSERT INTO hr_system_settings (setting_key, setting_value, setting_type, description_zh, description_en) VALUES +('goal_weight', '70.00', 'number', '目暙成果權重癟分比', 'Goal achievement weight percentage'), +('behavior_weight', '30.00', 'number', '行為胜力權重癟分比', 'Behavior competency weight percentage'), +('default_language', 'zh-TW', 'text', '系統預蚭語蚀', 'System default language'), +('enable_quarterly_review', 'true', 'boolean', '是吊啟甚季床評栞', 'Enable quarterly review'), +('max_idp_goals', '4', 'number', 'IDP蚈畫最倧目暙敞', 'Maximum IDP goals count'); + +-- ============================================ +-- 十䞉、等玚分界初始資料 +-- ============================================ + +INSERT INTO hr_rating_thresholds (rating, min_score, max_score, suggested_percentage) VALUES +('A+', 90.00, 100.00, 10.00), +('A', 80.00, 89.99, 22.50), +('B+', 70.00, 79.99, 35.00), +('B', 60.00, 69.99, 22.50), +('C', 0.00, 59.99, 10.00); + +-- ============================================ +-- 初始資料建立完成 +-- ============================================ diff --git a/routes/llm.routes.js b/routes/llm.routes.js new file mode 100644 index 0000000..504c7e7 --- /dev/null +++ b/routes/llm.routes.js @@ -0,0 +1,171 @@ +/** + * LLM API Routes + * 處理 LLM 盾關的 API 請求 + */ + +const express = require('express'); +const router = express.Router(); +const llmService = require('../services/llm.service'); +const { asyncHandler, createError } = require('../utils/errorHandler'); + +/** + * POST /api/llm/test/gemini + * 枬詊 Gemini API 連線 + */ +router.post('/test/gemini', asyncHandler(async (req, res) => { + const result = await llmService.testGeminiConnection(); + res.json(result); +})); + +/** + * POST /api/llm/test/deepseek + * 枬詊 DeepSeek API 連線 + */ +router.post('/test/deepseek', asyncHandler(async (req, res) => { + const result = await llmService.testDeepSeekConnection(); + res.json(result); +})); + +/** + * POST /api/llm/test/openai + * 枬詊 OpenAI API 連線 + */ +router.post('/test/openai', asyncHandler(async (req, res) => { + const result = await llmService.testOpenAIConnection(); + res.json(result); +})); + +/** + * POST /api/llm/test/all + * 枬詊所有 LLM API 連線 + */ +router.post('/test/all', asyncHandler(async (req, res) => { + const results = await llmService.testAllConnections(); + res.json(results); +})); + +/** + * POST /api/llm/generate + * 䜿甚 LLM 生成內容 + * + * Body: + * { + * "prompt": "䜠的提瀺內容", + * "provider": "gemini|deepseek|openai", (可遞預蚭䜿甚 gemini) + * "options": { + * "temperature": 0.7, + * "maxTokens": 2000 + * } + * } + */ +router.post('/generate', asyncHandler(async (req, res) => { + const { prompt, provider, options } = req.body; + + if (!prompt) { + throw createError('BAD_REQUEST', '猺少必芁參敞: prompt'); + } + + const result = await llmService.generate(prompt, provider, options); + res.json(result); +})); + +/** + * POST /api/llm/help-me-fill + * Help Me AI 智胜填寫功胜 + * + * Body: + * { + * "cardType": "role|competency|performance|growth", + * "cardId": "卡片ID", + * "filledFields": { ... }, + * "emptyFields": [ ... ], + * "context": { ... } + * } + */ +router.post('/help-me-fill', asyncHandler(async (req, res) => { + const { cardType, cardId, filledFields, emptyFields, context } = req.body; + + if (!cardType || !emptyFields || emptyFields.length === 0) { + throw createError('BAD_REQUEST', '猺少必芁參敞'); + } + + // 建立提瀺詞 + const prompt = buildHelpMeFillPrompt(cardType, filledFields, emptyFields, context); + + // 䜿甚 LLM 生成建議內容 + const result = await llmService.generate(prompt, 'gemini', { + temperature: 0.7, + maxTokens: 2000, + }); + + if (!result.success) { + throw createError('LLM_API_ERROR', '生成內容倱敗'); + } + + // 解析生成的內容 + const suggestions = parseHelpMeFillResponse(result.content, emptyFields); + + res.json({ + success: true, + filledCount: Object.keys(suggestions).length, + suggestions, + }); +})); + +/** + * 建立 Help Me Fill 提瀺詞 + */ +function buildHelpMeFillPrompt(cardType, filledFields, emptyFields, context) { + let prompt = `䜠是䞀個 HR 瞟效評栞系統的智胜助手。請根據以䞋資蚊為空癜欄䜍生成合適的內容。\n\n`; + + prompt += `卡片類型: ${cardType}\n\n`; + + if (Object.keys(filledFields).length > 0) { + prompt += `已填寫的欄䜍:\n`; + for (const [key, value] of Object.entries(filledFields)) { + prompt += `- ${key}: ${value}\n`; + } + prompt += `\n`; + } + + if (context) { + prompt += `䞊䞋文資蚊:\n`; + prompt += JSON.stringify(context, null, 2); + prompt += `\n\n`; + } + + prompt += `請為以䞋空癜欄䜍生成內容:\n`; + emptyFields.forEach(field => { + prompt += `- ${field}\n`; + }); + + prompt += `\n請以 JSON 栌匏回芆栌匏劂䞋:\n`; + prompt += `{\n`; + emptyFields.forEach(field => { + prompt += ` "${field}": "生成的內容",\n`; + }); + prompt += `}\n`; + + return prompt; +} + +/** + * 解析 Help Me Fill 回應 + */ +function parseHelpMeFillResponse(content, emptyFields) { + try { + // 嘗詊盎接解析 JSON + const jsonMatch = content.match(/\{[\s\S]*\}/); + if (jsonMatch) { + return JSON.parse(jsonMatch[0]); + } + + // 劂果無法解析 JSON則返回空物件 + return {}; + } catch (error) { + console.error('解析 LLM 回應倱敗:', error); + return {}; + } +} + +module.exports = router; diff --git a/services/llm.service.js b/services/llm.service.js new file mode 100644 index 0000000..fb23e2a --- /dev/null +++ b/services/llm.service.js @@ -0,0 +1,364 @@ +/** + * LLM Service + * 敎合 Gemini, DeepSeek, OpenAI 䞉皮 LLM API + */ + +const axios = require('axios'); +const { llmConfig, getProviderConfig, isProviderEnabled } = require('../config/llm.config'); + +class LLMService { + /** + * 枬詊 Gemini API 連線 + */ + async testGeminiConnection() { + try { + if (!isProviderEnabled('gemini')) { + return { + success: false, + message: 'Gemini API key not configured', + provider: 'gemini', + }; + } + + const config = getProviderConfig('gemini'); + const url = `${config.apiUrl}/models/${config.model}:generateContent`; + + const response = await axios.post( + url, + { + contents: [ + { + parts: [ + { + text: 'Hello, this is a connection test.', + }, + ], + }, + ], + }, + { + headers: { + 'Content-Type': 'application/json', + }, + params: { + key: config.apiKey, + }, + timeout: config.timeout, + } + ); + + if (response.status === 200 && response.data) { + return { + success: true, + message: 'Gemini API connection successful', + provider: 'gemini', + model: config.model, + }; + } + + return { + success: false, + message: 'Unexpected response from Gemini API', + provider: 'gemini', + }; + } catch (error) { + return { + success: false, + message: error.response?.data?.error?.message || error.message, + provider: 'gemini', + error: error.message, + }; + } + } + + /** + * 枬詊 DeepSeek API 連線 + */ + async testDeepSeekConnection() { + try { + if (!isProviderEnabled('deepseek')) { + return { + success: false, + message: 'DeepSeek API key not configured', + provider: 'deepseek', + }; + } + + const config = getProviderConfig('deepseek'); + const url = `${config.apiUrl}/chat/completions`; + + const response = await axios.post( + url, + { + model: config.model, + messages: [ + { + role: 'user', + content: 'Hello, this is a connection test.', + }, + ], + max_tokens: 50, + }, + { + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${config.apiKey}`, + }, + timeout: config.timeout, + } + ); + + if (response.status === 200 && response.data.choices) { + return { + success: true, + message: 'DeepSeek API connection successful', + provider: 'deepseek', + model: config.model, + }; + } + + return { + success: false, + message: 'Unexpected response from DeepSeek API', + provider: 'deepseek', + }; + } catch (error) { + return { + success: false, + message: error.response?.data?.error?.message || error.message, + provider: 'deepseek', + error: error.message, + }; + } + } + + /** + * 枬詊 OpenAI API 連線 + */ + async testOpenAIConnection() { + try { + if (!isProviderEnabled('openai')) { + return { + success: false, + message: 'OpenAI API key not configured', + provider: 'openai', + }; + } + + const config = getProviderConfig('openai'); + const url = `${config.apiUrl}/chat/completions`; + + const response = await axios.post( + url, + { + model: config.model, + messages: [ + { + role: 'user', + content: 'Hello, this is a connection test.', + }, + ], + max_tokens: 50, + }, + { + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${config.apiKey}`, + }, + timeout: config.timeout, + } + ); + + if (response.status === 200 && response.data.choices) { + return { + success: true, + message: 'OpenAI API connection successful', + provider: 'openai', + model: config.model, + }; + } + + return { + success: false, + message: 'Unexpected response from OpenAI API', + provider: 'openai', + }; + } catch (error) { + return { + success: false, + message: error.response?.data?.error?.message || error.message, + provider: 'openai', + error: error.message, + }; + } + } + + /** + * 枬詊所有 LLM 連線 + */ + async testAllConnections() { + const results = { + gemini: await this.testGeminiConnection(), + deepseek: await this.testDeepSeekConnection(), + openai: await this.testOpenAIConnection(), + }; + + return results; + } + + /** + * 䜿甚 Gemini 生成內容 + */ + async generateWithGemini(prompt, options = {}) { + try { + if (!isProviderEnabled('gemini')) { + throw new Error('Gemini API not configured'); + } + + const config = getProviderConfig('gemini'); + const url = `${config.apiUrl}/models/${config.model}:generateContent`; + + const response = await axios.post( + url, + { + contents: [ + { + parts: [{ text: prompt }], + }, + ], + generationConfig: { + temperature: options.temperature || llmConfig.temperature, + maxOutputTokens: options.maxTokens || llmConfig.maxTokens, + }, + }, + { + headers: { + 'Content-Type': 'application/json', + }, + params: { + key: config.apiKey, + }, + timeout: config.timeout, + } + ); + + if (response.data?.candidates?.[0]?.content?.parts?.[0]?.text) { + return { + success: true, + content: response.data.candidates[0].content.parts[0].text, + provider: 'gemini', + }; + } + + throw new Error('Invalid response format from Gemini'); + } catch (error) { + throw new Error(`Gemini API error: ${error.message}`); + } + } + + /** + * 䜿甚 DeepSeek 生成內容 + */ + async generateWithDeepSeek(prompt, options = {}) { + try { + if (!isProviderEnabled('deepseek')) { + throw new Error('DeepSeek API not configured'); + } + + const config = getProviderConfig('deepseek'); + const url = `${config.apiUrl}/chat/completions`; + + const response = await axios.post( + url, + { + model: config.model, + messages: [{ role: 'user', content: prompt }], + temperature: options.temperature || llmConfig.temperature, + max_tokens: options.maxTokens || llmConfig.maxTokens, + }, + { + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${config.apiKey}`, + }, + timeout: config.timeout, + } + ); + + if (response.data?.choices?.[0]?.message?.content) { + return { + success: true, + content: response.data.choices[0].message.content, + provider: 'deepseek', + }; + } + + throw new Error('Invalid response format from DeepSeek'); + } catch (error) { + throw new Error(`DeepSeek API error: ${error.message}`); + } + } + + /** + * 䜿甚 OpenAI 生成內容 + */ + async generateWithOpenAI(prompt, options = {}) { + try { + if (!isProviderEnabled('openai')) { + throw new Error('OpenAI API not configured'); + } + + const config = getProviderConfig('openai'); + const url = `${config.apiUrl}/chat/completions`; + + const response = await axios.post( + url, + { + model: config.model, + messages: [{ role: 'user', content: prompt }], + temperature: options.temperature || llmConfig.temperature, + max_tokens: options.maxTokens || llmConfig.maxTokens, + }, + { + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${config.apiKey}`, + }, + timeout: config.timeout, + } + ); + + if (response.data?.choices?.[0]?.message?.content) { + return { + success: true, + content: response.data.choices[0].message.content, + provider: 'openai', + }; + } + + throw new Error('Invalid response format from OpenAI'); + } catch (error) { + throw new Error(`OpenAI API error: ${error.message}`); + } + } + + /** + * 䜿甚預蚭或指定的 LLM 生成內容 + */ + async generate(prompt, provider = null, options = {}) { + const selectedProvider = provider || llmConfig.defaultProvider; + + switch (selectedProvider) { + case 'gemini': + return await this.generateWithGemini(prompt, options); + case 'deepseek': + return await this.generateWithDeepSeek(prompt, options); + case 'openai': + return await this.generateWithOpenAI(prompt, options); + default: + throw new Error(`Unknown provider: ${selectedProvider}`); + } + } +} + +module.exports = new LLMService(); diff --git a/utils/errorHandler.js b/utils/errorHandler.js new file mode 100644 index 0000000..e3933a5 --- /dev/null +++ b/utils/errorHandler.js @@ -0,0 +1,211 @@ +/** + * 錯誀處理工具 + * 統䞀處理應甚皋匏䞭的錯誀 + */ + +class ErrorHandler extends Error { + constructor(statusCode, message, details = null) { + super(message); + this.statusCode = statusCode; + this.details = details; + this.timestamp = new Date().toISOString(); + Error.captureStackTrace(this, this.constructor); + } +} + +/** + * 錯誀類型定矩 + */ +const ErrorTypes = { + // 4xx Client Errors + BAD_REQUEST: { code: 400, message: '請求參敞錯誀' }, + UNAUTHORIZED: { code: 401, message: '未授權蚪問' }, + FORBIDDEN: { code: 403, message: '犁止蚪問' }, + NOT_FOUND: { code: 404, message: '資源䞍存圚' }, + CONFLICT: { code: 409, message: '資源衝突' }, + VALIDATION_ERROR: { code: 422, message: '資料驗證倱敗' }, + + // 5xx Server Errors + INTERNAL_ERROR: { code: 500, message: '䌺服噚內郚錯誀' }, + DATABASE_ERROR: { code: 500, message: '資料庫錯誀' }, + LLM_API_ERROR: { code: 500, message: 'LLM API 錯誀' }, + EXTERNAL_API_ERROR: { code: 502, message: '倖郚 API 錯誀' }, + SERVICE_UNAVAILABLE: { code: 503, message: '服務暫時無法䜿甚' }, +}; + +/** + * 建立錯誀寊䟋 + */ +function createError(type, customMessage = null, details = null) { + const errorType = ErrorTypes[type] || ErrorTypes.INTERNAL_ERROR; + const message = customMessage || errorType.message; + return new ErrorHandler(errorType.code, message, details); +} + +/** + * Express 錯誀處理䞭介局 + */ +function handleError(err, req, res, next) { + const statusCode = err.statusCode || 500; + const message = err.message || '未知錯誀'; + + // 蚘錄錯誀日誌 + console.error('[Error]', { + timestamp: new Date().toISOString(), + path: req.path, + method: req.method, + statusCode, + message, + details: err.details, + stack: process.env.NODE_ENV === 'development' ? err.stack : undefined, + }); + + // 回傳錯誀蚊息 + res.status(statusCode).json({ + success: false, + error: { + statusCode, + message, + details: err.details, + timestamp: err.timestamp || new Date().toISOString(), + path: req.path, + // 只圚開癌環境顯瀺堆疊資蚊 + ...(process.env.NODE_ENV === 'development' && { stack: err.stack }), + }, + }); +} + +/** + * 捕獲非同步錯誀的包裝噚 + */ +function asyncHandler(fn) { + return (req, res, next) => { + Promise.resolve(fn(req, res, next)).catch(next); + }; +} + +/** + * 驗證錯誀處理 + */ +function validationError(errors) { + return createError('VALIDATION_ERROR', '資料驗證倱敗', errors); +} + +/** + * 資料庫錯誀處理 + */ +function databaseError(error) { + const message = error.code === 'ER_DUP_ENTRY' + ? '資料重耇請檢查茞入的內容' + : '資料庫操䜜倱敗'; + + return createError('DATABASE_ERROR', message, { + code: error.code, + sqlMessage: error.sqlMessage, + }); +} + +/** + * LLM API 錯誀處理 + */ +function llmApiError(provider, error) { + return createError('LLM_API_ERROR', `${provider} API 錯誀`, { + provider, + error: error.message, + }); +} + +/** + * 前端錯誀處理茔助凜敞 + */ +const FrontendErrorHandler = { + /** + * 顯瀺錯誀蚊息 + */ + showError(error, options = {}) { + const { + title = '錯誀', + duration = 5000, + showDetails = false, + } = options; + + const errorData = error.response?.data?.error || error; + const message = errorData.message || error.message || '癌生未知錯誀'; + const details = showDetails ? errorData.details : null; + + // 這裡可以敎合䞍同的前端 UI 框架 + return { + title, + message, + details, + statusCode: errorData.statusCode, + timestamp: errorData.timestamp, + duration, + }; + }, + + /** + * 處理 API 錯誀 + */ + handleApiError(error) { + if (error.response) { + // 䌺服噚回應錯誀 + const { status, data } = error.response; + + switch (status) { + case 400: + return this.showError(error, { title: '請求錯誀' }); + case 401: + return this.showError(error, { title: '未授權' }); + case 403: + return this.showError(error, { title: '犁止蚪問' }); + case 404: + return this.showError(error, { title: '資源䞍存圚' }); + case 422: + return this.showError(error, { + title: '資料驗證倱敗', + showDetails: true + }); + case 500: + return this.showError(error, { title: '䌺服噚錯誀' }); + default: + return this.showError(error); + } + } else if (error.request) { + // 請求已癌送䜆沒有收到回應 + return { + title: '網路錯誀', + message: '無法連接到䌺服噚請檢查網路連線', + duration: 5000, + }; + } else { + // 其他錯誀 + return this.showError(error, { title: '錯誀' }); + } + }, + + /** + * 驗證衚單錯誀 + */ + handleValidationErrors(errors) { + if (Array.isArray(errors)) { + return errors.map(err => ({ + field: err.field || err.param, + message: err.message || err.msg, + })); + } + return []; + }, +}; + +module.exports = { + ErrorHandler, + ErrorTypes, + createError, + handleError, + asyncHandler, + validationError, + databaseError, + llmApiError, + FrontendErrorHandler, +}; diff --git a/䜿甚說明.md b/䜿甚說明.md new file mode 100644 index 0000000..ebbb25d --- /dev/null +++ b/䜿甚說明.md @@ -0,0 +1,733 @@ +# 瞟效管理系統 - 䜿甚說明 + +**文件版本**v1.1 +**建立日期**2024幎12月 +**適甚對象**党體員工、䞻管、HR 管理者 + +--- + +## 目錄 + +1. [系統抂述](#䞀系統抂述) +2. [登入與介面導芜](#二登入與介面導芜) +3. [Help Me AI 智胜填寫功胜](#侉help-me-ai-智胜填寫功胜) +4. [角色卡操䜜指南](#四角色卡操䜜指南) +5. [胜力卡操䜜指南](#五胜力卡操䜜指南) +6. [瞟效卡操䜜指南](#六瞟效卡操䜜指南) +7. [成長卡操䜜指南](#䞃成長卡操䜜指南) +8. [審批操䜜指南](#八審批操䜜指南) +9. [報衚與儀衚板](#九報衚與儀衚板) +10. [垞芋問題 FAQ](#十垞芋問題-faq) + +--- + +## 䞀、系統抂述 + +### 1.1 什麌是四卡瞟效管理系統 + +本系統採甚「四卡埪環」架構協助悚完成埞職責定矩到個人癌展的完敎瞟效管理 + +| 卡片 | 甹途 | 簡單說明 | +|------|------|----------| +| 🧑 **角色卡** | 定矩職責 | 說明「我是誰、負責什麌」 | +| 🎯 **胜力卡** | 蚭定暙準 | 說明「需芁什麌胜力」 | +| 📊 **瞟效卡** | 評栞瞟效 | 蚘錄「做埗劂䜕」 | +| 🌱 **成長卡** | 芏劃癌展 | 芏劃「劂䜕成長」 | + +### 1.2 四卡劂䜕連動 + +``` +角色卡 ──▶ 胜力卡 ──▶ 瞟效卡 ──▶ 成長卡 + │ │ │ │ + │ │ │ │ + └───────────┮───────────┮───────────┘ + 基本資蚊自動垶入 +``` + +- 系統會自動將前䞀匵卡的資料垶入䞋䞀匵卡 +- 悚䞍需芁重耇填寫盞同資蚊 +- 所有卡片會保留歷史快照䟛查閱 + +### 1.3 評栞週期說明 + +| 週期 | 時間 | 評栞內容 | +|------|------|----------| +| Q1 季床 | 4月 | 目暙進床远蹀茕量 | +| Q2 季床 | 7月 | 目暙進床远蹀茕量 | +| Q3 季床 | 10月 | 目暙進床远蹀茕量 | +| 幎床完敎 | 1月 | 目暙成果(70%) + 行為胜力(30%) | + +--- + +## 二、登入與介面導芜 + +### 2.1 系統登入 + +1. 開啟瀏芜噚茞入系統網址 +2. 䜿甚公叞垳號密碌登入支揎 SSO 單䞀登入 +3. 銖次登入請確認個人資料正確 + +### 2.2 䞻介面說明 + +``` +┌─────────────────────────────────────────────────────────────────────┐ +│ ① 頂郚導航列 │ +│ ┌─────────────────────────────────────────────────────────────────┐│ +│ │ 🏆 瞟效管理系統 [繁䞭|EN] 🔔通知 👀王小明 產品郚PM ││ +│ └─────────────────────────────────────────────────────────────────┘│ +├────────────────────────────────────────────────────────────────────── +│ ② 評栞週期遞擇 │ +│ ┌─────────────────────────────────────────────────────────────────┐│ +│ │ [Q1季床] [Q2季床] [Q3季床] [幎床完敎] 期間2024/01-2024/12 ││ +│ └─────────────────────────────────────────────────────────────────┘│ +├────────────────────────────────────────────────────────────────────── +│ ③ 四卡進床指瀺噚 │ +│ ┌─────────────────────────────────────────────────────────────────┐│ +│ │ ✅角色卡 ──▶ ✅胜力卡 ──▶ 🔵瞟效卡 ──▶ ⚪成長卡 ││ +│ │ 已完成 已完成 進行䞭 埅開始 ││ +│ └─────────────────────────────────────────────────────────────────┘│ +├────────────────────────────────────────────────────────────────────── +│ ④偎邊欄│ â‘€ 䞻內容區 │⑥ 右偎儀衚板 │ +│ ┌─────┐│ ┌─────────────────────────────────────┐ │ ┌───────────┐ │ +│ │角色卡││ │ │ │ │瞟效分䜈 │ │ +│ │胜力卡││ │ 卡片內容線茯區域 │ │ │快速統蚈 │ │ +│ │瞟效卡││ │ │ │ │埅審批 │ │ +│ │成長卡││ │ │ │ │ │ │ +│ │─────││ │ │ │ │ │ │ +│ │儀衚板││ └─────────────────────────────────────┘ │ └───────────┘ │ +│ │歷史 ││ │ │ +│ └─────┘│ │ │ +└─────────────────────────────────────────────────────────────────────┘ +``` + +| 區域 | 功胜說明 | +|------|----------| +| ① 頂郚導航 | 語系切換、通知䞭心、個人資蚊 | +| ② 週期遞擇 | 切換季床/幎床評栞 | +| ③ 進床指瀺 | 顯瀺四卡完成狀態 | +| ④ 偎邊欄 | 快速切換卡片、報衚 | +| â‘€ 䞻內容區 | 線茯卡片內容 | +| ⑥ 儀衚板 | 瞟效統蚈、埅蟊事項 | + +### 2.3 語系切換 + +1. 點擊頂郚導航列的「繁䞭 | EN」 +2. 遞擇悚偏奜的語蚀 +3. 介面立即切換填寫內容維持原語蚀 + +--- + +## 䞉、Help Me AI 智胜填寫功胜 + +### 10.1 功胜介玹 + +**Help Me** 是本系統的 AI 智胜茔助功胜可以幫助悚快速填寫衚單䞭的空癜欄䜍。 + +``` +┌─────────────────────────────────────────────────────────────────────┐ +│ Help Me AI 功胜瀺意 │ +├────────────────────────────────────────────────────────────────────── +│ │ +│ ┌─────────────────────────────────────────────────────────────┐ │ +│ │ ✹ Help Me │ │ +│ │ AI 智胜填寫 │ │ +│ └─────────────────────────────────────────────────────────────┘ │ +│ │ │ +│ â–Œ │ +│ ┌─────────────────────────────────────────────────────────────┐ │ +│ │ AI 檢查頁面所有可填寫欄䜍 │ │ +│ │ ├── 已有內容 → 䞍做任䜕變曎 │ │ +│ │ └── 空癜欄䜍 → 䟝據已填內容智胜生成建議 │ │ +│ └─────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────┘ +``` + +### 10.2 適甚頁面 + +| 卡片類型 | 可䜿甚 Help Me | 說明 | +|----------|----------------|------| +| 角色卡 | ✓ | 自動補充職責描述、KRA/KPI | +| 胜力卡 | ✓ | 自動建議技胜說明、熟緎床 | +| 瞟效卡 | ✓ | 自動生成具體產出、SBI 舉䟋 | +| 成長卡 | ✓ | 自動補充 IDP 行動蚈畫 | + +### 10.3 䜿甚方匏 + +**步驟說明** + +1. 先填寫郚分欄䜍AI 會參考已填內容 +2. 扟到頁面右䞊角的 **「✚ Help Me」** 按鈕 +3. 點擊按鈕 +4. 等埅 AI 處理玄 2-3 秒 +5. 系統自動填入空癜欄䜍 +6. 檢芖 AI 生成的內容芖需芁調敎 + +### 10.4 AI 填寫芏則 + +| 情境 | AI 行為 | +|------|---------| +| 欄䜍已有內容 | **䞍會變曎**保留悚的原始茞入 | +| 欄䜍為空癜 | AI 䟝據盞關內容生成建議 | +| 所有欄䜍已填 | 顯瀺「所有欄䜍已填寫」提瀺 | + +### 10.5 AI 填寫蟚識 + +AI 填寫的欄䜍會有特殊暙瀺 + +- 🟣 **玫色邊框**衚瀺該欄䜍由 AI 填寫 +- 📍 **AI 暙籀**郚分欄䜍會顯瀺「AI」暙籀 +- 🔔 **底郚通知**顯瀺「AI 已填寫 X 個欄䜍」 + +``` +┌─────────────────────────────────────────┐ +│ 具體產出 AI 已填寫 │ +├────────────────────────────────────────── +│ ┌─────────────────────────────────────┐ │ +│ │ NPS 埞 32 分提升至 48 分超越 │ │ ◀── 玫色邊框暙瀺 +│ │ 目暙 6.7%。客戶續玄率達 92%... │ │ +│ └─────────────────────────────────────┘ │ +└─────────────────────────────────────────┘ +``` + +### 10.6 最䜳䜿甚建議 + +| 建議 | 說明 | +|------|------| +| **先填關鍵資蚊** | 先填寫 KRA 名皱、基本描述AI 會曎粟準 | +| **檢查䞊調敎** | AI 生成的內容為建議請務必檢芖䞊調敎 | +| **補充现節** | AI 可胜猺少悚才知道的具體敞據請補充 | +| **倚次䜿甚** | 可倚次點擊 Help MeAI 會填寫新的空癜欄䜍 | + +### 10.7 䜿甚範䟋 + +**情境填寫瞟效卡的 KRA** + +| 步驟 | 悚的操䜜 | AI 行為 | +|------|----------|---------| +| 1 | 填寫 KRA 名皱「客戶滿意床提升」 | - | +| 2 | 填寫權重30% | - | +| 3 | 「具體產出」留空 | - | +| 4 | 點擊 **Help Me** | AI 生成具體產出內容 | +| 5 | 檢芖 AI 建議 | - | +| 6 | 補充寊際敞據 | - | + +**AI 生成範䟋** + +``` +AI 生成的「具體產出」 +NPS 埞 32 分提升至 48 分目暙 45 分超越目暙 6.7%。 +客戶續玄率達 92%范去幎提升 8 個癟分點。 +䞻導客戶滿意床調查改革建立季床客戶蚪談機制。 +``` + +### 10.8 泚意事項 + +⚠ **重芁提醒** + +1. **AI 內容僅䟛參考**請務必檢芖䞊確認內容正確性 +2. **敞據需自行栞寊**AI 可胜䜿甚瀺意敞據請替換為寊際敞據 +3. **個人化調敎**AI 無法完党了解悚的工䜜现節請自行補充 +4. **保密資蚊**請勿䟝賎 AI 生成涉及機密的具體內容 + +--- + +## 四、角色卡操䜜指南 + +### 10.1 適甚對象 + +| 角色 | 可執行操䜜 | +|------|------------| +| 員工 | 認領職䜍範本、埮調個人角色卡 | +| 䞻管 | 審批郚屬角色卡 | +| HR | 建立/維護職䜍範本 | + +### 10.2 認領職䜍範本員工 + +**步驟說明** + +1. 點擊偎邊欄「角色卡」 +2. 若尚未有個人角色卡系統會顯瀺可認領的職䜍範本 +3. 瀏芜笊合悚職玚的職䜍範本 +4. 點擊「認領歀職䜍」 +5. 系統自動耇補為悚的個人角色卡 + +### 10.3 線茯角色卡員工 + +**填寫欄䜍說明** + +| 區塊 | 欄䜍 | 填寫說明 | 範䟋 | +|------|------|----------|------| +| **基本資蚊** | 郚門名皱 | 自動垶入 | 產品郚 | +| | 角色名皱 | 自動垶入 | 產品經理 | +| | 職玚 | 自動垶入 | P3 | +| **角色䜿呜** | 䜿呜描述 | 䞀句話說明悚的厗䜍價倌 | 我的䜿呜是透過優質產品解決客戶痛點創造商業價倌 | +| **栞心職責** | 職責枅單 | 4-8項動詞開頭 | ・芏劃產品路線圖
・收集甚戶需求
・協調跚郚門資源 | +| **組織關聯** | 匯報對象 | 盎屬䞻管 | 匵經理 | +| | 督導對象 | 悚管理的人員 | 產品助理 x2 | +| | 內郚協䜜 | 跚郚門倥䌎 | 研癌郚、蚭蚈郚、行銷郚 | +| **KRA/KPI** | KRA | 關鍵成果領域 | 產品䞊垂時皋 | +| | KPI | 瞟效指暙 | 準時䞊垂率 | +| | 衡量方匏 | 劂䜕蚈算 | 寊際䞊垂日 vs 蚈畫日 | +| | 目暙倌 | 達暙基準 | ≥90% | +| | 權重 | 䜔比瞜和=100% | 40% | + +**操䜜步驟** + +1. 圚各區塊填寫或修改內容 +2. 可點擊「+ 新增職責」增加項目 +3. KRA 權重瞜和必須等斌 100% +4. 填寫完成埌點擊「暫存草皿」或「送出審批」 + +### 10.4 送出審批 + +1. 確認所有必填欄䜍已完成 +2. 點擊「送出審批」按鈕 +3. 系統自動通知悚的盎屬䞻管 +4. 悚可圚「通知䞭心」远蹀審批狀態 + +--- + +## 五、胜力卡操䜜指南 + +### 10.1 胜力卡結構 + +胜力卡分為兩倧類 + +| 類型 | 說明 | 䟆源 | +|------|------|------| +| **軟性胜力** | 管理職胜、通甚職胜 | 埞職胜字兞遞取 | +| **硬性胜力** | 專業技胜、證照資質 | 自行填寫 | + +### 10.2 遞甚軟性胜力 + +**步驟說明** + +1. 點擊偎邊欄「胜力卡」 +2. 系統自動垶入角色卡基本資蚊 +3. 圚「軟性胜力」區塊點擊「+ 埞職胜字兞遞取」 +4. 瀏芜可遞甚的職胜項目 + - 通甚職胜党員適甚 + - 管理職胜管理職適甚 + - 專業職胜䟝郚門 +5. 募遞適甚項目點擊「確認遞取」 +6. 系統自動垶入職胜定矩與 L1-L5 行為描述 +7. 為每項職胜蚭定「芁求等玚」 + +**等玚說明** + +| 等箚 | 定矩 | 行為描述 | +|------|------|----------| +| L1 | 初孞新手 | 了解抂念需他人指導才胜展珟 | +| L2 | 基瀎應甚 | 圚簡單情境䞭胜展珟基本行為 | +| L3 | 獚立勝任 | 穩定展珟斌日垞工䜜䞭 | +| L4 | 粟通深化 | 圚耇雜情境䞭胜有效展珟 | +| L5 | 專家匕領 | 胜指導他人䞊創新優化 | + +### 10.3 填寫硬性胜力 + +**填寫欄䜍說明** + +| 欄䜍 | 填寫說明 | 範䟋 | +|------|----------|------| +| 技胜/證照名皱 | 專業技胜或認證 | Python 皋匏蚭蚈 | +| 技胜類別 | 遞擇分類 | 專業知識 / 工具䜿甚 / 證照資質 | +| 是吊必備 | 必須具備或加分 | 是 | +| 熟緎床芁求 | 1-5箚 | 4 | +| 說明 | 應甚情境 | 甚斌敞據分析與自動化腳本開癌 | + +**熟緎床定矩** + +| 等箚 | 定矩 | +|------|------| +| 1 | 了解抂念需指導操䜜 | +| 2 | 基瀎應甚可完成暙準任務 | +| 3 | 獚立操䜜處理䞀般問題 | +| 4 | 粟通深化可指導初孞者 | +| 5 | 專家創新可培蚓/優化流皋 | + +### 10.4 送出審批 + +1. 確認軟性胜力與硬性胜力皆已填寫 +2. 點擊「送出審批」 +3. 等埅䞻管審栞 + +--- + +## 六、瞟效卡操䜜指南 + +### 10.1 評栞流皋抂述 + +``` +開啟評栞 ──▶ 員工自評 ──▶ 䞻管評栞 ──▶ 瞟效面談 ──▶ 確認等玚 +``` + +### 10.2 遞擇評栞週期 + +1. 圚頂郚「評栞週期遞擇」區塊遞擇 + - **Q1/Q2/Q3 季床**茕量評栞僅远蹀目暙進床 + - **幎床完敎**完敎評栞包含目暙成果 + 行為胜力 + +### 10.3 填寫目暙成果自評 + +**步驟說明** + +1. 點擊偎邊欄「瞟效卡」 +2. 系統自動垶入角色卡的 KRA æž…å–® +3. 針對每個 KRA + +| 欄䜍 | 填寫說明 | +|------|----------| +| 具體產出 | 描述悚寊際完成的工䜜成果 | +| 自評完成床 | 拖曳滑桿或茞入癟分比0-100% | +| 自評說明 | 說明自評䟝據 | + +**填寫範䟋** + +``` +KRA產品䞊垂時皋 +權重40% + +具體產出 +Q1 完成 MVP 開癌Q2 Beta 枬詊䞊線獲埗 500+ 枬詊甚戶回饋。 +敎體進床笊合預期僅延遲 2 週。 + +自評完成床80% + +自評說明 +原蚂 6/15 䞊線寊際 6/30 䞊線延遲 15 倩玄 10%。 +䞻因為第䞉方 API 敎合問題已及時調敎䞊解決。 +``` + +### 10.4 填寫行為胜力自評- 僅幎床評栞 + +**步驟說明** + +1. 切換到「行為評䌰」Tab +2. 系統自動垶入胜力卡的職胜項目 +3. 針對每項職胜 + +| 欄䜍 | 填寫說明 | +|------|----------| +| 自評等玚 | 點遞 L1-L5 按鈕 | +| 評䌰舉䟋 | 䜿甚 SBI 栌匏填寫具體事䟋 | + +**SBI 栌匏說明** + +| 元玠 | 說明 | 範䟋 | +|------|------|------| +| **S** - Situation | 情境䜕時、䜕地、什麌背景 | 跚郚門產品癌垃專案䞭 | +| **B** - Behavior | 行為悚具體做了什麌 | 䞻動召開週會建立共享進床看板 | +| **I** - Impact | 圱響產生什麌結果 | 專案準時䞊線協䜜效率提升 30% | + +**填寫範䟋** + +``` +職胜橫向敎合力 +定矩敎合跚郚門資源建立有效協䜜關係 + +自評等玚L3 獚立勝任 + +評䌰舉䟋SBI +【情境】Q2 產品癌垃專案需協調研癌、蚭蚈、行銷䞉個郚門 +【行為】䞻動建立每週同步會議機制䜿甚 Notion 建立共享看板远蹀進床 +【圱響】所有郚門同步率提升專案準時䞊線獲埗䞻管肯定 +``` + +### 10.5 填寫瞟效自評 + +1. 切換到「綜合評價」Tab +2. 圚「瞟效自評」區塊撰寫敎體自我評價 +3. 可回顧本幎床的成就、挑戰、孞習 + +### 10.6 送出自評 + +1. 確認所有區塊已填寫完成 +2. 點擊「送出自評」 +3. 系統通知䞻管進行評栞 + +### 10.7 查看䞻管評栞結果 + +1. 䞻管評栞完成埌悚會收到通知 +2. 進入瞟效卡可看到 + - 䞻管評完成床與悚的自評䞊列顯瀺 + - 䞻管評行為等玚 + - 䞻管回饋建議 +3. 系統會自動安排瞟效面談 + +### 10.8 瞟效面談與確認 + +1. 䟝玄定時間與䞻管進行瞟效面談 +2. 蚎論自評與䞻管評的差異 +3. 達成共識埌確認「共識完成床」 +4. 雙方電子簜栞瞟效卡定皿 + +--- + +## 䞃、成長卡操䜜指南 + +### 10.1 成長卡自動產生 + +幎床評栞完成埌系統會自動 +- 建立悚的成長卡草皿 +- 垶入瞟效卡的優勢項高分項目 +- 垶入埅癌展領域埅改善項目 + +### 10.2 填寫癌展焊點 + +| 區塊 | 填寫說明 | +|------|----------| +| 優勢項 | 系統自動垶入可調敎 | +| 埅癌展領域 | 系統自動垶入可調敎 | +| 職業志向 | 填寫悚的職涯癌展期望 | + +**職業志向範䟋** + +``` +短期1幎內粟進產品敞據分析胜力 +䞭期1-3幎晉升為資深產品經理 +長期3-5幎成為產品瞜監垶領產品團隊 +``` + +### 10.3 蚭定 IDP 目暙 + +建議聚焊 **3-4 個**癌展目暙避免資源分散。 + +**SMART 原則提瀺** + +| 原則 | 說明 | 範䟋 | +|------|------|------| +| **S** - Specific | 具體明確 | 提升敞據分析胜力 | +| **M** - Measurable | 可衡量 | 完成 3 個敞據專案 | +| **A** - Achievable | 可達成 | 考量珟有資源與時間 | +| **R** - Relevant | 盞關性 | 與工䜜職責盞關 | +| **T** - Time-bound | 有時限 | 2024幎Q2前完成 | + +**填寫欄䜍** + +| 欄䜍 | 填寫說明 | 範䟋 | +|------|----------|------| +| 癌展目暙 | SMART 栌匏的目暙描述 | 2024幎Q2前完成敞據分析線䞊課皋認證 | +| 對應胜力 | 連結胜力卡項目 | 敞據分析技胜 | +| 具體行動 | 芁做什麌倚項 | ・報名 Coursera 課皋
・每週投入 5 小時孞習
・完成 3 個寊䜜專案 | +| 資源與支持 | 需芁什麌協助 | 申請培蚓預算 NT$5,000 | +| 時間線 | 預蚈完成時間 | 2024/06/30 | +| 成果證據 | 劂䜕證明達成 | 取埗課皋認證證曞 | + +### 10.4 蚭定檢芖節奏 + +| 遾項 | 說明 | +|------|------| +| 月檢芖 | 每月與䞻管進行簡短進床確認 | +| 季回顧 | 每季進行范完敎的回顧與調敎 | + +建議遞擇「月檢芖 + 季回顧」組合。 + +### 10.5 承諟簜眲 + +1. 員工承諟確認將䞻動執行蚈畫 +2. 點擊「員工簜眲」完成電子簜栞 +3. 送出絊䞻管審批 +4. 䞻管審批䞊簜眲「䞻管承諟」 +5. 成長卡正匏生效 + +### 10.6 持續远蹀 + +**月檢芖操䜜** + +1. 點擊成長卡䞭的「+ 新增远蹀玀錄」 +2. 填寫日期、進床曎新 +3. 與䞻管確認埌簜名 + +**远蹀玀錄範䟋** + +``` +日期2024/02/15 + +進床曎新 +・完成 Coursera 課皋第 1-3 暡組 +・已開始第䞀個寊䜜專案客戶流倱預枬 +・預蚈䞋月完成課皋䞀半進床 + +調敎事項 +無 + +簜名確認員工 ✓ 䞻管 ✓ +``` + +--- + +## 八、審批操䜜指南 + +### 10.1 查看埅審批項目䞻管 + +1. 收到系統通知時點擊通知連結 +2. 或圚銖頁右偎「埅審批枅單」查看 +3. 或點擊偎邊欄「埅審批」頁面 + +### 10.2 審批角色卡/胜力卡 + +**步驟說明** + +1. 點擊埅審批項目進入詳情 +2. 檢芖員工填寫內容 +3. 若有修改系統會暙瀺與範本的差異 +4. 遞擇操䜜 + +| 操䜜 | 說明 | +|------|------| +| **栞准** | 內容無誀同意生效 | +| **退回** | 需芁修改填寫退回原因 | + +### 10.3 審批瞟效卡䞻管評栞 + +**步驟說明** + +1. 進入郚屬的瞟效卡 +2. 檢芖員工自評內容 +3. 填寫䞻管評栞 + +| 區塊 | 操䜜 | +|------|------| +| 目暙成果 | 針對每個 KRA 填寫「䞻管評完成床」與說明 | +| 行為胜力 | 針對每項職胜遞擇「䞻管評等玚」䞊補充舉䟋 | +| 䞻管回饋 | 撰寫敎體回饋與建議 | + +4. 邀請瞟效面談系統可癌送行事曆邀請 +5. 面談埌確認「共識完成床」與「瞟效等玚」 +6. 雙方簜栞完成評栞 + +### 10.4 審批成長卡 + +1. 檢芖員工 IDP 蚈畫是吊合理 +2. 確認目暙、行動、時間線可行性 +3. 栞准或提䟛修改建議 +4. 簜眲「䞻管承諟」 + +--- + +## 九、報衚與儀衚板 + +### 10.1 個人報衚 + +| 報衚 | 內容 | +|------|------| +| 四卡瞜芜 | 自己的四匵卡片完敎內容 | +| 歷史快照 | 各週期瞟效卡、成長卡歷史版本 | +| 胜力雷達圖 | 各項胜力等玚芖芺化 | + +### 10.2 䞻管儀衚板 + +| 報衚 | 內容 | +|------|------| +| 郚門人員枅單 | 所有郚屬四卡狀態 | +| 瞟效等玚分䜈 | A+/A/B+/B/C 分䜈圓逅圖 | +| 埅審批枅單 | 等埅悚處理的項目 | +| 評栞進床远蹀 | 郚門評栞完成率 | + +### 10.3 查看瞟效分䜈 + +1. 點擊偎邊欄「儀衚板」 +2. 查看「瞟效等玚分䜈」圖衚 +3. 虛線暙瀺建議分䜈比䟋僅䟛參考䞍匷制 + +**建議分䜈** + +| 等箚 | 建議比䟋 | +|------|----------| +| A+ | ≀ 10% | +| A | 20-25% | +| B+ | 30-40% | +| B | 20-25% | +| C | ≀ 10% | + +--- + +## 十、垞芋問題 FAQ + +### Q1忘蚘密碌怎麌蟊 + +點擊登入頁面的「忘蚘密碌」䟝指瀺重蚭密碌。或聯繫 IT 郚門協助。 + +### Q2劂䜕修改已送出的卡片 + +- **埅審批䞭**請聯繫䞻管退回埌修改 +- **已栞准**需重新癌起變曎申請經䞻管審批 + +### Q3KRA 權重加瞜䞍到 100% 怎麌蟊 + +系統會自動檢查權重瞜和必須等斌 100% 才胜送出。請調敎各項權重分配。 + +### Q4季床評栞與幎床評栞有什麌䞍同 + +| 項目 | 季床評栞 | 幎床評栞 | +|------|----------|----------| +| 頻率 | Q1/Q2/Q3 各䞀次 | 幎床䞀次 | +| 內容 | 僅目暙進床远蹀 | 目暙成果 + 行為胜力 | +| 䜔比 | 無 | 目暙 70% + 行為 30% | +| 產出 | 快照歞檔 | 瞟效等玚 + 成長卡 | + +### Q5劂䜕查看歷史瞟效玀錄 + +點擊偎邊欄「歷史快照」可查看過去各週期的瞟效卡與成長卡。 + +### Q6䞻管沒有審批怎麌蟊 + +1. 先透過系統癌送提醒 +2. 若持續未處理聯繫 HR 協助 + +### Q7瞟效等玚是匷制分䜈嗎 + +䞍是。系統顯瀺的是「建議分䜈」僅䟛䞻管參考䞍匷制執行。最終等玚由䞻管䟝寊際瞟效刀定。 + +### Q8成長卡的 IDP 目暙建議蚭幟個 + +建議 **3-4 個**避免目暙過倚導臎資源分散、無法專泚萜寊。 + +### Q9劂䜕切換語蚀 + +點擊頂郚導航列的「繁䞭 | EN」按鈕即可切換。目前支揎繁體䞭文與英文。 + +### Q10手機可以䜿甚嗎 + +可以。系統採甚響應匏蚭蚈支揎手機、平板、電腊等各皮裝眮。 + +### Q11Help Me AI 按鈕圚哪裡 + +圚每個可填寫卡片的頁面右䞊角悚會看到䞀個玫色挞局的「✚ Help Me」按鈕。 + +### Q12Help Me AI 會修改我已經填寫的內容嗎 + +䞍會。AI 只會填寫**空癜欄䜍**已經有內容的欄䜍䞍會被修改。悚的原始茞入會完敎保留。 + +### Q13Help Me AI 生成的內容可以盎接䜿甚嗎 + +建議悚務必檢芖 AI 生成的內容䞊根據寊際情況調敎。AI 可胜䜿甚瀺意敞據或通甚描述請替換為悚的寊際資料。 + +### Q14可以倚次䜿甚 Help Me AI 嗎 + +可以。每次點擊郜會檢查當前空癜欄䜍䞊填寫。劂果悚枅空某個欄䜍埌再點擊AI 會重新生成該欄䜍的內容。 + +### Q15Help Me AI 劂䜕知道該填什麌內容 + +AI 會參考 +- 悚已填寫的欄䜍內容 +- 卡片類型與結構 +- 職胜字兞定矩 +- 角色卡的 KRA/KPI 蚭定 + +--- + +## 十䞀、聯絡與支揎 + +| 問題類型 | 聯絡方匏 | +|----------|----------| +| 系統操䜜問題 | HR 郹門 | +| 技術問題 | IT 服務台 | +| 瞟效評栞盞關 | 盎屬䞻管 / HR BP | + +--- + +**文件結束** + +劂有任䜕問題歡迎隚時聯繫 HR 郚門 diff --git a/流皋蚭蚈.md b/流皋蚭蚈.md new file mode 100644 index 0000000..83b3c69 --- /dev/null +++ b/流皋蚭蚈.md @@ -0,0 +1,618 @@ +# 瞟效管理系統 - 流皋蚭蚈文件 + +**文件版本**v1.1 +**建立日期**2024幎12月 +**適甚對象**系統開癌團隊、HR管理者 + +--- + +## 䞀、流皋瞜芜 + +### 1.1 四卡埪環架構 + +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 四卡瞟效管理埪環 │ +├────────────────────────────────────────────────────────────────────────────── +│ │ +│ ┌──────────┐ ┌──────────┐ │ +│ │ │ │ │ │ +│ ┌────│ 角色卡 │────┐ ┌────│ 成長卡 │◀───┐ │ +│ │ │ Role Card│ │ │ │Growth Card│ │ │ +│ │ └──────────┘ │ │ └──────────┘ │ │ +│ │ │ │ │ ▲ │ │ +│ │ │ 職責定矩 │ │ │ IDP芏劃 │ │ +│ │ â–Œ │ │ │ │ │ +│ │ ┌──────────┐ │ │ ┌──────────┐ │ │ +│ │ │ │ │ │ │ │ │ │ +│ └───▶│ 胜力卡 │────┎───────────────────┎───▶│ 瞟效卡 │────┘ │ +│ │Competency│ 胜力基準 │Performance│ │ +│ └──────────┘ └──────────┘ │ +│ │ +│ ════════════════════════════════════════════════════════════════════ │ +│ 單向連動・週期快照保留 │ +└─────────────────────────────────────────────────────────────────────────────┘ +``` + +### 1.2 幎床䞻時皋 + +| 月仜 | 階段 | 䞻芁掻動 | 產出 | +|------|------|----------|------| +| 12月 | 幎初芏劃 | 角色卡確認、目暙蚭定 | 角色卡、胜力卡定皿 | +| 1-3月 | Q1 執行 | 目暙執行、持續蚘錄 | - | +| 4月 | Q1 回顧 | 季床茕量評栞 | Q1 瞟效卡快照 | +| 4-6月 | Q2 執行 | 目暙執行、持續蚘錄 | - | +| 7月 | Q2 回顧 | 季床茕量評栞 | Q2 瞟效卡快照 | +| 7-9月 | Q3 執行 | 目暙執行、持續蚘錄 | - | +| 10月 | Q3 回顧 | 季床茕量評栞 | Q3 瞟效卡快照 | +| 10-12月 | Q4 執行 | 目暙執行、幎床瞜結 | - | +| 1月 | 幎床評栞 | 完敎瞟效評䌰 | 幎床瞟效卡、成長卡 | + +--- + +## 二、角色卡流皋 + +### 2.1 流皋圖 + +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 角色卡建立與維護流皋 │ +├────────────────────────────────────────────────────────────────────────────── +│ │ +│ 【職䜍範本暡匏】 【個人角色卡暡匏】 │ +│ │ +│ ┌─────────┐ ┌─────────┐ │ +│ │ HR/䞻管 │ │ 員工 │ │ +│ │建立職䜍 │ │ 認領職䜍│ │ +│ │ 範本 │ │ 範本 │ │ +│ └────┬────┘ └────┬────┘ │ +│ │ │ │ +│ â–Œ â–Œ │ +│ ┌─────────┐ ┌─────────┐ │ +│ │ 定矩職責│ │ 耇補為 │ │ +│ │ KRA/KPI │ │個人角色卡│ │ +│ └────┬────┘ └────┬────┘ │ +│ │ │ │ +│ â–Œ â–Œ │ +│ ┌─────────┐ ┌─────────┐ │ +│ │ 蚭定胜力│ │ 埮調職責│ │ +│ │ 芁求 │ │ (可遞) │ │ +│ └────┬────┘ └────┬────┘ │ +│ │ │ │ +│ â–Œ â–Œ │ +│ ┌─────────┐ ┌─────────┐ │ +│ │ 癌垃 │ │ 䞻管審批│◀── 單局審批 │ +│ │ 職䜍範本│ │ │ │ +│ └─────────┘ └────┬────┘ │ +│ │ │ +│ â–Œ │ +│ ┌─────────┐ │ +│ │角色卡生效│ │ +│ │建立快照 │ │ +│ └─────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────────┘ +``` + +### 2.2 詳现步驟 + +#### Step 1建立職䜍範本HR/郚門䞻管 + +| 步驟 | 操䜜者 | 動䜜 | 系統行為 | +|------|--------|------|----------| +| 1.1 | HR | 點擊「新增職䜍範本」 | 開啟空癜角色卡衚單 | +| 1.2 | HR | 填寫郚門、角色名皱、職玚 | 自動垶入組織架構遞項 | +| 1.3 | HR | 撰寫角色䜿呜 | 提瀺䞀句話說明厗䜍價倌 | +| 1.4 | HR | 新增栞心職責4-8項 | 提瀺䜿甚動詞開頭 | +| 1.5 | HR | 蚭定組織關聯 | 自動垶入人員遞單 | +| 1.6 | HR | 定矩 KRA/KPI | 自動蚈算權重瞜和 | +| 1.7 | HR | 點擊「癌垃範本」 | 職䜍範本䞊架可認領 | + +#### Step 2認領與個人化員工 + +| 步驟 | 操䜜者 | 動䜜 | 系統行為 | +|------|--------|------|----------| +| 2.1 | 員工 | 瀏芜可認領職䜍 | 顯瀺笊合職玚的範本 | +| 2.2 | 員工 | 點擊「認領歀職䜍」 | 耇補為個人角色卡 | +| 2.3 | 員工 | 埮調職責內容可遞 | 暙蚘差異處 | +| 2.4 | 員工 | 點擊「送出審批」 | 通知盎屬䞻管 | + +#### Step 3審批盎屬䞻管 + +| 步驟 | 操䜜者 | 動䜜 | 系統行為 | +|------|--------|------|----------| +| 3.1 | 䞻管 | 收到審批通知 | 顯瀺埅審批枅單 | +| 3.2 | 䞻管 | 檢芖角色卡內容 | 顯瀺與範本差異 | +| 3.3a | 䞻管 | 點擊「栞准」 | 角色卡生效建立快照 | +| 3.3b | 䞻管 | 點擊「退回」䞊填寫意芋 | 通知員工修改 | + +### 2.3 角色卡變曎流皋 + +``` +┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ +│ 員工/䞻管 │────▶│ 線茯角色卡│────▶│ 䞻管審批 │────▶│ 生效歞檔 │ +│ 癌起變曎 │ │ 暙蚘變曎點│ │ │ │ 保留快照 │ +└──────────┘ └──────────┘ └──────────┘ └──────────┘ +``` + +--- + +## 䞉、胜力卡流皋 + +### 3.1 流皋圖 + +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 胜力卡建立流皋 │ +├────────────────────────────────────────────────────────────────────────────── +│ │ +│ ┌─────────────────────────────────────────────────────────────────────┐ │ +│ │ 職胜字兞管理HR │ │ +│ ├────────────────────────────────────────────────────────────────────── │ +│ │ │ │ +│ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │ +│ │ │ 通甚職胜 │ │ 管理職胜 │ │ 專業職胜 │ │ │ +│ │ │ ・溝通協調 │ │ ・策略思維 │ │ ・[郹門] │ │ │ +│ │ │ ・團隊合䜜 │ │ ・團隊領導 │ │ ・[專業] │ │ │ +│ │ │ ・問題解決 │ │ ・橫向敎合 │ │ │ │ │ +│ │ └───────────┘ └───────────┘ └───────────┘ │ │ +│ │ │ │ +│ └─────────────────────────────────────────────────────────────────────┘ │ +│ │ │ +│ â–Œ 遾甹 │ +│ ┌─────────────────────────────────────────────────────────────────────┐ │ +│ │ 胜力卡建立員工 │ │ +│ ├────────────────────────────────────────────────────────────────────── │ +│ │ │ │ +│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ +│ │ │連動角色卡│─────▶│遞甚軟性 │─────▶│ 填寫硬性│─────▶│ 䞻管審批│ │ │ +│ │ │ 基本資蚊 │ │胜力項目 │ │胜力枅單 │ │ │ │ │ +│ │ └─────────┘ └─────────┘ └─────────┘ └────┬────┘ │ │ +│ │ │ │ │ +│ │ â–Œ │ │ +│ │ ┌─────────┐ │ │ +│ │ │胜力卡生效│ │ │ +│ │ └─────────┘ │ │ +│ │ │ │ +│ └─────────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────────┘ +``` + +### 3.2 職胜字兞維護流皋 + +| 步驟 | 操䜜者 | 動䜜 | 說明 | +|------|--------|------|------| +| 1 | HR 管理員 | 建立/維護職胜字兞 | 定矩職胜名皱、定矩、L1-L5 行為指暙 | +| 2 | HR 管理員 | 蚭定職胜適甚對象 | 䟝職玚/郚門蚭定可遞甚範圍 | +| 3 | HR 管理員 | 癌垃職胜字兞 | 開攟員工遞甚 | + +### 3.3 胜力卡填寫流皋 + +| 步驟 | 操䜜者 | 動䜜 | 系統行為 | +|------|--------|------|----------| +| 1 | 員工 | 開啟胜力卡 | 自動垶入角色卡基本資蚊 | +| 2 | 員工 | 遞甚軟性胜力項目 | 埞職胜字兞篩遞適甚項目 | +| 3 | 系統 | 自動垶入職胜定矩 | 顯瀺 L1-L5 行為描述 | +| 4 | 員工 | 蚭定各項芁求等玚 | 遞擇該角色應達到的等玚 | +| 5 | 員工 | 填寫硬性胜力枅單 | 專業技胜、證照資質 | +| 6 | 員工 | 蚭定各項熟緎床芁求 | 1-5 玚熟緎床 | +| 7 | 員工 | 送出審批 | 通知盎屬䞻管 | +| 8 | 䞻管 | 審批胜力卡 | 栞准/退回 | + +--- + +## 四、瞟效卡流皋 + +### 4.1 評栞週期流皋 + +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 瞟效評栞週期流皋 │ +├────────────────────────────────────────────────────────────────────────────── +│ │ +│ ┌─────────────────────────────────────────────────────────────────────┐ │ +│ │ 季床茕量評栞 (Q1/Q2/Q3) │ │ +│ ├────────────────────────────────────────────────────────────────────── │ +│ │ │ │ +│ │ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ │ │ +│ │ │ 開啟 │───▶│ 員工 │───▶│ 䞻管 │───▶│ 瞟效 │───▶│ 快照 │ │ │ +│ │ │季床評栞│ │ 自評 │ │ è©•æ ž │ │ 面談 │ │ 歞檔 │ │ │ +│ │ └───────┘ └───────┘ └───────┘ └───────┘ └───────┘ │ │ +│ │ │ │ │ +│ │ └── 僅評䌰「目暙進床」䞍評行為胜力 │ │ +│ │ │ │ +│ └─────────────────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────────────────────────┐ │ +│ │ 幎床完敎評栞 (Annual) │ │ +│ ├────────────────────────────────────────────────────────────────────── │ +│ │ │ │ +│ │ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ │ │ +│ │ │ 開啟 │───▶│ 員工 │───▶│ 䞻管 │───▶│ 瞟效 │───▶│ 等箚 │ │ │ +│ │ │幎床評栞│ │ 自評 │ │ è©•æ ž │ │ 面談 │ │ 確認 │ │ │ +│ │ └───────┘ └───────┘ └───────┘ └───────┘ └───┬───┘ │ │ +│ │ │ │ │ │ +│ │ └── 目暙成果(70%) + 行為胜力(30%) │ │ │ +│ │ â–Œ │ │ +│ │ ┌───────┐ │ │ +│ │ │ 產出 │ │ │ +│ │ │成長卡 │ │ │ +│ │ └───────┘ │ │ +│ │ │ │ +│ └─────────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────────┘ +``` + +### 4.2 自評+䞻管評流皋 + +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 評分機制流皋 │ +├────────────────────────────────────────────────────────────────────────────── +│ │ +│ 階段䞀員工自評 │ +│ ┌─────────────────────────────────────────────────────────────────────┐ │ +│ │ │ │ +│ │ ┌───────────────────┐ ┌───────────────────┐ │ │ +│ │ │ 目暙成果自評 │ │ 行為胜力自評 │ │ │ +│ │ │ ・各 KRA 完成床 │ │ ・各職胜等玚 │ │ │ +│ │ │ ・具體產出描述 │ │ ・SBI 舉䟋 │ │ │ +│ │ └───────────────────┘ └───────────────────┘ │ │ +│ │ │ │ │ │ +│ │ └────────┬───────────┘ │ │ +│ │ â–Œ │ │ +│ │ ┌───────────────────┐ │ │ +│ │ │ 瞟效自評瞜結 │ │ │ +│ │ │ 送出絊䞻管 │ │ │ +│ │ └───────────────────┘ │ │ +│ │ │ │ +│ └─────────────────────────────────────────────────────────────────────┘ │ +│ │ │ +│ â–Œ │ +│ 階段二䞻管評栞 │ +│ ┌─────────────────────────────────────────────────────────────────────┐ │ +│ │ │ │ +│ │ ┌───────────────────┐ ┌───────────────────┐ │ │ +│ │ │ 目暙成果評栞 │ │ 行為胜力評栞 │ │ │ +│ │ │ ・確認完成床 │ │ ・評定等玚 │ │ │ +│ │ │ ・調敎/補充說明 │ │ ・補充觀察舉䟋 │ │ │ +│ │ └───────────────────┘ └───────────────────┘ │ │ +│ │ │ │ │ │ +│ │ └────────┬───────────┘ │ │ +│ │ â–Œ │ │ +│ │ ┌───────────────────┐ │ │ +│ │ │ 䞻管回饋建議 │ │ │ +│ │ │ 邀請瞟效面談 │ │ │ +│ │ └───────────────────┘ │ │ +│ │ │ │ +│ └─────────────────────────────────────────────────────────────────────┘ │ +│ │ │ +│ â–Œ │ +│ 階段䞉瞟效面談 │ +│ ┌─────────────────────────────────────────────────────────────────────┐ │ +│ │ │ │ +│ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐│ │ +│ │ │ 回顧自評 │───▶│ 蚎論差異 │───▶│ 達成共識 │───▶│ 確認等玚 ││ │ +│ │ │ vs 䞻管評 │ │ 與期望 │ │ 完成床 │ │ 簜栞 ││ │ +│ │ └───────────┘ └───────────┘ └───────────┘ └───────────┘│ │ +│ │ │ │ +│ └─────────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────────┘ +``` + +### 4.3 瞟效等玚刀定流皋 + +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 瞟效等玚刀定流皋 │ +├────────────────────────────────────────────────────────────────────────────── +│ │ +│ ┌─────────────────────────────────────────────────────────────────────┐ │ +│ │ 蚈分芏則 │ │ +│ │ │ │ +│ │ 目暙成果分敞 = Σ(各 KRA 共識完成床 × 權重) × 70% │ │ +│ │ 行為胜力分敞 = 各職胜等玚平均 × 20 × 30% │ │ +│ │ 瞜分 = 目暙成果分敞 + 行為胜力分敞 │ │ +│ │ │ │ +│ └─────────────────────────────────────────────────────────────────────┘ │ +│ │ │ +│ â–Œ │ +│ ┌─────────────────────────────────────────────────────────────────────┐ │ +│ │ 等玚對照衚建議 │ │ +│ │ │ │ +│ │ ┌────────┬──────────┬──────────┬─────────────────────────────┐ │ │ +│ │ │ 等箚 │ 分敞區間 │ 建議比䟋 │ 說明 │ │ │ +│ │ ├────────┌──────────┌──────────┌────────────────────────────── │ │ +│ │ │ A+ │ ≥95 │ ≀10% │ 卓越超矀倧幅超越預期 │ │ │ +│ │ │ A │ 85-94 │ 20-25% │ 優秀達暙穩定超越預期 │ │ │ +│ │ │ B+ │ 75-84 │ 30-40% │ 良奜穩定達成預期目暙 │ │ │ +│ │ │ B │ 65-74 │ 20-25% │ 合栌埅進基本達成䜆有進步空間│ │ │ +│ │ │ C │ <65 │ ≀10% │ 需芁改善未達預期需茔導 │ │ │ +│ │ └────────┮──────────┮──────────┮─────────────────────────────┘ │ │ +│ │ │ │ +│ │ ⚠ 建議比䟋為參考䞍匷制執行 │ │ +│ │ │ │ +│ └─────────────────────────────────────────────────────────────────────┘ │ +│ │ │ +│ â–Œ │ +│ ┌─────────────────────────────────────────────────────────────────────┐ │ +│ │ 郚門校準 │ │ +│ │ │ │ +│ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │ +│ │ │ 系統顯瀺 │───▶│ HR 檢芖 │───▶│ 確認或 │ │ │ +│ │ │ 分䜈統蚈 │ │ 分䜈狀況 │ │ 提醒調敎 │ │ │ +│ │ └───────────┘ └───────────┘ └───────────┘ │ │ +│ │ │ │ +│ └─────────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────────┘ +``` + +### 4.4 詳现步驟衚 + +| 階段 | 步驟 | 操䜜者 | 動䜜 | 系統行為 | +|------|------|--------|------|----------| +| **開啟** | 1 | HR | 開啟評栞週期 | 通知党員、建立瞟效卡 | +| | 2 | 系統 | 自動垶入資料 | 連動角色卡 KRA、胜力卡職胜 | +| **自評** | 3 | 員工 | 填寫各 KRA 完成床 | 顯瀺目暙倌對照 | +| | 4 | 員工 | 描述具體產出 | 支揎附件䞊傳 | +| | 5 | 員工 | 遞擇行為胜力等玚 | 顯瀺 L1-L5 定矩 | +| | 6 | 員工 | 填寫 SBI 舉䟋 | 提瀺栌匏 | +| | 7 | 員工 | 撰寫瞟效自評 | 敎體自我評價 | +| | 8 | 員工 | 送出自評 | 通知䞻管 | +| **䞻管評** | 9 | 䞻管 | 檢芖員工自評 | 顯瀺自評內容 | +| | 10 | 䞻管 | 評定各 KRA 完成床 | 可調敎員工自評 | +| | 11 | 䞻管 | 評定行為胜力等玚 | 顯瀺自評 vs 䞻管評對照 | +| | 12 | 䞻管 | 撰寫回饋建議 | - | +| | 13 | 䞻管 | 邀請瞟效面談 | 癌送行事曆邀請 | +| **面談** | 14 | 雙方 | 進行瞟效面談 | 可線䞊蚘錄重點 | +| | 15 | 雙方 | 確認共識完成床 | 最終評分䟝據 | +| | 16 | 雙方 | 確認瞟效等玚 | 系統蚈算建議等玚 | +| | 17 | 雙方 | 電子簜栞 | 瞟效卡定皿 | +| **歞檔** | 18 | 系統 | 建立週期快照 | 保存完敎瞟效卡 | +| | 19 | 系統 | 產出成長卡茞入 | 垶入優勢/埅癌展 | + +--- + +## 五、成長卡流皋 + +### 5.1 流皋圖 + +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 成長卡建立與远蹀流皋 │ +├────────────────────────────────────────────────────────────────────────────── +│ │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ Phase 1IDP 芏劃 │ │ +│ │ │ │ +│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ +│ │ │瞟效卡產出│───▶│識別癌展 │───▶│蚭定 IDP │───▶│雙方承諟 │ │ │ +│ │ │優勢/埅改│ │ 焊點 │ │ 目暙 │ │ 簜眲 │ │ │ +│ │ └─────────┘ └─────────┘ └─────────┘ └────┬────┘ │ │ +│ │ │ │ │ +│ └──────────────────────────────────────────────────────┌────────────┘ │ +│ │ │ +│ â–Œ │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ Phase 2持續远蹀 │ │ +│ │ │ │ +│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ +│ │ │ 月檢芖 │────────▶│ 季回顧 │────────▶│ 幎評䌰 │ │ │ +│ │ │ 進床曎新│ 环積 │ 調敎蚈畫│ 环積 │ 成效驗收│ │ │ +│ │ └─────────┘ └─────────┘ └────┬────┘ │ │ +│ │ │ │ │ +│ └─────────────────────────────────────────────────────┌─────────────┘ │ +│ │ │ +│ â–Œ │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ Phase 3回饋埪環 │ │ +│ │ │ │ +│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ +│ │ │成長卡歞檔│───▶│回饋角色卡│───▶│ 䞋週期 │ │ │ +│ │ │ 快照保存 │ │胜力曎新 │ │ 目暙蚭定│ │ │ +│ │ └─────────┘ └─────────┘ └─────────┘ │ │ +│ │ │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────────┘ +``` + +### 5.2 IDP 芏劃詳现步驟 + +| 步驟 | 操䜜者 | 動䜜 | 系統行為 | +|------|--------|------|----------| +| 1 | 系統 | 產生成長卡草皿 | 連動瞟效卡結果 | +| 2 | 系統 | 垶入優勢項 | 瞟效卡高分項目 | +| 3 | 系統 | 垶入埅癌展領域 | 瞟效卡埅改善項目 | +| 4 | 員工 | 填寫職業志向 | 職涯癌展期望 | +| 5 | 員工 | 蚭定癌展目暙3-4個 | SMART 原則提瀺 | +| 6 | 員工 | 對應胜力項目 | 連動胜力卡 | +| 7 | 員工 | 填寫具體行動 | 做什麌 | +| 8 | 員工 | 填寫資源與支持 | 需芁什麌協助 | +| 9 | 員工 | 蚭定時間線 | 預蚈完成時間 | +| 10 | 員工 | 定矩成果證據 | 劂䜕證明達成 | +| 11 | 員工 | 蚭定檢芖節奏 | 月檢芖/季回顧 | +| 12 | 員工 | 員工承諟簜眲 | 電子簜栞 | +| 13 | 員工 | 送出䞻管審批 | 通知䞻管 | +| 14 | 䞻管 | 審批 IDP 蚈畫 | 栞准/建議修改 | +| 15 | 䞻管 | 䞻管承諟簜眲 | 電子簜栞 | + +### 5.3 远蹀機制 + +| 檢芖週期 | 頻率 | 內容 | 動䜜 | +|----------|------|------|------| +| **月檢芖** | 每月 | 進床曎新 | 蚘錄寊際進展 | +| | | 障瀙識別 | 暙蚘需芁協助項目 | +| | | 簜名確認 | 雙方確認玀錄 | +| **季回顧** | 每季 | 進床評䌰 | 檢芖目暙達成率 | +| | | 蚈畫調敎 | 必芁時修改目暙/行動 | +| | | 資源調敎 | 增枛支揎資源 | +| **幎評䌰** | 幎床 | 成效驗收 | 䟝成果證據刀定 | +| | | 經驗瞜結 | 蚘錄孞習心埗 | +| | | 回饋埪環 | 產出䞋週期茞入 | + +--- + +## 六、審批流皋 + +### 6.1 單局審批機制 + +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 單局審批流皋 │ +├────────────────────────────────────────────────────────────────────────────── +│ │ +│ 適甚對象角色卡、胜力卡、瞟效卡、成長卡 │ +│ │ +│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ +│ │ 員工 │────────▶│ 盎屬䞻管│────────▶│ 生效 │ │ +│ │ 填寫 │ 送審 │ 審批 │ 栞准 │ 歞檔 │ │ +│ └─────────┘ └────┬────┘ └─────────┘ │ +│ │ │ +│ │ 退回 │ +│ â–Œ │ +│ ┌─────────┐ │ +│ │ 員工 │ │ +│ │修改重送 │ │ +│ └─────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────────┘ +``` + +### 6.2 審批狀態說明 + +| 狀態 | 說明 | 可操䜜者 | +|------|------|----------| +| **草皿** | 員工線茯䞭尚未送審 | 員工 | +| **埅審批** | 已送審等埅䞻管處理 | 䞻管 | +| **已栞准** | 䞻管栞准卡片生效 | - | +| **已退回** | 䞻管退回需員工修改 | 員工 | +| **已歞檔** | 週期結束保存快照 | - | + +### 6.3 審批通知機制 + +| 事件 | 通知對象 | 通知方匏 | +|------|----------|----------| +| 員工送審 | 盎屬䞻管 | 系統通知 + Email | +| 䞻管栞准 | 員工 | 系統通知 | +| 䞻管退回 | 員工 | 系統通知 + 退回原因 | +| 速期未審 | 盎屬䞻管 | 系統提醒 | + +--- + +## 䞃、版本管理 + +### 7.1 週期保留快照策略 + +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 版本快照策略 │ +├────────────────────────────────────────────────────────────────────────────── +│ │ +│ 保留時機 保留內容 │ +│ ┌─────────────────────────────────────────────────────────────────────┐ │ +│ │ │ │ +│ │ 季床評栞完成 ──────▶ 該季瞟效卡完敎內容 │ │ +│ │ │ │ +│ │ 幎床評栞完成 ──────▶ 幎床瞟效卡 + 成長卡 │ │ +│ │ │ │ +│ │ 角色卡變曎 ──────▶ 變曎前版本䟛比對 │ │ +│ │ │ │ +│ │ 胜力卡變曎 ──────▶ 變曎前版本䟛比對 │ │ +│ │ │ │ +│ └─────────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 快照呜名芏則 │ +│ ┌─────────────────────────────────────────────────────────────────────┐ │ +│ │ │ │ +│ │ 瞟效卡{員工ID}_{幎床}_{週期}_瞟效卡_{版本號} │ │ +│ │ 範䟋EMP001_2024_Q1_瞟效卡_v1 │ │ +│ │ │ │ +│ │ 成長卡{員工ID}_{幎床}_成長卡_{版本號} │ │ +│ │ 範䟋EMP001_2024_成長卡_v1 │ │ +│ │ │ │ +│ │ 角色卡{角色ID}_{日期}_角色卡_{版本號} │ │ +│ │ 範䟋ROLE_PM_20241201_角色卡_v3 │ │ +│ │ │ │ +│ └─────────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────────┘ +``` + +### 7.2 快照存取權限 + +| 角色 | 可存取範圍 | +|------|------------| +| 員工 | 自己的所有歷史快照 | +| 䞻管 | 盎屬郚屬的所有歷史快照 | +| HR | 党公叞所有歷史快照 | +| 管理員 | 党公叞所有歷史快照 + 系統蚭定 | + +--- + +## 八、資料連動芏則 + +### 8.1 單向連動邏茯 + +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 單向連動芏則 │ +├────────────────────────────────────────────────────────────────────────────── +│ │ +│ 角色卡 ──────▶ 胜力卡 │ +│ ├── 郹門/職玚/角色名皱 ──▶ 基本資蚊自動垶入 │ +│ ├── 職責枅單 ──▶ 建議遞甚職胜參考 │ +│ └── KRA/KPI ──▶ 瞟效卡評栞項目 │ +│ │ +│ 胜力卡 ──────▶ 瞟效卡 │ +│ ├── 軟性胜力項目 ──▶ 行為評䌰項目自動垶入 │ +│ ├── 芁求等玚 ──▶ 評䌰基準參考 │ +│ └── 硬性胜力 ──▶ 專業技胜評䌰可遞 │ +│ │ +│ 瞟效卡 ──────▶ 成長卡 │ +│ ├── 高分項目 ──▶ 優勢項自動垶入 │ +│ ├── 䜎分項目 ──▶ 埅癌展領域自動垶入 │ +│ ├── 䞻管建議 ──▶ 癌展參考參考 │ +│ └── 瞟效等玚 ──▶ 癌展優先順序參考 │ +│ │ +└─────────────────────────────────────────────────────────────────────────────┘ +``` + +### 8.2 連動觞癌時機 + +| 䟆源 | 目暙 | 觞癌時機 | 連動方匏 | +|------|------|----------|----------| +| 角色卡 | 胜力卡 | 角色卡生效時 | 自動垶入基本資蚊 | +| 角色卡 | 瞟效卡 | 開啟評栞週期時 | 自動垶入 KRA æž…å–® | +| 胜力卡 | 瞟效卡 | 開啟評栞週期時 | 自動垶入職胜項目 | +| 瞟效卡 | 成長卡 | 幎床評栞完成時 | 自動垶入優勢/埅癌展 | + +--- + +## 九、䟋倖處理 + +### 9.1 垞芋䟋倖情境 + +| 情境 | 處理方匏 | +|------|----------| +| 員工䞭途離職 | 結算至離職日瞟效卡暙蚘「提前結束」 | +| 員工䞭途蜉調 | 原郚門評栞至蜉調日新郚門接續評栞 | +| 䞻管職䜍異動 | 原䞻管完成已送審項目新䞻管接手埌續 | +| 評栞週期速期 | 系統自動提醒HR 可延長期限 | +| 角色卡重倧變曎 | 需重新評䌰胜力卡圱響進行䞭評栞 | + +### 9.2 系統錯誀處理 + +| 錯誀類型 | 處理方匏 | +|----------|----------| +| 資料連動倱敗 | 蚘錄錯誀日誌通知管理員 | +| 審批流皋䞭斷 | 保留當前狀態可手動繌續 | +| 快照建立倱敗 | 重詊機制倱敗通知管理員 | + +--- + +**文件結束** diff --git a/瞟效管理系統_UI預芜_v1.1.html b/瞟效管理系統_UI預芜_v1.1.html new file mode 100644 index 0000000..80569b3 --- /dev/null +++ b/瞟效管理系統_UI預芜_v1.1.html @@ -0,0 +1,1771 @@ + + + + + + 瞟效管理系統 - 四卡埪環 v1.1 + + + + + +
+
+
+
🏆
+
+

瞟效管理系統

+

Performance Management System

+
+
+
+
+ + +
+ + +
+
+
+ + +
+ +
+
+ + + + +
+
+ 評栞期間2024/01/01 - 2024/12/31 +
+
+ + +
+
+

📋 2024 幎床瞟效評栞流皋 - 單向連動

+ 敎體進床65% +
+
+
+
👀
+
角色卡
+
Role Card
+
已完成
+
+
+
🎯
+
胜力卡
+
Competency
+
已完成
+
+
+
📊
+
瞟效卡
+
Performance
+
進行䞭
+
+
+
🌱
+
成長卡
+
Growth
+
埅開始
+
+
+
+ + +
+ + + + +
+
+
+
+
📊
+
+

瞟效卡 - 2024幎床完敎評栞

+

Performance Review Form - Annual

+
+
+
+
+
目暙䜔比
+
70%
+
+
+
行為䜔比
+
30%
+
+
+
完成床
+
65%
+
+
+
+
+ + +
+ + + + + +
+ + +
+ +
+
+

+ 🎯 䞀、目暙與成果 (Goals & Outcomes) +

+ 䜔比: 70% +
+ + +
+
+
+ KRA 1 +

產品䞊垂時皋

+

權重40%

+
+ ✓ 已達成 +
+
+
具體產出
+
Q1 完成 MVP 開癌Q2 Beta 枬詊䞊線獲埗 500+ 枬詊甚戶回饋
+
+
+
+
+
+ 👀 自評 + 80% +
+
+
+
+
+
+
+ 👔 䞻管評 + 85% +
+
+
+
+
+
+
+
+ + +
+
+
+ KRA 2 +

客戶滿意床提升

+

權重30%

+
+ ✓ 超額達成 +
+
+
具體產出
+
NPS 埞 32 提升至 48目暙 45客戶續玄率達 92%
+
+
+
+
+
+ 👀 自評 + 100% +
+
+
+
+
+
+
+ 👔 䞻管評 + 100% +
+
+
+
+
+
+
+
+ + +
+ + +
+
+

+ 👥 二、行為與胜力評䌰 (Behavior Assessment) +

+ 䜔比: 30% +
+ +
+
+
+ 📚 職胜字兞 +

管理職胜橫向敎合力

+
+
+

敎合跚郚門資源建立有效協䜜關係達成共同目暙

+ + +
+
+ 👀 自評等玚 +
+
+ + + + + +
+
+ + +
+
+ 👔 䞻管評等玚 +
+
+ + + + + +
+
+ +
+
📝 評䌰舉䟋 (SBI 栌匏)
+

【情境 Situation】 跚郚門產品癌垃專案䞭

+

【行為 Behavior】 䞻動召開週會建立共享進床看板協調資源分配

+

【圱響 Impact】 專案準時䞊線團隊協䜜效率提升 30%

+
+
+
+
+ + + +
+ + + +
+ + +
+

🔄 四卡單向連動資料流

+
+
+
👀
+
角色卡
+
職責・KRA/KPI
+
+
→
+
+
🎯
+
胜力卡
+
技胜・熟緎床
+
+
→
+
+
📊
+
瞟效卡
+
達成・評分
+
+
→
+
+
🌱
+
成長卡
+
IDP・远蹀
+
+
+

↺ 基本資蚊自動垶入連動  週期保留快照歞檔

+
+
+ + + + diff --git a/瞟效管理系統_UI預芜_v1.2_AI茔助.html b/瞟效管理系統_UI預芜_v1.2_AI茔助.html new file mode 100644 index 0000000..079f28e --- /dev/null +++ b/瞟效管理系統_UI預芜_v1.2_AI茔助.html @@ -0,0 +1,1362 @@ + + + + + + 瞟效管理系統 - 四卡埪環 v1.2 (含AI茔助) + + + + + +
+
+
+
🏆
+
+

瞟效管理系統

+

Performance Management System

+
+
+
+
+ + +
+ +
+
+
+ + +
+ +
+ + + + +
+ + +
+
+
+
👀
+
+

角色卡 - 產品經理

+

Role Card - Product Manager

+
+
+ + + +
+ + +
+ +
+
+

+ 📋 䞀、栞心暙識信息 (Basic Identification) +

+
+ +
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ + +
+
+
+ + +
+
+

+ 🎯 二、角色䜿呜 (Role Mission) +

+
+ +
+
+ + +
+
+
+ + +
+
+

+ 📝 䞉、栞心職責 (Key Responsibilities) +

+ 建議 4-8 項動詞開頭 +
+ +
+
+ 1 + +
+
+ 2 + +
+
+ 3 + +
+
+ 4 + +
+
+ 5 + +
+
+ +
+ + +
+
+

+ 🔗 四、組織關聯 (Organizational Linkages) +

+
+ +
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ + +
+
+
+ + +
+
+

+ 📊 五、關鍵成果領域與瞟效指暙 (KRA/KPI) +

+ 權重瞜和須為 100% +
+ +
+
+
+ KRA 1 +
+ 權重 + + % +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+ +
+
+ KRA 2 +
+ 權重 + + % +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+ +
+
+ KRA 3 +
+ 權重 + + % +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ +
+
+ + + +
+
+ + +
+ +
✹
+
+

AI 已為悚補充 5 個欄䜍

+

玫色暙蚘的欄䜍為 AI 建議內容請確認埌調敎

+
+
+ + +
+
+
🀖
+

AI 正圚分析悚的資料...

+

根據已填寫內容智慧補充空癜欄䜍

+
+
+
+
+
+ + + +