Aller au contenu principal

Venus : pages consigne

Venus (Nest + Vue, central/venus) expose la consigne via GraphQL et ajoute un groupe Consignes dans la sidebar.

Les onglets par consigne sont générés depuis la requête consignes (rafraîchie toutes les 30 s, composable partagé useConsignes) :

const consigneTab = computed<SidebarTab>(() => ({
id: 'consignes',
label: 'Consignes',
icon: '📦',
defaultOpen: true,
children: [
{ id: 'consignes-overview', label: 'Vue d’ensemble', icon: '◎', to: '/consignes' },
...consignes.value.map((c) => ({
id: `consigne-${c.node_id}`,
label: c.name || c.node_id,
icon: c.online ? '🟢' : '⚪',
to: `/consignes/${encodeURIComponent(c.node_id)}`,
})),
{ id: 'consignes-parcel-new', label: 'Nouveau colis', icon: '➕', to: '/consignes/parcels/new' },
{ id: 'consignes-email', label: 'Email SMTP', icon: '✉', to: '/consignes/email' },
],
}));

Pages​

RouteVueContenu
/consignesConsignesView.vueCartes : en ligne, libres / occupés, canal et date de sync
/consignes/:nodeIdConsigneDetailView.vueGrille des casiers, table des colis (statut, email, livraison), journal (rafraîchi toutes les 15 s)
/consignes/parcels/newConsigneParcelNewView.vueFormulaire : consigne active, casier libre, nom, email
/consignes/emailConsigneEmailView.vueConfiguration SMTP + email de test

Captures du frontend​

Liste des consignes​

Liste Venus des consignes avec l&#39;état des nodes et le nombre de casiers disponibles

La vue d'ensemble présente les consignes connues, leur disponibilité et leur capacité.

Détail d'une consigne​

Détail Venus d&#39;une consigne avec son journal d&#39;événements et le mur de casiers

La vue détaillée regroupe l'état du node, les onglets de supervision, le journal et l'état des casiers.

Chaîne d'appel backend​

Les resolvers restent de simples dispatchers ; la logique est dans modules/consignes/consignes.service.ts.

Schéma GraphQL​

type Query {
consignes: [ConsigneDevice!]!
consigne(nodeId: String!): ConsigneDetail!
consigneParcels(nodeId: String): [ConsigneParcel!]!
consigneSmtp: SmtpSettings!
}

type Mutation {
createConsigneParcel(nodeId: String!, input: ParcelCreateInput!): ConsigneParcel!
saveConsigneSmtp(input: SmtpSettingsInput!): SmtpSettings!
testConsigneSmtp(to: String!): Boolean!
}

input ParcelCreateInput {
locker: Int!
recipient_name: String!
recipient_email: String!
}

Exemple :

curl -s -X POST http://localhost:8135/graphql -H 'Content-Type: application/json' \
-d '{"query":"{ consignes { node_id name enabled locker_count occupied_count online last_channel } }"}'
{"data":{"consignes":[{"node_id":"node-0001","name":"luckOS","enabled":true,
"locker_count":19,"occupied_count":1,"online":true,"last_channel":"grpc"}]}}

Fichiers​

CôtéFichiers
Nestsrc/models/consigne.model.ts, src/modules/consignes/*, src/api/graph/resolvers/consignes.resolver.ts, src/gateway/central-api.client.ts
Vueweb/src/types/consigne.ts, web/src/services/consigneApi.ts, web/src/composables/useConsignes.ts, web/src/views/Consigne*.vue, web/src/App.vue, web/src/router/index.ts