考核結案報表頁(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」琥珀色
  • 已離職未受考人數 / 實際面談人數
  • 總計列(琥珀色底,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 — 頁面用 JSON
  • GET /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=xxx
  • GET /api/hr/projects/{id}/dept-unit-report?dept=xxx
  • GET /api/hr/projects/{id}/rating-ratio-report-json
  • GET /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-statsSummary 已新增 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 整合完成後替換為實際下載。