113 lines
3.0 KiB
TypeScript
113 lines
3.0 KiB
TypeScript
export const CARE_TASK_TYPE_VALUES = ["daily_care", "meal", "medication", "rehab", "inspection", "cleaning", "other"] as const;
|
|
export type CareTaskType = (typeof CARE_TASK_TYPE_VALUES)[number];
|
|
|
|
export const CARE_TASK_PRIORITY_VALUES = ["low", "normal", "high", "urgent"] as const;
|
|
export type CareTaskPriority = (typeof CARE_TASK_PRIORITY_VALUES)[number];
|
|
|
|
export const CARE_TASK_STATUS_VALUES = ["pending", "in_progress", "completed", "cancelled"] as const;
|
|
export type CareTaskStatus = (typeof CARE_TASK_STATUS_VALUES)[number];
|
|
|
|
export const CARE_TASK_TYPE_LABELS: Record<CareTaskType, string> = {
|
|
daily_care: "日常照护",
|
|
meal: "助餐",
|
|
medication: "用药",
|
|
rehab: "康复",
|
|
inspection: "巡检",
|
|
cleaning: "清洁",
|
|
other: "其他",
|
|
};
|
|
|
|
export const CARE_TASK_PRIORITY_LABELS: Record<CareTaskPriority, string> = {
|
|
low: "低",
|
|
normal: "普通",
|
|
high: "高",
|
|
urgent: "紧急",
|
|
};
|
|
|
|
export const CARE_TASK_STATUS_LABELS: Record<CareTaskStatus, string> = {
|
|
pending: "待处理",
|
|
in_progress: "进行中",
|
|
completed: "已完成",
|
|
cancelled: "已取消",
|
|
};
|
|
|
|
export type CareTask = {
|
|
id: string;
|
|
organizationId: string;
|
|
elderId?: string;
|
|
elderName: string;
|
|
title: string;
|
|
careType: CareTaskType;
|
|
priority: CareTaskPriority;
|
|
status: CareTaskStatus;
|
|
scheduledAt: string;
|
|
assigneeLabel: string;
|
|
executionNotes: string;
|
|
completedAt?: string;
|
|
completedByAccountId?: string;
|
|
completedByName?: string;
|
|
createdAt: string;
|
|
updatedAt: string;
|
|
};
|
|
|
|
export type CareExecutionMetrics = {
|
|
pending: number;
|
|
inProgress: number;
|
|
completedToday: number;
|
|
highPriority: number;
|
|
};
|
|
|
|
export type CareExecutionData = {
|
|
metrics: CareExecutionMetrics;
|
|
tasks: CareTask[];
|
|
};
|
|
|
|
export type CareTaskStatusUpdateInput = {
|
|
status: CareTaskStatus;
|
|
executionNotes: string;
|
|
};
|
|
|
|
type ValidationSuccess<T> = {
|
|
success: true;
|
|
data: T;
|
|
};
|
|
|
|
type ValidationFailure = {
|
|
success: false;
|
|
reason: string;
|
|
};
|
|
|
|
export type ValidationResult<T> = ValidationSuccess<T> | ValidationFailure;
|
|
|
|
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
}
|
|
|
|
function readString(source: Record<string, unknown>, key: string): string {
|
|
const value = source[key];
|
|
return typeof value === "string" ? value.trim() : "";
|
|
}
|
|
|
|
function readEnum<T extends string>(value: unknown, values: readonly T[]): T | null {
|
|
return typeof value === "string" ? values.find((item) => item === value) ?? null : null;
|
|
}
|
|
|
|
export function validateCareTaskStatusUpdateInput(value: unknown): ValidationResult<CareTaskStatusUpdateInput> {
|
|
if (!isRecord(value)) {
|
|
return { success: false, reason: "请求数据格式无效" };
|
|
}
|
|
|
|
const status = readEnum(value.status, CARE_TASK_STATUS_VALUES);
|
|
if (!status) {
|
|
return { success: false, reason: "护理任务状态无效" };
|
|
}
|
|
|
|
return {
|
|
success: true,
|
|
data: {
|
|
status,
|
|
executionNotes: readString(value, "executionNotes"),
|
|
},
|
|
};
|
|
}
|