lct-55: ошибка адреса и сообщение в 112

This commit is contained in:
kaifarikman 2026-09-28 00:55:28 +03:00 • committed by gglamer
commit e2d3c56576
14 changed files with 267 additions and 7 deletions

View file

@ -103,6 +103,8 @@ export function Debrief({ report, big = false }: { report: SessionReport; big?:
{card.address ? ` · ${card.address}` : ""}</summary>
{card.managed_service && <p><strong>Ответственная служба:</strong> {card.managed_service}</p>}
<p><strong>Ответ диспетчера:</strong> {card.reply_text || "не внесён"}</p>
{(card.actions ?? []).filter((action) => action.type === "card.error_report_112").map((action, actionIndex) =>
<p key={`report-112-${actionIndex}`}><strong>Сообщение об ошибке в 112:</strong> {String(action.text ?? "")}</p>)}
{card.metrics.some((metric) => !metric.passed || (metric.credit != null && metric.credit < 1)) && <ul>
{card.metrics.filter((metric) => !metric.passed || (metric.credit != null && metric.credit < 1)).map((metric) =>
<li key={metric.key} className={metric.passed ? "ref" : "state-violated"}>

View file

@ -242,6 +242,7 @@ export function Dds() {
const [crewReplyText, setCrewReplyText] = useState("");
const [adjacentTarget, setAdjacentTarget] = useState("");
const [adjacentText, setAdjacentText] = useState("");
const [report112Text, setReport112Text] = useState("");
const [error, setError] = useState("");
const [ended, setEnded] = useState(false);
const [paused, setPaused] = useState(false);
@ -295,6 +296,7 @@ export function Dds() {
setCrewReplyText("");
setAdjacentTarget("");
setAdjacentText("");
setReport112Text("");
setZone(null);
setScoreReady(false);
setView(openCardAfterSwitch.current ? "card" : "registry");
@ -719,6 +721,20 @@ export function Dds() {
{adjacentLines.map((line, index) => <p key={`${line.at}-${index}`}><small>{time(line.at)} · {line.speaker === "crew" ? line.crew : "Диспетчер ДДС"}</small><br />{line.text}</p>)}
</div>}
</>}
{station?.card_error_discovered && <div className="dds-phone-form">
<h3>Сообщение об ошибке карточки в 112</h3>
{station.report_112_text ? <p>Сообщено в 112: {station.report_112_text}</p> : <>
<p>После доклада бригады сообщите оператору 112, что указано в карточке и что установлено на месте.</p>
<label htmlFor="dds-report-112">Содержание сообщения</label>
<textarea id="dds-report-112" rows={3} value={report112Text}
disabled={!isConnected || ended || paused}
onChange={(event) => setReport112Text(event.target.value)} />
<button type="button" disabled={!cardId || !isConnected || ended || paused || report112Text.trim().length < 10}
onClick={() => send({ type: "card.error_report_112", card_id: cardId, text: report112Text })}>
Зафиксировать сообщение в 112
</button>
</>}
</div>}
</section>}
{pane === "reply" && <section className="dds-panel dds-reply">
<div className="dds-panel-title"><h2>Рабочая заметка диспетчера</h2>

View file

@ -393,6 +393,9 @@ export function Instructor() {
<small>{report.text}</small>
</p>)}
</div> : null}
{item.dds_snapshot.report_112_text && <p className="active-session-log">
<strong>Сообщено в 112 об ошибке карточки:</strong> {item.dds_snapshot.report_112_text}
</p>}
</details>}</td>
<td>{item.exercise === "dds" ? `Открытых карточек: ${item.dds_open_cards}` : "—"}</td>
<td className={item.dds_overdue_cards ? "state-violated" : "state-ok"}>

View file

@ -108,6 +108,13 @@ export interface CardBriefing {
handoff_to_dds?: boolean;
}
/** Сообщение диспетчера в 112 после доклада бригады с места. */
export interface CardErrorReport112 {
type: "card.error_report_112";
card_id: string;
text: string;
}
export interface CardNext {
type: "card.next";
card_id: string;
@ -719,6 +726,8 @@ export interface StationSnapshot {
phone_reports?: Array<PhoneReportRecord>;
phone_lines?: Array<PhoneLineRecord>;
phone_pending?: PhoneCallPending | null;
card_error_discovered?: boolean;
report_112_text?: string | null;
card_id?: string | null;
card_index?: number;
card_total?: number;
@ -847,7 +856,7 @@ export type InstructorToServer = ScenarioStart | DirectorInject | ReferencePlay
export type ServerToStation = CardReceived | StationState | PhoneLine | PhoneReport | TimerTick | SessionEnded | ScoreReady | CommandAck | SessionPaused | ErrorEvent;
export type StationToServer = CardAck | CardBounce | ServiceStatusSet | CrewSelect | PhoneDial | PhoneBrief | PhoneCheck | PhoneHangup | PhoneReply | AdjacentDial | StationFinish | CardReply | CardNext | CardOpen | ZoneDecision | CrewDispatched | CrewArrived;
export type StationToServer = CardAck | CardBounce | ServiceStatusSet | CrewSelect | PhoneDial | PhoneBrief | PhoneCheck | PhoneHangup | PhoneReply | AdjacentDial | StationFinish | CardReply | CardErrorReport112 | CardNext | CardOpen | ZoneDecision | CrewDispatched | CrewArrived;
export type EventName =
"adjacent.dial"
@ -864,6 +873,7 @@ export type EventName =
| "card.ack"
| "card.bounce"
| "card.briefing"
| "card.error_report_112"
| "card.next"
| "card.open"
| "card.received"