feat: HR Portal - Complete Multi-Tenant System with Redis Session Storage

Major Features:
-  Multi-tenant architecture (tenant isolation)
-  Employee CRUD with lifecycle management (onboarding/offboarding)
-  Department tree structure with email domain management
-  Company info management (single-record editing)
-  System functions CRUD (permission management)
-  Email account management (multi-account per employee)
-  Keycloak SSO integration (auth.lab.taipei)
-  Redis session storage (10.1.0.254:6379)
  - Solves Cookie 4KB limitation
  - Cross-system session sharing
  - Sliding expiration (8 hours)
  - Automatic token refresh

Technical Stack:
Backend:
- FastAPI + SQLAlchemy
- PostgreSQL 16 (10.1.0.20:5433)
- Keycloak Admin API integration
- Docker Mailserver integration (SSH)
- Alembic migrations

Frontend:
- Next.js 14 (App Router)
- NextAuth 4 with Keycloak Provider
- Redis session storage (ioredis)
- Tailwind CSS

Infrastructure:
- Redis 7 (10.1.0.254:6379) - Session + Cache
- Keycloak 26.1.0 (auth.lab.taipei)
- Docker Mailserver (10.1.0.254)

Architecture Highlights:
- Session管理由 Keycloak + Redis 統一控制
- 支援多系統 (HR/WebMail/Calendar/Drive/Office) 共享 session
- Token 自動刷新,異質服務整合
- 未來可無縫遷移到雲端

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-02-23 20:12:43 +08:00
commit 360533393f
386 changed files with 70353 additions and 0 deletions

352
Phase_2.2_完成報告.md Normal file
View File

