Files
szjs/pages/ghdCalculator/ghdCalculator.js

243 lines
7.1 KiB
JavaScript
Raw Permalink Normal View History

2025-03-14 22:37:20 +08:00
const app = getApp();
Page({
data: {
// 基础数据
ba: '', // 骨龄
ca: '', // 实际年龄
igf1: '', // IGF-1值
igfbp3: '', // IGFBP-3值
// 计算结果
showResult: false,
probability: null,
calculationDetails: null,
// 参考范围
referenceRanges: {
igf1: {
male: [
{ ageRange: '0-1', min: 55, max: 327 },
{ ageRange: '1-3', min: 51, max: 303 },
{ ageRange: '3-5', min: 49, max: 289 },
{ ageRange: '5-7', min: 52, max: 297 },
{ ageRange: '7-9', min: 57, max: 316 },
{ ageRange: '9-11', min: 88, max: 474 },
{ ageRange: '11-13', min: 110, max: 565 },
{ ageRange: '13-15', min: 202, max: 957 },
{ ageRange: '15-17', min: 193, max: 731 }
],
female: [
{ ageRange: '0-1', min: 55, max: 327 },
{ ageRange: '1-3', min: 51, max: 303 },
{ ageRange: '3-5', min: 49, max: 289 },
{ ageRange: '5-7', min: 52, max: 297 },
{ ageRange: '7-9', min: 57, max: 316 },
{ ageRange: '9-11', min: 88, max: 474 },
{ ageRange: '11-13', min: 183, max: 850 },
{ ageRange: '13-15', min: 261, max: 1096 },
{ ageRange: '15-17', min: 238, max: 996 }
]
},
igfbp3: {
male: [
{ ageRange: '0-1', min: 0.7, max: 3.6 },
{ ageRange: '1-3', min: 0.8, max: 3.9 },
{ ageRange: '3-5', min: 0.9, max: 4.3 },
{ ageRange: '5-7', min: 1.0, max: 4.7 },
{ ageRange: '7-9', min: 1.1, max: 5.2 },
{ ageRange: '9-11', min: 1.3, max: 5.6 },
{ ageRange: '11-13', min: 1.4, max: 6.1 },
{ ageRange: '13-15', min: 1.6, max: 6.8 },
{ ageRange: '15-17', min: 1.8, max: 7.1 }
],
female: [
{ ageRange: '0-1', min: 0.7, max: 3.6 },
{ ageRange: '1-3', min: 0.8, max: 3.9 },
{ ageRange: '3-5', min: 0.9, max: 4.3 },
{ ageRange: '5-7', min: 1.0, max: 4.7 },
{ ageRange: '7-9', min: 1.1, max: 5.2 },
{ ageRange: '9-11', min: 1.3, max: 5.6 },
{ ageRange: '11-13', min: 1.5, max: 6.3 },
{ ageRange: '13-15', min: 1.7, max: 7.3 },
{ ageRange: '15-17', min: 1.9, max: 7.9 }
]
}
}
},
// 输入处理
inputBA(e) {
// 只允许输入数字和小数点
const value = e.detail.value.replace(/[^\d.]/g, '');
// 确保只有一个小数点
const formattedValue = value.replace(/\.+/g, '.');
this.setData({ ba: formattedValue });
},
inputCA(e) {
const value = e.detail.value.replace(/[^\d.]/g, '');
const formattedValue = value.replace(/\.+/g, '.');
this.setData({ ca: formattedValue });
},
inputIGF1(e) {
const value = e.detail.value.replace(/[^\d.]/g, '');
const formattedValue = value.replace(/\.+/g, '.');
this.setData({ igf1: formattedValue });
},
inputIGFBP3(e) {
const value = e.detail.value.replace(/[^\d.]/g, '');
const formattedValue = value.replace(/\.+/g, '.');
this.setData({ igfbp3: formattedValue });
},
// 计算GHD概率
calculate() {
const { ba, ca, igf1, igfbp3 } = this.data;
// 输入验证
if (!this.validateInput()) return;
try {
// 将字符串转换为数字
const baNum = parseFloat(ba);
const caNum = parseFloat(ca);
const igf1Num = parseFloat(igf1);
const igfbp3Num = parseFloat(igfbp3);
// 计算 BA-CA
const baCaDiff = baNum - caNum;
// 计算 Y = LN(P/1-P)
const y = this.calculateY(baCaDiff, igf1Num, igfbp3Num);
// 计算概率 P
const p = this.calculateProbability(y);
// 计算各因素的贡献
const contributions = this.calculateContributions(baCaDiff, igf1Num, igfbp3Num);
// 显示结果
this.setData({
showResult: true,
probability: p,
calculationDetails: {
steps: [
`步骤1设置方程右边为 Y`,
`Y = 3.726 - 0.876×(BA-CA) - 0.058×(IGF-1) + 0.229×(IGFBP-3)`,
`Y = 3.726 - 0.876×(${baNum.toFixed(2)} - ${caNum.toFixed(2)}) - 0.058×${igf1Num.toFixed(2)} + 0.229×${igfbp3Num.toFixed(2)}`,
`Y = 3.726 - 0.876×(${baCaDiff.toFixed(2)}) - 0.058×${igf1Num.toFixed(2)} + 0.229×${igfbp3Num.toFixed(2)}`,
`Y = 3.726 - ${(0.876 * baCaDiff).toFixed(4)} - ${(0.058 * igf1Num).toFixed(4)} + ${(0.229 * igfbp3Num).toFixed(4)}`,
`Y = ${y.toFixed(4)}`,
``,
`步骤2解指数方程`,
`P/(1-P) = e^Y`,
`P/(1-P) = e^${y.toFixed(4)}`,
`P/(1-P) = ${Math.exp(y).toFixed(4)}`,
``,
`步骤3求概率 P`,
`P = e^Y / (1 + e^Y)`,
`P = ${p.toFixed(4)}`,
``,
`GHD预测概率${(p * 100).toFixed(2)}%`
].join('\n'),
interpretation: this.getInterpretation(p)
}
});
} catch (error) {
wx.showToast({
title: error.message || '计算失败',
icon: 'none'
});
}
},
// 输入验证
validateInput() {
const { ba, ca, igf1, igfbp3 } = this.data;
if (!ba || !ca || !igf1 || !igfbp3) {
wx.showToast({
title: '请填写完整信息',
icon: 'none'
});
return false;
}
// 验证输入是否为有效数字
const baNum = parseFloat(ba);
const caNum = parseFloat(ca);
const igf1Num = parseFloat(igf1);
const igfbp3Num = parseFloat(igfbp3);
if (isNaN(baNum) || isNaN(caNum) || isNaN(igf1Num) || isNaN(igfbp3Num)) {
wx.showToast({
title: '请输入有效数字',
icon: 'none'
});
return false;
}
// 验证数值范围
if (baNum <= 0 || caNum <= 0) {
wx.showToast({
title: '年龄必须大于0',
icon: 'none'
});
return false;
}
return true;
},
// 计算Y值
calculateY(baCaDiff, igf1, igfbp3) {
return 3.726 - 0.876 * baCaDiff - 0.058 * igf1 + 0.229 * igfbp3;
},
// 计算概率
calculateProbability(y) {
const expY = Math.exp(y);
return expY / (1 + expY);
},
// 计算各因素的贡献
calculateContributions(baCaDiff, igf1, igfbp3) {
// Implementation of calculateContributions method
},
// 获取解释文本
getInterpretation(p) {
const percentage = (p * 100).toFixed(2);
let interpretation = `预测结果显示该患者患有GHD的概率为${percentage}%\n\n`;
if (p >= 0.8) {
interpretation += '预测结果提示GHD可能性较大建议进一步进行相关检查。';
} else if (p >= 0.5) {
interpretation += '预测结果提示存在GHD可能建议进行相关检查。';
} else {
interpretation += '预测结果提示GHD可能性较小但仍需结合临床表现进行综合判断。';
}
return interpretation;
},
// 重置表单
reset() {
this.setData({
ba: '',
ca: '',
igf1: '',
igfbp3: '',
showResult: false,
probability: null,
calculationDetails: null
});
},
// 返回上一页
onClickLeft() {
wx.navigateBack();
}
});