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>
353 lines
13 KiB
Markdown
353 lines
13 KiB
Markdown
# 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
|