lct-50: таймеры ДДС — 30 с до открытия карточки, 3 минуты до первой записи
This commit is contained in:
parent
8ff51a8955
commit
51ef99c472
18 changed files with 169 additions and 169 deletions
|
|
@ -241,12 +241,23 @@ def _refused(message: str) -> DeskOutcome:
|
|||
|
||||
|
||||
def _start_work_timer(card: DdsLiveCard) -> None:
|
||||
"""Три минуты на работу идут один раз — с открытия карточки."""
|
||||
"""Открытие карточки: останавливает 30 с и запускает 3 мин — один раз.
|
||||
|
||||
Автоматическая активация первой карточки очереди открытием не считается:
|
||||
карточка стоит в строке сообщений, пока диспетчер её не откроет. Первое
|
||||
действие по карточке без явного открытия тоже доказывает, что она открыта.
|
||||
"""
|
||||
timer = card.timers.timers.get(TimerCode.DDS_WORK)
|
||||
if timer is None or timer.started_at is None:
|
||||
card.on_event("dds.open")
|
||||
|
||||
|
||||
def _first_record(card: DdsLiveCard, comment: str) -> None:
|
||||
"""Первая запись — ручной статус с текстом; она закрывает 3 минуты (П.5)."""
|
||||
if comment.strip():
|
||||
card.on_event("dds.record")
|
||||
|
||||
|
||||
def _line(card: DdsLiveCard, speaker: str, text: str) -> PhoneLine | None:
|
||||
call = card.phone_pending
|
||||
if call is None:
|
||||
|
|
@ -436,17 +447,17 @@ class DdsDesk(BaseModel):
|
|||
return _refused("Для подтверждения приёма добавьте комментарий с основанием")
|
||||
if any(action == "card.ack" for action, _at, _detail in card.dds_log):
|
||||
return DeskOutcome()
|
||||
card.on_event("card.ack")
|
||||
card.dds_log.append(("card.ack", now_utc(), None))
|
||||
_start_work_timer(card)
|
||||
services = session.card_services(card)
|
||||
if services:
|
||||
_start_work_timer(card)
|
||||
try:
|
||||
card.set_service_status(
|
||||
services[0], ServiceStatus.ACCEPTED, command.comment,
|
||||
author="диспетчер",
|
||||
)
|
||||
session.consecutive_refusals = 0
|
||||
_first_record(card, command.comment)
|
||||
except StatusError:
|
||||
pass # статус уже стоит: повторное нажатие ничего не меняет
|
||||
case "card.status":
|
||||
|
|
@ -460,9 +471,8 @@ class DdsDesk(BaseModel):
|
|||
card.set_service_status(
|
||||
command.service, command.status, command.comment, author="диспетчер"
|
||||
)
|
||||
# Первичный статус останавливает норматив 30 секунд.
|
||||
_first_record(card, command.comment)
|
||||
if command.status in PRIMARY:
|
||||
card.on_event("card.ack")
|
||||
# Сигнал реестра "повторные отказы" считает подряд идущие
|
||||
# отказы, а не сумму за занятие.
|
||||
session.consecutive_refusals = (
|
||||
|
|
@ -470,10 +480,6 @@ class DdsDesk(BaseModel):
|
|||
if command.status is ServiceStatus.DECLINED
|
||||
else 0
|
||||
)
|
||||
if command.status in {
|
||||
ServiceStatus.COMPLETED, ServiceStatus.DECLINED, ServiceStatus.REFUSED,
|
||||
}:
|
||||
card.on_event("dds.complete")
|
||||
case "crew.select":
|
||||
if command.crew not in session.crew_options(card):
|
||||
return _refused("Выберите бригаду из списка доступных")
|
||||
|
|
|
|||
Loading…
Reference in a new issue