Схема 1. Порядок формирования очереди карт на запись и удаление.
На схеме 1 изображена основа базы данных Артонит 10.
В таблице ss_accessuser хранится информация о наборе прав для каждого пользователя.
С помощью триггеров SS_ACCESSUSER_DELETECARD и SS_ACCESSUSER_WRITECARDS с использованием процедур cardidx_delete и cardidx_insert соответственно данные заносятся в таблицу cardidx.
Таблица cardidx является решением основной задачи СКУД.
Данные в таблицу ss_accessuser записываются с помощью программ Менеджер карт или сервера интеграции SOAP_Integration.
Таблицей device управляет приложение Конфигуратор.
Очередь на запись и удаление формируется в таблице CARDIDX и обрабатывается АСервером.
№ п/п | Версия | Дата | Изменения |
---|---|---|---|
1 | 1.2.5 | 20.10.2017 | Выводится список пользователей, у которых нет карты. При переходе по ссылке есть возможность удалить выбранных жильцов из базы данных СКУД. Введ анализ событий вида Недействительная карта и указана причина отказа. |
2 | 1.2.6 | Май 2019 | При анализе событий выводится подробная информация о причине отказа. Выводится информация об активности пользователя, активности карты, анализ по категориям доступа. Аналитика формируется в момент вставки события. |
3 | 1.2.7 | окт. 2020 | Внесены изменения при работе с удаленными картами. Более детально см. History. city_1_2_7-2020_10_02.zip |
Артонит Сити позволяет быстро проверить свойство пользователя/жильца.
В ходе эксплуатации СКУД всегда есть потребность знать: а правильно ли работает СКУД? Может, где-то есть сбои, о которых оператор не знает?
Например, где-то система не пропустила где-то сотрудника, где этот сотрудник может ходить. Сотрудник не понял причины отказа, но и не стал жаловаться на работу системы. Получается, что система работает некорректно, но никто об этом не знает, ибо жалоб нет.
Возможна и обратная ситуация: сотрудник не имеет право прохода через какую-нибудь дверь, но СКУД его пропускает. Сотрудник тоже не будет жаловаться, т.к. его такая ситуация устраивает.
Потому всегда надо знать ответ на вопрос: были ли сбои в работе СКУД?
Артонит Сити имеет ответ на этот вопрос.
В базе данных есть два уровня представления информации о проходах.
Первый уровень - это таблица ss_accessuser, в которой хранятся права пользователя. Существенно: набор категорий доступа «привязан» к пользователю, а не к идентификатору.
Второй уровень - это таблица cardidx, в которой хранится список карт с указанием в какие точки прохода эти карты могут ходить.
Второй уровень хранинеия данных строится на основе первого уровня.
Есть вероятность, что в силу непредвиденных причин второй вариант неправильно построен (например, после обновления базы данных).
Ниже приводится SQL-запрос, который находит разночтения в вариантах представления информации.
Результат выполнения запроса - список номеров идентификаторов, которые имеются в Уровне 1, но отсутствуют в уровне 2.
select ac.id_dev, c.id_card from ss_accessuser ssu join card c on ssu.id_pep=c.id_pep join access ac on ssu.id_accessname=ac.id_accessname left join cardidx cd on cd.id_card=c.id_card and cd.id_dev=ac.id_dev join device d on d.id_dev=ac.id_dev and d."ACTIVE"=1 join device d2 on d2.id_ctrl=d.id_ctrl and d2.id_reader is null and d2."ACTIVE"=1 where c."ACTIVE">0 and (c.timeend>'NOW' or c.timeend is null) and c.id_cardtype in (1,2) and cd.id_card is null
С этими номерами следует поступить так:
insert into CardIdx(ID_DB, ID_CARD, ID_DEV) values (1, :id_card, :id_dev);
Где
:id_card - c.id_card из предыдущего запроса,
:id_dev ac.id_dev из предыдущего запроса.
После выполнение указанных действий результата выполнения запроса Самопроверка должен быть пустым: данные точно соответствуют друг другу.
Либо сразу так:
select 'insert into CardIdx(ID_DB, ID_CARD, ID_DEV) values (1, '''||c.id_card ||''', '||ac.id_dev||');' from ss_accessuser ssu join card c on ssu.id_pep=c.id_pep join access ac on ssu.id_accessname=ac.id_accessname left join cardidx cd on cd.id_card=c.id_card and cd.id_dev=ac.id_dev join device d on d.id_dev=ac.id_dev and d."ACTIVE"=1 join device d2 on d2.id_ctrl=d.id_ctrl and d2.id_reader is null and d2."ACTIVE"=1 where c."ACTIVE">0 and (c.timeend>'NOW' or c.timeend is null) and c.id_cardtype in (1,2) and cd.id_card is null
результат выборки в виде готового набора sql-запросов следует вставить в окно скриптов.
2.10.2020
Фактически выводился список все неактивных карт, коих было 4729 шт. А надо выводить только тех, у кого срок действия истек, но карта еще активна.
Изменения 2.10.2020
C:\xampp\htdocs\city\application\classes\Model\Stat.php
стр 557. Убрана проверка на срок действия. Теперь выводится все неактивные карты.
А до этого выводились только c.timeend<\'now\'.
Получается, что мы не видели карты, у которых срок действия не истек, но они уже были неактивны.
Добавлен метод Model::Factory('stat')→Get_unActiveCard(); Этот метод готовит список всех неактивных карт.
C:\xampp\htdocs\city\application\views\dashboard.php стр. 21. Добавлена ссылка на метод HTML::anchor('people/find_unActiveCard'…
C:\xampp\htdocs\city\application\classes\Controller\People.php добавлен метод action_find_unActiveCard() Вызывается метод Model::Factory('stat')→Get_unActiveCard() и полученный список передается во view 'people/card_late'
Изменены вызовы view в public function action_find_card_late() и public function action_find_unActiveCard() при вызове теперь добавяется параметр title. Оба метода выводят данные на одно и то же окно, и теперь меняется название окна, а сама формы и реализованные в ней методы работы с картами одинаковы. Чтобы формы различались у них сделан разный титул.
C:\xampp\htdocs\city\application\i18n\ru.php Добавлена запись 'unActiveCard' ⇒ 'Список неактивных карт. Эти карты можно либо удалить, либо продлить до указанной Вами даты.', и изменена
'card_late_info' ⇒ 'Список карт с прошедшим сроком действия. Эти карты можно либо удалить, либо продлить до указанной Вами даты.', было 'card_late_info' ⇒ 'Список карт с прошедшим сроком действия',
Добавлена 'pp'⇒'№ п/п',
Изменена форма C:\xampp\htdocs\city\application\views\People\card_late.php добавлена колонка с номером по порядку.