Утилита позволяет перенести структуру папок и файлы, находящиеся в системе G-Station, в Vitro MP.
Дополнительно есть возможность переноса замечаний и согласований.

Обязательные предварительные действия

Для работы утилиты нужны решения Migration, которые надо разместить в Solutions на сервере Vitro MP:

  • Windows - C:\Program Files\Vitro Software\Vitro\Server\Solutions\Migration
  • Linux - /etc/Vitro/Server/Solutions/Migration

Сами решения Migration берутся из дистрибутива версии сервера Vitro-CAD

Режимы работы утилиты

  • Init – режим подготовки данных файлов и папок. Опрашивает всю структуру G-Station, указанную в параметре LibraryMap. Формирует записи в таблице migration_gstation.
  • Folder – режим обработки таблицы migration_gstation- перенос папочной структуры.
  • File - режим обработки таблицы migration_gstation- перенос файлов.
  • Issue – режим переноса замечаний. Все переносимые замечания фиксируются в таблице migration_gstation c type = 3
  • IssueAttachment – режим переноса вложений замечаний. Все файлы прикрепленные к замечанию будут перенесены в атрибут "Вложения". 
  • Approval – режим переноса согласований. Переносимые согласования фиксируются в таблице migration_gstation c type = 4
  • PublishApproval – режим переноса согласований типа "В производство работ".

Если не указать параметр Mode, то будут запущены все режимы последовательно.


Принцип работы

Данные из G-Station извлекаются с помощью API. В системе G-Station должен быть технический пользователь, у которого есть доступ на чтение ко всем переносимым проектам.

Вся информация о миграции записывается в таблицу БД migration_gstation. В качестве БД предполагается использовать PostgreSQL. Может быть расположено в той же схеме, что и Vitro MP.

Структура таблицы

Название колонкиТип данныхОписание
api_urlTEXTСодержит api префикс для получения элемента. G-Station может быть разбит на несколько серверов с разными адресами
project_urnTEXTUrn проекта переносимой сущности
urnTEXTUrn сущности
nameTEXTНазвание
idBIGINTЧисленный идентификатор в системе G-Station
parentBIGINTИдентификатор родителя в системе G-Station
typeINTТип сущности. 0 – файл, 1 – папка, 2 - проект, 3 - замечание, 4 - согласование
sizeBIGINTРазмер в байтах. Актуален только для файлов.
item_idUUIDGuid в системе Vitro MP. Формируется во время режима Init.
versionINTВерсия элемента в G-Station
create_startTIMESTAMPДата начала обработки файла/папки
create_endTIMESTAMPДата окончания обработки файла/папки
issue_startTIMESTAMPДата начала обработки замечания
issue_endTIMESTAMPДата окончания обработки замечания
issue_attachment_startTIMESTAMPДата начала переноса вложений замечания
issue_attachment_endTIMESTAMPДата окончания переноса вложений замечания
approving_startTIMESTAMPДата начала обработки согласования
approving_endTIMESTAMPДата окончания обработки согласования
errorTEXTТекст ошибки при переносе элемента


Записи, которые поступили в обработку имеют заполненное поле *_start для своего режима (например create_start). 
При успешной обработке будет заполнено поле *_end (например поле create_end). Если произошла ошибка, то будет заполнен столбец error.

Уникальный идентификатор для таблицы - составной ключ: api_url, project_urn, urn, так как в системе G-Station нет Guid и уникального идентификатора в рамках всех проектов.


Конфигурация утилиты

Основной параметр является LibraryMap, который определяет, какая папка G-Station в какую папку Vitro MP будет перенесена.

ПараметрПримерОписание
WebUrl"https://localhost:53135"Адрес системы Vitro MP
Login"admin"Логин от технической учетной записи в системе Vitro MP
Password"admin"Пароль от технической учетной записи в системе Vitro MP
ModeInitРежим работы утилиты. Может быть не заполнен. В таком случае будут запущены последовательно все режимы работы
ListId"966e62c5-a803-49a0-a1be-e680d130c481"Guid списка куда будут перенесены папки и файлы в Vitro MP
ConnectionString"server=localhost;database=vitrodb;user id=vitrodbuser;password=vitrodbuser"Строка подключения к БД с таблицей migration_gstation
DownloadFileBodytrueФлаг скачивания тел файлов. Может быть проведено тестирование без переноса тел файлов для экономии места.
MigrateFileVersionListtrueФлаг переноса всех версий файлов. Если true, то будут перенесены все тела файлов.
DefaultUserId"aab39600-92b4-4c38-a55c-53efac8db9cc"Guid пользователя, который будет подставлен при отсутствии сопоставления пользователя по email
IssueStatusMap

