refactor(asset): 优化保养项目设计,使用折中方案

变更内容:
1. 删除 maintainItemId 字段(冗余,无实际作用)
2. 保留 maintainItem 字段(直接存储项目名称)
3. 新增接口:获取已使用的保养项目列表(去重)
4. 前端可使用该接口提供下拉提示,提升用户体验
5. 添加 maintainItem 字段的非空校验

设计思路:
- 不引入保养项目字典表(避免过度设计)
- 通过 DISTINCT 查询提供已使用项目列表
- 用户可以输入新项目,也可以从已有项目中选择
- 后续如需规范化,可平滑升级到字典表方案
This commit is contained in:
k kfluous
2026-03-12 09:54:00 +08:00
parent eb9eaf3810
commit a2e2d5c27e
25 changed files with 4402 additions and 11 deletions

256
test-api.sh Executable file
View File

@@ -0,0 +1,256 @@
#!/bin/bash
# =============================================
# 停车场和车型参数模块 - API 测试脚本
# 创建时间: 2026-03-12
# =============================================
# 配置
BASE_URL="http://localhost:48080/admin-api"
TOKEN="YOUR_TOKEN_HERE" # 需要替换为实际的 token
# 颜色输出
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 测试计数
TOTAL_TESTS=0
PASSED_TESTS=0
FAILED_TESTS=0
# 测试函数
test_api() {
local test_name=$1
local method=$2
local url=$3
local data=$4
TOTAL_TESTS=$((TOTAL_TESTS + 1))
echo ""
echo "=========================================="
echo "测试 ${TOTAL_TESTS}: ${test_name}"
echo "=========================================="
if [ -z "$data" ]; then
response=$(curl -s -X ${method} "${BASE_URL}${url}" \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json")
else
response=$(curl -s -X ${method} "${BASE_URL}${url}" \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d "${data}")
fi
echo "响应: ${response}"
# 检查响应是否包含 "code":0
if echo "$response" | grep -q '"code":0'; then
echo -e "${GREEN}✅ 测试通过${NC}"
PASSED_TESTS=$((PASSED_TESTS + 1))
return 0
else
echo -e "${RED}❌ 测试失败${NC}"
FAILED_TESTS=$((FAILED_TESTS + 1))
return 1
fi
}
# 开始测试
echo "=========================================="
echo "开始 API 测试"
echo "=========================================="
echo "基础 URL: ${BASE_URL}"
echo "时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo ""
# ==========================================
# 停车场管理接口测试
# ==========================================
echo ""
echo "=========================================="
echo "一、停车场管理接口测试"
echo "=========================================="
# 测试 1创建停车场
test_api "创建停车场" "POST" "/asset/parking/create" '{
"name": "杭州停车场",
"principal": "张三",
"contactName": "李四",
"contactPhone": "13800138000",
"address": "浙江省杭州市西湖区",
"longitude": "120.123456",
"latitude": "30.123456",
"capacity": 100,
"parkedAmount": 0,
"stockArea": 1,
"unusualActionCity": 1,
"remark": "测试停车场"
}'
# 保存停车场 ID假设返回的 ID 为 1
PARKING_ID=1
# 测试 2获取停车场详情
test_api "获取停车场详情" "GET" "/asset/parking/get?id=${PARKING_ID}"
# 测试 3分页查询停车场
test_api "分页查询停车场" "GET" "/asset/parking/page?pageNo=1&pageSize=10"
# 测试 4获取停车场精简列表
test_api "获取停车场精简列表" "GET" "/asset/parking/simple-list"
# 测试 5更新停车场
test_api "更新停车场" "PUT" "/asset/parking/update" '{
"id": '${PARKING_ID}',
"name": "杭州停车场(已更新)",
"principal": "王五",
"contactName": "李四",
"contactPhone": "13800138000",
"address": "浙江省杭州市西湖区",
"longitude": "120.123456",
"latitude": "30.123456",
"capacity": 150,
"parkedAmount": 10,
"stockArea": 1,
"unusualActionCity": 1,
"remark": "测试停车场(已更新)"
}'
# ==========================================
# 车型参数管理接口测试
# ==========================================
echo ""
echo "=========================================="
echo "二、车型参数管理接口测试"
echo "=========================================="
# 测试 6创建车型参数带保养项目
test_api "创建车型参数(带保养项目)" "POST" "/asset/vehicle-model/create" '{
"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
}
]
}'
# 保存车型参数 ID假设返回的 ID 为 1
VEHICLE_MODEL_ID=1
# 测试 7获取车型参数详情含保养项目
test_api "获取车型参数详情(含保养项目)" "GET" "/asset/vehicle-model/get?id=${VEHICLE_MODEL_ID}"
# 测试 8分页查询车型参数
test_api "分页查询车型参数" "GET" "/asset/vehicle-model/page?pageNo=1&pageSize=10"
# 测试 9获取车型参数精简列表
test_api "获取车型参数精简列表" "GET" "/asset/vehicle-model/simple-list"
# 测试 10根据品牌查询车型参数
test_api "根据品牌查询车型参数" "GET" "/asset/vehicle-model/list-by-brand?brand=1"
# 测试 11根据车型查询车型参数
test_api "根据车型查询车型参数" "GET" "/asset/vehicle-model/list-by-model?model=1"
# 测试 12更新车型参数更新保养项目
test_api "更新车型参数(更新保养项目)" "PUT" "/asset/vehicle-model/update" '{
"id": '${VEHICLE_MODEL_ID}',
"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": 250.00,
"hourFee": 120.00,
"kilometerCycle": 5000,
"timeCycle": 6
}
]
}'
# ==========================================
# 清理测试数据(可选)
# ==========================================
echo ""
echo "=========================================="
echo "三、清理测试数据(可选)"
echo "=========================================="
# 测试 13删除车型参数
# test_api "删除车型参数" "DELETE" "/asset/vehicle-model/delete?id=${VEHICLE_MODEL_ID}"
# 测试 14删除停车场
# test_api "删除停车场" "DELETE" "/asset/parking/delete?id=${PARKING_ID}"
# ==========================================
# 测试总结
# ==========================================
echo ""
echo "=========================================="
echo "测试总结"
echo "=========================================="
echo "总测试数: ${TOTAL_TESTS}"
echo -e "${GREEN}通过: ${PASSED_TESTS}${NC}"
echo -e "${RED}失败: ${FAILED_TESTS}${NC}"
echo ""
if [ ${FAILED_TESTS} -eq 0 ]; then
echo -e "${GREEN}✅ 所有测试通过!${NC}"
exit 0
else
echo -e "${RED}❌ 有 ${FAILED_TESTS} 个测试失败${NC}"
exit 1
fi