fix: 套餐
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
# Design: 订单上传态与设备切卡模式调整
|
||||
|
||||
## Context
|
||||
|
||||
当前代码中已经存在订单创建弹窗、设备切卡模式弹窗和设备实时信息卡片,但实现和最新需求存在三个明显差异:
|
||||
|
||||
- 订单支付凭证上传采用异步上传对象存储的方式,但提交按钮仍固定显示 `提交`,没有把上传中的状态暴露给用户。
|
||||
- 设备切卡模式前端当前只提交 `switch_mode`,而最新接口要求同时提交 `iot_card_id`。
|
||||
- 设备实时信息当前展示了 `IP 地址`、`WAN IP`、`LAN IP` 等字段,最新需求只要求移除 `IP 地址` 这一项。
|
||||
|
||||
## Goals / Non-Goals
|
||||
|
||||
- Goals:
|
||||
- 让订单创建流程在支付凭证上传期间给出明确、不可误解的提交反馈
|
||||
- 让设备切卡模式请求与最新接口契约保持一致
|
||||
- 让设备实时信息展示符合最新页面要求
|
||||
- Non-Goals:
|
||||
- 不改造订单上传的后端流程或存储协议
|
||||
- 不改动切卡模式接口路径或 HTTP 方法
|
||||
- 不移除 `WAN IP`、`LAN IP`、`MAC 地址` 等其他实时信息字段
|
||||
|
||||
## Decisions
|
||||
|
||||
- Decision: 为订单创建弹窗引入独立的“凭证上传中”状态,而不是复用 `createLoading`
|
||||
- Rationale: `createLoading` 表示“正在创建订单”,`voucherUploading` 表示“正在上传图片”,两者语义不同,混用会导致按钮文案和禁用逻辑失真。
|
||||
|
||||
- Decision: 切卡模式弹窗改为同时收集 `iot_card_id` 与 `switch_mode`
|
||||
- Rationale: 最新接口契约要求请求体必须包含这两个字段,前端需要在提交前把选择结果显式建模。
|
||||
|
||||
- Decision: 设备未配置 IMEI 或没有任何绑定卡时,前端直接阻止提交
|
||||
- Rationale: 这是当前确认保留的前置条件,应该在界面层尽早反馈,而不是把失败留到接口返回后再处理。
|
||||
|
||||
- Decision: 设备列表页和资产信息页共用同一套切卡模式弹窗提交契约
|
||||
- Rationale: 两个入口都在执行相同的业务动作,统一参数结构和校验逻辑可以避免行为漂移。
|
||||
|
||||
- Decision: 只移除设备实时信息里的 `IP 地址` 字段,不影响 `WAN IP` 和 `LAN IP`
|
||||
- Rationale: 需求文本只点名删除 `IP 地址`,当前没有证据表明其他网络字段也需要一起隐藏。
|
||||
|
||||
## Risks / Trade-offs
|
||||
|
||||
- 订单弹窗在上传中被关闭、删除凭证或上传失败时,必须正确清理上传状态和 `payment_voucher_key`,否则容易残留脏状态。
|
||||
- 设备列表页与资产信息页使用的绑定卡数据结构不完全一致,实施时需要统一成弹窗可消费的数据结构。
|
||||
|
||||
## Migration Plan
|
||||
|
||||
1. 扩展设备切卡模式的请求类型与 API service 签名。
|
||||
2. 改造切卡模式弹窗,使其支持选择绑定卡并输出完整请求体。
|
||||
3. 改造设备列表页和资产信息页的调用逻辑,传入设备标识、IMEI 条件和绑定卡列表。
|
||||
4. 改造订单创建弹窗,在支付凭证上传中切换按钮文案与禁用状态。
|
||||
5. 删除设备实时信息卡片中的 `IP 地址` 展示项。
|
||||
|
||||
## Open Questions
|
||||
|
||||
- 暂无。若产品后续希望连同 `WAN IP` / `LAN IP` 一并隐藏,应另开变更明确说明。
|
||||
@@ -0,0 +1,46 @@
|
||||
# Change: 更新订单支付凭证上传反馈与设备切卡模式配置
|
||||
|
||||
## Why
|
||||
|
||||
当前订单创建和设备切卡相关交互与最新需求不一致:
|
||||
|
||||
- 创建订单时,支付凭证上传是异步过程,但提交按钮没有明确反映“图片上传中”状态,用户可能在文件仍在上传时误以为可以提交。
|
||||
- 设备切卡模式接口已经调整为必须同时提交 `iot_card_id` 与 `switch_mode`,并要求设备已配置 IMEI;当前前端只提交 `switch_mode`。
|
||||
- 设备实时信息区域当前仍展示 `IP 地址` 字段,和最新展示要求不一致。
|
||||
|
||||
这些差异会导致误操作、接口调用失败以及页面展示不符合产品预期。
|
||||
|
||||
## What Changes
|
||||
|
||||
- 更新订单创建弹窗的支付凭证上传反馈:
|
||||
- 凭证上传进行中时,提交按钮显示 `图片上传中...`
|
||||
- 上传完成前禁止提交订单
|
||||
- 上传结束后恢复正常提交状态
|
||||
- 更新设备切卡模式流程:
|
||||
- 切卡模式弹窗增加绑定卡选择
|
||||
- 提交时调用 `POST /api/admin/devices/by-identifier/{identifier}/switch-mode`
|
||||
- 请求体改为 `{ iot_card_id, switch_mode }`
|
||||
- 设备未配置 IMEI 时禁止执行切卡模式设置
|
||||
- 更新设备实时信息展示:
|
||||
- 删除“设备实时信息”中的 `IP 地址` 字段展示
|
||||
- 保留其他实时网络信息字段不变
|
||||
|
||||
## Impact
|
||||
|
||||
- Affected specs:
|
||||
- `order-management`
|
||||
- `device-management`
|
||||
- Affected code:
|
||||
- `src/views/order-management/order-list/index.vue`
|
||||
- `src/api/modules/device.ts`
|
||||
- `src/types/api/device.ts`
|
||||
- `src/views/asset-management/device-list/index.vue`
|
||||
- `src/views/asset-management/asset-information/index.vue`
|
||||
- `src/views/asset-management/asset-information/components/dialogs/SwitchModeDialog.vue`
|
||||
- `src/views/asset-management/asset-information/components/BasicInfoCard.vue`
|
||||
- `src/views/asset-management/asset-information/types.ts`
|
||||
- Dependencies:
|
||||
- 依赖现有订单创建流程和对象存储上传流程
|
||||
- 与活跃变更 `add-order-management` 存在同一能力域的补充关系,实施时需要一并核对
|
||||
- Breaking changes:
|
||||
- 前端 `DeviceService.setSwitchMode` 的调用签名将发生变化
|
||||
@@ -0,0 +1,43 @@
|
||||
# Device Management Specification
|
||||
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: Device Switch Mode Submission
|
||||
|
||||
The system SHALL require a bound IoT card when configuring device switch mode and MUST submit both `iot_card_id` and `switch_mode` to the switch mode API.
|
||||
|
||||
#### Scenario: Submit switch mode with selected bound card
|
||||
|
||||
- **GIVEN** 用户从设备列表页或资产信息页打开“设置切卡模式”弹窗
|
||||
- **AND** 目标设备已经配置 IMEI
|
||||
- **AND** 目标设备至少绑定了一张卡
|
||||
- **WHEN** 用户选择一张绑定卡并选择切卡模式后确认提交
|
||||
- **THEN** 系统 MUST 调用 `POST /api/admin/devices/by-identifier/{identifier}/switch-mode`
|
||||
- **AND** 请求体 MUST 包含 `iot_card_id`
|
||||
- **AND** 请求体 MUST 包含 `switch_mode`
|
||||
- **AND** 成功后系统 MUST 给出成功反馈并刷新相关设备数据
|
||||
|
||||
#### Scenario: Device without IMEI cannot submit switch mode
|
||||
|
||||
- **GIVEN** 用户尝试为一个未配置 IMEI 的设备设置切卡模式
|
||||
- **WHEN** 用户打开弹窗或尝试提交
|
||||
- **THEN** 系统 MUST 阻止提交
|
||||
- **AND** 系统 MUST 明确提示设备需要先配置 IMEI
|
||||
|
||||
#### Scenario: Device without bound card cannot submit switch mode
|
||||
|
||||
- **GIVEN** 目标设备没有任何绑定卡
|
||||
- **WHEN** 用户打开弹窗或尝试提交
|
||||
- **THEN** 系统 MUST 阻止提交
|
||||
- **AND** 系统 MUST 明确提示必须先选择或绑定一张卡
|
||||
|
||||
### Requirement: Device Realtime Information Visibility
|
||||
|
||||
The system SHALL hide the generic `IP 地址` field in device realtime information while preserving other required realtime network information.
|
||||
|
||||
#### Scenario: Device realtime information does not show the IP address field
|
||||
|
||||
- **GIVEN** 页面正在展示设备实时信息
|
||||
- **WHEN** 实时信息卡片完成渲染
|
||||
- **THEN** 界面 MUST NOT 显示标签为 `IP 地址` 的字段
|
||||
- **AND** `WAN IP` 与 `LAN IP` 等其他实时网络字段在有数据时 MUST 继续显示
|
||||
@@ -0,0 +1,31 @@
|
||||
# Order Management Specification
|
||||
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: Order Voucher Upload Feedback
|
||||
|
||||
The system SHALL make the payment voucher upload state explicit during order creation and MUST prevent submission until the upload finishes.
|
||||
|
||||
#### Scenario: Submit button reflects voucher upload in progress
|
||||
|
||||
- **GIVEN** 用户正在创建线下支付订单
|
||||
- **AND** 用户已经选择支付凭证图片
|
||||
- **WHEN** 前端正在获取上传地址或正在上传图片文件
|
||||
- **THEN** 提交按钮 MUST 显示 `图片上传中...`
|
||||
- **AND** 提交按钮 MUST 被禁用,或以其他方式阻止创建订单请求发出
|
||||
|
||||
#### Scenario: Submit button returns to normal after upload completes
|
||||
|
||||
- **GIVEN** 用户正在创建线下支付订单
|
||||
- **WHEN** 支付凭证上传成功完成
|
||||
- **THEN** 系统 MUST 保存返回的 `payment_voucher_key`
|
||||
- **AND** 提交按钮 MUST 恢复为 `提交`
|
||||
- **AND** 用户 MAY 继续提交订单
|
||||
|
||||
#### Scenario: Upload failure or removal clears pending submit state
|
||||
|
||||
- **GIVEN** 用户正在创建线下支付订单
|
||||
- **WHEN** 支付凭证上传失败,或用户移除了已选择的支付凭证
|
||||
- **THEN** 系统 MUST 清理失效的凭证状态
|
||||
- **AND** 上传中状态 MUST 结束
|
||||
- **AND** 系统 MUST 保持订单未提交
|
||||
@@ -0,0 +1,34 @@
|
||||
# Tasks: Update Order Upload And Device Switch Mode
|
||||
|
||||
## 1. Order Creation Upload State
|
||||
|
||||
- [x] 1.1 为订单创建弹窗增加独立的支付凭证上传中状态。
|
||||
- [x] 1.2 在支付凭证上传过程中将提交按钮文案切换为 `图片上传中...`。
|
||||
- [x] 1.3 在支付凭证上传完成前阻止订单提交。
|
||||
- [x] 1.4 在上传成功、上传失败、删除凭证和关闭弹窗时正确重置上传状态。
|
||||
|
||||
## 2. Device Switch Mode API Contract
|
||||
|
||||
- [x] 2.1 补充或更新切卡模式请求类型,显式包含 `iot_card_id` 和 `switch_mode`。
|
||||
- [x] 2.2 更新 `DeviceService.setSwitchMode()` 的调用签名和请求体。
|
||||
- [x] 2.3 保持路径参数 `{identifier}` 兼容虚拟号、IMEI 或 SN。
|
||||
|
||||
## 3. Device Switch Mode UI
|
||||
|
||||
- [x] 3.1 改造 `SwitchModeDialog.vue`,同时采集目标绑定卡和切卡模式。
|
||||
- [x] 3.2 展示设备当前可选的绑定卡作为切卡目标。
|
||||
- [x] 3.3 当设备未配置 IMEI 或没有绑定卡时,阻止提交并给出明确提示。
|
||||
- [x] 3.4 更新 `device-list` 与 `asset-information` 两个入口的弹窗入参和确认逻辑。
|
||||
- [x] 3.5 设置切卡模式成功后刷新相关设备数据。
|
||||
|
||||
## 4. Device Realtime Information Display
|
||||
|
||||
- [x] 4.1 删除设备实时信息卡片中的 `IP 地址` 字段展示。
|
||||
- [x] 4.2 保留 `WAN IP`、`LAN IP` 等其他实时网络信息字段不变。
|
||||
|
||||
## 5. Verification
|
||||
|
||||
- [ ] 5.1 验证线下支付场景下支付凭证上传成功、失败和删除时的按钮反馈。
|
||||
- [ ] 5.2 验证设备列表页和资产信息页两处切卡模式提交流程。
|
||||
- [ ] 5.3 验证切卡模式接口请求体符合 `{ iot_card_id, switch_mode }`。
|
||||
- [x] 5.4 运行 `openspec.cmd validate update-order-upload-and-device-switch-mode --strict`。
|
||||
Reference in New Issue
Block a user