# 一键日期查询完整指标仪表盘 - 实现计划 ## 📋 需求确认 **用户真实需求**: - ✅ 选择**一个日期** - ✅ **一次查询**看到所有关键指标(20+个) - ✅ 不需要逐个模块查询 - ✅ 不需要手动计算和拼凑 - ✅ 采用 JSONP 方式(与 batch_query.html 相同) **改进前流程**: ``` 用户选择日期 → 逐个查询5个模块 → 手动汇总 → 5分钟+ ``` **改进后流程**: ``` 用户选择日期 → 点击查询 → 一屏显示所有指标 → 2-3秒 ``` --- ## 🎯 实现步骤 ### 第一步:创建/更新仪表盘前端 (metrics-dashboard-summary.html) **状态**:已部分完成,需补充 JSONP 实现细节和指标展示逻辑 **修改内容**: 1. ✅ 环境选择器 2. ✅ 日期选择器 (简化为单一输入) 3. ✅ 查询/刷新按钮 4. ❌ JSONP 请求函数 (需补充完整) 5. ❌ 响应处理函数 (需补充完整) 6. ❌ 指标显示模板 (需补充完整) **关键 JSONP 实现**: ```javascript // 回调函数注册 window['dashboardCallback_' + timestamp] = function(response) { // 处理响应 } // 构建 JSONP URL url = "metrics-proxy.jsp?action=getDailyDashboard&date=2026-05-17&callback=dashboardCallback_xxx&env=test" // 通过 script 标签加载 const script = document.createElement('script'); script.src = url; document.head.appendChild(script); ``` **指标显示结构**: ``` ├─ 核心指标 (3个大卡片):当天新增、应换单数、已完成 ├─ 完成率指标 (2个卡片):当日完成率、24小时完成率 ├─ 分时段统计 (表格):16点前/后对比 └─ 详细指标 (信息卡片):STOP数、标签推送、扫描数等 ``` **文件路径**:`d:\EPproject\LabelReplaceServer\metrics-dashboard-summary.html` --- ### 第二步:更新 JSP 代理 (metrics-proxy.jsp) **状态**:已存在,需新增 getDailyDashboard 操作和 JSONP 支持 **修改内容**: 1. 获取 callback 参数 2. 判断返回格式 (JSON vs JSONP) 3. 新增 `getDailyDashboard` 操作分支 4. JSONP 响应包装 (callback + 数据) 5. Callback 安全验证 (正则表达式) **关键代码片段**: ```jsp // 获取 callback 参数 String callback = request.getParameter("callback"); String format = request.getParameter("format"); if (format == null) { format = (callback != null && !callback.isEmpty()) ? "jsonp" : "json"; } // 新增操作 else if ("getDailyDashboard".equals(action)) { apiUrl = baseUrl + "/api/metrics/daily-dashboard?date=" + URLEncoder.encode(date, "UTF-8"); } // JSONP 返回处理 if ("jsonp".equals(format) && callback != null && !callback.isEmpty()) { if (callback.matches("^[a-zA-Z_$][a-zA-Z0-9_$]*$")) { out.print(callback + "(" + resultJson.toString() + ");"); } else { out.print("jsonp_error({\"error\": \"Invalid callback name\"});"); } } else { out.print(resultJson.toString()); } ``` **文件路径**:`d:\EPproject\LabelReplaceServer\metrics-proxy.jsp` --- ### 第三步:后端 API 支持 (可选但推荐) **状态**:需新增或验证 **修改内容**: 1. 验证 `/api/metrics/daily-dashboard` 端点是否存在 2. 如不存在,在 MetricsController 中新增此端点 3. 后端调用 MetricsCalculationService 的方法聚合数据 **API 规格**: - **端点**:`GET /api/metrics/daily-dashboard?date=2026-05-17` - **返回**:完整汇总 JSON 包含所有 20+ 指标 - **格式**: ```json { "success": true, "data": { "date": "2026-05-17", "summary": { "dailyNewReplaceCount": 150, "dailyShouldReplaceCount": 150, "dailySuccessCount": 145, "dailyCompletionRate": "96.67%", "rate24Hour": "96.67%" }, "breakdown": { "beforeNoon": {"arrived": 80, "passed": 78, "rate": "97.50%"}, "afternoon": {"arrived": 70, "passed": 67, "rate": "95.71%"} }, "details": { "cumulativeTotal": 500, "dailyStop": 25, "dailyLabelPush": 160, "dailyScanCount": 200, "dailyFailure": 5 } } } ``` **文件路径**: - `d:\EPproject\LabelReplaceServer\src\CONTROLLER\Controllers\MetricsController.cs` - `d:\EPproject\LabelReplaceServer\src\BLL\Services\MetricsCalculationService.cs` --- ## 🔄 JSONP 工作流 ### 前端流程 ``` 1. 用户选择日期 (e.g., 2026-05-17) 2. 点击"查询"按钮 3. 生成唯一回调名称:dashboardCallback_1234567890 4. 注册 window 全局函数:window['dashboardCallback_1234567890'] = function(data) {...} 5. 创建