Add File
This commit is contained in:
228
src/elderly/services/moodService.ts
Normal file
228
src/elderly/services/moodService.ts
Normal file
@@ -0,0 +1,228 @@
|
||||
/**
|
||||
* 老人端情绪记录服务
|
||||
* 负责记录和查询老人的情绪状态
|
||||
*/
|
||||
|
||||
const API_BASE_URL = 'http://localhost:8000/api';
|
||||
|
||||
export type MoodType = 'happy' | 'calm' | 'sad' | 'anxious' | 'angry' | 'tired';
|
||||
|
||||
export interface MoodRecord {
|
||||
id?: number;
|
||||
family_id: string;
|
||||
elderly_id?: number;
|
||||
mood_type: MoodType;
|
||||
mood_score: number; // 1-10
|
||||
note?: string;
|
||||
source?: 'manual' | 'ai_detect' | 'voice';
|
||||
trigger_event?: string;
|
||||
location?: string;
|
||||
weather?: string;
|
||||
recorded_at?: string;
|
||||
created_at?: string;
|
||||
}
|
||||
|
||||
export interface MoodRecordResponse {
|
||||
records: MoodRecord[];
|
||||
total: number;
|
||||
limit: number;
|
||||
offset: number;
|
||||
}
|
||||
|
||||
/**
|
||||
* 情绪类型对应的分数范围
|
||||
*/
|
||||
export const moodScoreMap: Record<MoodType, number> = {
|
||||
happy: 9,
|
||||
calm: 7,
|
||||
sad: 3,
|
||||
anxious: 4,
|
||||
angry: 2,
|
||||
tired: 5,
|
||||
};
|
||||
|
||||
/**
|
||||
* 情绪类型对应的中文名称
|
||||
*/
|
||||
export const moodLabelMap: Record<MoodType, string> = {
|
||||
happy: '开心',
|
||||
calm: '平静',
|
||||
sad: '难过',
|
||||
anxious: '焦虑',
|
||||
angry: '生气',
|
||||
tired: '疲惫',
|
||||
};
|
||||
|
||||
/**
|
||||
* 情绪类型对应的emoji
|
||||
*/
|
||||
export const moodEmojiMap: Record<MoodType, string> = {
|
||||
happy: '😊',
|
||||
calm: '😌',
|
||||
sad: '😔',
|
||||
anxious: '😰',
|
||||
angry: '😠',
|
||||
tired: '😫',
|
||||
};
|
||||
|
||||
/**
|
||||
* 创建情绪记录
|
||||
*/
|
||||
export async function createMoodRecord(
|
||||
familyId: string,
|
||||
moodType: MoodType,
|
||||
options?: {
|
||||
elderlyId?: number;
|
||||
moodScore?: number;
|
||||
note?: string;
|
||||
source?: 'manual' | 'ai_detect' | 'voice';
|
||||
triggerEvent?: string;
|
||||
location?: string;
|
||||
weather?: string;
|
||||
}
|
||||
): Promise<number> {
|
||||
try {
|
||||
const recordData: any = {
|
||||
family_id: familyId,
|
||||
mood_type: moodType,
|
||||
mood_score: options?.moodScore || moodScoreMap[moodType],
|
||||
source: options?.source || 'manual',
|
||||
};
|
||||
|
||||
if (options?.elderlyId) {
|
||||
recordData.elderly_id = options.elderlyId;
|
||||
}
|
||||
if (options?.note) {
|
||||
recordData.note = options.note;
|
||||
}
|
||||
if (options?.triggerEvent) {
|
||||
recordData.trigger_event = options.triggerEvent;
|
||||
}
|
||||
if (options?.location) {
|
||||
recordData.location = options.location;
|
||||
}
|
||||
if (options?.weather) {
|
||||
recordData.weather = options.weather;
|
||||
}
|
||||
|
||||
const response = await fetch(`${API_BASE_URL}/elderly/moods`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify(recordData),
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
const errorData = await response.json();
|
||||
console.error('创建情绪记录失败:', errorData);
|
||||
throw new Error(errorData.error || '创建情绪记录失败');
|
||||
}
|
||||
|
||||
const data = await response.json();
|
||||
console.log('情绪记录创建成功,ID:', data.record_id);
|
||||
return data.record_id;
|
||||
} catch (error) {
|
||||
console.error('创建情绪记录错误:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取情绪记录列表
|
||||
*/
|
||||
export async function getMoodRecords(
|
||||
familyId: string,
|
||||
options?: {
|
||||
elderlyId?: number;
|
||||
limit?: number;
|
||||
offset?: number;
|
||||
}
|
||||
): Promise<MoodRecordResponse> {
|
||||
try {
|
||||
const params = new URLSearchParams({
|
||||
family_id: familyId,
|
||||
});
|
||||
|
||||
if (options?.elderlyId) {
|
||||
params.append('elderly_id', options.elderlyId.toString());
|
||||
}
|
||||
if (options?.limit) {
|
||||
params.append('limit', options.limit.toString());
|
||||
}
|
||||
if (options?.offset) {
|
||||
params.append('offset', options.offset.toString());
|
||||
}
|
||||
|
||||
const response = await fetch(`${API_BASE_URL}/elderly/moods?${params}`);
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`获取情绪记录失败: ${response.statusText}`);
|
||||
}
|
||||
|
||||
return await response.json();
|
||||
} catch (error) {
|
||||
console.error('获取情绪记录错误:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取今日情绪记录
|
||||
*/
|
||||
export async function getTodayMoods(
|
||||
familyId: string,
|
||||
elderlyId?: number
|
||||
): Promise<MoodRecord[]> {
|
||||
try {
|
||||
const params = new URLSearchParams({
|
||||
family_id: familyId,
|
||||
});
|
||||
|
||||
if (elderlyId) {
|
||||
params.append('elderly_id', elderlyId.toString());
|
||||
}
|
||||
|
||||
const response = await fetch(`${API_BASE_URL}/elderly/moods/today?${params}`);
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`获取今日情绪记录失败: ${response.statusText}`);
|
||||
}
|
||||
|
||||
const data = await response.json();
|
||||
return data.records || [];
|
||||
} catch (error) {
|
||||
console.error('获取今日情绪记录错误:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取最新情绪记录
|
||||
*/
|
||||
export async function getLatestMood(
|
||||
familyId: string,
|
||||
elderlyId?: number
|
||||
): Promise<MoodRecord | null> {
|
||||
try {
|
||||
const params = new URLSearchParams({
|
||||
family_id: familyId,
|
||||
});
|
||||
|
||||
if (elderlyId) {
|
||||
params.append('elderly_id', elderlyId.toString());
|
||||
}
|
||||
|
||||
const response = await fetch(`${API_BASE_URL}/elderly/moods/latest?${params}`);
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`获取最新情绪记录失败: ${response.statusText}`);
|
||||
}
|
||||
|
||||
const data = await response.json();
|
||||
return data.record;
|
||||
} catch (error) {
|
||||
console.error('获取最新情绪记录错误:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user