1. Общие сведения

Данный модуль лицензируется по количеству запущенных экземпляров программы. 

1.1. Назначение

Программа предназначена для визуализации информации из базы данных (например, поэтажного плана, списка находящихся клиентов и др.) и должна быть отображена на отдельном дисплее в удобном для посетителей месте, например в холе заведения. Устанавливается на рабочий компьютер администратора, при наличии второго монитора или на отдельный компьютер. В случае размещения в зале, за телевизором устанавливаем компьютер типа NetTop. 

  

Внешний вид модуля

1.2. Целевая аудитория программного продукта

  1. Посетители - могут наблюдать информацию в режиме реального времени: поэтажный план, данные о доступных системах, свободных местах и прочую информацию из базы данных Абонемент.
  1. Операторы (пользователи системы) – в зависимости от настроек, имеют возможность отслеживать служебную информацию для осуществления рабочего процесса, например, такую как время начала и окончания мероприятия, размещение клиентов и др.

2. Настройка программы

Для настройки программы используется файл monitor.ini - в данном файле, в разделе [Settings], указывается путь до файла с настройками MonitorSettings.xml и путь до базы данных

MonitorSettings=D:\Monitor\MonitorSettings.xml 
dbname=127.0.0.1/3080:D:\MyDB\IBData\fitness.FDB 
;Программа защищена ключом, поэтому необходимо прописать путь к серверу блокировок: 
[LOCK.SERVER] 
TCPPort=1111 
TCPHost=127.0.0.1

Далее, существует 2 варианта настройки выводимых данных и интерфейса:

2.1.  С помощью встроенного редактора в abonementmanager

Для упрощенного вывода отображения поэтажного плана используется настройка в редакторе abonementmanager.

Преимуществo данного способа – простота редактирования выводимой формы

Недостаток данного способа – негибкость настроек отображаемых данных, ограниченный набор способов вывода данных.

В случае, если abonementmanager.ini и monitor.ini настроены на одну базу, Этажный план, создаваемый с помощью abonementmanager, будет дублироваться в форме Monitor.

Для внесения изменений в форму Монитора, можно зайти в раздел Абонемента, щелкнув по иконке (см. рис.1).

 

Рис.1. Настройка поэтажного плана в abonementmanager

Далее, сохраняем внесённые изменения и наблюдаем изменения в форме Монитора.

2.2. С помощью настройки файлов преобразований и запросов

В результате настройки, выводимая информация представляет собой специфический динамически изменяемый отчет, отражающий, например, текущее состояние работы заведения.

Преимущества данного способа – возможность вывода любых данных из БД в удобной форме, в зависимости от настроек.

Недостаток данного способа – сложность настроек файлов, необходимость знать наименования полей БД.

2.2.1. Структура программы Monitor

В состав программного продукта входят следующие основные модули (типы файлов):

  • Файлы настроек: *. ini
  • Файлы библиотек: *.dll
  • Файлы запуска программ .exe (Для запуска Монитора - Monitor.exe)
  • Файлы .xml — файлы в текстовом формате, предназначенные для хранения структурированных данных и для обмена информацией между программами.

MonitorSettings.xml

В данном файле определяются параметры выводимой формы, такие как: высота, ширина, заголовок, позиционирование на экране.

Кроме этого, из SQL-запроса, указанного здесь, возвращается набор данных, которые могут быть выведены на форму.

Атрибуты формы (Form)

left

Отступ слева (в пикселях)

top

Отступ

Width

Ширина формы (окна)

Height

Высота формы (окна)

Caption

Выводимое наименование окна (заголовок)

BorderStyle

задает толщину рамки вокруг элемента в пикселях

 

С частотой, указанной в теге <Periodicity>2</Periodicity> (в данном случае – 2 секунды), данные, полученные из запроса, будут обновляться на выводимой форме Monitora.

2.2.2.  Алгоритм работы программы

Результат выполнения запроса, указанного в MonitorSettings.xml формируется в виде xml-данных, на которые накладывается шаблон преобразования (*.xls) (см. рис.2).

