部門行政(Coordinator)
從 CLAUDE.md 分離。每部門可指派 1~N 位「行政」追蹤考核進度,不評分、不看分數。
角色定位
| 項目 | 說明 |
|---|---|
| 角色名 | 部門行政(Coordinator) |
| 權限範圍 | 追蹤所綁定虛擬部門的考核進度(不含分數/評語/具體事蹟) |
| 可執行 | 查看進度儀表、Excel 匯出(未來) |
| 不能執行 | 打分 / 調等第 / 部門確認 / 催繳(暫緩) |
| 週期綁定 | 每行政 × 每週期 × 每虛擬部門 一筆 row;新週期不自動繼承 |
| 跨公司 | 不做;虛擬部門全部可見 |
| 本人考核 | 行政本人照走一般員工考核流程(身份並存) |
Schema
新表 CoordinatorDepts
Id int PK
UserId int FK → SystemUsers
PeriodId int FK → ExamPeriods
VirtualDeptName nvarchar(450)
CreatedBy nvarchar
CreatedAt datetime2
UNIQUE (UserId, PeriodId, VirtualDeptName)
INDEX PeriodId(登入時批次查當期行政)
JWT role claim
AuthController.GenerateToken:
- 登入時查當期(Active 週期)該 user 是否有任一
CoordinatorDeptsrow - 若有 → JWT 加
ClaimTypes.Role = "Coordinator"(與原 Role 並存) LoginResponse加IsCoordinator: bool
一個 user 可以同時是 Reviewer + Coordinator(角色 claim 多筆,[Authorize(Roles = "...")] OR match)。
後端 API
行政自己用(Role: Coordinator / HR / Admin)
| Method | Path | 用途 |
|---|---|---|
| GET | /api/coordinator/my-depts | 我當期綁定的部門 + 每部門進度摘要(total/completed/inProgress/forceFlagCount) |
| GET | /api/coordinator/periods/{id}/dept-participants?dept=X | 部門人員清單(不含分數) |
| GET | /api/coordinator/periods/{id}/reviewers-progress?dept=X | 按「當前責任主管」彙總的進度(已保留,UI 未用) |
| GET | /api/coordinator/periods/{id}/stage-progress?dept=X | 主力端點:部門 × 關卡 × 主管 × 下屬(比照 upstream-progress) |
HR 管理行政(Role: HR / Admin)
| Method | Path | 用途 |
|---|---|---|
| GET | /api/hr/coordinators?periodId=X | 當期所有行政綁定(按 user 分組) |
| GET | /api/hr/virtual-depts?periodId=X | 部門下拉選項 |
| POST | /api/hr/coordinators body {periodId, employeeNo, depts[]} | 新增綁定(無帳號則自動建 SystemUser,預設密碼 @2026) |
| DELETE | /api/hr/coordinators/{id} | 移除單筆綁定 |
後端過濾邏輯
stage-progress:隱藏「上層主管」
目的:行政只追蹤部門內直接評分的主管,不包含跨部門/高階審核主管。
兩條並行規則(CoordinatorController.GetStageProgressAsync):
- 排除
IsDeptHead=true的被評者 — 這類案件的 reviewer 是部門頭的頭 - 預先收集該部門所有
Reviewer1 / Reviewer2人名為deptLocalReviewers,排除「只評 deptLocalReviewers 內其他人」的 reviewer
實例(新媒體部):
嚴智徑只評 1 人(黃丞瑜),黃丞瑜本人又是 14 人的 Reviewer1 →嚴智徑判定為上層,隱藏練台生(通常在 終審)同理
前端
TodayPage 區塊(/review/today 底部)
登入後若 user.isCoordinator === true → 頁尾多一區塊:
我追蹤的部門 (N)
僅顯示進度;不含分數 / 評語 / 具體事蹟。
┌─────────┐ ┌─────────┐
│ 新媒體部 ▾│ │資訊科技部▾│
│ 總 21 人 │ │ 總 24 人 │
│ ▓▓▓▓▓▓▓ │ │ ▓────── │
│ 21/21 │ │ 1/24 (4%)│
│ │ │ 進行中23人│
└─────────┘ └─────────┘
點卡片展開 → 顯示「各主管進度」:
新媒體部 — 各主管進度
黃丞瑜 總案 20 待處理 0
初核 已完成 14/14
複核 已完成 6/6
溫學民 總案 20 待處理 0
初核 已完成 1/1
複核 已完成 14/14
許逢珉 總案 6 待處理 0
初核 已完成 6/6
再點主管內的關卡列 → 顯示下屬 chips(待處理 + 已完成,只顯示姓名):
初核 已完成 14/14
已完成 (14)
[許逢珉] [王靈] [呂郁鈴] [李芷柔] ...
關鍵過濾(前端):只保留 初核 / 複核 關卡;審核(初審~終審)隱藏。
Sidebar 過濾(純 Coordinator 用)
AppLayout.tsx:若 isCoordinator === true 且 /review/my-list 回傳空陣列 → 隱藏「考核總覽」「待評清單」。保留「今日要事」與 HR 頁(若有)。
HR 後台:/hr/coordinators
側邊欄「部門行政」(UserCog icon)。
- 表格欄:員編 / 姓名 / 負責部門 chips(每 chip 可一鍵移除)
- 對話框:輸入員編 + 多選虛擬部門 → 儲存
- 若該員工尚無
SystemUser→ 自動建立(預設密碼@2026、AccountType/Role = Reviewer)
- 若該員工尚無
測試種子(手動 SQL)
目前尚無 Excel 匯入欄位支援。seed 範例:
-- 周慧晴(240816)綁定「資訊科技部」+「新媒體部」
INSERT INTO SystemUsers (...) VALUES ('240816', '周慧晴', ...); -- 若無帳號
INSERT INTO CoordinatorDepts (UserId, PeriodId, VirtualDeptName, ...)
VALUES (@uid, 1014, '資訊科技部', ...);
INSERT INTO CoordinatorDepts (UserId, PeriodId, VirtualDeptName, ...)
VALUES (@uid, 1014, '新媒體部', ...);未做
- ❌ Excel 匯入「部門行政」欄位自動建帳號(目前只能 HR 後台手動加)
- ❌ 催繳通知(user 決議暫緩)
- ❌ 歷史週期查看(只看當期)
- ❌ 行政可看自己綁定(目前
/hr/coordinators僅 HR/Admin 可進,行政看不到自己名下部門清單的管理頁;若要開放需另建 read-only view)
最後更新:2026/04/21 · 部門行政功能 Phase 1+2+3 上線