Files
huang b9c3875c08
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m3s
feat: 新增数据库迁移,重命名 device_no 为 virtual_no,新增 iot_card.virtual_no 和 package.virtual_ratio 字段
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-14 18:27:28 +08:00

53 lines
2.5 KiB
Markdown
Raw Permalink 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.
# polling-protect-consistency Specification
## Purpose
新增第四种轮询任务类型(保护期一致性检查),用于确保设备保护期内绑定卡的网络状态与保护期方向保持一致,防止状态漂移。
## Requirements
### Requirement: 保护期一致性检查轮询任务
系统 SHALL 新增第四种轮询任务类型(保护期一致性检查),作为独立任务处理器,不修改现有三种任务(实名检查/流量检查/套餐检查)的内部逻辑。
**任务类型标识**: `protect`(与现有 `realname``carddata``package` 并列)
**Redis 队列 Key**: `RedisPollingQueueProtectKey()``"polling:queue:protect"`
**触发频率**: 与流量检查任务同频(默认 10 分钟)
**任务范围**: 仅检查"已绑定设备且设备当前有保护期"的卡,范围小,不会对未绑定设备的卡产生影响
**处理逻辑**:
1. 检查卡是否已实名(`real_name_status = 0` 则跳过,未实名卡不参与保护期逻辑)
2. 检查卡是否绑定设备(`is_standalone = true` 则跳过)
3. 读取设备保护期 Redis Key
4. 若设备有 **stop 保护期**,且卡当前网络状态为**开机**:强制调网关停机,更新卡 `network_status = 0`
5. 若设备有 **start 保护期**,且卡当前网络状态为**停机**:强制调网关复机,更新卡 `network_status = 1`
6. 状态已一致(开机 + stop 保护期已停 / 停机 + start 保护期已开):跳过
#### Scenario: stop 保护期内卡状态异常(开机)
- **WHEN** 轮询任务检查一张已实名卡,发现绑定设备有 stop 保护期,但卡当前 network_status=1开机
- **THEN** 任务强制调网关停机,更新卡 network_status=0记录 Info 日志
#### Scenario: start 保护期内卡状态异常(停机)
- **WHEN** 轮询任务检查一张已实名卡,发现绑定设备有 start 保护期,但卡当前 network_status=0停机
- **THEN** 任务强制调网关复机,更新卡 network_status=1记录 Info 日志
#### Scenario: 状态已一致,跳过
- **WHEN** 轮询任务检查一张卡,设备有 stop 保护期,卡已是停机状态
- **THEN** 任务跳过,不调网关,不更新 DB
#### Scenario: 未实名卡跳过保护期逻辑
- **WHEN** 轮询任务遇到 real_name_status=0 的卡
- **THEN** 任务直接跳过,不检查保护期,不调网关
#### Scenario: 独立卡(未绑定设备)跳过
- **WHEN** 轮询任务遇到 is_standalone=true 的卡
- **THEN** 任务直接跳过,不查询设备保护期