Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
product:api:integration_examples:aw [21.04.2024 22:04] liliia.katrenkoproduct:api:integration_examples:aw [07.08.2024 05:55] (текущий) – [1)Сформировать в ADVANTA LINQ-запросы] ekaterina.menkhuzina
Строка 4: Строка 4:
 Ниже приведена подробная пошаговая инструкция по организации процесса обмена данными между двумя системами. Для реализации обмена у вас должен быть доступ к по крайней мере к демо-версиям данных продуктов. Ниже приведена подробная пошаговая инструкция по организации процесса обмена данными между двумя системами. Для реализации обмена у вас должен быть доступ к по крайней мере к демо-версиям данных продуктов.
  
-**1) Сформировать в ADVANTA LINQ-запросы** +==== 1) Сформировать в ADVANTA LINQ-запросы ====
  
-Интеграция с Analytic Workspace организована с использование [[corporative:integration:linq|LINQ-запросов]] и [[product:api:start|Web-API]] ADVANTA. Таким образом, для того, чтобы загрузить данные в BI-систему, необходимо предварительно сформировать LINQ-запросы внутри ADVANTA для получения тех данных, которые в дальнейшем будут визуализированы.+Интеграция с Analytic Workspace организована с использованием [[corporative:integration:linq|LINQ-запросов]] и [[product:api:start|Web-API]] ADVANTA. Таким образом, для того, чтобы загрузить данные в BI-систему, необходимо предварительно сформировать LINQ-запросы внутри ADVANTA для получения тех данных, которые в дальнейшем будут визуализированы.
  
-Пример LINQ-запроса данных по проектам+=== Пример LINQ-запроса данных по проектам ===
  
 <code csharp> <code csharp>
Строка 45: Строка 45:
 </code>  </code> 
  
-Пример LINQ-запроса данных по контрольным точкам +\\ 
 +=== Пример LINQ-запроса данных по контрольным точкам === 
 + 
  
 <code csharp> <code csharp>
Строка 79: Строка 81:
 <callout type="info" icon="true">Данный код запросов приведен в качестве примера. На вашей инсталяции необходимо будет указать наименования сущностей, объектов, справочников, реквизитов, соответствующих сформированному контексту LINQ-запросов.</callout> <callout type="info" icon="true">Данный код запросов приведен в качестве примера. На вашей инсталяции необходимо будет указать наименования сущностей, объектов, справочников, реквизитов, соответствующих сформированному контексту LINQ-запросов.</callout>
  
-** 2) Создать шаблоны таблиц данных в формате .xlsx **+\\ 
 + ==== 2) Создать шаблоны таблиц данных в формате .xlsx ====
  
 Данные шаблоны необходимы для формирования структуры хранения данных в AW в соответствии со структурой получаемых их ADVANTA данных. Данные шаблоны необходимы для формирования структуры хранения данных в AW в соответствии со структурой получаемых их ADVANTA данных.
  
