feat: 新增数据库迁移,重命名 device_no 为 virtual_no,新增 iot_card.virtual_no 和 package.virtual_ratio 字段
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m3s
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m3s
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
52
openspec/specs/polling-protect-consistency/spec.md
Normal file
52
openspec/specs/polling-protect-consistency/spec.md
Normal file
@@ -0,0 +1,52 @@
|
||||
# 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** 任务直接跳过,不查询设备保护期
|
||||
Reference in New Issue
Block a user