Files
xyzw_web_helper/MD说明文件夹/问题修复-每日发车次数限制v3.8.0.md
2025-10-17 20:56:50 +08:00

246 lines
7.1 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.

# 问题修复-每日发车次数限制 v3.8.0
## 📋 问题描述
每日发车4辆限制功能未生效所有4辆车都能发送成功没有触发限制。
## 🔍 问题分析
通过日志分析发现:
1. **计数增加正常**:每次发送成功后,`dailySendCount` 会正确增加
```
✅ 今日发车次数更新: 1/4
```
2. **计数被重置**:但紧接着调用 `queryClubCars()` 时,会从服务器响应中读取 `sendCount` 字段
```
🚗 今日已发车次数: 0 // 服务器返回的值始终为0
```
3. **覆盖客户端值**`dailySendCount.value = sendCount` 将客户端计数重置为0
### 执行流程(问题版本)
```
发送第1辆 → 计数+1 → 查询 → 服务器返回0 → 计数重置为0
发送第2辆 → 计数+1 → 查询 → 服务器返回0 → 计数重置为0
发送第3辆 → 计数+1 → 查询 → 服务器返回0 → 计数重置为0
发送第4辆 → 计数+1 → 查询 → 服务器返回0 → 计数重置为0
```
### 根本原因
服务器的 `roleCar.sendCount` 字段可能:
- 不存在或位置不对
- 或者服务器确实没有维护这个字段
## ✅ 解决方案
### 1. **客户端维护计数**
不再完全依赖服务器返回的 `sendCount`,改为客户端自己维护,只在特定情况下更新:
```javascript
// 只有当服务器返回的值更大时,才更新客户端计数
if (response.roleCar.sendCount !== undefined && response.roleCar.sendCount !== null) {
if (response.roleCar.sendCount > dailySendCount.value) {
dailySendCount.value = response.roleCar.sendCount
saveDailySendCount(dailySendCount.value)
console.log('🚗 从服务器更新今日发车次数:', dailySendCount.value)
} else {
console.log(`🚗 保持客户端发车次数: ${dailySendCount.value}(服务器值: ${response.roleCar.sendCount}`)
}
} else {
console.log('🚗 服务器未返回sendCount保持客户端计数:', dailySendCount.value)
}
```
### 2. **localStorage 持久化**
将发车次数保存到 localStorage按日期区分
```javascript
// 生成今日的存储key
const STORAGE_KEY_PREFIX = 'car_daily_send_count_'
const getTodayKey = () => {
const today = new Date().toLocaleDateString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit' })
return `${STORAGE_KEY_PREFIX}${today}` // 例如: car_daily_send_count_2025/01/08
}
// 从localStorage加载
const loadDailySendCount = () => {
try {
const savedCount = localStorage.getItem(getTodayKey())
return savedCount ? parseInt(savedCount, 10) : 0
} catch (error) {
console.error('读取发车次数失败:', error)
return 0
}
}
// 保存到localStorage
const saveDailySendCount = (count) => {
try {
localStorage.setItem(getTodayKey(), count.toString())
console.log(`💾 已保存今日发车次数: ${count}`)
} catch (error) {
console.error('保存发车次数失败:', error)
}
}
```
### 3. **发送成功后持久化**
每次发送成功后,立即保存到 localStorage
```javascript
if (response) {
dailySendCount.value++
saveDailySendCount(dailySendCount.value) // 持久化
message.success(`车辆 ${carId} 发送成功(今日已发${dailySendCount.value}/4`)
await queryClubCars()
}
```
## 🎯 修复效果
### 执行流程(修复版本)
```
初始化 → 从localStorage加载计数: 0/4
发送第1辆 → 计数+1 → 保存到localStorage → 查询
→ 服务器返回0 → 判断0 < 1 → 保持客户端计数1
发送第2辆 → 计数+1 → 保存到localStorage → 查询
→ 服务器返回0 → 判断0 < 2 → 保持客户端计数2
发送第3辆 → 计数+1 → 保存到localStorage → 查询
→ 服务器返回0 → 判断0 < 3 → 保持客户端计数3
发送第4辆 → 计数+1 → 保存到localStorage → 查询
→ 服务器返回0 → 判断0 < 4 → 保持客户端计数4
→ 达到上限!
尝试发送第5辆 → 检查计数4 >= 4 → 拦截!
→ 提示: "今日发车次数已达上限4/4明天再来吧"
```
## 📊 新增日志
### 初始化日志
```
🚗 初始化发车计数: 0/4今日: 2025/1/8
```
### 发送过程日志
```
🚀 开始发送车辆ID: 11p3-7462375今日已发0/4
🚀 车辆发送成功ID: 11p3-7462375
✅ 今日发车次数更新: 1/4
💾 已保存今日发车次数: 1
🚗 保持客户端发车次数: 1服务器值: 0
```
### 达到上限日志
```
⚠️ 今日发车次数已达上限: 4/4
```
## 🔧 技术细节
### localStorage 数据结构
```javascript
// Key 格式
car_daily_send_count_2025/01/08
// Value
"4" // 字符串格式
```
### 跨日期自动重置
由于 localStorage key 包含日期不同日期会自动使用不同的key实现自动重置
```
2025/01/08: car_daily_send_count_2025/01/08 → 4
2025/01/09: car_daily_send_count_2025/01/09 → 0 (新的一天,自动重置)
```
## 🎨 UI 变化
### 未达上限0-3辆
```
[🚗 2/4] // 绿色徽章
```
### 已达上限4辆
```
[🚗 4/4] // 红色徽章 + 闪烁动画
```
## 🧪 测试场景
### 场景1正常发车
1. 初始计数0/4
2. 一键发车4辆待发
3. 成功发送4辆
4. 计数更新为4/4
5. UI显示红色徽章并闪烁
### 场景2达到上限后尝试发送
1. 当前计数4/4
2. 点击"🚀发送"按钮
3. **拦截成功**:提示"今日发车次数已达上限4/4明天再来吧"
4. 未执行发送操作
### 场景3刷新页面后
1. 发送3辆车后刷新页面
2. 计数从 localStorage 恢复3/4
3. 可以继续发送1辆车
4. 第2辆被拦截
### 场景4跨日期重置
1. 2025/01/08 发送4辆4/4
2. 第二天2025/01/09打开页面
3. 计数自动重置为 0/4
4. 可以继续发送4辆车
## 📝 相关文件
### 修改的文件
- `src/components/CarManagement.vue`
- 添加 `loadDailySendCount()` 函数
- 添加 `saveDailySendCount()` 函数
- 添加 `getTodayKey()` 函数
- 修改 `queryClubCars()` 中的计数更新逻辑
- 修改 `sendCar()` 添加持久化调用
### 新增文件
- `MD说明/问题修复-每日发车次数限制v3.8.0.md`
## 🔄 版本信息
- **版本号**: v3.8.0
- **修复日期**: 2025-01-08
- **修复内容**:
- 修复每日发车次数限制未生效的问题
- 添加 localStorage 持久化功能
- 优化计数更新逻辑,避免被服务器覆盖
## 🚀 使用说明
### 清除计数(调试用)
如需手动重置今日发车次数,可在浏览器控制台执行:
```javascript
// 清除今日计数
const today = new Date().toLocaleDateString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit' })
localStorage.removeItem(`car_daily_send_count_${today}`)
location.reload() // 刷新页面
```
### 查看计数(调试用)
```javascript
const today = new Date().toLocaleDateString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit' })
console.log('今日发车次数:', localStorage.getItem(`car_daily_send_count_${today}`))
```
---
**✅ 修复完成刷新页面Ctrl + F5每日发车4辆限制将正常工作**