Procházet zdrojové kódy

📝 docs(prd): update order export feature documentation

- add version history entries for US005-14 implementation details
- add order data export feature story US005-14 with acceptance criteria
- define exportable data fields based on code verification
- document technical implementation plan for frontend and backend
- add frontend implementation code details for order export function
- describe API status, management page tasks and technical implementation tasks
- outline performance optimization strategies and security considerations
- update dependency relationships and implementation status summary
yourname před 3 měsíci
rodič
revize
ebc8b29f1f
1 změnil soubory, kde provedl 154 přidání a 0 odebrání
  1. 154 0
      docs/prd/epic-005-travel-service-core.md

+ 154 - 0
docs/prd/epic-005-travel-service-core.md

@@ -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.2 | 2025-10-25 | 添加小程序手机号获取集成故事US005-12,顺延原有故事编号 | 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中添加导出功能
+- 🔄 **用户体验**: 需要添加导出进度和状态显示
+
 ## 技术实现方案
 
 ### 后端数据模型