using SteamWare; using System; namespace GMW_data { /// /// classe gestione operazioni con terminalino /// public class TermClass { #region area table adapters /// /// init dei table adapters /// protected void initTA() { // istanzio oggetto } /// /// effettua setup dei connection strings da web.config delal singola applicazione /// protected virtual void setupConnectionStringBase() { // connections del db } #endregion #region Inizializzazione protected TermClass() { // init oggetto initTA(); setupConnectionStringBase(); } /// /// oggetto static per fare chiamate sul magazzino /// public static TermClass Ter = new TermClass(); #endregion #region metodi protected #if false /// /// aggiunge le righe liste di prelievo necessarie a soddisfare la richiesta in logica FIFO dato un elenco di cartellini, la qta totale da allocare e la lista attuale /// /// /// /// private void allocaRigheListaPrelievo(decimal QtaTot, string codListaAttuale, DS_magazzino.ElencoCartelliniDataTable tabellaElencoCartellini) { //ricavo il valore UDC della riga del più vecchio string udcAttuale; bool qtaOk = false; bool dataFinished = false; int progrUdc = 0; int numUdcDisponibili = tabellaElencoCartellini.Rows.Count; // contiene la quantità della riga attuale decimal qtaRiga; // somma progressiva della qta allocata - calcolo da db! decimal qtaAllocata = taElencoListePrelievo.getByCodLista(codListaAttuale)[0].Prelevato; //ciclo WHILE per lo riempimento FIFO con UDC secondo richiesta a partire da elenco fornito while (!qtaOk && !dataFinished) { /* * crea una riga in righelistaprelievo passando come valori * il codlista attuale ricavato da sopr * l'UDC dal primo della tabella getOlderUDC * * * recupero quantità dalla riga corrente; * * imposto proposto a 1; * imposto prelevato 0; * taRighelistePreliveo.Insert; * * qtaAllocata = qtaAllocata + Qta di questa riga (riuso il valore della colonna QTA * tabella[contatore]; contatore++; * qtaOk = (qtaAllocata >= qtaRichiesta) * dataFinished = (contatore >= numRighe); * * */ // ricavo la riga più vecchia qtaRiga = tabellaElencoCartellini[progrUdc].Qta; udcAttuale = tabellaElencoCartellini[progrUdc].UDC; // eseguo query di insert taRigheListePrelievo.Insert(codListaAttuale, udcAttuale, qtaRiga, true, false); //incremento qta allocata qtaAllocata = (qtaAllocata + qtaRiga); //incremento contatore progrUdc++; // verifico le condizioni, false se non cambia nulla true se cambia e si esce dal while qtaOk = (qtaAllocata >= QtaTot); dataFinished = (progrUdc >= numUdcDisponibili); } } #endif #endregion #region Metodi esposti /// /// Verifica il login utente andando a controllare il CodSoggetto da RilPro e salvando in sessione un oggetto user_std x l'utente corrispondente al cod soggetto secondo la tab soggetti2utente /// /// /// tipo di errore codificato public esitoLoginTerm doUserLogin(string CodSoggetto) { esitoLoginTerm answ = esitoLoginTerm.errore; try { // verifico che il cod operatore passato sia valido per RilPro.AnagOperatori e Soggetti2Utente int trovatiAnagOp = DataProxy.obj.taAnagOperatore.getByCodSoggetto(CodSoggetto).Rows.Count; int trovatiS2U = DataProxy.obj.taSogg2Oper.getByCodSoggetto(CodSoggetto).Rows.Count; if (trovatiAnagOp == 1) { if (trovatiS2U == 1) { // è ok, proseguo facendo avvio user DS_Applicazione.Soggetti2UtenteRow rigaOp = DataProxy.obj.taSogg2Oper.getByCodSoggetto(CodSoggetto)[0]; // inizializzo utente con dati operatore user_std _utente = new user_std(); user_std.UtSn.isForcedUser = true; bool fatto = _utente.startUpUtente(rigaOp.DOMINIO, rigaOp.USER_NAME); if (fatto) { answ = esitoLoginTerm.ok; logger.lg.scriviLog(String.Format("Forced user identity ok: logged as \t {0}\\{1}", user_std.UtSn.dominio, user_std.UtSn.utente), tipoLog.STARTUP); } } else { logger.lg.scriviLog(string.Format("Attenzione: trovati {0} utenti in RilPro AnagOperatori e {1} utenti in Soggetti2Utente per il CodSoggetto {2}: login impossibile!", trovatiAnagOp, trovatiS2U, CodSoggetto), tipoLog.ERROR); answ = esitoLoginTerm.errore_noUser; } } else { logger.lg.scriviLog(string.Format("Attenzione: trovati {0} utenti in RilPro AnagOperatori e {1} utenti in Soggetti2Utente per il CodSoggetto {2}: login impossibile!", trovatiAnagOp, trovatiS2U, CodSoggetto), tipoLog.ERROR); answ = esitoLoginTerm.errore_noCodSogg; } } catch (Exception e) { logger.lg.scriviLog(string.Format("Errore in TermClass.doUserLogin per il CodSoggetto {0}: eccezione {1}", CodSoggetto, e), tipoLog.FATAL); } return answ; } /// /// verifica se il codice barcode letto sia un particolare con codice tipo "P" /// /// /// public bool isParticolare(string barcodeIN) { bool answ = false; try { answ = utils.obj.taSelParticolari.getByConditioValue(barcodeIN, "P").Rows.Count == 1; } catch { } return answ; } /// /// verifica se il codice barcode letto sia un anima /// /// /// public bool isAnima(string valore) { bool answ = false; try { answ = utils.obj.taSelParticolari.getByConditioValue(valore, "A").Rows.Count == 1; } catch { } return answ; } /// /// verifica se il codice barcode letto sia /// - FinitoLiquidi /// - NON consumato ( maggiore di 0 ) /// - NON spedito ( minore di 200 ) /// /// UDC da verificare /// public bool isFinitoLiquidiOK(string UDC) { bool answ = false; try { answ = DataProxy.obj.taCartellini.getByUdcStatoPosiz(UDC, "FinLiq", 1, 199).Rows.Count == 1; } catch { } return answ; } /// /// Hash Redis contenente i dati MP di una specifico TYPE (es StatusMacchina, StateMachineIngressi, ...) /// /// /// public static string mHash(string dataType) { return memLayer.ML.redHash(dataType); } /// /// Hash dati DECODIFICA BCode /// /// /// public static string BCDecodeHash(string idxMacchina) { return mHash(string.Format("BCDecode:{0}", idxMacchina)); } /// /// verifica il codice barcode letto e restituisce il tipo di valore corrisponente /// /// /// public tipoCodiceBarcode riconosciBarcode(string barcodeIN) { tipoCodiceBarcode answ = tipoCodiceBarcode.ND; if (barcodeIN != "") { // cerco in sessione redis il valore con quella chiave... string rCall = ""; bool dataFound = false; try { rCall = memLayer.ML.getRSV(BCDecodeHash(barcodeIN)); if (rCall != "" && rCall != null) { dataFound = true; } } catch { } if (dataFound && memLayer.ML.CRB("EnableDecodeCache")) { tipoCodiceBarcode.TryParse(rCall, out answ); } else { // salvo richiesta barcode in cache.. memLayer.ML.setCacheVal("lastBarcodeIN", barcodeIN); // cerco se sia un particolare... if (utils.obj.taSelParticolari.getByConditioValue(barcodeIN, "*").Rows.Count == 1) { answ = tipoCodiceBarcode.Particolare; } // se non lo è continuo if (answ == tipoCodiceBarcode.ND) { switch (barcodeIN.Substring(0, 1)) { case "O": answ = tipoCodiceBarcode.Operatore; break; case "K": // se è "KITAN" allora è tipo KIT... if (barcodeIN.Substring(0, 5) == "KITAN") { answ = tipoCodiceBarcode.KitAnime; } else { answ = tipoCodiceBarcode.ListaPrelievo; } break; //case "P": //case "A": // answ = tipoCodiceBarcode.Particolare; // break; case "U": answ = tipoCodiceBarcode.UDC; break; case "S": answ = tipoCodiceBarcode.Cella; break; default: // cerco se la stringa intera abbia un match con le celle... if (MagClass.magazzino.taCelle.getByCodCella(barcodeIN).Rows.Count == 1) { answ = tipoCodiceBarcode.Cella; } // 2018.07.04 aggiunta decodifica magClass x AL... else { answ = MagClass.tipoBCode_L4(barcodeIN); } break; } } // salvo in cache decodifica int BCDecodeDurationSec = memLayer.ML.CRI("BCDecodeDurationSec") > 0 ? memLayer.ML.CRI("BCDecodeDurationSec") : 30; memLayer.ML.setRSV(BCDecodeHash(barcodeIN), answ.ToString(), BCDecodeDurationSec); } } return answ; } /// /// effettua il reset di tutti i valori in sessione salvati a valle della scansione di un barcode /// /// true/false se resettare UDC selezionato /// true/false se resettare Cella selezionata /// true/false se resettare Particolare selezionato public void resetScanBarcode(bool resetUdc, bool resetCella, bool resetParticolare) { if (resetUdc) { memLayer.ML.emptySessionVal("UDC_sel"); } if (resetCella) { memLayer.ML.emptySessionVal("IdxCella_sel"); memLayer.ML.emptySessionVal("codCella_sel"); } if (resetParticolare) { memLayer.ML.emptySessionVal("Particolare_sel"); } } #endregion } } /// /// Classe per decodifica barcode gestita tramite REDIS session values /// public class BCDecode { /// /// init classe /// protected BCDecode() { } /// /// oggetto static per fare chiamate sul magazzino /// public static BCDecode obj = new BCDecode(); /// /// Decodifica il barcode e ne determina il tipo, tramite lista decodifica REDIS oppure tramite controllo DB (e poi salva in redis x un tempo predefinito) /// /// /// public tipoCodiceBarcode getType(string BCode) { tipoCodiceBarcode answ = tipoCodiceBarcode.ND; // durata validità cache REDIS x decodifica int BCDecodeDurationSec = memLayer.ML.CRI("BCDecodeDurationSec"); if (BCDecodeDurationSec <= 0) { BCDecodeDurationSec = 30; } // cerco nella cache REDIS return answ; } } /// /// definisce i tipi di codice che il barcode può leggere /// public enum tipoCodiceBarcode { /// /// Tipo non riconosciuto /// ND, /// /// [O] - il barcode rappresenta un codice operatore /// Operatore, /// /// [K] - il barcode rappresenta una lista di prelievo /// ListaPrelievo, /// /// [U] - il barcode rappresenta un UDC /// UDC, /// /// il barcode rappresenta un particolare /// Particolare, /// /// Cella [S] /// Cella, /// /// codice gitterbox /// Gitterbox, /// /// Codice PartNumber come calcolato e valido sottoinsieme di codice datamatrix (BMW, Magneti Marelli, Porsche, ...) /// DataMatrixDecodificato, /// /// Codice datamatrix /// DataMatrixTrovato, /// /// codice che indica un comando (prefisso da web.config) /// Comando, /// /// Assieme Logico /// AL, /// /// Trattamento Termico /// TT, /// /// Codice di imballo /// Imballo, /// /// Marcatore DataOra /// DateTime, /// /// Marcatore BarCodeCMD /// BarCodeCMD, /// /// Marcatore DataOra e Linea /// DateTimeLine, /// /// Tipologia di KIT ANIME /// KitAnime } /// /// elenco degli esiti per una sessione di login da terminalino /// public enum esitoLoginTerm { /// /// tutto ok, come true /// ok, /// /// non è andata, errore generico /// errore, /// /// errore x mancanza record in tab operatori di RilPro x CodSoggetto /// errore_noCodSogg, /// /// errore mancanza username corrisponende all'operatore il cui cod soggetto è stato passato /// errore_noUser }