实现了包含药物信息管理、服药记录追踪、统计分析、自动状态更新和推送提醒的完整药物管理系统。 核心功能: - 药物 CRUD 操作,支持多种剂型和自定义服药时间 - 惰性生成服药记录策略,查询时才生成当天记录 - 定时任务自动更新过期记录状态(每30分钟) - 服药前15分钟自动推送提醒(每5分钟检查) - 每日/范围/总体统计分析功能 - 完整的 API 文档和数据库建表脚本 技术实现: - 使用 Sequelize ORM 管理 MySQL 数据表 - 集成 @nestjs/schedule 实现定时任务 - 复用现有推送通知系统发送提醒 - 采用软删除和权限验证保障数据安全
91 lines
4.8 KiB
SQL
91 lines
4.8 KiB
SQL
-- 药物管理相关表创建脚本
|
||
-- 创建时间: 2025-01-15
|
||
-- 说明: 包含药物信息表和服药记录表
|
||
|
||
-- ==========================================
|
||
-- 1. 药物信息表 (t_medications)
|
||
-- ==========================================
|
||
CREATE TABLE IF NOT EXISTS `t_medications` (
|
||
`id` varchar(50) NOT NULL COMMENT '药物唯一标识',
|
||
`user_id` varchar(50) NOT NULL COMMENT '用户ID',
|
||
`name` varchar(100) NOT NULL COMMENT '药物名称',
|
||
`photo_url` varchar(255) DEFAULT NULL COMMENT '药物照片URL',
|
||
`form` varchar(20) NOT NULL COMMENT '药物剂型:capsule/pill/injection/spray/drop/syrup/other',
|
||
`dosage_value` decimal(10,2) NOT NULL COMMENT '剂量数值',
|
||
`dosage_unit` varchar(20) NOT NULL COMMENT '剂量单位(片、粒、毫升等)',
|
||
`times_per_day` int NOT NULL COMMENT '每日服用次数',
|
||
`medication_times` json NOT NULL COMMENT '服药时间列表,格式:["08:00", "20:00"]',
|
||
`repeat_pattern` varchar(20) NOT NULL DEFAULT 'daily' COMMENT '重复模式:daily/weekly/custom',
|
||
`start_date` datetime NOT NULL COMMENT '开始日期(UTC时间)',
|
||
`end_date` datetime DEFAULT NULL COMMENT '结束日期(UTC时间,可选)',
|
||
`note` text COMMENT '备注信息',
|
||
`is_active` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否激活:1=激活,0=停用',
|
||
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '软删除标记:0=未删除,1=已删除',
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_user_id` (`user_id`),
|
||
KEY `idx_is_active` (`is_active`),
|
||
KEY `idx_user_active` (`user_id`, `is_active`),
|
||
KEY `idx_deleted` (`deleted`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='药物信息表';
|
||
|
||
-- ==========================================
|
||
-- 2. 服药记录表 (t_medication_records)
|
||
-- ==========================================
|
||
CREATE TABLE IF NOT EXISTS `t_medication_records` (
|
||
`id` varchar(50) NOT NULL COMMENT '记录唯一标识',
|
||
`medication_id` varchar(50) NOT NULL COMMENT '关联的药物ID',
|
||
`user_id` varchar(50) NOT NULL COMMENT '用户ID',
|
||
`scheduled_time` datetime NOT NULL COMMENT '计划服药时间(UTC时间)',
|
||
`actual_time` datetime DEFAULT NULL COMMENT '实际服药时间(UTC时间)',
|
||
`status` varchar(20) NOT NULL COMMENT '服药状态:upcoming/taken/missed/skipped',
|
||
`note` text COMMENT '备注',
|
||
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '软删除标记:0=未删除,1=已删除',
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_medication_id` (`medication_id`),
|
||
KEY `idx_user_id` (`user_id`),
|
||
KEY `idx_scheduled_time` (`scheduled_time`),
|
||
KEY `idx_status` (`status`),
|
||
KEY `idx_user_scheduled` (`user_id`, `scheduled_time`),
|
||
KEY `idx_user_date_status` (`user_id`, `scheduled_time`, `status`),
|
||
KEY `idx_deleted` (`deleted`),
|
||
CONSTRAINT `fk_medication_records_medication`
|
||
FOREIGN KEY (`medication_id`)
|
||
REFERENCES `t_medications` (`id`)
|
||
ON DELETE CASCADE
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='服药记录表';
|
||
|
||
-- ==========================================
|
||
-- 3. 索引优化说明
|
||
-- ==========================================
|
||
-- idx_user_id: 用于快速查询用户的所有药物
|
||
-- idx_is_active: 用于筛选激活状态的药物
|
||
-- idx_user_active: 复合索引,优化查询用户的激活药物
|
||
-- idx_user_scheduled: 复合索引,优化按日期查询用户的服药记录
|
||
-- idx_user_date_status: 复合索引,优化统计查询
|
||
-- idx_status: 用于定时任务批量更新状态
|
||
|
||
-- ==========================================
|
||
-- 4. 数据约束说明
|
||
-- ==========================================
|
||
-- 1. form 字段只能是预定义的剂型枚举值
|
||
-- 2. repeat_pattern 当前只支持 'daily'
|
||
-- 3. status 字段只能是 upcoming/taken/missed/skipped
|
||
-- 4. medication_times 必须是有效的 JSON 数组
|
||
-- 5. 外键约束确保记录关联的药物存在
|
||
|
||
-- ==========================================
|
||
-- 5. 使用示例
|
||
-- ==========================================
|
||
-- 插入药物示例:
|
||
-- INSERT INTO t_medications (id, user_id, name, form, dosage_value, dosage_unit,
|
||
-- times_per_day, medication_times, repeat_pattern, start_date)
|
||
-- VALUES ('med_001', 'user_123', 'Metformin', 'capsule', 1, '粒',
|
||
-- 2, '["08:00", "20:00"]', 'daily', '2025-01-01 00:00:00');
|
||
|
||
-- 插入服药记录示例:
|
||
-- INSERT INTO t_medication_records (id, medication_id, user_id, scheduled_time, status)
|
||
-- VALUES ('record_001', 'med_001', 'user_123', '2025-01-15 08:00:00', 'upcoming'); |