[    {  "Name": "DRAFT",  "Id": "059114cf-3ff1-40db-9086-af0a0053e123"   },
{  "Name":"NOT_RELEVANT",  "Id": "059114cf-3ff1-40db-9086-af0a0053e123"  },
{  "Name": "NOT_STARTED",   "Id": "646ac5e3-d5d4-4f88-b213-af0a0058c25c"  },
{  "Name": "IN_PROCESS",     "Id": "5755dca4-9bad-442f-abfd-af0a0058e7e2"   },
{ "Name": "ON_REVIEW",   "Id": "2c559935-7137-46a8-a858-af0a0059773f"   },
{ "Name": "CLOSED",    "Id": "ae7cf376-0098-4a76-b172-af0a0059978d"  } ]

Маппинг статусов замечаний G-Station в статусы задач Vitro MP
FileStatusMap

[  {   "Name": "default",   "Id": "b9d061b1-7ce7-4756-8230-e502cfe3d8d8"  },
   {   "Name": "approved",  "Id": "84124eed-7049-46a8-bac9-a179ff00efe3"  },
   {   "Name": "rejected",  "Id": "14a46dee-9aa4-47a5-b2ae-7dfee7deefd5" },
   { "Name": "partially_approved", "Id": "132fd34b-b757-459e-8191-4a264c91a5b3" }  ],

Маппинг статусов файлов G-Station в статус документа Vitro MP
ApprovalStatusMap[  { "Name": "started", "Id": "4a1254f6-6d16-4f53-8861-45df330758f2" },
   { "Name": "void",    "Id": "ef9e1ebe-2211-4ba4-9493-9d17323a3b4d" },
  { "Name": "completed", "Id": "62f64b73-76df-40f4-9889-7ed6a8494c3d"  }  ]
Маппинга статусов согласований G-Station в статус процесса Vitro MP
FileRefStatusMap[  {  "Name": "default",   "Id": "a5f3ae02-9ee1-4b3a-ad25-1af248eac2ae"  },
   {  "Name": "approved", "Id": "57465f37-3c35-4d73-96e7-b3b53bdd8336"  },
   {  "Name": "rejected", "Id": "d1abf56b-cfba-49ba-89e3-672ad012e0d8"  },
   {  "Name": "partially_approved", "Id": "0d43e15e-fa91-4976-bd5e-9f8423247d80"  } ]
Маппинг статусов привязки файлов к согласованиям.
ExtensionWhiteList[ "DWG", "PDF", "XLSX", "JPG", "DOCX", "ZIP", "RAR", "RVT", "DOC", "7Z", "TXT", "PNG"]Белый список расширений переносимых файлов.
ApprovalListId"fd8f54f8-b708-47d9-807d-f36add5dfc82"Guid списка согласования в Vitro MP
PublishApprovalListId"102f576c-9903-489c-a10b-d6dd78a5f0f0"Guid списка "В производство работ" в Vitro MP
ApprovalContentTypeId"7f09fdc2-3dce-418b-a8b5-f2e059442315"Guid типа элемента "Согласование" в Vitro MP
ApprovalStepContentTypeId"de4133bb-286d-4c02-a37b-4fafb8a0f45c"Guid типа элемента "Этап согласования" в Vitro MP
ApproverContentTypeId"23aa25ba-2b04-49a5-9e9e-4959908de66f"Guid типа элемента "Согласующий" в Vitro MP
LibraryMap{ "https://gs.ru/urn:gstation.dm.project:130/folders/urn:gstation.dm.folder:1112": "3401b2e4-a230-438d-848a-4a0e1c6233ac",   "https://gs.ru/urn:gstation.dm.project:133/folders/urn:gstation.dm.folder:17929": "3401b2e4-a230-438d-848a-4a0e1c6233ac"}Основной параметр. Маппинг url папки G-Station в guid папки Vitro MP.

Пример конфигурации утилиты с указанием режима обработки Mode. Если строчку с Mode удалить все режимы запустятся последовательно:

{
  "WebUrl": "https://localhost:53135",
  "Login": "admin",
  "Mode": "Init",
  "Password": "admin",
  "ListId": "966e62c5-a803-49a0-a1be-e680d130c481",
  "ConnectionString": "server=localhost;database=vitrodb;user id=vitrodbuser;password=@pwd4vitro!",
  "DownloadFileBody": true,
  "DefaultUserId": "aab39600-92b4-4c38-a55c-53efac8db9cc",
  "ApprovalRefContentTypeId": "45b51fc8-40ff-48fe-bc06-cbad7d6a1d11",
  "IssueStatusMap": [
    {
      "Name": "DRAFT",
      "Id": "059114cf-3ff1-40db-9086-af0a0053e123"
    },
    {
      "Name": "NOT_RELEVANT",
      "Id": "059114cf-3ff1-40db-9086-af0a0053e123"
    },
    {
      "Name": "NOT_STARTED",
      "Id": "646ac5e3-d5d4-4f88-b213-af0a0058c25c"
    },
    {
      "Name": "IN_PROCESS",
      "Id": "5755dca4-9bad-442f-abfd-af0a0058e7e2"
    },
    {
      "Name": "ON_REVIEW",
      "Id": "2c559935-7137-46a8-a858-af0a0059773f"
    },
    {
      "Name": "CLOSED",
      "Id": "ae7cf376-0098-4a76-b172-af0a0059978d"
    }
  ],
  "FileStatusMap": [
    {
      "Name": "default",
      "Id": "b9d061b1-7ce7-4756-8230-e502cfe3d8d8"
    },
    {
      "Name": "approved",
      "Id": "84124eed-7049-46a8-bac9-a179ff00efe3"
    },
    {
      "Name": "rejected",
      "Id": "14a46dee-9aa4-47a5-b2ae-7dfee7deefd5"
    },
    {
      "Name": "partially_approved",
      "Id": "132fd34b-b757-459e-8191-4a264c91a5b3"
    }
  ],
  "ApprovalStatusMap": [
    {
      "Name": "started",
      "Id": "4a1254f6-6d16-4f53-8861-45df330758f2"
    },
    {
      "Name": "void",
      "Id": "ef9e1ebe-2211-4ba4-9493-9d17323a3b4d"
    },
    {
      "Name": "completed",
      "Id": "62f64b73-76df-40f4-9889-7ed6a8494c3d"
    }
  ],
  "FileRefStatusMap": [
    {
      "Name": "default",
      "Id": "a5f3ae02-9ee1-4b3a-ad25-1af248eac2ae"
    },
    {
      "Name": "approved",
      "Id": "57465f37-3c35-4d73-96e7-b3b53bdd8336"
    },
    {
      "Name": "rejected",
      "Id": "d1abf56b-cfba-49ba-89e3-672ad012e0d8"
    },
    {
      "Name": "partially_approved",
      "Id": "0d43e15e-fa91-4976-bd5e-9f8423247d80"
    }
  ],
  "ExtensionWhiteList": [ "DWG", "PDF", "XLSX" ],
  "ApprovalListId": "fd8f54f8-b708-47d9-807d-f36add5dfc82",
  "ApprovalContentTypeId": "7f09fdc2-3dce-418b-a8b5-f2e059442315",
  "ApprovalStepContentTypeId": "de4133bb-286d-4c02-a37b-4fafb8a0f45c",
  "PublishApprovalListId": "102f576c-9903-489c-a10b-d6dd78a5f0f0",
  "ApproverContentTypeId": "23aa25ba-2b04-49a5-9e9e-4959908de66f",
  "LibraryMap": {
    "https://gs.gs.ru/dm/projects/urn:gstation.dm.project:133/folders/urn:gstation.dm.folder:17929": "3401b2e4-a230-438d-848a-4a0e1c6233ac",
    "https://gs.gs.ru/dm/projects/urn:gstation.dm.project:130/folders/urn:gstation.dm.folder:14900": "3401b2e4-a230-438d-848a-4a0e1c6233ac",

  },
  "MigrateFileVersionList": true
}

Важно: перед запуском утилиты качественно подготовить config – проверить все ID в системе Vitro-CAD:

  1. Они должны существовать;
  2. Они должны ввести в корректную директорию.

Требования к системе

Атрибуты, которые должны существовать в Vitro-CAD MP перед запуском утилиты:


assignedto_gstation – string -  ФИО пользователей в поле "Исполнители"

approver_role_list – string – список ролей этапа согласования

