fetch(modify):修改原来的bug
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 4m53s

This commit is contained in:
sexygoat
2026-01-31 11:18:37 +08:00
parent 8a1388608c
commit 31440b2904
62 changed files with 3025 additions and 1421 deletions

View File

@@ -15,18 +15,21 @@
新增企业设备授权管理功能,包括:
### 类型定义
- 新增 `src/types/api/enterpriseDevice.ts` 文件
- 定义设备列表项、查询参数、分页结果类型
- 定义授权/撤销请求和响应类型
-`src/types/api/index.ts` 中导出新类型
### API 服务层
- 扩展 `EnterpriseService` 类,新增3个方法:
- `allocateDevices(enterpriseId, data)` - POST 授权设备
- `getEnterpriseDevices(enterpriseId, params)` - GET 设备列表
- `recallDevices(enterpriseId, data)` - POST 撤销授权
### 视图层
- 新增 `src/views/asset-management/enterprise-devices/index.vue` 页面
- 实现设备列表展示 (表格、分页、搜索)
- 实现授权设备对话框 (支持批量输入设备号)
@@ -34,10 +37,12 @@
- 实现操作结果展示 (成功/失败统计)
### 路由配置
-`src/router/routesAlias.ts` 添加路由别名
-`src/router/routes/asyncRoutes.ts` 的资产管理模块下添加子路由
### 国际化
-`src/locales/langs/zh.json``en.json` 添加中英文翻译
- 包含菜单、表单、表格、对话框、提示消息等所有文案

View File

