HaniBlindBox/.kiro/specs/order-management-frontend/design.md
2026-01-17 20:21:30 +08:00

13 KiB
Raw Blame History

Design Document: 订单管理模块前端迁移

Overview

本设计文档描述订单管理模块从老项目PHP ThinkPHP + Layui迁移到新项目ASP.NET Core + Vue 3 + Element Plus的技术方案。订单管理模块是后台管理系统的核心业务模块包含购买订单、发货订单、回收订单、卡单订单等多种订单类型的管理功能。

技术栈

  • 前端框架Vue 3 + TypeScript
  • UI组件库Element Plus
  • 状态管理Pinia
  • HTTP客户端Axios
  • 后端框架ASP.NET Core (.NET 10)
  • 数据库SQL Server

Architecture

┌─────────────────────────────────────────────────────────────────┐
│                        前端应用层                                │
├─────────────────────────────────────────────────────────────────┤
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐              │
│  │ 购买订单页面 │  │ 发货订单页面 │  │ 回收订单页面 │              │
│  └─────────────┘  └─────────────┘  └─────────────┘              │
│  ┌─────────────┐  ┌─────────────┐                               │
│  │ 卡单订单页面 │  │ 综合订单页面 │                               │
│  └─────────────┘  └─────────────┘                               │
├─────────────────────────────────────────────────────────────────┤
│                        组件层                                    │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐              │
│  │ SearchForm  │  │ OrderTable  │  │ DetailDialog│              │
│  └─────────────┘  └─────────────┘  └─────────────┘              │
│  ┌─────────────┐  ┌─────────────┐                               │
│  │ShippingDialog│ │ PrizeList   │                               │
│  └─────────────┘  └─────────────┘                               │
├─────────────────────────────────────────────────────────────────┤
│                        API层                                     │
│  ┌─────────────────────────────────────────────────────────────┐│
│  │                    api/business/order.ts                     ││
│  └─────────────────────────────────────────────────────────────┘│
├─────────────────────────────────────────────────────────────────┤
│                        后端API层                                 │
│  ┌─────────────────────────────────────────────────────────────┐│
│  │                    OrderController                           ││
│  └─────────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────────┘

Components and Interfaces

1. 页面组件

1.1 购买订单页面 (BuyOrderPage)

  • 路径:views/business/order/buy.vue
  • 功能:展示购买订单列表,支持搜索、分页、查看详情、导出

1.2 发货订单页面 (ShippingOrderPage)

  • 路径:views/business/order/shipping.vue
  • 功能:展示发货订单列表,支持搜索、分页、查看详情、发货操作、取消发货、导出

1.3 回收订单页面 (RecoveryOrderPage)

  • 路径:views/business/order/recovery.vue
  • 功能:展示回收订单列表,支持搜索、分页、查看详情、导出

1.4 卡单订单页面 (StuckOrderPage)

  • 路径:views/business/order/stuck.vue
  • 功能:展示卡单订单列表,支持搜索、分页

1.5 综合订单页面 (OrderListPage)

  • 路径:views/business/order/list.vue
  • 功能:展示综合订单列表,支持多条件搜索、分页、查看详情、导出

2. 公共组件

2.1 订单搜索表单 (OrderSearchForm)

  • 路径:views/business/order/components/OrderSearchForm.vue
  • Props
    • type: 订单类型buy/shipping/recovery/stuck/list
    • modelValue: 搜索条件对象
  • Events
    • search: 触发搜索
    • reset: 重置搜索条件

2.2 订单表格 (OrderTable)

  • 路径:views/business/order/components/OrderTable.vue
  • Props
    • type: 订单类型
    • data: 订单数据列表
    • loading: 加载状态
    • total: 总记录数
    • page: 当前页码
    • pageSize: 每页大小
  • Events
    • page-change: 页码变化
    • view-detail: 查看详情
    • ship: 发货操作
    • cancel-ship: 取消发货

2.3 订单详情弹窗 (OrderDetailDialog)

  • 路径:views/business/order/components/OrderDetailDialog.vue
  • Props
    • visible: 是否显示
    • orderId: 订单ID
  • Events
    • close: 关闭弹窗

2.4 发货订单详情弹窗 (ShippingDetailDialog)

  • 路径:views/business/order/components/ShippingDetailDialog.vue
  • Props
    • visible: 是否显示
    • sendId: 发货记录ID
  • Events
    • close: 关闭弹窗
    • shipped: 发货成功

2.5 发货操作弹窗 (ShipDialog)

  • 路径:views/business/order/components/ShipDialog.vue
  • Props
    • visible: 是否显示
    • sendId: 发货记录ID
  • Events
    • close: 关闭弹窗
    • success: 发货成功

2.6 回收订单详情弹窗 (RecoveryDetailDialog)

  • 路径:views/business/order/components/RecoveryDetailDialog.vue
  • Props
    • visible: 是否显示
    • recoveryId: 回收记录ID
  • Events
    • close: 关闭弹窗

3. API接口

3.1 订单API模块

  • 路径:api/business/order.ts
// 接口类型定义
interface OrderListRequest {
  page: number
  pageSize: number
  userId?: number
  mobile?: string
  orderNum?: string
  startDate?: string
  endDate?: string
  status?: number
  orderType?: number
}

interface OrderListResponse {
  id: number
  orderNum: string
  userId: number
  userNickname?: string
  userMobile?: string
  userUid?: string
  goodsId: number
  goodsTitle?: string
  goodsImgUrl?: string
  orderType: number
  orderTotal: number
  discount: number
  discountTotal: number
  weChatPayment: number
  balancePayment: number
  integralPayment: number
  scorePayment: number
  couponPayment?: number
  num: number
  prizeNum: number
  status: number
  statusName: string
  payType: number
  payTypeName: string
  createdAt: string
  payTime?: string
}

