This commit is contained in:
shuhongfan
2023-09-04 16:40:17 +08:00
commit cf5ac25c14
8267 changed files with 1305066 additions and 0 deletions

View File

@@ -0,0 +1,45 @@
<template>
<uni-popup
ref="uppop"
type="center"
:animation="false"
class="comPop"
:mask-click="false"
>
<view class="con">用户已支付</view>
<view><button @click="goList">返回主页</button></view>
</uni-popup>
</template>
<script setup>
import { ref } from "vue";
// 获取父组件数据
const props = defineProps({
tipInfo: {
type: String,
default: "",
},
});
// ------定义变量------
const emit = defineEmits(); //子组件向父组件事件传递
const uppop = ref();
// ------定义方法------
// 打开弹层
const dialogOpen = () => {
uppop.value.open();
};
// 关闭弹层
const dialogClose = () => {
uppop.value.close();
};
// 返回任务列表页
const goList = () => {
uni.navigateTo({
url: "/pages/pickup/index",
});
};
// 向父组件暴露方法
defineExpose({
dialogOpen,
});
</script>

View File

@@ -0,0 +1,131 @@
body,
uni-page-body,
uni-page-head,
.uni-page-head {
background-color: var(--neutral-color-background) !important;
}
.pickUp {
padding: 200rpx 0 0;
font-size: 36rpx;
line-height: 50rpx;
font-weight: 600;
text-align: center;
icon {
background: url(@/static/chenggong@2x.png) no-repeat;
background-size: contain;
width: 146rpx;
height: 146rpx;
margin-bottom: 24rpx;
}
.btnBox {
padding-top: 64rpx;
}
::v-deep .navigator-wrap {
width: 300rpx;
height: 100rpx;
line-height: 100rpx;
display: inline-block;
background: var(--neutral-color-white) !important;
border-radius: 20rpx;
color: var(--neutral-color-main) !important;
font-size: var(--font-size-16);
font-weight: 500;
}
}
.scanPay {
.boxBg {
margin-top: 32rpx;
padding: 40rpx;
}
.srCan {
text-align: center;
line-height: 40rpx;
padding-bottom: 50rpx;
image {
width: 416rpx;
height: 410rpx;
}
.text {
color: var(--essential-color-red);
font-size: 50rpx;
font-weight: 6 00;
line-height: 58rpx;
text {
font-size: var(--font-size-13);
}
}
}
}
:deep(uni-canvas){
width: 416rpx;
height: 400rpx;
margin: 0 auto;
display: inline-block;
}
.payBox {
.item {
display: flex;
align-items: center;
font-size: var(--font-size-16);
line-height: 52rpx;
icon {
width: 48rpx;
height: 48rpx;
margin-right: 20rpx;
}
& > view {
&:first-child {
flex: 1;
display: flex;
align-items: center;
icon {
background: url(@/static/weChat.png) no-repeat;
background-size: contain;
}
}
::v-deep .uni-radio-input {
margin-right: 0 !important;
}
.checkRadio {
uni-radio {
vertical-align: super;
}
}
}
}
&:last-child {
& > view {
&:first-child {
icon {
background: url(@/static/Alipay.png) no-repeat;
background-size: contain;
}
}
}
}
}
.comPop {
::v-deep .uni-popup__wrapper {width: 70%;
background: var(--neutral-color-white) !important;
border-radius: 24rpx !important;
font-size: var(--font-size-16);
.con{
padding: 68rpx;
text-align: center;
border-bottom: 1px solid var(--neutral-color-background);
}
uni-button{
background: none;
line-height: 94rpx;
height: 100rpx;
color: var(--neutral-color-font);
font-size: var(--font-size-16);
}
}
}

View File

