166 lines
6.9 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="picker-page">
<!-- 订单普通/团购 两个 tab -->
<view v-if="mode === 'order'" class="tabs">
<view class="tab" :class="{ active: orderTab === 'normal' }" @tap="switchTab('normal')">普通订单</view>
<view class="tab" :class="{ active: orderTab === 'group' }" @tap="switchTab('group')">团购订单</view>
</view>
<scroll-view class="list" scroll-y>
<!-- 订单列表 -->
<block v-if="mode === 'order'">
<view v-for="(item, idx) in orderList" :key="idx" class="order-card" @tap="pickOrder(item)">
<view class="order-head">
<text class="order-no">订单号{{ item.order_no }}</text>
</view>
<view class="order-goods">
<image v-for="(g, gi) in (item.commodity_order_item_list || []).slice(0, 4)" :key="gi"
:src="g.commodity_pic" class="goods-thumb" mode="aspectFill" />
</view>
<view class="order-foot">
<text>{{ item.total_count }}</text>
<text class="amount">¥{{ item.total_amount }}</text>
<view class="send-btn">发送</view>
</view>
</view>
<view v-if="orderList.length === 0" class="empty">暂无订单</view>
</block>
<!-- 购物车列表 -->
<block v-else>
<view v-for="(g, idx) in cartGoods" :key="idx" class="goods-row" @tap="pickGoods(g)">
<image :src="g.pic" class="goods-thumb-lg" mode="aspectFill" />
<view class="goods-info">
<view class="goods-name">{{ g.name }}</view>
<view class="goods-price">¥{{ g.price }}</view>
</view>
<view class="send-btn">发送</view>
</view>
<view v-if="cartGoods.length === 0" class="empty">购物车为空</view>
</block>
</scroll-view>
</view>
</template>
<script>
import { request, picUrl } from '@/utils'
import { apiArr as shopApi } from '@/api/shop'
import { apiArr as afterSaleApi } from '@/api/afterSale'
export default {
data() {
return {
mode: 'order', // order | goods
bindId: 0,
orderTab: 'normal', // normal | group
orderList: [],
cartGoods: []
}
},
onLoad(options) {
this.mode = options.type === 'goods' ? 'goods' : 'order'
this.bindId = Number(options.bindId) || 0
uni.setNavigationBarTitle({ title: this.mode === 'goods' ? '选择购物车商品' : '选择订单' })
if (this.mode === 'goods') {
this.loadCart()
} else {
this.loadOrders()
}
},
methods: {
switchTab(t) {
this.orderTab = t
this.loadOrders()
},
// 订单列表order_cate 1普通 2团购按 tab 过滤)
loadOrders() {
request(afterSaleApi.orderList, 'POST', {
user_id: uni.getStorageSync('userId')
}).then(res => {
const list = res.order_list || []
list.forEach(item => {
(item.commodity_order_item_list || []).forEach(g => {
g.commodity_pic = (g.commodity_pic && g.commodity_pic.startsWith('http')) ? g.commodity_pic : picUrl + g.commodity_pic
})
})
if (this.orderTab === 'group') {
this.orderList = list.filter(i => i.order_cate == 2)
} else {
this.orderList = list.filter(i => i.order_cate == 1 || i.order_cate == 4)
}
})
},
// 购物车(非团购)
loadCart() {
request(shopApi.getCar, 'POST', { is_group_buy: '' }).then(res => {
const groups = [].concat(res.same_day_cart_list || [], res.normal_cart_list || [])
const goods = []
groups.forEach(sup => {
(sup.commodity_cart_and_goods_model || []).forEach(c => {
const gi = c.commodity_goods_info || {}
goods.push({
goods_id: c.goods_id,
commodity_id: c.commodity_id,
name: gi.commodity_name || gi.goods_name || '商品',
pic: (gi.commodity_pic && gi.commodity_pic.startsWith('http')) ? gi.commodity_pic : picUrl + (gi.commodity_pic || ''),
price: gi.sales_price || c.price || 0
})
})
})
this.cartGoods = goods
})
},
// 选中订单 -> 回传订单卡片type=5
pickOrder(item) {
const firstPic = (item.commodity_order_item_list && item.commodity_order_item_list[0] && item.commodity_order_item_list[0].commodity_pic) || ''
const card = {
order_id: item.id,
order_no: item.order_no,
amount: item.total_amount,
count: item.total_count,
pic: firstPic,
page: '/packages/myOrders/orderDetails/index', // 点击跳转目标页(完整 item 经 storage 中转,避免 URL 超长)
item // 完整订单对象,详情页直接用
}
uni.$emit('chat:pickCard', { type: 5, card })
uni.navigateBack()
},
// 选中购物车商品 -> 回传商品卡片type=4
pickGoods(g) {
const card = {
goods_id: g.goods_id,
commodity_id: g.commodity_id,
name: g.name,
price: g.price,
pic: g.pic,
page: '/packages/advertising/goodsDetail/index',
item: { commodity_id: g.commodity_id, id: g.goods_id, promotional_price: g.price } // goodsDetail 需 commodity_id 查详情、id 定位规格、promotional_price 作展示价
}
uni.$emit('chat:pickCard', { type: 4, card })
uni.navigateBack()
}
}
}
</script>
<style scoped>
.picker-page { display: flex; flex-direction: column; height: 100vh; background: #f5f5f5; }
.tabs { display: flex; background: #fff; }
.tab { flex: 1; text-align: center; padding: 28rpx 0; font-size: 28rpx; color: #666; }
.tab.active { color: #FF370B; font-weight: 600; border-bottom: 4rpx solid #FF370B; }
.list { flex: 1; padding: 20rpx; box-sizing: border-box; }
.order-card { background: #fff; border-radius: 12rpx; padding: 20rpx; margin-bottom: 20rpx; }
.order-head { font-size: 24rpx; color: #999; margin-bottom: 14rpx; }
.order-goods { display: flex; gap: 12rpx; }
.goods-thumb { width: 120rpx; height: 120rpx; border-radius: 8rpx; background: #f0f0f0; }
.order-foot { display: flex; align-items: center; justify-content: flex-end; gap: 20rpx; margin-top: 16rpx; }
.order-foot .amount { color: #FF370B; font-weight: 600; }
.goods-row { display: flex; align-items: center; background: #fff; border-radius: 12rpx; padding: 16rpx; margin-bottom: 16rpx; }
.goods-thumb-lg { width: 140rpx; height: 140rpx; border-radius: 8rpx; background: #f0f0f0; flex-shrink: 0; }
.goods-info { flex: 1; margin-left: 20rpx; min-width: 0; }
.goods-name { font-size: 28rpx; color: #222; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.goods-price { font-size: 30rpx; color: #FF370B; font-weight: 600; margin-top: 12rpx; }
.send-btn { background: linear-gradient(91deg, #FF7658, #FF370B); color: #fff; font-size: 24rpx; padding: 10rpx 28rpx; border-radius: 30rpx; flex-shrink: 0; }
.empty { text-align: center; color: #999; font-size: 26rpx; padding: 80rpx 0; }
</style>