272 lines
8.2 KiB
JavaScript
272 lines
8.2 KiB
JavaScript
/**
|
||
* 生成产品管理和订单管理测试数据
|
||
* @file generate-test-data.js
|
||
* @description 为产品和订单模块生成测试数据并插入数据库
|
||
*/
|
||
|
||
const { sequelize } = require('./config/database-simple');
|
||
const { Product, Order, OrderItem, User } = require('./models');
|
||
|
||
// 产品测试数据
|
||
const productData = [
|
||
{
|
||
name: '有机苹果',
|
||
description: '新鲜有机苹果,来自山东烟台,口感甜脆,营养丰富',
|
||
price: 1200, // 12.00元,以分为单位
|
||
stock: 500,
|
||
image_url: '/images/products/apple.jpg',
|
||
is_active: true
|
||
},
|
||
{
|
||
name: '优质大米',
|
||
description: '东北优质大米,粒粒饱满,口感香甜,5kg装',
|
||
price: 3500, // 35.00元
|
||
stock: 200,
|
||
image_url: '/images/products/rice.jpg',
|
||
is_active: true
|
||
},
|
||
{
|
||
name: '新鲜鸡蛋',
|
||
description: '农场散养鸡蛋,30枚装,营养价值高',
|
||
price: 2800, // 28.00元
|
||
stock: 150,
|
||
image_url: '/images/products/eggs.jpg',
|
||
is_active: true
|
||
},
|
||
{
|
||
name: '有机蔬菜礼盒',
|
||
description: '精选有机蔬菜组合,包含白菜、萝卜、青菜等',
|
||
price: 4500, // 45.00元
|
||
stock: 80,
|
||
image_url: '/images/products/vegetable-box.jpg',
|
||
is_active: true
|
||
},
|
||
{
|
||
name: '纯天然蜂蜜',
|
||
description: '纯天然野花蜜,500g装,无添加剂',
|
||
price: 6800, // 68.00元
|
||
stock: 120,
|
||
image_url: '/images/products/honey.jpg',
|
||
is_active: true
|
||
},
|
||
{
|
||
name: '有机牛奶',
|
||
description: '有机牧场牛奶,1L装,营养丰富',
|
||
price: 1800, // 18.00元
|
||
stock: 300,
|
||
image_url: '/images/products/milk.jpg',
|
||
is_active: true
|
||
},
|
||
{
|
||
name: '农家土鸡',
|
||
description: '农家散养土鸡,约2kg,肉质鲜美',
|
||
price: 8500, // 85.00元
|
||
stock: 50,
|
||
image_url: '/images/products/chicken.jpg',
|
||
is_active: true
|
||
},
|
||
{
|
||
name: '新鲜玉米',
|
||
description: '甜玉米,10根装,口感甜嫩',
|
||
price: 1500, // 15.00元
|
||
stock: 200,
|
||
image_url: '/images/products/corn.jpg',
|
||
is_active: true
|
||
},
|
||
{
|
||
name: '有机胡萝卜',
|
||
description: '有机胡萝卜,2kg装,营养丰富',
|
||
price: 1200, // 12.00元
|
||
stock: 180,
|
||
image_url: '/images/products/carrot.jpg',
|
||
is_active: true
|
||
},
|
||
{
|
||
name: '精品茶叶',
|
||
description: '高山绿茶,250g装,香气清雅',
|
||
price: 12800, // 128.00元
|
||
stock: 60,
|
||
image_url: '/images/products/tea.jpg',
|
||
is_active: true
|
||
}
|
||
];
|
||
|
||
// 生成随机订单数据的辅助函数
|
||
function generateRandomOrders(users, products, orderCount = 20) {
|
||
const orders = [];
|
||
const orderStatuses = ['pending', 'processing', 'shipped', 'delivered', 'cancelled'];
|
||
const paymentStatuses = ['unpaid', 'paid', 'refunded'];
|
||
const addresses = [
|
||
'北京市朝阳区建国路88号',
|
||
'上海市浦东新区陆家嘴环路1000号',
|
||
'广州市天河区珠江新城花城大道123号',
|
||
'深圳市南山区科技园南区456号',
|
||
'杭州市西湖区文三路789号',
|
||
'成都市锦江区春熙路321号',
|
||
'武汉市江汉区中山大道654号',
|
||
'西安市雁塔区高新路987号'
|
||
];
|
||
|
||
for (let i = 0; i < orderCount; i++) {
|
||
const user = users[Math.floor(Math.random() * users.length)];
|
||
const status = orderStatuses[Math.floor(Math.random() * orderStatuses.length)];
|
||
const paymentStatus = paymentStatuses[Math.floor(Math.random() * paymentStatuses.length)];
|
||
const address = addresses[Math.floor(Math.random() * addresses.length)];
|
||
|
||
// 创建订单基本信息
|
||
const order = {
|
||
user_id: user.id,
|
||
total_amount: 0, // 稍后计算
|
||
status: status,
|
||
payment_status: paymentStatus,
|
||
shipping_address: address,
|
||
created_at: new Date(Date.now() - Math.random() * 30 * 24 * 60 * 60 * 1000) // 最近30天内的随机时间
|
||
};
|
||
|
||
// 为每个订单生成1-5个订单项
|
||
const itemCount = Math.floor(Math.random() * 5) + 1;
|
||
const orderItems = [];
|
||
let totalAmount = 0;
|
||
|
||
for (let j = 0; j < itemCount; j++) {
|
||
const product = products[Math.floor(Math.random() * products.length)];
|
||
const quantity = Math.floor(Math.random() * 3) + 1; // 1-3个
|
||
const price = product.price;
|
||
|
||
orderItems.push({
|
||
product_id: product.id,
|
||
quantity: quantity,
|
||
price: price
|
||
});
|
||
|
||
totalAmount += price * quantity;
|
||
}
|
||
|
||
order.total_amount = totalAmount;
|
||
order.items = orderItems;
|
||
orders.push(order);
|
||
}
|
||
|
||
return orders;
|
||
}
|
||
|
||
// 主函数:生成并插入测试数据
|
||
async function generateTestData() {
|
||
try {
|
||
console.log('开始生成测试数据...');
|
||
|
||
// 连接数据库
|
||
await sequelize.authenticate();
|
||
console.log('数据库连接成功');
|
||
|
||
// 获取现有用户
|
||
const users = await User.findAll();
|
||
if (users.length === 0) {
|
||
console.log('警告:数据库中没有用户数据,请先创建用户');
|
||
return;
|
||
}
|
||
console.log(`找到 ${users.length} 个用户`);
|
||
|
||
// 清理现有的测试数据(可选)
|
||
console.log('清理现有测试数据...');
|
||
await OrderItem.destroy({ where: {} });
|
||
await Order.destroy({ where: {} });
|
||
await Product.destroy({ where: {} });
|
||
console.log('清理完成');
|
||
|
||
// 插入产品数据
|
||
console.log('插入产品数据...');
|
||
const createdProducts = await Product.bulkCreate(productData);
|
||
console.log(`成功插入 ${createdProducts.length} 个产品`);
|
||
|
||
// 生成订单数据
|
||
console.log('生成订单数据...');
|
||
const orderData = generateRandomOrders(users, createdProducts, 25);
|
||
|
||
// 使用事务插入订单和订单项
|
||
console.log('插入订单和订单项数据...');
|
||
let orderCount = 0;
|
||
let orderItemCount = 0;
|
||
|
||
for (const orderInfo of orderData) {
|
||
await sequelize.transaction(async (t) => {
|
||
// 创建订单
|
||
const order = await Order.create({
|
||
user_id: orderInfo.user_id,
|
||
total_amount: orderInfo.total_amount,
|
||
status: orderInfo.status,
|
||
payment_status: orderInfo.payment_status,
|
||
shipping_address: orderInfo.shipping_address,
|
||
created_at: orderInfo.created_at
|
||
}, { transaction: t });
|
||
|
||
// 创建订单项
|
||
const orderItems = orderInfo.items.map(item => ({
|
||
order_id: order.id,
|
||
product_id: item.product_id,
|
||
quantity: item.quantity,
|
||
price: item.price
|
||
}));
|
||
|
||
await OrderItem.bulkCreate(orderItems, { transaction: t });
|
||
|
||
orderCount++;
|
||
orderItemCount += orderItems.length;
|
||
});
|
||
}
|
||
|
||
console.log(`成功插入 ${orderCount} 个订单`);
|
||
console.log(`成功插入 ${orderItemCount} 个订单项`);
|
||
|
||
// 显示统计信息
|
||
console.log('\n=== 数据统计 ===');
|
||
const productCount = await Product.count();
|
||
const totalOrderCount = await Order.count();
|
||
const totalOrderItemCount = await OrderItem.count();
|
||
|
||
console.log(`产品总数: ${productCount}`);
|
||
console.log(`订单总数: ${totalOrderCount}`);
|
||
console.log(`订单项总数: ${totalOrderItemCount}`);
|
||
|
||
// 显示一些示例数据
|
||
console.log('\n=== 示例产品 ===');
|
||
const sampleProducts = await Product.findAll({ limit: 3 });
|
||
sampleProducts.forEach(product => {
|
||
console.log(`${product.name} - ¥${(product.price / 100).toFixed(2)} - 库存: ${product.stock}`);
|
||
});
|
||
|
||
console.log('\n=== 示例订单 ===');
|
||
const sampleOrders = await Order.findAll({
|
||
limit: 3,
|
||
include: [
|
||
{ model: User, as: 'user', attributes: ['username'] },
|
||
{
|
||
model: OrderItem,
|
||
as: 'orderItems',
|
||
include: [{ model: Product, as: 'product', attributes: ['name'] }]
|
||
}
|
||
]
|
||
});
|
||
|
||
sampleOrders.forEach(order => {
|
||
console.log(`订单 #${order.id} - 用户: ${order.user.username} - 总额: ¥${(order.total_amount / 100).toFixed(2)} - 状态: ${order.status}`);
|
||
order.orderItems.forEach(item => {
|
||
console.log(` - ${item.product.name} x ${item.quantity}`);
|
||
});
|
||
});
|
||
|
||
console.log('\n测试数据生成完成!');
|
||
|
||
} catch (error) {
|
||
console.error('生成测试数据失败:', error);
|
||
} finally {
|
||
await sequelize.close();
|
||
}
|
||
}
|
||
|
||
// 运行脚本
|
||
if (require.main === module) {
|
||
generateTestData();
|
||
}
|
||
|
||
module.exports = { generateTestData, productData }; |