@@ -12,9 +12,8 @@
#### Scenario: 定义企业设备列表项类型
**Given** 需要展示企业设备列表
**When** 定义 `EnterpriseDeviceItem` 接口
**Then** 接口必须包含以下字段:
**Given** 需要展示企业设备列表 **When** 定义 `EnterpriseDeviceItem` 接口 **Then** 接口必须包含以下字段:
- `device_id: number` - 设备ID
- `device_no: string` - 设备号
- `device_name: string` - 设备名称
@@ -24,52 +23,49 @@
#### Scenario: 定义设备列表查询参数
**Given** 需要查询和搜索企业设备
**When** 定义 `EnterpriseDeviceListParams` 接口
**Then** 接口必须包含以下可选字段:
**Given** 需要查询和搜索企业设备 **When** 定义 `EnterpriseDeviceListParams` 接口 **Then** 接口必须包含以下可选字段:
- `page?: number` - 页码
- `page_size?: number` - 每页数量
- `device_no?: string` - 设备号模糊搜索
#### Scenario: 定义授权设备请求类型
**Given** 需要授权设备给企业
**When** 定义 `AllocateDevicesRequest` 接口
**Then** 接口必须包含:
**Given** 需要授权设备给企业 **When** 定义 `AllocateDevicesRequest` 接口 **Then** 接口必须包含:
- `device_nos: string[]` - 设备号列表 (nullable, 最多100个)
- `remark?: string` - 授权备注
#### Scenario: 定义授权设备响应类型
**Given** 授权操作需要返回详细结果
**When** 定义 `AllocateDevicesResponse` 接口
**Then** 接口必须包含:
**Given** 授权操作需要返回详细结果 **When** 定义 `AllocateDevicesResponse` 接口 **Then** 接口必须包含:
- `success_count: number` - 成功数量
- `fail_count: number` - 失败数量
- `authorized_devices: AuthorizedDeviceItem[]` - 已授权设备列表 (nullable)
- `failed_items: FailedDeviceItem[]` - 失败项列表 (nullable)
**And** `AuthorizedDeviceItem` 包含:
- `device_id: number` - 设备ID
- `device_no: string` - 设备号
- `card_count: number` - 绑定卡数量
**And** `FailedDeviceItem` 包含:
- `device_no: string` - 设备号
- `reason: string` - 失败原因
#### Scenario: 定义撤销授权请求类型
**Given** 需要撤销设备授权
**When** 定义 `RecallDevicesRequest` 接口
**Then** 接口必须包含:
**Given** 需要撤销设备授权 **When** 定义 `RecallDevicesRequest` 接口 **Then** 接口必须包含:
- `device_nos: string[]` - 设备号列表 (nullable, 最多100个)
#### Scenario: 定义撤销授权响应类型
**Given** 撤销操作需要返回结果统计
**When** 定义 `RecallDevicesResponse` 接口
**Then** 接口必须包含:
**Given** 撤销操作需要返回结果统计 **When** 定义 `RecallDevicesResponse` 接口 **Then** 接口必须包含:
- `success_count: number` - 成功数量
- `fail_count: number` - 失败数量
- `failed_items: FailedDeviceItem[]` - 失败项列表 (nullable)
@@ -82,28 +78,15 @@
#### Scenario: 授权设备给企业
**Given** 运营人员需要授权设备给企业客户
**When** 调用 `EnterpriseService.allocateDevices(enterpriseId, data)`
**Then** 必须发送 POST 请求到 `/api/admin/enterprises/{id}/allocate-devices`
**And** 请求体必须包含设备号列表和可选备注
**And** 返回授权结果,包含成功/失败统计和详细列表
**Given** 运营人员需要授权设备给企业客户 **When** 调用 `EnterpriseService.allocateDevices(enterpriseId, data)` **Then** 必须发送 POST 请求到 `/api/admin/enterprises/{id}/allocate-devices` **And** 请求体必须包含设备号列表和可选备注 **And** 返回授权结果,包含成功/失败统计和详细列表
#### Scenario: 获取企业设备列表
**Given** 需要查看企业的设备列表
**When** 调用 `EnterpriseService.getEnterpriseDevices(enterpriseId, params)`
**Then** 必须发送 GET 请求到 `/api/admin/enterprises/{id}/devices`
**And** 支持分页参数 (page, page_size)
**And** 支持设备号模糊搜索
**And** 返回设备列表和总数
**Given** 需要查看企业的设备列表 **When** 调用 `EnterpriseService.getEnterpriseDevices(enterpriseId, params)` **Then** 必须发送 GET 请求到 `/api/admin/enterprises/{id}/devices` **And** 支持分页参数 (page, page_size) **And** 支持设备号模糊搜索 **And** 返回设备列表和总数
#### Scenario: 撤销设备授权
**Given** 需要撤销企业的设备授权
**When** 调用 `EnterpriseService.recallDevices(enterpriseId, data)`
**Then** 必须发送 POST 请求到 `/api/admin/enterprises/{id}/recall-devices`
**And** 请求体必须包含设备号列表
**And** 返回撤销结果,包含成功/失败统计和失败原因
**Given** 需要撤销企业的设备授权 **When** 调用 `EnterpriseService.recallDevices(enterpriseId, data)` **Then** 必须发送 POST 请求到 `/api/admin/enterprises/{id}/recall-devices` **And** 请求体必须包含设备号列表 **And** 返回撤销结果,包含成功/失败统计和失败原因
---
@@ -113,10 +96,8 @@
#### Scenario: 显示企业设备列表
**Given** 用户访问企业设备列表页面
**When** 页面加载完成
**Then** 必须显示设备列表表格
**And** 表格必须包含以下列:
**Given** 用户访问企业设备列表页面 **When** 页面加载完成 **Then** 必须显示设备列表表格 **And** 表格必须包含以下列:
- 设备ID
- 设备号
- 设备名称
@@ -124,56 +105,32 @@
- 绑定卡数量
- 授权时间
**And** 必须支持分页功能
**And** 必须显示加载状态
**And** 必须支持分页功能 **And** 必须显示加载状态
#### Scenario: 搜索企业设备
**Given** 设备列表已加载
**When** 用户在搜索框输入设备号
**And** 点击搜索按钮
**Then** 必须根据设备号模糊查询设备
**And** 必须更新设备列表显示
**And** 必须重置到第一页
**Given** 设备列表已加载 **When** 用户在搜索框输入设备号 **And** 点击搜索按钮 **Then** 必须根据设备号模糊查询设备 **And** 必须更新设备列表显示 **And** 必须重置到第一页
#### Scenario: 授权设备对话框
**Given** 用户点击"授权设备"按钮
**When** 授权设备对话框打开
**Then** 必须显示设备号输入框 (textarea)
**And** 必须显示备注输入框 (可选)
**And** 必须提示支持的输入格式 (换行或逗号分隔)
**And** 必须提示最多100个设备号限制
**And** 必须有表单验证 (设备号必填)
**Given** 用户点击"授权设备"按钮 **When** 授权设备对话框打开 **Then** 必须显示设备号输入框 (textarea) **And** 必须显示备注输入框 (可选) **And** 必须提示支持的输入格式 (换行或逗号分隔) **And** 必须提示最多100个设备号限制 **And** 必须有表单验证 (设备号必填)
#### Scenario: 提交授权设备
**Given** 用户在对话框中输入了设备号列表
**When** 用户点击提交按钮
**Then** 必须解析设备号列表 (支持换行和逗号分隔)
**And** 必须去除空白字符和空行
**And** 必须验证设备号数量不超过100个
**And** 必须调用授权 API
**And** 必须显示加载状态
**And** 授权完成后必须展示结果:
**Given** 用户在对话框中输入了设备号列表 **When** 用户点击提交按钮 **Then** 必须解析设备号列表 (支持换行和逗号分隔) **And** 必须去除空白字符和空行 **And** 必须验证设备号数量不超过100个 **And** 必须调用授权 API **And** 必须显示加载状态 **And** 授权完成后必须展示结果:
- 成功数量
- 失败数量
- 失败设备列表及原因
**And** 如果有成功授权的设备,必须刷新设备列表
**And** 必须关闭对话框
**And** 如果有成功授权的设备,必须刷新设备列表 **And** 必须关闭对话框
#### Scenario: 撤销设备授权
**Given** 用户选中了要撤销的设备
**When** 用户点击"撤销授权"按钮
**Then** 必须显示二次确认对话框
**And** 确认对话框必须显示将要撤销的设备数量
**Given** 用户选中了要撤销的设备 **When** 用户点击"撤销授权"按钮 **Then** 必须显示二次确认对话框 **And** 确认对话框必须显示将要撤销的设备数量
**When** 用户确认撤销 **Then** 必须调用撤销 API **And** 必须显示加载状态 **And** 撤销完成后必须展示结果:
**When** 用户确认撤销
**Then** 必须调用撤销 API
**And** 必须显示加载状态
**And** 撤销完成后必须展示结果:
- 成功数量
- 失败数量
- 失败设备列表及原因
@@ -182,19 +139,11 @@
#### Scenario: 错误处理
**Given** API 调用可能失败
**When** API 返回错误
**Then** 必须显示友好的错误提示消息
**And** 必须在控制台记录错误详情
**And** 必须停止加载状态
**Given** API 调用可能失败 **When** API 返回错误 **Then** 必须显示友好的错误提示消息 **And** 必须在控制台记录错误详情 **And** 必须停止加载状态
#### Scenario: 分页切换
**Given** 设备列表超过一页
**When** 用户切换页码或每页数量
**Then** 必须保持当前的搜索条件
**And** 必须重新加载设备列表
**And** 必须显示加载状态
**Given** 设备列表超过一页 **When** 用户切换页码或每页数量 **Then** 必须保持当前的搜索条件 **And** 必须重新加载设备列表 **And** 必须显示加载状态
---
@@ -204,13 +153,8 @@
#### Scenario: 注册企业设备列表路由
**Given** 需要访问企业设备列表页面
**When** 配置路由
**Then** 必须在资产管理模块 (`/asset-management`) 下添加子路由
**And** 路由路径必须为 `enterprise-devices`
**And** 路由名称必须为 `EnterpriseDevices`
**And** 必须使用路由别名 `RoutesAlias.EnterpriseDevices`
**And** 必须配置 meta 信息:
**Given** 需要访问企业设备列表页面 **When** 配置路由 **Then** 必须在资产管理模块 (`/asset-management`) 下添加子路由 **And** 路由路径必须为 `enterprise-devices` **And** 路由名称必须为 `EnterpriseDevices` **And** 必须使用路由别名 `RoutesAlias.EnterpriseDevices` **And** 必须配置 meta 信息:
- `title: 'menus.assetManagement.enterpriseDevices'`
- `keepAlive: true`
@@ -222,9 +166,8 @@
#### Scenario: 中文翻译
**Given** 系统语言设置为中文
**When** 访问企业设备相关页面
**Then** 所有文本必须显示中文,包括:
**Given** 系统语言设置为中文 **When** 访问企业设备相关页面 **Then** 所有文本必须显示中文,包括:
- 菜单标题: "企业设备列表"
- 搜索表单标签和占位符
- 表格列名
@@ -234,9 +177,8 @@
#### Scenario: 英文翻译
**Given** 系统语言设置为英文
**When** 访问企业设备相关页面
**Then** 所有文本必须显示英文,包括:
**Given** 系统语言设置为英文 **When** 访问企业设备相关页面 **Then** 所有文本必须显示英文,包括:
- 菜单标题: "Enterprise Devices"
- 搜索表单标签和占位符
- 表格列名
@@ -252,37 +194,28 @@
#### Scenario: 批量输入设备号
**Given** 用户需要授权多个设备
**When** 在设备号输入框中输入
**Then** 必须支持以下输入方式:
**Given** 用户需要授权多个设备 **When** 在设备号输入框中输入 **Then** 必须支持以下输入方式:
- 每行一个设备号
- 逗号分隔的设备号
- 混合使用换行和逗号
**And** 系统必须能正确解析所有格式
**And** 必须自动去除首尾空白字符
**And** 必须过滤空行
**And** 系统必须能正确解析所有格式 **And** 必须自动去除首尾空白字符 **And** 必须过滤空行
#### Scenario: 操作结果展示
**Given** 批量操作完成
**When** 显示操作结果
**Then** 必须清晰展示:
**Given** 批量操作完成 **When** 显示操作结果 **Then** 必须清晰展示:
- 总共处理的数量
- 成功的数量
- 失败的数量
- 每个失败项的设备号和失败原因
**And** 如果全部成功,必须显示成功提示
**And** 如果部分失败,必须显示警告提示
**And** 如果全部失败,必须显示错误提示
**And** 如果全部成功,必须显示成功提示 **And** 如果部分失败,必须显示警告提示 **And** 如果全部失败,必须显示错误提示
#### Scenario: 表格列管理
**Given** 设备列表表格已显示
**When** 用户点击列管理按钮
**Then** 必须能够选择显示/隐藏的列
**And** 列配置必须被保存
**Given** 设备列表表格已显示 **When** 用户点击列管理按钮 **Then** 必须能够选择显示/隐藏的列 **And** 列配置必须被保存
## Related Specs

