// 驾驶舱模拟数据(接口未就绪时的兜底展示)
|
// 字段形状与真实接口保持一致,后端就绪后可在 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()
|
};
|
}
|