# 处方用量功能完整实现总结 ## 概述 在两个处方页面中实现了用量、单位和代煎功能: 1. **处方组件** (`admin/src/components/tcm-prescription/index.vue`) - 创建/编辑处方 2. **处方列表** (`admin/src/views/consumer/prescription/index.vue`) - 查看/编辑处方 ## 已实现的功能 ### 1. 数据库层 ✅ **文件**: `add_prescription_dosage_fields.sql` ```sql ALTER TABLE `zyt_tcm_prescription` ADD COLUMN `dosage_amount` decimal(10,2) DEFAULT NULL COMMENT '用量数值', ADD COLUMN `dosage_unit` varchar(10) NOT NULL DEFAULT '' COMMENT '用量单位(g/ml)', ADD COLUMN `need_decoction` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否代煎(0否1是,仅饮片)'; ``` ### 2. 后端层 ✅ #### 模型 (`server/app/common/model/tcm/Prescription.php`) ```php protected $type = [ 'dosage_amount' => 'float', 'need_decoction' => 'integer', ]; ``` #### 业务逻辑 (`server/app/adminapi/logic/tcm/PrescriptionLogic.php`) - ✅ `add()` 方法:保存新处方 - ✅ `edit()` 方法:编辑处方 ### 3. 前端层 ✅ #### 3.1 处方组件 (`admin/src/components/tcm-prescription/index.vue`) **数据结构**: ```typescript interface PrescriptionForm { prescription_type: string dosage_amount: number | undefined dosage_unit: string need_decoction: boolean // ... } ``` **响应式数据**: ```typescript const formData = reactive({ prescription_type: '浓缩水丸', dosage_amount: 1, dosage_unit: 'g', need_decoction: false, // ... }) ``` **自动切换逻辑**: ```typescript watch(() => formData.prescription_type, (newType) => { if (newType === '浓缩水丸') { formData.dosage_unit = 'g' formData.dosage_amount = 1 formData.need_decoction = false } else if (newType === '饮片') { formData.dosage_unit = 'ml' formData.dosage_amount = 50 } else { formData.dosage_unit = 'g' formData.dosage_amount = undefined formData.need_decoction = false } }) ``` #### 3.2 处方列表 (`admin/src/views/consumer/prescription/index.vue`) **数据结构**: ```typescript const editForm = reactive({ prescription_type: '浓缩水丸', dosage_amount: 1 as number | undefined, dosage_unit: 'g', need_decoction: false, // ... }) ``` **自动切换逻辑**: ```typescript watch(() => editForm.prescription_type, (newType) => { if (newType === '浓缩水丸') { editForm.dosage_unit = 'g' editForm.dosage_amount = 1 editForm.need_decoction = false } else if (newType === '饮片') { editForm.dosage_unit = 'ml' editForm.dosage_amount = 50 } else { editForm.dosage_unit = 'g' editForm.dosage_amount = undefined editForm.need_decoction = false } }) ``` ## UI 组件实现 ### 浓缩水丸 (1-10g) ```vue ``` ### 饮片 (50-250ml) ```vue 代煎 不代煎 ``` ### 其他类型 ```vue ``` ## 功能规则 ### 1. 浓缩水丸 - **单位**: g (克) - **范围**: 1-10g - **UI**: 下拉选择 - **代煎**: 不显示 ### 2. 饮片 - **单位**: ml (毫升) - **范围**: 50-250ml (步进50ml) - **UI**: 下拉选择 - **代煎**: 显示单选按钮(代煎/不代煎) ### 3. 其他类型(颗粒、丸剂、散剂、膏方、汤剂) - **单位**: g (克) - **范围**: 不限制 - **UI**: 数字输入框(支持小数) - **代煎**: 不显示 ## 数据流转示例 ### 创建浓缩水丸处方 ``` 用户操作: 1. 选择"浓缩水丸" 2. 自动设置: 单位=g, 用量=1g 3. 选择用量: 5g 4. 保存 数据库存储: prescription_type: "浓缩水丸" dosage_amount: 5.00 dosage_unit: "g" need_decoction: 0 ``` ### 创建饮片处方(代煎) ``` 用户操作: 1. 选择"饮片" 2. 自动设置: 单位=ml, 用量=50ml 3. 选择用量: 150ml 4. 选择"代煎" 5. 保存 数据库存储: prescription_type: "饮片" dosage_amount: 150.00 dosage_unit: "ml" need_decoction: 1 ``` ## 部署清单 ### 1. 数据库迁移 ⚠️ 必须执行 ```bash mysql -u用户名 -p数据库名 < add_prescription_dosage_fields.sql ``` ### 2. 后端文件 - ✅ `server/app/common/model/tcm/Prescription.php` - ✅ `server/app/adminapi/logic/tcm/PrescriptionLogic.php` ### 3. 前端文件 - ✅ `admin/src/components/tcm-prescription/index.vue` - ✅ `admin/src/views/consumer/prescription/index.vue` ## 测试清单 ### 处方组件测试 - [ ] 创建浓缩水丸处方,选择1-10g - [ ] 创建饮片处方,选择50-250ml - [ ] 饮片处方选择"代煎" - [ ] 饮片处方选择"不代煎" - [ ] 创建颗粒处方,输入自定义用量 - [ ] 切换处方类型,验证用量自动调整 - [ ] 保存处方,验证数据正确存储 ### 处方列表测试 - [ ] 编辑浓缩水丸处方,修改用量 - [ ] 编辑饮片处方,修改用量和代煎选项 - [ ] 编辑其他类型处方,输入自定义用量 - [ ] 切换处方类型,验证用量自动调整 - [ ] 保存修改,验证数据正确更新 - [ ] 查看处方详情,验证显示正确 ### 数据验证测试 - [ ] 浓缩水丸用量范围:1-10g - [ ] 饮片用量范围:50-250ml - [ ] 饮片用量步进:50ml - [ ] 代煎选项仅在饮片时显示 - [ ] 切换类型时代煎选项自动隐藏 ## 文件清单 ### 数据库 - `add_prescription_dosage_fields.sql` - 数据库迁移文件 ### 后端 - `server/app/common/model/tcm/Prescription.php` - 处方模型 - `server/app/adminapi/logic/tcm/PrescriptionLogic.php` - 处方业务逻辑 ### 前端 - `admin/src/components/tcm-prescription/index.vue` - 处方组件 - `admin/src/views/consumer/prescription/index.vue` - 处方列表 ### 文档 - `PRESCRIPTION_DOSAGE_FEATURE.md` - 功能说明 - `PRESCRIPTION_DOSAGE_DATABASE_IMPLEMENTATION.md` - 数据库实现 - `PRESCRIPTION_DOSAGE_COMPLETE_SUMMARY.md` - 本文档 ## 注意事项 1. **数据库迁移必须先执行**,否则保存时会报错 2. **旧数据兼容**:旧处方的用量字段为NULL,不影响显示 3. **类型切换**:切换处方类型时,用量和单位会自动调整 4. **代煎选项**:仅在选择"饮片"时显示 5. **数据验证**:前端使用下拉选择确保数据有效性 ## 后续优化建议 1. **后端验证**:添加用量范围的后端验证逻辑 2. **打印显示**:在处方打印时显示用量和代煎信息 3. **统计报表**:按处方类型和用量统计 4. **价格联动**:根据用量自动计算处方价格 5. **库存检查**:代煎选项关联药房库存 ## 总结 ✅ **数据库层**:3个字段已定义 ✅ **后端层**:模型和业务逻辑已实现 ✅ **前端层**:2个页面都已实现 ✅ **UI组件**:下拉选择器和单选按钮 ✅ **自动切换**:watch监听实现 ✅ **数据流转**:完整的保存和读取 **状态**: 功能完整实现,只需执行数据库迁移即可使用!🎉