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

7.0 KiB
Raw Blame History

处方字段完整修复总结

问题描述

前端添加了新字段(用量、代煎、每天几次),但后端没有相应处理,导致编辑保存时数据丢失。

修复内容

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: 每天几次不保存

原因:

  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 定义和数据加载已修复
数据流转: 完整的保存和读取流程

状态: 所有问题已修复,功能完整可用!🎉