feat(medications): 增加基于视觉AI的药品智能录入系统

构建了从照片到药品档案的自动化处理流程,通过GLM多模态大模型实现药品信息的智能采集:

核心能力:
- 创建任务追踪表 t_medication_recognition_tasks 存储识别任务状态
- 四阶段渐进式分析:基础识别→人群适配→成分解析→风险评估
- 提供三个REST端点支持任务创建、进度查询和结果确认
- 前端可通过轮询方式获取0-100%的实时进度反馈
- VIP用户免费使用,普通用户按次扣费

技术实现:
- 利用GLM-4V-Plus模型处理多角度药品图像(正面+侧面+说明书)
- 采用GLM-4-Flash模型进行文本深度分析
- 异步任务执行机制避免接口阻塞
- 完整的异常处理和任务失败恢复策略
- 新增AI_RECOGNITION.md文档详细说明集成方式

同步修复:
- 修正会员用户AI配额扣减逻辑,避免不必要的次数消耗
- 优化APNs推送中无效设备令牌的检测和清理流程
- 将服药提醒的提前通知时间从15分钟缩短为5分钟
This commit is contained in:
richarjiang
2025-11-21 10:27:59 +08:00
parent 75fbea2c90
commit a17fe0b965
14 changed files with 1706 additions and 74 deletions

View File

@@ -0,0 +1,49 @@
-- 药物AI识别任务表创建脚本
-- 用于存储用户上传的药品图片和AI识别过程的状态追踪
CREATE TABLE IF NOT EXISTS `t_medication_recognition_tasks` (
`id` VARCHAR(100) NOT NULL COMMENT '任务唯一标识,格式: task_{userId}_{timestamp}',
`user_id` VARCHAR(50) NOT NULL COMMENT '用户ID',
`front_image_url` VARCHAR(500) NOT NULL COMMENT '正面图片URL必需',
`side_image_url` VARCHAR(500) NOT NULL COMMENT '侧面图片URL必需',
`auxiliary_image_url` VARCHAR(500) DEFAULT NULL COMMENT '辅助面图片URL可选如说明书',
`status` VARCHAR(50) NOT NULL DEFAULT 'pending' COMMENT '识别状态: pending/analyzing_product/analyzing_suitability/analyzing_ingredients/analyzing_effects/completed/failed',
`current_step` VARCHAR(200) DEFAULT NULL COMMENT '当前步骤描述,用于向用户展示',
`progress` INT NOT NULL DEFAULT 0 COMMENT '进度百分比(0-100)',
`recognition_result` TEXT DEFAULT NULL COMMENT '识别结果(JSON格式),包含药品名称、剂型、剂量、适宜人群等完整信息',
`error_message` TEXT DEFAULT NULL COMMENT '错误信息仅在status为failed时有值',
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`completed_at` TIMESTAMP NULL DEFAULT NULL COMMENT '完成时间(成功或失败)',
PRIMARY KEY (`id`),
INDEX `idx_user_id` (`user_id`),
INDEX `idx_status` (`status`),
INDEX `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='药物AI识别任务表';
-- 添加外键约束(可选,如果需要严格的数据完整性)
-- ALTER TABLE `t_medication_recognition_tasks`
-- ADD CONSTRAINT `fk_recognition_user_id`
-- FOREIGN KEY (`user_id`) REFERENCES `t_users`(`id`) ON DELETE CASCADE;
-- 示例数据结构说明
-- recognition_result JSON 格式示例:
/*
{
"name": "阿莫西林胶囊",
"photoUrl": "https://cdn.example.com/medications/front_001.jpg",
"form": "capsule",
"dosageValue": 0.25,
"dosageUnit": "g",
"timesPerDay": 3,
"medicationTimes": ["08:00", "14:00", "20:00"],
"suitableFor": ["成年人", "细菌感染患者"],
"unsuitableFor": ["青霉素过敏者", "孕妇", "哺乳期妇女"],
"mainIngredients": ["阿莫西林"],
"mainUsage": "用于敏感菌引起的各种感染",
"sideEffects": ["恶心", "呕吐", "腹泻", "皮疹"],
"storageAdvice": ["密封保存", "室温避光", "儿童接触不到的地方"],
"healthAdvice": ["按时服药", "多喝水", "避免饮酒"],
"confidence": 0.95
}
*/