# 创建订单功能说明
## 功能概述
在订单列表页面添加了完整的创建订单功能,支持:
- 搜索患者
- 选择订单类型
- 输入订单金额
- 添加多个订单项
- 自动计算总价
## 新增功能
### 1. 创建订单按钮
在搜索表单右侧添加了"+ 创建订单"按钮,点击打开创建订单弹窗。
```vue
+ 创建订单
```
### 2. 创建订单弹窗
包含以下字段:
#### 基本信息
- **患者**:远程搜索患者列表,支持按姓名和手机号搜索
- **订单类型**:下拉选择(挂号费、问诊费、药品费用)
- **订单金额**:自动计算(订单项总价之和)
- **备注**:可选的备注信息
#### 订单详情
- 支持添加多个订单项
- 每个订单项包含:
- 关联类型(挂号、问诊、药品)
- 关联ID
- 数量
- 单价
- 总价(自动计算)
### 3. 患者搜索
使用远程搜索功能,实时搜索患者:
```typescript
const searchPatients = async (query: string) => {
if (!query) {
patientList.value = []
return
}
try {
patientLoading.value = true
const res = await getUserList({
page_no: 1,
page_size: 10,
keyword: query
})
patientList.value = res?.lists || []
} finally {
patientLoading.value = false
}
}
```
### 4. 订单项管理
#### 添加订单项
```typescript
const addOrderDetail = () => {
createForm.details.push({
related_type: '',
related_id: '',
quantity: 1,
unit_price: 0,
total_price: 0
})
}
```
#### 删除订单项
```typescript
const removeOrderDetail = (index: number) => {
createForm.details.splice(index, 1)
}
```
#### 自动计算总价
```typescript
const updateDetailTotal = (index: number) => {
const detail = createForm.details[index]
detail.total_price = detail.quantity * detail.unit_price
}
```
### 5. 表单验证
创建订单表单包含以下验证规则:
```typescript
const createRules = {
patient_id: [{ required: true, message: '请选择患者', trigger: 'change' }],
order_type: [{ required: true, message: '请选择订单类型', trigger: 'change' }],
amount: [{ required: true, message: '请输入订单金额', trigger: 'blur' }]
}
```
### 6. 提交创建
```typescript
const submitCreateOrder = async () => {
try {
await createFormRef.value?.validate()
if (createForm.details.length === 0) {
feedback.msgWarning('请至少添加一个订单项')
return
}
createLoading.value = true
// 计算总金额
const totalAmount = createForm.details.reduce((sum, detail) => {
return sum + (detail.quantity * detail.unit_price)
}, 0)
const params = {
patient_id: createForm.patient_id,
order_type: createForm.order_type,
amount: totalAmount,
remark: createForm.remark,
details: createForm.details.map(detail => ({
related_type: detail.related_type,
related_id: detail.related_id,
quantity: detail.quantity,
unit_price: detail.unit_price,
total_price: detail.quantity * detail.unit_price
}))
}
await orderCreate(params)
feedback.msgSuccess('订单创建成功')
createDialogVisible.value = false
getLists()
} finally {
createLoading.value = false
}
}
```
## 使用流程
### 第一步:打开创建订单弹窗
点击"+ 创建订单"按钮打开弹窗
### 第二步:选择患者
1. 在患者输入框中输入患者姓名或手机号
2. 从下拉列表中选择患者
### 第三步:填写基本信息
1. 选择订单类型(挂号费、问诊费、药品费用)
2. 输入订单金额(可选,会自动计算)
3. 输入备注(可选)
### 第四步:添加订单项
1. 点击"+ 添加订单项"按钮
2. 填写订单项信息:
- 选择关联类型
- 输入关联ID
- 输入数量
- 输入单价
3. 总价会自动计算
### 第五步:提交创建
1. 点击"创建订单"按钮
2. 系统验证表单
3. 创建成功后自动刷新列表
## 数据结构
### 创建订单请求参数
```typescript
{
patient_id: number, // 患者ID
order_type: number, // 订单类型 1-挂号费 2-问诊费 3-药品费用
amount: number, // 订单金额
remark: string, // 备注
details: [
{
related_type: string, // 关联类型 appointment/diagnosis/medicine
related_id: number, // 关联ID
quantity: number, // 数量
unit_price: number, // 单价
total_price: number // 总价
}
]
}
```
## 权限控制
创建订单功能受权限控制:
```vue
v-perms="['order.order/create']"
```
需要在后端权限系统中添加 `order.order/create` 权限节点。
## 新增导入
在 API 导入中添加了 `orderCreate`:
```typescript
import { orderLists, orderDetail, orderPay, orderCancel, orderDelete, orderRefund, orderExport, orderCreate } from '@/api/order'
```
同时导入了患者列表 API:
```typescript
import { getUserList } from '@/api/consumer'
```
## 新增状态
### 响应式数据
```typescript
const createDialogVisible = ref(false) // 创建弹窗显示状态
const createFormRef = ref() // 表单引用
const createLoading = ref(false) // 提交加载状态
const patientLoading = ref(false) // 患者搜索加载状态
const patientList = ref([]) // 患者列表
```
### 表单数据
```typescript
const createForm = reactive({
patient_id: '',
order_type: '',
amount: 0,
remark: '',
details: []
})
```
## 新增方法
| 方法 | 说明 |
|------|------|
| `handleCreate()` | 打开创建订单弹窗 |
| `searchPatients()` | 搜索患者 |
| `addOrderDetail()` | 添加订单项 |
| `removeOrderDetail()` | 删除订单项 |
| `updateDetailTotal()` | 更新订单项总价 |
| `resetCreateForm()` | 重置创建表单 |
| `submitCreateOrder()` | 提交创建订单 |
## 特性
✅ 远程搜索患者
✅ 动态添加/删除订单项
✅ 自动计算总价
✅ 表单验证
✅ 权限控制
✅ 加载状态提示
✅ 成功/失败反馈
## 注意事项
1. **患者搜索**:需要至少输入一个字符才能搜索
2. **订单项**:至少需要添加一个订单项才能创建订单
3. **金额计算**:订单金额自动计算为所有订单项的总价
4. **权限**:需要 `order.order/create` 权限才能看到创建按钮
## 相关文件
- `admin/src/views/order/index.vue` - 订单列表页面(已更新)
- `admin/src/api/order.ts` - 订单 API(已有 orderCreate)
- `server/app/adminapi/controller/order/OrderController.php` - 后端控制器
---
**更新日期**: 2024-03-10
**版本**: 1.1.0
**状态**: ✅ 完成