Aggiunto servizio che restituisce la giacenza in tempo reale a partire dalla tabella delle giacenze progressive

This commit is contained in:
2024-07-01 10:03:48 +02:00
parent a0cd0cbec5
commit 3e6c38b51f
4 changed files with 301 additions and 24 deletions

View File

@@ -5,9 +5,8 @@ import it.integry.ems.product.controller.ListiniVenditaController;
import it.integry.ems.response.EsitoType;
import it.integry.ems.response.ServiceRestResponse;
import it.integry.ems.response.StatusResponse;
import it.integry.ems.retail.pvmRetail.service.GiacenzaService;
import it.integry.ems.retail.service.GiacenzaService;
import it.integry.ems.status.ServiceChecker;
import it.integry.ems_model.utility.UtilityDate;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
@@ -17,27 +16,20 @@ import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.List;
@RestController
@Scope(value = "request")
@RequestMapping("giacenza")
public class GiacenzaController {
private final Logger logger = LogManager.getLogger();
@Autowired
private ServiceChecker serviceChecker;
@Autowired
GiacenzaService giacenzaService;
@ExceptionHandler({Exception.class})
public @ResponseBody
ServiceRestResponse handleException(HttpServletRequest request, HttpServletResponse response, Exception ex) {
logger.error(request.getRequestURI(), ex);
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return ServiceRestResponse.createNegativeResponse(ex);
}
@Autowired
private GiacenzaService giacenzaService;
@RequestMapping(value = "status", method = RequestMethod.GET)
public @ResponseBody
@@ -49,17 +41,18 @@ public class GiacenzaController {
}
@RequestMapping(value = "consolida", method = RequestMethod.POST)
public @ResponseBody
ServiceRestResponse consolidaGiacenza(
HttpServletRequest request,
@RequestParam(CommonConstants.PROFILE_DB) String configuration) {
public ServiceRestResponse consolidaGiacenza(HttpServletRequest request,
@RequestParam(CommonConstants.PROFILE_DB) String configuration) throws Exception {
try {
giacenzaService.consolidaGiacenza();
return ServiceRestResponse.createPositiveResponse();
} catch (Exception e) {
logger.error(request.getRequestURI(), e);
return new ServiceRestResponse(EsitoType.KO, configuration, e);
}
giacenzaService.consolidaGiacenza();
return ServiceRestResponse.createPositiveResponse();
}
@RequestMapping(value = "retrieve", method = RequestMethod.GET)
public ServiceRestResponse retrieveGiacenza(HttpServletRequest request,
@RequestParam(CommonConstants.PROFILE_DB) String configuration,
@RequestParam String codMdep) throws Exception {
return ServiceRestResponse.createPositiveResponse(giacenzaService.retrieveGiacenza(codMdep));
}
}

View File

@@ -0,0 +1,69 @@
package it.integry.ems.retail.dto;
import it.integry.ems_model.annotation.SqlField;
import java.math.BigDecimal;
import java.util.Date;
public class GiacenzaDTO {
@SqlField("cod_mart")
private String codMart;
@SqlField("descrizione")
private String descrizione;
@SqlField("qta_inv")
private BigDecimal qtaInv;
@SqlField("data_inventario")
private Date dtaInventario;
@SqlField("cod_mdep")
private String codMdep;
public String getCodMart() {
return codMart;
}
public GiacenzaDTO setCodMart(String codMart) {
this.codMart = codMart;
return this;
}
public String getDescrizione() {
return descrizione;
}
public GiacenzaDTO setDescrizione(String descrizione) {
this.descrizione = descrizione;
return this;
}
public BigDecimal getQtaInv() {
return qtaInv;
}
public GiacenzaDTO setQtaInv(BigDecimal qtaInv) {
this.qtaInv = qtaInv;
return this;
}
public Date getDtaInventario() {
return dtaInventario;
}
public GiacenzaDTO setDtaInventario(Date dtaInventario) {
this.dtaInventario = dtaInventario;
return this;
}
public String getCodMdep() {
return codMdep;
}
public GiacenzaDTO setCodMdep(String codMdep) {
this.codMdep = codMdep;
return this;
}
}

View File

@@ -14,6 +14,7 @@ import it.integry.ems.retail.pvmRetail.dto.save.DocFromPickingDTO;
import it.integry.ems.retail.pvmRetail.dto.save.PropostaOrdineDTO;
import it.integry.ems.retail.pvmRetail.dto.save.SaveDTO;
import it.integry.ems.retail.pvmRetail.service.*;
import it.integry.ems.retail.service.GiacenzaService;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems.user.UserSession;
import it.integry.ems.utility.UtilityEntity;

View File

@@ -1,7 +1,9 @@
package it.integry.ems.retail.pvmRetail.service;
package it.integry.ems.retail.service;
import com.annimon.stream.Stream;
import it.integry.ems.expansion.RunnableThrowable;
import it.integry.ems.retail.dto.GiacenzaDTO;
import it.integry.ems.retail.pvmRetail.service.PvmService;
import it.integry.ems.service.EntityProcessor;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems.utility.UtilityEntity;
@@ -475,4 +477,216 @@ public class GiacenzaService {
}
}
}
public List<GiacenzaDTO> retrieveGiacenza(String codMdep) throws Exception {
String sql = "WITH art\n" +
" AS (SELECT mtb_aart.cod_mart AS cod_mart,\n" +
" CASE\n" +
" WHEN mtb_aart.articolo_composto = 'S'\n" +
" AND mtb_comp.cod_comp IS NOT NULL\n" +
" THEN mtb_comp.cod_comp\n" +
" ELSE mtb_aart.cod_mart\n" +
" END AS cod_mart_mov,\n" +
" ISNULL(mtb_comp.qta_std, 1) AS qta_std\n" +
" FROM mtb_aart\n" +
" LEFT OUTER JOIN mtb_comp\n" +
" ON mtb_aart.cod_mart = mtb_comp.cod_mart\n" +
" AND mtb_aart.articolo_composto = 'S'),\n" +
" movimenti\n" +
" AS (SELECT mtb_movi.cod_mdep,\n" +
" mtb_movi.cod_mart,\n" +
" mtb_movi.data_reg,\n" +
" mtb_movi.qta_car AS qta_car,\n" +
" mtb_movi.qta_scar AS qta_scar,\n" +
" dtb_doct.data_ins,\n" +
" 'D' AS tipo_car\n" +
" FROM mtb_movi\n" +
" INNER JOIN dtb_doct\n" +
" ON dtb_doct.cod_anag = mtb_movi.cod_anag\n" +
" AND dtb_doct.cod_dtip = mtb_movi.cod_dtip\n" +
" AND dtb_doct.data_doc = mtb_movi.data_doc\n" +
" AND dtb_doct.ser_doc = mtb_movi.ser_doc\n" +
" AND dtb_doct.num_doc = mtb_movi.num_doc\n" +
" WHERE mtb_movi.cod_mdep IN (" + UtilityDB.valueToString(codMdep) + ")\n" +
" AND dtb_doct.data_ins >= DATEADD(DAY, - 7, CAST(GETDATE() AS DATE))\n" +
"\n" +
" UNION ALL\n" +
"\n" +
" SELECT wdtb_doct.cod_mdep,\n" +
" wdtb_docr.cod_mart,\n" +
" wdtb_doct.data_reg,\n" +
" wdtb_docr.qta_doc * wdtb_docr.rap_conv,\n" +
" 0,\n" +
" wdtb_doct.data_mod,\n" +
" 'W' AS tipo_car\n" +
" FROM wdtb_doct\n" +
" INNER JOIN wdtb_docr\n" +
" ON wdtb_doct.cod_anag = wdtb_docr.cod_anag\n" +
" AND wdtb_doct.cod_dtip = wdtb_docr.cod_dtip\n" +
" AND wdtb_doct.data_doc = wdtb_docr.data_doc\n" +
" AND wdtb_doct.ser_doc = wdtb_docr.ser_doc\n" +
" AND wdtb_doct.num_doc = wdtb_docr.num_doc\n" +
" WHERE wdtb_doct.flag_elaborato = 'N'\n" +
" AND wdtb_doct.cod_mdep IN (" + UtilityDB.valueToString(codMdep) + ")\n" +
" AND wdtb_doct.data_ins >= DATEADD(DAY, - 7, CAST(GETDATE() AS DATE))\n" +
"\n" +
" UNION ALL\n" +
"\n" +
" SELECT ntb_doct.cod_mdep,\n" +
" ntb_docr.cod_mart,\n" +
" ntb_doct.date_only_doc AS data_reg,\n" +
" 0,\n" +
" ntb_docr.qta_doc * ntb_docr.qta_cnf,\n" +
" ntb_doct.data_import,\n" +
" NULL AS tipo_car\n" +
" FROM ntb_doct\n" +
" INNER JOIN ntb_docr\n" +
" ON ntb_doct.cod_mdep = ntb_docr.cod_mdep\n" +
" AND ntb_doct.cod_cassa = ntb_docr.cod_cassa\n" +
" AND ntb_doct.data_doc = ntb_docr.data_doc\n" +
" LEFT OUTER JOIN dtb_tipi\n" +
" ON ntb_doct.cod_dtip_val = dtb_tipi.cod_dtip\n" +
" WHERE ntb_doct.cod_mdep IN (" + UtilityDB.valueToString(codMdep) + ")\n" +
" AND ntb_doct.causale = 'V'\n" +
" AND (\n" +
" ntb_doct.data_doc_val IS NULL\n" +
" OR dtb_tipi.segno_qta_scar = 0\n" +
" )\n" +
" AND ntb_doct.date_only_doc >= DATEADD(DAY, - 7, CAST(GETDATE() AS DATE))),\n" +
" inventario_provvisorio\n" +
" AS (SELECT mtb_colt.cod_mdep,\n" +
" art.cod_mart_mov AS cod_mart,\n" +
" SUM(qta_col * art.qta_std) AS qta_col,\n" +
" data_ins,\n" +
" MAX(data_ins) OVER (\n" +
" PARTITION BY mtb_colt.cod_mdep,art.cod_mart_mov\n" +
" ) max_data_ins\n" +
" FROM mtb_colt\n" +
" INNER JOIN mtb_colr\n" +
" ON 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" +
" INNER JOIN (SELECT mtb_aart.cod_mart AS cod_mart,\n" +
" CASE\n" +
" WHEN mtb_aart.articolo_composto = 'S'\n" +
" AND mtb_comp.cod_comp IS NOT NULL\n" +
" THEN mtb_comp.cod_comp\n" +
" ELSE mtb_aart.cod_mart\n" +
" END AS cod_mart_mov,\n" +
" ISNULL(mtb_comp.qta_std, 1) AS qta_std\n" +
" FROM mtb_aart\n" +
" LEFT OUTER JOIN mtb_comp\n" +
" ON mtb_aart.cod_mart = mtb_comp.cod_mart) art\n" +
" ON mtb_colr.cod_mart = art.cod_mart\n" +
" WHERE mtb_colt.cod_dtip_provv = 'RGIAC'\n" +
" AND mtb_colt.data_ins >= DATEADD(DAY, - 7, CAST(GETDATE() AS DATE))\n" +
" AND mtb_colt.cod_mdep IN (" + UtilityDB.valueToString(codMdep) + ")\n" +
" GROUP BY art.cod_mart_mov, mtb_colt.data_collo, data_ins, mtb_colt.cod_mdep),\n" +
" selezione_giacenza\n" +
" AS (SELECT ISNULL(ip.cod_mdep, gp.cod_mdep) cod_mdep,\n" +
" ISNULL(ip.cod_mart, gp.cod_mart) cod_mart,\n" +
" ISNULL(ip.qta_col, gp.qta_car) AS qta_car,\n" +
" ISNULL(CASE\n" +
" WHEN gp.data_ins < ip.data_ins\n" +
" THEN 0\n" +
" ELSE gp.qta_scar\n" +
" END, 0) AS qta_scar,\n" +
" ISNULL(ip.data_ins, gp.data_ins) AS data_ins,\n" +
" ISNULL(CAST(ip.data_ins AS DATE), gp.data_reg) AS data_reg,\n" +
" CASE\n" +
" WHEN ip.data_ins IS NULL\n" +
" THEN 0\n" +
" ELSE 1\n" +
" END AS is_invent,\n" +
" ip.data_ins last_rgiac\n" +
" FROM carelli_giacenza_prog gp\n" +
" LEFT JOIN inventario_provvisorio ip\n" +
" ON ip.cod_mart = gp.cod_mart\n" +
" AND ip.cod_mdep = gp.cod_mdep\n" +
" AND max_data_ins = ip.data_ins\n" +
" AND (gp.data_ins < ip.data_ins)\n" +
" WHERE gp.cod_mdep IN (" + UtilityDB.valueToString(codMdep) + ")),\n" +
" mov\n" +
" AS (SELECT movimenti.cod_mdep,\n" +
" art.cod_mart_mov AS cod_mart,\n" +
" SUM(movimenti.qta_car * qta_std) + ISNULL(giac.qta_car, 0) AS qta_car,\n" +
" SUM(movimenti.qta_scar * qta_std) + ISNULL(giac.qta_scar, 0) AS qta_scar,\n" +
" GETDATE() AS data_ins\n" +
" FROM movimenti\n" +
" INNER JOIN art\n" +
" ON movimenti.cod_mart = art.cod_mart\n" +
" LEFT OUTER JOIN selezione_giacenza giac\n" +
" ON giac.cod_mdep = movimenti.cod_mdep\n" +
" AND giac.cod_mart = art.cod_mart_mov\n" +
" WHERE (\n" +
" (\n" +
" movimenti.data_reg >= ISNULL(giac.data_reg, CAST(GETDATE() AS DATE))\n" +
" AND (\n" +
" giac.data_ins IS NULL\n" +
" OR (movimenti.data_ins >= giac.data_ins)\n" +
" )\n" +
" )\n" +
" OR (\n" +
" (movimenti.tipo_car = 'W')\n" +
" AND (\n" +
" (\n" +
" giac.data_ins IS NULL\n" +
" OR (movimenti.data_ins >= giac.data_ins)\n" +
" )\n" +
" OR (\n" +
" is_invent = 0\n" +
" AND (\n" +
" movimenti.data_ins >= last_rgiac\n" +
" OR last_rgiac IS NULL\n" +
" )\n" +
" )\n" +
" )\n" +
" )\n" +
" )\n" +
" AND movimenti.cod_mdep IN (" + UtilityDB.valueToString(codMdep) + ")\n" +
" GROUP BY movimenti.cod_mdep, art.cod_mart_mov, giac.qta_car, giac.qta_scar),\n" +
" inv\n" +
" AS (SELECT ISNULL(r.cod_mart, k.cod_mart) AS cod_mart,\n" +
" ISNULL(mtb_aart.descrizione, '') descrizione,\n" +
" ISNULL(r.qta_car, ISNULL(k.qta_car, 0)) - ISNULL(r.qta_scar, ISNULL(k.qta_scar, 0)) qta_inv,\n" +
" ISNULL(k.data_ins, CAST(GETDATE() AS DATE)) data_inventario,\n" +
" ISNULL(r.cod_mdep, k.cod_mdep) AS cod_mdep\n" +
" FROM mov r\n" +
" INNER JOIN mtb_aart\n" +
" ON r.cod_mart = mtb_aart.cod_mart\n" +
" FULL OUTER JOIN selezione_giacenza k\n" +
" ON k.cod_mart = r.cod_mart\n" +
" AND k.cod_mdep = r.cod_mdep\n" +
" AND k.cod_mdep IN (" + UtilityDB.valueToString(codMdep) + ")),\n" +
" final\n" +
" AS (SELECT cod_mart, descrizione, qta_inv, data_inventario, cod_mdep\n" +
" FROM inv\n" +
" WHERE cod_mdep IN (" + UtilityDB.valueToString(codMdep) + ")\n" +
" AND qta_inv != 0\n" +
"\n" +
" UNION\n" +
"\n" +
" SELECT mtb_comp.cod_mart, descrizione, ROUND(qta_inv / qta_std, 2), data_inventario, cod_mdep\n" +
" FROM inv\n" +
" JOIN mtb_comp\n" +
" ON inv.cod_mart = mtb_comp.cod_comp\n" +
" WHERE cod_mdep IN (" + UtilityDB.valueToString(codMdep) + ")),\n" +
" find_duplicates AS (SELECT cod_mart,\n" +
" descrizione,\n" +
" qta_inv,\n" +
" data_inventario,\n" +
" cod_mdep,\n" +
" ROW_NUMBER() OVER (PARTITION BY cod_mart, cod_mdep ORDER BY data_inventario DESC, qta_inv DESC) AS rownum\n" +
" FROM final)\n" +
"SELECT cod_mart,\n" +
" descrizione,\n" +
" qta_inv,\n" +
" data_inventario,\n" +
" cod_mdep\n" +
"FROM find_duplicates\n" +
"WHERE rownum = 1";
return UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sql, GiacenzaDTO.class);
}
}