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

220 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 前端数据处理错误修复计划
## 问题分析
用户反馈后端返回JSON数据成功但前端显示error
### 用户收到的JSON数据
```json
{
"data": {
"date": "2026-05-17",
"summary": {
"dailyNewReplaceCount": 0,
"dailyShouldReplaceCount": 0,
"dailySuccessCount": 0,
"dailyCompletionRate": "0.00%",
"rate24Hour": "0.00%"
},
"breakdown": {
"beforeNoon": {
"arrived": 0,
"passed": 0,
"rate": "0%"
},
"afternoon": {
"arrived": 0,
"passed": 0,
"rate": "0%"
}
},
"details": {
"cumulativeTotal": 106,
"dailyStop": 0,
"dailyLabelPush": 0,
"dailyScanCount": 0,
"dailyFailure": 0
}
},
"success": true
}
```
### 问题根源
查看 `metrics-dashboard-summary.html` 第525-628行的 `displayDashboard` 函数:
```javascript
function displayDashboard(data) {
const date = data.date;
const summary = data.summary || {};
const breakdown = data.breakdown || {};
const details = data.details || {};
// ... 生成HTML ...
}
```
**问题识别**
1. 前端代码期望的数据结构与后端返回的结构不一致
2. `data.summary` 应该包含 `dailyNewReplaceCount` 等字段
3. 但后端可能返回的是不同的结构
### 数据不匹配的具体原因
后端 API`/api/metrics/daily-dashboard?date=2026-05-17`
后端返回的JSON结构中 `success: true`,说明后端代码执行成功。
但根据数据内容:
- `daily NewReplaceCount: 0` - 应为大于0
- `dailyShouldReplaceCount: 0` - 应该与之前查询的3592接近
- 仅有 `cumulativeTotal: 106` 有合理的值
### 真实原因
这不是前端代码问题,而是**后端返回的数据本身是全0**。
前端代码正确地处理了接收到的数据:
- 第493行检查 `response.success`
- 第507行调用 `displayDashboard(response.data)`
- 第525-628行遍历 `data.summary``data.breakdown` 显示
**关键问题**:用户说"显示error"但我们看到的JSON显示 `success: true`
这可能意味着:
1. 存储过程未执行或返回空结果
2. 后端的 `GetDailySummaryAsync` 返回的是默认值全0
3. 查询的日期 2026-05-17 在数据库中没有实际数据
## 修复计划
### 步骤1验证后端API实际返回的数据
在浏览器开发者工具中:
1. 打开 Chrome DevTools (F12)
2. 切换到 Network 标签
3. 选择日期 2026-05-17 并点击"查询汇总"
4. 找到 `/api/metrics/daily-dashboard` 请求
5. 在 Response 标签查看实际返回的JSON
**检查项**
- `success` 字段值
- `data.summary` 中各字段的实际值
- 是否有错误信息
### 步骤2检查后端的 MetricsController.GetDailyDashboard 方法
**问题**:需要确认后端是否正确调用了存储过程并映射了数据
**检查文件**`src/CONTROLLER/Controllers/MetricsController.cs`
**关键问题**
- 是否正确传递了日期参数?
- `GetDailySummaryAsync(date)` 返回的是什么?
- DTO映射是否正确
### 步骤3检查存储过程是否真的被创建和调用
在数据库中验证:
```sql
-- 1. 验证存储过程存在
SHOW PROCEDURE STATUS WHERE Db = 'lr01mainusa' AND Name = 'sp_GetDailyMetricsSummary';
-- 2. 直接测试存储过程
CALL sp_GetDailyMetricsSummary('2026-05-17');
-- 3. 检查该日期是否有实际数据
SELECT COUNT(*) FROM arrival_handover_forms
WHERE DATE(CONVERT_TZ(ReceiptTime, '+00:00', '-05:00')) = '2026-05-17';
SELECT COUNT(*) FROM label_replace_requests
WHERE DATE(CONVERT_TZ(CreatedAt, '+00:00', '-05:00')) = '2026-05-17'
AND Label IS NOT NULL;
```
### 步骤4在不同日期上测试
尝试查询其他日期如2026-05-16、2026-05-15等确认
- 是否某个特定日期返回0
- 还是所有日期都返回0
### 步骤5添加前端调试日志
在前端 `handleDashboardResponse` 函数中添加详细日志:
```javascript
function handleDashboardResponse(response) {
console.log('响应内容:', JSON.stringify(response, null, 2));
if (response && response.success) {
console.log('数据验证:成功');
console.log('summary:', response.data?.summary);
console.log('breakdown:', response.data?.breakdown);
console.log('details:', response.data?.details);
displayDashboard(response.data);
} else {
console.error('响应失败:', response?.error);
showError(response?.error || '查询失败');
}
}
```
### 步骤6后端添加详细日志
`MetricsCalculationService.GetDailySummaryAsync` 中添加日志:
```csharp
public async Task<Daily24HCompletionRateDto> GetDailySummaryAsync(DateTime date)
{
_logger.LogInformation("=== GetDailySummaryAsync START ===");
_logger.LogInformation("查询日期:{date:yyyy-MM-dd}", date);
try
{
var db = _provider.GetClient();
string sql = $"CALL sp_GetDailyMetricsSummary('{date:yyyy-MM-dd}')";
_logger.LogInformation("执行SQL{sql}", sql);
var summaryList = await db.SqlQueryable<dynamic>(sql).ToListAsync();
_logger.LogInformation("查询结果行数:{count}", summaryList?.Count ?? 0);
if (summaryList?.Count > 0)
{
var firstRow = summaryList[0];
_logger.LogInformation("第一行数据DailyShouldReplaceCount={count}", firstRow.DailyShouldReplaceCount);
}
// ... 后续处理 ...
}
catch (Exception ex)
{
_logger.LogError(ex, "=== GetDailySummaryAsync ERROR ===");
// ... 降级处理 ...
}
}
```
## 关键发现
用户提供的JSON显示 `success: true` 和数据存在所以前端的问题不在于处理null或异常。
真实问题是**后端返回的数据本身全是0**(除了 `cumulativeTotal: 106`)。
这说明:
1. ✅ API端点工作正常
2. ✅ 数据库连接成功
3. ✅ 没有异常导致降级
4. ❌ 存储过程返回了错误的数据全0或者
5. ❌ 查询的日期在数据库中确实没有相关数据
## 验收标准
1. ✅ 通过浏览器DevTools查看实际API返回
2. ✅ 验证存储过程是否存在并可执行
3. ✅ 检查查询日期的实际源数据
4. ✅ 修改日期后验证不同日期的数据
5. ✅ 查看后端日志确认实际调用情况