|
|
import { PrismaClient } from '@prisma/client';
|
|
|
|
|
|
const prisma = new PrismaClient();
|
|
|
|
|
|
async function main() {
|
|
|
console.log('🌱 开始种子数据...');
|
|
|
|
|
|
// 创建期货品种
|
|
|
const products = [
|
|
|
{ symbol: 'SC', name: '原油', category: 'energy', exchange: 'INE', unit: '元/桶', minChange: 0.1 },
|
|
|
{ symbol: 'AU', name: '黄金', category: 'metal', exchange: 'SHFE', unit: '元/克', minChange: 0.02 },
|
|
|
{ symbol: 'CU', name: '铜', category: 'metal', exchange: 'SHFE', unit: '元/吨', minChange: 10 },
|
|
|
{ symbol: 'AG', name: '白银', category: 'metal', exchange: 'SHFE', unit: '元/千克', minChange: 1 },
|
|
|
{ symbol: 'I', name: '铁矿石', category: 'metal', exchange: 'DCE', unit: '元/吨', minChange: 0.5 },
|
|
|
{ symbol: 'M', name: '豆粕', category: 'agriculture', exchange: 'DCE', unit: '元/吨', minChange: 1 },
|
|
|
{ symbol: 'P', name: '棕榈油', category: 'agriculture', exchange: 'DCE', unit: '元/吨', minChange: 2 },
|
|
|
{ symbol: 'EC', name: '集运指数', category: 'financial', exchange: 'INE', unit: '点', minChange: 0.1 },
|
|
|
{ symbol: 'RB', name: '螺纹钢', category: 'metal', exchange: 'SHFE', unit: '元/吨', minChange: 1 },
|
|
|
{ symbol: 'FG', name: '玻璃', category: 'industrial', exchange: 'ZCE', unit: '元/吨', minChange: 1 },
|
|
|
{ symbol: 'SA', name: '纯碱', category: 'industrial', exchange: 'ZCE', unit: '元/吨', minChange: 1 },
|
|
|
{ symbol: 'MA', name: '甲醇', category: 'energy', exchange: 'ZCE', unit: '元/吨', minChange: 1 },
|
|
|
{ symbol: 'TA', name: 'PTA', category: 'industrial', exchange: 'ZCE', unit: '元/吨', minChange: 2 },
|
|
|
{ symbol: 'CF', name: '棉花', category: 'agriculture', exchange: 'ZCE', unit: '元/吨', minChange: 5 },
|
|
|
{ symbol: 'SR', name: '白糖', category: 'agriculture', exchange: 'ZCE', unit: '元/吨', minChange: 1 },
|
|
|
];
|
|
|
|
|
|
for (const product of products) {
|
|
|
await prisma.product.upsert({
|
|
|
where: { symbol: product.symbol },
|
|
|
update: product,
|
|
|
create: product,
|
|
|
});
|
|
|
}
|
|
|
|
|
|
console.log(`✅ 已创建 ${products.length} 个期货品种`);
|
|
|
|
|
|
// 创建热点事件
|
|
|
const events = [
|
|
|
{
|
|
|
title: '地缘政治风险升级',
|
|
|
summary: '美以袭伊朗,"海上油阀"被关,中东局势紧张升级',
|
|
|
content: '详细内容...',
|
|
|
impact: 'bullish',
|
|
|
impactLevel: 5,
|
|
|
analysis: '地缘政治风险急剧升温,霍尔木兹海峡封锁风险上升。原油供应中断担忧推动油价上涨,避险资产黄金、白银同步走强。短期油价易涨难跌,建议关注原油、黄金相关品种做多机会。',
|
|
|
risks: ['冲突升级可能', '供应中断风险', '波动率激增'],
|
|
|
affectedSymbols: ['SC', 'AU', 'AG'],
|
|
|
},
|
|
|
{
|
|
|
title: '黄金价格创历史新高',
|
|
|
summary: 'COMEX黄金突破3100美元关口,避险需求强劲',
|
|
|
content: '详细内容...',
|
|
|
impact: 'bullish',
|
|
|
impactLevel: 4,
|
|
|
analysis: '特朗普关税政策"2.0"版本引发市场担忧,叠加地缘政治风险,黄金避险属性凸显。技术面突破历史高点,多头趋势强劲。预计金价短期维持强势,回调即是买入机会。',
|
|
|
risks: ['获利回吐压力', '美元反弹风险', '美联储政策转向'],
|
|
|
affectedSymbols: ['AU', 'AG'],
|
|
|
},
|
|
|
{
|
|
|
title: '铜供应紧张预期',
|
|
|
summary: '全球铜市场预计出现18万吨供应缺口,美国或加征铜进口关税',
|
|
|
content: '详细内容...',
|
|
|
impact: 'bullish',
|
|
|
impactLevel: 4,
|
|
|
analysis: '铜精矿TC现货指数持续回落,矿山供应增长放缓。美国可能加征铜进口关税,刺激美铜价格上涨,全球套利行为收紧供应。需求端新能源产业用铜需求快速增长,供需矛盾支撑铜价。',
|
|
|
risks: ['需求放缓风险', '美元走强压制', '库存累积'],
|
|
|
affectedSymbols: ['CU'],
|
|
|
},
|
|
|
{
|
|
|
title: '美联储通胀数据超预期',
|
|
|
summary: '核心PCE数据超预期,降息预期降温',
|
|
|
content: '详细内容...',
|
|
|
impact: 'bearish',
|
|
|
impactLevel: 3,
|
|
|
analysis: '美国2月核心PCE通胀数据超预期,市场对美联储降息预期降温。美元指数短期获得支撑,对大宗商品形成一定压制。但地缘政治风险对冲了部分利空影响。',
|
|
|
risks: ['加息预期升温', '美元持续走强', '风险资产抛售'],
|
|
|
affectedSymbols: ['AU', 'AG', 'SC', 'CU'],
|
|
|
},
|
|
|
{
|
|
|
title: 'OPEC+减产延期预期',
|
|
|
summary: 'OPEC+可能延长减产协议至二季度末',
|
|
|
content: '详细内容...',
|
|
|
impact: 'bullish',
|
|
|
impactLevel: 3,
|
|
|
analysis: 'OPEC+成员国倾向于延长减产协议以支撑油价。全球原油需求预期改善,叠加供应端约束,原油市场供需格局趋紧。关注减产协议正式落地情况。',
|
|
|
risks: ['减产执行力度', '非OPEC增产', '需求不及预期'],
|
|
|
affectedSymbols: ['SC'],
|
|
|
},
|
|
|
];
|
|
|
|
|
|
for (const event of events) {
|
|
|
const existing = await prisma.hotEvent.findFirst({
|
|
|
where: { title: event.title },
|
|
|
});
|
|
|
|
|
|
if (!existing) {
|
|
|
// 查找产品ID
|
|
|
const products = await prisma.product.findMany({
|
|
|
where: { symbol: { in: event.affectedSymbols } },
|
|
|
});
|
|
|
|
|
|
await prisma.hotEvent.create({
|
|
|
data: {
|
|
|
title: event.title,
|
|
|
summary: event.summary,
|
|
|
content: event.content,
|
|
|
impact: event.impact,
|
|
|
impactLevel: event.impactLevel,
|
|
|
analysis: event.analysis,
|
|
|
risks: event.risks,
|
|
|
affectedProducts: {
|
|
|
create: products.map((p) => ({
|
|
|
productId: p.id,
|
|
|
impactConfidence: 0.8,
|
|
|
})),
|
|
|
},
|
|
|
},
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
|
|
|
console.log(`✅ 已创建 ${events.length} 个热点事件`);
|
|
|
|
|
|
// 创建系统配置
|
|
|
const configs = [
|
|
|
{ key: 'MARKET_STATUS', value: 'open', description: '市场状态' },
|
|
|
{ key: 'TRADING_HOURS', value: '09:00-11:30,13:30-15:00,21:00-02:30', description: '交易时间' },
|
|
|
];
|
|
|
|
|
|
for (const config of configs) {
|
|
|
await prisma.systemConfig.upsert({
|
|
|
where: { key: config.key },
|
|
|
update: config,
|
|
|
create: config,
|
|
|
});
|
|
|
}
|
|
|
|
|
|
console.log(`✅ 已创建 ${configs.length} 个系统配置`);
|
|
|
|
|
|
console.log('✨ 种子数据完成!');
|
|
|
}
|
|
|
|
|
|
main()
|
|
|
.catch((e) => {
|
|
|
console.error('❌ 种子数据失败:', e);
|
|
|
process.exit(1);
|
|
|
})
|
|
|
.finally(async () => {
|
|
|
await prisma.$disconnect();
|
|
|
});
|