# 数据库设计文档 ## 数据库: MongoDB ## 集合: vehicles, orders, customers --- ## 1. 车辆集合 (vehicles) ### 字段说明 | 字段名 | 类型 | 必填 | 说明 | |--------|------|------|------| | vehicleId | String | ✅ | 车架号/车辆编号 (唯一) | | model | String | ✅ | 车型 | | brand | String | ✅ | 品牌 | | color | String | ❌ | 颜色 | | batteryType | String | ❌ | 电池类型 | | batteryCapacity | Number | ❌ | 电池容量 (Ah) | | batteryStatus | String | ❌ | 电池状态: 正常/老化/待更换 | | status | String | ✅ | 车辆状态: 空闲/在租/维修中/已报废/待回收 | | location | Object | ❌ | GPS位置 {type, coordinates} | | lastLocationUpdate | Date | ❌ | 最后位置更新时间 | | currentOrderId | ObjectId | ❌ | 当前订单ID (关联orders) | | totalRentDays | Number | ❌ | 累计租赁天数 | | lastMaintenanceDate | Date | ❌ | 最后保养日期 | | nextMaintenanceDate | Date | ❌ | 下次保养日期 | | maintenanceHistory | Array | ❌ | 维修历史记录 | | purchaseDate | Date | ❌ | 购买日期 | | purchasePrice | Number | ❌ | 购买价格 | | purchaseSupplier | String | ❌ | 供应商 | | notes | String | ❌ | 备注 | | createdAt | Date | ✅ | 创建时间 | | updatedAt | Date | ✅ | 更新时间 | ### 索引 - vehicleId: 唯一索引 - location: 2dsphere 索引 (用于地理查询) --- ## 2. 订单集合 (orders) ### 字段说明 | 字段名 | 类型 | 必填 | 说明 | |--------|------|------|------| | orderNumber | String | ✅ | 订单号 (唯一) | | customer | ObjectId | ✅ | 客户ID (关联customers) | | vehicle | ObjectId | ✅ | 车辆ID (关联vehicles) | | startDate | Date | ✅ | 开始日期 | | endDate | Date | ✅ | 结束日期 | | actualEndDate | Date | ❌ | 实际结束日期 | | rentalFee | Number | ✅ | 租金 (元/天) | | deposit | Number | ❌ | 押金 | | totalAmount | Number | ✅ | 总金额 | | paidAmount | Number | ❌ | 已支付金额 | | status | String | ✅ | 订单状态: 待支付/进行中/已完成/逾期/已取消/已退款 | | overdueDays | Number | ❌ | 逾期天数 | | overdueFee | Number | ❌ | 逾期费用 | | paymentMethod | String | ❌ | 支付方式: 微信/支付宝/现金/银行卡 | | paymentDate | Date | ❌ | 支付日期 | | contractUrl | String | ❌ | 合同文件路径 | | contractSigned | Boolean | ❌ | 合同是否签署 | | notes | String | ❌ | 备注 | | createdAt | Date | ✅ | 创建时间 | | updatedAt | Date | ✅ | 更新时间 | ### 索引 - orderNumber: 唯一索引 - customer: 普通索引 - vehicle: 普通索引 - status: 普通索引 - endDate: 普通索引 (用于查询逾期订单) --- ## 3. 客户集合 (customers) ### 字段说明 | 字段名 | 类型 | 必填 | 说明 | |--------|------|------|------| | customerId | String | ✅ | 客户编号 (唯一) | | name | String | ✅ | 姓名 | | phone | String | ✅ | 手机号 | | idCard | String | ❌ | 身份证号 | | address | String | ❌ | 地址 | | email | String | ❌ | 邮箱 | | totalRentals | Number | ❌ | 总租赁次数 | | totalSpent | Number | ❌ | 总消费金额 | | currentRentals | Number | ❌ | 当前租赁数量 | | creditScore | Number | ❌ | 信用评分 (0-100) | | creditLevel | String | ❌ | 信用等级: 优秀/良好/一般/较差 | | accountStatus | String | ✅ | 账户状态: 正常/冻结/注销 | | notes | String | ❌ | 备注 | | createdAt | Date | ✅ | 创建时间 | | updatedAt | Date | ✅ | 更新时间 | ### 索引 - customerId: 唯一索引 - phone: 唯一索引 - name: 普通索引 (用于搜索) --- ## 4. 关系说明 ### 车辆 ↔ 订单 - 一辆车同一时间只能有一个进行中的订单 - 车辆状态会随订单状态变化 ### 客户 ↔ 订单 - 一个客户可以有多个订单 - 客户的租赁次数和消费金额会随订单更新 ### 订单 ↔ 车辆/客户 - 订单必须关联一辆车和一个客户 - 订单完成后,车辆状态变为空闲 --- ## 5. 数据验证规则 ### 车辆 - vehicleId 必须唯一 - status 必须在预定义枚举中 - location 必须是有效的经纬度坐标 ### 订单 - orderNumber 必须唯一 - startDate 必须早于 endDate - rentalFee 必须大于 0 - status 必须在预定义枚举中 ### 客户 - customerId 必须唯一 - phone 必须唯一 - creditScore 必须在 0-100 之间 - creditLevel 由 creditScore 自动计算