diff --git a/niucloud/app/common.php b/niucloud/app/common.php index 4bb49e97..f1d57b3b 100644 --- a/niucloud/app/common.php +++ b/niucloud/app/common.php @@ -1147,3 +1147,70 @@ function isPhone($mobile) { return preg_match('/^1[3456789]\d{9}$/', $mobile); } + +/** + * 体测评分 + * @param int $age年龄 + * @param int $gender性别( 1:男,2:女) + * @param int $height身高 + * @param int $weight体重 + */ +function calculateChildHealthScore($age, $gender, $height, $weight) { + // WHO 标准数据(简化版)——单位:cm/kg + // 示例使用中位数及上下限估算(实际可使用更精确的Z-score或百分位表) + + $reference = [ + '1' => [ + 3 => ['height_median' => 96.5, 'height_low' => 91.5, 'height_high' => 101.5, 'weight_median' => 14.2, 'weight_low' => 12.3, 'weight_high' => 16.5], + 5 => ['height_median' => 110.0, 'height_low' => 104.5, 'height_high' => 115.5, 'weight_median' => 18.0, 'weight_low' => 15.6, 'weight_high' => 21.0], + 7 => ['height_median' => 123.0, 'height_low' => 117.0, 'height_high' => 129.0, 'weight_median' => 22.5, 'weight_low' => 19.5, 'weight_high' => 26.0], + 10 => ['height_median' => 138.0, 'height_low' => 131.0, 'height_high' => 145.0, 'weight_median' => 29.5, 'weight_low' => 25.5, 'weight_high' => 34.0], + 12 => ['height_median' => 148.5, 'height_low' => 141.0, 'height_high' => 156.0, 'weight_median' => 36.0, 'weight_low' => 31.0, 'weight_high' => 42.0], + 15 => ['height_median' => 164.0, 'height_low' => 155.0, 'height_high' => 173.0, 'weight_median' => 50.0, 'weight_low' => 43.0, 'weight_high' => 58.0], + 18 => ['height_median' => 170.0, 'height_low' => 161.0, 'height_high' => 179.0, 'weight_median' => 58.0, 'weight_low' => 50.0, 'weight_high' => 67.0], + ], + '2' => [ + 3 => ['height_median' => 95.5, 'height_low' => 90.5, 'height_high' => 100.5, 'weight_median' => 13.8, 'weight_low' => 12.0, 'weight_high' => 16.0], + 5 => ['height_median' => 109.0, 'height_low' => 103.5, 'height_high' => 114.5, 'weight_median' => 17.8, 'weight_low' => 15.3, 'weight_high' => 20.5], + 7 => ['height_median' => 122.0, 'height_low' => 116.0, 'height_high' => 128.0, 'weight_median' => 22.0, 'weight_low' => 19.0, 'weight_high' => 25.5], + 10 => ['height_median' => 137.0, 'height_low' => 130.0, 'height_high' => 144.0, 'weight_median' => 29.0, 'weight_low' => 25.0, 'weight_high' => 33.5], + 12 => ['height_median' => 150.0, 'height_low' => 142.0, 'height_high' => 158.0, 'weight_median' => 37.0, 'weight_low' => 31.5, 'weight_high' => 43.0], + 15 => ['height_median' => 158.0, 'height_low' => 150.0, 'height_high' => 166.0, 'weight_median' => 48.0, 'weight_low' => 41.0, 'weight_high' => 56.0], + 18 => ['height_median' => 159.0, 'height_low' => 152.0, 'height_high' => 166.0, 'weight_median' => 53.0, 'weight_low' => 46.0, 'weight_high' => 61.0], + ] + ]; + + if (!isset($reference[$gender][$age])) { + return 0; // 年龄不在范围内 + } + + $data = $reference[$gender][$age]; + + // 身高评分(线性插值) + $height_score = 100; + if ($height < $data['height_low']) { + $height_score = max(0, 50 * ($height - $data['height_low']) / ($data['height_median'] - $data['height_low'])); + } elseif ($height > $data['height_high']) { + $height_score = max(0, 50 + 50 * ($data['height_high'] - $height) / ($data['height_high'] - $data['height_median'])); + } else { + $height_score = 50 + 50 * (abs($height - $data['height_median']) / ($data['height_median'] - $data['height_low'])) * ($height > $data['height_median'] ? 1 : -1); + $height_score = max(0, min(100, $height_score)); + } + + // 体重评分 + $weight_score = 100; + if ($weight < $data['weight_low']) { + $weight_score = max(0, 50 * ($weight - $data['weight_low']) / ($data['weight_median'] - $data['weight_low'])); + } elseif ($weight > $data['weight_high']) { + $weight_score = max(0, 50 + 50 * ($data['weight_high'] - $weight) / ($data['weight_high'] - $data['weight_median'])); + } else { + $weight_score = 50 + 50 * (abs($weight - $data['weight_median']) / ($data['weight_median'] - $data['weight_low'])) * ($weight > $data['weight_median'] ? 1 : -1); + $weight_score = max(0, min(100, $weight_score)); + } + + // 综合评分 + $total_score = ($height_score + $weight_score) / 2; + + // 四舍五入取整 + return round($total_score); +}