// 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 }); }), ];