# 停车场和车型参数模块 - 部署和测试指南

## 部署时间
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
**状态**: 待执行部署和测试
