Files
jdt-user/src/pages/hotGoods/hot_list/index.vue
YuanHuakk 1d8532eccf
All checks were successful
continuous-integration/drone/push Build is passing
feat(custom): 新增消息订阅
2024-08-27 17:06:59 +08:00

369 lines
7.4 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.

<script lang="ts" setup>
import {ref} from 'vue';
import {
useLoad,
useReachBottom,
showToast,
navigateTo,
setStorageSync,
} from '@tarojs/taro';
import Pay from '@/components/Pay.vue';
import {getActiveOrderList, deleteActiveOrder} from '@/api/goods';
import {getOrderStatistics} from '@/api/order';
const tabValue = ref(0);
const isShowPay = ref(false);
const tabsList = ref([
{
title: '全部',
value: 0,
num: 0,
},
{
title: '待付款',
value: 1,
num: 0,
},
{
title: '待使用',
value: 2,
num: 0,
},
{
title: '已使用',
value: 3,
num: 0,
},
{
title: '已失效',
value: 4,
num: 0,
},
]);
const jfInfo = ref({});
interface OrderList {
oid: string;
add_time: string;
status: number;
BindGoods: {
cover: string;
name: string;
number: number;
};
count: number;
number: number;
}
const orderList = ref<OrderList[]>([]);
useLoad(options => {
console.log(options);
// tabValue.value = Number(options.type);
getList();
});
const countInfo = ref<any>({});
const getTj = async () => {
try {
const res = await getOrderStatistics({
type: 1,
});
countInfo.value = res.data.data;
console.log(res);
tabsList.value[0].num = countInfo.value.A;
tabsList.value[1].num = countInfo.value.B;
tabsList.value[2].num = countInfo.value.C;
tabsList.value[3].num = countInfo.value.D;
tabsList.value[4].num = countInfo.value.F;
} catch (error) {
showToast({
title: error.msg,
icon: 'none',
});
}
};
const getList = async () => {
try {
const res = await getActiveOrderList({
status: tabValue.value,
});
console.log(res);
orderList.value = res.data.data;
} catch (error) {
showToast({
title: error.msg,
icon: 'none',
});
}
getTj();
};
const tabChange = (index: number) => {
tabValue.value = index;
getList();
};
useReachBottom(() => {
console.log('useReachBottom');
});
const openPay = (item: OrderList) => {
isShowPay.value = true;
jfInfo.value = item;
};
const errPay = () => {
isShowPay.value = false;
showToast({
title: '支付失败',
icon: 'none',
});
jfInfo.value = {};
getList();
};
// const successPay = (val: boolean) => {
// isShowPay.value = val;
// showToast({
// title: "支付成功",
// icon: "none",
// });
// jfInfo.value = {};
// getList();
// };
const closePay = () => {
isShowPay.value = false;
showToast({
title: '支付取消',
icon: 'none',
});
jfInfo.value = {};
getList();
};
const toDetail = (item: any) => {
setStorageSync('item', item);
navigateTo({
url: `/pages/users/order_list_detail/index?Id=${item.oid}&type=1`,
});
};
const delOrder = async (oid: string) => {
try {
const res = await deleteActiveOrder({
oid,
});
console.log(res);
getList();
} catch (error) {
showToast({
title: error.msg,
icon: 'none',
});
}
};
</script>
<template>
<view>
<view class="topTips">
<view>
<view style="font-weight: bold">订单信息</view>
<view style="font-size: 15px"
>总消费(){{ countInfo.Total || 0 }}
</view>
</view>
<image src="../static/user/order_list_top.png" />
</view>
<view class="tabs-box">
<view
v-for="item in tabsList"
:key="item.value"
@click="tabChange(item.value)">
<view class="text">{{ item.title }}</view>
<view>{{ item.num }}</view>
<view class="line" :class="{lineColor: item.value === tabValue}"></view>
</view>
</view>
<view v-if="orderList.length > 0">
<view class="order-card" v-for="(item, index) in orderList" :key="index">
<view class="top">
<view>{{ item.add_time.slice(0, 19).replace('T', ' ') }}</view>
<view style="color: red"
>{{
item.status === 0
? '待付款'
: item.status === 1
? '待使用'
: item.status === 2
? '已使用'
: '已失效'
}}
</view>
</view>
<view class="line"></view>
<view class="center">
<view class="top">
<image :src="item.BindGoods.cover" />
<view class="title">{{ item.BindGoods.name }}</view>
<view class="right">
<view>{{ item.number }}</view>
<!-- <view>x{{ item.count }}</view> -->
</view>
</view>
<!-- <view
class="bom"
style="text-align: right; font-size: 13px"
>
{{ item.count }}件商品,实付():
<text style="color: red">{{ item.number }}</text>
</view> -->
</view>
<view class="line"></view>
<view class="btn">
<nut-button
v-if="item.status === 0"
plain
size="small"
type="primary"
@click="delOrder(item.oid)"
>删除订单
</nut-button>
<nut-button
style="margin-left: 5px"
size="small"
type="primary"
@click="toDetail(item)"
>查看详情
</nut-button>
<nut-button
style="margin-left: 5px"
size="small"
type="primary"
v-if="item.status === 0"
@click="openPay(item)"
>立即付款
</nut-button>
</view>
</view>
</view>
<nut-empty v-else description="暂无订单"></nut-empty>
<pay
:isShowPay="isShowPay"
payType="wx"
@errPay="errPay"
@closePay="closePay"
:jfInfo="jfInfo" />
</view>
</template>
<style lang="scss">
.topTips {
box-sizing: border-box;
width: 100%;
background-color: #ff0000;
color: #ffffff;
padding: 20px;
display: flex;
justify-content: space-between;
align-items: center;
image {
width: 150px;
height: 150px;
}
}
.tabs-box {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
height: auto;
background-color: #fff;
padding: 0 20px;
text-align: center;
.text {
margin: 10px 20px;
align-items: center;
}
.line {
margin: 0 auto;
width: 50px;
height: 5px;
border-radius: 30px;
transition: all 0.3s ease-in-out;
}
.lineColor {
background-color: #ff0000;
}
}
.order-card {
width: 95%;
box-sizing: border-box;
margin: 15px auto;
background-color: #fff;
border-radius: 10px;
padding: 20px;
.line {
width: 100%;
height: 1px;
background-color: #f5f5f5;
margin: 10px;
}
.top {
display: flex;
justify-content: space-between;
align-items: center;
}
.btn {
display: flex;
justify-content: flex-end;
align-items: center;
}
.center {
.top {
display: flex;
justify-content: space-between;
// align-items: flex-start;
image {
width: 150px;
height: 150px;
}
.title {
margin-left: 10px;
display: -webkit-box;
overflow: hidden;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
text-overflow: ellipsis;
width: 350px;
}
.right {
margin-left: 10px;
font-size: 28px;
text-align: right;
}
}
}
}
</style>