jiangchengfeiyi-xiaochengxu/pages/order/product-paysuccess/product-paysuccess.vue

606 lines
15 KiB
Vue
Raw Normal View History

<template>
<view class="flex-col page">
<view class="flex-row items-center section_2">
<image
class="image"
:src="stateObject.img"
/>
<view class="flex-col items-start flex-1 ml-6">
<text class="font text">{{ stateObject.msg }}</text>
2025-01-09 02:50:05 +00:00
<text class="text_2 mt-4">{{ stateObject.tips }}</text>
</view>
</view>
<view class="flex-row justify-between items-center section_3">
<view class="flex-col group">
<text class="self-start font text_3">{{ addressInfo.name }} {{ addressInfo.phone }}</text>
<view class="flex-row items-center self-stretch">
<image
class="image_2"
src="https://carbon2.obs.cn-north-4.myhuaweicloud.com:443/feiyi%2Ftest%2F0%2FXZHjzkRH-dingwei.png"
/>
<text class="font_2 text_4 ml-9">{{ addressInfo.region }}</text>
</view>
<text class="self-end font_2 text_6">{{ addressInfo.detailAddress }}</text>
</view>
</view>
<view class="flex-col section_4">
<view class="flex-col">
<view class="flex-row justify-between goodsBox" v-for="(item, index) in productList" :key="index">
<view class="flex-row">
<image
class="image_4"
:src="item.goodSnapshot.goodImg.split(';')[0]"
/>
<view class="flex-col group_2 ml-17">
<view class="flex-row">
<text class="font">{{ item.goodSnapshot.name }}</text>
<text class="font text_11">{{ item.goodSnapshot.type }}</text>
</view>
<view class="flex-row items-center mt-53">
<image
class="image_5"
src="https://ide.code.fun/api/image?token=6764d712797f850011f38d7b&name=2a1f46d015a316fa98edfbdad0f9921f.png"
/>
<text class="font_3">{{ item.goodSnapshot.price }}</text>
<!-- <text class="font_4">00</text> -->
</view>
</view>
</view>
<text class="self-start font_5 text_8 text_1">×{{ item.quantity }}</text>
</view>
</view>
<view class="flex-col group_7 mt-6">
<text class="self-start font_6 text_18">买家留言</text>
<view class="flex-col justify-start self-stretch relative group_8 mt-5">
<view class="group_9"></view>
<text class="font_6 text_19 pos_4">
{{ orderObject.note }}
</text>
</view>
</view>
<view class="flex-row justify-between items-center mt-6">
<text class="font_6 text_20">订单编号</text>
<view class="flex-row items-center group_11">
<view class="flex-col justify-start items-center text-wrapper view" @click="copy(orderObject.orderNumber)">
<text class="font_7 text_22">复制</text>
</view>
<text class="font_4 text_21">{{ orderObject.orderNumber }}</text>
</view>
</view>
<view class="flex-row justify-between items-center mt-6">
<text class="font_6 text_23">创建时间</text>
<text class="font_4 text_24">{{ orderObject.createTime }}</text>
</view>
<view class="flex-row justify-between items-baseline group_1 mt-6"
v-if="stateObject.state === '已退款'">
<text class="font_6 text_25">退款时间</text>
<text class="font_4 text_26">{{ orderObject.updateTime }}</text>
</view>
<view class="flex-row justify-between group_16 mt-6"
v-if="stateObject.state === '待收货'">
<text class="font_6 text_27">物流单号</text>
<view class="flex-row items-center group_14">
<text class="font_4">{{ orderObject.trackingNumber }}</text>
<!-- <view class="flex-col justify-start items-center shrink-0 text-wrapper ml-5">
<text class="font_7 text_22">复制</text>
</view> -->
</view>
</view>
<view class="flex-row justify-between items-baseline mt-6"
v-if="stateObject.state === '交易成功'" >
<text class="font_6 text_28">成交时间</text>
<text class="font_4 text_29">{{ orderObject.updateTime }}</text>
</view>
</view>
<view class="flex-row justify-between items-center section_5"
v-if="stateObject.state != '交易成功'">
<view class="flex-row items-center">
<text class="font_8 text_30">合计</text>
<image
class="shrink-0 image_8"
src="https://ide.code.fun/api/image?token=6764d712797f850011f38d7b&name=549b29459342a9a09d24834be40eb53b.png"
/>
<text class="text_31">{{ orderObject.totalAmount }}</text>
<!-- <text class="text_33">00</text> -->
</view>
<view class="flex-col justify-start items-center text-wrapper_2" @click="stateSubmit(orderObject)" v-if="bottomBtn != '联系客服'">
<text class="font_8 text_32" >{{ bottomBtn }}</text>
</view>
<view class="flex-col justify-start items-center text-wrapper_2" @click="confirm()" v-if="bottomBtn === '查看物流'">
<text class="font_8 text_32" >确认收货</text>
</view>
<button class="text-wrapper_3" v-if="bottomBtn === '联系客服'" open-type="contact" bindcontact="handleContact" session-from="sessionFrom">
<text class="font_8 text_32">联系客服</text>
</button>
</view>
</view>
<!-- 遮罩层 -->
<view v-if="isShow" class="overlay"></view>
</template>
<script setup>
import { ref } from 'vue';
import { onLoad , onShow } from "@dcloudio/uni-app";
import { stateMap } from '../../../common/global';
import { baseUrl } from '../../../api/request';
const orderObject = ref({}) //后端传来的订单对象
const addressInfo = ref({}) //地址信息
const productList = ref([]) //订单涵盖的商品
const stateObject = ref({}) //当前订单状态
const bottomBtn = ref('去支付') //底下按钮
const oid = ref(0)
onLoad((options)=>{
oid.value = JSON.parse(options.oid) //获取从上一个页面传来的值
console.log('当前订单ID为',oid.value);
})
onShow( async ()=>{
await getOrderItem()
await setBottomText()
})
const getOrderItem = async ()=>{ //获取当前订单详情
const res = await uni.request({
url: baseUrl + '/order/get/id',
method: 'POST',
header: {
'cookie': wx.getStorageSync("cookie")
},
data: { id: oid.value }
})
if(res.data.code === 1) {
orderObject.value = res.data.data,
addressInfo.value = res.data.data.addressSnapshot,
productList.value = res.data.data.orderItemList
stateObject.value = stateMap.get(res.data.data.orderStatus)
}
console.log('地址信息--->',addressInfo.value);
console.log('商品信息为--->',productList.value);
console.log('此订单信息为',res.data);
console.log('订单状态---->',stateObject.value);
}
const setBottomText =()=>{ //更改按钮的字体
switch(stateObject.value.state) {
case '待支付': bottomBtn.value = '立即支付';break;
case '待发货': bottomBtn.value = '联系客服';break;
2025-01-02 02:07:36 +00:00
case '待收货': bottomBtn.value = '查看物流';break;
case '已退款': bottomBtn.value = '删除订单';break;
case '交易成功': bottomBtn.value = '删除订单';break;
default: bottomBtn.value = '删除订单'
}
}
const stateSubmit = (obj) => { //按钮状态改变的方法
// console.log('商品obj--->',obj);
if(bottomBtn.value === '立即支付') { //重新支付
wxPayFd(oid.value)
} else if(bottomBtn.value === '删除订单') {
console.log('订单被删除');
} else if(bottomBtn.value === '查看物流') {
viewLogistics(obj.id)
}
}
const confirm =()=> { //确认收货方法
console.log('确认收货方法');
}
const wxPay = async( oid )=> { //传入订单id
try {
const res = await uni.request({
url: baseUrl + '/wechat/payment/create',
method: 'POST',
header: {
'cookie': wx.getStorageSync("cookie")
},
data: { id: oid }
})
const paymentData = res.data.data
wx.requestPayment({
appid: paymentData.appId,
nonceStr: paymentData.nonceStr,
package: paymentData.packageVal,
paySign: paymentData.paySign,
timeStamp: paymentData.timeStamp,
signType: paymentData.signType,
success(res) {
uni.showModal({
content: '支付成功',
showCancel: false
})
buffer()
},
fail(e) {
// uni.showModal({
// content: '支付失败,原因为:' + e.errMsg,
// showCancel: false
// })
}
})
}catch(error) {
console.error('支付请求失败',error);
uni.showModal({
content: '支付请求失败,请重试。',
showCancel: false
})
}
}
const buffer = async ()=>{ //缓冲函数
await getOrderItem();
await setBottomText();
}
//查看物流方法
const viewLogistics = ( oid )=>{
// console.log('订单编号--->',oid);
uni.request({
url: baseUrl + '/logistics/get/info',
method: 'POST',
data: {
id: oid
},
header: {
'cookie': wx.getStorageSync("cookie")
},
success: (res) => {
console.log(res.data.data)
waybillToken = res.data.data.waybill_token
plugin.openWaybillTracking({
waybillToken: waybillToken
})
}
})
}
//复制到剪切板方法
const copy = ( orderNumber ) => {
console.log('订单编号为--->',orderNumber);
uni.setClipboardData({
data: orderNumber,
success: () => {
uni.showToast({
title: '成功复制到剪贴板'
})
}
})
}
//防抖相关变量
let debounceTimer = null;
let wxPayTimer = null;
let loading = false;
let isLoading = ref(false)
let isShow = ref(false)
const fd = () => { //防抖
clearTimeout(debounceTimer)
showLoading()
debounceTimer = setTimeout(async () => {
await getMyCouponList()
hideLoading()
}, 1000)
}
const wxPayFd = (oid) => { //微信支付按钮防抖
clearTimeout(wxPayTimer)
isShow.value = true
showLoading()
wxPayTimer = setTimeout(async () => {
await wxPay(oid)
hideLoading()
}, 1000)
}
function showLoading() { //加载弹窗
if (!loading) {
wx.showLoading({
title: '加载中...',
});
loading = true;
isLoading.value = true
}
}
function hideLoading() { //关闭弹窗
if (loading) {
wx.hideLoading();
loading = false;
isLoading.value = false
isShow.value = false
}
}
</script>
<style lang="scss" scoped>
.overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.4); /* 半透明黑色背景 */
z-index: 999;
}
.goodsBox {
margin-bottom: 20rpx;
}
.ml-9 {
margin-left: 16.88rpx;
}
.mt-53 {
margin-top: 99.38rpx;
}
.ml-17 {
margin-left: 31.88rpx;
}
.mt-5 {
margin-top: 9.38rpx;
}
.ml-5 {
margin-left: 9.38rpx;
}
.page {
padding-top: 17.25rpx;
background-color: #f8e8c1;
2025-01-09 02:50:05 +00:00
background-image: url('https://carbon2.obs.cn-north-4.myhuaweicloud.com:443/feiyi%2Ftest%2F0%2FQfLHXSAU-feiyigongfangbeijin.png');
background-size: 100% 100%;
background-repeat: no-repeat;
width: 100%;
overflow-y: auto;
overflow-x: hidden;
height: 100vh;
}
.section_2 {
margin-left: 16.88rpx;
margin-right: 15rpx;
padding: 16.88rpx;
background-color: #ffffff;
border-radius: 18.75rpx;
}
.image {
width: 75rpx;
height: 75rpx;
}
.font {
font-size: 26.25rpx;
font-family: FZSongKeBenXiuKaiS-R-GB;
line-height: 25.54rpx;
color: #323232;
}
.text {
color: #323233;
font-size: 28.13rpx;
line-height: 27.58rpx;
}
.text_2 {
color: #6b6e72;
font-size: 22.5rpx;
font-family: FZSongKeBenXiuKaiS-R-GB;
line-height: 22.14rpx;
}
.section_3 {
margin: 15rpx 15rpx 0 16.88rpx;
padding: 24.81rpx 11.25rpx 25.26rpx 20.68rpx;
background-color: #ffffff;
border-radius: 18.75rpx;
}
.group {
width: 410.31rpx;
height: 84.94rpx;
}
.text_3 {
margin-left: 59.89rpx;
line-height: 22.67rpx;
}
.image_2 {
width: 43.13rpx;
height: 43.13rpx;
}
.font_2 {
font-size: 26.25rpx;
font-family: FZSongKeBenXiuKaiS-R-GB;
line-height: 30rpx;
color: #818181;
}
.text_4 {
font-size: 24.38rpx;
}
.text_6 {
margin-top: -10.26rpx;
font-size: 24.38rpx;
}
.text_5 {
color: #ffaaa5;
line-height: 24.41rpx;
}
.image_3 {
width: 24.38rpx;
height: 24.38rpx;
}
.section_4 {
margin: 15rpx 15rpx 110rpx 16.88rpx;
padding: 22.5rpx 22.63rpx 24.79rpx 24.38rpx;
background-color: #ffffff;
border-radius: 18.75rpx;
}
.image_4 {
border-radius: 9.38rpx;
width: 146.25rpx;
height: 165rpx;
}
.group_2 {
margin-top: 4.2rpx;
margin-bottom: 5.63rpx;
}
.text_11 {
line-height: 25.01rpx;
}
.image_5 {
width: 30rpx;
height: 30rpx;
}
.font_3 {
font-size: 33.75rpx;
font-family: FZSongKeBenXiuKaiS-R-GB;
line-height: 22.54rpx;
color: #323232;
}
.font_4 {
font-size: 26.25rpx;
font-family: FZSongKeBenXiuKaiS-R-GB;
line-height: 17.53rpx;
color: #323232;
}
.font_5 {
font-size: 26.25rpx;
font-family: Open Sans;
line-height: 17.53rpx;
color: #323232;
}
.text_8 {
line-height: 18.73rpx;
}
.text_1 {
margin-right: 7.58rpx;
margin-top: 133.14rpx;
}
.font_6 {
font-size: 26.25rpx;
font-family: FZSongKeBenXiuKaiS-R-GB;
line-height: 25.54rpx;
color: #818181;
}
.group_7 {
padding: 29.19rpx 0 16.88rpx;
border-top: solid 1.88rpx #dfdfdf;
border-bottom: solid 1.88rpx #dfdfdf;
}
.text_18 {
margin-left: 2.36rpx;
line-height: 24.71rpx;
}
.group_8 {
margin-right: 3.62rpx;
padding-top: 9.86rpx;
}
.group_9 {
border-radius: 9.38rpx;
height: 84.38rpx;
border: solid 1.88rpx #ffffff;
}
.text_19 {
line-height: 31.88rpx;
text-shadow: 0 1.88rpx #ffffff, 0 -1.88rpx #ffffff, 1.88rpx 0 #ffffff, -1.88rpx 0 #ffffff;
text-indent: 54.45rpx;
}
.pos_4 {
position: absolute;
left: 12.17rpx;
right: 25.33rpx;
top: 50%;
transform: translateY(-50%);
}
.text_20 {
line-height: 25.84rpx;
}
.group_11 {
margin-right: 3.62rpx;
width: 368.34rpx;
}
.text-wrapper {
padding-bottom: 2.29rpx;
background-color: #ffffff;
width: 50.63rpx;
height: 22.5rpx;
border: solid 0.94rpx #d1d1d1;
}
.view {
margin-left: 317.72rpx;
}
.font_7 {
font-size: 18.75rpx;
font-family: Open Sans;
line-height: 17.53rpx;
color: #323232;
}
.text_22 {
line-height: 17.38rpx;
}
.text_21 {
margin-left: -368.34rpx;
}
.text_23 {
line-height: 24.71rpx;
}
.text_24 {
margin-right: 26.38rpx;
}
.group_1 {
padding: 0 2.38rpx;
}
.text_25 {
line-height: 24.51rpx;
}
.text_26 {
margin-right: 137.49rpx;
}
.group_16 {
padding: 0 3.32rpx;
}
.text_27 {
line-height: 25.84rpx;
}
.group_14 {
margin-right: 28.43rpx;
}
.text_28 {
line-height: 24.51rpx;
}
.text_29 {
margin-right: 139.88rpx;
}
.section_5 {
position: fixed;
left: 0;
right: 0;
bottom: 0;
// margin-top: 78.75rpx;
padding: 16.88rpx 25.31rpx 15rpx;
background-color: #ffffff;
}
.font_8 {
font-size: 30rpx;
font-family: FZSongKeBenXiuKaiS-R-GB;
line-height: 27.77rpx;
}
.text_30 {
color: #000000;
}
.image_8 {
width: 33.75rpx;
height: 33.75rpx;
}
.text_31 {
color: #ffaaa5;
font-size: 37.5rpx;
font-family: Open Sans;
font-weight: 700;
line-height: 27.62rpx;
}
.text_33 {
color: #ffaaa5;
font-size: 30rpx;
font-family: Open Sans;
font-weight: 700;
line-height: 22.05rpx;
}
.text-wrapper_2 {
padding: 20.63rpx 0 22.86rpx;
background-color: #ffaaa5;
border-radius: 75rpx;
width: 204.38rpx;
height: 71.25rpx;
}
.text_32 {
color: #ffffff;
}
.text-wrapper_3 {
position: relative;
left: 140rpx;
background-color: #ffaaa5;
border-radius: 75rpx;
width: 204rpx;
// height: 71rpx;
font-size: unset;
}
@import url(../../../common/css/global.css);
</style>