Add File
This commit is contained in:
206
src/family/services/scheduleService.ts
Normal file
206
src/family/services/scheduleService.ts
Normal file
@@ -0,0 +1,206 @@
|
||||
/**
|
||||
* 家人端 - 日程管理服务
|
||||
* 提供护理计划的增删改查功能
|
||||
*/
|
||||
|
||||
const API_BASE_URL = 'http://localhost:8000/api';
|
||||
|
||||
export interface Schedule {
|
||||
id?: number;
|
||||
family_id: string;
|
||||
title: string;
|
||||
description?: string;
|
||||
schedule_type?: 'medication' | 'exercise' | 'meal' | 'checkup' | 'other';
|
||||
schedule_time: string; // ISO 8601 格式
|
||||
repeat_type?: 'once' | 'daily' | 'weekly' | 'monthly';
|
||||
repeat_days?: string; // JSON 字符串,如 "[1,3,5]"
|
||||
status?: 'pending' | 'completed' | 'skipped' | 'missed';
|
||||
completed_at?: string;
|
||||
auto_remind?: number; // 数字人自动播报:1=启用,0=禁用
|
||||
is_active?: number;
|
||||
created_by?: number;
|
||||
created_at?: string;
|
||||
updated_at?: string;
|
||||
creator_name?: string;
|
||||
}
|
||||
|
||||
export interface ScheduleResponse {
|
||||
schedules: Schedule[];
|
||||
}
|
||||
|
||||
export interface CreateScheduleResponse {
|
||||
success: boolean;
|
||||
schedule_id: number;
|
||||
}
|
||||
|
||||
export interface UpdateScheduleResponse {
|
||||
success: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取家庭所有日程
|
||||
*/
|
||||
export async function getFamilySchedules(familyId: string): Promise<Schedule[]> {
|
||||
try {
|
||||
const response = await fetch(
|
||||
`${API_BASE_URL}/family/schedules?family_id=${familyId}`
|
||||
);
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`获取日程失败: ${response.statusText}`);
|
||||
}
|
||||
|
||||
const data: ScheduleResponse = await response.json();
|
||||
return data.schedules || [];
|
||||
} catch (error) {
|
||||
console.error('获取日程错误:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建新日程
|
||||
*/
|
||||
export async function createSchedule(schedule: Schedule): Promise<number> {
|
||||
try {
|
||||
const response = await fetch(`${API_BASE_URL}/family/schedules`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify(schedule),
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`创建日程失败: ${response.statusText}`);
|
||||
}
|
||||
|
||||
const data: CreateScheduleResponse = await response.json();
|
||||
return data.schedule_id;
|
||||
} catch (error) {
|
||||
console.error('创建日程错误:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新日程
|
||||
*/
|
||||
export async function updateSchedule(
|
||||
scheduleId: number,
|
||||
updates: Partial<Schedule>
|
||||
): Promise<boolean> {
|
||||
try {
|
||||
const response = await fetch(
|
||||
`${API_BASE_URL}/family/schedules/${scheduleId}`,
|
||||
{
|
||||
method: 'PUT',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify(updates),
|
||||
}
|
||||
);
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`更新日程失败: ${response.statusText}`);
|
||||
}
|
||||
|
||||
const data: UpdateScheduleResponse = await response.json();
|
||||
return data.success;
|
||||
} catch (error) {
|
||||
console.error('更新日程错误:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除日程(软删除)
|
||||
*/
|
||||
export async function deleteSchedule(scheduleId: number): Promise<boolean> {
|
||||
try {
|
||||
const response = await fetch(
|
||||
`${API_BASE_URL}/family/schedules/${scheduleId}`,
|
||||
{
|
||||
method: 'DELETE',
|
||||
}
|
||||
);
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`删除日程失败: ${response.statusText}`);
|
||||
}
|
||||
|
||||
const data: UpdateScheduleResponse = await response.json();
|
||||
return data.success;
|
||||
} catch (error) {
|
||||
console.error('删除日程错误:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 格式化日期时间为 ISO 字符串
|
||||
*/
|
||||
export function formatDateTime(date: Date): string {
|
||||
const year = date.getFullYear();
|
||||
const month = String(date.getMonth() + 1).padStart(2, '0');
|
||||
const day = String(date.getDate()).padStart(2, '0');
|
||||
const hours = String(date.getHours()).padStart(2, '0');
|
||||
const minutes = String(date.getMinutes()).padStart(2, '0');
|
||||
const seconds = String(date.getSeconds()).padStart(2, '0');
|
||||
|
||||
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取日程类型的显示名称
|
||||
*/
|
||||
export function getScheduleTypeLabel(type: string): string {
|
||||
const labels: Record<string, string> = {
|
||||
medication: '用药',
|
||||
exercise: '运动',
|
||||
meal: '饮食',
|
||||
checkup: '检查',
|
||||
other: '其他',
|
||||
};
|
||||
return labels[type] || type;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取重复类型的显示名称
|
||||
*/
|
||||
export function getRepeatTypeLabel(type: string): string {
|
||||
const labels: Record<string, string> = {
|
||||
once: '单次',
|
||||
daily: '每天',
|
||||
weekly: '每周',
|
||||
monthly: '每月',
|
||||
};
|
||||
return labels[type] || type;
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析重复日期(星期几)
|
||||
*/
|
||||
export function parseRepeatDays(repeatDays: string): number[] {
|
||||
try {
|
||||
return JSON.parse(repeatDays || '[]');
|
||||
} catch {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 格式化重复日期为字符串
|
||||
*/
|
||||
export function formatRepeatDays(days: number[]): string {
|
||||
return JSON.stringify(days);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取星期几的显示名称
|
||||
*/
|
||||
export function getWeekdayLabel(day: number): string {
|
||||
const labels = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
|
||||
return labels[day] || '';
|
||||
}
|
||||
Reference in New Issue
Block a user