Add File
This commit is contained in:
165
src/elderly/services/messageService.ts
Normal file
165
src/elderly/services/messageService.ts
Normal file
@@ -0,0 +1,165 @@
|
|||||||
|
/**
|
||||||
|
* 老人端留言服务
|
||||||
|
* 负责获取待播报的留言、标记已播放、点赞等操作
|
||||||
|
*/
|
||||||
|
|
||||||
|
const API_BASE_URL = 'http://localhost:8000/api';
|
||||||
|
|
||||||
|
export interface ElderlyMessage {
|
||||||
|
id: number;
|
||||||
|
family_id: string;
|
||||||
|
content: string;
|
||||||
|
sender_name: string;
|
||||||
|
sender_relation: string;
|
||||||
|
scheduled_time: string;
|
||||||
|
played: boolean;
|
||||||
|
played_at?: string;
|
||||||
|
liked: boolean;
|
||||||
|
is_active: boolean;
|
||||||
|
created_at: string;
|
||||||
|
updated_at: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取所有留言(按预约时间排序)
|
||||||
|
*/
|
||||||
|
export async function getMessages(familyId: string): Promise<ElderlyMessage[]> {
|
||||||
|
try {
|
||||||
|
const response = await fetch(
|
||||||
|
`${API_BASE_URL}/elderly/messages?family_id=${familyId}`
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(`获取留言失败: ${response.statusText}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = await response.json();
|
||||||
|
return data.messages || [];
|
||||||
|
} catch (error) {
|
||||||
|
console.error('获取留言错误:', error);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取待播放的留言(预约时间已到但未播放的)
|
||||||
|
*/
|
||||||
|
export async function getPendingMessages(familyId: string): Promise<ElderlyMessage[]> {
|
||||||
|
try {
|
||||||
|
const response = await fetch(
|
||||||
|
`${API_BASE_URL}/elderly/messages/pending?family_id=${familyId}`
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(`获取待播放留言失败: ${response.statusText}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = await response.json();
|
||||||
|
return data.messages || [];
|
||||||
|
} catch (error) {
|
||||||
|
console.error('获取待播放留言错误:', error);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 标记留言为已播放
|
||||||
|
*/
|
||||||
|
export async function markAsPlayed(messageId: number): Promise<boolean> {
|
||||||
|
try {
|
||||||
|
const response = await fetch(
|
||||||
|
`${API_BASE_URL}/elderly/messages/${messageId}/play`,
|
||||||
|
{
|
||||||
|
method: 'POST',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(`标记已播放失败: ${response.statusText}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = await response.json();
|
||||||
|
return data.success;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('标记已播放错误:', error);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 点赞留言
|
||||||
|
*/
|
||||||
|
export async function likeMessage(messageId: number): Promise<boolean> {
|
||||||
|
try {
|
||||||
|
const response = await fetch(
|
||||||
|
`${API_BASE_URL}/elderly/messages/${messageId}/like`,
|
||||||
|
{
|
||||||
|
method: 'POST',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(`点赞留言失败: ${response.statusText}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = await response.json();
|
||||||
|
return data.success;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('点赞留言错误:', error);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 取消点赞
|
||||||
|
*/
|
||||||
|
export async function unlikeMessage(messageId: number): Promise<boolean> {
|
||||||
|
try {
|
||||||
|
const response = await fetch(
|
||||||
|
`${API_BASE_URL}/elderly/messages/${messageId}/unlike`,
|
||||||
|
{
|
||||||
|
method: 'POST',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(`取消点赞失败: ${response.statusText}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = await response.json();
|
||||||
|
return data.success;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('取消点赞错误:', error);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 推送留言到数字人播报(通过5000端口的透传接口)
|
||||||
|
*/
|
||||||
|
export async function playMessageOnAvatar(message: ElderlyMessage): Promise<void> {
|
||||||
|
try {
|
||||||
|
const text = `来自${message.sender_relation}${message.sender_name}的留言:${message.content}`;
|
||||||
|
|
||||||
|
// 使用与日程相同的透传接口(5000端口)
|
||||||
|
const response = await fetch('http://127.0.0.1:5000/transparent-pass', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
user: 'User',
|
||||||
|
text: text,
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(`推送数字人播报失败: ${response.statusText}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('留言已推送到数字人播报:', text);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('推送数字人播报错误:', error);
|
||||||
|
// 不抛出错误,让流程继续
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user