Путь к данному шаблону и его имя указываются в файле MonitorSettings.xml, в разделе

<XSLT>floorplan.xsl</XSLT> (в данном случае, файл floorplan.xsl располагается в том же каталоге, что и Monitor.exe, MonitorSettings.xml).

В шаблоне преобразования (floorplan.xsl) описаны правила преобразования xml документа в другой внешний вид, в данном случае в HTML страницу. Путь и наименование новой html-страницы указываются в MonitorSettings.xml в разделе

<HTML>cache\floorplan.html</HTML> (в данном случае, будет создана страница floorplan.html в папке cache).

Рис.2. Схема работы программы Монитор

2.2.3. Шаблон преобразования документа

Шаблон преобразования написан на XSL (язык преобразований XML-документов). С помощью него XML-документ трансформируется в HTML вид.

Структура документа

<header> </header>

здесь указываются метаданные, например, кодировка.

<body></body>

«тело документа». В атрибутах тега <body> можно указать, например, style="background-image:url(floorplan.gif);"

При этом, картинка floorplan.gif должна находиться в папке Monitor\cache\

Атрибуты тега <body> влияют на внешний вид всего документа целиком:

Атрибут

Описание

Пример

bgcolor

Цвет фона

<body bgcolor="#C9CDED">

background

Фоновая картинка

<body background="images/tile.jpg">

text

Цвет текста

<body text="#000067">

link

Цвет ссылок

<body link="#457BAF">

vlink

Цвет посещённых ссылок

<body vlink="#9C7B92">

alink

Цвет активных ссылок

<body alink="#434343">

Таким образом, результаты запроса можно представить в виде html-документа

Каждая строчка в выводимом наборе данных представлена в теге <RecordSet>, каждое поле в теге <Record>.

Схематично это можно проиллюстрировать примером:

Запрос «select ID, Name from Rooms».

В результате выполнения запроса будут получены следующие данные:

ID

Name

1

Бассейн

2

Зал

В результате преобразования данные будут представлены в следующем схематичном виде

<RecordSet>

<Record> ID=”1”  Name= “Бассейн” </Record>

<Record> ID=”2”  Name= “Зал” </Record>

</RecordSet>

Данные выводятся в табличном виде. Схема простой таблицы (с 1 строкой и 2 колонками) представлена ниже:

<table>   
 <tr>     
   <td>Ячейка 1</td>     
   <td>Ячейка 2</td>
 </tr>
</table>

В ячейках можно выводить данные, полученные в результате выполнения запроса из MonitorSettings.xml.

Например, выводим номер <xsl:value-of select="NUMBER"/>

Примечание! Наименование полей указывается прописными буквами

2.2.4. Примеры

Пример 1

Создадим одну форму, которая будет выводиться поверх всех окон, в этой форме в табличном режиме будут выводиться данные с номером и наименованием комнат.

1) Настраиваем MonitorSettings.xml

<Form left="500" top="5" Width="200"                        Height="400"

Размеры и расположение формы на мониторе

     Caption="Данные по комнатам"

Заголовок окна

      ID="2"

Номер формы (ее идентификатор)

       BorderStyle="2"

       WindowState="0">

Стиль окна: ширина рамки 2 пикселя

 <ZOrder>-1</ZOrder>

Z-последовательность (Z order) окна обозначает позицию окна в стеке перекрывающихся окон. Окно наверху Z-последовательности перекрывает все другие окна. Окно внизу Z-последовательности перекрыто всеми другими окнами.

 <ShowPanel>0</ShowPanel>

Не отображать панель настроек браузера

 <Periodicity>2</Periodicity>

Период обновления – 2 секунды

 <SQLText>

 select r.number  number, r.name from rooms r

 </SQLText>

SQL запрос. Выводятся следующие поля таблицы rooms базы данных: number (номер) комнаты и name (имя) комнаты

<XSLT>rooms.xsl</XSLT>

Применяемый файл преобразования, в данном случае: rooms.xsl

<HTML>cache\rooms.html</HTML>

