Files
oneos-backend/DEPLOYMENT_TEST_GUIDE.md
k kfluous a2e2d5c27e refactor(asset): 优化保养项目设计,使用折中方案
变更内容:
1. 删除 maintainItemId 字段(冗余,无实际作用)
2. 保留 maintainItem 字段(直接存储项目名称)
3. 新增接口:获取已使用的保养项目列表(去重)
4. 前端可使用该接口提供下拉提示,提升用户体验
5. 添加 maintainItem 字段的非空校验

设计思路:
- 不引入保养项目字典表(避免过度设计)
- 通过 DISTINCT 查询提供已使用项目列表
- 用户可以输入新项目,也可以从已有项目中选择
- 后续如需规范化,可平滑升级到字典表方案
2026-03-12 09:54:00 +08:00

520 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 停车场和车型参数模块 - 部署和测试指南
## 部署时间
2026-03-12 01:26
## 一、数据库迁移
### 方案 1使用 MySQL 客户端(推荐)
#### 1.1 安装 MySQL 客户端
```bash
brew install mysql-client
```
#### 1.2 执行 SQL 脚本
```bash
cd /Users/kkfluous/Projects/ai-coding/ln-oneos/oneos-backend
mysql -h 47.103.115.36 -u root -pPassw0rd2026@ssl yudao_asset < sql/update-2026-03-12-停车场和车型参数模块.sql
```
#### 1.3 验证表结构
```bash
# 验证停车场表
mysql -h 47.103.115.36 -u root -pPassw0rd2026@ssl yudao_asset -e "DESC asset_parking;"
# 验证车型参数表
mysql -h 47.103.115.36 -u root -pPassw0rd2026@ssl yudao_asset -e "DESC asset_vehicle_model;"
# 验证车型维保项目关联表
mysql -h 47.103.115.36 -u root -pPassw0rd2026@ssl yudao_asset -e "DESC asset_vehicle_model_maintain_item;"
```
### 方案 2SSH 到服务器执行
#### 2.1 上传 SQL 文件
```bash
scp sql/update-2026-03-12-停车场和车型参数模块.sql root@47.103.115.36:/tmp/
```
#### 2.2 SSH 登录并执行
```bash
ssh root@47.103.115.36
# 执行 SQL
mysql -u root -pPassw0rd2026@ssl yudao_asset < /tmp/update-2026-03-12-停车场和车型参数模块.sql
# 验证
mysql -u root -pPassw0rd2026@ssl yudao_asset -e "SHOW TABLES LIKE 'asset_%';"
```
### 方案 3使用数据库管理工具
使用 Navicat、DBeaver、MySQL Workbench 等工具:
1. 连接到数据库47.103.115.36:3306
2. 选择数据库yudao_asset
3. 打开 SQL 文件:`sql/update-2026-03-12-停车场和车型参数模块.sql`
4. 执行 SQL
## 二、启动应用服务
### 2.1 打包应用
```bash
cd /Users/kkfluous/Projects/ai-coding/ln-oneos/oneos-backend
# 清理并打包
mvn clean package -DskipTests
# 查看打包结果
ls -lh yudao-server/target/*.jar
```
### 2.2 启动服务
```bash
# 方式 1使用 Maven 启动
cd yudao-server
mvn spring-boot:run
# 方式 2使用 JAR 启动
java -jar yudao-server/target/yudao-server-*.jar
# 方式 3指定配置文件启动
java -jar yudao-server/target/yudao-server-*.jar --spring.profiles.active=local
```
### 2.3 验证服务启动
```bash
# 检查服务是否启动
curl http://localhost:48080/actuator/health
# 查看 Swagger 文档
open http://localhost:48080/doc.html
```
## 三、API 测试用例
### 3.1 停车场管理接口测试
#### 测试 1创建停车场
```bash
curl -X POST http://localhost:48080/admin-api/asset/parking/create \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"name": "杭州停车场",
"principal": "张三",
"contactName": "李四",
"contactPhone": "13800138000",
"address": "浙江省杭州市西湖区",
"longitude": "120.123456",
"latitude": "30.123456",
"capacity": 100,
"parkedAmount": 0,
"stockArea": 1,
"unusualActionCity": 1,
"remark": "测试停车场"
}'
```
**预期结果**:
```json
{
"code": 0,
"data": 1,
"msg": "操作成功"
}
```
#### 测试 2获取停车场详情
```bash
curl -X GET "http://localhost:48080/admin-api/asset/parking/get?id=1" \
-H "Authorization: Bearer YOUR_TOKEN"
```
**预期结果**:
```json
{
"code": 0,
"data": {
"id": 1,
"name": "杭州停车场",
"principal": "张三",
"contactName": "李四",
"contactPhone": "13800138000",
"address": "浙江省杭州市西湖区",
"longitude": "120.123456",
"latitude": "30.123456",
"capacity": 100,
"parkedAmount": 0,
"stockArea": 1,
"unusualActionCity": 1,
"remark": "测试停车场",
"createTime": "2026-03-12T01:30:00"
}
}
```
#### 测试 3分页查询停车场
```bash
curl -X GET "http://localhost:48080/admin-api/asset/parking/page?pageNo=1&pageSize=10" \
-H "Authorization: Bearer YOUR_TOKEN"
```
#### 测试 4更新停车场
```bash
curl -X PUT http://localhost:48080/admin-api/asset/parking/update \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"id": 1,
"name": "杭州停车场(已更新)",
"principal": "王五",
"contactName": "李四",
"contactPhone": "13800138000",
"address": "浙江省杭州市西湖区",
"longitude": "120.123456",
"latitude": "30.123456",
"capacity": 150,
"parkedAmount": 10,
"stockArea": 1,
"unusualActionCity": 1,
"remark": "测试停车场(已更新)"
}'
```
#### 测试 5删除停车场
```bash
curl -X DELETE "http://localhost:48080/admin-api/asset/parking/delete?id=1" \
-H "Authorization: Bearer YOUR_TOKEN"
```
### 3.2 车型参数管理接口测试
#### 测试 1创建车型参数带保养项目
```bash
curl -X POST http://localhost:48080/admin-api/asset/vehicle-model/create \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"brand": 1,
"model": 1,
"modelCode": "HFC1043K1",
"modelName": "江淮骏铃V6",
"noticeModel": "HFC1043K1R8T",
"hydrogenUnit": 1,
"hydrogenCapacity": 165,
"electricityMileage": 300,
"reserveElectricity": 80.00,
"hydrogenMileage": 400,
"fuelType": 1,
"tireSize": "225/70R19.5",
"tireNumber": 6,
"truckSize": "5995×2100×2850",
"onlineSpreadEnterprise": "上海重塑",
"batteryFactory": "宁德时代",
"refrigeratorFactory": "开山",
"maintainItems": [
{
"maintainItem": "更换机油",
"maintainContent": "更换机油、机滤",
"materialsExpenses": 200.00,
"hourFee": 100.00,
"kilometerCycle": 5000,
"timeCycle": 6
},
{
"maintainItem": "更换空滤",
"maintainContent": "更换空气滤芯",
"materialsExpenses": 50.00,
"hourFee": 50.00,
"kilometerCycle": 10000,
"timeCycle": 12
}
]
}'
```
**预期结果**:
```json
{
"code": 0,
"data": 1,
"msg": "操作成功"
}
```
#### 测试 2获取车型参数详情含保养项目
```bash
curl -X GET "http://localhost:48080/admin-api/asset/vehicle-model/get?id=1" \
-H "Authorization: Bearer YOUR_TOKEN"
```
**预期结果**:
```json
{
"code": 0,
"data": {
"id": 1,
"brand": 1,
"model": 1,
"modelCode": "HFC1043K1",
"modelName": "江淮骏铃V6",
"noticeModel": "HFC1043K1R8T",
"hydrogenUnit": 1,
"hydrogenCapacity": 165,
"electricityMileage": 300,
"reserveElectricity": 80.00,
"hydrogenMileage": 400,
"fuelType": 1,
"tireSize": "225/70R19.5",
"tireNumber": 6,
"truckSize": "5995×2100×2850",
"onlineSpreadEnterprise": "上海重塑",
"batteryFactory": "宁德时代",
"refrigeratorFactory": "开山",
"maintainItems": [
{
"id": 1,
"maintainItem": "更换机油",
"maintainContent": "更换机油、机滤",
"materialsExpenses": 200.00,
"hourFee": 100.00,
"kilometerCycle": 5000,
"timeCycle": 6
},
{
"id": 2,
"maintainItem": "更换空滤",
"maintainContent": "更换空气滤芯",
"materialsExpenses": 50.00,
"hourFee": 50.00,
"kilometerCycle": 10000,
"timeCycle": 12
}
],
"createTime": "2026-03-12T01:30:00"
}
}
```
#### 测试 3分页查询车型参数
```bash
curl -X GET "http://localhost:48080/admin-api/asset/vehicle-model/page?pageNo=1&pageSize=10" \
-H "Authorization: Bearer YOUR_TOKEN"
```
#### 测试 4精简列表用于下拉框
```bash
curl -X GET "http://localhost:48080/admin-api/asset/vehicle-model/simple-list" \
-H "Authorization: Bearer YOUR_TOKEN"
```
**预期结果**:
```json
{
"code": 0,
"data": [
{
"id": 1,
"modelName": "江淮骏铃V6",
"brand": 1,
"model": 1
}
]
}
```
#### 测试 5根据品牌查询车型参数
```bash
curl -X GET "http://localhost:48080/admin-api/asset/vehicle-model/list-by-brand?brand=1" \
-H "Authorization: Bearer YOUR_TOKEN"
```
#### 测试 6根据车型查询车型参数
```bash
curl -X GET "http://localhost:48080/admin-api/asset/vehicle-model/list-by-model?model=1" \
-H "Authorization: Bearer YOUR_TOKEN"
```
#### 测试 7更新车型参数更新保养项目
```bash
curl -X PUT http://localhost:48080/admin-api/asset/vehicle-model/update \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"id": 1,
"brand": 1,
"model": 1,
"modelCode": "HFC1043K1",
"modelName": "江淮骏铃V6已更新",
"noticeModel": "HFC1043K1R8T",
"hydrogenCapacity": 165,
"reserveElectricity": 80.00,
"fuelType": 1,
"maintainItems": [
{
"maintainItem": "更换机油",
"maintainContent": "更换机油、机滤、空滤",
"materialsExpenses": 250.00,
"hourFee": 120.00,
"kilometerCycle": 5000,
"timeCycle": 6
}
]
}'
```
#### 测试 8删除车型参数
```bash
curl -X DELETE "http://localhost:48080/admin-api/asset/vehicle-model/delete?id=1" \
-H "Authorization: Bearer YOUR_TOKEN"
```
## 四、使用 Postman 测试
### 4.1 导入 Postman Collection
创建 Postman Collection包含以下请求
**环境变量**:
- `base_url`: http://localhost:48080
- `token`: YOUR_ACCESS_TOKEN
**请求列表**:
1. 停车场 - 创建
2. 停车场 - 获取详情
3. 停车场 - 分页查询
4. 停车场 - 更新
5. 停车场 - 删除
6. 车型参数 - 创建(带保养项目)
7. 车型参数 - 获取详情
8. 车型参数 - 分页查询
9. 车型参数 - 精简列表
10. 车型参数 - 按品牌查询
11. 车型参数 - 按车型查询
12. 车型参数 - 更新
13. 车型参数 - 删除
### 4.2 测试流程
1. **获取 Token**
- 登录系统获取访问令牌
- 设置环境变量 `token`
2. **停车场测试**
- 创建 → 获取详情 → 更新 → 分页查询 → 删除
3. **车型参数测试**
- 创建(带保养项目)→ 获取详情(验证保养项目)→ 更新(修改保养项目)→ 删除
## 五、验收标准
### 5.1 数据库层面
- [ ] 停车场表包含所有新字段
- [ ] 车型参数表创建成功
- [ ] 车型维保项目关联表创建成功
- [ ] 索引创建正确
### 5.2 功能层面
- [ ] 停车场 CRUD 功能正常
- [ ] 停车场新字段保存和查询正常
- [ ] 车型参数 CRUD 功能正常
- [ ] 保养项目随车型参数一起保存
- [ ] 保养项目随车型参数一起查询
- [ ] 保养项目随车型参数一起更新
- [ ] 保养项目随车型参数一起删除
### 5.3 接口层面
- [ ] 所有接口返回正确
- [ ] 参数校验正常
- [ ] 错误提示友好
- [ ] Swagger 文档正常显示
### 5.4 数据一致性
- [ ] 创建车型时保养项目正确保存
- [ ] 更新车型时保养项目正确更新
- [ ] 删除车型时保养项目级联删除
- [ ] 事务回滚正常
## 六、常见问题
### 6.1 数据库连接失败
**问题**: 无法连接到数据库
**解决**:
- 检查数据库地址和端口
- 检查用户名和密码
- 检查防火墙设置
### 6.2 表已存在错误
**问题**: `Table 'asset_vehicle_model' already exists`
**解决**:
- 检查表是否已创建
- 如需重新创建,先删除表:`DROP TABLE IF EXISTS asset_vehicle_model;`
### 6.3 字段已存在错误
**问题**: `Duplicate column name 'principal'`
**解决**:
- 检查字段是否已添加
- 跳过已存在的字段
### 6.4 权限不足
**问题**: 接口返回 403 Forbidden
**解决**:
- 检查是否已登录
- 检查 Token 是否有效
- 检查用户是否有相应权限
## 七、测试报告模板
```markdown
# 测试报告
## 测试环境
- 数据库: 47.103.115.36:3306
- 应用服务: localhost:48080
- 测试时间: 2026-03-12
## 测试结果
### 停车场模块
- [ ] 创建停车场 - 通过/失败
- [ ] 获取停车场详情 - 通过/失败
- [ ] 分页查询停车场 - 通过/失败
- [ ] 更新停车场 - 通过/失败
- [ ] 删除停车场 - 通过/失败
### 车型参数模块
- [ ] 创建车型参数 - 通过/失败
- [ ] 获取车型参数详情 - 通过/失败
- [ ] 分页查询车型参数 - 通过/失败
- [ ] 精简列表 - 通过/失败
- [ ] 按品牌查询 - 通过/失败
- [ ] 按车型查询 - 通过/失败
- [ ] 更新车型参数 - 通过/失败
- [ ] 删除车型参数 - 通过/失败
### 保养项目功能
- [ ] 创建车型时保存保养项目 - 通过/失败
- [ ] 查询车型时返回保养项目 - 通过/失败
- [ ] 更新车型时更新保养项目 - 通过/失败
- [ ] 删除车型时删除保养项目 - 通过/失败
## 问题记录
1. 问题描述
2. 重现步骤
3. 预期结果
4. 实际结果
5. 解决方案
## 总结
- 测试通过率: X%
- 发现问题数: X
- 已解决问题数: X
```
---
**文档创建时间**: 2026-03-12 01:26
**状态**: 待执行部署和测试