lct-50: таймеры ДДС — 30 с до открытия карточки, 3 минуты до первой записи
This commit is contained in:
parent
8ff51a8955
commit
51ef99c472
18 changed files with 169 additions and 169 deletions
|
|
@ -22,7 +22,7 @@ from app.domain.statuses import (
|
|||
)
|
||||
from app.domain.taxonomy import Competency, ErrorCode, Finding, FindingSource
|
||||
from app.domain.events import Metric
|
||||
from app.domain.timers import GOST_REF
|
||||
from app.domain.timers import GOST_REF, TimerCode
|
||||
|
||||
#: Статусы, означающие, что реагирование действительно шло.
|
||||
PROGRESS = (ServiceStatus.RESPONDING, ServiceStatus.ARRIVED, ServiceStatus.WORKING)
|
||||
|
|
@ -161,37 +161,37 @@ def evaluate_dispatcher(
|
|||
),
|
||||
))
|
||||
|
||||
# D1 — первичного статуса нет либо он проставлен позже норматива.
|
||||
# D1 — карточка открыта позже норматива или не открыта вовсе. 30 с идут
|
||||
# от появления карточки в строке сообщений до её открытия (ответ
|
||||
# заказчика, П.5); `elapsed_ms` — зафиксированное время открытия.
|
||||
if elapsed_ms is None or elapsed_ms > deadline_ms:
|
||||
findings.append(
|
||||
_finding(
|
||||
ErrorCode.D1,
|
||||
(f"{service}: карточка открыта с нарушением срока"
|
||||
if elapsed_ms is not None else f"{service}: карточка не открыта"),
|
||||
fact=(
|
||||
f"открыта через {elapsed_ms // 1000} с"
|
||||
if elapsed_ms is not None
|
||||
else "карточка не открыта до конца занятия"
|
||||
),
|
||||
norm=f"открыть карточку в течение {deadline_ms // 1000} с",
|
||||
)
|
||||
)
|
||||
|
||||
# D1 — первичного статуса нет: карточка ушла в «Не оповещено».
|
||||
primary = next((mark for mark in marks if mark.status in PRIMARY), None)
|
||||
if primary is None:
|
||||
findings.append(
|
||||
_finding(
|
||||
ErrorCode.D1,
|
||||
f"{service}: статус реагирования не проставлен",
|
||||
fact=(
|
||||
f"прошло {elapsed_ms // 1000} с"
|
||||
if elapsed_ms is not None
|
||||
else "карточка осталась без отметки"
|
||||
),
|
||||
norm=f"первичный статус в течение {deadline_ms // 1000} с",
|
||||
fact="карточка осталась без первичного статуса",
|
||||
norm="проставить «Принята» или «Не принята» с комментарием",
|
||||
)
|
||||
)
|
||||
continue
|
||||
|
||||
if elapsed_ms is None or elapsed_ms > deadline_ms:
|
||||
findings.append(
|
||||
_finding(
|
||||
ErrorCode.D1,
|
||||
f"{service}: первичный статус проставлен с нарушением срока",
|
||||
fact=(
|
||||
f"прошло {elapsed_ms // 1000} с"
|
||||
if elapsed_ms is not None
|
||||
else "время первичной отметки не зафиксировано"
|
||||
),
|
||||
norm=f"первичный статус в течение {deadline_ms // 1000} с",
|
||||
)
|
||||
)
|
||||
|
||||
for mark in marks:
|
||||
# D4 — отказ без комментария.
|
||||
if mark.status in REFUSAL_COMMENT_REQUIRED and not mark.comment.strip():
|
||||
|
|
@ -307,13 +307,14 @@ def dispatcher_metrics(
|
|||
))
|
||||
|
||||
primary = next((mark for mark in marks if mark.status in PRIMARY), None)
|
||||
elapsed = (int((primary.at - state.dispatched_at).total_seconds() * 1000)
|
||||
if primary and state.dispatched_at else None)
|
||||
# Время открытия — то, что зафиксировал таймер событием, а не разница
|
||||
# отметок: 30 с по ответу заказчика идут до открытия карточки.
|
||||
elapsed = state.timers.measured_ms(TimerCode.DDS_ACK)
|
||||
add("dds_primary", "решение по карточке", primary is not None,
|
||||
primary.status.value if primary else "решение отсутствует", "Принята или Не принята", 2.0)
|
||||
add("dds_ack", f"первичная отметка за {deadline_ms // 1000} с",
|
||||
add("dds_ack", f"открытие карточки за {deadline_ms // 1000} с",
|
||||
elapsed is not None and elapsed <= deadline_ms,
|
||||
f"{elapsed / 1000:.1f} с" if elapsed is not None else "не отмечено",
|
||||
f"{elapsed / 1000:.1f} с" if elapsed is not None else "карточка не открыта",
|
||||
f"≤ {deadline_ms // 1000} с")
|
||||
if primary is None:
|
||||
continue
|
||||
|
|
|
|||
Loading…
Reference in a new issue