238 lines
6.4 KiB
Markdown
238 lines
6.4 KiB
Markdown
# 订单列表操作按钮设计
|
|
|
|
## 设计概述
|
|
|
|
为订单列表页面设计了根据不同订单状态显示相应操作按钮的功能,提供更精准、更直观的订单管理体验。
|
|
|
|
## 按钮设计原则
|
|
|
|
### 1. 🎯 **状态驱动**
|
|
- 根据订单的支付状态、发货状态、订单状态组合显示按钮
|
|
- 确保每个状态下的操作都符合业务逻辑
|
|
|
|
### 2. 🎨 **视觉层次**
|
|
- 主要操作使用蓝色样式 (`ele-text-primary`)
|
|
- 成功操作使用绿色样式 (`ele-text-success`)
|
|
- 警告操作使用橙色样式 (`ele-text-warning`)
|
|
- 危险操作使用红色样式 (`ele-text-danger`)
|
|
|
|
### 3. 🔒 **安全确认**
|
|
- 所有危险操作都有确认对话框
|
|
- 明确的操作说明和后果提示
|
|
|
|
## 完整的按钮矩阵
|
|
|
|
### 基础操作(所有状态)
|
|
|
|
| 按钮 | 图标 | 样式 | 说明 |
|
|
|------|------|------|------|
|
|
| 详情 | 👁️ EyeOutlined | 默认 | 查看订单详细信息 |
|
|
|
|
### 未付款状态 (payStatus=0, orderStatus=0)
|
|
|
|
| 按钮 | 图标 | 样式 | 操作 |
|
|
|------|------|------|------|
|
|
| 修改 | ✏️ EditOutlined | 默认 | 修改订单信息 |
|
|
| 取消 | ❌ CloseOutlined | 警告 | 取消订单 |
|
|
|
|
### 已付款未发货 (payStatus=1, deliveryStatus=10, 未取消)
|
|
|
|
| 按钮 | 图标 | 样式 | 操作 |
|
|
|------|------|------|------|
|
|
| 发货 | 🚚 SendOutlined | 主要 | 标记为已发货 |
|
|
| 退款 | ↩️ UndoOutlined | 默认 | 申请退款 |
|
|
|
|
### 已发货未完成 (payStatus=1, deliveryStatus=20, orderStatus=0)
|
|
|
|
| 按钮 | 图标 | 样式 | 操作 |
|
|
|------|------|------|------|
|
|
| 确认收货 | ✅ CheckOutlined | 主要 | 确认收货并完成订单 |
|
|
| 退款 | ↩️ UndoOutlined | 默认 | 申请退款 |
|
|
|
|
### 退款申请中 (orderStatus=4,7)
|
|
|
|
| 按钮 | 图标 | 样式 | 操作 |
|
|
|------|------|------|------|
|
|
| 同意退款 | ✅ CheckCircleOutlined | 成功 | 同意退款申请 |
|
|
| 拒绝退款 | ❌ CloseCircleOutlined | 危险 | 拒绝退款申请 |
|
|
|
|
### 退款被拒绝 (orderStatus=5)
|
|
|
|
| 按钮 | 图标 | 样式 | 操作 |
|
|
|------|------|------|------|
|
|
| 重新处理 | 🔄 RedoOutlined | 默认 | 重新提交退款申请 |
|
|
|
|
### 已完成 (orderStatus=1)
|
|
|
|
| 按钮 | 图标 | 样式 | 操作 |
|
|
|------|------|------|------|
|
|
| 申请退款 | ↩️ UndoOutlined | 默认 | 为已完成订单申请退款 |
|
|
|
|
### 可删除状态 (orderStatus=1,2,6)
|
|
|
|
| 按钮 | 图标 | 样式 | 操作 |
|
|
|------|------|------|------|
|
|
| 删除 | 🗑️ DeleteOutlined | 危险 | 删除订单记录 |
|
|
|
|
## 代码实现
|
|
|
|
### 模板结构
|
|
|
|
```vue
|
|
<template v-if="column.key === 'action'">
|
|
<a-space>
|
|
<!-- 查看详情 - 所有状态都可以查看 -->
|
|
<a @click.stop="openEdit(record)">
|
|
<EyeOutlined /> 详情
|
|
</a>
|
|
|
|
<!-- 未付款状态的操作 -->
|
|
<template v-if="record.payStatus === 0 && record.orderStatus === 0">
|
|
<!-- 修改和取消按钮 -->
|
|
</template>
|
|
|
|
<!-- 已付款未发货状态的操作 -->
|
|
<template v-if="record.payStatus === 1 && record.deliveryStatus === 10 && !isCancelledStatus(record.orderStatus)">
|
|
<!-- 发货和退款按钮 -->
|
|
</template>
|
|
|
|
<!-- 其他状态的操作... -->
|
|
</a-space>
|
|
</template>
|
|
```
|
|
|
|
### 辅助判断函数
|
|
|
|
```typescript
|
|
// 判断是否为取消状态
|
|
const isCancelledStatus = (orderStatus?: number) => {
|
|
return [2, 3].includes(orderStatus || 0);
|
|
};
|
|
|
|
// 判断是否为退款相关状态
|
|
const isRefundStatus = (orderStatus?: number) => {
|
|
return [4, 5, 6, 7].includes(orderStatus || 0);
|
|
};
|
|
|
|
// 判断是否可以删除订单
|
|
const canDeleteOrder = (order: ShopOrder) => {
|
|
return [1, 2, 6].includes(order.orderStatus || 0);
|
|
};
|
|
```
|
|
|
|
### 操作方法示例
|
|
|
|
```typescript
|
|
// 发货处理
|
|
const handleDelivery = (record: ShopOrder) => {
|
|
Modal.confirm({
|
|
title: '确认发货',
|
|
content: '确定要将此订单标记为已发货吗?',
|
|
onOk: async () => {
|
|
try {
|
|
const deliveryTime = toDateString(new Date(), 'yyyy-MM-dd HH:mm:ss');
|
|
await updateShopOrder({
|
|
...record,
|
|
deliveryStatus: 20,
|
|
deliveryTime: deliveryTime
|
|
});
|
|
message.success('发货成功');
|
|
reload();
|
|
} catch (error: any) {
|
|
message.error(error.message || '发货失败');
|
|
}
|
|
}
|
|
});
|
|
};
|
|
```
|
|
|
|
## 状态流转图
|
|
|
|
```
|
|
未付款订单 → [修改/取消]
|
|
↓ 付款
|
|
已付款未发货 → [发货/退款]
|
|
↓ 发货
|
|
已发货未完成 → [确认收货/退款]
|
|
↓ 确认收货
|
|
已完成订单 → [申请退款/删除]
|
|
|
|
退款流程:
|
|
申请退款 → [同意/拒绝]
|
|
↓ 同意
|
|
退款成功 → [删除]
|
|
↓ 拒绝
|
|
退款被拒绝 → [重新处理/删除]
|
|
```
|
|
|
|
## 用户体验优化
|
|
|
|
### 1. 按钮排序
|
|
- 主要操作放在前面(发货、确认收货)
|
|
- 次要操作放在中间(修改、申请退款)
|
|
- 危险操作放在最后(取消、删除)
|
|
|
|
### 2. 视觉反馈
|
|
- 使用图标增强按钮识别度
|
|
- 颜色编码表示操作类型
|
|
- 分隔线清晰区分不同操作
|
|
|
|
### 3. 操作确认
|
|
- 危险操作使用 `a-popconfirm` 组件
|
|
- 明确的确认文案
|
|
- 详细的操作说明
|
|
|
|
### 4. 错误处理
|
|
- 统一的错误提示
|
|
- 操作失败后的状态恢复
|
|
- 网络异常的友好提示
|
|
|
|
## 权限控制建议
|
|
|
|
### 1. 角色权限
|
|
```typescript
|
|
// 根据用户角色显示不同按钮
|
|
const userRole = getCurrentUserRole();
|
|
|
|
// 财务人员可以处理退款
|
|
const canHandleRefund = userRole.includes('FINANCE') || userRole.includes('ADMIN');
|
|
|
|
// 仓库人员可以发货
|
|
const canDelivery = userRole.includes('WAREHOUSE') || userRole.includes('ADMIN');
|
|
```
|
|
|
|
### 2. 按钮权限控制
|
|
```vue
|
|
<a
|
|
v-if="canHandleRefund && (record.orderStatus === 4 || record.orderStatus === 7)"
|
|
@click.stop="handleApproveRefund(record)"
|
|
class="ele-text-success"
|
|
>
|
|
<CheckCircleOutlined /> 同意退款
|
|
</a>
|
|
```
|
|
|
|
## 性能优化
|
|
|
|
### 1. 条件渲染优化
|
|
- 使用 `v-if` 而不是 `v-show` 减少DOM节点
|
|
- 合理组织条件判断顺序
|
|
- 避免重复的状态计算
|
|
|
|
### 2. 事件处理优化
|
|
- 使用 `@click.stop` 防止事件冒泡
|
|
- 异步操作添加loading状态
|
|
- 防抖处理频繁点击
|
|
|
|
## 总结
|
|
|
|
新的订单列表操作按钮设计具有以下优势:
|
|
|
|
1. **功能完整**:覆盖订单全生命周期的所有操作
|
|
2. **逻辑清晰**:按钮显示严格遵循业务流程
|
|
3. **用户友好**:直观的图标和颜色编码
|
|
4. **安全可靠**:危险操作有确认机制
|
|
5. **易于维护**:模块化的代码结构
|
|
|
|
这个设计将显著提升订单管理的效率和用户体验。
|