@@ -0,0 +1,96 @@
<!-- 取件成功页 -->
<template>
<!-- 自定义头部 -->
<UniNav
:title="users.isDelivery ? '签收成功' : '取件成功'"
@goBack="goBack"
></UniNav>
<!-- end -->
<view class="pickUp">
<icon></icon>
<view>{{ users.isDelivery ? "签收成功" : "取件成功" }}</view>
<view class="btnBox" v-if="users.isDelivery">
<navigator
url="/pages/pay/scanPay?pay=true"
open-type="redirect"
v-if="type === '2'"
>去收款</navigator
>
<view class="navigator-wrap" v-else @click="handleBack">返回主页</view>
</view>
<view class="btnBox" v-else>
<navigator
url="/pages/pay/scanPay?pay=true"
open-type="redirect"
v-if="type === '1'"
>去收款</navigator
>
<view class="navigator-wrap" v-else @click="handleBack">返回主页</view>
</view>
</view>
</template>
<script setup>
import { ref } from "vue";
import { useStore } from "vuex";
// 导入组件
// 导航组件
import UniNav from "@/components/uni-nav/index.vue";
// ------定义变量------
const store = useStore(); //vuex获取、储存数据
const users = store.state.user;
const pages = getCurrentPages(); //获取加载的页面获取当前页面路由信息uniapp 做安卓不支持 vue-router
const currentPage = pages[pages.length - 1].$page.options; //获取当前页面的对象
const type = currentPage.type;
// ------定义方法------
// 返回上一页
const handleBack = () => {
if (users.isDelivery) {
if (users.taskStatus === 6 && users.detailType === 2) {
store.commit("user/setTabIndex", 1);
uni.redirectTo({
url: "/pages/history/index",
});
} else {
uni.redirectTo({
url: "/pages/delivery/index",
});
}
} else {
if (users.taskStatus === 6) {
uni.redirectTo({
url: "/pages/history/index",
});
} else {
uni.redirectTo({
url: "/pages/pickup/index",
});
}
}
store.commit("user/setIsPickUp", false);
store.commit("user/setIsSign", false);
};
// 返回上一页
const goBack = () => {
if (users.isDelivery) {
if (users.paymentMethod === 2) {
store.commit("user/setIsCollect", true);
} else {
store.commit("user/setIsSign", true);
}
uni.redirectTo({
url: "/pages/details/waybill",
});
} else {
if (users.paymentMethod === 2) {
store.commit("user/setIsCollect", true);
}
uni.redirectTo({
url: "/pages/details/index",
});
}
};
</script>
<style src="./index.scss" lang="scss" scoped></style>

View File

