R46 A1-A7:落地绩效考核模块首版

这个提交包含在:
2026-03-29 16:30:29 +08:00
父节点 48f395e18d
当前提交 659e3153a3
共修改 19 个文件,包含 2652 行新增和 15 行删除
+35
查看文件
@@ -83,6 +83,22 @@ export function PeopleStatsPage() {
{stats.certificateSummary.dateFrom} 至 {stats.certificateSummary.dateTo}
</div>
</section>
<section className="card-std p-5">
<div className="text-sm text-zinc-500">当前 / 最近周期平均分</div>
<div className="mt-2 text-3xl font-semibold text-zinc-900">
{stats.performanceSummary.averageScore == null ? "-" : stats.performanceSummary.averageScore.toFixed(1)}
</div>
<div className="mt-2 text-xs text-zinc-500">
{stats.performanceSummary.cycle
? `${stats.performanceSummary.cycle.name} · ${stats.performanceSummary.cycle.startDate} 至 ${stats.performanceSummary.cycle.endDate}`
: "暂无可展示的绩效周期"}
</div>
</section>
<section className="card-std p-5">
<div className="text-sm text-zinc-500">当前 / 最近周期已评分人数</div>
<div className="mt-2 text-3xl font-semibold text-zinc-900">{stats.performanceSummary.reviewedCount}</div>
<div className="mt-2 text-xs text-zinc-500">只统计当前 active 或最近 completed 周期</div>
</section>
</div>
<div className="grid gap-6 xl:grid-cols-[1.1fr_0.9fr]">
@@ -126,6 +142,25 @@ export function PeopleStatsPage() {
</div>
</section>
</div>
<section className="card-std p-6">
<div>
<h2 className="text-lg font-semibold text-zinc-900">绩效评分分布</h2>
<p className="mt-1 text-sm text-zinc-500">按当前 active 周期或最近 completed 周期的总分分布汇总。</p>
</div>
<div className="mt-6 grid gap-3 md:grid-cols-3 xl:grid-cols-5">
{stats.performanceSummary.cycle && stats.performanceSummary.distribution.length ? (
stats.performanceSummary.distribution.map((item) => (
<div key={item.score} className="rounded-2xl border border-zinc-200 bg-white px-4 py-3">
<div className="text-sm text-zinc-500">{item.score.toFixed(1)} 分</div>
<div className="mt-2 text-2xl font-semibold text-zinc-900">{item.count}</div>
</div>
))
) : (
<div className="text-sm text-zinc-500">暂无绩效周期统计。</div>
)}
</div>
</section>
</div>
);
}