From 23205ddd1b3c36994dd99a00b057919b7542bc61 Mon Sep 17 00:00:00 2001 From: fengpu <18691763612@163.com> Date: Thu, 25 Jun 2026 19:41:03 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=90=A5=E5=85=BB=E8=BE=B9=E7=BC=98?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=8E=9F=E5=9E=8B=E8=BF=AD=E4=BB=A3=20+=20?= =?UTF-8?q?=E8=A5=BF=E5=AE=89=E5=BA=94=E6=80=A5=E5=A4=A7=E5=B1=8F=20v2/v3?= =?UTF-8?q?=20=E5=8F=8C=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 营养边缘服务:新增《缓存中转服务器产品需求说明书》及导航入口;重构数据下发详情页(抽屉式接收轨迹+终端应用明细弹窗);告警中心/下发管理/上报管理/服务器管理/服务器详情统一补齐分页与列调整 - 西安应急大屏:新增 v2 版本(路径规划+统计胶囊悬浮化+图层位置调整)与 v3 版本(顶部 KPI 条+24h 趋势折线+横向条形图+环形组合图等图表化重构),全部纯内联 SVG;同步更新 CHANGELOG Co-Authored-By: Claude Opus 4.7 --- index.html | 5 + .../emergency-screen/doc/CHANGELOG.md | 60 + .../emergency-screen/xian-center/.gitkeep | 0 .../xian-center/index-v2.html | 3351 +++++++++++++++ .../xian-center/index-v3.html | 3617 +++++++++++++++++ .../doc/缓存中转服务器产品需求说明书.md | 284 ++ web-admin/nutrition/edge-alert-center.html | 62 +- web-admin/nutrition/edge-dispatch-detail.html | 320 +- .../nutrition/edge-dispatch-management.html | 61 +- .../nutrition/edge-report-management.html | 158 +- web-admin/nutrition/edge-server-detail.html | 56 +- .../nutrition/edge-server-management.html | 141 +- 12 files changed, 7911 insertions(+), 204 deletions(-) delete mode 100644 other-module/emergency-screen/xian-center/.gitkeep create mode 100644 other-module/emergency-screen/xian-center/index-v2.html create mode 100644 other-module/emergency-screen/xian-center/index-v3.html create mode 100644 web-admin/nutrition/doc/缓存中转服务器产品需求说明书.md diff --git a/index.html b/index.html index 3c2d969..c244717 100644 --- a/index.html +++ b/index.html @@ -893,6 +893,11 @@ const PROJECT_DOCS = [ title: '缓存中转服务器功能架构与数据流转方案', file: 'web-admin/nutrition/doc/缓存中转服务器功能架构与数据流转方案.md', desc: '营养管理服务云端主服务与食堂边缘节点服务的架构、数据流转和接口方案。' + }, + { + title: '缓存中转服务器产品需求说明书', + file: 'web-admin/nutrition/doc/缓存中转服务器产品需求说明书.md', + desc: '缓存中转服务器的业务目标、功能范围、页面与交互需求说明。' } ]; diff --git a/other-module/emergency-screen/doc/CHANGELOG.md b/other-module/emergency-screen/doc/CHANGELOG.md index 816d9b2..6abc7fd 100644 --- a/other-module/emergency-screen/doc/CHANGELOG.md +++ b/other-module/emergency-screen/doc/CHANGELOG.md @@ -1,5 +1,65 @@ # 应急大屏 - 变更记录 +## [2026-06-25] feat: 西安应急中心大屏 v3 - 图表化重构 + 顶部 KPI 条 + 双栏可视化升级 + +### 新增(v3 文件 `xian-center/index-v3.html`,v1/v2 保持不变) +- **顶部 KPI 条**:标题栏下方新增 5 个全局指标卡片(在线监测设备 1,286 台 / 今日告警 109 次 / 待处理 7 件 / 已处理 102 件 / 平均响应时长 4.2 分钟),每张卡片含图标、数值、标签、右上角趋势箭头(↑↓) +- **穿戴告警 24h 趋势折线图**:纯内联 SVG 绘制,3 条折线(心率/压力/血氧异常)按 0-23 小时分布,含网格虚线与 X 轴时间标签、底部图例 +- **应急重点人员 TOP5 横向条形图**:替代原列表,TOP1/TOP2/TOP3 用红/黄/蓝三色高亮,其余统一蓝色,右端白色竖线 + 阴影 +- **图表 CSS 模块**:`.kpi-bar` / `.alarm-combo` / `.trend-chart` / `.service-combo` / `.bar-rank` / `.ai-risk-rings` 等组件样式 + +### 变更 +- **左栏重构**(4 个面板,重新分配高度 152+148+237+232): + - 「穿戴告警分布」升级为**柱状+玫瑰环形组合图**:左侧保留 6 类横向柱状图(标签精简为 2-3 字),右侧新增 6 段占比环形图(按数值占比分段,中央显示告警总数 109) + - 「告警 24h 趋势」面板(见上) + - 「穿戴告警事件」**保留**滚动列表 + 点击触发急救路线交互,高度调整为 flex:1 自适应 + - 「心脑血管预警(AI)」**保留**列表 + 点击触发急救提示书交互;摘要数字升级为 3 个**迷你环形图**(高危 3 / 中危 5 / 低危 12,按占比绘制弧长) +- **右栏重构**(3 个面板,重新分配高度 158+467+156): + - 「应急服务数据」升级为**中央环形+类型列表组合图**:左侧环形图(中央累计受理 3,562 + 三类服务按 22.96%/65.31%/11.73% 占比分段),右侧 3 项明细列表(视频 45 / 电话 128 / 120 拨打 23,含占比百分比) + - 「应急求助事件」**保留**滚动列表 + 点击触发急救路线交互 + - 「应急重点人员 TOP5」改用横向条形图(见上) +- **布局调整**:`.main` 高度由 `calc(100vh - 64px)` 改为 `calc(100vh - 64px - 64px)`(为顶部 KPI 条让出 64px);`.side` 宽度由 320px 改为 340px +- **响应式**:`@media(max-width:1440px)` 同步调整 `.side` 宽度为 280px、KPI 数字字号降为 16px + +### 保留(不动) +- 中间地图整体(资源 Tab / 路径规划 / 急救路线 / 资源面板 / 急救提示书 / 图层切换 / 接听状态 / 资源统计胶囊) +- 3 类告警弹窗(穿戴告警 / 应急求助 / 心脑血管预警)及其触发按钮 +- 3 类记录列表弹窗(穿戴告警 / 心脑血管预警 / 应急求助 记录)及「查看更多」「历史记录」入口 +- 所有 v2 既有 JS 交互函数 + +### 技术约束 +- 全部图表使用**纯内联 SVG** 绘制(stroke-dasharray 控制环形占比、polyline 绘制折线),不引入任何外部图表库 +- 严格遵守墨刀导入兼容约束(无外部引用、内联 SVG、简洁 DOM) + +## [2026-06-25] feat: 西安应急中心大屏 - 路径规划 + 统计胶囊悬浮化 + 图层位置调整 + +### 新增 +- **路径规划功能**:地图上方 Tab 栏在 AED 之后追加「路径规划」Tab,点击后在 Tab 栏下方展开规划面板 + - 起点下拉(12 个备选点:当前位置/3 医疗点/4 医院/2 救护车/2 AED) + - 终点下拉(同上,默认选中采油三厂医疗点) + - 「路径规划」按钮:在地图上绘制带动画的青色虚线弧形路径,并标注起/终点圆点 + - 「清除」按钮:清除已绘制路径 + - 规划完成后右上角显示路线信息卡片(总距离、预计用时,按 viewBox 距离 Mock 换算) +- **独立 SVG 层** `.plan-route-svg`:与急救路线 `.route-svg` 完全解耦,互不影响 +- **JS**:`PLAN_POINTS` 坐标映射 + `toggleRoutePlan()` / `executeRoutePlan()` / `clearRoutePlan()`;`switchTab()` 末尾联动关闭规划面板并清除路径 + +### 变更 +- **统计卡片悬浮化**:`.res-stat-row` 从 `.center` 末尾移入 `.map-wrap` 内部,改为绝对定位悬浮胶囊 + - 位置:地图底部居中、`bottom:24px`,与底部边缘留有间距,不再贴合 + - 样式:玻璃质感胶囊容器(圆角 24px + 模糊背景 + 阴影 + 装饰角),内部三张小卡片(图标 28px + 数字 18px + 标签 10px),卡片间以竖线分隔 +- **图层切换移位**:`.map-layer` 由原来右下角(`bottom:12px;right:178px`)移至地图右上角(`top:12px;right:12px`),与顶部居中的 `.res-tabs` 不冲突 + +## [2026-06-25] refactor: 西安应急中心大屏 - 中间区域统计卡片改造 + +### 变更 +- **移除**:中间地图区域顶部的 KPI 核心指标卡片行(穿戴设备总数/今日穿戴报警数/今日应急求助数/平均响应时长)及其对应 `.kpi-row/.kpi-card*` CSS +- **新增**:地图下方资源统计卡片行 `.res-stat-row`,默认隐藏,点击地图上方医疗点/救护车/AED Tab 时切换显示对应三组统计卡片 + - 医疗点:医疗点总数(3)/ 覆盖人数(2,860)/ 医护人员(28) + - 救护车:急救型救护车(5)/ 转运型救护车(3)/ 出勤次数(128) + - AED:在线设备(18)/ 离线设备(2)/ 使用次数(36) +- **新增**:`RES_STAT_CONFIG` 数据映射 + `updateResStatRow(type)` 函数,由 `switchTab()` 调用同步刷新卡片内容 +- **样式**:复用深色玻璃质感卡片风格,含图标、数值、标签、装饰角;图标颜色按主题色(青/绿/橙/红)区分 + ## [2026-06-23] feat: 新增西安应急中心大屏原型 ### 新增 diff --git a/other-module/emergency-screen/xian-center/.gitkeep b/other-module/emergency-screen/xian-center/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/other-module/emergency-screen/xian-center/index-v2.html b/other-module/emergency-screen/xian-center/index-v2.html new file mode 100644 index 0000000..c8f5e49 --- /dev/null +++ b/other-module/emergency-screen/xian-center/index-v2.html @@ -0,0 +1,3351 @@ + + + + + + 西安应急中心大屏 | 健康CQ原型 + + + + + +
+
+
--
+
+
+
+ +
+ 西安应急中心大屏 +
+
+ + + + +
+ 系统累计运行 + 0 + +
+
+
+
+ + +
+ + + + +
+ +
+ + + + +
+
+ + +
+
+
+ + +
+
+ + +
+ + +
+
规划路线
+
总距离--
+
预计用时--
+
+ +
+ +
+
+
+
+
+
+ +
兴隆医院
+
高陵医院
+
宝石花医院
+
庆阳医院
+
采油一厂
+
采油二厂
+
采油三厂
+ +
CQ大道
+
能源北路
+
兴隆路
+ + +
+
+ +
兴隆医院
+
+
+
+ +
高陵医院
+
+
+
+ +
宝石花医院
+
+
+
+ +
庆阳医院
+
+ +
+
+ +
采油一厂医疗点
+
+
+
+ +
采油二厂医疗点
+
+
+
+ +
采油三厂医疗点
+
+ +
+
+ +
AED-001
+
+
+
+ +
AED-002
+
+ +
+
+ +
陕A·120-03
+
+
+
+ +
陕A·120-01
+
+ + + +
+
油田医院(1)
+
合作医院(1)
+
地方医院(2)
+
医疗点(3)
+
救护车(2)
+
AED(2)
+
+ + +
+
+ + + + + +
+
告警详情
+
+
+ 异常类型 + 摔倒 +
+
+ 异常值 + -- +
+
+ 告警时间 + 2026-06-23 14:32:15 +
+
+ 员工姓名 + 张建国 +
+
+ 单位部门 + 采油一厂生产区 +
+
+ 详细地址 + 采油一厂生产基地B区3号井组作业平台 +
+
+
+
+ + +
+
+
+
详细地址
+
+
+ + + + + + + + + + + + + + + + + + +
+
距离最近资源
+ +
+
+
+
兴隆医院 油田医院
+
2.4 km约8分钟
+
+
+
+
+
+
宝石花医院 合作医院
+
5.2 km约15分钟
+
+
+
+
+
+
庆阳医院 地方医院
+
3.6 km约11分钟
+
+
+
+
+
+
采油一厂医疗点 医疗点
+
0.3 km约1分钟
+
+
+
+
+
+
陕A·120-03 救护车
+
2.2 km约7分钟
+
+
+
+
+
+
AED-001 AED
+
0.5 km约2分钟
+
+
+
+ + +
+
+ 急救提示书 + × +
+
+
    +
  1. 心率与血氧异常,可能是心梗前期
  2. +
  3. 立即停止活动,平躺减少能量和氧气消耗
  4. +
  5. 如有症状发生请立即拨打120
  6. +
  7. 请准备硝酸甘油准备服用
  8. +
  9. 距离350米处有AED可用,电话15698987876
  10. +
  11. 距离580米处有急救包可用,电话12569869896
  12. +
  13. 距离8.5公里处有救护车,电话1365695668815分钟可赶来
  14. +
  15. 距离8.5公里处有医疗点,电话1569896365615分钟可赶来
  16. +
  17. 距离18公里处有庆城县医院,救护车来回约45分钟,该医院内科李晓涛医生、王开来医生较为专长
  18. +
  19. 距离52公里处有庆阳市医院,救护车来回约75分钟,该医院心梗急救能力强,教授胡忠、副教授李悦、教授徐立专长心梗,徐立是油田专家库签约教授
  20. +
  21. 距离339公里有西京医院、唐都医院、交大一附院、交大二附院等,急救能力强,有油田签约教授,在征得医生意见后,可谨慎考虑前往
  22. +
  23. 距离335公里有油田应急就医服务中心,可咨询就医,可帮助对以上应急医疗资源进行联系、协调,电话02986565199
  24. +