-Для создания шаблона необходимо выполнить созданный LINQ-запрос в ADVANTA, скопировать шапку полученной таблицы в Excel и сохранить файл в формате .xlsx. +Для создания шаблона необходимо **выполнить созданный LINQ-запрос** в ADVANTA, скопировать шапку полученной таблицы в Excel и сохранить файл в формате .xlsx.  
 + 
 +{{ :product:api:integration_examples:без_имени.jpg?800 |}} 
 + 
 +\\ 
 +=== Пример шаблона для источника данных по проектам === 
 + 
 +{{ :product:api:integration_examples:снимок_экрана_2024-04-22_002808.png?600 |}} 
 + 
 +\\ 
 +=== Пример шаблона для источника данных по контрольным точкам === 
 + 
 +{{ :product:api:integration_examples:снимок_экрана_2024-04-22_002843.png?600 |}} 
 + 
 +\\ 
 +Загрузите данные шаблоны в Analytic Workspace, в раздел «Источники данных» — здесь необходимо **создать источник, выбрать формат «Файл» и загрузить сформированный шаблон**. 
 + 
 +{{ :product:api:integration_examples:снимок_экрана_2024-04-22_003003.png?250 |}} 
 + 
 +\\ 
 +==== 3) Создать модель в Analytic Workspace и сформировать скрипт в ETL-редакторе ==== 
 + 
 +После создания источника необходимо в соответствующем разделе Analytic Workspace **создать модель**, которая и будет служить витриной данных для созданного источника. Необходимо создать столько же моделей, сколько предполагается использовать LINQ-запросов.  
 + 
 +{{ :product:api:integration_examples:снимок_экрана_2024-04-22_003125.png?400 |}} 
 + 
 +\\ 
 +Сразу после создания необходимо перейти в режим редактирования модели и зайти в **ETL-редактор**. 
 + 
 +{{ :product:api:integration_examples:без_имени1.jpg?800 |}} 
 + 
 +\\ 
 +В открывшемся редакторе необходимо ввести скрипт для обработки получаемых из ADVANTA данных. Скрипт написан на Python.  
 + 
 +\\ 
 +=== Пример скрипта для проектов === 
 + 
 +<code csharp> 
 +# ----------------------------------------------------------------------------------- 
 +# Cкрипт для обработки модели * * * 
 +# ----------------------------------------------------------------------------------- 
 + 
 +import requests 
 +import datetime 
 +from pyspark.sql import Row 
 + 
 +# python - m pip install requests, matplotlib, pandas 
 + 
 +from pandas import json_normalize  
 + 
 +def after_all(df, spark, app, *args, **kwargs): 
 +    print(df.schema) 
 + 
 +    LOGIN = '* * *' 
 +    PASSWORD = '* * *' 
 +    DOMAIN = 'https://* * *.ru' 
 + 
 +    AUTH = { 
 +    'Login': LOGIN, 
 +    'Password': PASSWORD, 
 +    } 
 + 
 +    session = requests.Session() 
 +    # cookies = session.cookies.get_dict() # {} 
 + 
 +    # авторизация 
 +    response = session.post(url=DOMAIN+'/api/auth/login', json=AUTH, verify=False) 
 + 
 +    cookies = session.cookies.get_dict() 
 + 
 +    # print(cookies) 
 + 
 +    # получение LINQ-запроса 
 +    LINQ = { 
 +        'DataSourceKey': 'BI_projects', 
 +        # нужен другой запрос для перечня проектов в модель list1 
 +        # 'DataSourceKey': 'BI_projects',  
 +        # и еще один для перечня КТ из этих проектов в модель list1_ywrq 
 +        # 'DataSourceKey': 'BI_milestones',  
 +        'PageSize': 100,      
 +    } 
 + 
 +    r = session.post(url=DOMAIN+'/api/queries/get', cookies=cookies, json=LINQ, verify=False) 
 + 
 +    if not r.ok: 
 +        raise Exception(f'Ошибка в {r.url}. HTTP {r.status_code}: {r.text}'
 + 
 +    data = r.json() 
 +     
 +    #Создадим список, который послужит основной для создания DataFrame 
 +    rows = [] 
 +    for line in data: 
 +        rows.append(Row( 
 +            id=line['Id'], 
 +            name=line['Name'], 
 +            parentname=line['ParentName'], 
 +            lifecyclename=line['LifeCycleName'], 
 +            # systemstartdate=str(datetime.datetime.fromisoformat(line['SystemStartDate']).replace(tzinfo=datetime.timezone.utc)), 
 +            # systemenddate=str(datetime.datetime.fromisoformat(line['SystemEndDate']).replace(tzinfo=datetime.timezone.utc)), 
 +            # actualstartdate=str(datetime.datetime.fromisoformat(line['ActualStartDate']).replace(tzinfo=datetime.timezone.utc)), 
 +            # actualenddate=str(datetime.datetime.fromisoformat(line['ActualEndDate']).replace(tzinfo=datetime.timezone.utc)), 
 +            # baselineplanstartdate=str(datetime.datetime.fromisoformat(line['BaselinePlanStartDate']).replace(tzinfo=datetime.timezone.utc)), 
 +            # baselineplanenddate=str(datetime.datetime.fromisoformat(line['BaselinePlanEndDate']).replace(tzinfo=datetime.timezone.utc)), 
 + 
 +            systemstartdate=line['SystemStartDate'], 
 +            systemenddate=line['SystemEndDate'], 
 +            actualstartdate=line['ActualStartDate'], 
 +            actualenddate=line['ActualEndDate'], 
 +            baselineplanstartdate=line['BaselinePlanStartDate'], 
 +            baselineplanenddate=line['BaselinePlanEndDate'], 
 + 
 +            bossfio=line['BossFIO'], 
 +            rpfio=line['RPFIO'], 
 +            description=line['Description'], 
 +            projectscalename=line['ProjectScaleName'], 
 +            projectgainname=line['ProjectGainName'], 
 + 
 +            # statusreport_date=str(datetime.datetime.fromisoformat(line['StatusReport_Date']).replace(tzinfo=datetime.timezone.utc)), 
 +            statusreport_date=line['StatusReport_Date'], 
 + 
 +            statusreport_chto_sdelano_problemi_riski=line['StatusReport_Chto_sdelano_problemi_riski'], 
 +            statusreport_prichina_problemi=line['StatusReport_Prichina_problemi'], 
 +            statusreport_statusname=line['StatusReport_StatusName'], 
 +            budjetsum=line['BudjetSum'
 +        )) 
 + 
 +    return spark.createDataFrame(rows) 
 +</code> 
 + 
 +\\ 
 +=== Пример скрипта для контрольных точек === 
 + 
 +<code csharp> 
 +# # ----------------------------------------------------------------------------------- 
 +# Cкрипт для обработки модели * * * 
 +# ----------------------------------------------------------------------------------- 
 + 
 +import requests 
 +import datetime 
 +from pyspark.sql import Row 
 +from pandas import json_normalize  
 + 
 +def after_all(df, spark, app, *args, **kwargs): 
 + 
 +    LOGIN = '* * *' 
 +    PASSWORD = '* * *' 
 +    DOMAIN = 'https://* * *.ru' 
 + 
 +    AUTH = { 
 +    'Login': LOGIN, 
 +    'Password': PASSWORD, 
 +    } 
 + 
 +    session = requests.Session() 
 +    # cookies = session.cookies.get_dict() # {} 
 + 
 +    # авторизация 
 +    response = session.post(url=DOMAIN+'/api/auth/login', json=AUTH, verify=False) 
 + 
 +    cookies = session.cookies.get_dict() 
 + 
 +    # print(cookies) 
 + 
 +    # получение LINQ-запроса 
 +    LINQ = { 
 +        'DataSourceKey': 'BI_milestones', 
 +        'PageSize': 1000,      
 +    } 
 + 
 +    r = session.post(url=DOMAIN+'/api/queries/get', cookies=cookies, json=LINQ, verify=False) 
 + 
 +    if not r.ok: 
 +        raise Exception(f'Ошибка в {r.url}. HTTP {r.status_code}: {r.text}'
 + 
 +    data = r.json() 
 +     
 +    #Создадим список, который послужит основной для создания DataFrame 
 +    rows = [] 
 +    for line in data: 
 +        print(line) 
 +        rows.append(Row( 
 +            id=line['Id'], 
 +            name=line['Name'], 
 +            projectid=line['ProjectId'], 
 +            systemstartdate=line['SystemStartDate'], 
 +            systemenddate=line['SystemEndDate'], 
 +            actualstartdate=line['ActualStartDate'], 
 +            actualenddate=line['ActualEndDate'], 
 +            baselineplanstartdate=line['BaselinePlanStartDate'], 
 +            baselineplanenddate=line['BaselinePlanEndDate'], 
 +            bossfio=line['BossFIO'], 
 +            rpfio=line['RPFIO'], 
 +            description=line['Description'], 
 +            result=line['Result'], 
 +            statusreport_date=line['StatusReport_Date'], 
 +            statusreport_chto_sdelano_problemi_riski=line['StatusReport_Chto_sdelano_problemi_riski'], 
 +            statusreport_prichina_problemi=line['StatusReport_Prichina_problemi'], 
 +            statusreport_statusname=line['StatusReport_StatusName'
 +        )) 
 + 
 +    return spark.createDataFrame(rows) 
 +</code> 
 + 
 +<callout type="info" icon="true">Символами * * * в примерах скриптов обозначены автоматически формируемые данные (например, номер модели) или данные, имеющие отношение к конкретной учетной записи в ADVANTA (например, логин, пароль и домен).</callout> 
 + 
 +Затем необходимо опубликовать скрипт и обновить модель. После обновления данные из ADVANTA автоматически загрузятся в модель. 
 + 
 +\\ 
 +=== Пример модели === 
 + 
 +{{ :product:api:integration_examples:снимок_экрана_2024-04-03_165120.png?800 |}} 
 + 
 +\\ 
 +==== 4) Создать виджеты для отображения данных и дашборды из виджетов ==== 
 + 
 +Для реализации этих шагов необходимо ознакомиться с возможностями системы Analytic Workspace. В этом вам помогут [[https://webhelp.analyticworkspace.ru|база знаний]], [[https://analyticworkspace.ru/datacourse|обучающий курс]] и специалисты, контакты которых вы можете найти на сайте [[https://analyticworkspace.ru|Analytic Workspace]]. 
 + 
 +=== Пример дашборда «Здоровье портфеля» в Analytic Workspace на основе данных, полученных из ADVANTA === 
 + 
 +{{ :product:api:integration_examples:снимок_экрана_2024-04-22_004043.png?800 |}} 
 + 
 +\\ 
 +[[https://promo.advanta-group.ru/a2nta_presentation?utm_source=wiki&utm_medium=link&utm_campaign=integrations|Оставить заявку на демонстрацию или внедрение ADVANTA]] 
 + 
 +[[https://analyticworkspace.ru|Узнать подробнее о системе Analytic Workspace]]
  
-{{ :product:api:integration_examples:без_имени.jpg?600 |}}