@@ -0,0 +1,227 @@
<!-- 扫码支付页 -->
<template>
<!-- 自定义头部 -->
<UniNav :title="title" @goBack="goBack"></UniNav>
<!-- end -->
<view class="pageBox scanPay">
<view class="boxBg srCan">
<view class="qr-box" v-if="qrShow"><canvas canvas-id="qrcode" /></view>
<image :src="qrCodeImg" v-else></image>
<view class="text">
<text>¥</text>
{{ detailsData.freight }}
</view>
<view>支付运费</view>
</view>
<view class="boxBg payBox" v-for="(item, index) in PayWayData" :key="index">
<view class="item">
<view>
<icon></icon>
{{ item.label }}
</view>
<view>
<view class="checkRadio"
><radio
:value="String(index)"
:class="index === current ? 'active' : ''"
:checked="index === current"
@click="checkbox(index)"
/></view>
</view>
</view>
</view>
</view>
<!-- 支付成功弹层 -->
<Uppop ref="uppop"></Uppop>
<!-- end -->
</template>
<script setup>
import { ref, onMounted } from "vue";
import { useStore } from "vuex";
import uQRCode from "@/utils/uqrcode.js"; //引入uqrcode.js
// 获取数据
import { PayWayData } from "@/utils/commonData.js";
// 接口
import { getQrCode, paySucceed, getDetail } from "@/pages/api/index.js";
// 导入组件
// 导航组件
import UniNav from "@/components/uni-nav/index.vue";
import Uppop from "./components/uppop.vue";
// ------定义变量------
const store = useStore(); //vuex获取、储存数据
const users = store.state.user;
const uppop = ref();
const title = ref("扫码支付"); //nav标题
const pages = getCurrentPages(); //获取加载的页面获取当前页面路由信息uniapp 做安卓不支持 vue-router
const currentPage = pages[pages.length - 1]; //获取当前页面的对象
const type = currentPage.$page.options.type;
const pay = currentPage.$page.options.pay;
let isLeftText = true; //是否显示左侧文字
let current = ref(0); //当前触发付款方式的值
let qrCodeImg = ref("");
let times = ref(null);
let detailsData = ref({}); //详情数据
let qrShow = ref(false); //二维码支付有两种情况一种是后端返回的base64图片另一种是后端返回的二维码地址需要前端来做处理
onMounted(() => {
getDetails();
// 10秒钟监听一下付款状态是否付款
times.value = setInterval(() => {
getPaySucceed();
}, 10000);
});
// ------定义方法------
const getPaySucceed = async () => {
await paySucceed(users.detailsData.orderId).then((res) => {
if (res.code === 200) {
// 如果付款成功,弹出付款成功弹层
if (res.data) {
// 清除定时器
clearInterval(times.value);
uppop.value.dialogOpen();
}
}
});
};
// 获取订单详情
const getDetails = async () => {
await getDetail(users.taskId).then((res) => {
detailsData.value = res.data;
store.commit("user/setDetailsData", detailsData.value);
getCode(res.data);
});
};
// 获取支付二维码
const getCode = async (obj) => {
let data = users.payData;
let params = {};
if (data.tradingAmount) {
params = {
memo: data.memo ? data.memo : "备注",
payMethod: current.value === 0 ? 2 : 1,
productOrderNo: data.productOrderNo,
tradingAmount: data.tradingAmount,
};
} else {
params = {
memo: obj.remark ? obj.remark : "备注",
payMethod: current.value === 0 ? 2 : 1,
productOrderNo: obj.orderId,
tradingAmount: obj.freight,
};
}
// 网络慢的时候添加按钮loading
let times =
setTimeout(()=>{
uni.showLoading({
title: 'loading',
});
},500)
// 调用接口
await getQrCode(params).then((res) => {
// 操作成功后清除loading
uni.hideLoading();
clearTimeout(times)
const data = res.data;
const str = data.qrCode.slice(0, 10);
// 以base图片显示二维码
if (str === "data:image") {
qrCodeImg.value = data.qrCode.replace(/[\r\n]/g, "");
} else {
// 后端直接返回的二维码地址,需要前端处理一下返回的二维码地址
qrCodeFun(data.qrCode);
}
});
};
// 处理后端返回的地址生成二维码
const qrCodeFun = (valUrl) => {
qrShow.value = true;
uQRCode.make({
canvasId: "qrcode", //放置在哪个标签中将ID设置为相同
componentInstance: this,
text: valUrl, //valUrl为存放要传输的数据的变量
size: 200, //大小左右都为200 !注意要和容器大小一致
margin: 0, //不改变大小添加白色边框
backgroundColor: "#ffffff",
foregroundColor: "#000000",
fileType: "jpg",
errorCorrectLevel: uQRCode.errorCorrectLevel.H,
success: (res) => {},
});
};
// 选项框点击事件,参数是数据的下标
const checkbox = (index) => {
current.value = index;
getCode(detailsData.value);
};
// 返回上一页
const goBack = () => {
// 清除定时器
clearInterval(times.value);
// 返回派件详情
// 派件返回
if (users.isDelivery) {
if (users.detailType === 2 && users.taskStatus === 6) {
// 如果时从历史取派的取件列表进入的,返回的时候进入到历史取派列表
store.commit("user/setTabIndex", 1);
uni.redirectTo({
url: "/pages/history/index",
});
} else if (users.detailType === 0 && users.taskStatus === 5) {
// 如果是派件列表进入的,返回的时候进入到派件列表
store.commit("user/setTabIndex", 1);
uni.redirectTo({
url: "/pages/delivery/index",
});
} else if (users.isPickUp && users.paymentMethod === 2 && !pay) {
// 如果时从派件列表进入的,返回的时候进入到派件列表
uni.redirectTo({
url: "/pages/details/waybill",
});
} else {
uni.redirectTo({
url: "/pages/pay/index?type=" + users.paymentMethod,
});
pay = false;
}
} else {
// 取件返回
if (users.detailType === 1 && users.taskStatus === 6) {
// 如果是从历史取派的取件列表进入的,返回的时候进入到历史取派列表取件
store.commit("user/setTabIndex", 0);
uni.redirectTo({
url: "/pages/history/index",
});
} else if (
users.detailType === 2 &&
users.taskStatus === 3 &&
!users.isSearch
) {
// 如果是从取件列表进入的,返回的时候进入到取件列表的已取件
store.commit("user/setTabIndex", 1);
uni.redirectTo({
url: "/pages/pickup/index",
});
} else if (users.isPickUp && users.paymentMethod === 1 && !pay) {
// 如果时从取件列表进入的,返回的时候进入到取件列表
// 返回详情
uni.redirectTo({
url: "/pages/details/index",
});
} else if (users.isSearch) {
store.commit("user/setIsSearch", false);
uni.redirectTo({
url: "/pages/search/index",
});
} else {
uni.redirectTo({
url: "/pages/pay/index?type=" + users.paymentMethod,
});
pay = false;
}
}
};
</script>
<style src="./index.scss" lang="scss" scoped></style>