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
185
186
187
188
189
190
191
192
193
194
// 统计模块模拟数据
// 响应字段与 /opo/totals/* 返回的 Totals(opo统计) 对象保持一致
// mock 模式下由 statistics.js 返回,页面逻辑无需区分数据来源
 
const REGIONS = ['青岛地区', '日照地区', '济南地区', '烟台地区', '威海地区', '潍坊地区', '临沂地区'];
const MONTHS = ['2024-01', '2024-02', '2024-03', '2024-04', '2024-05', '2024-06'];
const YEARS = ['2022', '2023', '2024'];
const ORGANS = ['全肝', '肾脏', '心脏', '肺', '胰腺', '眼角膜'];
const BLOOD_TYPES = ['A', 'B', 'O', 'AB'];
const AGE_GROUPS = ['1', '2', '3', '4'];
 
// 确定性伪随机,保证每次渲染数据一致
function createRand(seed) {
  let s = seed % 2147483647;
  if (s <= 0) s += 2147483646;
  return function () {
    s = (s * 16807) % 2147483647;
    return (s - 1) / 2147483646;
  };
}
 
// 案例趋势(月份维度)
function mockCaseTrend() {
  const r = createRand(11);
  return MONTHS.map((m) => {
    const potential = 40 + Math.round(r() * 40);
    return { donateTime: m, potentialCount: potential, completeCount: Math.round(potential * (0.6 + r() * 0.2)), totalCount: potential };
  });
}
 
// 案例趋势(地区维度)
function mockCaseTrendArea() {
  const r = createRand(22);
  return REGIONS.map((area) => {
    const potential = 30 + Math.round(r() * 70);
    return { area, potentialCount: potential, completeCount: Math.round(potential * (0.6 + r() * 0.2)) };
  });
}
 
// 案例明细(地区 x 月份)
function mockCaseTrendMoon() {
  const r = createRand(33);
  const rows = [];
  REGIONS.forEach((area) => {
    MONTHS.forEach((m) => {
      const potential = 5 + Math.round(r() * 15);
      rows.push({ area, donateTime: m, potentialCount: potential, completeCount: Math.round(potential * (0.5 + r() * 0.4)), totalCount: potential });
    });
  });
  return rows;
}
 
// 平均年龄
function mockCaseAvgAge() {
  return [{ avgAge: 45.6 }];
}
 
// 性别与血型分布
function mockCaseBloodType() {
  const r = createRand(44);
  return BLOOD_TYPES.map((boodType) => {
    const man = 20 + Math.round(r() * 30);
    const woman = 20 + Math.round(r() * 30);
    return { boodType, manCount: man, womanCount: woman, boodTypeCount: man + woman };
  });
}
 
// 捐献者年龄性别分布
function mockCaseSex() {
  const r = createRand(55);
  return AGE_GROUPS.map((ageGroup) => ({
    ageGroup,
    manCount: 15 + Math.round(r() * 40),
    womanCount: 15 + Math.round(r() * 40)
  }));
}
 
// 捐献器官统计明细(年份 x 器官 x 地区)
function mockOrgan() {
  const r = createRand(66);
  const rows = [];
  YEARS.forEach((year) => {
    ORGANS.forEach((organName) => {
      REGIONS.forEach((area) => {
        const get = 10 + Math.round(r() * 40);
        rows.push({ donateTime: year, organName, area, getCount: get, useCount: Math.round(get * (0.7 + r() * 0.25)) });
      });
    });
  });
  return rows;
}
 
// 器官获取/移植趋势(月份维度)
function mockOrganMoon() {
  const r = createRand(77);
  return MONTHS.map((m) => {
    const get = 50 + Math.round(r() * 60);
    return { donateTime: m, getCount: get, useCount: Math.round(get * (0.75 + r() * 0.2)) };
  });
}
 
// 器官类型分布
function mockOrganType() {
  const r = createRand(88);
  return ORGANS.map((organName) => {
    const get = 40 + Math.round(r() * 80);
    return { organName, getCount: get, useCount: Math.round(get * (0.75 + r() * 0.2)) };
  });
}
 
