Repository ocmis-web¶
Panoramica¶
Il repository ocmis-web contiene i moduli che acquisiscono i dati dalle macchine Ocmis installate in tutto il mondo, memorizzandoli sul database ocmis_machinedata.
Il repository ospita due versioni del servizio:
| Versione | Linguaggio | Stato |
|---|---|---|
| Originale | PHP | Legacy, ancora in produzione |
| Nuova | Go | In sviluppo / migrazione |
La documentazione seguente fa riferimento alla versione Go.
Vedi anche
Per una descrizione approfondita dell'architettura dei backend dei singoli tipi macchina (pivot, lineare, motopompa, rotolone, ippodromo), pattern condiviso, ciclo di vita richieste e struttura dei package, vedere Architettura backend macchine.
Struttura del progetto¶
Il progetto Go e' organizzato in una cartella principale server_go con moduli suddivisi per area funzionale.
| Cartella | File | Funzione |
|---|---|---|
common |
common.go |
Dati comuni disponibili a tutto il progetto |
main |
db.go |
Funzioni di connessione al database |
main |
logs.go |
Preparazione e scrittura del log |
main |
main.go |
Attivazione del processo e messa in ascolto del servizio |
main |
router.go |
Preparazione del router di connessione e dispatching per tipo macchina |
motopompa |
readData.go |
Scambio dati con le macchine di tipo motopompa |
Database interessati¶
farmfront_portalcfg¶
All'interno del progetto e' identificato come dbCfg.
Da questo database si legge solo la tabella machines_digital, usata per capire se il segnale arrivato appartiene a una macchina esistente nel sistema.
| Tabella | Uso |
|---|---|
| machines_digital | Verifica esistenza macchina (id, tipo, azienda) |
| cust_digital | Dati cliente associato alla macchina (mail, fuso orario) |
ocmis_machinedata¶
All'interno del progetto e' identificato come dbData.
Qui viene memorizzato lo stato dei log per ciascuna macchina e i dati ricevuti, con tabelle dedicate per tipo macchina.
| Tabella | Uso |
|---|---|
| machine_log | Stato log per ciascuna macchina (1 riga per macchina) |
| motop_variabili | Variabili ricevute dalle motopompe (JSON + timestamp) |
| motop_costanti | Costanti ricevute dalle motopompe (JSON + timestamp) |
| motop_portale | Stato portale per ciascuna motopompa (comandi da inviare) |
Ambiente di test¶
Per verificare il comportamento lato DB durante l'acquisizione dati macchine, si usa l'ambiente alpha.
| Parametro | Valore |
|---|---|
| URL | https://alpha.irrigation-dataserver.com/ |
| Utente | [email protected] |
| Password | Test!1234 |
Dal pannello laterale si vedono tutte le macchine associate all'utente (una per tipo) e si puo' verificare l'effetto della modifica dei parametri.
motopompa¶
ReadData — analisi body¶
Il body ricevuto puo' contenere una sola sezione tra:
constantsvariables
Ogni sezione e' elaborata in modo indipendente.
Db interessati¶
farmfront_portalcfg
machines_digitalcust_digital
ocmis_machinedata
machine_logmotop_variabilimotop_costantimotop_portale
Riepilogo risposte¶
| aggiornamento | Situazione | Dati aggiornati | Valore |
|---|---|---|---|
| 0 | Risposta con problemi o nessun dato da aggiornare | ||
| 1 | Risposta corretta, macchina accesa | Insieme di parametri tecnici | |
| 2 | Ricevuto timestamp nel futuro (ora macchina errata) | aggiornamentoOraDaCloud | Ora attuale +/- offset fuso orario |
| 3 | Risposta corretta, richiesto azzeramento allarmi da portale | Solo timestamp |
variables¶
LoadVariables¶
Ricerca macchina¶
Esegue una query su machines_digital con i filtri:
- Macchina = id trovato
- tipo =
M - Azienda = Azienda configurata
Se la macchina non e' trovata, scrive un record su machine_log ed esce.
Se e' trovata, recupera la mail dal cliente associato (da cust_digital) e il fuso orario.
Gestione email¶
Se nel JSON esiste il parametro MailRegistrata e non corrisponde alla mail del cliente associato, viene salvata l'informazione mailModificata.
Aggiornamento log¶
Dopo le operazioni precedenti viene aggiornato il record machine_log.
Richiesta futura¶
Se la richiesta arriva con timestamp nel futuro:
- Invio messaggio di aggiornamento con:
aggiornamento= 2aggiornamentoOraDaCloud= ora attuale +/- offset fuso orario
Aggiornamenti (in transazione)¶
- Inserimento riga in
motop_variabili(contiene il JSON ricevuto e alcuni campi timestamp) - Aggiornamento riga in
motop_portale - Nell'esecuzione di
variablessi da' per scontato che il record esista gia', perche' i dati principali arrivano dalle costanti - Aggiornamento di entrambi i log per la macchina su
machine_log(sia quello di variabili sia quello di costanti)
Elaborazioni finali¶
In caso di completamento dell'operazione vengono eseguite operazioni comuni:
checkMessaggisticainviaDati
constants¶
LoadConstants¶
Ricerca macchina¶
Esegue una query su machines_digital con i filtri:
- Macchina = id trovato
- tipo =
M - Azienda = Azienda configurata
Se la macchina non e' trovata, scrive un record su machine_log ed esce.
Se e' trovata, recupera la mail dal cliente associato (da cust_digital) e il fuso orario.
Gestione email¶
Se nel JSON esiste il parametro MailRegistrata e non corrisponde alla mail del cliente associato, viene salvata l'informazione mailModificata.
Aggiornamento log¶
Dopo le operazioni precedenti viene aggiornato il record machine_log.
Richiesta futura¶
Se la richiesta arriva con timestamp nel futuro:
- Invio messaggio di aggiornamento con:
aggiornamento= 2aggiornamentoOraDaCloud= ora attuale +/- offset fuso orario
Aggiornamenti (in transazione)¶
- Inserimento riga in
motop_costanti(contiene il JSON ricevuto e alcuni campi timestamp) - Aggiornamento riga in
motop_portale - I dati principali per il record
motop_portalearrivano dalle costanti
Elaborazioni finali¶
In caso di completamento dell'operazione vengono eseguite operazioni comuni:
checkMessaggisticainviaDati
checkMessaggistica¶
Sezione indipendente che controlla se, nel JSON ricevuto, i flag di allarme sono diversi rispetto a quelli memorizzati sul database. In tal caso invia una segnalazione.
- Estrazione segnalazioni: tramite una query che confronta i valori di variabili e costanti per la macchina, genera campi con alias che rappresentano codici di "errore" e di "warning"
- Vengono estratte le ultime due righe del confronto: serve a capire se con l'ultimo aggiornamento esiste una variazione tra gli stati precedenti e quelli appena ricevuti
- Vengono segnalate solo le transizioni da "spento" ad "acceso", non il contrario
Questa elaborazione non influisce sullo stato della risposta, che resta comunque 200.
inviaDati¶
Sezione indipendente che prepara il JSON da restituire al termine della chiamata, con una serie di campi di risposta.
La logica e' la seguente:
- Cerca su
motop_portalese la macchina esiste e se hampo_aggiornatoin (1, 3) - NO: esegue
checkTimeAndMail(invio risposta "2" nel caso in cui il cliente abbia una mail diversa o il timestamp del messaggio sia piu' vecchio di 30 secondi) - SI:
mpo_aggiornato= 1 (comandi da inviare): invia una serie di dati in rispostampo_aggiornato= 3 (spegnimento allarme): invia solo il timestamp in risposta
rotolone¶
Test rotolone¶
I test del modulo rotolone si considerano positivi solo se l'elaborazione eseguita dalla versione PHP restituisce un risultato analogo a quella Go.
| Tipo JSON | Caso | Test |
|---|---|---|
| costanti | Risposta da roto_portale con rpo_aggiornato = 1 (dati_salvati se datiPortale != nil) |
Ok |
| costanti |
Funzioni comuni di utilita'¶
checkTimeAndMail¶
Funzione che riceve in input:
| Parametro | Descrizione |
|---|---|
| TimeZone | Fuso orario del cliente |
| TimeStamp | Timestamp ricevuto nel body |
| Email del cliente |
Viene eseguita dai singoli processi di ricezione dati dalle macchine quando, durante l'invio dati, non si e' in grado di recuperare i dati della macchina con aggiornamento 1 o 3.
In questo contesto la funzione restituisce una risposta al chiamante seguendo altre logiche. Sara' il chiamante a inviarla.
I casi gestiti sono:
- TimeStamp del body piu' vecchio di 30 secondi
aggiornamento= 2aggiornamentoOraDaCloud= ora del server rispetto al fuso del cliente- Mail del cliente diversa da quella indicata
- Come sopra, ma aggiunge anche l'informazione
mailModificata
formattaRisposta¶
Prepara un messaggio di risposta gia' formattato, utilizzabile generalmente in una risposta standard.
| Parametro input | Descrizione |
|---|---|
| Messaggio di risposta | map di stringhe |
| MettiSpazio | Flag |
Restituisce:
- Una stringa (la macchina non si aspetta un vero JSON)
- Un eventuale errore
replyErr¶
Risponde con un messaggio formattato nel seguente modo:
{
"aggiornamento": n,
"details": messaggio
}
Riceve in input:
| Parametro | Descrizione |
|---|---|
| fiber.ctx | Contesto della richiesta |
| status | Codice HTTP (es. 400) |
| CodiceRisposta | Valore aggiornamento |
| messaggio | Testo di dettaglio |
replyStd¶
Risponde a una richiesta eseguita con successo. Il formato della risposta e' identico a replyErr:
{
"aggiornamento": n,
"details": messaggio
}
Riceve in input gli stessi parametri di replyErr:
| Parametro | Descrizione |
|---|---|
| fiber.ctx | Contesto della richiesta |
| status | Codice HTTP |
| CodiceRisposta | Valore aggiornamento |
| messaggio | Testo di dettaglio |
prepareReply¶
Prepara un messaggio di risposta gia' formattato in caso di errore, con due soli elementi:
aggiornamento: ndetails: messaggio
Internamente usa formattaRisposta per produrre la stringa "simil-JSON" necessaria alle macchine.
Service — Assist¶
Area dedicata ai servizi di assistenza. Include le procedure di pulizia ambiente e i test da eseguire in fase di validazione.
Pulizia ambiente per test¶
Elenco delle tabelle e delle query di pulizia eseguite per preparare l'ambiente di test da zero.
Tabelle anagrafiche
arpmerciarpmeserarplistiarpscontiarpgruppiscontoarpanagrapasnmatriarpprestarpconttapcogdestiarparmagarpsnmagarpslmag
Movimentazione
arpintesarpintes2arpintecarpindetarpchdetarpindocarpchprparpscpex
Query SQL di pulizia (azienda X04398):
DELETE from arpmerci where rmer_azi = 'X04398';
DELETE from arpmeser where rmers_azi = 'X04398';
DELETE from arplisti where rlis_azi = 'X04398';
DELETE from arpsconti where a_scc_azienda = 'X04398';
DELETE from arpgruppisconto where a_gst_azienda = 'X04398';
DELETE from arpanagr where rana_azi = 'X04398';
DELETE from apasnmatri where a_amtr_azienda = 'X04398';
DELETE from arpprest where rpre_azi = 'X04398';
DELETE from arpcontt where rrif_azi = 'X04398';
DELETE from apcogdesti where a_dst_azi = 'X04398';
DELETE from arparmag where a_armag_azi = 'X04398';
DELETE from arpsnmag where a_snm_azi = 'X04398';
DELETE from arpslmag where rpmsalc_azi = 'X04398';
DELETE from arpintes where rcit_azi = 'X04398';
DELETE from arpintes2 where rcit2_azi = 'X04398';
DELETE from arpintec where rcin_azi = 'X04398';
DELETE from arpindet where rcid_azi = 'X04398';
DELETE from arpchdet where rcht_azi = 'X04398';
DELETE from arpindoc where rind_azi = 'X04398';
DELETE from arpchprp where rchp_azi = 'X04398';
DELETE from arpscpex where a_scpe_azi = 'X04398';
Test da eseguire¶
| Oggetto | Tipo test | Esito |
|---|---|---|
| Anagrafica clienti | Import | Vengono importati solo alcuni clienti: da verificare l'import massivo |
| Anagrafica contatti | Import | |
| Anagrafica destinazioni | Import | |
| Anagrafica merci | Import | |
| Anagrafica prestazioni | Import | |
| Anagrafica listini + sconti | Import | |
| Anagrafica matricole | Import |