9 changed files with 1101 additions and 81 deletions
@ -0,0 +1,75 @@ |
|||
// pages/order/detail/index.js
|
|||
const API = require('../../../utils/api.js'); |
|||
|
|||
Page({ |
|||
// 分享给朋友/群聊
|
|||
onShareAppMessage() { |
|||
return { |
|||
title: '鸡蛋贸易平台 - 订单详情', |
|||
path: '/pages/order/detail/index', |
|||
imageUrl: '/images/你有好蛋.png' |
|||
} |
|||
}, |
|||
|
|||
// 分享到朋友圈
|
|||
onShareTimeline() { |
|||
return { |
|||
title: '鸡蛋贸易平台 - 订单详情', |
|||
query: '', |
|||
imageUrl: '/images/你有好蛋.png' |
|||
} |
|||
}, |
|||
|
|||
data: { |
|||
orderId: '', |
|||
orderDetail: null, |
|||
loading: false, |
|||
error: '' |
|||
}, |
|||
|
|||
onLoad(options) { |
|||
if (options.orderId) { |
|||
this.setData({ orderId: options.orderId }); |
|||
this.loadOrderDetail(); |
|||
} |
|||
}, |
|||
|
|||
// 加载订单详情
|
|||
loadOrderDetail() { |
|||
const orderId = this.data.orderId; |
|||
if (!orderId) { |
|||
this.setData({ error: '订单ID不能为空' }); |
|||
return; |
|||
} |
|||
|
|||
this.setData({ loading: true, error: '' }); |
|||
|
|||
API.request(`/api/orders/detail/${orderId}`, 'GET', {}) |
|||
.then(res => { |
|||
console.log('获取订单详情成功:', res); |
|||
if (res.success) { |
|||
this.setData({ |
|||
orderDetail: res.data, |
|||
loading: false |
|||
}); |
|||
} else { |
|||
this.setData({ |
|||
error: res.message || '获取订单详情失败', |
|||
loading: false |
|||
}); |
|||
} |
|||
}) |
|||
.catch(err => { |
|||
console.error('获取订单详情失败:', err); |
|||
this.setData({ |
|||
error: err.message || '网络请求失败,请稍后重试', |
|||
loading: false |
|||
}); |
|||
}); |
|||
}, |
|||
|
|||
// 返回上一页
|
|||
goBack() { |
|||
wx.navigateBack(); |
|||
} |
|||
}) |
|||
@ -0,0 +1,4 @@ |
|||
{ |
|||
"navigationBarTitleText": "订单详情", |
|||
"usingComponents": {} |
|||
} |
|||
@ -0,0 +1,106 @@ |
|||
<view class="order-detail-page"> |
|||
<!-- 加载中 --> |
|||
<view wx:if="{{loading}}" class="loading"> |
|||
<text>加载中...</text> |
|||
</view> |
|||
|
|||
<!-- 错误提示 --> |
|||
<view wx:elif="{{error}}" class="error"> |
|||
<text>{{error}}</text> |
|||
<button bindtap="loadOrderDetail">重新加载</button> |
|||
</view> |
|||
|
|||
<!-- 订单详情 --> |
|||
<view wx:elif="{{orderDetail}}" class="order-content"> |
|||
<!-- 订单头部 --> |
|||
<view class="order-header"> |
|||
<view class="order-no">订单号: {{orderDetail.sales_no}}</view> |
|||
<view class="order-date">{{orderDetail.order_date}}</view> |
|||
</view> |
|||
|
|||
<!-- 客户信息 --> |
|||
<view class="section"> |
|||
<view class="section-title">客户信息</view> |
|||
<view class="customer-info"> |
|||
<view class="info-item"> |
|||
<view class="label">公司名称:</view> |
|||
<view class="value">{{orderDetail.customer_company}}</view> |
|||
</view> |
|||
<view class="info-item"> |
|||
<view class="label">联系人:</view> |
|||
<view class="value">{{orderDetail.contact_person}}</view> |
|||
</view> |
|||
<view class="info-item"> |
|||
<view class="label">联系电话:</view> |
|||
<view class="value">{{orderDetail.phone}}</view> |
|||
</view> |
|||
<view class="info-item"> |
|||
<view class="label">联系地址:</view> |
|||
<view class="value">{{orderDetail.address}}</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
|
|||
<!-- 订单摘要 --> |
|||
<view class="section"> |
|||
<view class="section-title">订单摘要</view> |
|||
<view class="order-summary"> |
|||
<view class="info-item"> |
|||
<view class="label">总金额:</view> |
|||
<view class="value total-amount">¥{{orderDetail.total_amount}}</view> |
|||
</view> |
|||
<view class="info-item"> |
|||
<view class="label">总件数:</view> |
|||
<view class="value">{{orderDetail.total_pieces}}</view> |
|||
</view> |
|||
<view class="info-item"> |
|||
<view class="label">总斤数:</view> |
|||
<view class="value">{{orderDetail.total_weight}}</view> |
|||
</view> |
|||
<view class="info-item"> |
|||
<view class="label">支付状态:</view> |
|||
<view class="value payment-status">{{orderDetail.payment_status}}</view> |
|||
</view> |
|||
<view class="info-item"> |
|||
<view class="label">订单状态:</view> |
|||
<view class="value order-status">{{orderDetail.order_status}}</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
|
|||
<!-- 产品详情 --> |
|||
<view class="section"> |
|||
<view class="section-title">产品详情</view> |
|||
<view class="products-list"> |
|||
<view wx:for="{{orderDetail.subItems}}" wx:key="sub_id" class="product-item"> |
|||
<view class="product-header"> |
|||
<view class="product-name">{{item.product_name}}</view> |
|||
</view> |
|||
<view class="product-details"> |
|||
<view class="info-item"> |
|||
<view class="label">销售件数:</view> |
|||
<view class="value">{{item.sales_pieces}}</view> |
|||
</view> |
|||
<view class="info-item"> |
|||
<view class="label">销售斤数:</view> |
|||
<view class="value">{{item.sales_weight}}</view> |
|||
</view> |
|||
<view class="info-item"> |
|||
<view class="label">单价:</view> |
|||
<view class="value">¥{{item.unit_price}}</view> |
|||
</view> |
|||
<view class="info-item"> |
|||
<view class="label">小计:</view> |
|||
<view class="value">¥{{item.sales_amount}}</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
|
|||
<!-- 无数据提示 --> |
|||
<view wx:else class="no-data"> |
|||
<text>暂无订单详情</text> |
|||
</view> |
|||
</view> |
|||
@ -0,0 +1,206 @@ |
|||
/* pages/order/detail/index.wxss */ |
|||
.order-detail-page { |
|||
min-height: 100vh; |
|||
background-color: #f5f5f5; |
|||
padding: 20rpx; |
|||
} |
|||
|
|||
/* 加载中 */ |
|||
.loading { |
|||
display: flex; |
|||
justify-content: center; |
|||
align-items: center; |
|||
padding: 120rpx 0; |
|||
background-color: #fff; |
|||
border-radius: 12rpx; |
|||
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05); |
|||
font-size: 32rpx; |
|||
color: #666; |
|||
} |
|||
|
|||
/* 错误提示 */ |
|||
.error { |
|||
display: flex; |
|||
flex-direction: column; |
|||
justify-content: center; |
|||
align-items: center; |
|||
padding: 120rpx 40rpx; |
|||
background-color: #fff; |
|||
border-radius: 12rpx; |
|||
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05); |
|||
font-size: 32rpx; |
|||
color: #ff4d4f; |
|||
text-align: center; |
|||
} |
|||
|
|||
.error button { |
|||
margin-top: 40rpx; |
|||
background-color: #1677ff; |
|||
color: #fff; |
|||
border: none; |
|||
padding: 20rpx 80rpx; |
|||
border-radius: 60rpx; |
|||
font-size: 28rpx; |
|||
font-weight: bold; |
|||
} |
|||
|
|||
/* 订单内容 */ |
|||
.order-content { |
|||
background-color: #fff; |
|||
border-radius: 12rpx; |
|||
padding: 30rpx; |
|||
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05); |
|||
} |
|||
|
|||
/* 订单头部 */ |
|||
.order-header { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
margin-bottom: 30rpx; |
|||
padding-bottom: 30rpx; |
|||
border-bottom: 1rpx solid #f0f0f0; |
|||
} |
|||
|
|||
.order-no { |
|||
font-size: 28rpx; |
|||
color: #333; |
|||
font-weight: bold; |
|||
} |
|||
|
|||
.order-date { |
|||
font-size: 26rpx; |
|||
color: #999; |
|||
} |
|||
|
|||
/* 区块样式 */ |
|||
.section { |
|||
margin-bottom: 30rpx; |
|||
} |
|||
|
|||
.section-title { |
|||
font-size: 30rpx; |
|||
color: #333; |
|||
font-weight: bold; |
|||
margin-bottom: 20rpx; |
|||
padding-left: 20rpx; |
|||
border-left: 6rpx solid #1677ff; |
|||
} |
|||
|
|||
/* 客户信息 */ |
|||
.customer-info { |
|||
background-color: #f9f9f9; |
|||
border-radius: 8rpx; |
|||
padding: 20rpx; |
|||
} |
|||
|
|||
/* 订单摘要 */ |
|||
.order-summary { |
|||
background-color: #f9f9f9; |
|||
border-radius: 8rpx; |
|||
padding: 20rpx; |
|||
} |
|||
|
|||
/* 信息项 */ |
|||
.info-item { |
|||
display: flex; |
|||
margin-bottom: 16rpx; |
|||
align-items: flex-start; |
|||
} |
|||
|
|||
.info-item:last-child { |
|||
margin-bottom: 0; |
|||
} |
|||
|
|||
.label { |
|||
width: 140rpx; |
|||
font-size: 26rpx; |
|||
color: #666; |
|||
font-weight: bold; |
|||
flex-shrink: 0; |
|||
} |
|||
|
|||
.value { |
|||
flex: 1; |
|||
font-size: 26rpx; |
|||
color: #333; |
|||
word-break: break-all; |
|||
line-height: 1.4; |
|||
} |
|||
|
|||
/* 总金额样式 */ |
|||
.total-amount { |
|||
font-size: 28rpx; |
|||
color: #ff4d4f; |
|||
font-weight: bold; |
|||
} |
|||
|
|||
/* 状态样式 */ |
|||
.payment-status { |
|||
color: #52c41a; |
|||
font-weight: bold; |
|||
} |
|||
|
|||
.order-status { |
|||
color: #1677ff; |
|||
font-weight: bold; |
|||
} |
|||
|
|||
/* 产品列表 */ |
|||
.products-list { |
|||
background-color: #f9f9f9; |
|||
border-radius: 8rpx; |
|||
padding: 20rpx; |
|||
} |
|||
|
|||
/* 产品项 */ |
|||
.product-item { |
|||
background-color: #fff; |
|||
border-radius: 8rpx; |
|||
padding: 20rpx; |
|||
margin-bottom: 16rpx; |
|||
box-shadow: 0 1rpx 4rpx rgba(0, 0, 0, 0.05); |
|||
} |
|||
|
|||
.product-item:last-child { |
|||
margin-bottom: 0; |
|||
} |
|||
|
|||
/* 产品头部 */ |
|||
.product-header { |
|||
margin-bottom: 16rpx; |
|||
padding-bottom: 16rpx; |
|||
border-bottom: 1rpx solid #f0f0f0; |
|||
} |
|||
|
|||
.product-name { |
|||
font-size: 28rpx; |
|||
color: #333; |
|||
font-weight: bold; |
|||
} |
|||
|
|||
/* 产品详情 */ |
|||
.product-details { |
|||
display: grid; |
|||
grid-template-columns: repeat(2, 1fr); |
|||
gap: 16rpx; |
|||
} |
|||
|
|||
@media (max-width: 375px) { |
|||
.product-details { |
|||
grid-template-columns: 1fr; |
|||
} |
|||
} |
|||
|
|||
/* 无数据提示 */ |
|||
.no-data { |
|||
display: flex; |
|||
justify-content: center; |
|||
align-items: center; |
|||
padding: 120rpx 0; |
|||
background-color: #fff; |
|||
border-radius: 12rpx; |
|||
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05); |
|||
font-size: 32rpx; |
|||
color: #999; |
|||
} |
|||
@ -1,21 +1,123 @@ |
|||
<view class="order-page"> |
|||
<!-- 订单状态标签栏 --> |
|||
<view class="order-tabs"> |
|||
<view class="tab-item active">全部</view> |
|||
<view class="tab-item">待付款</view> |
|||
<view class="tab-item">待发货</view> |
|||
<view class="tab-item">待收货</view> |
|||
<view class="tab-item">已完成</view> |
|||
<view class="tab-item {{activeTab === 'all' ? 'active' : ''}}" bindtap="switchTab" data-tab="all">全部</view> |
|||
<view class="tab-item {{activeTab === 'unpaid' ? 'active' : ''}}" bindtap="switchTab" data-tab="unpaid">待付款</view> |
|||
<view class="tab-item {{activeTab === 'completed' ? 'active' : ''}}" bindtap="switchTab" data-tab="completed">已完成</view> |
|||
</view> |
|||
|
|||
<!-- 时间筛选组件 --> |
|||
<view class="date-filter"> |
|||
<view class="date-filter-row"> |
|||
<view class="date-picker"> |
|||
<view class="date-label">开始日期:</view> |
|||
<picker mode="date" value="{{dateRange.start}}" bindchange="bindStartDateChange"> |
|||
<view class="picker"> |
|||
{{dateRange.start || '请选择'}} |
|||
</view> |
|||
</picker> |
|||
</view> |
|||
<view class="date-picker"> |
|||
<view class="date-label">结束日期:</view> |
|||
<picker mode="date" value="{{dateRange.end}}" bindchange="bindEndDateChange"> |
|||
<view class="picker"> |
|||
{{dateRange.end || '请选择'}} |
|||
</view> |
|||
</picker> |
|||
</view> |
|||
</view> |
|||
<view class="filter-actions"> |
|||
<button class="reset-btn" bindtap="resetDateFilter">重置</button> |
|||
<button class="apply-btn" bindtap="applyDateFilter">应用筛选</button> |
|||
</view> |
|||
</view> |
|||
|
|||
<!-- 统计信息 --> |
|||
<view class="statistics-card"> |
|||
<view class="statistics-header"> |
|||
<text class="statistics-title">订单统计</text> |
|||
</view> |
|||
<view class="statistics-body"> |
|||
<view class="stat-item"> |
|||
<view class="stat-label">总订单数</view> |
|||
<view class="stat-value">{{statistics.totalOrders}}</view> |
|||
</view> |
|||
<view class="stat-item"> |
|||
<view class="stat-label">总件数</view> |
|||
<view class="stat-value">{{statistics.totalPieces}}</view> |
|||
</view> |
|||
<view class="stat-item"> |
|||
<view class="stat-label">总斤数</view> |
|||
<view class="stat-value">{{statistics.totalWeight}}</view> |
|||
</view> |
|||
<view class="stat-item"> |
|||
<view class="stat-label">已消费</view> |
|||
<view class="stat-value paid">¥{{statistics.paidAmount}}</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
|
|||
<!-- 订单列表 --> |
|||
<view class="order-list"> |
|||
<!-- 暂无订单提示 --> |
|||
<view class="no-orders"> |
|||
<!-- 加载中 --> |
|||
<view wx:if="{{loading}}" class="loading"> |
|||
<text>加载中...</text> |
|||
</view> |
|||
|
|||
<!-- 错误提示 --> |
|||
<view wx:elif="{{error}}" class="error"> |
|||
<text>{{error}}</text> |
|||
</view> |
|||
|
|||
<!-- 无订单提示 --> |
|||
<view wx:elif="{{orders.length === 0}}" class="no-orders"> |
|||
<view class="no-orders-icon">📦</view> |
|||
<view class="no-orders-title">空空如也~</view> |
|||
<view class="no-orders-subtitle">您还没有任何订单,快去选购吧</view> |
|||
<button class="go-shopping-btn" bindtap="goToHome">去首页购物</button> |
|||
</view> |
|||
|
|||
<!-- 订单列表 --> |
|||
<view wx:else class="orders"> |
|||
<view wx:for="{{orders}}" wx:key="dataid" class="order-card" bindtap="viewOrderDetail" data-order-id="{{item.dataid}}"> |
|||
<!-- 订单头部 --> |
|||
<view class="order-header"> |
|||
<view class="order-no">订单号: {{item.sales_no}}</view> |
|||
<view class="order-date">{{item.order_date}}</view> |
|||
</view> |
|||
|
|||
<!-- 订单主体 --> |
|||
<view class="order-body"> |
|||
<view class="customer-info"> |
|||
<view class="customer-company">{{item.customer_company}}</view> |
|||
<view class="contact-person">{{item.contact_person}} {{item.phone}}</view> |
|||
</view> |
|||
<view class="order-summary"> |
|||
<view class="total-amount">总金额: ¥{{item.total_amount}}</view> |
|||
<view class="total-pieces">总件数: {{item.total_pieces}}</view> |
|||
<view class="total-weight">总斤数: {{item.total_weight}}</view> |
|||
</view> |
|||
</view> |
|||
|
|||
<!-- 订单底部 --> |
|||
<view class="order-footer"> |
|||
<view class="status-container"> |
|||
<view class="payment-status">{{item.payment_status}}</view> |
|||
<view class="order-status">{{item.order_status}}</view> |
|||
</view> |
|||
<view class="arrow-icon">→</view> |
|||
</view> |
|||
</view> |
|||
|
|||
<!-- 分页加载状态 --> |
|||
<view class="load-more"> |
|||
<view wx:if="{{loadingMore}}" class="loading-more"> |
|||
<text>加载中...</text> |
|||
</view> |
|||
<view wx:elif="{{!hasMore && orders.length > 0}}" class="no-more"> |
|||
<text>没有更多数据了</text> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
|
|||
Loading…
Reference in new issue