Parcourir la source

docs: 手动进出场操作页面设计文档

lq il y a 1 mois
Parent
commit
43864ca36f
1 fichiers modifiés avec 129 ajouts et 0 suppressions
  1. 129 0
      docs/superpowers/specs/2026-07-16-manual-entry-exit-design.md

+ 129 - 0
docs/superpowers/specs/2026-07-16-manual-entry-exit-design.md

@@ -0,0 +1,129 @@
+# 手动进出场操作页面 — 设计文档
+
+> 日期:2026-07-16 | 优先级:P0-2
+
+## 1. 目标
+
+为岗亭操作员提供手动进出场操作页面,作为 RFID 自动识别的备用兜底。当 UHF 标签损坏、无标签车辆进入、或 RFID 系统故障时,操作员手动输入车牌/RFID 完成进出场。
+
+## 2. 使用场景
+
+- **主要场景**:RFID 不可用时的备用操作(低频)
+- **用户**:管理员(888)、操作员(618)
+- **菜单位置**:停车管理 → 进出场操作
+
+## 3. 页面结构
+
+```
+进出场操作
+├── Tab:车辆进场 | 车辆出场
+│
+├── 输入区
+│   ├── 车牌号输入框
+│   ├── RFID 标签输入框
+│   └── 查询按钮
+│
+├── 车辆详情卡片(查询后显示)
+│   ├── 车牌号、车辆类型、车主名
+│   ├── 当前在场状态
+│   └── 进场/出场特有信息
+│
+└── 操作区
+    ├── 进场:停车场下拉选择 + 确认进场按钮
+    └── 出场:费用信息 + 收费方式 + 确认出场按钮
+```
+
+## 4. 进场流程
+
+```
+输入车牌/RFID → 查询车辆
+  ├─ 找到车辆 → 显示详情,检查是否已入场
+  │   ├─ 已入场 → 提示"该车辆已在场内"
+  │   └─ 未入场 → 选择停车场 → 确认进场
+  └─ 未找到 → 提示"未找到车辆,将按临时车入场"
+      └─ 选择停车场 → 确认进场
+
+确认进场 → POST /vehicle/entry
+  ├─ 成功 → 提示"入场成功",显示入场时间,清空表单
+  └─ 失败 → 提示错误原因
+```
+
+### 涉及 API
+
+| 接口 | 用途 |
+|------|------|
+| `GET /vehicle/get-by-plate?plate_number=` | 根据车牌查询车辆信息 |
+| `GET /parking/lot/list` | 获取停车场下拉列表 |
+| `POST /vehicle/entry` | 执行入场 |
+
+## 5. 出场流程
+
+```
+输入车牌/RFID → 查询车辆
+  ├─ 找到车辆 → 检查是否有未出场记录
+  │   ├─ 无未出场记录 → 提示"该车辆不在场内"
+  │   └─ 有未出场记录 → 显示计费信息
+  │       ├─ 进场时间
+  │       ├─ 停留时长
+  │       ├─ 费用金额
+  │       ├─ 收费方式选择(现金/扫码/免密,本次先做现金)
+  │       └─ 确认出场
+  └─ 未找到 → 提示"未找到车辆信息"
+
+确认出场 → POST /vehicle/exit
+  ├─ 成功 → 提示"出场成功",显示费用,清空表单
+  └─ 失败 → 提示错误原因
+```
+
+### 涉及 API
+
+| 接口 | 用途 |
+|------|------|
+| `GET /vehicle/get-by-plate?plate_number=` | 根据车牌查询车辆信息 |
+| `POST /vehicle/exit` | 执行出场(返回 fee、stayTime、entryTime、exitTime) |
+
+## 6. 技术实现
+
+### 前端
+
+| 项 | 说明 |
+|------|------|
+| 框架 | Vue 3 + Composition API |
+| 组件库 | Element Plus(el-tabs、el-form、el-input、el-select、el-button、el-descriptions) |
+| API 封装 | 复用 `src/api/vehicle.js` 已有的 `vehicleEntry`、`vehicleAppear`、`obtainVehicleLicense` |
+| 文件位置 | `frontend/src/view/parking/entryExit.vue` |
+| 路由 | 后端菜单表中新增记录,前端通过动态路由自动加载 |
+
+### 后端
+
+无需修改。已有 API 全部就绪:
+- `VehicleEntry` / `VehicleExit` handler 在 `internal/api/v1/vehicle/vehicle.go`
+- 计费逻辑在 `internal/service/vehicle/vehicle.go` 的 `calculateFee()`
+- `PassageService` 已抽取公共逻辑(`internal/service/parking/passage.go`)
+
+### 涉及文件变更
+
+| 文件 | 操作 | 说明 |
+|------|------|------|
+| `frontend/src/view/parking/entryExit.vue` | 新增 | 进出场操作页面 |
+| `frontend/src/api/vehicle.js` | 不改 | 已有 entry/exit API |
+| `internal/initialize/seed.go` | 修改 | 新增菜单记录 + Casbin 规则 |
+| 后端其他文件 | 不改 | API 已就绪 |
+
+## 7. 边界情况
+
+| 场景 | 处理方式 |
+|------|---------|
+| 输入为空时点查询 | 前端校验,至少填一个(车牌或 RFID) |
+| 车牌和 RFID 都填 | 优先用车牌号查询 |
+| 查到的车辆已进场 | 进场 Tab:提示"车辆已入场,请切换到出场";出场 Tab:正常显示费用 |
+| 查到的车辆不在场内 | 进场 Tab:允许入场;出场 Tab:提示"车辆不在场内" |
+| 车辆不存在(新临时车) | 进场 Tab:自动创建临时车记录后入场;出场 Tab:提示未找到 |
+| 未选停车场点确认进场 | 前端校验,提示"请选择停车场" |
+| API 调用失败 | 显示后端返回的错误信息 |
+
+## 8. 后续扩展预留
+
+- **关联 UHF 实时扫描**:页面预留"最近扫描"区域,显示 `DeviceManager` 推送的标签列表,点击自动填入
+- **收费方式**:当前写死现金,后续对接 P0-3 收费模块后,支持扫码/免密
+- **抓拍图片**:`VehicleEntry`/`VehicleExit` 已有 `EntryImage`/`ExitImage` 字段,页面后续可加拍照上传