Aggiunta cache in servizi di completamento unt_mis e qta_cnf

This commit is contained in:
2025-11-07 18:21:09 +01:00
parent ee9ec1a8a7
commit 84a6f4c4f1
7 changed files with 140 additions and 60 deletions

View File

@@ -53,6 +53,21 @@ public class DbmsChangeTracker {
}
}
private void checkConnection() {
try {
if (integryConnection.isClosed())
createConnection();
} catch (SQLException e) {
try {
integryConnection.close();
createConnection();
} catch (SQLException ex) {
logger.error("Unable to reestablish DB connection for Change Tracker", ex);
throw new RuntimeException("Unable to reestablish DB connection for Change Tracker");
}
}
}
public void enableTrackerInDbms() throws SQLException, DataConverterNotFoundException, InstantiationException, IllegalAccessException {
final ChangeTrackingConfigDTO currentConfig = retrieveTrackerCurrentConfig();
if (currentConfig != null) {
@@ -112,6 +127,8 @@ public class DbmsChangeTracker {
if (!trackerEnabled)
return;
checkConnection();
final List<String> trackedTables = retrieveTrackedTables();
HashMap<Long, DetectedChangeDataDTO> changesByVersion = new HashMap<>();

View File

@@ -8,10 +8,7 @@ import it.integry.ems.dbms_change_tracker.model.events.TableRecordUpdatedEvent;
import it.integry.ems.migration._base.IntegryCustomerDB;
import it.integry.ems.sync.MultiDBTransaction.Connection;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems_model.entity.MtbAart;
import it.integry.ems_model.entity.StbGestSetup;
import it.integry.ems_model.entity.StbGestSetupDepo;
import it.integry.ems_model.entity.WtbGestSetupUser;
import it.integry.ems_model.entity.*;
import it.integry.ems_model.exception.DataConverterNotFoundException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -33,6 +30,8 @@ public class DbmsChangeTrackerComponent {
private final ArrayList<String> trackedTables = new ArrayList<String>() {{
add(MtbAart.ENTITY);
add(MtbAartBarCode.ENTITY);
add(MtbUntMis.ENTITY);
add(StbGestSetup.ENTITY);
add(StbGestSetupDepo.ENTITY);
add(WtbGestSetupUser.ENTITY);

View File

@@ -13,10 +13,7 @@ import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems.utility.UtilityDebug;
import it.integry.ems_model.base.EntityBase;
import it.integry.ems_model.base.EntityPropertyHolder;
import it.integry.ems_model.entity.MtbAart;
import it.integry.ems_model.entity.StbGestSetup;
import it.integry.ems_model.entity.StbGestSetupDepo;
import it.integry.ems_model.entity.WtbGestSetupUser;
import it.integry.ems_model.entity.*;
import it.integry.ems_model.exception.DataConverterNotFoundException;
import it.integry.ems_model.utility.UtilityDB;
import it.integry.ems_model.utility.UtilityQuery;
@@ -34,6 +31,7 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@Component
public class EntityCacheComponent implements ApplicationListener {
@@ -47,6 +45,8 @@ public class EntityCacheComponent implements ApplicationListener {
private final HashMap<String, Class<? extends EntityBase>> enabledEntities = new HashMap<String, Class<? extends EntityBase>>() {{
put(MtbAart.ENTITY, MtbAart.class);
put(MtbAartBarCode.ENTITY, MtbAartBarCode.class);
put(MtbUntMis.ENTITY, MtbUntMis.class);
put(StbGestSetup.ENTITY, StbGestSetup.class);
put(StbGestSetupDepo.ENTITY, StbGestSetupDepo.class);
put(WtbGestSetupUser.ENTITY, WtbGestSetupUser.class);
@@ -61,7 +61,7 @@ public class EntityCacheComponent implements ApplicationListener {
private MultiDBTransactionManager multiDBTransactionManager;
@PostContextConstruct
public void init() throws Exception {
private void init() throws Exception {
if (UtilityDebug.isDebugExecution())
return;
@@ -105,6 +105,11 @@ public class EntityCacheComponent implements ApplicationListener {
}
public <T extends EntityBase> List<T> getCachedEntitiesList(IntegryCustomerDB customerDB, String tableName, Predicate<T> filterPredicate) {
return getCachedEntitiesStream(customerDB, tableName, filterPredicate)
.collect(Collectors.toList());
}
public <T extends EntityBase> Stream<T> getCachedEntitiesStream(IntegryCustomerDB customerDB, String tableName, Predicate<T> filterPredicate) {
if (!isCacheEnabled(customerDB, tableName) && UtilityDebug.isDebugExecution()) {
try {
refreshCacheForEntity(customerDB, tableName);
@@ -113,14 +118,12 @@ public class EntityCacheComponent implements ApplicationListener {
}
}
List<T> entities = entityCache.get(customerDB).get(tableName)
return entityCache.get(customerDB).get(tableName)
.values()
.parallelStream()
.map(x -> (T) x)
.filter(filterPredicate)
.map(x -> (T) x.clone())
.collect(Collectors.toList());
return entities;
.map(x -> (T) x.clone());
}

View File

@@ -1,10 +1,12 @@
package it.integry.ems.rules.completing;
import com.annimon.stream.ComparatorCompat;
import com.annimon.stream.Optional;
import com.annimon.stream.Stream;
import it.integry.common.var.CommonConstants;
import it.integry.ems._context.ApplicationContextProvider;
import it.integry.ems.dynamic_cache.EntityCacheComponent;
import it.integry.ems.json.ResponseJSONObjectMapper;
import it.integry.ems.migration._base.IntegryCustomerDB;
import it.integry.ems.sync.MultiDBTransaction.Connection;
import it.integry.ems_model.annotation.ReloadRow;
import it.integry.ems_model.annotation.SqlField;
@@ -296,7 +298,7 @@ public class CommonRules extends QueryRules {
if (testata.getOperation() != OperationType.INSERT) {
Integer maxIdRiga = 0;
Optional<? extends EntityBase> maxRiga =
Stream.of(rows)
rows.stream()
.filter(x -> x.getIdRigaEntity(x, rigaField) != null)
.max(Comparator.comparingInt(o -> o.getIdRigaEntity(o, rigaField)));
@@ -369,7 +371,8 @@ public class CommonRules extends QueryRules {
}
public static void completePosRigaEntity(Connection conn, DtbOrdt testata) throws Exception {
List<DtbOrdr> rows = Stream.of(testata.getDtbOrdr()).filter(x -> x.getOperation() != OperationType.DELETE).toList();
List<DtbOrdr> rows = Stream.of(testata.getDtbOrdr())
.filter(x -> x.getOperation() != OperationType.DELETE).toList();
if (!rows.isEmpty()) {
if (testata.getExecuteRecalc()) {
ComparatorCompat<DtbOrdr> c =
@@ -668,32 +671,71 @@ public class CommonRules extends QueryRules {
return execQuery(conn, sql);
}
public static String completeCodBarre(Connection connection, String codMart)
public static String completeCodBarre(IntegryCustomerDB customerDB, Connection connection, String codMart)
throws SQLException {
String sql = "SELECT mvw_barcode_det.cod_barre " + "FROM mvw_barcode_det "
+ "WHERE mvw_barcode_det.cod_mart = '" + codMart + "'";
List<HashMap<String, Object>> result = execQuery(connection, sql);
final EntityCacheComponent entityCacheComponent = ApplicationContextProvider.getApplicationContext().getBean(EntityCacheComponent.class);
List<HashMap<String, Object>> result = new ArrayList<>();
entityCacheComponent.<MtbAart>getCachedEntitiesStream(customerDB, MtbAart.ENTITY,
x -> x.getCodMart().equalsIgnoreCase(codMart) && !UtilityString.isNullOrEmpty(x.getBarCode()))
.forEach(x -> result.add(new HashMap<String, Object>() {{
put("cod_mart", x.getCodMart());
put("cod_barre", x.getBarCode());
put("cod_col", null);
put("cod_tagl", null);
put("qta_cnf", BigDecimal.ONE);
}}));
entityCacheComponent.<MtbAart>getCachedEntitiesStream(customerDB, MtbAart.ENTITY,
x -> x.getCodMart().equalsIgnoreCase(codMart) && !UtilityString.isNullOrEmpty(x.getCodBarreImb()))
.forEach(x -> result.add(new HashMap<String, Object>() {{
put("cod_mart", x.getCodMart());
put("cod_barre", x.getCodBarreImb());
put("cod_col", null);
put("cod_tagl", null);
put("qta_cnf", x.getQtaCnf());
}}));
entityCacheComponent.<MtbAartBarCode>getCachedEntitiesStream(customerDB, MtbAartBarCode.ENTITY,
x -> x.getCodMart().equalsIgnoreCase(codMart))
.forEach(x -> result.add(new HashMap<String, Object>() {{
put("cod_mart", x.getCodMart());
put("cod_barre", x.getCodBarre());
put("cod_col", null);
put("cod_tagl", null);
put("qta_cnf", x.getQtaCnf());
}}));
String barcode = null;
if (result != null && !result.isEmpty() && result.get(0).containsKey("cod_barre"))
barcode = result.get(0).get("cod_barre").toString();
if (!result.isEmpty())
barcode = UtilityHashMap.getValueIfExists(result.get(0), "cod_barre");
return barcode;
}
public static String completeCodBarreScontrini(Connection connection, String codMart)
throws Exception {
String sql = "SELECT TOP 1 mvw_barcode_det.cod_barre " + "FROM mvw_barcode_det "
String sql = "SELECT TOP 1 mvw_barcode_det.cod_barre " +
"FROM mvw_barcode_det "
+ "WHERE mvw_barcode_det.cod_mart = '" + codMart + "' and len(mvw_barcode_det.cod_barre) <= 13";
String barcode = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(connection, sql);
return barcode;
}
public static String completeFlagQtaCnfFissa(Connection connection, String codMart) throws Exception {
String sql = "select flag_qta_cnf_fissa from mtb_aart WHERE cod_mart = '" + codMart + "'";
String flagQtaCnfFissa = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(connection, sql);
return flagQtaCnfFissa;
public static String completeFlagQtaCnfFissa(Connection connection, IntegryCustomerDB customerDB, String codMart) {
final EntityCacheComponent entityCacheComponent = ApplicationContextProvider.getApplicationContext().getBean(EntityCacheComponent.class);
final List<MtbAart> cachedMtbAarts = entityCacheComponent.getCachedEntitiesList(customerDB, MtbAart.ENTITY, x -> x.getCodMart().equals(codMart));
if (cachedMtbAarts == null || cachedMtbAarts.isEmpty())
return null;
return cachedMtbAarts.get(0).getFlagQtaCnfFissa();
}
public static String getApplicationName(Connection connection) throws Exception {

View File

@@ -1,13 +1,13 @@
package it.integry.ems.rules.completing;
import com.annimon.stream.Stream;
import it.integry.ems._context.ApplicationContextProvider;
import it.integry.ems.dynamic_cache.EntityCacheComponent;
import it.integry.ems.migration._base.IntegryCustomerDB;
import it.integry.ems.rules.completing.dto.DatiPartitaMagDTO;
import it.integry.ems.sync.MultiDBTransaction.Connection;
import it.integry.ems_model.config.EmsRestConstants;
import it.integry.ems_model.entity.MtbColr;
import it.integry.ems_model.entity.MtbCols;
import it.integry.ems_model.entity.MtbColt;
import it.integry.ems_model.entity.MtbPartitaMag;
import it.integry.ems_model.entity.*;
import it.integry.ems_model.types.OperationType;
import it.integry.ems_model.utility.*;
@@ -255,7 +255,7 @@ public class PackagesRules extends QueryRules {
int cifreDec;
if (UtilityString.isNullOrEmpty(flagQtaCnfFissa)) {
throw new Exception(String.format("Articolo %s non trovato", mtbColr.getCodMart()));
}else if (flagQtaCnfFissa.equalsIgnoreCase("S")) {
} else if (flagQtaCnfFissa.equalsIgnoreCase("S")) {
cifreDec = EmsRestConstants.cifreDecMax;
} else {
cifreDec = 0;
@@ -331,23 +331,28 @@ public class PackagesRules extends QueryRules {
return datiOrd;
}
public static HashMap<String, Object> calcPeso(Connection conn, MtbColr entity) throws Exception {
String sql = "select cifre_dec from mtb_unt_mis where flag_unita_kg = 'S'";
BigDecimal cifreDec = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(conn, sql);
public static HashMap<String, Object> calcPeso(IntegryCustomerDB customerDB, Connection conn, MtbColr entity) throws Exception {
if ( cifreDec == null ) { cifreDec = BigDecimal.valueOf(5); }
final EntityCacheComponent entityCacheComponent = ApplicationContextProvider.getApplicationContext().getBean(EntityCacheComponent.class);
sql =
"SELECT mtb_aart.unt_mis, " +
" mtb_aart.tara_kg, " +
" mtb_aart.peso_kg, " +
" case when mtb_aart.flag_peso_egalizzato = 1 THEN mtb_aart.qta_cnf ELSE 1 END * mtb_aart.peso_kg as 'peso_egalizzato', " +
" mtb_unt_mis.flag_unita_kg, " +
" mtb_aart.flag_peso_egalizzato " +
" FROM mtb_aart INNER JOIN mtb_unt_mis ON mtb_aart.unt_mis = mtb_unt_mis.unt_mis " +
" WHERE mtb_aart.cod_mart = " + UtilityDB.valueToString(entity.getCodMart());
BigDecimal cifreDec = entityCacheComponent.<MtbUntMis>getCachedEntitiesStream(customerDB, MtbUntMis.ENTITY,
x -> x.getFlagUnitaKg().equalsIgnoreCase("S"))
.map(MtbUntMis::getCifreDec)
.findFirst()
.orElse(BigDecimal.valueOf(5));
HashMap<String, Object> anagArt = entityCacheComponent.<MtbAart>getCachedEntitiesStream(customerDB, MtbAart.ENTITY,
x -> x.getCodMart().equalsIgnoreCase(entity.getCodMart()))
.map(x -> new HashMap<String, Object>() {{
put("unt_mis", x.getUntMis());
put("tara_kg", x.getTaraKg());
put("peso_kg", x.getPesoKg());
put("flag_peso_egalizzato", x.getFlagPesoEgalizzato());
put("peso_egalizzato", x.getFlagPesoEgalizzato() ? x.getQtaCnf().multiply(x.getPesoKg()) : null);
}})
.findFirst()
.orElse(null);
HashMap<String, Object> queryResults = UtilityDB.executeSimpleQueryOnlyFirstRow(conn, sql);
MtbColr originalEntity = ((MtbColr) entity.getOriginalEntity());
if (originalEntity != null && originalEntity.getPesoNettoKg() != null && originalEntity.getPesoLordoKg() != null) {
@@ -359,12 +364,17 @@ public class PackagesRules extends QueryRules {
}
BigDecimal pesoNetto = BigDecimal.ZERO, pesoLordo = BigDecimal.ZERO;
if (queryResults != null) {
BigDecimal taraKg = (BigDecimal) queryResults.get("tara_kg");
BigDecimal pesoKg = (BigDecimal) queryResults.get("peso_kg");
String flagUnitaKg = (String) queryResults.get("flag_unita_kg");
BigDecimal pesoKGEgalizzato = (BigDecimal) queryResults.get("peso_egalizzato");
Boolean pesoEgalizzato = (Boolean) queryResults.get("flag_peso_egalizzato");
if (anagArt != null) {
String flagUnitaKg = entityCacheComponent.<MtbUntMis>getCachedEntitiesStream(customerDB, MtbUntMis.ENTITY,
x -> x.getUntMis().equalsIgnoreCase(String.valueOf(anagArt.get("unt_mis"))))
.map(MtbUntMis::getFlagUnitaKg)
.findFirst()
.orElse(null);
BigDecimal taraKg = (BigDecimal) anagArt.get("tara_kg");
BigDecimal pesoKg = (BigDecimal) anagArt.get("peso_kg");
BigDecimal pesoKGEgalizzato = (BigDecimal) anagArt.get("peso_egalizzato");
Boolean pesoEgalizzato = (Boolean) anagArt.get("flag_peso_egalizzato");
if ("S".equalsIgnoreCase(flagUnitaKg)) {
pesoNetto = entity.getQtaCol();

View File

@@ -46,39 +46,44 @@ public class MtbAartBarCode extends EntityBase {
return codBarre;
}
public void setCodBarre(String codBarre) {
public MtbAartBarCode setCodBarre(String codBarre) {
this.codBarre = codBarre;
return this;
}
public String getCodMart() {
return codMart;
}
public void setCodMart(String codMart) {
public MtbAartBarCode setCodMart(String codMart) {
this.codMart = codMart;
return this;
}
public BigDecimal getQtaCnf() {
return qtaCnf;
}
public void setQtaCnf(BigDecimal qtaCnf) {
public MtbAartBarCode setQtaCnf(BigDecimal qtaCnf) {
this.qtaCnf = qtaCnf;
return this;
}
public String getFlagPrimario() {
return flagPrimario;
}
public void setFlagPrimario(String flagPrimario) {
public MtbAartBarCode setFlagPrimario(String flagPrimario) {
this.flagPrimario = flagPrimario;
return this;
}
public String getTipoCodBarre() {
return tipoCodBarre;
}
public void setTipoCodBarre(String tipoCodBarre) {
public MtbAartBarCode setTipoCodBarre(String tipoCodBarre) {
this.tipoCodBarre = tipoCodBarre;
return this;
}
}

View File

@@ -16,12 +16,16 @@ import it.integry.ems_model.entity.MtbColt
import it.integry.ems_model.entity.MtbColr
import java.time.LocalDate
import it.integry.ems_model.utility.UtilityLocalDate;
import it.integry.ems.migration._base.IntegryCustomerDB;
import it.integry.ems.migration._base.IntegryCustomer
global Connection conn
global String username
global Boolean completeRulesEnabled
global Boolean checkRulesEnabled
global Boolean postRulesEnabled
global IntegryCustomerDB customerDb
global IntegryCustomer customer
//PACKAGES TESTATE
rule "completeCodVlis"
@@ -290,7 +294,7 @@ when
eval(completeRulesEnabled)
$row: MtbColr(flagQtaCnfFissa == null && codMart != null)
then
String flagQtaCnfFissa = CommonRules.completeFlagQtaCnfFissa(conn, $row.getCodMart());
String flagQtaCnfFissa = CommonRules.completeFlagQtaCnfFissa(conn, customerDb, $row.getCodMart());
modify ( $row ) { setFlagQtaCnfFissa(flagQtaCnfFissa) }
end
@@ -300,7 +304,7 @@ when
eval(completeRulesEnabled)
$row: MtbColr(codBarre == null && codMart != null)
then
String codBarre = CommonRules.completeCodBarre(conn, $row.getCodMart());
String codBarre = CommonRules.completeCodBarre(customerDb, conn, $row.getCodMart());
modify ( $row ) { setCodBarre(codBarre) }
end
@@ -351,7 +355,7 @@ when
eval(completeRulesEnabled)
$entity: MtbColr(qtaCol != null && numCnf != null && qtaCnf != null && operation != OperationType.DELETE)
then
HashMap<String, Object> dati = PackagesRules.calcPeso(conn, $entity);
HashMap<String, Object> dati = PackagesRules.calcPeso(customerDb, conn, $entity);
modify ( $entity ) {
setPesoNettoKg(QueryRules.<BigDecimal>getMapData(dati, $entity.getPesoNettoKg(), "peso_netto")),
setPesoLordoKg(QueryRules.<BigDecimal>getMapData(dati, $entity.getPesoLordoKg(), "peso_lordo"))