feat: 添加mock数据

This commit is contained in:
zdl
2025-10-27 14:56:44 +08:00
parent a9dc1191bf
commit 39feae87a6
3 changed files with 752 additions and 0 deletions

View File

@@ -0,0 +1,215 @@
// src/mocks/handlers/company.js
// 公司相关的 Mock Handlers
import { http, HttpResponse } from 'msw';
import { PINGAN_BANK_DATA, generateCompanyData } from '../data/company';
// 模拟延迟
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
// 获取公司数据的辅助函数
const getCompanyData = (stockCode) => {
return stockCode === '000001' ? PINGAN_BANK_DATA : generateCompanyData(stockCode, '示例公司');
};
export const companyHandlers = [
// 1. 综合分析
http.get('/api/company/comprehensive-analysis/:stockCode', async ({ params }) => {
await delay(300);
const { stockCode } = params;
const data = getCompanyData(stockCode);
return HttpResponse.json({
success: true,
data: data.comprehensiveAnalysis
});
}),
// 2. 价值链分析
http.get('/api/company/value-chain-analysis/:stockCode', async ({ params }) => {
await delay(250);
const { stockCode } = params;
const data = getCompanyData(stockCode);
return HttpResponse.json({
success: true,
data: data.valueChainAnalysis
});
}),
// 3. 关键因素时间线
http.get('/api/company/key-factors-timeline/:stockCode', async ({ params }) => {
await delay(200);
const { stockCode } = params;
const data = getCompanyData(stockCode);
return HttpResponse.json({
success: true,
data: {
timeline: data.keyFactorsTimeline,
total: data.keyFactorsTimeline.length
}
});
}),
// 4. 基本信息
http.get('/api/stock/:stockCode/basic-info', async ({ params }) => {
await delay(150);
const { stockCode } = params;
const data = getCompanyData(stockCode);
return HttpResponse.json({
success: true,
data: data.basicInfo
});
}),
// 5. 实际控制人
http.get('/api/stock/:stockCode/actual-control', async ({ params }) => {
await delay(150);
const { stockCode } = params;
const data = getCompanyData(stockCode);
return HttpResponse.json({
success: true,
data: data.actualControl
});
}),
// 6. 股权集中度
http.get('/api/stock/:stockCode/concentration', async ({ params }) => {
await delay(150);
const { stockCode } = params;
const data = getCompanyData(stockCode);
return HttpResponse.json({
success: true,
data: data.concentration
});
}),
// 7. 高管信息
http.get('/api/stock/:stockCode/management', async ({ params, request }) => {
await delay(200);
const { stockCode } = params;
const data = getCompanyData(stockCode);
// 解析查询参数
const url = new URL(request.url);
const activeOnly = url.searchParams.get('active_only') === 'true';
let management = data.management || [];
// 如果需要只返回在职高管mock 数据中默认都是在职)
if (activeOnly) {
management = management.filter(m => m.status !== 'resigned');
}
return HttpResponse.json({
success: true,
data: management // 直接返回数组
});
}),
// 8. 十大流通股东
http.get('/api/stock/:stockCode/top-circulation-shareholders', async ({ params, request }) => {
await delay(200);
const { stockCode } = params;
const data = getCompanyData(stockCode);
// 解析查询参数
const url = new URL(request.url);
const limit = parseInt(url.searchParams.get('limit') || '10', 10);
const shareholders = (data.topCirculationShareholders || []).slice(0, limit);
return HttpResponse.json({
success: true,
data: shareholders // 直接返回数组
});
}),
// 9. 十大股东
http.get('/api/stock/:stockCode/top-shareholders', async ({ params, request }) => {
await delay(200);
const { stockCode } = params;
const data = getCompanyData(stockCode);
// 解析查询参数
const url = new URL(request.url);
const limit = parseInt(url.searchParams.get('limit') || '10', 10);
const shareholders = (data.topShareholders || []).slice(0, limit);
return HttpResponse.json({
success: true,
data: shareholders // 直接返回数组
});
}),
// 10. 分支机构
http.get('/api/stock/:stockCode/branches', async ({ params }) => {
await delay(200);
const { stockCode } = params;
const data = getCompanyData(stockCode);
return HttpResponse.json({
success: true,
data: data.branches || [] // 直接返回数组
});
}),
// 11. 公告列表
http.get('/api/stock/:stockCode/announcements', async ({ params, request }) => {
await delay(250);
const { stockCode } = params;
const data = getCompanyData(stockCode);
// 解析查询参数
const url = new URL(request.url);
const limit = parseInt(url.searchParams.get('limit') || '20', 10);
const page = parseInt(url.searchParams.get('page') || '1', 10);
const type = url.searchParams.get('type');
let announcements = data.announcements || [];
// 类型筛选
if (type) {
announcements = announcements.filter(a => a.type === type);
}
// 分页
const start = (page - 1) * limit;
const end = start + limit;
const paginatedAnnouncements = announcements.slice(start, end);
return HttpResponse.json({
success: true,
data: paginatedAnnouncements // 直接返回数组
});
}),
// 12. 披露时间表
http.get('/api/stock/:stockCode/disclosure-schedule', async ({ params }) => {
await delay(150);
const { stockCode } = params;
const data = getCompanyData(stockCode);
return HttpResponse.json({
success: true,
data: data.disclosureSchedule || [] // 直接返回数组
});
}),
// 13. 盈利预测报告
http.get('/api/stock/:stockCode/forecast-report', async ({ params }) => {
await delay(300);
const { stockCode } = params;
const data = getCompanyData(stockCode);
return HttpResponse.json({
success: true,
data: data.forecastReport || null
});
}),
];