6.8 KiB
6.8 KiB
1. Contract Confirmation
- 1.1 以
docs/产品迭代8月份/手机号资产关联.md为准:该接口只定义路径参数id、无请求体,故reason/confirmed按 query 参数传递,不再另行确认。 - 1.2 确认
GET /phone-asset-associations/unbind-imports任务列表的筛选参数(分页/状态/时间?)与分页响应结构。 - 1.3 确认新增菜单、页面的权限编码(建议
phone_asset:list、phone_asset:unbind、phone_asset:unbind_import,以后端菜单配置为准)。 - 1.4 确认关联列表页菜单位置与路由归属(资产管理下新增分组或独立入口)。
2. API And Types
- 2.1 新增
src/api/modules/phoneAsset.ts:关联列表、单条解绑、批量解绑、创建解绑导入任务、导入任务列表、导入任务详情。 - 2.2 新增
src/types/api/phoneAsset.ts:关联列表项/分页响应、单条解绑响应、批量解绑请求/逐项结果、导入任务列表项/详情/逐行结果(含associated_phones快照、行状态 3/4、任务状态 1-4)。 - 2.3 对齐统一响应结构
code/msg/timestamp/data与分页结构page/size/total/items。 - 2.4
src/api/modules/storage.ts的FilePurpose增加phone_unbind_import,上传前校验扩展名为.csv。 - 2.5 在
src/api/modules/index.ts、src/types/api/index.ts导出新模块/类型。 - 2.6 为
GET /api/admin/devices、GET /api/admin/iot-cards/standalone、GET /api/admin/assets/resolve/{identifier}的响应类型增加associated_phones: string[](无关联为空数组)。
3. Association List Page
- 3.1 在资产管理下新增「手机号资产关联」页面/路由/菜单(仅超管/平台可见)。
- 3.2 筛选区:资产标识(精确)、完整手机号(精确)、状态(0 已失效 / 1 有效)、创建时间区间;分页
page/page_size(默认 20,最大 100)。 - 3.3 表格列:资产类型/ID/标识、完整手机号、建立时间、建立来源(固定 H5 短信验证)、状态;已失效行展示失效时间/失效方式/失效原因。
- 3.4 提供模板下载与 CSV 导入入口(见第 5 节),列表行操作提供单条解绑按钮。
4. Unbind Operations
- 4.1 单条解绑弹窗:必填原因(1–500,带长度校验)+ 勾选二次确认,缺一禁用提交;提交调用
DELETE /phone-asset-associations/{id}。 - 4.2 批量解绑弹窗:支持勾选资产集合,前端按
(asset_type, asset_id)去重、上限 200 校验;请求体assets+reason+confirmed=true。 - 4.3 批量结果展示:成功数/失败数 + 逐项明细(资产标识/类型/成功与否/失败原因/解除关系数),部分成功不回滚;失败文案直接展示后端返回。
- 4.4 解绑按钮仅超管/平台可见,
v-permission接入,403 文案透传展示。
5. CSV Unbind Import Tasks
- 5.1 提供 CSV 模板下载:表头
资产标识,备注(备注可选),UTF-8(可带 BOM)。 - 5.2 上传流程:
StorageService.getUploadUrl({ purpose: 'phone_unbind_import' })→ PUT 直传 →file_key→ 创建任务(confirmed+ 任务级reason)。 - 5.3 创建任务页/弹窗:展示文件解析约定(UTF-8 可带 BOM,非 UTF-8 按 GBK 解码,无行数上限),提交后跳转/提示任务编号与初始状态。
- 5.4 「解绑导入任务」列表页:分页 + 状态筛选,展示任务编号、文件名、状态、成功/失败行数、总数、创建人、时间与任务级
unbind_reason。 - 5.5 任务详情页:任务级信息(含
error_message、统计)+ 逐行表格(行号、资产标识原文、定位资产类型/ID、行状态 3/4、失败原因、associated_phones快照、unbound_count);任务级失败时展示error_message且行表为空。 - 5.6 任务列表/详情仅超管/平台可见,按钮与入口受权限控制。
6. Existing Module Modification
- 6.1 设备列表页新增「关联手机号」列(
associated_phones,无关联显示「-」)。 - 6.2 IoT 单卡列表页新增「关联手机号」列(多号以「、」连接)。
- 6.3 资产详情(
assets/resolve)新增「关联手机号」字段展示。 - 6.4 确认卡/设备导出文件新列由后端模板生成,前端导出任务列表/详情无需改动。
7. Routing, Permissions And UX
- 7.1 新增路由、路由别名与菜单项,仅超管/平台账号可见。
- 7.2 所有新增页面/按钮接入
usePermission/v-permission,无权限不渲染,不依赖禁用态。 - 7.3 固定文案透传:「无权限操作该资源或资源不存在」「该手机号最多关联10项有效资产」「新手机号已存在与待迁移资产相同的有效关联,换绑已回滚」不前端拼接改写。
- 7.4 关联页不提供创建/补录入口。
- 7.5 操作失败提示稳定,不破坏列表渲染;上传/任务创建过程有 loading 与超时兜底。
8. Verification
- 8.1 类型检查通过(vue-tsc --noEmit,即 npm run build 的类型阶段),新增文件 eslint 通过。
- 8.2 关联列表:各筛选维度、分页、状态/失效信息展示正确。 — 已核验:关联列表筛选/分页/状态与失效信息列(searchFormItems + columnOptions + getTableData)均已实现
- 8.3 单条解绑:缺 reason/confirmed 被前端拦截;成功与失败文案正确。 — 已核验:unbindRules 必填 reason(1-500)+confirmed 校验,confirmUnbind 校验通过才提交,失败文案透传
- 8.4 批量解绑:去重、200 上限、逐项结果展示、部分成功不回滚提示正确。 — 已核验:buildUniqueAssets 按 (asset_type,asset_id) 去重并 slice(0,200),批次结果弹窗展示成功/失败/逐项
- 8.5 CSV 导入:模板下载、GBK/UTF-8 文件上传、任务创建/列表/详情逐行与手机号快照展示正确;任务级失败场景正确。 — 已核验:downloadTemplate 生成 BOM 模板、handleFileChange 限 .csv、getUploadUrl+PUT+createUnbindImport、任务列表/详情含 associated_phones 快照
- 8.6 设备/单卡/详情页关联手机号列展示正确(含空数组)。 — 已核验:device-list/index.vue:1898、iot-card-management/index.vue:2097、BasicInfoCard.vue:54 展示关联手机号,空数组显示 -
- 8.7 代理/企业/个人账号看不到任何入口;直达路由 403 文案透传。 — 已核验:路由 meta.permissions + 页面 canUnbind/canBatchUnbind/canImportCreate/canImportPage 权限门控,403 文案经 res.msg/normalizeApiError 原样透传
- 8.8 契约核对:任务列表参数/响应与
phone_unbind_import上传前缀均按文档实现;文档未定义项不再单独确认。
注:8.2–8.7 已按静态代码核验勾选(实现已落地);联调如发现契约偏差再修正。