Диаграмма Ганта¶
В "Первой Форме" есть возможность отобразить на диаграмме Ганта некоторый набор задач, имеющих отношение к какой-то исходной задаче. Например, диаграмма может отображать все задачи и подзадачи проекта или все активности по клиенту (продажи, проекты, взаимодействия, договоры, коммерческие предложения и пр). Текущая дата отображается на диаграмме красной чертой.
ℹ️ Включить новую диаграмму Ганта в проектной категории можно:
Для версий до 2.261: в Конфигурации тулбара — пункт Новый Гант Для версий, начиная с 2.261 Лира: с помощью настройки ДП Таблица.
Реализация¶
Для вывода диаграммы нужно настроить две публикации пакетов действий:
-
Публикация, которая описывает структуру данных.
-
Публикация, которая возвращает данные.
Пусть в нашем примере название первой публикации — gnt-structure, название второй публикации — gnt-data.
Интерфейс диаграммы Ганта вызывается следующим образом:
\~/spa/gantt/gnt-structure?taskId=\' + taskId где \~ — адрес приложения "Первая Форма", gnt-structure — название публикации, возвращающей структуру данных, а taskId — номер исходной задачи.
ℹ️ При настройке публикаций не забывайте настраивать права.
- Публикация, описывающая структуру данных
В нашем примере это публикация gnt-structure.
Входящих параметров у публикации нет.
Тип запроса — GET.
Пакет содержит единственное действие HTTP ответ, которое возвращает результат в формате JSON.
Структура тела ответа:
Ключи
Описание
dataUrl
строка вызова второй публикации
columns
массив столбцов левой части диаграммы Ганта в формате JSON. Для каждого столбца могут быть указаны:
type
тип столбца. В структуре данных обязательно должен быть один столбец с типом name — это столбец с названием задачи, он участвует в построении иерархии. Для остальных столбцов тип не указывается
field
название поля (так, как оно возвращается в публикации с данными)
text
название столбца, как оно будет отображаться в шапке
width
фиксированная ширина столбца в пикселях
minWidth
минимальная ширина столбца в пикселях
flex
вес столбца в адаптивном интерфейсе (при построении диаграммы из общей ширины окна вычитается фиксированная ширина столбцов (width), а оставшееся место делится между остальными столбцами в соответствии с их весом — столбец с весом 2 будет вдвое шире, чем с весом 1)
locked
признак закрепленного столбца (1 или 0),
hidden
признак скрытого столбца (1 или 0). Отображение скрытых столбцов может быть включено пользователем с помощью контекстного меню
align
выравнивание текста в столбце (left, right или center)
format
строка с форматом для даты (например, "dd.MM.yy")
Пример тела ответа
{ \ "dataUrl": "/app/v1.2/api/publications/action/gantt-data", \ "columns": [\ { "field": "realTaskId", "text":"Номер задачи", "width": 150 },\ { "type": "name", "field": "name", "text":"Задача", "width": 250 },\ { "field": "SubcatName", "text":"Категория", "width": 250 },\ { "field": "startDate", "text":"Дата начала", "width": 100, "hidden": 1 },\ { "field": "endDate", "text":"Дата окончания", "width": 100, "hidden": 1 }\ ]\ } 2. Публикация, возвращающая данные
В нашем примере это публикация gnt-data.
Если у диаграммы Ганта есть корневая задача (например, проект, для которого отбираются подзадачи), тогда номер корневой задачи передается во входящем параметре taskId. Если корневой задачи нет, то входящий параметр не нужен.
ℹ️ Входящий параметр (если он есть) должен называться именно taskId (название регистрозависимое)
Тип запроса — GET.
Пакет содержит единственное действие HTTP ответ, которое возвращает результат в формате JSON. Тело ответа формируется с помощью смарт-выражения.
Структура тела ответа:
Ключи
Описание
tasks
список записей. Обычно каждая запись содержит информацию о задаче. Также в списке могут содержаться группирующие записи, например, объединяющие задачи из одного раздела или категории (см. скриншоты выше)
rows
id
уникальный идентификатор
name
название задачи/категории
startDate
дата и время начала задачи
endDate
дата и время окончания задачи
urlToOpen
(необязательное поле) ссылка, которая будет открываться в модальном окне по клику на соответствующую полосу диаграммы Ганта. Например, строка вида \'/maintaskform.aspx?taskid=ID_задачи\'
...
Структура может также содержать любые дополнительные информационные поля, такие как Заказчик, Исполнители, Категория, Статус, Приоритет и пр.
children
массив записей, дочерних для данной записи, с тем же составом полей. У этих дочерних записей могут быть свои вложенные массивы children, и таким образом выстраивается иерархия задач
dependencies
ℹ️ Проверьте актуальное название ключа в интерфейсе системы — в некоторых версиях используется написание dependecies.
массив зависимостей по срокам между задачами. Если зависимости не установлены, возвращается пустой массив
rows
Пример смарт-выражения, возвращающего данные
DECLARE @resTasks NVARCHAR(MAX);
DECLARE @headId INT;
SELECT @headId = CAST(JSON_VALUE(@eventParam0, '$.queryString.taskId') as int);
SET @resTasks = (
SELECT
DISTINCT t.Description AS name,
'subcat-' + CAST(t.SubcatId AS VARCHAR(20)) + '-task-' + CAST(t.TaskId AS VARCHAR(50)) AS id,
children.*
FROM Tasks t
OUTER APPLY (
SELECT
'subcat-' + CAST(t2.SubcatId AS VARCHAR(20)) + '-task-' + CAST(t2.TaskId AS VARCHAR(50)) AS id,
t2.TaskId AS realTaskId,
t2.Description AS name,
t2.CreatedTask AS startDate,
t2.OrderedTime AS endDate,
'/maintaskform.aspx?taskid=' + CAST(t2.TaskId AS VARCHAR(20)) AS url,
sc.Description AS subcatName
FROM Tasks t2
INNER JOIN Subcategories AS sc ON t2.SubcatID = sc.SubcatID
WHERE t2.ParentTaskId = t.TaskId
) children
WHERE t.TaskID = @headId
FOR JSON AUTO
)
DECLARE @res NVARCHAR(MAX) = '{"tasks": {"rows": ' + @resTasks + '}, "dependencies": {"rows":[]}}' ;
SELECT @res
{ "tasks": { "rows": [ { "name": "Подготовка обучения", "id": "subcat-2610-task-678783", "children": \ { "id": "subcat-2610-task-678784", "realTaskId": 678784, "name": "Подготовка аудитории", "startDate": "2020-07-31T05:33:48.327", "endDate": "2020-08-12T16:00:00", "url": "/maintaskform.aspx?taskid=678784", "subcatName": "Задачи и поручения" }, { "id": "subcat-2611-task-678785", "realTaskId": 678785, "name": "Оплата аренды", "startDate": "2020-07-31T05:33:52.907", "endDate": "2020-08-04T16:00:00", "url": "/maintaskform.aspx?taskid=678785", "subcatName": "Платежи" } } ] }, "dependencies": { "rows": [] } } Для формирования тела ответа можно использовать хранимую процедуру Timeline, которая поставляется вместе с платформой. Она отбирает все задачи, подчиненные по отношению к исходной (корневой) задаче, а также все задачи, где исходная выбрана в ДП Lookup.
Входящие параметры процедуры Timeline:
Параметры
Описание
\@XmlParam
структура данных в формате XML. Она содержит корневой элемент root с вложенными элементами:
TaskID
элемент содержит один атрибут:
include
строка с номером исходной (корневой) задачи
SortOrder
элемент содержит атрибуты:
rootCatID
ID категории, задачи из которой должны выводиться на диаграмме Ганта
SortOrder
порядковый номер для сортировки задач в итоговом списке (чем меньше порядковый номер, тем выше будут отображаться задачи из данной категории на диаграмме Ганта)
Options
элемент содержит атрибуты:
StripHtmlTags
1 если из текста задач надо удалять html теги, 0 если не надо
MakeJsonHumanReadable
1 если итоговый JSON надо преображать к более удобному для чтения виду, 0 если не надо
\@OutFormat
формат, в котором возвращаются данные. Возможные значения: \'json\', \'json2\', \'resultset\', \'print\'
\@IncludeDictionaries
определяет, необходимо ли вести отбор данных по справочным категориям (тип категории в общих настройках установлен как Справочник)
1 - вести отбор, 0 - не вести
Пример смарт-выражения с вызовом Timeline:
DECLARE
@rootTaskID INT = JSON_VALUE(@eventParam0, '$.queryString.taskId'),
@procParams XML;
SET @procParams = N'<root>
<TaskID include="' + CAST(@rootTaskID AS VARCHAR(20)) + '"/>
<SortOrder rootCatID="11" SortOrder="1" />
<SortOrder rootCatID="22" SortOrder="2" />
<SortOrder rootCatID="33" SortOrder="3" />
<Options StripHtmlTags="0" MakeJsonHumanReadable="0"/>
</root>';
EXEC dbo.Timeline @XmlParam = @procParams, @OutFormat = 'json2', @IncludeDictionaries = 0