469 lines
14 KiB
C#
469 lines
14 KiB
C#
using SteamWare;
|
|
using System;
|
|
|
|
namespace GMW_data
|
|
{
|
|
/// <summary>
|
|
/// classe gestione operazioni con terminalino
|
|
/// </summary>
|
|
public class TermClass
|
|
{
|
|
#region area table adapters
|
|
|
|
/// <summary>
|
|
/// init dei table adapters
|
|
/// </summary>
|
|
protected void initTA()
|
|
{
|
|
// istanzio oggetto
|
|
}
|
|
/// <summary>
|
|
/// effettua setup dei connection strings da web.config delal singola applicazione
|
|
/// </summary>
|
|
protected virtual void setupConnectionStringBase()
|
|
{
|
|
// connections del db
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Inizializzazione
|
|
|
|
protected TermClass()
|
|
{
|
|
// init oggetto
|
|
initTA();
|
|
setupConnectionStringBase();
|
|
}
|
|
|
|
/// <summary>
|
|
/// oggetto static per fare chiamate sul magazzino
|
|
/// </summary>
|
|
public static TermClass Ter = new TermClass();
|
|
|
|
#endregion
|
|
|
|
#region metodi protected
|
|
|
|
#if false
|
|
/// <summary>
|
|
/// 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
|
|
/// </summary>
|
|
/// <param name="QtaTot"></param>
|
|
/// <param name="codListaAttuale"></param>
|
|
/// <param name="tabellaElencoCartellini"></param>
|
|
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
|
|
|
|
/// <summary>
|
|
/// 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
|
|
/// </summary>
|
|
/// <param name="CodSoggetto"></param>
|
|
/// <returns>tipo di errore codificato</returns>
|
|
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;
|
|
}
|
|
/// <summary>
|
|
/// verifica se il codice barcode letto sia un particolare con codice tipo "P"
|
|
/// </summary>
|
|
/// <param name="barcodeIN"></param>
|
|
/// <returns></returns>
|
|
public bool isParticolare(string barcodeIN)
|
|
{
|
|
bool answ = false;
|
|
try
|
|
{
|
|
answ = utils.obj.taSelParticolari.getByConditioValue(barcodeIN, "P").Rows.Count == 1;
|
|
}
|
|
catch
|
|
{ }
|
|
return answ;
|
|
}
|
|
/// <summary>
|
|
/// verifica se il codice barcode letto sia un anima
|
|
/// </summary>
|
|
/// <param name="valore"></param>
|
|
/// <returns></returns>
|
|
public bool isAnima(string valore)
|
|
{
|
|
bool answ = false;
|
|
try
|
|
{
|
|
answ = utils.obj.taSelParticolari.getByConditioValue(valore, "A").Rows.Count == 1;
|
|
}
|
|
catch
|
|
{ }
|
|
return answ;
|
|
}
|
|
/// <summary>
|
|
/// verifica se il codice barcode letto sia
|
|
/// - FinitoLiquidi
|
|
/// - NON consumato ( maggiore di 0 )
|
|
/// - NON spedito ( minore di 200 )
|
|
/// </summary>
|
|
/// <param name="UDC">UDC da verificare</param>
|
|
/// <returns></returns>
|
|
public bool isFinitoLiquidiOK(string UDC)
|
|
{
|
|
bool answ = false;
|
|
try
|
|
{
|
|
answ = DataProxy.obj.taCartellini.getByUdcStatoPosiz(UDC, "FinLiq", 1, 199).Rows.Count == 1;
|
|
}
|
|
catch
|
|
{ }
|
|
return answ;
|
|
}
|
|
/// <summary>
|
|
/// Hash Redis contenente i dati MP di una specifico TYPE (es StatusMacchina, StateMachineIngressi, ...)
|
|
/// </summary>
|
|
/// <param name="dataType"></param>
|
|
/// <returns></returns>
|
|
public static string mHash(string dataType)
|
|
{
|
|
return memLayer.ML.redHash(dataType);
|
|
}
|
|
/// <summary>
|
|
/// Hash dati DECODIFICA BCode
|
|
/// </summary>
|
|
/// <param name="idxMacchina"></param>
|
|
/// <returns></returns>
|
|
public static string BCDecodeHash(string idxMacchina)
|
|
{
|
|
return mHash(string.Format("BCDecode:{0}", idxMacchina));
|
|
}
|
|
/// <summary>
|
|
/// verifica il codice barcode letto e restituisce il tipo di valore corrisponente
|
|
/// </summary>
|
|
/// <param name="barcodeIN"></param>
|
|
/// <returns></returns>
|
|
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;
|
|
}
|
|
/// <summary>
|
|
/// effettua il reset di tutti i valori in sessione salvati a valle della scansione di un barcode
|
|
/// </summary>
|
|
/// <param name="resetUdc">true/false se resettare UDC selezionato</param>
|
|
/// <param name="resetCella">true/false se resettare Cella selezionata</param>
|
|
/// <param name="resetPArticolare">true/false se resettare Particolare selezionato</param>
|
|
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
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Classe per decodifica barcode gestita tramite REDIS session values
|
|
/// </summary>
|
|
public class BCDecode
|
|
{
|
|
/// <summary>
|
|
/// init classe
|
|
/// </summary>
|
|
protected BCDecode()
|
|
{
|
|
}
|
|
|
|
/// <summary>
|
|
/// oggetto static per fare chiamate sul magazzino
|
|
/// </summary>
|
|
public static BCDecode obj = new BCDecode();
|
|
/// <summary>
|
|
/// 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)
|
|
/// </summary>
|
|
/// <param name="BCode"></param>
|
|
/// <returns></returns>
|
|
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;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// definisce i tipi di codice che il barcode può leggere
|
|
/// </summary>
|
|
public enum tipoCodiceBarcode
|
|
{
|
|
/// <summary>
|
|
/// Tipo non riconosciuto
|
|
/// </summary>
|
|
ND,
|
|
/// <summary>
|
|
/// [O] - il barcode rappresenta un codice operatore
|
|
/// </summary>
|
|
Operatore,
|
|
/// <summary>
|
|
/// [K] - il barcode rappresenta una lista di prelievo
|
|
/// </summary>
|
|
ListaPrelievo,
|
|
/// <summary>
|
|
/// [U] - il barcode rappresenta un UDC
|
|
/// </summary>
|
|
UDC,
|
|
/// <summary>
|
|
/// il barcode rappresenta un particolare
|
|
/// </summary>
|
|
Particolare,
|
|
/// <summary>
|
|
/// Cella [S]
|
|
/// </summary>
|
|
Cella,
|
|
/// <summary>
|
|
/// codice gitterbox
|
|
/// </summary>
|
|
Gitterbox,
|
|
/// <summary>
|
|
/// Codice PartNumber come calcolato e valido sottoinsieme di codice datamatrix (BMW, Magneti Marelli, Porsche, ...)
|
|
/// </summary>
|
|
DataMatrixDecodificato,
|
|
/// <summary>
|
|
/// Codice datamatrix
|
|
/// </summary>
|
|
DataMatrixTrovato,
|
|
/// <summary>
|
|
/// codice che indica un comando (prefisso da web.config)
|
|
/// </summary>
|
|
Comando,
|
|
/// <summary>
|
|
/// Assieme Logico
|
|
/// </summary>
|
|
AL,
|
|
/// <summary>
|
|
/// Trattamento Termico
|
|
/// </summary>
|
|
TT,
|
|
/// <summary>
|
|
/// Codice di imballo
|
|
/// </summary>
|
|
Imballo,
|
|
/// <summary>
|
|
/// Marcatore DataOra
|
|
/// </summary>
|
|
DateTime,
|
|
/// <summary>
|
|
/// Marcatore BarCodeCMD
|
|
/// </summary>
|
|
BarCodeCMD,
|
|
/// <summary>
|
|
/// Marcatore DataOra e Linea
|
|
/// </summary>
|
|
DateTimeLine,
|
|
/// <summary>
|
|
/// Tipologia di KIT ANIME
|
|
/// </summary>
|
|
KitAnime
|
|
}
|
|
/// <summary>
|
|
/// elenco degli esiti per una sessione di login da terminalino
|
|
/// </summary>
|
|
public enum esitoLoginTerm
|
|
{
|
|
/// <summary>
|
|
/// tutto ok, come true
|
|
/// </summary>
|
|
ok,
|
|
/// <summary>
|
|
/// non è andata, errore generico
|
|
/// </summary>
|
|
errore,
|
|
/// <summary>
|
|
/// errore x mancanza record in tab operatori di RilPro x CodSoggetto
|
|
/// </summary>
|
|
errore_noCodSogg,
|
|
/// <summary>
|
|
/// errore mancanza username corrisponende all'operatore il cui cod soggetto è stato passato
|
|
/// </summary>
|
|
errore_noUser
|
|
} |