From a848f89da0e2c5e182696209eda3fa92f59c239f Mon Sep 17 00:00:00 2001 From: GGlamer <52128225+Gamer201760@users.noreply.github.com> Date: Sun, 27 Sep 2026 23:04:54 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20=D1=80=D0=B0=D0=B7=D0=B1=D0=BE=D1=80=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BA=D0=B0=D0=B7=D1=8B=D0=B2=D0=B0=D0=B5=D1=82=20?= =?UTF-8?q?=D0=B2=D1=81=D0=B5=20=D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=B8=20=D0=B1=D0=B0=D0=BB=D0=BB=20=D0=BA=D0=B0=D1=80=D1=82?= =?UTF-8?q?=D0=BE=D1=87=D0=BA=D0=B8=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B7=D0=B1=D0=BE=D1=80=D0=B0,=20=D0=B2=D0=B5?= =?UTF-8?q?=D1=81=20=D0=BE=D1=82=D0=BC=D0=B5=D1=82=D0=BA=D0=B8=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B5=D0=BF=D0=BE=D0=B4=D0=B0=D0=B2=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=B2=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B9=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/features/debrief/Debrief.tsx | 9 +++++---- frontend/src/features/instructor/ScoreWeightsEditor.tsx | 5 +++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/frontend/src/features/debrief/Debrief.tsx b/frontend/src/features/debrief/Debrief.tsx index 8d69d3b..59b28df 100644 --- a/frontend/src/features/debrief/Debrief.tsx +++ b/frontend/src/features/debrief/Debrief.tsx @@ -90,7 +90,8 @@ export function Debrief({ report, big = false }: { report: SessionReport; big?: {Boolean(report.card_results?.length) &&

Карточки занятия ({report.card_results!.length})

{report.card_results!.map((card, index) =>
- Карточка {index + 1}: {card.title || card.scenario_id} · {card.score_auto.toFixed(0)} / 100 + Карточка {index + 1}: {card.title || card.scenario_id} · {(card.score_reviewed ?? card.score_auto).toFixed(0)} / 100 + {card.score_reviewed != null && ` после разбора (автооценка ${card.score_auto.toFixed(0)})`} {card.address ? ` · ${card.address}` : ""} {card.managed_service &&

Ответственная служба: {card.managed_service}

}

Ответ диспетчера: {card.reply_text || "не внесён"}

@@ -146,9 +147,9 @@ export function Debrief({ report, big = false }: { report: SessionReport; big?: {finding.summary}
{finding.fact}{finding.norm && ` · ${finding.norm}`}
{finding.source === "instructor" &&
отметка преподавателя {finding.author ?? ""}
} - {finding.review &&
- {finding.review.decision === "dismissed" ? "снята" : "подтверждена"} преподавателем: {finding.review.reason} -
} + {(finding.reviews ?? []).map((review, reviewIndex) =>
+ {review.decision === "dismissed" ? "снята" : "подтверждена"} преподавателем {review.author}: {review.reason} +
)} ))} diff --git a/frontend/src/features/instructor/ScoreWeightsEditor.tsx b/frontend/src/features/instructor/ScoreWeightsEditor.tsx index 9f81065..8134184 100644 --- a/frontend/src/features/instructor/ScoreWeightsEditor.tsx +++ b/frontend/src/features/instructor/ScoreWeightsEditor.tsx @@ -39,6 +39,10 @@ const CARD_METRICS = OPERATOR_METRICS.filter(({ key }) => [ "required_fields", "description_grammar", "card_fill_time", ].includes(key)); const CALL_METRICS = OPERATOR_METRICS.filter(({ key }) => key !== "card_fill_time"); +// Метрика появляется, только когда ручной отметке преподавателя нечего провалить. +const REVIEW_METRICS: MetricOption[] = [ + { key: "instructor_finding", label: "Отметка преподавателя", hint: "Ручная отметка на разборе без связанной метрики (например, D4)." }, +]; export function ScoreWeightsEditor({ exercise, @@ -57,6 +61,7 @@ export function ScoreWeightsEditor({ : exercise === "card_dds" ? [["Карточка КИО", CARD_METRICS], ["Реагирование ДДС", DDS_METRICS]] : [["Опрос 112", CALL_METRICS], ["Реагирование ДДС", DDS_METRICS]]; + groups.push(["Разбор", REVIEW_METRICS]); function setWeight(key: string, raw: string) { const next = { ...values };