Хотел бы разместить здесь небольшую свою заметку о том, как создавал в свое время систему информационных табло для предыдущего места работы. Оригинал статьи на Хабре
В суде я работаю работал секретарем судебного заседания – помощником судьи, но иногда меня привлекают для участия в более сложных и важных мероприятиях, таких как, например, создание очередного программного обеспечения для внутреннего пользования (замечу сразу - никаким техническим образованием не обладаю).
Так случилось и месяц назад, хотя слухи об этом событии ходили уже давно – одной из важнейших задач, сопровождающих реконструкцию здания, является создание электронной системы распределения залов судебных заседаний, а также написание программы, обеспечивающей вывод информации на плазму и 7 мониторов перед каждым залом судебного заседания.
Процесс решили организовать следующим образом:
1. по итогам проведенного тендера была выбрана подрядная организация, которая занимается прокладкой сети, поставкой и настройкой оборудования.
2. ПО для внутреннего использования было решено написать самим, имея в штате программиста – системного администратора и секретаря судебного заседания – программиста, то есть меня.
Сегодня я хотел бы рассказать именно про систему распределения залов и про вывод информации на «табло». Ответственным за первое назначили нашего программиста, за второе – меня. Такое разделение труда было осознанным и скажу даже больше – оправданным, так как у него за долгие годы работы уже были собственные наработки, которые могли ускорить процесс создания программы, у меня же – большой энтузиазм и высокая скорость исполнения, присущая молодым специалистам. К тому же каждый из нас имел четкое поле деятельности и нес персональную ответственность - каждый за свою часть.
Начало
По итогам совещания нашей рабочей группы наметили следующий план действий:
Вся необходимая информация о делах хранится в автоматизированной информационной системе (АИС), представляющей собой сервер с базой данной ORACLE 8-ой версии и программы-клиента, в которую, собственно, и заносятся все сведения о рассматриваемых делах – номера дел, судьи, стороны, даты, виды производств и прочее. База имеет довольно сложную и запутанную структуру связей, причем документация отсутствует напрочь. Фирма, разработавшая сей великий продукт в далеком 2000-ом году, исправлять или дополнять новым функционалом эту версию программы не захотела, а предложила создать абсолютно новую АИС, но пока настанет этот счастливый для всех судов день, думаю, я успею выйти на пенсию, а может и просто умереть, так что сегодня не будет заострять на этом факте внимание. Скажу лишь, что программа эта крайне не дружелюбна к пользователям.
Дата проведения судебного заседания (отложения, приостановления и т.д.) хранится в вышеназванной АИС, однако ввод времени в ней не предусмотрен, в связи с чем, нашим программистом с давних пор была разработана небольшая надстройка над базой данных с использованием средств, предоставляемых Microsoft Access, которая называлась просто и незамысловато – «Назначенные», куда секретари судебных заседаний каждую неделю, в пятницу, заносили информацию о времени рассмотрения дела. Для решения поставленной перед нами задачи мы, не долго думая, решили немного усовершенствовать данную СУБД – теперь вся заносимая в «Назначенные» информация будет храниться не в самих «Назначенных», а непосредственно в ORACLE, что ускорит обращение к этой информации моих программ-«табло», упростит сбор нужных нам сведений из базы данных. Решена была и постоянная проблема с разрастанием mdb файла, хранившегося на общем (сетевом) диске.
Программа вывода информации. Подрядчик устанавливает компьютер, к которому подключается 7 мониторов и одна плазма. Так получилось, что этим компьютером стала рабочая станция Dell с двумя видеокартами Nvidia Quadro NSV 420 с предустановленной Windows 7 64 bit, у которой активация заканчивалась через два дня после поставки, но это уже совсем иная история.
В качестве среды разработки выбрал Delphi 7. Выбор, кстати, продиктован необходимостью и сделан с тем расчетом, чтобы упростить внесение изменений в исходный код программы нашим программистом, если вдруг я решу сменить место работы.
«Управление миром мониторов и плазмы»
Еще не приступив к написанию какого-либо кода, наметил для себя основные возможности, которыми должна обладать будущая программа.
- сетевое управление по принципу клиент-сервер,
- красивый и в то же время практичный интерфейс, гармонирующий с внутренним оформлением здания, понятный посетителям и работникам суда.
На плазменный телевизор («плазму», как я его прозвал про себя), расположенный в холле, должна выводится следующая информация: сведения о судебных заседаниях по всем залам, в зависимости от времени; текущее время и дата; курсы валют, которые автоматически загружаются из интернета с сайта Национального Банка; текущая и на несколько дней вперед погода – да-да, этот блок произвел наибольший фурор, особенно среди женской половины коллектива, некоторые даже высказывали свое сожаление по поводу того, что теперь чаще нужно будет спускаться на первый этаж с целью узнать погоду; небольшая секция, отражающая график приема граждан судьями (здесь решено было выводить только тех судей, которые осуществляют прием в данный момент); инфо-блок – здесь отображается произвольная информация, в основном, носящая пропагандистский характер.
На мониторы, висящие перед залами судебных заседаний, подается более узкоспециализированная информация, касающаяся исключительно рассматриваемых дел – время, номер дела, судья, истец, ответчик, сущность спора\статус.
Как я уже сказал выше, в качестве среды разработки была выбрана Borland Delphi 7 с некоторыми дополнительными компонентами – ODAC, EhLib, VGScene.
Oracle Data Access Components использовались для связи с базой данных, EhLib – известный своими гридами набор компонент, обладающий, не побоюсь этого слова, уникальными возможностями, VGScene – приятный на глаз и богатый на функции векторный движок для создания интерфейсов.
Основная программа запускается при запуске компьютера и раскидывает формочки по назначенным мониторам.
Дополнительно были разработаны две программы: администраторская часть, позволяющая управлять миром мониторов по сети, и программа для добавления новостей-заметок в инфо-блок.
Трудности, с которыми мы столкнулись
Организация, занимающаяся прокладкой сети и установкой оборудования на протяжении 2-ух недель кормила нас «завтраками» по поводу доставки оборудования – то товар на таможне задержали, то он у них на складе. В конце-концов, когда на них надавили, они сознались, что не могут настроить 7 мониторов с использованием одного компьютера. Отлично, с учетом того, что эту схему они предложили нам сами. «Везите, сами настроим», - сказали мы и сделали их часть работы.
Вывод информации на несколько мониторов. Сначала наш программист высказывал свои соображения по поводу реализации данной задачи, решения порою доходили до абсурда, например, запускать несколько виртуальных машин. Не совсем понятно, как это помогло бы, но остановились на моем (довольно-таки банальном) варианте с использованием Delphi:
Информационный блок на плазме, по мнению руководства, должен не просто показывать текст, но показывать его еще и с различными эффектами, причем под этими самыми эффектами подразумеваются не только тень и плавное скольжение снизу вверх, но и «затухание», появление текста по диагонали, слева, справа и т.д., в общем все как в Power Point. С трудом, но объяснили, что такие качества информационному блоку не нужны и будут отвлекать посетителей. Запутанность структуры и объем базы данных. При составлении некоторых SQL запросов приходилось обращаться к большому количеству литературы, а кое-где проявлять творческий подход. Очень-очень редко, но все же случаются ситуации, когда в деле участвует более одного истца \ ответчика. «Множественность сторон» доставила немало хлопот, но поборол я ее вот таким вот способом (ниже приведу текст запроса, может кому пригодится):
CREATE VIEW PLAINTIFF AS
select suit_id, max(LTRIM(sys_connect_by_path(name,'; '),'; ')) app
from (SELECT naznach.suit_id, app_resps.name, row_number() over (partition by naznach.suit_id order by app_resps.name) rn
from Naznach INNER JOIN App_resps ON naznach.suit_id = app_resps.suit_id
WHERE ((app_resps.TYPE=1) Or (app_resps.TYPE=4) Or (app_resps.TYPE=10) Or (app_resps.TYPE=14) Or (app_resps.TYPE=13)))
start with rn = 1
connect by prior rn = rn-1
and prior suit_id = suit_id
group by suit_id
order by suit_id
В результате выполнения этого запроса создается View, содержащий информацию об истцах (наименование), а также идентификатор для связи с другими таблицами. Если в деле несколько истцов, то они будут записаны через символ «;». Дальнейшая обработка происходит уже на стороне программы.
Итог
Создание информационного табло достаточно простая задача, однако сопряженная со своими, не вовремя появляющимися, сложностями: будь-то недобросовестный подрядчик или полное отсутствие документации по работе с АИС.
Комментариев нет:
Отправить комментарий