Платформа 3V/DataManager/Маппинг справочников: различия между версиями

Материал из 3v-wiki
Перейти к навигации Перейти к поиску
 
(не показано 45 промежуточных версий этого же участника)
Строка 1: Строка 1:
 
{{DISPLAYTITLE: Как настроить маппинг для справочника}}
 
{{DISPLAYTITLE: Как настроить маппинг для справочника}}
После настройки [[Платформа_3V/DataManager/Источник_данных|источника данных]] необходимо настроить приемник данных. Приемник данных настраивается в части '''"Destination"'''
+
Если приемник данных - справочник, то настройка выглядит следующим образом:
 
 
{| class="wikitable"
 
|-
 
! Название полей !! Описание !! Тип
 
|-
 
| discriminator || Дискриминатор:
 
* Если приемник - справочник, то "DictionaryDataOptions"
 
* Если приемник - показатель, то "IndicatorDataOption"
 
|| Текст ячейки
 
|-
 
| SaveMode ||
 
* DictionaryClient - запись через апи справочников (стоит по умолчанию, можно не прописывать)
 
* Postgres - запись через БД (в данном случае следует указать)
 
|| string (строка)
 
|-
 
| mapperOptions[] || Настройки маппинга || string (строка)
 
|-
 
| expressions[] || Настройки выражений (при необходимости) || коллекция полей
 
|-
 
| clearData || Очистить данные (для справочника '''(если дискриминатор - DictionaryDataOptions)''' добавлена настройка для частичной очистки данных) || boolean (логический тип)
 
|-
 
| dictionaryIdent || Код справочника-приемника данных || string (строка)
 
|}
 
'''Шаблон для Destination:'''
 
 
<syntaxhighlight lang="JSON" line>
 
<syntaxhighlight lang="JSON" line>
 
