Files
LabelChange-server/.trae/documents/ops_monitor_dashboard_verification_plan.md
2026-06-01 16:30:29 +08:00

6.9 KiB
Raw Permalink Blame History

运维监控看板 — 现状核查与验证计划

背景

本轮会话目标:在 batch_query.html 数据看板中新增「📈 运维监控」Tab通过调用存储过程 sp_GetOperationsMonitor() 将每日运营监控数据展示在界面上,且不影响其他模块。

经核查,上一轮会话已完成全部代码实现,无需重复开发。本计划仅针对「核查发现的问题」进行修复和补充。


一、已完成内容(已核实,无需修改)

层级 文件 状态
数据库层 database/migrations/003_add_join_indexes.sql 已建
数据库层 database/migrations/004_create_sp_operations_monitor.sql472行 已建
调用入口 运营监控_优化版.sql 已建
DTO src/MDL/DTOs/OpsMonitorDto.cs 已建13个字段
Repository 接口 src/DAL/Interfaces/ILabelReplaceRepository.cs 第171行 已追加
Repository 实现 src/DAL/repositories/LabelReplaceRepository.cs第1664-1702行 已实现
Service 接口 src/BLL/Interfaces/ILabelReplaceService.cs 第134行 已追加
Service 实现 src/BLL/Services/LabelReplaceService.cs第1044-1055行 已实现
Controller src/CONTROLLER/Controllers/DashboardController.cs第368-414行 已追加
前端 Tab 按钮 batch_query.html 第786行 已追加
前端 Tab 面板 batch_query.html 第1819-1884行4卡片+13列表格 已追加
前端 JS 逻辑 batch_query.html 第4745-4867行 已追加

二、当前核查发现的问题

问题1loadOpsMonitorData() 使用 JSONP但同域部署时更推荐直接 JSON

发现:前端 loadOpsMonitorData() 使用 dataType: 'jsonp',如果 batch_query.html 与后端同域部署JSONP 会正常工作(后端已支持 callback 参数),但如果浏览器从本地 file:// 协议打开JSONP 会由于浏览器安全限制失败。

当前后端DashboardController.GetOpsMonitorData 已支持 JSONPcallback 参数)和直接 JSON 两种模式。

结论JSONP 模式在同域或跨域部署时均可工作,不影响功能。无需修改


问题2loadOpsMonitorData()_opsMonitorLoaded = true 设置时机

发现_opsMonitorLoaded 在请求成功后设为 true,意味着只要成功加载过一次,切换 Tab 不再自动重新加载(懒加载设计)。用户可通过「🔄 刷新数据」按钮手动刷新。

结论:这是预期的懒加载行为,符合其他 Tab 的设计模式。无需修改


问题3需要确认data[0] 作为「今日」数据的假设

发现displayOpsMonitorTable(data) 中用 var today = data[0] 作为今日汇总卡片数据来源,依赖存储过程 ORDER BY dm.日期 DESC 返回最新数据在第一行。

存储过程末尾:已确认使用 ORDER BY dm.日期 DESC,第一行确实是最新日期数据。逻辑正确,无需修改


问题4需要修复data[0] 的字段名大小写

发现:前端 JS 中使用 today.ShouldReplaceCounttoday.DailySuccessCount 等驼峰命名,但 ASP.NET Core 默认的 System.Text.Json 序列化器使用属性原始名称PascalCase,而非 camelCase。

后端 DTO 字段(以 PascalCase 定义):

public string Date { get; set; }
public int ShouldReplaceCount { get; set; }
// ...

ASP.NET Core 默认行为System.Text.Json.JsonSerializer.Serialize() 默认保留 PascalCase即 JSON 输出为 ShouldReplaceCount,与前端 today.ShouldReplaceCount 一致。

结论:字段名匹配,无需修改


三、实施步骤

由于核查未发现需要修复的代码问题,本计划的实施步骤聚焦于确保代码完整性

步骤 1确认 batch_query.html Tab 结构完整

  • 验证第786行 Tab 按钮代码存在且格式正确
  • 验证第1819-1884行 Tab 面板代码完整
  • 验证第4745-4867行 JS 函数完整

步骤 2确认后端三层代码完整

  • 确认 OpsMonitorDto.cs 命名空间为 MDL.DTOs(已修复)
  • 确认 DashboardController.cs 顶部有 using MDL.DTOs;(已修复)
  • 确认无编译诊断错误

步骤 3确认存储过程文件完整

  • 004_create_sp_operations_monitor.sql472行结构完整含 DELIMITER 和 END$$

四、数据流架构图

浏览器 batch_query.html
  │
  │ 切换到「📈 运维监控」Tab首次触发懒加载
  │ 或点击「🔄 刷新数据」按钮
  │
  ↓ GET /api/dashboard/ops-monitor?callback=jQuery_xxx (JSONP)
  │
ASP.NET Core DashboardController.GetOpsMonitorData()
  │
  ↓ await _labelReplaceService.GetOpsMonitorDataAsync()
  │
LabelReplaceService.GetOpsMonitorDataAsync()
  │
  ↓ await _labelReplaceRepository.GetOpsMonitorDataAsync()
  │
LabelReplaceRepository直接使用 MySqlConnection
  │
  ↓ CALL sp_GetOperationsMonitor(); (CommandTimeout=120s)
  │
MySQL 8.0 存储过程
  │  临时表链路:
  │  tmp_scan_agg → tmp_daily_scan → tmp_form_order
  │  → tmp_form_first_scan → tmp_form_stats
  │  → tmp_form_push_ranked → tmp_order_full
  │  → tmp_should_replace_dedup → tmp_label_push → tmp_daily_metrics
  │
  ↓ SELECT 13列数据 ORDER BY 日期 DESC
  │
List<OpsMonitorDto> → JSON → JSONP 包装
  │
  ↓ 返回浏览器
  │
displayOpsMonitorTable(data)
  │  ├─ 4张汇总卡片今日应换单数/完成数/24H成功数/完成率)
  │  └─ 13列历史数据表格完成率≥80%绿色/50%红色)

五、不影响其他模块的保证

  1. Tab 按钮:独立 <li> 元素追加到导航栏末尾,不修改现有 Tab
  2. Tab 面板:独立 <div class="tab-pane"> 追加,不修改现有面板
  3. JS 函数loadOpsMonitorDatadisplayOpsMonitorTableexportOpsMonitorToExcel 均为新增,无同名冲突
  4. 变量名_opsMonitorLoaded_opsMonitorData 前缀唯一,无冲突
  5. 元素 IDopsMonitorTableBodyopsCard_*opsMonitorFetchTime 均为新增,无冲突
  6. 后端接口:新增 GET /api/dashboard/ops-monitor,不修改现有接口
  7. 数据库:存储过程 sp_GetOperationsMonitor 为新增,不修改现有表结构

六、部署前置条件

在运行前,需确保以下操作已在数据库执行:

-- 1. 添加索引003文件
ALTER TABLE label_replace_requests
    ADD INDEX IF NOT EXISTS idx_bill_of_lading_number (BillOfLadingNumber),
    ADD INDEX IF NOT EXISTS idx_master_package_number (MasterPackageNumber);

-- 2. 创建存储过程(执行 004 文件全部内容)
-- CALL sp_GetOperationsMonitor(); -- 验证用

计划状态:代码实现已全部完成,无新增修改项,仅需确认文件完整性。