部門行政(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 是否有任一 CoordinatorDepts row
  • 若有 → JWT 加 ClaimTypes.Role = "Coordinator"(與原 Role 並存)
  • LoginResponseIsCoordinator: bool

一個 user 可以同時是 Reviewer + Coordinator(角色 claim 多筆,[Authorize(Roles = "...")] OR match)。


後端 API

行政自己用(Role: Coordinator / HR / Admin)

MethodPath用途
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)

MethodPath用途
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):

  1. 排除 IsDeptHead=true 的被評者 — 這類案件的 reviewer 是部門頭的頭
  2. 預先收集該部門所有 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)
  [許逢珉] [王靈] [呂郁鈴] [李芷柔] ...

關鍵過濾(前端):只保留 初核 / 複核 關卡;審核(初審~終審)隱藏。

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 上線