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