device-boundary-demo.html 5.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. <!doctype html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="utf-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1" />
  6. <title>Cockpit Device Boundary Demo</title>
  7. <style>
  8. body { margin:0; min-height:100vh; background:#0b1622; color:#e8f1f8; font:15px/1.5 "Microsoft YaHei",sans-serif; }
  9. main { width:min(1180px,calc(100vw - 32px)); margin:32px auto; background:#102030; border:1px solid #21465f; padding:24px; }
  10. h1 { margin:0 0 6px; font-size:22px; } .endpoint { color:#78a2b8; font-family:Consolas,monospace; margin:0 0 18px; }
  11. .summary { display:grid; grid-template-columns:repeat(5,1fr); gap:10px; margin-bottom:18px; }
  12. .card { padding:12px; border:1px solid #2a5a75; background:#0d1922; }
  13. .card strong { display:block; font-size:22px; } .card span { color:#8fb3c7; }
  14. table { width:100%; border-collapse:collapse; margin-top:16px; } th,td { border:1px solid #2a5a75; padding:8px; text-align:left; }
  15. th { background:#123247; } .facility td:first-child { color:#61d095; } .device td:first-child { color:#78a2b8; }
  16. .unknown { color:#f0ad4e; } code { color:#c9e7f7; }
  17. </style>
  18. </head>
  19. <body>
  20. <main>
  21. <h1>驾驶舱设备身份与领域边界演示</h1>
  22. <p class="endpoint">GET /api/cockpit/v1/device-boundary</p>
  23. <section class="summary">
  24. <div class="card"><strong id="facility-count"></strong><span>设施</span></div>
  25. <div class="card"><strong id="device-count"></strong><span>智能设备</span></div>
  26. <div class="card"><strong id="formal-device-count"></strong><span>正式范围设备</span></div>
  27. <div class="card"><strong id="unknown-count"></strong><span>未知类型</span></div>
  28. <div class="card"><strong id="mismatch-count"></strong><span>类型边界冲突</span></div>
  29. </section>
  30. <table>
  31. <thead><tr><th>编码</th><th>名称</th><th>类型</th><th>行业</th><th>排水范围</th><th>对象</th><th>正式范围</th></tr></thead>
  32. <tbody id="objects"></tbody>
  33. </table>
  34. </main>
  35. <script>
  36. const payload = {
  37. requestId:'demo-device-boundary',apiVersion:'v1',readOnly:true,
  38. typeScope:{formalIndustries:['GAS','WATER_SUPPLY','DRAINAGE'],drainageScopes:['RAINWATER','SEWAGE'],objectKinds:['FACILITY','SMART_DEVICE']},
  39. facilities:[
  40. {facilityCode:'F-WATER-001',facilityName:'第一水厂',facilityType:{code:'WATER_PLANT',name:'水厂'},industry:'WATER_SUPPLY',objectKind:'FACILITY',formalScope:true},
  41. {facilityCode:'F-PUMP-001',facilityName:'城北泵站',facilityType:{code:'PUMP_STATION',name:'泵站'},industry:'WATER_SUPPLY',objectKind:'FACILITY',formalScope:true},
  42. {facilityCode:'F-PIPE-001',facilityName:'供水主线',facilityType:{code:'PIPELINE',name:'供水管线'},industry:'WATER_SUPPLY',objectKind:'FACILITY',formalScope:true}
  43. ],
  44. devices:[
  45. {deviceCode:'EQ-GAS-001',deviceName:'燃气浓度计-001',deviceType:{code:'GAS_SENSOR',name:'燃气浓度计'},industry:'GAS',objectKind:'SMART_DEVICE',formalScope:true,typeResolution:'RESOLVED'},
  46. {deviceCode:'EQ-WS-001',deviceName:'供水压力计-001',deviceType:{code:'WATER_SUPPLY_SENSOR',name:'供水压力计'},industry:'WATER_SUPPLY',objectKind:'SMART_DEVICE',formalScope:true,typeResolution:'RESOLVED'},
  47. {deviceCode:'EQ-RAIN-001',deviceName:'雨水流量计-001',deviceType:{code:'RAINWATER_SENSOR',name:'雨水流量计'},industry:'DRAINAGE',drainageScope:'RAINWATER',objectKind:'SMART_DEVICE',formalScope:true,typeResolution:'RESOLVED'},
  48. {deviceCode:'EQ-SEW-001',deviceName:'污水环境监测仪-001',deviceType:{code:'SEWAGE_ENVIRONMENT_SENSOR',name:'污水环境监测仪'},industry:'DRAINAGE',drainageScope:'SEWAGE',objectKind:'SMART_DEVICE',formalScope:true,typeResolution:'RESOLVED'},
  49. {deviceCode:'EQ-MH-001',deviceName:'智能井盖-001',deviceType:{code:'SMART_MANHOLE',name:'智能井盖'},objectKind:'SMART_DEVICE',formalScope:false,typeResolution:'RESOLVED'},
  50. {deviceCode:'EQ-UNKNOWN-001',deviceName:'未知类型设备-001',deviceType:{code:'LEGACY_UNKNOWN_TYPE'},objectKind:'SMART_DEVICE',formalScope:false,typeResolution:'UNKNOWN_TYPE'}
  51. ],
  52. statistics:{facilityCount:3,smartDeviceCount:6,formalSmartDeviceCount:4,unknownTypeCount:1,typeKindMismatchCount:0}
  53. };
  54. function row(item,isFacility){
  55. return `<tr class="${isFacility?'facility':'device'} ${item.typeResolution==='UNKNOWN_TYPE'?'unknown':''}"><td><code>${item.facilityCode||item.deviceCode}</code></td><td>${item.facilityName||item.deviceName}</td><td>${(item.facilityType||item.deviceType||{}).name||'未知类型'}</td><td>${item.industry||'—'}</td><td>${item.drainageScope||'—'}</td><td>${item.objectKind}</td><td>${item.formalScope?'是':'否'}</td></tr>`;
  56. }
  57. document.getElementById('objects').innerHTML = payload.facilities.map(x=>row(x,true)).concat(payload.devices.map(x=>row(x,false))).join('');
  58. const stats=payload.statistics;
  59. facilityCount.textContent=stats.facilityCount;deviceCount.textContent=stats.smartDeviceCount;formalDeviceCount.textContent=stats.formalSmartDeviceCount;unknownCount.textContent=stats.unknownTypeCount;mismatchCount.textContent=stats.typeKindMismatchCount;
  60. </script>
  61. </body>
  62. </html>