Оглавление
- Установка
- Общий принцип использования на хост-странице
- Инициализация и логин
- События и подписка на них
- Методы получения данных
- Синхронизация
- Навигация
- Отправка отладочной информации
- Завершение работы
Установка
Вариант 1 (показан в example.html):
npm install git+https://gitflic.ru/project/rososmotr/websdk.git
import { VaConstructor, App as VaApp } from 'rososmotr-web-sdk';
VaConstructor(VaApp);
Вариант 2 (показан в example2.html):
<script src="rososmotr-web-sdk.umd.js"></script>
<script>
RososmotrWebSDK.VaConstructor(RososmotrWebSDK.App);
</script>
В обоих вариантах нужно также подключить стили:
<link rel="stylesheet" href="style.css">
и создать контейнер (id строго “VaApp”)
<div id="VaApp"></div>
Общий принцип использования на хост-странице
Основные договорённости и принципы решения:
-
SDK кэширует данные в локальной БД. Получает данные от сервера, сохраняет, добавляет к ним то, что пользователь отредактировал или осмотрел.
-
SDK выдаёт данные host-странице и строит свои экраны всегда по локальной БД. Даже при наличии интернета, запросы к серверу НЕ синхронные.
-
Методы обращения к данным, доступные host-странице, всегда отдают наиболее свежие данные непосредственно, однако реализован механизм подписки на события изменения данных.
-
Host-приложение должно проектироваться таким образом, чтобы обрабатывать изменения данных, на которые подписывается. Не единожды, а до тех пор, пока подписка не будет отменена. К примеру, метод
eventBus.on('inspectionsList', listener)
единожды вызванный, организует подписку и будет вызывать указанный listener каждый раз, когда данные будут меняться.
Инициализация и логин
const myApp = window.va_app_instance.VAWebSDK();
Возвращает объект WebSDK для последующего использования в host-приложении.
myApp.init({ token: 'someToken', userId: 123, serverUri: 'someURI', apikey: 'myKey' });
token
– (string) токен открытой сессии текущего пользователя, например"904822.ffb34b6110abca4df25f63fd9ba333fc"
;userId
– (int) идентификатор текущего пользователя из БД viewapp, например904822
;serverUri
– (string) адрес сервера для обмена данными, который будет использоваться как префикc для всех запросов, например"https://web.rososmotr.ru"
. Адрес должен быть без завершающего слэша.apikey
– (string) ключ копии SDK, по которому определяется принадлежность к компании (должен быть выдан вам Рососмотром), например"sdk.cmp15"
;
Метод принимает токен, идентификатор авторизованного пользователя и вспомогательные параметры для связи с серверами. Идентификатор пользователя определяет локальную БД, поэтому важно, чтобы userId
был задан корректно.
Получить токен и идентификатор пользователя необходимо через серверное взаимодействие методом /sdk/sdk_login.
Прервать сессию пользователя в дельнейшем можно методом /sdk/sdk_logout.
Для пробного запуска приложения без логина и без связи с сервером можно использовать
myApp.testInit({ token: 'someToken', userId: 123, serverUri: 'someURI', apikey: 'myKey' });
с произвольными параметрами.
События и подписка на них
Для работы с подписками используется шина событий:
myApp.eventBus.on('eventName', listener); // добавление постоянной подписки
myApp.eventBus.once('eventName', listener); // добавление разовой подписки (использовать с осторожностью)
myApp.eventBus.off('eventName', listener); // удаление подписки
События и что они возвращают:
sending
: true, если отправка данных началась, false если закончиласьreceiving
: true, если получение данных началось, false если закончилосьinspectionListChanged
: возвращает массив осмотров. Срабатывает если массив изменился по данным от сервера, структура аналогична методу.inspectionChanged
: возвращает детальные данные осмотра. Срабатывает если осмотр изменился по данным от сервера, структура аналогична методу.inspectionChangedByUser
: возвращает детальные данные осмотра. Срабатывает если осмотр был изменён пользователем, структура аналогична методу.userChanged
: возвращает данные пользователя. Срабатывает если осмотр изменился по данным от сервера, структура аналогична методу.routeChanged
: возвращает внутреннее навание страницы, куда перешёл пользователь внутри WebSDK. Может быть полезно для взаимодействия с кнопками “назад”-“вперёд” как браузерными, так хост-страницы.error
: возвращает уровень возникшей ошибки (error
илиwarning
), её код и описание.
Методы получения данных
myApp.getUser()
: возвращает пользователя текущей сессии
// UserModel
{
"id": 17901,
"lastName": "Иванов",
"firstName": "Иван",
"middleName": "Иванович",
"phone": "+71234567890",
"role": "agent",
"language": "ru"
}
myApp.getInspectionList()
: возвращает массив доступных осмотров. Если список пуст – возвращается пустой массив, если список по причине того, что данные с сервреа ещё не приехали, а локально ничего сохранённого нет – возвращает null.
// InspectionInListModel
{
"id": 142369,
"objectName": "Полное наименование объекта",
"serviceName": "Наименование схемы осмотра",
"image": "https://",
"status": {
"alias": "contract",
"name": "Заявление принято",
"message": "Проверка фотографий прошла успешно",
"date": "2021-10-12 18:53:17"
}
}
myApp.getInspection(inspectionId)
: возвращает данные осмотра для детального экрана
// InspectionDetailsModel
{
"id": 142369,
"objectName": "KASKO Lexus UX I",
"serviceName": "Automobile loss settlement",
"status": {
"alias": "draft",
"name": "The inspection is incomplete",
"message": "You have not completed the inspection...",
"date": "2021-03-23 21:37:42"
},
"statusList": [
{
"alias": "draft",
"ord": 1,
"short": "осмотр не завершён",
"description": "Вы не завершили осмотр или...",
"datetime": "2019-06-03 06:04:16",
"isPassed": false,
"isCurrent": true
},
{
"alias": "expertise",
"ord": 3,
"short": "экспертиза",
"description": "Сделанные вами фотографии переданы на проверку",
"datetime": null,
"isPassed": false,
"isCurrent": false
}
],
"isChecklist": false,
"stages": [ // InspectionStageModel
{
"type": "multiShooting",
"key": "1903",
"ord": 4,
"icon": "https://",
"title": "Equipment",
"subTitle": "Repeat shooting",
"state": "todo"
},
{
"type": "repeatShooting",
"key": "1902",
"ord": 3,
"icon": "https://",
"title": "Tools",
"subTitle": "Multi shooting",
"state": "todo"
}
],
"allowedActions": [
"sendToReview",
"makeAgreement"
],
"extraButtons": [
{
"isDoc": true,
"icon": "https://web.rososmotr.ru/img/extra_buttons/pdf.png",
"text": "Акт об осмотре",
"subText": "PDF",
"size": "0,73 Мб",
"url": "https://web.rososmotr.ru/pdf/inspection_test_4222b902d.pdf",
"ord": 1
}
]
}
-
Статусы: поля
status
иstatusList
связаны между собой:status
– текущий статус осмотра по данным из локальной БД;statusList
– список статусов, через которые осмотр проходил или будет проходить — помогает добавить наглядности для пользователя.statusList.isPassed
– (bool) флаг: считается ли данный статус пройденным для текущего осмотра;statusList.isCurrent
– (bool) флаг: является ли данный статус текущим статусом осмотра.
Один и тот же статус может многократно повторяться в осмотре, так как предусмотрен возврат на доработку и повторная экспертиза (можно много раз).
-
extraButtons
– массив дополнительных материалов или действий — в него, в том числе, выдаётся ссылка на документ до и после подписания (файл НЕ кэшируется SDK и должен быть загружен host-приложением, при необходимости). -
InspectionStageModel
- поле с изображениемicon
в текущей версии SDK выдаёт ссылку на файл в интернете, либо пустую строку, когда изображения нет (кэшировать картинку в текущий момент host-приложению необходимо самостоятельно); -
state
– состояние готовности этапа, может иметь один из вариантов заполнения:"todo"
– этап ещё не заполнялся, пользователь начнёт делать его впервые;"alarm"
– пользователь начинал выполнять этап, но не завершил; или эксперты вернули этап на доработку;"done"
– минимально необходимые, но достаточные операции по этапу выполнены.
Синхронизация
myApp.forceSync();
: заставляет WebSDK попробовать синхронизироваться с сервером прямо сейчас.
myApp.getReceivingStatus();
: возращает объект с информацией о том, ожидается ли получение (или идёт сейчас) каких-либо данных с сервера.
// возможно будет расширен
{
haveDataToReceive: false,
receivingNow: false
}
myApp.getSendingStatus();
: возращает объект с информацией о том, ожидается ли отправка (или идёт сейчас) каких-либо данных на сервер.
// возможно будет расширен
{
haveDataToSend: false,
sendingNow: false
}
Навигация
myApp.setRoute(route, force);
: заставляет WebSDK осуществить переход к указанной странице. Если параметр force
равен true
, то WebSDK перейдёт на страницу даже тогда, когда уходить с текущей страницы нельзя или не предусмотрен прямой штатный переход к странице route
.
Отправка отладочной информации
Для решения внештатных ситуаций, пользователю необходимо предоставить возможность отправлять запросы в техническую поддержку. Необходимо, чтобы была проинициализирована сессия пользователя.
myApp.sendSupportRequest(textMessage, additionalObject)
Метод может вызвать любой вид ошибок, включая сетевые!
Метод синхронно отправит сообщение в техническую поддержку, и добавит к обращению файлы локальной БД. Это даст возможность внимательно изучить, с чем столкнулся пользователь, и помочь ему.
Метод можно использовать для отправки вспомогательных данных в техническую поддержку сервиса без непосредственного участия пользователя, но рекомендуется, всё же, совершать обращения только с санкции пользователя. По меньшей мере, потому, что используется заметный объём трафика на отправку запроса.
Завершение работы
myApp.close();
: завершает работу объекта WebSDK, для повторной работы необходимо начинать с
const myApp = window.va_app_instance.VAWebSDK();