e-scooter-rental-system/server/models/Order.js

70 lines
2.2 KiB
JavaScript

const mongoose = require('mongoose');
const orderSchema = new mongoose.Schema({
// 订单基本信息
orderNumber: { type: String, unique: true }, // 订单号(由 pre-save hook 自动生成)
customer: { type: mongoose.Schema.Types.ObjectId, ref: 'Customer', required: true }, // 客户
vehicle: { type: mongoose.Schema.Types.ObjectId, ref: 'Vehicle', required: true }, // 车辆
// 租赁信息
startDate: { type: Date, required: true }, // 开始日期
endDate: { type: Date, required: true }, // 结束日期
actualEndDate: { type: Date }, // 实际结束日期
// 费用信息
rentalFee: { type: Number, required: true }, // 租金
deposit: { type: Number, default: 0 }, // 押金
totalAmount: { type: Number, required: true }, // 总金额
paidAmount: { type: Number, default: 0 }, // 已支付金额
// 订单状态
status: {
type: String,
enum: ['待支付', '进行中', '已完成', '逾期', '已取消', '已退款'],
default: '待支付'
},
// 逾期信息
overdueDays: { type: Number, default: 0 }, // 逾期天数
overdueFee: { type: Number, default: 0 }, // 逾期费用
// 支付信息
paymentMethod: { type: String, enum: ['微信', '支付宝', '现金', '银行卡'] },
paymentDate: { type: Date },
// 门店关联
storeId: { type: String, index: true }, // 所属门店
// 合同信息
contractUrl: { type: String }, // 合同文件路径
contractSigned: { type: Boolean, default: false }, // 合同是否签署
// 备注
notes: { type: String },
// 时间戳
createdAt: { type: Date, default: Date.now },
updatedAt: { type: Date, default: Date.now }
});
// 更新时自动更新 updatedAt
orderSchema.pre('save', function(next) {
this.updatedAt = new Date();
next();
});
// 生成订单号
orderSchema.pre('save', function(next) {
if (!this.orderNumber) {
const date = new Date();
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const random = Math.floor(Math.random() * 10000).toString().padStart(4, '0');
this.orderNumber = `ORD${year}${month}${day}${random}`;
}
next();
});
module.exports = mongoose.model('Order', orderSchema);