feat:添加mock数据

This commit is contained in:
zdl
2025-10-31 20:11:50 +08:00
parent fc251ede05
commit 933932b86d

View File

@@ -609,7 +609,7 @@ function generateEventDescription(industry, importance, seed) {
return impacts[importance] + details[seed % details.length]; return impacts[importance] + details[seed % details.length];
} }
// 生成关键词 // 生成关键词(对象数组格式,包含完整信息)
function generateKeywords(industry, seed) { function generateKeywords(industry, seed) {
const commonKeywords = ['政策', '利好', '业绩', '涨停', '龙头', '突破', '合作', '投资']; const commonKeywords = ['政策', '利好', '业绩', '涨停', '龙头', '突破', '合作', '投资'];
const industryKeywords = { const industryKeywords = {
@@ -620,12 +620,93 @@ function generateKeywords(industry, seed) {
'消费': ['白酒', '食品', '家电', '零售', '免税'], '消费': ['白酒', '食品', '家电', '零售', '免税'],
}; };
const keywords = [ // 概念描述模板
const descriptionTemplates = {
'政策': '政策性利好消息对相关行业和板块产生积极影响,带动市场情绪和资金流向。',
'利好': '市场积极因素推动相关板块上涨,投资者情绪乐观,资金持续流入。',
'业绩': '公司业绩超预期增长,盈利能力提升,市场给予更高估值预期。',
'涨停': '强势涨停板显示市场热度,短期资金追捧,板块效应明显。',
'龙头': '行业龙头企业具备竞争优势,市场地位稳固,带动板块走势。',
'突破': '技术面或基本面出现重大突破,打开上涨空间,吸引资金关注。',
'合作': '战略合作为公司带来新的增长点,业务协同效应显著。',
'投资': '重大投资项目落地,长期发展空间广阔,市场预期良好。',
'芯片': '国产芯片替代加速,自主可控需求强烈,政策和资金支持力度大。',
'晶圆': '晶圆产能紧张,供需关系改善,相关企业盈利能力提升。',
'封测': '封测环节景气度上行,订单饱满,产能利用率提高。',
'AI芯片': '人工智能快速发展带动AI芯片需求爆发市场空间巨大。',
'国产替代': '国产替代进程加速,政策扶持力度大,进口依赖度降低。',
'电池': '新能源汽车渗透率提升,动力电池需求旺盛,技术迭代加快。',
'光伏': '光伏装机量快速增长,成本持续下降,行业景气度维持高位。',
'储能': '储能市场爆发式增长,政策支持力度大,应用场景不断拓展。',
'新能源车': '新能源汽车销量高增长,渗透率持续提升,产业链受益明显。',
'锂电': '锂电池技术进步,成本优势扩大,下游应用领域持续扩张。',
'大模型': '大语言模型技术突破,商业化进程加速,应用场景广阔。',
'AI应用': '人工智能应用落地加速,垂直领域渗透率提升,市场空间巨大。',
'算力': '算力需求持续增长,数据中心建设加速,相关产业链受益。',
'数据': '数据要素市场化改革推进,数据价值释放,相关企业盈利模式清晰。',
'机器学习': '机器学习技术成熟,应用场景丰富,商业价值逐步显现。',
'创新药': '创新药研发管线丰富,商业化进程顺利,市场给予高估值。',
'CRO': 'CRO行业高景气订单充足盈利能力稳定增长。',
'医疗器械': '医疗器械国产化率提升,技术创新加快,市场份额扩大。',
'生物制药': '生物制药技术突破,产品管线丰富,商业化前景广阔。',
'仿制药': '仿制药集采常态化,质量优势企业市场份额提升。',
'白酒': '白酒消费升级,高端产品量价齐升,龙头企业护城河深厚。',
'食品': '食品饮料需求稳定,品牌力强的企业市场份额持续提升。',
'家电': '家电消费需求回暖,智能化升级带动产品结构优化。',
'零售': '零售行业数字化转型,线上线下融合,运营效率提升。',
'免税': '免税政策优化,消费回流加速,行业景气度上行。'
};
const keywordNames = [
...commonKeywords.slice(seed % 3, seed % 3 + 3), ...commonKeywords.slice(seed % 3, seed % 3 + 3),
...(industryKeywords[industry] || []).slice(0, 2) ...(industryKeywords[industry] || []).slice(0, 2)
]; ].slice(0, 5);
return keywords.slice(0, 5); const matchTypes = ['hybrid_knn', 'keyword', 'semantic'];
// 生成历史触发时间3-5个历史日期
const generateHappenedTimes = (baseSeed) => {
const times = [];
const count = 3 + (baseSeed % 3); // 3-5个时间点
for (let i = 0; i < count; i++) {
const daysAgo = 30 + (baseSeed * 7 + i * 11) % 330; // 30-360天前
const date = new Date();
date.setDate(date.getDate() - daysAgo);
times.push(date.toISOString().split('T')[0]);
}
return times.sort().reverse(); // 降序排列
};
// 生成核心相关股票4-6只
const generateRelatedStocks = (conceptName, baseSeed) => {
const stockCount = 4 + (baseSeed % 3); // 4-6只股票
const selectedStocks = [];
for (let i = 0; i < stockCount && i < stockPool.length; i++) {
const stockIndex = (baseSeed + i * 7) % stockPool.length;
const stock = stockPool[stockIndex];
selectedStocks.push({
stock_name: stock.stock_name,
stock_code: stock.stock_code,
reason: relationDescTemplates[(baseSeed + i) % relationDescTemplates.length],
change_pct: (Math.random() * 15 - 5).toFixed(2) // -5% ~ +10%
});
}
return selectedStocks;
};
// 将字符串数组转换为对象数组,包含完整字段
return keywordNames.map((name, index) => ({
name: name,
stock_count: 10 + Math.floor((seed + index) % 30), // 10-39个相关股票
relevance: 70 + Math.floor((seed * 7 + index * 11) % 30), // 70-99的相关度
description: descriptionTemplates[name] || `${name}相关概念,市场关注度较高,具有一定的投资价值。`,
avg_change_pct: (Math.random() * 15 - 5).toFixed(2), // -5% ~ +10% 的涨跌幅
match_type: matchTypes[(seed + index) % 3], // 随机匹配类型
happened_times: generateHappenedTimes(seed + index), // 历史触发时间
stocks: generateRelatedStocks(name, seed + index) // 核心相关股票
}));
} }
/** /**
@@ -670,22 +751,42 @@ export function generateMockEvents(params = {}) {
const relatedStockCount = 2 + (i % 4); // 2-5个股票 const relatedStockCount = 2 + (i % 4); // 2-5个股票
const relatedStocks = []; const relatedStocks = [];
const industryStocks = stockPool.filter(s => s.industry === industry); const industryStocks = stockPool.filter(s => s.industry === industry);
const addedStockCodes = new Set(); // 用于去重
// 优先选择同行业股票 // 优先选择同行业股票
if (industryStocks.length > 0) { if (industryStocks.length > 0) {
for (let j = 0; j < Math.min(relatedStockCount, industryStocks.length); j++) { for (let j = 0; j < Math.min(relatedStockCount, industryStocks.length); j++) {
relatedStocks.push(industryStocks[j % industryStocks.length].stock_code); const stock = industryStocks[j % industryStocks.length];
if (!addedStockCodes.has(stock.stock_code)) {
relatedStocks.push({
stock_name: stock.stock_name,
stock_code: stock.stock_code,
relation_desc: relationDescTemplates[(i + j) % relationDescTemplates.length]
});
addedStockCodes.add(stock.stock_code);
}
} }
} }
// 如果同行业股票不够,从整个 stockPool 中补充 // 如果同行业股票不够,从整个 stockPool 中补充
while (relatedStocks.length < relatedStockCount && relatedStocks.length < stockPool.length) { let poolIndex = 0;
const randomStock = stockPool[relatedStocks.length % stockPool.length]; while (relatedStocks.length < relatedStockCount && poolIndex < stockPool.length) {
if (!relatedStocks.includes(randomStock.stock_code)) { const randomStock = stockPool[poolIndex % stockPool.length];
relatedStocks.push(randomStock.stock_code); if (!addedStockCodes.has(randomStock.stock_code)) {
relatedStocks.push({
stock_name: randomStock.stock_name,
stock_code: randomStock.stock_code,
relation_desc: relationDescTemplates[(i + poolIndex) % relationDescTemplates.length]
});
addedStockCodes.add(randomStock.stock_code);
} }
poolIndex++;
} }
// 计算交易日期模拟下一交易日这里简单地加1天
const tradingDate = new Date(createdAt);
tradingDate.setDate(tradingDate.getDate() + 1);
allEvents.push({ allEvents.push({
id: i + 1, id: i + 1,
title: generateEventTitle(industry, i), title: generateEventTitle(industry, i),
@@ -696,6 +797,7 @@ export function generateMockEvents(params = {}) {
status: 'published', status: 'published',
created_at: createdAt.toISOString(), created_at: createdAt.toISOString(),
updated_at: createdAt.toISOString(), updated_at: createdAt.toISOString(),
trading_date: tradingDate.toISOString().split('T')[0], // YYYY-MM-DD 格式
hot_score: hotScore, hot_score: hotScore,
view_count: Math.floor(Math.random() * 10000), view_count: Math.floor(Math.random() * 10000),
related_avg_chg: parseFloat(relatedAvgChg), related_avg_chg: parseFloat(relatedAvgChg),