Разработка диалога "Матрица времени" в DIRECTUM

Заказчик: ПАО Корпорация "ВСМПО-АВИСМА"
Исполнитель: Самостоятельно

Задача

Периодически, при разработке различных модулей в системе DIRECTUM возникают задачи отображения объектов, ограниченных во времени. Заявки, резервирование объектов, мероприятия, поручения.Такие объекты имеют время начала и время окончания. При этом, во время работы пользователя с такими объектами, важно понимать их взаимное расположение во времени. В некоторых случаях требуется, например, чтобы эти объекты во времени не пересекались. В других случаях, чтобы следовали друг за другом. 

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

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

Описание и возможности решения

Реализован диалог "Матрица времени". Основное пространство диалога занял iWebBrowserControl элемент формы. 

Особенность данного диалога заключается в том, что он не заточен на какой-то определённый модуль в системе, а может быть применен для самых разных разработок. Достигается это за счет того, что данные в этот диалог передаются в виде SQL-запросов в параметры. Так же в параметры передаются настройки отображения, заголовки, кнопки и т.д.

(Все параметры в документации к диалогу. Для просмотра, нажимайте на картинку)
 

Диалог визуально состоит из 2-х частей: левой и центральной. 

Левая часть: Табличные данные

  • Данные загружаются из БД на основе SQL-запроса. 
  • Программно задается ширина всей левой части целиком
  • Программно задается количество и состав отображаемых колонок.
    В том числе заголовок колонки, ширина каждой колонки, как процент от общей ширины левой части и из какого по номеру поля (результата SQL-запроса) брать данные в колонку на форме.
  • Пользователь может менять ширину каждой колонки отдельно и ширину всей левой части целиком перетаскивая их мышью.
  • Сортировка и фильтрация данных определяется переданным SQL-запросом.
  • Двойной клик по строке таблицы открывает связанную с ней карточку справочника.

Центральная часть: Матрица времени

  • Данные загружаются в центральную часть на основе структурированного SQL-запроса.
  • В запросе можно использовать подстановки {startTime} и {endTime}. При выполнении запроса эти подстроки будут заменены на даты и время левой и правой границы диапазона времени, отображаемого пользователю на экране.
  • Данные центральной части ссылаются на данные табличной части и объект на форме отображается напротив соответствующей ему записи таблицы.
  • Данные центральной части отображаются в виде прямоугольного блока, размер и положение которого зависит от времени его начала и окончания.
  • Эти блоки могут быть раскрашены в разные цвета, иметь разную высоту и к ним могут быть применены различные CSS-стили.
  • При наведении мыши на блок может отображаться всплывающая подсказка.
  • При двойном клике на блок открывается связанная с ним карточка справочника.
  • Реализована возможность задать "текущий блок" и при открытии диалога экран центрируется на нём, а сам блок временно подсвечивается анимацией.

Выбор отображаемого времени

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

  • Реквизит "Дата" слева снизу устанавливает текущую дату отображения диалога.
  • Реквизит "Позиционирование" устанавливает, в какой части экрана будет отображаться текущая дата: "Начало" - текущая дата в левой части матрицы, "По центру" - в центре, "Конец" - в правой части матрицы.
  • Сверху поле "Дней на графике" определяет, сколько дней на графике может быть отображено, а ползунок "Масштаб" определяет отображаемый период времени. От 1 часа до заданного в поле "Дней на графике" периода.
  • Линейка времени в зависимости от отображаемого на форме периода времени может показывать минуты, часы, дни и месяцы.
        

Режимы отображения диалога

Реализованы 3 режима работы диалога. 

Первый режим - режим просмотра. При этом режиме справа снизу отображается кнопка "Закрыть". При двойном нажатии на строчку в левой табличной части или на блок в центральной части открываются связанные с ними записи справочника. Этот режим предназначен для отображения информации и работы с ней.

Второй режим -- режим выбора строчек. При этом режиме, справа отображаются кнопки "Выбрать" и "Отмена". При щелчке на строчке, она выделяется целиком. По кнопке "Выбрать" или по двойному клику диалог закрывается, а в специальном реквизите диалога записывается ИД выбранной строчки. 

Третий режим - режим выбора блоков из центральной части. Этот режим похож на режим выбора строчки. Но, при щелчке на блок, выделяется этот блок рамкой, а в реквизите с результатом записывается ИД записи, связанной с этим блоком.

