變更內容: - 所有資料表加上 HR_position_ 前綴 - 整理完整欄位顯示名稱與 ID 對照表 - 模組化 JS 檔案 (admin.js, ai.js, csv.js 等) - 專案結構優化 (docs/, scripts/, tests/ 等) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
44 KiB
44 KiB
HR 基礎資料維護系統 - 軟體設計文件 (SDD)
文件版本:3.1 建立日期:2024-12-03 最後更新:2024-12-08 文件狀態:Released
1. 文件概述
1.1 目的
本文件為 HR 基礎資料維護系統之軟體設計文件 (Software Design Document),詳細描述系統架構、模組設計、資料結構、介面規格與 AI 整合功能,供開發人員、測試人員及維護人員參考。
1.2 範圍
本系統涵蓋以下功能模組:
| 模組 | 功能說明 |
|---|---|
| 崗位基礎資料 | 崗位主檔維護,含基礎資料與招聘要求 |
| 職務基礎資料 | 職務類別與屬性設定維護 |
| 部門職責 | 部門職責定義、使命願景與 KPI 維護 |
| 崗位描述 | 職責描述、崗位要求與任職條件維護 |
| 崗位清單 | 顯示所有崗位資料,支援查看描述與匯出 |
| 管理者頁面 | 使用者管理與完整崗位資料匯出 |
| 組織階層管理 | 事業體、處級單位、部級單位、崗位的層級關聯管理 |
1.3 參考文件
- 用戶需求規格書 (URD)
- 系統功能規格書 (FSD)
- API 設計規範
1.4 術語定義
| 術語 | 定義 |
|---|---|
| 崗位 (Position) | 組織架構中的職位單位,具有編號、級別、編制人數等屬性 |
| 職務 (Job Title) | 職務類別分類,如管理職、技術職、業務職等 |
| 部門職責 (DeptFunction) | 部門的職責範圍、使命願景與績效指標定義 |
| 崗位描述 (Job Description) | 詳細描述崗位職責、要求與任職條件的文件 |
| 事業體 (Business Unit) | 組織最高層級,代表獨立經營單位 |
| 處級單位 (Division) | 事業體下的次級組織單位 |
| 部級單位 (Department) | 處級單位下的基層組織單位 |
| AI 自動填充 | 利用大型語言模型自動生成表單欄位內容的功能 |
| 三個錦囊 | AI 智能功能區塊,提供自動補齊、範例模板、驗證檢查 |
| LLM | Large Language Model,大型語言模型 |
2. 系統架構
2.1 整體架構圖
┌─────────────────────────────────────────────────────────────────────┐
│ 使用者介面層 (UI Layer) │
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
│ │ 崗位基礎 │ │ 職務基礎 │ │ 部門職責 │ │ 崗位描述 │ │
│ │ 模組 │ │ 模組 │ │ 模組 │ │ 模組 │ │
│ └───────────┘ └───────────┘ └───────────┘ └───────────┘ │
│ │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ 三個錦囊 AI 功能區 │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ 自動補齊 │ │ 範例模板 │ │ 驗證檢查 │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ ES6 JavaScript 模組化架構 │ │
│ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │
│ │ │ main.js│ │ ui.js │ │ api.js │ │ai-bags │ │utils.js│ │ │
│ │ └────────┘ └────────┘ └────────┘ └────────┘ └────────┘ │ │
│ └───────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 應用服務層 (Application Layer) │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ Flask RESTful API │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │Position │ │ Job │ │DeptFunc │ │ LLM │ │Hierarchy│ │ │
│ │ │ API │ │ API │ │ API │ │ API │ │ API │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └─────────┘ │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ LLM 配置模組 (llm_config.py) │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │ Gemini │ │DeepSeek │ │ OpenAI │ │ Ollama │ │ GPT-OSS │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ │
│ └───────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 資料存取層 (Data Layer) │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ In-Memory Database / MySQL │ │
│ │ ┌─────────────────┐ ┌─────────────────────────────────────┐ │ │
│ │ │ positions_db │ │ 組織階層資料 │ │ │
│ │ │ jobs_db │ │ (business_units, divisions, │ │ │
│ │ │ dept_func_db │ │ departments, org_positions) │ │ │
│ │ │ job_desc_db │ │ │ │ │
│ │ └─────────────────┘ └─────────────────────────────────────┘ │ │
│ └───────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
2.2 技術堆疊
| 層級 | 技術選型 | 說明 |
|---|---|---|
| 前端 | HTML5 + CSS3 + ES6 JavaScript | 模組化架構,使用 import/export |
| 樣式 | CSS Modules + Google Fonts | Noto Sans TC 字型、CSS Variables |
| 後端 | Python Flask | RESTful API 服務 |
| AI 服務 | 多 LLM 支援 | Ollama、Gemini、DeepSeek、OpenAI、GPT-OSS |
| 資料庫 | In-Memory + MySQL | 組織階層資料支援 MySQL 持久化 |
2.3 前端模組結構
| 檔案 | 功能說明 |
|---|---|
| js/main.js | 應用程式入口,初始化與事件綁定 |
| js/ui.js | UI 互動邏輯,表單處理與頁籤切換 |
| js/api.js | API 呼叫封裝,與後端通訊 |
| js/ai-bags.js | 三個錦囊 AI 功能實現 |
| js/utils.js | 工具函數,Toast、錯誤處理等 |
| js/config.js | 配置常數,API 端點等 |
2.4 CSS 模組結構
| 檔案 | 功能說明 |
|---|---|
| styles/base.css | 基礎樣式、CSS 變數、reset |
| styles/layout.css | 頁面佈局、header、sidebar |
| styles/components.css | 按鈕、表單、卡片、Modal 等元件 |
| styles/modules.css | 各模組特定樣式 |
| styles/responsive.css | 響應式設計樣式 |
2.5 部署架構
┌─────────────────────────────────────────────────────────────────┐
│ 使用者瀏覽器 │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ index.html (前端應用,ES6 Modules) │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ js/main.js → ui.js → api.js → ai-bags.js │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│ │
▼ ▼
┌─────────────────────────┐ ┌────────────────────────────────────┐
│ Flask Server │ │ LLM API Services │
│ localhost:5000 │ │ ┌──────────┐ ┌──────────┐ │
│ ┌───────────────────┐ │ │ │ Ollama │ │ Gemini │ │
│ │ app.py │ │ │ │localhost │ │ Google │ │
│ │ llm_config.py │ │ │ └──────────┘ └──────────┘ │
│ └───────────────────┘ │ │ ┌──────────┐ ┌──────────┐ │
└─────────────────────────┘ │ │ DeepSeek │ │ OpenAI │ │
│ └──────────┘ └──────────┘ │
└────────────────────────────────────┘
3. 模組設計
3.1 崗位基礎資料模組
3.1.1 模組概述
提供崗位主檔的 CRUD 操作,分為「基礎資料」與「招聘要求資料」兩個頁籤。
3.1.2 基礎資料頁籤欄位規格
| 欄位名稱 | 欄位ID | 資料類型 | 必填 | 說明 |
|---|---|---|---|---|
| 崗位編號 | positionCode | String(20) | ✓ | 唯一識別碼,格式:XXX-NNN |
| 崗位名稱 | positionName | String(100) | ✓ | 崗位中文名稱 |
| 崗位類別 | positionCategory | Enum | 01/02/03/04 | |
| 崗位類別名稱 | positionCategoryName | String(50) | 自動帶出,唯讀 | |
| 崗位性質 | positionNature | Enum | FT/PT/CT/IN | |
| 崗位性質名稱 | positionNatureName | String(50) | 自動帶出,唯讀 | |
| 編制人數 | headcount | Integer | 0-9999 | |
| 崗位級別 | positionLevel | Enum | L1-L7 | |
| 生效日期 | effectiveDate | Date | 預設 2001-01-01 | |
| 崗位描述 | positionDesc | Text | 多行文字 | |
| 崗位備注 | positionRemark | Text | 多行文字 |
3.1.3 招聘要求資料頁籤欄位規格
| 欄位名稱 | 欄位ID | 資料類型 | 說明 |
|---|---|---|---|
| 最低學歷 | minEducation | Enum | HS/JC/BA/MA/PHD |
| 要求性別 | requiredGender | Enum | 空值=不限, M=男, F=女 |
| 薪酬范圍 | salaryRange | Enum | A/B/C/D/E/N |
| 工作經驗 | workExperience | Enum | 0/1/3/5/10 (年) |
| 最小年齡 | minAge | Integer | 18-65 |
| 最大年齡 | maxAge | Integer | 18-65 |
| 工作性質 | jobType | Enum | FT/PT/CT/DP |
| 招聘職位 | recruitPosition | Enum | ENG/MGR/AST/OP/SAL |
| 職位名稱 | jobTitle | String(100) | |
| 職位描述 | jobDesc | Text | |
| 崗位要求 | positionReq | Text | |
| 職稱要求 | titleReq | Enum | NONE/CERT/LIC |
| 專業要求 | majorReq | String(200) | 多選,逗號分隔 |
| 技能要求 | skillReq | String(200) | |
| 語言要求 | langReq | String(100) | |
| 其他要求 | otherReq | String(200) | |
| 上級崗位編號 | superiorPosition | String(20) | |
| 備注說明 | recruitRemark | Text |
3.1.4 類別代碼對照表
崗位類別 (positionCategory)
| 代碼 | 名稱 |
|---|---|
| 01 | 技術職 |
| 02 | 管理職 |
| 03 | 業務職 |
| 04 | 行政職 |
崗位性質 (positionNature)
| 代碼 | 名稱 |
|---|---|
| FT | 全職 |
| PT | 兼職 |
| CT | 約聘 |
| IN | 實習 |
崗位級別 (positionLevel)
| 代碼 | 名稱 |
|---|---|
| L1 | 基層員工 |
| L2 | 資深員工 |
| L3 | 主管 |
| L4 | 經理 |
| L5 | 總監 |
| L6 | 副總 |
| L7 | 總經理 |
3.2 職務基礎資料模組
3.2.1 模組概述
提供職務類別主檔的維護功能,包含職務屬性設定。
3.2.2 欄位規格
| 欄位名稱 | 欄位ID | 資料類型 | 必填 | 說明 |
|---|---|---|---|---|
| 職務類別編號 | jobCategoryCode | Enum | ✓ | MGR/TECH/SALE/ADMIN/RD/PROD |
| 職務類別名稱 | jobCategoryName | String(50) | 自動帶出,唯讀 | |
| 職務編號 | jobCode | String(20) | ✓ | 唯一識別碼 |
| 職務名稱 | jobName | String(100) | ✓ | 職務中文名稱 |
| 職務英文 | jobNameEn | String(100) | 職務英文名稱 | |
| 生效日期 | jobEffectiveDate | Date | ||
| 編制人數 | jobHeadcount | Integer | 0-9999 | |
| 排列順序 | jobSortOrder | Integer | 顯示排序 | |
| 備注說明 | jobRemark | Text | ||
| 職務層級 | jobLevel | String(50) | 可設為 保密 | |
| 是否有全勤 | hasAttendanceBonus | Boolean | Toggle 開關 | |
| 是否住房補貼 | hasHousingAllowance | Boolean | Toggle 開關 |
3.2.3 職務類別代碼對照表
| 代碼 | 名稱 |
|---|---|
| MGR | 管理職 |
| TECH | 技術職 |
| SALE | 業務職 |
| ADMIN | 行政職 |
| RD | 研發職 |
| PROD | 生產職 |
3.3 部門職責模組
3.3.1 模組概述
提供部門職責定義維護功能,包含部門使命願景、核心職責與績效指標設定。
3.3.2 欄位規格
| 欄位名稱 | 欄位ID | 資料類型 | 必填 | 說明 |
|---|---|---|---|---|
| 職責編號 | df_code | String(20) | ✓ | 格式 DF-001 |
| 職責名稱 | df_name | String(100) | ✓ | |
| 事業體 | df_businessUnit | Enum | ✓ | SBU/MBU/TBU |
| 處級單位 | df_division | Enum | ✓ | 聯動選項 |
| 部級單位 | df_department | Enum | ✓ | 聯動選項 |
| 課級單位 | df_section | String(50) | ||
| 對應崗位 | df_posTitle | Enum | ✓ | 關聯 Position |
| 崗位級別 | df_posLevel | Enum | L1-L7 | |
| 部門主管職稱 | df_managerTitle | String(100) | ||
| 生效日期 | df_effectiveDate | Date | ✓ | |
| 人數上限 | df_headcountLimit | Integer | ||
| 狀態 | df_status | Enum | active/inactive | |
| 部門使命 | df_mission | Text | ||
| 部門願景 | df_vision | Text | ||
| 核心職責 | df_coreFunc | Text | ✓ | |
| KPIs | df_kpis | Text | 績效指標 | |
| 協作部門 | df_collab | Text | ||
| 備注 | df_remark | Text |
3.3.3 狀態代碼對照表
| 代碼 | 名稱 |
|---|---|
| active | 生效中 |
| inactive | 已停用 |
3.4 崗位描述模組
3.4.1 模組概述
提供完整的崗位描述書 (Job Description) 維護功能,包含崗位基本信息、職責描述與崗位要求三大區塊。
3.4.2 頂部區域欄位
| 欄位名稱 | 欄位ID | 資料類型 | 說明 |
|---|---|---|---|
| 工號 | jd_empNo | String(20) | 員工編號 |
| 姓名 | jd_empName | String(50) | 自動帶出,唯讀 |
| 崗位代碼 | jd_positionCode | String(20) | |
| 版本更新日期 | jd_versionDate | Date |
3.4.3 崗位基本信息區塊
| 欄位名稱 | 欄位ID | 資料類型 | 說明 |
|---|---|---|---|
| 崗位名稱 | jd_positionName | String(100) | |
| 所屬部門 | jd_department | String(100) | |
| 崗位生效日期 | jd_positionEffectiveDate | Date | |
| 直接領導職務 | jd_directSupervisor | String(100) | |
| 崗位職等&職務 | jd_positionGradeJob | String(100) | 選擇按鈕 |
| 匯報對象職務 | jd_reportTo | String(100) | 選擇按鈕 |
| 直接下級 | jd_directReports | String(200) | 格式:職位 x 人數 |
| 任職地點 | jd_workLocation | Enum | HQ/TPE/TYC/KHH/SH/SZ |
| 員工屬性 | jd_empAttribute | Enum | FT/CT/PT/IN/DP |
3.4.4 職責描述區塊
| 欄位名稱 | 欄位ID | 資料類型 | 說明 |
|---|---|---|---|
| 崗位設置目的 | jd_positionPurpose | String(500) | 單行文字 |
| 主要崗位職責 | jd_mainResponsibilities | Text | 編號格式 1、2、3、... |
3.4.5 崗位要求區塊
| 欄位名稱 | 欄位ID | 資料類型 | 說明 |
|---|---|---|---|
| 教育程度 | jd_education | String(200) | |
| 基本技能 | jd_basicSkills | Text | |
| 專業知識 | jd_professionalKnowledge | Text | |
| 工作經驗 | jd_workExperienceReq | Text | |
| 其他 | jd_otherRequirements | Text |
3.4.6 任職地點代碼對照表
| 代碼 | 名稱 |
|---|---|
| HQ | 總部 |
| TPE | 台北辦公室 |
| TYC | 桃園廠區 |
| KHH | 高雄廠區 |
| SH | 上海辦公室 |
| SZ | 深圳辦公室 |
3.4.7 員工屬性代碼對照表
| 代碼 | 名稱 |
|---|---|
| FT | 正式員工 |
| CT | 約聘人員 |
| PT | 兼職人員 |
| IN | 實習生 |
| DP | 派遣人員 |
4. API 設計
4.1 API 端點總覽
4.1.1 崗位資料 API
| 方法 | 端點 | 說明 |
|---|---|---|
| GET | /api/positions |
獲取所有崗位(支援分頁、搜尋) |
| GET | /api/positions/{id} |
獲取單一崗位 |
| POST | /api/positions |
新增崗位 |
| PUT | /api/positions/{id} |
更新崗位 |
| DELETE | /api/positions/{id} |
刪除崗位 |
| POST | /api/positions/{id}/change-code |
更改崗位編號 |
4.1.2 職務資料 API
| 方法 | 端點 | 說明 |
|---|---|---|
| GET | /api/jobs |
獲取所有職務(支援分頁、搜尋、類別篩選) |
| GET | /api/jobs/{id} |
獲取單一職務 |
| POST | /api/jobs |
新增職務 |
| PUT | /api/jobs/{id} |
更新職務 |
| DELETE | /api/jobs/{id} |
刪除職務 |
| POST | /api/jobs/{id}/change-code |
更改職務編號 |
4.1.3 崗位描述 API
| 方法 | 端點 | 說明 |
|---|---|---|
| GET | /api/position-descriptions |
獲取所有崗位描述 |
| GET | /api/position-descriptions/{position_code} |
獲取單一崗位描述 |
| POST | /api/position-descriptions |
新增或更新崗位描述 |
| PUT | /api/position-descriptions/{position_code} |
更新崗位描述 |
| DELETE | /api/position-descriptions/{position_code} |
刪除崗位描述 |
4.1.4 崗位清單 API
| 方法 | 端點 | 說明 |
|---|---|---|
| GET | /api/position-list |
獲取崗位清單(支援分頁、搜尋) |
| GET | /api/position-list/export |
匯出完整崗位清單為 CSV |
4.1.5 CSV 匯入匯出 API
| 方法 | 端點 | 說明 |
|---|---|---|
| GET | /api/positions/csv-template |
下載崗位資料 CSV 範本 |
| POST | /api/positions/import-csv |
批次匯入崗位資料 |
| GET | /api/jobs/csv-template |
下載職務資料 CSV 範本 |
| POST | /api/jobs/import-csv |
批次匯入職務資料 |
4.1.6 參照資料 API
| 方法 | 端點 | 說明 |
|---|---|---|
| GET | /api/reference/categories |
崗位類別選項 |
| GET | /api/reference/job-categories |
職務類別選項 |
| GET | /api/reference/natures |
崗位性質選項 |
| GET | /api/reference/education |
學歷選項 |
| GET | /api/reference/majors |
專業選項 |
4.1.7 組織階層 API
| 方法 | 端點 | 說明 |
|---|---|---|
| GET | /api/hierarchy/business-units |
獲取所有事業體 |
| GET | /api/hierarchy/divisions |
獲取處級單位(可按事業體篩選) |
| GET | /api/hierarchy/departments |
獲取部級單位(可按處級單位篩選) |
| GET | /api/hierarchy/positions |
獲取崗位名稱(可按部級單位篩選) |
| GET | /api/hierarchy/full |
獲取完整階層資料(支援分頁) |
| GET | /api/hierarchy/cascade |
獲取級聯選擇資料 |
| GET | /api/hierarchy/stats |
獲取組織統計資訊 |
4.2 API 請求/回應範例
4.2.1 新增崗位
Request
POST /api/positions
Content-Type: application/json
{
"basicInfo": {
"positionCode": "ENG-001",
"positionName": "資深軟體工程師",
"positionCategory": "01",
"positionNature": "FT",
"headcount": "5",
"positionLevel": "L3",
"effectiveDate": "2024-01-01",
"positionDesc": "負責系統架構設計與核心模組開發"
},
"recruitInfo": {
"minEducation": "BA",
"salaryRange": "D",
"workExperience": "5",
"skillReq": "Python, JavaScript, SQL"
}
}
Response (201 Created)
{
"success": true,
"message": "崗位資料新增成功",
"data": {
"id": "ENG-001",
"basicInfo": { ... },
"recruitInfo": { ... },
"createdAt": "2024-12-03T10:30:00",
"updatedAt": "2024-12-03T10:30:00"
}
}
4.2.2 查詢崗位列表
Request
GET /api/positions?page=1&size=20&search=工程師
Response (200 OK)
{
"success": true,
"data": [
{
"id": "ENG-001",
"basicInfo": { ... },
"recruitInfo": { ... }
}
],
"pagination": {
"page": 1,
"size": 20,
"total": 1,
"totalPages": 1
}
}
4.3 錯誤處理
| HTTP 狀態碼 | 錯誤類型 | 說明 |
|---|---|---|
| 400 | Bad Request | 請求參數錯誤或缺少必填欄位 |
| 404 | Not Found | 找不到指定資源 |
| 409 | Conflict | 資源衝突(如編號已存在) |
| 500 | Internal Server Error | 伺服器內部錯誤 |
錯誤回應格式
{
"success": false,
"error": "錯誤訊息描述"
}
5. AI 智能功能設計
5.1 功能概述
系統整合多種 LLM API,提供「三個錦囊」智能功能區塊:
| 錦囊 | 功能 | 說明 |
|---|---|---|
| 自動補齊 | AI 自動填充 | 根據已填內容智能生成其餘欄位 |
| 範例模板 | 範例資料生成 | 提供符合行業標準的範例資料 |
| 驗證檢查 | 資料驗證建議 | 檢查資料完整性與合理性 |
5.2 支援的 LLM 服務
| 服務 | 配置鍵 | 預設模型 | 說明 |
|---|---|---|---|
| Ollama | OLLAMA_API_KEY | qwen2.5:3b | 本地部署,無需 API 費用 |
| Gemini | GEMINI_API_KEY | gemini-pro | Google AI 服務 |
| DeepSeek | DEEPSEEK_API_KEY | deepseek-chat | 中文優化模型 |
| OpenAI | OPENAI_API_KEY | gpt-3.5-turbo | OpenAI 官方服務 |
| GPT-OSS | GPTOSS_API_KEY | - | 開源替代服務 |
5.3 三個錦囊 UI 設計
┌─────────────────────────────────────────────────────┐
│ 三個錦囊 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 自動補齊 │ │ 範例模板 │ │ 驗證檢查 │ │
│ │ AI │ │ Template │ │ Validate │ │
│ │ (Edit) │ │ (Edit) │ │ (Edit) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────┘
5.4 Prompt 編輯功能
每個錦囊支援 Prompt 編輯,用戶可自訂 AI 生成邏輯:
- 標題:錦囊顯示名稱
- 副標題:功能簡述
- Prompt:發送給 LLM 的指令內容
- 儲存至 LocalStorage,持久化設定
5.5 填充邏輯
┌─────────────────────────────────────────────────────────┐
│ AI 填充流程 │
├─────────────────────────────────────────────────────────┤
│ 1. 用戶點擊「I'm feeling lucky」按鈕 │
│ │ │
│ ▼ │
│ 2. 檢查表單欄位狀態 │
│ ├── 收集已填寫欄位 (作為上下文) │
│ └── 識別空白欄位 (待填充目標) │
│ │ │
│ ▼ │
│ 3. 若無空白欄位 → 顯示「所有欄位都已填寫完成!」 │
│ 若有空白欄位 → 繼續 │
│ │ │
│ ▼ │
│ 4. 組裝 Prompt │
│ ├── 包含已填寫資料作為參考 │
│ ├── 指定只生成空白欄位 │
│ └── 要求返回 JSON 格式 │
│ │ │
│ ▼ │
│ 5. 呼叫 Claude API (claude-sonnet-4-20250514) │
│ │ │
│ ▼ │
│ 6. 解析回應並填充空白欄位 │
│ └── 已有內容的欄位保持不變 │
│ │ │
│ ▼ │
│ 7. 顯示「✨ AI 已補充 N 個欄位!」 │
└─────────────────────────────────────────────────────────┘
5.6 核心函數
5.6.1 fillIfEmpty
/**
* 只在欄位為空時填入值
* @param {string} elementId - DOM 元素 ID
* @param {string} value - 要填入的值
* @returns {boolean} - 是否有填入值
*/
function fillIfEmpty(elementId, value) {
const el = document.getElementById(elementId);
if (el && !el.value.trim() && value) {
el.value = value;
return true;
}
return false;
}
5.6.2 getEmptyFields
/**
* 獲取空白欄位列表
* @param {string[]} fieldIds - 欄位 ID 陣列
* @returns {string[]} - 空白欄位 ID 陣列
*/
function getEmptyFields(fieldIds) {
return fieldIds.filter(id => !getFieldValue(id));
}
5.7 API 呼叫規格
本地 Flask API Endpoint
POST http://localhost:5000/api/llm/generate
Request Body
{
"api": "ollama",
"model": "qwen2.5:3b",
"prompt": "Prompt 內容...",
"max_tokens": 2000
}
5.8 Prompt 設計範例
請為HR崗位管理系統生成崗位基礎資料。請用繁體中文回覆。
已填寫的資料(請參考這些內容來生成相關的資料):
{
"positionName": "資深前端工程師",
"positionLevel": "L4"
}
請「只生成」以下這些尚未填寫的欄位:positionCode, positionCategory, positionNature, headcount, positionDesc
欄位說明:
- positionCode: 崗位編號(格式如 ENG-001)
- positionCategory: 崗位類別代碼(01=技術職, 02=管理職...)
...
請直接返回JSON格式,只包含需要生成的欄位:
{
"positionCode": "...",
"positionCategory": "...",
...
}
6. 使用者介面設計
6.1 色彩規範
| 變數名稱 | 色碼 | 用途 |
|---|---|---|
| --primary | #1a5276 | 主色(崗位模組) |
| --primary-light | #2980b9 | 主色亮色 |
| --primary-dark | #0e3a53 | 主色暗色 |
| --accent | #e67e22 | 強調色(職務模組) |
| --green | #27ae60 | 綠色(崗位描述模組) |
| --success | #27ae60 | 成功狀態 |
| --warning | #f39c12 | 警告狀態 |
| --danger | #e74c3c | 錯誤/必填標示 |
6.2 模組主題色
| 模組 | Header 背景 | 按鈕樣式 |
|---|---|---|
| 崗位基礎資料 | 藍色漸層 | primary |
| 職務基礎資料 | 橘色漸層 | accent |
| 崗位描述 | 綠色漸層 | green |
6.3 元件規格
6.3.1 輸入框
input, select, textarea {
padding: 10px 14px;
border: 1.5px solid var(--border);
border-radius: 6px;
font-size: 0.9rem;
}
6.3.2 按鈕
| 類型 | Class | 用途 |
|---|---|---|
| 主要按鈕 | .btn-primary | 保存操作 |
| 次要按鈕 | .btn-secondary | 保存並新增 |
| 取消按鈕 | .btn-cancel | 取消操作 |
| AI 按鈕 | .ai-generate-btn | AI 自動填充 |
6.3.3 Toggle 開關
.toggle-switch {
width: 52px;
height: 28px;
}
6.4 響應式斷點
| 斷點 | 寬度 | 佈局調整 |
|---|---|---|
| Desktop | > 768px | 雙欄表單佈局 |
| Mobile | ≤ 768px | 單欄表單佈局 |
7. 資料結構
7.1 崗位資料 (Position)
interface Position {
id: string; // 崗位編號 (PK)
basicInfo: {
positionCode: string; // 崗位編號
positionName: string; // 崗位名稱
positionCategory: string; // 崗位類別
positionCategoryName: string;// 崗位類別名稱
positionNature: string; // 崗位性質
positionNatureName: string; // 崗位性質名稱
headcount: string; // 編制人數
positionLevel: string; // 崗位級別
effectiveDate: string; // 生效日期
positionDesc: string; // 崗位描述
positionRemark: string; // 崗位備注
};
recruitInfo: {
minEducation: string; // 最低學歷
requiredGender: string; // 要求性別
salaryRange: string; // 薪酬范圍
workExperience: string; // 工作經驗
minAge: string; // 最小年齡
maxAge: string; // 最大年齡
jobType: string; // 工作性質
recruitPosition: string; // 招聘職位
jobTitle: string; // 職位名稱
jobDesc: string; // 職位描述
positionReq: string; // 崗位要求
titleReq: string; // 職稱要求
majorReq: string; // 專業要求
skillReq: string; // 技能要求
langReq: string; // 語言要求
otherReq: string; // 其他要求
superiorPosition: string; // 上級崗位編號
recruitRemark: string; // 備注說明
};
createdAt: string; // 建立時間
updatedAt: string; // 更新時間
}
7.2 職務資料 (Job)
interface Job {
id: string; // 職務編號 (PK)
jobCategoryCode: string; // 職務類別編號
jobCategoryName: string; // 職務類別名稱
jobCode: string; // 職務編號
jobName: string; // 職務名稱
jobNameEn: string; // 職務英文名稱
jobEffectiveDate: string; // 生效日期
jobHeadcount: number; // 編制人數
jobSortOrder: number; // 排列順序
jobRemark: string; // 備注說明
jobLevel: string; // 職務層級
hasAttendanceBonus: boolean; // 是否有全勤
hasHousingAllowance: boolean; // 是否住房補貼
createdAt: string; // 建立時間
updatedAt: string; // 更新時間
}
7.3 崗位描述資料 (PositionDescription)
interface PositionDescription {
id: string; // 崗位編號 (PK)
positionCode: string; // 崗位編號
positionName: string; // 崗位名稱
effectiveDate: string; // 生效日期
jobDuties: string; // 工作職責
requiredSkills: string; // 所需技能
workEnvironment: string; // 工作環境
careerPath: string; // 職涯發展路徑
createdAt: string; // 建立時間
updatedAt: string; // 更新時間
}
7.4 崗位清單資料 (PositionListItem)
interface PositionListItem {
positionCode: string; // 崗位編號
positionName: string; // 崗位名稱
positionCategory: string; // 崗位類別
positionNature: string; // 崗位性質
headcount: string; // 編制人數
positionLevel: string; // 崗位等級
effectiveDate: string; // 生效日期
minEducation: string; // 最低學歷
salaryRange: string; // 薪資範圍
hasDescription: boolean; // 是否有描述
jobDuties: string; // 工作職責
requiredSkills: string; // 所需技能
workEnvironment: string; // 工作環境
createdAt: string; // 建立時間
updatedAt: string; // 更新時間
}
7.5 組織階層資料結構
7.5.1 事業體 (BusinessUnit)
interface BusinessUnit {
id: number; // 主鍵
business_code: string; // 事業體代碼 (BU001, BU002...)
business_name: string; // 事業體名稱
sort_order: number; // 排序
is_active: boolean; // 是否啟用
remark: string; // 備註
created_at: string; // 建立時間
updated_at: string; // 更新時間
}
7.5.2 處級單位 (Division)
interface Division {
id: number; // 主鍵
division_code: string; // 處級單位代碼 (DIV001, DIV002...)
division_name: string; // 處級單位名稱
business_id: number; // 所屬事業體ID (FK)
sort_order: number; // 排序
is_active: boolean; // 是否啟用
remark: string; // 備註
created_at: string; // 建立時間
updated_at: string; // 更新時間
}
7.5.3 部級單位 (Department)
interface Department {
id: number; // 主鍵
department_code: string; // 部級單位代碼 (DEPT001, DEPT002...)
department_name: string; // 部級單位名稱
division_id: number; // 所屬處級單位ID (FK)
sort_order: number; // 排序
is_active: boolean; // 是否啟用
remark: string; // 備註
created_at: string; // 建立時間
updated_at: string; // 更新時間
}
7.5.4 組織崗位關聯 (OrganizationPosition)
interface OrganizationPosition {
id: number; // 主鍵
business_id: number; // 事業體ID (FK)
division_id: number; // 處級單位ID (FK)
department_id: number; // 部級單位ID (FK)
position_title: string; // 崗位名稱
sort_order: number; // 排序
is_active: boolean; // 是否啟用
created_at: string; // 建立時間
updated_at: string; // 更新時間
}
7.5.5 組織階層關係圖
事業體 (business_units)
│
├── 岡山製造事業體
│ ├── 生產處 (divisions)
│ │ ├── 生產部 (departments)
│ │ │ ├── 經副理 (organization_positions)
│ │ │ ├── 課長
│ │ │ ├── 組長
│ │ │ └── 班長
│ │ └── 生產企劃部
│ │ ├── 經副理
│ │ └── 專員
│ ├── 封裝工程處
│ └── ...
│
├── 產品事業體
│ ├── 先進產品事業處
│ └── 成熟產品事業處
│
└── ...(共 15 個事業體)
7.5.6 資料統計
| 層級 | 資料筆數 |
|---|---|
| 事業體 | 15 筆 |
| 處級單位 | ~45 筆 |
| 部級單位 | ~70 筆 |
| 組織崗位關聯 | ~350 筆(去重後) |
8. 快捷鍵設計
| 快捷鍵 | 功能 | 適用範圍 |
|---|---|---|
Ctrl + S |
保存并退出 | 所有模組 |
Ctrl + N |
保存并新增 | 所有模組 |
9. 檔案結構
hr_position_form/
├── index.html # 前端應用主檔
├── app.py # Flask 後端 API
├── llm_config.py # LLM API 配置模組
├── database_schema.sql # MySQL 資料庫結構定義
├── init_database.py # 資料庫初始化腳本
├── import_hierarchy_data.py # 組織階層資料匯入腳本
├── hierarchical_data.js # 組織階層原始資料
├── requirements.txt # Python 依賴套件
├── .env # 環境變數配置 (API Keys)
├── README.md # 使用說明文件
├── SDD.md # 軟體設計文件
├── TDD.md # 測試設計文件
│
├── js/ # JavaScript 模組
│ ├── main.js # 應用程式入口
│ ├── ui.js # UI 互動邏輯
│ ├── api.js # API 呼叫封裝
│ ├── ai-bags.js # 三個錦囊功能
│ ├── utils.js # 工具函數
│ └── config.js # 配置常數
│
├── styles/ # CSS 樣式模組
│ ├── base.css # 基礎樣式
│ ├── layout.css # 頁面佈局
│ ├── components.css # UI 元件
│ ├── modules.css # 模組樣式
│ └── responsive.css # 響應式設計
│
└── data/ # 資料檔案
├── positions.csv # 崗位資料範本
└── jobs.csv # 職務資料範本
10. 未來擴展建議
10.1 資料庫整合
將 In-Memory 儲存替換為正式資料庫:
# 建議使用 SQLAlchemy ORM
from flask_sqlalchemy import SQLAlchemy
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://user:pass@host/db'
db = SQLAlchemy(app)
10.2 權限控制整合
# 建議整合 Azure AD
from flask_azure_oauth import AzureOAuth
azure_oauth = AzureOAuth(app)
@app.route('/api/positions', methods=['POST'])
@azure_oauth.require_auth
def create_position():
...
10.3 審計日誌
# 記錄所有資料變更
def log_audit(action, entity_type, entity_id, old_data, new_data, user_id):
audit_log = {
'action': action, # CREATE/UPDATE/DELETE
'entity_type': entity_type,
'entity_id': entity_id,
'old_data': old_data,
'new_data': new_data,
'user_id': user_id,
'timestamp': datetime.now().isoformat()
}
# 儲存至審計日誌表
10.4 多語言支援
// i18n 國際化
const i18n = {
'zh-TW': {
'position.code': '崗位編號',
'position.name': '崗位名稱',
...
},
'en-US': {
'position.code': 'Position Code',
'position.name': 'Position Name',
...
}
};
11. 版本歷史
| 版本 | 日期 | 作者 | 變更說明 |
|---|---|---|---|
| 1.0 | 2024-12-03 | System | 初始版本,包含三大模組設計與 AI 功能 |
| 2.0 | 2024-12-04 | System | 新增 MySQL 資料庫整合、多 LLM API 支援、全局錯誤處理、Gitea 版本控制 |
| 2.1 | 2024-12-04 | System | 新增崗位描述保存功能、崗位清單模組、管理者頁面匯出功能、CSV 批次匯入 |
| 3.0 | 2024-12-06 | System | 新增部門職責模組、三個錦囊 AI 功能、ES6 模組化架構、改進 JSON 解析錯誤處理 |
| 3.1 | 2024-12-08 | System | 新增組織階層管理模組,包含事業體、處級單位、部級單位、崗位的四層架構;新增 7 個組織階層 API 端點;更新資料庫結構支援組織階層資料 |
12. 附錄
附錄 A:JSON 資料預覽格式
系統提供即時 JSON 預覽功能,格式如下:
{
"module": "崗位基礎資料",
"basicInfo": {
"positionCode": "ENG-001",
"positionName": "資深軟體工程師",
"positionCategory": "01",
"positionCategoryName": "技術職",
"positionNature": "FT",
"positionNatureName": "全職",
"headcount": "5",
"positionLevel": "L3"
},
"recruitInfo": {
"minEducation": "BA",
"salaryRange": "D",
"workExperience": "5"
}
}
附錄 B:UI 截圖參考
(請參考系統實際畫面)
文件結束