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