Merge remote-tracking branch 'origin/develop' into develop
All checks were successful
IntegryManagementSystem_Multi/pipeline/head This commit looks good

This commit is contained in:
2025-03-26 20:17:34 +01:00
2 changed files with 103 additions and 134 deletions

View File

@@ -1,35 +1,33 @@
package it.integry.ems.service.production;
import com.annimon.stream.Stream;
import it.integry.annotations.PostWebServerConstruct;
import it.integry.ems.looper.service.LooperService;
import it.integry.ems.service.dto.production.MRPDailyConsumiDTO;
import it.integry.ems.settings.Model.AvailableConnectionsModel;
import it.integry.ems.settings.Model.SettingsModel;
import it.integry.ems.settings.SettingsController;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems.utility.UtilityDebug;
import it.integry.ems_model.service.SetupGest;
import it.integry.ems_model.utility.*;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.web.context.ContextLoader;
import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@Component
public class MrpConsumiHandlerService {
private final Logger logger = LogManager.getLogger();
@Autowired
private LooperService looperService;
@Autowired
private SettingsModel settingsModel;
@@ -39,69 +37,43 @@ public class MrpConsumiHandlerService {
@Autowired
public SetupGest setupGest;
@Autowired
private MrpSetupHandlerService mrpSetupHandlerService;
private final HashMap<String, HashMap<String, Map<String, List<MRPDailyConsumiDTO>>>> consumiCachedData = new HashMap<>();
@PostWebServerConstruct
public void init() {
if ( saveCache() ) {
looperService.add(() -> this.internalCacheConsumi(consumiCachedData), (UtilityDebug.isDebugExecution()?5:1) * 60 * 1000, MrpConsumiHandlerService.class.getName());
}
}
private boolean saveCache(){
return !UtilityDebug.isDebugExecution() && !UtilityDebug.isIntegryServer() && settingsModel.isPrimaryInstance();
}
public void internalCacheConsumi(HashMap<String, HashMap<String, Map<String, List<MRPDailyConsumiDTO>>>> consumiList) {
try {
String historyProfileDb = settingsController.getHistoryProfileDb();
Map<String, List<AvailableConnectionsModel>> databases = settingsModel.getAvailableConnections()
.stream()
.filter(AvailableConnectionsModel::getInternalDb)
.filter(x -> !historyProfileDb.equalsIgnoreCase(x.getProfileName()))
.collect(Collectors.groupingBy(AvailableConnectionsModel::getDbName));
for (String dbName : databases.keySet()) {
String profileName = databases.get(dbName).get(0).getProfileName();
@Scheduled(fixedDelay = 1, timeUnit = TimeUnit.MINUTES, initialDelay = 60, zone = "Europe/Rome")
private void updateData() throws Exception {
String historyProfileDb = settingsController.getHistoryProfileDb();
final List<AvailableConnectionsModel> availableConnections = settingsModel.getAvailableConnectionsWithoutDuplicatedProfiles(true, historyProfileDb);
loadConsumi(dbName,profileName,consumiList);
for (AvailableConnectionsModel connectionModel : availableConnections) {
boolean isEnabled = mrpSetupHandlerService.isGestioneAbilitata(connectionModel.getDbName());
if(!isEnabled) continue;
try (MultiDBTransactionManager multiDBTransactionManager = new MultiDBTransactionManager(connectionModel, false)) {
int timingId = UtilityTiming.startNewTiming(MrpConsumiHandlerService.class.getSimpleName() + " (" + connectionModel.getProfileName() + ")");
internalCacheConsumi(multiDBTransactionManager);
UtilityTiming.endTiming(timingId, true);
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
}
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
}
}
private void loadConsumi(String dbName, String profileName, HashMap<String, HashMap<String, Map<String, List<MRPDailyConsumiDTO>>>> consumiList) throws Exception {
Date startDate = new Date();
MultiDBTransactionManager multiDBTransactionManager = new MultiDBTransactionManager(profileName, false);
boolean gestioneAbilitata = isGestioneAbilitata(multiDBTransactionManager);
private void internalCacheConsumi(MultiDBTransactionManager multiDBTransactionManager) throws Exception {
String dbName = multiDBTransactionManager.getPrimaryDatasource().getDbName();
if ( gestioneAbilitata ) {
Map<String, List<MRPDailyConsumiDTO>> consumi = getConsumi(multiDBTransactionManager);
HashMap<String, Map<String, List<MRPDailyConsumiDTO>>> section = getSectionConsumiByDBName(consumiList, dbName);
section.clear();
section.put(dbName, consumi);
Map<String, List<MRPDailyConsumiDTO>> consumi = getConsumi(multiDBTransactionManager);
HashMap<String, Map<String, List<MRPDailyConsumiDTO>>> section = getSectionConsumiByDBName(consumiCachedData, dbName);
}
logger.trace(MrpConsumiHandlerService.class.getSimpleName() + " - Consumi: Timing " + ((new Date().getTime() - startDate.getTime()) / 1000) + " secs");
multiDBTransactionManager.closeAll();
}
private static boolean isGestioneAbilitata(MultiDBTransactionManager multiDBTransactionManager) throws Exception {
String sql =
"SELECT CAST(COUNT(*) AS BIT)\n" +
"FROM stb_abil\n" +
"WHERE cod_opz IN ('WG125') \n" +
" AND flag_abil <> 'N'";
boolean gestioneAbilitata = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(multiDBTransactionManager.getPrimaryConnection(), sql);
return gestioneAbilitata;
section.clear();
section.put(dbName, consumi);
}
private HashMap<String, Map<String, List<MRPDailyConsumiDTO>>> getSectionConsumiByDBName(HashMap<String, HashMap<String, Map<String, List<MRPDailyConsumiDTO>>>> inputData, String profileDb) {
@@ -112,28 +84,28 @@ public class MrpConsumiHandlerService {
}
private Map<String, List<MRPDailyConsumiDTO>> getConsumi(MultiDBTransactionManager multiDBTransactionManager ) throws Exception {
private Map<String, List<MRPDailyConsumiDTO>> getConsumi(MultiDBTransactionManager multiDBTransactionManager) throws Exception {
final String gestName = "PVM";
final String section = "MRP";
final String keySection = "MEDIA_CONSUMI";
String mediaConsumi = setupGest.getSetup(multiDBTransactionManager.getPrimaryConnection(), gestName, section,keySection);
String listaDepositi = setupGest.getSetup(multiDBTransactionManager.getPrimaryConnection(), gestName, section,"LIST_COD_MDEP");
String mediaConsumi = setupGest.getSetup(multiDBTransactionManager.getPrimaryConnection(), gestName, section, keySection);
String listaDepositi = setupGest.getSetup(multiDBTransactionManager.getPrimaryConnection(), gestName, section, "LIST_COD_MDEP");
String whereCondDepo = null;
if (!UtilityString.isNullOrEmpty(listaDepositi) )
if (!UtilityString.isNullOrEmpty(listaDepositi))
whereCondDepo = String.format("mtb_movi.cod_mdep in ('%s')", listaDepositi.replace(",", "','"));
String codDtipMix = setupGest.getSetup(multiDBTransactionManager.getPrimaryConnection(), "DTB_DOCT","MOVIMENTAZIONE_OLIO", "COD_DTIP_SCAR");
String codDtipMix = setupGest.getSetup(multiDBTransactionManager.getPrimaryConnection(), "DTB_DOCT", "MOVIMENTAZIONE_OLIO", "COD_DTIP_SCAR");
String sql =
Query.format(
"SELECT mtb_sgrp.cod_mgrp,\n" +
"mtb_sgrp.cod_msgr,\n" +
"IsNull(stb_gest_setup_det.value, %s) as tipo_media\n" +
"FROM mtb_sgrp \n" +
"Left outer join stb_gest_setup_det on gest_name = %s and\n" +
"section = %s and\n" +
"key_section = %s and\n" +
"tipo_setup = 'mtb_sgrp' and mtb_sgrp.cod_mgrp + '~'+ mtb_sgrp.cod_msgr = stb_gest_setup_det.val_col_rif ",
"SELECT mtb_sgrp.cod_mgrp,\n" +
"mtb_sgrp.cod_msgr,\n" +
"IsNull(stb_gest_setup_det.value, %s) as tipo_media\n" +
"FROM mtb_sgrp \n" +
"Left outer join stb_gest_setup_det on gest_name = %s and\n" +
"section = %s and\n" +
"key_section = %s and\n" +
"tipo_setup = 'mtb_sgrp' and mtb_sgrp.cod_mgrp + '~'+ mtb_sgrp.cod_msgr = stb_gest_setup_det.val_col_rif ",
mediaConsumi, gestName, section, keySection);
List<HashMap<String, Object>> sottoGruppi = UtilityDB.executeSimpleQuery(multiDBTransactionManager.getPrimaryConnection(), sql);
@@ -143,7 +115,7 @@ public class MrpConsumiHandlerService {
.toList();
List<MRPDailyConsumiDTO> consumiDTO = new ArrayList<>();
for (Map.Entry<Object, List<HashMap<String, Object>>> d: tipoMedia ) {
for (Map.Entry<Object, List<HashMap<String, Object>>> d : tipoMedia) {
String queryconsumi;
if (d.getKey().equals("M")) {
queryconsumi = getQueryConsumiMesili(d.getValue(), d.getKey().toString(), whereCondDepo, codDtipMix);
@@ -169,18 +141,18 @@ public class MrpConsumiHandlerService {
String sql =
String.format(
"SELECT periodo.cod_mart,\n" +
"periodo.finemese AS data,\n" +
"SUM(ISNULL(qta_scar, 0)) qta,\n" +
"'%s' as tipo_media\n" +
"FROM (SELECT DISTINCT cod_mart,\n" +
" EOMONTH(date) AS finemese\n" +
" FROM [dbo].[stb_dates],\n" +
" mtb_aart\n" +
" WHERE stb_dates.date BETWEEN %s AND %s AND %s) periodo\n" +
" LEFT OUTER JOIN (" + getQueryMovimenti(dataIniz, dataFine, whereCondDepo, codDtipMix ) + ") mtb_movi ON EOMONTH(data_reg) = periodo.finemese AND periodo.cod_mart = mtb_movi.cod_mart\n " +
"GROUP BY periodo.cod_mart, periodo.finemese\n"+
"ORDER BY periodo.cod_mart, periodo.finemese desc",
"SELECT periodo.cod_mart,\n" +
"periodo.finemese AS data,\n" +
"SUM(ISNULL(qta_scar, 0)) qta,\n" +
"'%s' as tipo_media\n" +
"FROM (SELECT DISTINCT cod_mart,\n" +
" EOMONTH(date) AS finemese\n" +
" FROM [dbo].[stb_dates],\n" +
" mtb_aart\n" +
" WHERE stb_dates.date BETWEEN %s AND %s AND %s) periodo\n" +
" LEFT OUTER JOIN (" + getQueryMovimenti(dataIniz, dataFine, whereCondDepo, codDtipMix) + ") mtb_movi ON EOMONTH(data_reg) = periodo.finemese AND periodo.cod_mart = mtb_movi.cod_mart\n " +
"GROUP BY periodo.cod_mart, periodo.finemese\n" +
"ORDER BY periodo.cod_mart, periodo.finemese desc",
tipoMedia,
UtilityDB.valueToString(dataIniz),
UtilityDB.valueToString(dataFine),
@@ -197,28 +169,28 @@ public class MrpConsumiHandlerService {
dataIniz = dataIniz.minusDays(1);
String sql =
String.format(
"SELECT tempo.cod_mart,\n" +
" tempo.data,\n" +
" SUM(ISNULL(mtb_movi.qta_scar, 0)) AS qta,\n" +
" '%s' AS tipo_media\n" +
"FROM (SELECT mtb_aart.cod_mart,\n" +
" DATEPART(ISO_WEEK, date) settimana,\n" +
" MAX(DATEFROMPARTS(YEAR(date), MONTH(date), DAY(date))) AS data,\n" +
" DATEADD(DAY, -6, MAX(DATEFROMPARTS(YEAR(date), MONTH(date), DAY(date)))) AS data_min\n" +
" FROM dbo.stb_dates,\n" +
" mtb_part\n" +
" INNER JOIN mtb_aart ON mtb_part.cod_mart = mtb_aart.cod_mart\n" +
" WHERE stb_dates.date BETWEEN %s AND %s AND \n%s\n" +
" GROUP BY mtb_aart.cod_mart, DATEPART(ISO_WEEK, date)) tempo\n" +
" LEFT OUTER JOIN (" + getQueryMovimenti(dataIniz, dataFine, whereCondDepo, codDtipMix) + ") mtb_movi ON mtb_movi.data_reg BETWEEN tempo.data_min AND tempo.data\n" +
" AND mtb_movi.cod_mart = tempo.cod_mart \n" +
" LEFT OUTER JOIN dtb_tipi ON mtb_movi.cod_dtip = dtb_tipi.cod_dtip \n" +
"GROUP BY tempo.cod_mart, tempo.data\n" +
"ORDER BY tempo.cod_mart, tempo.data DESC \n",
tipoMedia,
"SELECT tempo.cod_mart,\n" +
" tempo.data,\n" +
" SUM(ISNULL(mtb_movi.qta_scar, 0)) AS qta,\n" +
" '%s' AS tipo_media\n" +
"FROM (SELECT mtb_aart.cod_mart,\n" +
" DATEPART(ISO_WEEK, date) settimana,\n" +
" MAX(DATEFROMPARTS(YEAR(date), MONTH(date), DAY(date))) AS data,\n" +
" DATEADD(DAY, -6, MAX(DATEFROMPARTS(YEAR(date), MONTH(date), DAY(date)))) AS data_min\n" +
" FROM dbo.stb_dates,\n" +
" mtb_part\n" +
" INNER JOIN mtb_aart ON mtb_part.cod_mart = mtb_aart.cod_mart\n" +
" WHERE stb_dates.date BETWEEN %s AND %s AND \n%s\n" +
" GROUP BY mtb_aart.cod_mart, DATEPART(ISO_WEEK, date)) tempo\n" +
" LEFT OUTER JOIN (" + getQueryMovimenti(dataIniz, dataFine, whereCondDepo, codDtipMix) + ") mtb_movi ON mtb_movi.data_reg BETWEEN tempo.data_min AND tempo.data\n" +
" AND mtb_movi.cod_mart = tempo.cod_mart \n" +
" LEFT OUTER JOIN dtb_tipi ON mtb_movi.cod_dtip = dtb_tipi.cod_dtip \n" +
"GROUP BY tempo.cod_mart, tempo.data\n" +
"ORDER BY tempo.cod_mart, tempo.data DESC \n",
tipoMedia,
UtilityDB.valueToString(dataIniz),
UtilityDB.valueToString(dataFine),
whereCond );
whereCond);
return sql;
}
@@ -237,13 +209,14 @@ public class MrpConsumiHandlerService {
return whereCond;
}
public Map<String, List<MRPDailyConsumiDTO>> getConsumi() throws Exception {
MultiDBTransactionManager multiDBTransactionManager = ContextLoader.getCurrentWebApplicationContext().getBean(MultiDBTransactionManager.class);
String dbName = multiDBTransactionManager.getPrimaryDatasource().getDbName();
if (!saveCache()) {
if (!mrpSetupHandlerService.isGestioneAbilitata(dbName)) {
return getConsumi(multiDBTransactionManager);
} else {
String dbName = multiDBTransactionManager.getPrimaryDatasource().getDbName();
Map<String, List<MRPDailyConsumiDTO>> consumiList = getSectionConsumiByDBName(consumiCachedData, dbName).get(dbName);
if (consumiList == null)
return getConsumi(multiDBTransactionManager);
@@ -251,12 +224,12 @@ public class MrpConsumiHandlerService {
}
}
private String getQueryMovimenti(LocalDate dataInizio, LocalDate dataFine, String whereCondDepo, String codDtipMix ){
private String getQueryMovimenti(LocalDate dataInizio, LocalDate dataFine, String whereCondDepo, String codDtipMix) {
String whereCondTipiDoc = "";
if (!UtilityString.isNullOrEmpty(codDtipMix)) {
whereCondTipiDoc =
" AND dtb_tipi.flag_gestione_speciale = 0\n" +
" AND dtb_tipi.cod_dtip NOT IN (SELECT value_string from dbo.ParseStringIntoArray ('" + codDtipMix + "', '|')) " ;
" AND dtb_tipi.cod_dtip NOT IN (SELECT value_string from dbo.ParseStringIntoArray ('" + codDtipMix + "', '|')) ";
}
String queryMovimenti =
@@ -266,21 +239,21 @@ public class MrpConsumiHandlerService {
"WHERE dtb_tipi.flag_cons_consumi = 1 \n" +
" AND qta_scar <> 0 \n" +
" AND data_reg BETWEEN '[dataIniz]' AND '[dataFine]'\n" +
(whereCondDepo!=null?"AND " + whereCondDepo + " \n":"") +
(whereCondDepo != null ? "AND " + whereCondDepo + " \n" : "") +
whereCondTipiDoc;
if (!UtilityString.isNullOrEmpty(codDtipMix)){
if (!UtilityString.isNullOrEmpty(codDtipMix)) {
queryMovimenti =
queryMovimenti +
"UNION ALL\n" +
"SELECT cod_mart, qta_scar, lvw_movimentiposture.cod_dtip, data_reg\n" +
"FROM lvw_movimentiposture\n" +
" INNER JOIN dtb_tipi ON lvw_movimentiposture.cod_dtip = dtb_tipi.cod_dtip\n" +
"WHERE (dtb_tipi.flag_gestione_speciale = 1 OR (dtb_tipi.gestione = 'L' AND\n" +
" (dtb_tipi.segno_qta_car < 0 OR dtb_tipi.segno_qta_scar <> 0) AND\n" +
" dtb_tipi.flag_gestione_speciale = 0)) AND \n" +
" data_reg BETWEEN '[dataIniz]' AND '[dataFine]'" +
(whereCondDepo!=null?"AND " + whereCondDepo.replace("mtb_movi", "lvw_movimentiposture") + " \n":"");
"UNION ALL\n" +
"SELECT cod_mart, qta_scar, lvw_movimentiposture.cod_dtip, data_reg\n" +
"FROM lvw_movimentiposture\n" +
" INNER JOIN dtb_tipi ON lvw_movimentiposture.cod_dtip = dtb_tipi.cod_dtip\n" +
"WHERE (dtb_tipi.flag_gestione_speciale = 1 OR (dtb_tipi.gestione = 'L' AND\n" +
" (dtb_tipi.segno_qta_car < 0 OR dtb_tipi.segno_qta_scar <> 0) AND\n" +
" dtb_tipi.flag_gestione_speciale = 0)) AND \n" +
" data_reg BETWEEN '[dataIniz]' AND '[dataFine]'" +
(whereCondDepo != null ? "AND " + whereCondDepo.replace("mtb_movi", "lvw_movimentiposture") + " \n" : "");
}
queryMovimenti =

View File

@@ -7,6 +7,7 @@ import it.integry.ems.settings.Model.SettingsModel;
import it.integry.ems.settings.SettingsController;
import it.integry.ems.sync.MultiDBTransaction.Connection;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems.utility.UtilityDebug;
import it.integry.ems_model.service.SetupGest;
import it.integry.ems_model.utility.Query;
import it.integry.ems_model.utility.UtilityDB;
@@ -37,18 +38,15 @@ public class MrpSetupHandlerService {
@Autowired
public SetupGest setupGest;
private final HashMap<String, HashMap<String, List<MRPDailySetupSottogruppiDTO>>> setupSottogruppiCachedData = new HashMap<>();
private final HashMap<String, HashMap<String, List<MRPDailySetupGruppiDTO>>> setupGruppiCachedData = new HashMap<>();
private boolean canBeExecuted = false;
private final HashMap<String, Boolean> executionPermission = new HashMap<>();
private final HashMap<String, HashMap<String, List<MRPDailySetupSottogruppiDTO>>> setupSottogruppiCachedData = new HashMap<>();
private final HashMap<String, HashMap<String, List<MRPDailySetupGruppiDTO>>> setupGruppiCachedData = new HashMap<>();
@Scheduled(fixedDelay = 1, timeUnit = TimeUnit.HOURS, zone = "Europe/Rome")
private void refreshCronPermission() throws Exception {
canBeExecuted = true;
// canBeExecuted = !UtilityDebug.isDebugExecution() && settingsModel.isPrimaryInstance() && !UtilityDebug.isIntegryServer();
canBeExecuted = !UtilityDebug.isDebugExecution() && settingsModel.isPrimaryInstance() && !UtilityDebug.isIntegryServer();
if (!canBeExecuted) return;
try {
@@ -76,7 +74,7 @@ public class MrpSetupHandlerService {
}
public boolean isGestioneAbilitata(String dbName) {
if(!canBeExecuted) return false;
if (!canBeExecuted) return false;
return executionPermission.getOrDefault(dbName, false);
}
@@ -90,16 +88,14 @@ public class MrpSetupHandlerService {
for (AvailableConnectionsModel connectionModel : availableConnections) {
boolean isEnabled = isGestioneAbilitata(connectionModel.getDbName());
if (!isEnabled) continue;
try (MultiDBTransactionManager multiDBTransactionManager = new MultiDBTransactionManager(connectionModel, false)) {
boolean isEnabled = isGestioneAbilitata(connectionModel.getDbName());
int timingId = UtilityTiming.startNewTiming(MrpSetupHandlerService.class.getSimpleName() + " (" + connectionModel.getProfileName() + ")");
if (isEnabled) {
internalSottogruppoSetupCache(multiDBTransactionManager);
internalGruppoSetupCache(multiDBTransactionManager);
}
internalSottogruppoSetupCache(multiDBTransactionManager);
internalGruppoSetupCache(multiDBTransactionManager);
UtilityTiming.endTiming(timingId, true);