Биржа поручений Mesh ночного режима для МЧС

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

8

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

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

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

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

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

#define MODULE_TAG "MCS_TASK_MESH_NIGHT"
#define TASK_LIMIT 24

enum e_task
{
    bool:used,
    status,
    owner,
    caption[64]
};
new MCS_Tasks[TASK_LIMIT][e_task];

CMD:taskmeshnighstatres(playerid, const params[])
{
    SendClientMessage(playerid, 0xF5DEB3FF, "[%s] Биржа задач:", MODULE_TAG);
    for(new i = 0; i < TASK_LIMIT; i++)
    {
        if(!MCS_Tasks[i][used]) continue;
        new msg[144];
        format(msg, sizeof msg, "#%d [%d] %s | Исп: %d", i, MCS_Tasks[i][status], MCS_Tasks[i][caption], MCS_Tasks[i][owner]);
        SendClientMessage(playerid, 0xFFFACDFF, msg);
    }
    return 1;
}

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

    if(!strcmp(action, "add", true))
    {
        if(sscanf(params, "s[8]is[64]", action, slot, text)) return SendClientMessage(playerid, -1, "/taskmeshnighctlres add [слот] [текст]");
        MCS_Tasks[slot][used] = true;
        MCS_Tasks[slot][status] = 0;
        MCS_Tasks[slot][owner] = INVALID_PLAYER_ID;
        format(MCS_Tasks[slot][caption], 64, "%s", text);
        SendClientMessage(playerid, 0x32CD32FF, "[%s] Задача #%d создана.", MODULE_TAG, slot);
    }
    else if(!strcmp(action, "assign", true))
    {
        if(sscanf(params, "s[8]ii", action, slot, target)) return SendClientMessage(playerid, -1, "/taskmeshnighctlres assign [слот] [игрок]");
        if(!MCS_Tasks[slot][used]) return SendClientMessage(playerid, 0xDC143CFF, "[%s] Нет такой задачи.", MODULE_TAG);
        MCS_Tasks[slot][owner] = target;
        MCS_Tasks[slot][status] = 1;
        SendClientMessage(target, 0xDAA520FF, "[%s] Вам назначена задача #%d.", MODULE_TAG, slot);
    }
    else if(!strcmp(action, "close", true))
    {
        if(sscanf(params, "s[8]ii", action, slot, status)) return SendClientMessage(playerid, -1, "/taskmeshnighctlres close [слот] [0/1]");
        if(!MCS_Tasks[slot][used]) return SendClientMessage(playerid, 0xDC143CFF, "[%s] Пустой слот.", MODULE_TAG);
        if(status == 1 && MCS_Tasks[slot][owner] == INVALID_PLAYER_ID) return SendClientMessage(playerid, 0xFF0000FF, "[%s] Нужен исполнитель.", MODULE_TAG);
        MCS_Tasks[slot][status] = status ? 2 : 0;
        if(status)
        {
            new msg[96];
            format(msg, sizeof msg, "[%s] #%d завершена.", MODULE_TAG, slot);
            SendClientMessage(MCS_Tasks[slot][owner], 0x32CD32FF, msg);
        }
    }
    return 1;
}

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

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

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

Сверху