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

7.4 KiB
Raw Blame History

处方用量功能完整实现总结

概述

在两个处方页面中实现了用量、单位和代煎功能:

  1. 处方组件 (admin/src/components/tcm-prescription/index.vue) - 创建/编辑处方
  2. 处方列表 (admin/src/views/consumer/prescription/index.vue) - 查看/编辑处方

已实现的功能

1. 数据库层

文件: add_prescription_dosage_fields.sql

ALTER TABLE `zyt_tcm_prescription`
ADD COLUMN `dosage_amount` decimal(10,2) DEFAULT NULL COMMENT '用量数值',
ADD COLUMN `dosage_unit` varchar(10) NOT NULL DEFAULT '' COMMENT '用量单位(g/ml)',
ADD COLUMN `need_decoction` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否代煎(0否1是,仅饮片)';

2. 后端层

模型 (server/app/common/model/tcm/Prescription.php)

protected $type = [
    'dosage_amount' => 'float',
    'need_decoction' => 'integer',
];

业务逻辑 (server/app/adminapi/logic/tcm/PrescriptionLogic.php)

  • add() 方法:保存新处方
  • edit() 方法:编辑处方

3. 前端层

3.1 处方组件 (admin/src/components/tcm-prescription/index.vue)

数据结构:

interface PrescriptionForm {
    prescription_type: string
    dosage_amount: number | undefined
    dosage_unit: string
    need_decoction: boolean
    // ...
}

响应式数据:

const formData = reactive<PrescriptionForm>({
    prescription_type: '浓缩水丸',
    dosage_amount: 1,
    dosage_unit: 'g',
    need_decoction: false,
    // ...
})

自动切换逻辑:

watch(() => formData.prescription_type, (newType) => {
    if (newType === '浓缩水丸') {
        formData.dosage_unit = 'g'
        formData.dosage_amount = 1
        formData.need_decoction = false
    } else if (newType === '饮片') {
        formData.dosage_unit = 'ml'
        formData.dosage_amount = 50
    } else {
        formData.dosage_unit = 'g'
        formData.dosage_amount = undefined
        formData.need_decoction = false
    }
})

3.2 处方列表 (admin/src/views/consumer/prescription/index.vue)

数据结构:

const editForm = reactive({
    prescription_type: '浓缩水丸',
    dosage_amount: 1 as number | undefined,
    dosage_unit: 'g',
    need_decoction: false,
    // ...
})

自动切换逻辑:

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
    }
})

UI 组件实现

浓缩水丸 (1-10g)

<el-select v-model="formData.dosage_amount">
    <el-option label="1g" :value="1" />
    <el-option label="2g" :value="2" />
    <!-- ... 3-10g -->
</el-select>

饮片 (50-250ml)

<el-select v-model="formData.dosage_amount">
    <el-option label="50ml" :value="50" />
    <el-option label="100ml" :value="100" />
    <el-option label="150ml" :value="150" />
    <el-option label="200ml" :value="200" />
    <el-option label="250ml" :value="250" />
</el-select>

<!-- 代煎选项 -->
<el-radio-group v-model="formData.need_decoction">
    <el-radio :label="true">代煎</el-radio>
    <el-radio :label="false">不代煎</el-radio>
</el-radio-group>

其他类型

<el-input-number
    v-model="formData.dosage_amount"
    :min="0"
    :precision="2"
/>

功能规则

1. 浓缩水丸

  • 单位: g (克)
  • 范围: 1-10g
  • UI: 下拉选择
  • 代煎: 不显示

2. 饮片

  • 单位: ml (毫升)
  • 范围: 50-250ml (步进50ml)
  • UI: 下拉选择
  • 代煎: 显示单选按钮(代煎/不代煎)

3. 其他类型(颗粒、丸剂、散剂、膏方、汤剂)

  • 单位: g (克)
  • 范围: 不限制
  • UI: 数字输入框(支持小数)
  • 代煎: 不显示

数据流转示例

创建浓缩水丸处方

用户操作:
1. 选择"浓缩水丸"
2. 自动设置: 单位=g, 用量=1g
3. 选择用量: 5g
4. 保存

数据库存储:
prescription_type: "浓缩水丸"
dosage_amount: 5.00
dosage_unit: "g"
need_decoction: 0

创建饮片处方(代煎)

用户操作:
1. 选择"饮片"
2. 自动设置: 单位=ml, 用量=50ml
3. 选择用量: 150ml
4. 选择"代煎"
5. 保存

数据库存储:
prescription_type: "饮片"
dosage_amount: 150.00
dosage_unit: "ml"
need_decoction: 1

部署清单

1. 数据库迁移 ⚠️ 必须执行

mysql -u用户名 -p数据库名 < add_prescription_dosage_fields.sql

2. 后端文件

  • server/app/common/model/tcm/Prescription.php
  • server/app/adminapi/logic/tcm/PrescriptionLogic.php

3. 前端文件

  • admin/src/components/tcm-prescription/index.vue
  • admin/src/views/consumer/prescription/index.vue

测试清单

处方组件测试

  • 创建浓缩水丸处方,选择1-10g
  • 创建饮片处方,选择50-250ml
  • 饮片处方选择"代煎"
  • 饮片处方选择"不代煎"
  • 创建颗粒处方,输入自定义用量
  • 切换处方类型,验证用量自动调整
  • 保存处方,验证数据正确存储

处方列表测试

  • 编辑浓缩水丸处方,修改用量
  • 编辑饮片处方,修改用量和代煎选项
  • 编辑其他类型处方,输入自定义用量
  • 切换处方类型,验证用量自动调整
  • 保存修改,验证数据正确更新
  • 查看处方详情,验证显示正确

数据验证测试

  • 浓缩水丸用量范围:1-10g
  • 饮片用量范围:50-250ml
  • 饮片用量步进:50ml
  • 代煎选项仅在饮片时显示
  • 切换类型时代煎选项自动隐藏

文件清单

数据库

  • add_prescription_dosage_fields.sql - 数据库迁移文件

后端

  • server/app/common/model/tcm/Prescription.php - 处方模型
  • server/app/adminapi/logic/tcm/PrescriptionLogic.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 - 本文档

注意事项

  1. 数据库迁移必须先执行,否则保存时会报错
  2. 旧数据兼容:旧处方的用量字段为NULL,不影响显示
  3. 类型切换:切换处方类型时,用量和单位会自动调整
  4. 代煎选项:仅在选择"饮片"时显示
  5. 数据验证:前端使用下拉选择确保数据有效性

后续优化建议

  1. 后端验证:添加用量范围的后端验证逻辑
  2. 打印显示:在处方打印时显示用量和代煎信息
  3. 统计报表:按处方类型和用量统计
  4. 价格联动:根据用量自动计算处方价格
  5. 库存检查:代煎选项关联药房库存

总结

数据库层3个字段已定义
后端层:模型和业务逻辑已实现
前端层2个页面都已实现
UI组件:下拉选择器和单选按钮
自动切换watch监听实现
数据流转:完整的保存和读取

状态: 功能完整实现,只需执行数据库迁移即可使用!🎉