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

252 lines
7.0 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. 数据库字段 ✅
**文件**: `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 定义和数据加载已修复
**数据流转**: 完整的保存和读取流程
**状态**: 所有问题已修复,功能完整可用!🎉