公告系統(Announcements)

登入頁「最新消息」與系統公告的維護入口,HR 後台可增修。

資料表

Announcement:Id / Title(nvarchar 300) / Tag(HR|系統|指引) / LinkUrl / LinkLabel / IsPinned / PublishAt / ExpireAt / IsPublished / CreatedBy / CreatedAt / UpdatedAt

Migration:20260419022449_AddAnnouncements

API

端點Auth說明
GET /api/announcements/public免登入登入頁使用。回最新 5 則已上架且未過期(依 IsPinned DESC → PublishAt/CreatedAt DESC)
GET /api/announcements/login-meta免登入回傳進行中週期 chip 資料 + 使用手冊 URL(取 Login:ManualUrl SystemSetting,空則前端預設 /manuals/PAM_一般考核主管操作手冊.pdf
GET /api/hr/announcementsHR/Admin列表(含未上架與已過期)
POST /api/hr/announcementsHR/Admin新增
PUT /api/hr/announcements/{id}HR/Admin編輯
DELETE /api/hr/announcements/{id}HR/Admin刪除

自動公告(部門等第審核通過)

GradeReviewService.ConfirmDepartmentAsync 確認成功後(僅 GradeReview,Settlement 太晚不需要)自動建立 Announcement:

  • Title:【{部門}】{year} 年{年中/年終}考核已全數完成!
  • Tag:系統;ExpireAt = 14 天;以 Title 去重避免 HR 退回重確認時重複發布
  • Program.cs 啟動補建:遍歷所有 Confirmed GradeReview 補公告(冪等)

Session Chip 邏輯(login-meta)

Status == "Active" 且日期在 StartDate ~ EndDate 區間的週期(若無則取任一 Active),再從 Reviewer1EndDate / Reviewer2EndDate / ApproverEndDate / EndDate 中挑最近一個尚未過期的截止日,回傳「{year} {periodTypeLabel}進行中 · {dueLabel}剩 {days} 天」。無進行中週期時 chip 隱藏。

前端頁面

  • HR 後台:AnnouncementsPage.tsx — 列表 + 編輯 Dialog(標題 / 標籤 / 置頂 / 連結 / 上下架日期 / 已上架)+ 刪除確認
  • 路由:/hr/announcements,側邊欄 icon Megaphone
  • 登入頁:LoginPage.tsx — 使用 useQuery(['announcements','public']) + useQuery(['announcements','login-meta'])

HR 側邊欄命名

原本側邊欄「公告管理」項目(指向 /hr/notifications)實際為催繳通知系統,已改名為「通知管理」;新「公告管理」項目指向 /hr/announcements