fix: разбор показывает все решения и балл карточки после разбора, вес отметки преподавателя в настройке

This commit is contained in:
GGlamer 2026-09-27 23:04:54 +03:00
commit a848f89da0
2 changed files with 10 additions and 4 deletions

View file

@ -90,7 +90,8 @@ export function Debrief({ report, big = false }: { report: SessionReport; big?:
{Boolean(report.card_results?.length) && <section className="debrief-card-results"> {Boolean(report.card_results?.length) && <section className="debrief-card-results">
<h3>Карточки занятия ({report.card_results!.length})</h3> <h3>Карточки занятия ({report.card_results!.length})</h3>
{report.card_results!.map((card, index) => <details key={card.card_id}> {report.card_results!.map((card, index) => <details key={card.card_id}>
<summary>Карточка {index + 1}: {card.title || card.scenario_id} · {card.score_auto.toFixed(0)} / 100 <summary>Карточка {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}` : ""}</summary> {card.address ? ` · ${card.address}` : ""}</summary>
{card.managed_service && <p><strong>Ответственная служба:</strong> {card.managed_service}</p>} {card.managed_service && <p><strong>Ответственная служба:</strong> {card.managed_service}</p>}
<p><strong>Ответ диспетчера:</strong> {card.reply_text || "не внесён"}</p> <p><strong>Ответ диспетчера:</strong> {card.reply_text || "не внесён"}</p>
@ -146,9 +147,9 @@ export function Debrief({ report, big = false }: { report: SessionReport; big?:
{finding.summary} {finding.summary}
<div className="ref">{finding.fact}{finding.norm && ` · ${finding.norm}`}</div> <div className="ref">{finding.fact}{finding.norm && ` · ${finding.norm}`}</div>
{finding.source === "instructor" && <div className="ref">отметка преподавателя {finding.author ?? ""}</div>} {finding.source === "instructor" && <div className="ref">отметка преподавателя {finding.author ?? ""}</div>}
{finding.review && <div className="ref"> {(finding.reviews ?? []).map((review, reviewIndex) => <div className="ref" key={reviewIndex}>
{finding.review.decision === "dismissed" ? "снята" : "подтверждена"} преподавателем: {finding.review.reason} {review.decision === "dismissed" ? "снята" : "подтверждена"} преподавателем {review.author}: {review.reason}
</div>} </div>)}
</td> </td>
</tr> </tr>
))} ))}

View file

@ -39,6 +39,10 @@ const CARD_METRICS = OPERATOR_METRICS.filter(({ key }) => [
"required_fields", "description_grammar", "card_fill_time", "required_fields", "description_grammar", "card_fill_time",
].includes(key)); ].includes(key));
const CALL_METRICS = OPERATOR_METRICS.filter(({ key }) => key !== "card_fill_time"); const CALL_METRICS = OPERATOR_METRICS.filter(({ key }) => key !== "card_fill_time");
// Метрика появляется, только когда ручной отметке преподавателя нечего провалить.
const REVIEW_METRICS: MetricOption[] = [
{ key: "instructor_finding", label: "Отметка преподавателя", hint: "Ручная отметка на разборе без связанной метрики (например, D4)." },
];
export function ScoreWeightsEditor({ export function ScoreWeightsEditor({
exercise, exercise,
@ -57,6 +61,7 @@ export function ScoreWeightsEditor({
: exercise === "card_dds" : exercise === "card_dds"
? [["Карточка КИО", CARD_METRICS], ["Реагирование ДДС", DDS_METRICS]] ? [["Карточка КИО", CARD_METRICS], ["Реагирование ДДС", DDS_METRICS]]
: [["Опрос 112", CALL_METRICS], ["Реагирование ДДС", DDS_METRICS]]; : [["Опрос 112", CALL_METRICS], ["Реагирование ДДС", DDS_METRICS]];
groups.push(["Разбор", REVIEW_METRICS]);
function setWeight(key: string, raw: string) { function setWeight(key: string, raw: string) {
const next = { ...values }; const next = { ...values };