Update TallyFlow architecture diagram and description
Corrections: - Database: MongoDB - Assets (Mobile): Lightweight inventory, seek & find, enrollment - Capture (PhotoTag): Photo + barcode association for QC - Print: Zebra ZPL compatible - Improved component descriptions and data flows
This commit is contained in:
@@ -86,37 +86,37 @@
|
|||||||
<text x="300" y="168" fill="#94a3b8" font-size="9" text-anchor="middle">FastAPI / Node.js</text>
|
<text x="300" y="168" fill="#94a3b8" font-size="9" text-anchor="middle">FastAPI / Node.js</text>
|
||||||
<text x="300" y="182" fill="#34d399" font-size="8" text-anchor="middle">REST + WebSocket</text>
|
<text x="300" y="182" fill="#34d399" font-size="8" text-anchor="middle">REST + WebSocket</text>
|
||||||
|
|
||||||
<!-- Assets Component -->
|
<!-- Assets (Mobile) Component - corrected -->
|
||||||
<rect x="420" y="120" width="160" height="70" rx="8" fill="rgba(76, 29, 149, 0.45)" stroke="#a78bfa" stroke-width="2"/>
|
<rect x="420" y="120" width="160" height="70" rx="8" fill="rgba(8, 51, 68, 0.45)" stroke="#22d3ee" stroke-width="2"/>
|
||||||
<text x="500" y="150" fill="white" font-size="13" font-weight="700" text-anchor="middle">Assets</text>
|
<text x="500" y="148" fill="white" font-size="13" font-weight="700" text-anchor="middle">Assets (Mobile)</text>
|
||||||
<text x="500" y="168" fill="#94a3b8" font-size="9" text-anchor="middle">Asset Registry</text>
|
<text x="500" y="165" fill="#94a3b8" font-size="9" text-anchor="middle">Lightweight Inventory</text>
|
||||||
<text x="500" y="182" fill="#a78bfa" font-size="8" text-anchor="middle">PostgreSQL + Search</text>
|
<text x="500" y="180" fill="#22d3ee" font-size="8" text-anchor="middle">Seek & Find • Enrollment</text>
|
||||||
|
|
||||||
<!-- Print Component -->
|
<!-- Print Component - corrected to Zebra ZPL -->
|
||||||
<rect x="620" y="120" width="160" height="70" rx="8" fill="rgba(120, 53, 15, 0.4)" stroke="#fbbf24" stroke-width="2"/>
|
<rect x="620" y="120" width="160" height="70" rx="8" fill="rgba(120, 53, 15, 0.4)" stroke="#fbbf24" stroke-width="2"/>
|
||||||
<text x="700" y="150" fill="white" font-size="13" font-weight="700" text-anchor="middle">Print</text>
|
<text x="700" y="148" fill="white" font-size="13" font-weight="700" text-anchor="middle">Print</text>
|
||||||
<text x="700" y="168" fill="#94a3b8" font-size="9" text-anchor="middle">Label Printing</text>
|
<text x="700" y="165" fill="#94a3b8" font-size="9" text-anchor="middle">Zebra (ZPL compatible)</text>
|
||||||
<text x="700" y="182" fill="#fbbf24" font-size="8" text-anchor="middle">Zebra / Brother</text>
|
<text x="700" y="180" fill="#fbbf24" font-size="8" text-anchor="middle">Label + RFID Encoding</text>
|
||||||
|
|
||||||
<!-- Capture (Mobile) -->
|
<!-- Capture (PhotoTag) - corrected -->
|
||||||
<rect x="80" y="280" width="140" height="90" rx="8" fill="rgba(8, 51, 68, 0.45)" stroke="#22d3ee" stroke-width="2"/>
|
<rect x="80" y="280" width="140" height="90" rx="8" fill="rgba(136, 19, 55, 0.4)" stroke="#fb7185" stroke-width="2"/>
|
||||||
<text x="150" y="310" fill="white" font-size="13" font-weight="700" text-anchor="middle">Capture</text>
|
<text x="150" y="308" fill="white" font-size="13" font-weight="700" text-anchor="middle">Capture</text>
|
||||||
<text x="150" y="328" fill="#94a3b8" font-size="9" text-anchor="middle">Mobile App</text>
|
<text x="150" y="326" fill="#94a3b8" font-size="9" text-anchor="middle">(PhotoTag)</text>
|
||||||
<text x="150" y="342" fill="#22d3ee" font-size="8" text-anchor="middle">Janam / Zebra / Atid</text>
|
<text x="150" y="342" fill="#fb7185" font-size="8" text-anchor="middle">Photo + Barcode assoc</text>
|
||||||
<text x="150" y="356" fill="#94a3b8" font-size="8" text-anchor="middle">Enroll & Scan</text>
|
<text x="150" y="356" fill="#94a3b8" font-size="8" text-anchor="middle">QC Documentation</text>
|
||||||
|
|
||||||
<!-- IoT / Fixed Readers -->
|
<!-- IoT / Fixed Readers + Sensors -->
|
||||||
<rect x="780" y="280" width="140" height="90" rx="8" fill="rgba(251, 146, 60, 0.35)" stroke="#fb923c" stroke-width="2"/>
|
<rect x="780" y="280" width="140" height="90" rx="8" fill="rgba(251, 146, 60, 0.35)" stroke="#fb923c" stroke-width="2"/>
|
||||||
<text x="850" y="310" fill="white" font-size="13" font-weight="700" text-anchor="middle">IoT</text>
|
<text x="850" y="308" fill="white" font-size="13" font-weight="700" text-anchor="middle">IoT</text>
|
||||||
<text x="850" y="328" fill="#94a3b8" font-size="9" text-anchor="middle">Fixed Readers</text>
|
<text x="850" y="326" fill="#94a3b8" font-size="9" text-anchor="middle">Fixed Readers + Sensors</text>
|
||||||
<text x="850" y="342" fill="#fb923c" font-size="8" text-anchor="middle">Impinj / Zebra</text>
|
<text x="850" y="342" fill="#fb923c" font-size="8" text-anchor="middle">Impinj / Zebra</text>
|
||||||
<text x="850" y="356" fill="#94a3b8" font-size="8" text-anchor="middle">MQTT / HTTP</text>
|
<text x="850" y="356" fill="#94a3b8" font-size="8" text-anchor="middle">MQTT / HTTP / BLE</text>
|
||||||
|
|
||||||
<!-- Database Layer -->
|
<!-- Database Layer - corrected to MongoDB -->
|
||||||
<rect x="320" y="420" width="360" height="70" rx="8" fill="rgba(76, 29, 149, 0.35)" stroke="#a78bfa" stroke-width="1.5"/>
|
<rect x="320" y="420" width="360" height="70" rx="8" fill="rgba(76, 29, 149, 0.35)" stroke="#a78bfa" stroke-width="1.5"/>
|
||||||
<text x="500" y="450" fill="white" font-size="12" font-weight="700" text-anchor="middle">Database & Event Store</text>
|
<text x="500" y="450" fill="white" font-size="12" font-weight="700" text-anchor="middle">MongoDB</text>
|
||||||
<text x="500" y="468" fill="#94a3b8" font-size="9" text-anchor="middle">PostgreSQL • Redis • Time-series</text>
|
<text x="500" y="468" fill="#94a3b8" font-size="9" text-anchor="middle">Asset registry • Event store • Audit</text>
|
||||||
<text x="500" y="482" fill="#a78bfa" font-size="8" text-anchor="middle">Asset history, tag events, audit logs</text>
|
<text x="500" y="482" fill="#a78bfa" font-size="8" text-anchor="middle">Tags, photos, zones, history</text>
|
||||||
|
|
||||||
<!-- External Integrations / Excel -->
|
<!-- External Integrations / Excel -->
|
||||||
<rect x="80" y="420" width="120" height="60" rx="6" fill="rgba(30, 41, 59, 0.5)" stroke="#94a3b8" stroke-width="1.5"/>
|
<rect x="80" y="420" width="120" height="60" rx="6" fill="rgba(30, 41, 59, 0.5)" stroke="#94a3b8" stroke-width="1.5"/>
|
||||||
@@ -126,12 +126,12 @@
|
|||||||
<!-- Arrows / Flows -->
|
<!-- Arrows / Flows -->
|
||||||
|
|
||||||
<!-- Capture → Core -->
|
<!-- Capture → Core -->
|
||||||
<line x1="222" y1="325" x2="280" y2="190" stroke="#22d3ee" stroke-width="2" marker-end="url(#arrowhead)"/>
|
<line x1="222" y1="325" x2="280" y2="190" stroke="#fb7185" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||||
<text x="235" y="265" fill="#22d3ee" font-size="9" font-weight="600">API Sync</text>
|
<text x="235" y="265" fill="#fb7185" font-size="9" font-weight="600">Photo + Data</text>
|
||||||
|
|
||||||
<!-- Core ↔ Assets (internal) -->
|
<!-- Core ↔ Assets (Mobile) -->
|
||||||
<line x1="382" y1="155" x2="418" y2="155" stroke="#a78bfa" stroke-width="2" marker-end="url(#arrowhead)"/>
|
<line x1="382" y1="155" x2="418" y2="155" stroke="#22d3ee" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||||
<text x="400" y="148" fill="#a78bfa" font-size="8">CRUD</text>
|
<text x="400" y="148" fill="#22d3ee" font-size="8">Sync</text>
|
||||||
|
|
||||||
<!-- Core → Print -->
|
<!-- Core → Print -->
|
||||||
<line x1="382" y1="155" x2="618" y2="155" stroke="#fbbf24" stroke-width="2" marker-end="url(#arrowhead)"/>
|
<line x1="382" y1="155" x2="618" y2="155" stroke="#fbbf24" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||||
@@ -141,11 +141,11 @@
|
|||||||
<line x1="778" y1="325" x2="720" y2="190" stroke="#fb923c" stroke-width="2" marker-end="url(#arrowhead)"/>
|
<line x1="778" y1="325" x2="720" y2="190" stroke="#fb923c" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||||
<text x="765" y="265" fill="#fb923c" font-size="9" font-weight="600">Tag Events</text>
|
<text x="765" y="265" fill="#fb923c" font-size="9" font-weight="600">Tag Events</text>
|
||||||
|
|
||||||
<!-- Core ↔ Database -->
|
<!-- Core ↔ MongoDB -->
|
||||||
<line x1="500" y1="192" x2="500" y2="418" stroke="#a78bfa" stroke-width="2" marker-end="url(#arrowhead)"/>
|
<line x1="500" y1="192" x2="500" y2="418" stroke="#a78bfa" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||||
<text x="515" y="310" fill="#a78bfa" font-size="9">Persist</text>
|
<text x="515" y="310" fill="#a78bfa" font-size="9">Persist</text>
|
||||||
|
|
||||||
<!-- Print ↔ Database (via Core) -->
|
<!-- Print ↔ MongoDB (via Core) -->
|
||||||
<line x1="700" y1="192" x2="680" y2="418" stroke="#fbbf24" stroke-width="1.5" stroke-dasharray="4,2" marker-end="url(#arrowhead)"/>
|
<line x1="700" y1="192" x2="680" y2="418" stroke="#fbbf24" stroke-width="1.5" stroke-dasharray="4,2" marker-end="url(#arrowhead)"/>
|
||||||
|
|
||||||
<!-- Capture ↔ Excel example flow -->
|
<!-- Capture ↔ Excel example flow -->
|
||||||
@@ -157,20 +157,23 @@
|
|||||||
<rect x="80" y="572" width="18" height="11" rx="2" fill="rgba(6, 78, 59, 0.45)" stroke="#34d399" stroke-width="1"/>
|
<rect x="80" y="572" width="18" height="11" rx="2" fill="rgba(6, 78, 59, 0.45)" stroke="#34d399" stroke-width="1"/>
|
||||||
<text x="105" y="581" fill="#94a3b8" font-size="8">Core Backend</text>
|
<text x="105" y="581" fill="#94a3b8" font-size="8">Core Backend</text>
|
||||||
|
|
||||||
<rect x="200" y="572" width="18" height="11" rx="2" fill="rgba(76, 29, 149, 0.45)" stroke="#a78bfa" stroke-width="1"/>
|
<rect x="200" y="572" width="18" height="11" rx="2" fill="rgba(8, 51, 68, 0.45)" stroke="#22d3ee" stroke-width="1"/>
|
||||||
<text x="225" y="581" fill="#94a3b8" font-size="8">Assets / DB</text>
|
<text x="225" y="581" fill="#94a3b8" font-size="8">Assets (Mobile)</text>
|
||||||
|
|
||||||
<rect x="310" y="572" width="18" height="11" rx="2" fill="rgba(8, 51, 68, 0.45)" stroke="#22d3ee" stroke-width="1"/>
|
<rect x="330" y="572" width="18" height="11" rx="2" fill="rgba(136, 19, 55, 0.4)" stroke="#fb7185" stroke-width="1"/>
|
||||||
<text x="335" y="581" fill="#94a3b8" font-size="8">Mobile / Frontend</text>
|
<text x="355" y="581" fill="#94a3b8" font-size="8">Capture (PhotoTag)</text>
|
||||||
|
|
||||||
<rect x="440" y="572" width="18" height="11" rx="2" fill="rgba(120, 53, 15, 0.4)" stroke="#fbbf24" stroke-width="1"/>
|
<rect x="485" y="572" width="18" height="11" rx="2" fill="rgba(120, 53, 15, 0.4)" stroke="#fbbf24" stroke-width="1"/>
|
||||||
<text x="465" y="581" fill="#94a3b8" font-size="8">Print Service</text>
|
<text x="510" y="581" fill="#94a3b8" font-size="8">Print (Zebra ZPL)</text>
|
||||||
|
|
||||||
<rect x="555" y="572" width="18" height="11" rx="2" fill="rgba(251, 146, 60, 0.35)" stroke="#fb923c" stroke-width="1"/>
|
<rect x="610" y="572" width="18" height="11" rx="2" fill="rgba(251, 146, 60, 0.35)" stroke="#fb923c" stroke-width="1"/>
|
||||||
<text x="580" y="581" fill="#94a3b8" font-size="8">IoT / Edge</text>
|
<text x="635" y="581" fill="#94a3b8" font-size="8">IoT / Edge</text>
|
||||||
|
|
||||||
<line x1="680" y1="577" x2="698" y2="577" stroke="#64748b" stroke-width="1.5" marker-end="url(#arrowhead)"/>
|
<rect x="720" y="572" width="18" height="11" rx="2" fill="rgba(76, 29, 149, 0.35)" stroke="#a78bfa" stroke-width="1"/>
|
||||||
<text x="705" y="581" fill="#94a3b8" font-size="8">Data Flow</text>
|
<text x="745" y="581" fill="#94a3b8" font-size="8">MongoDB</text>
|
||||||
|
|
||||||
|
<line x1="850" y1="577" x2="868" y2="577" stroke="#64748b" stroke-width="1.5" marker-end="url(#arrowhead)"/>
|
||||||
|
<text x="875" y="581" fill="#94a3b8" font-size="8">Data Flow</text>
|
||||||
</svg>
|
</svg>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -178,25 +181,37 @@
|
|||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<div class="card-dot emerald"></div>
|
<div class="card-dot emerald"></div>
|
||||||
<h3>Core + Assets</h3>
|
<h3>Core</h3>
|
||||||
</div>
|
</div>
|
||||||
<ul>
|
<ul>
|
||||||
<li>• Central orchestration & API layer</li>
|
<li>• Central orchestration & API hub</li>
|
||||||
<li>• Asset registry & lifecycle management</li>
|
<li>• Web UI for asset management</li>
|
||||||
<li>• Real-time event processing</li>
|
<li>• Zone, category & reporting config</li>
|
||||||
<li>• Web UI for operators & admins</li>
|
<li>• Integration point for all modules</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<div class="card-dot cyan"></div>
|
<div class="card-dot cyan"></div>
|
||||||
<h3>Capture (Mobile)</h3>
|
<h3>Assets (Mobile)</h3>
|
||||||
</div>
|
</div>
|
||||||
<ul>
|
<ul>
|
||||||
<li>• Field enrollment & tag scanning</li>
|
<li>• Lightweight inventory & tracking</li>
|
||||||
<li>• Supports Janam XR2, Zebra, Atid</li>
|
<li>• Geiger-style seek & find</li>
|
||||||
<li>• Offline-first with sync</li>
|
<li>• Fast enrollment & editing</li>
|
||||||
<li>• Photo + GPS metadata capture</li>
|
<li>• Zone moves & shipping workflows</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<div class="card-dot rose"></div>
|
||||||
|
<h3>Capture (PhotoTag)</h3>
|
||||||
|
</div>
|
||||||
|
<ul>
|
||||||
|
<li>• Photo + barcode association</li>
|
||||||
|
<li>• QC & visual documentation</li>
|
||||||
|
<li>• Work order / serial tagging</li>
|
||||||
|
<li>• Searchable photo records</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="card">
|
<div class="card">
|
||||||
@@ -205,10 +220,10 @@
|
|||||||
<h3>Print + IoT</h3>
|
<h3>Print + IoT</h3>
|
||||||
</div>
|
</div>
|
||||||
<ul>
|
<ul>
|
||||||
<li>• On-demand label printing</li>
|
<li>• Zebra ZPL label printing & encoding</li>
|
||||||
<li>• Fixed reader integration (Impinj/Zebra)</li>
|
<li>• Fixed RFID readers (Impinj/Zebra)</li>
|
||||||
<li>• MQTT & HTTP tag event ingestion</li>
|
<li>• IoT sensors (location, temp, shock)</li>
|
||||||
<li>• Bulk Excel import support</li>
|
<li>• Excel bulk import support</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -4,13 +4,24 @@
|
|||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
TallyFlow's architecture is built around a central Core backend that serves as the orchestration layer for all asset tracking, RFID tag management, and workflow automation. The Assets module provides a structured registry and persistence layer (PostgreSQL-backed) for manufacturing assets, their metadata, history, and relationships. Field operations are enabled through the Capture mobile application, which runs on rugged handheld devices (Janam XR2, Zebra, Atid) to support offline-first tag enrollment, scanning, photo capture, and GPS tagging with seamless synchronization to Core. TallyFlow Print handles on-demand label generation and data association, while the IoT layer integrates fixed RFID readers (Impinj and Zebra) via MQTT or HTTP to stream real-time tag events into the platform. All components communicate through the Core API, enabling unified visibility, audit trails, and waste-reduction analytics across the manufacturing environment. Bulk data ingestion is supported via Excel import directly into Core.
|
TallyFlow is a modular asset tracking platform centered on **TallyFlow Core**, the central web backend and integration hub. All other components synchronize with Core for asset registration, configuration, reporting, and data consistency.
|
||||||
|
|
||||||
|
**TallyFlow Assets (Mobile)** is the primary field application for lightweight inventory management, geiger-counter-style seek & find, fast enrollment, zone movements, and shipping workflows.
|
||||||
|
|
||||||
|
**TallyFlow Capture** (rebranded from PhotoTag) enables photo documentation by associating images with barcodes, work orders, serial numbers, and other metadata for quality control and visual record-keeping across incoming, in-process, and outgoing inspections.
|
||||||
|
|
||||||
|
**TallyFlow Print** handles on-demand Zebra ZPL-compatible label printing and RFID encoding, with optional automatic registration back into Core.
|
||||||
|
|
||||||
|
**IoT** provides real-time location, environmental sensor data (temperature, humidity, shock), and fixed RFID reader integration (Impinj, Zebra) via MQTT/HTTP/BLE, feeding live events into Core.
|
||||||
|
|
||||||
|
Data is persisted in **MongoDB**, which stores the asset registry, tag events, photo metadata, zones, and full audit history. Bulk onboarding is supported via Excel import. All modules communicate through Core’s REST + WebSocket APIs, enabling unified visibility and waste reduction across manufacturing operations.
|
||||||
|
|
||||||
## Key Data Flows
|
## Key Data Flows
|
||||||
- Capture ↔ Core: Real-time and batched sync of tag events and asset updates
|
- **Assets (Mobile) ↔ Core**: Sync inventory updates, enrollment, and seek/find data
|
||||||
- Print ↔ Core: Print job submission and confirmation
|
- **Capture ↔ Core**: Photo + barcode metadata and QC records
|
||||||
- IoT → Core: Continuous tag read events from fixed readers
|
- **Print → Core**: Print job submission + optional auto-registration
|
||||||
- Core ↔ Assets/DB: Persistent storage of asset state and event history
|
- **IoT → Core**: Real-time tag events and sensor data
|
||||||
- Excel → Core: Bulk asset onboarding
|
- **Core ↔ MongoDB**: Persistent storage of all asset, tag, photo, and event data
|
||||||
|
- **Excel → Core**: Bulk asset and tag ingestion
|
||||||
|
|
||||||
This modular design allows TallyFlow to scale from mobile-only deployments to full IoT-enabled smart factories while maintaining a single source of truth in the Core.
|
This architecture allows flexible deployment — from mobile-only inventory tracking to full IoT + automated capture environments — while keeping Core as the single source of truth.
|
||||||
Reference in New Issue
Block a user