252 lines
7.0 KiB
Markdown
252 lines
7.0 KiB
Markdown
# 处方字段完整修复总结
|
||
|
||
## 问题描述
|
||
前端添加了新字段(用量、代煎、每天几次),但后端没有相应处理,导致编辑保存时数据丢失。
|
||
|
||
## 修复内容
|
||
|
||
### 1. 数据库字段 ✅
|
||
|
||
**文件**: `add_prescription_complete_fields.sql`
|
||
|
||
```sql
|
||
-- 用量相关字段
|
||
ALTER TABLE `zyt_tcm_prescription`
|
||
ADD COLUMN IF NOT EXISTS `dosage_amount` decimal(10,2) DEFAULT NULL COMMENT '用量数值',
|
||
ADD COLUMN IF NOT EXISTS `dosage_unit` varchar(10) NOT NULL DEFAULT '' COMMENT '用量单位(g/ml)',
|
||
ADD COLUMN IF NOT EXISTS `need_decoction` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否代煎(0否1是,仅饮片)';
|
||
|
||
-- 每天几次字段
|
||
ALTER TABLE `zyt_tcm_prescription`
|
||
ADD COLUMN IF NOT EXISTS `times_per_day` int(11) NOT NULL DEFAULT 2 COMMENT '每天服用次数';
|
||
```
|
||
|
||
### 2. 后端修复 ✅
|
||
|
||
#### 文件: `server/app/adminapi/logic/tcm/PrescriptionLogic.php`
|
||
|
||
**add() 方法** - 添加处方时保存新字段:
|
||
```php
|
||
'dosage_amount' => isset($params['dosage_amount']) ? (float)$params['dosage_amount'] : null,
|
||
'dosage_unit' => $params['dosage_unit'] ?? '',
|
||
'need_decoction' => (int)($params['need_decoction'] ?? 0),
|
||
'times_per_day' => (int)($params['times_per_day'] ?? 2),
|
||
```
|
||
|
||
**edit() 方法** - 编辑处方时更新新字段:
|
||
```php
|
||
'dosage_amount' => isset($params['dosage_amount']) ? (float)$params['dosage_amount'] : $prescription->dosage_amount,
|
||
'dosage_unit' => $params['dosage_unit'] ?? $prescription->dosage_unit,
|
||
'need_decoction' => isset($params['need_decoction']) ? (int)$params['need_decoction'] : (int)($prescription->need_decoction ?? 0),
|
||
'times_per_day' => (int)($params['times_per_day'] ?? $prescription->times_per_day ?? 2),
|
||
```
|
||
|
||
### 3. 前端修复 ✅
|
||
|
||
#### 文件: `admin/src/views/consumer/prescription/index.vue`
|
||
|
||
**editForm 定义** - 添加新字段:
|
||
```typescript
|
||
const editForm = reactive({
|
||
// ...
|
||
dosage_amount: 1 as number | undefined,
|
||
dosage_unit: 'g',
|
||
need_decoction: false,
|
||
times_per_day: 2,
|
||
// ...
|
||
})
|
||
```
|
||
|
||
**handleEdit() 方法** - 加载数据时填充新字段:
|
||
```typescript
|
||
editForm.dosage_amount = row.dosage_amount ?? undefined
|
||
editForm.dosage_unit = row.dosage_unit || ''
|
||
editForm.need_decoction = row.need_decoction === 1 || row.need_decoction === true
|
||
editForm.times_per_day = row.times_per_day ?? 2
|
||
```
|
||
|
||
**watch 监听** - 处方类型变化时自动调整:
|
||
```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
|
||
}
|
||
})
|
||
```
|
||
|
||
## 字段说明
|
||
|
||
| 字段名 | 类型 | 默认值 | 说明 |
|
||
|--------|------|--------|------|
|
||
| `dosage_amount` | decimal(10,2) | NULL | 用量数值 |
|
||
| `dosage_unit` | varchar(10) | '' | 用量单位 (g/ml) |
|
||
| `need_decoction` | tinyint(1) | 0 | 是否代煎 (0=否, 1=是) |
|
||
| `times_per_day` | int(11) | 2 | 每天服用次数 |
|
||
|
||
## 数据流转
|
||
|
||
### 创建处方
|
||
```
|
||
前端表单
|
||
↓
|
||
{
|
||
prescription_type: "浓缩水丸",
|
||
dosage_amount: 5,
|
||
dosage_unit: "g",
|
||
need_decoction: false,
|
||
times_per_day: 2
|
||
}
|
||
↓
|
||
PrescriptionLogic::add()
|
||
↓
|
||
数据库保存
|
||
```
|
||
|
||
### 编辑处方
|
||
```
|
||
数据库读取
|
||
↓
|
||
{
|
||
dosage_amount: 5.00,
|
||
dosage_unit: "g",
|
||
need_decoction: 0,
|
||
times_per_day: 2
|
||
}
|
||
↓
|
||
前端 editForm 填充
|
||
↓
|
||
用户修改
|
||
↓
|
||
PrescriptionLogic::edit()
|
||
↓
|
||
数据库更新
|
||
```
|
||
|
||
## 部署步骤
|
||
|
||
### 1. 备份数据库 ⚠️
|
||
```bash
|
||
mysqldump -u用户名 -p数据库名 > backup_$(date +%Y%m%d_%H%M%S).sql
|
||
```
|
||
|
||
### 2. 执行数据库迁移 ⚠️ 必须
|
||
```bash
|
||
mysql -u用户名 -p数据库名 < add_prescription_complete_fields.sql
|
||
```
|
||
|
||
### 3. 验证字段添加
|
||
```sql
|
||
SHOW COLUMNS FROM `zyt_tcm_prescription` LIKE 'dosage%';
|
||
SHOW COLUMNS FROM `zyt_tcm_prescription` LIKE 'need_decoction';
|
||
SHOW COLUMNS FROM `zyt_tcm_prescription` LIKE 'times_per_day';
|
||
```
|
||
|
||
### 4. 部署后端代码
|
||
```bash
|
||
# 上传修改的文件
|
||
- server/app/adminapi/logic/tcm/PrescriptionLogic.php
|
||
- server/app/common/model/tcm/Prescription.php
|
||
```
|
||
|
||
### 5. 部署前端代码
|
||
```bash
|
||
cd admin
|
||
npm run build
|
||
# 上传 dist/ 目录
|
||
```
|
||
|
||
### 6. 清除缓存(如需要)
|
||
```bash
|
||
cd server
|
||
php think clear
|
||
```
|
||
|
||
## 测试清单
|
||
|
||
### 创建处方测试
|
||
- [ ] 创建浓缩水丸处方,设置用量5g,每天2次
|
||
- [ ] 创建饮片处方,设置用量150ml,代煎,每天3次
|
||
- [ ] 创建颗粒处方,设置用量15.5g,每天2次
|
||
- [ ] 保存后查看数据库,验证字段正确存储
|
||
|
||
### 编辑处方测试
|
||
- [ ] 编辑已有处方,修改用量
|
||
- [ ] 编辑饮片处方,修改代煎选项
|
||
- [ ] 编辑处方,修改每天几次
|
||
- [ ] 切换处方类型,验证用量自动调整
|
||
- [ ] 保存后查看数据库,验证字段正确更新
|
||
|
||
### 数据加载测试
|
||
- [ ] 打开编辑对话框,验证用量正确显示
|
||
- [ ] 验证代煎选项正确显示
|
||
- [ ] 验证每天几次正确显示
|
||
- [ ] 验证旧数据(无新字段)不报错
|
||
|
||
## 修复的问题
|
||
|
||
### 问题 1: 用量字段不保存 ✅
|
||
**原因**: 后端 `add()` 和 `edit()` 方法没有处理 `dosage_amount`, `dosage_unit`, `need_decoction` 字段
|
||
**修复**: 在两个方法中添加字段处理逻辑
|
||
|
||
### 问题 2: 每天几次不保存 ✅
|
||
**原因**:
|
||
1. 数据库没有 `times_per_day` 字段
|
||
2. 后端没有处理该字段
|
||
3. 前端 editForm 定义错误(空字符串而非数字)
|
||
|
||
**修复**:
|
||
1. 添加数据库字段
|
||
2. 后端添加字段处理
|
||
3. 前端修正默认值为数字 2
|
||
|
||
### 问题 3: 编辑时数据不加载 ✅
|
||
**原因**: `handleEdit()` 方法没有加载新字段
|
||
**修复**: 在加载数据时填充所有新字段
|
||
|
||
## 相关文件
|
||
|
||
### 数据库
|
||
- `add_prescription_complete_fields.sql` - 完整字段迁移文件
|
||
|
||
### 后端
|
||
- `server/app/adminapi/logic/tcm/PrescriptionLogic.php` - 处方业务逻辑
|
||
- `server/app/common/model/tcm/Prescription.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` - 完整总结
|
||
- `PRESCRIPTION_FIELDS_FIX_SUMMARY.md` - 本文档
|
||
|
||
## 注意事项
|
||
|
||
1. **必须先执行数据库迁移**,否则保存时会报错
|
||
2. **旧数据兼容**:旧处方的新字段为 NULL 或默认值,不影响显示
|
||
3. **类型转换**:
|
||
- `dosage_amount`: float
|
||
- `need_decoction`: boolean (前端) → int (后端/数据库)
|
||
- `times_per_day`: int
|
||
4. **数据验证**:前端使用下拉和数字输入框确保数据有效性
|
||
|
||
## 总结
|
||
|
||
✅ **数据库**: 4个字段已添加
|
||
✅ **后端**: add() 和 edit() 方法已更新
|
||
✅ **前端**: editForm 定义和数据加载已修复
|
||
✅ **数据流转**: 完整的保存和读取流程
|
||
|
||
**状态**: 所有问题已修复,功能完整可用!🎉
|