approval_template – string – шаблон согласования


Типы элементов, которые должны существовать в Vitro-CAD MP перед запуском утилиты и их атрибуты:

Тип элементаАтрибуты
Замечаниеassignedto_gstation, attachment_list
Согласование (ApprovalContentTypeId)End_date_plan, end_date_fact, description, workflow_status, approval_template
Этап согласования (ApprovalStepContentTypeId)End_date_plan, end_date_fact, approver_role_list, workflow_status
Согласующий (ApproverContentTypeId)Description, workflow_status
Связь с согласованиемНеобходимо создать тип элемента под Связь с указанием версии. Дополнительные атрибуты не нужны.


Списки

СписокТипы элементов
Согласования (ApprovalListId)Согласование, этап согласования, согласующий
Выпуск в производство (PublishApprovalListId)Согласование, этап согласования, согласующий


Особенности переноса

  • В G-Station нет типов элементов. Соответственно в Vitro MP всё переносится как Папка для папок и Файл Проекта для файлов. Необходимо дополнительно продумывать последующее изменение типов контента или распределение элементов в нужную структуру
  • Маркапы замечаний не переносятся. В Vitro MP при использовании BIM viewer модели конвертируются заново, метки используемые в G-Station имеют несопоставимые координаты.
  • Рабочие процессы переносятся в отдельный список. G-Station имеет множество шаблонов на каждый случай, так как малейшее изменение в бизнес логике ведет к дополнительному шаблону. В Vitro процессы имеют гибкую настройку, и общая практика такова, что запускается небольшое количество универсальных гибких процессов. Соответственно конвертировать шаблон в логику процессов Витро трудоемко и бессмысленно, и перемешивание этих сущностей в одном списке вредило бы логике.


Алгоритм переноса

Последовательность действий для запуска первичной миграции (таблица в БД migration_gstation пустая)

1. Заполнить config. json основными параметрами типов контента и списков. Убедиться, что все пути указывают в верную директорию Vitro-CAD. Убедиться, что есть доступы у указанных пользователи в системе G-Station

2. Заполнить параметр LibraryMap для переноса нужных папок

3. Запустить утилиту GStationToMPMigrateApp

4. Проверить таблицу migration_gstation – в ней появляются записи. Критерии успешности:

  • Строчка появилась в таблице
  • В строчке БД и в поле create_start – есть запись значит эта строчка обрабатывается утилитой.
  • В строчке БД и в поле create_end – есть запись значит эта строчка обработалась утилитой и нужно проверять.
  • В строчки БД в поле error -должно быть пусто
  • Элемент появился в Vitro-CAD.

5. При возникновении ошибок делать запрос в таблицу миграции gstation_migration и изучить ошибку. Запустить утилиту в том режиме, в котором произошла ошибка. Если ошибка упала на режиме Folder, то следующий запуск нужно сделать в режиме Folder. Для этого зайти в config.json указать Mode Folder.

6. При повторном запуске утилиты миграции с новыми параметрами LibraryMap предварительно необходимо очистить таблицу миграции и запустить утилиту без указания Mode (строчку надо удалить из config.json). Если цель повторного запуска утилиты – домиграция новых данных из тех директорий в LibraryMap, которые ранее были перенесены – чистить таблицу gstation_migration нельзя

Возможные ошибки

  • В поле error таблицы migration_gstation смотрим ошибку
  • Переходим в Vitro-CAD MP
  • В Центр администрирования -> списки-> Аудит запросов (скрытый список)
  • Сортируем по дате изменения или дате создания ищем самую актуальную запись с кодом ошибки из поля error таблицы migration_gstation.
  • Виды ошибок:
    • Элемент существует в системе. В Аудит запросов будет ошибка вида Vitro.Server.Core.Exceptions.ItemExistsFieldValueException.  Причина может быть в некорректно указанном LibraryMap, где уже есть данная папка или в структуре самого проекта существуют папки/файлы на одном уровне с одинаковым названием
    • Не найден родитель элемента. В аудите запросов будет ошибка ItemNotFoundException. Причина может быть в незавершенности режима Folder или возникала ошибка при создании родителя.
    • Другие ошибки маппинга атрибутов, наименования файлов, папок, которые требуют дополнительного разбора – скорее всего не были соблюдены обязательные требования перед запуском утилиты – необходимо эти требования выполнить и запустить утилиту в том режиме в котором была ошибка.