View File

@@ -9,6 +9,7 @@
### Phase 1: Type Definitions (Foundation)
1. **创建企业设备类型定义文件**
- 创建 `src/types/api/enterpriseDevice.ts`
- 定义 `EnterpriseDeviceItem` 接口 (设备列表项)
- 定义 `EnterpriseDeviceListParams` 接口 (查询参数)
@@ -38,6 +39,7 @@
### Phase 3: Internationalization
4. **添加中文翻译**
-`src/locales/langs/zh.json``menus.assetManagement` 下添加 `enterpriseDevices` 条目
-`src/locales/langs/zh.json` 添加 `enterpriseDevices` 模块的所有中文文案:
- 页面标题和搜索表单
@@ -55,6 +57,7 @@
### Phase 4: Routing
6. **添加路由别名**
-`src/router/routesAlias.ts` 添加 `EnterpriseDevices = '/asset-management/enterprise-devices'`
- **验证**: 确认导出正确
@@ -66,6 +69,7 @@
### Phase 5: UI Components
8. **创建企业设备列表页面**
- 创建 `src/views/asset-management/enterprise-devices/index.vue`
- 实现页面基础结构:
- 使用 `ArtTableFullScreen` 布局
@@ -75,6 +79,7 @@
- **验证**: 页面能正常渲染,无控制台错误
9. **实现设备列表查询功能**
- 实现 `loadDeviceList()` 方法调用 API
- 实现搜索和重置功能
- 实现分页功能
@@ -82,6 +87,7 @@
- **验证**: 能正确展示设备列表数据,分页工作正常
10. **实现授权设备对话框**
- 创建授权设备对话框
- 使用 `ElForm` + `ElInput` (textarea) 输入设备号列表
- 支持多行输入或逗号分隔
@@ -90,6 +96,7 @@
- **验证**: 对话框显示正常,表单验证工作
11. **实现授权设备提交逻辑**
- 实现 `handleAllocateDevices()` 方法
- 解析设备号列表 (处理换行和逗号分隔)
- 调用 `EnterpriseService.allocateDevices()` API
@@ -99,6 +106,7 @@
- **验证**: 能成功授权设备,正确处理部分成功/失败情况
12. **实现撤销授权对话框**
- 创建撤销授权对话框
- 使用表格多选模式选择要撤销的设备
- 或者使用输入框输入设备号列表
@@ -116,18 +124,21 @@
### Phase 6: Polish & Testing
14. **完善表格列配置**
- 配置表格列 (设备ID,设备号,设备名称,设备型号,绑定卡数量,授权时间)
- 实现列显示/隐藏功能
- 添加时间格式化
- **验证**: 表格数据展示完整美观
15. **添加错误处理**
- 为所有 API 调用添加 try-catch
- 添加友好的错误提示消息
- 处理网络错误和业务错误
- **验证**: 各种错误场景都有适当提示
16. **样式调整**
- 确保页面样式与系统其他页面一致
- 响应式布局适配
- 对话框尺寸和布局优化