refactor(asset): 优化保养项目设计,使用折中方案
变更内容: 1. 删除 maintainItemId 字段(冗余,无实际作用) 2. 保留 maintainItem 字段(直接存储项目名称) 3. 新增接口:获取已使用的保养项目列表(去重) 4. 前端可使用该接口提供下拉提示,提升用户体验 5. 添加 maintainItem 字段的非空校验 设计思路: - 不引入保养项目字典表(避免过度设计) - 通过 DISTINCT 查询提供已使用项目列表 - 用户可以输入新项目,也可以从已有项目中选择 - 后续如需规范化,可平滑升级到字典表方案
This commit is contained in:
519
DEPLOYMENT_TEST_GUIDE.md
Normal file
519
DEPLOYMENT_TEST_GUIDE.md
Normal file
@@ -0,0 +1,519 @@
|
||||
# 停车场和车型参数模块 - 部署和测试指南
|
||||
|
||||
## 部署时间
|
||||
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;"
|
||||
```
|
||||
|
||||
### 方案 2:SSH 到服务器执行
|
||||
|
||||
#### 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
|
||||
**状态**: 待执行部署和测试
|
||||
Reference in New Issue
Block a user