====== msc (сервисное обслуживание со считывателями) ======
Модуль msc (Machinery Service Control) предназначен для работы со считывателями rfid-карт, установленными на технологическом оборудовании, которое требует периодического тех.обслуживания. Поднесение карты к считывателю фиксирует факт выполнения поставленное мастером задачи по обслуживанию конкретного оборудования.
Модуль msc осуществляет подключение к серверу данных по протоколу rpsvr, опрашивающему считыватели, и подключение к базе данных firebird.
Если база данных не существует, то создается автоматически. Для существующей базы данных проводится проверка на наличие определенных метаданных, и если не найдено, то создается необходимая структура. Все объекты метаданных имеют в имени определенный префикс, называемый схемой. Таким образом модуль msc может соседствовать в базе с другими данными, например, с весовым учетом.
====== Конфигурация ======
Пример конфигурационного файла:
^Параметр^По умолчанию^Описание^
|**db** | ''db'' |Модуль базы данных |
|**refmod** | - |Модуль, содержащий теги от считывателей |
|**script** | ''msc'' |Имя dbscr-скрипта |
|**schema** | ''msc'' |Название схемы (префикс для имен метаобъектов в базе данных) |
====== Основные таблицы ======
Во многих таблицах встречается поле deleted. Если значение в нем не равно 0, то запись считается удаленной и не будет участвовать при создании новых задач.
===== reader =====
create table {schema}_READER (
ID integer not null primary key,
ISGROUP smallint default 0,
NAME varchar(128),
IDNAME varchar(64),
READERTYPE varchar(64),
DELETED smallint default 0
)
**ISGROUP** -- 0 - обычная запись, 1 - группа\\
**NAME** - текстовое название считывателя\\
**IDNAME** - имя модуля считывателя, по которому будут созданы теги\\
**READERTYPE** - пока только ''promauto''\\
===== person =====
create table {schema}_PERSON (
ID integer not null primary key,
ISGROUP smallint default 0,
NAME varchar(128),
DELETED smallint default 0
)
Владельцы карт.
===== card =====
create table {schema}_CARD (
ID integer not null primary key,
PERSON_ID integer references {schema}_PERSON on delete cascade on update cascade,
CODE varchar(32),
DT_CREATE timestamp,
DELETED smallint default 0
)
Карты.
**CODE** - код карты в десятичном формате, пример: "89,11,36277"
===== schedule =====
create table {schema}_SCHEDULE (
ID integer not null primary key,
READER_ID integer references {schema}_READER on delete cascade on update cascade,
TIMETBL varchar(1024),
DURATION integer,
DESCR varchar(256),
AUTOTASK smallint default 1,
DELETED smallint default 0
)
Расписание по которому будут генерироваться задачи.
**TIMETABLE** - задание время для автоматического создания задач. Формат записи на примерах:
|e/0800 |Ежедневно в 8:00 |
|e/0800 0830 |Ежедневно в 8:00 и 8:30 |
|w 1 2 3 4 5/0800 0830 |Каждую неделю по будням в 8:00 и 8:30 |
|m 1 10 20/0000 1200 |Каждый месяц 1-го, 10-го и 20-го числа в 00:00 и 12:00 |
|d 20160621 20160622/0800 0830 |21.06.2016 и 22.06.2016 в 8:00 и 8:30 |
|e/0800;m 1 4/0830 |Ежедневно в 8:00 и в каждый понедельник и четверг в 8:30 |
**DURATION** - длительность задачи в минутах. В течение этого времени от начала задачи требуется ее выполнение.\\
**AUTOTASK** - если 1, то разрешена автоматическая генерация задач по данному расписанию.
===== task =====
create table {schema}_TASK (
ID integer not null primary key,
SCHEDULE_ID integer references {schema}_SCHEDULE on delete cascade on update cascade,
READER_ID integer references {schema}_READER on delete cascade on update cascade,
PERSON_ID integer references {schema}_PERSON on delete set null on update cascade,
DT_CREATE timestamp,
DT_BEGIN timestamp,
DT_END timestamp,
DT_EXPIRE timestamp,
DT_REG timestamp,
STATUS smallint,
DELETED smallint default 0
)
Таблица содержит задачи на обслуживание определенного оборудования со считывателемя.
**DT_CREATE** - создание задачи - момент создания записи в таблицы.\\
**DT_BEGIN** - начало задачи - с какого момента можно подносить карту к считывателю.\\
**DT_END** - окончание задачи - поднесение карты после этого момента будет засчитано как выполнение с опозданием.\\
**DT_EXPIRE** - максимальное время жизни открытой задачи, после которого она автоматически закрывается со статусом ''3''.\\
**DT_REG** - дата и время выполнения задачи (поднесения карты).\\
**PERSON_ID** - человек, выполнивший задачу.\\
**STATUS** - статус задачи:
^Код статуса ^Описание ^
| 0 |Открыта |
| 1 |Закрыта во время |
| 2 |Закрыта с опозданием |
| 3 |Закрыта по просрочке |
| 4 |Отменена |
===== input =====
create table {schema}_INPUT (
ID integer not null primary key,
CARD_ID integer references {schema}_CARD on delete cascade on update cascade,
READER_ID integer references {schema}_READER on delete cascade on update cascade,
PERSON_ID integer references {schema}_PERSON on delete set null on update cascade,
DT timestamp
)
В данной таблице сохраняются все считывания карт. PERSON_ID может содержать null, если карта не имеет владельца.
====== Работа модуля ======
При запуске модуль ожидает подключений к базе данных и к серверу данных, после чего циклически выполняет действия:
===== Получение и сохранение данных от считывателей =====
Выполняется проверка поступления новых кодов от считывателей, и если есть, фиксирование их в базе данных в таблице ''input''. При этом выполняется поиск открытой задачи по данному считывателю, и, если у владельца карты есть права на задачу, в таблице ''task'' выполняется закрытие задачи со статусом 1 или 2.
После успешной записи данных считывателю посылается обратная связь на светодиоды:
- длинный зеленый - задача закрыта
- длинный синий - задача не найдена, либо у владельца карты нет прав
- мигающий синий - карта не имеет владельца
===== Генерирование новых задач =====
По расписанию в таблице ''schedule'' создаются задачи и помещаются в таблицу ''task''. При этом сразу расчитываются даты открытия, закрытия и просрочки задачи. Дата просрочки вычисляется как дата начала следующей задачи по данному расписанию.
===== Закрытие просроченных задач =====
Открытые задачи, т.е. те у которых STATUS=0 и DT_REG is null, считаются просроченными, если DT_EXPIRE < текущее время. При этом в ''task'' для данной задачи прописывается STATUS=3 и DT_REG=текущее время.