feat: 优化提醒主体 & 提醒记录的表设计

This commit is contained in:
zhaoyingbo 2023-08-18 18:49:34 +08:00
parent 3f9dbc7663
commit 650b6a416b
2 changed files with 191 additions and 38 deletions

126
README.md
View File

@ -1,17 +1,25 @@
# 小煎蛋 通知系统服务端
初始的目标是替代小方糖
## 里程碑
[ ] Dockerfile & Gitea Action
[ ] webhook消息通知
[ ] 通过卡片操作药品提醒
[ ] 通过GPT接口判断用户意图创建提醒
[ ] 用药提醒 & 重复提醒
[ ] 日常提醒 & 重复提醒
[ ] 用药记录
[ ] 提醒记录
[ ] 用药统计
[ ] 提醒统计
## 零碎TODO
[ ] 用药提醒的卡片模板,确认、取消、延迟
[ ] 看看提醒统计的卡片需要什么数据应该是需要单建统计数据表看看能不能融合进Remind表加个needRepeat字段
## 项目框架 [Fastify](https://fastify.dev/)
Fastify 是一个高效、低开销、功能丰富的 Web 框架,专为提高开发人员的生产力和性能而设计。
@ -24,33 +32,58 @@ Docs [Fastify documentation](https://www.fastify.io/docs/latest/).
运行端口: 3000
## JSON结构设计
用药提醒,本质上是一个可重复提醒的闹钟,单独建一个表存
### 提醒主体信息
不论是用药提醒,还是什么提醒,本质上是一个可重复提醒的闹钟,单独建一个表存
每次提醒之后计算下次提醒时间,每次遍历列表确定是否需要提醒
```typescript
interface Remind {
/**
* id
*/
id: number;
id: string;
/**
* 提醒标题
* 卡片信息,用于绘制初始卡片、确认卡片、取消卡片、延迟卡片
*/
title: string;
cardInfo: {
/**
* 提醒标题
*/
title: string;
/**
* 提醒内容
*/
content: string;
/**
* 确认文本
*/
confirmText: string;
/**
* 取消文本
*/
cancelText: string;
/**
* 延迟文本
*/
delayText: string;
} | null;
/**
* 提醒内容
* 卡片模板ID
*/
content: string;
templateId: string;
/**
* 确认文本
* 确认之后的卡片模板ID
*/
confirmText: string;
confirmTemplateId: string;
/**
* 取消文本
* 取消之后的卡片模板ID
*/
cancelText: string;
cancelTemplateId: string;
/**
* 延迟文本
* 延迟之后的卡片模板ID
*/
delayText: string;
delayTemplateId: string;
/**
* 重复类型
* single: 一次性
@ -61,7 +94,14 @@ interface Remind {
* workday: 工作日
* holiday: 节假日
*/
frequency: 'single' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'workday' | 'holiday';
frequency:
| "single"
| "daily"
| "weekly"
| "monthly"
| "yearly"
| "workday"
| "holiday";
/**
* 提醒时间格式为HH:mm
*/
@ -69,22 +109,66 @@ interface Remind {
/**
* 星期几当frequency为weekly时有效
*/
dayOfWeek?: number;
dayOfWeek: number;
/**
* 每月的几号当frequency为monthly时有效
*/
dayOfMonth?: number;
dayOfMonth: number;
/**
* 今年的哪天提醒当frequency为single时有效格式为MM-dd
*/
day?: string;
day: string;
/**
* 每年的哪天提醒当frequency为yearly时有效格式为MM-dd
*/
dayOfYear?: string;
dayOfYear: string;
/**
* 是否启用
*/
enabled: boolean;
/**
* 下次提醒的时间格式为yyyy-MM-dd HH:mm
*/
nextRemindTime: string;
}
```
### 提醒记录
每次提醒之后记录下messageId用于确认、取消、延迟
将用户的反馈结果融合进提醒状态里,用于统计
多余的数据如选择的结果则存储进result没有留空
```typescript
interface RemindRecord {
/**
* 记录Id
*/
id: string;
/**
* 关联的提醒Id
*/
remindId: string;
/**
* 发送的卡片Id
*/
messageId: string;
/**
* 提醒状态
* pending: 待确认
* delay: 已延迟
* confirmed: 已确认
* canceled: 已取消
*/
status: "pending" | "delay" | "confirmed" | "canceled";
/**
* 本次提醒时间格式为yyyy-MM-dd HH:mm
*/
remindTime: string;
/**
* 用户回答的结果
*/
result: string;
}
```

View File

@ -1,28 +1,52 @@
/**
*
*/
interface Remind {
/**
* id
*/
id: number;
id: string;
/**
*
*
*/
title: string;
cardInfo: {
/**
*
*/
title: string;
/**
*
*/
content: string;
/**
*
*/
confirmText: string;
/**
*
*/
cancelText: string;
/**
*
*/
delayText: string;
} | null;
/**
*
* ID
*/
content: string;
templateId: string;
/**
*
* ID
*/
confirmText: string;
confirmTemplateId: string;
/**
*
* ID
*/
cancelText: string;
cancelTemplateId: string;
/**
*
* ID
*/
delayText: string;
delayTemplateId: string;
/**
*
* single: 一次性
@ -33,7 +57,14 @@ interface Remind {
* workday: 工作日
* holiday: 节假日
*/
frequency: 'single' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'workday' | 'holiday';
frequency:
| "single"
| "daily"
| "weekly"
| "monthly"
| "yearly"
| "workday"
| "holiday";
/**
* 格式为HH:mm
*/
@ -41,21 +72,59 @@ interface Remind {
/**
* frequency为weekly时有效
*/
dayOfWeek?: number;
dayOfWeek: number;
/**
* frequency为monthly时有效
*/
dayOfMonth?: number;
dayOfMonth: number;
/**
* frequency为single时有效MM-dd
*/
day?: string;
day: string;
/**
* frequency为yearly时有效MM-dd
*/
dayOfYear?: string;
dayOfYear: string;
/**
*
*/
enabled: boolean;
}
/**
* yyyy-MM-dd HH:mm
*/
nextRemindTime: string;
}
/**
*
*
*/
interface RemindRecord {
/**
* Id
*/
id: string;
/**
* Id
*/
remindId: string;
/**
* Id
*/
messageId: string;
/**
*
* pending: 待确认
* delay: 已延迟
* confirmed: 已确认
* canceled: 已取消
*/
status: "pending" | "delay" | "confirmed" | "canceled";
/**
* yyyy-MM-dd HH:mm
*/
remindTime: string;
/**
*
*/
result: string;
}