В результате преобразования в папке /cache будет сформирована html-страница rooms.html

<HIDECURSOR>0</HIDECURSOR>

Не показывать курсор мыши в пределах окна формы

<FormID>2</FormID>

</Form>

Команда на создание формы

                    

2) Создадим файл преобразования rooms.xsl

Приведем часть кода

<body>  <table border="1" >        <tr>           <th >Номер комнаты </th>                        ;Заголовки колонок таблицы           <th >Наименование комнаты </th>          ;Заголовки колонок таблицы       </tr>     <xsl:for-each select="RecordSet/Record">         <tr>           <td>             <xsl:value-of select="NUMBER"/>             ;Выводимые значения полей БД           </td>           <td>             <xsl:value-of select="NAME"/>                   ;Выводимые значения полей БД           </td>         </tr>  </xsl:for-each>  </table> </body>

То есть данные должны быть выведены в подобном виде:

Номер комнаты

Наименование комнаты

    <--- Заголовок колонок таблицы

 Значение 1

Наименование 1

    <--- Выводимые значения полей БД

..

..

     

  В результате выполнения преобразования будет создана rooms.html страница в папке cache. И при запуске исполняемого файла Monitor.exe поверх всего будет выведена форма с таблицей.            

Пример 2

Настройка цветов в зависимости от статуса мероприятия

Варианты статусов

ID статуса

Статус

0

Не началось мероприятие

1

Началось мероприятие

2

Мероприятие закончилось

3. Режим работы с программой

Управление выводимой формой осуществляется с помощью следующего стандартного окна настроек (см.рис.3).

Рис.3 - Стандартное окно настроек Монитора

Окно выводимой формы с этажным планом можно настраивать в соответствии с потребностями, и оно всегда выводится поверх остальных окон (см. рис.4). 

 

Рис.4,5 - Варианты окна Монитора

Данное окно не подлежит закрытию стандартными средствами - для закрытия программы используется Окно настроек (с рис.3).

Файл MonitorSettings.xml:

<Monitor>

        <Forms>  

                <Form left="5" top="5" Width="510" Height="380" Caption="Этажный план" ID="1" BorderStyle="2" WindowState="0">

                        <ZOrder>-1</ZOrder>

                        <ShowPanel>0</ShowPanel>

                        <Periodicity>2</Periodicity>

                        <SQLText>

    

select r.id id, r.number  number, r.name, r.state, r.floor,r.building, 0 guest_quant ,

     rk.id roomkind, rk.code roomkindcode,rk.name roomkindname,


COLORTOHTMLHEXCOLOR(rk.color) roomkindcolor,

d.id claim, d.status claimstate, formatdatetimeex('hh:mm:ss',d.startdate,'') arrival,


case when d.status=1 and d.finishdate=90000

     then formatdatetimeex('hh:mm:ss',(d.startdate + p.diaryduration)-(d2dbl('now')),'')

     else formatdatetimeex('hh:mm:ss',d.finishdate-(d2dbl('now')),'')

end  fmt_end_time, 


case when d.status=1 and d.finishdate=90000

     then ROUND(((d.startdate + p.diaryduration)-(d2dbl('now')))*1440)

     else ROUND(((d.finishdate)-(d2dbl('now')))*1440)

end  fmt_end_time_min,


case when

        case when d.status=1 and d.finishdate=90000

            then ROUND(((d.startdate + p.diaryduration)-(d2dbl('now')))*1440)

            else ROUND(((d.finishdate)-(d2dbl('now')))*1440)

       end >5 then 'black'

              else 'red'

end fmt_end_time_min_color,



d.guest,fp.aleft , fp.atop,fp.awidth,fp.aheight, r.building, r.floor,

case when d.status=1 then 'red' else 'green' end statecolor ,

g.fullname as GUESTNAME,


case when getnamedparamdefnum(dd.paramstr,'color',0)=000000

    then 'ffffff'

     else COLORTOHTMLHEXCOLOR(getnamedparamdefnum(dd.paramstr,'color',0)) end as room_abonement_categ_color


from resource_categ rc

