diff --git a/apps/web/src/shared/components/FlowchartStatisticsPanel.vue b/apps/web/src/shared/components/FlowchartStatisticsPanel.vue
index 4fe7900..1619d2d 100644
--- a/apps/web/src/shared/components/FlowchartStatisticsPanel.vue
+++ b/apps/web/src/shared/components/FlowchartStatisticsPanel.vue
@@ -13,7 +13,8 @@
clearable
/>
- 统计
+ 统计
+ 统计没拉下来,稍后会自动再试
@@ -42,8 +43,9 @@
班级人数
+
- {{ data.personCount }}
+ {{ adjustedPersonCount }}
@@ -102,8 +104,10 @@
+
@@ -117,7 +121,10 @@
-
+
+ 没完成的 {{ hiddenCount }} 位都隐藏了
+
+
全都完成了
@@ -186,8 +193,6 @@ interface Props {
const props = defineProps()
-const message = useMessage()
-
const durationOptions: SelectOption[] = [...PANEL_DURATION_OPTIONS]
// 班级、题号、时间段记一小时,理由见 useStatisticsQuery
@@ -437,7 +442,14 @@ const subOptions = computed(
() => durationFromValue(query.duration) ?? durationFromValue(PANEL_DURATION_OPTIONS[0].value)!,
)
+const loading = ref(false)
+/** 上一次统计失败了。不弹 toast:会自动刷新,断网时会一直弹 */
+const failed = ref(false)
+
async function handleStatistics() {
+ // 自动刷新和手点可能撞上,上一次没回来就跳过这一次
+ if (loading.value) return
+ loading.value = true
const current = Date.now()
const end = formatISO(current)
const duration =
@@ -446,15 +458,34 @@ async function handleStatistics() {
const res = await getFlowchartStatistics(duration, query.problem, query.username)
Object.assign(data, res)
saveQuery()
+ failed.value = false
} catch (error) {
- message.error("获取流程图统计失败")
+ failed.value = true
console.error("获取流程图统计失败:", error)
return
+ } finally {
+ loading.value = false
}
await nextTick()
renderWordCloud()
}
+/**
+ * 和代码统计面板一样:打开就查、开着就刷(老师是投在屏幕上盯着看的)。
+ * 流程图统计要给词云分词,比代码统计重,所以 30 秒一次,而且只刷一天以内的时间段 ——
+ * 查一周、一学年的是回头看,不是盯课堂,不必反复重算
+ */
+onMounted(handleStatistics)
+
+const visibility = useDocumentVisibility()
+useIntervalFn(() => {
+ if (visibility.value !== "visible") return
+ if (query.duration === "all") return
+ const d = subOptions.value
+ if (d.weeks || d.months || d.years || (d.days ?? 0) > 1) return
+ handleStatistics()
+}, 30_000)
+
onUnmounted(() => {
if (wordcloudChart) {
wordcloudChart.destroy()
diff --git a/apps/web/src/shared/components/StatisticsPanel.vue b/apps/web/src/shared/components/StatisticsPanel.vue
index 47c3980..4ee2f0a 100644
--- a/apps/web/src/shared/components/StatisticsPanel.vue
+++ b/apps/web/src/shared/components/StatisticsPanel.vue
@@ -18,6 +18,7 @@
统计
前往提交列表
+ 统计没拉下来,15 秒后会自动再试
@@ -104,7 +105,11 @@
恢复 {{ hiddenCount }} 位
-
+
+
+ 没完成的 {{ hiddenCount }} 位都隐藏了
+
+
全都完成了
@@ -647,9 +652,10 @@ const pieChartOptions = {
},
}
-// 环形图数据 - 班级完成度
+// 环形图数据 - 班级完成度。「已完成」和上面数字行的「完成人数」是同一个数(做完的),
+// 原来这里用的是 list.length —— 那是所有交过的人,交了没对的也被画成了已完成
const completionChartData = computed(() => {
- const completedCount = list.value.length
+ const completedCount = doneList.value.length
const uncompletedCount = Math.max(0, adjustedPersonCount.value - completedCount)
return {
labels: ["已完成", "未完成"],
@@ -703,12 +709,21 @@ function goSubmissions() {
}
const loading = ref(false)
+/**
+ * 上一次统计失败了。原来没 catch,请求一失败面板上什么都不说,老师看着的还是旧数字。
+ * 不弹 toast:每 15 秒自动刷新一次,断网时会一直弹
+ */
+const failed = ref(false)
+
async function handleStatistics() {
// 自动刷新和手点可能撞上,上一次没回来就跳过这一次
if (loading.value) return
loading.value = true
try {
await fetchStatistics()
+ failed.value = false
+ } catch {
+ failed.value = true
} finally {
loading.value = false
}