+
+
+ + +
+ 默认地图 + 卫星地图 + 标准地图 +
+ + +
+
+ 当前接收状态 + +
+ + +
+ + + + + + + + + +
+
+
+
+
--
+
--
+
+
+
+
+
+
--
+
--
+
+
+
+
+
+
--
+
--
+
+
+
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + diff --git a/other-module/emergency-screen/xian-center/index-v3.html b/other-module/emergency-screen/xian-center/index-v3.html new file mode 100644 index 0000000..99e716d --- /dev/null +++ b/other-module/emergency-screen/xian-center/index-v3.html @@ -0,0 +1,3617 @@ + + + + + + 西安应急中心大屏 | 健康CQ原型 + + + + + +
+
+
--
+
+
+
+ +
+ 西安应急中心大屏 +
+
+ + + + +
+ 系统累计运行 + 0 + +
+
+
+
+ + +
+
+
+ +
+
+
1,286
+
在线监测设备
+
+ ↑ 2.3% +
+
+
+ +
+
+
109
+
今日告警总数
+
+ ↑ 12.4% +
+
+
+ +
+
+
7
+
待处理事件
+
+ ↑ 3 +
+
+
+ +
+
+
102
+
已处理事件
+
+ ↓ 8.1% +
+
+
+ +
+
+
4.2分钟
+
平均响应时长
+
+ ↓ 0.6 +
+
+ + +
+ + + + +
+ +
+ + + + +
+
+ + +
+
+
+ + +
+
+ + +
+ + +
+
规划路线
+
总距离--
+
预计用时--
+
+ +
+ +
+
+
+
+
+
+ +
兴隆医院
+
高陵医院
+
宝石花医院
+
庆阳医院
+
采油一厂
+
采油二厂
+
采油三厂
+ +
CQ大道
+
能源北路
+
兴隆路
+ + +
+
+ +
兴隆医院
+
+
+
+ +
高陵医院
+
+
+
+ +
宝石花医院
+
+
+
+ +
庆阳医院
+
+ +
+
+ +
采油一厂医疗点
+
+
+
+ +
采油二厂医疗点
+
+
+
+ +
采油三厂医疗点
+
+ +
+
+ +
AED-001
+
+
+
+ +
AED-002
+
+ +
+
+ +
陕A·120-03
+
+
+
+ +
陕A·120-01
+
+ + + +
+
油田医院(1)
+
合作医院(1)
+
地方医院(2)
+
医疗点(3)
+
救护车(2)
+
AED(2)
+
+ + +
+
+ + + + + +
+
告警详情
+
+
+ 异常类型 + 摔倒 +
+
+ 异常值 + -- +
+
+ 告警时间 + 2026-06-23 14:32:15 +
+
+ 员工姓名 + 张建国 +
+
+ 单位部门 + 采油一厂生产区 +
+
+ 详细地址 + 采油一厂生产基地B区3号井组作业平台 +
+
+
+
+ + +
+
+
+
详细地址
+
+
+ + + + + + + + + + + + + + + + + + +
+
距离最近资源
+ +
+
+
+
兴隆医院 油田医院
+
2.4 km约8分钟
+
+
+
+
+
+
宝石花医院 合作医院
+
5.2 km约15分钟
+
+
+
+
+
+
庆阳医院 地方医院
+
3.6 km约11分钟
+
+
+
+
+
+
采油一厂医疗点 医疗点
+
0.3 km约1分钟
+
+
+
+
+
+
陕A·120-03 救护车
+
2.2 km约7分钟
+
+
+
+
+
+
AED-001 AED
+
0.5 km约2分钟
+
+
+
+ + +
+
+ 急救提示书 + × +
+
+
    +
  1. 心率与血氧异常,可能是心梗前期
  2. +
  3. 立即停止活动,平躺减少能量和氧气消耗
  4. +
  5. 如有症状发生请立即拨打120
  6. +
  7. 请准备硝酸甘油准备服用
  8. +
  9. 距离350米处有AED可用,电话15698987876
  10. +
  11. 距离580米处有急救包可用,电话12569869896
  12. +
  13. 距离8.5公里处有救护车,电话1365695668815分钟可赶来
  14. +
  15. 距离8.5公里处有医疗点,电话1569896365615分钟可赶来
  16. +
  17. 距离18公里处有庆城县医院,救护车来回约45分钟,该医院内科李晓涛医生、王开来医生较为专长
  18. +
  19. 距离52公里处有庆阳市医院,救护车来回约75分钟,该医院心梗急救能力强,教授胡忠、副教授李悦、教授徐立专长心梗,徐立是油田专家库签约教授
  20. +
  21. 距离339公里有西京医院、唐都医院、交大一附院、交大二附院等,急救能力强,有油田签约教授,在征得医生意见后,可谨慎考虑前往
  22. +
  23. 距离335公里有油田应急就医服务中心,可咨询就医,可帮助对以上应急医疗资源进行联系、协调,电话02986565199
  24. +
