pet/utils/healthManager.js

502 lines
13 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 宠物健康数据管理工具类
* 负责整合体重、疫苗、健康记录等数据,提供综合健康评估
*/
import weightManager from './weightManager.js'
import vaccineManager from './vaccineManager.js'
class HealthManager {
constructor() {
this.storageKey = 'pet_health_records'
// 健康记录类型定义
this.recordTypes = {
medical: {
name: '就医记录',
icon: '🏥',
color: '#F44336'
},
checkup: {
name: '体检记录',
icon: '🔍',
color: '#2196F3'
},
symptom: {
name: '异常症状',
icon: '⚠️',
color: '#FF9800'
},
medication: {
name: '用药记录',
icon: '💊',
color: '#9C27B0'
},
surgery: {
name: '手术记录',
icon: '🔪',
color: '#795548'
}
}
// 健康评分权重配置
this.scoreWeights = {
weight: 0.3, // 体重状态权重
vaccine: 0.3, // 疫苗状态权重
medical: 0.2, // 医疗记录权重
growth: 0.2 // 生长发育权重
}
}
/**
* 获取宠物的健康记录
* @param {string} petId 宠物ID
* @returns {Array} 健康记录数组
*/
getHealthRecords(petId) {
try {
const allRecords = uni.getStorageSync(this.storageKey) || {}
let records = allRecords[petId] || []
// 如果没有数据,初始化一些测试数据
if (records.length === 0) {
records = this.initializeTestData(petId)
allRecords[petId] = records
uni.setStorageSync(this.storageKey, allRecords)
}
return records
} catch (error) {
console.error('获取健康记录失败:', error)
return this.initializeTestData(petId)
}
}
/**
* 初始化测试数据
* @param {string} petId 宠物ID
* @returns {Array} 测试数据数组
*/
initializeTestData(petId) {
const now = new Date()
const testData = []
// 体检记录
testData.push({
id: Date.now() + 1,
petId: petId,
type: 'checkup',
title: '年度体检',
date: new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000).toISOString(),
description: '全面体检,各项指标正常',
result: 'normal',
hospital: '宠物医院',
veterinarian: '张医生',
cost: 200,
note: '建议半年后复查'
})
// 就医记录
testData.push({
id: Date.now() + 2,
petId: petId,
type: 'medical',
title: '感冒治疗',
date: new Date(now.getTime() - 60 * 24 * 60 * 60 * 1000).toISOString(),
description: '轻微感冒症状,开具感冒药',
result: 'treated',
hospital: '宠物医院',
veterinarian: '李医生',
cost: 80,
note: '已康复'
})
// 异常症状记录
testData.push({
id: Date.now() + 3,
petId: petId,
type: 'symptom',
title: '食欲不振',
date: new Date(now.getTime() - 90 * 24 * 60 * 60 * 1000).toISOString(),
description: '连续两天食欲不佳,精神状态一般',
result: 'resolved',
hospital: '',
veterinarian: '',
cost: 0,
note: '自行恢复'
})
return testData
}
/**
* 添加健康记录
* @param {string} petId 宠物ID
* @param {Object} record 健康记录
*/
addHealthRecord(petId, record) {
try {
const allRecords = uni.getStorageSync(this.storageKey) || {}
if (!allRecords[petId]) {
allRecords[petId] = []
}
const newRecord = {
id: Date.now(),
petId: petId,
type: record.type,
title: record.title,
date: record.date || new Date().toISOString(),
description: record.description || '',
result: record.result || 'pending',
hospital: record.hospital || '',
veterinarian: record.veterinarian || '',
cost: record.cost || 0,
note: record.note || ''
}
allRecords[petId].push(newRecord)
allRecords[petId].sort((a, b) => new Date(b.date) - new Date(a.date))
uni.setStorageSync(this.storageKey, allRecords)
return newRecord
} catch (error) {
console.error('添加健康记录失败:', error)
return null
}
}
/**
* 获取综合健康数据
* @param {string} petId 宠物ID
* @param {Object} petInfo 宠物信息
* @returns {Object} 综合健康数据
*/
getComprehensiveHealthData(petId, petInfo) {
// 获取各类数据
const weightData = this.getWeightHealthData(petId)
const vaccineData = this.getVaccineHealthData(petId)
const medicalData = this.getMedicalHealthData(petId)
const growthData = this.getGrowthHealthData(petId, petInfo)
// 计算综合健康评分
const healthScore = this.calculateHealthScore(weightData, vaccineData, medicalData, growthData)
// 生成健康趋势
const healthTrend = this.analyzeHealthTrend(petId)
// 识别风险因素
const riskFactors = this.identifyRiskFactors(weightData, vaccineData, medicalData)
return {
healthScore,
healthTrend,
riskFactors,
weightData,
vaccineData,
medicalData,
growthData
}
}
/**
* 获取体重健康数据
* @param {string} petId 宠物ID
* @returns {Object} 体重健康数据
*/
getWeightHealthData(petId) {
const currentWeight = weightManager.getCurrentWeight(petId)
const weeklyChange = weightManager.calculateWeightChange(petId, 7)
const monthlyChange = weightManager.calculateWeightChange(petId, 30)
// 体重状态评分 (0-100)
let weightScore = 85 // 默认良好
if (Math.abs(weeklyChange.percent) > 10) {
weightScore = 60 // 变化过快
} else if (Math.abs(weeklyChange.percent) > 5) {
weightScore = 75 // 变化较快
}
return {
currentWeight,
weeklyChange,
monthlyChange,
weightScore,
status: weightScore >= 80 ? 'good' : weightScore >= 60 ? 'warning' : 'poor'
}
}
/**
* 获取疫苗健康数据
* @param {string} petId 宠物ID
* @returns {Object} 疫苗健康数据
*/
getVaccineHealthData(petId) {
const statusSummary = vaccineManager.getVaccineStatusSummary(petId)
// 疫苗状态评分
let vaccineScore = statusSummary.completionRate
if (statusSummary.expired > 0) {
vaccineScore -= 20
}
if (statusSummary.expiringSoon > 0) {
vaccineScore -= 10
}
return {
statusSummary,
vaccineScore: Math.max(0, vaccineScore),
status: vaccineScore >= 80 ? 'good' : vaccineScore >= 60 ? 'warning' : 'poor'
}
}
/**
* 获取医疗健康数据
* @param {string} petId 宠物ID
* @returns {Object} 医疗健康数据
*/
getMedicalHealthData(petId) {
const records = this.getHealthRecords(petId)
const now = new Date()
const threeMonthsAgo = new Date(now.getTime() - 90 * 24 * 60 * 60 * 1000)
// 近三个月的医疗记录
const recentRecords = records.filter(record => new Date(record.date) >= threeMonthsAgo)
const medicalVisits = recentRecords.filter(record => record.type === 'medical').length
const symptoms = recentRecords.filter(record => record.type === 'symptom').length
// 医疗状态评分
let medicalScore = 90 // 默认健康
if (medicalVisits > 2) {
medicalScore = 60 // 就医频繁
} else if (medicalVisits > 0 || symptoms > 1) {
medicalScore = 75 // 有健康问题
}
return {
totalRecords: records.length,
recentRecords: recentRecords.length,
medicalVisits,
symptoms,
medicalScore,
status: medicalScore >= 80 ? 'good' : medicalScore >= 60 ? 'warning' : 'poor'
}
}
/**
* 获取生长发育数据
* @param {string} petId 宠物ID
* @param {Object} petInfo 宠物信息
* @returns {Object} 生长发育数据
*/
getGrowthHealthData(petId, petInfo) {
const age = petInfo.age || 2
const currentWeight = weightManager.getCurrentWeight(petId)
// 根据年龄判断生长阶段
let growthStage = 'adult'
if (age < 1) {
growthStage = 'kitten'
} else if (age < 2) {
growthStage = 'young'
} else if (age > 7) {
growthStage = 'senior'
}
// 生长发育评分
let growthScore = 85
if (growthStage === 'kitten' && currentWeight < 2) {
growthScore = 70 // 幼猫体重偏轻
} else if (growthStage === 'senior' && currentWeight > 6) {
growthScore = 75 // 老年猫超重
}
return {
age,
growthStage,
currentWeight,
growthScore,
status: growthScore >= 80 ? 'good' : growthScore >= 60 ? 'warning' : 'poor'
}
}
/**
* 计算综合健康评分
* @param {Object} weightData 体重数据
* @param {Object} vaccineData 疫苗数据
* @param {Object} medicalData 医疗数据
* @param {Object} growthData 生长数据
* @returns {number} 健康评分
*/
calculateHealthScore(weightData, vaccineData, medicalData, growthData) {
const score =
weightData.weightScore * this.scoreWeights.weight +
vaccineData.vaccineScore * this.scoreWeights.vaccine +
medicalData.medicalScore * this.scoreWeights.medical +
growthData.growthScore * this.scoreWeights.growth
return Math.round(score)
}
/**
* 分析健康趋势
* @param {string} petId 宠物ID
* @returns {string} 趋势分析
*/
analyzeHealthTrend(petId) {
const weightChange = weightManager.calculateWeightChange(petId, 30)
const healthRecords = this.getHealthRecords(petId)
// 简化的趋势分析
if (healthRecords.length === 0) {
return 'stable'
}
const recentRecords = healthRecords.filter(record => {
const recordDate = new Date(record.date)
const thirtyDaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000)
return recordDate >= thirtyDaysAgo
})
if (recentRecords.length > 2) {
return 'declining'
} else if (recentRecords.length === 0 && Math.abs(weightChange.percent) < 3) {
return 'improving'
} else {
return 'stable'
}
}
/**
* 识别风险因素
* @param {Object} weightData 体重数据
* @param {Object} vaccineData 疫苗数据
* @param {Object} medicalData 医疗数据
* @returns {Array} 风险因素列表
*/
identifyRiskFactors(weightData, vaccineData, medicalData) {
const risks = []
if (weightData.status === 'poor') {
risks.push({
type: 'weight',
level: 'high',
description: '体重变化异常,需要关注饮食和运动'
})
}
if (vaccineData.statusSummary.expired > 0) {
risks.push({
type: 'vaccine',
level: 'high',
description: '疫苗已过期,免疫保护失效'
})
}
if (medicalData.medicalVisits > 2) {
risks.push({
type: 'medical',
level: 'medium',
description: '近期就医频繁,需要关注健康状况'
})
}
return risks
}
/**
* 生成AI健康分析
* @param {string} petId 宠物ID
* @param {Object} petInfo 宠物信息
* @returns {Object} AI分析结果
*/
generateAIHealthAnalysis(petId, petInfo) {
const healthData = this.getComprehensiveHealthData(petId, petInfo)
// 综合评估
let overallAssessment = ''
if (healthData.healthScore >= 85) {
overallAssessment = `${petInfo.name}的整体健康状况优秀,各项指标均在正常范围内。`
} else if (healthData.healthScore >= 70) {
overallAssessment = `${petInfo.name}的健康状况良好,但有一些需要关注的方面。`
} else {
overallAssessment = `${petInfo.name}的健康状况需要改善,建议加强健康管理。`
}
// 趋势分析
const trendTexts = {
'improving': '健康状况呈改善趋势,继续保持良好的护理习惯。',
'stable': '健康状况保持稳定,维持当前的护理方式。',
'declining': '健康状况有下降趋势,建议加强关注并考虑就医。'
}
const trendAnalysis = trendTexts[healthData.healthTrend] || '健康趋势需要进一步观察。'
// 个性化建议
const recommendations = this.generateHealthRecommendations(healthData, petInfo)
// 预防措施
const preventiveMeasures = this.generatePreventiveMeasures(healthData, petInfo)
return {
overallAssessment,
trendAnalysis,
recommendations,
preventiveMeasures,
riskFactors: healthData.riskFactors
}
}
/**
* 生成健康建议
* @param {Object} healthData 健康数据
* @param {Object} petInfo 宠物信息
* @returns {string} 健康建议
*/
generateHealthRecommendations(healthData, petInfo) {
const recommendations = []
if (healthData.weightData.status !== 'good') {
recommendations.push('调整饮食结构,控制食物分量')
}
if (healthData.vaccineData.statusSummary.expiringSoon > 0) {
recommendations.push('及时安排疫苗接种,维持免疫保护')
}
if (healthData.medicalData.symptoms > 0) {
recommendations.push('密切观察异常症状,必要时及时就医')
}
// 根据年龄阶段添加建议
if (healthData.growthData.growthStage === 'senior') {
recommendations.push('增加体检频率,关注老年期常见疾病')
} else if (healthData.growthData.growthStage === 'kitten') {
recommendations.push('确保营养充足,支持健康成长')
}
return recommendations.length > 0 ? recommendations.join('') + '。' : '继续保持良好的护理习惯。'
}
/**
* 生成预防措施
* @param {Object} healthData 健康数据
* @param {Object} petInfo 宠物信息
* @returns {string} 预防措施
*/
generatePreventiveMeasures(healthData, petInfo) {
const measures = []
measures.push('定期体检建议每6-12个月进行一次全面检查')
measures.push('保持适当运动每日互动游戏15-30分钟')
measures.push('维护口腔健康,定期检查牙齿和牙龈')
if (petInfo.age > 7) {
measures.push('老年宠物需要更频繁的健康监测')
}
return measures.join('') + '。'
}
}
export default new HealthManager()