left join room_kinds rk on rc.id=rk.resource_categ and  rk.enabled=1

left join rooms r on r.roomkind=rk.id and r.enabled=1


                         /*and r.building=3*/

left join floorplan fp on fp.idroom = r.id

left join diary d on d.idroom=r.id and d.enabled=1

                                   and ( d.status=1 or (d.startdate &lt; d2dbl('now') 

                                   and d.finishdate &gt; d2dbl('now')))

left join guests g on d.guest = g.id

left join abonement_packages ap on d.abonement_package = ap.id


left join abonements a on a.id = ap.abonement

left join package_kinds pk on a.package_kind=pk.id

left join d_document dd on dd.id=pk.abonementcateg


left join packages p on ap.package = p.id


                         where 

                         rc.kind in (0) 

                         and r.enabled=1 

                         order by r.number ,fmt_end_time_min


      </SQLText>

                        <XSLT>floorplan.xsl</XSLT>

                        <HTML>cache\floorplan.html</HTML>

                        <HIDECURSOR>0</HIDECURSOR>

                        <FormID>2</FormID>

                </Form>



        </Forms>

</Monitor>

Файл floorplan.xsl

<?xml version="1.0" encoding="WINDOWS-1251" ?>

<!--Набор переменных используеться для XSLT -->

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 

                         xmlns:str="http://user.com/namespace" version="2.0"  

>


<xsl:key name="group" match="/RecordSet/Record" use="ID" /> 

<!--Ключ "group", уникальное поле "ID" -->

<xsl:template match="/">


<header>

  <META http-equiv="Content-Type" CONTENT="text/html; charset=WINDOWS-1251" />

</header>

<!--Фон страницы -->

<body style="background-image: url(floorplan2.GIF);background-repeat: no-repeat;">

<!-- Первый цикл по уникальному поле "ID" -->

  <xsl:for-each select="/RecordSet/Record[ generate-id() = generate-id( key( 'group', ID ))]">


 <!--позицианирование div  блока согластно данным в БД-->

 <div ID="{ID}" STYLE="position:absolute; top: {ATOP}px; left: {ALEFT}px; width: {AWIDTH}px; height: {AHEIGHT}px; overflow:hidden;">

<!--Построение "шапки" таблицы таблицы border толщина линий, width ширина height высота, cellpadding расстояние между ячейками по высоте, cellspacing расстояние между ячейками по ширине -->   

<table border="1" width="100%" height="100%" cellpadding='0' cellspacing='0' > 

    <tr height="20px" > <!--Высота первой строки-->

<td align="center" colspan="2" style='background-color: #FFCC66;'> 

<!--Фон  первой строки-->

<xsl:value-of select="NUMBER"/>  <!--Значение  первой строки-->

  </td>

</tr>

<xsl:for-each select="key( 'group', current()/ID )">

<!-- Второй цикл тут обходим только Record для ID из прошлого цикла, т.е. строим строки таблицы -->

<tr > <td align="center" width="60px"><!--Ширина первого столбца  таблицы-->

<xsl:attribute name="BGCOLOR">                             

<!--Фон столбца  таблицы, в зависимости от категории-->

<xsl:value-of select="ROOM_ABONEMENT_CATEG_COLOR"/>

</xsl:attribute>  

<font color="{FMT_END_TIME_MIN_COLOR}">                   

 <!--Фон столбца  таблицы, в зависимости от категории-->

<xsl:value-of select="FMT_END_TIME_MIN"/> мин                 

</font> 

      </td >

    <td align="center">

<xsl:attribute name="BGCOLOR">                             

<xsl:value-of select="ROOM_ABONEMENT_CATEG_COLOR"/>   

<!--Фон 2 столбца  таблицы, в зависимости от категории-->

</xsl:attribute>  

    <xsl:value-of select="GUESTNAME"/>  <!--Гость во 2-м столбце  таблицы-->

                        </td > 

                    </tr>

                </xsl:for-each>

  </table> 

  

     </div>

</xsl:for-each>


</body>

</xsl:template>

</xsl:stylesheet>