Менеджер волонтёрских смен Loop ночного режима для МЧС

Активный
Статус
Сообщения
516
Лайки
32

8

месяц на сайте

Контекст
сводит добровольцев и их часы допуска держит ночные смены в курсе каждой секунды координирует спасательные штабы.

Функциональность
  • отслеживает часы дежурства для корпуса добровольцев ночного контура и наносит данные на ночную сетку Watcher
  • управляет карточки Loop через панель Beacon без задержек
  • прогнозирует провал смен и заранее предупреждает координаторов волонтёров

Внедрение
  • прописать лист ожидания и ночные ключи доступа перед вводом
  • сверить расписание смен с марки Chronos
  • назначить ответственных за лист резерва и ночной резерв каналов
  • загрузить сценарии инструктаж допуска и ночные регламенты

Код
Код:
#include <a_samp>
#include <zcmd>
#include <sscanf2>

#define MODULE_TAG "MCS_VOLUNTEER_LOOP_NIGHT"
#define VOL_CAP 18

enum e_vol
{
    bool:used,
    playerid,
    hours,
    status
};
new MCS_Volunteers[VOL_CAP][e_vol];

stock MCS_FindByPlayer(playerid)
{
    for(new i = 0; i < VOL_CAP; i++)
    {
        if(MCS_Volunteers[i][used] && MCS_Volunteers[i][playerid] == playerid) return i;
    }
    return -1;
}

CMD:volunteerloostatres(playerid, const params[])
{
    new idx = MCS_FindByPlayer(playerid);
    if(idx == -1) return SendClientMessage(playerid, 0xDC143CFF, "[%s] Вы не записаны на смену.", MODULE_TAG);
    new msg[128];
    format(msg, sizeof msg, "[%s] Слот #%d | Часы: %d | Статус: %d", MODULE_TAG, idx, MCS_Volunteers[idx][hours], MCS_Volunteers[idx][status]);
    SendClientMessage(playerid, 0x98FB98FF, msg);
    return 1;
}

CMD:volunteerlooctlres(playerid, const params[])
{
    new action[8], slot, target, hours, status;
    if(sscanf(params, "s[8]", action)) return SendClientMessage(playerid, -1, "Используй: /volunteerlooctlres add/update/reset");

    if(!strcmp(action, "add", true))
    {
        if(sscanf(params, "s[8]iii", action, slot, target, hours)) return SendClientMessage(playerid, -1, "/volunteerlooctlres add [слот] [id] [часы]");
        if(MCS_FindByPlayer(target) != -1) return SendClientMessage(playerid, 0xFF0000FF, "[%s] Игрок уже в сетке.", MODULE_TAG);
        MCS_Volunteers[slot][used] = true;
        MCS_Volunteers[slot][playerid] = target;
        MCS_Volunteers[slot][hours] = hours;
        MCS_Volunteers[slot][status] = 1;
        SendClientMessage(target, 0x32CD32FF, "[%s] Вы записаны на смену #%d.", MODULE_TAG, slot);
    }
    else if(!strcmp(action, "update", true))
    {
        if(sscanf(params, "s[8]iiii", action, slot, hours, status, target)) return SendClientMessage(playerid, -1, "/volunteerlooctlres update [слот] [часы] [статус] [id]");
        MCS_Volunteers[slot][hours] = hours;
        MCS_Volunteers[slot][status] = status;
        MCS_Volunteers[slot][playerid] = target;
        SendClientMessage(target, 0xFFD700FF, "[%s] Параметры смены обновлены.", MODULE_TAG);
    }
    else if(!strcmp(action, "reset", true))
    {
        if(sscanf(params, "s[8]i", action, slot)) return SendClientMessage(playerid, -1, "/volunteerlooctlres reset [слот]");
        MCS_Volunteers[slot][used] = false;
    }
    return 1;
}

Тест-кейсы
  • провести испытание: проставить все слоты и проверить очередь — ожидать корректного сигнала
  • смоделировать отказ: обновить статус допуска на лету — убедиться что резерв подхватил
  • сравнить отчёт с журнал добровольцев и подтвердить отсутствие расхождений

Эксплуатация
  • в конце суток очищать сетку
  • раз в месяц актуализировать контакты
  • проводить ночные аудиты вместе с координаторов волонтёров
  • держать план реагирования на провал смен актуальным
  • отчёты автоматически попадают в штаб МЧС
 

1 человек читают эту тему (Всего: 1, Пользователей: 0, Гостей: 1)

Сверху