/** * 生成产品管理和订单管理测试数据 * @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 };