Gestione ordini di lavorazione multipli per mes smetar

This commit is contained in:
2023-12-20 10:19:02 +01:00
parent 4696051355
commit df9df5a21f
9 changed files with 291 additions and 11 deletions

View File

@@ -12,6 +12,8 @@ import java.util.*
import it.integry.ems_model.utility.UtilityString
import it.integry.ems_model.utility.UtilityDB
import it.integry.ems_model.entity.MtbCols
import it.integry.ems_model.entity.MtbColt
import it.integry.ems_model.entity.MtbColr
global Connection conn
global String username

View File

@@ -19,6 +19,7 @@ public class CaricoProdFinLavDTO {
private String codMdepScar;
private String codDtipCar;
private String codDtipScar;
private String codDtipRien;
private String terminaLavorazione;
private String serDoc;
private String aggiornaStato;
@@ -27,6 +28,7 @@ public class CaricoProdFinLavDTO {
private String creaCaricoDaCollo;
private String creaScaricoDaCollo;
private String creaColloVersDaColloCarico;
private String creaRientroDaCollo;
private Integer numOrd;
private Integer idRiga;
private Integer idStep;
@@ -40,6 +42,7 @@ public class CaricoProdFinLavDTO {
private String codJfas;
private String terminaLavorazioneLinea;
private String activityID;
private Integer idLotto;
public String getCodJfas() {
return codJfas;
@@ -168,6 +171,16 @@ public class CaricoProdFinLavDTO {
this.codDtipScar = codDtipScar;
}
public String getCodDtipRien() {
return codDtipRien;
}
@XmlElement(name = "COD_DTIP_RIEN")
public CaricoProdFinLavDTO setCodDtipRien(String codDtipRien) {
this.codDtipRien = codDtipRien;
return this;
}
public String getTerminaLavorazione() {
return terminaLavorazione;
}
@@ -290,6 +303,16 @@ public class CaricoProdFinLavDTO {
return this;
}
public String getCreaRientroDaCollo() {
return creaRientroDaCollo;
}
@XmlElement(name = "CREA_RIENTRO_COLLO")
public CaricoProdFinLavDTO setCreaRientroDaCollo(String creaRientroDaCollo) {
this.creaRientroDaCollo = creaRientroDaCollo;
return this;
}
public String getActivityID() {
return activityID;
}
@@ -299,6 +322,15 @@ public class CaricoProdFinLavDTO {
return this;
}
public Integer getIdLotto() {
return idLotto;
}
public CaricoProdFinLavDTO setIdLotto(Integer idLotto) {
this.idLotto = idLotto;
return this;
}
public String getGenerateJson() {
return generateJson;
}

View File

@@ -1135,6 +1135,138 @@ public class DocumentProdService {
return entityList;
}
private List<EntityBase> generateRientroDaCollo(CaricoProdFinLavDTO carico) throws Exception {
String sql, codProd = null, partitaMag = null;
String condFase = null;
List<EntityBase> entityList = new ArrayList<>();
String gestione = "L";
Date dataOrd = carico.getDataOrd();
Integer numOrd = carico.getNumOrd();
String codJfas = carico.getCodJfas();
sql = "SELECT cod_prod, partita_mag FROM dtb_ordt " +
" WHERE gestione = " + UtilityDB.valueToString(gestione) + " AND " +
" data_ord = " + UtilityDB.valueDateToString(dataOrd, CommonConstants.DATE_FORMAT_YMD) + " AND " +
" num_ord = " + UtilityDB.valueToString(numOrd);
HashMap<String, Object> datiOrd = UtilityDB.executeSimpleQueryOnlyFirstRow(multiDBTransactionManager.getPrimaryConnection(), sql);
if (datiOrd != null && !datiOrd.isEmpty()) {
codProd = (String) datiOrd.get("cod_prod");
partitaMag = (String) datiOrd.get("partita_mag");
}
if (carico.getTerminaLavorazione().compareTo("N") == 0) {
if (codJfas != null) {
condFase = "mtb_colt.cod_jfas = " + UtilityDB.valueToString(codJfas);
}
}
List<DataDocFromCollo> results;
if (carico.getDataDoc() == null) {
sql = it.integry.ems_model.utility.Query.format(
"SELECT DISTINCT mtb_colt.data_collo AS data_doc_from_collo, SUM(mtb_colr.qta_col) AS qta_col_for_date\n" +
"FROM mtb_colt\n" +
" LEFT OUTER JOIN dtb_ordt ON mtb_colt.gestione = dtb_ordt.gestione AND\n" +
" mtb_colt.data_ord = dtb_ordt.data_ord AND\n" +
" mtb_colt.num_ord = dtb_ordt.num_ord,\n" +
" mtb_colr\n" +
"WHERE ((mtb_colt.gestione = %s\n" +
" AND mtb_colt.data_ord = %s\n" +
" AND mtb_colt.num_ord = %s) OR (mtb_colt.id_lotto = %s))\n" +
" AND mtb_colt.cod_dtip IS NULL\n" +
" AND mtb_colt.segno = 1\n" +
" AND mtb_colt.gestione = mtb_colr.gestione\n" +
" AND mtb_colt.data_collo = mtb_colr.data_collo\n" +
" AND mtb_colt.ser_collo = mtb_colr.ser_collo\n" +
" AND mtb_colt.num_collo = mtb_colr.num_collo\n" +
"GROUP BY mtb_colt.data_collo\n" +
"ORDER BY 1",
gestione,
dataOrd,
numOrd,
carico.getIdLotto()
);
sql = UtilityDB.addwhereCond(sql, condFase, false);
results = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sql, DataDocFromCollo.class);
if ((results == null || results.isEmpty()) && "S".equals(carico.getTerminaLavorazione())) {
throw new Exception("Non ci sono colli di produzione generati per la produzione in corso");
}
} else {
DataDocFromCollo dataDocFromCollo = new DataDocFromCollo();
dataDocFromCollo.setDataDocFromCollo(carico.getDataDoc());
dataDocFromCollo.setQtaColForDate(carico.getProdotti().getRow().get(0).getQtaProdAna()); /*UM magazzino*/
results = new ArrayList<>();
results.add(dataDocFromCollo);
}
if (results != null) {
for (DataDocFromCollo dataDocFromCollo : results) {
LoadColliDTO loadColli = new LoadColliDTO()
.setCodAnag(carico.getCodAnag())
.setCodDtip(carico.getCodDtipRien())
.setSerDoc(carico.getSerDoc())
.setDataDoc(dataDocFromCollo.getDataDocFromCollo())
.setCodMdep(carico.getCodMdep())
.setDataOrd(dataOrd)
.setNumOrd(numOrd);
String condDataCollo = "";
if (carico.getDataDoc() == null) {
condDataCollo = "mtb_colt.data_collo = " + UtilityDB.valueDateToString(dataDocFromCollo.getDataDocFromCollo(), CommonConstants.DATE_FORMAT_YMD);
}
sql = it.integry.ems_model.utility.Query.format(
"SELECT DISTINCT mtb_colt.gestione, mtb_colt.data_collo, mtb_colt.ser_collo, mtb_colt.num_collo\n" +
"FROM mtb_colt\n" +
" LEFT OUTER JOIN dtb_ordt ON mtb_colt.gestione = dtb_ordt.gestione AND mtb_colt.data_ord = dtb_ordt.data_ord AND\n" +
" mtb_colt.num_ord = dtb_ordt.num_ord,\n" +
" mtb_colr\n" +
"WHERE mtb_colt.gestione = 'L'\n" +
" AND mtb_colt.data_ord IS NULL\n" +
" AND mtb_colt.num_ord IS NULL\n" +
" AND mtb_colt.id_lotto = %s\n" +
" AND mtb_colt.cod_dtip IS NULL\n" +
" AND mtb_colt.segno = 1\n" +
" AND mtb_colt.gestione = mtb_colr.gestione\n" +
" AND mtb_colt.data_collo = mtb_colr.data_collo\n" +
" AND mtb_colt.ser_collo = mtb_colr.ser_collo\n" +
" AND mtb_colt.num_collo = mtb_colr.num_collo\n" +
"ORDER BY 1, 2, 3, 4",
carico.getIdLotto()
);
sql = UtilityDB.addwhereCond(sql, condDataCollo, false);
sql = UtilityDB.addwhereCond(sql, condFase, false);
List<MtbColt> colli = new ResultSetMapper().mapQuerySetToList(multiDBTransactionManager.getPrimaryConnection(), sql, MtbColt.class);
loadColli.setColli(colli);
if (loadColli.getColli() != null && !loadColli.getColli().isEmpty()) {
DtbDoct docT = loadColliService.createDocFromColli(multiDBTransactionManager, loadColli);
docT
.setActivityId(carico.getActivityID())
.setCodProd(codProd)
.setPartitaMag(partitaMag);
if (codJfas != null) {
docT.setCodJfas(codJfas);
}
entityList.add(docT);
}
}
}
return entityList;
}
@Deprecated
private void generateScaricoMaterialiDaColloVers(CaricoProdFinLavDTO carico, List<EntityBase> arrayEntity) throws Exception {
Connection conn = multiDBTransactionManager.getPrimaryConnection();
@@ -2178,6 +2310,11 @@ public class DocumentProdService {
}
}
// Generazione rientro prodotti da collo
if ("S".equalsIgnoreCase(UtilityString.isNull(carico.getCreaRientroDaCollo(), "N"))) {
arrayEntity.addAll(this.generateRientroDaCollo(carico));
}
return arrayEntity;
}

View File

@@ -403,6 +403,15 @@ public class MesProductionControllerV2 {
return ServiceRestResponse.createPositiveResponse();
}
@RequestMapping(value = "cambioFaseGroup", method = RequestMethod.POST)
public @ResponseBody
ServiceRestResponse cambioFaseGroup(@RequestParam(CommonConstants.PROFILE_DB) String profileDB,
@RequestBody GroupStepDTO groupStepDTO) throws Exception {
mesProductionService.executeGroupStep(groupStepDTO, MesProductionServiceV2.Action.CAMBIO_FASE);
return ServiceRestResponse.createPositiveResponse();
}
@RequestMapping(value = "createColloCaricoGroup", method = RequestMethod.POST)
public @ResponseBody
ServiceRestResponse createColloCaricoGroup(@RequestParam(CommonConstants.PROFILE_DB) String profileDB,

View File

@@ -11,6 +11,7 @@ public class GroupStepDTO {
String note;
String terminaLavorazione = "S";
String terminaLavorazioneLinea = "N";
String newCodJfas;
public String getCodJfas() {
return codJfas;
@@ -83,4 +84,13 @@ public class GroupStepDTO {
this.terminaLavorazioneLinea = terminaLavorazioneLinea;
return this;
}
public String getNewCodJfas() {
return newCodJfas;
}
public GroupStepDTO setNewCodJfas(String newCodJfas) {
this.newCodJfas = newCodJfas;
return this;
}
}

View File

@@ -11,6 +11,7 @@ import it.integry.ems.document.dto.CaricoProdFinLavRowDTO;
import it.integry.ems.document.service.DocumentProdService;
import it.integry.ems.exception.MissingDataException;
import it.integry.ems.exception.PrimaryDatabaseNotPresentException;
import it.integry.ems.object_storage.minio.sdk.errors.MinioException;
import it.integry.ems.production.dto.*;
import it.integry.ems.report.dto.JasperDTO;
import it.integry.ems.report.dto.PairsDTO;
@@ -24,6 +25,7 @@ import it.integry.ems.utility.UtilityEntity;
import it.integry.ems_model.base.EntityBase;
import it.integry.ems_model.db.ResultSetMapper;
import it.integry.ems_model.entity.*;
import it.integry.ems_model.exception.*;
import it.integry.ems_model.service.SetupGest;
import it.integry.ems_model.types.OperationType;
import it.integry.ems_model.utility.*;
@@ -35,12 +37,16 @@ import org.apache.pdfbox.printing.Orientation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import org.xmlpull.v1.XmlPullParserException;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.HttpURLConnection;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@@ -421,6 +427,55 @@ public class MesProductionServiceV2 {
UtilityEntity.throwEntitiesException(UtilityEntity.toEntityBaseList(dtbOrdtList));
}
public void cambioFase(Date dataOrd, Integer numOrd, String gestioneOrd, String codJfas, Integer idStep, Integer idRiga, String newCodJfas) throws SQLException, IOException, PrimaryDatabaseNotPresentException, DataConverterNotFoundException, InstantiationException, IllegalAccessException, RulesNotCompiledException, MergeEntityDBToObjectException, MinioException, XmlPullParserException, NoSuchAlgorithmException, InvalidKeyException, NoSuchFieldException, FieldMissingException, InvocationTargetException, ConverterNotConfiguredException, EntityException {
String whereCondCodJfas = "";
String whereCondIdStep = "";
if (!UtilityString.isNullOrEmpty(codJfas)) {
whereCondCodJfas = " AND cod_jfas = " + UtilityDB.valueToString(codJfas);
}
if (idStep != null && idRiga != null) {
whereCondIdStep = " AND id_step = " + UtilityDB.valueToString(idStep) + " AND id_riga = " + UtilityDB.valueToString(idRiga);
}
String sql = "SELECT * " +
" FROM dtb_ord_steps " +
" WHERE num_ord = " + UtilityDB.valueToString(numOrd) +
" AND gestione = " + UtilityDB.valueToString(gestioneOrd) +
" AND data_ord = " + UtilityDB.valueDateToString(dataOrd, CommonConstants.DATE_FORMAT_YMD) +
whereCondCodJfas +
whereCondIdStep +
" AND data_fine IS NULL " +
" AND data_iniz IS NULL ";
List<DtbOrdSteps> latestSteps = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sql, DtbOrdSteps.class);
ArrayList<DtbOrdt> dtbOrdtList = new ArrayList<>();
if (latestSteps != null) {
for (DtbOrdSteps dtbOrdStep : latestSteps) {
DtbOrdt dtbOrdt = new DtbOrdt();
dtbOrdt.setOperation(OperationType.NO_OP);
dtbOrdt.setGestione(dtbOrdStep.getGestione());
dtbOrdt.setDataOrd(dtbOrdStep.getDataOrd());
dtbOrdt.setNumOrd(dtbOrdStep.getNumOrd());
dtbOrdt.setDtbOrdSteps(new ArrayList<>());
dtbOrdt.getDtbOrdSteps().add(dtbOrdStep);
dtbOrdStep.setCodJfas(newCodJfas);
dtbOrdStep.setOperation(OperationType.UPDATE);
dtbOrdtList.add(dtbOrdt);
}
}
entityProcessor.processEntityList(dtbOrdtList, true);
UtilityEntity.throwEntitiesException(UtilityEntity.toEntityBaseList(dtbOrdtList));
}
public void updateQtaImmesseStep(OrdineLavorazioneDTO ordineLavorazione, String codJfas, double qta) throws Exception {
@@ -1041,7 +1096,8 @@ public class MesProductionServiceV2 {
public enum Action {
OPEN,
CLOSE,
STOP
STOP,
CAMBIO_FASE
}
public void executeGroupStep(GroupStepDTO groupStepDTO, Action action) throws Exception {
@@ -1123,6 +1179,7 @@ public class MesProductionServiceV2 {
if (ordine.getNumFase() == ordine.getMaxFase()) {
String codDtipScar = setupGest.getSetup("W_PORDI_RC", "SETUP_DOCUMENTI", "COD_DTIP_SCAR");
String codDtipCar = setupGest.getSetup("W_PORDI_RC", "SETUP_DOCUMENTI", "COD_DTIP_CAR");
String codDtipRien = setupGest.getSetup("W_PORDI_RC", "SETUP_DOCUMENTI", "COD_DTIP_RIEN");
String codMdepCar = setupGest.getSetup("W_PORDI_RC", "SETUP_DOCUMENTI", "COD_MDEP_CAR");
CaricoProdFinLavDTO carico = new CaricoProdFinLavDTO();
@@ -1136,12 +1193,15 @@ public class MesProductionServiceV2 {
carico.setEffettuaScaricoMateriali("S");
carico.setCodDtipScar(codDtipScar);
carico.setCodDtipCar(codDtipCar);
carico.setCodDtipRien(codDtipRien);
carico.setCodMdep(UtilityString.isNullOrEmpty(codMdepCar) ? null : codMdepCar);
carico.setCodMdepScar(ordine.getCodMdep());
carico.setCreaCaricoDaCollo("S");
carico.setCreaScaricoDaCollo("S");
carico.setTerminaLavorazione(groupStepDTO.getTerminaLavorazione());
carico.setTerminaLavorazioneLinea(groupStepDTO.getTerminaLavorazioneLinea());
carico.setCreaRientroDaCollo("S");
carico.setIdLotto(ordine.getIdLotto());
CaricoProdFinLavProdottiDTO prodotti = new CaricoProdFinLavProdottiDTO();
@@ -1167,6 +1227,10 @@ public class MesProductionServiceV2 {
entitiesToSave.add(ordLav);
}
break;
case CAMBIO_FASE:
this.cambioFase(ordine.getDataOrd(), ordine.getNumOrd(), ordine.getGestione(), groupStepDTO.getCodJfas(), null, null, groupStepDTO.getNewCodJfas());
break;
}

View File

@@ -14,6 +14,7 @@ public class ScaricoMateriaPrimaDaColloDTO {
private BigDecimal quantity;
private DtbOrdr order;
private boolean createNewUl = false;
private Integer idLotto;
public String getCodMart() {
return codMart;
@@ -77,4 +78,13 @@ public class ScaricoMateriaPrimaDaColloDTO {
this.codMdep = codMdep;
return this;
}
public Integer getIdLotto() {
return idLotto;
}
public ScaricoMateriaPrimaDaColloDTO setIdLotto(Integer idLotto) {
this.idLotto = idLotto;
return this;
}
}

View File

@@ -2527,14 +2527,14 @@ public class WMSGenericService {
anomalieList.add(AnomalieDTO.error("Non è stato possibile scaricare la quantita per l'articolo " + codMart + ": i dati del collo di origine non cono completi"));
continue;
}
if (order != null && (
order.getDataOrd() == null ||
order.getNumOrd() == null ||
order.getGestione() == null
)) {
anomalieList.add(AnomalieDTO.error("Non è stato possibile scaricare la quantita per l'articolo " + codMart + ": i dati dell' ordine non sono completi"));
continue;
}
// if (order != null && (
// order.getDataOrd() == null ||
// order.getNumOrd() == null ||
// order.getGestione() == null
// )) {
// anomalieList.add(AnomalieDTO.error("Non è stato possibile scaricare la quantita per l'articolo " + codMart + ": i dati dell' ordine non sono completi"));
// continue;
// }
if (order != null) {
codAnag = !UtilityString.isNullOrEmpty(order.getCodAnag()) ? order.getCodAnag() : null;
if (UtilityString.isNullOrEmpty(codAnag)) {
@@ -2612,6 +2612,7 @@ public class WMSGenericService {
.setPosizione(giacenza.getPosizione())
.setDataOrd(order != null ? order.getDataOrd() : null)
.setNumOrd((order != null ? order.getNumOrd() : null))
.setIdLotto(scarico.getIdLotto())
.setCodAnag(codAnag);
mtbColt.setOperation(OperationType.INSERT_OR_UPDATE);
mtbColtsToInsert.add(mtbColt);

View File

@@ -1,5 +1,6 @@
package it.integry.ems.retail.wms.lavorazione.service;
import com.annimon.stream.Stream;
import it.integry.ems.javabeans.RequestDataDTO;
import it.integry.ems.logistic.dto.sm2.FiltroDistribuzioneColloDTO;
import it.integry.ems.product.importaz.service.ProductServices;
@@ -146,10 +147,24 @@ public class WMSLavorazioneService {
final List<OrdineLavorazioneDTO> ordiniLavorazioneInCorso = productionOrderDataHandlerService.getOrdiniLavorazioneInCorso(createUDSRequestDTO.getCodJfas());
//Try to retrieve
//TODO: Assegnare l'ordine o l'id lotto al collo appena creato
//Se non trovo niente allora eccezione
if (ordiniLavorazioneInCorso == null || ordiniLavorazioneInCorso.isEmpty()) {
throw new Exception("Nessun ordine in corso sulla linea " + createUDSRequestDTO.getCodJfas());
}
List<Integer> idLotto = Stream.of(ordiniLavorazioneInCorso).map(OrdineLavorazioneDTO::getIdLotto).withoutNulls().distinct().toList();
if (idLotto.size() > 1) {
throw new Exception("Trovato più di 1 id lotto in corso.");
}
//Assegnare l'ordine o l'id lotto al collo appena creato
OrdineLavorazioneDTO ordineLavorazioneDTO = ordiniLavorazioneInCorso.get(0);
udsMtbColt
.setDataOrd(ordineLavorazioneDTO.getDataOrd())
.setNumOrd(ordineLavorazioneDTO.getNumOrd())
.setIdLotto(ordineLavorazioneDTO.getIdLotto());
}
udsMtbColt.setOperation(OperationType.INSERT);