From 7b09900a1f421246a9cda85513109425caf27d80 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Fri, 26 Sep 2025 12:21:23 +0200 Subject: [PATCH 01/13] [Magazzino Automatico] Create entity per le missioni e servizi base --- .../model/Migration_20250925103840.java | 61 ++++++ .../java/it/integry/ems/user/UserSession.java | 20 +- .../ems_model/entity/MtbMissioneMagAuto.java | 99 +++++++++ .../entity/MtbMissioneMagAutoDet.java | 190 ++++++++++++++++++ .../controller/InventarioController.java | 1 - ...MissioniMagazzinoAutomaticoController.java | 67 ++++++ ...MissioneMagazzinoAutomaticoRequestDTO.java | 15 ++ ...issioneMagazzinoAutomaticoResponseDTO.java | 14 ++ .../dto/MissioneMagazzinoAutomaticoDTO.java | 71 +++++++ .../MissioneMagazzinoAutomaticoRowDTO.java | 140 +++++++++++++ .../MissioniMagazzinoAutomaticoService.java | 47 +++++ .../MissioniMagazzinoAutomaticoUtils.java | 70 +++++++ 12 files changed, 793 insertions(+), 2 deletions(-) create mode 100644 ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250925103840.java create mode 100644 ems-core/src/main/java/it/integry/ems_model/entity/MtbMissioneMagAuto.java create mode 100644 ems-core/src/main/java/it/integry/ems_model/entity/MtbMissioneMagAutoDet.java create mode 100644 ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/controller/MissioniMagazzinoAutomaticoController.java create mode 100644 ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/CreateMissioneMagazzinoAutomaticoRequestDTO.java create mode 100644 ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/CreateMissioneMagazzinoAutomaticoResponseDTO.java create mode 100644 ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoDTO.java create mode 100644 ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoRowDTO.java create mode 100644 ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/MissioniMagazzinoAutomaticoService.java create mode 100644 ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/utils/MissioniMagazzinoAutomaticoUtils.java diff --git a/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250925103840.java b/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250925103840.java new file mode 100644 index 0000000000..94e4926e1e --- /dev/null +++ b/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250925103840.java @@ -0,0 +1,61 @@ +package it.integry.ems.migration.model; + +import it.integry.ems.migration._base.BaseMigration; +import it.integry.ems.migration._base.MigrationModelInterface; + +public class Migration_20250925103840 extends BaseMigration implements MigrationModelInterface { + + @Override + public void up() throws Exception { + if (isHistoryDB()) + return; + + + String sqlCreateMaster = "CREATE TABLE dbo.mtb_missione_mag_auto\n" + + "(\n" + + " id BIGINT IDENTITY\n" + + " CONSTRAINT mtb_missione_mag_auto_pk\n" + + " PRIMARY KEY,\n" + + " cod_cmac VARCHAR(20) NOT NULL\n" + + " CONSTRAINT mtb_missione_mag_auto_ctb_amac_cod_cmac_fk\n" + + " REFERENCES dbo.ctb_amac,\n" + + " created_by VARCHAR(40) NOT NULL\n" + + " CONSTRAINT mtb_missione_mag_auto_stb_user_user_name_fk\n" + + " REFERENCES dbo.stb_user,\n" + + " created_at DATETIME DEFAULT GETDATE() NOT NULL\n" + + ")"; + + String sqlCreateDetail = "CREATE TABLE dbo.mtb_missione_mag_auto_det\n" + + "(\n" + + " id BIGINT IDENTITY\n" + + " CONSTRAINT mtb_missione_mag_auto_det_pk\n" + + " PRIMARY KEY,\n" + + " parent_id BIGINT NOT NULL\n" + + " CONSTRAINT mtb_missione_mag_auto_det_mtb_missione_mag_auto_id_fk\n" + + " REFERENCES dbo.mtb_missione_mag_auto (id),\n" + + " sscc VARCHAR(18),\n" + + " cod_mart VARCHAR(15)\n" + + " CONSTRAINT mtb_missione_mag_auto_det_mtb_aart_cod_mart_fk\n" + + " REFERENCES dbo.mtb_aart,\n" + + " partita_mag VARCHAR(20),\n" + + " cod_jcom VARCHAR(10)\n" + + " CONSTRAINT mtb_missione_mag_auto_det_jtb_comt_cod_jcom_fk\n" + + " REFERENCES dbo.jtb_comt,\n" + + " posizione_in VARCHAR(40),\n" + + " posizione_out VARCHAR(40),\n" + + " error_message VARCHAR(MAX),\n" + + " completed BIT DEFAULT 0 NOT NULL,\n" + + " skipped BIT DEFAULT 0 NOT NULL,\n" + + " created_at DATETIME DEFAULT GETDATE() NOT NULL,\n" + + " updated_at DATETIME DEFAULT GETDATE() NOT NULL,\n" + + " CONSTRAINT mtb_missione_mag_auto_det_mtb_partita_mag_cod_mart_partita_mag_fk\n" + + " FOREIGN KEY (cod_mart, partita_mag) REFERENCES dbo.mtb_partita_mag\n" + + ")"; + + executeStatement(sqlCreateMaster, sqlCreateDetail); + } + + @Override + public void down() throws Exception { + } +} \ No newline at end of file diff --git a/ems-core/src/main/java/it/integry/ems/user/UserSession.java b/ems-core/src/main/java/it/integry/ems/user/UserSession.java index 27752a5331..bf8226046f 100644 --- a/ems-core/src/main/java/it/integry/ems/user/UserSession.java +++ b/ems-core/src/main/java/it/integry/ems/user/UserSession.java @@ -33,7 +33,7 @@ public class UserSession { if(currentUser != null) currentUserDepo = UtilityUser.getDefaultUserDepo(multiDBTransactionManager, currentUser); } catch (Exception ex) { - logger.trace(UserSession.class.getName() + ": errore durante l'inizializzazione", ex); + //logger.trace(UserSession.class.getName() + ": errore durante l'inizializzazione", ex); } } @@ -60,4 +60,22 @@ public class UserSession { public MtbDepo getDefaultDepo() { return currentUserDepo; } + + public void checkUser() throws Exception { + if (currentUser == null) { + throw new Exception("Utente non trovato"); + } + + if (!isAttivo()) { + throw new Exception("Utente " + getUsername() + " non riconoscuto!"); + } + } + + public void checkUserDepo() throws Exception { + checkUser(); + + if (currentUserDepo == null) { + throw new Exception("Deposito non trovato per l'utente " + getUsername()); + } + } } diff --git a/ems-core/src/main/java/it/integry/ems_model/entity/MtbMissioneMagAuto.java b/ems-core/src/main/java/it/integry/ems_model/entity/MtbMissioneMagAuto.java new file mode 100644 index 0000000000..9b533f650f --- /dev/null +++ b/ems-core/src/main/java/it/integry/ems_model/entity/MtbMissioneMagAuto.java @@ -0,0 +1,99 @@ +package it.integry.ems_model.entity; + +import com.fasterxml.jackson.annotation.JsonTypeName; +import it.integry.common.var.CommonConstants; +import it.integry.ems_model.annotation.*; +import it.integry.ems_model.base.EntityBase; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.kie.api.definition.type.PropertyReactive; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Master() +@PropertyReactive() +@Table(value = MtbMissioneMagAuto.ENTITY) +@JsonTypeName(value = MtbMissioneMagAuto.ENTITY) +public class MtbMissioneMagAuto extends EntityBase { + + public final static String ENTITY = "mtb_missione_mag_auto"; + + private final static Long serialVersionUID = 1L; + + private final static Logger logger = LogManager.getLogger(); + + public MtbMissioneMagAuto() { + super(logger); + } + + @PK() + @Identity() + @SqlField(value = "id", nullable = false) + private Long id; + + @SqlField(value = "cod_cmac", maxLength = 20, nullable = false) + @FK(tableName = CtbAmac.ENTITY, columnName = "cod_cmac") + private String codCmac; + + @SqlField(value = "created_by", maxLength = 40, nullable = false) + @FK(tableName = StbUser.ENTITY, columnName = "user_name") + private String createdBy; + + @SqlField(value = "created_at", nullable = false, defaultObjectValue = CommonConstants.TIMESTAMP) + private LocalDateTime createdAt; + + @EntityChild() + private List mtbMissioneMagAutoDet = new ArrayList<>(); + + public Long getId() { + return id; + } + + public MtbMissioneMagAuto setId(Long id) { + this.id = id; + return this; + } + + public String getCodCmac() { + return codCmac; + } + + public MtbMissioneMagAuto setCodCmac(String codCmac) { + this.codCmac = codCmac; + return this; + } + + public String getCreatedBy() { + return createdBy; + } + + public MtbMissioneMagAuto setCreatedBy(String createdBy) { + this.createdBy = createdBy; + return this; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public MtbMissioneMagAuto setCreatedAt(LocalDateTime createdAt) { + this.createdAt = createdAt; + return this; + } + + public List getMtbMissioneMagAutoDet() { + return mtbMissioneMagAutoDet; + } + + public MtbMissioneMagAuto setMtbMissioneMagAutoDet(List mtbMissioneMagAutoDet) { + this.mtbMissioneMagAutoDet = mtbMissioneMagAutoDet; + return this; + } + + protected void deleteChilds() throws Exception { + MtbMissioneMagAutoDet mtbMissioneMagAutoDet = new MtbMissioneMagAutoDet(); + mtbMissioneMagAutoDet.deleteAllEntities(connection, this); + } +} diff --git a/ems-core/src/main/java/it/integry/ems_model/entity/MtbMissioneMagAutoDet.java b/ems-core/src/main/java/it/integry/ems_model/entity/MtbMissioneMagAutoDet.java new file mode 100644 index 0000000000..11ed3943ba --- /dev/null +++ b/ems-core/src/main/java/it/integry/ems_model/entity/MtbMissioneMagAutoDet.java @@ -0,0 +1,190 @@ +package it.integry.ems_model.entity; + +import com.fasterxml.jackson.annotation.JsonTypeName; +import it.integry.common.var.CommonConstants; +import it.integry.ems_model.annotation.*; +import it.integry.ems_model.base.EntityBase; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.kie.api.definition.type.PropertyReactive; + +import java.time.LocalDateTime; + +@PropertyReactive() +@Table(value = MtbMissioneMagAutoDet.ENTITY) +@JsonTypeName(value = MtbMissioneMagAutoDet.ENTITY) +public class MtbMissioneMagAutoDet extends EntityBase { + + public final static String ENTITY = "mtb_missione_mag_auto_det"; + + private final static Long serialVersionUID = 1L; + + private final static Logger logger = LogManager.getLogger(); + + public MtbMissioneMagAutoDet() { + super(logger); + } + + @PK() + @Identity() + @SqlField(value = "id", nullable = false) + private Long id; + + @SqlField(value = "parent_id", nullable = false) + @FK(tableName = MtbMissioneMagAuto.ENTITY, columnName = "id") + private Long parentId; + + @SqlField(value = "sscc", maxLength = 18, nullable = true) + private String sscc; + + @SqlField(value = "cod_mart", maxLength = 15, nullable = true) + @FK(tableName = MtbAart.ENTITY, columnName = "cod_mart") + @FK(tableName = MtbPartitaMag.ENTITY, columnName = "cod_mart") + private String codMart; + + @SqlField(value = "partita_mag", maxLength = 20, nullable = true) + @FK(tableName = MtbPartitaMag.ENTITY, columnName = "partita_mag") + private String partitaMag; + + @SqlField(value = "cod_jcom", maxLength = 10, nullable = true) + @FK(tableName = JtbComt.ENTITY, columnName = "cod_jcom") + private String codJcom; + + @SqlField(value = "posizione_in", maxLength = 40, nullable = true) + private String posizioneIn; + + @SqlField(value = "posizione_out", maxLength = 40, nullable = true) + private String posizioneOut; + + @SqlField(value = "error_message", maxLength = -1, nullable = true) + private String errorMessage; + + @SqlField(value = "completed", nullable = false) + private boolean completed; + + @SqlField(value = "skipped", nullable = false) + private boolean skipped; + + @SqlField(value = "created_at", nullable = false, defaultObjectValue = CommonConstants.TIMESTAMP) + private LocalDateTime createdAt; + + @SqlField(value = "updated_at", nullable = false, defaultObjectValue = CommonConstants.TIMESTAMP) + private LocalDateTime updatedAt; + + public Long getId() { + return id; + } + + public MtbMissioneMagAutoDet setId(Long id) { + this.id = id; + return this; + } + + public Long getParentId() { + return parentId; + } + + public MtbMissioneMagAutoDet setParentId(Long parentId) { + this.parentId = parentId; + return this; + } + + public String getSscc() { + return sscc; + } + + public MtbMissioneMagAutoDet setSscc(String sscc) { + this.sscc = sscc; + return this; + } + + public String getCodMart() { + return codMart; + } + + public MtbMissioneMagAutoDet setCodMart(String codMart) { + this.codMart = codMart; + return this; + } + + public String getPartitaMag() { + return partitaMag; + } + + public MtbMissioneMagAutoDet setPartitaMag(String partitaMag) { + this.partitaMag = partitaMag; + return this; + } + + public String getCodJcom() { + return codJcom; + } + + public MtbMissioneMagAutoDet setCodJcom(String codJcom) { + this.codJcom = codJcom; + return this; + } + + public String getPosizioneIn() { + return posizioneIn; + } + + public MtbMissioneMagAutoDet setPosizioneIn(String posizioneIn) { + this.posizioneIn = posizioneIn; + return this; + } + + public String getPosizioneOut() { + return posizioneOut; + } + + public MtbMissioneMagAutoDet setPosizioneOut(String posizioneOut) { + this.posizioneOut = posizioneOut; + return this; + } + + public String getErrorMessage() { + return errorMessage; + } + + public MtbMissioneMagAutoDet setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + return this; + } + + public boolean isCompleted() { + return completed; + } + + public MtbMissioneMagAutoDet setCompleted(boolean completed) { + this.completed = completed; + return this; + } + + public boolean isSkipped() { + return skipped; + } + + public MtbMissioneMagAutoDet setSkipped(boolean skipped) { + this.skipped = skipped; + return this; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public MtbMissioneMagAutoDet setCreatedAt(LocalDateTime createdAt) { + this.createdAt = createdAt; + return this; + } + + public LocalDateTime getUpdatedAt() { + return updatedAt; + } + + public MtbMissioneMagAutoDet setUpdatedAt(LocalDateTime updatedAt) { + this.updatedAt = updatedAt; + return this; + } +} diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/controller/InventarioController.java b/ems-engine/src/main/java/it/integry/ems/logistic/controller/InventarioController.java index 1a601e254e..9741385635 100644 --- a/ems-engine/src/main/java/it/integry/ems/logistic/controller/InventarioController.java +++ b/ems-engine/src/main/java/it/integry/ems/logistic/controller/InventarioController.java @@ -17,7 +17,6 @@ import javax.servlet.http.HttpServletRequest; @RestController @Scope("request") - public class InventarioController { private final Logger logger = LogManager.getLogger(); @Autowired diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/controller/MissioniMagazzinoAutomaticoController.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/controller/MissioniMagazzinoAutomaticoController.java new file mode 100644 index 0000000000..aa34c9f383 --- /dev/null +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/controller/MissioniMagazzinoAutomaticoController.java @@ -0,0 +1,67 @@ +package it.integry.ems.logistic.missioni.magazzino_automatico.controller; + +import it.integry.common.var.CommonConstants; +import it.integry.ems.javabeans.RequestDataDTO; +import it.integry.ems.logistic.missioni.magazzino_automatico.dto.CreateMissioneMagazzinoAutomaticoRequestDTO; +import it.integry.ems.logistic.missioni.magazzino_automatico.dto.CreateMissioneMagazzinoAutomaticoResponseDTO; +import it.integry.ems.logistic.missioni.magazzino_automatico.service.MissioniMagazzinoAutomaticoService; +import it.integry.ems.response.ServiceRestResponse; +import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager; +import it.integry.ems.user.UserSession; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.context.annotation.Scope; +import org.springframework.web.bind.annotation.*; + +@RestController +@Scope("request") +@RequestMapping("missioni/magazzino-automatico") +public class MissioniMagazzinoAutomaticoController { + + private final Logger logger = LogManager.getLogger(); + + + private final MissioniMagazzinoAutomaticoService missioniMagazzinoAutomaticoService; + private final MultiDBTransactionManager multiDBTransactionManager; + private final RequestDataDTO requestDataDTO; + private final UserSession userSession; + + public MissioniMagazzinoAutomaticoController(MissioniMagazzinoAutomaticoService missioniMagazzinoAutomaticoService, MultiDBTransactionManager multiDBTransactionManager, RequestDataDTO requestDataDTO, UserSession userSession) { + this.missioniMagazzinoAutomaticoService = missioniMagazzinoAutomaticoService; + this.multiDBTransactionManager = multiDBTransactionManager; + this.requestDataDTO = requestDataDTO; + this.userSession = userSession; + } + + + @GetMapping(value = "") + public @ResponseBody + ServiceRestResponse retrieve(@RequestParam(CommonConstants.PROFILE_DB) String profileDB, + @RequestParam(required = false, defaultValue = "true") boolean onlyPending) throws Exception { + + missioniMagazzinoAutomaticoService.retrieve(multiDBTransactionManager, onlyPending); + + + return ServiceRestResponse.createPositiveResponse(); + } + + + @PostMapping(value = "create") + public @ResponseBody + ServiceRestResponse create(@RequestParam(CommonConstants.PROFILE_DB) String profileDB, + @RequestBody CreateMissioneMagazzinoAutomaticoRequestDTO requestBody) throws Exception { + userSession.checkUser(); + + if (requestBody.getData() == null) + throw new IllegalArgumentException("Request body data is null"); + + long missioneId = missioniMagazzinoAutomaticoService.createMissione(multiDBTransactionManager, + requestDataDTO.getUsername(), + requestBody.getData()); + + + return ServiceRestResponse.createPositiveResponse( + new CreateMissioneMagazzinoAutomaticoResponseDTO(missioneId)); + } + +} diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/CreateMissioneMagazzinoAutomaticoRequestDTO.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/CreateMissioneMagazzinoAutomaticoRequestDTO.java new file mode 100644 index 0000000000..42dbb7314f --- /dev/null +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/CreateMissioneMagazzinoAutomaticoRequestDTO.java @@ -0,0 +1,15 @@ +package it.integry.ems.logistic.missioni.magazzino_automatico.dto; + +public class CreateMissioneMagazzinoAutomaticoRequestDTO { + + private MissioneMagazzinoAutomaticoDTO data; + + public MissioneMagazzinoAutomaticoDTO getData() { + return data; + } + + public CreateMissioneMagazzinoAutomaticoRequestDTO setData(MissioneMagazzinoAutomaticoDTO data) { + this.data = data; + return this; + } +} diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/CreateMissioneMagazzinoAutomaticoResponseDTO.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/CreateMissioneMagazzinoAutomaticoResponseDTO.java new file mode 100644 index 0000000000..96d3739c13 --- /dev/null +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/CreateMissioneMagazzinoAutomaticoResponseDTO.java @@ -0,0 +1,14 @@ +package it.integry.ems.logistic.missioni.magazzino_automatico.dto; + +public class CreateMissioneMagazzinoAutomaticoResponseDTO { + + private final long id; + + public CreateMissioneMagazzinoAutomaticoResponseDTO(long id) { + this.id = id; + } + + public long getId() { + return id; + } +} diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoDTO.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoDTO.java new file mode 100644 index 0000000000..6a1988bd4c --- /dev/null +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoDTO.java @@ -0,0 +1,71 @@ +package it.integry.ems.logistic.missioni.magazzino_automatico.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +import java.time.LocalDateTime; +import java.util.List; + +public class MissioneMagazzinoAutomaticoDTO { + + private Long id; + private String codCmac; + + @JsonIgnore + private transient String createdBy; + @JsonIgnore + private LocalDateTime createdAt; + + private List rows; + + public MissioneMagazzinoAutomaticoDTO() { + } + + public MissioneMagazzinoAutomaticoDTO(Long id) { + this.id = id; + } + + public Long getId() { + return id; + } + + private MissioneMagazzinoAutomaticoDTO setId(Long id) { + this.id = id; + return this; + } + + public String getCodCmac() { + return codCmac; + } + + public MissioneMagazzinoAutomaticoDTO setCodCmac(String codCmac) { + this.codCmac = codCmac; + return this; + } + + public String getCreatedBy() { + return createdBy; + } + + public MissioneMagazzinoAutomaticoDTO setCreatedBy(String createdBy) { + this.createdBy = createdBy; + return this; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public MissioneMagazzinoAutomaticoDTO setCreatedAt(LocalDateTime createdAt) { + this.createdAt = createdAt; + return this; + } + + public List getRows() { + return rows; + } + + public MissioneMagazzinoAutomaticoDTO setRows(List rows) { + this.rows = rows; + return this; + } +} diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoRowDTO.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoRowDTO.java new file mode 100644 index 0000000000..0150f90f6e --- /dev/null +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoRowDTO.java @@ -0,0 +1,140 @@ +package it.integry.ems.logistic.missioni.magazzino_automatico.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +import java.time.LocalDateTime; + +public class MissioneMagazzinoAutomaticoRowDTO { + + private Long id; + private String sscc; + private String codMart; + private String partitaMag; + private String codJcom; + private String posizioneIn; + private String posizioneOut; + private String errorMessage; + private boolean completed; + private boolean skipped; + + @JsonIgnore + private LocalDateTime createdAt; + + @JsonIgnore + private LocalDateTime updatedAt; + + public MissioneMagazzinoAutomaticoRowDTO() { + } + + public MissioneMagazzinoAutomaticoRowDTO(Long id) { + this.id = id; + } + + public Long getId() { + return id; + } + + private MissioneMagazzinoAutomaticoRowDTO setId(Long id) { + this.id = id; + return this; + } + + public String getSscc() { + return sscc; + } + + public MissioneMagazzinoAutomaticoRowDTO setSscc(String sscc) { + this.sscc = sscc; + return this; + } + + public String getCodMart() { + return codMart; + } + + public MissioneMagazzinoAutomaticoRowDTO setCodMart(String codMart) { + this.codMart = codMart; + return this; + } + + public String getPartitaMag() { + return partitaMag; + } + + public MissioneMagazzinoAutomaticoRowDTO setPartitaMag(String partitaMag) { + this.partitaMag = partitaMag; + return this; + } + + public String getCodJcom() { + return codJcom; + } + + public MissioneMagazzinoAutomaticoRowDTO setCodJcom(String codJcom) { + this.codJcom = codJcom; + return this; + } + + public String getPosizioneIn() { + return posizioneIn; + } + + public MissioneMagazzinoAutomaticoRowDTO setPosizioneIn(String posizioneIn) { + this.posizioneIn = posizioneIn; + return this; + } + + public String getPosizioneOut() { + return posizioneOut; + } + + public MissioneMagazzinoAutomaticoRowDTO setPosizioneOut(String posizioneOut) { + this.posizioneOut = posizioneOut; + return this; + } + + public String getErrorMessage() { + return errorMessage; + } + + public MissioneMagazzinoAutomaticoRowDTO setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + return this; + } + + public boolean isCompleted() { + return completed; + } + + public MissioneMagazzinoAutomaticoRowDTO setCompleted(boolean completed) { + this.completed = completed; + return this; + } + + public boolean isSkipped() { + return skipped; + } + + public MissioneMagazzinoAutomaticoRowDTO setSkipped(boolean skipped) { + this.skipped = skipped; + return this; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public MissioneMagazzinoAutomaticoRowDTO setCreatedAt(LocalDateTime createdAt) { + this.createdAt = createdAt; + return this; + } + + public LocalDateTime getUpdatedAt() { + return updatedAt; + } + + public MissioneMagazzinoAutomaticoRowDTO setUpdatedAt(LocalDateTime updatedAt) { + this.updatedAt = updatedAt; + return this; + } +} diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/MissioniMagazzinoAutomaticoService.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/MissioniMagazzinoAutomaticoService.java new file mode 100644 index 0000000000..01f4f98305 --- /dev/null +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/MissioniMagazzinoAutomaticoService.java @@ -0,0 +1,47 @@ +package it.integry.ems.logistic.missioni.magazzino_automatico.service; + +import it.integry.ems.logistic.missioni.magazzino_automatico.dto.MissioneMagazzinoAutomaticoDTO; +import it.integry.ems.logistic.missioni.magazzino_automatico.utils.MissioniMagazzinoAutomaticoUtils; +import it.integry.ems.service.EntityProcessor; +import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager; +import it.integry.ems_model.entity.MtbMissioneMagAuto; +import it.integry.ems_model.types.OperationType; +import it.integry.ems_model.utility.UtilityString; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; + +@Service +public class MissioniMagazzinoAutomaticoService { + + + private final EntityProcessor entityProcessor; + + public MissioniMagazzinoAutomaticoService(EntityProcessor entityProcessor) { + this.entityProcessor = entityProcessor; + } + + public void retrieve(MultiDBTransactionManager multiDBTransactionManager, boolean onlyPending) { + String sql = "SELECT mmma.*\n" + + "FROM " + MtbMissioneMagAuto.ENTITY + " mmma \n"; + +// if(onlyPending) +// sql += "WHERE stato = 'PENDING'\n"; + } + + public long createMissione(MultiDBTransactionManager multiDBTransactionManager, String username, MissioneMagazzinoAutomaticoDTO missione) throws Exception { + if (UtilityString.isNullOrEmpty(username)) + throw new UsernameNotFoundException("Username is null or empty"); + + final MtbMissioneMagAuto mtbMissioneMagAuto = MissioniMagazzinoAutomaticoUtils.convertDtoToEntity(missione) + .setCreatedAt(LocalDateTime.now()) + .setCreatedBy(username); + + mtbMissioneMagAuto.setOperation(OperationType.INSERT); + + entityProcessor.processEntity(mtbMissioneMagAuto, multiDBTransactionManager); + + return mtbMissioneMagAuto.getId(); + } +} diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/utils/MissioniMagazzinoAutomaticoUtils.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/utils/MissioniMagazzinoAutomaticoUtils.java new file mode 100644 index 0000000000..2a42463df2 --- /dev/null +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/utils/MissioniMagazzinoAutomaticoUtils.java @@ -0,0 +1,70 @@ +package it.integry.ems.logistic.missioni.magazzino_automatico.utils; + +import it.integry.ems.logistic.missioni.magazzino_automatico.dto.MissioneMagazzinoAutomaticoDTO; +import it.integry.ems.logistic.missioni.magazzino_automatico.dto.MissioneMagazzinoAutomaticoRowDTO; +import it.integry.ems_model.entity.MtbMissioneMagAuto; +import it.integry.ems_model.entity.MtbMissioneMagAutoDet; + +import java.util.stream.Collectors; + +public class MissioniMagazzinoAutomaticoUtils { + + + public static MtbMissioneMagAuto convertDtoToEntity(MissioneMagazzinoAutomaticoDTO inputData) { + + return new MtbMissioneMagAuto() + .setId(inputData.getId()) + .setCreatedAt(inputData.getCreatedAt()) + .setCodCmac(inputData.getCodCmac()) + .setMtbMissioneMagAutoDet(inputData.getRows().stream() + .map(x -> convertDtoRowToEntity(x, inputData.getId())) + .collect(Collectors.toList())); + + } + + public static MtbMissioneMagAutoDet convertDtoRowToEntity(MissioneMagazzinoAutomaticoRowDTO inputData, long parentId) { + return new MtbMissioneMagAutoDet() + .setId(inputData.getId()) + .setParentId(parentId) + .setSscc(inputData.getSscc()) + .setCodMart(inputData.getCodMart()) + .setPartitaMag(inputData.getPartitaMag()) + .setCodJcom(inputData.getCodJcom()) + .setPosizioneIn(inputData.getPosizioneIn()) + .setPosizioneOut(inputData.getPosizioneOut()) + .setErrorMessage(inputData.getErrorMessage()) + .setCompleted(inputData.isCompleted()) + .setSkipped(inputData.isSkipped()) + .setCreatedAt(inputData.getCreatedAt()) + .setUpdatedAt(inputData.getUpdatedAt()); + } + + + public static MissioneMagazzinoAutomaticoDTO convertDtoToEntity(MtbMissioneMagAuto inputData) { + + return new MissioneMagazzinoAutomaticoDTO(inputData.getId()) + .setCreatedAt(inputData.getCreatedAt()) + .setCodCmac(inputData.getCodCmac()) + .setRows(inputData.getMtbMissioneMagAutoDet().stream() + .map(MissioniMagazzinoAutomaticoUtils::convertEntotyRowToDto) + .collect(Collectors.toList())); + + } + + public static MissioneMagazzinoAutomaticoRowDTO convertEntotyRowToDto(MtbMissioneMagAutoDet inputData) { + return new MissioneMagazzinoAutomaticoRowDTO(inputData.getId()) + .setSscc(inputData.getSscc()) + .setCodMart(inputData.getCodMart()) + .setPartitaMag(inputData.getPartitaMag()) + .setCodJcom(inputData.getCodJcom()) + .setPosizioneIn(inputData.getPosizioneIn()) + .setPosizioneOut(inputData.getPosizioneOut()) + .setErrorMessage(inputData.getErrorMessage()) + .setCompleted(inputData.isCompleted()) + .setSkipped(inputData.isSkipped()) + .setCreatedAt(inputData.getCreatedAt()) + .setUpdatedAt(inputData.getUpdatedAt()); + } + + +} From 32229f7157905209521553d3e074cb500aa257c6 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Fri, 26 Sep 2025 16:38:31 +0200 Subject: [PATCH 02/13] [Magazzino Automatico] Completato servizio di retrieve --- .../entity/MtbMissioneMagAutoDet.java | 1 + .../ems_model/utility/UtilityHashMap.java | 2 + ...MissioniMagazzinoAutomaticoController.java | 5 +- .../dto/MissioneMagazzinoAutomaticoDTO.java | 11 +++-- .../MissioneMagazzinoAutomaticoRowDTO.java | 13 ++++-- .../MissioniMagazzinoAutomaticoService.java | 46 +++++++++++++++++-- .../MissioniMagazzinoAutomaticoUtils.java | 32 ++++++++++--- 7 files changed, 90 insertions(+), 20 deletions(-) diff --git a/ems-core/src/main/java/it/integry/ems_model/entity/MtbMissioneMagAutoDet.java b/ems-core/src/main/java/it/integry/ems_model/entity/MtbMissioneMagAutoDet.java index 11ed3943ba..a21cf4a64f 100644 --- a/ems-core/src/main/java/it/integry/ems_model/entity/MtbMissioneMagAutoDet.java +++ b/ems-core/src/main/java/it/integry/ems_model/entity/MtbMissioneMagAutoDet.java @@ -31,6 +31,7 @@ public class MtbMissioneMagAutoDet extends EntityBase { private Long id; @SqlField(value = "parent_id", nullable = false) + @ImportFromParent(value = "id") @FK(tableName = MtbMissioneMagAuto.ENTITY, columnName = "id") private Long parentId; diff --git a/ems-core/src/main/java/it/integry/ems_model/utility/UtilityHashMap.java b/ems-core/src/main/java/it/integry/ems_model/utility/UtilityHashMap.java index b3dfff5f46..224d15a19e 100644 --- a/ems-core/src/main/java/it/integry/ems_model/utility/UtilityHashMap.java +++ b/ems-core/src/main/java/it/integry/ems_model/utility/UtilityHashMap.java @@ -2,6 +2,7 @@ package it.integry.ems_model.utility; import it.integry.ems_model.annotation.SqlField; +import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.validation.constraints.NotNull; import java.lang.reflect.Field; @@ -34,6 +35,7 @@ public class UtilityHashMap { } + @Nonnull public static List mapListToObjects(List> dataList, Class clazz) { List result = new ArrayList<>(); try { diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/controller/MissioniMagazzinoAutomaticoController.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/controller/MissioniMagazzinoAutomaticoController.java index aa34c9f383..6af4f1e23b 100644 --- a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/controller/MissioniMagazzinoAutomaticoController.java +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/controller/MissioniMagazzinoAutomaticoController.java @@ -39,10 +39,7 @@ public class MissioniMagazzinoAutomaticoController { ServiceRestResponse retrieve(@RequestParam(CommonConstants.PROFILE_DB) String profileDB, @RequestParam(required = false, defaultValue = "true") boolean onlyPending) throws Exception { - missioniMagazzinoAutomaticoService.retrieve(multiDBTransactionManager, onlyPending); - - - return ServiceRestResponse.createPositiveResponse(); + return ServiceRestResponse.createPositiveResponse(missioniMagazzinoAutomaticoService.retrieve(multiDBTransactionManager, onlyPending)); } diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoDTO.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoDTO.java index 6a1988bd4c..5b6fb7cc4c 100644 --- a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoDTO.java +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoDTO.java @@ -1,18 +1,21 @@ package it.integry.ems.logistic.missioni.magazzino_automatico.dto; -import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; import java.time.LocalDateTime; import java.util.List; public class MissioneMagazzinoAutomaticoDTO { + @JsonProperty(access = JsonProperty.Access.READ_ONLY) private Long id; + private String codCmac; - @JsonIgnore - private transient String createdBy; - @JsonIgnore + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + private String createdBy; + + @JsonProperty(access = JsonProperty.Access.READ_ONLY) private LocalDateTime createdAt; private List rows; diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoRowDTO.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoRowDTO.java index 0150f90f6e..6306085c05 100644 --- a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoRowDTO.java +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoRowDTO.java @@ -1,11 +1,12 @@ package it.integry.ems.logistic.missioni.magazzino_automatico.dto; -import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; import java.time.LocalDateTime; public class MissioneMagazzinoAutomaticoRowDTO { + @JsonProperty(access = JsonProperty.Access.READ_ONLY) private Long id; private String sscc; private String codMart; @@ -13,14 +14,20 @@ public class MissioneMagazzinoAutomaticoRowDTO { private String codJcom; private String posizioneIn; private String posizioneOut; + + @JsonProperty(access = JsonProperty.Access.READ_ONLY) private String errorMessage; + + @JsonProperty(access = JsonProperty.Access.READ_ONLY) private boolean completed; + + @JsonProperty(access = JsonProperty.Access.READ_ONLY) private boolean skipped; - @JsonIgnore + @JsonProperty(access = JsonProperty.Access.READ_ONLY) private LocalDateTime createdAt; - @JsonIgnore + @JsonProperty(access = JsonProperty.Access.READ_ONLY) private LocalDateTime updatedAt; public MissioneMagazzinoAutomaticoRowDTO() { diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/MissioniMagazzinoAutomaticoService.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/MissioniMagazzinoAutomaticoService.java index 01f4f98305..823c3d0aea 100644 --- a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/MissioniMagazzinoAutomaticoService.java +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/MissioniMagazzinoAutomaticoService.java @@ -1,16 +1,24 @@ package it.integry.ems.logistic.missioni.magazzino_automatico.service; +import it.integry.ems.exception.PrimaryDatabaseNotPresentException; import it.integry.ems.logistic.missioni.magazzino_automatico.dto.MissioneMagazzinoAutomaticoDTO; import it.integry.ems.logistic.missioni.magazzino_automatico.utils.MissioniMagazzinoAutomaticoUtils; import it.integry.ems.service.EntityProcessor; import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager; import it.integry.ems_model.entity.MtbMissioneMagAuto; +import it.integry.ems_model.entity.MtbMissioneMagAutoDet; +import it.integry.ems_model.exception.DataConverterNotFoundException; import it.integry.ems_model.types.OperationType; +import it.integry.ems_model.utility.UtilityDB; +import it.integry.ems_model.utility.UtilityQuery; import it.integry.ems_model.utility.UtilityString; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; +import java.sql.SQLException; import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; @Service public class MissioniMagazzinoAutomaticoService { @@ -22,12 +30,43 @@ public class MissioniMagazzinoAutomaticoService { this.entityProcessor = entityProcessor; } - public void retrieve(MultiDBTransactionManager multiDBTransactionManager, boolean onlyPending) { + public List retrieve(MultiDBTransactionManager multiDBTransactionManager, boolean onlyPending) throws PrimaryDatabaseNotPresentException, DataConverterNotFoundException, SQLException, InstantiationException, IllegalAccessException { String sql = "SELECT mmma.*\n" + "FROM " + MtbMissioneMagAuto.ENTITY + " mmma \n"; -// if(onlyPending) -// sql += "WHERE stato = 'PENDING'\n"; + if (onlyPending) { + sql += "INNER JOIN (SELECT DISTINCT parent_id,\n" + + " IIF(COUNT(*) OVER (PARTITION BY parent_id) = SUM(IIF(CAST(completed AS SMALLINT) = 1, 1, CAST(skipped AS SMALLINT))) OVER (PARTITION BY parent_id), 1, 0) AS completed\n" + + "FROM " + MtbMissioneMagAutoDet.ENTITY + " mmma_det) mmma_det ON\n" + + "mmma.id = mmma_det.parent_id \n"; + sql += "WHERE mmma_det.completed = 0"; + } + + final List missioni = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sql, MtbMissioneMagAuto.class); + + if (missioni == null || missioni.isEmpty()) { + return null; + } + + String sqlRows = "SELECT * FROM " + MtbMissioneMagAutoDet.ENTITY + " WHERE parent_id IN (" + + UtilityQuery.concatLongFieldsWithSeparator(missioni.stream().map(MtbMissioneMagAuto::getId).collect(Collectors.toList()), ",") + + ")"; + + if (onlyPending) { + sqlRows += " AND completed = 0 AND skipped = 0"; + } + + final List missioniRows = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sqlRows, MtbMissioneMagAutoDet.class); + + missioni.forEach(missione -> { + final List rows = missioniRows.stream() + .filter(x -> x.getParentId().equals(missione.getId())) + .collect(Collectors.toList()); + missione.setMtbMissioneMagAutoDet(rows); + }); + + + return MissioniMagazzinoAutomaticoUtils.convertEntityListToDto(missioni); } public long createMissione(MultiDBTransactionManager multiDBTransactionManager, String username, MissioneMagazzinoAutomaticoDTO missione) throws Exception { @@ -39,6 +78,7 @@ public class MissioniMagazzinoAutomaticoService { .setCreatedBy(username); mtbMissioneMagAuto.setOperation(OperationType.INSERT); + mtbMissioneMagAuto.getMtbMissioneMagAutoDet().forEach(x -> x.setOperation(OperationType.INSERT)); entityProcessor.processEntity(mtbMissioneMagAuto, multiDBTransactionManager); diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/utils/MissioniMagazzinoAutomaticoUtils.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/utils/MissioniMagazzinoAutomaticoUtils.java index 2a42463df2..19a79e3b69 100644 --- a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/utils/MissioniMagazzinoAutomaticoUtils.java +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/utils/MissioniMagazzinoAutomaticoUtils.java @@ -5,11 +5,18 @@ import it.integry.ems.logistic.missioni.magazzino_automatico.dto.MissioneMagazzi import it.integry.ems_model.entity.MtbMissioneMagAuto; import it.integry.ems_model.entity.MtbMissioneMagAutoDet; +import java.util.List; import java.util.stream.Collectors; public class MissioniMagazzinoAutomaticoUtils { + public static List convertDtoListToEntity(List inputData) { + return inputData.stream() + .map(MissioniMagazzinoAutomaticoUtils::convertDtoToEntity) + .collect(Collectors.toList()); + } + public static MtbMissioneMagAuto convertDtoToEntity(MissioneMagazzinoAutomaticoDTO inputData) { return new MtbMissioneMagAuto() @@ -22,7 +29,7 @@ public class MissioniMagazzinoAutomaticoUtils { } - public static MtbMissioneMagAutoDet convertDtoRowToEntity(MissioneMagazzinoAutomaticoRowDTO inputData, long parentId) { + public static MtbMissioneMagAutoDet convertDtoRowToEntity(MissioneMagazzinoAutomaticoRowDTO inputData, Long parentId) { return new MtbMissioneMagAutoDet() .setId(inputData.getId()) .setParentId(parentId) @@ -39,19 +46,32 @@ public class MissioniMagazzinoAutomaticoUtils { .setUpdatedAt(inputData.getUpdatedAt()); } + public static List convertEntityListToDto(List inputData) { + return inputData.stream() + .map(MissioniMagazzinoAutomaticoUtils::convertEntityToDto) + .collect(Collectors.toList()); + } - public static MissioneMagazzinoAutomaticoDTO convertDtoToEntity(MtbMissioneMagAuto inputData) { + public static MissioneMagazzinoAutomaticoDTO convertEntityToDto(MtbMissioneMagAuto inputData) { return new MissioneMagazzinoAutomaticoDTO(inputData.getId()) .setCreatedAt(inputData.getCreatedAt()) .setCodCmac(inputData.getCodCmac()) - .setRows(inputData.getMtbMissioneMagAutoDet().stream() - .map(MissioniMagazzinoAutomaticoUtils::convertEntotyRowToDto) - .collect(Collectors.toList())); + .setRows(convertEntityRowListToDto(inputData.getMtbMissioneMagAutoDet())); } - public static MissioneMagazzinoAutomaticoRowDTO convertEntotyRowToDto(MtbMissioneMagAutoDet inputData) { + public static List convertEntityRowListToDto(List inputData) { + if (inputData == null) + return null; + + return inputData.stream() + .map(MissioniMagazzinoAutomaticoUtils::convertEntityRowToDto) + .collect(Collectors.toList()); + } + + + public static MissioneMagazzinoAutomaticoRowDTO convertEntityRowToDto(MtbMissioneMagAutoDet inputData) { return new MissioneMagazzinoAutomaticoRowDTO(inputData.getId()) .setSscc(inputData.getSscc()) .setCodMart(inputData.getCodMart()) From 6efa6e729337c6e5866fd1ac9987439c3309577b Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Mon, 29 Sep 2025 09:21:27 +0200 Subject: [PATCH 03/13] [Magazzino Automatico] Aggiunti servizi --- ...MissioniMagazzinoAutomaticoController.java | 28 +++++++++-- .../MissioniMagazzinoAutomaticoService.java | 47 ++++++++++++++++++- 2 files changed, 71 insertions(+), 4 deletions(-) diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/controller/MissioniMagazzinoAutomaticoController.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/controller/MissioniMagazzinoAutomaticoController.java index 6af4f1e23b..45f3a73bcb 100644 --- a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/controller/MissioniMagazzinoAutomaticoController.java +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/controller/MissioniMagazzinoAutomaticoController.java @@ -34,12 +34,21 @@ public class MissioniMagazzinoAutomaticoController { } - @GetMapping(value = "") + @GetMapping(value = "retrieveAll") + public @ResponseBody + ServiceRestResponse retrieveAll(@RequestParam(CommonConstants.PROFILE_DB) String profileDB, + @RequestParam(required = false, defaultValue = "true") boolean onlyPending) throws Exception { + + return ServiceRestResponse.createPositiveResponse(missioniMagazzinoAutomaticoService.retrieveAll(multiDBTransactionManager, onlyPending)); + } + + + @GetMapping(value = "retrieve") public @ResponseBody ServiceRestResponse retrieve(@RequestParam(CommonConstants.PROFILE_DB) String profileDB, - @RequestParam(required = false, defaultValue = "true") boolean onlyPending) throws Exception { + @RequestParam long id) throws Exception { - return ServiceRestResponse.createPositiveResponse(missioniMagazzinoAutomaticoService.retrieve(multiDBTransactionManager, onlyPending)); + return ServiceRestResponse.createPositiveResponse(missioniMagazzinoAutomaticoService.retrieveItem(multiDBTransactionManager, id)); } @@ -61,4 +70,17 @@ public class MissioniMagazzinoAutomaticoController { new CreateMissioneMagazzinoAutomaticoResponseDTO(missioneId)); } + + @GetMapping(value = "abort") + public @ResponseBody + ServiceRestResponse create(@RequestParam(CommonConstants.PROFILE_DB) String profileDB, + @RequestParam long missionId) throws Exception { + userSession.checkUser(); + + missioniMagazzinoAutomaticoService.abortMission(multiDBTransactionManager, + missionId); + + return ServiceRestResponse.createPositiveResponse(); + } + } diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/MissioniMagazzinoAutomaticoService.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/MissioniMagazzinoAutomaticoService.java index 823c3d0aea..47130582af 100644 --- a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/MissioniMagazzinoAutomaticoService.java +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/MissioniMagazzinoAutomaticoService.java @@ -30,7 +30,7 @@ public class MissioniMagazzinoAutomaticoService { this.entityProcessor = entityProcessor; } - public List retrieve(MultiDBTransactionManager multiDBTransactionManager, boolean onlyPending) throws PrimaryDatabaseNotPresentException, DataConverterNotFoundException, SQLException, InstantiationException, IllegalAccessException { + public List retrieveAll(MultiDBTransactionManager multiDBTransactionManager, boolean onlyPending) throws PrimaryDatabaseNotPresentException, DataConverterNotFoundException, SQLException, InstantiationException, IllegalAccessException { String sql = "SELECT mmma.*\n" + "FROM " + MtbMissioneMagAuto.ENTITY + " mmma \n"; @@ -69,6 +69,32 @@ public class MissioniMagazzinoAutomaticoService { return MissioniMagazzinoAutomaticoUtils.convertEntityListToDto(missioni); } + public MissioneMagazzinoAutomaticoDTO retrieveItem(MultiDBTransactionManager multiDBTransactionManager, long missionId) throws PrimaryDatabaseNotPresentException, DataConverterNotFoundException, SQLException, InstantiationException, IllegalAccessException { + String sql = "SELECT mmma.*\n" + + "FROM " + MtbMissioneMagAuto.ENTITY + " mmma \n" + + "WHERE mmma.id = " + UtilityDB.valueToString(missionId); + + + final MtbMissioneMagAuto missione = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(multiDBTransactionManager.getPrimaryConnection(), sql, MtbMissioneMagAuto.class); + + if (missione == null) { + return null; + } + + String sqlRows = "SELECT * FROM " + MtbMissioneMagAutoDet.ENTITY + " WHERE parent_id = " + UtilityDB.valueToString(missionId); + + final List missioniRows = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sqlRows, MtbMissioneMagAutoDet.class); + + + final List rows = missioniRows.stream() + .filter(x -> x.getParentId().equals(missione.getId())) + .collect(Collectors.toList()); + missione.setMtbMissioneMagAutoDet(rows); + + + return MissioniMagazzinoAutomaticoUtils.convertEntityToDto(missione); + } + public long createMissione(MultiDBTransactionManager multiDBTransactionManager, String username, MissioneMagazzinoAutomaticoDTO missione) throws Exception { if (UtilityString.isNullOrEmpty(username)) throw new UsernameNotFoundException("Username is null or empty"); @@ -84,4 +110,23 @@ public class MissioniMagazzinoAutomaticoService { return mtbMissioneMagAuto.getId(); } + + public void abortMission(MultiDBTransactionManager multiDBTransactionManager, long missioneId) throws Exception { + MtbMissioneMagAuto mtbMissioneMagAuto = new MtbMissioneMagAuto(); + mtbMissioneMagAuto.setId(missioneId); + + String sqlRows = "SELECT * FROM " + MtbMissioneMagAutoDet.ENTITY + + " WHERE parent_id = " + UtilityDB.valueToString(missioneId) + + " AND completed = 0 AND skipped = 0"; + + final List mtbMissioneMagAutoDets = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sqlRows, MtbMissioneMagAutoDet.class); + if (mtbMissioneMagAutoDets == null) return; + + mtbMissioneMagAutoDets.forEach(x -> + x.setSkipped(true) + .setOperation(OperationType.UPDATE)); + + mtbMissioneMagAuto.setMtbMissioneMagAutoDet(mtbMissioneMagAutoDets); + entityProcessor.processEntity(mtbMissioneMagAuto, multiDBTransactionManager); + } } From 139fc94ed53c25e31e997fea990996efe6398a01 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Mon, 29 Sep 2025 18:41:41 +0200 Subject: [PATCH 04/13] Creato servizio di logError missione --- ...MissioniMagazzinoAutomaticoController.java | 19 ++++++++++++-- ...MissioneMagazzinoAutomaticoRequestDTO.java | 25 +++++++++++++++++++ .../MissioneMagazzinoAutomaticoRowDTO.java | 5 ++++ .../MissioniMagazzinoAutomaticoService.java | 20 +++++++++++++++ 4 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/LogErrorMissioneMagazzinoAutomaticoRequestDTO.java diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/controller/MissioniMagazzinoAutomaticoController.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/controller/MissioniMagazzinoAutomaticoController.java index 45f3a73bcb..419950baa4 100644 --- a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/controller/MissioniMagazzinoAutomaticoController.java +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/controller/MissioniMagazzinoAutomaticoController.java @@ -4,6 +4,7 @@ import it.integry.common.var.CommonConstants; import it.integry.ems.javabeans.RequestDataDTO; import it.integry.ems.logistic.missioni.magazzino_automatico.dto.CreateMissioneMagazzinoAutomaticoRequestDTO; import it.integry.ems.logistic.missioni.magazzino_automatico.dto.CreateMissioneMagazzinoAutomaticoResponseDTO; +import it.integry.ems.logistic.missioni.magazzino_automatico.dto.LogErrorMissioneMagazzinoAutomaticoRequestDTO; import it.integry.ems.logistic.missioni.magazzino_automatico.service.MissioniMagazzinoAutomaticoService; import it.integry.ems.response.ServiceRestResponse; import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager; @@ -34,7 +35,7 @@ public class MissioniMagazzinoAutomaticoController { } - @GetMapping(value = "retrieveAll") + @GetMapping(value = "retrieve-all") public @ResponseBody ServiceRestResponse retrieveAll(@RequestParam(CommonConstants.PROFILE_DB) String profileDB, @RequestParam(required = false, defaultValue = "true") boolean onlyPending) throws Exception { @@ -73,7 +74,7 @@ public class MissioniMagazzinoAutomaticoController { @GetMapping(value = "abort") public @ResponseBody - ServiceRestResponse create(@RequestParam(CommonConstants.PROFILE_DB) String profileDB, + ServiceRestResponse abort(@RequestParam(CommonConstants.PROFILE_DB) String profileDB, @RequestParam long missionId) throws Exception { userSession.checkUser(); @@ -83,4 +84,18 @@ public class MissioniMagazzinoAutomaticoController { return ServiceRestResponse.createPositiveResponse(); } + + @GetMapping(value = "log-error") + public @ResponseBody + ServiceRestResponse logError(@RequestParam(CommonConstants.PROFILE_DB) String profileDB, + @RequestBody LogErrorMissioneMagazzinoAutomaticoRequestDTO requestBody) throws Exception { + userSession.checkUser(); + + missioniMagazzinoAutomaticoService.logMissionError(multiDBTransactionManager, + requestBody.getMissionRowId(), + requestBody.getErrorMessage()); + + return ServiceRestResponse.createPositiveResponse(); + } + } diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/LogErrorMissioneMagazzinoAutomaticoRequestDTO.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/LogErrorMissioneMagazzinoAutomaticoRequestDTO.java new file mode 100644 index 0000000000..08ecaebb4c --- /dev/null +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/LogErrorMissioneMagazzinoAutomaticoRequestDTO.java @@ -0,0 +1,25 @@ +package it.integry.ems.logistic.missioni.magazzino_automatico.dto; + +public class LogErrorMissioneMagazzinoAutomaticoRequestDTO { + + private long missionRowId; + private String errorMessage; + + public long getMissionRowId() { + return missionRowId; + } + + public LogErrorMissioneMagazzinoAutomaticoRequestDTO setMissionRowId(long missionRowId) { + this.missionRowId = missionRowId; + return this; + } + + public String getErrorMessage() { + return errorMessage; + } + + public LogErrorMissioneMagazzinoAutomaticoRequestDTO setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + return this; + } +} diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoRowDTO.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoRowDTO.java index 6306085c05..6d54c14545 100644 --- a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoRowDTO.java +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoRowDTO.java @@ -144,4 +144,9 @@ public class MissioneMagazzinoAutomaticoRowDTO { this.updatedAt = updatedAt; return this; } + + + public boolean isError() { + return errorMessage != null && !errorMessage.isEmpty() && !completed && !skipped; + } } diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/MissioniMagazzinoAutomaticoService.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/MissioniMagazzinoAutomaticoService.java index 47130582af..12a3832e12 100644 --- a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/MissioniMagazzinoAutomaticoService.java +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/MissioniMagazzinoAutomaticoService.java @@ -129,4 +129,24 @@ public class MissioniMagazzinoAutomaticoService { mtbMissioneMagAuto.setMtbMissioneMagAutoDet(mtbMissioneMagAutoDets); entityProcessor.processEntity(mtbMissioneMagAuto, multiDBTransactionManager); } + + public void logMissionError(MultiDBTransactionManager multiDBTransactionManager, long missioneRowId, String errorMessage) throws Exception { + String sqlMissione = "SELECT * \n" + + " FROM " + MtbMissioneMagAutoDet.ENTITY + " mmma_det\n" + + " WHERE mmma_det.id = " + UtilityDB.valueToString(missioneRowId); + + MtbMissioneMagAutoDet missioneRow = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(multiDBTransactionManager.getPrimaryConnection(), sqlMissione, MtbMissioneMagAutoDet.class); + missioneRow.setOperation(OperationType.UPDATE); + missioneRow.setErrorMessage(errorMessage); + missioneRow.setUpdatedAt(LocalDateTime.now()); + + MtbMissioneMagAuto missione = new MtbMissioneMagAuto() + .setId(missioneRow.getParentId()); + + missione.setOperation(OperationType.UPDATE); + + missione.getMtbMissioneMagAutoDet().add(missioneRow); + + entityProcessor.processEntity(missione, multiDBTransactionManager); + } } From cc21e43bd4ea651a632286367b102d6ff600f24d Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Thu, 2 Oct 2025 11:05:48 +0200 Subject: [PATCH 05/13] Cambiata struttura MtbMissioneMagAuto --- .../model/Migration_20250925103840.java | 15 ++--- .../entity/MtbMissioneMagAutoDet.java | 64 +++++++------------ .../MissioneMagazzinoAutomaticoRowDTO.java | 48 ++++++++------ .../MissioniMagazzinoAutomaticoUtils.java | 10 ++- 4 files changed, 60 insertions(+), 77 deletions(-) diff --git a/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250925103840.java b/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250925103840.java index 94e4926e1e..f9f5f1c7bf 100644 --- a/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250925103840.java +++ b/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250925103840.java @@ -34,22 +34,15 @@ public class Migration_20250925103840 extends BaseMigration implements Migration " CONSTRAINT mtb_missione_mag_auto_det_mtb_missione_mag_auto_id_fk\n" + " REFERENCES dbo.mtb_missione_mag_auto (id),\n" + " sscc VARCHAR(18),\n" + - " cod_mart VARCHAR(15)\n" + - " CONSTRAINT mtb_missione_mag_auto_det_mtb_aart_cod_mart_fk\n" + - " REFERENCES dbo.mtb_aart,\n" + - " partita_mag VARCHAR(20),\n" + - " cod_jcom VARCHAR(10)\n" + - " CONSTRAINT mtb_missione_mag_auto_det_jtb_comt_cod_jcom_fk\n" + - " REFERENCES dbo.jtb_comt,\n" + " posizione_in VARCHAR(40),\n" + " posizione_out VARCHAR(40),\n" + " error_message VARCHAR(MAX),\n" + " completed BIT DEFAULT 0 NOT NULL,\n" + " skipped BIT DEFAULT 0 NOT NULL,\n" + - " created_at DATETIME DEFAULT GETDATE() NOT NULL,\n" + - " updated_at DATETIME DEFAULT GETDATE() NOT NULL,\n" + - " CONSTRAINT mtb_missione_mag_auto_det_mtb_partita_mag_cod_mart_partita_mag_fk\n" + - " FOREIGN KEY (cod_mart, partita_mag) REFERENCES dbo.mtb_partita_mag\n" + + " started_at DATETIME,\n" + + " ended_at DATETIME,\n" + + " created_at DATETIME DEFAULT GETDATE(),\n" + + " updated_at DATETIME DEFAULT GETDATE() NOT NULL\n" + ")"; executeStatement(sqlCreateMaster, sqlCreateDetail); diff --git a/ems-core/src/main/java/it/integry/ems_model/entity/MtbMissioneMagAutoDet.java b/ems-core/src/main/java/it/integry/ems_model/entity/MtbMissioneMagAutoDet.java index a21cf4a64f..e09c8ba251 100644 --- a/ems-core/src/main/java/it/integry/ems_model/entity/MtbMissioneMagAutoDet.java +++ b/ems-core/src/main/java/it/integry/ems_model/entity/MtbMissioneMagAutoDet.java @@ -38,19 +38,6 @@ public class MtbMissioneMagAutoDet extends EntityBase { @SqlField(value = "sscc", maxLength = 18, nullable = true) private String sscc; - @SqlField(value = "cod_mart", maxLength = 15, nullable = true) - @FK(tableName = MtbAart.ENTITY, columnName = "cod_mart") - @FK(tableName = MtbPartitaMag.ENTITY, columnName = "cod_mart") - private String codMart; - - @SqlField(value = "partita_mag", maxLength = 20, nullable = true) - @FK(tableName = MtbPartitaMag.ENTITY, columnName = "partita_mag") - private String partitaMag; - - @SqlField(value = "cod_jcom", maxLength = 10, nullable = true) - @FK(tableName = JtbComt.ENTITY, columnName = "cod_jcom") - private String codJcom; - @SqlField(value = "posizione_in", maxLength = 40, nullable = true) private String posizioneIn; @@ -66,6 +53,12 @@ public class MtbMissioneMagAutoDet extends EntityBase { @SqlField(value = "skipped", nullable = false) private boolean skipped; + @SqlField(value = "started_at", nullable = true) + private LocalDateTime startedAt; + + @SqlField(value = "ended_at", nullable = true) + private LocalDateTime endedAt; + @SqlField(value = "created_at", nullable = false, defaultObjectValue = CommonConstants.TIMESTAMP) private LocalDateTime createdAt; @@ -99,33 +92,6 @@ public class MtbMissioneMagAutoDet extends EntityBase { return this; } - public String getCodMart() { - return codMart; - } - - public MtbMissioneMagAutoDet setCodMart(String codMart) { - this.codMart = codMart; - return this; - } - - public String getPartitaMag() { - return partitaMag; - } - - public MtbMissioneMagAutoDet setPartitaMag(String partitaMag) { - this.partitaMag = partitaMag; - return this; - } - - public String getCodJcom() { - return codJcom; - } - - public MtbMissioneMagAutoDet setCodJcom(String codJcom) { - this.codJcom = codJcom; - return this; - } - public String getPosizioneIn() { return posizioneIn; } @@ -171,6 +137,24 @@ public class MtbMissioneMagAutoDet extends EntityBase { return this; } + public LocalDateTime getStartedAt() { + return startedAt; + } + + public MtbMissioneMagAutoDet setStartedAt(LocalDateTime startedAt) { + this.startedAt = startedAt; + return this; + } + + public LocalDateTime getEndedAt() { + return endedAt; + } + + public MtbMissioneMagAutoDet setEndedAt(LocalDateTime endedAt) { + this.endedAt = endedAt; + return this; + } + public LocalDateTime getCreatedAt() { return createdAt; } diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoRowDTO.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoRowDTO.java index 6d54c14545..4efbae5365 100644 --- a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoRowDTO.java +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoRowDTO.java @@ -9,8 +9,6 @@ public class MissioneMagazzinoAutomaticoRowDTO { @JsonProperty(access = JsonProperty.Access.READ_ONLY) private Long id; private String sscc; - private String codMart; - private String partitaMag; private String codJcom; private String posizioneIn; private String posizioneOut; @@ -24,6 +22,12 @@ public class MissioneMagazzinoAutomaticoRowDTO { @JsonProperty(access = JsonProperty.Access.READ_ONLY) private boolean skipped; + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + private LocalDateTime startedAt; + + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + private LocalDateTime endedAt; + @JsonProperty(access = JsonProperty.Access.READ_ONLY) private LocalDateTime createdAt; @@ -55,24 +59,6 @@ public class MissioneMagazzinoAutomaticoRowDTO { return this; } - public String getCodMart() { - return codMart; - } - - public MissioneMagazzinoAutomaticoRowDTO setCodMart(String codMart) { - this.codMart = codMart; - return this; - } - - public String getPartitaMag() { - return partitaMag; - } - - public MissioneMagazzinoAutomaticoRowDTO setPartitaMag(String partitaMag) { - this.partitaMag = partitaMag; - return this; - } - public String getCodJcom() { return codJcom; } @@ -127,6 +113,24 @@ public class MissioneMagazzinoAutomaticoRowDTO { return this; } + public LocalDateTime getStartedAt() { + return startedAt; + } + + public MissioneMagazzinoAutomaticoRowDTO setStartedAt(LocalDateTime startedAt) { + this.startedAt = startedAt; + return this; + } + + public LocalDateTime getEndedAt() { + return endedAt; + } + + public MissioneMagazzinoAutomaticoRowDTO setEndedAt(LocalDateTime endedAt) { + this.endedAt = endedAt; + return this; + } + public LocalDateTime getCreatedAt() { return createdAt; } @@ -149,4 +153,8 @@ public class MissioneMagazzinoAutomaticoRowDTO { public boolean isError() { return errorMessage != null && !errorMessage.isEmpty() && !completed && !skipped; } + + public boolean isRunning() { + return startedAt != null && endedAt == null; + } } diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/utils/MissioniMagazzinoAutomaticoUtils.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/utils/MissioniMagazzinoAutomaticoUtils.java index 19a79e3b69..78f3cc84ed 100644 --- a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/utils/MissioniMagazzinoAutomaticoUtils.java +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/utils/MissioniMagazzinoAutomaticoUtils.java @@ -34,14 +34,13 @@ public class MissioniMagazzinoAutomaticoUtils { .setId(inputData.getId()) .setParentId(parentId) .setSscc(inputData.getSscc()) - .setCodMart(inputData.getCodMart()) - .setPartitaMag(inputData.getPartitaMag()) - .setCodJcom(inputData.getCodJcom()) .setPosizioneIn(inputData.getPosizioneIn()) .setPosizioneOut(inputData.getPosizioneOut()) .setErrorMessage(inputData.getErrorMessage()) .setCompleted(inputData.isCompleted()) .setSkipped(inputData.isSkipped()) + .setStartedAt(inputData.getStartedAt()) + .setEndedAt(inputData.getEndedAt()) .setCreatedAt(inputData.getCreatedAt()) .setUpdatedAt(inputData.getUpdatedAt()); } @@ -74,14 +73,13 @@ public class MissioniMagazzinoAutomaticoUtils { public static MissioneMagazzinoAutomaticoRowDTO convertEntityRowToDto(MtbMissioneMagAutoDet inputData) { return new MissioneMagazzinoAutomaticoRowDTO(inputData.getId()) .setSscc(inputData.getSscc()) - .setCodMart(inputData.getCodMart()) - .setPartitaMag(inputData.getPartitaMag()) - .setCodJcom(inputData.getCodJcom()) .setPosizioneIn(inputData.getPosizioneIn()) .setPosizioneOut(inputData.getPosizioneOut()) .setErrorMessage(inputData.getErrorMessage()) .setCompleted(inputData.isCompleted()) .setSkipped(inputData.isSkipped()) + .setStartedAt(inputData.getStartedAt()) + .setEndedAt(inputData.getEndedAt()) .setCreatedAt(inputData.getCreatedAt()) .setUpdatedAt(inputData.getUpdatedAt()); } From e53add6f0d2006fd36cf3021ebfc3e17d5594c04 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Mon, 6 Oct 2025 10:05:13 +0200 Subject: [PATCH 06/13] Rimossa commessa missioni magazzino automatico --- .../ems/rules/completing/dto/ForeignKeyDTO.java | 1 + .../dto/MissioneMagazzinoAutomaticoRowDTO.java | 10 ---------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/ems-core/src/main/java/it/integry/ems/rules/completing/dto/ForeignKeyDTO.java b/ems-core/src/main/java/it/integry/ems/rules/completing/dto/ForeignKeyDTO.java index 0445453ce1..da0a7199f2 100644 --- a/ems-core/src/main/java/it/integry/ems/rules/completing/dto/ForeignKeyDTO.java +++ b/ems-core/src/main/java/it/integry/ems/rules/completing/dto/ForeignKeyDTO.java @@ -7,6 +7,7 @@ import java.util.HashMap; public class ForeignKeyDTO { public static HashMap tableConstraintBindings = new HashMap() {{ + put(CtbAmac.ENTITY, "Codice macchina inesistente"); put(MtbAart.ENTITY, "Codice articolo inesistente"); put(MtbPartitaMag.ENTITY, "Partita di magazzino inesistente"); put(DtbDoct.ENTITY, "Documento inesistente"); diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoRowDTO.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoRowDTO.java index 4efbae5365..8c576b5464 100644 --- a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoRowDTO.java +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoRowDTO.java @@ -9,7 +9,6 @@ public class MissioneMagazzinoAutomaticoRowDTO { @JsonProperty(access = JsonProperty.Access.READ_ONLY) private Long id; private String sscc; - private String codJcom; private String posizioneIn; private String posizioneOut; @@ -59,15 +58,6 @@ public class MissioneMagazzinoAutomaticoRowDTO { return this; } - public String getCodJcom() { - return codJcom; - } - - public MissioneMagazzinoAutomaticoRowDTO setCodJcom(String codJcom) { - this.codJcom = codJcom; - return this; - } - public String getPosizioneIn() { return posizioneIn; } From a01025853c313638f2d9f734961cfba8bc5915eb Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Thu, 9 Oct 2025 12:50:02 +0200 Subject: [PATCH 07/13] Implementato servizio di debug per sincronizzare le posizioni delle pedane con eurofork --- .../EuroforkDataSyncronizerService.java | 140 ++++++++++++++++++ .../ems/retail/wms/Utility/WMSUtility.java | 3 + .../WMSMagazzinoAutomaticoController.java | 11 +- .../WMSMagazzinoAutomaticoService.java | 32 ++-- 4 files changed, 175 insertions(+), 11 deletions(-) create mode 100644 ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/EuroforkDataSyncronizerService.java diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/EuroforkDataSyncronizerService.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/EuroforkDataSyncronizerService.java new file mode 100644 index 0000000000..f9bb9588f7 --- /dev/null +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/EuroforkDataSyncronizerService.java @@ -0,0 +1,140 @@ +package it.integry.ems.logistic.missioni.magazzino_automatico.service; + +import groovy.lang.Tuple2; +import it.integry.annotations.CustomerService; +import it.integry.ems.javabeans.RequestDataDTO; +import it.integry.ems.migration._base.IntegryCustomer; +import it.integry.ems.retail.wms.Utility.WMSUtility; +import it.integry.ems.service.EntityProcessor; +import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager; +import it.integry.ems_model.config.EmsRestConstants; +import it.integry.ems_model.entity.MtbColr; +import it.integry.ems_model.entity.MtbColt; +import it.integry.ems_model.utility.UtilityDB; +import it.integry.ems_model.utility.UtilityHashMap; +import it.integry.ems_model.utility.UtilityQuery; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.scheduling.annotation.Scheduled; + +import javax.annotation.PostConstruct; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +@CustomerService(IntegryCustomer.Biolevante) +public class EuroforkDataSyncronizerService { + + private final Logger logger = LogManager.getLogger(); + + private final EntityProcessor entityProcessor; + + public EuroforkDataSyncronizerService(EntityProcessor entityProcessor) { + this.entityProcessor = entityProcessor; + } + + @PostConstruct + public void init() { + logger.info("EuroforkDataSyncronizerService initialized for Biolevante"); + } + + + @Scheduled(fixedDelay = 1, timeUnit = TimeUnit.MINUTES) + private void syncLuScheduled() { + if (true) //Da abilitare al momento del bisogno + return; + + String sqlRetrieveEuroforkStatus = "SELECT LU.[Number] AS SSCC,\n" + + " ISNULL(\n" + + " IIF(LEN(Cells.[Note]) > 0, CONCAT('WH1', Cells.[Note]), NULL),\n" + + " CONCAT('WH1',\n" + + " FORMAT(Cells.[Level], '00'),\n" + + " Cells.[ColumnSide],\n" + + " FORMAT(Cells.[Column], '000'))) AS posizione\n" + + "FROM LU\n" + + " INNER JOIN Cells ON LU.Cells_ID = Cells.ID\n" + + "WHERE Element IN ('Bay', 'Cell')\n" + + " AND LU.[State] = 'Warehouse'"; + + try (MultiDBTransactionManager mdbEurofork = new MultiDBTransactionManager("EUROFORK"); + MultiDBTransactionManager mdbInternal = new MultiDBTransactionManager("BIOLEVANTE")) { + + final List> internalAssignedPositions = UtilityDB.executeSimpleQuery(mdbInternal.getPrimaryConnection(), + "SELECT DISTINCT barcode_ul, mvw.posizione\n" + + "FROM mvw_sitart_udc_det_inventario mvw\n" + + " INNER JOIN mtb_depo_posizioni ON mvw.posizione = mtb_depo_posizioni.posizione\n" + + "WHERE mtb_depo_posizioni.cod_area = 'WH1'"); + + final HashMap internalAssignedPositionsMap = new HashMap<>(); + for (HashMap row : internalAssignedPositions) { + String barcodeUl = UtilityHashMap.getValueIfExists(row, "barcode_ul"); + String posizione = UtilityHashMap.getValueIfExists(row, "posizione"); + internalAssignedPositionsMap.put(barcodeUl, posizione); + } + + final List> euroforkAssignedPositions = UtilityDB.executeSimpleQuery(mdbEurofork.getPrimaryConnection(), sqlRetrieveEuroforkStatus); + final HashMap euroforkAssignedPositionsMap = new HashMap<>(); + for (HashMap row : euroforkAssignedPositions) { + String barcodeUl = UtilityHashMap.getValueIfExists(row, "SSCC"); + String posizione = UtilityHashMap.getValueIfExists(row, "posizione"); + euroforkAssignedPositionsMap.put(barcodeUl, posizione); + } + + // Mappa delle posizioni da aggiornare (barcodeUl, (oldPosizione, newPosizione)) + HashMap> updateMap = new HashMap<>(); + + //Rimuovo le posizioni che non sono più presenti in Eurofork + for (String barcodeUl : internalAssignedPositionsMap.keySet()) { + String newPosizione = euroforkAssignedPositionsMap.getOrDefault(barcodeUl, null); + updateMap.put(barcodeUl, new Tuple2<>(internalAssignedPositionsMap.get(barcodeUl), newPosizione)); + } + + //Aggiungo le nuove posizioni presenti in Eurofork + for (String barcodeUl : euroforkAssignedPositionsMap.keySet()) { + if (!internalAssignedPositionsMap.containsKey(barcodeUl)) { + String newPosizione = euroforkAssignedPositionsMap.get(barcodeUl); + updateMap.put(barcodeUl, new Tuple2<>(null, newPosizione)); + } + } + + //Aggiorno solo le posizioni che sono cambiate + final Map> dataToStore = updateMap.entrySet() + .stream().filter(x -> !Objects.equals(x.getValue().getV1(), x.getValue().getV2())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + + //Controllo la correttezza degli SSCC + String sql = "SELECT barcode_ul FROM mvw_sitart_udc_det_inventario\n" + + "WHERE barcode_ul IN (" + UtilityQuery.concatStringFieldsWithSeparator(new ArrayList<>(dataToStore.keySet()), ",") + ")"; + + final List existantsUl = UtilityDB.executeSimpleQueryOnlyFirstColumn(mdbInternal.getPrimaryConnection(), sql); + + //Aggiorno solo gli SSCC esistenti + final Map> dataToStore2 = dataToStore.entrySet() + .stream().filter(x -> existantsUl.contains(x.getKey())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + + RequestDataDTO requestDataDTO = RequestDataDTO.systemMockupData(); + + for (Map.Entry> ulRow : dataToStore2.entrySet()) { + MtbColt internalMovement = WMSUtility.createInternalMovement(mdbInternal.getPrimaryConnection(), "01", requestDataDTO.getUsername()); + final List cambiaPosizioneUlMovement = + WMSUtility.createCambiaPosizioneUlMovement( + mdbInternal.getPrimaryConnection(), + ulRow.getKey(), + false, + "01", + ulRow.getValue().getV2() == null ? EmsRestConstants.NULL : ulRow.getValue().getV2()); + internalMovement.setMtbColr(cambiaPosizioneUlMovement); + + entityProcessor.processEntity(internalMovement, false, false, requestDataDTO.getUsername(), mdbInternal, requestDataDTO); + } + + String tmp = ""; + + } catch (Exception e) { + throw new RuntimeException(e); + } + + } + +} diff --git a/ems-engine/src/main/java/it/integry/ems/retail/wms/Utility/WMSUtility.java b/ems-engine/src/main/java/it/integry/ems/retail/wms/Utility/WMSUtility.java index 9426001524..d34b17306c 100644 --- a/ems-engine/src/main/java/it/integry/ems/retail/wms/Utility/WMSUtility.java +++ b/ems-engine/src/main/java/it/integry/ems/retail/wms/Utility/WMSUtility.java @@ -167,6 +167,9 @@ public class WMSUtility { final List mvwSitArtUdcDetInventarioDTOS = wmsGiacenzaULService.retrieveArtsInGiacenzaByBarcodeUls(connection, ssccList, true); + if (mvwSitArtUdcDetInventarioDTOS == null) + throw new Exception("Errore nel recupero degli articoli per il barcode: " + StringUtils.join(ssccList, ", ")); + if (mvwSitArtUdcDetInventarioDTOS.isEmpty()) throw new Exception("Nessun articolo trovato per il barcode: " + ssccList); diff --git a/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/controller/WMSMagazzinoAutomaticoController.java b/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/controller/WMSMagazzinoAutomaticoController.java index febb64d615..4364b4ef61 100644 --- a/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/controller/WMSMagazzinoAutomaticoController.java +++ b/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/controller/WMSMagazzinoAutomaticoController.java @@ -1,10 +1,12 @@ package it.integry.ems.retail.wms.generic.controller; import it.integry.common.var.CommonConstants; +import it.integry.ems.javabeans.RequestDataDTO; import it.integry.ems.response.ServiceRestResponse; import it.integry.ems.retail.wms.generic.dto.MagazzinoAutomaticoPickItemsRequestDTO; import it.integry.ems.retail.wms.generic.dto.MagazzinoAutomaticoPutItemsRequestDTO; import it.integry.ems.retail.wms.generic.service.WMSMagazzinoAutomaticoService; +import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; @@ -21,13 +23,18 @@ public class WMSMagazzinoAutomaticoController { @Autowired private WMSMagazzinoAutomaticoService wmsMagazzinoAutomaticoService; + @Autowired + private MultiDBTransactionManager multiDBTransactionManager; + @Autowired + private RequestDataDTO requestDataDTO; + @RequestMapping(value = "{posizione}/pickItems", method = RequestMethod.POST) public @ResponseBody ServiceRestResponse pickItems(@RequestParam(CommonConstants.PROFILE_DB) String profileDB, @PathVariable String posizione, @RequestBody MagazzinoAutomaticoPickItemsRequestDTO magazzinoAutomaticoPickItemsRequestDTO) throws Exception { - wmsMagazzinoAutomaticoService.pickItems(magazzinoAutomaticoPickItemsRequestDTO); + wmsMagazzinoAutomaticoService.pickItems(multiDBTransactionManager, magazzinoAutomaticoPickItemsRequestDTO); return ServiceRestResponse.createPositiveResponse(); } @@ -38,7 +45,7 @@ public class WMSMagazzinoAutomaticoController { ServiceRestResponse putItems(@RequestParam(CommonConstants.PROFILE_DB) String profileDB, @PathVariable String posizione, @RequestBody MagazzinoAutomaticoPutItemsRequestDTO magazzinoAutomaticoPutItemsRequestDTO) throws Exception { - wmsMagazzinoAutomaticoService.putItems(magazzinoAutomaticoPutItemsRequestDTO); + wmsMagazzinoAutomaticoService.putItems(multiDBTransactionManager, requestDataDTO.getUsername(), posizione, magazzinoAutomaticoPutItemsRequestDTO); return ServiceRestResponse.createPositiveResponse(); } diff --git a/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/service/WMSMagazzinoAutomaticoService.java b/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/service/WMSMagazzinoAutomaticoService.java index 71bcc47cb2..3816c8ba7a 100644 --- a/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/service/WMSMagazzinoAutomaticoService.java +++ b/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/service/WMSMagazzinoAutomaticoService.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.JsonNode; import it.integry.ems.export.enums.EntityExportType; import it.integry.ems.json.ResponseJSONObjectMapper; import it.integry.ems.logistic.Export.ColliExporter; +import it.integry.ems.retail.wms.Utility.WMSUtility; import it.integry.ems.retail.wms.dto.CreateUDSRequestDTO; import it.integry.ems.retail.wms.dto.CreateUDSRequestOrderDTO; import it.integry.ems.retail.wms.generic.dto.*; @@ -14,7 +15,9 @@ import it.integry.ems.service.EntityProcessor; import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager; import it.integry.ems.user.UserSession; import it.integry.ems_model.entity.DtbOrdr; +import it.integry.ems_model.entity.MtbColr; import it.integry.ems_model.entity.MtbColt; +import it.integry.ems_model.entity.MtbDepoPosizioni; import it.integry.ems_model.types.OperationType; import it.integry.ems_model.utility.UtilityLocalDate; import org.springframework.beans.factory.annotation.Autowired; @@ -45,13 +48,10 @@ public class WMSMagazzinoAutomaticoService { @Autowired private WMSSpedizioneService wmsSpedizioneService; - @Autowired - private MultiDBTransactionManager multiDBTransactionManager; - @Autowired private UserSession userSession; - public void pickItems(MagazzinoAutomaticoPickItemsRequestDTO magazzinoAutomaticoPickItemsRequestDTO) throws Exception { + public void pickItems(MultiDBTransactionManager multiDBTransactionManager, MagazzinoAutomaticoPickItemsRequestDTO magazzinoAutomaticoPickItemsRequestDTO) throws Exception { MtbColt refMtbColt = null; if (magazzinoAutomaticoPickItemsRequestDTO.isShouldCreateUDS()) { @@ -109,13 +109,27 @@ public class WMSMagazzinoAutomaticoService { } - public void putItems(MagazzinoAutomaticoPutItemsRequestDTO magazzinoAutomaticoPutItemsRequestDTO) throws Exception { + public void putItems(MultiDBTransactionManager multiDBTransactionManager, String username, String posizione, MagazzinoAutomaticoPutItemsRequestDTO magazzinoAutomaticoPutItemsRequestDTO) throws Exception { MtbColt mtbColtToPut = magazzinoAutomaticoPutItemsRequestDTO.getInputMtbColt(); JsonNode node = jsonObjectMapper.valueToTree(mtbColtToPut); - emsServices.export( - EntityExportType.COLLI.getText(), - ColliExporter.Format.ICON_ACCETTAZIONE.getText(), - node, false); + final MtbDepoPosizioni mtbDepoPosizione = WMSUtility.getPosizioneFromName(multiDBTransactionManager.getPrimaryConnection(), posizione); + + if (mtbDepoPosizione == null) + return; + + if (mtbDepoPosizione.getTipoMagazAutomatico().equalsIgnoreCase("SILO2")) { + emsServices.export( + EntityExportType.COLLI.getText(), + ColliExporter.Format.ICON_ACCETTAZIONE.getText(), + node, false); + } else { + MtbColt internalMovement = WMSUtility.createInternalMovement(multiDBTransactionManager.getPrimaryConnection(), mtbColtToPut.getCodMdep(), username); + final List cambiaPosizioneUlMovement = WMSUtility.createCambiaPosizioneUlMovement(multiDBTransactionManager.getPrimaryConnection(), mtbColtToPut.getBarcodeUl(), false, mtbColtToPut.getCodMdep(), mtbDepoPosizione.getPosizione()); + internalMovement.setMtbColr(cambiaPosizioneUlMovement); + + entityProcessor.processEntity(internalMovement, multiDBTransactionManager); + + } } } From 7bd80d9e52d49667794eed01362069bb8f315758 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Tue, 14 Oct 2025 12:36:22 +0200 Subject: [PATCH 08/13] Vario magazzino automatico --- .../ems_model/entity/MtbDepoPosizioni.java | 50 ++++++++++++++++--- ...MissioniMagazzinoAutomaticoController.java | 41 ++++++++++++++- .../dto/MoveLuRequestDTO.java | 25 ++++++++++ ...agazzinoAutomaticoMoveItemsRequestDTO.java | 27 ++++++++++ .../WMSMagazzinoAutomaticoController.java | 27 ++++++++-- .../generic/service/WMSGiacenzaULService.java | 31 ++++++++---- .../WMSMagazzinoAutomaticoService.java | 49 ++++++++++++++---- 7 files changed, 217 insertions(+), 33 deletions(-) create mode 100644 ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MoveLuRequestDTO.java create mode 100644 ems-engine/src/main/java/it/integry/ems/retail/wms/dto/MagazzinoAutomaticoMoveItemsRequestDTO.java diff --git a/ems-core/src/main/java/it/integry/ems_model/entity/MtbDepoPosizioni.java b/ems-core/src/main/java/it/integry/ems_model/entity/MtbDepoPosizioni.java index 7ca24f9b57..f0ff308ac1 100644 --- a/ems-core/src/main/java/it/integry/ems_model/entity/MtbDepoPosizioni.java +++ b/ems-core/src/main/java/it/integry/ems_model/entity/MtbDepoPosizioni.java @@ -51,7 +51,7 @@ public class MtbDepoPosizioni extends EntityBase { private Long idPosizione; @SqlField(value = "tipo_magaz_automatico", maxLength = 40) - private String tipoMagazAutomatico; + private TipoMagazzinoAutomaticoEnum tipoMagazAutomatico; @SqlField(value = "posti_pallet", nullable = false, defaultObjectValue = "0") private Integer postiPallet; @@ -145,10 +145,15 @@ public class MtbDepoPosizioni extends EntityBase { return this; } - public String getTipoMagazAutomatico() { + public TipoMagazzinoAutomaticoEnum getTipoMagazAutomatico() { return tipoMagazAutomatico; } + public MtbDepoPosizioni setTipoMagazAutomatico(TipoMagazzinoAutomaticoEnum tipoMagazAutomatico) { + this.tipoMagazAutomatico = tipoMagazAutomatico; + return this; + } + public Integer getPostiPallet() { return postiPallet; } @@ -157,11 +162,6 @@ public class MtbDepoPosizioni extends EntityBase { this.postiPallet = postiPallet; } - public MtbDepoPosizioni setTipoMagazAutomatico(String tipoMagazAutomatico) { - this.tipoMagazAutomatico = tipoMagazAutomatico; - return this; - } - public String getCodArea() { return codArea; } @@ -230,4 +230,40 @@ public class MtbDepoPosizioni extends EntityBase { return from(val); } } + + public enum TipoMagazzinoAutomaticoEnum implements IBaseEnum { + + SILO2("SILO2"), + EUROFORK("EUROFORK"); + + private final String value; + + TipoMagazzinoAutomaticoEnum(String value) { + this.value = value; + } + + public static TipoMagazzinoAutomaticoEnum from(Object value) { + String castValue = (String) value; + for (TipoMagazzinoAutomaticoEnum b : TipoMagazzinoAutomaticoEnum.values()) { + if (b.value.equalsIgnoreCase(castValue)) + return b; + } + return null; + } + + @JsonValue + public String getValue() { + return this.value; + } + + @Override + public Object get() { + return this.value; + } + + @Override + public TipoMagazzinoAutomaticoEnum fromInternal(Object val) { + return from(val); + } + } } diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/controller/MissioniMagazzinoAutomaticoController.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/controller/MissioniMagazzinoAutomaticoController.java index 419950baa4..8af627f290 100644 --- a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/controller/MissioniMagazzinoAutomaticoController.java +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/controller/MissioniMagazzinoAutomaticoController.java @@ -7,6 +7,7 @@ import it.integry.ems.logistic.missioni.magazzino_automatico.dto.CreateMissioneM import it.integry.ems.logistic.missioni.magazzino_automatico.dto.LogErrorMissioneMagazzinoAutomaticoRequestDTO; import it.integry.ems.logistic.missioni.magazzino_automatico.service.MissioniMagazzinoAutomaticoService; import it.integry.ems.response.ServiceRestResponse; +import it.integry.ems.retail.wms.generic.service.WMSGiacenzaULService; import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager; import it.integry.ems.user.UserSession; import org.apache.logging.log4j.LogManager; @@ -26,12 +27,14 @@ public class MissioniMagazzinoAutomaticoController { private final MultiDBTransactionManager multiDBTransactionManager; private final RequestDataDTO requestDataDTO; private final UserSession userSession; + private final WMSGiacenzaULService wmsGiacenzaULService; - public MissioniMagazzinoAutomaticoController(MissioniMagazzinoAutomaticoService missioniMagazzinoAutomaticoService, MultiDBTransactionManager multiDBTransactionManager, RequestDataDTO requestDataDTO, UserSession userSession) { + public MissioniMagazzinoAutomaticoController(MissioniMagazzinoAutomaticoService missioniMagazzinoAutomaticoService, MultiDBTransactionManager multiDBTransactionManager, RequestDataDTO requestDataDTO, UserSession userSession, WMSGiacenzaULService wmsGiacenzaULService) { this.missioniMagazzinoAutomaticoService = missioniMagazzinoAutomaticoService; this.multiDBTransactionManager = multiDBTransactionManager; this.requestDataDTO = requestDataDTO; this.userSession = userSession; + this.wmsGiacenzaULService = wmsGiacenzaULService; } @@ -85,7 +88,7 @@ public class MissioniMagazzinoAutomaticoController { } - @GetMapping(value = "log-error") + @PostMapping(value = "log-error") public @ResponseBody ServiceRestResponse logError(@RequestParam(CommonConstants.PROFILE_DB) String profileDB, @RequestBody LogErrorMissioneMagazzinoAutomaticoRequestDTO requestBody) throws Exception { @@ -98,4 +101,38 @@ public class MissioniMagazzinoAutomaticoController { return ServiceRestResponse.createPositiveResponse(); } + +// @PostMapping(value = "move-lu") +// public @ResponseBody +// ServiceRestResponse moveLu(@RequestParam(CommonConstants.PROFILE_DB) String profileDB, +// @RequestBody MoveLuRequestDTO requestBody) throws Exception { +// userSession.checkUser(); +// +// final List giacenzaItems = wmsGiacenzaULService.retrieveArtsInGiacenzaByBarcodeUl(multiDBTransactionManager.getPrimaryConnection(), requestBody.getBarcodeUl()); +// if(giacenzaItems == null || giacenzaItems.isEmpty()) +// throw new IllegalArgumentException("Unità logistica non trovata: " + requestBody.getBarcodeUl()); +// +// final MvwSitArtUdcDetInventarioDTO giacenzaItem = giacenzaItems.get(0); +// +// final MtbDepoPosizioni posizione = WMSUtility.getPosizioneFromName(multiDBTransactionManager.getPrimaryConnection(), giacenzaItem.getPosizione()); +// if(posizione == null) +// throw new IllegalArgumentException("Posizione non trovata: " + giacenzaItem.getPosizione()); +// +// long missioneId = missioniMagazzinoAutomaticoService.createMissione(multiDBTransactionManager, +// requestDataDTO.getUsername(), +// new MissioneMagazzinoAutomaticoDTO(){{ +//// setCodCmac(requestBody.getCodCmac()); +//// setRows(requestBody.getRows()); +// }}); +// +// +// return ServiceRestResponse.createPositiveResponse( +// new CreateMissioneMagazzinoAutomaticoResponseDTO(missioneId)); +// +// return ServiceRestResponse.createPositiveResponse(); +// } + + + + } diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MoveLuRequestDTO.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MoveLuRequestDTO.java new file mode 100644 index 0000000000..c001e9e9e5 --- /dev/null +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MoveLuRequestDTO.java @@ -0,0 +1,25 @@ +package it.integry.ems.logistic.missioni.magazzino_automatico.dto; + +public class MoveLuRequestDTO { + + private String barcodeUl; + private String posizioneDestinazione; + + public String getBarcodeUl() { + return barcodeUl; + } + + public MoveLuRequestDTO setBarcodeUl(String barcodeUl) { + this.barcodeUl = barcodeUl; + return this; + } + + public String getPosizioneDestinazione() { + return posizioneDestinazione; + } + + public MoveLuRequestDTO setPosizioneDestinazione(String posizioneDestinazione) { + this.posizioneDestinazione = posizioneDestinazione; + return this; + } +} diff --git a/ems-engine/src/main/java/it/integry/ems/retail/wms/dto/MagazzinoAutomaticoMoveItemsRequestDTO.java b/ems-engine/src/main/java/it/integry/ems/retail/wms/dto/MagazzinoAutomaticoMoveItemsRequestDTO.java new file mode 100644 index 0000000000..2186cc5e1e --- /dev/null +++ b/ems-engine/src/main/java/it/integry/ems/retail/wms/dto/MagazzinoAutomaticoMoveItemsRequestDTO.java @@ -0,0 +1,27 @@ +package it.integry.ems.retail.wms.dto; + +import java.util.List; + +public class MagazzinoAutomaticoMoveItemsRequestDTO { + + private List barcodeUl; + private String posizioneDestinazione; + + public List getBarcodeUl() { + return barcodeUl; + } + + public MagazzinoAutomaticoMoveItemsRequestDTO setBarcodeUl(List barcodeUl) { + this.barcodeUl = barcodeUl; + return this; + } + + public String getPosizioneDestinazione() { + return posizioneDestinazione; + } + + public MagazzinoAutomaticoMoveItemsRequestDTO setPosizioneDestinazione(String posizioneDestinazione) { + this.posizioneDestinazione = posizioneDestinazione; + return this; + } +} diff --git a/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/controller/WMSMagazzinoAutomaticoController.java b/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/controller/WMSMagazzinoAutomaticoController.java index 4364b4ef61..00d113da56 100644 --- a/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/controller/WMSMagazzinoAutomaticoController.java +++ b/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/controller/WMSMagazzinoAutomaticoController.java @@ -3,10 +3,12 @@ package it.integry.ems.retail.wms.generic.controller; import it.integry.common.var.CommonConstants; import it.integry.ems.javabeans.RequestDataDTO; import it.integry.ems.response.ServiceRestResponse; +import it.integry.ems.retail.wms.dto.MagazzinoAutomaticoMoveItemsRequestDTO; import it.integry.ems.retail.wms.generic.dto.MagazzinoAutomaticoPickItemsRequestDTO; import it.integry.ems.retail.wms.generic.dto.MagazzinoAutomaticoPutItemsRequestDTO; import it.integry.ems.retail.wms.generic.service.WMSMagazzinoAutomaticoService; import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager; +import it.integry.ems.user.UserSession; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; @@ -25,29 +27,46 @@ public class WMSMagazzinoAutomaticoController { @Autowired private MultiDBTransactionManager multiDBTransactionManager; + @Autowired private RequestDataDTO requestDataDTO; + @Autowired + private UserSession userSession; - @RequestMapping(value = "{posizione}/pickItems", method = RequestMethod.POST) + @PostMapping(value = "{posizione}/pickItems") public @ResponseBody ServiceRestResponse pickItems(@RequestParam(CommonConstants.PROFILE_DB) String profileDB, @PathVariable String posizione, @RequestBody MagazzinoAutomaticoPickItemsRequestDTO magazzinoAutomaticoPickItemsRequestDTO) throws Exception { + userSession.checkUser(); wmsMagazzinoAutomaticoService.pickItems(multiDBTransactionManager, magazzinoAutomaticoPickItemsRequestDTO); return ServiceRestResponse.createPositiveResponse(); } - @RequestMapping(value = "{posizione}/putItems", method = RequestMethod.POST) + @PostMapping(value = "{posizione}/putItems") public @ResponseBody ServiceRestResponse putItems(@RequestParam(CommonConstants.PROFILE_DB) String profileDB, - @PathVariable String posizione, - @RequestBody MagazzinoAutomaticoPutItemsRequestDTO magazzinoAutomaticoPutItemsRequestDTO) throws Exception { + @PathVariable String posizione, + @RequestBody MagazzinoAutomaticoPutItemsRequestDTO magazzinoAutomaticoPutItemsRequestDTO) throws Exception { + userSession.checkUser(); wmsMagazzinoAutomaticoService.putItems(multiDBTransactionManager, requestDataDTO.getUsername(), posizione, magazzinoAutomaticoPutItemsRequestDTO); return ServiceRestResponse.createPositiveResponse(); } + + @PostMapping(value = "moveItems") + public @ResponseBody + ServiceRestResponse moveItems(@RequestParam(CommonConstants.PROFILE_DB) String profileDB, + @PathVariable String posizione, + @RequestBody MagazzinoAutomaticoMoveItemsRequestDTO requestBody) throws Exception { + userSession.checkUser(); + wmsMagazzinoAutomaticoService.moveItems(multiDBTransactionManager, requestDataDTO.getUsername(), requestBody); + + return ServiceRestResponse.createPositiveResponse(); + } + } diff --git a/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/service/WMSGiacenzaULService.java b/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/service/WMSGiacenzaULService.java index 51bfe4e7dd..a46224a1a2 100644 --- a/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/service/WMSGiacenzaULService.java +++ b/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/service/WMSGiacenzaULService.java @@ -7,7 +7,6 @@ import it.integry.ems.retail.wms.generic.dto.RetrieveArtsInGiacenzaByArtRequestD import it.integry.ems.retail.wms.generic.dto.StatoArtInventarioDTO; import it.integry.ems.sync.MultiDBTransaction.Connection; import it.integry.ems_model.config.EmsRestConstants; -import it.integry.ems_model.entity.MtbColt; import it.integry.ems_model.utility.UtilityDB; import it.integry.ems_model.utility.UtilityHashMap; import it.integry.ems_model.utility.UtilityQuery; @@ -356,15 +355,27 @@ public class WMSGiacenzaULService { return UtilityDB.executeSimpleQueryDTO(connection, sql, MvwSitArtUdcDetInventarioDTO.class); } - public List retrieveArtByMtbColt(Connection connection, MtbColt mtbColt) throws Exception { - return retrieveArtsByUL(connection, - mtbColt.getGestione(), - mtbColt.getDataCollo(), - mtbColt.getSerCollo(), - mtbColt.getNumCollo(), - mtbColt.getSegno(), - null, null); + + public HashMap checkIfUlsAreInGiacenza(Connection connection, List barcodeUls) throws Exception { + if (barcodeUls == null || barcodeUls.isEmpty()) + return new HashMap<>(); + + String sql = "SELECT DISTINCT barcode_ul FROM mvw_sitart_udc_det_inventario " + + "WHERE barcode_ul IN (" + UtilityQuery.concatStringFieldsWithSeparator(barcodeUls, ", ") + ")"; + + List> results = UtilityDB.executeSimpleQuery(connection, sql); + + HashMap resultMap = new HashMap<>(); + for (String ul : barcodeUls) + resultMap.put(ul, false); + + for (HashMap row : results) { + String ul = UtilityHashMap.getValueIfExists(row, "barcode_ul"); + if (!UtilityString.isNullOrEmpty(ul)) + resultMap.put(ul, true); + } + + return resultMap; } - } diff --git a/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/service/WMSMagazzinoAutomaticoService.java b/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/service/WMSMagazzinoAutomaticoService.java index 8c9990b7d5..30fa99d781 100644 --- a/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/service/WMSMagazzinoAutomaticoService.java +++ b/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/service/WMSMagazzinoAutomaticoService.java @@ -8,6 +8,7 @@ import it.integry.ems.logistic.Export.ColliExporter; import it.integry.ems.retail.wms.Utility.WMSUtility; import it.integry.ems.retail.wms.dto.CreateUDSRequestDTO; import it.integry.ems.retail.wms.dto.CreateUDSRequestOrderDTO; +import it.integry.ems.retail.wms.dto.MagazzinoAutomaticoMoveItemsRequestDTO; import it.integry.ems.retail.wms.generic.dto.*; import it.integry.ems.retail.wms.lavorazione.service.WMSLavorazioneService; import it.integry.ems.retail.wms.vendita.service.WMSSpedizioneService; @@ -21,11 +22,13 @@ import it.integry.ems_model.entity.MtbColt; import it.integry.ems_model.entity.MtbDepoPosizioni; import it.integry.ems_model.types.OperationType; import it.integry.ems_model.utility.UtilityLocalDate; +import org.apache.commons.lang3.NotImplementedException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; import java.math.BigDecimal; +import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; @@ -54,6 +57,8 @@ public class WMSMagazzinoAutomaticoService { @Autowired private RequestDataDTO requestDataDTO; + @Autowired + private WMSGiacenzaULService wmsGiacenzaULService; public void pickItems(MultiDBTransactionManager multiDBTransactionManager, MagazzinoAutomaticoPickItemsRequestDTO magazzinoAutomaticoPickItemsRequestDTO) throws Exception { @@ -122,18 +127,42 @@ public class WMSMagazzinoAutomaticoService { if (mtbDepoPosizione == null) return; - if (mtbDepoPosizione.getTipoMagazAutomatico().equalsIgnoreCase("SILO2")) { - emsServices.export(multiDBTransactionManager, requestDataDTO, - EntityExportType.COLLI.getText(), - ColliExporter.Format.ICON_ACCETTAZIONE.getText(), - node, false); - } else { - MtbColt internalMovement = WMSUtility.createInternalMovement(multiDBTransactionManager.getPrimaryConnection(), mtbColtToPut.getCodMdep(), username); - final List cambiaPosizioneUlMovement = WMSUtility.createCambiaPosizioneUlMovement(multiDBTransactionManager.getPrimaryConnection(), mtbColtToPut.getBarcodeUl(), false, mtbColtToPut.getCodMdep(), mtbDepoPosizione.getPosizione()); - internalMovement.setMtbColr(cambiaPosizioneUlMovement); + switch (mtbDepoPosizione.getTipoMagazAutomatico()) { + case SILO2: + emsServices.export(multiDBTransactionManager, requestDataDTO, + EntityExportType.COLLI.getText(), + ColliExporter.Format.ICON_ACCETTAZIONE.getText(), + node, false); + break; + case EUROFORK: + MtbColt internalMovement = WMSUtility.createInternalMovement(multiDBTransactionManager.getPrimaryConnection(), mtbColtToPut.getCodMdep(), username); + final List cambiaPosizioneUlMovement = WMSUtility.createCambiaPosizioneUlMovement(multiDBTransactionManager.getPrimaryConnection(), mtbColtToPut.getBarcodeUl(), false, mtbColtToPut.getCodMdep(), mtbDepoPosizione.getPosizione()); + internalMovement.setMtbColr(cambiaPosizioneUlMovement); - entityProcessor.processEntity(internalMovement, multiDBTransactionManager); + entityProcessor.processEntity(internalMovement, multiDBTransactionManager); + break; + default: + throw new NotImplementedException("Tipo magazzino automatico non gestito: " + mtbDepoPosizione.getTipoMagazAutomatico()); } } + + + public void moveItems(MultiDBTransactionManager multiDBTransactionManager, String username, MagazzinoAutomaticoMoveItemsRequestDTO inputData) throws Exception { + final HashMap giacenzaItems = + wmsGiacenzaULService.checkIfUlsAreInGiacenza(multiDBTransactionManager.getPrimaryConnection(), inputData.getBarcodeUl()); + + if (giacenzaItems == null || giacenzaItems.isEmpty()) + throw new IllegalArgumentException("Unità logistica non trovata: " + inputData.getBarcodeUl()); + + if (giacenzaItems.values().stream().anyMatch(x -> !x)) + throw new IllegalArgumentException("Unità logistica non in giacenza: " + giacenzaItems.entrySet().stream() + .filter(x -> !x.getValue()) + .findFirst() + .get() + .getKey()); + + + + } } From ea6cb1e9d78082a0eb96e5fa72197cac4bf00c27 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Thu, 16 Oct 2025 12:50:37 +0200 Subject: [PATCH 09/13] Aggiunte annotazioni nel dto di moveItems per Magazzino Automatico --- .../dto/MagazzinoAutomaticoMoveItemsRequestDTO.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ems-engine/src/main/java/it/integry/ems/retail/wms/dto/MagazzinoAutomaticoMoveItemsRequestDTO.java b/ems-engine/src/main/java/it/integry/ems/retail/wms/dto/MagazzinoAutomaticoMoveItemsRequestDTO.java index 2186cc5e1e..56a9d984e7 100644 --- a/ems-engine/src/main/java/it/integry/ems/retail/wms/dto/MagazzinoAutomaticoMoveItemsRequestDTO.java +++ b/ems-engine/src/main/java/it/integry/ems/retail/wms/dto/MagazzinoAutomaticoMoveItemsRequestDTO.java @@ -6,6 +6,7 @@ public class MagazzinoAutomaticoMoveItemsRequestDTO { private List barcodeUl; private String posizioneDestinazione; + private String annotazioni; public List getBarcodeUl() { return barcodeUl; @@ -24,4 +25,13 @@ public class MagazzinoAutomaticoMoveItemsRequestDTO { this.posizioneDestinazione = posizioneDestinazione; return this; } + + public String getAnnotazioni() { + return annotazioni; + } + + public MagazzinoAutomaticoMoveItemsRequestDTO setAnnotazioni(String annotazioni) { + this.annotazioni = annotazioni; + return this; + } } From 3e9793eb76ffbbfe860619c1952d8ae53a34ee92 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Thu, 16 Oct 2025 15:22:07 +0200 Subject: [PATCH 10/13] Aggiunto servizio di moveItem in Magazzino Automatico --- .../model/Migration_20250925103840.java | 7 +- .../ems_model/entity/MtbMissioneMagAuto.java | 27 ++++-- .../dto/MissioneMagazzinoAutomaticoDTO.java | 21 +++-- .../MissioniMagazzinoAutomaticoService.java | 45 +++++++++- .../MissioniMagazzinoAutomaticoUtils.java | 7 +- .../ems/retail/wms/Utility/WMSUtility.java | 9 +- .../WMSMagazzinoAutomaticoController.java | 1 - .../generic/service/WMSGiacenzaULService.java | 22 +++++ .../WMSMagazzinoAutomaticoService.java | 83 +++++++++++++++++-- 9 files changed, 192 insertions(+), 30 deletions(-) diff --git a/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250925103840.java b/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250925103840.java index f9f5f1c7bf..9a0900030a 100644 --- a/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250925103840.java +++ b/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250925103840.java @@ -16,9 +16,10 @@ public class Migration_20250925103840 extends BaseMigration implements Migration " id BIGINT IDENTITY\n" + " CONSTRAINT mtb_missione_mag_auto_pk\n" + " PRIMARY KEY,\n" + - " cod_cmac VARCHAR(20) NOT NULL\n" + - " CONSTRAINT mtb_missione_mag_auto_ctb_amac_cod_cmac_fk\n" + - " REFERENCES dbo.ctb_amac,\n" + + " cod_mdep VARCHAR(5) NOT NULL,\n" + + " cod_area VARCHAR(15) NOT NULL,\n" + + " CONSTRAINT table_name_mtb_depo_area_cod_area_cod_mdep_fk\n" + + " FOREIGN KEY (cod_mdep, cod_area) REFERENCES dbo.mtb_depo_area (cod_mdep, cod_area),\n" + " created_by VARCHAR(40) NOT NULL\n" + " CONSTRAINT mtb_missione_mag_auto_stb_user_user_name_fk\n" + " REFERENCES dbo.stb_user,\n" + diff --git a/ems-core/src/main/java/it/integry/ems_model/entity/MtbMissioneMagAuto.java b/ems-core/src/main/java/it/integry/ems_model/entity/MtbMissioneMagAuto.java index 9b533f650f..ad98b57aa2 100644 --- a/ems-core/src/main/java/it/integry/ems_model/entity/MtbMissioneMagAuto.java +++ b/ems-core/src/main/java/it/integry/ems_model/entity/MtbMissioneMagAuto.java @@ -33,9 +33,13 @@ public class MtbMissioneMagAuto extends EntityBase { @SqlField(value = "id", nullable = false) private Long id; - @SqlField(value = "cod_cmac", maxLength = 20, nullable = false) - @FK(tableName = CtbAmac.ENTITY, columnName = "cod_cmac") - private String codCmac; + @SqlField(value = "cod_mdep", maxLength = 5, nullable = false) + @FK(tableName = MtbDepoArea.ENTITY, columnName = "cod_mdep") + private String codMdep; + + @SqlField(value = "cod_area", maxLength = 15, nullable = false) + @FK(tableName = MtbDepoArea.ENTITY, columnName = "cod_area") + private String codArea; @SqlField(value = "created_by", maxLength = 40, nullable = false) @FK(tableName = StbUser.ENTITY, columnName = "user_name") @@ -56,12 +60,21 @@ public class MtbMissioneMagAuto extends EntityBase { return this; } - public String getCodCmac() { - return codCmac; + public String getCodMdep() { + return codMdep; } - public MtbMissioneMagAuto setCodCmac(String codCmac) { - this.codCmac = codCmac; + public MtbMissioneMagAuto setCodMdep(String codMdep) { + this.codMdep = codMdep; + return this; + } + + public String getCodArea() { + return codArea; + } + + public MtbMissioneMagAuto setCodArea(String codArea) { + this.codArea = codArea; return this; } diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoDTO.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoDTO.java index 5b6fb7cc4c..45338f4fad 100644 --- a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoDTO.java +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/MissioneMagazzinoAutomaticoDTO.java @@ -10,7 +10,9 @@ public class MissioneMagazzinoAutomaticoDTO { @JsonProperty(access = JsonProperty.Access.READ_ONLY) private Long id; - private String codCmac; + private String codMdep; + + private String codArea; @JsonProperty(access = JsonProperty.Access.READ_ONLY) private String createdBy; @@ -36,12 +38,21 @@ public class MissioneMagazzinoAutomaticoDTO { return this; } - public String getCodCmac() { - return codCmac; + public String getCodMdep() { + return codMdep; } - public MissioneMagazzinoAutomaticoDTO setCodCmac(String codCmac) { - this.codCmac = codCmac; + public MissioneMagazzinoAutomaticoDTO setCodMdep(String codMdep) { + this.codMdep = codMdep; + return this; + } + + public String getCodArea() { + return codArea; + } + + public MissioneMagazzinoAutomaticoDTO setCodArea(String codArea) { + this.codArea = codArea; return this; } diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/MissioniMagazzinoAutomaticoService.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/MissioniMagazzinoAutomaticoService.java index 12a3832e12..b0806ace01 100644 --- a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/MissioniMagazzinoAutomaticoService.java +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/MissioniMagazzinoAutomaticoService.java @@ -4,19 +4,24 @@ import it.integry.ems.exception.PrimaryDatabaseNotPresentException; import it.integry.ems.logistic.missioni.magazzino_automatico.dto.MissioneMagazzinoAutomaticoDTO; import it.integry.ems.logistic.missioni.magazzino_automatico.utils.MissioniMagazzinoAutomaticoUtils; import it.integry.ems.service.EntityProcessor; +import it.integry.ems.sync.MultiDBTransaction.Connection; import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager; import it.integry.ems_model.entity.MtbMissioneMagAuto; import it.integry.ems_model.entity.MtbMissioneMagAutoDet; +import it.integry.ems_model.entity.StbUser; import it.integry.ems_model.exception.DataConverterNotFoundException; import it.integry.ems_model.types.OperationType; import it.integry.ems_model.utility.UtilityDB; +import it.integry.ems_model.utility.UtilityHashMap; import it.integry.ems_model.utility.UtilityQuery; import it.integry.ems_model.utility.UtilityString; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; +import javax.validation.constraints.NotNull; import java.sql.SQLException; import java.time.LocalDateTime; +import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; @@ -31,8 +36,13 @@ public class MissioniMagazzinoAutomaticoService { } public List retrieveAll(MultiDBTransactionManager multiDBTransactionManager, boolean onlyPending) throws PrimaryDatabaseNotPresentException, DataConverterNotFoundException, SQLException, InstantiationException, IllegalAccessException { - String sql = "SELECT mmma.*\n" + - "FROM " + MtbMissioneMagAuto.ENTITY + " mmma \n"; + String sql = "SELECT mmma.id,\n" + + " mmma.cod_mdep,\n" + + " mmma.cod_area,\n" + + " mmma.created_at,\n" + + " su.full_name AS created_by\n" + + "FROM " + MtbMissioneMagAuto.ENTITY + " mmma \n" + + "INNER JOIN " + StbUser.ENTITY + " su ON su.user_name = mmma.created_by \n"; if (onlyPending) { sql += "INNER JOIN (SELECT DISTINCT parent_id,\n" + @@ -149,4 +159,35 @@ public class MissioniMagazzinoAutomaticoService { entityProcessor.processEntity(missione, multiDBTransactionManager); } + + public @NotNull HashMap checkIfPendingMissionExists(Connection connection, List ssccToCheck) throws PrimaryDatabaseNotPresentException, SQLException { + if (ssccToCheck == null || ssccToCheck.isEmpty()) + return new HashMap<>(); + + String sql = "SELECT mmma_det.sscc, \n" + + " CAST(COUNT(*) AS BIT) AS esists_missione\n" + + "FROM " + MtbMissioneMagAutoDet.ENTITY + " mmma_det\n" + + "WHERE mmma_det.completed = 0\n" + + " AND mmma_det.skipped = 0\n" + + " AND mmma_det.sscc IN (" + UtilityQuery.concatStringFieldsWithSeparator(ssccToCheck, ",") + ")\n" + + "GROUP BY mmma_det.sscc"; + + List> total = UtilityDB.executeSimpleQuery(connection, sql); + + if (total.isEmpty()) + return new HashMap<>(); + + final HashMap result = new HashMap<>(); + + total.forEach(x -> { + String sscc = UtilityHashMap.getValueIfExists(x, "sscc"); + Boolean existsMissione = UtilityHashMap.getValueIfExists(x, "exists_missione"); + + if (existsMissione) + result.put(sscc, existsMissione); + }); + + return result; + } + } diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/utils/MissioniMagazzinoAutomaticoUtils.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/utils/MissioniMagazzinoAutomaticoUtils.java index 78f3cc84ed..2a8ed330e1 100644 --- a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/utils/MissioniMagazzinoAutomaticoUtils.java +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/utils/MissioniMagazzinoAutomaticoUtils.java @@ -22,7 +22,8 @@ public class MissioniMagazzinoAutomaticoUtils { return new MtbMissioneMagAuto() .setId(inputData.getId()) .setCreatedAt(inputData.getCreatedAt()) - .setCodCmac(inputData.getCodCmac()) + .setCodMdep(inputData.getCodMdep()) + .setCodArea(inputData.getCodArea()) .setMtbMissioneMagAutoDet(inputData.getRows().stream() .map(x -> convertDtoRowToEntity(x, inputData.getId())) .collect(Collectors.toList())); @@ -54,8 +55,10 @@ public class MissioniMagazzinoAutomaticoUtils { public static MissioneMagazzinoAutomaticoDTO convertEntityToDto(MtbMissioneMagAuto inputData) { return new MissioneMagazzinoAutomaticoDTO(inputData.getId()) + .setCreatedBy(inputData.getCreatedBy()) .setCreatedAt(inputData.getCreatedAt()) - .setCodCmac(inputData.getCodCmac()) + .setCodMdep(inputData.getCodMdep()) + .setCodArea(inputData.getCodArea()) .setRows(convertEntityRowListToDto(inputData.getMtbMissioneMagAutoDet())); } diff --git a/ems-engine/src/main/java/it/integry/ems/retail/wms/Utility/WMSUtility.java b/ems-engine/src/main/java/it/integry/ems/retail/wms/Utility/WMSUtility.java index d34b17306c..907bb1369b 100644 --- a/ems-engine/src/main/java/it/integry/ems/retail/wms/Utility/WMSUtility.java +++ b/ems-engine/src/main/java/it/integry/ems/retail/wms/Utility/WMSUtility.java @@ -758,7 +758,14 @@ public class WMSUtility { public static MtbDepoPosizioni getPosizioneFromName(Connection conn, String posizione) throws Exception { - MtbDepoPosizioni mtbDepoPosizioni = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(conn, Query.format("SELECT * from " + MtbDepoPosizioni.ENTITY + " where posizione = {}", posizione), MtbDepoPosizioni.class); + List mtbDepoPosizioni = getPosizioniFromName(conn, Collections.singletonList(posizione)); + return mtbDepoPosizioni == null || mtbDepoPosizioni.isEmpty() ? null : mtbDepoPosizioni.get(0); + } + + public static List getPosizioniFromName(Connection conn, List inputData) throws Exception { + List mtbDepoPosizioni = UtilityDB.executeSimpleQueryDTO(conn, + "SELECT * from " + MtbDepoPosizioni.ENTITY + "\n" + + "WHERE posizione IN (" + UtilityQuery.concatStringFieldsWithSeparator(inputData, ", ") + ")", MtbDepoPosizioni.class); return mtbDepoPosizioni; } diff --git a/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/controller/WMSMagazzinoAutomaticoController.java b/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/controller/WMSMagazzinoAutomaticoController.java index 00d113da56..7f785e7914 100644 --- a/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/controller/WMSMagazzinoAutomaticoController.java +++ b/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/controller/WMSMagazzinoAutomaticoController.java @@ -61,7 +61,6 @@ public class WMSMagazzinoAutomaticoController { @PostMapping(value = "moveItems") public @ResponseBody ServiceRestResponse moveItems(@RequestParam(CommonConstants.PROFILE_DB) String profileDB, - @PathVariable String posizione, @RequestBody MagazzinoAutomaticoMoveItemsRequestDTO requestBody) throws Exception { userSession.checkUser(); wmsMagazzinoAutomaticoService.moveItems(multiDBTransactionManager, requestDataDTO.getUsername(), requestBody); diff --git a/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/service/WMSGiacenzaULService.java b/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/service/WMSGiacenzaULService.java index a46224a1a2..7f266bd789 100644 --- a/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/service/WMSGiacenzaULService.java +++ b/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/service/WMSGiacenzaULService.java @@ -378,4 +378,26 @@ public class WMSGiacenzaULService { return resultMap; } + public HashMap retrieveBarcodeUlsCurrentPosition(Connection connection, List barcodeUls) throws Exception { + if (barcodeUls == null || barcodeUls.isEmpty()) + return new HashMap<>(); + + String sql = "SELECT DISTINCT barcode_ul, posizione FROM mvw_sitart_udc_det_inventario " + + "WHERE barcode_ul IN (" + UtilityQuery.concatStringFieldsWithSeparator(barcodeUls, ", ") + ")"; + + List> results = UtilityDB.executeSimpleQuery(connection, sql); + + HashMap resultMap = new HashMap<>(); + for (String ul : barcodeUls) + resultMap.put(ul, null); + + for (HashMap row : results) { + String ul = UtilityHashMap.getValueIfExists(row, "barcode_ul"); + if (!UtilityString.isNullOrEmpty(ul)) + resultMap.put(ul, UtilityHashMap.getValueIfExists(row, "posizione")); + } + + return resultMap; + } + } diff --git a/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/service/WMSMagazzinoAutomaticoService.java b/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/service/WMSMagazzinoAutomaticoService.java index 30fa99d781..5f899ebb97 100644 --- a/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/service/WMSMagazzinoAutomaticoService.java +++ b/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/service/WMSMagazzinoAutomaticoService.java @@ -5,6 +5,9 @@ import it.integry.ems.export.enums.EntityExportType; import it.integry.ems.javabeans.RequestDataDTO; import it.integry.ems.json.ResponseJSONObjectMapper; import it.integry.ems.logistic.Export.ColliExporter; +import it.integry.ems.logistic.missioni.magazzino_automatico.dto.MissioneMagazzinoAutomaticoDTO; +import it.integry.ems.logistic.missioni.magazzino_automatico.dto.MissioneMagazzinoAutomaticoRowDTO; +import it.integry.ems.logistic.missioni.magazzino_automatico.service.MissioniMagazzinoAutomaticoService; import it.integry.ems.retail.wms.Utility.WMSUtility; import it.integry.ems.retail.wms.dto.CreateUDSRequestDTO; import it.integry.ems.retail.wms.dto.CreateUDSRequestOrderDTO; @@ -57,9 +60,14 @@ public class WMSMagazzinoAutomaticoService { @Autowired private RequestDataDTO requestDataDTO; + @Autowired private WMSGiacenzaULService wmsGiacenzaULService; + @Autowired + private MissioniMagazzinoAutomaticoService missioniMagazzinoAutomaticoService; + + public void pickItems(MultiDBTransactionManager multiDBTransactionManager, MagazzinoAutomaticoPickItemsRequestDTO magazzinoAutomaticoPickItemsRequestDTO) throws Exception { MtbColt refMtbColt = null; @@ -143,25 +151,82 @@ public class WMSMagazzinoAutomaticoService { break; default: - throw new NotImplementedException("Tipo magazzino automatico non gestito: " + mtbDepoPosizione.getTipoMagazAutomatico()); + throw new NotImplementedException("Tipo magazzino automatico non gestito: " + mtbDepoPosizione.getTipoMagazAutomatico().getValue()); } } public void moveItems(MultiDBTransactionManager multiDBTransactionManager, String username, MagazzinoAutomaticoMoveItemsRequestDTO inputData) throws Exception { - final HashMap giacenzaItems = - wmsGiacenzaULService.checkIfUlsAreInGiacenza(multiDBTransactionManager.getPrimaryConnection(), inputData.getBarcodeUl()); + final HashMap existingMissions = + missioniMagazzinoAutomaticoService.checkIfPendingMissionExists(multiDBTransactionManager.getPrimaryConnection(), inputData.getBarcodeUl()); + + if (!existingMissions.isEmpty()) + throw new IllegalArgumentException("Esistono missioni in corso per le unità logistiche: " + String.join(", ", existingMissions.keySet())); + + final HashMap giacenzaItems = + wmsGiacenzaULService.retrieveBarcodeUlsCurrentPosition(multiDBTransactionManager.getPrimaryConnection(), inputData.getBarcodeUl()); if (giacenzaItems == null || giacenzaItems.isEmpty()) throw new IllegalArgumentException("Unità logistica non trovata: " + inputData.getBarcodeUl()); - if (giacenzaItems.values().stream().anyMatch(x -> !x)) - throw new IllegalArgumentException("Unità logistica non in giacenza: " + giacenzaItems.entrySet().stream() - .filter(x -> !x.getValue()) - .findFirst() - .get() - .getKey()); + //Controlli base per correttezza dei barcode ricevuti + List barcodeNonTrovati = inputData.getBarcodeUl().stream() + .filter(barcode -> !giacenzaItems.containsKey(barcode)) + .collect(Collectors.toList()); + if (!barcodeNonTrovati.isEmpty()) + throw new IllegalArgumentException("Unità logistica non in giacenza: " + barcodeNonTrovati.stream() + .findFirst() + .get()); + + + //Carico anagrafica posizioni + List posizioniPartenza = giacenzaItems.values().stream() + .filter(x -> x != null && !x.isEmpty()) + .distinct() + .collect(Collectors.toList()); + + final List posizioniAnag = WMSUtility.getPosizioniFromName(multiDBTransactionManager.getPrimaryConnection(), posizioniPartenza); + + final List foundTipiMagAuto = posizioniAnag.stream() + .map(MtbDepoPosizioni::getTipoMagazAutomatico) + .distinct() + .collect(Collectors.toList()); + + if (foundTipiMagAuto.size() > 1) + throw new IllegalArgumentException("Le unità logistiche appartengono a magazzini automatici differenti: " + new HashMap() {{ + for (MtbDepoPosizioni.TipoMagazzinoAutomaticoEnum tipoMagAuto : foundTipiMagAuto) + put(tipoMagAuto.getValue(), (int) posizioniAnag.stream().filter(x -> x.getTipoMagazAutomatico() == tipoMagAuto).count()); + }}); + + + String codMdep = posizioniAnag.get(0).getCodMdep(); + String codArea = posizioniAnag.get(0).getCodArea(); + + switch (foundTipiMagAuto.get(0)) { + case EUROFORK: + //Controllare che le pedane possono essere prelevate (non sono bloccate da altre pedane) + + final List missionRows = giacenzaItems.entrySet().stream() + .map(x -> new MissioneMagazzinoAutomaticoRowDTO() + .setSscc(x.getKey()) + .setPosizioneOut(x.getValue()) + .setPosizioneIn(inputData.getPosizioneDestinazione())) + .collect(Collectors.toList()); + + final MissioneMagazzinoAutomaticoDTO missioneRequest = new MissioneMagazzinoAutomaticoDTO() + .setCodMdep(codMdep) + .setCodArea(codArea) + .setRows(missionRows); + + missioniMagazzinoAutomaticoService.createMissione(multiDBTransactionManager, username, missioneRequest); + + break; + + + default: + throw new NotImplementedException("Tipo magazzino automatico non gestito: " + foundTipiMagAuto.get(0).getValue()); + } } From 8e934b8a38e8046785d0460bde7fccaaf105d1d6 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Thu, 16 Oct 2025 15:27:41 +0200 Subject: [PATCH 11/13] Cambiato ordinamento retrieveMissioni Magazzino automatico --- .../service/MissioniMagazzinoAutomaticoService.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/MissioniMagazzinoAutomaticoService.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/MissioniMagazzinoAutomaticoService.java index b0806ace01..eb9ee0e9b4 100644 --- a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/MissioniMagazzinoAutomaticoService.java +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/MissioniMagazzinoAutomaticoService.java @@ -52,6 +52,8 @@ public class MissioniMagazzinoAutomaticoService { sql += "WHERE mmma_det.completed = 0"; } + sql += " ORDER BY mmma.created_at DESC"; + final List missioni = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sql, MtbMissioneMagAuto.class); if (missioni == null || missioni.isEmpty()) { @@ -165,7 +167,7 @@ public class MissioniMagazzinoAutomaticoService { return new HashMap<>(); String sql = "SELECT mmma_det.sscc, \n" + - " CAST(COUNT(*) AS BIT) AS esists_missione\n" + + " CAST(COUNT(*) AS BIT) AS exists_missione\n" + "FROM " + MtbMissioneMagAutoDet.ENTITY + " mmma_det\n" + "WHERE mmma_det.completed = 0\n" + " AND mmma_det.skipped = 0\n" + @@ -181,7 +183,7 @@ public class MissioniMagazzinoAutomaticoService { total.forEach(x -> { String sscc = UtilityHashMap.getValueIfExists(x, "sscc"); - Boolean existsMissione = UtilityHashMap.getValueIfExists(x, "exists_missione"); + Boolean existsMissione = UtilityHashMap.getValueIfExists(x, "esists_missione"); if (existsMissione) result.put(sscc, existsMissione); From a6415486c3d73c65d620bc4fecbd33c84866836f Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Fri, 17 Oct 2025 15:41:57 +0200 Subject: [PATCH 12/13] Aggiunta application Connettore Eurofork --- .../java/it/integry/ems/model/IntegryApplicationEnum.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ems-core/src/main/java/it/integry/ems/model/IntegryApplicationEnum.java b/ems-core/src/main/java/it/integry/ems/model/IntegryApplicationEnum.java index 911e49ac64..35cd4c0514 100644 --- a/ems-core/src/main/java/it/integry/ems/model/IntegryApplicationEnum.java +++ b/ems-core/src/main/java/it/integry/ems/model/IntegryApplicationEnum.java @@ -8,7 +8,10 @@ public enum IntegryApplicationEnum { TASK("478f3a4c51824ad23cb50c1c60670c0f"), SALESBOOK("f0484398-1f8b-42f5-ab79-5282c164e1d8"), CONSEGNA("c012124f-4f11-471c-ae12-81bd4a97626c"), - WINCLOCK("54ceebf0-494f-49f1-850b-b15c57666146"); + WINCLOCK("54ceebf0-494f-49f1-850b-b15c57666146"), + + //Service Applications + SERVICE_EUROFORK_CONNECTOR("eadadd1c-13bb-4aae-87fd-4672573f8088"); private final String text; From cf078ced9c4577fa63fd17734586d501d179bd82 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Tue, 21 Oct 2025 09:49:33 +0200 Subject: [PATCH 13/13] Aggiunti servizi per gestione magazzino automatico --- ...MissioniMagazzinoAutomaticoController.java | 21 ++++++++- ...MissioneMagazzinoAutomaticoRequestDTO.java | 10 ++++ .../MissioniMagazzinoAutomaticoService.java | 47 +++++++++++++++---- .../WMSMagazzinoAutomaticoController.java | 1 + .../WMSMagazzinoAutomaticoService.java | 21 +++++++-- .../security/filter/RestLoggerBodyFilter.java | 1 + 6 files changed, 85 insertions(+), 16 deletions(-) diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/controller/MissioniMagazzinoAutomaticoController.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/controller/MissioniMagazzinoAutomaticoController.java index 8af627f290..5e7396e936 100644 --- a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/controller/MissioniMagazzinoAutomaticoController.java +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/controller/MissioniMagazzinoAutomaticoController.java @@ -41,9 +41,10 @@ public class MissioniMagazzinoAutomaticoController { @GetMapping(value = "retrieve-all") public @ResponseBody ServiceRestResponse retrieveAll(@RequestParam(CommonConstants.PROFILE_DB) String profileDB, - @RequestParam(required = false, defaultValue = "true") boolean onlyPending) throws Exception { + @RequestParam(required = false, defaultValue = "true") boolean onlyPending, + @RequestParam(required = false, defaultValue = "-1") int limit) throws Exception { - return ServiceRestResponse.createPositiveResponse(missioniMagazzinoAutomaticoService.retrieveAll(multiDBTransactionManager, onlyPending)); + return ServiceRestResponse.createPositiveResponse(missioniMagazzinoAutomaticoService.retrieveAll(multiDBTransactionManager, onlyPending, limit)); } @@ -75,6 +76,21 @@ public class MissioniMagazzinoAutomaticoController { } + @GetMapping(value = "set-as-started") + public @ResponseBody + ServiceRestResponse abort(@RequestParam(CommonConstants.PROFILE_DB) String profileDB, + @RequestParam long missionId, + @RequestParam long missionRowId) throws Exception { + userSession.checkUser(); + + missioniMagazzinoAutomaticoService.setMissionAsStarted(multiDBTransactionManager, + missionId, + missionRowId); + + return ServiceRestResponse.createPositiveResponse(); + } + + @GetMapping(value = "abort") public @ResponseBody ServiceRestResponse abort(@RequestParam(CommonConstants.PROFILE_DB) String profileDB, @@ -95,6 +111,7 @@ public class MissioniMagazzinoAutomaticoController { userSession.checkUser(); missioniMagazzinoAutomaticoService.logMissionError(multiDBTransactionManager, + requestBody.getMissionId(), requestBody.getMissionRowId(), requestBody.getErrorMessage()); diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/LogErrorMissioneMagazzinoAutomaticoRequestDTO.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/LogErrorMissioneMagazzinoAutomaticoRequestDTO.java index 08ecaebb4c..ed26bc4d90 100644 --- a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/LogErrorMissioneMagazzinoAutomaticoRequestDTO.java +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/dto/LogErrorMissioneMagazzinoAutomaticoRequestDTO.java @@ -2,9 +2,19 @@ package it.integry.ems.logistic.missioni.magazzino_automatico.dto; public class LogErrorMissioneMagazzinoAutomaticoRequestDTO { + private long missionId; private long missionRowId; private String errorMessage; + public long getMissionId() { + return missionId; + } + + public LogErrorMissioneMagazzinoAutomaticoRequestDTO setMissionId(long missionId) { + this.missionId = missionId; + return this; + } + public long getMissionRowId() { return missionRowId; } diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/MissioniMagazzinoAutomaticoService.java b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/MissioniMagazzinoAutomaticoService.java index eb9ee0e9b4..732d0d72b8 100644 --- a/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/MissioniMagazzinoAutomaticoService.java +++ b/ems-engine/src/main/java/it/integry/ems/logistic/missioni/magazzino_automatico/service/MissioniMagazzinoAutomaticoService.java @@ -6,6 +6,7 @@ import it.integry.ems.logistic.missioni.magazzino_automatico.utils.MissioniMagaz import it.integry.ems.service.EntityProcessor; import it.integry.ems.sync.MultiDBTransaction.Connection; import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager; +import it.integry.ems_model.config.EmsRestConstants; import it.integry.ems_model.entity.MtbMissioneMagAuto; import it.integry.ems_model.entity.MtbMissioneMagAutoDet; import it.integry.ems_model.entity.StbUser; @@ -36,6 +37,10 @@ public class MissioniMagazzinoAutomaticoService { } public List retrieveAll(MultiDBTransactionManager multiDBTransactionManager, boolean onlyPending) throws PrimaryDatabaseNotPresentException, DataConverterNotFoundException, SQLException, InstantiationException, IllegalAccessException { + return retrieveAll(multiDBTransactionManager, onlyPending, -1); + } + + public List retrieveAll(MultiDBTransactionManager multiDBTransactionManager, boolean onlyPending, int limit) throws PrimaryDatabaseNotPresentException, DataConverterNotFoundException, SQLException, InstantiationException, IllegalAccessException { String sql = "SELECT mmma.id,\n" + " mmma.cod_mdep,\n" + " mmma.cod_area,\n" + @@ -54,7 +59,7 @@ public class MissioniMagazzinoAutomaticoService { sql += " ORDER BY mmma.created_at DESC"; - final List missioni = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sql, MtbMissioneMagAuto.class); + List missioni = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sql, MtbMissioneMagAuto.class); if (missioni == null || missioni.isEmpty()) { return null; @@ -77,6 +82,9 @@ public class MissioniMagazzinoAutomaticoService { missione.setMtbMissioneMagAutoDet(rows); }); + if (limit > 0 && missioni.size() > limit) { + missioni = missioni.subList(0, limit); + } return MissioniMagazzinoAutomaticoUtils.convertEntityListToDto(missioni); } @@ -123,12 +131,34 @@ public class MissioniMagazzinoAutomaticoService { return mtbMissioneMagAuto.getId(); } - public void abortMission(MultiDBTransactionManager multiDBTransactionManager, long missioneId) throws Exception { + public void setMissionAsStarted(MultiDBTransactionManager multiDBTransactionManager, long missionId, long missionRowId) throws Exception { + String sqlMissione = "SELECT * \n" + + " FROM " + MtbMissioneMagAutoDet.ENTITY + " mmma_det\n" + + " WHERE mmma_det.id = " + UtilityDB.valueToString(missionRowId); + + MtbMissioneMagAutoDet missioneRow = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(multiDBTransactionManager.getPrimaryConnection(), sqlMissione, MtbMissioneMagAutoDet.class); + missioneRow.setOperation(OperationType.UPDATE); + missioneRow.setStartedAt(LocalDateTime.now()); + missioneRow.setCompleted(false); + missioneRow.setEndedAt(EmsRestConstants.LOCAL_DATE_TIME_NULL); + missioneRow.setUpdatedAt(LocalDateTime.now()); + + MtbMissioneMagAuto missione = new MtbMissioneMagAuto() + .setId(missionId); + + missione.setOperation(OperationType.UPDATE); + + missione.getMtbMissioneMagAutoDet().add(missioneRow); + + entityProcessor.processEntity(missione, multiDBTransactionManager); + } + + public void abortMission(MultiDBTransactionManager multiDBTransactionManager, long missionId) throws Exception { MtbMissioneMagAuto mtbMissioneMagAuto = new MtbMissioneMagAuto(); - mtbMissioneMagAuto.setId(missioneId); + mtbMissioneMagAuto.setId(missionId); String sqlRows = "SELECT * FROM " + MtbMissioneMagAutoDet.ENTITY + - " WHERE parent_id = " + UtilityDB.valueToString(missioneId) + + " WHERE parent_id = " + UtilityDB.valueToString(missionId) + " AND completed = 0 AND skipped = 0"; final List mtbMissioneMagAutoDets = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sqlRows, MtbMissioneMagAutoDet.class); @@ -142,10 +172,10 @@ public class MissioniMagazzinoAutomaticoService { entityProcessor.processEntity(mtbMissioneMagAuto, multiDBTransactionManager); } - public void logMissionError(MultiDBTransactionManager multiDBTransactionManager, long missioneRowId, String errorMessage) throws Exception { + public void logMissionError(MultiDBTransactionManager multiDBTransactionManager, long missionId, long missionRowId, String errorMessage) throws Exception { String sqlMissione = "SELECT * \n" + " FROM " + MtbMissioneMagAutoDet.ENTITY + " mmma_det\n" + - " WHERE mmma_det.id = " + UtilityDB.valueToString(missioneRowId); + " WHERE mmma_det.id = " + UtilityDB.valueToString(missionRowId); MtbMissioneMagAutoDet missioneRow = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(multiDBTransactionManager.getPrimaryConnection(), sqlMissione, MtbMissioneMagAutoDet.class); missioneRow.setOperation(OperationType.UPDATE); @@ -153,7 +183,7 @@ public class MissioniMagazzinoAutomaticoService { missioneRow.setUpdatedAt(LocalDateTime.now()); MtbMissioneMagAuto missione = new MtbMissioneMagAuto() - .setId(missioneRow.getParentId()); + .setId(missionId); missione.setOperation(OperationType.UPDATE); @@ -183,7 +213,7 @@ public class MissioniMagazzinoAutomaticoService { total.forEach(x -> { String sscc = UtilityHashMap.getValueIfExists(x, "sscc"); - Boolean existsMissione = UtilityHashMap.getValueIfExists(x, "esists_missione"); + Boolean existsMissione = UtilityHashMap.getValueIfExists(x, "exists_missione"); if (existsMissione) result.put(sscc, existsMissione); @@ -191,5 +221,4 @@ public class MissioniMagazzinoAutomaticoService { return result; } - } diff --git a/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/controller/WMSMagazzinoAutomaticoController.java b/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/controller/WMSMagazzinoAutomaticoController.java index 7f785e7914..6b6b15c821 100644 --- a/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/controller/WMSMagazzinoAutomaticoController.java +++ b/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/controller/WMSMagazzinoAutomaticoController.java @@ -30,6 +30,7 @@ public class WMSMagazzinoAutomaticoController { @Autowired private RequestDataDTO requestDataDTO; + @Autowired private UserSession userSession; diff --git a/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/service/WMSMagazzinoAutomaticoService.java b/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/service/WMSMagazzinoAutomaticoService.java index 5f899ebb97..0dd5b950dc 100644 --- a/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/service/WMSMagazzinoAutomaticoService.java +++ b/ems-engine/src/main/java/it/integry/ems/retail/wms/generic/service/WMSMagazzinoAutomaticoService.java @@ -20,7 +20,6 @@ import it.integry.ems.service.EntityProcessor; import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager; import it.integry.ems.user.UserSession; import it.integry.ems_model.entity.DtbOrdr; -import it.integry.ems_model.entity.MtbColr; import it.integry.ems_model.entity.MtbColt; import it.integry.ems_model.entity.MtbDepoPosizioni; import it.integry.ems_model.types.OperationType; @@ -31,6 +30,7 @@ import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; import java.math.BigDecimal; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; @@ -143,11 +143,22 @@ public class WMSMagazzinoAutomaticoService { node, false); break; case EUROFORK: - MtbColt internalMovement = WMSUtility.createInternalMovement(multiDBTransactionManager.getPrimaryConnection(), mtbColtToPut.getCodMdep(), username); - final List cambiaPosizioneUlMovement = WMSUtility.createCambiaPosizioneUlMovement(multiDBTransactionManager.getPrimaryConnection(), mtbColtToPut.getBarcodeUl(), false, mtbColtToPut.getCodMdep(), mtbDepoPosizione.getPosizione()); - internalMovement.setMtbColr(cambiaPosizioneUlMovement); - entityProcessor.processEntity(internalMovement, multiDBTransactionManager); + //TODO: Ricavare la posizione di destinazione. Se l'UL proviene da L7 allora va ricavata dallo step dell'ordine +// String posizioneDest = "WH101L002"; + + final MissioneMagazzinoAutomaticoRowDTO missionRow = new MissioneMagazzinoAutomaticoRowDTO() + .setSscc(mtbColtToPut.getBarcodeUl()) + .setPosizioneOut(mtbColtToPut.getPosizione()) + .setPosizioneIn(mtbDepoPosizione.getPosizione()); + + final MissioneMagazzinoAutomaticoDTO missioneRequest = new MissioneMagazzinoAutomaticoDTO() + .setCodMdep(mtbDepoPosizione.getCodMdep()) + .setCodArea(mtbDepoPosizione.getCodArea()) + .setRows(Collections.singletonList(missionRow)); + + missioniMagazzinoAutomaticoService.createMissione(multiDBTransactionManager, username, missioneRequest); + break; default: diff --git a/ems-engine/src/main/java/it/integry/security/filter/RestLoggerBodyFilter.java b/ems-engine/src/main/java/it/integry/security/filter/RestLoggerBodyFilter.java index 834009e3be..c2f4d1719d 100644 --- a/ems-engine/src/main/java/it/integry/security/filter/RestLoggerBodyFilter.java +++ b/ems-engine/src/main/java/it/integry/security/filter/RestLoggerBodyFilter.java @@ -128,6 +128,7 @@ public class RestLoggerBodyFilter extends AbstractRequestLoggingFilter { !serviceName.contains("system/ok") && !serviceName.contains("system/login") && !serviceName.contains("auth/login") && + !serviceName.contains("magazzino-automatico/retrieve-all") && !serviceName.contains("logs") && !serviceName.contains("getCurrentMachinesStatus") && !serviceName.contains("getOrdiniLavorazione") &&