refactor(miniprogram): 体征阈值改用动态 API — 替代硬编码参考范围
- health.ts 新增 getHealthThresholds/findThreshold/DEFAULT_THRESHOLDS - 24h storage 缓存 + 降级到内置默认值 - health/index.tsx: REF_RANGES → buildRefRange(thresholds) - pkg-health/input: WARN_THRESHOLDS → getWarnForIndicator(thresholds)
This commit is contained in:
@@ -2,7 +2,7 @@ import { useState } from 'react';
|
||||
import { View, Text, Input, Picker } from '@tarojs/components';
|
||||
import Taro, { useDidShow } from '@tarojs/taro';
|
||||
import { z } from 'zod';
|
||||
import { inputVitalSign } from '../../../services/health';
|
||||
import { inputVitalSign, getHealthThresholds, findThreshold, DEFAULT_THRESHOLDS, type HealthThreshold } from '../../../services/health';
|
||||
import { useAuthStore } from '../../../stores/auth';
|
||||
import { useHealthStore } from '@/stores/health';
|
||||
import { usePointsStore } from '@/stores/points';
|
||||
@@ -29,14 +29,30 @@ const vitalSignSchema = z.object({
|
||||
note: z.string().max(200, '备注不能超过200字').optional(),
|
||||
});
|
||||
|
||||
const WARN_THRESHOLDS: Record<string, { max?: number; min?: number; warning: string }> = {
|
||||
blood_pressure: { max: 180, warning: '收缩压偏高,建议及时就医' },
|
||||
heart_rate: { max: 120, min: 50, warning: '心率异常,请注意休息' },
|
||||
blood_sugar_fasting: { max: 11.0, warning: '血糖偏高,建议就医检查' },
|
||||
};
|
||||
/** 根据动态阈值生成警告配置 */
|
||||
function getWarnForIndicator(
|
||||
thresholds: HealthThreshold[],
|
||||
indicator: string,
|
||||
): { max?: number; min?: number; warning: string } | null {
|
||||
const high = findThreshold(thresholds, indicator === 'blood_pressure' ? 'systolic_bp' : indicator, 'high');
|
||||
const low = findThreshold(thresholds, indicator === 'blood_pressure' ? 'systolic_bp' : indicator, 'low');
|
||||
if (!high && !low) return null;
|
||||
const warningMap: Record<string, string> = {
|
||||
blood_pressure: '收缩压偏高,建议及时就医',
|
||||
heart_rate: '心率异常,请注意休息',
|
||||
blood_sugar_fasting: '血糖偏高,建议就医检查',
|
||||
blood_sugar_postprandial: '血糖偏高,建议就医检查',
|
||||
};
|
||||
return {
|
||||
max: high?.threshold_value,
|
||||
min: low?.threshold_value,
|
||||
warning: warningMap[indicator] ?? '数值异常,请关注',
|
||||
};
|
||||
}
|
||||
|
||||
export default function HealthInput() {
|
||||
const [indicatorIdx, setIndicatorIdx] = useState(0);
|
||||
const [thresholds, setThresholds] = useState<HealthThreshold[]>(DEFAULT_THRESHOLDS);
|
||||
const [value, setValue] = useState('');
|
||||
const [systolic, setSystolic] = useState('');
|
||||
const [diastolic, setDiastolic] = useState('');
|
||||
@@ -47,6 +63,7 @@ export default function HealthInput() {
|
||||
|
||||
/** 从 storage 中读取设备同步回传的数据并自动填充表单 */
|
||||
useDidShow(() => {
|
||||
getHealthThresholds().then((t) => { if (t.length > 0) setThresholds(t); });
|
||||
try {
|
||||
const raw = Taro.getStorageSync('device_sync_result');
|
||||
if (!raw) return;
|
||||
@@ -102,7 +119,7 @@ export default function HealthInput() {
|
||||
return;
|
||||
}
|
||||
|
||||
const threshold = WARN_THRESHOLDS[currentIndicator];
|
||||
const threshold = getWarnForIndicator(thresholds, currentIndicator);
|
||||
if (threshold) {
|
||||
const val = input.value;
|
||||
if ((threshold.max && val > threshold.max) || (threshold.min && val < threshold.min)) {
|
||||
|
||||
Reference in New Issue
Block a user