Files
one-pipe-system/openspec/changes/add-phone-asset-unbind-management/tasks.md
2026-09-17 12:16:20 +08:00

6.8 KiB
Raw Blame History

1. Contract Confirmation

  • 1.1 以 docs/产品迭代8月份/手机号资产关联.md 为准:该接口只定义路径参数 id、无请求体,故 reason / confirmed 按 query 参数传递,不再另行确认。
  • 1.2 确认 GET /phone-asset-associations/unbind-imports 任务列表的筛选参数(分页/状态/时间?)与分页响应结构。
  • 1.3 确认新增菜单、页面的权限编码(建议 phone_asset:listphone_asset:unbindphone_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.tsFilePurpose 增加 phone_unbind_import,上传前校验扩展名为 .csv
  • 2.5 在 src/api/modules/index.tssrc/types/api/index.ts 导出新模块/类型。
  • 2.6 为 GET /api/admin/devicesGET /api/admin/iot-cards/standaloneGET /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 单条解绑弹窗必填原因1500带长度校验+ 勾选二次确认,缺一禁用提交;提交调用 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.28.7 已按静态代码核验勾选(实现已落地);联调如发现契约偏差再修正。