+
+
+ + +
+ 默认地图 + 卫星地图 + 标准地图 +
+ + +
+
+ 当前接收状态 + +
+ + +
+ + + + + + + + + +
+
+
+
+
--
+
--
+
+
+
+
+
+
--
+
--
+
+
+
+
+
+
--
+
--
+
+
+
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + diff --git a/web-admin/nutrition/doc/缓存中转服务器产品需求说明书.md b/web-admin/nutrition/doc/缓存中转服务器产品需求说明书.md new file mode 100644 index 0000000..274050a --- /dev/null +++ b/web-admin/nutrition/doc/缓存中转服务器产品需求说明书.md @@ -0,0 +1,284 @@ +# 缓存中转服务器产品需求说明书 + +> 版本:v0.1 产品交付 +> 日期:2026-06-24 +> 范围:营养管理云端主服务、食堂边缘服务器、现场终端设备 +> 参考:`缓存中转服务器功能架构与数据流转方案.md`、`营养管理功能说明.md`、营养管理后台原型 `web-admin/nutrition` + +## 1. 需求概述 + +缓存中转服务器是部署在食堂现场的边缘服务节点,用于承接营养管理后台在食堂现场的设备接入、业务缓存、任务下发、数据上报、断网续用和异常补偿能力。 + +本需求文档面向研发交付,此文档中将重点说明: + +1. 边缘服务器需要支撑哪些营养管理后台业务场景。 +2. 每个业务场景中哪些数据由云端服务器下发,哪些数据由边缘服务器上报。 +3. 云端下发以及边缘服务器数据上报的触发规则、频率、版本控制和失败补偿要求。 +4. 边缘服务器数据流转服务能力与云端管理端可见功能的边界。 + +## 2. 产品目标 + +| 目标 | 说明 | +|---|---| +| 现场业务不中断 | 云端网络异常时,食堂现场终端仍可查询已缓存资料和任务,并继续记录现场业务数据 | +| 数据不丢失 | 现场终端产生的数据先写入边缘服务器,本地保存成功后再异步同步云端 | +| 下发可追踪 | 云端下发的基础资料、任务、配置、文件、升级包需要有接收状态、应用状态、失败原因 | +| 补传可恢复 | 网络恢复后,边缘服务器可按业务发生时间顺序补传未同步数据 | +| 异常可处置 | 云端管理端能查看节点、设备、上报、下发、文件、任务等异常,并提供重试、补发、忽略、人工处理入口 | + +## 3. 角色与职责 + +| 角色 | 职责 | +|---|------------------------------------------------------| +| 云端系统管理员 | 管理食堂、人员、设备、字典、菜品、任务、规则、升级包,查看边缘节点运行状态 | +| 食堂运营人员 | 制定食谱、餐品、营养标准、生产计划、食堂开餐、取餐、上餐、余量、终端状态和异常处置,查看生产任务执行结果 | +| 供应链人员 | 管理种采、采购、入库、检测、仓储、净菜加工、配送等现场业务 | +| 运维人员 | 负责边缘服务器部署、网络、磁盘、服务、设备接入、升级和故障恢复 | +| 现场终端设备 | 通过边缘服务器获取任务和资料,执行称重、识别、结算、取餐、上餐、打印、日志上报 | + +## 4. 总体职责边界 + +| 层级 | 职责定位 | 负责内容 | 不负责内容 | +|--------|---|-----------------------------------------|---| +| 云端主服务 | 全局权威中心 | 主数据维护、任务生成、策略配置、跨食堂统计、异常监管、最终数据归档落库 | 直接访问食堂内网设备、依赖实时网络完成现场作业 | +| 边缘服务器 | 食堂现场业务连续性保障节点 | 本地缓存、终端接入、本地写入、上行补传、下行应用、文件缓存、设备状态、异常告警 | 全局主数据最终编辑、跨食堂审批、长期历史分析、大模型推理 | +| 现场终端设备 | 业务执行和采集终端 | 称重、菜品识别、取餐、入库、食材加工、结算、组配、烹制、上餐、打印、日志采集 | 全局业务规则判断、跨食堂数据查询、云端统计分析 | + +## 5. 功能清单 + +本章按能力类型划分,而不是按后台全部菜单机械展开。边缘服务器只承载需要现场硬件、现场终端、弱网连续作业、本地采集或本地任务执行的业务;纯后台维护、统计分析、模型配置、报表查询类功能不下沉到边缘节点。 + +### 5.1 云端后台运维监控功能 [详见原型界面] + +| 分类 | 功能 | 说明 | +|---|---|---| +| 边缘服务器管理 | 节点列表 | 按食堂查看边缘服务器名称、编号、在线状态、健康状态、版本、最近心跳、所属位置 | +| 边缘服务器管理 | 节点详情 | 查看基础信息、资源状态、运行检查项、设备清单、上报记录、下发记录、告警记录、运行日志 | +| 边缘服务器管理 | 资源监控 | 展示 CPU、内存、磁盘、网络、服务进程、文件缓存容量、同步积压量 | +| 数据上报管理 | 上报日志 | 查看边缘服务器上报数据类型、业务编号、来源设备、产生时间、最近上报时间、上报状态 | +| 数据上报管理 | 失败处理 | 支持查看失败原因、重试次数、中心受理状态、关联告警,并可发起手动重试 | +| 数据下发管理 | 下发任务 | 支持基础资料、人脸增量、生产任务、配置同步、升级任务等下发任务的创建、查询、导出 | +| 数据下发管理 | 下发详情 | 查看目标边缘服务器接收状态、终端应用状态、失败原因、任务轨迹,支持补发和强制重试 | +| 异常告警中心 | 告警聚合 | 聚合服务器异常、设备异常、上报失败、下发失败、文件失败、同步积压等告警 | +| 异常告警中心 | 告警处置 | 支持按等级、状态、食堂、服务器、影响对象筛选,支持标记处理中、忽略、查看关联记录 | +| 运维策略配置 | 策略参数 | 配置心跳周期、重试次数、死信阈值、磁盘阈值、文件保留周期、告警等级规则 | + +### 5.2 边缘服务器基础能力清单 + +| 能力域 | 功能要求 | 关键状态 | +|-----------|--------------------------------------------------------------------------|--------------------| +| 终端设备接入 | 负责现场所有终端设置的接入(注册、认证、心跳、数据交互、时间同步、设备绑定查询),理论上所有的终端设备只需和边缘服务器节点互通不和云端服务器直连 | 未注册、已注册、在线、离线、异常 | +| 本地业务API服务 | 为终端设备提供基础资料查询、任务领取、业务数据上报、文件下载、日志上传接口 | 正常、限流、不可用 | +| 本地缓存库 | 按食堂隔离保存所有业务主数据、任务、流水、文件索引、同步控制数据 | 有效、过期、待清理 | +| 下行 Inbox | 接收云端下发消息,完成幂等校验、版本校验、签名校验、应用入库 | 待处理、处理中、已应用、失败、已忽略 | +| 上行 Outbox | 保存现场业务事件,按业务发生时间或特定频率上传云端 | 待同步、同步中、已同步、失败、死信 | +| 文件缓存 | 缓存升级包、人脸图片、过程图片、视频索引、日志文件 | 待下载、已缓存、校验失败、过期 | +| 任务状态引擎 | 管理现场任务领取、开始、完成、异常、取消、补录 | 待执行、执行中、已完成、异常、已取消 | +| 断网续用 | 云边断连时允许终端继续查询已缓存数据并写入现场数据 | 在线、弱网、断网、恢复中 | +| 冲突处理 | 处理旧版本下发、重复上报、任务变更、断网补传冲突 | 已处理、需人工、已忽略 | +| 健康监控 | 采集节点资源、服务状态、设备状态、同步积压 | 正常、告警、严重 | +| 告警生成 | 根据规则生成本地告警并上报云端 | 待处理、处理中、已恢复、已忽略 | +| 心跳机制 | 边缘服务器需要长期与云端服务器维持心跳机制保持连接活性检测连接问题,与终端设置保持心跳机制确定设备在线状态 | 在线、故障、离线 | + +### 5.3 业务支持功能清单 + +业务支持功能只覆盖需要现场硬件、现场终端、本地任务执行、本地采集或弱网连续作业的后台二级菜单。云端只把现场执行所需的资料、任务、规则、配置或文件下发到边缘服务器,边缘服务器只上报现场产生的业务流水、设备状态、执行结果和异常事件。 + +| 功能菜单 | 云端下发数据 | 下发规则说明 | 边缘数据上报 | 上报规则说明 | +|-----------|----------------------------------|-------------------------------------------------------------------------|-------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| 食物成分 | 食材编码、食物成分项、营养素含量、单位换算、适用状态、净菜类型等 | 1. 食物成分信息调整后实时增量下发。
2. 新部署边缘节点执行全量初始化下发。 | 暂无 | 暂无 | +| 餐品总库 | 餐品编码、餐品名称、餐品组成、食材用量、营养指标、餐品规格等 | 1. 餐品发布、调整、停用后实时增量下发。
2. 新部署边缘节点执行全量初始化下发。 | 菜品研发(味养创新) | 1.新研发菜品数据实时增量上报; | +| 用户管理 | 用户、部门、权限、人脸特征、人员状态、会员标识 | 1. 人员、人脸、会员等级、权限变更后实时增量下发。
2. 每日低峰执行一次全量一致性校验。
3. 人员停用或权限回收需立即下发。 | 新用户注册、人脸录入、会员充值等 | 1. 有新用户注册、人脸录入时实时增量上传。
2.会员充值操作必须以云端响应状态为准,边缘服务器节点不能私自改变充值状态,弱网、断网、服务器连接异常的情况下不允许充值操作或标记为充值失败。 | +| 取餐管理 | 暂无 | 暂无 | 取餐记录、取餐核销、结算信息、用餐明细等 | 1. 取餐结算完成后立即写入边缘节点本地库。
2. 就餐数据3分钟一次定时增量上传。
3. 重复核销、异常核销需优先上报并生成告警。
4. 如若使用本系统的支付结算必须以云端响应状态为准,边缘服务器节点不能私自改变结算状态,弱网、断网、服务器连接异常的情况下不允许结算操作或标记为结算失败。
5. 支付和退款结果按交易唯一键幂等上报。 | +| 终端管理 | 设备档案、绑定关系、业务配置、升级任务、升级包元数据 | 1. 设备绑定和业务配置变更后实时下发。
2. 新部署边缘节点执行按食堂全量初始化下发。 | 设备状态、运行日志、升级结果、设备异常 | 1. 设备状态每30分钟周期上报。
2. 设备异常、升级失败、配置应用失败需立即上报。
3. 异常日志优先上报。 | +| 供商管理 | 内部供应商、外部供应商、供应商资质 | 1. 供应商信息发生变更后实时增量下发。
2. 升级任务按运维指定时间窗下发。
3. 供应商资质变更后实时增量下发。 | 暂无 | 暂无 | +| 采供管理 | 采购单信息、采购单明细 | 1. 产生新的采购单后实时增量下发。
2. 采购单状态变更后实时下发(如取消,接单,发货等)。 | 设备新增采购单 | 1. 毛菜入库的无订单验收需要同步新建采购单,新建后实时上报至云端服务。 | +| 仓储管理 | 仓库档案、区域信息 | 1. 仓库信息和区域信息变更后实时下发。
2. 新部署边缘节点执行按食堂全量初始化下发。 | 暂无 | 暂无 | +| 毛菜入库 | 入库单、采购单、供应商、食材档案 | 1. 采购单、供应商、食材档案等信息已在其他模块中明确了下发规则。 | 称重记录、入库批次、质检状态、现场照片、操作员、设备编号 | 1. 验收称重完成后实时增量上报。
2. 入库批次、称重记录、质检状态按同一业务唯一键上报。 | +| 净菜加工 | 加工任务、净菜类型、加工规格 | 1. 加工任务生成后实时下发。
2. 净菜类型已在食物成分模块明确下发规则。 | 毛菜加工、净菜加工、毛重、净重、出净率 | 1. 从毛菜加工开始、称重、完成节点分别写入边缘节点本地库。
2. 加工完成后汇总毛重、净重、出净率和损耗实时上报至云端服务。
3. 过程图片或者视频按文件队列异步补传。 | +| 净菜入库 | 人工录入的入库信息、入库信息在后台被修改 | 1.后台人工录入的净菜入库信息需要实时下发至边缘节点服务器。
2. 入库信息在后台被手动编辑、删除、出库等信息需实时下发。 | 入库记录、库位绑定、入库重量 | 1. 入库完成后实时增量上报。 | +| 净菜包装 | 包装任务、包装规格、溯源码规则 | 1. 包装任务生成后实时下发。。
2. 包装任务变更后增量下发。 | 包装批次、包装重量、组配信息、设备信息 | 1. 包装、称重、打标节点单菜品包装完成先记录与边缘服务器本地库。
2. 整个订单包装完成后实时上报云端。 | +| 净菜内供、净菜外售 | 内供订单、外售订单 | 1. 内供或内功订单产生后实时下发。
2. 配送计划变更后实时补发。
3. 订单状态变更后实时下发(如取消订单)。 | 暂无 | 暂无 | +| 净菜进柜 | 暂无 | 暂不考虑后台手动添加的进柜记录同步至边缘节点,理论上进柜记录都是从设备端主动发起 | 进柜记录、格口占用、取放记录、柜体异常、重量变更 | 1. 进柜、取出等操作实时上报。
2. 格口占用变化需实时上报。。 | +| 净菜组配 | 组配任务、餐品规格、份数、食材明细、标准用量、差异阈值 | 1. 组配任务发布后实时下发。
2. 餐品规格和标准用量按餐品版本下发(餐品总库)。 | 任务状态、称重明细、实际用量、设备编号、操作员、完成状态 | 1. 任务完成后汇总称重明细和完成状态上报。 | +| 按单烹制 | 烹制任务、餐品、需求份数、食材明细、工艺要求、温度阈值 | 1. 烹制任务发布后实时下发。
2. 任务调整后实时补发到后厨终端。
3. 工艺要求和温度阈值按版本发布后下发(餐品总库)。 | 开始/完成、厨师、生重、熟重、生熟比、温度过程、质量结果 | 1. 边缘节点服务器实时记录烹制过程,烹制完成后一次性实时上报至云端服务器。 | +| 食谱管理 | 当周食谱数据、餐品数据、食谱状态 | 1. 后台周食谱生成后实时下发。
2. 食谱调整后实时下发。 | 暂无 | 暂无 | +| 上餐监控 | 暂无 | 暂无(食谱、餐品、设备数据均已在其他模块下发) | 上餐时间、出锅温度、上餐重量、补餐记录、余量记录 | 1. 开餐信息实时上报。
2.补餐、余量监控等信息可3分钟周期性上报。 | +| 餐线管理 | 餐线档案、档口信息、餐线终端绑定、餐线状态规则 | 1.新增餐线或档案变更后实时下发。
2. 新部署边缘节点执行按食堂全量初始化下发; | 餐线状态、档口终端状态、餐线异常、终端应用回执 | 1. 餐线状态、监测信息按3分钟周期上报。
2. 档口终端离线或餐线异常需立即上报。 | +| 营养点餐 | 点餐订单、餐品信息、餐品价格、营养指标、点餐规则 | 1. 点餐订单创建或变更后实时下发。 | 暂无 | 暂无 | +| 余量处置 | 暂无 | 暂无 | 余量重量、处置方式、领取明细、捐赠记录、废弃记录 | 1. 称重、领取、捐赠、废弃节点分别写入边缘。
2. 员工福利领取需按人员和批次做幂等上报。
3. 废弃记录和异常处置需优先上报。 | +| 食安监控 | 留样规则、证件规则、能耗阈值、摄像头档案、水电气设备 | 1. 预警规则变更、设备档案信息变更、人员证件信息变更后实时下发。
2. 新部署边缘节点执行按食堂全量初始化下发; | 留样记录、巡检记录、证件状态、能耗数据、视频索引、设备数据 | 1. 留样、巡检、证件检查完成后立即上报业务结果。
2. 能耗数据按配置30分钟一次周期上报,越界数据立即上报。
3. 视频只上报索引和关键事件,原文件按存储策略处理。 | + + +## 6. 核心同步规则 + +### 6.1 云端下发规则 + +1. 基础主数据以云端为权威来源,边缘服务器只缓存和应用,不作为最终编辑源。 +2. 所有下发数据必须包含业务类型、业务编号、版本号、更新时间、食堂范围、幂等键。 +3. 边缘服务器收到旧版本数据时不得覆盖本地较新版本,应记录为已忽略。 +4. 支持全量初始化、实时增量下发、指定范围补发、定时校验四种方式。 +5. 文件类数据下发时只传元数据,文件由边缘服务器通过 HTTP 或对象存储地址下载。 +6. 所有的数据下发记录都要做到有迹可循,下发失败需追溯到失败原因。 + +### 6.2 边缘上报规则 + +1. 现场终端产生的业务数据必须先写入边缘服务器本地再上传至云端服务器。 +2. 边缘服务器本地写入成功后,终端设备即可得到成功反馈。 +3. 上行同步失败不得阻塞现场作业。 +4. 上行数据必须具备业务唯一键,云端按唯一键做幂等入库。 +5. 网络恢复后,边缘服务器按业务发生时间顺序补传。 +6. 多次失败后进入死信队列,并在云端异常告警中心生成待处理告警。 +7. 所有的上传记录都要做到有迹可循,上报失败需追溯到失败原因。 + +## 7. 业务流程 + +### 7.1 云端下发到边缘服务器 + +```mermaid +sequenceDiagram + participant Admin as 云端管理端/业务服务 + participant Sync as 云端同步编排 + participant Edge as 边缘服务器 + participant Device as 现场终端 + + Admin->>Sync: 发布资料/任务/配置/文件元数据 + Sync->>Edge: 推送下发消息 + Edge->>Edge: 校验签名、版本、幂等键 + Edge->>Edge: 写入 Inbox 并应用到本地业务表 + Edge-->>Sync: 返回接收与应用结果 + Device->>Edge: 查询本地资料或任务 + Edge-->>Device: 返回可执行数据 +``` + +### 7.2 现场数据上报到云端 + +```mermaid +sequenceDiagram + participant Device as 现场终端 + participant Edge as 边缘服务器 + participant Sync as 云端同步编排 + participant Cloud as 云端业务服务 + + Device->>Edge: 上报现场业务数据 + Edge->>Edge: 写本地业务表和 Outbox + Edge-->>Device: 返回现场操作成功 + Edge->>Sync: 异步补传 Outbox 事件 + Sync->>Cloud: 幂等校验并入库 + Sync-->>Edge: 返回同步回执 + Edge->>Edge: 更新同步状态 +``` + +### 7.3 断网续用与恢复补传 + +1. 云端与边缘服务器断连后,边缘服务器状态变为断网或弱网。 +2. 现场终端继续访问边缘服务器,使用已缓存的任务和资料。 +3. 新产生的数据继续写入本地业务表和 Outbox。 +4. 断网期间不允许现场修改全局主数据,仅允许产生现场流水和任务过程数据。 +5. 网络恢复后,边缘服务器先同步心跳和积压概况,再按业务时间补传 Outbox。 +6. 云端按业务唯一键幂等入库,失败数据进入重试或死信队列。 + +## 8. 状态定义 + +### 8.1 下发任务状态 + +| 状态 | 说明 | +|---|---| +| 待执行 | 任务已创建但未到执行时间 | +| 下发中 | 云端正在向目标边缘服务器下发 | +| 已接收 | 边缘服务器已接收任务 | +| 应用中 | 边缘服务器或终端正在应用 | +| 已完成 | 所有目标边缘服务器和终端均应用成功 | +| 部分失败 | 部分目标失败,可补发或重试 | +| 已失败 | 全部目标失败或超过重试阈值 | +| 已取消 | 用户或系统取消任务 | + +### 8.2 上报状态 + +| 状态 | 说明 | +|---|---| +| 待同步 | 已写入边缘本地库,尚未上报云端 | +| 同步中 | 正在上报云端 | +| 已同步 | 云端已受理并返回成功回执 | +| 待重试 | 上报失败但未超过重试阈值 | +| 上报失败 | 超过重试阈值或明确不可恢复 | +| 死信 | 进入人工处理队列 | + +### 8.3 告警状态 + +| 状态 | 说明 | +|---|---| +| 待处理 | 告警已生成,尚未指派或处理 | +| 处理中 | 已有人处理或系统正在补偿 | +| 已恢复 | 告警条件消失,业务恢复正常 | +| 已忽略 | 经确认不需要处理 | + +## 9. 异常处理要求 + +| 异常场景 | 处理要求 | +|--------|---------------------------------------| +| 云边断连 | 云端标记节点离线;边缘继续本地作业;恢复后补传 | +| 设备离线 | 边缘记录设备离线;云端生成设备异常告警;恢复后上报恢复记录 | +| 下发失败 | 记录失败阶段、失败原因、目标边缘服务器、目标终端;支持自动重试和人工补发 | +| 上报失败 | 保留原始业务数据和失败原因;支持手动重试;达到阈值进入死信 | +| 文件下载失败 | 不影响业务流水保存;保留待下载状态;支持重新下载 | +| 磁盘不足 | 优先保障业务流水和同步控制数据;限制大文件缓存;生成严重告警 | +| 版本冲突 | 旧版本不覆盖新版本;任务已开始后不直接覆盖现场任务 | +| 重复上报 | 云端按业务唯一键幂等处理,边缘保留同步回执 | +| 失败重试 | 数据上报和数据下发失败后至少要进行一次重试操作,重试成功后同步修改数据状态 | + +## 10. 数据保留策略 + +| 数据类型 | 边缘服务器保留建议 | 云端保留建议 | +|---|---|---| +| 基础资料 | 最新有效版本和上一版本 | 长期保留 | +| 人脸特征 | 本食堂有效数据,删除标记需保留同步周期 | 长期保留 | +| 当日生产任务 | 完整任务和过程状态 | 长期保留 | +| 现场流水 | 7 到 30 天,可配置 | 长期保留或归档 | +| 同步控制数据 | 至少保留最近 30 天或未完成数据 | 长期保留关键轨迹 | +| 设备日志 | 7 到 30 天,可配置 | 按需上传 | +| 图片/视频/附件 | 按容量和业务规则保留 | 按合规和存储策略保留 | +| 升级包 | 当前版本和上一版本 | 长期保留可用版本 | + +## 11. 产品验收标准 + +| 验收项 | 验收标准 | +|---|-----------------------------------------------| +| 新节点初始化 | 新增边缘服务器后,可完成食堂基础资料、人脸、设备、餐品、食谱、字典、当日任务的全量初始化 | +| 基础资料下发 | 云端修改员工、设备、餐品、食谱、字典后,指定边缘服务器可收到并应用,云端可查看结果 | +| 生产任务下发 | 食谱、净菜订单、组配、烹制、上餐任务可下发到对应食堂边缘服务器并被终端查询 | +| 现场数据上报 | 入库、称重、组配、烹制、上餐、取餐、消费、余量等数据可先写边缘并异步同步云端 | +| 断网续用 | 云边断连后,终端仍可查询已缓存任务并继续上报现场数据到边缘服务器 | +| 网络恢复补传 | 网络恢复后,断网期间产生的数据可自动补传,云端不产生重复业务数据 | +| 下发异常处理 | 下发失败、部分失败、终端应用失败可在云端查看失败原因,并支持重试或补发 | +| 上报异常处理 | 上报失败可在数据上报管理中查看,支持手动重试,超过阈值生成告警 | +| 设备状态监管 | 云端可查看边缘服务器下设备在线、离线、版本、业务场景、最近活跃时间 | +| 文件缓存分发 | 升级包、人脸图片、过程图片等文件不通过 MQ 传输正文,边缘服务器可下载、校验、缓存和分发 | + +## 12. 技术附录 + +### 12.1 推荐通信方式 + +| 方式 | 用途 | 说明 | +|---|---|---| +| MQ | 云端与边缘服务器主同步链路 | 边缘服务器主动连接云端 Broker,适合内网场景 | +| HTTP Pull | MQ 不可用时的兜底拉取 | 边缘服务器定时拉取下行消息 | +| HTTP Push | 上行积压补传 | 边缘服务器批量补传 Outbox | +| HTTP/Object Storage | 文件下载和上传 | 文件不通过 MQ 传输正文 | + +### 12.2 通用消息字段 + +| 字段 | 说明 | +|---|---| +| messageId | 消息唯一编号 | +| direction | UP 或 DOWN | +| canteenId | 食堂编号 | +| edgeNodeId | 边缘服务器编号 | +| bizType | 业务类型 | +| bizId | 业务编号 | +| version | 业务版本 | +| occurredAt | 业务发生时间 | +| sentAt | 消息发送时间 | +| traceId | 全链路追踪编号 | +| payload | 业务载荷 | +| signature | 签名 | diff --git a/web-admin/nutrition/edge-alert-center.html b/web-admin/nutrition/edge-alert-center.html index 20f6b42..3eabf8b 100644 --- a/web-admin/nutrition/edge-alert-center.html +++ b/web-admin/nutrition/edge-alert-center.html @@ -65,7 +65,17 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei .table-card__header{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--border);} .table-card__title{font-size:var(--font-base);font-weight:600;} .table-wrap{overflow-x:auto;} -.table-wrap table{min-width:1560px;} +.table-wrap table{min-width:1320px;} +.pagination{display:flex;align-items:center;justify-content:space-between;padding:14px 20px;border-top:1px solid var(--border);background:#fff;} +.pagination__total{font-size:var(--font-sm);color:var(--text-secondary);} +.pagination__pager{display:flex;align-items:center;gap:6px;} +.pagination__pager button{min-width:32px;height:32px;padding:0 8px;border:1px solid var(--border);background:#fff;border-radius:var(--radius-sm);font-size:var(--font-sm);color:var(--text-primary);cursor:pointer;} +.pagination__pager button:hover:not(:disabled){color:var(--primary);border-color:var(--primary);} +.pagination__pager button.active{background:var(--primary);color:#fff;border-color:var(--primary);} +.pagination__pager button:disabled{color:var(--text-placeholder);cursor:not-allowed;background:#F5F5F5;} +.pagination__pager .ellipsis{border:none;background:transparent;cursor:default;} +.pagination__jump{display:flex;align-items:center;gap:6px;font-size:var(--font-sm);color:var(--text-secondary);} +.pagination__jump input{width:48px;height:32px;border:1px solid var(--border);border-radius:var(--radius-sm);text-align:center;font-size:var(--font-sm);outline:none;} table{width:100%;border-collapse:collapse;} thead th{background:#FAFAFA;padding:12px 16px;text-align:left;font-size:var(--font-sm);color:var(--text-secondary);font-weight:500;border-bottom:1px solid var(--border);white-space:nowrap;} tbody td{padding:14px 16px;font-size:var(--font-sm);color:var(--text-primary);border-bottom:1px solid var(--border);white-space:nowrap;vertical-align:middle;} @@ -122,16 +132,6 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
-
48
当日告警总数
已去重的事件级告警
@@ -173,7 +173,6 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
-
@@ -182,7 +181,7 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
边缘服务器异常告警列表
- + @@ -191,9 +190,7 @@ tbody tr:hover td.td-actions{background:#F8FBFF;} - - - + @@ -206,9 +203,7 @@ tbody tr:hover td.td-actions{background:#F8FBFF;} - - - + @@ -221,9 +216,7 @@ tbody tr:hover td.td-actions{background:#F8FBFF;} - - @@ -236,9 +229,7 @@ tbody tr:hover td.td-actions{background:#F8FBFF;} - - @@ -251,9 +242,7 @@ tbody tr:hover td.td-actions{background:#F8FBFF;} - - @@ -262,6 +251,19 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
告警编号告警类型告警主题等级所属食堂边缘服务器影响对象影响业务首次发生最近发生当前状态处理人操作
告警编号告警类型告警主题等级所属食堂边缘服务器业务类型告警时间当前状态处理人操作
ALM-20260624-078警告 采气一厂食堂 采气一厂后厨服务器MEAL-20260624-0178数据上报2026-06-24 08:45:00数据上报 2026-06-24 09:18:33 处理中 运维张工严重 炼化中心食堂 炼化中心餐线服务器UPG-20260624-002数据下发2026-06-24 11:06:12数据下发 2026-06-24 11:18:20 待处理 未指派严重 炼化中心食堂 炼化中心餐线服务器EDGE-CQ-024 接入、上报、下发全链路2026-06-24 08:54:09 2026-06-24 09:21:20 待处理 未指派警告 采气一厂食堂 采气一厂后厨服务器LINE-SCALE-002 称重采集、就餐校验2026-06-24 08:42:00 2026-06-24 09:12:00 待处理 运维李工提醒 总部一号食堂 总部一号食堂服务器FACE-TERM-003 人脸识别、就餐放行2026-06-24 07:48:12 2026-06-24 08:01:30 已恢复 平台自动恢复
+
@@ -285,6 +287,8 @@ var alarmDetails={ ['边缘服务器','采气一厂后厨服务器'], ['当前状态','处理中'], ['关联业务单号','MEAL-20260624-0178'], + ['首次发生','2026-06-24 08:45:00'], + ['最近发生','2026-06-24 09:18:33'], ['处理人','运维张工'] ], sections:[ @@ -324,6 +328,8 @@ var alarmDetails={ ['边缘服务器','炼化中心餐线服务器'], ['当前状态','待处理'], ['关联任务','UPG-20260624-002'], + ['首次发生','2026-06-24 11:06:12'], + ['最近发生','2026-06-24 11:18:20'], ['处理人','未指派'] ], sections:[ @@ -364,6 +370,8 @@ var alarmDetails={ ['边缘服务器','炼化中心餐线服务器'], ['当前状态','待处理'], ['服务器编号','EDGE-CQ-024'], + ['首次发生','2026-06-24 08:54:09'], + ['最近发生','2026-06-24 09:21:20'], ['处理人','未指派'] ], sections:[ @@ -403,6 +411,8 @@ var alarmDetails={ ['边缘服务器','采气一厂后厨服务器'], ['当前状态','待处理'], ['设备编号','LINE-SCALE-002'], + ['首次发生','2026-06-24 08:42:00'], + ['最近发生','2026-06-24 09:12:00'], ['处理人','运维李工'] ], sections:[ @@ -442,6 +452,8 @@ var alarmDetails={ ['边缘服务器','总部一号食堂服务器'], ['当前状态','已恢复'], ['设备编号','FACE-TERM-003'], + ['首次发生','2026-06-24 07:48:12'], + ['最近发生','2026-06-24 08:01:30'], ['处理人','平台自动恢复'] ], sections:[ diff --git a/web-admin/nutrition/edge-dispatch-detail.html b/web-admin/nutrition/edge-dispatch-detail.html index 7ebaca5..c215c20 100644 --- a/web-admin/nutrition/edge-dispatch-detail.html +++ b/web-admin/nutrition/edge-dispatch-detail.html @@ -72,6 +72,48 @@ tbody tr:hover td.td-actions{background:#F8FBFF;} .link:hover{color:#40a9ff;} .toast{position:fixed;top:76px;left:50%;transform:translateX(-50%) translateY(-12px);background:#fff;border-left:4px solid var(--primary);box-shadow:var(--shadow-md);padding:10px 18px;border-radius:var(--radius-sm);font-size:var(--font-sm);opacity:0;pointer-events:none;transition:all .25s;z-index:1200;} .toast.show{opacity:1;transform:translateX(-50%) translateY(0);} +.action-links{display:flex;align-items:center;gap:8px;} +.td-actions{min-width:220px;} +.drawer-mask{position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:1000;display:none;} +.drawer-mask.show{display:block;} +.drawer{position:absolute;right:0;top:0;bottom:0;width:560px;background:#fff;box-shadow:-6px 0 24px rgba(0,0,0,.12);display:flex;flex-direction:column;} +.drawer__header{display:flex;align-items:center;justify-content:space-between;padding:18px 24px;border-bottom:1px solid var(--border);} +.drawer__title{font-size:var(--font-lg);font-weight:600;} +.drawer__close{border:none;background:none;font-size:22px;cursor:pointer;color:var(--text-placeholder);} +.drawer__body{padding:20px 24px;overflow-y:auto;flex:1;} +.detail-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px 18px;} +.detail-item{display:flex;flex-direction:column;gap:3px;} +.detail-label{font-size:var(--font-xs);color:var(--text-placeholder);} +.detail-value{font-size:var(--font-sm);color:var(--text-primary);} +.section-title{font-size:var(--font-sm);font-weight:600;margin:16px 0 10px;padding-left:8px;border-left:3px solid var(--primary);} +.trace-panel{margin-top:14px;} +.trace-summary{display:flex;align-items:center;justify-content:space-between;background:#F8FBFF;border:1px solid #D6E9FF;border-radius:var(--radius-sm);padding:10px 12px;margin-bottom:12px;font-size:var(--font-sm);} +.trace-summary__meta{color:var(--text-secondary);} +.trace-timeline{position:relative;padding-left:24px;} +.trace-timeline::before{content:'';position:absolute;left:7px;top:6px;bottom:6px;width:2px;background:#D9E6F7;} +.trace-step{position:relative;margin-bottom:14px;} +.trace-step__dot{position:absolute;left:-24px;top:4px;width:16px;height:16px;border-radius:50%;background:#fff;border:2px solid var(--primary);box-shadow:0 0 0 3px #E6F7FF;} +.trace-step__dot--success{border-color:var(--success);box-shadow:0 0 0 3px #F6FFED;} +.trace-step__dot--warning{border-color:var(--warning);box-shadow:0 0 0 3px #FFF7E6;} +.trace-step__dot--gray{border-color:#BFBFBF;box-shadow:0 0 0 3px #F5F5F5;} +.trace-step__dot--danger{border-color:var(--danger);box-shadow:0 0 0 3px #FFF1F0;} +.trace-step__card{background:#fff;border:1px solid var(--border);border-radius:var(--radius-sm);padding:12px 14px;box-shadow:var(--shadow-sm);} +.trace-step__head{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:var(--font-sm);font-weight:600;margin-bottom:6px;} +.trace-step__time{font-size:var(--font-xs);color:var(--text-placeholder);white-space:nowrap;} +.trace-step__desc{font-size:var(--font-sm);color:var(--text-secondary);line-height:1.6;} +.log-panel{margin-top:12px;} +.log-row{display:flex;align-items:center;gap:8px;padding:8px 0;border-bottom:1px dashed var(--border);font-size:var(--font-sm);color:var(--text-primary);} +.log-row__time{color:var(--text-placeholder);min-width:150px;white-space:nowrap;} +.log-row__stage{min-width:120px;color:var(--text-secondary);} +.log-row__desc{flex:1;} +.modal-mask{position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:1000;display:none;align-items:center;justify-content:center;} +.modal-mask.show{display:flex;} +.modal{width:720px;max-height:80vh;background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-md);display:flex;flex-direction:column;overflow:hidden;} +.modal__header{display:flex;align-items:center;justify-content:space-between;padding:18px 24px;border-bottom:1px solid var(--border);} +.modal__title{font-size:var(--font-lg);font-weight:600;} +.modal__close{border:none;background:none;font-size:22px;cursor:pointer;color:var(--text-placeholder);} +.modal__body{padding:18px 24px;overflow-y:auto;flex:1;} +.modal__footer{display:flex;justify-content:flex-end;gap:8px;padding:12px 24px 18px;} @@ -92,10 +134,6 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
-
1
目标服务器
@@ -121,77 +159,245 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
-
-
服务器接收情况
-
终端应用情况
-
失败明细
-
执行日志
-
- -
-
- - - - - -
边缘服务器所属食堂接收状态接收时间应用状态应用完成时间剩余终端关联告警操作
采气一厂后厨服务器采气一厂食堂已接收2026-06-24 08:40:12部分待应用2 台1 条接收轨迹
+
+
+
服务器接收情况
+ 进行中
-
- -
- + - - - - -
终端设备设备编号应用状态应用时间失败原因当前版本操作
边缘服务器所属食堂受理状态接收状态接收时间应用状态应用完成时间剩余终端关联告警操作
人脸识别终端 01FACE-TERM-001已完成2026-06-24 08:41:12v3.2.0终端回执
人脸识别终端 02FACE-TERM-002待应用终端离线v3.2.0重新通知
人脸识别终端 03FACE-TERM-003待应用终端忙碌中v3.2.0加入重试
-
-
- -
-
- - - - - - -
对象层级对象名称失败阶段失败原因最近处理时间建议动作操作
终端设备人脸识别终端 02终端应用终端离线,未获取到增量包2026-06-24 09:12:10待上线后重新通知重新通知
终端设备人脸识别终端 03终端应用本地特征库忙碌,应用超时2026-06-24 09:08:22延后 5 分钟自动重试调整策略
-
-
- -
-
- - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
时间执行阶段处理结果说明操作
2026-06-24 08:40:12边缘服务器接收成功采气一厂后厨服务器完成批次接收与校验复制轨迹号
2026-06-24 08:41:12终端应用部分完成1 台终端完成应用,2 台待应用服务器详情
2026-06-24 09:12:10异常补偿处理中系统已对离线终端触发重连检测查看告警
采气一厂后厨服务器采气一厂食堂已受理已接收2026-06-24 08:40:124 / 84 台1 条
炼化中心餐线服务器炼化中心食堂已受理已接收2026-06-24 08:40:158 / 82026-06-24 08:42:300 台
总部一号食堂服务器总部一号食堂拒绝受理未接收0 / 66 台2 条
+
+
+
接收轨迹
+
+
+
边缘服务器
采气一厂后厨服务器
+
所属食堂
采气一厂食堂
+
任务编号
FACE-BATCH-0624-04
+
数据版本
FACE-VER-20260624-04
+
+
下发日志
+
+
2026-06-24 08:40:12成功 边缘服务器接收采气一厂后厨服务器完成批次接收与校验。
+
2026-06-24 08:41:12部分完成 终端应用4 台终端完成应用,4 台待应用。
+
2026-06-24 09:12:10处理中 异常补偿系统已对离线终端触发重连检测。
+
+ +
+
+
+ + +
操作已完成
diff --git a/web-admin/nutrition/edge-dispatch-management.html b/web-admin/nutrition/edge-dispatch-management.html index cd8f711..d01a097 100644 --- a/web-admin/nutrition/edge-dispatch-management.html +++ b/web-admin/nutrition/edge-dispatch-management.html @@ -26,11 +26,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei .sidebar-item.active{color:#fff;background:var(--primary);} .mi{display:inline-block;width:20px;text-align:center;filter:grayscale(1);opacity:.75;margin-right:2px;} .main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);} -.page-header{display:flex;align-items:center;justify-content:space-between;background:#fff;border-radius:var(--radius-md);padding:18px 24px;margin-bottom:16px;box-shadow:var(--shadow-sm);} -.page-header__title{font-size:var(--font-xl);font-weight:700;} -.page-header__desc{margin-top:6px;font-size:var(--font-sm);color:var(--text-secondary);} -.page-header__actions{display:flex;gap:8px;} -.stats-grid{display:grid;grid-template-columns:repeat(6,1fr);gap:12px;margin-bottom:16px;} +.stats-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:16px;} .stat-card{background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);padding:16px 18px;} .stat-card__value{font-size:var(--font-xxl);font-weight:700;line-height:1;} .stat-card__label{font-size:var(--font-sm);color:var(--text-secondary);margin-top:8px;} @@ -78,9 +74,14 @@ tbody tr:hover td.td-actions{background:#F8FBFF;} .form-input,.form-select,.form-textarea{border:1px solid var(--border);border-radius:var(--radius-sm);padding:10px 12px;font-size:var(--font-sm);outline:none;background:#fff;} .form-textarea{min-height:96px;resize:none;} .modal__footer{display:flex;justify-content:flex-end;gap:8px;padding:0 24px 20px;} -.tip-card{margin-top:16px;background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);padding:16px 20px;} -.tip-title{font-size:var(--font-base);font-weight:600;margin-bottom:10px;} -.tip-list{display:flex;flex-direction:column;gap:8px;font-size:var(--font-sm);color:var(--text-secondary);} +.action-links{display:flex;align-items:center;gap:8px;} +.td-actions{min-width:170px;} +.pagination{display:flex;align-items:center;justify-content:space-between;padding:14px 24px;border-top:1px solid var(--border);font-size:var(--font-sm);color:var(--text-secondary);} +.pagination__controls{display:flex;align-items:center;gap:8px;} +.page-btn{min-width:32px;height:32px;padding:0 10px;border:1px solid var(--border);background:#fff;border-radius:var(--radius-sm);font-size:var(--font-sm);color:var(--text-secondary);cursor:pointer;} +.page-btn.active{border-color:var(--primary);background:var(--primary);color:#fff;} +.page-btn:disabled{background:#F5F5F5;color:var(--text-placeholder);cursor:not-allowed;} +.page-size{height:32px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 8px;background:#fff;color:var(--text-secondary);} .toast{position:fixed;top:76px;left:50%;transform:translateX(-50%) translateY(-12px);background:#fff;border-left:4px solid var(--primary);box-shadow:var(--shadow-md);padding:10px 18px;border-radius:var(--radius-sm);font-size:var(--font-sm);opacity:0;pointer-events:none;transition:all .25s;z-index:1200;} .toast.show{opacity:1;transform:translateX(-50%) translateY(0);} @@ -101,18 +102,11 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
- -
126
当日下发任务
中心服务器发起
108
已完成任务
成功到达目标服务器
12
进行中任务
含定时待执行
6
失败任务
需补发或重试
-
28
待接收服务器
来自 4 个任务
-
97.4%
当日完成率
较昨日 +0.9%
@@ -127,26 +121,37 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
-
中心服务器下发任务列表
+
+
中心服务器下发任务列表
+
+ + + +
+
- - - - + + + +
任务编号下发类型下发方式目标范围计划执行时间发起人当前状态完成服务器失败服务器关联告警操作
FACE-BATCH-0624-04人脸增量单次采气一厂食堂 1 台2026-06-24 08:40:00系统自动进行中0 / 101 条查看详情
CFG-PUSH-0624-01配置同步定时全部食堂 28 台每天 06:00平台运营已完成28 / 280查看详情
UPG-20260624-002升级任务单次炼化中心食堂 2 台2026-06-24 11:00:00运维李工部分失败1 / 212 条查看详情
TASK-20260624-021生产任务立即总部一号食堂 1 台2026-06-24 09:12:00营养运营已完成1 / 10查看详情
FACE-BATCH-0624-04人脸增量单次采气一厂食堂 1 台2026-06-24 08:40:00系统自动进行中0 / 101 条
CFG-PUSH-0624-01配置同步定时全部食堂 28 台每天 06:00平台运营已完成28 / 280
UPG-20260624-002升级任务单次炼化中心食堂 2 台2026-06-24 11:00:00运维李工部分失败1 / 212 条
TASK-20260624-021生产任务立即总部一号食堂 1 台2026-06-24 09:12:00营养运营已完成1 / 10
-
- -
-
调度规则提示
-
-
1. 单次任务适合临时下发,如补发人脸增量、紧急生产任务。
-
2. 定时任务适合每日配置、基础资料、规则包等固定时间同步。
-
3. 对已成功服务器默认不重复覆盖,需强制覆盖时应在任务策略中明确指定。
+
diff --git a/web-admin/nutrition/edge-report-management.html b/web-admin/nutrition/edge-report-management.html index 7bbcee5..0b85976 100644 --- a/web-admin/nutrition/edge-report-management.html +++ b/web-admin/nutrition/edge-report-management.html @@ -28,7 +28,6 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei .main{margin-left:240px;margin-top:56px;padding:24px;min-height:calc(100vh - 56px);} .page-header{display:flex;align-items:center;justify-content:space-between;background:#fff;border-radius:var(--radius-md);padding:18px 24px;margin-bottom:16px;box-shadow:var(--shadow-sm);} .page-header__title{font-size:var(--font-xl);font-weight:700;} -.page-header__desc{margin-top:6px;font-size:var(--font-sm);color:var(--text-secondary);} .page-header__meta{font-size:var(--font-sm);color:var(--text-placeholder);} .stats-grid{display:grid;grid-template-columns:repeat(6,1fr);gap:12px;margin-bottom:16px;} .stat-card{background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);padding:16px 18px;} @@ -49,7 +48,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei .table-card__header{display:flex;align-items:center;justify-content:space-between;padding:16px 24px;border-bottom:1px solid var(--border);} .table-card__title{font-size:var(--font-base);font-weight:600;} .table-wrap{overflow-x:auto;} -.table-wrap table{min-width:1640px;} +.table-wrap table{min-width:1720px;} table{width:100%;border-collapse:collapse;} thead th{background:#FAFAFA;padding:12px 16px;text-align:left;font-size:var(--font-sm);color:var(--text-secondary);font-weight:500;border-bottom:1px solid var(--border);white-space:nowrap;} tbody td{padding:14px 16px;font-size:var(--font-sm);color:var(--text-primary);border-bottom:1px solid var(--border);white-space:nowrap;vertical-align:middle;} @@ -65,6 +64,14 @@ tbody tr:hover td.td-actions{background:#F8FBFF;} .tag-gray{background:#F5F5F5;color:#999;} .link{color:var(--primary);cursor:pointer;font-size:var(--font-sm);text-decoration:none;} .link:hover{color:#40a9ff;} +.action-links{display:flex;align-items:center;gap:8px;} +.td-actions{min-width:210px;} +.pagination{display:flex;align-items:center;justify-content:space-between;padding:14px 24px;border-top:1px solid var(--border);font-size:var(--font-sm);color:var(--text-secondary);} +.pagination__controls{display:flex;align-items:center;gap:8px;} +.page-btn{min-width:32px;height:32px;padding:0 10px;border:1px solid var(--border);background:#fff;border-radius:var(--radius-sm);font-size:var(--font-sm);color:var(--text-secondary);cursor:pointer;} +.page-btn.active{border-color:var(--primary);background:var(--primary);color:#fff;} +.page-btn:disabled{background:#F5F5F5;color:var(--text-placeholder);cursor:not-allowed;} +.page-size{height:32px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 8px;background:#fff;color:var(--text-secondary);} .drawer-mask{position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:1000;display:none;} .drawer-mask.show{display:block;} .drawer{position:absolute;right:0;top:0;bottom:0;width:560px;background:#fff;box-shadow:-6px 0 24px rgba(0,0,0,.12);display:flex;flex-direction:column;} @@ -77,6 +84,20 @@ tbody tr:hover td.td-actions{background:#F8FBFF;} .detail-label{font-size:var(--font-xs);color:var(--text-placeholder);} .detail-value{font-size:var(--font-sm);color:var(--text-primary);} .section-title{font-size:var(--font-sm);font-weight:600;margin:16px 0 10px;padding-left:8px;border-left:3px solid var(--primary);} +.trace-panel{display:none;margin-top:14px;} +.trace-summary{display:flex;align-items:center;justify-content:space-between;background:#F8FBFF;border:1px solid #D6E9FF;border-radius:var(--radius-sm);padding:10px 12px;margin-bottom:12px;font-size:var(--font-sm);} +.trace-summary__meta{color:var(--text-secondary);} +.trace-timeline{position:relative;padding-left:24px;} +.trace-timeline::before{content:'';position:absolute;left:7px;top:6px;bottom:6px;width:2px;background:#D9E6F7;} +.trace-step{position:relative;margin-bottom:14px;} +.trace-step__dot{position:absolute;left:-24px;top:4px;width:16px;height:16px;border-radius:50%;background:#fff;border:2px solid var(--primary);box-shadow:0 0 0 3px #E6F7FF;} +.trace-step__dot--success{border-color:var(--success);box-shadow:0 0 0 3px #F6FFED;} +.trace-step__dot--warning{border-color:var(--warning);box-shadow:0 0 0 3px #FFF7E6;} +.trace-step__dot--gray{border-color:#BFBFBF;box-shadow:0 0 0 3px #F5F5F5;} +.trace-step__card{background:#fff;border:1px solid var(--border);border-radius:var(--radius-sm);padding:12px 14px;box-shadow:var(--shadow-sm);} +.trace-step__head{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:var(--font-sm);font-weight:600;margin-bottom:6px;} +.trace-step__time{font-size:var(--font-xs);color:var(--text-placeholder);white-space:nowrap;} +.trace-step__desc{font-size:var(--font-sm);color:var(--text-secondary);line-height:1.6;} .toast{position:fixed;top:76px;left:50%;transform:translateX(-50%) translateY(-12px);background:#fff;border-left:4px solid var(--primary);box-shadow:var(--shadow-md);padding:10px 18px;border-radius:var(--radius-sm);font-size:var(--font-sm);opacity:0;pointer-events:none;transition:all .25s;z-index:1200;} .toast.show{opacity:1;transform:translateX(-50%) translateY(0);} @@ -97,11 +118,6 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
- -
4,286
当日上报总量
全部服务器汇总
4,102
上报成功
成功率 95.7%
@@ -117,7 +133,6 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
-
@@ -126,40 +141,90 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
边缘服务器上报日志
- + - - - - + + + +
食堂边缘服务器数据类型业务编号来源设备产生时间最近上报时间上报状态中心服务器受理状态重试次数失败原因关联告警操作
食堂边缘服务器业务类型业务编号产生时间上报时间上报状态中心服务器受理状态重试次数失败原因关联告警操作
炼化中心食堂炼化中心餐线服务器就餐流水MEAL-20260624-0781结算终端 012026-06-24 08:21:182026-06-24 09:21:20上报失败未受理8服务器离线,等待恢复ALM-20260624-091查看详情
采气一厂食堂采气一厂后厨服务器称重记录WEIGH-20260624-0148餐线营养秤 022026-06-24 08:42:032026-06-24 09:18:33待重试受理超时3MQ 连接超时ALM-20260624-078查看详情
总部一号食堂总部一号食堂服务器设备日志LOG-20260624-0311组配秤 032026-06-24 09:05:482026-06-24 09:06:03已上报已受理0查看详情
输气站小食堂输气站小食堂服务器监控图片IMG-20260624-0096后厨摄像头 012026-06-24 08:58:272026-06-24 09:00:11已上报受理中0查看详情
炼化中心食堂炼化中心餐线服务器餐线结算MEAL-20260624-07812026-06-24 08:21:182026-06-24 09:21:20上报失败未受理8服务器离线,等待恢复ALM-20260624-091
采气一厂食堂采气一厂后厨服务器营养称重WEIGH-20260624-01482026-06-24 08:42:032026-06-24 09:18:33待重试受理超时3MQ 连接超时ALM-20260624-078
总部一号食堂总部一号食堂服务器设备运行LOG-20260624-03112026-06-24 09:05:482026-06-24 09:06:03已上报已受理0
输气站小食堂输气站小食堂服务器图像采集IMG-20260624-00962026-06-24 08:58:272026-06-24 09:00:11已上报受理中0
+
-
上报日志详情
+
上报日志详情
-
+
业务编号
WEIGH-20260624-0148
边缘服务器
采气一厂后厨服务器
数据类型
称重记录
-
来源设备
餐线营养秤 02
+
业务类型
营养称重
产生时间
2026-06-24 08:42:03
当前状态
待重试
-
处理轨迹
-
09:18:33 第 3 次重试失败,原因:MQ 连接超时。
-
09:05:21 第 2 次重试失败,边缘服务器已切换备用通道。
-
08:42:04 首次写入边缘本地库成功,等待异步上传。
-
处理动作
-
+
处理轨迹
+
09:18:33 第 3 次重试失败,原因:MQ 连接超时。
+
09:05:21 第 2 次重试失败,边缘服务器已切换备用通道。
+
08:42:04 首次写入边缘本地库成功,等待异步上传。
+
08:42:05 回执确认待中心服务器返回,轨迹进入收敛状态。
+
处理动作
+
+
+
+ 业务编号 WEIGH-20260624-0148 + 中心服务器当前状态:等待回执 +
+
+
+ +
+
边缘服务器上报2026-06-24 08:42:04
+
本地缓存写入完成,开始向 MQ 发送上报消息。
+
+
+
+ +
+
MQ 接收消息2026-06-24 09:18:33
+
消息进入重试队列,当前处于重发等待状态。
+
+
+
+ +
+
云端服务器受理消息待确认
+
中心服务器尚未返回受理结果,等待下一次轮询。
+
+
+
+ +
+
回执确认--
+
收到回执后将关闭重试并同步更新上报状态。
+
+
+
+
@@ -174,6 +239,55 @@ function showToast(text){ } function openDrawer(bizId){ document.getElementById('detailBizId').textContent=bizId; + document.getElementById('drawerTitle').textContent='上报日志详情'; + document.getElementById('trackTitle').textContent='处理轨迹'; + document.getElementById('detailGrid').style.display='grid'; + document.getElementById('tracePanel').style.display='none'; + document.getElementById('trackTitle').style.display='block'; + document.getElementById('logLine1').style.display='block'; + document.getElementById('logLine2').style.display='block'; + document.getElementById('logLine3').style.display='block'; + document.getElementById('logLine4').style.display='block'; + document.getElementById('logLine1').innerHTML='09:18:33 第 3 次重试失败,原因:MQ 连接超时。'; + document.getElementById('logLine2').innerHTML='09:05:21 第 2 次重试失败,边缘服务器已切换备用通道。'; + document.getElementById('logLine3').innerHTML='08:42:04 首次写入边缘本地库成功,等待异步上传。'; + document.getElementById('logLine4').innerHTML='08:42:05 回执确认待中心服务器返回,轨迹进入收敛状态。'; + document.getElementById('actionTitle').style.display='block'; + document.getElementById('actionPanel').style.display='flex'; + document.getElementById('drawerMask').classList.add('show'); +} +function openLogDrawer(bizId){ + document.getElementById('detailBizId').textContent=bizId; + document.getElementById('drawerTitle').textContent='服务器错误日志'; + document.getElementById('trackTitle').textContent='错误日志信息'; + document.getElementById('detailGrid').style.display='grid'; + document.getElementById('tracePanel').style.display='none'; + document.getElementById('trackTitle').style.display='block'; + document.getElementById('logLine1').style.display='block'; + document.getElementById('logLine2').style.display='block'; + document.getElementById('logLine3').style.display='block'; + document.getElementById('logLine4').style.display='block'; + document.getElementById('logLine1').innerHTML='09:18:33 ERROR mq-producer 发送消息超时,topic=edge.report.upload,retry=3。'; + document.getElementById('logLine2').innerHTML='09:05:21 WARN edge-uploader 备用通道切换完成,等待队列重新投递。'; + document.getElementById('logLine3').innerHTML='08:42:04 INFO local-store 写入本地缓存成功,payload 校验通过。'; + document.getElementById('logLine4').innerHTML='08:42:05 ERROR server-log 解析失败,无法生成本地错误摘要。'; + document.getElementById('actionTitle').style.display='none'; + document.getElementById('actionPanel').style.display='none'; + document.getElementById('drawerMask').classList.add('show'); +} +function openTraceDrawer(bizId){ + document.getElementById('detailBizId').textContent=bizId; + document.getElementById('drawerTitle').textContent='上报轨迹'; + document.getElementById('traceBizId').textContent=bizId; + document.getElementById('detailGrid').style.display='none'; + document.getElementById('tracePanel').style.display='block'; + document.getElementById('trackTitle').style.display='none'; + document.getElementById('logLine1').style.display='none'; + document.getElementById('logLine2').style.display='none'; + document.getElementById('logLine3').style.display='none'; + document.getElementById('logLine4').style.display='none'; + document.getElementById('actionTitle').style.display='none'; + document.getElementById('actionPanel').style.display='none'; document.getElementById('drawerMask').classList.add('show'); } function closeDrawer(){ diff --git a/web-admin/nutrition/edge-server-detail.html b/web-admin/nutrition/edge-server-detail.html index 117daf7..ecc06ae 100644 --- a/web-admin/nutrition/edge-server-detail.html +++ b/web-admin/nutrition/edge-server-detail.html @@ -37,8 +37,9 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei .btn-primary:hover{background:#40a9ff;} .btn-default{background:#fff;color:var(--text-primary);border:1px solid var(--border);} .btn-default:hover{color:var(--primary);border-color:var(--primary);} -.summary-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:16px;} -.summary-card{background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);padding:16px 18px;} +.summary-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:16px;} +.summary-card{background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);padding:16px 18px;border:1px solid transparent;cursor:pointer;transition:all .2s;} +.summary-card:hover{border-color:var(--primary);transform:translateY(-1px);} .summary-card__value{font-size:var(--font-xxl);font-weight:700;line-height:1;} .summary-card__label{font-size:var(--font-sm);color:var(--text-secondary);margin-top:8px;} .summary-card__hint{font-size:var(--font-xs);color:var(--text-placeholder);margin-top:8px;} @@ -112,23 +113,13 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
- -
-
80 / 90
当日上报统计
成功率 88.9%
-
3 / 3
当日下发统计
全部任务已接收
-
3
当日告警
1 条未恢复
-
12 / 18
设备在线 / 绑定设备
餐线设备离线 2 台
+ +
80 / 90
当日上报统计
成功率 88.9%
+ +
3 / 3
当日下发统计
全部任务已接收
+ +
3
当日告警
1 条未恢复
@@ -141,8 +132,7 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
所属食堂
采气一厂食堂
部署位置
后厨机房
服务器 IP
10.18.32.17
-
服务版本
v2.3.0
-
配置版本
CFG-20260624-02
+
远程连接
向日葵:3688595/F154SI
安装时间
2026-05-12 09:20
最近启动
2026-06-24 06:11
最近心跳
2026-06-24 09:17:58
@@ -167,8 +157,6 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
运行概览
设备接入
-
数据上报
-
数据下发
告警记录
运行日志
@@ -215,30 +203,6 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
-
-
- - - - - - -
数据类型业务编号来源设备产生时间上报状态失败次数最近处理时间失败原因操作
就餐流水MEAL-20260624-0178结算终端 012026-06-24 08:11:04待重试32026-06-24 09:08:33MQ 连接超时查看全量
称重记录WEIGH-20260624-0148餐线营养秤 022026-06-24 08:42:03已上报02026-06-24 08:42:19查看轨迹
-
-
- -
-
- - - - - - -
任务编号下发类型下发方式发起时间接收状态应用状态完成时间失败原因操作
FACE-BATCH-0624-04人脸增量单次2026-06-24 08:40:00已接收部分待应用2 台终端尚未回执查看详情
CFG-PUSH-0624-01配置同步定时2026-06-24 06:00:00已接收已完成2026-06-24 06:02:14查看详情
-
-
-
diff --git a/web-admin/nutrition/edge-server-management.html b/web-admin/nutrition/edge-server-management.html index ea95095..d2baa1f 100644 --- a/web-admin/nutrition/edge-server-management.html +++ b/web-admin/nutrition/edge-server-management.html @@ -30,7 +30,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei .page-header__title{font-size:var(--font-xl);font-weight:700;color:var(--text-primary);} .page-header__desc{margin-top:6px;font-size:var(--font-sm);color:var(--text-secondary);} .page-header__meta{font-size:var(--font-sm);color:var(--text-placeholder);} -.stats-row{display:grid;grid-template-columns:repeat(6,1fr);gap:12px;margin-bottom:16px;} +.stats-row{display:grid;grid-template-columns:repeat(5,1fr);gap:12px;margin-bottom:16px;} .stat-card{background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-sm);padding:16px 18px;border:1px solid transparent;transition:all .2s;cursor:pointer;} .stat-card:hover{border-color:var(--primary);transform:translateY(-1px);} .stat-card__value{font-size:var(--font-xxl);font-weight:700;line-height:1;color:var(--text-primary);} @@ -52,7 +52,8 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei .table-card__header{display:flex;align-items:center;justify-content:space-between;padding:16px 24px;border-bottom:1px solid var(--border);} .table-card__title{font-size:var(--font-base);font-weight:600;} .table-card__content{overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;} -.table-card__content table{min-width:1420px;} +.table-card__actions{display:flex;align-items:center;gap:8px;} +.table-card__content table{min-width:1720px;} table{width:100%;border-collapse:collapse;} thead th{background:#FAFAFA;padding:12px 16px;text-align:left;font-size:var(--font-sm);color:var(--text-secondary);font-weight:500;border-bottom:1px solid var(--border);white-space:nowrap;} tbody td{padding:14px 16px;font-size:var(--font-sm);color:var(--text-primary);border-bottom:1px solid var(--border);white-space:nowrap;vertical-align:middle;} @@ -68,6 +69,16 @@ tbody tr:hover td.td-actions{background:#F8FBFF;} .tag-gray{background:#F5F5F5;color:#999;} .link{color:var(--primary);cursor:pointer;font-size:var(--font-sm);text-decoration:none;} .link:hover{color:#40a9ff;} +.link+.link{margin-left:12px;} +.td-actions{white-space:nowrap;} +/* 胶囊开关:启动/停用 */ +.switch{position:relative;display:inline-block;width:44px;height:22px;cursor:pointer;vertical-align:middle;} +.switch__track{position:absolute;inset:0;background:#E8E8E8;border-radius:11px;transition:background .2s;} +.switch__thumb{position:absolute;top:2px;left:2px;width:18px;height:18px;background:#fff;border-radius:50%;box-shadow:0 1px 3px rgba(0,0,0,0.2);transition:left .2s;} +.switch--on .switch__track{background:var(--primary);} +.switch--on .switch__thumb{left:24px;} +.switch__label{margin-left:8px;font-size:var(--font-xs);color:var(--text-secondary);vertical-align:middle;} +.switch--on+.switch__label{color:var(--primary);} .server-name{font-weight:600;color:var(--primary);} .server-sub{font-size:var(--font-xs);color:var(--text-placeholder);margin-top:3px;} .metric-warning{color:var(--warning);font-weight:600;} @@ -76,6 +87,25 @@ tbody tr:hover td.td-actions{background:#F8FBFF;} .pagination span{font-size:var(--font-sm);color:var(--text-secondary);} .page-btn{width:32px;height:32px;border:1px solid var(--border);border-radius:var(--radius-sm);background:#fff;cursor:pointer;font-size:var(--font-sm);} .page-btn.active,.page-btn:hover{background:var(--primary);border-color:var(--primary);color:#fff;} +.modal-mask{display:none;position:fixed;inset:0;background:rgba(0,0,0,0.45);z-index:1000;align-items:center;justify-content:center;} +.modal-mask.show{display:flex;} +.modal{width:760px;max-height:86vh;background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-md);display:flex;flex-direction:column;overflow:hidden;} +.modal__header{display:flex;align-items:center;justify-content:space-between;padding:16px 24px;border-bottom:1px solid var(--border);} +.modal__title{font-size:var(--font-base);font-weight:600;color:var(--text-primary);} +.modal__close{width:28px;height:28px;border:none;background:transparent;border-radius:var(--radius-sm);font-size:22px;line-height:1;cursor:pointer;color:var(--text-placeholder);} +.modal__close:hover{background:#F5F5F5;color:var(--text-primary);} +.modal__body{padding:22px 24px;overflow-y:auto;} +.modal__footer{display:flex;justify-content:flex-end;gap:8px;padding:14px 24px;border-top:1px solid var(--border);} +.form-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:16px 20px;} +.form-item{display:flex;flex-direction:column;gap:6px;} +.form-item--full{grid-column:1 / -1;} +.form-label{font-size:var(--font-sm);color:var(--text-secondary);} +.form-label.required::before{content:"*";color:var(--danger);margin-right:4px;} +.form-input,.form-select,.form-textarea{width:100%;border:1px solid var(--border);border-radius:var(--radius-sm);font-size:var(--font-sm);outline:none;background:#fff;} +.form-input,.form-select{height:36px;padding:0 12px;} +.form-textarea{height:72px;padding:10px 12px;resize:none;font-family:inherit;} +.form-input:focus,.form-select:focus,.form-textarea:focus{border-color:var(--primary);} +.form-tip{font-size:var(--font-xs);color:var(--text-placeholder);line-height:1.5;} .toast{position:fixed;top:76px;left:50%;transform:translateX(-50%) translateY(-12px);background:#fff;border-left:4px solid var(--primary);box-shadow:var(--shadow-md);padding:10px 18px;border-radius:var(--radius-sm);font-size:var(--font-sm);opacity:0;pointer-events:none;transition:all .25s;z-index:1200;} .toast.show{opacity:1;transform:translateX(-50%) translateY(0);} @@ -112,30 +142,18 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
- -
28
接入服务器数
覆盖 16 个食堂
24
在线服务器
近 3 分钟有心跳
2
离线服务器
需运维优先处理
4
高风险服务器
告警或统计异常
3
上报异常服务器
当日成功率低于 95%
-
17
当日告警总数
含服务器、设备、上报、下发
-
-
-
@@ -143,7 +161,11 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
边缘服务器清单
-
+
+ + + +
@@ -151,14 +173,16 @@ tbody tr:hover td.td-actions{background:#F8FBFF;} + + - + @@ -166,67 +190,77 @@ tbody tr:hover td.td-actions{background:#F8FBFF;} + + - - + + + + - - + + + + - - + + + + - - + + + + - - + +
服务器名称 所属食堂部署位置服务器 IP 在线状态 健康状态服务版本 当日上报统计 当日下发统计 当日告警统计 最近心跳时间 最后上报成功启动/停用 操作
总部一号食堂服务器
EDGE-CQ-001
总部一号食堂主楼一层机房10.18.32.01 在线 正常v2.3.1 90 / 90 3 / 3 0 2026-06-24 09:18:10 2026-06-24 09:17:43查看详情启动查看详情编辑
采气一厂后厨服务器
EDGE-CQ-017
采气一厂食堂后厨机房10.18.32.17 异常 告警v2.3.0 80 / 90 3 / 3 3 2026-06-24 09:17:58 2026-06-24 08:41:11查看详情启动查看详情编辑
炼化中心餐线服务器
EDGE-CQ-024
炼化中心食堂餐线弱电柜10.18.32.24 离线 严重v2.2.8 56 / 90 1 / 4 8 2026-06-24 08:54:09 2026-06-24 08:12:18查看详情停用查看详情编辑
输气站小食堂服务器
EDGE-CQ-032
输气站小食堂收银台机柜10.18.32.32 在线 告警v2.3.1 72 / 80 2 / 2 1 2026-06-24 09:18:02 2026-06-24 08:50:33查看详情启动查看详情编辑
培训中心食堂服务器
EDGE-CQ-041
培训中心食堂后勤办公室10.18.32.41 在线 正常v2.3.1 84 / 84 2 / 2 0 2026-06-24 09:18:14 2026-06-24 09:14:41查看详情启动查看详情编辑
@@ -242,6 +276,34 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}
+ + +
操作已完成