WXL
3 天以前 4c9fdc87987140e8b2c3f0dfc2f6608cdb6be774
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
// 驾驶舱模拟数据(接口未就绪时的兜底展示)
// 字段形状与真实接口保持一致,后端就绪后可在 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()
  };
}