Files
wx_service/docs/sql/expiry.sql
T

133 lines
5.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.
-- 保质期提醒小程序 - 数据库初始化脚本
-- 执行前请确保已创建数据库并选择正确的数据库
-- ============================================
-- 1. 物品表 (expiry_items)
-- ============================================
CREATE TABLE IF NOT EXISTS expiry_items (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
user_id BIGINT UNSIGNED NOT NULL COMMENT '用户ID(关联 users 表)',
mini_program_id BIGINT UNSIGNED NOT NULL COMMENT '小程序ID(关联 mini_programs 表)',
name VARCHAR(100) NOT NULL COMMENT '物品名称',
category VARCHAR(20) NOT NULL COMMENT '分类:food/medicine/cosmetic/other',
production_date DATE DEFAULT NULL COMMENT '生产日期(可选)',
expiry_date DATE NOT NULL COMMENT '过期日期',
shelf_life_days INT DEFAULT NULL COMMENT '保质期天数(可选)',
quantity INT DEFAULT 1 COMMENT '数量',
location VARCHAR(50) DEFAULT NULL COMMENT '存放位置(可选)',
remark VARCHAR(255) DEFAULT NULL COMMENT '备注(可选)',
status VARCHAR(20) DEFAULT 'normal' COMMENT '状态:normal/used/discardedexpiring/expired 由业务动态计算)',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted_at TIMESTAMP NULL DEFAULT NULL COMMENT '软删除时间',
CONSTRAINT chk_expiry_category CHECK (category IN ('food', 'medicine', 'cosmetic', 'other')),
CONSTRAINT chk_expiry_quantity CHECK (quantity > 0),
CONSTRAINT chk_expiry_status CHECK (status IN ('normal', 'used', 'discarded')),
-- 索引
INDEX idx_user_expiry (user_id, expiry_date) COMMENT '用户+过期日期索引(最常用查询)',
INDEX idx_user_category (user_id, category) COMMENT '用户+分类索引',
INDEX idx_user_status (user_id, status) COMMENT '用户+状态索引',
INDEX idx_deleted_at (deleted_at) COMMENT '软删除索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='保质期物品表';
-- ============================================
-- 2. 用户设置表 (expiry_user_settings)
-- ============================================
CREATE TABLE IF NOT EXISTS expiry_user_settings (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
user_id BIGINT UNSIGNED NOT NULL UNIQUE COMMENT '用户ID(唯一)',
remind_days JSON DEFAULT (JSON_ARRAY(7,3,1)) COMMENT '提醒天数数组,例如 [7,3,1]',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
-- 索引
INDEX idx_user_id (user_id) COMMENT '用户ID索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='保质期用户设置表';
-- ============================================
-- 3. 插入测试数据(可选)
-- ============================================
-- 注意:以下测试数据需要根据实际的 user_id 和 mini_program_id 调整
-- 示例:假设 user_id=1, mini_program_id=1
-- INSERT INTO expiry_items (user_id, mini_program_id, name, category, production_date, expiry_date, shelf_life_days, quantity, location, remark) VALUES
-- (1, 1, '伊利纯牛奶', 'food', '2026-02-01', '2026-03-10', 37, 6, '冰箱', ''),
-- (1, 1, '感冒灵颗粒', 'medicine', NULL, '2027-12-31', NULL, 1, '药箱', ''),
-- (1, 1, '雅诗兰黛面霜', 'cosmetic', '2025-06-01', '2028-06-01', 1095, 1, '梳妆台', '');
-- 插入默认用户设置
-- INSERT INTO expiry_user_settings (user_id, remind_days) VALUES
-- (1, '[7,3,1]');
-- ============================================
-- 4. 验证表结构
-- ============================================
-- 查看表结构
-- SHOW CREATE TABLE expiry_items;
-- SHOW CREATE TABLE expiry_user_settings;
-- 查看索引
-- SHOW INDEX FROM expiry_items;
-- SHOW INDEX FROM expiry_user_settings;
-- ============================================
-- 5. 常用查询示例
-- ============================================
-- 查询用户的所有物品
-- SELECT * FROM expiry_items WHERE user_id = 1 AND deleted_at IS NULL;
-- 查询即将过期的物品(7天内)
-- SELECT * FROM expiry_items
-- WHERE user_id = 1
-- AND deleted_at IS NULL
-- AND expiry_date BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY)
-- ORDER BY expiry_date ASC;
-- 查询已过期的物品
-- SELECT * FROM expiry_items
-- WHERE user_id = 1
-- AND deleted_at IS NULL
-- AND expiry_date < CURDATE()
-- ORDER BY expiry_date DESC;
-- 统计汇总
-- SELECT
-- COUNT(*) as total_items,
-- SUM(CASE WHEN expiry_date BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY) THEN 1 ELSE 0 END) as expiring_soon,
-- SUM(CASE WHEN expiry_date < CURDATE() THEN 1 ELSE 0 END) as expired,
-- SUM(CASE WHEN expiry_date > DATE_ADD(CURDATE(), INTERVAL 7 DAY) THEN 1 ELSE 0 END) as normal
-- FROM expiry_items
-- WHERE user_id = 1
-- AND deleted_at IS NULL
-- AND status NOT IN ('used', 'discarded');
-- ============================================
-- 6. 数据清理(谨慎使用)
-- ============================================
-- 物理删除已软删除超过30天的记录
-- DELETE FROM expiry_items
-- WHERE deleted_at IS NOT NULL
-- AND deleted_at < DATE_SUB(NOW(), INTERVAL 30 DAY);
-- 清空测试数据(谨慎使用!)
-- TRUNCATE TABLE expiry_items;
-- TRUNCATE TABLE expiry_user_settings;
-- ============================================
-- 7. 性能优化建议
-- ============================================
-- 定期分析表,优化查询性能
-- ANALYZE TABLE expiry_items;
-- ANALYZE TABLE expiry_user_settings;
-- 查看表状态
-- SHOW TABLE STATUS LIKE 'expiry_%';
-- ============================================
-- 初始化完成
-- ============================================