308 lines
8.6 KiB
Markdown
308 lines
8.6 KiB
Markdown
# 处方用量功能实现
|
||
|
||
## 概述
|
||
根据处方类型自动调整用量单位和范围,并为饮片类型添加代煎选项。
|
||
|
||
## 功能说明
|
||
|
||
### 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:数据保存
|
||
- 填写完整处方信息
|
||
- 保存处方
|
||
- 验证用量数据正确存储
|
||
- 验证代煎选项正确存储
|