Обмен данными с АСТУ, использующими MSSQL, осуществляется посредством задач трансфера.

Конфигурирование трансфера

Работа трансфера обеспечивается сервисами, запускаемыми при установке пакета artixcs-datatransfer. Установка трансфера может быть выполнена в "горячем" режиме без остановки кассового сервера.

При установке пакета в директории /opt/artixcs-datatransfer/ создается конфигурационный файл application.properties, в котором указываются параметры для обработки различных задач трансфера.

НаименованиеТип данныхОписаниеЗначение по умолчанию
dictionariesстроковыйСписок таблиц, используемых для передачи данных из удаленной БД MSSQL в БД MySQL на кассовом сервере. При выполнении операции база данных кассового сервера блокируется

accountmask, accumulatesprices, actionparameter, agent, agerestrict, aspect, aspectscheme, aspectvalue, aspectvalueset, aspectvaluesetvalues, barcodes, button, campaign, card, cardgroup, catalog, catalogattribute, category, client, clientcardmask, cmaction, cmevent, command, defcode, dept, disccard, disccardaccumulate, discountsauto, discountsfixed, discountSystem, extendedparameter, groups, hcodelist, hotkey, hotkeyinvent, kbkey, keys, kit, kitdisc, kitgoods, macro, macroparameters, menu, menuitem, mol, op, payforbiddance, prices, provider, region, role, rolecmaction, rolecommand, rolerelation, roleuser, sprices, terminal, timeperiod, timerestrict, tmc, tmccatalog, tmcgroups, tmcrequiredquantity, tmcsalerestrict, tmcvisualverify, tostat, tprices, units, valut, vat, certificate

dictionaries2строковыйСписок таблиц, используемых для передачи данных из удаленной БД MSSQL в БД MySQL на кассовом сервере. При выполнении операции база данных кассового сервера не блокируетсяsoftcheck, softcheckposition, changeAccountBalance
dictionaries3строковыйПредназначен для оповещения АСТУ о последнем копировании данных из КС в удаленную БД. Данные переносятся полностью с предварительной очисткой таблицlast_copy
dictionaries.targetSuffixстроковыйСуффикс, который добавляется к названию таблицTemp
dictionaries.sourceConnectionTypeстроковыйТип БД, которая используется в качестве источника для загрузки справочниковMSSQL
dictionaries.targetConnectionTypeстроковыйТип БД, которая используется в качестве адресата для загрузки справочниковMYSQL
sales.sourceConnectionTypeстроковыйТип БД, которая используется в качестве источника для выгрузки продажMYSQL
sales.targetConnectionTypeстроковыйТип БД, которая используется в качестве адресата для выгрузки продажMSSQL
salesстроковый

Список таблиц, используемых для передачи данных продаж из БД All в удаленную БД. При выполнении операции БД КС не блокируется

aspectitem, bonusitem, button, carditem, client, crights, department, discitem, goodsitem, kkm, moneyitem, paymentitem, stornogoodsitem, users, workshift, document
sales2строковый

Содержит таблицу softcheckstatus и предназначен для передачи статусов софт-чеков из БД All в удаленную БД. При выполнении операции БД КС не блокируется

softcheckstatus
dictionaries.lock.maxTryCountцелочисленныйМаксимальное количество попыток блокировки БД трансфером100
dictionaries.lock.tryDelayцелочисленныйВремя ожидания между попытками блокировки2000
urls.csdic.driverстроковыйНазвание JDBC драйвераorg.gjt.mm.mysql.Driver
urls.csdic.urlстроковыйURL для подключения к БД Dictionaries на кассовом сервереjdbc:mysql://localhost:3306/$clusterId$artixcs$storeId$?user=netroot&password=netroot&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
urls.csdoc.driverстроковыйНазвание JDBC драйвераorg.gjt.mm.mysql.Driver
urls.csdoc.urlстроковыйURL для подключения к БД Documents на кассовом сервере

jdbc:mysql://localhost:3306/$clusterId$documentsAll?user=netroot&password=netroot&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull

urls.astudic.driverстроковыйНазвание JDBC драйвераnet.sourceforge.jtds.jdbc.Driver
urls.astudic.urlстроковыйURL для подключения к БД Dictionaries в АСТУ

jdbc:jtds:sqlserver://localhost:11433;user=cashserver;password=cashserver;databasename=$clusterId$dic

urls.astudoc.driverстроковыйНазвание JDBC драйвераnet.sourceforge.jtds.jdbc.Driver
urls.astudoc.urlстроковыйURL для подключения к БД Documents в АСТУ

jdbc:jtds:sqlserver://localhost:11433;user=cashserver;password=cashserver;databasename=$clusterId$doc

