|
@@ -3,6 +3,8 @@
|
|
|
## 版本信息
|
|
## 版本信息
|
|
|
| 版本 | 日期 | 描述 | 作者 |
|
|
| 版本 | 日期 | 描述 | 作者 |
|
|
|
|------|------|------|------|
|
|
|------|------|------|------|
|
|
|
|
|
+| 2.5 | 2025-10-25 | 根据代码核对更新订单导出功能故事US005-14,完善技术实现细节 | John (PM) |
|
|
|
|
|
+| 2.4 | 2025-10-25 | 添加管理后台订单数据导出功能故事US005-14,顺延原有故事编号 | John (PM) |
|
|
|
| 2.3 | 2025-10-25 | 添加微信小程序环境自动登录获取openid故事US005-13,顺延原有故事编号 | John (PM) |
|
|
| 2.3 | 2025-10-25 | 添加微信小程序环境自动登录获取openid故事US005-13,顺延原有故事编号 | John (PM) |
|
|
|
| 2.2 | 2025-10-25 | 添加小程序手机号获取集成故事US005-12,顺延原有故事编号 | John (PM) |
|
|
| 2.2 | 2025-10-25 | 添加小程序手机号获取集成故事US005-12,顺延原有故事编号 | John (PM) |
|
|
|
| 2.1 | 2025-10-20 | 添加车型和路线配置增强故事US005-04,顺延原有故事编号 | John (PM) |
|
|
| 2.1 | 2025-10-20 | 添加车型和路线配置增强故事US005-04,顺延原有故事编号 | John (PM) |
|
|
@@ -576,6 +578,158 @@ export class UserEntity {
|
|
|
- 🔄 **静默登录**: 应用启动时自动登录功能待实现
|
|
- 🔄 **静默登录**: 应用启动时自动登录功能待实现
|
|
|
- ✅ **安全机制**: 完整的错误处理、防刷机制和隐私保护
|
|
- ✅ **安全机制**: 完整的错误处理、防刷机制和隐私保护
|
|
|
|
|
|
|
|
|
|
+### US005-14: 管理后台订单数据导出功能
|
|
|
|
|
+**作为** 系统管理员
|
|
|
|
|
+**我希望** 能够在管理后台的订单管理页面导出订单数据为xlsx格式
|
|
|
|
|
+**以便** 进行数据分析和报表制作
|
|
|
|
|
+
|
|
|
|
|
+**验收标准**:
|
|
|
|
|
+- [ ] 在订单管理页面添加"导出Excel"按钮
|
|
|
|
|
+- [ ] 支持按当前筛选条件导出订单数据
|
|
|
|
|
+- [ ] 导出的xlsx文件包含完整的订单信息
|
|
|
|
|
+- [ ] 支持批量导出所有订单数据
|
|
|
|
|
+- [ ] 导出的文件格式规范,包含表头和格式
|
|
|
|
|
+- [ ] 支持导出进度显示和下载提示
|
|
|
|
|
+- [ ] 处理大量数据时的性能优化
|
|
|
|
|
+- [ ] 导出文件命名规范,包含时间戳
|
|
|
|
|
+
|
|
|
|
|
+**实际可导出数据字段**(基于代码核对):
|
|
|
|
|
+- **订单编号**: `id`
|
|
|
|
|
+- **用户信息**: `user.username`, `user.phone`
|
|
|
|
|
+- **路线信息**: `route.name`, `route.description`
|
|
|
|
|
+- **乘客数量**: `passengerCount`
|
|
|
|
|
+- **订单金额**: `totalAmount`
|
|
|
|
|
+- **订单状态**: `status` (待支付、待出发、行程中、已完成、已取消)
|
|
|
|
|
+- **支付状态**: `paymentStatus` (待支付、支付中、已支付、支付失败、已退款、已关闭)
|
|
|
|
|
+- **创建时间**: `createdAt`
|
|
|
|
|
+- **更新时间**: `updatedAt`
|
|
|
|
|
+- **乘客快照信息**: `passengerSnapshots` (包含姓名、证件类型、证件号码等)
|
|
|
|
|
+
|
|
|
|
|
+**技术实现方案**(基于实际代码架构):
|
|
|
|
|
+- **前端实现**: 使用已安装的 `xlsx` 库生成Excel文件
|
|
|
|
|
+- **后端支持**: 利用现有的通用CRUD API,支持JSON格式筛选条件
|
|
|
|
|
+- **文件生成**: 前端生成Excel文件,避免服务器压力
|
|
|
|
|
+- **性能优化**: 使用现有API的`pageSize`参数支持大量数据查询
|
|
|
|
|
+
|
|
|
|
|
+**前端实现细节**(基于实际代码结构):
|
|
|
|
|
+```typescript
|
|
|
|
|
+// 订单导出功能实现 - 基于实际Orders.tsx页面结构
|
|
|
|
|
+const handleExportOrders = async () => {
|
|
|
|
|
+ try {
|
|
|
|
|
+ // 1. 显示导出进度
|
|
|
|
|
+ setExporting(true);
|
|
|
|
|
+
|
|
|
|
|
+ // 2. 获取当前页面筛选条件(基于现有filters和searchParams)
|
|
|
|
|
+ const exportFilters = {
|
|
|
|
|
+ status: filters.status,
|
|
|
|
|
+ paymentStatus: filters.paymentStatus,
|
|
|
|
|
+ search: searchParams.search,
|
|
|
|
|
+ pageSize: 10000 // 使用大pageSize获取所有数据
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ // 3. 调用现有订单API获取数据
|
|
|
|
|
+ const response = await orderClient.$get({
|
|
|
|
|
+ query: {
|
|
|
|
|
+ page: 1,
|
|
|
|
|
+ pageSize: 10000,
|
|
|
|
|
+ keyword: searchParams.search,
|
|
|
|
|
+ filters: JSON.stringify({
|
|
|
|
|
+ status: filters.status,
|
|
|
|
|
+ paymentStatus: filters.paymentStatus
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ if (response.status !== 200) {
|
|
|
|
|
+ throw new Error('获取订单数据失败');
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ const ordersData = await response.json();
|
|
|
|
|
+ const orders = ordersData.data || [];
|
|
|
|
|
+
|
|
|
|
|
+ // 4. 生成Excel文件
|
|
|
|
|
+ const workbook = XLSX.utils.book_new();
|
|
|
|
|
+ const worksheet = XLSX.utils.json_to_sheet(orders.map(order => ({
|
|
|
|
|
+ '订单编号': `#${order.id}`,
|
|
|
|
|
+ '用户名': order.user?.username || '未知用户',
|
|
|
|
|
+ '手机号': order.user?.phone || '未知',
|
|
|
|
|
+ '路线名称': order.route?.name || '未知路线',
|
|
|
|
|
+ '路线描述': order.route?.description || '无描述',
|
|
|
|
|
+ '乘客数量': order.passengerCount,
|
|
|
|
|
+ '订单金额': `¥${order.totalAmount}`,
|
|
|
|
|
+ '订单状态': order.status,
|
|
|
|
|
+ '支付状态': order.paymentStatus,
|
|
|
|
|
+ '创建时间': format(new Date(order.createdAt), 'yyyy-MM-dd HH:mm:ss'),
|
|
|
|
|
+ '更新时间': format(new Date(order.updatedAt), 'yyyy-MM-dd HH:mm:ss'),
|
|
|
|
|
+ '乘客信息': order.passengerSnapshots?.map((p: any, index: number) =>
|
|
|
|
|
+ `乘客${index + 1}: ${p.name || '未知'} (${p.idType || '未知'}: ${p.idNumber || '未知'})`
|
|
|
|
|
+ ).join('; ') || '无乘客信息'
|
|
|
|
|
+ })));
|
|
|
|
|
+
|
|
|
|
|
+ // 5. 设置表头样式
|
|
|
|
|
+ XLSX.utils.book_append_sheet(workbook, worksheet, '订单数据');
|
|
|
|
|
+
|
|
|
|
|
+ // 6. 生成文件并下载
|
|
|
|
|
+ const fileName = `订单数据_${dayjs().format('YYYYMMDD_HHmmss')}.xlsx`;
|
|
|
|
|
+ XLSX.writeFile(workbook, fileName);
|
|
|
|
|
+
|
|
|
|
|
+ // 7. 显示成功提示
|
|
|
|
|
+ message.success(`订单数据导出成功,共导出 ${orders.length} 条记录`);
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.error('导出失败:', error);
|
|
|
|
|
+ message.error('导出失败,请重试');
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ setExporting(false);
|
|
|
|
|
+ }
|
|
|
|
|
+};
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+**后端API现状**(基于代码核对):
|
|
|
|
|
+- ✅ **API端点**: `GET /api/v1/admin/orders` 已存在
|
|
|
|
|
+- ✅ **查询参数**: 支持 `page`, `pageSize`, `keyword`, `filters` (JSON格式)
|
|
|
|
|
+- ✅ **筛选支持**: 支持订单状态、支付状态筛选
|
|
|
|
|
+- ✅ **数据关联**: 已包含 `user` 和 `route` 关联数据
|
|
|
|
|
+- ✅ **分页能力**: 支持大pageSize查询(最大10000条)
|
|
|
|
|
+
|
|
|
|
|
+**管理后台页面任务**:
|
|
|
|
|
+- [ ] 在订单管理页面添加导出按钮(位于搜索区域)
|
|
|
|
|
+- [ ] 实现导出功能组件(集成到现有Orders.tsx中)
|
|
|
|
|
+- [ ] 添加导出进度显示和状态管理
|
|
|
|
|
+- [ ] 支持按当前筛选条件导出
|
|
|
|
|
+- [ ] 优化大量数据导出性能
|
|
|
|
|
+
|
|
|
|
|
+**技术实现任务**:
|
|
|
|
|
+- [x] **xlsx库依赖**: 已安装(web/package.json:118行)
|
|
|
|
|
+- [ ] 实现订单数据导出组件
|
|
|
|
|
+- [x] **后端API**: 已支持大量数据查询
|
|
|
|
|
+- [x] **权限验证**: 已通过adminMiddleware实现
|
|
|
|
|
+- [ ] 实现导出文件命名规范
|
|
|
|
|
+- [ ] 添加导出错误处理和重试机制
|
|
|
|
|
+
|
|
|
|
|
+**性能优化策略**:
|
|
|
|
|
+- **现有API利用**: 使用现有通用CRUD API的`pageSize`参数
|
|
|
|
|
+- **进度显示**: 在导出过程中显示进度状态
|
|
|
|
|
+- **错误处理**: 处理网络超时和API错误
|
|
|
|
|
+- **内存管理**: 及时释放内存资源
|
|
|
|
|
+
|
|
|
|
|
+**安全考虑**:
|
|
|
|
|
+- ✅ **权限验证**: 已通过adminMiddleware确保仅管理员可访问
|
|
|
|
|
+- ✅ **数据安全**: 现有API已包含权限验证
|
|
|
|
|
+- **数据脱敏**: 保护用户隐私信息
|
|
|
|
|
+- **导出频率**: 可考虑添加频率限制
|
|
|
|
|
+
|
|
|
|
|
+**依赖关系**:
|
|
|
|
|
+- ✅ **前置依赖**: US005-07 订单信息查看(管理后台)已实现
|
|
|
|
|
+- ✅ **技术依赖**: xlsx库已安装,订单查询API已存在
|
|
|
|
|
+- ✅ **并行开发**: 可与现有订单管理页面集成
|
|
|
|
|
+
|
|
|
|
|
+**实现状态总结**:
|
|
|
|
|
+- ✅ **技术基础**: xlsx库已安装,后端API已就绪
|
|
|
|
|
+- ✅ **数据模型**: 订单实体包含完整导出字段
|
|
|
|
|
+- ✅ **权限控制**: 管理员权限验证已实现
|
|
|
|
|
+- 🔄 **前端集成**: 需要在Orders.tsx中添加导出功能
|
|
|
|
|
+- 🔄 **用户体验**: 需要添加导出进度和状态显示
|
|
|
|
|
+
|
|
|
## 技术实现方案
|
|
## 技术实现方案
|
|
|
|
|
|
|
|
### 后端数据模型
|
|
### 后端数据模型
|