2025-08-07 17:02:44 +08:00

480 lines
13 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.

// +---------------------------------------------------------------------- // |
likeshop开源商城系统 //
+---------------------------------------------------------------------- // |
欢迎阅读学习系统程序代码建议反馈是我们前进的动力 // |
gitee下载https://gitee.com/likeshop_gitee // |
github下载https://github.com/likeshop-github // |
访问官网https://www.likeshop.cn // | 访问社区https://home.likeshop.cn // |
访问手册http://doc.likeshop.cn // | 微信公众号likeshop技术社区 // |
likeshop系列产品在giteegithub等公开渠道开源版本可免费商用未经许可不能去除前后端官方版权标识
// |
likeshop系列产品收费版本务必购买商业授权购买去版权授权后方可去除前后端官方版权标识
// | 禁止对系统程序代码以任何目的,任何形式的再发布 // |
likeshop团队版权所有并拥有最终解释权 //
+---------------------------------------------------------------------- // |
author: likeshop.cn.team //
+----------------------------------------------------------------------
<template>
<view>
<view class="order-list">
<navigator
v-for="(item, index) in orderList"
:key="index"
hover-class="none"
class="order-item bg-white mt20"
:url="'/pages/order_details/order_details?id=' + item.id"
>
<view class="order-header row-between">
<view class="row">
<view v-if="item.delivery_type == 2" class="mr10">
<u-tag
text="自提"
size="mini"
type="primary"
mode="dark"
bg-color="#0cc21e"
/>
</view>
<view v-if="item.order_type == 1" class="mr10">
<u-tag text="秒杀" size="mini" type="primary" mode="plain" />
</view>
<view v-if="item.order_type == 2" class="mr10">
<u-tag text="拼团" size="mini" type="primary" mode="plain" />
</view>
<view v-if="item.order_type == 3" class="mr10">
<u-tag text="砍价" size="mini" type="primary" mode="plain" />
</view>
订单编号{{ item.order_sn }}
</view>
<view :class="item.order_status == 4 ? 'muted' : 'primary'">{{
item.order_status_desc
}}</view>
</view>
<view class="order-con">
<order-goods
:list="item.order_goods"
:order_type="item.order_type"
></order-goods>
<view class="all-price row-end">
<text class="muted xs"
>{{ goodCount(item.order_goods) }}件商品总金额</text
>
<price-format
:subscript-size="30"
:first-size="30"
:second-size="30"
:price="item.order_amount"
></price-format>
</view>
</view>
<view
class="order-footer row"
v-if="
item.pickup_btn ||
item.cancel_btn ||
item.delivery_btn ||
item.take_btn ||
item.del_btn ||
item.pay_btn ||
item.comment_btn
"
>
<view style="flex: 1">
<view
class="primary sm row"
style="line-height: 26rpx"
v-if="getCancelTime(item.order_cancel_time) > 0"
><u-count-down
separator="zh"
:timestamp="getCancelTime(item.order_cancel_time)"
separator-color="#FF2C3C"
color="#FF2C3C"
:separator-size="26"
:font-size="26"
bg-color="transparent"
@end="reflesh"
></u-count-down
></view>
</view>
<view v-if="item.cancel_btn">
<button
size="sm"
class="plain br60 lighter"
hover-class="none"
@tap.stop="cancelOrder(item.id)"
>
取消订单
</button>
</view>
<view
v-if="item.delivery_btn"
@tap.stop="
goPage(
'/bundle/pages/goods_logistics/goods_logistics?id=' + item.id
)
"
>
<button size="sm" class="btn plain br60 lighter" hover-class="none">
查看物流
</button>
</view>
<view v-if="item.del_btn">
<button
size="sm"
class="btn plain br60 lighter"
hover-class="none"
@tap.stop="delOrder(item.id)"
>
删除订单
</button>
</view>
<view v-if="item.pay_btn" class="ml20">
<button
size="sm"
class="btn bg-primary br60 white"
@tap.stop="payNow(item.id)"
>
立即付款
</button>
</view>
<view v-if="item.comment_btn" class="ml20">
<button
size="sm"
hover-class="none"
class="btn plain btn br60 primary red"
>
去评价
</button>
</view>
<view v-if="item.pickup_btn" class="ml20">
<button
size="sm"
hover-class="none"
class="btn plain btn br60 primary red"
>
查看提货码
</button>
</view>
<view v-if="item.take_btn" class="ml20">
<button
size="sm"
class="btn plain br60 primary red"
hover-class="none"
@tap.stop="comfirmOrder(item.id, item.pay_way)"
>
确认收货
</button>
</view>
</view>
</navigator>
<loading-footer :status="status" :slot-empty="true" @refresh="reload">
<view slot="empty" class="column-center" style="padding-top: 200rpx">
<image class="img-null" src="/static/images/goods_null.png"></image>
<text class="lighter">暂无订单</text>
</view>
</loading-footer>
</view>
<order-dialog
ref="orderDialog"
:order-id="orderId"
:type="type"
@refresh="reflesh"
></order-dialog>
<loading-view
v-if="showLoading"
background-color="transparent"
:size="50"
></loading-view>
</view>
</template>
<script>
import {
getOrderList,
cancelOrder,
delOrder,
confirmOrder,
getwxReceiveDetail,
getwechatSyncCheck,
} from "@/api/order";
import { compareWeChatVersion } from "@/utils/tools";
import { prepay } from "@/api/app";
import { loadingType } from "@/utils/type";
import { wxpay, alipay } from "@/utils/pay";
import { loadingFun } from "@/utils/tools";
export default {
data() {
return {
page: 1,
orderList: [],
status: loadingType.LOADING,
showCancel: false,
type: 0,
orderId: "",
showLoading: false,
pay_way: "",
};
},
components: {},
props: {
orderType: {
type: String,
},
},
created: function () {
uni.$on("refreshorder", () => {
this.reflesh();
});
uni.$on("payment", (params) => {
if (params.result) {
this.reflesh();
uni.navigateBack();
setTimeout(() => this.$toast({ title: "支付成功" }), 0.5 * 1000);
}
});
},
beforeMount: function () {
this.getOrderListFun();
},
destroyed: function () {
uni.$off(["payment", "refreshorder"]);
},
methods: {
reflesh() {
this.page = 1;
this.orderList = [];
this.status = loadingType.LOADING;
this.type = 0;
this.getOrderListFun();
},
reload() {
this.status = loadingType.LOADING;
this.getOrderListFun();
},
orderDialog() {
this.$refs.orderDialog.open();
},
delOrder(id) {
this.orderId = id;
this.type = 1;
this.$nextTick(() => {
this.orderDialog();
});
},
// 小程序确认收货
comfirmReceive(transaction_id) {
return new Promise((resolve, reject) => {
wx.openBusinessView({
businessType: "weappOrderConfirm",
extraData: {
transaction_id,
},
success({ extraData }) {
if (extraData.status == "success") {
resolve("确认收货");
} else {
resolve("取消收货");
}
},
fail(err) {
reject(err);
},
});
});
},
//查询是否收货成功
querycomfirmReceive(id) {
return new Promise((resolve, reject) => {
getwechatSyncCheck({ id })
.then(({ data }) => {
if (data.order.order_state === 4) {
resolve("已确认收货");
} else {
reject("未确认收货");
}
})
.catch((err) => {
reject(err);
});
});
},
comfirmOrder(id, pay_way) {
this.orderId = id;
this.pay_way = pay_way;
this.type = 2;
this.$nextTick(async () => {
// #ifdef MP-WEIXIN
let res = {};
if (this.pay_way === 1) {
res = await getwechatSyncCheck({ id: this.orderId });
console.log(res);
}
if (
compareWeChatVersion("2.6.0") === 1 &&
wx.openBusinessView &&
this.pay_way === 1 &&
res.data.order.order_state !== 1
) {
try {
const { data } = await getwxReceiveDetail({
order_id: this.orderId,
});
await this.comfirmReceive(data.transaction_id);
await this.querycomfirmReceive(this.orderId);
await confirmOrder(this.orderId);
} catch (error) {
console.log(error);
}
this.reflesh();
} else {
this.orderDialog();
}
// #endif
// #ifndef MP-WEIXIN
this.orderDialog();
// #endif
});
},
cancelOrder(id) {
this.orderId = id;
this.type = 0;
this.$nextTick(() => {
this.orderDialog();
});
},
payNow(id) {
// this.showLoading = true
uni.navigateTo({
url: `/pages/payment/payment?from=${"order"}&order_id=${id}`,
});
// prepay({
// from: 'order',
// order_id: id
// }).then(res => {
// let args = res.data;
// this.showLoading = false
// if (res.code == 1) {
// wxpay(args).then((resPay) => {
// if(resPay == 'success') {
// this.$toast({
// title: "支付成功"
// })
// uni.$emit("refreshorder")
// }
// })
// }else if(res.code == 20001){
// alipay(args).then((resPay) => {
// if(resPay == 'success') {
// this.$toast({
// title: "支付成功"
// })
// uni.$emit("refreshorder")
// }
// })
// }
// });
},
async getOrderListFun() {
let { page, orderType, orderList, status } = this;
const data = await loadingFun(getOrderList, page, orderList, status, {
type: orderType,
});
if (!data) return;
this.page = data.page;
this.orderList = data.dataList;
this.status = data.status;
},
goPage(url) {
uni.navigateTo({
url,
});
},
goodCount(goodLists) {
console.log(goodLists);
let count = 0;
goodLists.forEach((item) => {
count += item.goods_num;
});
return count;
},
},
computed: {
getOrderStatus() {
return (status) => {
let text = "";
switch (status) {
case 0:
text = "待支付";
break;
case 1:
text = "待发货";
break;
case 2:
text = "待收货";
break;
case 3:
text = "已完成";
break;
case 4:
text = "订单已关闭";
break;
}
return text;
};
},
getCancelTime() {
return (time) => time - Date.now() / 1000;
},
},
};
</script>
<style lang="scss">
.order-list {
// min-height: calc(100vh - 80rpx);
padding: 0 20rpx;
overflow: hidden;
.order-item {
border-radius: 10rpx;
.order-header {
height: 80rpx;
padding: 0 24rpx;
border-bottom: 1px dotted #e5e5e5;
}
.all-price {
text-align: right;
padding: 0 24rpx 20rpx;
}
.order-footer {
height: 100rpx;
border-top: $solid-border;
padding: 0 24rpx;
.plain {
border: 1px solid #bbbbbb;
&.red {
border-color: $color-primary;
}
}
}
}
}
</style>