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

8.6 KiB
Raw Blame History

处方用量功能实现

概述

根据处方类型自动调整用量单位和范围,并为饮片类型添加代煎选项。

功能说明

1. 浓缩水丸

  • 单位: g (克)
  • 范围: 1-10g
  • 步进: 1g
  • 默认值: 1g

2. 饮片

  • 单位: ml (毫升)
  • 范围: 50-250ml
  • 步进: 50ml (每50ml一个单位)
  • 默认值: 50ml
  • 特殊选项: 是否代煎(代煎/不代煎)

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

  • 单位: g (克)
  • 范围: 不限制
  • 精度: 小数点后2位
  • 默认值: 无

前端实现

文件:admin/src/components/tcm-prescription/index.vue

1. TypeScript 接口

interface PrescriptionForm {
    // ... 其他字段
    prescription_type: string      // 处方类型
    dosage_amount: number | undefined  // 用量数值
    dosage_unit: string           // 用量单位 (g 或 ml)
    need_decoction: boolean       // 是否代煎(仅饮片)
    // ...
}

2. 响应式数据

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

3. 自动切换逻辑

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
        // need_decoction 保持用户选择
    } else {
        formData.dosage_unit = 'g'
        formData.dosage_amount = undefined
        formData.need_decoction = false
    }
})

4. UI 组件

<!-- 用量字段 -->
<el-col :span="12">
    <el-form-item label="用量" prop="dosage_amount">
        <!-- 浓缩水丸1-10g -->
        <el-input-number
            v-if="formData.prescription_type === '浓缩水丸'"
            v-model="formData.dosage_amount"
            :min="1"
            :max="10"
            :step="1"
            class="!w-32"
        />
        <!-- 饮片50-250ml步进50 -->
        <el-input-number
            v-else-if="formData.prescription_type === '饮片'"
            v-model="formData.dosage_amount"
            :min="50"
            :max="250"
            :step="50"
            class="!w-32"
        />
        <!-- 其他类型自由输入 -->
        <el-input-number
            v-else
            v-model="formData.dosage_amount"
            :min="0"
            :precision="2"
            class="!w-32"
        />
        <span class="ml-2">{{ formData.dosage_unit }}</span>
    </el-form-item>
</el-col>

<!-- 饮片代煎选项 -->
<el-col v-if="formData.prescription_type === '饮片'" :span="12">
    <el-form-item label="是否代煎" prop="need_decoction">
        <el-radio-group v-model="formData.need_decoction">
            <el-radio :label="true">代煎</el-radio>
            <el-radio :label="false">不代煎</el-radio>
        </el-radio-group>
    </el-form-item>
</el-col>

用户交互流程

场景 1:选择浓缩水丸

  1. 用户选择"浓缩水丸"
  2. 系统自动设置:
    • 用量单位:g
    • 默认用量:1g
    • 用量范围:1-10g
    • 隐藏代煎选项

场景 2:选择饮片

  1. 用户选择"饮片"
  2. 系统自动设置:
    • 用量单位:ml
    • 默认用量:50ml
    • 用量范围:50-250ml(步进50ml
    • 显示代煎选项(默认"不代煎")
  3. 用户可选择:
    • 用量:50ml, 100ml, 150ml, 200ml, 250ml
    • 是否代煎:代煎 / 不代煎

场景 3:选择其他类型

  1. 用户选择"颗粒"、"丸剂"等
  2. 系统自动设置:
    • 用量单位:g
    • 默认用量:空
    • 用量范围:不限制(可输入小数)
    • 隐藏代煎选项

数据示例

浓缩水丸处方

{
    "prescription_type": "浓缩水丸",
    "dosage_amount": 5,
    "dosage_unit": "g",
    "need_decoction": false
}

饮片处方(代煎)

{
    "prescription_type": "饮片",
    "dosage_amount": 150,
    "dosage_unit": "ml",
    "need_decoction": true
}

饮片处方(不代煎)

{
    "prescription_type": "饮片",
    "dosage_amount": 200,
    "dosage_unit": "ml",
    "need_decoction": false
}

颗粒处方

{
    "prescription_type": "颗粒",
    "dosage_amount": 15.5,
    "dosage_unit": "g",
    "need_decoction": false
}

后端存储建议

数据库字段

建议在处方表中添加以下字段:

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是,仅饮片)';

后端验证逻辑

// 浓缩水丸验证
if ($prescriptionType === '浓缩水丸') {
    if ($dosageAmount < 1 || $dosageAmount > 10) {
        throw new Exception('浓缩水丸用量必须在1-10g之间');
    }
    if ($dosageUnit !== 'g') {
        throw new Exception('浓缩水丸单位必须为g');
    }
}

// 饮片验证
if ($prescriptionType === '饮片') {
    if ($dosageAmount < 50 || $dosageAmount > 250 || $dosageAmount % 50 !== 0) {
        throw new Exception('饮片用量必须为50-250ml,且为50的倍数');
    }
    if ($dosageUnit !== 'ml') {
        throw new Exception('饮片单位必须为ml');
    }
}

UI 布局

┌─────────────────────────────────────────────────────────┐
│ 处方类型: [浓缩水丸 ▼]    用量: [1] g                    │
└─────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────┐
│ 处方类型: [饮片 ▼]        用量: [150] ml                 │
│ 是否代煎: ⦿ 代煎  ○ 不代煎                               │
└─────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────┐
│ 处方类型: [颗粒 ▼]        用量: [15.5] g                 │
└─────────────────────────────────────────────────────────┘

业务规则

1. 浓缩水丸

  • 用于浓缩制剂,按克计量
  • 通常用量较小,1-10g范围合理
  • 不需要代煎

2. 饮片

  • 用于传统中药饮片
  • 按煎煮后的药液体积计量(ml
  • 每次50ml为一个标准单位
  • 可选择是否由药房代煎
  • 代煎:药房负责煎煮,患者直接服用
  • 不代煎:患者自行煎煮

3. 其他类型

  • 根据实际情况灵活设置用量
  • 支持小数点精度

注意事项

  1. 单位自动切换:切换处方类型时,单位和默认值会自动更新
  2. 代煎选项:仅在选择"饮片"时显示
  3. 用量限制:不同类型有不同的用量范围限制
  4. 数据验证:前端和后端都应进行用量范围验证
  5. 用户体验:使用 el-input-number 组件,支持键盘上下键调整

扩展建议

  1. 价格联动:根据用量自动计算处方价格
  2. 库存检查:代煎选项可关联药房库存
  3. 历史记录:记录患者常用的用量设置
  4. 模板保存:将用量设置保存到处方模板
  5. 打印显示:在处方打印时显示用量和代煎信息

相关文件

  • admin/src/components/tcm-prescription/index.vue - 处方组件主文件

测试用例

测试 1:浓缩水丸用量

  • 选择"浓缩水丸"
  • 验证用量范围:1-10g
  • 验证步进:1g
  • 验证代煎选项隐藏

测试 2:饮片用量

  • 选择"饮片"
  • 验证用量范围:50-250ml
  • 验证步进:50ml
  • 验证代煎选项显示
  • 测试代煎/不代煎切换

测试 3:类型切换

  • 从"浓缩水丸"切换到"饮片"
  • 验证单位从g变为ml
  • 验证用量自动调整
  • 验证代煎选项出现

测试 4:数据保存

  • 填写完整处方信息
  • 保存处方
  • 验证用量数据正确存储
  • 验证代煎选项正确存储