"Destination": {
 
"Destination": {
                 "discriminator": "",
+
                 "discriminator": "DictionaryDataOptions",
 
                 "SaveMode": "Postgres",
 
                 "SaveMode": "Postgres",
 
                 "mapperOptions": [ {}, {}],
 
                 "mapperOptions": [ {}, {}],
Строка 36: Строка 12:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== Настройки маппинга ===
+
=== Шаг 1. Настройка самого справочника-приемника ===
Все настройки маппинга записываются в поле mapperOptions
+
 
 +
Для начала следует создать справочник для загрузки. Чтобы корректно сработала задача загрузки, перед созданием справочника необходимо ознакомиться с атрибутами из источника и их типами данных. Например, модель источника данных выглядит так:
 +
 
 +
[[Файл:Атрибуты источника.png| 400px]]
 +
 
 +
Из этих данных необходимо, чтобы загружались атрибуты name (тип String), root_id (тип Integer), start_date (тип DateTime):
 +
 
 +
[[Файл:выбранные атрибуты источника.png|400px]]
 +
 
 +
Поэтому справочник следует настроить соответствующим образом:
  
Количество столбцов источника данных, должны соответствовать количеству столбцов приемника данных
+
[[Файл:Конструктор приемника.png|700px]]
{| class="wikitable"
+
 
|-
+
=== Шаг 2. Настройка полей ===
! Название поля !! Описание !! Тип
+
Настройка полей выглядит следующим образом:
|-
 
| propertyName || Наименование данных из источника || string (строка)
 
|-
 
| filedName || Название столбца-приемника || string (строка)
 
|-
 
| dataType || Тип столбца-приемника
 
'''(тип атрибута-источника и атрибута-приемника должен совпадать)'''
 
|| string (строка)
 
|-
 
| isPrimary || Первичный ключ (обычно первичным ключом является столбец с уникальными значениями, то есть идентификатор) || boolean (логический тип)
 
|-
 
| ExpressionId || Идентификатор выражения (необязательно, только если для данных требуется выражение) || string (строка)
 
|-
 
| discriminator || Дискриминатор (MapperOption) || string (строка)
 
|}
 
'''Шаблон для mapperOptions:'''
 
 
<syntaxhighlight lang="JSON" line>
 
<syntaxhighlight lang="JSON" line>
 
"mapperOptions": [
 
"mapperOptions": [
 
                   {
 
                   {
                     "propertyName": "",
+
                     "propertyName": "name",
                     "filedName": "",
+
                     "filedName": "NAME",
                     "dataType": "",
+
                     "dataType": "String",
 +
                    "isPrimary": false,
 +
                    "discriminator": "MapperOption"
 +
                  },
 +
                  {
 +
                    "propertyName": "root_id",
 +
                    "filedName": "root_id",
 +
                    "dataType": "Int32",
 
                     "isPrimary": true,
 
                     "isPrimary": true,
                     "discriminator":"MapperOption"
+
                     "discriminator": "MapperOption"
 
                   },
 
                   },
 
                   {
 
                   {
                     "propertyName": "",
+
                     "propertyName": "start_date",
                     "filedName": "",
+
                     "filedName": "start_date",
                     "dataType": "",
+
                     "dataType": "DateTime",
 
                     "isPrimary": false,
 
                     "isPrimary": false,
                     "discriminator":"MapperOption",
+
                     "discriminator": "MapperOption"
                    "ExpressionId": 1
+
                   }
                   },
 
 
                 ]
 
                 ]
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== Настройки выражений ===
+
'''Откуда берется:'''
 +
* '''propertyName''' - название атрибута из источника
 +
* '''filedName''' - название атрибута из конструктора справочника
 +
* '''dataType''' - тип данных, который должен совпадать в приемнике и источнике
 +
* '''isPrimary''' - является ли данный атрибут первичным ключом (хотя бы один из атрибутов должен содержать настройку  "isPrimary": true)
 +
* '''discriminator''' - здесь всегда необходимо ставить "MapperOption"
 +
 
 +
==== Типы данных, которые поддерживает DataManager ====
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
! Название поля!! Описание !! Тип
+
! Тип !! Как записать в настройке !! Небольшой комментарий
 +
|-
 +
|Строка || String|| Если в источнике приходит тип guid или длинное число, то лучше записать в приемник в атрибут с типом "String"
 +
|-
 +
|Целое число (Integer)|| Int32 || Int64 не поддерживается
 +
|-
 +
|Вещественное число (Double)|| Double || Формат записи через запятую ("370,70")
 
|-
 
|-
| Id || Идентификатор выражения || integer (целое число)
+
|Дата и время|| DateTime || Формат записи через запятую 01.01.2000 (даже, если приходят данные в формате "2020-01-01")
 
|-
 
|-
| Expression || Условие для выражения || string (строка)
+
|Логический тип|| Boolean|| -
 
|-
 
|-
| Variables || Переменные, которые используются в выражении || string (строка)
+
|Json|| "fieldDataType": "Json"|| Данные должны приходит в таком "кавычках", если необходимо атрибуты занести в формат json, то следует использовать выражение: "expression": "[атрибут]" и не прописывать в настройках "SaveMode"
 
|}
 
|}
'''Шаблон для выражений:'''
+
 
 +
=== Шаг 3. Завершение настройки ===
 +
Остается добавить только верный дискриминатор ('''DictionaryDataOptions'''), dictionaryIdent ('''код справочника-приемника'''), SaveMode
 +
<syntaxhighlight lang="JSON" line>
 +
"Destination": {
 +
                "discriminator": "DictionaryDataOptions",
 +
                "SaveMode": "Postgres",
 +
                "mapperOptions": [
 +
  {
 +
    "propertyName": "name",
 +
    "filedName": "NAME",
 +
    "dataType": "String",
 +
    "isPrimary": false,
 +
    "discriminator": "MapperOption"
 +
  },
 +
  {
 +
    "propertyName": "root_id",
 +
    "filedName": "root_id",
 +
    "dataType": "Int32",
 +
    "isPrimary": true,
 +
    "discriminator": "MapperOption"
 +
  },
 +
{
 +
    "propertyName": "start_date",
 +
    "filedName": "start_date",
 +
    "dataType": "DateTime",
 +
    "isPrimary": false,
 +
    "discriminator": "MapperOption"
 +
  }
 +
  ],
 +
  "dictionaryIdent": "New_Dictionary_5535"
 +
}
 +
</syntaxhighlight>
 +
 
 +
=== Шаг 4. Результат работы ===
 +
'''ОБЯЗАТЕЛЬНО НЕ ЗАБЫВАЕМ ВСТАВИТЬ В НАСТРОЙКУ SOURCE И ПРОВЕРИТЬ ВСЮ НАСТРОЙКУ НА СИНТАКСИЧЕСКИЕ ОШИБКИ'''
 +
 
 +
