using MagData; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace MP_MAG.WebUserControls { public partial class cmp_PLScanner : BaseUserControl { #region Protected Properties /// /// Comando ULTIMO barcode letto /// protected string lastCmd { get { return hfLastBCode.Value; } set { hfLastBCode.Value = value; lastValidCmd = value; } } /// /// UDC selezionato /// protected string LastUDC { get { return hfLastUDC.Value; } set { hfLastUDC.Value = value; } } /// /// ULTIMO Comando barcode VALIDO (!="") letto /// protected string lastValidCmd { get { return hfLastValidBCode.Value; } set { // solo se è non nullo/vuoto if (!string.IsNullOrEmpty(value)) { hfLastValidBCode.Value = value; } } } /// /// ID dell'ordine selezionato (per UDC) /// protected int SelOrdID { get { return cmp_SelUdc.SelOrdID; } } /// /// ID della packing list selezionata /// protected int SelPackList { get { return cmp_SelPackList.PackListID; } set { cmp_SelPackList.PackListID = value; cmp_SelUdc.PackListID = value; } } /// /// Pedana selezionata /// protected string SelPedana { get { return cmp_SelPedana.Pedana; } set { cmp_SelPedana.Pedana = value; } } /// /// UDC selezionato /// protected string SelUDC { get { return cmp_SelUdc.UDC; } set { cmp_SelUdc.UDC = value; cmp_SelUdc.cssCol = string.IsNullOrEmpty(value) ? "info" : "dark"; } } #endregion Protected Properties #region Private Methods private void Cmp_barcode_eh_doRefresh(object sender, EventArgs e) { bool doRaiseEv = false; // processo evento.. lastCmd = cmp_barcode.inputAcquired.ToUpper(); doRaiseEv = processLastCmd(doRaiseEv); // reset comando cmp_barcode.inputAcquired = ""; // aggiorno... doUpdate(); } private void Cmp_barcode_eh_doReset(object sender, EventArgs e) { } private void doUpdate() { #if false // reset grafico icnCart.Attributes.Remove("class"); icnCart.Attributes.Add("class", "btn btn-sm btn-block btn-outline-secondary"); icnBin.Attributes.Remove("class"); icnBin.Attributes.Add("class", "btn btn-sm btn-block btn-outline-secondary"); icnSecOp.Attributes.Remove("class"); icnSecOp.Attributes.Add("class", "btn btn-sm btn-block btn-outline-secondary"); // in base al secondo mostro uno o altro... if (showCart) { icnCart.Attributes.Remove("class"); icnCart.Attributes.Add("class", "btn btn-sm btn-block btn-success"); lblMessage.Text = "Item recognized"; // controllo SE HO cart if (currCartTab.Count == 1) { var cartRow = currCartTab[0]; // imposto OUT lblDestination.Text = $"SEND TO CART C{cartRow.CartIndex} ({cartRow.CartDtmx})"; } else { lblDestination.Text = $"ERROR SEARCHING CART: {currCartTab.Count} found!"; } lblDestination.CssClass = "text-success"; } else if (showBin) { icnBin.Attributes.Remove("class"); icnBin.Attributes.Add("class", "btn btn-sm btn-block btn-primary"); lblMessage.Text = "Item recognized"; if (currBinTab.Count == 1) { var binRow = currBinTab[0]; lblDestination.Text = $"SEND TO BIN B{binRow.BinIndex} ({binRow.BinDtmx})"; } else { lblDestination.Text = $"ERROR SEARCHING BIN: {currBinTab.Count} found!"; } lblDestination.CssClass = "text-primary"; } if (showSecOp) { icnSecOp.Attributes.Remove("class"); icnSecOp.Attributes.Add("class", "btn btn-sm btn-block btn-info"); lblMessage.Text = "Item recognized"; lblLastBCode.Text = $"DO SEC OP: {secOp}"; lblLastBCode.CssClass = "text-info"; } // fix btn reset! lbtResetSel.Visible = (itemIdSelected != 0); #endif } private bool processLastCmd(bool doRaiseEv) { if (string.IsNullOrEmpty(lastCmd)) doRaiseEv = true; // processiamo barcode letto decodedData decoData = MagDataLayer.man.decodeBcode(lastValidCmd); switch (decoData.codeType) { case codeType.Command: case codeType.PackList: case codeType.Pedana: case codeType.Udc: cmp_barcode.showOutput("badge badge-success", $"{decoData.description}"); processSuggestion(decoData.codeType, decoData.rawData, decoData.codeInt); doRaiseEv = true; break; default: cmp_barcode.showOutput("badge badge-danger", $"Codice sconosciuto: {decoData.rawData} --> ignoro"); resetSelection(false); doRaiseEv = true; break; } return doRaiseEv; } /// /// Processo il codice letto /// /// /// /// private void processSuggestion(codeType tipoCod, string rawData, int codeInt) { bool allOk = false; // processo suggerimenti switch (tipoCod) { case codeType.Command: // verifico tipo comando switch (rawData) { case "CMDRESET": SelPackList = 0; SelPedana = "ND"; SelUDC = "NA"; resetSelection(true); break; default: break; } break; case codeType.PackList: // verifica packlist... allOk = false; // step 1 : esiste var tabPList = MagDataLayer.man.taPList.getByKey(codeInt); if (tabPList.Rows.Count > 0) { // step 2: stato (1 richiesta, 2 iniziata, 3 completata) var rowPList = tabPList[0]; switch (rowPList.PackStatus) { case 0: cmp_barcode.showOutput("badge badge-danger", "Errore: PackList in bozza"); break; case 1: case 2: allOk = true; break; case 3: cmp_barcode.showOutput("badge badge-warning", "Errore: PackList completata"); break; case 4: cmp_barcode.showOutput("badge badge-danger", "Errore: PackList già trasferita"); break; default: cmp_barcode.showOutput("badge badge-danger", "Errore: PackList in stato UNK"); break; } } if (allOk) { // seleziono PackList SelPackList = codeInt; // resetto PEDANA ed UDC SelPedana = ""; SelUDC = ""; } break; case codeType.Pedana: // verifico di avere pack list allOk = false; if (SelPackList == 0) { cmp_barcode.showOutput("badge badge-danger", "Errore: manca PackList!"); } else { // verifico esista var tabAL = MagDataLayer.man.taEAL.getByKey(rawData); if (tabAL.Rows.Count == 0) { cmp_barcode.showOutput("badge badge-warning", $"Errore: Pedana non trovata: {rawData}"); } else { // ...e NON sia associata ad altre PList if (tabAL[0].PackListID == 0) { // se non associata associo... MagDataLayer.man.taEAL.updatePList(rawData, SelPackList); allOk = true; } else if (tabAL[0].PackListID != SelPackList) { cmp_barcode.showOutput("badge badge-danger", $"Errore: AL {rawData} già associata a PackList {tabAL[0].PackListID}"); } else if (tabAL[0].Status > 0) { cmp_barcode.showOutput("badge badge-danger", $"Errore: AL {rawData} non modificabile"); } else { // tutto ok allOk = true; } } //...e seleziono pedana if (allOk) { SelPedana = rawData; // resetto UDC SelUDC = ""; } } break; case codeType.Udc: // verifico di avere pack list allOk = false; if (SelPackList == 0) { cmp_barcode.showOutput("badge badge-danger", "Errore: manca PackList!"); } else { // verifico di avere Pedana if (string.IsNullOrEmpty(SelPedana)) { cmp_barcode.showOutput("badge badge-danger", "Errore: manca Pedana!"); } else { // verifico esista var tabUDC = MagDataLayer.man.taEUdc.getByKey(rawData); if (tabUDC.Rows.Count == 0) { cmp_barcode.showOutput("badge badge-warning", $"Errore: UDC non trovato: {rawData}"); } else { // ...e NON sia stato TRASFERITO if (tabUDC[0].IdxPosizione > 0) { cmp_barcode.showOutput("badge badge-warning", $"Errore: UDC già trasferito: {rawData}"); } else { // cerco AL se sia quello selezionato... var tabAL = MagDataLayer.man.taEAL.getByUdc(rawData); // se non trovo --> associo if (tabAL.Rows.Count == 0) { // tutto ok allOk = true; } // se uguale OK else if (tabAL[0].AL == SelPedana) { // tutto ok allOk = true; } else { // se siamo in seconda lettura --> OK x spostamento if (LastUDC == rawData) { allOk = true; LastUDC = ""; } else { // verifico pedana (vecchia/attuale) libera... if (tabAL[0].Status > 0) { cmp_barcode.showOutput("badge badge-danger", $"Attenzione: AL di origine ({tabAL[0].AL}) non modificabile, impossibile spostare"); } // chiedo seconda lettura SE AL "libero" else { cmp_barcode.showOutput("badge badge-info", $"Attenzione: UDC {rawData} già associato ad AL ({tabAL[0].AL}), rileggere per confermare ({SelPedana})"); LastUDC = rawData; } } } } } // ...e seleziono udc if (allOk) { SelUDC = rawData; tryLinkAlUdc(); } } } break; default: break; } } private void tryLinkAlUdc() { bool doRecordUdc = false; int OrderListID = 0; // cerco se UDC sia tra quelli RICHIESTI facendo Ordine <--> Lotto <--> UDC var tabOrdini = MagDataLayer.man.taOList.getByPL_UDC(SelPackList, SelUDC); // se sono 0 --> NON COMPATIBILE if (tabOrdini.Rows.Count == 0) { cmp_barcode.showOutput("badge badge-danger", "Errore: articolo non presente nella PackList, impossibile acquisire"); } // se 1 --> associa else if (tabOrdini.Rows.Count == 1) { OrderListID = tabOrdini[0].OrderListID; doRecordUdc = true; } // se è già selezionato un singolo ordine else if (SelOrdID > 0) { OrderListID = SelOrdID; doRecordUdc = true; } // se > 1 ma NON HO selezione --> chiede a quale associare else { cmp_barcode.showOutput("badge badge-warning", "Attenzione: più di un ordine presente, prego selezionare (UDC)"); } // se va salvato... if (doRecordUdc) { MagDataLayer.man.taEA2U.upsertQuery(SelUDC, SelPedana, OrderListID); cmp_SelUdc.cssCol = "success"; // fa refresh delle tab calcolate... cmp_SelPackList.doUpdate(); cmp_SelPedana.doUpdate(); cmp_SelUdc.doUpdate(); } else { cmp_SelUdc.cssCol = "warning"; } } #endregion Private Methods #region Protected Methods protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { SelPackList = 0; SelPedana = ""; SelUDC = ""; LastUDC = ""; } // eventi barcode cmp_barcode.eh_doRefresh += Cmp_barcode_eh_doRefresh; // eventi reset lotti IN cmp_barcode.eh_doReset += Cmp_barcode_eh_doReset; ; } /// /// Reset selezione item + blocchi suggerimento + sel REDIS x pagina unload /// /// protected void resetSelection(bool resetStatus) { #if false if (resetStatus) { try { // SE item esiste... var tabItem = DataLayer.man.taIL.getBySearch(itemIdSelected, itemIdSelected.ToString(), 0, 999); if (tabItem.Count == 1) { // riposto item a status 1... DataLayer.man.taIL.updateStatus(itemIdSelected, 1, PlaceId); } } catch { } } // elimino item sel... itemIdSelected = 0; resetShowData(); ComLib.resetItemPickup(SheetID, DeviceId); #endif } #endregion Protected Methods } }