====== 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=текущее время.