动态血压参考值

This commit is contained in:
Flow 2025-07-28 10:53:06 +08:00
parent 98bef4a83d
commit bfb6ee5b32

View File

@ -218,8 +218,10 @@ import { Loading, Delete } from '@element-plus/icons-vue'
import { ElMessageBox, ElMessage } from 'element-plus'
import { AbpmdataApi } from '@/api/abpmdata'
import { abpmApi } from '@/api/abpm'
import { ThresholdsApi } from '@/api/system/thresholds'
import dayjs from 'dayjs'
import { formatDate } from '@/utils/formatTime'
import { getUserProfile } from '@/api/system/user/profile'
//
const visible = ref(false)
@ -268,6 +270,138 @@ const patientData = reactive({
// -
const analysisResult = ref('')
//
const thresholds = ref<any>({})
//
const defaultThresholds = {
//
bp_normal_systolic: 120,
bp_normal_diastolic: 80,
bp_mild_systolic: 140,
bp_mild_diastolic: 90,
bp_moderate_systolic: 180,
bp_moderate_diastolic: 110,
//
bp_all_day_systolic: 130,
bp_all_day_diastolic: 80,
//
bp_daytime_systolic: 135,
bp_daytime_diastolic: 85,
//
bp_nighttime_systolic: 120,
bp_nighttime_diastolic: 70,
//
bp_load_min: 5,
bp_load_max: 15,
//
bp_drop_min: 10,
bp_drop_max: 20,
//
bp_load_total_systolic: 140,
bp_load_total_diastolic: 90,
bp_load_daytime_systolic: 135,
bp_load_daytime_diastolic: 85,
bp_load_nighttime_systolic: 120,
bp_load_nighttime_diastolic: 70
}
//
const loadThresholds = async (orgid: number) => {
try {
const userinfo = await getUserProfile()
if (userinfo) {
orgid = userinfo.orgid
}
const res = await ThresholdsApi.getThresholdsByOrgId(orgid)
if (res && res && res.length > 0) {
//
const thresholdMap: any = {}
res.forEach((periodGroup: any) => {
const periodType = periodGroup.periodType
const thresholdsList = periodGroup.thresholdsList || []
thresholdsList.forEach((threshold: any) => {
const metricType = threshold.metrictype
const key = `${periodType}_${metricType}`
thresholdMap[key] = {
minValue: threshold.minValue,
maxValue: threshold.maxValue,
unit: threshold.unit
}
})
})
//
thresholds.value = {
// - 使
bp_normal_systolic:
thresholdMap['全天_收缩压']?.maxValue || defaultThresholds.bp_normal_systolic,
bp_normal_diastolic:
thresholdMap['全天_舒张压']?.maxValue || defaultThresholds.bp_normal_diastolic,
bp_mild_systolic: defaultThresholds.bp_mild_systolic, //
bp_mild_diastolic: defaultThresholds.bp_mild_diastolic,
bp_moderate_systolic: defaultThresholds.bp_moderate_systolic, //
bp_moderate_diastolic: defaultThresholds.bp_moderate_diastolic,
//
bp_all_day_systolic:
thresholdMap['全天_收缩压']?.maxValue || defaultThresholds.bp_all_day_systolic,
bp_all_day_diastolic:
thresholdMap['全天_舒张压']?.maxValue || defaultThresholds.bp_all_day_diastolic,
//
bp_daytime_systolic:
thresholdMap['白天_收缩压']?.maxValue || defaultThresholds.bp_daytime_systolic,
bp_daytime_diastolic:
thresholdMap['白天_舒张压']?.maxValue || defaultThresholds.bp_daytime_diastolic,
//
bp_nighttime_systolic:
thresholdMap['夜间_收缩压']?.maxValue || defaultThresholds.bp_nighttime_systolic,
bp_nighttime_diastolic:
thresholdMap['夜间_舒张压']?.maxValue || defaultThresholds.bp_nighttime_diastolic,
// -
bp_load_min: defaultThresholds.bp_load_min,
bp_load_max: defaultThresholds.bp_load_max,
// -
bp_drop_min: defaultThresholds.bp_drop_min,
bp_drop_max: defaultThresholds.bp_drop_max,
// - 使
bp_load_total_systolic:
thresholdMap['全天_收缩压']?.maxValue || defaultThresholds.bp_load_total_systolic,
bp_load_total_diastolic:
thresholdMap['全天_舒张压']?.maxValue || defaultThresholds.bp_load_total_diastolic,
bp_load_daytime_systolic:
thresholdMap['白天_收缩压']?.maxValue || defaultThresholds.bp_load_daytime_systolic,
bp_load_daytime_diastolic:
thresholdMap['白天_舒张压']?.maxValue || defaultThresholds.bp_load_daytime_diastolic,
bp_load_nighttime_systolic:
thresholdMap['夜间_收缩压']?.maxValue || defaultThresholds.bp_load_nighttime_systolic,
bp_load_nighttime_diastolic:
thresholdMap['夜间_舒张压']?.maxValue || defaultThresholds.bp_load_nighttime_diastolic
}
} else {
// 使
thresholds.value = { ...defaultThresholds }
}
} catch (error) {
console.warn('加载阈值配置失败,使用默认配置:', error)
// 使
thresholds.value = { ...defaultThresholds }
}
}
// -
const open = async (rowData?: any) => {
if (rowData) {
@ -281,6 +415,8 @@ const open = async (rowData?: any) => {
loading.value = true
try {
//
await loadThresholds(rowData.orgid || 1)
// 1. ABPMID
const abpmPageRes = await abpmApi.getabpmPage({
examid: rowData.examid,
@ -632,9 +768,13 @@ const getGenderText = (gender: string) => {
//
const getBPStatus = (systolic: number, diastolic: number) => {
if (systolic < 120 && diastolic < 80) return '正常血压'
if (systolic < 140 && diastolic < 90) return '轻度高血压'
if (systolic < 180 && diastolic < 110) return '中度高血压'
const config = thresholds.value
if (systolic < config.bp_normal_systolic && diastolic < config.bp_normal_diastolic)
return '正常血压'
if (systolic < config.bp_mild_systolic && diastolic < config.bp_mild_diastolic)
return '轻度高血压'
if (systolic < config.bp_moderate_systolic && diastolic < config.bp_moderate_diastolic)
return '中度高血压'
return '重度高血压'
}
@ -806,19 +946,24 @@ const generateAnalysisReport = (rawList: any[]) => {
const nighttimeMeanPressure = Math.round((nighttimeSystolic + 2 * nighttimeDiastolic) / 3)
//
const config = thresholds.value
const totalSystolicLoad = (
(systolicValues.filter((v) => v >= 140).length / systolicValues.length) *
(systolicValues.filter((v) => v >= config.bp_load_total_systolic).length /
systolicValues.length) *
100
).toFixed(2)
const totalDiastolicLoad = (
(diastolicValues.filter((v) => v >= 90).length / diastolicValues.length) *
(diastolicValues.filter((v) => v >= config.bp_load_total_diastolic).length /
diastolicValues.length) *
100
).toFixed(2)
const daytimeSystolicLoad =
daytimeData.length > 0
? (
(daytimeData.filter((item) => (Number(item.systolicpressure) || 0) >= 135).length /
(daytimeData.filter(
(item) => (Number(item.systolicpressure) || 0) >= config.bp_load_daytime_systolic
).length /
daytimeData.length) *
100
).toFixed(2)
@ -826,7 +971,9 @@ const generateAnalysisReport = (rawList: any[]) => {
const daytimeDiastolicLoad =
daytimeData.length > 0
? (
(daytimeData.filter((item) => (Number(item.diastolicpressure) || 0) >= 85).length /
(daytimeData.filter(
(item) => (Number(item.diastolicpressure) || 0) >= config.bp_load_daytime_diastolic
).length /
daytimeData.length) *
100
).toFixed(2)
@ -835,7 +982,9 @@ const generateAnalysisReport = (rawList: any[]) => {
const nighttimeSystolicLoad =
nighttimeData.length > 0
? (
(nighttimeData.filter((item) => (Number(item.systolicpressure) || 0) >= 120).length /
(nighttimeData.filter(
(item) => (Number(item.systolicpressure) || 0) >= config.bp_load_nighttime_systolic
).length /
nighttimeData.length) *
100
).toFixed(2)
@ -843,7 +992,9 @@ const generateAnalysisReport = (rawList: any[]) => {
const nighttimeDiastolicLoad =
nighttimeData.length > 0
? (
(nighttimeData.filter((item) => (Number(item.diastolicpressure) || 0) >= 70).length /
(nighttimeData.filter(
(item) => (Number(item.diastolicpressure) || 0) >= config.bp_load_nighttime_diastolic
).length /
nighttimeData.length) *
100
).toFixed(2)
@ -861,16 +1012,16 @@ const generateAnalysisReport = (rawList: any[]) => {
//
const getSystolicDropType = (drop: number) => {
if (drop >= 10 && drop <= 20) return '杓型'
if (drop > 20) return '深杓型'
if (drop >= 0 && drop < 10) return '非杓型'
if (drop >= config.bp_drop_min && drop <= config.bp_drop_max) return '杓型'
if (drop > config.bp_drop_max) return '深杓型'
if (drop >= 0 && drop < config.bp_drop_min) return '非杓型'
return '反杓型'
}
const getDiastolicDropType = (drop: number) => {
if (drop >= 10 && drop <= 20) return '杓型'
if (drop > 20) return '深杓型'
if (drop >= 0 && drop < 10) return '非杓型'
if (drop >= config.bp_drop_min && drop <= config.bp_drop_max) return '杓型'
if (drop > config.bp_drop_max) return '深杓型'
if (drop >= 0 && drop < config.bp_drop_min) return '非杓型'
return '反杓型'
}
@ -884,14 +1035,14 @@ const generateAnalysisReport = (rawList: any[]) => {
}
const getLoadStatusText = (load: number) => {
return load >= 5 && load <= 15 ? '正常' : '异常'
return load >= config.bp_load_min && load <= config.bp_load_max ? '正常' : '异常'
}
//
const generateConclusion = () => {
const issues: string[] = []
if (avgSystolic >= 130 || avgDiastolic >= 80) {
if (avgSystolic >= config.bp_all_day_systolic || avgDiastolic >= config.bp_all_day_diastolic) {
issues.push('全程平均血压轻度升高')
}
@ -903,7 +1054,7 @@ const generateAnalysisReport = (rawList: any[]) => {
issues.push('夜间血压负荷>40%')
}
if (Number(systolicDrop) < 10 || Number(diastolicDrop) < 10) {
if (Number(systolicDrop) < config.bp_drop_min || Number(diastolicDrop) < config.bp_drop_min) {
issues.push('夜间血压下降不足')
}
@ -918,12 +1069,12 @@ const generateAnalysisReport = (rawList: any[]) => {
return `全程检测血压次数${totalCount}次,有效次数${effectiveCount}次,有效率${effectiveRate}%
最高收缩压${maxSystolic}mmHg发生于${maxSystolicTime}最高舒张压${maxDiastolic}mmHg发生于${maxDiastolicTime}
最低收缩压${minSystolic}mmHg发生于${minSystolicTime}最低舒张压${minDiastolic}mmHg发生于${minDiastolicTime}
整天血压平均值收缩压${avgSystolic}mmHg(${getStatusText(avgSystolic, 130)}) 正常值<130mmHg舒张压${avgDiastolic}mmHg(${getStatusText(avgDiastolic, 80)}) 正常值<80mmHg平均压${avgMeanPressure}mmHg
白天血压平均值收缩压${daytimeSystolic}mmHg(${getStatusText(daytimeSystolic, 135)}) 正常值<135mmHg舒张压${daytimeDiastolic}mmHg(${getStatusText(daytimeDiastolic, 85)}) 正常值<85mmHg平均压${daytimeMeanPressure}mmHg
夜间血压平均值收缩压${nighttimeSystolic}mmHg(${getStatusText(nighttimeSystolic, 120)}) 正常值<120mmHg舒张压${nighttimeDiastolic}mmHg(${getStatusText(nighttimeDiastolic, 70)}) 正常值<70mmHg平均压${nighttimeMeanPressure}mmHg
收缩压负荷整天${totalSystolicLoad}% ${getLoadStatusText(Number(totalSystolicLoad))}(正常范围5%-15%) 白天${daytimeSystolicLoad}% ${getLoadStatusText(Number(daytimeSystolicLoad))}(正常范围5%-15%)夜间${nighttimeSystolicLoad}% ${getLoadStatusText(Number(nighttimeSystolicLoad))}(正常范围5%-15%)
舒张压负荷整天${totalDiastolicLoad}% ${getLoadStatusText(Number(totalDiastolicLoad))}(正常范围5%-15%) 白天${daytimeDiastolicLoad}% ${getLoadStatusText(Number(daytimeDiastolicLoad))}(正常范围5%-15%)夜间${nighttimeDiastolicLoad}% ${getLoadStatusText(Number(nighttimeDiastolicLoad))}(正常范围5%-15%)
夜间比白天血压下降收缩压${systolicDrop}% ${getSystolicDropType(Number(systolicDrop))} 正常值 10%-20%舒张压${diastolicDrop}% ${getDiastolicDropType(Number(diastolicDrop))} 正常值 10%-20%
整天血压平均值收缩压${avgSystolic}mmHg(${getStatusText(avgSystolic, config.bp_all_day_systolic)}) 正常值<${config.bp_all_day_systolic}mmHg舒张压${avgDiastolic}mmHg(${getStatusText(avgDiastolic, config.bp_all_day_diastolic)}) 正常值<${config.bp_all_day_diastolic}mmHg平均压${avgMeanPressure}mmHg
白天血压平均值收缩压${daytimeSystolic}mmHg(${getStatusText(daytimeSystolic, config.bp_daytime_systolic)}) 正常值<${config.bp_daytime_systolic}mmHg舒张压${daytimeDiastolic}mmHg(${getStatusText(daytimeDiastolic, config.bp_daytime_diastolic)}) 正常值<${config.bp_daytime_diastolic}mmHg平均压${daytimeMeanPressure}mmHg
夜间血压平均值收缩压${nighttimeSystolic}mmHg(${getStatusText(nighttimeSystolic, config.bp_nighttime_systolic)}) 正常值<${config.bp_nighttime_systolic}mmHg舒张压${nighttimeDiastolic}mmHg(${getStatusText(nighttimeDiastolic, config.bp_nighttime_diastolic)}) 正常值<${config.bp_nighttime_diastolic}mmHg平均压${nighttimeMeanPressure}mmHg
收缩压负荷整天${totalSystolicLoad}% ${getLoadStatusText(Number(totalSystolicLoad))}(正常范围${config.bp_load_min}%-${config.bp_load_max}%) 白天${daytimeSystolicLoad}% ${getLoadStatusText(Number(daytimeSystolicLoad))}(正常范围${config.bp_load_min}%-${config.bp_load_max}%)夜间${nighttimeSystolicLoad}% ${getLoadStatusText(Number(nighttimeSystolicLoad))}(正常范围${config.bp_load_min}%-${config.bp_load_max}%)
舒张压负荷整天${totalDiastolicLoad}% ${getLoadStatusText(Number(totalDiastolicLoad))}(正常范围${config.bp_load_min}%-${config.bp_load_max}%) 白天${daytimeDiastolicLoad}% ${getLoadStatusText(Number(daytimeDiastolicLoad))}(正常范围${config.bp_load_min}%-${config.bp_load_max}%)夜间${nighttimeDiastolicLoad}% ${getLoadStatusText(Number(nighttimeDiastolicLoad))}(正常范围${config.bp_load_min}%-${config.bp_load_max}%)
夜间比白天血压下降收缩压${systolicDrop}% ${getSystolicDropType(Number(systolicDrop))} 正常值 ${config.bp_drop_min}%-${config.bp_drop_max}%舒张压${diastolicDrop}% ${getDiastolicDropType(Number(diastolicDrop))} 正常值 ${config.bp_drop_min}%-${config.bp_drop_max}%
${generateConclusion()}`
}
@ -1195,13 +1346,105 @@ const clearAllData = () => {
analysisResult.value = '暂无数据,无法生成分析报告'
}
//
const calculatePieChartStats = () => {
const data = chartDataTable.value
if (!data || data.length === 0) {
return {
systolic: {
day: { normal: 0, abnormal: 0 },
night: { normal: 0, abnormal: 0 },
allDay: { normal: 0, abnormal: 0 }
},
diastolic: {
day: { normal: 0, abnormal: 0 },
night: { normal: 0, abnormal: 0 },
allDay: { normal: 0, abnormal: 0 }
},
heartRate: {
day: { normal: 0, abnormal: 0 },
night: { normal: 0, abnormal: 0 },
allDay: { normal: 0, abnormal: 0 }
}
}
}
//
const isDaytime = (timeStr: string) => {
const hour = parseInt(timeStr.split(':')[0])
return hour >= 8 && hour < 22
}
//
const daytimeData = data.filter((item) => isDaytime(item.time))
const nighttimeData = data.filter((item) => !isDaytime(item.time))
//
const calculateStats = (dataSet: any[], type: 'systolic' | 'diastolic' | 'heartRate') => {
let normalCount = 0
let abnormalCount = 0
dataSet.forEach((item) => {
let value: number
let isNormal = false
if (type === 'systolic') {
value = item.systolic
// : 90-140, : 80-120
const isDayTime = isDaytime(item.time)
isNormal = isDayTime ? value >= 90 && value <= 140 : value >= 80 && value <= 120
} else if (type === 'diastolic') {
value = item.diastolic
// : 65-90, : 55-80
const isDayTime = isDaytime(item.time)
isNormal = isDayTime ? value >= 65 && value <= 90 : value >= 55 && value <= 80
} else {
// heartRate
value = item.heartRate
// : 50-90
isNormal = value >= 50 && value <= 90
}
if (isNormal) {
normalCount++
} else {
abnormalCount++
}
})
return { normal: normalCount, abnormal: abnormalCount }
}
return {
systolic: {
day: calculateStats(daytimeData, 'systolic'),
night: calculateStats(nighttimeData, 'systolic'),
allDay: calculateStats(data, 'systolic')
},
diastolic: {
day: calculateStats(daytimeData, 'diastolic'),
night: calculateStats(nighttimeData, 'diastolic'),
allDay: calculateStats(data, 'diastolic')
},
heartRate: {
day: calculateStats(daytimeData, 'heartRate'),
night: calculateStats(nighttimeData, 'heartRate'),
allDay: calculateStats(data, 'heartRate')
}
}
}
//
const handleReportPreview = () => {
//
const pieChartStats = calculatePieChartStats()
//
const reportData = {
patientData: patientData,
chartDataTable: chartDataTable.value,
analysisResult: analysisResult.value
analysisResult: analysisResult.value,
pieChartStats: pieChartStats
}
// abpm-report-template.html (public)