/** * 睡眠通知服务 * * 负责在睡眠分析完成后发送通知,提供睡眠质量评估和建议 */ import { logger } from '@/utils/logger'; import * as Notifications from 'expo-notifications'; import { SleepAnalysisData } from './sleepMonitor'; /** * 分析睡眠数据并发送通知 */ export async function analyzeSleepAndSendNotification( analysis: SleepAnalysisData ): Promise { try { logger.info('开始分析睡眠并发送通知:', { score: analysis.sleepScore, quality: analysis.quality, duration: analysis.totalSleepHours, }); // 构建通知内容 const notification = buildSleepNotification(analysis); // 发送通知 await Notifications.scheduleNotificationAsync({ content: notification, trigger: null, // 立即发送 }); logger.info('睡眠分析通知已发送'); } catch (error) { logger.error('发送睡眠分析通知失败:', error); throw error; } } /** * 构建睡眠通知内容 */ function buildSleepNotification(analysis: SleepAnalysisData): Notifications.NotificationContentInput { const { sleepScore, quality, totalSleepHours, sleepEfficiency } = analysis; // 根据质量等级选择emoji和标题 const qualityConfig = getQualityConfig(quality); // 构建通知标题 const title = `${qualityConfig.emoji} ${qualityConfig.title}`; // 构建通知正文 const sleepDuration = formatSleepDuration(totalSleepHours); const efficiencyText = `睡眠效率 ${sleepEfficiency.toFixed(0)}%`; const body = `您昨晚睡了 ${sleepDuration},${efficiencyText}。评分:${sleepScore}分`; // 获取建议 const suggestion = getSleepSuggestion(analysis); return { title, body: `${body}\n${suggestion}`, data: { type: 'sleep_analysis', score: sleepScore, quality, analysis: JSON.stringify(analysis), url: '/sleep-detail', // 点击通知跳转到睡眠详情页 }, sound: 'default', badge: 1, }; } /** * 获取质量配置 */ function getQualityConfig(quality: string): { emoji: string; title: string; } { const configs = { excellent: { emoji: '😴', title: '睡眠质量优秀', }, good: { emoji: '😊', title: '睡眠质量良好', }, fair: { emoji: '😐', title: '睡眠质量一般', }, poor: { emoji: '😟', title: '睡眠质量较差', }, very_poor: { emoji: '😰', title: '睡眠质量很差', }, }; return configs[quality as keyof typeof configs] || { emoji: '💤', title: '睡眠分析完成', }; } /** * 格式化睡眠时长 */ function formatSleepDuration(hours: number): string { const h = Math.floor(hours); const m = Math.round((hours - h) * 60); if (m === 0) { return `${h}小时`; } return `${h}小时${m}分钟`; } /** * 获取睡眠建议 */ function getSleepSuggestion(analysis: SleepAnalysisData): string { const { quality, totalSleepHours, deepSleepPercentage, remSleepPercentage, sleepEfficiency } = analysis; // 优秀或良好的睡眠 if (quality === 'excellent' || quality === 'good') { const tips = [ '继续保持良好的睡眠习惯!', '坚持规律作息,身体会感谢你!', '优质睡眠让你精力充沛!', ]; return tips[Math.floor(Math.random() * tips.length)]; } // 根据具体问题给出建议 const suggestions: string[] = []; if (totalSleepHours < 7) { suggestions.push('建议增加睡眠时间至7-9小时'); } else if (totalSleepHours > 9) { suggestions.push('睡眠时间偏长,注意睡眠质量'); } if (deepSleepPercentage < 13) { suggestions.push('深度睡眠不足,睡前避免使用电子设备'); } if (remSleepPercentage < 20) { suggestions.push('REM睡眠不足,保持规律的作息时间'); } if (sleepEfficiency < 85) { suggestions.push('睡眠效率较低,改善睡眠环境'); } // 如果有具体建议,返回第一条;否则返回通用建议 if (suggestions.length > 0) { return `💡 ${suggestions[0]}`; } return '建议关注睡眠质量,保持良好作息'; } /** * 发送简单的睡眠提醒(用于测试) */ export async function sendSimpleSleepReminder(userName: string = '朋友'): Promise { try { await Notifications.scheduleNotificationAsync({ content: { title: '😴 睡眠质量分析', body: `${userName},您的睡眠数据已更新,点击查看详细分析`, data: { type: 'sleep_reminder', url: '/sleep-detail', }, sound: 'default', }, trigger: null, }); logger.info('简单睡眠提醒已发送'); } catch (error) { logger.error('发送简单睡眠提醒失败:', error); } }