Окраска диапазонов времени

Реализована возможность окрашивания диапазона времени на матрице в тот или иной цвет.


Демонстрация окрашивания диапазона на линейке времени: Зелёная вертикальная полоса.

В параметры диалога передается строка, в которой указаны диапазоны и цвет для каждого диапазона. 

Обновление данных

Для обновления данных реализована кнопка "Обновить". При нажатии этой кнопки запрос на получение данных для центральной части выполняется заново. Результаты запроса обновляются на матрице. 

Так же, есть возможность через параметр диалога установить период автоматического обновления в секундах.

Фильтрация данных на форме

Реализована возможность фильтрации данных в уже запущенном диалоге. На форме диалога размещена кнопка, заголовок которой задается в параметрах диалога. По нажатию на эту кнопку запускается сценарий, указанный в параметрах диалога. В сценарий передается объект диалога. Такой сценарий может вызвать диалог для ввода условий фильтрации, изменить SQL запрос, вызвать процедуру обновления формы матрицы.

Применение диалога в модуле "Заказы на перевозку"

В модуле "Заказы на перевозку" диспетчер транспортной службы назначает на каждый заказ водителя и автомобиль из доступных. Для удобной работы с заказами, применяется диалог "Матрица времени". На форме-списке справочников "Заказы на перевозку", "Водители" и "Автомобили" размещены кнопки, по которым открывается диалог в режиме просмотра в разрезе водителей или автомобилей. В центральной части диалога отображаются назначенные заказы, а в левой табличной части список водителей или автомобилей, в зависимости от нажатой кнопки.

В справочнике "Заказы на перевозку" заказы окрашены в зависимости от их статуса. Такая же окраска применена для их отображения на диалоге "Матрица времени". Для заказа используется сервис отправки и приёма СМС-сообщений. Водитель может отчитаться о выполнении заказа, отправив СМС со структурированным текстом на специальный номер. Дата этой СМС фиксируется в карточке заказа и отображается на матрице в виде тонкой зелёной полосы. Технически, это такой же блок, полученный из одного SQL-запроса для центральной части, но для него задан другой номер слоя, другой цвет, высота и некоторые другие параметры. 

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

В момент назначения водителя и автомобиля на конкретный заказ, диспетчеру важно знать, что этот автомобиль или водитель не заняты в заданное время на других заказах. Их выбор производится с помощью диалога "Матрица времени". Диалог отображается в режиме выбора строки. Диапазон времени, на который сформирован заказ на матрице подкрашивается зеленым цветом. Окрашивание диапазона позволяет визуально быстро выявить незанятые в заданное время автомобили и водителей.

Через механизм фильтрации данных реализована возможность накладывать фильтр по подразделению.

При открытии диалога на просмотр, настроено автоматическое обновление с периодом обновления в 5 секунд. Диспетчеры привыкли открывать диалог один раз и сверяться с ним по текущему плану заявок. Автоматическое обновление позволяет поддерживать данные на форме в актуальном состоянии.

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

Результаты применения решения

Диалог "Матрица времени" на данный момент применяется в модуле "Заказы на перевозку", который сейчас находится в первой итерации разработки и внедрения. Этот диалог облегчил работу диспетчеров с пулом заявок, позволил визуально представить данные по заказам в удобном виде.

В дальнейших разработках, при возникновении необходимости отображать объекты с привязкой ко времени, будем использовать этот диалог.

Команда

Колесов А.Д. - руководитель бюро. 

Тарасов М.В. - программист. Разработка диалога, внедрение его в модуль "Заказы на перевозку"

Андреева Л.С. - программист. Разработка модуля "Заказы на перевозку"

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

Номинация: Forum
Организация: Самостоятельно
Утверждено 27 4

Комментарии (4)

Евгения Сарварова

Добрый день! Хочется понять какие конкретно действия приходится выполнять диспетчеру, чтобы отметить планируемую занятость автомобиля/водителя? Может ли он делать отметку прямо в матрице, не переходя в справочники DIRECTUM?

Михаил Тарасов

