This commit is contained in:
2026-04-21 01:28:02 +03:00
parent 1d8a436106
commit b9d1afad42

View File

@@ -126,7 +126,6 @@ public class IikoOlapColumnsImporter {
// Запрос полей для конкретного reportType // Запрос полей для конкретного reportType
private Future<JsonObject> fetchColumnsFromIiko(String reportType, String token) { private Future<JsonObject> fetchColumnsFromIiko(String reportType, String token) {
Promise<JsonObject> promise = Promise.promise(); Promise<JsonObject> promise = Promise.promise();
String url = "https://" + iikoServer + "/resto/api/v2/reports/olap/columns?key=" + token + "&reportType=" + reportType; String url = "https://" + iikoServer + "/resto/api/v2/reports/olap/columns?key=" + token + "&reportType=" + reportType;
@@ -163,7 +162,7 @@ public class IikoOlapColumnsImporter {
} }
} }
// ---------- Методы работы с БД (те же, с поддержкой UTF8) ---------- // ---------- Методы работы с БД (с префиксом iiko_) ----------
private Future<Void> storeColumnsToDb(String reportType, JsonObject columns) { private Future<Void> storeColumnsToDb(String reportType, JsonObject columns) {
return getOrCreateReportType(reportType) return getOrCreateReportType(reportType)
.compose(reportTypeId -> { .compose(reportTypeId -> {
@@ -178,14 +177,14 @@ public class IikoOlapColumnsImporter {
private Future<Integer> getOrCreateReportType(String reportType) { private Future<Integer> getOrCreateReportType(String reportType) {
Promise<Integer> promise = Promise.promise(); Promise<Integer> promise = Promise.promise();
String selectSql = "SELECT report_type_id FROM report_types WHERE name = ?"; String selectSql = "SELECT report_type_id FROM iiko_report_types WHERE name = ?";
dbPool.preparedQuery(selectSql) dbPool.preparedQuery(selectSql)
.execute(Tuple.of(reportType)) .execute(Tuple.of(reportType))
.onComplete(ar -> { .onComplete(ar -> {
if (ar.succeeded() && ar.result().size() > 0) { if (ar.succeeded() && ar.result().size() > 0) {
promise.complete(ar.result().iterator().next().getInteger("report_type_id")); promise.complete(ar.result().iterator().next().getInteger("report_type_id"));
} else if (ar.succeeded()) { } else if (ar.succeeded()) {
String insertSql = "INSERT INTO report_types (name, description) VALUES (?, ?)"; String insertSql = "INSERT INTO iiko_report_types (name, description) VALUES (?, ?)";
dbPool.preparedQuery(insertSql) dbPool.preparedQuery(insertSql)
.execute(Tuple.of(reportType, "OLAP report type: " + reportType)) .execute(Tuple.of(reportType, "OLAP report type: " + reportType))
.onComplete(insAr -> { .onComplete(insAr -> {
@@ -224,7 +223,7 @@ public class IikoOlapColumnsImporter {
JsonArray tagsArray = fieldDef.getJsonArray("tags", new JsonArray()); JsonArray tagsArray = fieldDef.getJsonArray("tags", new JsonArray());
String insertFieldSql = """ String insertFieldSql = """
INSERT INTO fields ( INSERT INTO iiko_fields (
report_type_id, field_key, field_key_normal, name, type, type_normal, report_type_id, field_key, field_key_normal, name, type, type_normal,
aggregation_allowed, grouping_allowed, filtering_allowed aggregation_allowed, grouping_allowed, filtering_allowed
) )
@@ -244,7 +243,7 @@ public class IikoOlapColumnsImporter {
aggregationAllowed, groupingAllowed, filteringAllowed aggregationAllowed, groupingAllowed, filteringAllowed
)) ))
.compose(ignored -> { .compose(ignored -> {
String selectFieldIdSql = "SELECT field_id FROM fields WHERE report_type_id = ? AND field_key = ?"; String selectFieldIdSql = "SELECT field_id FROM iiko_fields WHERE report_type_id = ? AND field_key = ?";
return dbPool.preparedQuery(selectFieldIdSql) return dbPool.preparedQuery(selectFieldIdSql)
.execute(Tuple.of(reportTypeId, fieldKey)) .execute(Tuple.of(reportTypeId, fieldKey))
.compose(rows -> { .compose(rows -> {
@@ -269,14 +268,14 @@ public class IikoOlapColumnsImporter {
private Future<Integer> getOrCreateTag(String tagName) { private Future<Integer> getOrCreateTag(String tagName) {
Promise<Integer> promise = Promise.promise(); Promise<Integer> promise = Promise.promise();
String selectSql = "SELECT tag_id FROM tags WHERE tag_name = ?"; String selectSql = "SELECT tag_id FROM iiko_tags WHERE tag_name = ?";
dbPool.preparedQuery(selectSql) dbPool.preparedQuery(selectSql)
.execute(Tuple.of(tagName)) .execute(Tuple.of(tagName))
.onComplete(ar -> { .onComplete(ar -> {
if (ar.succeeded() && ar.result().size() > 0) { if (ar.succeeded() && ar.result().size() > 0) {
promise.complete(ar.result().iterator().next().getInteger("tag_id")); promise.complete(ar.result().iterator().next().getInteger("tag_id"));
} else { } else {
String insertSql = "INSERT IGNORE INTO tags (tag_name) VALUES (?)"; String insertSql = "INSERT IGNORE INTO iiko_tags (tag_name) VALUES (?)";
dbPool.preparedQuery(insertSql) dbPool.preparedQuery(insertSql)
.execute(Tuple.of(tagName)) .execute(Tuple.of(tagName))
.onComplete(insAr -> { .onComplete(insAr -> {
@@ -297,7 +296,7 @@ public class IikoOlapColumnsImporter {
} }
private Future<Void> linkFieldTag(int fieldId, int tagId) { private Future<Void> linkFieldTag(int fieldId, int tagId) {
String sql = "INSERT IGNORE INTO field_tags (field_id, tag_id) VALUES (?, ?)"; String sql = "INSERT IGNORE INTO iiko_field_tags (field_id, tag_id) VALUES (?, ?)";
return dbPool.preparedQuery(sql) return dbPool.preparedQuery(sql)
.execute(Tuple.of(fieldId, tagId)) .execute(Tuple.of(fieldId, tagId))
.mapEmpty(); .mapEmpty();
@@ -305,14 +304,14 @@ public class IikoOlapColumnsImporter {
private Future<Void> createTablesIfNotExist() { private Future<Void> createTablesIfNotExist() {
String createReportTypesTable = """ String createReportTypesTable = """
CREATE TABLE IF NOT EXISTS report_types ( CREATE TABLE IF NOT EXISTS iiko_report_types (
report_type_id INT AUTO_INCREMENT PRIMARY KEY, report_type_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) UNIQUE NOT NULL, name VARCHAR(50) UNIQUE NOT NULL,
description TEXT NOT NULL description TEXT NOT NULL
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
"""; """;
String createFieldsTable = """ String createFieldsTable = """
CREATE TABLE IF NOT EXISTS fields ( CREATE TABLE IF NOT EXISTS iiko_fields (
field_id INT AUTO_INCREMENT PRIMARY KEY, field_id INT AUTO_INCREMENT PRIMARY KEY,
report_type_id INT NOT NULL, report_type_id INT NOT NULL,
field_key VARCHAR(255) NOT NULL, field_key VARCHAR(255) NOT NULL,
@@ -325,27 +324,27 @@ public class IikoOlapColumnsImporter {
filtering_allowed BOOLEAN NOT NULL DEFAULT 0, filtering_allowed BOOLEAN NOT NULL DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uk_fields_report_type_field_key (report_type_id, field_key), UNIQUE KEY uk_fields_report_type_field_key (report_type_id, field_key),
FOREIGN KEY (report_type_id) REFERENCES report_types(report_type_id) ON DELETE RESTRICT FOREIGN KEY (report_type_id) REFERENCES iiko_report_types(report_type_id) ON DELETE RESTRICT
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
"""; """;
String createTagsTable = """ String createTagsTable = """
CREATE TABLE IF NOT EXISTS tags ( CREATE TABLE IF NOT EXISTS iiko_tags (
tag_id INT AUTO_INCREMENT PRIMARY KEY, tag_id INT AUTO_INCREMENT PRIMARY KEY,
tag_name VARCHAR(100) UNIQUE NOT NULL tag_name VARCHAR(100) UNIQUE NOT NULL
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
"""; """;
String createFieldTagsTable = """ String createFieldTagsTable = """
CREATE TABLE IF NOT EXISTS field_tags ( CREATE TABLE IF NOT EXISTS iiko_field_tags (
field_id INT NOT NULL, field_id INT NOT NULL,
tag_id INT NOT NULL, tag_id INT NOT NULL,
PRIMARY KEY (field_id, tag_id), PRIMARY KEY (field_id, tag_id),
FOREIGN KEY (field_id) REFERENCES fields(field_id) ON DELETE CASCADE, FOREIGN KEY (field_id) REFERENCES iiko_fields(field_id) ON DELETE CASCADE,
FOREIGN KEY (tag_id) REFERENCES tags(tag_id) ON DELETE CASCADE FOREIGN KEY (tag_id) REFERENCES iiko_tags(tag_id) ON DELETE CASCADE
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
"""; """;
String createIdxFieldsReportType = "CREATE INDEX IF NOT EXISTS idx_fields_report_type ON fields(report_type_id)"; String createIdxFieldsReportType = "CREATE INDEX IF NOT EXISTS idx_fields_report_type ON iiko_fields(report_type_id)";
String createIdxFieldsName = "CREATE INDEX IF NOT EXISTS idx_fields_name ON fields(name)"; String createIdxFieldsName = "CREATE INDEX IF NOT EXISTS idx_fields_name ON iiko_fields(name)";
String createIdxFieldTagsTagId = "CREATE INDEX IF NOT EXISTS idx_field_tags_tag_id ON field_tags(tag_id)"; String createIdxFieldTagsTagId = "CREATE INDEX IF NOT EXISTS idx_field_tags_tag_id ON iiko_field_tags(tag_id)";
return dbPool.query(createReportTypesTable).execute() return dbPool.query(createReportTypesTable).execute()
.compose(ignored -> dbPool.query(createFieldsTable).execute()) .compose(ignored -> dbPool.query(createFieldsTable).execute())