考核結案報表頁(ExamReportPage)
HR 查看各部門考核成績與等第統計,三個 Tab。
Tab 結構
| Tab | 內容 | 篩選器 |
|---|---|---|
| 各部門結案報告 | 部門單位 × 公司別 等第統計表 + 人員清單 | 年度 / 報表類型 / 部門 |
| 週期/年度報告書 | 評等比例一覽表 inline(全公司跨部門)+ Excel 匯出 | 年度 / 報表類型(不需部門) |
| 104 回寫 PDF 存檔 | 員工考核結果報告 PDF 批次產出狀態表(供 104 回寫) | 年度 / 報表類型(不需部門) |
Tab 1:各部門結案報告
單位 × 公司別 統計表(取代原 等第統計)
選部門後顯示統計表,列維度為「單位 × 公司別」,同單位跨公司時 rowspan 合併單位欄:
- 強制調整 / 單位 / 公司 / 受考人數
- 5 個等第 × 4 欄(標準人數 / 實際人數 / 差異說明 / 實際比例)
- 標準人數(per-unit)= 最大餘額法分派:先決定部門總標準(HR 核定
GradeDistribution優先,未核定時用ComputeByRate(部門總數)fallback),再按各單位人數比例用最大餘額法分派;保證Σ 單位標準 = 部門總標準,不再出現「各單位 0+0+0 但合計 3」的視覺落差(HrController.DistributeByLargestRemainder) - 同等第餘數相同時,單位人數大的優先多拿 1 人(平手規則)
- 超額:紅字加粗,差異說明「超 N」紅字
- 缺額:琥珀色加粗,差異說明「缺 N」琥珀色
- 標準人數(per-unit)= 最大餘額法分派:先決定部門總標準(HR 核定
- 已離職未受考人數 / 實際面談人數
- 總計列(琥珀色底,2 欄合併)
備註說明(頁面 + Excel)
- 備註 1:本次受考人數共計 N 人(上開統計人數不含部門最高主管 N 人,XX、YY)。
- 備註 2:各等第標準 vs 實際對照
- 備註 3:面談統計(若有乙/丙等)
人員清單
每位員工列,欄位:
- 姓名 / 工號(同欄位兩行顯示,姓名大字 + 工號 font-mono 灰字)
- 單位 / 考核職別(管理職/一般職,從 Employee.JobLevel 或 Participant.FormType 推導)
- 初複核平均(ScoreC) / 出勤扣分
- 最終得分(含天花板 10px 橘字小註)
- 最終等第 / 分數調整 / 等第調整 / 調整說明(自動換行)
API
週期版(年中 / 年終)
GET /api/hr/periods/{id}/dept-unit-report-json?dept=xxx— 頁面用 JSONGET /api/hr/periods/{id}/dept-unit-report?dept=xxx— Excel 下載GET /api/hr/periods/{id}/rating-ratio-report-json— 全公司評等比例(Tab 2)GET /api/hr/periods/{id}/rating-ratio-report— 全公司 Excel(需 HR 密碼)
年度總結版
GET /api/hr/projects/{id}/dept-unit-report-json?dept=xxxGET /api/hr/projects/{id}/dept-unit-report?dept=xxxGET /api/hr/projects/{id}/rating-ratio-report-jsonGET /api/hr/projects/{id}/rating-ratio-report(需 HR 密碼)
核心實作
HrController.BuildDeptUnitReport(...)— 建構單位 × 公司報表 DTO(週期版)HrController.BuildRatingRatioReport(...)— 建構全公司評等比例 DTO(週期版)HrController.BuildAnnualDeptUnitReport(...)— 年度版部門報告(公式(年中+年終)/2 + 獎懲,年度調分優先)HrController.BuildAnnualRatingRatioReportAsync(...)— 年度版全公司評等比例ExcelService.ExportDeptUnitRatingRatioReport(...)— 2 sheet 匯出(依IsAnnual切換 Sheet 2 欄位)ExcelService.ExportRatingRatioReport(...)— 一覽表 Excel(同上)ExcelService.BuildAnnualParticipantSheet(...)— 年度版 Sheet 2 共用渲染函式(年中/年終/獎懲/計算/年度調分/最終/原因)
年度報告基準與狀態語意
員工集合:以年終受評者為基準(非年中∪年終 union)
BuildAnnualDeptUnitReport/BuildAnnualRatingRatioReportAsync兩處皆用endByEmp.Keys為員工清單- 年中有受評但年終未列入的人視為離職/異動,不列入年度報告
- 排除人數記錄於
MidOnlyExcludedCount,前端狀態列以「(已排除年中受評但年終未列入 N 人)」呈現
邊界處理(AnnualEmptyHint)
| 狀況 | 提示 |
|---|---|
| 年終週期不存在 | 「年度報告需先建立年終考核週期」 |
| 年終週期已建立但 0 人 | 「年終考核名單尚未匯入」 |
狀態欄判定(C 方案:年度進度明確化)
| 條件 | 顯示 |
|---|---|
員工有 AnnualResult(已年度結算) | 已結算 |
部門結案:IsExcluded | 已排除 |
部門結案:IsDeptHead | 部門主管 |
年終 Completed / Locked | 待結算 |
年終 InProgress | 年終進行中 |
年終 Returned | 已退回 |
年終 Pending | 年終待考核 |
報告書狀態列(前端 ExamReportPage)
頁首補充說明顯示三段彩色徽章(年中考核 / 年終考核 / 年度結算)。年度模式各週期分母改用實際受評人數(MidYearTotal / YearEndTotal),不再共用 union 總數:
年中考核:進行中(374/438 完成)
年終考核:準備中(0/230 完成)
年度結算:民國 115 年 · 受評 230 人(已排除年中受評但年終未列入 208 人) — 未結算(即時試算)
/hr/projects/{id}/settlement-stats 的 Summary 已新增 MidYearTotal / YearEndTotal / MidOnlyExcludedCount 三個欄位。
Excel 匯出(2 sheet)
Sheet 1:統計表
- A3 橫式、Fit to pages
- 單位 rowspan 合併(同單位多公司)
- 備註 3 條 + 空白備註框(HR 手填)
- 簽核 5 欄:董事長 → 總經理 → 副總經理 → 部門主管 → 管理部人事處
- 頁尾:製表單位:管理部人事處(右對齊、斜體灰字)
Sheet 2:人員清單
週期版(年中/年終)欄位:員工編號 / 姓名 / 公司 / 單位 / 職稱 / 考核職別 / 初複核平均 / 出勤扣分 / 分數調整 / 最終得分 / 最終等第 / 調整說明 / 狀態
- 分數調整有值時琥珀色加粗
- 狀態中文化:Completed→完成考核、InProgress→進行中、Returned→已退回、Pending→待考核、Locked→已鎖定
年度版欄位(部門結案 + 全公司一覽 統一):員工編號 / 姓名 / 公司 / 部門 / 單位 / 職稱 / 考核職別 / 年中分數 / 年終分數 / 獎懲加減分 / 計算年度分數 / 年度調分 / 最終年度分數 / 最終年度等第 / 年度調分原因 / 狀態
- 獎懲加減分:正值綠色(#15803D)、負值紅色(#DC2626)
- 年度調分有值:琥珀色(#B45309)加粗
- 最終年度分數:加粗
- 狀態使用 C 方案(已結算 / 待結算 / 年終進行中 / 年終待考核 / 已退回 / 部門主管 / 已排除)
- 由
BuildAnnualParticipantSheet共用渲染,兩個入口(部門 / 全公司)欄位完全一致
考核表單 HR 匯出 PDF 按鈕
ReviewFormPage 右上角(已完成/未完成皆顯示),下拉三選項:
- 空白表單(A/B 全空,董事長手寫用)
- 半填版(A 已填、B 空白,初核後給複核手寫)
- 結果通知書(含調分、等第印章、簽核歷程)
依參與者狀態自動推薦模式。按鈕目前為 UI 佔位,後端 PDF 整合完成後替換為實際下載。