ry_app/package_a/back/back.vue

232 lines
9.2 KiB
Vue
Raw Normal View History

2026-02-02 16:04:16 +08:00
<template>
<view class="page-container">
<!-- 导航栏 -->
<view class="navbar">
<view class="nav-tabs">
<view class="tab-item active">全部订单</view>
<!-- <view class="tab-item">只看订单</view> -->
2026-02-02 16:04:16 +08:00
</view>
</view>
<!-- 搜索与筛选区 -->
<view class="search-section">
<view class="search-box">
<!-- <text class="search-icon">🔍</text> -->
<!-- 选择订单号 -->
<block v-if="filterType === 'orderNo'">
<input class="search-input" v-model="queryParams.orderNo" placeholder="请输入订单号" @confirm="handleSearch" />
</block>
<!-- 选择条码 -->
<block v-else-if="filterType === 'barcode'">
<input class="search-input" v-model="queryParams.productBarCode" placeholder="请输入条码" @confirm="handleSearch" />
</block>
<!-- 选择支付状态 -->
<block v-else-if="filterType === 'payStatus'">
<picker class="search-input picker-input" mode="selector" :range="payStatusOptions" range-key="label" @change="onPayStatusChange">
<view class="picker-text">
{{ currentPayStatusLabel || '请选择支付状态' }}
</view>
</picker>
</block>
<!-- 重置 -->
<text class="reset-icon" @click="handleReset"></text>
<!-- 点击弹出下拉单选框选择类型 -->
<text class="split-icon" @click="showFilterTypeSelector"></text>
2026-02-02 16:04:16 +08:00
</view>
<view class="filter-btn" @click="handleSearch">
<!-- <text class="filter-icon">🔍</text> -->
<text class="filter-text">搜索</text>
2026-02-02 16:04:16 +08:00
</view>
</view>
<!-- 内容区 -->
<scroll-view scroll-y class="content" @scrolltolower="loadMore">
<block v-if="orderList.length > 0">
<!-- 订单列表展示 订单号支付状态支付金额支付时间 -->
<view class="order-item" v-for="(item, index) in orderList" :key="item.id" @click="goToDetail(item)">
<view class="order-header">
<text class="order-no">订单号{{ item.orderNo || '--' }}</text>
<text :class="['pay-status', item.payStatus === 2 ? 'status-success' : item.payStatus === 3 ? 'status-error' : 'status-warning']">
{{ getPayStatusText(item.payStatus) }}
</text>
</view>
<view class="order-body">
<view class="info-row">
<text class="info-label">支付金额</text>
<text class="info-value amount">¥{{ item.payAmount || '0.00' }}</text>
</view>
<view class="info-row">
<text class="info-label">支付时间</text>
<text class="info-value">{{ item.payTime || '--' }}</text>
</view>
</view>
</view>
</block>
<!-- 暂无数据状态 -->
<view class="empty-card" v-else>
2026-02-02 16:04:16 +08:00
<view class="empty-icon-wrapper">
<view class="empty-icon">📄</view>
2026-02-02 16:04:16 +08:00
</view>
<text class="empty-text">暂无数据</text>
</view>
</scroll-view>
2026-02-02 16:04:16 +08:00
</view>
</template>
<script>
import { getOrderList } from '@/api/back';
2026-02-02 16:04:16 +08:00
export default {
data() {
return {
// 筛选类型orderNo(订单号), barcode(条码), payStatus(支付状态)
filterType: 'orderNo',
currentPayStatusLabel: '',
payStatusOptions: [
{ label: '未支付', value: 0 },
{ label: '支付中', value: 1 },
{ label: '已支付', value: 2 },
{ label: '支付失败', value: 3 },
{ label: '已退款', value: 4 }
],
queryParams: {
storeId: '2', // 门店id必传
orderNo: '',
productBarCode: '',
payStatus: ''
},
orderList: []
};
},
onLoad() {
this.fetchOrderList();
},
2026-02-02 16:04:16 +08:00
methods: {
goBack() {
uni.navigateBack();
},
// 点击split-icon弹出单选下拉框
showFilterTypeSelector() {
const types = ['orderNo', 'barcode', 'payStatus'];
const labels = ['订单号', '条码', '支付状态'];
const itemList = labels.map((label, i) => (types[i] === this.filterType ? '✓ ' : '') + label);
uni.showActionSheet({
itemList,
success: (res) => {
this.filterType = types[res.tapIndex];
// 重置其他参数
this.queryParams.orderNo = '';
this.queryParams.productBarCode = '';
this.queryParams.payStatus = '';
this.currentPayStatusLabel = '';
}
});
},
onPayStatusChange(e) {
const index = e.detail.value;
const selectedOption = this.payStatusOptions[index];
this.currentPayStatusLabel = selectedOption.label;
this.queryParams.payStatus = selectedOption.value;
},
handleSearch() {
this.fetchOrderList();
},
handleReset() {
this.filterType = 'orderNo';
this.currentPayStatusLabel = '';
this.queryParams.orderNo = '';
this.queryParams.productBarCode = '';
this.queryParams.payStatus = '';
this.fetchOrderList();
},
getPayStatusText(status) {
const map = { 0: '未支付', 1: '支付中', 2: '已支付', 3: '支付失败', 4: '已退款' };
return map[status] ?? '未知状态';
},
// 按照项目要求调取接口
fetchOrderList() {
uni.showLoading({ title: '加载中...' });
const data = { storeId: this.queryParams.storeId };
if (this.queryParams.orderNo) data.orderNo = this.queryParams.orderNo;
if (this.queryParams.productBarCode) data.productBarCode = this.queryParams.productBarCode;
if (this.queryParams.payStatus !== '') data.payStatus = this.queryParams.payStatus;
getOrderList(data).then(res => {
if (res.code === 200) {
this.orderList = res.data || [];
} else {
uni.showToast({ title: res.msg || '获取失败', icon: 'none' });
}
}).catch(err => {
uni.showToast({ title: '网络请求失败', icon: 'none' });
}).finally(() => {
uni.hideLoading();
});
},
loadMore() {
},
goToDetail(orderObj) {
const itemsStr = encodeURIComponent(JSON.stringify(orderObj.orderItems || []));
uni.navigateTo({
url: `/package_a/back/backDetail?items=${itemsStr}`
});
2026-02-02 16:04:16 +08:00
}
}
};
</script>
<style scoped>
.page-container { width: 100%; min-height: 100vh; background: #f5f5f5; display: flex; flex-direction: column; }
.navbar { height: 48px; background: #e62318; color: white; display: flex; align-items: center; padding: 0 16px; position: relative; }
.nav-tabs { flex: 1; display: flex; justify-content: center; }
.tab-item { font-size: 17px; padding: 0 8px; position: relative; font-weight: bold; }
.tab-item.active::after { content: ''; position: absolute; bottom: -8px; left: 0; right: 0; height: 3px; background: white; border-radius: 2px; }
.search-section { background: white; padding: 12px 16px; display: flex; align-items: center; gap: 12px; }
.search-box { flex: 1; height: 36px; background: #f5f5f5; border-radius: 6px; border: 1px solid #e5e5e5; display: flex; align-items: center; padding: 0 12px; }
.search-icon { font-size: 16px; color: #999; margin-right: 8px; }
.search-input { flex: 1; font-size: 15px; color: #333; background: transparent; border: none; height: 100%; }
.picker-input { display: flex; align-items: center; }
.picker-text { line-height: 36px; color: #666; }
.split-icon { font-size: 18px; color: #666; margin-left: 8px; padding: 4px; display: flex; align-items: center; }
.reset-icon { font-size: 20px; color: #999; margin-left: 4px; padding: 4px; display: flex; align-items: center; line-height: 1; }
.filter-btn { height: 36px; background: #e62318; border-radius: 6px; padding: 0 16px; display: flex; align-items: center; gap: 4px; font-size: 15px; color: #fff; }
.reset-btn { height: 36px; background: #fff; border-radius: 6px; padding: 0 16px; display: flex; align-items: center; font-size: 15px; color: #666; border: 1px solid #ddd; }
.filter-icon { font-size: 14px; }
.content { flex: 1; padding: 12px; box-sizing: border-box; }
.order-item { background: #fff; border-radius: 8px; padding: 16px; margin-bottom: 12px; box-shadow: 0 2px 6px rgba(0,0,0,0.04); }
.order-header { display: flex; justify-content: space-between; border-bottom: 1px solid #f0f0f0; padding-bottom: 12px; margin-bottom: 12px; }
.order-no { font-size: 14px; color: #333; font-weight: bold; }
.pay-status { font-size: 13px; }
.status-warning { color: #f29c1f; }
.status-success { color: #52c41a; }
.status-error { color: #e62318; }
.order-body { display: flex; flex-direction: column; gap: 8px; }
.info-row { display: flex; justify-content: space-between; align-items: center; }
.info-label { font-size: 13px; color: #666; }
.info-value { font-size: 13px; color: #333; }
.amount { color: #e62318; font-weight: bold; font-size: 16px; }
.empty-card { background: transparent; padding: 100px 0; display: flex; flex-direction: column; align-items: center; }
.empty-icon-wrapper { width: 80px; height: 80px; background: #e8e8e8; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin-bottom: 16px; }
.empty-icon { font-size: 32px; color: #999; }
.empty-text { font-size: 16px; color: #999; }
2026-02-02 16:04:16 +08:00
</style>