modernлогический

Поле, используемое для переноса данных с одного кассового сервера на другой. Определяет метод поиска записи в таблице client:

  • при значении true поиск ведется по полю update_time,
  • при значении false поиск осуществляется по полю createdate.
false

type.request.mysql.copy

строковый

Режим вставки данных в БД MySQL при копировании из внешней БД:

  • REPLACE – при обнаружении записи с таким же ключом текущая запись будет удалена и вместо нее добавлена новая,
  • INSERT_ON_DUPLICATE_KEY_UPDATE – при обнаружении записи с таким же ключом выполняется обновление записи.

INSERT_ON_DUPLICATE_KEY_UPDATE

server.port

целочисленный

Порт сервера

38066

rest.port

целочисленный

Порт ядра

38051

rest.host

строковый

Хост ядра

localhost

rest.user

строковый

Имя пользователя для авторизации по REST-протоколу на КС (для получения доступа к ядру КС)

admin

По умолчанию настройка закомментирована, так как она используется только в случае, если сервис устанавливается на отдельную машину и включена авторизация на КС

rest.password

строковый

Пароль для авторизации по REST-протоколу на КС (для получения доступа к ядру КС)

admin

По умолчанию настройка закомментирована, так как она используется только в случае, если сервис устанавливается на отдельную машину и включена авторизация на КС

default.server.id

целочисленный

Поле для указания id сервера

1

Задачи трансфера

  • Трансфер справочники – используется для передачи справочников из удаленной БД в БД КС. При выполнении операции БД КС блокируется.
  • Трансфер глобальные справочники – предназначен для передачи данных из удаленной БД в БД КС. При выполнении операции БД не блокируется.
  • Трансфер продажи – используется для передачи данных продаж из БД All в удаленную БД. При выполнении операции БД КС не блокируется.
  • Трансфер глобальные продажи – предназначен для передачи статусов софт-чеков из БД All в удаленную БД. При выполнении операции БД КС не блокируется. 
  • Трансфер структура – используется для оповещения АСТУ о последнем копировании справочников из удаленной БД в КС. Или продаж – из КС в удаленную БД.

    Данные переносятся полностью с предварительной очисткой таблиц.
  • Трансфер бонусы – контролирует изменения в начислении бонусных баллов и выполняет их начисление на карты клиентов.

После установки пакета появляется возможность включить отображение перечня задач в планировщике. Настройка включается в настройках сервера (подраздел "Прочее"):

Перечень задач трансфера отобразится в разделе "Расписание":

Передача справочников из БД АСТУ в БД КС

Для передачи справочников в таблицах БД АСТУ дополнительно используются служебные поля. Например:

НазваниеТипОписание
bcodeстроковыйШтрих-код
name
строковыйНаименование

. . .

<Для каждого справочника набор полей индивидуален>

<Служебные поля справочника. Набор служебных полей для всех справочников одинаков>
update_timeдата и времяВремя модификации записи

transferAction

строковый(10)

Операция которую необходимо совершить с этой записью, может принимать значения:

  • ADD – добавить,
  • DELETE – удалить.

storeId

строковый(10)Идентификатор магазина

Передача справочников из удаленной БД MSSQL, установленной на АСТУ, осуществляется инкрементально – загружаются только те записи, которые были добавлены и изменены с момента предыдущего копирования справочников на КС.

Если в БД АСТУ была добавлена новая запись, то в ее поле transferAction записывается значение ADD. Тогда при следующей загрузке справочников эта запись будет добавлена или обновлена в БД КС.
Если в БД АСТУ запись была помечена как удаленная, то в ее поле transferAction записывается значение DELETE. Тогда при следующей загрузке справочников будет удалена соответствующая запись из БД КС. После окончания загрузки запись будет удалена из БД АСТУ.

БД КС, в которую будут сохранены изменения для каждой записи, определяется индивидуально – по правилу: dictionaries<storeId> (на основе идентификатора магазина).

Сравнение БД MySQL и MSSQL

При обновлении КС могут возникать проблемы несоответствия структуры внешней БД MSSQL и внутренней БД MySQL, при наличии которых передача данных может быть выполнена не в полном объеме или вообще остановлена:

  • отсутствие поля в одной из БД,
  • различное ограничение по количеству символов в поле,
  • различние первичных ключей и уникальных индексов в таблицах.

Для сравнения структуры двух БД используется компаратор, который можно скачать по ссылке.

Файл компаратора необходимо поместить в одну директорию с файлом настроек config.properties, в котором указать данные для внешней и внутренней БД.

