284 lines
7.4 KiB
Markdown
284 lines
7.4 KiB
Markdown
# 处方用量功能完整实现总结
|
||
|
||
## 概述
|
||
在两个处方页面中实现了用量、单位和代煎功能:
|
||
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<PrescriptionForm>({
|
||
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
|
||
<el-select v-model="formData.dosage_amount">
|
||
<el-option label="1g" :value="1" />
|
||
<el-option label="2g" :value="2" />
|
||
<!-- ... 3-10g -->
|
||
</el-select>
|
||
```
|
||
|
||
### 饮片 (50-250ml)
|
||
```vue
|
||
<el-select v-model="formData.dosage_amount">
|
||
<el-option label="50ml" :value="50" />
|
||
<el-option label="100ml" :value="100" />
|
||
<el-option label="150ml" :value="150" />
|
||
<el-option label="200ml" :value="200" />
|
||
<el-option label="250ml" :value="250" />
|
||
</el-select>
|
||
|
||
<!-- 代煎选项 -->
|
||
<el-radio-group v-model="formData.need_decoction">
|
||
<el-radio :label="true">代煎</el-radio>
|
||
<el-radio :label="false">不代煎</el-radio>
|
||
</el-radio-group>
|
||
```
|
||
|
||
### 其他类型
|
||
```vue
|
||
<el-input-number
|
||
v-model="formData.dosage_amount"
|
||
:min="0"
|
||
:precision="2"
|
||
/>
|
||
```
|
||
|
||
## 功能规则
|
||
|
||
### 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监听实现
|
||
✅ **数据流转**:完整的保存和读取
|
||
|
||
**状态**: 功能完整实现,只需执行数据库迁移即可使用!🎉
|