Fix diagnostic and terminal group imports

This commit is contained in:
2026-05-19 07:34:31 +07:00
parent 280e748538
commit 3026eb95e0
3 changed files with 55 additions and 13 deletions

1
gradle.properties Normal file
View File

@ -0,0 +1 @@
org.gradle.java.home=C:/Program Files/OpenLogic/jdk-8.0.482.08-hotspot

View File

@ -251,18 +251,25 @@ public class TerminalGroupImporterServiceBean implements TerminalGroupImporterSe
logger.info("Terminal group optimized import stale stage cleanup finished. importId={}, elapsed={} ms",
importId, System.currentTimeMillis() - cleanupStartTime);
boolean hasSnLowerNormColumn = hasColumn(connection, "tms_terminal_group_import_stage", "sn_lower_norm");
if (!hasSnLowerNormColumn) {
logger.warn("Terminal group import stage table does not have SN_LOWER_NORM column. " +
"Falling back to lower-case expression matching. importId={}", importId);
}
long insertStartTime = System.currentTimeMillis();
insertImportStageRows(connection, importId, parsedTerminals, wrappersByRowNo);
insertImportStageRows(connection, importId, parsedTerminals, wrappersByRowNo, hasSnLowerNormColumn);
logger.info("Terminal group optimized import stage insert finished. importId={}, rows={}, elapsed={} ms",
importId, parsedTerminals.size(), System.currentTimeMillis() - insertStartTime);
long queryStartTime = System.currentTimeMillis();
queryImportStageMatches(connection, importId, wrappersByRowNo, wrappersByTerminalId);
queryImportStageMatches(connection, importId, wrappersByRowNo, wrappersByTerminalId, hasSnLowerNormColumn);
logger.info("Terminal group optimized import match query finished. importId={}, matchedTerminalIds={}, elapsed={} ms",
importId, wrappersByTerminalId.size(), System.currentTimeMillis() - queryStartTime);
connection.commit();
} catch (SQLException e) {
rollbackQuietly(connection);
logSqlExceptionChain(e);
throw new RuntimeException("Error matching terminal group import data using import staging table", e);
} finally {
cleanupImportStageRows(connection, importId);
@ -286,9 +293,13 @@ public class TerminalGroupImporterServiceBean implements TerminalGroupImporterSe
private void insertImportStageRows(Connection connection,
UUID importId,
List<TerminalGroupImportObjectWrapper> parsedTerminals,
Map<Integer, TerminalGroupImportObjectWrapper> wrappersByRowNo) throws SQLException {
String sql = "insert into tms_terminal_group_import_stage " +
"(import_id, row_no, tid, sn, tid_norm, sn_norm, sn_lower_norm) values (?, ?, ?, ?, ?, ?, ?)";
Map<Integer, TerminalGroupImportObjectWrapper> wrappersByRowNo,
boolean hasSnLowerNormColumn) throws SQLException {
String sql = hasSnLowerNormColumn
? "insert into tms_terminal_group_import_stage " +
"(import_id, row_no, tid, sn, tid_norm, sn_norm, sn_lower_norm) values (?, ?, ?, ?, ?, ?, ?)"
: "insert into tms_terminal_group_import_stage " +
"(import_id, row_no, tid, sn, tid_norm, sn_norm) values (?, ?, ?, ?, ?, ?)";
try (PreparedStatement statement = connection.prepareStatement(sql)) {
int rowNo = 0;
for (TerminalGroupImportObjectWrapper wrapper : parsedTerminals) {
@ -301,7 +312,9 @@ public class TerminalGroupImporterServiceBean implements TerminalGroupImporterSe
statement.setString(4, wrapper.getSn());
statement.setString(5, normalizeImportValue(wrapper.getTid()));
statement.setString(6, normalizeImportValue(wrapper.getSn()));
if (hasSnLowerNormColumn) {
statement.setString(7, normalizeImportValueLower(wrapper.getSn()));
}
statement.addBatch();
if (rowNo % 1000 == 0) {
@ -315,10 +328,14 @@ public class TerminalGroupImporterServiceBean implements TerminalGroupImporterSe
private void queryImportStageMatches(Connection connection,
UUID importId,
Map<Integer, TerminalGroupImportObjectWrapper> wrappersByRowNo,
Map<UUID, List<TerminalGroupImportObjectWrapper>> wrappersByTerminalId) throws SQLException {
Map<UUID, List<TerminalGroupImportObjectWrapper>> wrappersByTerminalId,
boolean hasSnLowerNormColumn) throws SQLException {
String snJoinCondition = hasSnLowerNormColumn
? "t.sn in (i.sn, i.sn_norm, i.sn_lower_norm)"
: "t.sn in (i.sn, i.sn_norm, lower(i.sn_norm))";
String sql = "select i.row_no, t.id, te.terminal_id " +
"from tms_terminal_group_import_stage i " +
"left join tms_terminal t on t.sn in (i.sn, i.sn_norm, i.sn_lower_norm) and t.delete_ts is null " +
"left join tms_terminal t on " + snJoinCondition + " and t.delete_ts is null " +
"left join tms_terminal_link tl on tl.terminal_id = t.id " +
"left join tmsext_terminal_ext te on te.id = tl.terminal_ext_id and te.delete_ts is null " +
"where i.import_id = ? " +
@ -351,6 +368,18 @@ public class TerminalGroupImporterServiceBean implements TerminalGroupImporterSe
}
}
private boolean hasColumn(Connection connection, String tableName, String columnName) throws SQLException {
String sql = "select 1 from information_schema.columns " +
"where table_schema = current_schema() and lower(table_name) = ? and lower(column_name) = ?";
try (PreparedStatement statement = connection.prepareStatement(sql)) {
statement.setString(1, tableName.toLowerCase());
statement.setString(2, columnName.toLowerCase());
try (ResultSet resultSet = statement.executeQuery()) {
return resultSet.next();
}
}
}
private void cleanupImportStageRows(Connection connection, UUID importId) {
if (connection == null || importId == null) {
return;
@ -431,6 +460,20 @@ public class TerminalGroupImporterServiceBean implements TerminalGroupImporterSe
}
}
private void logSqlExceptionChain(SQLException exception) {
SQLException nextException = exception;
int exceptionIndex = 0;
while (nextException != null) {
logger.error("Terminal group import SQL exception [{}]. SQLState={}, ErrorCode={}, Message={}",
exceptionIndex,
nextException.getSQLState(),
nextException.getErrorCode(),
nextException.getMessage());
nextException = nextException.getNextException();
exceptionIndex++;
}
}
private Boolean eofByColumnNullValueTerminal(Row row, String columnAlias) throws ImportFileEofEvaluationException {
Integer columnNumber = terminalAttributesToColumns.get(columnAlias);
if (row != null) {

View File

@ -1,7 +1,6 @@
package com.cmobile.unifiedtms.web.screens.terminallastdiagnosticinfo;
import com.cmobile.unifiedtms.entity.ApplicationSimple;
import com.cmobile.unifiedtms.entity.DownloadTask;
import com.haulmont.cuba.gui.model.CollectionLoader;
import com.haulmont.cuba.gui.model.InstanceContainer;
import com.haulmont.cuba.gui.screen.*;
@ -15,8 +14,6 @@ import javax.inject.Inject;
@EditedEntityContainer("terminalLastDiagnosticInfoDc")
@LoadDataBeforeShow
public class TerminalLastDiagnosticInfoEdit extends StandardEditor<TerminalLastDiagnosticInfo> {
@Inject
private InstanceContainer<TerminalLastDiagnosticInfo> terminalLastDiagnosticInfoDc;
@Inject
private CollectionLoader<ApplicationSimple> applicationSimplesDl;
@Inject
@ -24,6 +21,7 @@ public class TerminalLastDiagnosticInfoEdit extends StandardEditor<TerminalLastD
@Subscribe
public void onInit(InitEvent event) {
applicationSimplesDl.setParameter("diagnosticInfoId", null);
applicationSimplesDl.addPostLoadListener(applicationSimplePostLoadEvent -> {
logger.info(">>> App Simple Loader Loaded!! : {}", applicationSimplePostLoadEvent.getLoadedEntities().size());
applicationSimplePostLoadEvent.getLoadedEntities().forEach(applicationSimple -> {
@ -35,7 +33,7 @@ public class TerminalLastDiagnosticInfoEdit extends StandardEditor<TerminalLastD
@Subscribe(id = "terminalLastDiagnosticInfoDc", target = Target.DATA_CONTAINER)
public void onTerminalLastDiagnosticInfoDcItemChange(InstanceContainer.ItemChangeEvent<TerminalLastDiagnosticInfo> event) {
TerminalLastDiagnosticInfo info = event.getItem();
logger.info(">>> Last Diagnostic Info Id: {}", info,getId());
logger.info(">>> Last Diagnostic Info Id: {}", info != null ? info.getId() : null);
if(info != null) {
logger.info(">>> NOT NULL");
applicationSimplesDl.setParameter("diagnosticInfoId", info.getId());