@@ -0,0 +1,352 @@
# HR Portal Phase 2.2 完成報告
**階段**: Phase 2.2 - 組織架構管理 (事業部與部門)
**完成日期**: 2026-02-15
**狀態**: ✅ 完成 (唯讀版本)
---
## 📋 執行摘要
成功完成 HR Portal 組織架構管理的基礎建設,包括資料庫擴充、後端 API 和前端 UI。建立了匠耘公司的三大事業部和九個部門的完整組織架構,並支援獨立網域配置策略。
---
## ✅ 完成項目
### 1. 資料庫遷移 (Alembic 0003)
**檔案**: `backend/alembic/versions/0003_extend_organization_structure.py`
#### 擴充欄位
**business_units 表**:
-`primary_domain` VARCHAR(100) - 主要網域
-`email_address` VARCHAR(255) - 事業部信箱
-`email_quota_mb` INTEGER (預設 10240) - 事業部信箱配額
**departments 表**:
-`email_address` VARCHAR(255) - 部門信箱
-`email_quota_mb` INTEGER (預設 5120) - 部門信箱配額
**email_accounts 表**:
-`account_type` VARCHAR(20) - 帳號類型 (personal/department/business_unit/organization)
-`department_id` INTEGER - 部門 ID (外鍵)
-`business_unit_id` INTEGER - 事業部 ID (外鍵)
#### 初始資料插入
**三大事業部**:
```sql
1. (BD) - ease.taipei
2. (TD) - lab.taipei
3. (OM) - porscheworld.tw
```
**九個部門**:
```sql
-- 業務發展部
- (WIND) - wind@ease.taipei
- (VIRTUAL) - virtual@ease.taipei
- (CARBON) - carbon@ease.taipei
-- 技術發展部
- (AI) - ai@lab.taipei
- (DEV) - dev@lab.taipei
- MIS (MIS) - mis@lab.taipei
-- 營運管理部
- (HR) - hr@porscheworld.tw
- (FIN) - finance@porscheworld.tw
- (ADMIN) - admin@porscheworld.tw
```
---
### 2. Models 更新
#### BusinessUnit Model
**檔案**: `backend/app/models/business_unit.py`
```python
# 新增欄位
primary_domain = Column(String(100), comment="主要網域")
email_address = Column(String(255), comment="事業部信箱")
email_quota_mb = Column(Integer, default=10240, nullable=False)
```
#### Department Model
**檔案**: `backend/app/models/department.py`
```python
# 新增欄位
email_address = Column(String(255), comment="部門信箱")
email_quota_mb = Column(Integer, default=5120, nullable=False)
```
#### EmailAccount Model
**檔案**: `backend/app/models/email_account.py`
```python
# 新增欄位 (支援組織/事業部/部門信箱)
account_type = Column(String(20), default='personal', nullable=False)
department_id = Column(Integer, ForeignKey("departments.id"), nullable=True)
business_unit_id = Column(Integer, ForeignKey("business_units.id"), nullable=True)
```
---
### 3. 後端 API (已存在,無需修改)
**檔案**: `backend/app/api/v1/business_units.py`
#### 可用端點
- `GET /api/v1/business-units/` - 查詢事業部列表 ✅
- `GET /api/v1/business-units/{id}` - 查詢單一事業部 ✅
- `GET /api/v1/business-units/{id}/departments` - 查詢事業部的部門列表 ✅
- `POST /api/v1/business-units/` - 創建事業部 (已實作但未啟用)
- `PUT /api/v1/business-units/{id}` - 更新事業部 (已實作但未啟用)
- `DELETE /api/v1/business-units/{id}` - 停用事業部 (已實作但未啟用)
---
### 4. 前端組織架構查詢頁面
**檔案**: `frontend/app/organization/page.tsx`
#### 核心功能
- ✅ 事業部列表顯示
- ✅ 樹狀展開/收合 (可展開查看部門)
- ✅ 事業部資訊 (名稱、代碼、網域、信箱)
- ✅ 部門卡片顯示 (名稱、代碼、信箱、配額)
- ✅ 網域配置說明
- ✅ 響應式設計 (支援桌面/平板/手機)
#### 介面設計
```
┌─────────────────────────────────────────────────────────┐
│ 組織架構 │
├─────────────────────────────────────────────────────────┤
│ │
│ 🏢 匠耘 Porsche World │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 📁 業務發展部 │ │
│ │ BD · ease.taipei 3 個部門 [▼] │ │
│ │ ─────────────────────────────────────────────────── │ │
│ │ 📋 玄鐵風能 (WIND) 📧 wind@ease.taipei │ │
│ │ 📋 虛擬公司 (VIRTUAL) 📧 virtual@ease.taipei │ │
│ │ 📋 國際碳權 (CARBON) 📧 carbon@ease.taipei │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 📁 技術發展部 │ │
│ │ TD · lab.taipei 3 個部門 [▼] │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 📁 營運管理部 │ │
│ │ OM · porscheworld.tw 3 個部門 [▼] │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 📧 網域配置說明 │
│ • ease.taipei - 業務發展部專用網域 │
│ • lab.taipei - 技術發展部專用網域 │
│ • porscheworld.tw - 營運管理部專用網域 │
└─────────────────────────────────────────────────────────┘
```
---
### 5. 匠耘組織架構文件
**檔案**: `1.專案規劃區/匠耘商業資料/組織架構.md`
#### 內容包含
- ✅ 公司資訊
- ✅ 組織架構圖
- ✅ 三大事業部詳細資訊
- ✅ 九個部門清單與業務範圍
- ✅ 郵件網域配置策略
- ✅ 網域權限規則
- ✅ 設計原則
---
## 🏗️ 組織架構總覽
### 匠耘 Porsche World 組織架構
```
匠耘 Porsche World (公司)
├── 業務發展部 (Business Development) [@ease.taipei]
│ ├── 玄鐵風能 (Wind Energy Licensing)
│ ├── 虛擬公司 (Virtual Company)
│ └── 國際碳權 (Carbon Credit Services)
├── 技術發展部 (Technology Development) [@lab.taipei]
│ ├── 智能研發 (Smart R&D Services)
│ ├── 軟體開發 (Software Development)
│ └── 虛擬MIS (Virtual MIS)
└── 營運管理部 (Operations Management) [@porscheworld.tw]
├── 人資 (Human Resources)
├── 財務 (Finance)
└── 總務 (General Affairs)
```
### 網域配置策略
**事業部層級獨立網域** (非子網域)
| 事業部 | 獨立網域 | 說明 |
|--------|---------|------|
| 業務發展部 | ease.taipei | 客戶服務、業務應用 |
| 技術發展部 | lab.taipei | 技術開發、實驗環境 |
| 營運管理部 | porscheworld.tw | 公司營運、基礎設施 |
**重要**: 這三個網域都是在 ISP (中華電信) 購買的**完全獨立網域**,不是子網域模式 (如 wind.porscheworld.tw)。
---
## 📊 統計數據
### 資料庫
- **遷移版本**: 0003 (extend_organization_structure)
- **新增欄位**: 7 個
- **初始資料**: 3 個事業部 + 9 個部門 = 12 筆
### 程式碼更新
- **更新檔案**: 3 個 (Models)
- `models/business_unit.py` (+3 欄位)
- `models/department.py` (+2 欄位)
- `models/email_account.py` (+3 欄位)
- **新增檔案**: 2 個
- `frontend/app/organization/page.tsx` (~250 行)
- `1.專案規劃區/匠耘商業資料/組織架構.md` (~300 行)
### 功能清單
- ✅ 事業部列表查詢
- ✅ 部門列表查詢 (依事業部)
- ✅ 樹狀組織架構顯示
- ✅ 部門卡片資訊 (信箱、配額)
- ✅ 網域配置說明
---
## ✨ 核心特色
### 1. 獨立網域策略
- 三個完全獨立的網域 (ease.taipei, lab.taipei, porscheworld.tw)
- 每個事業部使用專屬網域
- 所有員工和部門信箱都使用所屬事業部的網域
### 2. 樹狀組織架構
- 清晰的三層結構: 公司 → 事業部 → 部門
- 可展開/收合的互動式介面
- 卡片化設計,資訊一目了然
### 3. 部門信箱管理
- 每個部門都有專屬信箱
- 配額統一管理 (預設 5 GB)
- 支援未來擴展為實際郵件帳號
### 4. 擴展性設計
- EmailAccount 支援四種帳號類型 (personal/department/business_unit/organization)
- 為未來組織層級信箱預留空間
- 支援動態網域配置
---
## 🧪 測試建議
### 手動測試
- [ ] 訪問組織架構頁面 (http://localhost:10180/organization)
- [ ] 展開/收合各事業部
- [ ] 檢查部門資訊顯示是否正確
- [ ] 確認網域配置說明清晰
- [ ] 測試響應式設計 (手機/平板/桌面)
### API 測試
- [ ] `GET /api/v1/business-units/` - 事業部列表
- [ ] `GET /api/v1/business-units/2` - 業務發展部詳情
- [ ] `GET /api/v1/business-units/2/departments` - 業務發展部的部門列表
- [ ] 確認回傳欄位包含 email_address 和 email_quota_mb
### 資料庫驗證
- [ ] 確認 3 個事業部資料正確
- [ ] 確認 9 個部門資料正確
- [ ] 確認網域配置正確 (ease.taipei, lab.taipei, porscheworld.tw)
- [ ] 確認外鍵約束正常
---
## 📚 下一步
### Phase 2.3 - 員工新增/編輯表單
- [ ] 員工新增表單 (選擇事業部和部門)
- [ ] 員工編輯表單
- [ ] 根據員工所屬事業部自動選擇郵件網域
- [ ] create_full 選項 (一鍵創建所有帳號)
### Phase 2.4 - 郵件帳號 Tab 優化
- [ ] 根據員工所屬事業部,自動選擇預設網域
- [ ] 網域選項根據事業部權限動態調整
- [ ] 支援跨事業部郵件帳號 (營運管理部特權)
### Phase 2.5 - 組織信箱管理
- [ ] 組織層級信箱 (info@, support@, hr@)
- [ ] 事業部信箱管理
- [ ] 部門信箱實際創建 (整合 Docker Mailserver)
---
## 🎯 設計原則遵循
### ✅ 符合設計規範
- 事業部層級獨立網域策略 ✅
- 部門信箱命名規範 (wind@, dev@, hr@) ✅
- 配額統一管理 (事業部 10GB, 部門 5GB) ✅
- 擴展性設計 (EmailAccount 支援多種類型) ✅
### ✅ 資料一致性
- 所有組織資料集中管理 ✅
- 網域與事業部一對一映射 ✅
- 部門必須隸屬於事業部 ✅
- 外鍵約束保證參照完整性 ✅
---
## 📋 檢查清單
- [x] 資料庫遷移 (Alembic 0003)
- [x] Models 更新 (BusinessUnit, Department, EmailAccount)
- [x] 後端 API (已存在,無需修改)
- [x] 前端組織架構頁面
- [x] 初始資料插入 (3 事業部 + 9 部門)
- [x] 組織架構文件
- [x] 網域配置說明
- [ ] 前端測試 (待執行)
- [ ] 整合測試 (待執行)
- [ ] 員工表單整合 (Phase 2.3)
---
## 🎉 結論
Phase 2.2 成功完成了組織架構管理的基礎建設,建立了匠耘公司完整的三大事業部和九個部門架構。採用事業部層級獨立網域策略,符合現階段由 ISP 管理網域的實際需求。
前端提供了直觀的樹狀組織架構查詢介面,讓 HR 人員可以清楚看到公司的組織結構和網域配置。後端資料庫和 API 已為未來的員工管理、郵件帳號創建等功能做好準備。
**Phase 2.2 (組織架構管理) 完成!** 🚀
接下來將繼續進行 Phase 2.3 (員工表單整合),讓員工可以選擇所屬事業部和部門,並根據事業部自動分配正確的郵件網域。
---
**報告產出日期**: 2026-02-15
**撰寫者**: Claude AI
**前端伺服器**: 待啟動 (http://localhost:10180)
**後端 API**: ✅ 運行中 (http://localhost:10181)
**組織架構頁面**: /organization