Интеграция KafkaSync
Утилита забирает сообщения из брокера Kafka из определённых очередей (топиков) и создаёт структуру в Vitro MP на основе этих данных.
Обрабатываемые топики
ИСУП
isup.project-1— сообщения о проектах системыisup.constructions-object-1— объекты строительства системыisup.construction-object-type-1— (справочник) типы объектов строительстваisup.place-of-implementation-1— (справочник) места реализацииisup.building-unit-1— корпусы
ФСК Проектирование
kup.schedule-1— графикиkup.schedule-responsibles-1— ответственные у графиковkup.performers-groups-1— группы исполнителейkup.direction-1— направления ЦГИПkup.task-1— задачи
Исходящие (Vitro → Kafka)
vitro.event-status— смена статуса альбома (раздел 5)vitro.status-list— справочник статусов (раздел 5.1)
1. Описание интеграции
ИСУП предоставляет сообщения о верхнеуровневой структуре: Проект → Объект строительства → Корпус.
Сущности распространяются на списки:
- Реестр проектов
- Файлы
В реестре проектов сохраняется полная иерархия ИСУП. В файловой структуре создаются проект и корпус; корпус размещается непосредственно под проектом. Промежуточный элемент «Очередь» и связи через список «Связи» больше не используются.
Связь корпуса с проектом в файлах обеспечивается полем proekt_id_isup на карточке корпуса в реестре (заполняется вычислением, см. раздел 7.3).
ФСК Проектирование предоставляет сущности ниже ТЭ «Корпус»: Стадия, Комплект, Раздел, Альбом, ИЗМ и другие типы из KupMap.
Связь ИСУП и ФСК Проектирование — через справочник «Графики KUP» (kup.direction-1).
При создании корпуса в системе настроена автоматизация на разворачивание шаблона Vitro.
KafkaSync записывает числовые id ИСУП и иерархию parent_id. Guid-лукапы заполняются в Vitro через вычисления и автоматизации (раздел 7).
2. Требования к системе
2.1. Атрибуты
| Название | Системное имя | Тип | Описание |
|---|---|---|---|
| ID ИСУП | id_isup | Integer | числовой идентификатор в ИСУП |
| GUID 1C | guid_1c | string | идентификатор из 1С |
| Короткое имя | short_name | string | короткое имя |
| Описание | description | Note | полное описание |
| Проект (карточка) | project_card | Lookup | лукап на карточку проекта |
| Карточка корпуса | building_lookup | Lookup | лукап на карточку корпуса |
| ID проекта ИСУП | proekt_id_isup | Integer | id_isup проекта для размещения корпуса в файлах |
| Тип объекта (значение ИСУП) | object_type_isup_value | Integer | числовой id типа объекта из Kafka |
| Тип объекта строительства | construction_object_type | Lookup | лукап на справочник типов |
| Место реализации (значение) | mesto_realizacii_isup_value | Integer | числовой id места реализации |
| Место реализации | mesto_realizacii | Lookup | лукап на справочник мест |
| GUID KUP | guid_kup | string | идентификатор ФСКП |
| ИД КУП | short_name_kup | string | Key в ФСКП |
| ИД Шаблона КУП | template_task_id | string | шаблон задачи ФСКП |
| Сортировка КУП | order_kup | string | порядок элемента |
| Тип KUP | type_kup | string | тип задачи из Kafka |
| Path GUID KUP | path_guid_kup | string | уникальный путь элемента |
| Schedule ID KUP | schedule_id_kup | string | идентификатор графика |
| Основной график | is_primary_kup | boolean | флаг основного графика |
| Полное название | full_name | Note | полное имя |
| Направление ЦГИП | division_tsgip_att | Lookup | направление ЦГИП |
| ГИП | chief_project_engineer | Lookup | на корпусе |
| Помощник ГИПа | chief_engineer_assistant | Lookup | на корпусе |
| ГИП наружных сетей | chief_project_engineer_site_utilities | Lookup | на корпусе |
| ГИП заказчика | gip_customer | Lookup | на корпусе |
| Руководитель проекта | project_manager | Lookup | на корпусе |
| Ответственный | responsible | Lookup | на задачах ФСКП |
| Лист согласования | approval_user_list | Lookup | исполнители |
| Наличие внешнего проектировщика | external_designer_condition | Lookup | тип исполнителя |
| Сообщение Kafka | message_kafka | Note | текст сообщения |
| Топик Kafka | topic_kafka | string | топик |
| Ошибка Kafka | error_kafka | string | ошибка обработки |
| Обработано Kafka | success_kafka | boolean | флаг обработки |
2.2. Типы элементов
| Тип элемента | Атрибуты |
|---|---|
| Карточка проекта | id_isup, short_name, description, guid_1c, mesto_realizacii_isup_value, mesto_realizacii |
| Карточка объекта строительства | id_isup, guid_1c, object_type_isup_value, construction_object_type |
| Карточка корпуса | id_isup, proekt_id_isup, construction_object_type |
| Место реализации | id_isup |
| Тип объекта строительства | id_isup |
| Проект | id_isup, guid_1c, short_name, description, project_card, mesto_realizacii |
| Корпус | id_isup, building_lookup, construction_object_type, chief_project_engineer, chief_engineer_assistant, chief_project_engineer_site_utilities, gip_customer, project_manager |
| Стадия / Комплект / Раздел / Альбом / ИЗМ | guid_kup, order_kup, short_name_kup, template_task_id, type_kup, path_guid_kup, schedule_id_kup, full_name |
| Альбом | + division_tsgip_att, responsible, approval_user_list, external_designer_condition |
| Задача план-графика | id_isup |
| Карточка направления ЦГИП | guid_kup |
| График KUP | guid_kup, id_isup, is_primary_kup |
| Сообщение Kafka | message_kafka, topic_kafka, error_kafka, success_kafka |
2.3. Списки
| Название | Типы элементов |
|---|---|
| Файлы | Альбом, Комплект, Раздел, Стадия, Корпус, Проект, ИЗМ |
| Реестр проектов | Карточка проекта, Карточка объекта строительства, Карточка корпуса |
| Типы объектов строительства | Тип объекта строительства |
| Места реализации | Место реализации |
| Справочник направлений ЦГИП | Карточка направления ЦГИП |
| Графики KUP | График KUP |
| Импорт из Kafka | Сообщение Kafka |
| Экспорт в Kafka | Сообщение Kafka |
| Черный список проектов ИСУП | Карточка проекта, Карточка объекта строительства |
| Черный список элементов ФСКП | Папка |
3. Настройка config.json
Файл в корне с исполняемым файлом. Пример для vitro.dev FSK без паролей:
{
"WebUrl": "https://vitro.dev.fsk.ru",
"Login": "admin",
"Password": "password",
"LibraryListId": "966e62c5-a803-49a0-a1be-e680d130c481",
"LibraryParentId": "5da4709f-3c94-4a82-b335-800117096b46",
"ReferenceListId": "5b911635-5f2a-4049-926b-60ec11be3d17",
"ObjectTypeListId": "1a0671ac-6ffd-4c2a-ac83-177c4902377d",
"PlaceImplListId": "fcdecebd-4a57-41ed-8265-9c3d4d586b8b",
"KafkaMessageContentTypeId": "c3629456-3773-49b8-8a58-d4198e77ad8e",
"KafkaExportListId": "d244569a-fb9b-46f9-8a04-925c8baba2bb",
"KafkaImportListId": "9955d107-98e8-42e9-8cd6-19817764cfd3",
"ObjectTypeContentTypeId": "c8988a65-df34-4f60-88fd-90d23965c1fe",
"PlaceImplContentTypeId": "4002a57c-d5ad-42e9-a7f5-531c5d3ad99e",
"ProjectReferenceContentTypeId": "74546a61-799e-46aa-9a79-7f7661bb707f",
"ProjectContentTypeId": "540ff572-4a29-4d8e-8dfb-8eda093c583a",
"ObjectReferenceContentTypeId": "2ecac8b4-e621-400d-a63f-d456f4820efb",
"BuildingReferenceContentTypeId": "7175d8a2-2253-4172-b68b-150b823d855c",
"BuildingContentTypeId": "5c16ee47-fe94-4fc2-bd68-32ce0beb2a68",
"PerformerGroupContentTypeId": "7a5850e5-c2f4-4121-8ed4-450e3f0b4439",
"PerformerGroupListId": "daf3fd57-a7a4-4524-ae87-a359e6ffe082",
"ScheduleContentTypeId": "8e825548-5786-4aa5-b9af-8ad5ac157819",
"ScheduleListId": "e3d0f0ac-cc64-49b0-a06e-774fdc618ea2",
"DirectionContentTypeId": "9846503c-0b8a-4405-9d10-44f672f83fd5",
"DirectionListId": "66ec35fd-a050-45b6-87b2-61d65115cf90",
"IsupBlackListId": "af70989d-ca8f-450e-9422-6f323e9fcf65",
"KupBlackListId": "e77e04d3-f830-4b97-9d3a-d7cb39bd76b6",
"KupMap": {
"STAGE": "64a15f4c-083e-420b-b54e-fc75d44f31b7",
"SET": "78109552-37b6-4d87-b57f-bf11867bbaa9",
"SECTION": "ae453be5-c213-4ec6-b0ca-4efa2f9a98b7",
"ALBUM": "28a48961-35e0-43ae-ad6b-8f159cfd7202",
"IZM": "40a444c3-0f78-407f-8dba-d79ab0db2583",
"APR": "39c299a7-8c85-4c5c-811f-b654e2eb3099",
"STAGE_P": "da4a52ff-ceda-4b5e-b593-5a6339b50233",
"AGR": "0ae0d7cb-b8a2-43fe-8e40-9841c016adad",
"AGO": "f971344d-2e33-4d3a-8c84-cd942db81096",
"PSO": "b4a23642-bc6b-4aa2-97fb-b53631c732bd",
"FACTORY_PREORDER": "75e05071-cf52-4068-963f-622e66ecf7c8",
"RD": "de5012af-fa90-443e-b79b-cf2f56e0b5ed",
"CORRECTION_P": "8f586139-8987-4572-bae7-281d9d31acac",
"IEMD": "78109552-37b6-4d87-b57f-bf11867bbaa9",
"ITERATION_SET": "09ad2c16-6047-4dfb-8274-6c4a5f1edbe5",
"CORRECTION_P_ZOS": "09ad2c16-6047-4dfb-8274-6c4a5f1edbe5"
},
"PerformerTypeMap": {
"CONTRACTOR": "67e87ece-0994-4bf0-98d2-8837f6f87abf"
},
"KafkaConfig": {
"GroupId": "vitro.test",
"BootstrapServers": "kafka.k8s-dev.fsk.ru:9094",
"SaslUsername": "vitro",
"SaslPassword": "password",
"SecurityProtocol": "SaslPlaintext"
}
}
4. Настройка времени запуска утилиты
На усмотрение администраторов. Пример: https://portal.vitrocad.ru/pages/viewpage.action?pageId=23659062
5. Обратная интеграция. Настройка автоматизации
- Тип элемента: Альбом
- Атрибут триггера: Статус
- Действие: Вызов внешнего сервиса
Условия: IsNotNull(This("GUID КУП"))
Действия:
Format('{0}/api/automation/post?baseUrl={0}/api/item/update¶m=[{"list_id":"d244569a-fb9b-46f9-8a04-925c8baba2bb","content_type_id":"c3629456-3773-49b8-8a58-d4198e77ad8e",
"success_kafka":false,"topic_kafka":"vitro.event-status",
"message_kafka":"{\\"update_date\\":\\"{1}\\",\\"guid_kup\\":\\"{2}\\",\\"template_task_guid\\":\\"{3}\\",\\"key\\":\\"{4}\\",\\"document_status\\":\\"{5}\\",\\"building_id\\":\\"{6}\\",\\"type\\":\\"PDF\\",\\"change_number\\":{7} }"}]',
Cfg('Site.PortalUrl'), DateTime(This('Изменен'), 'yyyy-MM-ddTHH:mm:ss.fffZ'), This('GUID КУП'), This('ИД Шаблона КУП'), This('ИД КУП'), Id(This('Статус')), Field(Parent('Корпус'),'id_isup'), This('Номер ИЗМа'))
При срабатывании создаётся элемент в «Экспорт в Kafka» с success_kafka = false. Утилита отправляет его в vitro.event-status.
5.1. Экспорт справочника статусов
Утилита автоматически экспортирует изменённые статусы в vitro.status-list. Автоматизация не требуется. Формат: {"status":"{название}","id":"{guid}"}
6. Черный список проектов ИСУП
Проекты и объекты строительства, которые не будут созданы или обновлены.
Добавление
- Создать «Карточку проекта» с
id_isup. - Если проект уже синхронизирован — удалить вручную.
- Объекты добавляются утилитой автоматически.
Удаление
В «Черном списке»: записать id_isup объектов, удалить объекты и проект.
В «Импорт из Kafka»: для сообщений с BlackListException проставить success_kafka = false.
Шаг «восстановление очередей» больше не актуален.
6.1. Черный список элементов ФСКП
Список KupBlackListId. Элементы с неизвестным type из kup.task-1 или дочерние заблокированного родителя попадают сюда автоматически.
7. Настройка Vitro для работы интеграции
Инструкция первичной настройки. Предполагается, что базовые списки заведены, но изменения по новой схеме ИСУП (без очередей) ещё не выполнены.
7.1. Добавить атрибуты в систему
| Название | Системное имя | Тип |
|---|---|---|
| Место реализации | mesto_realizacii | Lookup → справочник мест реализации |
| Место реализации (значение ИСУП) | mesto_realizacii_isup_value | Integer |
| Тип объекта (значение ИСУП) | object_type_isup_value | Integer |
| ID проекта ИСУП | proekt_id_isup | Integer |
| Тип объекта строительства | construction_object_type | Lookup → типы объектов |
| Проект (карточка) | project_card | Lookup → реестр проектов |
| Карточка корпуса | building_lookup | Lookup → реестр проектов |
7.2. Привязать атрибуты к типам элементов
| Тип элемента | Добавить атрибуты |
|---|---|
| Карточка проекта | mesto_realizacii_isup_value, mesto_realizacii |
| Карточка объекта строительства | object_type_isup_value, construction_object_type |
| Карточка корпуса | proekt_id_isup, construction_object_type |
| Проект (Файлы) | project_card, mesto_realizacii |
| Корпус (Файлы) | building_lookup, construction_object_type |
7.3. Настроить вычисления
Формулы вычисления (не автоматизации). Имена типов в Parent('…') — как в UI.
| Тип элемента | Атрибут | Формула |
|---|---|---|
| Карточка корпуса | proekt_id_isup | Field(Parent('Карточка проекта'), 'id_isup') |
| Карточка корпуса | construction_object_type | Field(Parent("Карточка объекта строительства"), "construction_object_type") |
| Корпус (Файлы) | construction_object_type | Field(This("building_lookup"), "construction_object_type") |
| Проект (Файлы) | mesto_realizacii | Field(This('project_card'), 'mesto_realizacii') |
7.4. Настроить автоматизации
Остальные лукапы — записи в списке «Автоматизация». Общий алгоритм:
- Создать элемент в списке «Автоматизация».
- Триггер: «Изменено значение атрибута» — выбрать тип элемента и атрибут-триггер.
- Условие: формула, возвращающая
true(поле «Формула» у условия). - Действие: «Установить значение атрибута» — целевой атрибут и формула значения.
- GUID списков и типов — из
config.jsonцелевой среды.
Таблица автоматизаций:
| № | Название | Тип элемента | Тип действия | Триггер | Атрибут действия |
|---|---|---|---|---|---|
| 1 | Проект → project_card | Проект (Файлы) | Установить значение атрибута | id_isup | project_card |
| 2 | Карточка проекта → mesto_realizacii | Карточка проекта | Установить значение атрибута | mesto_realizacii_isup_value | mesto_realizacii |
| 3 | Карточка объекта → construction_object_type | Карточка объекта строительства | Установить значение атрибута | object_type_isup_value | construction_object_type |
| 4 | Корпус → building_lookup | Корпус (Файлы) | Установить значение атрибута | id_isup | building_lookup |
Автоматизация 1. Проект → project_card
Условие:
Count(GetList(
"5b911635-5f2a-4049-926b-60ec11be3d17",
"i => i.ContentTypeId == Guid(\"74546a61-799e-46aa-9a79-7f7661bb707f\") && i.GetValueAsInt(\"id_isup\") == " + Str(This("id_isup")),
true)) == 1
Формула действия:
Join("", Select(GetList(
"5b911635-5f2a-4049-926b-60ec11be3d17",
"i => i.ContentTypeId == Guid(\"74546a61-799e-46aa-9a79-7f7661bb707f\") && i.GetValueAsInt(\"id_isup\") == " + Str(This("id_isup")),
true), "Str(Id())"))
Автоматизация 2. Карточка проекта → mesto_realizacii
Условие:
Count(GetList(
"fcdecebd-4a57-41ed-8265-9c3d4d586b8b",
"i => i.ContentTypeId == Guid(\"4002a57c-d5ad-42e9-a7f5-531c5d3ad99e\") && i.GetValueAsInt(\"id_isup\") == " + Str(This("mesto_realizacii_isup_value")),
false)) == 1
Формула действия:
Join("", Select(GetList(
"fcdecebd-4a57-41ed-8265-9c3d4d586b8b",
"i => i.ContentTypeId == Guid(\"4002a57c-d5ad-42e9-a7f5-531c5d3ad99e\") && i.GetValueAsInt(\"id_isup\") == " + Str(This("mesto_realizacii_isup_value")),
false), "Str(Id())"))
Автоматизация 3. Карточка объекта → construction_object_type
Условие:
Count(GetList(
"1a0671ac-6ffd-4c2a-ac83-177c4902377d",
"i => i.ContentTypeId == Guid(\"c8988a65-df34-4f60-88fd-90d23965c1fe\") && i.GetValueAsInt(\"id_isup\") == " + Str(This("object_type_isup_value")),
false)) == 1
Формула действия:
Join("", Select(GetList(
"1a0671ac-6ffd-4c2a-ac83-177c4902377d",
"i => i.ContentTypeId == Guid(\"c8988a65-df34-4f60-88fd-90d23965c1fe\") && i.GetValueAsInt(\"id_isup\") == " + Str(This("object_type_isup_value")),
false), "Str(Id())"))
Автоматизация 4. Корпус → building_lookup
Условие:
Count(GetList(
"5b911635-5f2a-4049-926b-60ec11be3d17",
"i => i.ContentTypeId == Guid(\"7175d8a2-2253-4172-b68b-150b823d855c\") && i.GetValueAsInt(\"id_isup\") == " + Str(This("id_isup")),
true)) == 1
Формула действия:
Join("", Select(GetList(
"5b911635-5f2a-4049-926b-60ec11be3d17",
"i => i.ContentTypeId == Guid(\"7175d8a2-2253-4172-b68b-150b823d855c\") && i.GetValueAsInt(\"id_isup\") == " + Str(This("id_isup")),
true), "Str(Id())"))
