backup: 完成 HR_position_ 表格前綴重命名與欄位對照表整理

變更內容:
- 所有資料表加上 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>
This commit is contained in:
2025-12-09 12:05:20 +08:00
parent a068ef9704
commit a6af297623
82 changed files with 8685 additions and 4933 deletions

View File

@@ -0,0 +1,183 @@
# 系統表單欄位規範書 v1.1 (UX Optimized)
**設計原則 (UX Design Principles):**
1. **Context First**: 先確認組織架構 (BU/Dept),再定義具體內容。
2. **Key Data Top**: 核心識別資料 (編號/名稱) 置頂。
3. **Group by Type**: 下拉選單 (Select) 集中,開關 (Switch) 集中,長文字 (Textarea) 沉底。
---
## 1. 崗位基礎資料模組 (Position Module)
**表單代號**: `positionForm`
**資料表**: `Position`
### 1.1 基礎資料頁籤 (tab-position-basic)
> **UX 邏輯**: 先選組織(過濾條件) → 填寫核心識別 → 設定分類屬性 → 填寫詳細描述。
| # | 欄位顯示名稱 | 標準化 HTML ID | 資料庫欄位名稱 | 類型 | 必填 | 備註 |
|---|---|---|---|---|---|---|
| **[組織定義]** | | | | | | |
| 1 | 事業體 | `pos_businessUnit` | `businessUnit` | select | 否 | 聯動 L1 |
| 2 | 處級單位 | `pos_division` | `division` | select | 否 | 聯動 L2 |
| 3 | 部級單位 | `pos_department` | `department` | select | 否 | 聯動 L3 |
| 4 | 課級單位 | `pos_section` | `section` | text | 否 | - |
| **[核心識別]** | | | | | | |
| 5 | **崗位編號** | `pos_code` | `positionCode` | text | **是** | 唯一識別 |
| 6 | **崗位名稱** | `pos_name` | `positionName` | text | **是** | - |
| 7 | 生效日期 | `pos_effectiveDate` | `effectiveDate` | date | 否 | 預設今日 |
| **[分類屬性]** | | | | | | |
| 8 | 崗位級別 | `pos_level` | `positionLevel` | select | 否 | L1-L7 |
| 9 | 崗位類別 | `pos_category` | `positionCategory` | select | 否 | 連動帶出名稱 |
| 10 | 崗位類別名稱 | `pos_categoryName` | `positionCategoryName` | text | 否 | Readonly |
| 11 | 崗位性質 | `pos_type` | `positionType` | select | 否 | FT/PT/CT... |
| 12 | 崗位性質名稱 | `pos_typeName` | `positionTypeName` | text | 否 | Readonly |
| 13 | 編制人數 | `pos_headcount` | `headcount` | number | 否 | - |
| **[詳細描述]** | | | | | | |
| 14 | 崗位描述 | `pos_desc` | `description` | textarea | 否 | rows=6 |
| 15 | 崗位備注 | `pos_remark` | `remark` | textarea | 否 | rows=4 |
### 1.2 招聘要求資料頁籤 (tab-position-recruit)
> **UX 邏輯**: 先定義「要招什麼樣的人(Target)」→「硬性條件(Must)」→「軟性技能(Plus)」→「廣告文案(Text)」。
| # | 欄位顯示名稱 | 標準化 HTML ID | 資料庫欄位名稱 | 類型 | 必填 | 備註 |
|---|---|---|---|---|---|---|
| **[招聘職位定義]** | | | | | | |
| 1 | 招聘職位代碼 | `rec_position` | `recruitPosition` | select | 否 | ENG, MGR... |
| 2 | 對外職稱 | `rec_jobTitle` | `jobTitle` | text | 否 | 顯示在招聘網的名稱 |
| 3 | 上級崗位編號 | `rec_superiorCode` | `superiorPositionCode` | text | 否 | - |
| 4 | 工作性質 | `rec_jobType` | `jobType` | select | 否 | 招聘用分類 |
| **[硬性資格]** | | | | | | |
| 5 | 最低學歷 | `rec_eduLevel` | `educationLevel` | select | 否 | - |
| 6 | 專業要求 | `rec_majorReq` | `majorRequirements` | text | 否 | Modal 選擇 |
| 7 | 工作經驗 | `rec_expYears` | `experienceYears` | select | 否 | - |
| 8 | 薪酬范圍 | `rec_salaryRange` | `salaryRange` | select | 否 | - |
| 9 | 要求性別 | `rec_gender` | `requiredGender` | select | 否 | - |
| 10 | 年齡限制 (Min) | `rec_minAge` | `minAge` | number | 否 | 併排顯示 |
| 11 | 年齡限制 (Max) | `rec_maxAge` | `maxAge` | number | 否 | 併排顯示 |
| **[技能與證照]** | | | | | | |
| 12 | 語言要求 | `rec_langReq` | `langRequirements` | text | 否 | - |
| 13 | 證照要求 | `rec_certReq` | `certRequirements` | select | 否 | - |
| 14 | 技能要求 | `rec_skillReq` | `skillRequirements` | text | 否 | Tag input |
| 15 | 其他要求 | `rec_otherReq` | `otherRequirements` | text | 否 | - |
| **[文案描述]** | | | | | | |
| 16 | 職位描述 (JD) | `rec_jobDesc` | `recruitJobDesc` | textarea | 否 | 廣告用 |
| 17 | 崗位要求 (Req) | `rec_positionReq` | `recruitRequirements` | textarea | 否 | 廣告用 |
| 18 | 招聘備注 | `rec_remark` | `recruitRemark` | textarea | 否 | 內部用 |
---
## 2. 職務基礎資料模組 (Job Module)
**表單代號**: `jobForm`
**資料表**: `Job`
> **UX 邏輯**: 先分類 → 再命名 → 設定權限/福利(開關) → 備註。
| # | 欄位顯示名稱 | 標準化 HTML ID | 資料庫欄位名稱 | 類型 | 必填 | 備註 |
|---|---|---|---|---|---|---|
| **[分類與識別]** | | | | | | |
| 1 | **職務類別** | `job_category` | `jobCategoryCode` | select | **是** | - |
| 2 | 職務類別名稱 | `job_categoryName` | `jobCategoryName` | text | 否 | Readonly |
| 3 | **職務編號** | `job_code` | `jobCode` | text | **是** | - |
| 4 | **職務名稱** | `job_name` | `jobName` | text | **是** | - |
| 5 | 職務英文名稱 | `job_nameEn` | `jobNameEn` | text | 否 | - |
| **[屬性設定]** | | | | | | |
| 6 | 職務層級 | `job_level` | `jobLevel` | text | 否 | 敏感欄位 |
| 7 | 生效日期 | `job_effectiveDate`| `effectiveDate` | date | 否 | - |
| 8 | 排列順序 | `job_sortOrder` | `sortOrder` | number | 否 | - |
| 9 | 預算編制人數 | `job_headcount` | `headcount` | number | 否 | - |
| **[福利開關]** | | | | | | |
| 10 | 全勤獎金 | `job_hasAttBonus` | `hasAttendanceBonus` | checkbox| 否 | Toggle Switch |
| 11 | 住房補貼 | `job_hasHouseAllow`| `hasHousingAllowance` | checkbox| 否 | Toggle Switch |
| **[備註]** | | | | | | |
| 12 | 職務備注 | `job_remark` | `remark` | textarea | 否 | - |
---
## 3. 部門職責模組 (DeptFunction Module)
**表單代號**: `deptFunctionForm`
**資料表**: `DeptFunction`
> **UX 邏輯**: 組織架構 → 核心職責定義 → 管理與規模 → 策略性描述(使命/願景)。
| # | 欄位顯示名稱 | 標準化 HTML ID | 資料庫欄位名稱 | 類型 | 必填 | 備註 |
|---|---|---|---|---|---|---|
| **[基本定義]** | | | | | | |
| 1 | **事業體** | `df_businessUnit` | `businessUnit` | select | **是** | - |
| 2 | **處級單位** | `df_division` | `division` | select | **是** | - |
| 3 | **部級單位** | `df_department` | `department` | select | **是** | - |
| 4 | 課級單位 | `df_section` | `section` | text | 否 | - |
| 5 | **職責編號** | `df_code` | `dfCode` | text | **是** | - |
| 6 | **職責名稱** | `df_name` | `dfName` | text | **是** | - |
| **[管理架構]** | | | | | | |
| 7 | **對應崗位** | `df_posTitle` | `positionTitle` | select | **是** | 綁定 Position |
| 8 | 崗位級別 | `df_posLevel` | `positionLevel` | select | 否 | - |
| 9 | 部門主管職稱 | `df_managerTitle` | `managerTitle` | text | 否 | - |
| 10 | 人數上限 | `df_headcountLimit`| `headcountLimit` | number | 否 | - |
| 11 | **生效日期** | `df_effectiveDate` | `effectiveDate` | date | **是** | - |
| 12 | 狀態 | `df_status` | `status` | select | 否 | Active/Inactive |
| **[策略職責]** | | | | | | |
| 13 | **核心職責** | `df_coreFunc` | `coreFunctions` | textarea | **是** | 重點欄位 (Top) |
| 14 | 部門使命 | `df_mission` | `mission` | textarea | 否 | - |
| 15 | 部門願景 | `df_vision` | `vision` | textarea | 否 | - |
| 16 | KPIs | `df_kpis` | `kpis` | textarea | 否 | - |
| 17 | 協作部門 | `df_collab` | `collaboration` | textarea | 否 | - |
| 18 | 備注 | `df_remark` | `remark` | textarea | 否 | - |
---
## 4. 崗位描述模組 (JobDescription Module)
**表單代號**: `jobDescForm`
**資料表**: `JobDescription`
> **UX 邏輯**:
> 1. Header: 快速鎖定「這是誰的JD」。
> 2. Readonly Area: 顯示「他在哪裡工作」(提供撰寫JD的上下文)。
> 3. Reporting: 釐清「上下級關係」。
> 4. Main Body: 撰寫「做什麼」(Purpose/Resp)。
> 5. Requirements: 撰寫「需要什麼條件」。
### 4.1 識別與上下文 (Header & Context)
| # | 欄位顯示名稱 | 標準化 HTML ID | 資料庫欄位名稱 | 類型 | 必填 | 備註 |
|---|---|---|---|---|---|---|
| **[員工綁定]** | | | | | | |
| 1 | 選擇員工(工號) | `jd_empNo` | `empNo` | text | 否 | 搜尋 Modal |
| 2 | 姓名 | `jd_empName` | `empName` | text | 否 | Readonly |
| 3 | 版本日期 | `jd_versionDate` | `versionDate` | date | 否 | - |
| **[崗位背景 (唯讀)]** | | | | | | |
| 4 | 崗位代碼 | `jd_posCode` | `positionCode` | text | 否 | 關聯鍵 |
| 5 | 崗位名稱 | `jd_posName` | `positionName` | text | 否 | Readonly |
| 6 | 所屬部門 | `jd_department` | `department` | text | 否 | Readonly (組合字串) |
| 7 | 任職地點 | `jd_location` | `workLocation` | select | 否 | - |
| 8 | 員工屬性 | `jd_empAttr` | `empAttribute` | select | 否 | FT/PT... |
| 9 | 部門職責引用 | `jd_dfCode` | `dfCode` | text | 否 | 關聯 DF 模組 |
### 4.2 匯報關係 (Reporting Lines)
| # | 欄位顯示名稱 | 標準化 HTML ID | 資料庫欄位名稱 | 類型 | 必填 | 備註 |
|---|---|---|---|---|---|---|
| 10 | **直接主管** | `jd_supervisor` | `directSupervisor` | text | 否 | 姓名/職稱 |
| 11 | **匯報對象** | `jd_reportTo` | `reportTo` | text | 否 | 系統職務節點 |
| 12 | 職等&職務 | `jd_gradeJob` | `positionGradeJob` | text | 否 | HR 用級別 |
| 13 | 直接下屬 | `jd_directReports` | `directReports` | text | 否 | 人數或職稱 |
### 4.3 職責詳情 (Responsibilities)
| # | 欄位顯示名稱 | 標準化 HTML ID | 資料庫欄位名稱 | 類型 | 必填 | 備註 |
|---|---|---|---|---|---|---|
| 14 | 崗位設置目的 | `jd_purpose` | `positionPurpose` | text | 否 | 一句話摘要 |
| 15 | **主要職責** | `jd_mainResp` | `mainResponsibilities`| textarea | 否 | 核心內容 (大區塊) |
### 4.4 任職資格 (Requirements)
| # | 欄位顯示名稱 | 標準化 HTML ID | 資料庫欄位名稱 | 類型 | 必填 | 備註 |
|---|---|---|---|---|---|---|
| 16 | 教育程度 | `jd_eduLevel` | `educationLevel` | text | 否 | - |
| 17 | 工作經驗 | `jd_expReq` | `experienceRequirements`| textarea | 否 | - |
| 18 | 專業知識 | `jd_proKnowledge` | `professionalKnowledge` | textarea | 否 | - |
| 19 | 基本技能 | `jd_basicSkills` | `basicSkills` | textarea | 否 | - |
| 20 | 其他要求 | `jd_otherReq` | `otherRequirements` | textarea | 否 | - |

315
docs/CORS_FIX_GUIDE.md Normal file
View File

