# 甘草预下单测试功能 ## 功能概述 在订单编辑表单中添加"甘草预下单测试"功能,允许用户在不真实提交订单的情况下,测试当前配置的甘草预下单价格。测试结果以抽屉形式展示,包含完整的价格、配送、规则检查和药材明细信息。 ## 实现内容 ### 1. 后端接口 #### 控制器方法 (`server/app/adminapi/controller/tcm/PrescriptionOrderController.php`) ```php public function previewGancaoRecipel() ``` - 调用验证器场景:`previewGancaoRecipel` - 调用逻辑方法:`PrescriptionOrderLogic::previewGancaoRecipel()` - 返回预览结果(包含价格信息) #### 逻辑方法 (`server/app/adminapi/logic/tcm/PrescriptionOrderLogic.php`) ```php public static function previewGancaoRecipel(int $id, int $adminId, array $adminInfo) ``` - 验证订单和处方存在性 - 检查药材是否能匹配甘草药ID - 获取甘草token - 调用 `CTM_PREVIEW` 接口 - 检查规则拦截和药材可用性 - 返回完整的预览数据(不提交订单) #### 验证器 (`server/app/adminapi/validate/tcm/PrescriptionOrderValidate.php`) - 添加场景:`previewGancaoRecipel => ['id']` ### 2. 前端实现 #### API接口 (`admin/src/api/tcm.ts`) ```typescript export function prescriptionOrderPreviewGancaoRecipel(params: { id: number }) ``` #### UI组件 (`admin/src/views/consumer/prescription/order_list.vue`) **测试按钮位置**:在"剂数"和"剂量单位"字段后,"上次医生"字段前 **组件结构**: ```vue 测试价格 ``` ### 3. 抽屉展示内容 #### 价格信息卡片 - **药材成本** (`m_cost`): 橙色显示,单位:元 - **加工费** (`proces_cost`): 蓝色显示,单位:分转元 - **物流费** (`lis_cost`): 绿色显示,单位:分转元 - **总计**: 红色加粗显示,自动计算总和 #### 配送信息卡片 - 调配中心名称 (`ds_name`) - 调配中心ID (`ds_id`) - 服用天数范围 (`take_days.min` - `take_days.max`) - 默认服用天数 (`take_days.default`) #### 规则检查卡片 - 显示所有规则检查结果 (`rule_check`) - 根据 `type` 显示不同颜色: - `type >= 2`: 错误(红色) - `type === 1`: 警告(黄色) - `type === 0`: 信息(蓝色) - 显示规则代码 (`code`) 和消息 (`msg`) #### 药材明细表格 - 序号 - 药材名称 (`title`) - 用量 (`quantity` + `unit`) - 单价 (`price`,元/克,保留4位小数) - 小计(单价 × 用量,橙色显示) - 库存状态 (`is_available`,1=有货/0=缺货) - 备注 (`brief`) #### 订单信息卡片 - 订单号 (`order_no`):跨2列显示 - 剂数 (`dose_count`):显示格式"X剂"(如:5剂) - 单剂量:自动计算所有药材用量总和,显示格式"X克"(如:196克) ## 接口返回数据结构 ```json { "code": 1, "msg": "预下单成功", "data": { "success": true, "fee": { "m_cost": "112.88", "proces_cost": 80, "lis_cost": 0 }, "result": { "aa_id": 73, "ds_id": 135, "ds_name": "郑州-甘草调配中心√", "take_days": { "min": 7, "max": 35, "default": 28 }, "rule_check": [ { "code": "pill_yield_notice", "msg": "出丸量约98g±5%", "type": 0 } ], "fee": { "m_cost": "112.88", "proces_cost": 80, "lis_cost": 0 }, "m_list": [ { "id": 420, "title": "龙胆", "price": 0.405028, "unit": "克", "quantity": "6", "is_available": 1, "brief": "" } ] }, "order_no": "PO20260414160525788214", "dose_count": 5 } } ``` ## UI设计特点 ### 布局 - 使用 `el-drawer` 抽屉组件,宽度 800px - 内容分为5个卡片区域,使用 `el-card` 组件 - 使用 `el-descriptions` 展示键值对信息 - 使用 `el-table` 展示药材明细列表 ### 颜色方案 - 药材成本:橙色 (`text-orange-600`) - 加工费:蓝色 (`text-blue-600`) - 物流费:绿色 (`text-green-600`) - 总计:红色加粗 (`text-red-600 font-bold`) - 小计:橙色 (`text-orange-600`) ### 交互 - 点击"测试价格"按钮触发预下单 - 按钮显示加载状态(loading) - 成功后自动打开抽屉展示结果 - 失败时显示错误提示消息 ## 使用流程 1. 打开订单编辑对话框 2. 配置剂数(`dose_count`)和剂量单位(`dose_unit`) 3. 点击"测试价格"按钮 4. 系统调用甘草 `CTM_PREVIEW` 接口 5. 自动打开抽屉展示完整的预下单结果 ## 注意事项 - 预下单测试**不会**真实提交订单到甘草 - 预下单测试**不会**扣费 - 仅用于验证配置和查看价格 - 需要先保存订单才能测试(`editForm.id` 必须存在) - 测试结果会检查: - 药材是否匹配甘草药ID - 规则是否拦截 - 药材是否缺货 - 抽屉关闭时自动销毁内容(`destroy-on-close`) ## 相关文件 ### 后端 - `server/app/adminapi/controller/tcm/PrescriptionOrderController.php` - `server/app/adminapi/logic/tcm/PrescriptionOrderLogic.php` - `server/app/adminapi/validate/tcm/PrescriptionOrderValidate.php` - `server/app/common/service/gancao/GancaoScmRecipelService.php` ### 前端 - `admin/src/api/tcm.ts` - `admin/src/views/consumer/prescription/order_list.vue` ## 测试要点 - [ ] 点击"测试价格"按钮能正常调用接口 - [ ] 成功时自动打开抽屉展示结果 - [ ] 价格信息显示正确(药材成本、加工费、物流费、总计) - [ ] 配送信息显示完整(调配中心、服用天数范围) - [ ] 规则检查按类型显示不同颜色 - [ ] 药材明细表格显示完整(名称、用量、单价、小计、库存状态) - [ ] 订单信息显示正确(订单号、剂数) - [ ] 失败时显示清晰的错误信息 - [ ] 按钮加载状态正常显示 - [ ] 价格单位正确(分转元) - [ ] 仅在编辑已存在订单时显示测试按钮 - [ ] 测试不会真实提交订单到甘草 - [ ] 测试不会修改订单状态 - [ ] 抽屉关闭后内容正确销毁