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

284 lines
7.4 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. **处方组件** (`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监听实现
**数据流转**:完整的保存和读取
**状态**: 功能完整实现,只需执行数据库迁移即可使用!🎉