# 处方字段完整修复总结 ## 问题描述 前端添加了新字段(用量、代煎、每天几次),但后端没有相应处理,导致编辑保存时数据丢失。 ## 修复内容 ### 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 定义和数据加载已修复 ✅ **数据流转**: 完整的保存和读取流程 **状态**: 所有问题已修复,功能完整可用!🎉