# API 接口文档 ## 1. 概述 本文档定义了药箱系统的所有 API 接口,包括认证、药品管理、批次管理、分类管理、搜索、通知、AI 识别、用户管理等模块。 ### 1.1 基础信息 - **Base URL**: `http://localhost:8000/api` - **API 版本**: v1 - **认证方式**: Bearer Token (JWT) - **内容类型**: `application/json` - **字符编码**: UTF-8 ### 1.2 通用响应格式 **成功响应:** ```json { "code": 200, "message": "success", "data": {} } ``` **错误响应:** ```json { "code": 400, "message": "错误信息", "detail": "详细错误信息(可选)" } ``` ### 1.3 通用状态码 | 状态码 | 说明 | |--------|------| | 200 | 成功 | | 201 | 创建成功 | | 400 | 请求参数错误 | | 401 | 未认证 | | 403 | 权限不足 | | 404 | 资源不存在 | | 500 | 服务器内部错误 | --- ## 2. 认证接口 ### 2.1 用户登录 **POST** `/v1/auth/login` **请求体:** ```json { "username": "admin", "password": "123456" } ``` **响应:** ```json { "code": 200, "message": "success", "data": { "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "token_type": "bearer", "user": { "id": 1, "username": "admin", "display_name": "管理员", "role": "admin", "notification_level": "normal" } } } ``` ### 2.2 获取当前用户信息 **GET** `/v1/auth/me` **请求头:** ``` Authorization: Bearer ``` **响应:** ```json { "code": 200, "message": "success", "data": { "id": 1, "username": "admin", "display_name": "管理员", "email": "admin@example.com", "role": "admin", "notification_level": "normal", "is_active": true, "created_at": "2024-01-01T00:00:00", "updated_at": "2024-01-01T00:00:00" } } ``` ### 2.3 修改密码 **PUT** `/v1/auth/password` **请求体:** ```json { "old_password": "123456", "new_password": "654321" } ``` **响应:** ```json { "code": 200, "message": "密码修改成功" } ``` --- ## 3. 药品管理接口 ### 3.1 获取药品列表 **GET** `/v1/medicines` **查询参数:** | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | category_id | integer | 否 | null | 分类ID | | search | string | 否 | null | 搜索关键词 | | page | integer | 否 | 1 | 页码 | | page_size | integer | 否 | 20 | 每页数量 | **响应:** ```json { "code": 200, "message": "success", "data": { "data": [ { "id": 1, "name": "布洛芬", "generic_name": "布洛芬缓释胶囊", "brand_name": "芬必得", "manufacturer": "中美天津史克", "specification": "0.3g × 20粒", "category_id": 2, "total_quantity": 30, "nearest_expiry_date": "2027-01-15", "batch_count": 2, "image_front_path": "/uploads/medicines/1/front.jpg", "created_at": "2024-01-01T00:00:00" } ], "total": 50, "page": 1, "page_size": 20 } } ``` ### 3.2 获取药品详情 **GET** `/v1/medicines/{medicine_id}` **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | medicine_id | integer | 药品ID | **响应:** ```json { "code": 200, "message": "success", "data": { "id": 1, "name": "布洛芬", "generic_name": "布洛芬缓释胶囊", "brand_name": "芬必得", "manufacturer": "中美天津史克", "specification": "0.3g × 20粒", "category_id": 2, "description": "非甾体抗炎药", "indications": "用于缓解轻至中度疼痛,如头痛、关节痛、偏头痛、牙痛、肌肉痛、神经痛、痛经", "adult_dose": "口服,一次1粒,一日2次", "child_dose": "遵医嘱", "contraindications": "对本品及其他非甾体抗炎药过敏者禁用", "notes": "请勿空腹服用", "expiry_grace_days": 30, "image_front_path": "/uploads/medicines/1/front.jpg", "image_expiry_path": "/uploads/medicines/1/expiry.jpg", "image_leaflet_paths": ["/uploads/medicines/1/leaflet_1.jpg"], "created_by": 1, "created_at": "2024-01-01T00:00:00", "updated_at": "2024-01-01T00:00:00" } } ``` ### 3.3 创建药品 **POST** `/v1/medicines` **请求体:** ```json { "name": "布洛芬", "generic_name": "布洛芬缓释胶囊", "brand_name": "芬必得", "manufacturer": "中美天津史克", "specification": "0.3g × 20粒", "category_id": 2, "description": "非甾体抗炎药", "indications": "用于缓解轻至中度疼痛", "adult_dose": "口服,一次1粒,一日2次", "child_dose": "遵医嘱", "contraindications": "对本品过敏者禁用", "notes": "请勿空腹服用", "expiry_grace_days": 30 } ``` **响应:** ```json { "code": 200, "message": "success", "data": { "id": 1, "name": "布洛芬", ... } } ``` ### 3.4 更新药品 **PUT** `/v1/medicines/{medicine_id}` **请求体:** ```json { "name": "布洛芬缓释胶囊", "expiry_grace_days": 45 } ``` **响应:** ```json { "code": 200, "message": "success", "data": { "id": 1, "name": "布洛芬缓释胶囊", ... } } ``` ### 3.5 删除药品 **DELETE** `/v1/medicines/{medicine_id}` **响应:** ```json { "code": 200, "message": "删除成功" } ``` ### 3.6 上传药品图片 **POST** `/v1/medicines/{medicine_id}/images` **请求体(multipart/form-data):** | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | type | string | 是 | 图片类型:front/expiry/leaflet | | file | file | 是 | 图片文件 | **响应:** ```json { "code": 200, "message": "success", "data": { "path": "/uploads/medicines/1/front.jpg" } } ``` --- ## 4. 批次管理接口 ### 4.1 获取药品的所有批次 **GET** `/v1/medicines/{medicine_id}/batches` **响应:** ```json { "code": 200, "message": "success", "data": [ { "id": 1, "medicine_id": 1, "batch_no": "A20240101", "production_date": "2024-01-01", "expiry_date": "2027-01-01", "quantity": 20, "location": "药箱A层", "is_expired": false, "created_at": "2024-01-01T00:00:00" } ] } ``` ### 4.2 创建批次 **POST** `/v1/medicines/{medicine_id}/batches` **请求体:** ```json { "batch_no": "A20240101", "production_date": "2024-01-01", "expiry_date": "2027-01-01", "quantity": 20, "location": "药箱A层" } ``` **响应:** ```json { "code": 200, "message": "success", "data": { "id": 1, "medicine_id": 1, "batch_no": "A20240101", ... } } ``` ### 4.3 更新批次 **PUT** `/v1/batches/{batch_id}` **请求体:** ```json { "quantity": 15, "location": "药箱B层" } ``` **响应:** ```json { "code": 200, "message": "success", "data": { "id": 1, "quantity": 15, ... } } ``` ### 4.4 删除批次 **DELETE** `/v1/batches/{batch_id}` **响应:** ```json { "code": 200, "message": "删除成功" } ``` ### 4.5 取药(扣减库存) **POST** `/v1/batches/{batch_id}/dispense` **请求体:** ```json { "quantity": 5 } ``` **响应:** ```json { "code": 200, "message": "success", "data": { "id": 1, "quantity": 15, ... } } ``` ### 4.6 入库(增加库存) **POST** `/v1/batches/{batch_id}/add-stock` **请求体:** ```json { "quantity": 10 } ``` **响应:** ```json { "code": 200, "message": "success", "data": { "id": 1, "quantity": 25, ... } } ``` --- ## 5. 分类管理接口 ### 5.1 获取分类列表 **GET** `/v1/categories` **查询参数:** | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | parent_id | integer | 否 | null | 父分类ID | | level | integer | 否 | null | 分类层级 | **响应:** ```json { "code": 200, "message": "success", "data": [ { "id": 1, "name": "药品", "parent_id": null, "level": 1, "icon": "medicine", "sort_order": 1, "children": [ { "id": 5, "name": "感冒药", "parent_id": 1, "level": 2, "icon": null, "sort_order": 1 } ] } ] } ``` ### 5.2 创建分类 **POST** `/v1/categories` **请求体:** ```json { "name": "维生素", "parent_id": 1, "level": 2, "icon": "vitamin", "sort_order": 6 } ``` **响应:** ```json { "code": 200, "message": "success", "data": { "id": 11, "name": "维生素", ... } } ``` ### 5.3 更新分类 **PUT** `/v1/categories/{category_id}` **请求体:** ```json { "name": "维生素类", "sort_order": 7 } ``` **响应:** ```json { "code": 200, "message": "success", "data": { "id": 11, "name": "维生素类", ... } } ``` ### 5.4 删除分类 **DELETE** `/v1/categories/{category_id}` **响应:** ```json { "code": 200, "message": "删除成功" } ``` --- ## 6. 搜索接口 ### 6.1 关键词搜索 **GET** `/v1/search` **查询参数:** | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | q | string | 是 | - | 搜索关键词 | | type | string | 否 | name | 搜索类型:name/indications/all | **响应:** ```json { "code": 200, "message": "success", "data": [ { "id": 1, "name": "布洛芬", "generic_name": "布洛芬缓释胶囊", "indications": "用于缓解轻至中度疼痛", "total_quantity": 30 } ] } ``` ### 6.2 自然语言搜索 **POST** `/v1/search/natural` **请求体:** ```json { "query": "孩子发烧了,应该吃什么药?" } ``` **响应:** ```json { "code": 200, "message": "success", "data": [ { "medicine_id": 1, "name": "布洛芬", "reason": "适用于退热,可缓解发热症状", "match_score": 0.95 }, { "medicine_id": 2, "name": "对乙酰氨基酚", "reason": "适用于儿童退热", "match_score": 0.90 } ] } ``` --- ## 7. AI 识别接口 ### 7.1 识别药盒 **POST** `/v1/ai/recognize-medicine` **请求体(multipart/form-data):** | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | file | file | 是 | 药盒正面照片 | **响应:** ```json { "code": 200, "message": "success", "data": { "generic_name": "布洛芬缓释胶囊", "brand_name": "芬必得", "manufacturer": "中美天津史克", "specification": "0.3g × 20粒" } } ``` ### 7.2 识别日期 **POST** `/v1/ai/recognize-dates` **请求体(multipart/form-data):** | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | file | file | 是 | 生产日期/有效期照片 | **响应:** ```json { "code": 200, "message": "success", "data": { "production_date": "2024-08-01", "expiry_date": "2027-08-01" } } ``` ### 7.3 识别说明书 **POST** `/v1/ai/recognize-leaflet` **请求体(multipart/form-data):** | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | file | file | 是 | 说明书照片 | **响应:** ```json { "code": 200, "message": "success", "data": { "indications": "用于缓解轻至中度疼痛,如头痛、关节痛、偏头痛、牙痛、肌肉痛、神经痛、痛经", "adult_dose": "口服,一次1粒,一日2次", "child_dose": "遵医嘱", "contraindications": "对本品及其他非甾体抗炎药过敏者禁用", "notes": "请勿空腹服用" } } ``` --- ## 8. 通知接口 ### 8.1 获取通知列表 **GET** `/v1/notifications` **查询参数:** | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | is_read | boolean | 否 | null | 是否已读 | | type | string | 否 | null | 通知类型 | | page | integer | 否 | 1 | 页码 | | page_size | integer | 否 | 20 | 每页数量 | **响应:** ```json { "code": 200, "message": "success", "data": { "data": [ { "id": 1, "type": "expiry_warning", "title": "药品过期提醒", "content": "布洛芬批次A20240101将在30天内过期", "is_read": false, "related_id": 1, "created_at": "2024-01-01T00:00:00" } ], "total": 10, "page": 1, "page_size": 20 } } ``` ### 8.2 标记通知为已读 **PUT** `/v1/notifications/{notification_id}/read` **响应:** ```json { "code": 200, "message": "success" } ``` ### 8.3 标记所有通知为已读 **PUT** `/v1/notifications/read-all` **响应:** ```json { "code": 200, "message": "success", "data": { "count": 5 } } ``` ### 8.4 删除通知 **DELETE** `/v1/notifications/{notification_id}` **响应:** ```json { "code": 200, "message": "删除成功" } ``` ### 8.5 发送测试通知 **POST** `/v1/notifications/test` **请求体:** ```json { "provider": "serverchan" } ``` **响应:** ```json { "code": 200, "message": "success", "data": { "success": true } } ``` --- ## 9. 用户管理接口 ### 9.1 获取用户列表 **GET** `/v1/users` **响应:** ```json { "code": 200, "message": "success", "data": [ { "id": 1, "username": "admin", "display_name": "管理员", "role": "admin", "is_active": true, "created_at": "2024-01-01T00:00:00" } ] } ``` ### 9.2 创建用户 **POST** `/v1/users` **请求体:** ```json { "username": "user1", "password": "123456", "display_name": "用户1", "email": "user1@example.com", "role": "user", "notification_level": "normal" } ``` **响应:** ```json { "code": 200, "message": "success", "data": { "id": 2, "username": "user1", ... } } ``` ### 9.3 更新用户 **PUT** `/v1/users/{user_id}` **请求体:** ```json { "display_name": "新名字", "role": "readonly", "notification_level": "high" } ``` **响应:** ```json { "code": 200, "message": "success", "data": { "id": 2, "display_name": "新名字", ... } } ``` ### 9.4 删除用户 **DELETE** `/v1/users/{user_id}` **响应:** ```json { "code": 200, "message": "删除成功" } ``` ### 9.5 重置用户密码 **POST** `/v1/users/{user_id}/reset-password` **请求体:** ```json { "new_password": "654321" } ``` **响应:** ```json { "code": 200, "message": "success" } ``` --- ## 10. 审计日志接口 ### 10.1 获取审计日志列表 **GET** `/v1/audit-logs` **查询参数:** | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | medicine_id | integer | 否 | null | 药品ID | | user_id | integer | 否 | null | 用户ID | | action | string | 否 | null | 操作类型 | | start_date | string | 否 | null | 开始日期 | | end_date | string | 否 | null | 结束日期 | | page | integer | 否 | 1 | 页码 | | page_size | integer | 否 | 20 | 每页数量 | **响应:** ```json { "code": 200, "message": "success", "data": { "data": [ { "id": 1, "medicine_id": 1, "batch_id": 1, "user_id": 1, "action": "dispense", "quantity_change": -5, "quantity_after": 15, "remark": null, "created_at": "2024-01-01T00:00:00", "medicine_name": "布洛芬", "user_name": "admin" } ], "total": 100, "page": 1, "page_size": 20 } } ``` --- ## 11. 系统设置接口 ### 11.1 获取所有设置 **GET** `/v1/settings` **响应:** ```json { "code": 200, "message": "success", "data": [ { "key": "ai_provider", "value": "openai", "description": "AI 服务提供者" }, { "key": "expiry_warning_days", "value": "90,30,7", "description": "到期提醒天数" } ] } ``` ### 11.2 获取单个设置 **GET** `/v1/settings/{key}` **响应:** ```json { "code": 200, "message": "success", "data": { "key": "ai_provider", "value": "openai", "description": "AI 服务提供者" } } ``` ### 11.3 更新设置 **PUT** `/v1/settings/{key}` **请求体:** ```json { "value": "gemini" } ``` **响应:** ```json { "code": 200, "message": "success", "data": { "key": "ai_provider", "value": "gemini", "description": "AI 服务提供者" } } ``` ### 11.4 批量更新设置 **PUT** `/v1/settings` **请求体:** ```json { "settings": [ { "key": "ai_provider", "value": "openai" }, { "key": "openai_api_key", "value": "sk-xxx" } ] } ``` **响应:** ```json { "code": 200, "message": "success" } ``` --- ## 12. 外部 API(供插件/MCP调用) ### 12.1 查询库存 **GET** `/v1/external/inventory` **查询参数:** | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | name | string | 否 | null | 药品名称 | | category | string | 否 | null | 分类名称 | **响应:** ```json { "code": 200, "message": "success", "data": [ { "medicine_id": 1, "name": "布洛芬", "total_quantity": 30, "batches": [ { "batch_id": 1, "batch_no": "A20240101", "quantity": 20, "expiry_date": "2027-01-01" } ] } ] } ``` ### 12.2 取药 **POST** `/v1/external/dispense` **请求体:** ```json { "medicine_name": "布洛芬", "quantity": 5 } ``` **响应:** ```json { "code": 200, "message": "success", "data": { "medicine_id": 1, "batch_id": 1, "dispensed_quantity": 5, "remaining_quantity": 25 } } ``` ### 12.3 查询药品详情 **GET** `/v1/external/medicine/{medicine_name}` **响应:** ```json { "code": 200, "message": "success", "data": { "medicine_id": 1, "name": "布洛芬", "generic_name": "布洛芬缓释胶囊", "indications": "用于缓解轻至中度疼痛", "adult_dose": "口服,一次1粒,一日2次", "contraindications": "对本品过敏者禁用", "total_quantity": 30 } } ``` --- ## 13. MCP 协议支持 ### 13.1 MCP 工具定义 系统支持通过 MCP (Model Context Protocol) 协议暴露以下工具: ```json { "tools": [ { "name": "query_inventory", "description": "查询家庭药品库存", "inputSchema": { "type": "object", "properties": { "medicine_name": { "type": "string", "description": "药品名称(可选)" } } } }, { "name": "dispense_medicine", "description": "取药操作", "inputSchema": { "type": "object", "properties": { "medicine_name": { "type": "string", "description": "药品名称" }, "quantity": { "type": "integer", "description": "取药数量" } }, "required": ["medicine_name", "quantity"] } }, { "name": "get_medicine_info", "description": "获取药品详细信息", "inputSchema": { "type": "object", "properties": { "medicine_name": { "type": "string", "description": "药品名称" } }, "required": ["medicine_name"] } } ] } ``` ### 13.2 MCP 工具调用 **POST** `/v1/mcp/call` **请求体:** ```json { "tool": "query_inventory", "arguments": { "medicine_name": "布洛芬" } } ``` **响应:** ```json { "code": 200, "message": "success", "data": { "content": [ { "type": "text", "text": "找到布洛芬,当前库存30粒,最近过期批次将在2027年1月过期。" } ] } } ``` --- ## 14. 文件上传接口 ### 14.1 上传图片 **POST** `/v1/upload/image` **请求体(multipart/form-data):** | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | file | file | 是 | 图片文件 | | category | string | 否 | 图片分类:medicine/leaflet/other | **响应:** ```json { "code": 200, "message": "success", "data": { "path": "/uploads/images/2024/01/abc123.jpg", "url": "http://localhost:8000/uploads/images/2024/01/abc123.jpg" } } ```