merge: AI assessment re-evaluation controls

bugfix/ai-assessment-evidence-rescore
chenyuan 1 month ago
commit 2513f591ef

@ -34,7 +34,7 @@
<span class="evaluation-status" :class="`evaluation-status--${assessmentStatus.toLowerCase()}`">{{ statusLabel(assessmentStatus) }}</span> <span class="evaluation-status" :class="`evaluation-status--${assessmentStatus.toLowerCase()}`">{{ statusLabel(assessmentStatus) }}</span>
</div> </div>
<p class="evaluation-panel__hint">AI将基于已填写的答案给出综合评分和改进方向。</p> <p class="evaluation-panel__hint">AI根据已保存的答案评分。修改并保存答案后可重新助评;答案未变时保留上次结果。</p>
<el-button :loading="assessmentLoading" :disabled="isAssessmentDisabled" type="primary" @click="confirmAssessment"> <el-button :loading="assessmentLoading" :disabled="isAssessmentDisabled" type="primary" @click="confirmAssessment">
{{ assessmentActionLabel }} {{ assessmentActionLabel }}
</el-button> </el-button>
@ -90,9 +90,11 @@ const assessmentReport = computed(() => normalizedReports.value.assessmentReport
const score = computed(() => normalizedReports.value.score); const score = computed(() => normalizedReports.value.score);
const scoreCriteria = computed(() => normalizedReports.value.scoreCriteria); const scoreCriteria = computed(() => normalizedReports.value.scoreCriteria);
const isHelpDisabled = computed(() => !props.hasAnyAnswer || helpLoading.value || isTerminal(helpStatus.value)); const isHelpDisabled = computed(() => !props.hasAnyAnswer || helpLoading.value || isTerminal(helpStatus.value));
const isAssessmentDisabled = computed(() => !props.hasAnyAnswer || assessmentLoading.value || isTerminal(assessmentStatus.value)); const isAssessmentDisabled = computed(() => !props.hasAnyAnswer || assessmentLoading.value || assessmentStatus.value === "PROCESSING");
const helpActionLabel = computed(() => actionLabel(helpStatus.value, "生成助学建议", helpLoading.value)); const helpActionLabel = computed(() => actionLabel(helpStatus.value, "生成助学建议", helpLoading.value));
const assessmentActionLabel = computed(() => actionLabel(assessmentStatus.value, "请求AI助评", assessmentLoading.value)); const assessmentActionLabel = computed(() => assessmentStatus.value === "SUCCEEDED" && !assessmentLoading.value
? "重新助评"
: actionLabel(assessmentStatus.value, "请求AI助评", assessmentLoading.value));
onMounted(() => loadEvaluation()); onMounted(() => loadEvaluation());
@ -136,7 +138,7 @@ async function requestHelp() {
async function confirmAssessment() { async function confirmAssessment() {
if (isAssessmentDisabled.value || !props.taskKey) return; if (isAssessmentDisabled.value || !props.taskKey) return;
try { try {
await proxy?.$modal?.confirm("AI将根据当前已填写的内容进行评估,是否继续?", "提示"); await proxy?.$modal?.confirm("AI将根据当前已保存的答案进行评估,答案未变时保留上次结果,是否继续?", "提示");
} catch (error) { } catch (error) {
return; return;
} }

@ -64,7 +64,8 @@
</div> </div>
<p v-if="currentTaskKey && !hasSavedAnswer" class="assessment-hint">请先至少填写并保存一项实训内容,再请求 AI 助评。</p> <p v-if="currentTaskKey && !hasSavedAnswer" class="assessment-hint">请先至少填写并保存一项实训内容,再请求 AI 助评。</p>
<el-button class="assessment-button" :loading="assessmentLoading" :disabled="!currentTaskKey || !hasSavedAnswer || assessmentLoading" @click="requestEvaluation">AI智能评分</el-button> <p v-else-if="currentTaskKey" class="assessment-hint">修改并保存答案后可重新助评;答案未变时保留上次结果。</p>
<el-button class="assessment-button" :loading="assessmentLoading" :disabled="!currentTaskKey || !hasSavedAnswer || assessmentLoading" @click="requestEvaluation">{{ reports.assessment.status === "SUCCEEDED" ? "重新助评" : "AI智能评分" }}</el-button>
</section> </section>
</aside> </aside>
</template> </template>

@ -65,3 +65,12 @@ assert(/hasSavedAnswer/.test(page) && /:has-saved-answer="hasSavedAnswer"/.test(
assert(/hasSavedAnswer/.test(sidebar), "AI sidebar should accept persisted-answer state"); assert(/hasSavedAnswer/.test(sidebar), "AI sidebar should accept persisted-answer state");
assert(/!props\.hasSavedAnswer/.test(sidebar), "AI assessment should be disabled until a saved answer exists"); assert(/!props\.hasSavedAnswer/.test(sidebar), "AI assessment should be disabled until a saved answer exists");
assert(/catch \(error\)/.test(sidebar), "AI sidebar should handle assessment failures without an unhandled rejection"); assert(/catch \(error\)/.test(sidebar), "AI sidebar should handle assessment failures without an unhandled rejection");
assert(/const isAssessmentDisabled = computed\(\(\) => !props\.hasAnyAnswer \|\| assessmentLoading\.value \|\| assessmentStatus\.value === "PROCESSING"\)/.test(component),
"successful assessments should remain available for checking changed saved answers");
assert(/assessmentStatus\.value === "SUCCEEDED"[\s\S]*?\? "重新助评"/.test(component),
"successful assessments should expose the reassessment action");
assert(/reports\.assessment\.status === "SUCCEEDED" \? "重新助评" : "AI智能评分"/.test(sidebar),
"the shared sidebar should expose the reassessment action");
assert(component.includes("答案未变时保留上次结果") && sidebar.includes("答案未变时保留上次结果"),
"both assessment controls should explain saved-answer reuse");

Loading…
Cancel
Save