Готовую настройку можно загрузить с помощью задач загрузки данных или сваггер, затем посмотреть результат
 +
 
 +
[[Файл:результат работы.png|1000px]]
 +
 
 +
В итоге, в справочник приемник выгрузились необходимые данные
 +
 
 +
[[Файл:сам справочник.png|700px]]
 +
 
 +
=== Пример ===
 +
[https://3v.3v-group.net/navigator/#/?viewId=436077 Пример справочника-приемника (полезно обратить внимание на тип данных и на наименования атрибутов)]
 +
 
 +
'''Полная настройка:'''
 
<syntaxhighlight lang="JSON" line>
 
<syntaxhighlight lang="JSON" line>
"expressions":[
+
{
                {
+
"Validation": "StopIfErrorRecordsExists",
                  "Id": 1,      
+
"Source": {
                  "Expression": "",
+
  "discriminator": "UrlDataManagerSource",
                  "Variables": {"1": "", "2": ""}
+
  "Uri": "https://3v.3v-group.net/filestorage/api/File/c0ed6016-6423-4ac4-a6ff-9554d0697aad",
                }          
+
        "Credentials":{
              ]
+
            "discriminator": "PasswordAuthenticationSettingsDto",
 +
            "TokenRequestUrl": "https://3v.3v-group.net/auth/realms/trivium/protocol/openid-connect/token",
 +
            "clientId": "corp-engine",
 +
            "UserName": "apiTestUser",
 +
            "Password": "apiTestUser"
 +
  },
 +
  "Headers": {
 +
  "namespace": "develop"
 +
  }
 +
},
 +
"Destination": {
 +
  "discriminator": "DictionaryDataOptions",
 +
  "SaveMode": "Postgres",
 +
  "mapperOptions": [
 +
  {
 +
    "propertyName": "name",
 +
    "filedName": "NAME",
 +
    "dataType": "String",
 +
    "isPrimary": false,
 +
    "discriminator": "MapperOption"
 +
  },
 +
  {
 +
    "propertyName": "root_id",
 +
    "filedName": "root_id",
 +
    "dataType": "Int32",
 +
    "isPrimary": true,
 +
    "discriminator": "MapperOption"
 +
  },
 +
{
 +
    "propertyName": "start_date",
 +
    "filedName": "start_date",
 +
    "dataType": "DateTime",
 +
    "isPrimary": false,
 +
    "discriminator": "MapperOption"
 +
  }
 +
  ],
 +
  "dictionaryIdent": "New_Dictionary_5535"
 +
}
 +
}
 
</syntaxhighlight>
 
</syntaxhighlight>

Текущая версия на 09:12, 12 декабря 2022

Если приемник данных - справочник, то настройка выглядит следующим образом:

1 "Destination": {
2                  "discriminator": "DictionaryDataOptions",
3                  "SaveMode": "Postgres",
4                  "mapperOptions": [ {}, {}],
5                  "expressions": [{}],
6                  "clearData": false,
7                  "dictionaryIdent": ""
8                }

Шаг 1. Настройка самого справочника-приемника

Для начала следует создать справочник для загрузки. Чтобы корректно сработала задача загрузки, перед созданием справочника необходимо ознакомиться с атрибутами из источника и их типами данных. Например, модель источника данных выглядит так:

Атрибуты источника.png

Из этих данных необходимо, чтобы загружались атрибуты name (тип String), root_id (тип Integer), start_date (тип DateTime):

выбранные атрибуты источника.png

Поэтому справочник следует настроить соответствующим образом:

Конструктор приемника.png

Шаг 2. Настройка полей

Настройка полей выглядит следующим образом:

 1 "mapperOptions": [
 2                    {
 3                     "propertyName": "name",
 4                     "filedName": "NAME",
 5                     "dataType": "String",
 6                     "isPrimary": false,
 7                     "discriminator": "MapperOption"
 8                    },
 9                    {
10                     "propertyName": "root_id",
11                     "filedName": "root_id",
12                     "dataType": "Int32",
13                     "isPrimary": true,
14                     "discriminator": "MapperOption"
15                    },
16                    {
17                     "propertyName": "start_date",
18                     "filedName": "start_date",
19                     "dataType": "DateTime",
20                     "isPrimary": false,
21                     "discriminator": "MapperOption"
22                    }
23                  ]

Откуда берется:

  • propertyName - название атрибута из источника
  • filedName - название атрибута из конструктора справочника
  • dataType - тип данных, который должен совпадать в приемнике и источнике
  • isPrimary - является ли данный атрибут первичным ключом (хотя бы один из атрибутов должен содержать настройку "isPrimary": true)
  • discriminator - здесь всегда необходимо ставить "MapperOption"

Типы данных, которые поддерживает DataManager

Тип Как записать в настройке Небольшой комментарий
Строка String Если в источнике приходит тип guid или длинное число, то лучше записать в приемник в атрибут с типом "String"
Целое число (Integer) Int32 Int64 не поддерживается
Вещественное число (Double) Double Формат записи через запятую ("370,70")
Дата и время DateTime Формат записи через запятую 01.01.2000 (даже, если приходят данные в формате "2020-01-01")
Логический тип Boolean -
Json "fieldDataType": "Json" Данные должны приходит в таком "кавычках", если необходимо атрибуты занести в формат json, то следует использовать выражение: "expression": "[атрибут]" и не прописывать в настройках "SaveMode"

Шаг 3. Завершение настройки

Остается добавить только верный дискриминатор (DictionaryDataOptions), dictionaryIdent (код справочника-приемника), SaveMode

 1 "Destination": {
 2                 "discriminator": "DictionaryDataOptions",
 3                 "SaveMode": "Postgres",
 4                 "mapperOptions": [
 5    {
 6     "propertyName": "name",
 7     "filedName": "NAME",
 8     "dataType": "String",
 9     "isPrimary": false,
10     "discriminator": "MapperOption"
11    },
12    {
13     "propertyName": "root_id",
14     "filedName": "root_id",
15     "dataType": "Int32",
16     "isPrimary": true,
17     "discriminator": "MapperOption"
18    },
19  {
20     "propertyName": "start_date",
21     "filedName": "start_date",
22     "dataType": "DateTime",
23     "isPrimary": false,
24     "discriminator": "MapperOption"
25    }
26   ],
27   "dictionaryIdent": "New_Dictionary_5535"
28  }

Шаг 4. Результат работы

ОБЯЗАТЕЛЬНО НЕ ЗАБЫВАЕМ ВСТАВИТЬ В НАСТРОЙКУ SOURCE И ПРОВЕРИТЬ ВСЮ НАСТРОЙКУ НА СИНТАКСИЧЕСКИЕ ОШИБКИ

Готовую настройку можно загрузить с помощью задач загрузки данных или сваггер, затем посмотреть результат

результат работы.png

В итоге, в справочник приемник выгрузились необходимые данные

сам справочник.png

Пример

Пример справочника-приемника (полезно обратить внимание на тип данных и на наименования атрибутов)

Полная настройка:

 1 {
 2  "Validation": "StopIfErrorRecordsExists",
 3  "Source": {
 4   "discriminator": "UrlDataManagerSource",
 5   "Uri": "https://3v.3v-group.net/filestorage/api/File/c0ed6016-6423-4ac4-a6ff-9554d0697aad",
 6         "Credentials":{
 7             "discriminator": "PasswordAuthenticationSettingsDto",
 8             "TokenRequestUrl": "https://3v.3v-group.net/auth/realms/trivium/protocol/openid-connect/token",
 9             "clientId": "corp-engine",
10             "UserName": "apiTestUser",
11             "Password": "apiTestUser"
12   },
13   "Headers": {
14    "namespace": "develop"
15   }
16  },
17  "Destination": {
18    "discriminator": "DictionaryDataOptions",
19    "SaveMode": "Postgres",
20   "mapperOptions": [
21    {
22     "propertyName": "name",
23     "filedName": "NAME",
24     "dataType": "String",
25     "isPrimary": false,
26     "discriminator": "MapperOption"
27    },
28    {
29     "propertyName": "root_id",
30     "filedName": "root_id",
31     "dataType": "Int32",
32     "isPrimary": true,
33     "discriminator": "MapperOption"
34    },
35  {
36     "propertyName": "start_date",
37     "filedName": "start_date",
38     "dataType": "DateTime",
39     "isPrimary": false,
40     "discriminator": "MapperOption"
41    }
42   ],
43   "dictionaryIdent": "New_Dictionary_5535"
44  }
45 }