// 总统计(总潜在捐献案例 / 总完成捐献数)
function mockTotalsAll() {
  return [{ totalPotential: 486, totalCompletion: 327 }];
}
 
// 案例明细列表(trendList)
function mockTrendList() {
  const r = createRand(99);
  const NAMES = ['张三', '李四', '王五', '赵六', '陈七', '刘八', '周九'];
  const HOSPITALS = ['青岛大学附属医院', '青岛市立医院', '青岛市中心医院', '山东大学齐鲁医院(青岛)'];
  const DEATHS = ['脑外伤', '心搏骤停', '脑血管意外', '颅脑肿瘤', '缺氧性脑病'];
  const WORKFLOWS = [1, 2, 3, 4, 5, 6, 7, 99];
  return NAMES.map((name, i) => {
    const month = MONTHS[i % MONTHS.length];
    const day = String(1 + Math.floor(r() * 27)).padStart(2, '0');
    return {
      id: 1000 + i,
      caseNo: `C${month.replace('-', '')}00${i + 1}`,
      name,
      inpatientNo: `ZY${month.replace('-', '')}00${i + 1}`,
      workflow: WORKFLOWS[i % WORKFLOWS.length],
      organName: ORGANS[i % ORGANS.length],
      donatetime: `${month}-${day} 10:30`,
      deathReason: DEATHS[i % DEATHS.length],
      treatmentHospitalName: HOSPITALS[i % HOSPITALS.length]
    };
  });
}
 
// 器官移植总统计(数据概览)
function mockOrganTotals() {
  return [{ totalGet: 486, totalTransplant: 398, totalRecycle: 12, totalDiscard: 76 }];
}
 
// 捐献器官统计明细列表(器官明细详情)
function mockOrganList() {
  const r = createRand(111);
  const NAMES = ['张三', '李四', '王五', '赵六', '陈七', '刘八'];
  const HOSPITALS = ['青岛大学附属医院', '青岛市立医院', '青岛市中心医院'];
  const DOCTORS = ['李医生', '张医生', '王医生'];
  const RECIPIENTS = ['王明', '陈强', '刘伟', '赵刚'];
  const STATUS = [1, 1, 2, 3];
  return NAMES.map((name, i) => {
    const year = YEARS[i % YEARS.length];
    const month = String(1 + Math.floor(r() * 12)).padStart(2, '0');
    const st = STATUS[i % STATUS.length];
    return {
      id: 2000 + i,
      caseNo: `O${year}00${i + 1}`,
      name,
      organName: ORGANS[i % ORGANS.length],
      registerCountyName: REGIONS[i % REGIONS.length],
      donateYear: year,
      transplantstate: st,
      organGetTime: `${year}-${month}-15 10:30`,
      transplantTime: st === 1 ? `${year}-${month}-15 13:20` : '',
      notgetreason: st === 3 ? '器官质量不合格' : '',
      transplantName: st === 1 ? RECIPIENTS[i % RECIPIENTS.length] : '',
      hospitalName: HOSPITALS[i % HOSPITALS.length],
      transplantDoct: DOCTORS[i % DOCTORS.length]
    };
  });
}
 
const MOCK_MAP = {
  '/opo/totals/caseTrend': mockCaseTrend,
  '/opo/totals/caseTrendArea': mockCaseTrendArea,
  '/opo/totals/caseTrendMoon': mockCaseTrendMoon,
  '/opo/totals/caseAvgAge': mockCaseAvgAge,
  '/opo/totals/caseBloodType': mockCaseBloodType,
  '/opo/totals/caseSex': mockCaseSex,
  '/opo/totals/organ': mockOrgan,
  '/opo/totals/organMoon': mockOrganMoon,
  '/opo/totals/organType': mockOrganType,
  '/opo/totals/totals': mockTotalsAll,
  '/opo/totals/trendList': mockTrendList,
  '/opo/totals/organTotals': mockOrganTotals,
  '/opo/totals/organList': mockOrganList
};
 
export function mockTotals(url) {
  const fn = MOCK_MAP[url];
  return fn ? fn() : [];
}