// 驾驶舱模拟数据(接口未就绪时的兜底展示) // 字段形状与真实接口保持一致,后端就绪后可在 home/index.vue 里切换真实接口 // 说明:驾驶舱地图为「区县级」,而 /opo/totals/* 统计接口为「地区级」,故区县地图、仪表盘、动态表暂用此模拟数据 // 确定性伪随机,保证每次渲染数据一致 function createRand(seed) { let s = seed % 2147483647; if (s <= 0) s += 2147483646; return function () { s = (s * 16807) % 2147483647; return (s - 1) / 2147483646; }; } // 青岛 10 区县 + 日照 4 区县(与 common/map/qingdao.js 名称一一对应) const DISTRICTS = [ { name: '市南区', district: '370202' }, { name: '市北区', district: '370203' }, { name: '黄岛区', district: '370211' }, { name: '崂山区', district: '370212' }, { name: '李沧区', district: '370213' }, { name: '城阳区', district: '370214' }, { name: '即墨区', district: '370215' }, { name: '胶州市', district: '370281' }, { name: '平度市', district: '370283' }, { name: '莱西市', district: '370285' }, { name: '东港区', district: '371102' }, { name: '岚山区', district: '371103' }, { name: '五莲县', district: '371121' }, { name: '莒县', district: '371122' } ]; const REGIONS = ['青岛地区', '日照地区', '济南地区', '烟台地区', '威海地区', '潍坊地区', '临沂地区']; const MONTHS = ['2024-01', '2024-02', '2024-03', '2024-04', '2024-05', '2024-06', '2024-07', '2024-08', '2024-09', '2024-10', '2024-11', '2024-12']; const ORGANS = ['全肝', '肾脏', '心脏', '肺', '胰腺', '眼角膜']; const BLOOD_TYPES = ['A', 'B', 'O', 'AB']; const AGE_GROUPS = ['1', '2', '3', '4']; // 区县地图数据:{ name, district, value(潜在), elseData:{ value2(完成), value3(器官) } } export function mockMapData() { const r = createRand(101); return DISTRICTS.map(d => { const potential = 8 + Math.round(r() * 60); return { name: d.name, district: d.district, value: potential, elseData: { value2: Math.round(potential * (0.45 + r() * 0.35)), value3: Math.round(potential * (1.5 + r() * 2.5)) } }; }); } // 仪表盘指标:{ name, value, max, color } export function mockGauges() { return [ { name: '捐献完成率', value: 68.5, max: 100, color: '#34d399' }, { name: '潜献转化率', value: 45.2, max: 100, color: '#38a5f8' }, { name: '器官利用率', value: 86.0, max: 100, color: '#22d3ee' }, { name: '器官弃用率', value: 14.0, max: 100, color: '#fb7185' } ]; } export function mockCaseTrend() { const r = createRand(111); return MONTHS.map(m => { const potential = 40 + Math.round(r() * 50); return { donateTime: m, potentialCount: potential, completeCount: Math.round(potential * (0.5 + r() * 0.3)), totalCount: potential }; }); } export function mockOrganMoon() { const r = createRand(122); return MONTHS.map(m => { const get = 60 + Math.round(r() * 80); return { donateTime: m, getCount: get, useCount: Math.round(get * (0.7 + r() * 0.2)) }; }); } export function mockCaseBloodType() { const r = createRand(133); return BLOOD_TYPES.map(boodType => { const man = 25 + Math.round(r() * 35); const woman = 20 + Math.round(r() * 30); return { boodType, manCount: man, womanCount: woman, boodTypeCount: man + woman }; }); } export function mockCaseSex() { const r = createRand(144); return AGE_GROUPS.map(ageGroup => ({ ageGroup, manCount: 20 + Math.round(r() * 45), womanCount: 15 + Math.round(r() * 40) })); } export function mockOrganType() { const r = createRand(155); return ORGANS.map(organName => { const get = 50 + Math.round(r() * 90); return { organName, getCount: get, useCount: Math.round(get * (0.7 + r() * 0.2)) }; }); } export function mockCaseTrendArea() { const r = createRand(166); return REGIONS.map(area => { const potential = 30 + Math.round(r() * 80); return { area, potentialCount: potential, completeCount: Math.round(potential * (0.5 + r() * 0.3)) }; }); } export function mockTotals() { return [{ totalPotential: 486, totalCompletion: 327 }]; } export function mockCaseAvgAge() { return [{ avgAge: 45.6 }]; } // 器官弃用情况:{ organName, getCount, discardCount } export function mockOrganDiscard() { const r = createRand(199); return ORGANS.map(organName => { const get = 50 + Math.round(r() * 90); const discard = Math.round(get * (0.05 + r() * 0.2)); return { organName, getCount: get, discardCount: discard }; }); } // 机构捐献动态表(dv-scroll-board 配置) export function mockHospitalDonate() { const r = createRand(177); const HOSPITALS = [ '青岛大学附属医院', '青岛市立医院', '青岛市中心医院', '山东大学齐鲁医院(青岛)', '青岛妇女儿童医院', '青岛市海慈医院', '日照市人民医院', '日照市中医医院', '莒县人民医院' ]; const header = ['区域', '机构', '捐献登记', '捐献完成']; const data = HOSPITALS.map((h, i) => { const region = i < 6 ? '青岛地区' : '日照地区'; const potential = 15 + Math.round(r() * 40); return [region, h, potential, Math.round(potential * (0.5 + r() * 0.3))]; }); return { header, data }; } // 机构接受器官动态表(dv-scroll-board 配置) export function mockHospitalAccept() { const r = createRand(188); const HOSPITALS = [ '青岛大学附属医院', '青岛市立医院', '青岛市中心医院', '山东大学齐鲁医院(青岛)', '青岛妇女儿童医院', '青岛市海慈医院', '日照市人民医院', '日照市中医医院' ]; const header = ['移植医院', '接受器官数']; const data = HOSPITALS.map(h => [h, 8 + Math.round(r() * 50)]); return { header, data }; } // 汇总:一次性返回驾驶舱所需全部模拟数据 export function mockCockpitData() { return { mapData: mockMapData(), gauges: mockGauges(), caseTrend: mockCaseTrend(), organMoon: mockOrganMoon(), caseBloodType: mockCaseBloodType(), caseSex: mockCaseSex(), organType: mockOrganType(), organDiscard: mockOrganDiscard(), caseTrendArea: mockCaseTrendArea(), totals: mockTotals(), caseAvgAge: mockCaseAvgAge(), hospitalDonate: mockHospitalDonate(), hospitalAccept: mockHospitalAccept() }; }