AI 是按分值从高到低返回的:`逻辑正确性(40) → 完整性(30) → 规范性(20) → 清晰度(10)`。 但 `ai_criteria_details` 存在 jsonb 列里,而 Postgres 的 jsonb **不保留键序** —— 它按「键长度 + 字节序」重排,读出来变成 `完整性 → 清晰度 → 规范性 → 逻辑正确性`, 权重最高的那项被排到了最后。 评分弹框和教师端的评分详情都是直接 `v-for` 遍历这个对象,所以两处都乱。 统计面板因为用的是写死的 `CRITERIA_ORDER`,一直是对的 —— 于是同一份数据在两个 地方的顺序还不一致。 把顺序抽到 `utils/constants` 共享,三处统一走 `sortFlowchartCriteria()`; 表里没有的键排到后面,AI 万一返回别的评分项也不会丢。 顺带把限流的提示改得能看懂:撞上 429 时原来只显示「流程图提交失败」,学生会以为 是自己的图有问题然后反复点,越点等得越久。现在按错误码分支,提示「提交太频繁了, 缓一会儿再交」。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -304,6 +304,31 @@ export const RARITY_TEXT_COLOR: Record<
|
||||
}
|
||||
|
||||
// 时间范围配置
|
||||
/**
|
||||
* 流程图评分项的展示顺序(按分值从高到低)。
|
||||
*
|
||||
* `ai_criteria_details` 存在 jsonb 列里,而 Postgres 的 jsonb **不保留键序** ——
|
||||
* 它按「键长度 + 字节序」重排,读出来会变成 完整性 / 清晰度 / 规范性 / 逻辑正确性,
|
||||
* 40 分的那项排到最后。凡是要展示评分明细的地方都按这个顺序排,别直接遍历对象。
|
||||
*/
|
||||
export const FLOWCHART_CRITERIA_ORDER = [
|
||||
"逻辑正确性",
|
||||
"完整性",
|
||||
"规范性",
|
||||
"清晰度",
|
||||
]
|
||||
|
||||
/** 按 FLOWCHART_CRITERIA_ORDER 排序,表里没有的键排在后面并保持原有相对顺序 */
|
||||
export function sortFlowchartCriteria<T>(
|
||||
details: Record<string, T>,
|
||||
): [string, T][] {
|
||||
const rank = (key: string) => {
|
||||
const i = FLOWCHART_CRITERIA_ORDER.indexOf(key)
|
||||
return i === -1 ? Number.MAX_SAFE_INTEGER : i
|
||||
}
|
||||
return Object.entries(details).sort(([a], [b]) => rank(a) - rank(b))
|
||||
}
|
||||
|
||||
export const DURATION_OPTIONS = [
|
||||
{ label: "本节课内", value: "hours:1" },
|
||||
{ label: "两节课内", value: "hours:2" },
|
||||
|
||||
Reference in New Issue
Block a user