Files
plates-server/sql-scripts/medications-tables-create.sql
richarjiang 188b4addca feat(medications): 新增完整的药物管理和服药提醒功能
实现了包含药物信息管理、服药记录追踪、统计分析、自动状态更新和推送提醒的完整药物管理系统。

核心功能:
- 药物 CRUD 操作,支持多种剂型和自定义服药时间
- 惰性生成服药记录策略,查询时才生成当天记录
- 定时任务自动更新过期记录状态(每30分钟)
- 服药前15分钟自动推送提醒(每5分钟检查)
- 每日/范围/总体统计分析功能
- 完整的 API 文档和数据库建表脚本

技术实现:
- 使用 Sequelize ORM 管理 MySQL 数据表
- 集成 @nestjs/schedule 实现定时任务
- 复用现有推送通知系统发送提醒
- 采用软删除和权限验证保障数据安全
2025-11-07 17:29:11 +08:00

91 lines
4.8 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- 药物管理相关表创建脚本
-- 创建时间: 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');