interface ShippingOrderListRequest {
  page: number
  pageSize: number
  userId?: number
  mobile?: string
  sendNum?: string
  startDate?: string
  endDate?: string
  status?: number
}

interface ShippingOrderResponse {
  id: number
  userId: number
  userNickname?: string
  userMobile?: string
  userUid?: string
  sendNum: string
  freight: number
  status: number
  statusName: string
  count: number
  name?: string
  receiverMobile?: string
  address?: string
  message?: string
  courierNumber?: string
  courierName?: string
  courierCode?: string
  deliveryStatus: number
  deliveryStatusName: string
  createdAt: string
  payTime?: string
  sendTime?: string
  receiveTime?: string
  prizes: ShippingPrizeDto[]
}

interface ShipOrderRequest {
  courierName: string
  courierNumber: string
  courierCode?: string
}

// API函数
export function getOrderList(params: OrderListRequest): Promise<PagedResult<OrderListResponse>>
export function getOrderDetail(id: number): Promise<OrderDetailResponse>
export function getStuckOrders(params: OrderListRequest): Promise<PagedResult<OrderListResponse>>
export function getRecoveryOrders(params: OrderListRequest): Promise<PagedResult<RecoveryOrderResponse>>
export function getShippingOrders(params: ShippingOrderListRequest): Promise<PagedResult<ShippingOrderResponse>>
export function getShippingOrderDetail(id: number): Promise<ShippingOrderResponse>
export function shipOrder(id: number, data: ShipOrderRequest): Promise<void>
export function cancelShippingOrder(id: number): Promise<void>
export function exportOrders(params: OrderExportRequest): Promise<Blob>

Data Models

1. 订单状态枚举

enum OrderStatus {
  Unpaid = 0,    // 待支付
  Paid = 1,      // 已支付
  Cancelled = 2  // 已取消
}

2. 发货状态枚举

enum ShippingStatus {
  Unpaid = 0,    // 待支付
  Pending = 1,   // 待发货
  Shipped = 2,   // 已发货
  Received = 3,  // 已签收
  Cancelled = 4  // 已取消
}

3. 订单项状态枚举

enum OrderItemStatus {
  Pending = 0,   // 待处理
  Recovered = 1, // 已回收
  Shipped = 2    // 已发货
}

4. 支付方式枚举

enum PayType {
  Unpaid = 0,    // 未支付
  WeChat = 1,    // 微信支付
  Alipay = 2     // 支付宝
}

Correctness Properties

A property is a characteristic or behavior that should hold true across all valid executions of a system-essentially, a formal statement about what the system should do. Properties serve as the bridge between human-readable specifications and machine-verifiable correctness guarantees.

Property 1: 搜索参数正确传递

For any 搜索条件对象当用户提交搜索时API调用应该正确传递所有非空的搜索参数到后端。

Validates: Requirements 1.2, 3.2, 4.2, 6.2, 7.2

Property 2: 分页参数正确传递

For any 页码和页大小组合当用户切换分页时API调用应该正确传递page和pageSize参数且page >= 1pageSize > 0。

Validates: Requirements 1.3

Property 3: 发货信息验证

For any 发货表单输入,当物流公司名称或快递单号为空字符串或纯空白字符串时,表单验证应该失败并阻止提交。

Validates: Requirements 5.4

Property 4: API响应格式一致性

For any API调用响应数据应该符合定义的TypeScript接口类型包含所有必需字段。

Validates: Requirements 8.2, 8.3, 8.4, 8.5, 8.6

Property 5: 错误响应格式一致性

For any API调用失败错误响应应该包含统一格式的错误信息code和message字段

Validates: Requirements 8.7

Error Handling

1. API错误处理

  • 网络错误:显示"网络连接失败,请检查网络"
  • 401未授权跳转到登录页面
  • 403无权限显示"您没有权限执行此操作"
  • 404未找到显示"请求的资源不存在"
  • 500服务器错误显示"服务器错误,请稍后重试"
  • 业务错误:显示后端返回的错误信息

2. 表单验证错误

  • 必填字段为空:显示"xxx不能为空"
  • 格式错误:显示具体的格式要求

3. 操作确认

  • 取消发货:弹出确认对话框"确定要取消发货吗?取消后奖品将返回用户盒柜"
  • 导出数据:大数据量时显示加载提示

Testing Strategy

1. 单元测试

  • 测试搜索表单组件的参数收集逻辑
  • 测试表格组件的数据展示逻辑
  • 测试发货表单的验证逻辑
  • 测试API模块的请求构造逻辑

2. 属性测试

使用 fast-check 库进行属性测试每个属性测试运行至少100次迭代。

  • Property 1: 搜索参数正确传递

    • 生成随机搜索条件对象
    • 验证API调用参数包含所有非空字段
  • Property 2: 分页参数正确传递

    • 生成随机页码和页大小
    • 验证API调用参数正确
  • Property 3: 发货信息验证

    • 生成随机字符串(包括空字符串、纯空白字符串、正常字符串)
    • 验证验证函数的返回值正确
  • Property 4: API响应格式一致性

    • 模拟API响应数据
    • 验证响应数据符合接口定义
  • Property 5: 错误响应格式一致性

    • 模拟各种错误响应
    • 验证错误处理逻辑正确

3. 集成测试

  • 测试完整的订单查询流程
  • 测试完整的发货操作流程
  • 测试导出功能