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-11-25 09:36:20 +01:00
22 changed files with 424 additions and 188 deletions

View File

@@ -14,7 +14,7 @@ public class ExecutorServiceConfig {
private final int corePoolSize = Runtime.getRuntime().availableProcessors();
private final int maxPoolSize = (int) (corePoolSize * 1.5f);
private final int queueSize = 500;
private final int queueSize = 1_000_000;
@Bean
public ExecutorService taskExecutor() {

View File

@@ -60,7 +60,11 @@ public class DbmsChangeTracker {
createConnection();
} catch (SQLException e) {
try {
integryConnection.close();
try {
integryConnection.close();
} catch (Exception ex) {
//ignore
}
createConnection();
} catch (SQLException ex) {
logger.error("Unable to reestablish DB connection for Change Tracker", ex);

View File

@@ -0,0 +1,96 @@
package it.integry.ems.migration.model;
import it.integry.ems.migration._base.BaseMigration;
import it.integry.ems.migration._base.MigrationModelInterface;
public class Migration_20251124164630 extends BaseMigration implements MigrationModelInterface {
@Override
public void up() throws Exception {
if (isHistoryDB())
return;
createOrUpdateFunction("getMaterialiDistinta",
"CREATE FUNCTION [dbo].[getMaterialiDistinta](@codProd VARCHAR(15), @explodeSemilavorati BIT)\n" +
" RETURNS TABLE\n" +
" AS\n" +
" RETURN(WITH distinta AS (SELECT cod_prod,\n" +
" CONVERT(VARCHAR(15), NULL) AS cod_parent,\n" +
" cod_prod AS cod_mart,\n" +
" jtb_cicl.descrizione_prod AS descrizione,\n" +
" jtb_cicl.descrizione_estesa,\n" +
" CONVERT(VARCHAR(3), unt_mis_prod) AS unt_mis_prod,\n" +
" CONVERT(NUMERIC(20, 5), rap_conv_prod) AS rap_conv_prod,\n" +
" CONVERT(NUMERIC(20, 5), jtb_cicl.qta_prod) AS qta_prod,\n" +
" CONVERT(NUMERIC(20, 5), jtb_cicl.qta_prod) AS qta_dist,\n" +
" 1 AS livello,\n" +
" FORMAT(ROW_NUMBER() OVER ( ORDER BY cod_prod), '00000') AS item_id,\n" +
" CONVERT(VARCHAR(15), cod_prod) AS cod_prod_pri,\n" +
" CAST(0 AS BIT) AS ricorsione,\n" +
" CONVERT(NUMERIC(5, 2), 0) AS perc_sfrido,\n" +
" CONVERT(INT, NULL) AS num_fase,\n" +
" CONVERT(VARCHAR(1), NULL) AS flag_pri,\n" +
" CONVERT(VARCHAR(1024), NULL) AS note,\n" +
" CAST(1 AS BIT) AS is_root,\n" +
" CAST(0 AS BIT) AS is_foglia\n" +
" FROM jtb_cicl\n" +
" WHERE (@codProd IS NULL OR cod_prod = @codProd)\n" +
" UNION ALL\n" +
" SELECT distinta.cod_prod,\n" +
" CONVERT(VARCHAR(15), jtb_dist_mate.cod_prod) AS cod_parent,\n" +
" jtb_dist_mate.cod_mart,\n" +
" jtb_dist_mate.descrizione,\n" +
" jtb_dist_mate.descrizione_estesa,\n" +
" CONVERT(VARCHAR(3), jtb_dist_mate.unt_mis_dist) AS unt_mis_prod,\n" +
" CONVERT(NUMERIC(20, 5), jtb_dist_mate.rap_conv_dist) AS rap_conv_prod,\n" +
" CONVERT(NUMERIC(20, 5),\n" +
" ((jtb_dist_mate.qta_std * (1 + jtb_dist_mate.perc_sfrido / 100)) /\n" +
" (distinta.qta_prod)) * distinta.qta_prod) AS qta_prod,\n" +
" CONVERT(NUMERIC(20, 5), NULL),\n" +
" distinta.livello + 1,\n" +
" distinta.item_id + '_' +\n" +
" FORMAT(\n" +
" ROW_NUMBER() OVER ( ORDER BY jtb_dist_mate.flag_pri DESC, jtb_dist_mate.num_fase, id_riga ),\n" +
" '00000') AS item_id,\n" +
" CONVERT(VARCHAR(15), distinta.cod_mart) AS cod_prod_pri,\n" +
" CAST(CASE\n" +
" WHEN jtb_dist_mate.cod_mart = jtb_dist_mate.cod_prod THEN 1\n" +
" ELSE 0 END AS BIT) AS ricorsione,\n" +
" jtb_dist_mate.perc_sfrido,\n" +
" jtb_dist_mate.num_fase,\n" +
" CONVERT(VARCHAR(1), jtb_dist_mate.flag_pri) AS flag_pri,\n" +
" CONVERT(VARCHAR(1024), jtb_dist_mate.note) AS note,\n" +
" CAST(0 AS BIT) AS is_root,\n" +
" CAST(IIF(jtb_dist_mate.flag_pri = 's', 0, 1) AS BIT) AS is_foglia\n" +
" FROM jtb_dist_mate\n" +
" INNER JOIN distinta ON jtb_dist_mate.cod_prod = distinta.cod_mart\n" +
" INNER JOIN mtb_aart ON mtb_aart.cod_mart = jtb_dist_mate.cod_mart\n" +
" WHERE distinta.ricorsione = 0\n" +
" AND (distinta.is_root = 1 OR distinta.flag_pri = 'S' OR @explodeSemilavorati = 1))\n" +
" SELECT cod_prod,\n" +
" cod_parent,\n" +
" cod_mart,\n" +
" descrizione,\n" +
" descrizione_estesa,\n" +
" unt_mis_prod,\n" +
" rap_conv_prod,\n" +
" ISNULL(qta_dist, qta_prod) AS qta_prod,\n" +
" livello,\n" +
" item_id,\n" +
" cod_prod_pri,\n" +
" perc_sfrido,\n" +
" num_fase,\n" +
" DENSE_RANK() OVER ( PARTITION BY cod_prod ORDER BY cod_prod_pri ) - 1 + num_fase AS num_fase_calc,\n" +
" flag_pri,\n" +
" note,\n" +
" is_root,\n" +
" is_foglia\n" +
" FROM distinta)");
}
@Override
public void down() throws Exception {
}
}

View File

@@ -1,5 +1,7 @@
package it.integry.ems.rules.completing;
import it.integry.ems._context.ApplicationContextProvider;
import it.integry.ems.dynamic_cache.EntityCacheComponent;
import it.integry.ems.service.comuni.entities.Comune;
import it.integry.ems.service.comuni.service.ComuniService;
import it.integry.ems.sync.MultiDBTransaction.Connection;
@@ -227,4 +229,19 @@ public class AnagRules extends QueryRules {
return UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(connection, sql);
}
public static boolean completeSetupInsDest(Connection connection) {
final EntityCacheComponent entityCacheComponent = ApplicationContextProvider.getApplicationContext().getBean(EntityCacheComponent.class);
return entityCacheComponent.<StbGestSetup>getCachedEntitiesStream(connection.getIntegryCustomerDB(), StbGestSetup.ENTITY,
x -> x.getGestName().equalsIgnoreCase("GTB_ANAG") &&
x.getSection().equalsIgnoreCase("SETUP") &&
x.getKeySection().equalsIgnoreCase("INSERISCI_DEST_CLIE"))
.map(x -> "S".equalsIgnoreCase(x.getValue()))
.findFirst()
.orElse(false);
}
}

View File

@@ -69,6 +69,10 @@ public class EntityProcessor {
return processEntity(entity, false, multiDBTransactionManager);
}
public <T> T processEntity(EntityInterface entity, MultiDBTransactionManager multiDBTransactionManager, RequestDataDTO requestDataDTO) throws Exception {
return (T) processEntity(entity, false, true, requestDataDTO.getUsername(), multiDBTransactionManager, requestDataDTO);
}
public <T> T processEntity(EntityInterface entity, MultiDBTransactionManager multiDBTransactionManager, boolean completeEntity) throws Exception {
return processEntity(entity, false, multiDBTransactionManager, completeEntity);
}

View File

@@ -1,15 +1,20 @@
package it.integry.ems.service.comuni.controller;
import it.integry.common.var.CommonConstants;
import it.integry.ems.javabeans.RequestDataDTO;
import it.integry.ems.response.ServiceRestResponse;
import it.integry.ems.service.comuni.dto.SavePositionRequestDTO;
import it.integry.ems.service.comuni.entities.Comune;
import it.integry.ems.service.comuni.exceptions.ComuniException;
import it.integry.ems.service.comuni.service.ComuniService;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems_model.utility.UtilityString;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@@ -20,18 +25,24 @@ public class ComuniController {
@Autowired
private ComuniService comuniService;
@Autowired
private MultiDBTransactionManager multiDBTransactionManager;
@Autowired
private RequestDataDTO requestDataDTO;
@PostMapping(value = "savePosition")
public ServiceRestResponse savePosition(@RequestParam(CommonConstants.PROFILE_DB) String config,
@RequestBody SavePositionRequestDTO request) throws Exception {
return ServiceRestResponse.createPositiveResponse(comuniService.savePosition(request));
return ServiceRestResponse.createPositiveResponse(comuniService.savePosition(multiDBTransactionManager, request, requestDataDTO));
}
@PostMapping(value = "retrievePosition")
public ServiceRestResponse retrievePosition(@RequestParam(CommonConstants.PROFILE_DB) String config,
@RequestBody String id) throws Exception {
return ServiceRestResponse.createPositiveResponse(comuniService.retrievePosition(id));
return ServiceRestResponse.createPositiveResponse(comuniService.retrievePosition(multiDBTransactionManager, requestDataDTO, id));
}
@PostMapping(value = "infoComuni")

View File

@@ -1,19 +1,19 @@
package it.integry.ems.service.comuni.service;
import it.integry.ems.javabeans.RequestDataDTO;
import it.integry.ems.service.EntityProcessor;
import it.integry.ems.service.comuni.base.CapCittaProv;
import it.integry.ems.service.comuni.base.ComuniSearchableFields;
import it.integry.ems.service.comuni.dto.SavePositionRequestDTO;
import it.integry.ems.service.comuni.entities.Comune;
import it.integry.ems.service.comuni.exceptions.ComuniException;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems_model.entity.StbPosizioni;
import it.integry.ems_model.types.OperationType;
import it.integry.googleCloudApi.service.GeocodingService;
import it.integry.ems.service.comuni.base.CapCittaProv;
import it.integry.ems.service.comuni.base.ComuniSearchableFields;
import it.integry.ems.service.comuni.entities.Comune;
import it.integry.ems.service.comuni.exceptions.ComuniException;
import it.integry.ems_model.utility.UtilityString;
import it.integry.googleCloudApi.dto.IndirizzoDTO;
import it.integry.googleCloudApi.service.GeocodingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
@@ -23,7 +23,6 @@ import java.util.List;
import java.util.stream.Collectors;
@Service
@Scope("request")
public class ComuniService {
@Autowired
@@ -35,14 +34,11 @@ public class ComuniService {
@Autowired
private EntityProcessor entityProcessor;
@Autowired
private MultiDBTransactionManager multiDBTransactionManager;
public List<Comune> getComuni() {
return unitaTerritorialiService.getComuni();
}
public StbPosizioni savePosition(SavePositionRequestDTO savePositionRequestDTO) throws Exception {
public StbPosizioni savePosition(MultiDBTransactionManager multiDBTransactionManager, SavePositionRequestDTO savePositionRequestDTO, RequestDataDTO requestDataDTO) throws Exception {
StbPosizioni position = new StbPosizioni()
.setCitta(savePositionRequestDTO.getCitta())
.setIndirizzo(savePositionRequestDTO.getIndirizzo())
@@ -53,17 +49,17 @@ public class ComuniService {
.setLng(BigDecimal.valueOf(savePositionRequestDTO.getLng()));
position.setOperation(OperationType.INSERT);
entityProcessor.processEntity(position, multiDBTransactionManager);
entityProcessor.processEntity(position, multiDBTransactionManager, requestDataDTO);
position.setOperation(OperationType.SELECT_OBJECT);
return position;
}
public StbPosizioni retrievePosition(String id) throws Exception {
public StbPosizioni retrievePosition(MultiDBTransactionManager multiDBTransactionManager, RequestDataDTO requestDataDTO, String id) throws Exception {
StbPosizioni position = new StbPosizioni().setId(Long.valueOf(id));
position.setOperation(OperationType.SELECT_OBJECT);
entityProcessor.processEntity(position, multiDBTransactionManager);
entityProcessor.processEntity(position, multiDBTransactionManager, requestDataDTO);
return position;
}

View File

@@ -333,10 +333,10 @@ public class GeneraOrdLav {
.setFlagEvasoProd(flagEvasoProd != null ? flagEvasoProd.getValue().toString() : null)
.setGeneraOrdLavDaProd(dtbOrdt.isGeneraOrdLavDaProd());
if (row.getFlagSospesoOrdl() !=null) {
if (row.getFlagSospesoOrdl() != null) {
ordT.setFlagSospeso(row.getFlagSospesoOrdl());
}
if (row.getRifOrdOrdl() !=null) {
if (row.getRifOrdOrdl() != null) {
ordT.setRifOrd(row.getRifOrdOrdl());
}
@@ -1477,7 +1477,7 @@ public class GeneraOrdLav {
}
if (dataInizProdOld != null && dataInizNew != null && dataInizProdOld != EmsRestConstants.LOCAL_DATE_NULL && dataInizNew != EmsRestConstants.LOCAL_DATE_NULL){
if (dataInizProdOld != null && dataInizNew != null && dataInizProdOld != EmsRestConstants.LOCAL_DATE_NULL && dataInizNew != EmsRestConstants.LOCAL_DATE_NULL) {
Integer ggDiff = Math.toIntExact(UtilityLocalDate.daysAfterDate(dataInizProdOld, dataInizNew));
if (ggDiff != 0) {
sql = "SELECT * FROM dtb_ordr";
@@ -1542,7 +1542,7 @@ public class GeneraOrdLav {
BigDecimal qtaProdOld = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(conn, sql);
BigDecimal qtaProdNew = qtaProd.multiply(rapConv);
BigDecimal moltiplicatore = qtaProdNew.divide(qtaProdOld, 5);
BigDecimal moltiplicatore = qtaProdNew.divide(qtaProdOld, 5, RoundingMode.HALF_UP);
if (!moltiplicatore.equals(BigDecimal.ONE)) {
sql = "SELECT * FROM dtb_ordr";

View File

@@ -482,7 +482,7 @@ public class DtbOrdt extends DtbDocOrdT implements EquatableEntityInterface<DtbO
super(logger);
}
public DtbOrdt(String gestione, LocalDate dataOrd,Integer numOrd) {
public DtbOrdt(String gestione, LocalDate dataOrd, Integer numOrd) {
super(logger);
this.gestione = gestione;
this.dataOrd = UtilityLocalDate.localDateToDate(dataOrd);
@@ -1789,7 +1789,7 @@ public class DtbOrdt extends DtbDocOrdT implements EquatableEntityInterface<DtbO
@Override
public void checkPreSave() throws Exception {
switch(getOperation()) {
switch (getOperation()) {
case NO_OP:
case SELECT_OBJECT:
case SELECT:
@@ -1935,7 +1935,7 @@ public class DtbOrdt extends DtbDocOrdT implements EquatableEntityInterface<DtbO
if (this == other)
return true;
if(hashCodeKey() != other.hashCodeKey())
if (hashCodeKey() != other.hashCodeKey())
return false;
return getDataOrd().equals(other.getDataOrd()) && getGestione().equals(other.getGestione()) && Objects.equals(getNumOrd(), other.getNumOrd());
@@ -1953,4 +1953,17 @@ public class DtbOrdt extends DtbDocOrdT implements EquatableEntityInterface<DtbO
public int hashCode() {
return Objects.hash(getDataOrd(), getGestione(), getNumOrd(), getAcconto(), getActivityId(), getActivityTypeId(), getAspettoBeni(), getCausaleTrasp(), getCodAbi(), getCodAnag(), getCodAuto(), getCodBanc(), getCodBancAzi(), getCodCab(), getCodDgrpArt(), getCodDivi(), getCodEtic(), getCodFornTd(), getCodJcom(), getCodJfas(), getCodMdep(), getCodPaga(), getCodProd(), getCodTcolUi(), getCodTcolUl(), getCodVage(), getCodVage2(), getCodVdes(), getCodVvet(), getCodVvet2(), getCodVzon(), getColliPedana(), getCompilatoDa(), getControllatoDa(), getDataConsProd(), getDataConsProdMax(), getDataEsportazione(), getDataConferma(), getDataInizProd(), getDataInizTrasp(), getDataInsOrd(), getDataOrdRif(), getRifDataOrd(), getDataRicezione(), getDataRifScad(), getDataUltMod(), getDescrEstesaProd(), getDescrizionePaga(), getDescrizioneProd(), getEanFidelity(), getFlagAnnulla(), getFlagEscRoyal(), getFlagEvasoForzato(), getFlagEvasoProd(), getFlagPrzScontati(), getFlagSospeso(), getFlagTipologia(), getGestioneRif(), getItemId(), getListino(), getLivello(), getMezzo(), getModificatoDa(), getNettoMerce(), getNolo(), getNolo2(), getNote(), getNumColli(), getNumCons(), getNumFase(), getNumOrdProvv(), getNumOrdRif(), getRifNumOrd(), getPartitaMag(), getPercEsclStat(), getPersonaRif(), getPeso(), getPorto(), getQtaEvasaProd(), getQtaPrenotataRep(), getQtaProd(), getRapConvProd(), getRfid(), getRifOrd(), getRigaOrdRif(), getSconto1(), getSconto2(), getSconto3(), getSconto4(), getSerie(), getTermCons(), getTipoAnag(), getTotFasi(), getTotImponib(), getTotIva(), getTotMerce(), getTotOmaggi(), getTotProvvig(), getUntMisProd(), getFlagPrzIva(), getNoteConferma(), getCodJflav(), getTarga(), getPostiPallet(), getFlagBudget(), getDataConsRich(), getNoteExport(), getNumCnfProd(), getCodLingua(), getCambio(), getUserName(), getFlagTd(), getGestisciStralciOrdV(), getIdViaggioTestata(), getExplodeKit(), getGestisciOrdLavTx(), getOrdTrasf(), isGeneraOrdLavDaProd());
}
public void clearChilds() {
setDtbOrdr(new ArrayList<>());
setDtbOrds(new ArrayList<>());
setDtbOrdL(new ArrayList<>());
setDtbOrdMacc(new ArrayList<>());
setDtbOrdSteps(new ArrayList<>());
setDtbOrdCq(new ArrayList<>());
setDtbOrdCqr(new ArrayList<>());
setJrlDisOrd(new ArrayList<>());
setDrlOrdAttached(new ArrayList<>());
setArlSchaccOrd(new ArrayList<>());
}
}

View File

@@ -2,10 +2,13 @@ package it.integry.googleCloudApi.controller;
import it.integry.common.var.CommonConstants;
import it.integry.ems.response.ServiceRestResponse;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.googleCloudApi.service.GeocodingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
@@ -13,6 +16,9 @@ import java.math.BigDecimal;
@Scope("request")
public class GeocodingController {
@Autowired
private MultiDBTransactionManager multiDBTransactionManager;
@Autowired
private GeocodingService geocodingService;
@@ -35,7 +41,7 @@ public class GeocodingController {
@RequestParam BigDecimal lat,
@RequestParam BigDecimal lng) throws Exception {
return ServiceRestResponse.createPositiveResponse(geocodingService.getPositionFromCoords(lat, lng));
return ServiceRestResponse.createPositiveResponse(geocodingService.getPositionFromCoords(multiDBTransactionManager, lat, lng));
}
@GetMapping(value = "map/getCoordinatesByCity")

View File

@@ -1,7 +1,8 @@
package it.integry.googleCloudApi.service;
import com.google.maps.GeocodingApi;
import com.google.maps.model.*;
import com.google.maps.model.GeocodingResult;
import com.google.maps.model.Geometry;
import it.integry.ems.service.EntityProcessor;
import it.integry.ems.service.KeyManagerService;
import it.integry.ems.sync.MultiDBTransaction.Connection;
@@ -14,14 +15,12 @@ import it.integry.ems_model.utility.UtilityDB;
import it.integry.googleCloudApi.dto.IndirizzoDTO;
import it.integry.googleCloudApi.utility.GoogleApiUtility;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
@Service
@Scope("request")
public class GeocodingService {
@Autowired
@@ -30,9 +29,6 @@ public class GeocodingService {
@Autowired
public EntityProcessor entityProcessor;
@Autowired
public MultiDBTransactionManager multiDBTransactionManager;
@Autowired
public SetupGest setupGest;
@@ -49,13 +45,13 @@ public class GeocodingService {
return GoogleApiUtility.buildIndirizzoDTO(results);
}
public IndirizzoDTO getPositionFromCoords(BigDecimal lat, BigDecimal lng) throws Exception {
Connection conn = multiDBTransactionManager.getPrimaryConnection();
public IndirizzoDTO getPositionFromCoords(MultiDBTransactionManager multiDBTransactionManager, BigDecimal lat, BigDecimal lng) throws Exception {
Connection connection = multiDBTransactionManager.getPrimaryConnection();
IndirizzoDTO indirizzo;
double formattedLat = lat.setScale(5, RoundingMode.HALF_EVEN).doubleValue();
double formattedLng = lng.setScale(5, RoundingMode.HALF_EVEN).doubleValue();
int distance = setupGest.getSetupInteger(conn, "MAPS", "SETUP", "GEOCODE_PRECISION", 50);
int distance = setupGest.getSetupInteger(connection, "MAPS", "SETUP", "GEOCODE_PRECISION", 50);
String nearbyPointQuery = "SELECT * from ( " +
" SELECT *,(6371392.896 * acos(cos(radians(" + formattedLat + ")) * cos(radians(lat)) * " +
@@ -66,7 +62,7 @@ public class GeocodingService {
"where distance < " + distance +
" ORDER BY distance";
StbPosizioni stbPosizioni = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(conn, nearbyPointQuery, StbPosizioni.class);
StbPosizioni stbPosizioni = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(connection, nearbyPointQuery, StbPosizioni.class);
if (stbPosizioni != null) {
indirizzo = new IndirizzoDTO()

View File

@@ -22,12 +22,7 @@ when
eval(completeRulesEnabled)
$gtbAnag: GtbAnag( insDestinatario == null && operation != OperationType.DELETE )
then
String sql = "SELECT value FROM stb_gest_setup " +
" WHERE stb_gest_setup.gest_name = 'GTB_ANAG' AND " +
"stb_gest_setup.section = 'SETUP' AND " +
"stb_gest_setup.key_section = 'INSERISCI_DEST_CLIE'";
Boolean insDest = ((String) QueryRules.getSingleValue(conn, sql)).equalsIgnoreCase("S");
Boolean insDest = AnagRules.completeSetupInsDest(conn);
modify ( $gtbAnag ) {
setInsDestinatario(insDest)

View File

@@ -338,7 +338,7 @@ rule "checkDeleteMtbColrWithoutDoc"
no-loop
when
eval(checkRulesEnabled)
$entity : MtbColr(operation == OperationType.DELETE && !hasDocument || !hasQuantity)
$entity : MtbColr(operation == OperationType.DELETE && (!hasDocument || !hasQuantity))
then
PackagesRules.checkForAnyColloRif(conn, $entity.getGestione(), $entity.getSerCollo(), $entity.getNumCollo(), $entity.getDataCollo());
end

View File

@@ -7,7 +7,6 @@ import it.integry.ems.activity.dto.UserWorkHoursClockOutRequestDTO;
import it.integry.ems.activity.dto.UserWorkHoursStatusDTO;
import it.integry.ems.exception.PrimaryDatabaseNotPresentException;
import it.integry.ems.service.EntityProcessor;
import it.integry.googleCloudApi.service.GeocodingService;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems.system.service.SystemService;
import it.integry.ems.user.dto.UserDTO;
@@ -21,9 +20,7 @@ import it.integry.ems_model.service.SetupGest;
import it.integry.ems_model.types.OperationType;
import it.integry.ems_model.utility.Query;
import it.integry.ems_model.utility.UtilityDB;
import it.integry.ems_model.utility.UtilityDate;
import it.integry.ems_model.utility.UtilityLocalDate;
import it.integry.googleCloudApi.dto.IndirizzoDTO;
import it.integry.firebase.dto.MessageDTO;
import it.integry.firebase.dto.NotificationDTO;
import it.integry.firebase.dto.android.AndroidConfigDTO;
@@ -31,6 +28,8 @@ import it.integry.firebase.dto.android.AndroidNotificationDTO;
import it.integry.firebase.dto.apns.ApnsConfigDTO;
import it.integry.firebase.dto.apns.ApsDTO;
import it.integry.firebase.service.NotificationService;
import it.integry.googleCloudApi.dto.IndirizzoDTO;
import it.integry.googleCloudApi.service.GeocodingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
@@ -39,9 +38,7 @@ import java.io.IOException;
import java.sql.SQLException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.temporal.ChronoUnit;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
@@ -97,7 +94,7 @@ public class UserWorkHoursService {
jtbRLavt.setOperation(OperationType.INSERT_OR_UPDATE);
final IndirizzoDTO positionFromCoords =
geocodingService.getPositionFromCoords(userWorkHoursClockInRequestDTO.getPositionLatitude(), userWorkHoursClockInRequestDTO.getPositionLongitude());
geocodingService.getPositionFromCoords(multiDBTransactionManager, userWorkHoursClockInRequestDTO.getPositionLatitude(), userWorkHoursClockInRequestDTO.getPositionLongitude());
JtbRLavr jtbRLavr = new JtbRLavr()
.setDaOra(userWorkHoursClockInRequestDTO.getTimestamp() != null ?
@@ -141,7 +138,7 @@ public class UserWorkHoursService {
jtbRLavt.setFlagTrasferta("S");
final IndirizzoDTO positionFromCoords =
geocodingService.getPositionFromCoords(userWorkHoursClockOutRequestDTO.getPositionLatitude(), userWorkHoursClockOutRequestDTO.getPositionLongitude());
geocodingService.getPositionFromCoords(multiDBTransactionManager, userWorkHoursClockOutRequestDTO.getPositionLatitude(), userWorkHoursClockOutRequestDTO.getPositionLongitude());
JtbRLavr jtbRLavr = new JtbRLavr()
.setCodJcom(userWorkHoursClockOutRequestDTO.getCodJcom())

View File

@@ -6,7 +6,6 @@ import it.integry.ems._context.ApplicationContextProvider;
import it.integry.ems.production.agribook.model.*;
import it.integry.ems.response.ServiceRestResponse;
import it.integry.ems.service.EntityProcessor;
import it.integry.googleCloudApi.service.GeocodingService;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems.utility.UtilityFile;
import it.integry.ems_model.entity.MtbDepo;
@@ -16,6 +15,7 @@ import it.integry.ems_model.types.OperationType;
import it.integry.ems_model.utility.UtilityDB;
import it.integry.ems_model.utility.UtilityString;
import it.integry.googleCloudApi.dto.IndirizzoDTO;
import it.integry.googleCloudApi.service.GeocodingService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
@@ -195,7 +195,7 @@ public class AgribookOrderController {
BigDecimal lng = x.getValue().get(0).getLng();
//Creazione posizione con coords
IndirizzoDTO indirizzoDTO = geocodingService.getPositionFromCoords(lat, lng);
IndirizzoDTO indirizzoDTO = geocodingService.getPositionFromCoords(multiDBTransactionManager, lat, lng);
MtbDepoPosizioni matchPosizione = Stream.of(mtbDepoPosizioni)

View File

@@ -6,7 +6,6 @@ import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import it.integry.ems.production.agribook.model.*;
import it.integry.ems.service.EntityProcessor;
import it.integry.googleCloudApi.service.GeocodingService;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems.user.UserSession;
import it.integry.ems.utility.UtilityEntity;
@@ -15,8 +14,9 @@ import it.integry.ems_model.entity.*;
import it.integry.ems_model.service.SetupGest;
import it.integry.ems_model.types.OperationType;
import it.integry.ems_model.utility.*;
import it.integry.googleCloudApi.dto.IndirizzoDTO;
import it.integry.ems_model.utility.dto.PaginatedDTO;
import it.integry.googleCloudApi.dto.IndirizzoDTO;
import it.integry.googleCloudApi.service.GeocodingService;
import org.apache.commons.text.StringSubstitutor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
@@ -1335,7 +1335,7 @@ public class AgribookOrderService {
for (AgribookSaveCoordsDTO saveCoordsDTO : agribookSaveCoordsDTOS) {
// Creazione posizione con coords
IndirizzoDTO indirizzoDTO = geocodingService.getPositionFromCoords(saveCoordsDTO.getLat(), saveCoordsDTO.getLng());
IndirizzoDTO indirizzoDTO = geocodingService.getPositionFromCoords(multiDBTransactionManager, saveCoordsDTO.getLat(), saveCoordsDTO.getLng());
String codMdep = saveCoordsDTO.getCodMdep();

View File

@@ -495,7 +495,7 @@ public class MesProductionControllerV2 {
@PostMapping(value = "ordine/ripianifica")
public @ResponseBody
ServiceRestResponse ripianifica(@RequestBody RipianificaOrdineLavRequestDTO dto) throws Exception {
productionOrdersLifecycleService.ripianificaOrdLav(dto);
productionOrdersLifecycleService.ripianificaOrdLav(multiDBTransactionManager,dto);
return ServiceRestResponse.createPositiveResponse();
}

View File

@@ -353,6 +353,16 @@ public class MesProductionServiceV2 {
));
}
if (lastStep.getDataIniz() != null && lastStep.getDataFine() == null) {
throw new Exception(String.format(
"L'ordine selezionato è già in corso su questa linea. (Gestione %s, data ord. %s, num ord. %d, linea %s)",
gestioneOrd,
CommonConstants.DATE_DMY_SLASHED_FORMATTER.format(dataOrd),
numOrd,
codJfas
));
}
Date dataIniz;
if (dataInizLav == null) {
dataIniz = new Date();

View File

@@ -16,6 +16,7 @@ import it.integry.ems.production.dto.ReopenOrdineLavRequestDTO;
import it.integry.ems.production.event.ProductionOrderClosedEvent;
import it.integry.ems.service.AziendaService;
import it.integry.ems.service.EntityProcessor;
import it.integry.ems.sync.MultiDBTransaction.Connection;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems.utility.UtilityDebug;
import it.integry.ems.utility.UtilityEntity;
@@ -27,11 +28,13 @@ import it.integry.ems_model.utility.*;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.docx4j.org.apache.xpath.operations.Mult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
@@ -347,25 +350,64 @@ public class ProductionOrdersLifecycleService {
}
}
public void ripianificaOrdLav(RipianificaOrdineLavRequestDTO ripianificaOrdineLavRequestDTO) throws Exception {
public void ripianificaOrdLav(MultiDBTransactionManager multiDBTransactionManager, RipianificaOrdineLavRequestDTO ripianificaOrdineLavRequestDTO) throws Exception {
//<editor-fold desc="Retrieve impostazioni e variabili base">
Connection connection = multiDBTransactionManager.getPrimaryConnection();
DtbOrdt ordL = new DtbOrdt(ripianificaOrdineLavRequestDTO.getGestione(), ripianificaOrdineLavRequestDTO.getDataOrd(), ripianificaOrdineLavRequestDTO.getNumOrd());
ordL.setOperation(OperationType.SELECT_OBJECT);
entityProcessor.processEntity(ordL, true, multiDBTransactionManager);
LocalDate dataPianificazione = UtilityLocalDate.isNull(ripianificaOrdineLavRequestDTO.getDataPianificazione(), ripianificaOrdineLavRequestDTO.getDataOrd());
String codJfas = UtilityString.isNull(ripianificaOrdineLavRequestDTO.getCodJfasNew(), ripianificaOrdineLavRequestDTO.getCodJfasOld());
boolean reimpostaLotto = setupGest.getSetupDepoBoolean("PVM", "MONITORAGGIO_LINEE_V2", "REIMPOSTA_LOTTO_ORDINE_RIPIANIFICATO", ordL.getCodMdep());
boolean flagEditedCodJfas = !ripianificaOrdineLavRequestDTO.getCodJfasOld().equalsIgnoreCase(ripianificaOrdineLavRequestDTO.getCodJfasNew());
boolean flagEditedDataOrd = !UtilityLocalDate.isSameDay(ripianificaOrdineLavRequestDTO.getDataOrd(), ripianificaOrdineLavRequestDTO.getDataPianificazione());
//</editor-fold>
if (!flagEditedCodJfas && !flagEditedDataOrd) {
throw new Exception("Nessuna modifica da apportare.");
}
//<editor-fold desc="Cambio data di produzione">
if (flagEditedDataOrd) {
ripianificaDataOrdLav(connection, ordL, ripianificaOrdineLavRequestDTO.getDataPianificazione());
ordL.clearChilds();
ordL.setOldPk(null);
}
//</editor-fold>
//<editor-fold desc="Cambio linea">
if (flagEditedCodJfas) {
ripianificaLineaOrdLav(connection, ordL, codJfas);
}
//</editor-fold>
//<editor-fold desc="Ricalcolo dati ordine di produzione">
DtbOrdr oldRigaProd = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(connection, Query.format(
"SELECT * from dtb_ordr where gestione = {} and data_ord = {} and num_ord = {} and riga_ord = {}",
ordL.getGestioneRif(),
ordL.getDataOrdRif(),
ordL.getNumOrdRif(),
ordL.getRigaOrdRif()
), DtbOrdr.class);
if (oldRigaProd == null)
throw new Exception("Riga ordine di produzione originale non trovata.");
DtbOrdt dtbOrdtP = new DtbOrdt()
.setCodJfas(UtilityString.isNull(ripianificaOrdineLavRequestDTO.getCodJfasNew(), ripianificaOrdineLavRequestDTO.getCodJfasOld()))
.setDataOrd(UtilityLocalDate.localDateToDate(ripianificaOrdineLavRequestDTO.getDataPianificazione() == null ?
ripianificaOrdineLavRequestDTO.getDataOrd() :
ripianificaOrdineLavRequestDTO.getDataPianificazione())
)
.setCodJfas(codJfas)
.setDataOrd(UtilityLocalDate.localDateToDate(dataPianificazione))
.setGestione("A")
.setGestioneRif("A")
.setGeneraOrdLavDaProd(false)
.setOrdTrasf(false);
dtbOrdtP.setOperation(OperationType.SELECT_OBJECT);
dtbOrdtP.setOnlyPkMaster(false);
entityProcessor.processEntity(dtbOrdtP, multiDBTransactionManager);
boolean reimpostaLotto = setupGest.getSetupDepoBoolean("PVM", "MONITORAGGIO_LINEE_V2", "REIMPOSTA_LOTTO_ORDINE_RIPIANIFICATO", dtbOrdtP.getCodMdep());
boolean flagEditedCodJfas = !ripianificaOrdineLavRequestDTO.getCodJfasOld().equalsIgnoreCase(ripianificaOrdineLavRequestDTO.getCodJfasNew());
boolean flagEditedDataOrd = !UtilityLocalDate.isSameDay(ripianificaOrdineLavRequestDTO.getDataOrd(), ripianificaOrdineLavRequestDTO.getDataPianificazione());
entityProcessor.processEntity(dtbOrdtP, true, multiDBTransactionManager);
if (dtbOrdtP.getNumOrd() == null) {
@@ -375,15 +417,15 @@ public class ProductionOrdersLifecycleService {
" FROM dtb_ordt " +
"WHERE EXISTS (SELECT * FROM dtb_ordt orl WHERE dtb_ordt.gestione = orl.gestione_rif AND dtb_ordt.data_ord = orl.data_ord_rif AND " +
"dtb_ordt.num_ord = orl.num_ord_rif and gestione = %s and data_ord = %s and num_ord = %s)",
ripianificaOrdineLavRequestDTO.getGestione(),
ripianificaOrdineLavRequestDTO.getDataOrd(),
ripianificaOrdineLavRequestDTO.getNumOrd()
ordL.getGestione(),
ordL.getDataOrd(),
ordL.getNumOrd()
);
dtbOrdtP = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(multiDBTransactionManager.getPrimaryConnection(), sql, DtbOrdt.class);
dtbOrdtP
.setCodJfas(ripianificaOrdineLavRequestDTO.getCodJfasNew() == null ? dtbOrdtP.getCodJfas() : ripianificaOrdineLavRequestDTO.getCodJfasNew())
.setDataOrd(ripianificaOrdineLavRequestDTO.getDataPianificazione() == null ? dtbOrdtP.getDataOrd() : UtilityLocalDate.localDateToDate(ripianificaOrdineLavRequestDTO.getDataPianificazione()))
.setCodJfas(codJfas)
.setDataOrd(UtilityLocalDate.localDateToDate(dataPianificazione))
.setNumOrd(null)
.setGeneraOrdLavDaProd(false)
.setOrdTrasf(false);
@@ -392,66 +434,46 @@ public class ProductionOrdersLifecycleService {
entityProcessor.processEntity(dtbOrdtP, true, multiDBTransactionManager);
}
String sql =
Query.format("SELECT ISNULL(MAX(riga_ord), 0) + 1 FROM dtb_ordr WHERE gestione = %s AND data_ord = %s AND num_ord = %s",
dtbOrdtP.getGestione(),
dtbOrdtP.getDataOrd(),
dtbOrdtP.getNumOrd());
dtbOrdtP.setOperation(OperationType.UPDATE);
dtbOrdtP.getDtbOrdr().add(oldRigaProd);
Integer rigaOrdProd = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(multiDBTransactionManager.getPrimaryConnection(), sql);
Integer rigaOrdProd = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(multiDBTransactionManager.getPrimaryConnection(), Query.format("SELECT ISNULL(MAX(riga_ord), 0) + 1 FROM dtb_ordr WHERE gestione = %s AND data_ord = %s AND num_ord = %s",
dtbOrdtP.getGestione(),
dtbOrdtP.getDataOrd(),
dtbOrdtP.getNumOrd()));
HashMap<String, Object> oldPk = new HashMap<>();
Date dataOrd = UtilityLocalDate.localDateToDate(ripianificaOrdineLavRequestDTO.getDataOrd());
if (ripianificaOrdineLavRequestDTO.getDataPianificazione() != null &&
!ripianificaOrdineLavRequestDTO.getDataOrd().equals(ripianificaOrdineLavRequestDTO.getDataPianificazione())) {
oldPk.put("dataOrd", ripianificaOrdineLavRequestDTO.getDataOrd());
dataOrd = UtilityLocalDate.localDateToDate(ripianificaOrdineLavRequestDTO.getDataPianificazione());
}
DtbOrdt dtbOrdl = new DtbOrdt()
.setDataOrd(dataOrd)
.setGestione(ripianificaOrdineLavRequestDTO.getGestione())
.setNumOrd(ripianificaOrdineLavRequestDTO.getNumOrd())
oldRigaProd
.setOldPk(new HashMap<String, Object>() {{
put("dataOrd", oldRigaProd.getDataOrd());
put("gestione", oldRigaProd.getGestione());
put("numOrd", oldRigaProd.getNumOrd());
put("rigaOrd", oldRigaProd.getRigaOrd());
}});
oldRigaProd.setRigaOrd(rigaOrdProd)
.setCodJfas(codJfas)
.setDataOrd(dtbOrdtP.getDataOrd())
.setNumOrd(dtbOrdtP.getNumOrd())
.setGestione(dtbOrdtP.getGestione())
.setOperation(OperationType.SUBSTITUTE);
ordL
.setGestioneRif(dtbOrdtP.getGestione())
.setDataOrdRif(dtbOrdtP.getDataOrd())
.setNumOrdRif(dtbOrdtP.getNumOrd())
.setDataConsProd(dataOrd)
.setRigaOrdRif(rigaOrdProd);
if (!oldPk.isEmpty()) {
dtbOrdl.setOldPk(oldPk);
dtbOrdl.setOperation(OperationType.SUBSTITUTE);
} else {
dtbOrdl.setOperation(OperationType.UPDATE);
.setDataConsProd(UtilityLocalDate.localDateToDate(dataPianificazione))
.setRigaOrdRif(rigaOrdProd)
.setDtbOrdtProd(null);
//</editor-fold>
//<editor-fold desc="Altre operazioni">
if (reimpostaLotto) {
ordL.setPartitaMag(EmsRestConstants.NULL);
}
//</editor-fold>
if (reimpostaLotto && (flagEditedCodJfas || flagEditedDataOrd)) {
dtbOrdl.setPartitaMag(EmsRestConstants.NULL);
}
ordL.setOperation(OperationType.UPDATE);
if (!UtilityString.equalsIgnoreCase(ripianificaOrdineLavRequestDTO.getCodJfasNew(), ripianificaOrdineLavRequestDTO.getCodJfasOld())) {
sql =
Query.format(
"SELECT * FROM dtb_ord_steps WHERE gestione = %s AND data_ord = %s AND num_ord = %s ORDER BY data_fine desc",
ripianificaOrdineLavRequestDTO.getGestione(),
ripianificaOrdineLavRequestDTO.getDataOrd(),
ripianificaOrdineLavRequestDTO.getNumOrd());
DtbOrdSteps lastStep = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(multiDBTransactionManager.getPrimaryConnection(), sql, DtbOrdSteps.class);
lastStep.setFlagStepAttivo("N");
lastStep.setOperation(OperationType.INSERT_OR_UPDATE);
dtbOrdl.getDtbOrdSteps().add(lastStep);
DtbOrdSteps dtbOrdSteps = (DtbOrdSteps) lastStep.deepClone();
dtbOrdSteps
.setCodJfas(ripianificaOrdineLavRequestDTO.getCodJfasNew())
.setIdRiga(0)
.setDataIniz(new Date())
.setDataFine(new Date())
.setFlagStepAttivo("S");
dtbOrdSteps.setOperation(OperationType.INSERT);
dtbOrdl.getDtbOrdSteps().add(dtbOrdSteps);
}
entityProcessor.processEntity(dtbOrdl, true, multiDBTransactionManager);
entityProcessor.processEntity(dtbOrdtP, true, multiDBTransactionManager);
entityProcessor.processEntity(ordL, true, multiDBTransactionManager);
}
@@ -484,4 +506,39 @@ public class ProductionOrdersLifecycleService {
throw e;
}
}
private void ripianificaDataOrdLav(Connection connection, DtbOrdt ordLav, LocalDate dataPianificazione) throws Exception {
HashMap<String, Object> oldPk = new HashMap<>();
oldPk.put("dataOrd", ordLav.getDataOrd());
ordLav
.setDataOrd(UtilityLocalDate.localDateToDate(dataPianificazione))
.setOldPk(oldPk);
ordLav.setOperation(OperationType.SUBSTITUTE);
entityProcessor.processEntity(ordLav, true, multiDBTransactionManager);
}
private void ripianificaLineaOrdLav(Connection connection, DtbOrdt dtbOrdt, String codJfas) throws Exception {
String sql =
Query.format(
"SELECT * FROM dtb_ord_steps WHERE gestione = %s AND data_ord = %s AND num_ord = %s ORDER BY data_fine desc, id_step DESC, id_riga DESC",
dtbOrdt.getGestione(),
dtbOrdt.getDataOrd(),
dtbOrdt.getNumOrd());
DtbOrdSteps lastStep = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(multiDBTransactionManager.getPrimaryConnection(), sql, DtbOrdSteps.class);
lastStep.setFlagStepAttivo("N");
lastStep.setOperation(OperationType.INSERT_OR_UPDATE);
dtbOrdt.getDtbOrdSteps().add(lastStep);
DtbOrdSteps dtbOrdSteps = (DtbOrdSteps) lastStep.deepClone();
dtbOrdSteps
.setCodJfas(codJfas)
.setIdRiga(0)
.setDataIniz(new Date())
.setDataFine(new Date())
.setFlagStepAttivo("S");
dtbOrdSteps.setOperation(OperationType.INSERT);
dtbOrdt.getDtbOrdSteps().add(dtbOrdSteps);
}
}

View File

@@ -2,6 +2,8 @@ package it.integry.ems.retail.wms.Utility;
import com.annimon.stream.Optional;
import com.annimon.stream.Stream;
import it.integry.ems._context.ApplicationContextProvider;
import it.integry.ems.dynamic_cache.EntityCacheComponent;
import it.integry.ems.exception.PrimaryDatabaseNotPresentException;
import it.integry.ems.javabeans.RequestDataDTO;
import it.integry.ems.retail.wms.dto.InsertUDCRowRequestDTO;
@@ -348,15 +350,12 @@ public class WMSUtility {
public static List<MtbAart> getArticoliByCodMarts(List<String> codMarts, Connection connection) throws Exception {
if (codMarts == null || codMarts.isEmpty()) return null;
String query =
"SELECT DISTINCT mtb_aart.*"
+ " FROM mtb_aart "
+ " WHERE cod_mart IN (" + UtilityQuery.concatStringFieldsWithSeparator(codMarts, ",") + ")";
final EntityCacheComponent entityCacheComponent = ApplicationContextProvider.getApplicationContext().getBean(EntityCacheComponent.class);
List<MtbAart> listMtbAart = entityCacheComponent.getCachedEntitiesList(
connection.getIntegryCustomerDB(), MtbAart.ENTITY, x -> codMarts.parallelStream().anyMatch(y -> y.equalsIgnoreCase(x.getCodMart())));
List<MtbAart> listMtbAart = UtilityDB.executeSimpleQueryDTO(connection, query, MtbAart.class);
List<MtbAartBarCode> barCodeFromCod = getBarCodeFromCod(codMarts, connection);
List<MtbAartBarCode> barCodeFromCod = getAlternativeMtbAartBarCodes(codMarts, connection);
if (listMtbAart != null && !listMtbAart.isEmpty()) {
List<String> untMisStrings = listMtbAart.stream()
@@ -399,9 +398,18 @@ public class WMSUtility {
return mtbUntMis != null ? mtbUntMis : new ArrayList<>();
}
public static List<MtbAartBarCode> getBarCodeFromCod(List<String> codMart, Connection conn) throws Exception {
String sql = "SELECT * FROM mtb_aart_bar_code WHERE cod_mart IN (" + UtilityQuery.concatStringFieldsWithSeparator(codMart, ",") + ")";
final List<MtbAartBarCode> barCodeList = UtilityDB.executeSimpleQueryDTO(conn, sql, MtbAartBarCode.class);
public static List<MtbAartBarCode> getAlternativeMtbAartBarCodes(List<String> codMarts, Connection conn) {
codMarts = codMarts.stream()
.distinct().collect(Collectors.toList());
final EntityCacheComponent entityCacheComponent = ApplicationContextProvider.getApplicationContext().getBean(EntityCacheComponent.class);
List<String> finalCodMarts = codMarts;
List<MtbAartBarCode> barCodeList = entityCacheComponent.getCachedEntitiesList(
conn.getIntegryCustomerDB(),
MtbAartBarCode.ENTITY,
x -> finalCodMarts.stream().anyMatch(y -> y.equalsIgnoreCase(x.getCodMart())));
return barCodeList != null ? barCodeList : new ArrayList<>();
}

View File

@@ -6,6 +6,7 @@ import it.integry.ems.sync.MultiDBTransaction.Connection;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems.system.exchange.service.structure.ExchangeImportDataManagerService;
import it.integry.ems.system.exchange.service.structure.ExchangeImportSchemaManagerService;
import it.integry.ems.task.TaskExecutorService;
import it.integry.ems_model.base.EquatableEntityInterface;
import it.integry.ems_model.entity.GtbAnag;
import it.integry.ems_model.entity.VtbClie;
@@ -19,9 +20,11 @@ import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.Callable;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
@@ -45,6 +48,8 @@ public class ExchangeClientiImportService {
@Autowired
private SetupGest setupGest;
@Autowired
private TaskExecutorService taskExecutorService;
public void importClienti(MultiDBTransactionManager internalMultiDb, MultiDBTransactionManager exchangeMultiDb, RequestDataDTO requestDataDTO) throws Exception {
@@ -65,63 +70,80 @@ public class ExchangeClientiImportService {
final Exception[] firstExceptionToThrow = {null};
List<Callable<Void>> callableList = new ArrayList<>();
for (String diacod : diacodsToSync) {
final List<GtbAnag> exchangeImportedData = retrieveClienti(
exchangeMultiDb.getPrimaryConnection(),
true, false, diacod);
final List<GtbAnag> exchangeUpdatedData = retrieveClienti(
exchangeMultiDb.getPrimaryConnection(),
false, useTempTable, diacod);
callableList.add(() -> {
try (MultiDBTransactionManager internalMultiDbTask = new MultiDBTransactionManager(internalMultiDb.getPrimaryConnection().getProfileName(), false);
MultiDBTransactionManager exchangeMultiDbTask = new MultiDBTransactionManager(exchangeMultiDb.getPrimaryConnection().getProfileName(), false)) {
List<EquatableEntityInterface> allData = exchangeImportDataManagerService
.runSync(GtbAnag.class, exchangeImportedData, exchangeUpdatedData);
final List<GtbAnag> exchangeImportedData = retrieveClienti(
exchangeMultiDbTask.getPrimaryConnection(),
true, false, diacod);
allData.parallelStream()
.map(x -> (GtbAnag) x)
.forEach(x -> {
if (x.getOperation() == OperationType.DELETE)
x.setOperation(OperationType.UPDATE);
final List<GtbAnag> exchangeUpdatedData = retrieveClienti(
exchangeMultiDbTask.getPrimaryConnection(),
false, useTempTable, diacod);
if (x.getVtbClie() != null) {
if (x.getVtbClie().getOperation() == OperationType.DELETE) {
x.getVtbClie().setFlagStato("I")
.setOperation(OperationType.UPDATE);
x.setOperation(OperationType.UPDATE);
} else {
x.getVtbClie().setFlagStato("A");
x.setOperation(x.getOperation() == OperationType.INSERT ? OperationType.INSERT_OR_UPDATE : x.getOperation());
}
List<EquatableEntityInterface> allData = exchangeImportDataManagerService
.runSync(GtbAnag.class, exchangeImportedData, exchangeUpdatedData);
allData.parallelStream()
.map(x -> (GtbAnag) x)
.forEach(x -> {
if (x.getOperation() == OperationType.DELETE)
x.setOperation(OperationType.UPDATE);
if (x.getVtbClie() != null) {
if (x.getVtbClie().getOperation() == OperationType.DELETE) {
x.getVtbClie().setFlagStato("I")
.setOperation(OperationType.UPDATE);
x.setOperation(OperationType.UPDATE);
} else {
x.getVtbClie().setFlagStato("A");
x.setOperation(x.getOperation() == OperationType.INSERT ? OperationType.INSERT_OR_UPDATE : x.getOperation());
}
}
});
if (allData.isEmpty())
dataCount.addAndGet(-exchangeUpdatedData.size());
for (EquatableEntityInterface<?> dataToSave : allData) {
((GtbAnag) dataToSave).setPrecode(precode);
logger.debug("Importati {} clienti di {}", importedCounter.incrementAndGet(), dataCount.get());
try {
entityProcessor.processEntity(dataToSave, true, true, EXCHANGE_USER, internalMultiDbTask, requestDataDTO);
singleUpdateImported(exchangeMultiDbTask.getPrimaryConnection(), (GtbAnag) dataToSave, useTempTable);
internalMultiDbTask.commitAll();
exchangeMultiDbTask.commitAll();
} catch (Exception ex) {
internalMultiDbTask.rollbackAll();
exchangeMultiDbTask.commitAll();
GtbAnag gtbAnagError = (GtbAnag) dataToSave;
Exception newException = new EntityException("Errore durante l'importazione del cliente [" +
"cod_anag: " + gtbAnagError.getCodAnag() + "]", ex);
if (firstExceptionToThrow[0] == null) firstExceptionToThrow[0] = newException;
logger.error(newException);
}
});
for (EquatableEntityInterface dataToSave : allData) {
((GtbAnag) dataToSave).setPrecode(precode);
logger.debug("Importati {} clienti di {}", importedCounter.incrementAndGet(), dataCount.get());
try {
entityProcessor.processEntity(dataToSave, true, true, EXCHANGE_USER, internalMultiDb, requestDataDTO);
singleUpdateImported(exchangeMultiDb.getPrimaryConnection(), (GtbAnag) dataToSave, useTempTable);
internalMultiDb.commitAll();
exchangeMultiDb.commitAll();
} catch (Exception ex) {
internalMultiDb.rollbackAll();
exchangeMultiDb.commitAll();
GtbAnag gtbAnagError = (GtbAnag) dataToSave;
Exception newException = new EntityException("Errore durante l'importazione del cliente [" +
"cod_anag: " + gtbAnagError.getCodAnag() + "]", ex);
if (firstExceptionToThrow[0] == null) firstExceptionToThrow[0] = newException;
logger.error(newException);
}
}
}
return null;
});
}
taskExecutorService.executeTasks(callableList);
if (firstExceptionToThrow[0] != null) throw firstExceptionToThrow[0];
} finally {
@@ -172,7 +194,8 @@ public class ExchangeClientiImportService {
}
private void singleUpdateImported(Connection connection, GtbAnag importedData, boolean useTempTable) throws Exception {
private void singleUpdateImported(Connection connection, GtbAnag importedData, boolean useTempTable) throws
Exception {
final HashMap<String, Object> importedKey = new HashMap<String, Object>() {{
put("cod_anag", importedData.getCodAnag());
}};

View File

@@ -10,7 +10,6 @@ import it.integry.ems.report.dto.PairsDTO;
import it.integry.ems.response.EsitoType;
import it.integry.ems.response.ServiceRestResponse;
import it.integry.ems.service.EntityProcessor;
import it.integry.googleCloudApi.service.GeocodingService;
import it.integry.ems.service.ReportProcessor;
import it.integry.ems.service.exception.EmptyReportException;
import it.integry.ems.sync.MultiDBTransaction.Connection;
@@ -23,8 +22,12 @@ import it.integry.ems_model.entity.JtbRLavr;
import it.integry.ems_model.entity.JtbRLavt;
import it.integry.ems_model.entity.JtbRicorrenze;
import it.integry.ems_model.types.OperationType;
import it.integry.ems_model.utility.*;
import it.integry.ems_model.utility.UtilityDB;
import it.integry.ems_model.utility.UtilityString;
import it.integry.ems_model.utility.UtilityXML;
import it.integry.ems_model.utility.UtilityZip;
import it.integry.googleCloudApi.dto.IndirizzoDTO;
import it.integry.googleCloudApi.service.GeocodingService;
import org.apache.commons.codec.binary.Base64;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -40,8 +43,8 @@ import java.io.File;
import java.io.InputStream;
import java.math.BigDecimal;
import java.net.URL;
import java.sql.Date;
import java.sql.*;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.*;
@@ -625,7 +628,7 @@ public class UtilityService {
try {
double lat = rs.getDouble("lat");
double lng = rs.getDouble("lng");
IndirizzoDTO address = geocodingService.getPositionFromCoords(BigDecimal.valueOf(lat), BigDecimal.valueOf(lng));
IndirizzoDTO address = geocodingService.getPositionFromCoords(multiDBTransactionManager, BigDecimal.valueOf(lat), BigDecimal.valueOf(lng));
if (address == null) {
logger.debug("nessun indirizzo trovato per le coordinate : [ " + lat + " , " + lng + " ]");
continue;