@@ -0,0 +1,315 @@
# CORS 錯誤修正指南
## 🔴 問題說明
您遇到的錯誤有兩個:
### 1. CORS (跨域資源共享) 錯誤
```
Access to fetch at 'https://api.anthropic.com/v1/messages' from origin 'http://127.0.0.1:5000'
has been blocked by CORS policy: Response to preflight request doesn't pass access control check:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
```
**原因**: 前端代碼直接從瀏覽器調用 Claude API但 Claude API 不允許來自瀏覽器的直接請求(出於安全考量)。
### 2. Storage 訪問錯誤
```
Uncaught (in promise) Error: Access to storage is not allowed from this context.
```
**原因**: 瀏覽器的本地存儲權限問題,通常在使用 `file://` 協議或某些安全限制下出現。
---
## ✅ 解決方案
### 方案 1: 修改 index.html 中的 callClaudeAPI 函數(推薦)
**步驟 1**: 打開 [index.html](./index.html)
**步驟 2**: 找到第 1264 行的 `callClaudeAPI` 函數
**步驟 3**: 將整個函數替換為以下代碼:
```javascript
// ==================== AI Generation Functions ====================
async function callClaudeAPI(prompt, api = 'gemini') {
try {
// 調用後端 Flask API避免 CORS 錯誤
const response = await fetch("/api/llm/generate", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
api: api, // 使用指定的 LLM API (gemini, deepseek, openai)
prompt: prompt,
max_tokens: 2000
})
});
if (!response.ok) {
const errorData = await response.json();
throw new Error(errorData.error || `API 請求失敗: ${response.status}`);
}
const data = await response.json();
if (!data.success) {
throw new Error(data.error || 'API 調用失敗');
}
// 解析返回的文字為 JSON
let responseText = data.text;
responseText = responseText.replace(/```json\n?/g, "").replace(/```\n?/g, "").trim();
return JSON.parse(responseText);
} catch (error) {
console.error("Error calling LLM API:", error);
// 顯示友好的錯誤訊息
alert(`AI 生成錯誤: ${error.message}\n\n請確保\n1. Flask 後端已啟動\n2. 已在 .env 文件中配置 LLM API Key\n3. 網路連線正常`);
throw error;
}
}
```
**步驟 4**: 保存文件
**步驟 5**: 確保使用更新版的 Flask 後端
```bash
# 使用包含 LLM 端點的版本
python app_updated.py
```
**步驟 6**: 重新載入瀏覽器頁面
---
### 方案 2: 使用已修正的文件(快速方案)
我已經創建了包含完整修正的文件,您可以選擇以下方式之一:
#### 選項 A: 手動修改(最安全)
1. 打開 `index.html`
2. 搜尋 `async function callClaudeAPI(prompt)`
3. 用上面方案 1 的代碼替換
#### 選項 B: 使用腳本自動修正
參考 [fix_cors.js](./fix_cors.js) 文件中的完整說明。
---
## 📋 完整修正步驟
### 1. 確認後端已啟動並包含 LLM 端點
```bash
# 停止當前運行的 Flask如果有
# 按 Ctrl+C
# 啟動更新版後端
python app_updated.py
```
您應該看到:
```
✓ LLM 功能已啟用
已配置的 API: gemini, deepseek, openai
```
### 2. 配置 LLM API Key
編輯 [.env](./.env) 文件,添加至少一個 API Key
```env
# 至少配置其中一個
GEMINI_API_KEY=your_actual_gemini_api_key_here
DEEPSEEK_API_KEY=your_actual_deepseek_api_key_here
OPENAI_API_KEY=your_actual_openai_api_key_here
```
**獲取 API Key:**
- **Gemini**: https://makersuite.google.com/app/apikey
- **DeepSeek**: https://www.deepseek.com/
- **OpenAI**: https://platform.openai.com/api-keys
### 3. 測試 LLM API 連線
訪問測試頁面http://localhost:5000/api-test
點擊「測試連線」按鈕,確保至少一個 API 顯示「✓ 連線成功」。
### 4. 修改 index.html
按照方案 1 的步驟修改 `callClaudeAPI` 函數。
### 5. 重新載入頁面
在瀏覽器中按 `Ctrl+F5` 強制重新載入頁面(清除緩存)。
### 6. 測試 AI 功能
1. 在主頁面點擊「新增崗位」
2. 填寫部分欄位(例如崗位名稱)
3. 點擊「✨ I'm feeling lucky」按鈕
4. 應該會成功生成內容,不再出現 CORS 錯誤
---
## 🔍 驗證修正是否成功
打開瀏覽器的開發者工具F12切換到 Console 標籤:
### ✅ 成功的表現:
- 沒有 CORS 錯誤
- 看到 `POST http://localhost:5000/api/llm/generate` 請求成功 (200 OK)
- AI 自動填充正常工作
### ❌ 仍有問題:
#### 如果看到 `403 LLM 功能未啟用`
**原因**: 沒有使用 `app_updated.py`
**解決**:
```bash
python app_updated.py
```
#### 如果看到 `API Key 未設定`
**原因**: .env 文件中沒有配置 API Key
**解決**: 編輯 `.env` 文件,添加有效的 API Key
#### 如果看到 `連線逾時`
**原因**: 網路連線問題或 API 伺服器問題
**解決**:
1. 檢查網路連線
2. 嘗試使用不同的 LLM API修改 `callClaudeAPI(prompt, 'deepseek')`
#### 如果看到 `API Key 無效`
**原因**: API Key 錯誤或已過期
**解決**: 重新獲取有效的 API Key
---
## 🎯 架構變更說明
### 修正前(錯誤):
```
瀏覽器 → 直接調用 → Claude API (❌ CORS 錯誤)
```
### 修正後(正確):
```
瀏覽器 → Flask 後端 → Gemini/DeepSeek/OpenAI API (✅ 正常)
```
---
## 💡 為什麼這樣修改
### 1. 安全性
- **API Key 保護**: API Key 只存儲在服務器端(.env 文件),不暴露給前端
- **防止濫用**: 用戶無法看到或竊取 API Key
### 2. CORS 問題
- **同源請求**: 前端只調用同域的 Flask APIhttp://localhost:5000
- **服務器端請求**: Flask 服務器調用外部 API不受 CORS 限制
### 3. 靈活性
- **多 API 支持**: 可以輕鬆切換不同的 LLM API
- **統一接口**: 前端代碼無需關心使用哪個 LLM API
---
## 📝 其他建議
### 1. 添加錯誤處理 UI
`<head>` 標籤中添加錯誤處理腳本:
```html
<script src="error_handler.js"></script>
```
### 2. 選擇 LLM API
如果想使用特定的 LLM API可以修改調用
```javascript
// 使用 Gemini默認
const result = await callClaudeAPI(prompt, 'gemini');
// 使用 DeepSeek
const result = await callClaudeAPI(prompt, 'deepseek');
// 使用 OpenAI
const result = await callClaudeAPI(prompt, 'openai');
```
### 3. 添加 API 選擇器
可以在前端添加一個下拉選單,讓用戶選擇使用哪個 LLM API
```html
<select id="llm-selector">
<option value="gemini">Google Gemini</option>
<option value="deepseek">DeepSeek</option>
<option value="openai">OpenAI</option>
</select>
```
然後在調用時使用:
```javascript
const api = document.getElementById('llm-selector').value;
const result = await callClaudeAPI(prompt, api);
```
---
## 🆘 仍然遇到問題?
### 檢查清單
- [ ] Flask 後端是否正在運行?
- [ ] 是否使用 `app_updated.py` 而不是 `app.py`
- [ ] .env 文件中是否配置了至少一個 API Key
- [ ] API Key 是否有效?(可以在 http://localhost:5000/api-test 測試)
- [ ] 是否已修改 index.html 中的 `callClaudeAPI` 函數?
- [ ] 瀏覽器是否已重新載入頁面Ctrl+F5
- [ ] 瀏覽器控制台是否還有其他錯誤?
### 調試步驟
1. **測試後端 API**:
```bash
curl -X POST http://localhost:5000/api/llm/generate \
-H "Content-Type: application/json" \
-d '{"api":"gemini","prompt":"測試","max_tokens":100}'
```
2. **檢查 Flask 日誌**: 查看終端中 Flask 的輸出
3. **瀏覽器控制台**: 查看詳細的錯誤訊息
4. **測試頁面**: 訪問 http://localhost:5000/api-test 確認 API 配置
---
## 📚 相關文件
- [SETUP.md](./SETUP.md) - 完整安裝指南
- [fix_cors.js](./fix_cors.js) - 詳細修正代碼
- [error_handler.js](./error_handler.js) - 全局錯誤處理
- [app_updated.py](./app_updated.py) - 包含 LLM 端點的 Flask 後端
---
**文件版本**: 1.0
**最後更新**: 2024-12-04
**問題類型**: CORS 跨域請求錯誤
**解決狀態**: ✅ 已提供完整解決方案

247
docs/Check.md Normal file
View File

@@ -0,0 +1,247 @@
# HR Position Management System - 資安檢核報告
**專案名稱**: HR Position Management System
**檢核日期**: 2024-12-04
**版本**: v2.1
---
## 一、專案結構與依賴檢查
### 1. 入口檔案
- ✅ 有 `start_server.py` 作為主要入口檔案
- ✅ 有 `index.html` 作為前端入口
### 2. 專案結構
- ⚠️ 無明確的資料夾結構app、routes、static、templates 等)
- ❌ 所有檔案皆放在根目錄,缺乏模組化架構
- **建議**: 建立標準專案結構如 `/static``/templates``/routes``/config`
### 3. 依賴檔案
- ✅ 有 `requirements.txt`
- ❌ 無 `package.json`(前端無使用 Node.js 打包工具)
### 4. 使用框架
- ✅ 後端使用 **Flask** 框架
- ✅ 使用 **flask_cors** 處理跨域
- ✅ 使用 **python-dotenv** 讀取環境變數
### 5. README.md
- ✅ 有 `README.md` 檔案
- ✅ 包含安裝與啟動說明
- ✅ 包含 API 端點說明
### 6. 依賴套件安全性
- ⚠️ 未指定套件版本號碼,可能造成相容性問題
- **建議**: 在 requirements.txt 中指定明確版本號
### 7. 監聽位址與端口
- ⚠️ **start_server.py:286** - `app.run(host='0.0.0.0', port=5000, debug=True)`
-**host='0.0.0.0'** 會監聽所有網路介面,存在安全風險
-**debug=True** 在生產環境中不應開啟
- **建議**:
- 開發環境使用 `host='127.0.0.1'`
- 生產環境從環境變數讀取 host/port
- 移除或設定 `debug=False`
---
## 二、安全性與環境變數檢核
### 1. 環境變數檔案
- ✅ 存在 `.env` 檔案
- ❌ 無 `.env.example` 範本檔案供其他開發者參考
- **建議**: 建立 `.env.example`,內含變數名稱但無實際值
### 2. .gitignore 設定
- ✅ 有 `.gitignore` 檔案
- ✅ 排除 `.env`
- ✅ 排除 `__pycache__`
- ✅ 排除 `*.log`
- ✅ 排除 `node_modules`
- ✅ 排除備份檔案 `*.backup`
- ✅ 設定排除 `.gitignore` 本身
### 3. 資料庫連線設定
- ✅ 有 MySQL 資料庫設定DB_HOST、DB_PORT、DB_NAME、DB_USER、DB_PASSWORD
- ⚠️ 目前使用記憶體模擬資料庫,未實際連接 MySQL
### 4. 敏感資訊硬編碼檢查
-**嚴重問題** - `.env` 檔案中包含實際敏感資訊:
- `DB_PASSWORD=Bb123456` - 資料庫密碼
- `GITEA_PASSWORD=!QAZ2wsx` - Gitea 密碼
- `GITEA_TOKEN=9e0a888d1a25bde9cf2ad5dff2bb7ee6d68d6ff0` - Gitea Token
- `GEMINI_API_KEY=AIzaSy...` - Google API Key
-`SECRET_KEY=your_secret_key_here_change_in_production` - Flask 密鑰使用預設值
- **建議**:
1. 立即更換所有已洩露的密碼和 Token
2. 確保 `.env` 永不提交到版本控制
3. 使用環境變數或密鑰管理服務
### 5. SQL Injection / XSS 防護
- ⚠️ **SQL Injection**: 目前使用記憶體字典,未使用 ORM 或參數化查詢
- ⚠️ **XSS 防護**: 前端直接將 API 回傳資料插入 DOM存在潛在 XSS 風險
- **建議**:
1. 使用 SQLAlchemy ORM 進行資料庫操作
2. 前端使用 `textContent` 替代 `innerHTML`
3. 對使用者輸入進行驗證和消毒
### 6. 其他安全疑慮
-**CORS 設定過於寬鬆**: `CORS(app)` 允許所有來源
-**無身分驗證機制**: API 端點無需認證即可存取
-**無速率限制**: 未防範暴力攻擊或 DDoS
-**無 HTTPS**: 敏感資料可能以明文傳輸
-**無 CSRF 保護**: 表單未使用 CSRF Token
- **建議**:
1. 設定 CORS 允許的特定來源
2. 實作 JWT 或 Session 認證
3. 加入 rate limiting
4. 生產環境強制使用 HTTPS
5. 實作 CSRF 保護
---
## 三、程式品質與可維護性
### 1. 錯誤處理
-**start_server.py** 有 try/except 錯誤處理
- ✅ 有全域錯誤處理器 (`@app.errorhandler(404)`, `@app.errorhandler(500)`)
-**llm_config.py** 有完整的錯誤處理
- ⚠️ 前端錯誤處理可改進,部分情況直接使用 console.log
### 2. 程式碼品質
- ⚠️ 程式碼未遵循 PEP8 完整規範
- ⚠️ 缺少單元測試
- **建議**: 加入 pytest 單元測試
---
## 四、檢核結果總覽
| 類別 | 項目 | 狀態 |
|------|------|------|
| **專案結構** | 入口檔案 | ✅ |
| | 專案結構 | ⚠️ |
| | requirements.txt | ✅ |
| | 框架識別 | ✅ |
| | README.md | ✅ |
| | 依賴安全性 | ⚠️ |
| | 監聽位址 | ❌ |
| **安全性** | .env 檔案 | ✅ |
| | .gitignore | ✅ |
| | DB 連線設定 | ⚠️ |
| | 敏感資訊硬編碼 | ❌ |
| | SQL Injection 防護 | ⚠️ |
| | XSS 防護 | ⚠️ |
| | CORS 設定 | ❌ |
| | 身分驗證 | ❌ |
| | CSRF 保護 | ❌ |
| **程式品質** | 錯誤處理 | ✅ |
| | 程式碼品質 | ⚠️ |
---
## 五、評分
| 評分項目 | 滿分 | 得分 | 說明 |
|----------|------|------|------|
| 專案結構與依賴 | 20 | 14 | 缺乏模組化架構、監聽設定不安全 |
| 環境變數管理 | 15 | 10 | 有 .env 但包含實際敏感資訊 |
| .gitignore 設定 | 10 | 10 | 設定完整 |
| 資料庫安全 | 15 | 8 | 未使用 ORM、無參數化查詢 |
| API 安全性 | 20 | 5 | 無認證、CORS 過寬、無速率限制 |
| XSS/CSRF 防護 | 10 | 4 | 缺乏完整防護 |
| 錯誤處理 | 10 | 8 | 大致完整,前端可改進 |
### **總分: 59 / 100**
---
## 六、修改建議優先順序
### 🔴 高優先(立即處理)
1. **更換所有已洩露的憑證**
- 更換 DB_PASSWORD
- 更換 GITEA_PASSWORD 和 GITEA_TOKEN
- 重新產生 GEMINI_API_KEY
- 設定強度足夠的 SECRET_KEY
2. **修改伺服器監聽設定**
```python
# start_server.py
if __name__ == '__main__':
host = os.getenv('FLASK_HOST', '127.0.0.1')
port = int(os.getenv('FLASK_PORT', 5000))
debug = os.getenv('FLASK_DEBUG', 'false').lower() == 'true'
app.run(host=host, port=port, debug=debug)
```
3. **建立 .env.example**
```env
DB_HOST=your_db_host
DB_PORT=3306
DB_NAME=your_db_name
DB_USER=your_db_user
DB_PASSWORD=your_db_password
GEMINI_API_KEY=your_api_key
SECRET_KEY=generate_a_secure_random_key
```
### 🟡 中優先(儘快處理)
4. **限制 CORS 來源**
```python
CORS(app, origins=['http://localhost:5000', 'https://your-domain.com'])
```
5. **實作基本身分驗證**
- 使用 Flask-Login 或 JWT
- 保護敏感 API 端點
6. **使用 ORM 防止 SQL Injection**
```python
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)
```
### 🟢 低優先(計畫性改進)
7. **建立標準專案結構**
```
hr-position-system/
├── app/
│ ├── __init__.py
│ ├── routes/
│ ├── models/
│ └── utils/
├── static/
├── templates/
├── config.py
└── run.py
```
8. **加入單元測試**
9. **實作 CSRF 保護**
```python
from flask_wtf.csrf import CSRFProtect
csrf = CSRFProtect(app)
```
10. **加入速率限制**
```python
from flask_limiter import Limiter
limiter = Limiter(app, key_func=get_remote_address)
```
---
## 七、結論
此專案目前處於**開發階段**,具備基本功能但存在多項安全隱患。**最緊急的問題是敏感資訊外洩風險**,需立即處理。建議在部署到生產環境前,完成所有高優先和中優先的修改項目。
---
**檢核人員**: Claude Code
**檢核日期**: 2024-12-04

View File

@@ -0,0 +1,286 @@
# HTML ID 重命名對照表
## 變更概覽
- **總計需變更72 個**
- **無需變更13 個**
- **總欄位數85 個**
---
## 模組 1: 崗位基礎資料 - 基礎資料頁籤
**需變更15 / 15**
| 舊 ID | 新 ID | 欄位名稱 | 備註 |
|-------|-------|---------|------|
| `businessUnit` | `pos_businessUnit` | 事業體 (Business Unit) | |
| `division` | `pos_division` | 處級單位 (Division) | |
| `department` | `pos_department` | 部級單位 (Department) | |
| `section` | `pos_section` | 課級單位 (Section) | |
| `positionCode` | `pos_code` | 崗位編號 | 必填欄位 |
| `effectiveDate` | `pos_effectiveDate` | 生效日期 | |
| `positionName` | `pos_name` | 崗位名稱 | 必填欄位 |
| `positionLevel` | `pos_level` | 崗位級別 | |
| `positionCategory` | `pos_category` | 崗位類別 | onchange 事件 |
| `positionCategoryName` | `pos_categoryName` | 崗位類別名稱 | readonly |
| `positionNature` | `pos_type` | 崗位性質 | onchange 事件,注意:資料庫改為 positionType |
| `positionNatureName` | `pos_typeName` | 崗位性質名稱 | readonly資料庫改為 positionTypeName |
| `headcount` | `pos_headcount` | 編制人數 | |
| `positionDesc` | `pos_desc` | 崗位描述 | 資料庫改為 description |
| `positionRemark` | `pos_remark` | 崗位備注 | 資料庫改為 remark |
---
## 模組 2: 崗位基礎資料 - 招聘要求頁籤
**需變更18 / 18**
| 舊 ID | 新 ID | 欄位名稱 | 備註 |
|-------|-------|---------|------|
| `minEducation` | `rec_eduLevel` | 最低學歷 | 資料庫改為 educationLevel |
| `requiredGender` | `rec_gender` | 要求性別 | |
| `salaryRange` | `rec_salaryRange` | 薪酬范圍 | |
| `workExperience` | `rec_expYears` | 工作經驗 | 資料庫改為 experienceYears |
| `minAge` | `rec_minAge` | 最小年齡 | |
| `maxAge` | `rec_maxAge` | 最大年齡 | |
| `jobType` | `rec_jobType` | 工作性質 | |
| `recruitPosition` | `rec_position` | 招聘職位 | 資料庫改為 recruitPosition |
| `jobTitle` | `rec_jobTitle` | 職位名稱(對外) | |
| `superiorPosition` | `rec_superiorCode` | 上級崗位編號 | 資料庫改為 superiorPositionCode |
| `jobDesc` | `rec_jobDesc` | 職位描述(JD) | 資料庫改為 recruitJobDesc |
| `positionReq` | `rec_positionReq` | 崗位要求(Req) | 資料庫改為 recruitRequirements |
| `titleReq` | `rec_certReq` | 職稱要求 | 語義更正為「證照要求」,資料庫改為 certRequirements |
| `majorReq` | `rec_majorReq` | 專業要求 | 資料庫改為 majorRequirements |
| `skillReq` | `rec_skillReq` | 技能要求 | 資料庫改為 skillRequirements |
| `langReq` | `rec_langReq` | 語言要求 | 資料庫改為 langRequirements |
| `otherReq` | `rec_otherReq` | 其他要求 | 資料庫改為 otherRequirements |
| `recruitRemark` | `rec_remark` | 招聘備注 | 資料庫改為 recruitRemark |
---
## 模組 3: 職務基礎資料
**需變更12 / 12**
| 舊 ID | 新 ID | 欄位名稱 | 備註 |
|-------|-------|---------|------|
| `jobCategoryCode` | `job_category` | 職務類別編號 | 必填欄位onchange 事件 |
| `jobCategoryName` | `job_categoryName` | 職務類別名稱 | readonly |
| `jobCode` | `job_code` | 職務編號 | 必填欄位 |
| `jobName` | `job_name` | 職務名稱 | 必填欄位 |
| `jobNameEn` | `job_nameEn` | 職務英文 | |
| `jobEffectiveDate` | `job_effectiveDate` | 生效日期 | 資料庫改為 effectiveDate |
| `jobLevel` | `job_level` | 職務層級 | 敏感欄位 |
| `jobHeadcount` | `job_headcount` | 編制人數 | 資料庫改為 headcount |
| `jobSortOrder` | `job_sortOrder` | 排列順序 | 資料庫改為 sortOrder |
| `hasAttendanceBonus` | `job_hasAttBonus` | 全勤獎金 | Toggle Switch |
| `hasHousingAllowance` | `job_hasHouseAllow` | 住房補貼 | Toggle Switch |
| `jobRemark` | `job_remark` | 職務備注 | 資料庫改為 remark |
---
## 模組 4: 部門職責
**需變更19 / 19**
| 舊 ID | 新 ID | 欄位名稱 | 備註 |
|-------|-------|---------|------|
| `deptFunctionCode` | `df_code` | 部門職責編號 | 必填欄位,資料庫改為 dfCode |
| `deptFunctionName` | `df_name` | 部門職責名稱 | 必填欄位,資料庫改為 dfName |
| `deptFunctionBU` | `df_businessUnit` | 事業體 (第1個) | 必填欄位,已合併重複欄位 |
| `deptFunc_businessUnit` | `df_businessUnit` | 事業體 (第2個) | **合併為同一欄位** |
| `deptFunc_division` | `df_division` | 處級單位 | 必填欄位 |
| `deptFunc_department` | `df_department` | 部級單位 | 必填欄位 |
| `deptFunc_section` | `df_section` | 課級單位 | |
| `deptFunc_positionTitle` | `df_posTitle` | 崗位名稱 | 必填欄位,資料庫改為 positionTitle |
| `deptFunc_positionLevel` | `df_posLevel` | 崗位級別 | 資料庫保持 positionLevel |
| `deptManager` | `df_managerTitle` | 部門主管職稱 | 資料庫改為 managerTitle |
| `deptFunctionEffectiveDate` | `df_effectiveDate` | 生效日期 | 必填欄位,資料庫改為 effectiveDate |
| `deptHeadcount` | `df_headcountLimit` | 部門人數上限 | 資料庫改為 headcountLimit |
| `deptStatus` | `df_status` | 部門狀態 | 資料庫改為 status |
| `deptMission` | `df_mission` | 部門使命 | 資料庫改為 mission |
| `deptVision` | `df_vision` | 部門願景 | 資料庫改為 vision |
| `deptCoreFunctions` | `df_coreFunc` | 核心職責 | 必填欄位,資料庫改為 coreFunctions |
| `deptKPIs` | `df_kpis` | 關鍵績效指標 | 資料庫改為 kpis |
| `deptCollaboration` | `df_collab` | 協作部門 | 資料庫改為 collaboration |
| `deptFunctionRemark` | `df_remark` | 備注 | 資料庫改為 remark |
**特別注意:** 原本有兩個事業體欄位 (`deptFunctionBU``deptFunc_businessUnit`),新規範已合併為單一欄位 `df_businessUnit`
---
## 模組 5: 崗位描述 - 基本信息
**需變更3 / 4**
| 舊 ID | 新 ID | 欄位名稱 | 備註 |
|-------|-------|---------|------|
| `jd_empNo` | `jd_empNo` | 工號 | ✓ 無需變更 |
| `jd_empName` | `jd_empName` | 姓名 | ✓ 無需變更 |
| `jd_positionCode` | `jd_posCode` | 崗位代碼 | |
| `jd_versionDate` | `jd_versionDate` | 版本更新日期 | ✓ 無需變更 |
---
## 模組 6: 崗位描述 - 崗位基本信息
**需變更10 / 14**
| 舊 ID | 新 ID | 欄位名稱 | 備註 |
|-------|-------|---------|------|
| `jd_positionName` | `jd_posName` | 崗位名稱 | |
| `jd_businessUnit` | `jd_businessUnit` | 事業體 | ✓ 無需變更 |
| `jd_division` | `jd_division` | 處級單位 | ✓ 無需變更 |
| `jd_department` | `jd_department` | 部級單位 | ✓ 無需變更 |
| `jd_section` | `jd_section` | 課級單位 | ✓ 無需變更 |
| `jd_positionTitle` | `(刪除)` | 崗位名稱 (重複) | 與 positionName 重複,建議刪除 |
| `jd_positionLevel` | `jd_posLevel` | 崗位級別 | |
| `jd_positionEffectiveDate` | `jd_posEffDate` | 崗位生效日期 | |
| `jd_directSupervisor` | `jd_supervisor` | 直接領導職務 | |
| `jd_positionGradeJob` | `jd_gradeJob` | 崗位職等&職務 | Modal 選擇器 |
| `jd_reportTo` | `jd_reportTo` | 匯報對象職務 | ✓ 無需變更 |
| `jd_directReports` | `jd_directReports` | 直接下級 | ✓ 無需變更 |
| `jd_workLocation` | `jd_location` | 任職地點 | |
| `jd_empAttribute` | `jd_empAttr` | 員工屬性 | |
---
## 模組 7: 崗位描述 - 部門職責資訊
**需變更3 / 5**
| 舊 ID | 新 ID | 欄位名稱 | 備註 |
|-------|-------|---------|------|
| `jd_deptFunctionCode` | `jd_dfCode` | 部門職責編號 | readonly |
| `jd_deptFunctionBU` | `(保留)` | 事業體 | 建議保留或改為 jd_dfBU |
| `jd_deptMission` | `jd_deptMission` | 部門使命 | ✓ 無需變更 |
| `jd_deptCoreFunctions` | `jd_deptCoreFunctions` | 部門核心職責 | ✓ 無需變更 |
| `jd_deptKPIs` | `jd_deptKPIs` | 部門 KPIs | ✓ 無需變更 |
**說明:** 這些是 readonly 欄位,自動帶入,可保持現有命名以維持與來源資料的一致性。
---
## 模組 8: 崗位描述 - 職責描述
**需變更1 / 2**
| 舊 ID | 新 ID | 欄位名稱 | 備註 |
|-------|-------|---------|------|
| `jd_positionPurpose` | `jd_purpose` | 崗位設置目的 | |
| `jd_mainResponsibilities` | `jd_mainResp` | 主要崗位職責 | Numbered textarea |
---
## 模組 9: 崗位描述 - 崗位要求
**需變更5 / 5**
| 舊 ID | 新 ID | 欄位名稱 | 備註 |
|-------|-------|---------|------|
| `jd_education` | `jd_eduLevel` | 教育程度 | |
| `jd_basicSkills` | `jd_basicSkills` | 基本技能 | ✓ 無需變更 |
| `jd_professionalKnowledge` | `jd_proKnowledge` | 專業知識 | |
| `jd_workExperienceReq` | `jd_expReq` | 工作經驗 | |
| `jd_otherRequirements` | `jd_otherReq` | 其他 | |
---
## 重要變更說明
### 1. 前綴標準化
所有欄位統一採用模組前綴:
- `pos_` - 崗位基礎資料
- `rec_` - 招聘要求
- `job_` - 職務基礎資料
- `df_` - 部門職責
- `jd_` - 崗位描述
### 2. 命名簡化
- `positionCode``pos_code`
- `positionName``pos_name`
- `positionCategory``pos_category`
- `positionNature``pos_type` (語義更精確)
- `hasAttendanceBonus``job_hasAttBonus` (縮寫簡化)
### 3. 語義改善
- `titleReq``rec_certReq` (職稱要求 → 證照要求)
- `positionNature``pos_type` (性質 → 類型,更符合英文語義)
- `workExperience``rec_expYears` (經驗年數更明確)
### 4. 資料庫欄位同步變更
部分 HTML ID 變更時,資料庫欄位名稱也需要對應修改:
- `positionNature``positionType`
- `positionDesc``description`
- `positionRemark``remark`
- `minEducation``educationLevel`
### 5. 重複欄位合併
部門職責模組中的兩個事業體欄位:
- 原:`deptFunctionBU``deptFunc_businessUnit`
- 新:統一為 `df_businessUnit`
---
## 實施建議
### 階段 1: 資料庫遷移
1. 執行資料庫欄位重命名 SQL 腳本
2. 更新所有 ORM Model 定義
3. 更新 API 回應的欄位名稱
### 階段 2: 前端更新
1. 全局搜尋替換 HTML ID
2. 更新所有 JavaScript 選擇器
3. 更新 CSS 樣式選擇器
4. 更新表單驗證邏輯
### 階段 3: 測試驗證
1. 單元測試:驗證所有表單欄位綁定
2. 整合測試:驗證資料儲存與讀取
3. E2E 測試:完整流程測試
4. 回歸測試:確保無遺漏欄位
### 階段 4: 文檔更新
1. API 文檔更新
2. 資料字典更新
3. 開發指南更新
4. 使用者手冊更新(如有影響)
---
## 風險評估
### 高風險變更 (必填欄位)
- `positionCode``pos_code`
- `positionName``pos_name`
- `jobCode``job_code`
- `jobName``job_name`
- `deptFunctionCode``df_code`
**建議:** 優先測試這些欄位的儲存與驗證邏輯。
### 中風險變更 (聯動欄位)
- 組織結構欄位:`businessUnit`, `division`, `department`, `section`
- 自動帶出欄位:`positionCategoryName`, `positionNatureName`
**建議:** 仔細測試聯動邏輯和 onchange 事件。
### 低風險變更 (選填欄位)
- 備注類欄位
- 描述類欄位
---
## 檢查清單
- [ ] 資料庫遷移腳本已準備
- [ ] Model 定義已更新
- [ ] HTML 表單 ID 已更新
- [ ] JavaScript 選擇器已更新
- [ ] CSS 樣式已更新
- [ ] API 端點已更新
- [ ] 驗證邏輯已更新
- [ ] 單元測試已通過
- [ ] 整合測試已通過
- [ ] E2E 測試已通過
- [ ] 文檔已更新
- [ ] 程式碼審查已完成
---
**文檔版本:** v1.0
**建立日期:** 2025-12-06
**最後更新:** 2025-12-06
**維護者:** 系統開發團隊

1147
docs/SDD.md Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

438
docs/SETUP.md Normal file
View File

@@ -0,0 +1,438 @@
# HR 基礎資料維護系統 - 安裝與配置指南
## 📋 目錄
1. [系統需求](#系統需求)
2. [環境配置](#環境配置)
3. [資料庫設置](#資料庫設置)
4. [Gitea 版本控制設置](#gitea-版本控制設置)
5. [LLM API 配置](#llm-api-配置)
6. [啟動系統](#啟動系統)
7. [功能測試](#功能測試)
8. [常見問題](#常見問題)
---
## 系統需求
### 軟體需求
- **Python**: 3.8 或更高版本
- **MySQL**: 5.7 或更高版本
- **Git**: 2.0 或更高版本 (用於版本控制)
- **現代瀏覽器**: Chrome, Firefox, Edge (最新版本)
### 硬體需求
- **記憶體**: 最少 2GB RAM
- **硬碟**: 最少 500MB 可用空間
- **網路**: 穩定的網際網路連線 (用於 LLM API)
---
## 環境配置
### 1. 複製或下載項目
```bash
cd d:/00001_Vibe_coding/1204剛為
```
### 2. 創建虛擬環境 (建議)
```bash
# Windows
python -m venv venv
venv\Scripts\activate
# Linux/Mac
python3 -m venv venv
source venv/bin/activate
```
### 3. 安裝依賴套件
```bash
pip install -r requirements_full.txt
```
如果出現錯誤,可以嘗試逐個安裝:
```bash
pip install flask flask-cors pymysql python-dotenv requests gitpython
```
### 4. 配置環境變數
項目根目錄下已有 [.env](./.env) 文件,請根據實際情況修改:
```env
# MySQL Database Configuration
DB_HOST=mysql.theaken.com
DB_PORT=33306
DB_NAME=db_A102
DB_USER=A102
DB_PASSWORD=Bb123456
# Gitea Version Control Configuration
GITEA_URL=https://gitea.theaken.com/
GITEA_USER=donald
GITEA_PASSWORD=!QAZ2wsx
GITEA_TOKEN=9e0a888d1a25bde9cf2ad5dff2bb7ee6d68d6ff0
# LLM API Keys (需要自行申請並填寫)
GEMINI_API_KEY=your_gemini_api_key_here
DEEPSEEK_API_KEY=your_deepseek_api_key_here
OPENAI_API_KEY=your_openai_api_key_here
```
⚠️ **重要**: `.env` 文件包含敏感資訊,已加入 `.gitignore`,請勿上傳到版本控制系統。
---
## 資料庫設置
### 1. 測試資料庫連線
```bash
python init_database.py
```
此腳本會:
- 測試資料庫連線
- 創建 `hr_position_system` 資料庫架構
- 建立所有必要的資料表
- 插入參照資料
### 2. 驗證資料表
成功執行後,應該會看到以下資料表:
- `positions` - 崗位基礎資料表
- `jobs` - 職務基礎資料表
- `job_descriptions` - 崗位描述表
- `reference_codes` - 參照資料代碼表
- `audit_logs` - 審計日誌表
### 3. 手動執行 SQL (可選)
如果自動腳本失敗,可以手動執行:
```bash
# 使用 MySQL 客戶端
mysql -h mysql.theaken.com -P 33306 -u A102 -p db_A102 < database_schema.sql
```
---
## Gitea 版本控制設置
### 1. 測試 Gitea 連線
```bash
python init_gitea.py
```
此腳本會:
- 測試 Gitea 伺服器連線
- 創建新的 Git 倉庫 (如果不存在)
- 配置本地 Git remote
- 創建初始提交
### 2. 推送到 Gitea
```bash
git push -u origin main
```
### 3. 訪問 Gitea 倉庫
在瀏覽器中訪問: [https://gitea.theaken.com/donald/hr-position-system](https://gitea.theaken.com/donald/hr-position-system)
---
## LLM API 配置
系統支援三種 LLM API:
### 1. Google Gemini
1. 訪問 [Google AI Studio](https://makersuite.google.com/app/apikey)
2. 創建 API Key
3. 將 API Key 填入 `.env` 文件的 `GEMINI_API_KEY`
### 2. DeepSeek
1. 訪問 [DeepSeek 官網](https://www.deepseek.com/)
2. 註冊並獲取 API Key
3. 將 API Key 填入 `.env` 文件的 `DEEPSEEK_API_KEY`
### 3. OpenAI
1. 訪問 [OpenAI Platform](https://platform.openai.com/api-keys)
2. 創建 API Key
3. 將 API Key 填入 `.env` 文件的 `OPENAI_API_KEY`
### 4. 測試 LLM API
```bash
python llm_config.py
```
此腳本會測試所有已配置的 API 連線狀態。
---
## 啟動系統
### 方法 1: 使用更新版的 app (包含 LLM 功能)
```bash
# 備份原有的 app.py
mv app.py app_original.py
# 使用新版 app
mv app_updated.py app.py
# 啟動系統
python app.py
```
### 方法 2: 直接使用更新版
```bash
python app_updated.py
```
### 啟動成功
您應該會看到類似以下的輸出:
```
╔══════════════════════════════════════════════════════════════╗
║ HR 基礎資料維護系統 - Flask Backend ║
╠══════════════════════════════════════════════════════════════╣
║ 伺服器啟動中... ║
║ 訪問網址: http://localhost:5000 ║
...
╚══════════════════════════════════════════════════════════════╝
✓ LLM 功能已啟用
已配置的 API: gemini, deepseek, openai
```
---
## 功能測試
### 1. 訪問主頁面
在瀏覽器中打開: [http://localhost:5000](http://localhost:5000)
### 2. 測試 LLM API 連線
訪問 API 測試頁面: [http://localhost:5000/api-test](http://localhost:5000/api-test)
在此頁面可以:
- 查看所有 LLM API 配置狀態
- 單獨測試每個 API 連線
- 一次測試所有 API
### 3. 測試 REST API
使用 Postman 或 curl 測試 API:
```bash
# 獲取崗位列表
curl http://localhost:5000/api/positions
# 獲取職務列表
curl http://localhost:5000/api/jobs
# 測試 LLM API 配置
curl http://localhost:5000/api/llm/config
# 測試 Gemini API
curl http://localhost:5000/api/llm/test/gemini
```
### 4. 測試崗位資料 CRUD
1. **新增崗位**: 點擊「新增崗位」按鈕
2. **填寫表單**: 輸入崗位基本資料
3. **AI 自動填充**: 點擊「✨ I'm feeling lucky」按鈕
4. **保存資料**: 點擊「保存並退出」
### 5. 測試錯誤處理
系統已集成全局錯誤處理:
- 所有 API 錯誤會自動顯示錯誤對話框
- 網路錯誤會有友好的提示訊息
- 可以在瀏覽器控制台查看詳細錯誤信息
---
## 常見問題
### Q1: 資料庫連線失敗
**問題**: 執行 `init_database.py` 時出現連線錯誤
**解決方案**:
1. 檢查 `.env` 文件中的資料庫配置是否正確
2. 確認資料庫伺服器是否可訪問:
```bash
ping mysql.theaken.com
```
3. 檢查防火牆是否阻擋了 33306 端口
4. 確認資料庫用戶名和密碼正確
### Q2: Gitea 推送失敗
**問題**: `git push` 時要求輸入密碼
**解決方案**:
1. 使用 Token 進行認證:
```bash
git remote set-url origin https://donald:9e0a888d1a25bde9cf2ad5dff2bb7ee6d68d6ff0@gitea.theaken.com/donald/hr-position-system.git
```
2. 或配置 Git credential helper
### Q3: LLM API 測試失敗
**問題**: LLM API 連線測試顯示失敗
**解決方案**:
1. 檢查 API Key 是否正確填寫在 `.env` 文件中
2. 確認 API Key 是否有效 (未過期)
3. 檢查網路連線是否正常
4. 查看是否有 API 配額限制
### Q4: 端口被占用
**問題**: 啟動 Flask 時提示 `Address already in use`
**解決方案**:
1. 更改端口:
```python
app.run(host='0.0.0.0', port=5001, debug=True)
```
2. 或關閉占用 5000 端口的進程:
```bash
# Windows
netstat -ano | findstr :5000
taskkill /PID <PID> /F
# Linux/Mac
lsof -i :5000
kill -9 <PID>
```
### Q5: 前端頁面無法訪問
**問題**: 瀏覽器顯示 404 Not Found
**解決方案**:
1. 確認 Flask 已正確啟動
2. 檢查 `index.html` 是否存在於項目根目錄
3. 清除瀏覽器緩存並重新載入
### Q6: LLM 功能未啟用
**問題**: 系統提示「LLM 功能未啟用」
**解決方案**:
1. 確認 `llm_config.py` 文件存在
2. 確認已安裝 `requests` 套件:
```bash
pip install requests
```
3. 使用 `app_updated.py` 而非原始的 `app.py`
---
## 系統架構
```
┌─────────────────────────────────────────┐
│ 使用者瀏覽器 │
│ ┌───────────────────────────────────┐ │
│ │ index.html (主應用) │ │
│ │ api_test.html (API測試頁) │ │
│ │ error_handler.js (錯誤處理) │ │
│ └───────────────────────────────────┘ │
└─────────────────────────────────────────┘
┌─────────────────────────────────────────┐
│ Flask Backend (app.py) │
│ ┌───────────────────────────────────┐ │
│ │ 崗位資料 API │ │
│ │ 職務資料 API │ │
│ │ 參照資料 API │ │
│ │ LLM API (llm_config.py) │ │
│ └───────────────────────────────────┘ │
└─────────────────────────────────────────┘
┌─────┴─────┐
▼ ▼
┌──────────┐ ┌──────────┐
│ MySQL │ │ LLM APIs │
│ Database │ │ (Gemini, │
│ │ │ DeepSeek,│
│ │ │ OpenAI) │
└──────────┘ └──────────┘
```
---
## 檔案說明
| 檔案 | 說明 |
|------|------|
| `.env` | 環境變數配置 |
| `.gitignore` | Git 忽略檔案配置 |
| `database_schema.sql` | MySQL 資料庫架構 |
| `init_database.py` | 資料庫初始化腳本 |
| `init_gitea.py` | Gitea 倉庫初始化腳本 |
| `llm_config.py` | LLM API 配置模組 |
| `app.py` | Flask 後端主程式 (原始版) |
| `app_updated.py` | Flask 後端主程式 (包含 LLM) |
| `error_handler.js` | 全局錯誤處理模組 |
| `api_test.html` | LLM API 測試頁面 |
| `index.html` | 主應用頁面 |
| `requirements_full.txt` | Python 依賴套件列表 |
| `SDD.md` | 軟體設計文件 |
| `SETUP.md` | 本安裝指南 |
---
## 技術支援
如遇到問題,請:
1. 查看瀏覽器控制台的錯誤訊息
2. 檢查 Flask 終端的錯誤日誌
3. 參考本文檔的[常見問題](#常見問題)章節
4. 查看系統設計文件 `SDD.md`
---
## 更新日誌
### Version 1.0 (2024-12-03)
- ✅ 初始版本發布
- ✅ 資料庫架構設計與初始化
- ✅ Gitea 版本控制整合
- ✅ LLM API 整合 (Gemini, DeepSeek, OpenAI)
- ✅ 全局錯誤處理機制
- ✅ API 測試頁面
- ✅ 環境配置自動化
---
**文件版本**: 1.0
**最後更新**: 2024-12-03
**維護者**: HR System Development Team

496
docs/TDD.md Normal file
View File

@@ -0,0 +1,496 @@
# HR 基礎資料維護系統 - 測試設計文件 (TDD)
**文件版本**1.1
**建立日期**2024-12-06
**最後更新**2025-12-08
**文件狀態**Draft
---
## 1. 文件概述
### 1.1 目的
本文件為 HR 基礎資料維護系統之測試設計文件 (Test Design Document),描述測試策略、測試範圍、測試案例設計與驗收標準,供測試人員與開發人員參考。
### 1.2 範圍
本測試涵蓋以下功能模組:
| 模組 | 測試重點 |
|------|----------|
| 崗位基礎資料 | CRUD 操作、欄位驗證、資料聯動 |
| 職務基礎資料 | CRUD 操作、類別關聯、Toggle 控件 |
| 部門職責 | CRUD 操作、組織層級聯動 |
| 崗位描述 | CRUD 操作、版本控制 |
| AI 幫我想 | LLM 呼叫、JSON 解析、Prompt 編輯、結果填入 |
| 崗位清單 | 列表顯示、搜尋過濾、資料匯出 |
| 組織階層 | 事業體/處級/部級單位、級聯選擇、API 查詢 |
| CSV 匯入匯出 | 批次匯入、範本下載、資料驗證 |
### 1.3 參考文件
- 軟體設計文件 (SDD.md)
- API 設計規範
- 需求確認文件
---
## 2. 測試策略
### 2.1 測試層次
```
┌─────────────────────────────────────────────────────────┐
│ E2E 測試 (End-to-End) │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 整合測試 (Integration) │ │
│ │ ┌─────────────────────────────────────────┐ │ │
│ │ │ 單元測試 (Unit) │ │ │
│ │ │ ┌─────────────────────────────────┐ │ │ │
│ │ │ │ 函數 / API / 元件 │ │ │ │
│ │ │ └─────────────────────────────────┘ │ │ │
│ │ └─────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
```
### 2.2 測試類型
| 類型 | 說明 | 工具 |
|------|------|------|
| 單元測試 | 測試單一函數或模組 | Jest / pytest |
| 整合測試 | 測試模組間互動 | pytest |
| API 測試 | 測試 RESTful API | Postman / pytest |
| UI 測試 | 測試使用者介面 | 手動測試 / Selenium |
| 效能測試 | 測試系統效能 | Apache JMeter |
### 2.3 測試環境
| 環境 | 配置 |
|------|------|
| 前端 | Chrome/Firefox/Edge 最新版 |
| 後端 | Python 3.9+, Flask 2.0+ |
| LLM | Ollama localhost:11434 |
| 資料庫 | In-Memory (測試環境) |
---
## 3. 功能測試案例
### 3.1 崗位基礎資料模組
#### 3.1.1 新增崗位
| TC-ID | TC-POS-001 |
|-------|------------|
| 測試名稱 | 新增崗位 - 正常流程 |
| 前置條件 | 系統已啟動,用戶在崗位基礎資料頁面 |
| 測試步驟 | 1. 輸入崗位編號 "ENG-001"<br>2. 輸入崗位名稱 "資深軟體工程師"<br>3. 選擇崗位類別 "技術職"<br>4. 點擊「保存」按鈕 |
| 預期結果 | 顯示「保存成功」Toast資料寫入成功 |
| 實際結果 | |
| 通過/失敗 | |
| TC-ID | TC-POS-002 |
|-------|------------|
| 測試名稱 | 新增崗位 - 必填欄位驗證 |
| 前置條件 | 系統已啟動,用戶在崗位基礎資料頁面 |
| 測試步驟 | 1. 不輸入崗位編號<br>2. 不輸入崗位名稱<br>3. 點擊「保存」按鈕 |
| 預期結果 | 顯示錯誤訊息「請填寫必填欄位」 |
| 實際結果 | |
| 通過/失敗 | |
| TC-ID | TC-POS-003 |
|-------|------------|
| 測試名稱 | 新增崗位 - 編號重複檢查 |
| 前置條件 | 已存在編號 "ENG-001" 的崗位 |
| 測試步驟 | 1. 輸入崗位編號 "ENG-001"<br>2. 輸入其他欄位<br>3. 點擊「保存」按鈕 |
| 預期結果 | 顯示錯誤訊息「崗位編號已存在」 |
| 實際結果 | |
| 通過/失敗 | |
#### 3.1.2 編輯崗位
| TC-ID | TC-POS-004 |
|-------|------------|
| 測試名稱 | 編輯崗位 - 正常流程 |
| 前置條件 | 已存在崗位 "ENG-001" |
| 測試步驟 | 1. 瀏覽至崗位 "ENG-001"<br>2. 修改崗位名稱為 "高級軟體工程師"<br>3. 點擊「保存」按鈕 |
| 預期結果 | 顯示「更新成功」Toast資料已更新 |
| 實際結果 | |
| 通過/失敗 | |
#### 3.1.3 刪除崗位
| TC-ID | TC-POS-005 |
|-------|------------|
| 測試名稱 | 刪除崗位 - 正常流程 |
| 前置條件 | 已存在崗位 "ENG-001" |
| 測試步驟 | 1. 瀏覽至崗位 "ENG-001"<br>2. 點擊「刪除」按鈕<br>3. 確認刪除 |
| 預期結果 | 顯示「刪除成功」Toast資料已移除 |
| 實際結果 | |
| 通過/失敗 | |
### 3.2 職務基礎資料模組
| TC-ID | TC-JOB-001 |
|-------|------------|
| 測試名稱 | 新增職務 - 正常流程 |
| 前置條件 | 系統已啟動,用戶在職務基礎資料頁面 |
| 測試步驟 | 1. 選擇職務類別 "技術職"<br>2. 輸入職務編號 "TECH-001"<br>3. 輸入職務名稱 "軟體工程師"<br>4. 點擊「保存」按鈕 |
| 預期結果 | 顯示「保存成功」Toast |
| 實際結果 | |
| 通過/失敗 | |
| TC-ID | TC-JOB-002 |
|-------|------------|
| 測試名稱 | Toggle 開關功能 |
| 前置條件 | 系統已啟動,用戶在職務基礎資料頁面 |
| 測試步驟 | 1. 開啟「是否有全勤獎金」Toggle<br>2. 開啟「是否住房補貼」Toggle<br>3. 保存資料 |
| 預期結果 | Toggle 狀態正確保存,重新載入後狀態一致 |
| 實際結果 | |
| 通過/失敗 | |
### 3.3 部門職責模組
| TC-ID | TC-DF-001 |
|-------|------------|
| 測試名稱 | 新增部門職責 - 正常流程 |
| 前置條件 | 系統已啟動,用戶在部門職責頁面 |
| 測試步驟 | 1. 輸入職責編號 "DF-001"<br>2. 輸入職責名稱 "研發部門職責"<br>3. 選擇事業體、處級單位、部級單位<br>4. 輸入核心職責<br>5. 點擊「保存」按鈕 |
| 預期結果 | 顯示「保存成功」Toast |
| 實際結果 | |
| 通過/失敗 | |
| TC-ID | TC-DF-002 |
|-------|------------|
| 測試名稱 | 組織層級聯動 |
| 前置條件 | 系統已啟動 |
| 測試步驟 | 1. 選擇事業體 "SBU"<br>2. 觀察處級單位選項變化<br>3. 選擇處級單位<br>4. 觀察部級單位選項變化 |
| 預期結果 | 各層級選項正確聯動,無無效選項 |
| 實際結果 | |
| 通過/失敗 | |
### 3.4 AI 幫我想功能
> **說明**v1.1 版本將三個錦囊按鈕整合為單一「AI 幫我想」按鈕,並提供可編輯的 Prompt 編輯器。
| TC-ID | TC-AI-001 |
|-------|------------|
| 測試名稱 | AI 幫我想 - 正常流程 |
| 前置條件 | Ollama 服務已啟動,用戶在崗位基礎資料頁面 |
| 測試步驟 | 1. 查看預設 Prompt 內容<br>2. 點擊「AI 幫我想」按鈕<br>3. 等待 AI 生成完成 |
| 預期結果 | AI 生成資料並填充至表單空白欄位顯示「AI 生成完成已填入表單」Toast |
| 實際結果 | |
| 通過/失敗 | |
| TC-ID | TC-AI-002 |
|-------|------------|
| 測試名稱 | Prompt 編輯功能 |
| 前置條件 | 系統已啟動 |
| 測試步驟 | 1. 在 Prompt 編輯器修改內容<br>2. 點擊「AI 幫我想」按鈕<br>3. 重新整理頁面<br>4. 檢查 Prompt 是否保留 |
| 預期結果 | 修改的 Prompt 保存至 LocalStorage重新整理後恢復 |
| 實際結果 | |
| 通過/失敗 | |
| TC-ID | TC-AI-003 |
|-------|------------|
| 測試名稱 | Prompt 重置功能 |
| 前置條件 | 已修改 Prompt 內容 |
| 測試步驟 | 1. 修改 Prompt 內容<br>2. 點擊重置按鈕(↺ 圖示) |
| 預期結果 | Prompt 恢復為預設值,顯示「已重置為預設 Prompt」Toast |
| 實際結果 | |
| 通過/失敗 | |
| TC-ID | TC-AI-004 |
|-------|------------|
| 測試名稱 | 各模組 AI 功能 |
| 前置條件 | Ollama 服務已啟動 |
| 測試步驟 | 分別在以下模組測試 AI 功能:<br>1. 崗位基礎資料 (positionBasic)<br>2. 招聘要求 (positionRecruit)<br>3. 職務基礎資料 (jobBasic)<br>4. 部門職責 (deptFunction)<br>5. 崗位描述 (jobDesc) |
| 預期結果 | 各模組 AI 均能正常生成對應欄位資料 |
| 實際結果 | |
| 通過/失敗 | |
| TC-ID | TC-AI-005 |
|-------|------------|
| 測試名稱 | JSON 解析錯誤處理 |
| 前置條件 | LLM 返回非標準 JSON 格式(含思考過程) |
| 測試步驟 | 使用 deepseek-reasoner 等推理模型,觀察 JSON 解析 |
| 預期結果 | 系統正確從回應中提取 JSON 物件,忽略思考過程文字 |
| 實際結果 | |
| 通過/失敗 | |
| TC-ID | TC-AI-006 |
|-------|------------|
| 測試名稱 | 按鈕載入狀態 |
| 前置條件 | 系統已啟動 |
| 測試步驟 | 1. 點擊「AI 幫我想」按鈕<br>2. 觀察按鈕狀態變化 |
| 預期結果 | 按鈕顯示 spinner 和「AI 生成中...」文字,完成後恢復原狀 |
| 實際結果 | |
| 通過/失敗 | |
| TC-ID | TC-AI-007 |
|-------|------------|
| 測試名稱 | 空白 Prompt 防護 |
| 前置條件 | 系統已啟動 |
| 測試步驟 | 1. 清空 Prompt 編輯器<br>2. 點擊「AI 幫我想」按鈕 |
| 預期結果 | 顯示錯誤訊息「請輸入 Prompt 指令」 |
| 實際結果 | |
| 通過/失敗 | |
### 3.5 CSV 匯入匯出
| TC-ID | TC-CSV-001 |
|-------|------------|
| 測試名稱 | 下載 CSV 範本 |
| 前置條件 | 系統已啟動 |
| 測試步驟 | 1. 點擊「下載崗位 CSV 範本」按鈕 |
| 預期結果 | 瀏覽器下載 CSV 檔案,格式正確 |
| 實際結果 | |
| 通過/失敗 | |
| TC-ID | TC-CSV-002 |
|-------|------------|
| 測試名稱 | 匯入崗位 CSV |
| 前置條件 | 已準備符合格式的 CSV 檔案 |
| 測試步驟 | 1. 點擊「匯入崗位」按鈕<br>2. 選擇 CSV 檔案<br>3. 確認匯入 |
| 預期結果 | 顯示匯入結果,資料正確寫入 |
| 實際結果 | |
| 通過/失敗 | |
| TC-ID | TC-CSV-003 |
|-------|------------|
| 測試名稱 | 匯入 CSV - 格式錯誤 |
| 前置條件 | CSV 檔案格式不正確 |
| 測試步驟 | 1. 選擇格式錯誤的 CSV 檔案<br>2. 嘗試匯入 |
| 預期結果 | 顯示錯誤訊息,說明格式問題 |
| 實際結果 | |
| 通過/失敗 | |
### 3.6 組織階層模組
| TC-ID | TC-ORG-001 |
|-------|------------|
| 測試名稱 | 事業體列表載入 |
| 前置條件 | 組織階層資料已匯入 |
| 測試步驟 | 1. 開啟部門職責頁面<br>2. 查看事業體下拉選單 |
| 預期結果 | 顯示所有事業體選項SBU, PBU, NBU 等) |
| 實際結果 | |
| 通過/失敗 | |
| TC-ID | TC-ORG-002 |
|-------|------------|
| 測試名稱 | 處級單位級聯選擇 |
| 前置條件 | 組織階層資料已匯入 |
| 測試步驟 | 1. 選擇事業體 "SBU"<br>2. 觀察處級單位選項 |
| 預期結果 | 處級單位僅顯示屬於 SBU 的選項 |
| 實際結果 | |
| 通過/失敗 | |
| TC-ID | TC-ORG-003 |
|-------|------------|
| 測試名稱 | 部級單位級聯選擇 |
| 前置條件 | 已選擇事業體和處級單位 |
| 測試步驟 | 1. 選擇處級單位<br>2. 觀察部級單位選項 |
| 預期結果 | 部級單位僅顯示屬於該處級單位的選項 |
| 實際結果 | |
| 通過/失敗 | |
| TC-ID | TC-ORG-004 |
|-------|------------|
| 測試名稱 | 崗位名稱級聯選擇 |
| 前置條件 | 已選擇部級單位 |
| 測試步驟 | 1. 選擇部級單位<br>2. 觀察崗位名稱選項 |
| 預期結果 | 崗位名稱僅顯示屬於該部級單位的選項 |
| 實際結果 | |
| 通過/失敗 | |
---
## 4. API 測試案例
### 4.1 崗位 API
| TC-ID | 端點 | 方法 | 測試說明 | 預期狀態碼 |
|-------|------|------|----------|------------|
| TC-API-001 | /api/positions | GET | 查詢所有崗位 | 200 |
| TC-API-002 | /api/positions | POST | 新增崗位(正常) | 201 |
| TC-API-003 | /api/positions | POST | 新增崗位(缺少必填) | 400 |
| TC-API-004 | /api/positions/{id} | GET | 查詢單一崗位 | 200 |
| TC-API-005 | /api/positions/{id} | GET | 查詢不存在崗位 | 404 |
| TC-API-006 | /api/positions/{id} | PUT | 更新崗位 | 200 |
| TC-API-007 | /api/positions/{id} | DELETE | 刪除崗位 | 200 |
### 4.2 職務 API
| TC-ID | 端點 | 方法 | 測試說明 | 預期狀態碼 |
|-------|------|------|----------|------------|
| TC-API-011 | /api/jobs | GET | 查詢所有職務 | 200 |
| TC-API-012 | /api/jobs | POST | 新增職務(正常) | 201 |
| TC-API-013 | /api/jobs/{id} | PUT | 更新職務 | 200 |
| TC-API-014 | /api/jobs/{id} | DELETE | 刪除職務 | 200 |
### 4.3 LLM API
| TC-ID | 端點 | 方法 | 測試說明 | 預期狀態碼 |
|-------|------|------|----------|------------|
| TC-API-021 | /api/llm/generate | POST | LLM 生成Ollama | 200 |
| TC-API-022 | /api/llm/generate | POST | LLM 生成(無效 API | 400 |
| TC-API-023 | /api/llm/generate | POST | LLM 服務不可用 | 500 |
### 4.4 組織階層 API
| TC-ID | 端點 | 方法 | 測試說明 | 預期狀態碼 |
|-------|------|------|----------|------------|
| TC-API-031 | /api/hierarchy/business-units | GET | 查詢所有事業體 | 200 |
| TC-API-032 | /api/hierarchy/divisions | GET | 查詢所有處級單位 | 200 |
| TC-API-033 | /api/hierarchy/divisions?business=SBU | GET | 按事業體篩選處級單位 | 200 |
| TC-API-034 | /api/hierarchy/departments | GET | 查詢所有部級單位 | 200 |
| TC-API-035 | /api/hierarchy/departments?division=技術處 | GET | 按處級篩選部級單位 | 200 |
| TC-API-036 | /api/hierarchy/positions | GET | 查詢所有崗位名稱 | 200 |
| TC-API-037 | /api/hierarchy/positions?department=研發部 | GET | 按部級篩選崗位 | 200 |
| TC-API-038 | /api/hierarchy/full | GET | 查詢完整階層資料 | 200 |
| TC-API-039 | /api/hierarchy/full?page=1&size=50 | GET | 分頁查詢階層資料 | 200 |
| TC-API-040 | /api/hierarchy/cascade | GET | 查詢級聯選擇資料 | 200 |
| TC-API-041 | /api/hierarchy/stats | GET | 查詢組織統計 | 200 |
---
## 5. UI 測試案例
### 5.1 表單互動
| TC-ID | TC-UI-001 |
|-------|------------|
| 測試名稱 | 頁籤切換 |
| 測試步驟 | 1. 點擊「招聘要求資料」頁籤<br>2. 點擊「基礎資料」頁籤 |
| 預期結果 | 頁籤內容正確切換,動畫流暢 |
| TC-ID | TC-UI-002 |
|-------|------------|
| 測試名稱 | 類別聯動顯示 |
| 測試步驟 | 1. 選擇崗位類別 "01"<br>2. 觀察崗位類別名稱欄位 |
| 預期結果 | 自動顯示「技術職」 |
| TC-ID | TC-UI-003 |
|-------|------------|
| 測試名稱 | Toast 通知顯示 |
| 測試步驟 | 1. 執行保存操作 |
| 預期結果 | 右上角顯示 Toast 通知3秒後自動消失 |
### 5.2 響應式設計
| TC-ID | TC-UI-010 |
|-------|------------|
| 測試名稱 | 手機版佈局 |
| 測試步驟 | 將瀏覽器寬度調整為 375px |
| 預期結果 | 表單變為單欄佈局,按鈕仍可操作 |
| TC-ID | TC-UI-011 |
|-------|------------|
| 測試名稱 | 平板版佈局 |
| 測試步驟 | 將瀏覽器寬度調整為 768px |
| 預期結果 | 佈局適當調整,無元素重疊 |
---
## 6. 效能測試
### 6.1 載入效能
| 測試項目 | 目標值 | 測試方法 |
|----------|--------|----------|
| 首次載入時間 | < 3秒 | Chrome DevTools |
| API 回應時間 | < 500ms | Postman |
| LLM 生成時間 | < 30秒 | 實際測試 |
### 6.2 並發測試
| 測試項目 | 目標值 |
|----------|--------|
| 同時連線數 | 50+ |
| API 請求/ | 100+ |
---
## 7. 安全測試
### 7.1 輸入驗證
| TC-ID | TC-SEC-001 |
|-------|------------|
| 測試名稱 | XSS 防護 |
| 測試步驟 | 在輸入框輸入 `<script>alert('XSS')</script>` |
| 預期結果 | 腳本不執行內容被轉義或過濾 |
| TC-ID | TC-SEC-002 |
|-------|------------|
| 測試名稱 | SQL Injection 防護 |
| 測試步驟 | 在輸入框輸入 `'; DROP TABLE positions; --` |
| 預期結果 | SQL 不執行顯示錯誤或過濾 |
### 7.2 API 安全
| TC-ID | TC-SEC-010 |
|-------|------------|
| 測試名稱 | CORS 設定 |
| 測試步驟 | 從不同來源發送 API 請求 |
| 預期結果 | 僅允許白名單來源 |
---
## 8. 測試報告模板
### 8.1 測試摘要
| 項目 | 數值 |
|------|------|
| 總測試案例數 | |
| 通過數 | |
| 失敗數 | |
| 通過率 | |
| 測試日期 | |
| 測試人員 | |
### 8.2 缺陷追蹤
| 缺陷ID | 嚴重度 | 標題 | 狀態 | 負責人 |
|--------|--------|------|------|--------|
| | | | | |
---
## 9. 驗收標準
### 9.1 功能驗收
- [ ] 所有 CRUD 操作正常運作
- [ ] 三個錦囊 AI 功能可正常生成內容
- [ ] CSV 匯入匯出功能完整
- [ ] 所有必填欄位驗證正確
- [ ] 組織層級聯動正確
### 9.2 效能驗收
- [ ] 頁面載入時間 < 3秒
- [ ] API 回應時間 < 500ms
- [ ] 無明顯 UI 卡頓
### 9.3 相容性驗收
- [ ] Chrome 最新版正常
- [ ] Firefox 最新版正常
- [ ] Edge 最新版正常
---
## 10. 版本歷史
| 版本 | 日期 | 作者 | 變更說明 |
|------|------|------|----------|
| 1.0 | 2024-12-06 | System | 初始版本 |
| 1.1 | 2025-12-08 | System | 1. 更新 AI 功能測試案例三個錦囊 AI 幫我想<br>2. 新增組織階層模組測試案例<br>3. 新增組織階層 API 測試案例<br>4. 更新 JSON 解析錯誤處理測試(支援推理模型) |
---
**文件結束**

File diff suppressed because it is too large Load Diff

314
docs/excel.md Normal file
View File

@@ -0,0 +1,314 @@
事業體 處別 單位名稱 崗位名稱
半導體事業群 半導體事業群 半導體事業群 營運長
營運長助理
汽車事業體 汽車事業體 汽車事業體 副總經理
專案經理
法務室 法務室 法務室 經副理
法務專員
專利工程師
岡山製造事業體 生產處 生產處 處長
專員
生產部 經副理
生產課 課長
組長
班長
副班長
作業員
生產企劃部 經副理
課長
專員
工程師
岡山製造事業體 岡山品質管制部 經副理
封裝品質管制課 課長
工程師
組長
班長
副班長
作業員
品質管制整合課 課長
工程師
岡山製造事業體 副總經理
副總經理助理
封裝工程處 封裝工程處 處長
專員
工程師
製程工程一部 經副理
製程工程二部 經副理
上片銲線工程課 課長
工程師
切割點膠工程課 課長
工程師
正印~彎腳工程課 課長
工程師
模壓電鍍工程課 課長
工程師
設備一部 經副理
設備二部 經副理
設備一課 課長
工程師
設備二課 課長
工程師
設備三課 課長
工程師
副總辦公室 工業工程部 經副理
工程師
工業工程課 課長
工程師
專案管理 副理
工程師
測試工程與研發處 測試工程與研發處 處長
專員
測試工程部 經副理
設備課 課長
工程師
測試課 課長
工程師
新產品導入部 經副理
專員
工程師
研發部 經副理
封裝技術課 課長
工程師
設計模擬課 課長
工程師
專員
資材處 資材處 處長
採購部 經副理
採購一課 課長
專員
採購二課 課長
專員
外部資源部 專員
生管部 經副理
生產排程課 課長
專員
成品倉 課長
班長
副班長
作業員
原物料控制部 經副理
物料控制課 課長
專員
原物料倉 班長
副班長
作業員
廠務與環安衛管理處 廠務與環安衛管理處 處長
工程師
廠務部 經副理
廠務課 課長
工程師
安衛中心 課長
工程師
專員
智動化課 課長
工程師
產品事業體 產品事業體 產品事業體 處長
先進產品事業處 先進產品事業處 處長
產品管理部(APD) 經副理
產品工程(APD) 經副理
工程師
產品管理(APD) 經副理
工程師
成熟產品事業處 成熟產品事業處 處長
產品管理部(MPD) 經副理
產品工程(MPD) 經副理
專案經副理
工程師
產品管理(MPD) 經副理
專案經副理
工程師
晶圓三廠 晶圓三廠 晶圓三廠 顧問
專員
品質部 經副理
工程師
作業員
製造部 經副理
課長
班長
副班長
作業員
廠務部(Fab3) 經副理
工程師
製程工程處 工程一部 經副理
工程師
工程二部 經副理
工程師
工程三部 經副理
工程師
製程整合部(Fab3) 經副理
工程師
集團人資行政事業體 集團人資行政事業體 集團人資行政事業體 人資長
行政總務管理部 經副理
專員
助理
招募任用部 經副理
專員
訓練發展部 經副理
專員
薪酬管理部 經副理
專員
集團財務事業體 集團財務事業體 集團財務事業體 財務長
岡山強茂財務處 岡山強茂財務處 處長
岡山強茂財務部 經副理
岡山強茂財務課 課長
專員
集團財務事業體 集團投資人關係 專案副理
集團會計事業體 集團會計事業體 集團會計事業體 會計長
岡山會計處 岡山會計處 處長
岡山會計處 會計部 經副理
岡山會計處 會計課 課長
岡山會計處 專員
岡山會計處 稅務課 課長
岡山會計處 專員
岡山會計處 管理會計部 經副理
岡山會計處 封裝管理會計課 課長
岡山會計處 專員
岡山會計處 晶圓管理會計課 課長
岡山會計處 專員
集團會計處 集團會計處 處長
集團會計處 集團合併報表部 經副理
集團會計處 專員
集團資訊事業體 集團資訊事業體 集團資訊事業體 資訊長
資安行動小組 資安行動課 課長
資訊一處 應用系統部 經副理
資訊一處 工程師
資訊一處 電腦整合製造部 經副理
資訊一處 工程師
資訊一處 系統網路服務部 經副理
資訊一處 工程師
資訊二處 資訊二處 處長
新創事業體 新創事業體 新創事業體 處長
新創事業體 資源管理部 經副理
新創事業體 專員
研發中心 中低壓產品研發處 經副理
研發中心 工程師
研發中心 高壓產品研發處 經副理
研發中心 工程師
稽核室 稽核室 稽核室 主任
專員
總經理室 總經理室 總經理室 總裁
總經理
ESG專案辦公室 ESG專案辦公室 經副理
環境永續小組 課長
專員/工程師
社會永續小組 課長
專員/工程師
公司治理永續小組 課長
專員/工程師
專案管理室 專案管理室 副總經理
專案管理 經副理
專員/工程師
PVS專案課 專員/工程師
總品質事業體 總品質事業體 總品質事業體 處長
客戶品質管理部 經副理
客戶品質工程課 課長
工程師
專員
品質工程課 課長
工程師
產品品質管理部 經副理
新產品品質管理課 課長
工程師
變更管理課 課長
工程師
客戶支援工程課 課長
工程師
班長
作業員
品質系統及客戶工程整合部 經副理
客戶工程整合課 課長
工程師
品質系統課 課長
工程師
封測外包品質管理部 經副理
課長
工程師
品質保證部 經副理
失效分析課 課長
工程師
供應商管理課 課長
工程師
班長
副班長
作業員
信賴性保證課 課長
工程師
班長
副班長
作業員
晶圓供應商管理課 課長
工程師
營業事業體 營業事業體 營業事業體 副總經理
副總經理助理
商業開發暨市場應用處 商業開發暨市場應用處 處長
經理
工程師
海外銷售事業處 海外銷售事業處 處長
日本區暨代工業務部 經副理
日本區 課長
專員
助理
代工 課長
專員
助理
歐亞區業務部 經副理
助理
歐洲 課長
專員
助理
南亞 課長
專員
助理
東協 課長
專員
助理
韓國區業務部-韓國區 經副理
課長
專員
助理
全球跨區客戶管理 專案經理
經副理
美洲區業務部 經副理
課長
專員
助理
全球技術服務處 全球技術服務處 處長
工程師
助理
應用工程部(GTS) 經副理
專案經副理
技術經副理
工程師
系統工程部 經副理
工程師
特性測試部 經副理
特性測試課 課長
工程師
全球行銷暨業務支援處 全球行銷暨業務支援處 副總經理
業務生管部 經副理
業務生管課 課長
專員
物流&船務 課長
專員
市場行銷企劃部 處長
經理
專員
行銷推廣 專員
市場戰略 專員
MOSFET晶圓採購部 經副理
課長
專員
大中華區銷售事業處 大中華區銷售事業處 處長
台灣區業務部 專員
助理
業務一部 處長/資深經理
經副理
專員
助理
業務二部 處長/資深經理
經副理
專員
助理
HH專案組 經副理
專員
助理

315
docs/excel_table copy.md Normal file
View File

@@ -0,0 +1,315 @@
| 事業體 | 處級單位 | 部級單位 | 崗位名稱 |
|--------|----------|----------|----------|
| 半導體事業群 | 半導體事業群 | | 營運長 |
| 半導體事業群 | 半導體事業群 | | 營運長助理 |
| 汽車事業體 | 汽車事業體 | | 副總經理 |
| 汽車事業體 | 汽車事業體 | | 專案經理 |
| 法務室 | 法務室 | | 經副理 |
| 法務室 | 法務室 | | 法務專員 |
| 法務室 | 法務室 | | 專利工程師 |
| 岡山製造事業體 | 生產處 | | 處長 |
| 岡山製造事業體 | 生產處 | | 專員 |
| 岡山製造事業體 | 生產處 | 生產部 | 經副理 |
| 岡山製造事業體 | 生產處 | 生產部 | 課長 |
| 岡山製造事業體 | 生產處 | 生產部 | 組長 |
| 岡山製造事業體 | 生產處 | 生產部 | 班長 |
| 岡山製造事業體 | 生產處 | 生產部 | 副班長 |
| 岡山製造事業體 | 生產處 | 生產部 | 作業員 |
| 岡山製造事業體 | 生產處 | 生產企劃部 | 經副理 |
| 岡山製造事業體 | 生產處 | 生產企劃部 | 課長 |
| 岡山製造事業體 | 生產處 | 生產企劃部 | 專員 |
| 岡山製造事業體 | 生產處 | 生產企劃部 | 工程師 |
| 岡山製造事業體 | 岡山製造事業體 | 岡山品質管制部 | 經副理 |
| 岡山製造事業體 | 岡山製造事業體 | 岡山品質管制部 | 課長 |
| 岡山製造事業體 | 岡山製造事業體 | 岡山品質管制部 | 工程師 |
| 岡山製造事業體 | 岡山製造事業體 | 岡山品質管制部 | 組長 |
| 岡山製造事業體 | 岡山製造事業體 | 岡山品質管制部 | 班長 |
| 岡山製造事業體 | 岡山製造事業體 | 岡山品質管制部 | 副班長 |
| 岡山製造事業體 | 岡山製造事業體 | 岡山品質管制部 | 作業員 |
| 岡山製造事業體 | 岡山製造事業體 | 岡山品質管制部 | 課長 |
| 岡山製造事業體 | 岡山製造事業體 | 岡山品質管制部 | 工程師 |
| 岡山製造事業體 | 岡山製造事業體 | 岡山品質管制部 | 副總經理 |
| 岡山製造事業體 | 岡山製造事業體 | 岡山品質管制部 | 副總經理助理 |
| 岡山製造事業體 | 封裝工程處 | | 處長 |
| 岡山製造事業體 | 封裝工程處 | | 專員 |
| 岡山製造事業體 | 封裝工程處 | | 工程師 |
| 岡山製造事業體 | 封裝工程處 | 製程工程一部 | 經副理 |
| 岡山製造事業體 | 封裝工程處 | 製程工程二部 | 經副理 |
| 岡山製造事業體 | 封裝工程處 | 製程工程二部 | 課長 |
| 岡山製造事業體 | 封裝工程處 | 製程工程二部 | 工程師 |
| 岡山製造事業體 | 封裝工程處 | 製程工程二部 | 課長 |
| 岡山製造事業體 | 封裝工程處 | 製程工程二部 | 工程師 |
| 岡山製造事業體 | 封裝工程處 | 製程工程二部 | 課長 |
| 岡山製造事業體 | 封裝工程處 | 製程工程二部 | 工程師 |
| 岡山製造事業體 | 封裝工程處 | 製程工程二部 | 課長 |
| 岡山製造事業體 | 封裝工程處 | 製程工程二部 | 工程師 |
| 岡山製造事業體 | 封裝工程處 | 設備一部 | 經副理 |
| 岡山製造事業體 | 封裝工程處 | 設備二部 | 經副理 |
| 岡山製造事業體 | 封裝工程處 | 設備二部 | 課長 |
| 岡山製造事業體 | 封裝工程處 | 設備二部 | 工程師 |
| 岡山製造事業體 | 封裝工程處 | 設備二部 | 課長 |
| 岡山製造事業體 | 封裝工程處 | 設備二部 | 工程師 |
| 岡山製造事業體 | 封裝工程處 | 設備二部 | 課長 |
| 岡山製造事業體 | 封裝工程處 | 設備二部 | 工程師 |
| 岡山製造事業體 | 副總辦公室 | 工業工程部 | 經副理 |
| 岡山製造事業體 | 副總辦公室 | 工業工程部 | 工程師 |
| 岡山製造事業體 | 副總辦公室 | 工業工程部 | 課長 |
| 岡山製造事業體 | 副總辦公室 | 工業工程部 | 工程師 |
| 岡山製造事業體 | 副總辦公室 | 工業工程部 | 副理 |
| 岡山製造事業體 | 副總辦公室 | 工業工程部 | 工程師 |
| 岡山製造事業體 | 測試工程與研發處 | | 處長 |
| 岡山製造事業體 | 測試工程與研發處 | | 專員 |
| 岡山製造事業體 | 測試工程與研發處 | 測試工程部 | 經副理 |
| 岡山製造事業體 | 測試工程與研發處 | 測試工程部 | 課長 |
| 岡山製造事業體 | 測試工程與研發處 | 測試工程部 | 工程師 |
| 岡山製造事業體 | 測試工程與研發處 | 測試工程部 | 課長 |
| 岡山製造事業體 | 測試工程與研發處 | 測試工程部 | 工程師 |
| 岡山製造事業體 | 測試工程與研發處 | 新產品導入部 | 經副理 |
| 岡山製造事業體 | 測試工程與研發處 | 新產品導入部 | 專員 |
| 岡山製造事業體 | 測試工程與研發處 | 新產品導入部 | 工程師 |
| 岡山製造事業體 | 測試工程與研發處 | 研發部 | 經副理 |
| 岡山製造事業體 | 測試工程與研發處 | 研發部 | 課長 |
| 岡山製造事業體 | 測試工程與研發處 | 研發部 | 工程師 |
| 岡山製造事業體 | 測試工程與研發處 | 研發部 | 課長 |
| 岡山製造事業體 | 測試工程與研發處 | 研發部 | 工程師 |
| 岡山製造事業體 | 測試工程與研發處 | 研發部 | 專員 |
| 岡山製造事業體 | 資材處 | | 處長 |
| 岡山製造事業體 | 資材處 | 採購部 | 經副理 |
| 岡山製造事業體 | 資材處 | 採購部 | 課長 |
| 岡山製造事業體 | 資材處 | 採購部 | 專員 |
| 岡山製造事業體 | 資材處 | 採購部 | 課長 |
| 岡山製造事業體 | 資材處 | 採購部 | 專員 |
| 岡山製造事業體 | 資材處 | 外部資源部 | 專員 |
| 岡山製造事業體 | 資材處 | 生管部 | 經副理 |
| 岡山製造事業體 | 資材處 | 生管部 | 課長 |
| 岡山製造事業體 | 資材處 | 生管部 | 專員 |
| 岡山製造事業體 | 資材處 | 生管部 | 課長 |
| 岡山製造事業體 | 資材處 | 生管部 | 班長 |
| 岡山製造事業體 | 資材處 | 生管部 | 副班長 |
| 岡山製造事業體 | 資材處 | 生管部 | 作業員 |
| 岡山製造事業體 | 資材處 | 原物料控制部 | 經副理 |
| 岡山製造事業體 | 資材處 | 原物料控制部 | 課長 |
| 岡山製造事業體 | 資材處 | 原物料控制部 | 專員 |
| 岡山製造事業體 | 資材處 | 原物料控制部 | 班長 |
| 岡山製造事業體 | 資材處 | 原物料控制部 | 副班長 |
| 岡山製造事業體 | 資材處 | 原物料控制部 | 作業員 |
| 岡山製造事業體 | 廠務與環安衛管理處 | | 處長 |
| 岡山製造事業體 | 廠務與環安衛管理處 | | 工程師 |
| 岡山製造事業體 | 廠務與環安衛管理處 | 廠務部 | 經副理 |
| 岡山製造事業體 | 廠務與環安衛管理處 | 廠務部 | 課長 |
| 岡山製造事業體 | 廠務與環安衛管理處 | 廠務部 | 工程師 |
| 岡山製造事業體 | 廠務與環安衛管理處 | 廠務部 | 課長 |
| 岡山製造事業體 | 廠務與環安衛管理處 | 廠務部 | 工程師 |
| 岡山製造事業體 | 廠務與環安衛管理處 | 廠務部 | 專員 |
| 岡山製造事業體 | 廠務與環安衛管理處 | 廠務部 | 課長 |
| 岡山製造事業體 | 廠務與環安衛管理處 | 廠務部 | 工程師 |
| 產品事業體 | 產品事業體 | 廠務部 | 處長 |
| 產品事業體 | 先進產品事業處 | | 處長 |
| 產品事業體 | 先進產品事業處 | 產品管理部(APD) | 經副理 |
| 產品事業體 | 先進產品事業處 | 產品管理部(APD) | 經副理 |
| 產品事業體 | 先進產品事業處 | 產品管理部(APD) | 工程師 |
| 產品事業體 | 先進產品事業處 | 產品管理部(APD) | 經副理 |
| 產品事業體 | 先進產品事業處 | 產品管理部(APD) | 工程師 |
| 產品事業體 | 成熟產品事業處 | | 處長 |
| 產品事業體 | 成熟產品事業處 | 產品管理部(MPD) | 經副理 |
| 產品事業體 | 成熟產品事業處 | 產品管理部(MPD) | 經副理 |
| 產品事業體 | 成熟產品事業處 | 產品管理部(MPD) | 專案經副理 |
| 產品事業體 | 成熟產品事業處 | 產品管理部(MPD) | 工程師 |
| 產品事業體 | 成熟產品事業處 | 產品管理部(MPD) | 經副理 |
| 產品事業體 | 成熟產品事業處 | 產品管理部(MPD) | 專案經副理 |
| 產品事業體 | 成熟產品事業處 | 產品管理部(MPD) | 工程師 |
| 晶圓三廠 | 晶圓三廠 | 產品管理部(MPD) | 顧問 |
| 晶圓三廠 | 晶圓三廠 | 產品管理部(MPD) | 專員 |
| 晶圓三廠 | 晶圓三廠 | 品質部 | 經副理 |
| 晶圓三廠 | 晶圓三廠 | 品質部 | 工程師 |
| 晶圓三廠 | 晶圓三廠 | 品質部 | 作業員 |
| 晶圓三廠 | 晶圓三廠 | 製造部 | 經副理 |
| 晶圓三廠 | 晶圓三廠 | 製造部 | 課長 |
| 晶圓三廠 | 晶圓三廠 | 製造部 | 班長 |
| 晶圓三廠 | 晶圓三廠 | 製造部 | 副班長 |
| 晶圓三廠 | 晶圓三廠 | 製造部 | 作業員 |
| 晶圓三廠 | 晶圓三廠 | 廠務部(Fab3) | 經副理 |
| 晶圓三廠 | 晶圓三廠 | 廠務部(Fab3) | 工程師 |
| 晶圓三廠 | 製程工程處 | 工程一部 | 經副理 |
| 晶圓三廠 | 製程工程處 | 工程一部 | 工程師 |
| 晶圓三廠 | 製程工程處 | 工程二部 | 經副理 |
| 晶圓三廠 | 製程工程處 | 工程二部 | 工程師 |
| 晶圓三廠 | 製程工程處 | 工程三部 | 經副理 |
| 晶圓三廠 | 製程工程處 | 工程三部 | 工程師 |
| 晶圓三廠 | 製程工程處 | 製程整合部(Fab3) | 經副理 |
| 晶圓三廠 | 製程工程處 | 製程整合部(Fab3) | 工程師 |
| 集團人資行政事業體 | 集團人資行政事業體 | 製程整合部(Fab3) | 人資長 |
| 集團人資行政事業體 | 集團人資行政事業體 | 行政總務管理部 | 經副理 |
| 集團人資行政事業體 | 集團人資行政事業體 | 行政總務管理部 | 專員 |
| 集團人資行政事業體 | 集團人資行政事業體 | 行政總務管理部 | 助理 |
| 集團人資行政事業體 | 集團人資行政事業體 | 招募任用部 | 經副理 |
| 集團人資行政事業體 | 集團人資行政事業體 | 招募任用部 | 專員 |
| 集團人資行政事業體 | 集團人資行政事業體 | 訓練發展部 | 經副理 |
| 集團人資行政事業體 | 集團人資行政事業體 | 訓練發展部 | 專員 |
| 集團人資行政事業體 | 集團人資行政事業體 | 薪酬管理部 | 經副理 |
| 集團人資行政事業體 | 集團人資行政事業體 | 薪酬管理部 | 專員 |
| 集團財務事業體 | 集團財務事業體 | 薪酬管理部 | 財務長 |
| 集團財務事業體 | 岡山強茂財務處 | | 處長 |
| 集團財務事業體 | 岡山強茂財務處 | 岡山強茂財務部 | 經副理 |
| 集團財務事業體 | 岡山強茂財務處 | 岡山強茂財務部 | 課長 |
| 集團財務事業體 | 岡山強茂財務處 | 岡山強茂財務部 | 專員 |
| 集團財務事業體 | 集團財務事業體 | 岡山強茂財務部 | 專案副理 |
| 集團會計事業體 | 集團會計事業體 | 岡山強茂財務部 | 會計長 |
| 集團會計事業體 | 岡山會計處 | | 處長 |
| 集團會計事業體 | 岡山會計處 | 會計部 | 經副理 |
| 集團會計事業體 | 岡山會計處 | 會計部 | 課長 |
| 集團會計事業體 | 岡山會計處 | 會計部 | 專員 |
| 集團會計事業體 | 岡山會計處 | 會計部 | 課長 |
| 集團會計事業體 | 岡山會計處 | 會計部 | 專員 |
| 集團會計事業體 | 岡山會計處 | 管理會計部 | 經副理 |
| 集團會計事業體 | 岡山會計處 | 管理會計部 | 課長 |
| 集團會計事業體 | 岡山會計處 | 管理會計部 | 專員 |
| 集團會計事業體 | 岡山會計處 | 管理會計部 | 課長 |
| 集團會計事業體 | 岡山會計處 | 管理會計部 | 專員 |
| 集團會計事業體 | 集團會計處 | | 處長 |
| 集團會計事業體 | 集團會計處 | 集團合併報表部 | 經副理 |
| 集團會計事業體 | 集團會計處 | 集團合併報表部 | 專員 |
| 集團資訊事業體 | 集團資訊事業體 | 集團合併報表部 | 資訊長 |
| 集團資訊事業體 | 資安行動小組 | 集團合併報表部 | 課長 |
| 集團資訊事業體 | 資訊一處 | 應用系統部 | 經副理 |
| 集團資訊事業體 | 資訊一處 | 應用系統部 | 工程師 |
| 集團資訊事業體 | 資訊一處 | 電腦整合製造部 | 經副理 |
| 集團資訊事業體 | 資訊一處 | 電腦整合製造部 | 工程師 |
| 集團資訊事業體 | 資訊一處 | 系統網路服務部 | 經副理 |
| 集團資訊事業體 | 資訊一處 | 系統網路服務部 | 工程師 |
| 集團資訊事業體 | 資訊二處 | | 處長 |
| 新創事業體 | 新創事業體 | | 處長 |
| 新創事業體 | 新創事業體 | 資源管理部 | 經副理 |
| 新創事業體 | 新創事業體 | 資源管理部 | 專員 |
| 新創事業體 | 中低壓產品研發處 | | 經副理 |
| 新創事業體 | 研發中心 | | 工程師 |
| 新創事業體 | 高壓產品研發處 | | 經副理 |
| 新創事業體 | 研發中心 | | 工程師 |
| 稽核室 | 稽核室 | | 主任 |
| 稽核室 | 稽核室 | | 專員 |
| 總經理室 | 總經理室 | | 總裁 |
| 總經理室 | 總經理室 | | 總經理 |
| 總經理室 | ESG專案辦公室 | | 經副理 |
| 總經理室 | ESG專案辦公室 | | 課長 |
| 總經理室 | ESG專案辦公室 | | 專員/工程師 |
| 總經理室 | ESG專案辦公室 | | 課長 |
| 總經理室 | ESG專案辦公室 | | 專員/工程師 |
| 總經理室 | ESG專案辦公室 | | 課長 |
| 總經理室 | ESG專案辦公室 | | 專員/工程師 |
| 總經理室 | 專案管理室 | | 副總經理 |
| 總經理室 | 專案管理室 | | 經副理 |
| 總經理室 | 專案管理室 | | 專員/工程師 |
| 總經理室 | 專案管理室 | | 專員/工程師 |
| 總品質事業體 | 總品質事業體 | | 處長 |
| 總品質事業體 | 總品質事業體 | 客戶品質管理部 | 經副理 |
| 總品質事業體 | 總品質事業體 | 客戶品質管理部 | 課長 |
| 總品質事業體 | 總品質事業體 | 客戶品質管理部 | 工程師 |
| 總品質事業體 | 總品質事業體 | 客戶品質管理部 | 專員 |
| 總品質事業體 | 總品質事業體 | 客戶品質管理部 | 課長 |
| 總品質事業體 | 總品質事業體 | 客戶品質管理部 | 工程師 |
| 總品質事業體 | 總品質事業體 | 產品品質管理部 | 經副理 |
| 總品質事業體 | 總品質事業體 | 產品品質管理部 | 課長 |
| 總品質事業體 | 總品質事業體 | 產品品質管理部 | 工程師 |
| 總品質事業體 | 總品質事業體 | 產品品質管理部 | 課長 |
| 總品質事業體 | 總品質事業體 | 產品品質管理部 | 工程師 |
| 總品質事業體 | 總品質事業體 | 產品品質管理部 | 課長 |
| 總品質事業體 | 總品質事業體 | 產品品質管理部 | 工程師 |
| 總品質事業體 | 總品質事業體 | 產品品質管理部 | 班長 |
| 總品質事業體 | 總品質事業體 | 產品品質管理部 | 作業員 |
| 總品質事業體 | 總品質事業體 | 品質系統及客戶工程整合部 | 經副理 |
| 總品質事業體 | 總品質事業體 | 品質系統及客戶工程整合部 | 課長 |
| 總品質事業體 | 總品質事業體 | 品質系統及客戶工程整合部 | 工程師 |
| 總品質事業體 | 總品質事業體 | 品質系統及客戶工程整合部 | 課長 |
| 總品質事業體 | 總品質事業體 | 品質系統及客戶工程整合部 | 工程師 |
| 總品質事業體 | 總品質事業體 | 封測外包品質管理部 | 經副理 |
| 總品質事業體 | 總品質事業體 | 封測外包品質管理部 | 課長 |
| 總品質事業體 | 總品質事業體 | 封測外包品質管理部 | 工程師 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 經副理 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 課長 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 工程師 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 課長 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 工程師 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 班長 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 副班長 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 作業員 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 課長 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 工程師 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 班長 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 副班長 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 作業員 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 課長 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 工程師 |
| 營業事業體 | 營業事業體 | 品質保證部 | 副總經理 |
| 營業事業體 | 營業事業體 | 品質保證部 | 副總經理助理 |
| 營業事業體 | 商業開發暨市場應用處 | | 處長 |
| 營業事業體 | 商業開發暨市場應用處 | | 經理 |
| 營業事業體 | 商業開發暨市場應用處 | | 工程師 |
| 營業事業體 | 海外銷售事業處 | | 處長 |
| 營業事業體 | 海外銷售事業處 | 日本區暨代工業務部 | 經副理 |
| 營業事業體 | 海外銷售事業處 | 日本區暨代工業務部 | 課長 |
| 營業事業體 | 海外銷售事業處 | 日本區暨代工業務部 | 專員 |
| 營業事業體 | 海外銷售事業處 | 日本區暨代工業務部 | 助理 |
| 營業事業體 | 海外銷售事業處 | 日本區暨代工業務部 | 課長 |
| 營業事業體 | 海外銷售事業處 | 日本區暨代工業務部 | 專員 |
| 營業事業體 | 海外銷售事業處 | 日本區暨代工業務部 | 助理 |
| 營業事業體 | 海外銷售事業處 | 歐亞區業務部 | 經副理 |
| 營業事業體 | 海外銷售事業處 | 歐亞區業務部 | 助理 |
| 營業事業體 | 海外銷售事業處 | 歐亞區業務部 | 課長 |
| 營業事業體 | 海外銷售事業處 | 歐亞區業務部 | 專員 |
| 營業事業體 | 海外銷售事業處 | 歐亞區業務部 | 助理 |
| 營業事業體 | 海外銷售事業處 | 歐亞區業務部 | 課長 |
| 營業事業體 | 海外銷售事業處 | 歐亞區業務部 | 專員 |
| 營業事業體 | 海外銷售事業處 | 歐亞區業務部 | 助理 |
| 營業事業體 | 海外銷售事業處 | 歐亞區業務部 | 課長 |
| 營業事業體 | 海外銷售事業處 | 歐亞區業務部 | 專員 |
| 營業事業體 | 海外銷售事業處 | 歐亞區業務部 | 助理 |
| 營業事業體 | 海外銷售事業處 | 韓國區業務部-韓國區 | 經副理 |
| 營業事業體 | 海外銷售事業處 | 韓國區業務部-韓國區 | 課長 |
| 營業事業體 | 海外銷售事業處 | 韓國區業務部-韓國區 | 專員 |
| 營業事業體 | 海外銷售事業處 | 韓國區業務部-韓國區 | 助理 |
| 營業事業體 | 海外銷售事業處 | 韓國區業務部-韓國區 | 專案經理 |
| 營業事業體 | 海外銷售事業處 | 韓國區業務部-韓國區 | 經副理 |
| 營業事業體 | 海外銷售事業處 | 美洲區業務部 | 經副理 |
| 營業事業體 | 海外銷售事業處 | 美洲區業務部 | 課長 |
| 營業事業體 | 海外銷售事業處 | 美洲區業務部 | 專員 |
| 營業事業體 | 海外銷售事業處 | 美洲區業務部 | 助理 |
| 營業事業體 | 全球技術服務處 | | 處長 |
| 營業事業體 | 全球技術服務處 | | 工程師 |
| 營業事業體 | 全球技術服務處 | | 助理 |
| 營業事業體 | 全球技術服務處 | 應用工程部(GTS) | 經副理 |
| 營業事業體 | 全球技術服務處 | 應用工程部(GTS) | 專案經副理 |
| 營業事業體 | 全球技術服務處 | 應用工程部(GTS) | 技術經副理 |
| 營業事業體 | 全球技術服務處 | 應用工程部(GTS) | 工程師 |
| 營業事業體 | 全球技術服務處 | 系統工程部 | 經副理 |
| 營業事業體 | 全球技術服務處 | 系統工程部 | 工程師 |
| 營業事業體 | 全球技術服務處 | 特性測試部 | 經副理 |
| 營業事業體 | 全球技術服務處 | 特性測試部 | 課長 |
| 營業事業體 | 全球技術服務處 | 特性測試部 | 工程師 |
| 營業事業體 | 全球行銷暨業務支援處 | | 副總經理 |
| 營業事業體 | 全球行銷暨業務支援處 | 業務生管部 | 經副理 |
| 營業事業體 | 全球行銷暨業務支援處 | 業務生管部 | 課長 |
| 營業事業體 | 全球行銷暨業務支援處 | 業務生管部 | 專員 |
| 營業事業體 | 全球行銷暨業務支援處 | 業務生管部 | 課長 |
| 營業事業體 | 全球行銷暨業務支援處 | 業務生管部 | 專員 |
| 營業事業體 | 全球行銷暨業務支援處 | 市場行銷企劃部 | 處長 |
| 營業事業體 | 全球行銷暨業務支援處 | 市場行銷企劃部 | 經理 |
| 營業事業體 | 全球行銷暨業務支援處 | 市場行銷企劃部 | 專員 |
| 營業事業體 | 全球行銷暨業務支援處 | 市場行銷企劃部 | 專員 |
| 營業事業體 | 全球行銷暨業務支援處 | 市場行銷企劃部 | 專員 |
| 營業事業體 | 全球行銷暨業務支援處 | MOSFET晶圓採購部 | 經副理 |
| 營業事業體 | 全球行銷暨業務支援處 | MOSFET晶圓採購部 | 課長 |
| 營業事業體 | 全球行銷暨業務支援處 | MOSFET晶圓採購部 | 專員 |
| 營業事業體 | 大中華區銷售事業處 | | 處長 |
| 營業事業體 | 大中華區銷售事業處 | 台灣區業務部 | 專員 |
| 營業事業體 | 大中華區銷售事業處 | 台灣區業務部 | 助理 |
| 營業事業體 | 大中華區銷售事業處 | 業務一部 | 處長/資深經理 |
| 營業事業體 | 大中華區銷售事業處 | 業務一部 | 經副理 |
| 營業事業體 | 大中華區銷售事業處 | 業務一部 | 專員 |
| 營業事業體 | 大中華區銷售事業處 | 業務一部 | 助理 |
| 營業事業體 | 大中華區銷售事業處 | 業務二部 | 處長/資深經理 |
| 營業事業體 | 大中華區銷售事業處 | 業務二部 | 經副理 |
| 營業事業體 | 大中華區銷售事業處 | 業務二部 | 專員 |
| 營業事業體 | 大中華區銷售事業處 | 業務二部 | 助理 |
| 營業事業體 | 大中華區銷售事業處 | 業務二部 | 經副理 |
| 營業事業體 | 大中華區銷售事業處 | 業務二部 | 專員 |
| 營業事業體 | 大中華區銷售事業處 | 業務二部 | 助理 |

315
docs/excel_table.md Normal file
View File

@@ -0,0 +1,315 @@
| 事業體 | 處級單位 | 部級單位 | 崗位名稱 |
|--------|----------|----------|----------|
| 半導體事業群 | 半導體事業群 | | 營運長 |
| 半導體事業群 | 半導體事業群 | | 營運長助理 |
| 汽車事業體 | 汽車事業體 | | 副總經理 |
| 汽車事業體 | 汽車事業體 | | 專案經理 |
| 法務室 | 法務室 | | 經副理 |
| 法務室 | 法務室 | | 法務專員 |
| 法務室 | 法務室 | | 專利工程師 |
| 岡山製造事業體 | 生產處 | | 處長 |
| 岡山製造事業體 | 生產處 | | 專員 |
| 岡山製造事業體 | 生產處 | 生產部 | 經副理 |
| 岡山製造事業體 | 生產處 | 生產部 | 課長 |
| 岡山製造事業體 | 生產處 | 生產部 | 組長 |
| 岡山製造事業體 | 生產處 | 生產部 | 班長 |
| 岡山製造事業體 | 生產處 | 生產部 | 副班長 |
| 岡山製造事業體 | 生產處 | 生產部 | 作業員 |
| 岡山製造事業體 | 生產處 | 生產企劃部 | 經副理 |
| 岡山製造事業體 | 生產處 | 生產企劃部 | 課長 |
| 岡山製造事業體 | 生產處 | 生產企劃部 | 專員 |
| 岡山製造事業體 | 生產處 | 生產企劃部 | 工程師 |
| 岡山製造事業體 | 岡山製造事業體 | 岡山品質管制部 | 經副理 |
| 岡山製造事業體 | 岡山製造事業體 | 岡山品質管制部 | 課長 |
| 岡山製造事業體 | 岡山製造事業體 | 岡山品質管制部 | 工程師 |
| 岡山製造事業體 | 岡山製造事業體 | 岡山品質管制部 | 組長 |
| 岡山製造事業體 | 岡山製造事業體 | 岡山品質管制部 | 班長 |
| 岡山製造事業體 | 岡山製造事業體 | 岡山品質管制部 | 副班長 |
| 岡山製造事業體 | 岡山製造事業體 | 岡山品質管制部 | 作業員 |
| 岡山製造事業體 | 岡山製造事業體 | 岡山品質管制部 | 課長 |
| 岡山製造事業體 | 岡山製造事業體 | 岡山品質管制部 | 工程師 |
| 岡山製造事業體 | 岡山製造事業體 | 岡山品質管制部 | 副總經理 |
| 岡山製造事業體 | 岡山製造事業體 | 岡山品質管制部 | 副總經理助理 |
| 岡山製造事業體 | 封裝工程處 | | 處長 |
| 岡山製造事業體 | 封裝工程處 | | 專員 |
| 岡山製造事業體 | 封裝工程處 | | 工程師 |
| 岡山製造事業體 | 封裝工程處 | 製程工程一部 | 經副理 |
| 岡山製造事業體 | 封裝工程處 | 製程工程二部 | 經副理 |
| 岡山製造事業體 | 封裝工程處 | 製程工程二部 | 課長 |
| 岡山製造事業體 | 封裝工程處 | 製程工程二部 | 工程師 |
| 岡山製造事業體 | 封裝工程處 | 製程工程二部 | 課長 |
| 岡山製造事業體 | 封裝工程處 | 製程工程二部 | 工程師 |
| 岡山製造事業體 | 封裝工程處 | 製程工程二部 | 課長 |
| 岡山製造事業體 | 封裝工程處 | 製程工程二部 | 工程師 |
| 岡山製造事業體 | 封裝工程處 | 製程工程二部 | 課長 |
| 岡山製造事業體 | 封裝工程處 | 製程工程二部 | 工程師 |
| 岡山製造事業體 | 封裝工程處 | 設備一部 | 經副理 |
| 岡山製造事業體 | 封裝工程處 | 設備二部 | 經副理 |
| 岡山製造事業體 | 封裝工程處 | 設備二部 | 課長 |
| 岡山製造事業體 | 封裝工程處 | 設備二部 | 工程師 |
| 岡山製造事業體 | 封裝工程處 | 設備二部 | 課長 |
| 岡山製造事業體 | 封裝工程處 | 設備二部 | 工程師 |
| 岡山製造事業體 | 封裝工程處 | 設備二部 | 課長 |
| 岡山製造事業體 | 封裝工程處 | 設備二部 | 工程師 |
| 岡山製造事業體 | 副總辦公室 | 工業工程部 | 經副理 |
| 岡山製造事業體 | 副總辦公室 | 工業工程部 | 工程師 |
| 岡山製造事業體 | 副總辦公室 | 工業工程部 | 課長 |
| 岡山製造事業體 | 副總辦公室 | 工業工程部 | 工程師 |
| 岡山製造事業體 | 副總辦公室 | 工業工程部 | 副理 |
| 岡山製造事業體 | 副總辦公室 | 工業工程部 | 工程師 |
| 岡山製造事業體 | 測試工程與研發處 | | 處長 |
| 岡山製造事業體 | 測試工程與研發處 | | 專員 |
| 岡山製造事業體 | 測試工程與研發處 | 測試工程部 | 經副理 |
| 岡山製造事業體 | 測試工程與研發處 | 測試工程部 | 課長 |
| 岡山製造事業體 | 測試工程與研發處 | 測試工程部 | 工程師 |
| 岡山製造事業體 | 測試工程與研發處 | 測試工程部 | 課長 |
| 岡山製造事業體 | 測試工程與研發處 | 測試工程部 | 工程師 |
| 岡山製造事業體 | 測試工程與研發處 | 新產品導入部 | 經副理 |
| 岡山製造事業體 | 測試工程與研發處 | 新產品導入部 | 專員 |
| 岡山製造事業體 | 測試工程與研發處 | 新產品導入部 | 工程師 |
| 岡山製造事業體 | 測試工程與研發處 | 研發部 | 經副理 |
| 岡山製造事業體 | 測試工程與研發處 | 研發部 | 課長 |
| 岡山製造事業體 | 測試工程與研發處 | 研發部 | 工程師 |
| 岡山製造事業體 | 測試工程與研發處 | 研發部 | 課長 |
| 岡山製造事業體 | 測試工程與研發處 | 研發部 | 工程師 |
| 岡山製造事業體 | 測試工程與研發處 | 研發部 | 專員 |
| 岡山製造事業體 | 資材處 | | 處長 |
| 岡山製造事業體 | 資材處 | 採購部 | 經副理 |
| 岡山製造事業體 | 資材處 | 採購部 | 課長 |
| 岡山製造事業體 | 資材處 | 採購部 | 專員 |
| 岡山製造事業體 | 資材處 | 採購部 | 課長 |
| 岡山製造事業體 | 資材處 | 採購部 | 專員 |
| 岡山製造事業體 | 資材處 | 外部資源部 | 專員 |
| 岡山製造事業體 | 資材處 | 生管部 | 經副理 |
| 岡山製造事業體 | 資材處 | 生管部 | 課長 |
| 岡山製造事業體 | 資材處 | 生管部 | 專員 |
| 岡山製造事業體 | 資材處 | 生管部 | 課長 |
| 岡山製造事業體 | 資材處 | 生管部 | 班長 |
| 岡山製造事業體 | 資材處 | 生管部 | 副班長 |
| 岡山製造事業體 | 資材處 | 生管部 | 作業員 |
| 岡山製造事業體 | 資材處 | 原物料控制部 | 經副理 |
| 岡山製造事業體 | 資材處 | 原物料控制部 | 課長 |
| 岡山製造事業體 | 資材處 | 原物料控制部 | 專員 |
| 岡山製造事業體 | 資材處 | 原物料控制部 | 班長 |
| 岡山製造事業體 | 資材處 | 原物料控制部 | 副班長 |
| 岡山製造事業體 | 資材處 | 原物料控制部 | 作業員 |
| 岡山製造事業體 | 廠務與環安衛管理處 | | 處長 |
| 岡山製造事業體 | 廠務與環安衛管理處 | | 工程師 |
| 岡山製造事業體 | 廠務與環安衛管理處 | 廠務部 | 經副理 |
| 岡山製造事業體 | 廠務與環安衛管理處 | 廠務部 | 課長 |
| 岡山製造事業體 | 廠務與環安衛管理處 | 廠務部 | 工程師 |
| 岡山製造事業體 | 廠務與環安衛管理處 | 廠務部 | 課長 |
| 岡山製造事業體 | 廠務與環安衛管理處 | 廠務部 | 工程師 |
| 岡山製造事業體 | 廠務與環安衛管理處 | 廠務部 | 專員 |
| 岡山製造事業體 | 廠務與環安衛管理處 | 廠務部 | 課長 |
| 岡山製造事業體 | 廠務與環安衛管理處 | 廠務部 | 工程師 |
| 產品事業體 | 產品事業體 | 廠務部 | 處長 |
| 產品事業體 | 先進產品事業處 | | 處長 |
| 產品事業體 | 先進產品事業處 | 產品管理部(APD) | 經副理 |
| 產品事業體 | 先進產品事業處 | 產品管理部(APD) | 經副理 |
| 產品事業體 | 先進產品事業處 | 產品管理部(APD) | 工程師 |
| 產品事業體 | 先進產品事業處 | 產品管理部(APD) | 經副理 |
| 產品事業體 | 先進產品事業處 | 產品管理部(APD) | 工程師 |
| 產品事業體 | 成熟產品事業處 | | 處長 |
| 產品事業體 | 成熟產品事業處 | 產品管理部(MPD) | 經副理 |
| 產品事業體 | 成熟產品事業處 | 產品管理部(MPD) | 經副理 |
| 產品事業體 | 成熟產品事業處 | 產品管理部(MPD) | 專案經副理 |
| 產品事業體 | 成熟產品事業處 | 產品管理部(MPD) | 工程師 |
| 產品事業體 | 成熟產品事業處 | 產品管理部(MPD) | 經副理 |
| 產品事業體 | 成熟產品事業處 | 產品管理部(MPD) | 專案經副理 |
| 產品事業體 | 成熟產品事業處 | 產品管理部(MPD) | 工程師 |
| 晶圓三廠 | 晶圓三廠 | 產品管理部(MPD) | 顧問 |
| 晶圓三廠 | 晶圓三廠 | 產品管理部(MPD) | 專員 |
| 晶圓三廠 | 晶圓三廠 | 品質部 | 經副理 |
| 晶圓三廠 | 晶圓三廠 | 品質部 | 工程師 |
| 晶圓三廠 | 晶圓三廠 | 品質部 | 作業員 |
| 晶圓三廠 | 晶圓三廠 | 製造部 | 經副理 |
| 晶圓三廠 | 晶圓三廠 | 製造部 | 課長 |
| 晶圓三廠 | 晶圓三廠 | 製造部 | 班長 |
| 晶圓三廠 | 晶圓三廠 | 製造部 | 副班長 |
| 晶圓三廠 | 晶圓三廠 | 製造部 | 作業員 |
| 晶圓三廠 | 晶圓三廠 | 廠務部(Fab3) | 經副理 |
| 晶圓三廠 | 晶圓三廠 | 廠務部(Fab3) | 工程師 |
| 晶圓三廠 | 製程工程處 | 工程一部 | 經副理 |
| 晶圓三廠 | 製程工程處 | 工程一部 | 工程師 |
| 晶圓三廠 | 製程工程處 | 工程二部 | 經副理 |
| 晶圓三廠 | 製程工程處 | 工程二部 | 工程師 |
| 晶圓三廠 | 製程工程處 | 工程三部 | 經副理 |
| 晶圓三廠 | 製程工程處 | 工程三部 | 工程師 |
| 晶圓三廠 | 製程工程處 | 製程整合部(Fab3) | 經副理 |
| 晶圓三廠 | 製程工程處 | 製程整合部(Fab3) | 工程師 |
| 集團人資行政事業體 | 集團人資行政事業體 | 製程整合部(Fab3) | 人資長 |
| 集團人資行政事業體 | 集團人資行政事業體 | 行政總務管理部 | 經副理 |
| 集團人資行政事業體 | 集團人資行政事業體 | 行政總務管理部 | 專員 |
| 集團人資行政事業體 | 集團人資行政事業體 | 行政總務管理部 | 助理 |
| 集團人資行政事業體 | 集團人資行政事業體 | 招募任用部 | 經副理 |
| 集團人資行政事業體 | 集團人資行政事業體 | 招募任用部 | 專員 |
| 集團人資行政事業體 | 集團人資行政事業體 | 訓練發展部 | 經副理 |
| 集團人資行政事業體 | 集團人資行政事業體 | 訓練發展部 | 專員 |
| 集團人資行政事業體 | 集團人資行政事業體 | 薪酬管理部 | 經副理 |
| 集團人資行政事業體 | 集團人資行政事業體 | 薪酬管理部 | 專員 |
| 集團財務事業體 | 集團財務事業體 | 薪酬管理部 | 財務長 |
| 集團財務事業體 | 岡山強茂財務處 | | 處長 |
| 集團財務事業體 | 岡山強茂財務處 | 岡山強茂財務部 | 經副理 |
| 集團財務事業體 | 岡山強茂財務處 | 岡山強茂財務部 | 課長 |
| 集團財務事業體 | 岡山強茂財務處 | 岡山強茂財務部 | 專員 |
| 集團財務事業體 | 集團財務事業體 | 岡山強茂財務部 | 專案副理 |
| 集團會計事業體 | 集團會計事業體 | 岡山強茂財務部 | 會計長 |
| 集團會計事業體 | 岡山會計處 | | 處長 |
| 集團會計事業體 | 岡山會計處 | 會計部 | 經副理 |
| 集團會計事業體 | 岡山會計處 | 會計部 | 課長 |
| 集團會計事業體 | 岡山會計處 | 會計部 | 專員 |
| 集團會計事業體 | 岡山會計處 | 會計部 | 課長 |
| 集團會計事業體 | 岡山會計處 | 會計部 | 專員 |
| 集團會計事業體 | 岡山會計處 | 管理會計部 | 經副理 |
| 集團會計事業體 | 岡山會計處 | 管理會計部 | 課長 |
| 集團會計事業體 | 岡山會計處 | 管理會計部 | 專員 |
| 集團會計事業體 | 岡山會計處 | 管理會計部 | 課長 |
| 集團會計事業體 | 岡山會計處 | 管理會計部 | 專員 |
| 集團會計事業體 | 集團會計處 | | 處長 |
| 集團會計事業體 | 集團會計處 | 集團合併報表部 | 經副理 |
| 集團會計事業體 | 集團會計處 | 集團合併報表部 | 專員 |
| 集團資訊事業體 | 集團資訊事業體 | 集團合併報表部 | 資訊長 |
| 集團資訊事業體 | 資安行動小組 | 集團合併報表部 | 課長 |
| 集團資訊事業體 | 資訊一處 | 應用系統部 | 經副理 |
| 集團資訊事業體 | 資訊一處 | 應用系統部 | 工程師 |
| 集團資訊事業體 | 資訊一處 | 電腦整合製造部 | 經副理 |
| 集團資訊事業體 | 資訊一處 | 電腦整合製造部 | 工程師 |
| 集團資訊事業體 | 資訊一處 | 系統網路服務部 | 經副理 |
| 集團資訊事業體 | 資訊一處 | 系統網路服務部 | 工程師 |
| 集團資訊事業體 | 資訊二處 | | 處長 |
| 新創事業體 | 新創事業體 | | 處長 |
| 新創事業體 | 新創事業體 | 資源管理部 | 經副理 |
| 新創事業體 | 新創事業體 | 資源管理部 | 專員 |
| 新創事業體 | 中低壓產品研發處 | | 經副理 |
| 新創事業體 | 研發中心 | | 工程師 |
| 新創事業體 | 高壓產品研發處 | | 經副理 |
| 新創事業體 | 研發中心 | | 工程師 |
| 稽核室 | 稽核室 | | 主任 |
| 稽核室 | 稽核室 | | 專員 |
| 總經理室 | 總經理室 | | 總裁 |
| 總經理室 | 總經理室 | | 總經理 |
| 總經理室 | ESG專案辦公室 | | 經副理 |
| 總經理室 | ESG專案辦公室 | | 課長 |
| 總經理室 | ESG專案辦公室 | | 專員/工程師 |
| 總經理室 | ESG專案辦公室 | | 課長 |
| 總經理室 | ESG專案辦公室 | | 專員/工程師 |
| 總經理室 | ESG專案辦公室 | | 課長 |
| 總經理室 | ESG專案辦公室 | | 專員/工程師 |
| 總經理室 | 專案管理室 | | 副總經理 |
| 總經理室 | 專案管理室 | | 經副理 |
| 總經理室 | 專案管理室 | | 專員/工程師 |
| 總經理室 | 專案管理室 | | 專員/工程師 |
| 總品質事業體 | 總品質事業體 | | 處長 |
| 總品質事業體 | 總品質事業體 | 客戶品質管理部 | 經副理 |
| 總品質事業體 | 總品質事業體 | 客戶品質管理部 | 課長 |
| 總品質事業體 | 總品質事業體 | 客戶品質管理部 | 工程師 |
| 總品質事業體 | 總品質事業體 | 客戶品質管理部 | 專員 |
| 總品質事業體 | 總品質事業體 | 客戶品質管理部 | 課長 |
| 總品質事業體 | 總品質事業體 | 客戶品質管理部 | 工程師 |
| 總品質事業體 | 總品質事業體 | 產品品質管理部 | 經副理 |
| 總品質事業體 | 總品質事業體 | 產品品質管理部 | 課長 |
| 總品質事業體 | 總品質事業體 | 產品品質管理部 | 工程師 |
| 總品質事業體 | 總品質事業體 | 產品品質管理部 | 課長 |
| 總品質事業體 | 總品質事業體 | 產品品質管理部 | 工程師 |
| 總品質事業體 | 總品質事業體 | 產品品質管理部 | 課長 |
| 總品質事業體 | 總品質事業體 | 產品品質管理部 | 工程師 |
| 總品質事業體 | 總品質事業體 | 產品品質管理部 | 班長 |
| 總品質事業體 | 總品質事業體 | 產品品質管理部 | 作業員 |
| 總品質事業體 | 總品質事業體 | 品質系統及客戶工程整合部 | 經副理 |
| 總品質事業體 | 總品質事業體 | 品質系統及客戶工程整合部 | 課長 |
| 總品質事業體 | 總品質事業體 | 品質系統及客戶工程整合部 | 工程師 |
| 總品質事業體 | 總品質事業體 | 品質系統及客戶工程整合部 | 課長 |
| 總品質事業體 | 總品質事業體 | 品質系統及客戶工程整合部 | 工程師 |
| 總品質事業體 | 總品質事業體 | 封測外包品質管理部 | 經副理 |
| 總品質事業體 | 總品質事業體 | 封測外包品質管理部 | 課長 |
| 總品質事業體 | 總品質事業體 | 封測外包品質管理部 | 工程師 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 經副理 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 課長 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 工程師 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 課長 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 工程師 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 班長 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 副班長 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 作業員 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 課長 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 工程師 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 班長 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 副班長 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 作業員 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 課長 |
| 總品質事業體 | 總品質事業體 | 品質保證部 | 工程師 |
| 營業事業體 | 營業事業體 | 品質保證部 | 副總經理 |
| 營業事業體 | 營業事業體 | 品質保證部 | 副總經理助理 |
| 營業事業體 | 商業開發暨市場應用處 | | 處長 |
| 營業事業體 | 商業開發暨市場應用處 | | 經理 |
| 營業事業體 | 商業開發暨市場應用處 | | 工程師 |
| 營業事業體 | 海外銷售事業處 | | 處長 |
| 營業事業體 | 海外銷售事業處 | 日本區暨代工業務部 | 經副理 |
| 營業事業體 | 海外銷售事業處 | 日本區暨代工業務部 | 課長 |
| 營業事業體 | 海外銷售事業處 | 日本區暨代工業務部 | 專員 |
| 營業事業體 | 海外銷售事業處 | 日本區暨代工業務部 | 助理 |
| 營業事業體 | 海外銷售事業處 | 日本區暨代工業務部 | 課長 |
| 營業事業體 | 海外銷售事業處 | 日本區暨代工業務部 | 專員 |
| 營業事業體 | 海外銷售事業處 | 日本區暨代工業務部 | 助理 |
| 營業事業體 | 海外銷售事業處 | 歐亞區業務部 | 經副理 |
| 營業事業體 | 海外銷售事業處 | 歐亞區業務部 | 助理 |
| 營業事業體 | 海外銷售事業處 | 歐亞區業務部 | 課長 |
| 營業事業體 | 海外銷售事業處 | 歐亞區業務部 | 專員 |
| 營業事業體 | 海外銷售事業處 | 歐亞區業務部 | 助理 |
| 營業事業體 | 海外銷售事業處 | 歐亞區業務部 | 課長 |
| 營業事業體 | 海外銷售事業處 | 歐亞區業務部 | 專員 |
| 營業事業體 | 海外銷售事業處 | 歐亞區業務部 | 助理 |
| 營業事業體 | 海外銷售事業處 | 歐亞區業務部 | 課長 |
| 營業事業體 | 海外銷售事業處 | 歐亞區業務部 | 專員 |
| 營業事業體 | 海外銷售事業處 | 歐亞區業務部 | 助理 |
| 營業事業體 | 海外銷售事業處 | 韓國區業務部-韓國區 | 經副理 |
| 營業事業體 | 海外銷售事業處 | 韓國區業務部-韓國區 | 課長 |
| 營業事業體 | 海外銷售事業處 | 韓國區業務部-韓國區 | 專員 |
| 營業事業體 | 海外銷售事業處 | 韓國區業務部-韓國區 | 助理 |
| 營業事業體 | 海外銷售事業處 | 韓國區業務部-韓國區 | 專案經理 |
| 營業事業體 | 海外銷售事業處 | 韓國區業務部-韓國區 | 經副理 |
| 營業事業體 | 海外銷售事業處 | 美洲區業務部 | 經副理 |
| 營業事業體 | 海外銷售事業處 | 美洲區業務部 | 課長 |
| 營業事業體 | 海外銷售事業處 | 美洲區業務部 | 專員 |
| 營業事業體 | 海外銷售事業處 | 美洲區業務部 | 助理 |
| 營業事業體 | 全球技術服務處 | | 處長 |
| 營業事業體 | 全球技術服務處 | | 工程師 |
| 營業事業體 | 全球技術服務處 | | 助理 |
| 營業事業體 | 全球技術服務處 | 應用工程部(GTS) | 經副理 |
| 營業事業體 | 全球技術服務處 | 應用工程部(GTS) | 專案經副理 |
| 營業事業體 | 全球技術服務處 | 應用工程部(GTS) | 技術經副理 |
| 營業事業體 | 全球技術服務處 | 應用工程部(GTS) | 工程師 |
| 營業事業體 | 全球技術服務處 | 系統工程部 | 經副理 |
| 營業事業體 | 全球技術服務處 | 系統工程部 | 工程師 |
| 營業事業體 | 全球技術服務處 | 特性測試部 | 經副理 |
| 營業事業體 | 全球技術服務處 | 特性測試部 | 課長 |
| 營業事業體 | 全球技術服務處 | 特性測試部 | 工程師 |
| 營業事業體 | 全球行銷暨業務支援處 | | 副總經理 |
| 營業事業體 | 全球行銷暨業務支援處 | 業務生管部 | 經副理 |
| 營業事業體 | 全球行銷暨業務支援處 | 業務生管部 | 課長 |
| 營業事業體 | 全球行銷暨業務支援處 | 業務生管部 | 專員 |
| 營業事業體 | 全球行銷暨業務支援處 | 業務生管部 | 課長 |
| 營業事業體 | 全球行銷暨業務支援處 | 業務生管部 | 專員 |
| 營業事業體 | 全球行銷暨業務支援處 | 市場行銷企劃部 | 處長 |
| 營業事業體 | 全球行銷暨業務支援處 | 市場行銷企劃部 | 經理 |
| 營業事業體 | 全球行銷暨業務支援處 | 市場行銷企劃部 | 專員 |
| 營業事業體 | 全球行銷暨業務支援處 | 市場行銷企劃部 | 專員 |
| 營業事業體 | 全球行銷暨業務支援處 | 市場行銷企劃部 | 專員 |
| 營業事業體 | 全球行銷暨業務支援處 | MOSFET晶圓採購部 | 經副理 |
| 營業事業體 | 全球行銷暨業務支援處 | MOSFET晶圓採購部 | 課長 |
| 營業事業體 | 全球行銷暨業務支援處 | MOSFET晶圓採購部 | 專員 |
| 營業事業體 | 大中華區銷售事業處 | | 處長 |
| 營業事業體 | 大中華區銷售事業處 | 台灣區業務部 | 專員 |
| 營業事業體 | 大中華區銷售事業處 | 台灣區業務部 | 助理 |
| 營業事業體 | 大中華區銷售事業處 | 業務一部 | 處長/資深經理 |
| 營業事業體 | 大中華區銷售事業處 | 業務一部 | 經副理 |
| 營業事業體 | 大中華區銷售事業處 | 業務一部 | 專員 |
| 營業事業體 | 大中華區銷售事業處 | 業務一部 | 助理 |
| 營業事業體 | 大中華區銷售事業處 | 業務二部 | 處長/資深經理 |
| 營業事業體 | 大中華區銷售事業處 | 業務二部 | 經副理 |
| 營業事業體 | 大中華區銷售事業處 | 業務二部 | 專員 |
| 營業事業體 | 大中華區銷售事業處 | 業務二部 | 助理 |
| 營業事業體 | 大中華區銷售事業處 | 業務二部 | 經副理 |
| 營業事業體 | 大中華區銷售事業處 | 業務二部 | 專員 |
| 營業事業體 | 大中華區銷售事業處 | 業務二部 | 助理 |

758
docs/prompt.md Normal file
View File

@@ -0,0 +1,758 @@
# HR 崗位管理系統 - AI 生成功能 Prompt 說明文件
> **文件版本**: v1.0
> **最後更新**: 2024-12-04
> **維護者**: AI所以有問題真的不要問我
---
## 📋 目錄
1. [總覽](#總覽)
2. [頁籤 1: 崗位基礎資料維護](#頁籤-1-崗位基礎資料維護)
3. [頁籤 2: 崗位招聘要求](#頁籤-2-崗位招聘要求)
4. [頁籤 3: 職務基礎資料](#頁籤-3-職務基礎資料)
5. [頁籤 4: 部門職責維護](#頁籤-4-部門職責維護)
6. [頁籤 5: 崗位描述 (JD)](#頁籤-5-崗位描述-jd)
7. [如何修改 Prompt](#如何修改-prompt)
8. [Prompt 設計原則](#prompt-設計原則)
---
## 總覽
系統中共有 **5 個頁籤**提供 AI 自動生成功能,每個頁籤都有一個 "✨ I'm feeling lucky" 按鈕。
### 🎯 核心運作原理
1. **智能空白檢測**: 系統會檢測哪些欄位是空白的
2. **上下文感知**: 將已填寫的欄位作為上下文傳給 LLM
3. **精準生成**: 只生成尚未填寫的欄位
4. **JSON 格式回傳**: 要求 LLM 返回結構化的 JSON 資料
5. **自動填充**: 解析 JSON 並填入對應欄位
### 🔗 對應函式與程式碼位置
| 頁籤名稱 | 函式名稱 | 程式碼位置 | 按鈕 ID/onclick |
|---------|---------|-----------|----------------|
| 崗位基礎資料維護 | `generatePositionBasic()` | [index.html:2179](index.html#L2179) | `onclick="generatePositionBasic()"` |
| 崗位招聘要求 | `generatePositionRecruit()` | [index.html:2253](index.html#L2253) | `onclick="generatePositionRecruit()"` |
| 職務基礎資料 | `generateJobBasic()` | [index.html:2330](index.html#L2330) | `onclick="generateJobBasic()"` |
| 部門職責維護 | `generateDeptFunction()` | [index.html:3778](index.html#L3778) | `onclick="generateDeptFunction()"` |
| 崗位描述 (JD) | `generateJobDesc()` | [index.html:2425](index.html#L2425) | `onclick="generateJobDesc()"` |
---
## 頁籤 1: 崗位基礎資料維護
### 📍 函式位置
- **檔案**: `index.html`
- **行數**: 2179-2251
- **函式**: `async function generatePositionBasic()`
### 📝 完整 Prompt
```
請為HR崗位管理系統生成崗位基礎資料。請用繁體中文回覆。
[如果有已填寫的資料,會附加此段]
已填寫的資料(請參考這些內容來生成相關的資料):
{JSON格式的已填寫資料}
請「只生成」以下這些尚未填寫的欄位:[動態欄位列表]
欄位說明:
- positionCode: 崗位編號(格式如 ENG-001, MGR-002, SAL-003
- positionName: 崗位名稱
- positionCategory: 崗位類別代碼01=技術職, 02=管理職, 03=業務職, 04=行政職)
- positionNature: 崗位性質代碼FT=全職, PT=兼職, CT=約聘, IN=實習)
- headcount: 編制人數1-10之間的數字字串
- positionLevel: 崗位級別L1到L7
- positionDesc: 崗位描述2-3句話描述工作內容
- positionRemark: 崗位備注(可選的補充說明)
請直接返回JSON格式只包含需要生成的欄位不要有任何其他文字
{
"positionCode": "...",
"positionName": "...",
...
}
```
### 🎯 Prompt 設計依據
1. **上下文感知**: 如果使用者已填寫部分欄位,這些資料會被傳入作為參考
2. **精準指令**: 明確告知只生成「尚未填寫」的欄位,避免覆蓋已有資料
3. **格式規範**: 提供詳細的欄位格式說明和代碼對照表
4. **結構化輸出**: 要求返回純 JSON方便程式解析
### 📦 處理的欄位
```javascript
const allFields = [
'positionCode', // 崗位編號
'positionName', // 崗位名稱
'positionCategory', // 崗位類別代碼
'positionNature', // 崗位性質代碼
'headcount', // 編制人數
'positionLevel', // 崗位級別
'positionDesc', // 崗位描述
'positionRemark' // 崗位備注
];
```
### 🔧 如何修改此 Prompt
在 [index.html:2205-2223](index.html#L2205) 找到以下程式碼:
```javascript
const prompt = `請為HR崗位管理系統生成崗位基礎資料。請用繁體中文回覆。
${contextInfo}
請「只生成」以下這些尚未填寫的欄位:${emptyFields.join(', ')}
欄位說明:
- positionCode: 崗位編號(格式如 ENG-001, MGR-002, SAL-003
...
`;
```
**修改建議**:
- 如果要改變生成風格:修改第一句的指令(例如:「請以專業正式的語氣生成...」)
- 如果要新增欄位規則:在「欄位說明」中添加新的規範
- 如果要調整格式:修改格式範例(如改變編號規則)
---
## 頁籤 2: 崗位招聘要求
### 📍 函式位置
- **檔案**: `index.html`
- **行數**: 2253-2328
- **函式**: `async function generatePositionRecruit()`
### 📝 完整 Prompt
```
請為HR崗位管理系統生成「{崗位名稱}」的招聘要求資料。請用繁體中文回覆。
已填寫的資料(請參考這些內容來生成相關的資料):
{JSON格式的已填寫資料包含 positionName}
請「只生成」以下這些尚未填寫的欄位:[動態欄位列表]
欄位說明:
- minEducation: 最低學歷代碼HS=高中職, JC=專科, BA=大學, MA=碩士, PHD=博士)
- requiredGender: 要求性別(空字串=不限, M=男, F=女)
- salaryRange: 薪酬范圍代碼A=30000以下, B=30000-50000, C=50000-80000, D=80000-120000, E=120000以上, N=面議)
- workExperience: 工作經驗年數0=不限, 1, 3, 5, 10
- minAge: 最小年齡18-30之間的數字字串
- maxAge: 最大年齡35-55之間的數字字串
- jobType: 工作性質代碼FT=全職, PT=兼職, CT=約聘, DP=派遣)
- recruitPosition: 招聘職位代碼ENG=工程師, MGR=經理, AST=助理, OP=作業員, SAL=業務)
- jobTitle: 職位名稱
- jobDesc: 職位描述2-3句話
- positionReq: 崗位要求(條列式,用換行分隔)
- skillReq: 技能要求(用逗號分隔)
- langReq: 語言要求
- otherReq: 其他要求
請直接返回JSON格式只包含需要生成的欄位
{
"minEducation": "...",
...
}
```
### 🎯 Prompt 設計依據
1. **職位名稱作為核心上下文**: 使用第一個頁籤的崗位名稱作為生成依據
2. **跨頁籤資料引用**: 會從「崗位基礎資料」頁籤讀取 `positionName`
3. **招聘專用代碼**: 提供完整的學歷、薪資、經驗等代碼對照
### 📦 處理的欄位
```javascript
const allFields = [
'minEducation', // 最低學歷
'requiredGender', // 要求性別
'salaryRange', // 薪酬范圍
'workExperience', // 工作經驗年數
'minAge', // 最小年齡
'maxAge', // 最大年齡
'jobType', // 工作性質
'recruitPosition', // 招聘職位
'jobTitle', // 職位名稱
'jobDesc', // 職位描述
'positionReq', // 崗位要求
'skillReq', // 技能要求
'langReq', // 語言要求
'otherReq' // 其他要求
];
```
### 🔧 如何修改此 Prompt
在 [index.html:2275-2301](index.html#L2275) 找到程式碼。
**修改建議**:
- **調整薪資範圍**: 修改 `salaryRange` 的代碼對照(例如增加更高薪資級別)
- **新增性別選項**: 如果需要更多性別選項,在 `requiredGender` 中添加
- **調整經驗年限**: 修改 `workExperience` 的可用選項
---
## 頁籤 3: 職務基礎資料
### 📍 函式位置
- **檔案**: `index.html`
- **行數**: 2330-2423
- **函式**: `async function generateJobBasic()`
### 📝 完整 Prompt
```
請為HR職務管理系統生成職務基礎資料。請用繁體中文回覆。
[如果有已填寫的資料,會附加此段]
已填寫的資料(請參考這些內容來生成相關的資料):
{JSON格式的已填寫資料}
請「只生成」以下這些尚未填寫的欄位:[動態欄位列表,可能包含 checkbox]
欄位說明:
- jobCategoryCode: 職務類別代碼MGR=管理職, TECH=技術職, SALE=業務職, ADMIN=行政職, RD=研發職, PROD=生產職)
- jobCode: 職務編號(格式如 MGR-001, TECH-002
- jobName: 職務名稱
- jobNameEn: 職務英文名稱
- jobHeadcount: 編制人數1-20之間的數字字串
- jobSortOrder: 排列順序10, 20, 30...的數字字串)
- jobRemark: 備注說明
- jobLevel: 職務層級(可以是 *保密* 或具體層級)
- hasAttendanceBonus: 是否有全勤true/false
- hasHousingAllowance: 是否住房補貼true/false
請直接返回JSON格式只包含需要生成的欄位
{
"jobCategoryCode": "...",
...
}
```
### 🎯 Prompt 設計依據
1. **職務 vs 崗位**: 這個頁籤處理的是「職務」Job與「崗位」Position不同
2. **Checkbox 處理**: 特殊處理 `hasAttendanceBonus``hasHousingAllowance` 兩個布林值欄位
3. **排序欄位**: `jobSortOrder` 使用 10 的倍數,方便後續插入新職務
### 📦 處理的欄位
```javascript
const allFields = [
'jobCategoryCode', // 職務類別代碼
'jobCode', // 職務編號
'jobName', // 職務名稱
'jobNameEn', // 職務英文名稱
'jobHeadcount', // 編制人數
'jobSortOrder', // 排列順序
'jobRemark', // 備注說明
'jobLevel' // 職務層級
];
// 額外處理的 checkbox
const checkboxes = [
'hasAttendanceBonus', // 是否有全勤
'hasHousingAllowance' // 是否住房補貼
];
```
### 🔧 如何修改此 Prompt
在 [index.html:2362-2382](index.html#L2362) 找到程式碼。
**修改建議**:
- **新增職務類別**: 在 `jobCategoryCode` 中添加新的類別代碼
- **調整編號格式**: 修改 `jobCode` 的格式範例
- **修改保密設定**: 調整 `jobLevel` 的說明(如不允許保密)
---
## 頁籤 4: 部門職責維護
### 📍 函式位置
- **檔案**: `index.html`
- **行數**: 3778-3839
- **函式**: `function generateDeptFunction()`
### 📝 完整 Prompt
```
請為HR部門職責管理系統生成部門職責資料。請用繁體中文回覆。
[如果有已填寫的資料,會附加此段]
已填寫的資料(請參考這些內容來生成相關的資料):
{JSON格式的已填寫資料}
請「只生成」以下這些尚未填寫的欄位:[動態欄位列表]
欄位說明:
- deptFunctionCode: 部門職責編號(格式如 DF-001, DF-002
- deptFunctionName: 部門職責名稱(例如:軟體研發部職責)
- deptFunctionBU: 事業體代碼SBU/MBU/HQBU/ITBU/HRBU/ACCBU 之一)
- deptFunctionDept: 部門名稱
- deptManager: 部門主管職稱
- deptMission: 部門使命使用「•」開頭的條列式2-3項
- deptVision: 部門願景使用「•」開頭的條列式1-2項
- deptCoreFunctions: 核心職責使用「•」開頭的條列式4-6項
- deptKPIs: 關鍵績效指標使用「•」開頭的條列式3-4項
請直接返回JSON格式只包含需要生成的欄位不要有任何其他文字
{
"deptFunctionCode": "...",
...
}
```
### 🎯 Prompt 設計依據
1. **條列式格式**: 特別要求使用 `•` 開頭的條列式,符合部門職責文件慣例
2. **數量控制**: 明確指定每個欄位的條列項目數量(例如使命 2-3 項)
3. **事業體代碼**: 提供固定的事業體代碼選項
4. **管理導向**: 專注於部門管理層面的使命、願景、職責、KPI
### 📦 處理的欄位
```javascript
const allFields = [
'deptFunctionCode', // 部門職責編號
'deptFunctionName', // 部門職責名稱
'deptFunctionBU', // 事業體代碼
'deptFunctionDept', // 部門名稱
'deptManager', // 部門主管職稱
'deptMission', // 部門使命(條列式)
'deptVision', // 部門願景(條列式)
'deptCoreFunctions', // 核心職責(條列式)
'deptKPIs' // 關鍵績效指標(條列式)
];
```
### 🔧 如何修改此 Prompt
在 [index.html:3800-3819](index.html#L3800) 找到程式碼。
**修改建議**:
- **新增事業體**: 在 `deptFunctionBU` 中添加新的事業體代碼
- **調整條列數量**: 修改各欄位的條列項目數量要求
- **改變條列符號**: 將 `•` 改為其他符號(如 `1.`, `-`, `★`
---
## 頁籤 5: 崗位描述 (JD)
### 📍 函式位置
- **檔案**: `index.html`
- **行數**: 2425-2541
- **函式**: `async function generateJobDesc()`
### 📝 完整 Prompt
```
請為HR崗位描述管理系統生成崗位描述資料。請用繁體中文回覆。
[如果有已填寫的資料,會附加此段]
已填寫的資料(請參考這些內容來生成相關的資料):
{JSON格式的已填寫資料欄位名稱已移除 jd_ 前綴}
請「只生成」以下這些尚未填寫的欄位:[動態欄位列表]
欄位說明:
- empNo: 工號(格式如 A001234
- empName: 員工姓名
- positionCode: 崗位代碼
- versionDate: 版本日期YYYY-MM-DD格式
- positionName: 崗位名稱
- department: 所屬部門
- positionEffectiveDate: 崗位生效日期YYYY-MM-DD格式
- directSupervisor: 直接領導職務
- directReports: 直接下級(格式如「工程師 x 5人」
- workLocation: 任職地點代碼HQ=總部, TPE=台北, TYC=桃園, KHH=高雄, SH=上海, SZ=深圳)
- empAttribute: 員工屬性代碼FT=正式員工, CT=約聘, PT=兼職, IN=實習, DP=派遣)
- positionPurpose: 崗位設置目的1句話說明
- mainResponsibilities: 主要崗位職責用「1、」「2、」「3、」「4、」「5、」格式每項換行用\n分隔
- education: 教育程度要求
- basicSkills: 基本技能要求
- professionalKnowledge: 專業知識要求
- workExperienceReq: 工作經驗要求
- otherRequirements: 其他要求
請直接返回JSON格式只包含需要生成的欄位
{
"empNo": "...",
...
}
```
### 🎯 Prompt 設計依據
1. **最複雜的表單**: 包含最多欄位18 個),涵蓋完整的 JD 內容
2. **日期格式規範**: 明確要求 YYYY-MM-DD 格式
3. **職責編號格式**: 特別指定使用「1、」「2、」格式並用 `\n` 換行
4. **地點代碼對照**: 提供台灣與中國大陸的辦公室代碼
5. **欄位名稱映射**: 程式中會將 `jd_` 前綴移除後再傳給 API
### 📦 處理的欄位
```javascript
const allFields = [
'jd_empNo', // 工號
'jd_empName', // 員工姓名
'jd_positionCode', // 崗位代碼
'jd_versionDate', // 版本日期
'jd_positionName', // 崗位名稱
'jd_department', // 所屬部門
'jd_positionEffectiveDate', // 崗位生效日期
'jd_directSupervisor', // 直接領導職務
'jd_directReports', // 直接下級
'jd_workLocation', // 任職地點
'jd_empAttribute', // 員工屬性
'jd_positionPurpose', // 崗位設置目的
'jd_mainResponsibilities', // 主要崗位職責
'jd_education', // 教育程度要求
'jd_basicSkills', // 基本技能要求
'jd_professionalKnowledge', // 專業知識要求
'jd_workExperienceReq', // 工作經驗要求
'jd_otherRequirements' // 其他要求
];
```
### 🔧 如何修改此 Prompt
在 [index.html:2464-2492](index.html#L2464) 找到程式碼。
**特別注意**: 這個模組有欄位名稱映射機制([index.html:2499-2518](index.html#L2499)),修改欄位時需要同時更新 `fieldMapping` 物件。
**修改建議**:
- **新增辦公室地點**: 在 `workLocation` 中添加新的辦公室代碼
- **調整職責數量**: 修改 `mainResponsibilities` 的編號範圍(如改為 1-10
- **新增員工屬性**: 在 `empAttribute` 中添加新的員工類型
---
## 如何修改 Prompt
### 📝 通用修改步驟
所有 "I'm Feeling Lucky" 按鈕的 Prompt 都遵循相同的修改流程:
#### 步驟 1: 找到對應函式
使用上方表格找到要修改的函式位置,例如:
```
崗位基礎資料維護 → index.html:2179
```
#### 步驟 2: 找到 prompt 變數
在函式中搜尋 `const prompt =``const prompt = \``:
```javascript
const prompt = `請為HR崗位管理系統生成崗位基礎資料。請用繁體中文回覆。
...
`;
```
#### 步驟 3: 修改 Prompt 內容
根據需求修改:
**A. 修改生成風格**
```javascript
// 修改前
const prompt = `請為HR崗位管理系統生成崗位基礎資料。請用繁體中文回覆。
// 修改後(加入語氣要求)
const prompt = `請以專業正式且友善的語氣為HR崗位管理系統生成崗位基礎資料。請用繁體中文回覆。
```
**B. 修改欄位說明**
```javascript
// 修改前
- positionCode: 崗位編號(格式如 ENG-001, MGR-002, SAL-003
// 修改後(改變編號規則)
- positionCode: 崗位編號(格式:部門縮寫-年份-流水號,如 ENG-2024-001
```
**C. 新增欄位規則**
```javascript
// 在「欄位說明」區塊新增
- positionPriority: 優先級HIGH=高, MID=中, LOW=低)
```
**D. 調整輸出格式**
```javascript
// 修改前
請直接返回JSON格式只包含需要生成的欄位不要有任何其他文字
// 修改後(要求更多資訊)
請直接返回JSON格式只包含需要生成的欄位。每個欄位請加上「_note」後綴提供生成理由
{
"positionCode": "ENG-001",
"positionCode_note": "根據技術職的慣例生成",
...
}
```
#### 步驟 4: 測試修改結果
1. 儲存 `index.html` 檔案
2. 重新整理瀏覽器頁面Ctrl+F5 強制重新整理)
3. 點擊對應頁籤的 "✨ I'm feeling lucky" 按鈕
4. 檢查生成的內容是否符合預期
### ⚠️ 修改時的注意事項
1. **保持 JSON 格式要求**: 必須要求 LLM 返回純 JSON否則程式解析會失敗
2. **不要移除欄位動態列表**: `${emptyFields.join(', ')}` 這段必須保留
3. **維持上下文機制**: `${contextInfo}` 這段是自動填入已有資料的機制,不要刪除
4. **注意反引號**: Prompt 使用反引號 `` ` `` 包裹,內部不可再使用反引號
5. **測試跨欄位引用**: 有些頁籤會引用其他頁籤的資料(如招聘要求引用崗位名稱)
---
## Prompt 設計原則
### 🎨 系統採用的 Prompt 設計原則
#### 1. **智能空白檢測**
```javascript
const emptyFields = getEmptyFields(allFields);
```
- 只生成尚未填寫的欄位
- 避免覆蓋使用者已輸入的資料
- 提升生成效率
#### 2. **上下文感知生成**
```javascript
const contextInfo = Object.keys(existingData).length > 0
? `\n\n已填寫的資料請參考這些內容來生成相關的資料\n${JSON.stringify(existingData, null, 2)}`
: '';
```
- 將已填寫的資料作為上下文
- 讓 LLM 生成與現有資料一致的內容
- 提升資料連貫性
#### 3. **結構化輸出**
```javascript
const prompt = `...
請直接返回JSON格式只包含需要生成的欄位不要有任何其他文字
{
${emptyFields.map(f => `"${f}": "..."`).join(',\n ')}
}`;
```
- 要求 LLM 返回純 JSON
- 提供 JSON 格式範本
- 方便程式解析
#### 4. **詳細的欄位說明**
```javascript
欄位說明:
- positionCode: 崗位編號(格式如 ENG-001, MGR-002, SAL-003
- positionCategory: 崗位類別代碼01=技術職, 02=管理職, 03=業務職, 04=行政職)
```
- 提供完整的代碼對照表
- 說明格式規範和範例
- 減少生成錯誤
#### 5. **繁體中文優先**
```javascript
const prompt = `請為HR崗位管理系統生成崗位基礎資料。請用繁體中文回覆。
```
- 明確要求使用繁體中文
- 避免出現簡體字或英文
### 🚀 進階 Prompt 技巧
#### 技巧 1: 加入企業特色
```javascript
// 在 prompt 開頭加入
const prompt = `你是一位專業的HR顧問熟悉台灣半導體產業的人力資源管理。
請為HR崗位管理系統生成崗位基礎資料。請用繁體中文回覆。
```
#### 技巧 2: 加入範例
```javascript
// 在欄位說明後加入
生成範例
{
"positionCode": "ENG-001",
"positionName": "前端工程師",
"positionDesc": "負責開發和維護公司網站前端功能,提升使用者體驗。"
}
請參考以上範例生成類似格式的資料
```
#### 技巧 3: 加入條件邏輯
```javascript
// 根據職位類型調整 prompt
const isManagerPosition = existingData.positionCategory === '02';
const extraInstruction = isManagerPosition
? '\n特別注意這是管理職請強調領導能力和團隊管理經驗。'
: '';
const prompt = `請為HR崗位管理系統生成崗位基礎資料。請用繁體中文回覆。${extraInstruction}
```
#### 技巧 4: 加入驗證規則
```javascript
const prompt = `...
請確保生成的資料符合以下規則:
1. 崗位編號必須以部門代碼開頭
2. 編制人數必須為正整數
3. 崗位描述長度在 20-100 字之間
4. 所有代碼必須從提供的選項中選擇
...`;
```
---
## 🔍 偵錯與問題排查
### 常見問題 1: LLM 返回格式錯誤
**現象**: 點擊按鈕後出現「生成失敗,請稍後再試」
**可能原因**:
- LLM 返回的不是純 JSON 格式
- JSON 中包含多餘的文字說明
- JSON 格式不正確(缺少逗號、括號等)
**解決方法**:
在 Prompt 中加強格式要求:
```javascript
const prompt = `...
請直接返回JSON格式不要包含任何markdown標記如 \`\`\`json不要有任何其他文字說明
{
${emptyFields.map(f => `"${f}": "..."`).join(',\n ')}
}`;
```
### 常見問題 2: 生成內容不符合預期
**現象**: 生成的內容格式正確,但內容不理想
**解決方法**:
1. 檢查上下文資料是否正確傳遞
2. 增加更詳細的欄位說明
3. 提供具體範例
4. 調整 Prompt 語氣和指令
### 常見問題 3: 部分欄位未填充
**現象**: 只填充了部分欄位,其他欄位仍為空
**可能原因**:
- LLM 返回的 JSON 缺少某些欄位
- 欄位名稱不匹配(大小寫、前綴問題)
**解決方法**:
檢查欄位映射邏輯,特別是 `generateJobDesc()` 函式中的 `fieldMapping`
```javascript
const fieldMapping = {
'empNo': 'jd_empNo',
'empName': 'jd_empName',
...
};
```
---
## 📚 參考資源
### 相關檔案
- **主程式**: [index.html](index.html) - 包含所有 AI 生成函式
- **LLM API 配置**: [llm_config.py](llm_config.py) - LLM 模型設定
- **環境變數**: [.env](.env) - API Key 和模型設定
### 相關函式
- **`callClaudeAPI(prompt)`**: 呼叫 LLM API 的核心函式
- **`getEmptyFields(allFields)`**: 檢測空白欄位
- **`fillIfEmpty(fieldId, value)`**: 只填充空白欄位
- **`setButtonLoading(btn, isLoading)`**: 設定按鈕載入狀態
### LLM 模型設定
系統支援多種 LLM 模型,在 `.env` 檔案中設定:
```env
# Gemini API Configuration
GEMINI_API_KEY=your_api_key
GEMINI_MODEL=gemini-1.5-flash
# DeepSeek API Configuration
DEEPSEEK_API_KEY=your_deepseek_api_key
DEEPSEEK_API_URL=https://api.deepseek.com/v1
# OpenAI API Configuration
OPENAI_API_KEY=your_openai_api_key
OPENAI_API_URL=https://api.openai.com/v1
# Ollama API Configuration
OLLAMA_API_URL=https://ollama_pjapi.theaken.com
OLLAMA_MODEL=deepseek-reasoner
```
---
## ✅ 最佳實踐
### ✨ 撰寫好的 Prompt 的建議
1. **明確的指令**: 清楚說明要生成什麼類型的資料
2. **詳細的格式說明**: 提供完整的代碼對照表和格式範例
3. **上下文資訊**: 包含已填寫的資料作為參考
4. **結構化輸出**: 要求返回 JSON 格式,方便解析
5. **語言偏好**: 明確指定使用繁體中文
6. **錯誤處理**: 加入驗證規則,減少生成錯誤
### 📝 Prompt 維護建議
1. **版本控制**: 重大修改前先備份原 Prompt
2. **測試驗證**: 每次修改後都要測試所有情境
3. **文件更新**: 修改後同步更新此說明文件
4. **使用者回饋**: 根據實際使用情況調整 Prompt
---
## 🎯 總結
### 快速參考表
| 頁籤 | 函式 | 程式碼行數 | 主要用途 | 欄位數量 |
|-----|------|-----------|---------|---------|
| 崗位基礎資料 | `generatePositionBasic()` | 2179-2251 | 生成崗位基本資訊 | 8 |
| 崗位招聘要求 | `generatePositionRecruit()` | 2253-2328 | 生成招聘需求 | 14 |
| 職務基礎資料 | `generateJobBasic()` | 2330-2423 | 生成職務資訊 | 8+2 checkbox |
| 部門職責維護 | `generateDeptFunction()` | 3778-3839 | 生成部門職責 | 9 |
| 崗位描述 (JD) | `generateJobDesc()` | 2425-2541 | 生成完整JD | 18 |
### 核心機制
1. **智能檢測**: 自動識別空白欄位
2. **上下文感知**: 參考已填寫資料生成
3. **結構化輸出**: JSON 格式便於解析
4. **安全填充**: 只填充空白欄位,不覆蓋現有資料
---
> **維護提醒**: 當系統新增或修改欄位時,記得同步更新:
> 1. HTML 表單欄位
> 2. JavaScript 函式中的 `allFields` 陣列
> 3. Prompt 中的欄位說明
> 4. 此說明文件
---
**文件結束** | 有問題請找 AI不要找我 ¯\\_(ツ)_/¯

263
docs/三個錦囊設計.md Normal file
View File

@@ -0,0 +1,263 @@
# 三個錦囊功能設計
## 功能概述
將原本的單一 "I'm feeling lucky" 按鈕改為三個可自定義的 AI 生成按鈕("三個錦囊")。
## UI 設計
### 視覺效果
```
┌─────────────────────────────────────────────────────────┐
│ 🎁 錦囊一 🎁 錦囊二 🎁 錦囊三 │
│ [標題] [標題] [標題] │
│ ⚙️ 編輯 ⚙️ 編輯 ⚙️ 編輯 │
└─────────────────────────────────────────────────────────┘
```
### 互動流程
1. **點擊錦囊按鈕** → 使用預設或自定義的 prompt 調用 AI
2. **點擊編輯圖示** → 彈出對話框,顯示並可編輯當前 prompt
3. **Prompt 儲存** → 儲存至 localStorage按模組區分
## 資料結構
### LocalStorage 結構
```javascript
{
"prompts": {
"positionBasic": {
"bag1": { "title": "簡化版", "prompt": "..." },
"bag2": { "title": "標準版", "prompt": "..." },
"bag3": { "title": "詳細版", "prompt": "..." }
},
"positionRecruit": {
"bag1": { "title": "一般需求", "prompt": "..." },
"bag2": { "title": "高階需求", "prompt": "..." },
"bag3": { "title": "專業需求", "prompt": "..." }
},
"jobBasic": { ... },
"deptFunction": { ... },
"jobDesc": { ... }
}
}
```
## 預設 Prompt 模板
### 崗位基礎資料 - 基礎資料頁籤
#### 錦囊一:簡化版(僅填必填欄位)
```
你是專業人資顧問,熟悉半導體製造業。請生成崗位基礎資料(僅必填欄位)。
已填寫的資料:{existingData}
需要生成的欄位positionCode, positionName
請用繁體中文,返回 JSON 格式。
```
#### 錦囊二:標準版(常用欄位)
```
你是專業人資顧問,熟悉半導體製造業。請生成崗位基礎資料(標準版)。
已填寫的資料:{existingData}
需要生成的欄位positionCode, positionName, positionCategory, positionLevel, headcount
欄位說明:
- positionCode: 崗位編號(格式如 ENG-001
- positionName: 崗位名稱
- positionCategory: 崗位類別代碼01=技術職, 02=管理職, 03=業務職, 04=行政職)
- positionLevel: 崗位級別L1-L7
- headcount: 編制人數1-10
請用繁體中文,返回 JSON 格式。
```
#### 錦囊三:詳細版(所有欄位)
```
你是專業人資顧問,熟悉半導體製造業的人資所有流程。請生成完整的崗位基礎資料。
已填寫的資料:{existingData}
需要生成的欄位positionCode, positionName, positionCategory, positionNature, headcount, positionLevel, positionDesc, positionRemark
欄位說明:
- positionCode: 崗位編號(格式如 ENG-001, MGR-002
- positionName: 崗位名稱
- positionCategory: 崗位類別代碼01=技術職, 02=管理職, 03=業務職, 04=行政職)
- positionNature: 崗位性質代碼FT=全職, PT=兼職, CT=約聘, IN=實習)
- headcount: 編制人數1-10之間的數字字串
- positionLevel: 崗位級別L1到L7
- positionDesc: 崗位描述(條列式,用換行分隔)
- positionRemark: 崗位備注(條列式,用換行分隔)
請用繁體中文,返回 JSON 格式,不要有任何其他文字。
```
### 崗位基礎資料 - 招聘要求頁籤
#### 錦囊一:基本需求
```
請生成「{positionName}」的基本招聘要求。
已填寫的資料:{existingData}
需要生成的欄位minEducation, workExperience, jobType, jobTitle
請用繁體中文,返回 JSON 格式。
```
#### 錦囊二:標準需求
```
請生成「{positionName}」的標準招聘要求。
已填寫的資料:{existingData}
需要生成的欄位minEducation, salaryRange, workExperience, jobType, recruitPosition, jobTitle, positionReq, skillReq
欄位說明:
- minEducation: 最低學歷代碼HS=高中職, JC=專科, BA=大學, MA=碩士, PHD=博士)
- salaryRange: 薪酬范圍代碼A=30000以下, B=30000-50000, C=50000-80000, D=80000-120000, E=120000以上, N=面議)
- workExperience: 工作經驗年數0=不限, 1, 3, 5, 10
- jobType: 工作性質代碼FT=全職, PT=兼職, CT=約聘, DP=派遣)
- recruitPosition: 招聘職位代碼ENG=工程師, MGR=經理, AST=助理, OP=作業員, SAL=業務)
- positionReq: 崗位要求(條列式,用換行分隔)
- skillReq: 技能要求(條列式,用換行分隔)
請用繁體中文,返回 JSON 格式。
```
#### 錦囊三:完整需求
```
請生成「{positionName}」的完整招聘要求資料。
已填寫的資料:{existingData}
需要生成所有空白欄位。
(完整欄位說明同標準版,包含所有 18 個欄位)
請用繁體中文,返回 JSON 格式。
```
## 實作步驟
### 1. HTML 結構更新
將單一按鈕:
```html
<button type="button" class="ai-generate-btn" onclick="generatePositionBasic()">
<span>✨ I'm feeling lucky</span>
</button>
```
改為三個錦囊:
```html
<div class="ai-bags-container">
<div class="ai-bag" data-bag="1" onclick="executeAIBag('positionBasic', 1)">
<div class="bag-icon">🎁</div>
<div class="bag-title" id="bag1-title-positionBasic">錦囊一</div>
<button class="bag-edit-btn" onclick="editBagPrompt(event, 'positionBasic', 1)">⚙️</button>
</div>
<div class="ai-bag" data-bag="2" onclick="executeAIBag('positionBasic', 2)">
<div class="bag-icon">🎁</div>
<div class="bag-title" id="bag2-title-positionBasic">錦囊二</div>
<button class="bag-edit-btn" onclick="editBagPrompt(event, 'positionBasic', 2)">⚙️</button>
</div>
<div class="ai-bag" data-bag="3" onclick="executeAIBag('positionBasic', 3)">
<div class="bag-icon">🎁</div>
<div class="bag-title" id="bag3-title-positionBasic">錦囊三</div>
<button class="bag-edit-btn" onclick="editBagPrompt(event, 'positionBasic', 3)">⚙️</button>
</div>
</div>
```
### 2. CSS 樣式
```css
.ai-bags-container {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 16px;
margin-bottom: 24px;
}
.ai-bag {
position: relative;
padding: 20px;
background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%);
border-radius: 8px;
cursor: pointer;
transition: all 0.3s ease;
box-shadow: 0 4px 15px rgba(155, 89, 182, 0.3);
}
.ai-bag:hover {
transform: translateY(-4px);
box-shadow: 0 6px 20px rgba(155, 89, 182, 0.5);
}
.ai-bag .bag-icon {
font-size: 2rem;
text-align: center;
margin-bottom: 8px;
}
.ai-bag .bag-title {
color: white;
font-weight: 600;
text-align: center;
font-size: 0.95rem;
}
.ai-bag .bag-edit-btn {
position: absolute;
top: 8px;
right: 8px;
background: rgba(255, 255, 255, 0.2);
border: none;
border-radius: 4px;
padding: 4px 8px;
cursor: pointer;
font-size: 0.9rem;
transition: all 0.2s ease;
}
.ai-bag .bag-edit-btn:hover {
background: rgba(255, 255, 255, 0.3);
transform: scale(1.1);
}
```
### 3. JavaScript 函式
#### 執行 AI 錦囊
```javascript
async function executeAIBag(module, bagNumber) {
const prompts = getModulePrompts(module);
const bagPrompt = prompts[`bag${bagNumber}`];
// 使用 prompt 調用 AI
await callClaudeAPI(bagPrompt.prompt);
}
```
#### 編輯 Prompt
```javascript
function editBagPrompt(event, module, bagNumber) {
event.stopPropagation();
// 顯示編輯對話框
showPromptEditModal(module, bagNumber);
}
```
## 優點
1.**靈活性高** - 用戶可自定義每個錦囊的用途
2.**效率提升** - 三個預設選項涵蓋不同需求場景
3.**學習友好** - 顯示 prompt 有助於理解 AI 運作
4.**可擴展** - 未來可增加更多錦囊或分享功能
## 待實作功能
- [ ] HTML 結構更新5 個模組)
- [ ] CSS 樣式新增
- [ ] JavaScript 函式實作
- [ ] LocalStorage 管理
- [ ] 編輯 Modal 對話框
- [ ] 預設 Prompt 初始化

View File

@@ -0,0 +1,26 @@
project_name/
├── .env # 環境變數(不進版控)
├── .env.example # 環境變數範本
├── .gitignore
├── README.md
├── requirements.txt
├── app.py # 主程式入口
├── config.py # 設定檔
├── preview.html # UI 預覽
├── docs/
│ ├── SDD.md # 系統設計文件
│ ├── security_audit.md # 資安檢視報告
│ ├── user_command_log.md # 用戶指令記錄
│ ├── CHANGELOG.md # 版本變更紀錄
│ └── API_DOC.md # API 文件
├── models/ # 資料庫模型
├── routes/ # 路由模組
├── services/ # 商業邏輯
├── utils/ # 工具函式
├── templates/ # HTML 模板
└── static/ # 靜態資源
├── css/
├── js/
└── images/

176
docs/更新欄位名稱.md Normal file
View File

@@ -0,0 +1,176 @@
# 系統表單欄位規範書 (Standardized Field Specifications)
## 1. 命名規範與前綴定義 (Naming Conventions)
為了確保系統一致性HTML 元素 ID 採用 `[模組前綴]_[標準欄位名]` 的命名方式。
| 模組名稱 | 模組前綴 (Prefix) | 說明 |
| :--- | :--- | :--- |
| **崗位管理 (Position)** | `pos_` | 崗位基礎資料 |
| **招聘條件 (Recruit)** | `rec_` | 崗位內的招聘頁籤 |
| **職務管理 (Job)** | `job_` | 全公司通用的職務定義 |
| **部門職責 (DeptFunc)** | `df_` | 部門功能與職責定義 |
| **崗位描述 (JobDesc)** | `jd_` | 最終的 JD 產出表單 |
---
## 2. 崗位基礎資料模組 (Position Module)
**表單代號**: `positionForm`
**資料表**: `Position`
### 2.1 基礎資料頁籤 (tab-position-basic)
| # | 欄位顯示名稱 | 標準化 HTML ID | 資料庫欄位名稱 | 類型 | 必填 | 預設 | 備註 |
|---|---|---|---|---|---|---|---|
| 1 | 事業體 | `pos_businessUnit` | `businessUnit` | select | 否 | - | SBU, MBU... (聯動L1) |
| 2 | 處級單位 | `pos_division` | `division` | select | 否 | - | (聯動L2) |
| 3 | 部級單位 | `pos_department` | `department` | select | 否 | - | (聯動L3) |
| 4 | 課級單位 | `pos_section` | `section` | text | 否 | - | - |
| 5 | **崗位編號** | `pos_code` | `positionCode` | text | **是** | - | 唯一識別碼 (PK) |
| 6 | 生效日期 | `pos_effectiveDate` | `effectiveDate` | date | 否 | Today | - |
| 7 | **崗位名稱** | `pos_name` | `positionName` | text | **是** | - | - |
| 8 | 崗位級別 | `pos_level` | `positionLevel` | select | 否 | - | L1-L7 |
| 9 | 崗位類別 | `pos_category` | `positionCategory` | select | 否 | - | onchange 觸發 |
| 10 | 崗位類別名稱 | `pos_categoryName` | `positionCategoryName` | text | 否 | - | readonly |
| 11 | 崗位性質 | `pos_type` | `positionType` | select | 否 | - | FT, PT, CT, IN |
| 12 | 崗位性質名稱 | `pos_typeName` | `positionTypeName` | text | 否 | - | readonly |
| 13 | 編制人數 | `pos_headcount` | `headcount` | number | 否 | 0 | min=0 |
| 14 | 崗位描述 | `pos_desc` | `description` | textarea | 否 | - | rows=6 |
| 15 | 崗位備注 | `pos_remark` | `remark` | textarea | 否 | - | rows=6 |
### 2.2 招聘要求資料頁籤 (tab-position-recruit)
| # | 欄位顯示名稱 | 標準化 HTML ID | 資料庫欄位名稱 | 類型 | 必填 | 預設 | 備註 |
|---|---|---|---|---|---|---|---|
| 1 | 最低學歷 | `rec_eduLevel` | `educationLevel` | select | 否 | - | HS, BA, MA, PHD |
| 2 | 要求性別 | `rec_gender` | `requiredGender` | select | 否 | Any | M, F, Any |
| 3 | 薪酬范圍 | `rec_salaryRange` | `salaryRange` | select | 否 | - | A-E, Negotiable |
| 4 | 工作經驗 | `rec_expYears` | `experienceYears` | select | 否 | - | 0, 1, 3, 5, 10+ |
| 5 | 最小年齡 | `rec_minAge` | `minAge` | number | 否 | - | min=18 |
| 6 | 最大年齡 | `rec_maxAge` | `maxAge` | number | 否 | - | max=65 |
| 7 | 工作性質 | `rec_jobType` | `jobType` | select | 否 | - | 招聘用性質分類 |
| 8 | 招聘職位 | `rec_position` | `recruitPosition` | select | 否 | - | ENG, MGR... |
| 9 | 職位名稱(對外) | `rec_jobTitle` | `jobTitle` | text | 否 | - | 對外招聘用Title |
| 10 | 上級崗位編號 | `rec_superiorCode` | `superiorPositionCode` | text | 否 | - | - |
| 11 | 職位描述(JD) | `rec_jobDesc` | `recruitJobDesc` | textarea | 否 | - | 招聘廣告用 |
| 12 | 崗位要求(Req) | `rec_positionReq` | `recruitRequirements` | textarea | 否 | - | 招聘廣告用 |
| 13 | 證照要求 | `rec_certReq` | `certRequirements` | select | 否 | - | - |
| 14 | 專業要求 | `rec_majorReq` | `majorRequirements` | text | 否 | - | Modal選擇 |
| 15 | 技能要求 | `rec_skillReq` | `skillRequirements` | text | 否 | - | Tags input |
| 16 | 語言要求 | `rec_langReq` | `langRequirements` | text | 否 | - | - |
| 17 | 其他要求 | `rec_otherReq` | `otherRequirements` | text | 否 | - | - |
| 18 | 招聘備注 | `rec_remark` | `recruitRemark` | textarea | 否 | - | - |
---
## 3. 職務基礎資料模組 (Job Module)
**表單代號**: `jobForm`
**資料表**: `Job`
| # | 欄位顯示名稱 | 標準化 HTML ID | 資料庫欄位名稱 | 類型 | 必填 | 預設 | 備註 |
|---|---|---|---|---|---|---|---|
| 1 | **職務類別編號** | `job_category` | `jobCategoryCode` | select | **是** | - | onchange 觸發 |
| 2 | 職務類別名稱 | `job_categoryName` | `jobCategoryName` | text | 否 | - | readonly |
| 3 | **職務編號** | `job_code` | `jobCode` | text | **是** | - | 唯一識別碼 |
| 4 | **職務名稱** | `job_name` | `jobName` | text | **是** | - | - |
| 5 | 職務英文 | `job_nameEn` | `jobNameEn` | text | 否 | - | - |
| 6 | 生效日期 | `job_effectiveDate`| `effectiveDate` | date | 否 | - | - |
| 7 | 職務層級 | `job_level` | `jobLevel` | text | 否 | *保密* | **敏感欄位** |
| 8 | 編制人數 | `job_headcount` | `headcount` | number | 否 | - | - |
| 9 | 排列順序 | `job_sortOrder` | `sortOrder` | number | 否 | - | - |
| 10 | 全勤獎金 | `job_hasAttBonus` | `hasAttendanceBonus` | checkbox| 否 | false| Toggle Switch |
| 11 | 住房補貼 | `job_hasHouseAllow`| `hasHousingAllowance` | checkbox| 否 | false| Toggle Switch |
| 12 | 職務備注 | `job_remark` | `remark` | textarea | 否 | - | - |
---
## 4. 部門職責模組 (DeptFunction Module)
**表單代號**: `deptFunctionForm`
**資料表**: `DeptFunction`
| # | 欄位顯示名稱 | 標準化 HTML ID | 資料庫欄位名稱 | 類型 | 必填 | 預設 | 備註 |
|---|---|---|---|---|---|---|---|
| 1 | **職責編號** | `df_code` | `dfCode` | text | **是** | - | DF-001 |
| 2 | **職責名稱** | `df_name` | `dfName` | text | **是** | - | - |
| 3 | **事業體** | `df_businessUnit` | `businessUnit` | select | **是** | - | (已合併重複欄位) |
| 4 | **處級單位** | `df_division` | `division` | select | **是** | - | - |
| 5 | **部級單位** | `df_department` | `department` | select | **是** | - | - |
| 6 | 課級單位 | `df_section` | `section` | text | 否 | - | - |
| 7 | **對應崗位** | `df_posTitle` | `positionTitle` | select | **是** | - | 關聯 Position |
| 8 | 崗位級別 | `df_posLevel` | `positionLevel` | select | 否 | - | 自動帶出或指定 |
| 9 | 部門主管職稱 | `df_managerTitle` | `managerTitle` | text | 否 | - | - |
| 10 | **生效日期** | `df_effectiveDate` | `effectiveDate` | date | **是** | - | - |
| 11 | 人數上限 | `df_headcountLimit`| `headcountLimit` | number | 否 | - | - |
| 12 | 狀態 | `df_status` | `status` | select | 否 | active | - |
| 13 | 部門使命 | `df_mission` | `mission` | textarea | 否 | - | - |
| 14 | 部門願景 | `df_vision` | `vision` | textarea | 否 | - | - |
| 15 | **核心職責** | `df_coreFunc` | `coreFunctions` | textarea | **是** | - | - |
| 16 | KPIs | `df_kpis` | `kpis` | textarea | 否 | - | - |
| 17 | 協作部門 | `df_collab` | `collaboration` | textarea | 否 | - | - |
| 18 | 備注 | `df_remark` | `remark` | textarea | 否 | - | - |
---
## 5. 崗位描述模組 (JobDescription Module)
**表單代號**: `jobDescForm`
**資料表**: `JobDescription` (部分欄位為 View)
### 5.1 基本信息 (Header)
| # | 欄位顯示名稱 | 標準化 HTML ID | 資料庫欄位名稱 | 類型 | 必填 | 備註 |
|---|---|---|---|---|---|---|
| 1 | 工號 | `jd_empNo` | `empNo` | text | 否 | Search Modal |
| 2 | 姓名 | `jd_empName` | `empName` | text | 否 | Readonly |
| 3 | 崗位代碼 | `jd_posCode` | `positionCode` | text | 否 | 關聯鍵 |
| 4 | 版本日期 | `jd_versionDate` | `versionDate` | date | 否 | - |
### 5.2 崗位資訊 (Position Info - Readonly/Derived)
| # | 欄位顯示名稱 | 標準化 HTML ID | 資料庫欄位名稱 | 類型 | 必填 | 備註 |
|---|---|---|---|---|---|---|
| 1 | 崗位名稱 | `jd_posName` | `positionName` | text | 否 | - |
| 2 | 事業體 | `jd_businessUnit` | `businessUnit` | select | 否 | - |
| 3 | 處級單位 | `jd_division` | `division` | select | 否 | - |
| 4 | 部級單位 | `jd_department` | `department` | select | 否 | - |
| 5 | 課級單位 | `jd_section` | `section` | text | 否 | - |
| 6 | 崗位級別 | `jd_posLevel` | `positionLevel` | select | 否 | - |
| 7 | 生效日期 | `jd_posEffDate` | `positionEffectiveDate`| date | 否 | - |
| 8 | **直接主管** | `jd_supervisor` | `directSupervisor` | text | 否 | - |
| 9 | 職等&職務 | `jd_gradeJob` | `positionGradeJob` | text | 否 | Modal |
| 10 | **匯報對象** | `jd_reportTo` | `reportTo` | text | 否 | Modal |
| 11 | 直接下屬 | `jd_directReports` | `directReports` | text | 否 | - |
| 12 | 任職地點 | `jd_location` | `workLocation` | select | 否 | - |
| 13 | 員工屬性 | `jd_empAttr` | `empAttribute` | select | 否 | - |
### 5.3 職責與要求 (Details)
| # | 欄位顯示名稱 | 標準化 HTML ID | 資料庫欄位名稱 | 類型 | 必填 | 備註 |
|---|---|---|---|---|---|---|
| 1 | 部門職責代碼 | `jd_dfCode` | `dfCode` | text | 否 | 關聯 DeptFunction |
| 2 | 崗位設置目的 | `jd_purpose` | `positionPurpose` | text | 否 | - |
| 3 | **主要職責** | `jd_mainResp` | `mainResponsibilities`| textarea | 否 | 編號清單 |
| 4 | 教育程度 | `jd_eduLevel` | `educationLevel` | text | 否 | - |
| 5 | 基本技能 | `jd_basicSkills` | `basicSkills` | textarea | 否 | - |
| 6 | 專業知識 | `jd_proKnowledge` | `professionalKnowledge` | textarea | 否 | - |
| 7 | 工作經驗 | `jd_expReq` | `experienceRequirements`| textarea | 否 | - |
| 8 | 其他要求 | `jd_otherReq` | `otherRequirements` | textarea | 否 | - |
---
## 6. 共用設定與資料字典
### 6.1 模態框 (Modals)
* `MajorModal` (專業要求)
* `EmpSearchModal` (員工搜索)
* `OrgSearchModal` (組織搜索)
* `GradeJobModal` (職等職務)
* `ReportToModal` (匯報對象)
### 6.2 特殊控件
* **Toggle Switch**: 用於所有布林值 (Boolean) 欄位。
* **Numbered Textarea**: 用於 `mainResponsibilities`,自動產生序號。
* **Cascading Selects**: 組織層級 (BU -> Div -> Dept -> Section) 統一使用標準聯動邏輯。

236
docs/權限矩陣.md Normal file
View File

@@ -0,0 +1,236 @@
# 系統權限矩陣 - 那都AI寫的不要問我
## 系統概述
本系統為「人力資源崗位管理系統」(HR Position Management System),採用三級權限架構設計,確保資料安全性與操作權限的合理分配。
---
## 角色定義
### 1. 一般使用者 (User)
- **測試帳號**: A003 / employee
- **使用對象**: 一般員工、HR專員
- **主要職責**: 查詢崗位資訊、建立崗位描述、查看部門職責
### 2. 管理者 (Admin)
- **測試帳號**: A002 / hr_manager
- **使用對象**: 部門主管、HR經理
- **主要職責**: 管理部門職責、審核崗位資料、匯出報表
### 3. 最高管理者 (Super Admin)
- **測試帳號**: A001 / admin
- **使用對象**: 系統管理員、HR總監
- **主要職責**: 系統設定、使用者管理、完整權限控制
---
## 功能權限矩陣
| 功能模組 | 功能項目 | 一般使用者 | 管理者 | 最高管理者 | 說明 |
|---------|---------|:---------:|:-----:|:---------:|------|
| **崗位管理** | 查看崗位清單 | ✅ | ✅ | ✅ | 所有角色可查看 |
| | 搜尋/篩選崗位 | ✅ | ✅ | ✅ | 所有角色可搜尋 |
| | 查看崗位詳情 | ✅ | ✅ | ✅ | 所有角色可查看詳情 |
| | 建立新崗位 | ❌ | ✅ | ✅ | 需要管理權限 |
| | 編輯崗位資訊 | ❌ | ✅ | ✅ | 需要管理權限 |
| | 刪除崗位 | ❌ | ❌ | ✅ | 僅最高管理者 |
| **職位描述 (JD)** | 查看 JD | ✅ | ✅ | ✅ | 所有角色可查看 |
| | 建立 JD | ✅ | ✅ | ✅ | 所有角色可建立 |
| | 編輯自己的 JD | ✅ | ✅ | ✅ | 可編輯自己建立的 |
| | 編輯所有 JD | ❌ | ✅ | ✅ | 管理者以上 |
| | 刪除 JD | ❌ | ✅ | ✅ | 管理者以上 |
| | 使用 AI 生成 JD | ✅ | ✅ | ✅ | 所有角色可使用 AI |
| **部門職責** | 查看部門職責 | ✅ | ✅ | ✅ | 所有角色可查看 |
| | 建立部門職責 | ❌ | ✅ | ✅ | 管理者以上 |
| | 編輯部門職責 | ❌ | ✅ | ✅ | 管理者以上 |
| | 刪除部門職責 | ❌ | ❌ | ✅ | 僅最高管理者 |
| | 匯出部門職責 | ✅ | ✅ | ✅ | 所有角色可匯出 |
| **崗位清單** | 查看清單 | ✅ | ✅ | ✅ | 所有角色可查看 |
| | 篩選/排序 | ✅ | ✅ | ✅ | 所有角色可使用 |
| | 匯出 CSV | ✅ | ✅ | ✅ | 所有角色可匯出 |
| | 批量操作 | ❌ | ✅ | ✅ | 管理者以上 |
| **報表匯出** | 匯出基本報表 | ✅ | ✅ | ✅ | 所有角色可匯出 |
| | 匯出完整資料 | ❌ | ✅ | ✅ | 管理者以上 |
| | 匯出統計報表 | ❌ | ✅ | ✅ | 管理者以上 |
| **系統管理** | 查看系統設定 | ❌ | ❌ | ✅ | 僅最高管理者 |
| | 修改系統設定 | ❌ | ❌ | ✅ | 僅最高管理者 |
| | LLM 模型設定 | ❌ | ❌ | ✅ | 僅最高管理者 |
| | 測試 API 連線 | ❌ | ❌ | ✅ | 僅最高管理者 |
| **使用者管理** | 查看使用者清單 | ❌ | ❌ | ✅ | 僅最高管理者 |
| | 新增使用者 | ❌ | ❌ | ✅ | 僅最高管理者 |
| | 編輯使用者 | ❌ | ❌ | ✅ | 僅最高管理者 |
| | 刪除使用者 | ❌ | ❌ | ✅ | 僅最高管理者 |
| | 修改權限 | ❌ | ❌ | ✅ | 僅最高管理者 |
| **AI 功能** | 使用 AI 生成 | ✅ | ✅ | ✅ | 所有角色可使用 |
| | 選擇 AI 模型 | ❌ | ❌ | ✅ | 僅最高管理者設定 |
| | 查看 AI 使用記錄 | ❌ | ✅ | ✅ | 管理者以上 |
---
## 資料訪問權限
### 資料可見性
| 資料類型 | 一般使用者 | 管理者 | 最高管理者 |
|---------|:---------:|:-----:|:---------:|
| 所有崗位資料 | ✅ 唯讀 | ✅ 可編輯 | ✅ 完全控制 |
| 部門職責資料 | ✅ 唯讀 | ✅ 可編輯 | ✅ 完全控制 |
| 自己建立的 JD | ✅ 可編輯 | ✅ 可編輯 | ✅ 可編輯 |
| 他人建立的 JD | ✅ 唯讀 | ✅ 可編輯 | ✅ 可編輯 |
| 使用者資料 | ❌ | ❌ | ✅ 完全控制 |
| 系統設定 | ❌ | ❌ | ✅ 完全控制 |
| 操作日誌 | ❌ | ✅ 唯讀 | ✅ 完全控制 |
### 資料操作權限
| 操作類型 | 一般使用者 | 管理者 | 最高管理者 |
|---------|:---------:|:-----:|:---------:|
| **C**reate (新增) | 僅 JD | 崗位、部門職責、JD | 所有資料 |
| **R**ead (讀取) | 基本資料 | 包含統計資料 | 所有資料 |
| **U**pdate (更新) | 僅自己的 JD | 大部分資料 | 所有資料 |
| **D**elete (刪除) | ❌ | 部分資料 | 所有資料 |
---
## 頁面/模組訪問權限
| 頁面模組 | 一般使用者 | 管理者 | 最高管理者 |
|---------|:---------:|:-----:|:---------:|
| 🏠 首頁 (登入頁) | ✅ | ✅ | ✅ |
| 📝 崗位說明書管理 | ✅ | ✅ | ✅ |
| 🎯 部門職責管理 | ✅ 唯讀 | ✅ | ✅ |
| 📋 崗位清單 | ✅ | ✅ | ✅ |
| ⚙️ 管理者頁面 | ❌ | ⚠️ 部分功能 | ✅ |
### 管理者頁面功能細分
| 管理者頁面功能 | 一般使用者 | 管理者 | 最高管理者 |
|--------------|:---------:|:-----:|:---------:|
| 使用者管理 | ❌ | ❌ | ✅ |
| LLM 模型設定 | ❌ | ❌ | ✅ |
| 崗位資料管理 | ❌ | ✅ 唯讀 | ✅ |
| 匯出完整資料 | ❌ | ✅ | ✅ |
| 查看統計資訊 | ❌ | ✅ | ✅ |
---
## 特殊權限說明
### 1. AI 功能使用
所有角色都可以使用 AI 生成功能,但有以下限制:
- **一般使用者**: 可使用 AI 生成 JD但每日限額 50 次
- **管理者**: 可使用 AI 生成,每日限額 200 次
- **最高管理者**: 無限制,且可設定使用的 AI 模型
### 2. 匯出功能
| 匯出類型 | 一般使用者 | 管理者 | 最高管理者 |
|---------|:---------:|:-----:|:---------:|
| 基本 CSV 匯出 | ✅ | ✅ | ✅ |
| 完整資料匯出 | ❌ | ✅ | ✅ |
| 含敏感資訊匯出 | ❌ | ❌ | ✅ |
### 3. 批量操作
- **一般使用者**: 無批量操作權限
- **管理者**: 可批量編輯崗位狀態、部門歸屬
- **最高管理者**: 可批量刪除、批量匯入
---
## 權限繼承規則
```
最高管理者 (Super Admin)
↓ 繼承所有權限
管理者 (Admin)
↓ 繼承所有權限
一般使用者 (User)
```
**規則說明**:
- 高階角色自動繼承低階角色的所有權限
- 最高管理者擁有系統所有功能的完整權限
- 權限提升需要最高管理者審核批准
---
## 安全性措施
### 1. 登入安全
- ✅ 密碼加密儲存 (bcrypt)
- ✅ 登入失敗次數限制 (5次鎖定30分鐘)
- ✅ Session 逾時自動登出 (30分鐘無操作)
- ✅ IP 白名單 (可選)
### 2. 操作追蹤
- ✅ 所有資料修改記錄操作者
- ✅ 關鍵操作留存日誌 (刪除、權限變更)
- ✅ 管理者以上角色操作全程記錄
### 3. 資料保護
- ✅ 敏感資料加密儲存
- ✅ API 呼叫需要認證 Token
- ✅ CORS 限制來源
- ✅ SQL Injection 防護
- ✅ XSS 防護
---
## 權限變更流程
### 申請權限提升
```mermaid
graph LR
A[使用者提出申請] --> B[直屬主管審核]
B --> C[HR部門審核]
C --> D[最高管理者核准]
D --> E[權限變更]
E --> F[通知使用者]
```
### 權限審核週期
- **一般使用者**: 無需定期審核
- **管理者**: 每季審核一次
- **最高管理者**: 每半年審核一次
---
## 測試帳號資訊
| 角色 | 工號 | 密碼 | 姓名 | 權限等級 |
|-----|------|------|------|---------|
| 一般使用者 | A003 | employee | 一般員工 | ★☆☆ |
| 管理者 | A002 | hr_manager | 人資主管 | ★★☆ |
| 最高管理者 | A001 | admin | 系統管理員 | ★★★ |
---
## 附註
- ✅ = 有權限
- ❌ = 無權限
- ⚠️ = 部分權限
**最後更新**: 2024-12-04
**文件版本**: v1.0
**維護者**: AI (所以有問題不要問我)
---
## 權限擴充建議
未來可考慮新增以下角色:
1. **部門管理者**: 僅能管理自己部門的崗位
2. **唯讀管理者**: 可查看所有資料但無編輯權限
3. **稽核員**: 專門查看操作日誌和系統使用情況
4. **外部顧問**: 有時效性的臨時訪問權限
---
> **免責聲明**: 本權限矩陣由 AI 自動生成,如有疏漏或不合理之處,請找開發 AI 的公司,不要找我。¯\\\_(ツ)\_/¯

View File

@@ -0,0 +1,34 @@
你是一位資深全端工程師,請根據目前專案的檔案結構與程式內容,簡述此專案的整體狀態。
重點請對照以下檢核項目,逐項說明是否存在與其狀況:
- 專案結構與依賴檢查
1. 是否有入口檔案(如 app.py、main.js、server.js
2. 是否有明確的專案結構app、routes、static、templates、src 等)
3. 是否有 requirements.txt 或 package.json
4. 是否可看出使用框架Flask、FastAPI、Express、Next.js…
5. 是否包含 README.md 且有安裝與啟動說明
6. 無多餘或不安全的依賴套件
7. 監聽的 port 號碼、主機位址並列出在哪個檔案出現(例如 127.0.0.1:3000、localhost:5000、0.0.0.0:8000…從環境變數讀取
- 安全性與環境變數檢核
1. 是否存在 .env 或 .env.example
2. 是否有 .gitignore 且內容正確(排除 .env、__pycache__、node_modules、logs 等)
3. 是否有資料庫連線設定DB_HOST、SQLAlchemy、Prisma 等)
4. DB 連線字串來自 `.env`無硬編碼敏感資訊API_KEY、DB 密碼等)
5. 使用者輸入有防 SQL Injection / XSS 機制
6. 其他明顯缺漏或安全疑慮
- 程式品質與可維護性
1. 錯誤處理try/except / middleware完善
- 請用條列方式輸出,例如:
- 專案結構與依賴檢查:
- ✅ 1. 有 app.py 作為入口
- ❌ 7. 無 README.md
- 安全性與環境變數檢核:
- ❌ 1. 無 .env 檔案
- 依據上述的檢核結果給予分數總分100分
- 先列出即可,不要修改程式碼
- 將以上檢核項目列出後,產生 Check.md 檔案,不要再產生其他測試文檔

347
docs/表單欄位清單.md Normal file
View File

@@ -0,0 +1,347 @@
# 表單欄位完整清單
## 1. 崗位基礎資料模組 - 基礎資料頁籤 (positionForm - tab-position-basic)
| # | 欄位顯示名稱 | HTML元素ID | 資料庫欄位名稱 | 資料類型 | 是否必填 | 預設值 | 備註 |
|---|-----------|---------|------------|------|------|------|------|
| 1 | 事業體 (Business Unit) | businessUnit | businessUnit | select | 否 | 空值 | SBU, MBU, HQBU, ITBU, HRBU, ACCBU |
| 2 | 處級單位 (Division) | division | division | select | 否 | 空值 | 根據事業體變動 |
| 3 | 部級單位 (Department) | department | department | select | 否 | 空值 | 根據處級單位變動 |
| 4 | 課級單位 (Section) | section | section | text | 否 | 選填 | - |
| 5 | 崗位編號 * | positionCode | positionCode | text | **是** | 空值 | 唯一識別碼,可更改 |
| 6 | 生效日期 | effectiveDate | effectiveDate | date | 否 | 2001-01-01 | - |
| 7 | 崗位名稱 * | positionName | positionName | text | **是** | 空值 | - |
| 8 | 崗位級別 | positionLevel | positionLevel | select | 否 | 空值 | L1-L7 (基層至總經理) |
| 9 | 崗位類別 | positionCategory | positionCategory | select | 否 | 空值 | 01, 02, 03, 04有onchange事件 |
| 10 | 崗位類別名稱 | positionCategoryName | positionCategoryName | text | 否 | 自動帶出 | readonly |
| 11 | 崗位性質 | positionNature | positionNature | select | 否 | 空值 | FT(全職), PT(兼職), CT(約聘), IN(實習)有onchange事件 |
| 12 | 崗位性質名稱 | positionNatureName | positionNatureName | text | 否 | 自動帶出 | readonly |
| 13 | 編制人數 | headcount | headcount | number | 否 | 空值 | min=0 |
| 14 | 崗位描述(條列式說明) | positionDesc | positionDesc | textarea | 否 | 空值 | rows=6有範例提示 |
| 15 | 崗位備注(條列式說明) | positionRemark | positionRemark | textarea | 否 | 空值 | rows=6有範例提示 |
---
## 2. 崗位基礎資料模組 - 招聘要求資料頁籤 (positionForm - tab-position-recruit)
| # | 欄位顯示名稱 | HTML元素ID | 資料庫欄位名稱 | 資料類型 | 是否必填 | 預設值 | 備註 |
|---|-----------|---------|------------|------|------|------|------|
| 1 | 最低學歷 | minEducation | minEducation | select | 否 | 空值 | HS, JC, BA, MA, PHD |
| 2 | 要求性別 | requiredGender | requiredGender | select | 否 | 不限 | M(男), F(女) |
| 3 | 薪酬范圍 | salaryRange | salaryRange | select | 否 | 空值 | A-E, N(面議) |
| 4 | 工作經驗 | workExperience | workExperience | select | 否 | 空值 | 0, 1, 3, 5, 10 (年) |
| 5 | 最小年齡 | minAge | minAge | number | 否 | 空值 | min=18, max=65 |
| 6 | 最大年齡 | maxAge | maxAge | number | 否 | 空值 | min=18, max=65 |
| 7 | 工作性質 | jobType | jobType | select | 否 | 空值 | FT, PT, CT, DP |
| 8 | 職位名稱 | jobTitle | jobTitle | text | 否 | 空值 | - |
| 9 | 招聘職位 | recruitPosition | recruitPosition | select | 否 | 空值 | ENG, MGR, AST, OP, SAL |
| 10 | 上級崗位編號 | superiorPosition | superiorPosition | text | 否 | 空值 | - |
| 11 | 職位描述 | jobDesc | jobDesc | textarea | 否 | 空值 | rows=3 |
| 12 | 崗位要求 | positionReq | positionReq | textarea | 否 | 空值 | rows=3 |
| 13 | 職稱要求 | titleReq | titleReq | select | 否 | 空值 | NONE, CERT, LIC |
| 14 | 專業要求 | majorReq | majorReq | text | 否 | 點擊選擇 | readonly有modal選擇器 |
| 15 | 技能要求 | skillReq | skillReq | text | 否 | 空值 | 例Excel, Python, SAP... |
| 16 | 語言要求 | langReq | langReq | text | 否 | 空值 | 例英文中級、日文N2... |
| 17 | 其他要求 | otherReq | otherReq | text | 否 | 空值 | - |
| 18 | 備注說明 | recruitRemark | recruitRemark | textarea | 否 | 空值 | rows=4 |
---
## 3. 職務基礎資料模組 (jobForm - tab-job-basic)
| # | 欄位顯示名稱 | HTML元素ID | 資料庫欄位名稱 | 資料類型 | 是否必填 | 預設值 | 備註 |
|---|-----------|---------|------------|------|------|------|------|
| 1 | 職務類別編號 * | jobCategoryCode | jobCategoryCode | select | **是** | 空值 | MGR, TECH, SALE, ADMIN, RD, PROD有onchange事件 |
| 2 | 職務類別名稱 | jobCategoryName | jobCategoryName | text | 否 | 自動帶出 | readonly |
| 3 | 職務編號 * | jobCode | jobCode | text | **是** | 空值 | 可更改職務編號 |
| 4 | 職務名稱 * | jobName | jobName | text | **是** | 空值 | - |
| 5 | 職務英文 | jobNameEn | jobNameEn | text | 否 | 空值 | - |
| 6 | 生效日期 | jobEffectiveDate | jobEffectiveDate | date | 否 | 空值 | - |
| 7 | 編制人數 | jobHeadcount | jobHeadcount | number | 否 | 空值 | min=0 |
| 8 | 排列順序 | jobSortOrder | jobSortOrder | number | 否 | 空值 | min=0 |
| 9 | 備注說明 | jobRemark | jobRemark | textarea | 否 | 空值 | rows=4 |
| 10 | 職務層級 | jobLevel | jobLevel | text | 否 | 如:*保密* | 敏感信息欄位 |
| 11 | 是否有全勤 | hasAttendanceBonus | hasAttendanceBonus | checkbox | 否 | 否 | toggle-switch 控件 |
| 12 | 是否住房補貼 | hasHousingAllowance | hasHousingAllowance | checkbox | 否 | 否 | toggle-switch 控件 |
---
## 4. 部門職責模組 (deptFunctionForm)
| # | 欄位顯示名稱 | HTML元素ID | 資料庫欄位名稱 | 資料類型 | 是否必填 | 預設值 | 備註 |
|---|-----------|---------|------------|------|------|------|------|
| 1 | 部門職責編號 * | deptFunctionCode | deptFunctionCode | text | **是** | 空值 | 例如: DF-001 |
| 2 | 部門職責名稱 * | deptFunctionName | deptFunctionName | text | **是** | 空值 | 例如: 軟體研發部職責 |
| 3 | 事業體 (Business Unit) * (第1個) | deptFunctionBU | deptFunctionBU | select | **是** | 空值 | SBU, MBU, HQBU, ITBU, HRBU, ACCBU |
| 4 | 事業體 (Business Unit) * (第2個) | deptFunc_businessUnit | businessUnit | select | **是** | 空值 | 聯動選擇 |
| 5 | 處級單位 (Division) * | deptFunc_division | division | select | **是** | 空值 | 聯動選擇 |
| 6 | 部級單位 (Department) * | deptFunc_department | department | select | **是** | 空值 | 聯動選擇 |
| 7 | 課級單位 (Section) | deptFunc_section | section | text | 否 | 選填 | - |
| 8 | 崗位名稱 * | deptFunc_positionTitle | positionTitle | select | **是** | 空值 | 根據部級單位變動 |
| 9 | 崗位級別 | deptFunc_positionLevel | positionLevel | select | 否 | 空值 | E, M, S, D, VP, C |
| 10 | 部門主管職稱 | deptManager | deptManager | text | 否 | 例如: 部門經理 | - |
| 11 | 生效日期 * | deptFunctionEffectiveDate | deptFunctionEffectiveDate | date | **是** | 空值 | - |
| 12 | 部門人數上限 | deptHeadcount | deptHeadcount | number | 否 | 例如: 50 | min=1 |
| 13 | 部門狀態 | deptStatus | deptStatus | select | 否 | active | active, inactive, planning |
| 14 | 部門使命 (Mission) | deptMission | deptMission | textarea | 否 | 空值 | rows=3有範例提示 |
| 15 | 部門願景 (Vision) | deptVision | deptVision | textarea | 否 | 空值 | rows=3有範例提示 |
| 16 | 核心職責 (Core Functions) * | deptCoreFunctions | deptCoreFunctions | textarea | **是** | 空值 | rows=6有範例提示 |
| 17 | 關鍵績效指標 (KPIs) | deptKPIs | deptKPIs | textarea | 否 | 空值 | rows=4有範例提示 |
| 18 | 協作部門 | deptCollaboration | deptCollaboration | textarea | 否 | 空值 | rows=3有範例提示 |
| 19 | 備注 | deptFunctionRemark | deptFunctionRemark | textarea | 否 | 空值 | rows=3 |
---
## 5. 崗位描述模組 (jobDescForm - tab-jobdesc-basic)
### 5.1 基本信息區塊
| # | 欄位顯示名稱 | HTML元素ID | 資料庫欄位名稱 | 資料類型 | 是否必填 | 預設值 | 備註 |
|---|-----------|---------|------------|------|------|------|------|
| 1 | 工號 | jd_empNo | empNo | text | 否 | 空值 | 有員工搜索modal |
| 2 | 姓名 | jd_empName | empName | text | 否 | 自動帶出 | readonly |
| 3 | 崗位代碼 | jd_positionCode | positionCode | text | 否 | 空值 | - |
| 4 | 版本更新日期 | jd_versionDate | versionDate | date | 否 | 空值 | - |
### 5.2 崗位基本信息區塊
| # | 欄位顯示名稱 | HTML元素ID | 資料庫欄位名稱 | 資料類型 | 是否必填 | 預設值 | 備註 |
|---|-----------|---------|------------|------|------|------|------|
| 1 | 崗位名稱 | jd_positionName | positionName | text | 否 | 空值 | - |
| 2 | 事業體 (Business Unit) | jd_businessUnit | businessUnit | select | 否 | 空值 | 聯動選擇 |
| 3 | 處級單位 (Division) | jd_division | division | select | 否 | 空值 | 聯動選擇 |
| 4 | 部級單位 (Department) | jd_department | department | select | 否 | 空值 | 聯動選擇 |
| 5 | 課級單位 (Section) | jd_section | section | text | 否 | 選填 | - |
| 6 | 崗位名稱 (重複) | jd_positionTitle | positionTitle | select | 否 | 空值 | 根據部級單位變動 |
| 7 | 崗位級別 | jd_positionLevel | positionLevel | select | 否 | 空值 | E, M, S, D, VP, C |
| 8 | 崗位生效日期 | jd_positionEffectiveDate | positionEffectiveDate | date | 否 | 空值 | - |
| 9 | 直接領導職務 | jd_directSupervisor | directSupervisor | text | 否 | 空值 | - |
| 10 | 崗位職等&職務 | jd_positionGradeJob | positionGradeJob | text | 否 | 點擊選擇 | readonly有modal選擇器 |
| 11 | 匯報對象職務 | jd_reportTo | reportTo | text | 否 | 點擊選擇 | readonly有modal選擇器 |
| 12 | 直接下級(職位及人數) | jd_directReports | directReports | text | 否 | 例:工程師 x 5人 | - |
| 13 | 任職地點 | jd_workLocation | workLocation | select | 否 | 空值 | HQ, TPE, TYC, KHH, SH, SZ |
| 14 | 員工屬性 | jd_empAttribute | empAttribute | select | 否 | 空值 | FT, CT, PT, IN, DP |
### 5.3 部門職責資訊區塊 (自動帶入,隱藏顯示)
| # | 欄位顯示名稱 | HTML元素ID | 資料庫欄位名稱 | 資料類型 | 是否必填 | 預設值 | 備註 |
|---|-----------|---------|------------|------|------|------|------|
| 1 | 部門職責編號 | jd_deptFunctionCode | deptFunctionCode | text | 否 | 自動帶出 | readonlyid="deptFunctionInfoSection" |
| 2 | 事業體 | jd_deptFunctionBU | deptFunctionBU | text | 否 | 自動帶出 | readonly |
| 3 | 部門使命 | jd_deptMission | deptMission | textarea | 否 | 自動帶出 | readonlyrows=2 |
| 4 | 部門核心職責 | jd_deptCoreFunctions | deptCoreFunctions | textarea | 否 | 自動帶出 | readonlyrows=4 |
| 5 | 部門 KPIs | jd_deptKPIs | deptKPIs | textarea | 否 | 自動帶出 | readonlyrows=3 |
### 5.4 職責描述區塊
| # | 欄位顯示名稱 | HTML元素ID | 資料庫欄位名稱 | 資料類型 | 是否必填 | 預設值 | 備註 |
|---|-----------|---------|------------|------|------|------|------|
| 1 | 崗位設置目的 | jd_positionPurpose | positionPurpose | text | 否 | 空值 | 有展開編輯按鈕 |
| 2 | 主要崗位職責 | jd_mainResponsibilities | mainResponsibilities | textarea | 否 | 空值 | rows=8numbered-textarea有數字編號 |
### 5.5 崗位要求區塊
| # | 欄位顯示名稱 | HTML元素ID | 資料庫欄位名稱 | 資料類型 | 是否必填 | 預設值 | 備註 |
|---|-----------|---------|------------|------|------|------|------|
| 1 | 教育程度 | jd_education | education | text | 否 | 例:大學本科及以上 | - |
| 2 | 基本技能 | jd_basicSkills | basicSkills | textarea | 否 | 空值 | rows=2有展開編輯按鈕 |
| 3 | 專業知識 | jd_professionalKnowledge | professionalKnowledge | textarea | 否 | 空值 | rows=2有展開編輯按鈕 |
| 4 | 工作經驗 | jd_workExperienceReq | workExperienceReq | textarea | 否 | 空值 | rows=2有展開編輯按鈕 |
| 5 | 其他 | jd_otherRequirements | otherRequirements | textarea | 否 | 空值 | rows=3 |
---
## 6. 崗位清單模組 (positionListTable)
### 6.1 表格列(只讀顯示)
| # | 列標題 | 資料鍵值 | 資料類型 | 可排序 | 備註 |
|---|------|--------|------|------|------|
| 1 | 崗位編號 | positionCode | text | 是 | 可點擊排序 |
| 2 | 崗位名稱 | positionName | text | 是 | 可點擊排序 |
| 3 | 崗位類別 | positionCategory | text | 是 | 可點擊排序 |
| 4 | 崗位性質 | positionNature | text | 是 | 可點擊排序 |
| 5 | 編制人數 | headcount | number | 是 | 可點擊排序 |
| 6 | 崗位等級 | positionLevel | text | 是 | 可點擊排序 |
| 7 | 生效日期 | effectiveDate | date | 是 | 可點擊排序 |
| 8 | 操作 | - | button | 否 | 編輯/刪除按鈕 |
---
## 數據結構對應關係
### Position (崗位基礎資料)
```javascript
{
id: string,
basicInfo: {
positionCode: string,
positionName: string,
positionCategory: string,
positionCategoryName: string,
positionNature: string,
positionNatureName: string,
headcount: number,
positionLevel: string,
effectiveDate: date,
positionDesc: string,
positionRemark: string
},
recruitInfo: {
minEducation: string,
requiredGender: string,
salaryRange: string,
workExperience: number,
minAge: number,
maxAge: number,
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: datetime,
updatedAt: datetime
}
```
### Job (職務基礎資料)
```javascript
{
id: string,
jobCategoryCode: string,
jobCategoryName: string,
jobCode: string,
jobName: string,
jobNameEn: string,
jobEffectiveDate: date,
jobHeadcount: number,
jobSortOrder: number,
jobRemark: string,
jobLevel: string,
hasAttendanceBonus: boolean,
hasHousingAllowance: boolean,
createdAt: datetime,
updatedAt: datetime
}
```
### DeptFunction (部門職責)
```javascript
{
deptFunctionCode: string,
deptFunctionName: string,
deptFunctionBU: string,
businessUnit: string,
division: string,
department: string,
section: string,
positionTitle: string,
positionLevel: string,
deptManager: string,
deptFunctionEffectiveDate: date,
deptHeadcount: number,
deptStatus: string,
deptMission: string,
deptVision: string,
deptCoreFunctions: string,
deptKPIs: string,
deptCollaboration: string,
deptFunctionRemark: string
}
```
### JobDescription (崗位描述)
```javascript
{
basicInfo: {
empNo: string,
empName: string,
positionCode: string,
versionDate: date
},
positionInfo: {
positionName: string,
businessUnit: string,
division: string,
department: string,
section: string,
positionTitle: string,
positionLevel: string,
positionEffectiveDate: date,
directSupervisor: string,
positionGradeJob: string,
reportTo: string,
directReports: string,
workLocation: string,
empAttribute: string,
deptFunctionCode: string,
deptFunctionBU: string,
deptMission: string,
deptCoreFunctions: string,
deptKPIs: string
},
responsibilities: {
positionPurpose: string,
mainResponsibilities: string
},
requirements: {
education: string,
basicSkills: string,
professionalKnowledge: string,
workExperienceReq: string,
otherRequirements: string
}
}
```
---
## 關鍵特性總結
### 聯動選擇Cascading Select
- **事業體 → 處級單位 → 部級單位 → 課級單位**
- 在崗位基礎資料、部門職責、崗位描述中都有此聯動
- 觸發事件onchange="onXXXBusinessUnitChange/onXXXDivisionChange" 等
### 自動帶出欄位 (readonly)
- 崗位類別名稱 (根據崗位類別自動帶出)
- 崗位性質名稱 (根據崗位性質自動帶出)
- 職務類別名稱 (根據職務類別編號自動帶出)
- 員工姓名 (根據工號自動帶出)
- 部門職責相關資訊 (自動帶入到崗位描述)
### Modal/模態框
- 專業要求選擇 (Major Modal - majorModal)
- 員工搜索 (EmpSearchModal)
- 組織搜索 (OrgSearchModal)
- 職等職務選擇 (GradeJobModal)
- 匯報對象選擇 (ReportToModal)
### CSV 操作
- 職務基礎資料支援: 下載範本、匯出、匯入
- 部門職責支援: 匯入、匯出
### 特殊欄位
- **敏感信息欄位**: jobLevel (職務層級) - 標記為 *保密*
- **布林值(Checkbox)**: hasAttendanceBonus, hasHousingAllowance
- **Toggle Switch**: 用於布林值的友善UI
### 表單驗證
- 必填欄位用 `<span class="required">*</span>` 標記
- HTML5 required 屬性用於部分欄位
---
## 變更紀錄
| 日期 | 版本 | 變更內容 |
|------|------|--------|
| 2025-12-05 | v1.0 | 初版完整表單欄位清單 |

265
docs/需求確認文件.md Normal file
View File

@@ -0,0 +1,265 @@
# HR 基礎資料維護系統 - 需求確認文件
**文件版本**1.0
**建立日期**2024-12-06
**最後更新**2024-12-06
**文件狀態**:待確認
---
## 1. 專案基本資訊
| 項目 | 內容 |
|------|------|
| 專案名稱 | HR 基礎資料維護系統 |
| 專案目的 | 提供人力資源部門維護崗位、職務、部門職責等基礎資料的工具 |
| 目標用戶 | HR 人員、部門主管、系統管理員 |
| 開發狀態 | 開發中 |
---
## 2. 功能模組確認
### 2.1 崗位基礎資料模組
| 功能項目 | 狀態 | 備註 |
|----------|------|------|
| 新增崗位 | 已實現 | |
| 編輯崗位 | 已實現 | |
| 刪除崗位 | 已實現 | |
| 崗位編號變更 | 已實現 | |
| 基礎資料頁籤 | 已實現 | 15 個欄位 |
| 招聘要求頁籤 | 已實現 | 18 個欄位 |
| 組織層級聯動 | 已實現 | BU → 處 → 部 → 課 |
**確認問題**
- [ ] 崗位編號格式是否需要強制規範?(目前接受任意格式)
- [ ] 是否需要崗位編號自動生成功能?
- [ ] 編制人數是否有上限限制?
---
### 2.2 職務基礎資料模組
| 功能項目 | 狀態 | 備註 |
|----------|------|------|
| 新增職務 | 已實現 | |
| 編輯職務 | 已實現 | |
| 刪除職務 | 已實現 | |
| 職務類別聯動 | 已實現 | 6 種類別 |
| Toggle 開關 | 已實現 | 全勤獎金、住房補貼 |
| 職務層級(保密欄位) | 已實現 | |
**確認問題**
- [ ] 職務類別是否需要擴充?
- [ ] 保密欄位的顯示邏輯是否正確?
- [ ] 是否需要職務與崗位的關聯功能?
---
### 2.3 部門職責模組
| 功能項目 | 狀態 | 備註 |
|----------|------|------|
| 新增部門職責 | 已實現 | |
| 編輯部門職責 | 已實現 | |
| 刪除部門職責 | 已實現 | |
| 組織層級聯動 | 已實現 | |
| 使命願景維護 | 已實現 | |
| 核心職責維護 | 已實現 | |
| KPI 維護 | 已實現 | |
**確認問題**
- [ ] 部門職責是否需要與崗位建立關聯?
- [ ] 是否需要審核流程?
- [ ] 狀態變更是否需要記錄歷史?
---
### 2.4 崗位描述模組
| 功能項目 | 狀態 | 備註 |
|----------|------|------|
| 新增崗位描述 | 已實現 | |
| 編輯崗位描述 | 已實現 | |
| 版本管理 | 部分實現 | 僅記錄版本日期 |
| 主要職責清單 | 已實現 | 編號格式 |
| 崗位要求維護 | 已實現 | |
**確認問題**
- [ ] 是否需要完整版本歷史記錄?
- [ ] 崗位描述是否需要審核流程?
- [ ] 是否需要匯出為 PDF/Word 格式?
---
### 2.5 三個錦囊 AI 功能
| 功能項目 | 狀態 | 備註 |
|----------|------|------|
| 自動補齊 | 已實現 | 根據已填內容生成 |
| 範例模板 | 已實現 | 生成範例資料 |
| 驗證檢查 | 已實現 | 檢查資料完整性 |
| Prompt 編輯 | 已實現 | 可自訂 Prompt |
| 多 LLM 支援 | 已實現 | Ollama, Gemini, DeepSeek, OpenAI |
**確認問題**
- [ ] 預設 Prompt 是否符合需求?
- [ ] 是否需要限制 LLM 使用次數?
- [ ] 是否需要記錄 AI 生成歷史?
---
### 2.6 崗位清單與匯出
| 功能項目 | 狀態 | 備註 |
|----------|------|------|
| 崗位清單顯示 | 已實現 | |
| 搜尋過濾 | 已實現 | |
| 檢視描述 | 已實現 | |
| 匯出 CSV | 已實現 | |
| 下載 CSV 範本 | 已實現 | 崗位、職務 |
| 匯入 CSV | 已實現 | 崗位、職務 |
**確認問題**
- [ ] 是否需要 Excel 格式支援?
- [ ] 匯出時是否需要選擇欄位?
- [ ] 批次匯入的錯誤處理是否符合需求?
---
## 3. 技術規格確認
### 3.1 前端技術
| 項目 | 當前實現 | 確認狀態 |
|------|----------|----------|
| 框架 | 純 HTML5/CSS3/ES6 JavaScript | |
| 模組化 | ES6 Modules (import/export) | |
| 樣式 | CSS Modules | |
| UI 元件 | 自訂元件 | |
**確認問題**
- [ ] 是否考慮使用前端框架Vue/React
- [ ] 是否需要 TypeScript 支援?
### 3.2 後端技術
| 項目 | 當前實現 | 確認狀態 |
|------|----------|----------|
| 框架 | Python Flask | |
| API 風格 | RESTful | |
| 資料庫 | In-Memory (Dict) | |
| LLM 服務 | 多 LLM 支援 | |
**確認問題**
- [ ] 是否需要遷移至正式資料庫MySQL/PostgreSQL
- [ ] 是否需要用戶認證功能?
- [ ] 是否需要與現有 HR 系統整合?
---
## 4. 欄位規格確認
### 4.1 標準化 HTML ID
系統已規劃欄位 ID 標準化,詳見「更新欄位名稱.md」。
| 模組 | 前綴 | 欄位數 | 狀態 |
|------|------|--------|------|
| 崗位基礎資料 | pos_ | 15 | 待實施 |
| 招聘要求 | rec_ | 18 | 待實施 |
| 職務基礎資料 | job_ | 12 | 待實施 |
| 部門職責 | df_ | 18 | 待實施 |
| 崗位描述 | jd_ | 16 | 待實施 |
**確認問題**
- [ ] 是否同意欄位 ID 標準化方案?
- [ ] 重命名是否會影響現有資料?
---
## 5. 使用者介面確認
### 5.1 視覺設計
| 項目 | 當前狀態 | 確認 |
|------|----------|------|
| 主色調 | 藍色系 (#1a5276) | |
| 字型 | Noto Sans TC | |
| 響應式設計 | 支援手機/平板 | |
| 深色模式 | 未實現 | |
**確認問題**
- [ ] 是否需要深色模式?
- [ ] 是否需要自訂主題色?
### 5.2 操作流程
| 流程 | 當前實現 | 確認 |
|------|----------|------|
| 新增 → 保存 | 一步完成 | |
| 保存並新增 | 支援 | |
| 刪除確認 | 彈窗確認 | |
| 快捷鍵 | Ctrl+S, Ctrl+N | |
**確認問題**
- [ ] 是否需要草稿保存功能?
- [ ] 是否需要操作歷史Undo/Redo
---
## 6. 待確認事項清單
### 6.1 優先級高
| # | 事項 | 負責人 | 截止日期 |
|---|------|--------|----------|
| 1 | 確認是否需要用戶認證功能 | | |
| 2 | 確認資料庫選型In-Memory vs MySQL | | |
| 3 | 確認欄位 ID 標準化方案 | | |
| 4 | 確認 AI 功能的使用政策 | | |
### 6.2 優先級中
| # | 事項 | 負責人 | 截止日期 |
|---|------|--------|----------|
| 5 | 確認 Excel 匯出需求 | | |
| 6 | 確認審核流程需求 | | |
| 7 | 確認與現有系統整合需求 | | |
### 6.3 優先級低
| # | 事項 | 負責人 | 截止日期 |
|---|------|--------|----------|
| 8 | 確認深色模式需求 | | |
| 9 | 確認多語言支援需求 | | |
---
## 7. 簽核記錄
| 角色 | 姓名 | 簽核日期 | 簽核狀態 |
|------|------|----------|----------|
| 專案負責人 | | | 待簽核 |
| 業務代表 | | | 待簽核 |
| 技術負責人 | | | 待簽核 |
---
## 8. 附錄
### 附錄 A相關文件
- SDD.md - 軟體設計文件
- TDD.md - 測試設計文件
- 更新欄位名稱.md - 欄位規範書
- ID重命名對照表.md - 欄位 ID 對照表
### 附錄 B系統截圖
(請參考系統實際畫面)
---
**文件結束**