ems-core v1.0.0: Standard EMS platform core

Shared backend + frontend for multi-customer EMS deployments.
- 12 enterprise modules: quota, cost, charging, maintenance, analysis, etc.
- 120+ API endpoints, 37 database tables
- Customer config mechanism (CUSTOMER env var + YAML config)
- Collectors: Modbus TCP, MQTT, HTTP API, Sungrow iSolarCloud
- Frontend: React 19 + Ant Design + ECharts + Three.js
- Infrastructure: Redis cache, rate limiting, aggregation engine

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Du Wenbo
2026-04-04 18:14:11 +08:00
commit 92ec910a13
227 changed files with 39179 additions and 0 deletions

View File

@@ -0,0 +1,46 @@
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="300" viewBox="0 0 400 300">
<defs>
<linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#1a2332;stop-opacity:1" />
<stop offset="100%" style="stop-color:#0f172a;stop-opacity:1" />
</linearGradient>
<linearGradient id="body" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" style="stop-color:#e5e7eb;stop-opacity:1" />
<stop offset="100%" style="stop-color:#9ca3af;stop-opacity:1" />
</linearGradient>
</defs>
<rect width="400" height="300" fill="url(#bg)" rx="12"/>
<!-- Heat pump body -->
<rect x="80" y="50" width="240" height="170" rx="12" fill="url(#body)" stroke="#6b7280" stroke-width="2"/>
<!-- Fan grille -->
<circle cx="200" cy="120" r="55" fill="#374151" stroke="#4b5563" stroke-width="3"/>
<circle cx="200" cy="120" r="45" fill="none" stroke="#6b7280" stroke-width="1"/>
<circle cx="200" cy="120" r="35" fill="none" stroke="#6b7280" stroke-width="1"/>
<circle cx="200" cy="120" r="25" fill="none" stroke="#6b7280" stroke-width="1"/>
<circle cx="200" cy="120" r="8" fill="#1f2937"/>
<!-- Fan blades -->
<g transform="translate(200, 120)" fill="#4b5563" opacity="0.8">
<ellipse cx="0" cy="-22" rx="8" ry="22" transform="rotate(0)"/>
<ellipse cx="0" cy="-22" rx="8" ry="22" transform="rotate(90)"/>
<ellipse cx="0" cy="-22" rx="8" ry="22" transform="rotate(180)"/>
<ellipse cx="0" cy="-22" rx="8" ry="22" transform="rotate(270)"/>
</g>
<!-- Side vents -->
<g fill="#9ca3af">
<rect x="90" y="170" width="40" height="3" rx="1.5"/>
<rect x="90" y="178" width="40" height="3" rx="1.5"/>
<rect x="90" y="186" width="40" height="3" rx="1.5"/>
<rect x="90" y="194" width="40" height="3" rx="1.5"/>
<rect x="90" y="202" width="40" height="3" rx="1.5"/>
</g>
<!-- Pipes -->
<rect x="280" y="140" width="30" height="12" rx="6" fill="#ef4444" opacity="0.8"/>
<rect x="280" y="165" width="30" height="12" rx="6" fill="#3b82f6" opacity="0.8"/>
<text x="295" y="149" text-anchor="middle" fill="white" font-size="8" font-family="Arial"></text>
<text x="295" y="174" text-anchor="middle" fill="white" font-size="8" font-family="Arial"></text>
<!-- Status LED -->
<circle cx="100" cy="68" r="4" fill="#22c55e"/>
<!-- Label -->
<text x="200" y="258" text-anchor="middle" fill="#ff8c00" font-family="Arial, sans-serif" font-size="20" font-weight="bold">空气源热泵</text>
<text x="200" y="278" text-anchor="middle" fill="#6b7280" font-family="Arial, sans-serif" font-size="12">Air Source Heat Pump</text>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB