# 处方用量功能实现 ## 概述 根据处方类型自动调整用量单位和范围,并为饮片类型添加代煎选项。 ## 功能说明 ### 1. 浓缩水丸 - **单位**: g (克) - **范围**: 1-10g - **步进**: 1g - **默认值**: 1g ### 2. 饮片 - **单位**: ml (毫升) - **范围**: 50-250ml - **步进**: 50ml (每50ml一个单位) - **默认值**: 50ml - **特殊选项**: 是否代煎(代煎/不代煎) ### 3. 其他类型(颗粒、丸剂、散剂、膏方、汤剂) - **单位**: g (克) - **范围**: 不限制 - **精度**: 小数点后2位 - **默认值**: 无 ## 前端实现 ### 文件:`admin/src/components/tcm-prescription/index.vue` #### 1. TypeScript 接口 ```typescript interface PrescriptionForm { // ... 其他字段 prescription_type: string // 处方类型 dosage_amount: number | undefined // 用量数值 dosage_unit: string // 用量单位 (g 或 ml) need_decoction: boolean // 是否代煎(仅饮片) // ... } ``` #### 2. 响应式数据 ```typescript const formData = reactive({ // ... prescription_type: '浓缩水丸', dosage_amount: 1, dosage_unit: 'g', need_decoction: false, // ... }) ``` #### 3. 自动切换逻辑 ```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 // need_decoction 保持用户选择 } else { formData.dosage_unit = 'g' formData.dosage_amount = undefined formData.need_decoction = false } }) ``` #### 4. UI 组件 ```vue {{ formData.dosage_unit }} 代煎 不代煎 ``` ## 用户交互流程 ### 场景 1:选择浓缩水丸 1. 用户选择"浓缩水丸" 2. 系统自动设置: - 用量单位:g - 默认用量:1g - 用量范围:1-10g - 隐藏代煎选项 ### 场景 2:选择饮片 1. 用户选择"饮片" 2. 系统自动设置: - 用量单位:ml - 默认用量:50ml - 用量范围:50-250ml(步进50ml) - 显示代煎选项(默认"不代煎") 3. 用户可选择: - 用量:50ml, 100ml, 150ml, 200ml, 250ml - 是否代煎:代煎 / 不代煎 ### 场景 3:选择其他类型 1. 用户选择"颗粒"、"丸剂"等 2. 系统自动设置: - 用量单位:g - 默认用量:空 - 用量范围:不限制(可输入小数) - 隐藏代煎选项 ## 数据示例 ### 浓缩水丸处方 ```json { "prescription_type": "浓缩水丸", "dosage_amount": 5, "dosage_unit": "g", "need_decoction": false } ``` ### 饮片处方(代煎) ```json { "prescription_type": "饮片", "dosage_amount": 150, "dosage_unit": "ml", "need_decoction": true } ``` ### 饮片处方(不代煎) ```json { "prescription_type": "饮片", "dosage_amount": 200, "dosage_unit": "ml", "need_decoction": false } ``` ### 颗粒处方 ```json { "prescription_type": "颗粒", "dosage_amount": 15.5, "dosage_unit": "g", "need_decoction": false } ``` ## 后端存储建议 ### 数据库字段 建议在处方表中添加以下字段: ```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是,仅饮片)'; ``` ### 后端验证逻辑 ```php // 浓缩水丸验证 if ($prescriptionType === '浓缩水丸') { if ($dosageAmount < 1 || $dosageAmount > 10) { throw new Exception('浓缩水丸用量必须在1-10g之间'); } if ($dosageUnit !== 'g') { throw new Exception('浓缩水丸单位必须为g'); } } // 饮片验证 if ($prescriptionType === '饮片') { if ($dosageAmount < 50 || $dosageAmount > 250 || $dosageAmount % 50 !== 0) { throw new Exception('饮片用量必须为50-250ml,且为50的倍数'); } if ($dosageUnit !== 'ml') { throw new Exception('饮片单位必须为ml'); } } ``` ## UI 布局 ``` ┌─────────────────────────────────────────────────────────┐ │ 处方类型: [浓缩水丸 ▼] 用量: [1] g │ └─────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────┐ │ 处方类型: [饮片 ▼] 用量: [150] ml │ │ 是否代煎: ⦿ 代煎 ○ 不代煎 │ └─────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────┐ │ 处方类型: [颗粒 ▼] 用量: [15.5] g │ └─────────────────────────────────────────────────────────┘ ``` ## 业务规则 ### 1. 浓缩水丸 - 用于浓缩制剂,按克计量 - 通常用量较小,1-10g范围合理 - 不需要代煎 ### 2. 饮片 - 用于传统中药饮片 - 按煎煮后的药液体积计量(ml) - 每次50ml为一个标准单位 - 可选择是否由药房代煎 - 代煎:药房负责煎煮,患者直接服用 - 不代煎:患者自行煎煮 ### 3. 其他类型 - 根据实际情况灵活设置用量 - 支持小数点精度 ## 注意事项 1. **单位自动切换**:切换处方类型时,单位和默认值会自动更新 2. **代煎选项**:仅在选择"饮片"时显示 3. **用量限制**:不同类型有不同的用量范围限制 4. **数据验证**:前端和后端都应进行用量范围验证 5. **用户体验**:使用 `el-input-number` 组件,支持键盘上下键调整 ## 扩展建议 1. **价格联动**:根据用量自动计算处方价格 2. **库存检查**:代煎选项可关联药房库存 3. **历史记录**:记录患者常用的用量设置 4. **模板保存**:将用量设置保存到处方模板 5. **打印显示**:在处方打印时显示用量和代煎信息 ## 相关文件 - `admin/src/components/tcm-prescription/index.vue` - 处方组件主文件 ## 测试用例 ### 测试 1:浓缩水丸用量 - 选择"浓缩水丸" - 验证用量范围:1-10g - 验证步进:1g - 验证代煎选项隐藏 ### 测试 2:饮片用量 - 选择"饮片" - 验证用量范围:50-250ml - 验证步进:50ml - 验证代煎选项显示 - 测试代煎/不代煎切换 ### 测试 3:类型切换 - 从"浓缩水丸"切换到"饮片" - 验证单位从g变为ml - 验证用量自动调整 - 验证代煎选项出现 ### 测试 4:数据保存 - 填写完整处方信息 - 保存处方 - 验证用量数据正确存储 - 验证代煎选项正确存储