租户端基础设施: - 新增工作台首页(欢迎信息/统计/待办/快捷操作/新手引导) - 新增机构信息管理页(自助查看编辑机构信息) - 修复403报错(fetchTenants加超管守卫) - 修复权限(log:read/notice:update/notice:delete/contest:work:read) - 修复评审规则组件映射 活动管理全模块优化(机构端视角): - 活动列表:加统计概览+精简列+筛选自动查询+发布弹窗修复+操作逻辑优化 - 创建/编辑活动:重构布局(去card嵌套+栅格响应式+分区卡片) - 评委管理:统一主色调+冻结确认+导入导出disabled - 报名管理:去Tab+统计+审核状态列+批量审核接口 - 报名记录:统计概览+去机构列+撤销审核+返回按钮+去参与方式列 - 作品管理:去Tab+统计+递交进度彩色+筛选修复(assignStatus/submitTime) - 评审进度:去Tab+统计+实际完成率状态+筛选修复 - 评审规则:表格加评委数/计算方式+描述列修复+删除保护 - 成果发布:去Tab+统计+操作文案优化 - 通知公告:统一主色调+发布确认+操作逻辑+状态筛选+时间范围 成果发布详情功能补全: - 计算得分/排名/设置奖项三步操作流程 - 排名列(金银铜徽章)+奖项列+奖项筛选 - 自定义奖项(动态添加行替代硬编码一二三等奖) - 后端AutoSetAwardsDto改为awards数组格式 数据统计看板(新模块): - 后端analytics module(overview+review两个接口) - 运营概览:6指标卡片+报名转化漏斗+ECharts月度趋势+活动对比表 - 评审分析:4效率卡片+评委工作量表+ECharts奖项分布饼图 - 菜单注册:数据统计→运营概览+评审分析 Bug修复: - 超管重置其他租户用户密码报"用户不存在" - gdlib登录快捷标签密码不一致 - 分配评委去掉评审时间限制 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
10 KiB
10 KiB
租户端数据统计分析看板 — 设计方案
所属端:租户端(机构管理端) 状态:已实现 创建日期:2026-03-31 最后更新:2026-03-31
1. 需求背景
机构领导需要一个数据统计看板来了解:
- 活动运营情况:活动办得怎么样,报名和参赛情况
- 运营效率:审核速度、评审进度、整体运营时效
- 评委工作量:每位评委评了多少作品、评分质量
2. 数据来源盘点
基于现有系统已实现的功能,可用的数据表和字段:
| 数据表 | 可用维度 | 可用指标 |
|---|---|---|
| t_contest | 活动名称、类型、状态(ongoing/finished)、发布状态、各时间节点 | 活动数量、阶段分布 |
| t_contest_registration | 活动ID、审核状态(pending/passed/rejected)、报名时间 | 报名数、通过率、时间分布 |
| t_contest_work | 活动ID、状态(submitted/reviewing/accepted/awarded)、提交时间、最终得分、排名、奖项 | 作品数、评审状态分布、得分分布、获奖分布 |
| t_contest_work_score | 作品ID、评委ID、分数、评分时间 | 评委评分量、评分时间分布 |
| t_contest_work_judge_assignment | 作品ID、评委ID、状态 | 分配完成率 |
| t_contest_judge | 活动ID、评委ID | 评委数量、评委-活动关联 |
| t_contest_notice | 活动ID、发布时间 | 公告数量 |
3. 看板设计
3.1 整体结构
┌──────────────────────────────────────────────────────────────┐
│ 数据统计 时间范围: [本月▾] [活动▾] │
├──────────────────────────────────────────────────────────────┤
│ │
│ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │活动数│ │报名数│ │通过数│ │作品数│ │已评审│ │获奖数│ │
│ └─────┘ └─────┘ └─────┘ └─────┘ └─────┘ └─────┘ │
│ │
│ ┌───── 报名转化漏斗 ─────┐ ┌────── 月度趋势 ──────────┐ │
│ │ 报名 → 通过 → 提交 │ │ 📈 报名量/作品量折线图 │ │
│ │ → 评审完成 → 获奖 │ │ │ │
│ └────────────────────────┘ └──────────────────────────┘ │
│ │
│ ┌───── 活动对比 ─────────────────────────────────────────┐ │
│ │ 表格:各活动 报名/通过率/作品提交率/评审完成率/获奖率 │ │
│ └───────────────────────────────────────────────────────┘ │
│ │
│ ┌──── 评委工作量 ────────┐ ┌────── 奖项分布 ──────────┐ │
│ │ 表格:评委 评审量/均分 │ │ 🥧 饼图:各奖项占比 │ │
│ └────────────────────────┘ └──────────────────────────┘ │
│ │
│ ┌──── 评审效率 ──────────────────────────────────────────┐ │
│ │ 平均评审周期 │ 日均评审量 │ 待评审积压 │ 评分标准差 │ │
│ └───────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
3.2 模块详细设计
模块A:核心指标卡片(顶部)
6 个数字卡片,一行排列:
| 指标 | 数据来源 | 计算方式 |
|---|---|---|
| 活动总数 | t_contest | COUNT WHERE tenant 可见 |
| 累计报名 | t_contest_registration | COUNT WHERE tenant_id |
| 报名通过 | t_contest_registration | COUNT WHERE registration_state='passed' |
| 作品总数 | t_contest_work | COUNT WHERE valid_state=1 |
| 已完成评审 | t_contest_work | COUNT WHERE status IN ('accepted','awarded') |
| 获奖作品 | t_contest_work | COUNT WHERE award_level IS NOT NULL AND award_level != 'none' |
模块B:报名转化漏斗
展示从报名到获奖的转化路径和各环节转化率:
报名人数 (12) → 通过审核 (10) → 提交作品 (8) → 评审完成 (5) → 获奖 (3)
83.3% 80.0% 62.5% 60.0%
数据来源:
- 报名人数:registration COUNT
- 通过审核:registration COUNT WHERE state='passed'
- 提交作品:work COUNT WHERE valid_state=1
- 评审完成:work COUNT WHERE status IN ('accepted','awarded')
- 获奖:work COUNT WHERE award_name IS NOT NULL
模块C:月度趋势图
折线图,X轴为月份,Y轴双轴:
- 左轴:报名数量(按 registration_time 月份分组)
- 右轴:作品数量(按 submit_time 月份分组)
时间范围:最近6个月
数据来源:
-- 月度报名
SELECT DATE_FORMAT(registration_time, '%Y-%m') as month, COUNT(*)
FROM t_contest_registration WHERE tenant_id=?
GROUP BY month ORDER BY month
-- 月度作品
SELECT DATE_FORMAT(submit_time, '%Y-%m') as month, COUNT(*)
FROM t_contest_work WHERE tenant_id=? AND valid_state=1
GROUP BY month ORDER BY month
模块D:活动对比表
表格形式,每行一个活动:
| 列 | 数据来源 |
|---|---|
| 活动名称 | t_contest.contest_name |
| 报名数 | registration COUNT |
| 通过率 | passed COUNT / total COUNT × 100% |
| 作品提交率 | work COUNT / passed registration COUNT × 100% |
| 评审完成率 | (accepted+awarded) COUNT / work COUNT × 100% |
| 获奖率 | awarded COUNT / work COUNT × 100% |
| 平均得分 | AVG(final_score) |
模块E:评委工作量
表格形式,每行一个评委:
| 列 | 数据来源 |
|---|---|
| 评委姓名 | users.nickname via t_contest_judge |
| 关联活动数 | t_contest_judge COUNT DISTINCT contest_id |
| 已分配作品数 | t_contest_work_judge_assignment COUNT |
| 已评分作品数 | t_contest_work_score COUNT |
| 评分完成率 | scored / assigned × 100% |
| 平均打分 | AVG(total_score) |
| 评分标准差 | STDDEV(total_score)(衡量评分一致性,越小越一致) |
模块F:奖项分布
饼图/环形图,展示获奖作品中各奖项的占比:
数据来源:
SELECT award_name, COUNT(*)
FROM t_contest_work
WHERE tenant_id=? AND award_name IS NOT NULL AND valid_state=1
GROUP BY award_name
模块G:评审效率指标
4 个数字卡片:
| 指标 | 计算方式 |
|---|---|
| 平均评审周期 | AVG(score_time - submit_time),从作品提交到第一次评分的平均天数 |
| 日均评审量 | 最近30天 score COUNT / 30 |
| 待评审积压 | assignment COUNT WHERE status='assigned'(已分配未评分) |
| 评分一致性 | 所有作品的评委间评分标准差的平均值(越小越好) |
3.3 筛选条件
顶部全局筛选栏:
| 筛选 | 类型 | 说明 |
|---|---|---|
| 时间范围 | 下拉 | 本月/本季度/本年/全部/自定义时间段 |
| 指定活动 | 下拉 | 全部活动 / 选择特定活动(切换后所有模块联动) |
3.4 交互设计
- 数字卡片可点击,跳转到对应管理页面(如点击「累计报名」跳到报名管理)
- 活动对比表的活动名称可点击,切换筛选到该活动
- 评委工作量表的评委名可点击查看评分明细
- 所有图表支持 hover 显示详细数据
- 支持将看板数据导出为 PDF/Excel
4. 菜单位置
新增一级菜单「数据统计」,放在「活动管理」之后:
工作台
活动管理
├── ...
数据统计(新增)
├── 运营概览 — 核心卡片 + 漏斗 + 趋势 + 活动对比
└── 评审分析 — 评委工作量 + 评审效率 + 奖项分布
系统设置
├── ...
5. 后端 API 设计
5.1 运营概览
GET /api/analytics/overview
参数: timeRange(month/quarter/year/all), contestId?(可选)
返回:
{
summary: { totalContests, totalRegistrations, passedRegistrations, totalWorks, reviewedWorks, awardedWorks },
funnel: { registered, passed, submitted, reviewed, awarded },
monthlyTrend: [{ month, registrations, works }],
contestComparison: [{
contestId, contestName,
registrations, passRate, submitRate, reviewRate, awardRate, avgScore
}]
}
5.2 评审分析
GET /api/analytics/review
参数: timeRange, contestId?
返回:
{
efficiency: { avgReviewDays, dailyReviewCount, pendingAssignments, avgScoreStddev },
judgeWorkload: [{
judgeId, judgeName,
contestCount, assignedCount, scoredCount, completionRate, avgScore, scoreStddev
}],
awardDistribution: [{ awardName, count, percentage }]
}
6. 技术方案
- 前端图表库:使用 ECharts 或 Ant Design Charts(@ant-design/charts)
- 数据缓存:统计数据变化不频繁,后端可加 5 分钟缓存
- 大数据量:月度趋势等聚合查询用 GROUP BY + 索引优化
- 导出:前端生成 PDF(html2canvas + jsPDF)或 CSV