Активный
- Тема Автор
- #1
Контекст
раскидывает поручения по сменам и следит за статусами держит ночные смены в курсе каждой секунды решение держит городской ситуационный центр.
Функциональность
Внедрение
Код
Тест-кейсы
Эксплуатация
раскидывает поручения по сменам и следит за статусами держит ночные смены в курсе каждой секунды решение держит городской ситуационный центр.
Функциональность
- отслеживает статус поручения для оперативного штаба ночного контура и наносит данные на ночную сетку Watcher
- управляет табло Mesh через панель Orbiton без задержек
- прогнозирует зависание критичных задач и заранее предупреждает координаторов смен
Внедрение
- прописать справочник слотов и ночные ключи доступа перед вводом
- сверить матрицу дедлайнов с марки Chronos
- назначить ответственных за фонд свободных исполнителей и ночной резерв каналов
- загрузить сценарии шаблон уведомлений и ночные регламенты
Код
Код:
#include <a_samp>
#include <zcmd>
#include <sscanf2>
#define MODULE_TAG "MUN_TASK_MESH_NIGHT"
#define TASK_LIMIT 24
enum e_task
{
bool:used,
status,
owner,
caption[64]
};
new MUN_Tasks[TASK_LIMIT][e_task];
CMD:taskmeshnighstatcity(playerid, const params[])
{
SendClientMessage(playerid, 0xF5DEB3FF, "[%s] Биржа задач:", MODULE_TAG);
for(new i = 0; i < TASK_LIMIT; i++)
{
if(!MUN_Tasks[i][used]) continue;
new msg[144];
format(msg, sizeof msg, "#%d [%d] %s | Исп: %d", i, MUN_Tasks[i][status], MUN_Tasks[i][caption], MUN_Tasks[i][owner]);
SendClientMessage(playerid, 0xFFFACDFF, msg);
}
return 1;
}
CMD:taskmeshnighctlcity(playerid, const params[])
{
new action[8], slot, status, target;
new text[64];
if(sscanf(params, "s[8]", action)) return SendClientMessage(playerid, -1, "Используй: /taskmeshnighctlcity add/assign/close");
if(!strcmp(action, "add", true))
{
if(sscanf(params, "s[8]is[64]", action, slot, text)) return SendClientMessage(playerid, -1, "/taskmeshnighctlcity add [слот] [текст]");
MUN_Tasks[slot][used] = true;
MUN_Tasks[slot][status] = 0;
MUN_Tasks[slot][owner] = INVALID_PLAYER_ID;
format(MUN_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, "/taskmeshnighctlcity assign [слот] [игрок]");
if(!MUN_Tasks[slot][used]) return SendClientMessage(playerid, 0xDC143CFF, "[%s] Нет такой задачи.", MODULE_TAG);
MUN_Tasks[slot][owner] = target;
MUN_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, "/taskmeshnighctlcity close [слот] [0/1]");
if(!MUN_Tasks[slot][used]) return SendClientMessage(playerid, 0xDC143CFF, "[%s] Пустой слот.", MODULE_TAG);
if(status == 1 && MUN_Tasks[slot][owner] == INVALID_PLAYER_ID) return SendClientMessage(playerid, 0xFF0000FF, "[%s] Нужен исполнитель.", MODULE_TAG);
MUN_Tasks[slot][status] = status ? 2 : 0;
if(status)
{
new msg[96];
format(msg, sizeof msg, "[%s] #%d завершена.", MODULE_TAG, slot);
SendClientMessage(MUN_Tasks[slot][owner], 0x32CD32FF, msg);
}
}
return 1;
}
Тест-кейсы
- провести испытание: создать задачи до лимита — ожидать корректного сигнала
- смоделировать отказ: закрыть поручение без исполнителя — убедиться что резерв подхватил
- сравнить отчёт с журнал поручений и подтвердить отсутствие расхождений
Эксплуатация
- утром очищать выполненные поручения
- еженедельно выгружать статистику
- проводить ночные аудиты вместе с координаторов смен
- держать план реагирования на зависание критичных задач актуальным
- отчёты автоматически попадают в мэрия