274 lines
8.3 KiB
JavaScript
274 lines
8.3 KiB
JavaScript
// 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);
|
||
|
||
// 直接返回 keyFactorsTimeline 对象(包含 key_factors 和 development_timeline)
|
||
return HttpResponse.json({
|
||
success: true,
|
||
data: data.keyFactorsTimeline
|
||
});
|
||
}),
|
||
|
||
// 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
|
||
});
|
||
}),
|
||
|
||
// 14. 价值链关联公司
|
||
http.get('/api/company/value-chain/related-companies', async ({ request }) => {
|
||
await delay(300);
|
||
|
||
const url = new URL(request.url);
|
||
const nodeName = url.searchParams.get('node_name') || '';
|
||
|
||
console.log('[Mock] 获取价值链关联公司:', nodeName);
|
||
|
||
// 生成模拟的关联公司数据
|
||
const relatedCompanies = [
|
||
{
|
||
stock_code: '601318',
|
||
stock_name: '中国平安',
|
||
industry: '保险',
|
||
relation: '同业竞争',
|
||
market_cap: 9200,
|
||
change_pct: 1.25
|
||
},
|
||
{
|
||
stock_code: '600036',
|
||
stock_name: '招商银行',
|
||
industry: '银行',
|
||
relation: '核心供应商',
|
||
market_cap: 8500,
|
||
change_pct: 0.85
|
||
},
|
||
{
|
||
stock_code: '601166',
|
||
stock_name: '兴业银行',
|
||
industry: '银行',
|
||
relation: '同业竞争',
|
||
market_cap: 4200,
|
||
change_pct: -0.32
|
||
},
|
||
{
|
||
stock_code: '601398',
|
||
stock_name: '工商银行',
|
||
industry: '银行',
|
||
relation: '同业竞争',
|
||
market_cap: 15000,
|
||
change_pct: 0.15
|
||
},
|
||
{
|
||
stock_code: '601288',
|
||
stock_name: '农业银行',
|
||
industry: '银行',
|
||
relation: '同业竞争',
|
||
market_cap: 12000,
|
||
change_pct: -0.08
|
||
}
|
||
];
|
||
|
||
return HttpResponse.json({
|
||
success: true,
|
||
data: relatedCompanies,
|
||
node_name: nodeName
|
||
});
|
||
}),
|
||
];
|