# 甘草预下单测试功能
## 功能概述
在订单编辑表单中添加"甘草预下单测试"功能,允许用户在不真实提交订单的情况下,测试当前配置的甘草预下单价格。测试结果以抽屉形式展示,包含完整的价格、配送、规则检查和药材明细信息。
## 实现内容
### 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`
## 测试要点
- [ ] 点击"测试价格"按钮能正常调用接口
- [ ] 成功时自动打开抽屉展示结果
- [ ] 价格信息显示正确(药材成本、加工费、物流费、总计)
- [ ] 配送信息显示完整(调配中心、服用天数范围)
- [ ] 规则检查按类型显示不同颜色
- [ ] 药材明细表格显示完整(名称、用量、单价、小计、库存状态)
- [ ] 订单信息显示正确(订单号、剂数)
- [ ] 失败时显示清晰的错误信息
- [ ] 按钮加载状态正常显示
- [ ] 价格单位正确(分转元)
- [ ] 仅在编辑已存在订单时显示测试按钮
- [ ] 测试不会真实提交订单到甘草
- [ ] 测试不会修改订单状态
- [ ] 抽屉关闭后内容正确销毁