Пример настройки файла config.properties
#Список таблиц из БД справочников, для которых не нужно искать разницу (удобно помещать сюда явно неиспользуемые таблицы сети)
listOfIgnoredDictionaryTables=securityweightTemp
#Список таблиц из БД документов, для которых не нужно искать разницу (удобно помещать сюда явно неиспользуемые таблицы сети)
listOfIgnoredDocumentTables=
#Тип драйвера для БД КС (всегда будет указанный по умолчанию)
driverClassName1 = com.mysql.cj.jdbc.Driver
#Параметры подключения к БД artixcsAll на КС
urlArtixcsDonor = jdbc:mysql://localhost:3306/artixcsAll?user=netroot&password=netroot&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false
#Параметры подключения к БД documentsAll на КС
urlDocumentsDonor=jdbc:mysql://localhost:3306/documentsAll?user=netroot&password=netroot&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false
#Тип драйвера для БД MSSQL (всегда будет указанный по умолчанию драйвер)
driverClassName2 = net.sourceforge.jtds.jdbc.Driver
#Параметры подключения к удаленной БД со справочниками
urlArtixcsRecipient = jdbc:jtds:sqlserver://localhost:1433;user=sa;password=yourStrong(!)Password;databasename=CashServerDicts
#Параметры подключения к удаленной БД с продажами
urlDocumentsRecipient = jdbc:jtds:sqlserver://localhost:1433;user=sa;password=yourStrong(!)Password;databasename=CashServerDocs
#Считать что у нас нет БД MSSQL формируем полную структуру
oneWay=True
#Игнорировать разницу размерности в существующих полях таблиц
ignoreDiffSizeExistsColumns=True
#Игнорировать разницу NOT NULL в существующих полях таблиц
ignoreDiffNotNullExistsColumns=True

Для запуска компаратора используется команда:

java -jar db-comparator.jar

В процессе работы компаратора сравниваются:

  • таблицы,
  • поля,
  • первичные ключи,
  • уникальные индексы.

После запуска утилита выводит в консоль результаты своей работы, а также дублирует результат в файл, в директорию ./out:

Пример вывода результатов работы (фрагмент)
[INFO ] 2018-01-16_18:25:03 Ignored dictionary tables: securityweightTemp
[INFO ] 2018-01-16_18:25:03 Start compare databases
[INFO ] 2018-01-16_18:25:03 --------------------Dictionaries:--------------------
[INFO ] 2018-01-16_18:25:03 Not founded table: accountmaskTemp
[INFO ] 2018-01-16_18:25:03 Primary keys: maskid
[INFO ] 2018-01-16_18:25:03 Unique indexes: 
[INFO ] 2018-01-16_18:25:03 Fields of table accountmaskTemp:
[INFO ] 2018-01-16_18:25:03 accountmaskTemp : maskid (INT:10) - 
[INFO ] 2018-01-16_18:25:03 accountmaskTemp : providerid (INT:10) - 
[INFO ] 2018-01-16_18:25:03 accountmaskTemp : mask (VARCHAR:200) - 
[INFO ] 2018-01-16_18:25:03 accountmaskTemp : transform (VARCHAR:200) - 
[INFO ] 2018-01-16_18:25:03 accountmaskTemp : crc (BIGINT:19) - контрольная сумма
[INFO ] 2018-01-16_18:25:03 accountmaskTemp : ownerStoreId (VARCHAR:10) - код родительского магазина
[INFO ] 2018-01-16_18:25:03 accountmaskTemp : update_time (TIMESTAMP:19) - Для сохранения момента модификации поля
[INFO ] 2018-01-16_18:25:03 accountmaskTemp : transferAction (VARCHAR:10) - тип передаваемого сообщения
[INFO ] 2018-01-16_18:25:03 ------------------------------------------------------------
[INFO ] 2018-01-16_18:25:03 Not founded table: accumulatespricesTemp
[INFO ] 2018-01-16_18:25:03 Primary keys: code
[INFO ] 2018-01-16_18:25:03 Unique indexes: 
[INFO ] 2018-01-16_18:25:03 Fields of table accumulatespricesTemp:
[INFO ] 2018-01-16_18:25:03 accumulatespricesTemp   : code (INT:10) - 
[INFO ] 2018-01-16_18:25:03 accumulatespricesTemp   : name (VARCHAR:255) - 
[INFO ] 2018-01-16_18:25:03 accumulatespricesTemp   : crc (BIGINT:19) - контрольная сумма
[INFO ] 2018-01-16_18:25:03 accumulatespricesTemp   : ownerStoreId (VARCHAR:10) - код родительского магазина
[INFO ] 2018-01-16_18:25:03 accumulatespricesTemp   : update_time (TIMESTAMP:19) - Для сохранения момента модификации поля
[INFO ] 2018-01-16_18:25:03 accumulatespricesTemp   : transferAction (VARCHAR:10) - тип передаваемого сообщения
[INFO ] 2018-01-16_18:25:03 ------------------------------------------------------------
[INFO ] 2018-01-16_18:25:03 Not founded table: actionpanelTemp
[INFO ] 2018-01-16_18:25:03 Primary keys: actionpanelcode
[INFO ] 2018-01-16_18:25:03 Unique indexes: 
[INFO ] 2018-01-16_18:25:03 Fields of table actionpanelTemp:
[INFO ] 2018-01-16_18:25:03 actionpanelTemp : actionpanelcode (INT:10) - 
[INFO ] 2018-01-16_18:25:03 actionpanelTemp : context (INT:10) - код контекста, в которм отображается панель
[INFO ] 2018-01-16_18:25:03 actionpanelTemp : page (INT:10) - номер панели в рамках контекста
[INFO ] 2018-01-16_18:25:03 actionpanelTemp : rowcount (INT:10) - кол-во строк в панели
[INFO ] 2018-01-16_18:25:03 actionpanelTemp : columncount (INT:10) - кол-во столбцов в панели
[INFO ] 2018-01-16_18:25:03 actionpanelTemp : crc (BIGINT:19) - контрольная сумма
[INFO ] 2018-01-16_18:25:03 actionpanelTemp : update_time (TIMESTAMP:19) - Для сохранения момента модификации поля
[INFO ] 2018-01-16_18:25:03 actionpanelTemp : ownerStoreId (VARCHAR:10) - код родительского магазина
[INFO ] 2018-01-16_18:25:03 actionpanelTemp : transferAction (VARCHAR:10) - тип передаваемого сообщения
[INFO ] 2018-01-16_18:25:03 ------------------------------------------------------------
[INFO ] 2018-01-16_18:25:03 Not founded table: actionpanelitemTemp
[INFO ] 2018-01-16_18:25:03 Primary keys: actionpanelitemcode
[INFO ] 2018-01-16_18:25:03 Unique indexes: 
[INFO ] 2018-01-16_18:25:03 Fields of table actionpanelitemTemp:
[INFO ] 2018-01-16_18:25:03 actionpanelitemTemp : actionpanelitemcode (INT:10) - 
[INFO ] 2018-01-16_18:25:03 actionpanelitemTemp : actionpanelcode (INT:10) - код панели
[INFO ] 2018-01-16_18:25:03 actionpanelitemTemp : actioncode (INT:10) - код действия
[INFO ] 2018-01-16_18:25:03 actionpanelitemTemp : row (INT:10) - положение по вертикали на панели
[INFO ] 2018-01-16_18:25:03 actionpanelitemTemp : column (INT:10) - положение по горизонтали на панели
[INFO ] 2018-01-16_18:25:03 actionpanelitemTemp : rowspan (INT:10) - кол-во занимаемых ячеек по вертикали (по умолчанию 1)
[INFO ] 2018-01-16_18:25:03 actionpanelitemTemp : columnspan (INT:10) - кол-во занимаемых ячеек по горизонтали (по умолчанию 1)
[INFO ] 2018-01-16_18:25:03 actionpanelitemTemp : color (VARCHAR:20) - цвет кнопки
[INFO ] 2018-01-16_18:25:03 actionpanelitemTemp : name (VARCHAR:100) - название кнопки (по умолчанию используется наименование действия)
[INFO ] 2018-01-16_18:25:03 actionpanelitemTemp : crc (BIGINT:19) - контрольная сумма
[INFO ] 2018-01-16_18:25:03 actionpanelitemTemp : update_time (TIMESTAMP:19) - Для сохранения момента модификации поля
[INFO ] 2018-01-16_18:25:03 actionpanelitemTemp : ownerStoreId (VARCHAR:10) - код родительского магазина
[INFO ] 2018-01-16_18:25:03 actionpanelitemTemp : transferAction (VARCHAR:10) - тип передаваемого сообщения
[INFO ] 2018-01-16_18:25:03 ------------------------------------------------------------
....

Настройка сервиса при установке на отдельную машину

Сервис DataTransfer можно установить на отдельную машину.

В настройках сервиса DataTransfer в конфигурационном файле /opt/artixcs-datatransfer/application.properties необходимо дополнительно указать настройки для авторизации по REST-протоколу на КС (имя пользователя и пароль).

Для работы с сервисом artixcs-datatransfer на другой машине в настройках пакета artixcs-rest (application.properties) необходимо добавить хост и порт:

Пример настройки
#Параметры подключения к DataTransfer
generate.transfer.host=localhost
generate.transfer.port=38066
  • No labels