docs(specs): 新增现场勘察业务相关 spec 文档
- rework-survey-equipment-tree:勘察设备树明细模式重构 - fix-equipment-topology-display:设备拓扑图完整显示修复 - survey-detail-building-select:勘察明细所属建筑下拉 - generate-floor-options-from-building:按建筑楼层生成楼层下拉 - survey-progress-track-detail:进度跟踪跳转勘察明细页 - survey-complete-to-tech-review:勘察完成提交技术复核与复核按钮改名
This commit is contained in:
1 parent
dff366a823
commit
7c915f8946
18 files changed
+553
No files matched your search
@@ -0,0 +1,8 @@
|
||||
# Checklist
|
||||
|
||||
- [x] 勘察明细页中间栏拓扑图 tree 系列已启用 `roam: true`,边距已压缩
|
||||
- [x] 台账详情弹窗拓扑图 tree 系列已启用 `roam: true`,边距已压缩,`.detail-topo-wrap` 高度已增大且空态高度同步
|
||||
- [x] 两处均保持 `initialTreeDepth: -1`(全展开)+ 原 label/symbol 配置不变
|
||||
- [x] `client` 编译通过(`npm run check`)
|
||||
- [x] 浏览器实测:工单 KC20261011001 下,两处拓扑图均可拖拽平移、滚轮缩放查看全部节点,无截断
|
||||
- [x] 无设备时台账详情拓扑区块空态显示正常(逻辑未改,高度同步)
|
||||
@@ -0,0 +1,33 @@
|
||||
# 设备拓扑图完整显示 Spec
|
||||
|
||||
## Why
|
||||
设备拓扑图(勘察明细页中间栏、台账详情弹窗「勘察明细拓扑图」)当前固定容器尺寸且未启用拖拽缩放,设备节点多时树形图超出容器,底部/右侧节点被截断,无法查看完整拓扑。
|
||||
|
||||
## What Changes
|
||||
- 台账详情弹窗「勘察明细拓扑图」(`views/dispatch/survey/index.vue`):ECharts tree 系列启用 `roam: true`(拖拽平移 + 滚轮缩放),全部节点可缩放查看;适当放大容器高度并压缩边距,减少初始截断
|
||||
- 勘察明细页中间栏设备拓扑图(`views/dispatch/survey/detail.vue`):ECharts tree 系列启用 `roam: true`;微调边距/容器高度,配合已有 ResizeObserver 自适应
|
||||
- 两处均保持 `initialTreeDepth: -1`(默认全展开),配合缩放查看全部层级
|
||||
|
||||
## Impact
|
||||
- Affected specs: 勘察派单重构(rework-survey-equipment-tree)交付的拓扑图展示能力
|
||||
- Affected code:
|
||||
- `client/src/views/dispatch/survey/detail.vue`(treeOption 系列配置 + 中间栏容器 CSS)
|
||||
- `client/src/views/dispatch/survey/index.vue`(renderDetailTopo 系列配置 + detail-topo-wrap CSS)
|
||||
|
||||
## ADDED Requirements
|
||||
### Requirement: 拓扑图可缩放查看全部节点
|
||||
两处设备拓扑图 SHALL 支持拖拽平移与缩放(`roam`),使设备树所有节点在超出容器时仍可完整查看。
|
||||
|
||||
#### Scenario: 设备节点多(3 级以上/大量同层节点)
|
||||
- **WHEN** 用户在勘察明细页或台账详情弹窗查看拓扑图,节点超出容器被截断
|
||||
- **THEN** 用户可通过拖拽平移、滚轮/按钮缩放查看全部节点,无节点被永久裁切
|
||||
|
||||
## MODIFIED Requirements
|
||||
### Requirement: 拓扑图容器与边距
|
||||
- 台账详情弹窗拓扑容器高度由 340px 适当增大;tree 系列 `top/left/bottom/right` 边距压缩,扩大有效绘制区
|
||||
- 勘察明细页中间栏拓扑图保持页面自适应,边距压缩以容纳更多节点
|
||||
|
||||
## REMOVED Requirements
|
||||
### Requirement: 无 —— 仅增强现有拓扑图交互与展示
|
||||
**Reason**: 无移除
|
||||
**Migration**: 无
|
||||
@@ -0,0 +1,21 @@
|
||||
# Tasks
|
||||
|
||||
## 前端拓扑图修复
|
||||
- [x] Task 1: 勘察明细页中间栏拓扑图支持缩放(`client/src/views/dispatch/survey/detail.vue`)
|
||||
- [x] 1.1 `treeOption` 中 tree 系列增加 `roam: true`(支持拖拽平移 + 滚轮缩放)
|
||||
- [x] 1.2 压缩系列边距:`right: '16%'` 缩至约 `'10%'`(`top/left/bottom` 视情况微调),扩大有效绘制区
|
||||
- [x] 1.3 保持 `initialTreeDepth: -1`(默认全展开)与现有 ResizeObserver 自适应逻辑不变
|
||||
- [x] Task 2: 台账详情弹窗拓扑图支持缩放(`client/src/views/dispatch/survey/index.vue`)
|
||||
- [x] 2.1 `renderDetailTopo` 中 tree 系列增加 `roam: true`
|
||||
- [x] 2.2 压缩系列边距:`right: '18%'` 缩至约 `'10%'`,`top/left/bottom` 视情况微调
|
||||
- [x] 2.3 `.detail-topo-wrap` 容器高度由 `340px` 增大至约 `440px`(弹窗内可容纳),空态 `.detail-topo-empty` 高度同步调整
|
||||
|
||||
## 验证
|
||||
- [x] Task 3: 编译 + 浏览器实测
|
||||
- [x] 3.1 `client` 编译通过(`npm run check`,vue-tsc)
|
||||
- [x] 3.2 浏览器实测:勘察明细页中间栏拓扑图可拖拽平移、滚轮缩放查看全部节点,无截断
|
||||
- [x] 3.3 浏览器实测:台账详情弹窗「勘察明细拓扑图」可拖拽缩放查看全部节点,无截断;空态逻辑未受影响
|
||||
|
||||
# Task Dependencies
|
||||
- Task 2 与 Task 1 相互独立,可并行修改
|
||||
- Task 3 依赖 Task 1、2
|
||||
@@ -0,0 +1,10 @@
|
||||
# Checklist
|
||||
|
||||
- [x] 勘察明细页右侧节点属性面板「所在楼层」为下拉,选项按所选建筑地上/地下层数生成(负N层/N层),未选建筑无选项并提示
|
||||
- [x] 勘察明细页新增/编辑设备弹窗「所在楼层」为下拉,行为同上
|
||||
- [x] 设备管理台账页「所在楼层」为下拉,行为同上
|
||||
- [x] 切换「所属建筑」时清空已选「所在楼层」(三处表单均生效)
|
||||
- [x] 建筑列表加载保留 `floorCount/floorDownCount`,楼层选项来自所选建筑的层数(非固定值)
|
||||
- [x] `floorNo` 存储值格式为 `-N`/`N`(与空间拓扑页一致)
|
||||
- [x] `client` 编译通过(`npm run check`)
|
||||
- [x] 浏览器实测:三处表单选择建筑后楼层选项正确(含地下层),切换建筑清空楼层,未选建筑无选项
|
||||
@@ -0,0 +1,69 @@
|
||||
# 勘察明细设备表单:所在位置改为所属建筑下拉 Spec
|
||||
|
||||
## Why
|
||||
|
||||
勘察明细页新增/编辑设备时,「所在位置」目前是自由文本输入,无法与客户建筑体系关联,与设备管理台账页的「所属建筑」下拉选择不一致。
|
||||
|
||||
## What Changes
|
||||
|
||||
* 勘察明细页(`views/dispatch/survey/detail.vue`)两处设备表单(①新增/编辑客户设备弹窗 equipForm;②右侧节点属性面板 nodeForm):
|
||||
|
||||
* 「所在位置」文本输入 → 「所属建筑」下拉选择(`buildingId`,按工单客户过滤建筑,可清空选填)
|
||||
|
||||
* 同时增加「所在楼层」输入(`floorNo`,文本,选填)
|
||||
|
||||
* 「具体位置」(`location`)保留为可选文本输入
|
||||
|
||||
* 建筑下拉数据源:`customerBuildingApi.getList({ customerId, page: 1, pageSize: 999 })`,在工单详情加载成功与设备树刷新时按工单客户加载
|
||||
|
||||
* 提交与回显:新增/编辑设备与保存节点属性时携带 `buildingId`/`floorNo`/`location`;编辑选中节点与打开编辑弹窗时回显
|
||||
|
||||
* 与设备管理台账页「位置信息」区块保持一致(所属建筑/所在楼层/具体位置三件套,均为选填)
|
||||
|
||||
## Impact
|
||||
|
||||
* Affected specs: 勘察派单重构(rework-survey-equipment-tree)交付的勘察明细页设备维护能力
|
||||
|
||||
* Affected code:
|
||||
|
||||
* `client/src/views/dispatch/survey/detail.vue`(两处表单模板 + equipForm/nodeForm 数据模型 + 提交/回显/加载逻辑)
|
||||
|
||||
* 不改动:后端 `customer_equipment.service.ts`(create/update 已透传 buildingId/floorNo)、`api/customerEquipment.ts`(类型已含 buildingId/floorNo/location)、设备管理台账页、空间拓扑页
|
||||
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: 设备表单按所属建筑选择位置
|
||||
|
||||
勘察明细页新增/编辑设备时,系统 SHALL 提供「所属建筑」下拉(按当前工单客户过滤建筑,可清空),并同时提供「所在楼层」与「具体位置」可选输入。
|
||||
|
||||
#### Scenario: 新增/编辑设备
|
||||
|
||||
* **WHEN** 用户在勘察明细页新增或编辑客户设备
|
||||
|
||||
* **THEN** 表单显示「所属建筑」下拉(选项为该客户的建筑)、「所在楼层」输入、「具体位置」输入,保存后设备携带 `buildingId`/`floorNo`/`location`,再次编辑时正确回显
|
||||
|
||||
## MODIFIED Requirements
|
||||
|
||||
### Requirement: 设备表单「所在位置」字段
|
||||
|
||||
* 原「所在位置」文本输入由「所属建筑」下拉 +「所在楼层」输入 +「具体位置」输入替代(两处表单均生效)
|
||||
|
||||
* `location` 数据保留可维护,「所属建筑」「所在楼层」为新增可维护字段
|
||||
|
||||
## REMOVED Requirements
|
||||
|
||||
### Requirement: 无 —— 仅调整勘察明细页设备表单的位置信息录入方式
|
||||
|
||||
**Reason**: 无移除
|
||||
**Migration**: 无
|
||||
|
||||
## 假设(已与用户确认)
|
||||
|
||||
* 两处表单都改(弹窗 + 右侧属性面板)
|
||||
|
||||
* 「具体位置」(location)保留为可选文本输入
|
||||
|
||||
* 同时增加「所在楼层」(floorNo)输入
|
||||
|
||||
* 所属建筑/所在楼层/具体位置均为选填(与设备管理台账页一致,必填仍为设备名称/类型)
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
# Tasks
|
||||
|
||||
## 勘察明细页(`client/src/views/dispatch/survey/detail.vue`,两处表单)
|
||||
- [x] Task 1: 楼层选项生成与表单改造
|
||||
- [x] 1.1 楼层选项工具:新增 `buildFloorOptions(building)`(地下 负N层=值 -N → 地上 N层=值 N,无建筑返回空数组),与空间拓扑页惯例一致
|
||||
- [x] 1.2 `loadBuildingOptions` 加载时保留完整建筑信息(新增 `buildingList: CustomerBuildingInfo[]` ref,供楼层计算使用;buildingOptions 仍映射 label/value)
|
||||
- [x] 1.3 新增两个 computed:`nodeFloorOptions`(按 `nodeForm.buildingId` 从 buildingList 匹配)与 `equipFloorOptions`(按 `equipForm.buildingId`)
|
||||
- [x] 1.4 模板两处「所在楼层」由 `a-input` 改为 `a-select`(`v-model` 绑定 `nodeForm.floorNo` / `equipForm.floorNo`,`:options` 对应 computed,`:not-found-content` 未选建筑时提示「请先选择所属建筑」,allow-clear)
|
||||
- [x] 1.5 两处「所属建筑」`a-select` 增加 `@change` 清空对应 `floorNo`(切换建筑重置楼层)
|
||||
|
||||
## 设备管理台账页(`client/src/views/device/equipment/index.vue`)
|
||||
- [x] Task 2: 楼层选项生成与表单改造
|
||||
- [x] 2.1 `loadBuildingOptions` 加载时保留完整建筑信息(`buildingList` ref);新增 `buildFloorOptions` 工具(与 Task 1 同规则)
|
||||
- [x] 2.2 新增 computed `floorOptions`(按 `formData.buildingId` 匹配)
|
||||
- [x] 2.3 模板「所在楼层」由 `a-input` 改为 `a-select`(绑定 `formData.floorNo`,`:options`,未选建筑提示「请先选择所属建筑」,allow-clear)
|
||||
- [x] 2.4 「所属建筑」`a-select` 增加 `@change` 清空 `formData.floorNo`(切换建筑重置楼层)
|
||||
|
||||
## 验证
|
||||
- [x] Task 3: 编译 + 浏览器实测
|
||||
- [x] 3.1 `client` 编译通过(`npm run check`,vue-tsc)
|
||||
- [x] 3.2 浏览器实测:勘察明细页与设备台账页选择「所属建筑」后,「所在楼层」下拉按该建筑地上/地下层数生成(如地上 3 层/地下 1 层 → 负1层、1层、2层、3层);切换建筑清空楼层;未选建筑无选项
|
||||
|
||||
# Task Dependencies
|
||||
- Task 1 与 Task 2 文件独立,可并行
|
||||
- Task 3 依赖 Task 1、2
|
||||
@@ -0,0 +1,34 @@
|
||||
# Checklist
|
||||
|
||||
## 数据层变更
|
||||
- [x] `customer_equipment` 迁移包含 `parent_id`(自引用)与索引,幂等可重跑
|
||||
- [x] `survey_detail` 迁移包含 `equip_id`(关联 customer_equipment)与索引
|
||||
- [x] `equip_type` 注释/文档/枚举包含「配电柜」
|
||||
- [x] `db_init.sql` 与 `系统设计/表结构新增及变更.md` 已同步
|
||||
|
||||
## 后端能力
|
||||
- [x] `customer_equipment` 实体含 `parentId`,`survey_detail` 实体含 `equipId`
|
||||
- [x] `GET /api/customer-equipments/tree` 返回按 parent_id 组装的嵌套树,权限过滤与 list 一致
|
||||
- [x] create/update 支持 `parentId` 且校验父设备同客户、非自身/子节点(防循环)
|
||||
- [x] `saveDetails` 接收 `equipId` 并校验设备属于工单客户;DTO 校验对齐
|
||||
- [x] 工单详情接口返回设备树数据(供拓扑图渲染)
|
||||
|
||||
## 前端:向导迁移与两步化
|
||||
- [x] 新建向导路由迁移至 `/customer/visit/survey/create`,旧 `/dispatch/survey/create` 移除
|
||||
- [x] 向导为 2 步(基本信息 / 指派电工与服务报酬),无「勘察明细」步骤,提交不含 details
|
||||
- [x] 台账页头无「发起勘察派单」按钮,访问 `/dispatch/survey?customerId=xx` 不再自动跳转
|
||||
- [x] 客户拜访「一键发起勘察派单」直跳新向导路由并预填客户
|
||||
- [x] 台账行操作「更多」含「勘察明细」菜单项,跳 `/dispatch/survey/:id/details`
|
||||
|
||||
## 前端:勘察明细页面与拓扑图
|
||||
- [x] `/dispatch/survey/:id/details` 页面:左侧设备树渲染正确(调 tree 接口)
|
||||
- [x] 支持新增/编辑/删除设备,父节点可选,类型含「配电柜」
|
||||
- [x] 设备节点照片/备注保存走 `saveDetails`(equipId + photos + remark)且成功后树/明细刷新
|
||||
- [x] 台账详情弹窗按拓扑图展示勘察明细(节点带照片/备注),无数据时空态
|
||||
- [x] 设备管理台账 `equipTypeOptions` 含「配电柜」,支持父设备选择
|
||||
|
||||
## 验证
|
||||
- [x] server 编译通过、client 构建通过
|
||||
- [x] 接口实测通过(tree、saveDetails、create 带 parentId)
|
||||
- [x] 浏览器端到端验证通过(发起派单 → 两步向导;台账明细页 → 设备树维护;详情拓扑图)
|
||||
- [x] 生产库迁移已应用(经确认后)
|
||||
@@ -0,0 +1,90 @@
|
||||
# 勘察派单重构:设备树形化 + 向导迁移 + 勘察明细页面 Spec
|
||||
|
||||
## Why
|
||||
现场勘察流程中,客户设备(`customer_equipment`)为扁平结构,无法表达配电层级(配电间→配电箱/井/柜);勘察明细(`survey_detail` 的建筑/楼层/房间)与客户设备树无关联,台账详情无法按拓扑直观展示。同时勘察派单入口分散(台账"发起勘察派单"按钮 + 客户拜访"一键发起勘察派单"),向导 3 步流程中的"勘察明细"步骤与新设备树维护职责重叠。
|
||||
|
||||
## What Changes
|
||||
- **BREAKING(表结构)**:`customer_equipment` 新增 `parent_id`(自引用树形,支持多级嵌套);设备类型枚举新增「配电柜」(现有:配电间/配电井/配电箱)。
|
||||
- **BREAKING(表结构)**:`survey_detail` 新增 `equip_id`(关联 `customer_equipment`),保留 `photos`/`remark` 并挂接到设备节点下;原 building/floor/room 字段保留为可空(兼容历史数据)。
|
||||
- 勘察派单向导迁至「项目管理 → 客户拜访」,路由 `/customer/visit/survey/create`;向导由 3 步改为 2 步(第1步 勘察基本信息与现场环境;第2步 指派电工与服务报酬),**取消原第2步「勘察明细」**。
|
||||
- 现场勘察派单台账(`/dispatch/survey`)移除「发起勘察派单」按钮及 `?customerId` 自动跳转逻辑;勘察派单仅能通过客户拜访的「一键发起勘察派单」进入。
|
||||
- 台账行操作「更多」新增「勘察明细」菜单项,打开新的勘察明细页面 `/dispatch/survey/:id/details`(参考「空间拓扑与用电架构」模式:左侧设备树 + 中间拓扑图 + 右侧节点属性),支持新增客户设备并按树形结构显示。
|
||||
- 台账「查看详情」弹窗增加按拓扑图(设备树 + 明细附件)形式展示勘察明细数据。
|
||||
|
||||
## Impact
|
||||
- Affected specs: 无(新建 change-id,不与既有 spec 冲突)
|
||||
- Affected code:
|
||||
- DB:`database/db_init.sql`、新增 `database/migrations/2026xxxx_survey_equipment_tree.sql`、`系统设计/表结构新增及变更.md`
|
||||
- 后端:`server/src/entity/customer_equipment.entity.ts`、`server/src/entity/survey_detail.entity.ts`、`server/src/service/customer_equipment.service.ts`、`server/src/controller/customer_equipment.controller.ts`、`server/src/service/survey_order.service.ts`、`server/src/dto/survey_order.dto.ts`
|
||||
- 前端:`client/src/router/index.ts`、`client/src/views/dispatch/survey/form.vue`、`client/src/views/dispatch/survey/index.vue`、`client/src/views/customer/visit/index.vue`、新增 `client/src/views/dispatch/survey/detail.vue`、`client/src/api/surveyOrder.ts`、`client/src/api/customerEquipment.ts`(如存在)、`client/src/views/device/equipment/index.vue`
|
||||
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: customer_equipment 树形结构
|
||||
系统 SHALL 为 `customer_equipment` 增加 `parent_id`(自引用,指向同表设备 id,支持多级嵌套),并提供按客户聚合的树接口。
|
||||
|
||||
#### Scenario: 获取客户设备树
|
||||
- **WHEN** 用户调用 `GET /api/customer-equipments/tree?customerId=xx`
|
||||
- **THEN** 返回该客户下按 parent_id 组装的嵌套树结构(根节点 parent_id 为空),数据权限过滤与现有 list 一致
|
||||
|
||||
#### Scenario: 新增子设备
|
||||
- **WHEN** 用户新建设备并指定 `parentId`
|
||||
- **THEN** 校验父设备存在、属于同一客户且非自身,创建成功后该设备挂到父节点下
|
||||
|
||||
### Requirement: 勘察明细关联设备
|
||||
系统 SHALL 让 `survey_detail` 通过 `equip_id` 关联 `customer_equipment`,明细照片与备注挂接到设备节点。
|
||||
|
||||
#### Scenario: 保存勘察明细
|
||||
- **WHEN** 用户调用 `PUT /api/survey-orders/:id/details`,明细含 `equipId`、`photos`、`remark`
|
||||
- **THEN** 校验工单状态、`equipId` 对应的设备属于该工单客户,随后全量替换该工单明细
|
||||
|
||||
### Requirement: 勘察明细页面(按拓扑模式)
|
||||
系统 SHALL 提供勘察明细页面 `/dispatch/survey/:id/details`,参考「空间拓扑与用电架构」:左侧设备树 + 中间拓扑图 + 右侧节点属性,可新增/编辑/删除客户设备并按树显示,设备类型含「配电柜」。
|
||||
|
||||
#### Scenario: 新增设备到树
|
||||
- **WHEN** 用户在勘察明细页新增设备(选择父节点、类型含配电柜)
|
||||
- **THEN** 调用 `customer_equipment` 创建接口写入设备,树即时刷新
|
||||
|
||||
#### Scenario: 维护明细附件
|
||||
- **WHEN** 用户为设备节点填写照片/备注并保存
|
||||
- **THEN** 调用 `saveDetails` 保存为 `survey_detail`(equip_id + photos + remark)
|
||||
|
||||
### Requirement: 台账详情拓扑图
|
||||
系统 SHALL 在台账「查看详情」中以拓扑图形式展示勘察明细数据(设备树 + 明细附件)。
|
||||
|
||||
#### Scenario: 查看工单详情
|
||||
- **WHEN** 用户在台账点击工单编号/查看详情
|
||||
- **THEN** 详情弹窗内渲染设备拓扑图,节点带明细照片与备注信息
|
||||
|
||||
## MODIFIED Requirements
|
||||
|
||||
### Requirement: 勘察派单向导(迁移 + 两步化)
|
||||
勘察派单向导 SHALL 从 `/dispatch/survey/create` 迁至 `/customer/visit/survey/create`(父级「客户拜访」,归属项目管理菜单),向导步骤由 3 步改为 2 步:第1步 勘察基本信息与现场环境、第2步 指派电工与服务报酬;原第2步「勘察明细」取消,创建/更新请求不再携带明细数据。
|
||||
|
||||
#### Scenario: 从客户拜访发起勘察派单
|
||||
- **WHEN** 客户拜访列表满足 `canSurvey` 的记录点击「一键发起勘察派单」
|
||||
- **THEN** 直接跳转 `/customer/visit/survey/create?customerId=xx`,向导预填客户
|
||||
|
||||
#### Scenario: 编辑既有工单
|
||||
- **WHEN** 台账行操作「编辑」打开向导
|
||||
- **THEN** 走 2 步向导(基本信息 + 电工报酬),不含勘察明细步骤
|
||||
|
||||
### Requirement: 台账入口收敛
|
||||
现场勘察派单台账 SHALL 移除「发起勘察派单」按钮与 `?customerId` 自动跳转;勘察派单仅能从客户拜访发起。行操作「更多」SHALL 新增「勘察明细」入口。
|
||||
|
||||
#### Scenario: 台账无新建入口
|
||||
- **WHEN** 用户打开现场勘察派单台账
|
||||
- **THEN** 页头无「发起勘察派单」按钮,访问 `/dispatch/survey?customerId=xx` 不再自动跳转新建
|
||||
|
||||
### Requirement: 设备类型枚举扩展
|
||||
`customer_equipment.equip_type` 取值 SHALL 包含 配电间/配电井/配电箱/配电柜;前端设备管理台账选项同步增加「配电柜」。
|
||||
|
||||
## REMOVED Requirements
|
||||
|
||||
### Requirement: 台账「发起勘察派单」按钮与自动跳转
|
||||
**Reason**: 勘察派单入口收敛至客户拜访,避免双入口不一致。
|
||||
**Migration**: 由客户拜访「一键发起勘察派单」承担新建入口(直跳新向导路由)。
|
||||
|
||||
### Requirement: 向导第2步「勘察明细」
|
||||
**Reason**: 勘察明细维护迁移至台账行操作「勘察明细」独立页面(按设备树维护),向导聚焦基本信息与电工指派。
|
||||
**Migration**: 明细维护通过台账「更多 → 勘察明细」进入新页面完成。
|
||||
@@ -0,0 +1,50 @@
|
||||
# Tasks
|
||||
|
||||
## 数据层变更
|
||||
- [x] Task 1: DB 表结构变更(树形化 + 配电柜 + 明细关联设备)
|
||||
- [x] 1.1 新增 `database/migrations/2026xxxx_survey_equipment_tree.sql`:`customer_equipment` 增 `parent_id BIGINT REFERENCES customer_equipment(id)` + 索引;`survey_detail` 增 `equip_id BIGINT REFERENCES customer_equipment(id)` + 索引;更新 `equip_type` 注释含「配电柜」;幂等可重跑
|
||||
- [x] 1.2 同步 `database/db_init.sql` 的建表语句与注释
|
||||
- [x] 1.3 更新 `server/src/entity/customer_equipment.entity.ts`(加 parentId 列)与 `server/src/entity/survey_detail.entity.ts`(加 equipId 列)
|
||||
- [x] 1.4 同步设计文档 `系统设计/表结构新增及变更.md`
|
||||
|
||||
## 后端能力
|
||||
- [x] Task 2: customer_equipment 树接口与父级校验
|
||||
- [x] 2.1 `customer_equipment.service.ts`:create/update 支持 `parentId`,校验父设备存在、同属客户、非自身/非子节点(防循环);新增 `tree(customerId)` 组装嵌套树,权限过滤与 list 一致
|
||||
- [x] 2.2 `customer_equipment.controller.ts`:注册 `GET /api/customer-equipments/tree`(置于 `/:id` 之前)
|
||||
- [x] Task 3: survey_detail 关联设备 + 详情返回设备树
|
||||
- [x] 3.1 `survey_order.service.ts` 的 `saveDetails` 接收 `equipId`,校验设备属于该工单客户,全量替换明细
|
||||
- [x] 3.2 详情接口返回时附带该工单的设备树数据(供拓扑图渲染)
|
||||
- [x] 3.3 `dto/survey_order.dto.ts` 增加/调整明细校验(equipId 必填、photos/remark 约束)
|
||||
|
||||
## 前端:向导迁移与两步化
|
||||
- [x] Task 4: 向导路由迁移 + 两步化 + 台账入口收敛(可并行,但依赖路由与表单同改)
|
||||
- [x] 4.1 `router/index.ts`:新增 `/customer/visit/survey/create`(meta 父级=客户拜访),移除 `/dispatch/survey/create`;保留 `/dispatch/survey/edit/:id`
|
||||
- [x] 4.2 `views/dispatch/survey/form.vue`:STEPS 改 2 步,删除第2步「勘察明细」区块与明细表单/`buildDetails`,提交不再携带 details
|
||||
- [x] 4.3 `views/customer/visit/index.vue`:`handleSurvey` 直跳 `/customer/visit/survey/create?customerId=xx`
|
||||
- [x] 4.4 `views/dispatch/survey/index.vue`:移除页头「发起勘察派单」按钮(handleAdd)与 onMounted 的 `?customerId` 自动跳转;行操作「更多」新增「勘察明细」菜单项(跳 `/dispatch/survey/:id/details`)
|
||||
|
||||
## 前端:勘察明细页面(新)
|
||||
- [x] Task 5: 新建勘察明细页 `views/dispatch/survey/detail.vue`(参考空间拓扑与用电架构模式)
|
||||
- [x] 5.1 左侧设备树:调用 `GET /customer-equipments/tree?customerId=` 渲染树
|
||||
- [x] 5.2 中间拓扑图 + 右侧节点属性:设备详情、照片/备注维护(保存走 `saveDetails(id, [{equipId, photos, remark}])`)
|
||||
- [x] 5.3 新增/编辑/删除设备:支持选择父节点、设备类型含「配电柜」;新增接口带 parentId
|
||||
- [x] 5.4 路由 `/dispatch/survey/:id/details` 注册;如缺 `api/customerEquipment.ts` 则补齐 tree/CRUD API
|
||||
- [x] Task 6: 台账详情拓扑图
|
||||
- [x] 6.1 `views/dispatch/survey/index.vue` 详情弹窗:新增拓扑图区块,按设备树渲染勘察明细(节点带照片/备注),无数据时给空态
|
||||
- [x] Task 7: 设备管理台账类型扩展
|
||||
- [x] 7.1 `views/device/equipment/index.vue`:`equipTypeOptions` 增加「配电柜」;设备新增/编辑表单支持选择父设备(parentId)
|
||||
|
||||
## 验证
|
||||
- [x] Task 8: 编译 + 接口 + 浏览器端到端验证
|
||||
- [x] 8.1 `server` 编译通过;`client` 构建通过
|
||||
- [x] 8.2 接口实测:tree 接口、带 equipId 的 saveDetails、create 带 parentId
|
||||
- [x] 8.3 浏览器验证:客户拜访发起派单直跳两步向导;台账无发起按钮、行内「勘察明细」进入新页并新增/维护设备;详情弹窗拓扑图正确显示
|
||||
- [x] 8.4 生产库应用迁移(经确认后)
|
||||
|
||||
# Task Dependencies
|
||||
- Task 2 依赖 Task 1(表结构/实体先行)
|
||||
- Task 3 依赖 Task 1(survey_detail 实体加列)
|
||||
- Task 4 依赖 Task 1(后端不动,可并行;路由与表单同批改动)
|
||||
- Task 5 依赖 Task 2、3(tree 接口、saveDetails equipId)
|
||||
- Task 6 依赖 Task 3(详情返回设备树)
|
||||
- Task 8 依赖全部 Task
|
||||
@@ -0,0 +1,10 @@
|
||||
# Checklist
|
||||
|
||||
- [x] 后端存在 `PUT /api/survey-orders/:id/complete` 接口,仅「现场勘察中(1)」工单可流转为「待技术复核(2)」,含可见性校验与审计日志
|
||||
- [x] `client/src/api/surveyOrder.ts` 提供 `complete(id)` 方法
|
||||
- [x] 勘察明细页头部出现「勘察完成」按钮,且仅「现场勘察中」状态显示
|
||||
- [x] 点击「勘察完成」确认后:先保存勘察明细 → 成功后调 complete → 工单变「待技术复核」→ 跳回台账页
|
||||
- [x] 台账主操作按钮文字由「审核测绘成果」改为「技术复核」且点击逻辑正常
|
||||
- [x] 复核弹窗标题由「审核测绘成果」改为「技术复核」
|
||||
- [x] `server` 编译通过
|
||||
- [x] `client` 编译通过(`npm run check`)
|
||||
@@ -0,0 +1,42 @@
|
||||
# 勘察完成提交技术复核 + 复核按钮改名 Spec
|
||||
|
||||
## Why
|
||||
现场勘察员完成勘察后缺少「勘察完成」操作,工单无法从「现场勘察中」流转到「待技术复核」;同时台账「审核测绘成果」按钮文案与复核语义不符,需统一为「技术复核」。
|
||||
|
||||
## What Changes
|
||||
- **后端**:新增勘察完成状态流转接口 `PUT /api/survey-orders/:id/complete`,将「现场勘察中(1)」工单流转为「待技术复核(2)」(仅此状态可流转;权限校验沿用现有可见性校验;写审计日志)
|
||||
- **前端 API**:`client/src/api/surveyOrder.ts` 新增 `complete(id)` 客户端方法
|
||||
- **勘察明细页**(`client/src/views/dispatch/survey/detail.vue`):头部操作区新增「勘察完成」按钮,仅「现场勘察中」状态显示;点击弹确认 → 先调用保存勘察明细逻辑 → 成功后再调用 complete 接口 → 跳回台账页
|
||||
- **台账页**(`client/src/views/dispatch/survey/index.vue`):「审核测绘成果」改为「技术复核」——主操作按钮文字(`primaryAction`)与复核弹窗标题同时修改
|
||||
- 状态枚举/标签不变(「待技术复核」标签已存在)
|
||||
|
||||
## Impact
|
||||
- Affected specs: 无(独立增量)
|
||||
- Affected code:
|
||||
- `server/src/controller/survey_order.controller.ts`
|
||||
- `server/src/service/survey_order.service.ts`
|
||||
- `client/src/api/surveyOrder.ts`
|
||||
- `client/src/views/dispatch/survey/detail.vue`
|
||||
- `client/src/views/dispatch/survey/index.vue`
|
||||
|
||||
## ADDED Requirements
|
||||
### Requirement: 勘察完成提交技术复核
|
||||
系统 SHALL 提供勘察明细页「勘察完成」操作:先保存当前勘察明细,再将工单状态由「现场勘察中(1)」变更为「待技术复核(2)」。
|
||||
|
||||
#### Scenario: Success case
|
||||
- **WHEN** 勘察明细页工单处于「现场勘察中」状态,用户点击「勘察完成」并确认
|
||||
- **THEN** 系统先保存当前勘察明细,成功后调用状态流转接口,工单变更为「待技术复核」,页面跳回台账页,台账该行主按钮显示「技术复核」
|
||||
|
||||
#### Scenario: 非勘察中状态
|
||||
- **WHEN** 工单处于待指派/待技术复核/已归档/已取消等状态
|
||||
- **THEN** 勘察明细页不显示「勘察完成」按钮
|
||||
|
||||
### Requirement: 复核按钮改名
|
||||
系统 SHALL 将台账「审核测绘成果」主操作按钮文字与复核弹窗标题统一改为「技术复核」。
|
||||
|
||||
## MODIFIED Requirements
|
||||
### Requirement: 勘察完成状态流转接口
|
||||
新增后端接口 `PUT /api/survey-orders/:id/complete`:仅「现场勘察中」状态可流转至「待技术复核」;无权限返回 403;工单不存在返回 404;状态不符返回 400;成功后写审计日志。
|
||||
|
||||
## REMOVED Requirements
|
||||
无。
|
||||
@@ -0,0 +1,29 @@
|
||||
# Tasks
|
||||
|
||||
## 后端状态流转接口
|
||||
- [x] Task 1: 新增「勘察完成」接口
|
||||
- [x] 1.1 `server/src/service/survey_order.service.ts` 新增 `complete(id, ctx)`:查工单 → 可见性校验(沿用 `isOrderVisible`)→ 仅 `STATUS.SURVEYING(1)` 可流转,将 `status` 更新为 `STATUS.PENDING_REVIEW(2)` → 返回 VO(`toVO` + `decorate`)→ 写审计日志(`logAction`,操作名「勘察派单」、动作「勘察完成」)
|
||||
- [x] 1.2 `server/src/controller/survey_order.controller.ts` 新增 `@Put("/:id/complete")` 路由(须在 `@Get("/:id")` 等动态路由声明之后追加,放在 review 旁即可)
|
||||
- [x] 1.3 `client/src/api/surveyOrder.ts` 新增 `complete(id: number) => request.put('/survey-orders/' + id + '/complete')`
|
||||
|
||||
## 勘察明细页按钮
|
||||
- [x] Task 2: detail.vue 新增「勘察完成」按钮
|
||||
- [x] 2.1 头部操作区(「保存勘察明细」旁)新增「勘察完成」按钮,仅 `order.status === SURVEY_STATUS.SURVEYING` 时显示,样式与「保存勘察明细」区分(如 dashed/带图标)
|
||||
- [x] 2.2 点击弹 `Modal.confirm`(标题如「确认勘察完成?」、说明「将保存当前勘察明细并提交技术复核」)→ 确认后先执行现有保存明细逻辑(复用 `handleSaveAll`)→ 保存成功后调用 `surveyOrderApi.complete(order.id)` → 成功 `message.success` 并 `router.push('/dispatch/survey')` 跳回台账页
|
||||
- [x] 2.3 校验:非「现场勘察中」状态不渲染该按钮;按钮加载态防重复提交
|
||||
|
||||
## 台账复核按钮改名
|
||||
- [x] Task 3: 「审核测绘成果」→「技术复核」
|
||||
- [x] 3.1 `index.vue` `primaryAction` 中 `{ label: '审核测绘成果' }` 改为 `{ label: '技术复核' }`
|
||||
- [x] 3.2 复核弹窗标题 `title="审核测绘成果"` 改为 `title="技术复核"`;`handlePrimary` 中 `action.label === '审核测绘成果'` 判断同步改为 `'技术复核'`
|
||||
|
||||
## 验证
|
||||
- [x] Task 4: 编译 + 接口/浏览器验证
|
||||
- [x] 4.1 `server` TypeScript 编译通过(npm run build 或 tsc,视项目脚本而定)
|
||||
- [x] 4.2 `client` 编译通过(`npm run check`,vue-tsc)
|
||||
- [x] 4.3 浏览器实测(可选,用现有数据不写库):勘察明细页「勘察完成」按钮仅勘察中状态显示、点击出现确认框;台账页「技术复核」按钮文字与弹窗标题正确
|
||||
|
||||
# Task Dependencies
|
||||
- Task 2 依赖 Task 1(complete 接口)
|
||||
- Task 3 独立于 Task 1/2
|
||||
- Task 4 依赖 Task 1、2、3
|
||||
@@ -0,0 +1,11 @@
|
||||
# Checklist
|
||||
|
||||
- [x] 右侧节点属性面板「设备信息」表单包含「所属建筑」下拉、「所在楼层」「具体位置」输入,无「所在位置」文本输入
|
||||
- [x] 新增/编辑客户设备弹窗表单同样包含「所属建筑」下拉、「所在楼层」「具体位置」输入
|
||||
- [x] 建筑下拉选项按工单客户过滤(`customerBuildingApi.getList({ customerId })`),可清空选填
|
||||
- [x] 新增/编辑设备提交 payload 携带 `buildingId`/`floorNo`/`location`
|
||||
- [x] 右侧面板保存节点属性 patch 携带 `buildingId`/`floorNo`,且建筑/楼层变更会触发更新(变更判断包含新字段)
|
||||
- [x] 编辑回显:选中节点与打开编辑弹窗时正确回显 `buildingId`/`floorNo`/`location`
|
||||
- [x] 必填校验不变(仍为设备名称/设备类型),所属建筑等位置字段选填
|
||||
- [x] `client` 编译通过(`npm run check`)
|
||||
- [x] 浏览器实测:勘察明细页新增/编辑设备完整流程正常,设备管理台账页不受影响
|
||||
@@ -0,0 +1,43 @@
|
||||
# 勘察明细设备表单:所在位置改为所属建筑下拉 Spec
|
||||
|
||||
## Why
|
||||
勘察明细页新增/编辑设备时,「所在位置」目前是自由文本输入,无法与客户建筑体系关联,与设备管理台账页的「所属建筑」下拉选择不一致。
|
||||
|
||||
## What Changes
|
||||
- 勘察明细页(`views/dispatch/survey/detail.vue`)两处设备表单(①新增/编辑客户设备弹窗 equipForm;②右侧节点属性面板 nodeForm):
|
||||
- 「所在位置」文本输入 → 「所属建筑」下拉选择(`buildingId`,按工单客户过滤建筑,可清空选填)
|
||||
- 同时增加「所在楼层」输入(`floorNo`,文本,选填)
|
||||
- 「具体位置」(`location`)保留为可选文本输入
|
||||
- 建筑下拉数据源:`customerBuildingApi.getList({ customerId, page: 1, pageSize: 999 })`,在工单详情加载成功与设备树刷新时按工单客户加载
|
||||
- 提交与回显:新增/编辑设备与保存节点属性时携带 `buildingId`/`floorNo`/`location`;编辑选中节点与打开编辑弹窗时回显
|
||||
- 与设备管理台账页「位置信息」区块保持一致(所属建筑/所在楼层/具体位置三件套,均为选填)
|
||||
|
||||
## Impact
|
||||
- Affected specs: 勘察派单重构(rework-survey-equipment-tree)交付的勘察明细页设备维护能力
|
||||
- Affected code:
|
||||
- `client/src/views/dispatch/survey/detail.vue`(两处表单模板 + equipForm/nodeForm 数据模型 + 提交/回显/加载逻辑)
|
||||
- 不改动:后端 `customer_equipment.service.ts`(create/update 已透传 buildingId/floorNo)、`api/customerEquipment.ts`(类型已含 buildingId/floorNo/location)、设备管理台账页、空间拓扑页
|
||||
|
||||
## ADDED Requirements
|
||||
### Requirement: 设备表单按所属建筑选择位置
|
||||
勘察明细页新增/编辑设备时,系统 SHALL 提供「所属建筑」下拉(按当前工单客户过滤建筑,可清空),并同时提供「所在楼层」与「具体位置」可选输入。
|
||||
|
||||
#### Scenario: 新增/编辑设备
|
||||
- **WHEN** 用户在勘察明细页新增或编辑客户设备
|
||||
- **THEN** 表单显示「所属建筑」下拉(选项为该客户的建筑)、「所在楼层」输入、「具体位置」输入,保存后设备携带 `buildingId`/`floorNo`/`location`,再次编辑时正确回显
|
||||
|
||||
## MODIFIED Requirements
|
||||
### Requirement: 设备表单「所在位置」字段
|
||||
- 原「所在位置」文本输入由「所属建筑」下拉 +「所在楼层」输入 +「具体位置」输入替代(两处表单均生效)
|
||||
- `location` 数据保留可维护,「所属建筑」「所在楼层」为新增可维护字段
|
||||
|
||||
## REMOVED Requirements
|
||||
### Requirement: 无 —— 仅调整勘察明细页设备表单的位置信息录入方式
|
||||
**Reason**: 无移除
|
||||
**Migration**: 无
|
||||
|
||||
## 假设(已与用户确认)
|
||||
- 两处表单都改(弹窗 + 右侧属性面板)
|
||||
- 「具体位置」(location)保留为可选文本输入
|
||||
- 同时增加「所在楼层」(floorNo)输入
|
||||
- 所属建筑/所在楼层/具体位置均为选填(与设备管理台账页一致,必填仍为设备名称/类型)
|
||||
@@ -0,0 +1,26 @@
|
||||
# Tasks
|
||||
|
||||
## 勘察明细页设备表单改造(同一文件 `client/src/views/dispatch/survey/detail.vue`,串行完成)
|
||||
- [x] Task 1: 两处表单模板 UI 改造
|
||||
- [x] 1.1 右侧节点属性面板「设备信息」表单(约 L167-169):将「所在位置」替换为「所属建筑」下拉(`a-select`,`buildingId`,allow-clear)+「所在楼层」输入(`floorNo`)+「具体位置」输入(`location`)
|
||||
- [x] 1.2 新增/编辑客户设备弹窗表单(约 L231-233):同样替换为「所属建筑」下拉 +「所在楼层」输入 +「具体位置」输入
|
||||
- [x] Task 2: 表单数据模型与提交/回显逻辑
|
||||
- [x] 2.1 `NodeForm`/`EquipForm` 接口与 `nodeForm`/`equipForm` 增加 `buildingId: number | null`、`floorNo: string` 字段
|
||||
- [x] 2.2 `handleAddEquip`/`handleEditEquip` 初始化与回显 `buildingId`/`floorNo`
|
||||
- [x] 2.3 `watch(selectedNode)` 回显 `buildingId`/`floorNo`/`location`
|
||||
- [x] 2.4 `handleEquipSubmit`:新增(`CustomerEquipmentCreateParams`)与编辑 payload 增加 `buildingId`/`floorNo`
|
||||
- [x] 2.5 `handleSaveNode`:patch 增加 `buildingId`/`floorNo`,并将变更判断条件加入 buildingId/floorNo 对比(否则修改建筑后不触发更新)
|
||||
- [x] Task 3: 建筑下拉数据加载
|
||||
- [x] 3.1 导入 `customerBuildingApi` 与 `CustomerBuildingInfo`;新增 `buildingOptions` ref(`{label: buildingName, value: id}`)与 `buildingLoading`
|
||||
- [x] 3.2 新增 `loadBuildingOptions(customerId)`:调 `customerBuildingApi.getList({ customerId, page: 1, pageSize: 999 })`
|
||||
- [x] 3.3 在 `loadOrder` 成功后与 `refreshTreeOnly` 时按 `order.value.customerId` 加载建筑选项(客户变更时刷新)
|
||||
|
||||
## 验证
|
||||
- [x] Task 4: 编译 + 浏览器实测
|
||||
- [x] 4.1 `client` 编译通过(`npm run check`,vue-tsc)
|
||||
- [x] 4.2 浏览器实测:勘察明细页新增设备弹窗与右侧节点面板均显示「所属建筑」下拉(选项为该客户建筑)、「所在楼层」「具体位置」输入;新增保存成功、右侧面板编辑回显正确;设备管理台账页不受影响
|
||||
|
||||
# Task Dependencies
|
||||
- Task 2 依赖 Task 1(表单字段先有,逻辑后挂)
|
||||
- Task 3 依赖 Task 1(下拉数据源就绪后加载)
|
||||
- Task 4 依赖 Task 1-3
|
||||
@@ -0,0 +1,7 @@
|
||||
# Checklist
|
||||
|
||||
- [x] 台账「进度跟踪」主操作按钮点击后跳转到勘察明细页(`DispatchSurveyDetail` / `/dispatch/survey/:id/details`),而非编辑勘察派单页
|
||||
- [x] 「更多 → 勘察明细」菜单行为不变(仍跳转 `DispatchSurveyDetail`)
|
||||
- [x] 「更多 → 编辑」菜单仍跳转编辑勘察派单(`DispatchSurveyEdit` / form.vue)
|
||||
- [x] 「进度跟踪」按钮仍仅「勘察中」(SURVEYING)状态显示
|
||||
- [x] `client` 编译通过(`npm run check`)
|
||||
@@ -0,0 +1,31 @@
|
||||
# 进度跟踪按钮改为打开勘察明细页 Spec
|
||||
|
||||
## Why
|
||||
现场勘察派单台账中,「进度跟踪」主操作按钮(仅「勘察中」状态显示)当前点击后跳转到「编辑勘察派单」(form.vue),与按钮的「进度跟踪」语义不符。期望点击后打开「勘察明细」页(detail.vue),便于现场跟进设备明细、拓扑与勘察进度。
|
||||
|
||||
## What Changes
|
||||
- 「进度跟踪」主操作按钮的跳转目标由 `DispatchSurveyEdit`(编辑勘察派单 form.vue)改为 `DispatchSurveyDetail`(勘察明细 detail.vue,路径 `/dispatch/survey/:id/details`),与「更多 → 勘察明细」一致
|
||||
- 「更多 → 编辑」菜单保持跳转 `DispatchSurveyEdit` 不变(编辑勘察派单入口保留)
|
||||
- 「进度跟踪」按钮的显示条件保持现状:仅「勘察中」(SURVEYING)状态显示,其他状态主按钮逻辑不变
|
||||
|
||||
## Impact
|
||||
- Affected specs: 无(独立小改动)
|
||||
- Affected code: `client/src/views/dispatch/survey/index.vue`
|
||||
|
||||
## ADDED Requirements
|
||||
### Requirement: 进度跟踪打开勘察明细
|
||||
系统 SHALL 在台账「进度跟踪」主操作按钮点击时跳转到该工单的「勘察明细」页面(detail.vue,完整编辑能力)。
|
||||
|
||||
#### Scenario: Success case
|
||||
- **WHEN** 台账中某「勘察中」工单行点击「进度跟踪」主操作按钮
|
||||
- **THEN** 整页跳转到 `/dispatch/survey/:id/details`,展示该工单勘察明细页(设备树/拓扑图/节点属性与勘察登记)
|
||||
|
||||
## MODIFIED Requirements
|
||||
### Requirement: 进度跟踪按钮跳转目标
|
||||
原「进度跟踪」点击跳转 `DispatchSurveyEdit`(编辑勘察派单),改为跳转 `DispatchSurveyDetail`(勘察明细)。
|
||||
|
||||
### Requirement: 编辑入口保持不变
|
||||
「更多 → 编辑」菜单点击仍跳转 `DispatchSurveyEdit`(编辑勘察派单),不受本次改动影响。
|
||||
|
||||
## REMOVED Requirements
|
||||
无。
|
||||
@@ -0,0 +1,14 @@
|
||||
# Tasks
|
||||
|
||||
## 台账按钮跳转改造(`client/src/views/dispatch/survey/index.vue`)
|
||||
- [x] Task 1: 「进度跟踪」跳转目标改为勘察明细页
|
||||
- [x] 1.1 `handlePrimary` 中「进度跟踪」分支由 `goDetail(record)`(跳 `DispatchSurveyEdit`)改为 `router.push({ name: 'DispatchSurveyDetail', params: { id: record.id } })`(与「更多 → 勘察明细」分支一致)
|
||||
- [x] 1.2 确认 `goDetail`(「更多 → 编辑」使用)保持跳 `DispatchSurveyEdit` 不变
|
||||
- [x] 1.3 确认「进度跟踪」显示条件保持仅「勘察中」(SURVEYING)状态
|
||||
|
||||
## 验证
|
||||
- [x] Task 2: 编译验证
|
||||
- [x] 2.1 `client` 编译通过(`npm run check`,vue-tsc)
|
||||
|
||||
# Task Dependencies
|
||||
- Task 2 依赖 Task 1
|
||||
Reference in new issue
Block a user