Евгения, диспетчер получает задания во Входящие. При выполнении задания, система показывает диспетчеру диалог,  котором он должен назначить на заказ водителя и автомобиль. Событие выбора из справочника в этом диалоге на этих реквизитах переопределено и отображается матрица времени в соответствующем разрезе. В этот момент важно не выбрать уже занятый автомобиль и водителя на заданное время. Поэтому, отображается выбор матрицей. На ней диспетчер выбирает строчку с водителем или автомобилем. После, задание завершается и идёт дальше по маршруту.

В этом смысле, в какой то степени он "отмечает" заявку прямо на матрице. Но, это не выглядит так, будто он перетаскивает на матрице квадратики...

Евгения Сарварова

Михаил, спасибо за ответ!

Михаил Тарасов

Дополнение к статье

Буквально сейчас решаем ещё одну задачу с помощью "Матрицы времени".

Ситуация

Есть сложный процесс, состоящий из карточки справочника и задач по 2м ТМ. В карточке в табличной части перечисляются этапы, сроки на этапе и исполнители. По кнопке запускается задача по головному ТМ. В нем циклично для одного этапа создаются подзадачи. Одна подзадача на каждую строчку ТМ. В процессе обработки на этапе исполнители могут делегировать своё задание другому исполнителю, или подключить другого исполнителя параллельно. В этом случае, создается строчка в записи справочника и новая подзадача.


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

Проблема

В процессе полу года года эксплуатации производятся длительные задержки при прохождении маршрутов. Требуется периодически проводить анализ: Кто или что является "слабым звеном", находить причины задержек и вырабатывать решения для их устранения. Для этого, участники процесса запросили у нас инструмент для формирования отчета или аналитики, по которой можно было бы проводить анализ. Ситуация осложняется тем, что в данной разработке активно используются подзадачи. А аналитику требуется проводить в разрезе данных, заполненных на первоначальной карточке. Поэтому, стандартные инструменты мониторинга не подошли.

Решение

Как одно из решений, был применен диалог "матрица времени" для построения наглядной картинки по процессам прохождения маршрутов. 

На форме списке справочника размещена кнопка ""Матрица по проработкам. По нажатию на эту кнопку открывается диалог матрицы, в котором отображаются записи данного справочника и задачи по головному ТМ


Прямоугольник на матрице обозначает ход выполнения по головной задаче. Синим цветом отмечаются завершенные задачи. Зелёным - в работе. Красным цветом отмечаются просрочки на этапах. Серым прекращенные задачи.

Поясню подробнее про этапы: В рамках одной головной задачи как правило проходит 2, 3 этапа. В редких случаях 1 или более 3х. На каждом этапе устанавливается один срок на все задания на исполнителей по подзадачам. Таким образом, этап считается просроченным, если любая подзадача на этом этапе завершилась позже, чем установленный на этом этапе срок. Для следующего этапа срок изначально задается в днях, и при создании подзадач рассчитывается конкретная дата.

При двойном клике на строке в левой части, откроется соответствующая карточка справочника. При двойном клике на блок на матрице, откроется карточка головной задачи.

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

Благодаря такому представлению можно выделить проблемные записи справочника и уже по ним подробно исследовать ситуацию.

Далее, на форме карточки справочника добавлена кнопка "Матрица по заданиям". При нажатии на эту кнопку открывается подробная диаграмма по выполнению заданий в рамках головной задачи по текущей карточке.

В этой диаграмме каждый блок - это задание. Блоки имеют ту же подсветку, что и задачи в первом диалоге. Синий - выполнено. Зелёный - в работе. Серый - прекращено. Розовый фон - это просрочка на этапе. При двойном клике на блок, откроется соответствующее задание.

Колонка "Этап" показывает, в рамках какого этапа созданы эти задания. Колонка "ФИО" отображает ФИО исполнителей. Колонка "Статус" показывает, по какому блоку ТМ было создано это задание. Проработка, Доработка или Рассмотрение. Колонка "№" отображает номер строки в табличной части. По ней можно сориентироваться, какие задания сформированы в рамках одной подзадачи.

Такая диаграмма позволяет взглянуть на процесс прохождения проработки целиком и выявить виновников просрочки.

 

От задумки до воплощения этих кнопок меньше недели. Программная реализация - 2 дня с отвлечением на другую работу. 

Михаил Тарасов: обновлено 01.02.2019 в 10:44

Авторизуйтесь, чтобы написать комментарий