Files
zyt/PRESCRIPTION_DOSAGE_FEATURE.md
T
2026-04-15 16:31:25 +08:00

308 lines
8.6 KiB
Markdown
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. 浓缩水丸
- **单位**: 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<PrescriptionForm>({
// ...
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
<!-- 用量字段 -->
<el-col :span="12">
<el-form-item label="用量" prop="dosage_amount">
<!-- 浓缩水丸1-10g -->
<el-input-number
v-if="formData.prescription_type === '浓缩水丸'"
v-model="formData.dosage_amount"
:min="1"
:max="10"
:step="1"
class="!w-32"
/>
<!-- 饮片50-250ml步进50 -->
<el-input-number
v-else-if="formData.prescription_type === '饮片'"
v-model="formData.dosage_amount"
:min="50"
:max="250"
:step="50"
class="!w-32"
/>
<!-- 其他类型自由输入 -->
<el-input-number
v-else
v-model="formData.dosage_amount"
:min="0"
:precision="2"
class="!w-32"
/>
<span class="ml-2">{{ formData.dosage_unit }}</span>
</el-form-item>
</el-col>
<!-- 饮片代煎选项 -->
<el-col v-if="formData.prescription_type === '饮片'" :span="12">
<el-form-item label="是否代煎" prop="need_decoction">
<el-radio-group v-model="formData.need_decoction">
<el-radio :label="true">代煎</el-radio>
<el-radio :label="false">不代煎</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
```
## 用户交互流程
### 场景 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:数据保存
- 填写完整处方信息
- 保存处方
- 验证用量数据正确存储
- 验证代煎选项正确存储