173 lines
3.8 KiB
JavaScript
173 lines
3.8 KiB
JavaScript
const app = getApp();
|
||
const math = require('../../utils/math.js');
|
||
|
||
Page({
|
||
data: {
|
||
age: '',
|
||
height: '',
|
||
gender: 'male',
|
||
showResult: false,
|
||
sdsValue: null,
|
||
percentile: null,
|
||
growthEvaluation: '',
|
||
chartData: null
|
||
},
|
||
|
||
// 输入年龄
|
||
inputAge(e) {
|
||
this.setData({
|
||
age: Number(e.detail.value) // 确保age是数字
|
||
});
|
||
},
|
||
|
||
// 输入身高
|
||
inputHeight(e) {
|
||
this.setData({
|
||
height: Number(e.detail.value) // 确保height是数字
|
||
});
|
||
},
|
||
|
||
// 选择性别
|
||
selectGender(e) {
|
||
const gender = e.currentTarget.dataset.gender;
|
||
this.setData({ gender });
|
||
},
|
||
|
||
// 重置表单
|
||
reset() {
|
||
this.setData({
|
||
age: '',
|
||
height: '',
|
||
gender: 'male',
|
||
showResult: false
|
||
});
|
||
},
|
||
|
||
// 计算SDS
|
||
calculate() {
|
||
const { age, height, gender } = this.data;
|
||
|
||
// 输入验证
|
||
if (!age || !height) {
|
||
wx.showToast({
|
||
title: '请填写完整信息',
|
||
icon: 'none'
|
||
});
|
||
return;
|
||
}
|
||
|
||
// 直接使用本地生长数据
|
||
this.useLocalGrowthData();
|
||
},
|
||
|
||
// 处理生长数据
|
||
processGrowthData(growthData) {
|
||
try {
|
||
const { age, height, gender } = this.data;
|
||
|
||
// 计算SDS值并获取标准数据
|
||
const { sds, standard } = this.calculateSDS(height, age, gender, growthData);
|
||
console.log('SDS计算详情:', {
|
||
height,
|
||
age,
|
||
gender,
|
||
mean: standard.mean,
|
||
sd: standard.sd,
|
||
sds
|
||
});
|
||
|
||
// 显示计算公式
|
||
console.log(`计算公式:SDS = (${height} - ${standard.mean}) / ${standard.sd} = ${sds.toFixed(2)}`);
|
||
|
||
// 计算百分位数
|
||
const percentile = this.calculatePercentile(sds);
|
||
|
||
// 获取生长评价
|
||
const evaluation = this.getGrowthEvaluation(sds);
|
||
|
||
// 更新结果
|
||
this.setData({
|
||
showResult: true,
|
||
sdsValue: Number(sds.toFixed(2)), // 确保sdsValue是数字类型
|
||
percentile: percentile,
|
||
growthEvaluation: evaluation
|
||
});
|
||
|
||
// 绘制生长曲线
|
||
this.drawGrowthChart(growthData);
|
||
} catch (error) {
|
||
wx.showToast({
|
||
title: error.message || '计算失败',
|
||
icon: 'none'
|
||
});
|
||
}
|
||
},
|
||
|
||
// 使用本地生长数据
|
||
useLocalGrowthData() {
|
||
try {
|
||
const localData = require('./growthData.js');
|
||
// 确保数据类型一致
|
||
const processedData = localData.map(item => ({
|
||
...item,
|
||
age: Number(item.age)
|
||
}));
|
||
this.processGrowthData(processedData);
|
||
} catch (error) {
|
||
wx.showToast({
|
||
title: '本地数据加载失败',
|
||
icon: 'none'
|
||
});
|
||
}
|
||
},
|
||
|
||
// 计算SDS值
|
||
calculateSDS(height, age, gender, growthData) {
|
||
// 根据年龄和性别获取标准值
|
||
const standard = growthData.find(d =>
|
||
Number(d.age) === Number(age) &&
|
||
d.gender === gender
|
||
);
|
||
|
||
if (!standard) {
|
||
throw new Error('未找到对应年龄和性别的标准数据');
|
||
}
|
||
|
||
// SDS = (实际值 - 平均值) / 标准差
|
||
const sds = (height - standard.mean) / standard.sd;
|
||
return { sds, standard };
|
||
},
|
||
|
||
// 计算百分位数
|
||
calculatePercentile(sds) {
|
||
// 使用标准正态分布计算百分位数
|
||
const percentile = 100 * (1 + math.erf(sds / Math.sqrt(2))) / 2;
|
||
return percentile.toFixed(1);
|
||
},
|
||
|
||
// 获取生长评价
|
||
getGrowthEvaluation(sds) {
|
||
if (sds < -2) {
|
||
return '生长迟缓';
|
||
} else if (sds >= -2 && sds <= 2) {
|
||
return '正常范围';
|
||
} else {
|
||
return '生长过快';
|
||
}
|
||
},
|
||
|
||
// 绘制生长曲线
|
||
drawGrowthChart(growthData) {
|
||
const ctx = wx.createCanvasContext('growthChart');
|
||
|
||
// 绘制逻辑...
|
||
|
||
ctx.draw();
|
||
},
|
||
|
||
// 返回
|
||
onClickLeft() {
|
||
wx.navigateBack();
|
||
}
|
||
});
|