sl-express/project-wl-kuaidiyuan-uniap.../pages/details/index.vue

386 lines
11 KiB
Vue
Raw Permalink Normal View History

2023-09-04 16:40:17 +08:00
<!-- 去取件详情页 -->
<template>
<!-- 自定义头部 -->
<UniNav :title="title" @goBack="goBack"></UniNav>
<!-- end -->
<view class="detailBox">
<!-- 订单号 -->
<view class="boxBg">
<view class="tit">
<text>
<text>订单号SD{{ detailsData.orderId }}</text>
<icon @click="handleCopy" class="copy"></icon>
</text>
</view>
</view>
<!-- end -->
<!-- 取件信息 -->
<Address :detailsData="detailsData" class="pickupBox"></Address>
<!-- end -->
<!-- 物品信息 -->
<view class="boxBg">
<view class="tit">
<text>物品名称</text>
<view class="goodsSelect" @click="handleGoods" v-if="!isPickUp || (users.paymentMethod === 2 && !isCollect)">
<text class="textInfo">{{ detailsData.goodsType }}</text>
<icon class="nextIcon"></icon>
</view>
<view class="goodsSelect" v-else>
<text class="textInfo">{{ detailsData.goodsType }}</text>
</view>
</view>
</view>
<!-- end -->
<!-- 计算物品快递费 -->
<view class="boxBg">
<GoodsInfo ref="goods" :detailsData="detailsData" @getFreight="getFreight"></GoodsInfo>
<view class="freight">
<view>
总计金额
<text>
<text>*</text>
基础运费+增值服务费
</text>
</view>
<view>
<view v-if="!isPickUp || (users.paymentMethod === 2 && !isCollect)">
<input v-if="isFreigthEdit" type="number" v-model="freight" @blur="handleAmount" />
<text @click="handleFreight" v-else>{{ detailsData.freight }}</text>
<text></text>
</view>
<view v-else>
<text>{{ users.payData.tradingAmount }}</text>
<text></text>
</view>
</view>
</view>
</view>
<!-- end -->
<!-- 付款方式 -->
<view class="boxBg">
<view class="tit">
<text>付款方式</text>
<view class="goodsSelect" @click="handlePayMethod" v-if="!isPickUp || (users.paymentMethod === 2 && !isCollect)">
<text class="textInfo">{{ detailsData.paymentMethod === 1 ? '寄付' : '到付' }}</text>
<icon class="nextIcon"></icon>
</view>
<view class="goodsSelect" v-else>
<text class="textInfo">{{ detailsData.paymentMethod === 1 ? '寄付' : '到付' }}</text>
</view>
</view>
</view>
<!-- end -->
<!-- 备注 -->
<view class="boxBg">
<view class="tit">
<text>备注</text>
<view class="goodsSelect" @click="handleRemark" v-if="!isPickUp || (users.paymentMethod === 2 && !isCollect)">
<text class="textInfo">{{ detailsData.remark }}</text>
<icon class="nextIcon"></icon>
</view>
<view class="goodsSelect" v-else>
<text class="textInfo">{{ detailsData.remark }}</text>
</view>
</view>
</view>
<!-- end -->
<!-- 身份验证未验证 -->
<Authentication ref="card" :detailsData="detailsData"></Authentication>
<!-- end -->
<view class="btnBox">
<button v-if="isPickUp && users.paymentMethod === 1" class="btn-default uni-mini" @click="handleReceipt">去收款</button>
<button v-if="isCollect && isPickUp && users.paymentMethod === 2" class="btn-default uni-mini btn-forbid">已取件</button>
<button v-if="!isPickUp || (users.paymentMethod === 2 && !isCollect)" class="btn-default uni-mini" @click="handleSubmit">去取件</button>
</view>
<!-- 物品名称付款选择备注弹层 -->
<Uppop ref="method" @getGoodType="getGoodType" @getPayMethod="getPayMethod" @getRemark="getRemark" :detailsData="detailsData" :type="type"></Uppop>
<!-- end -->
</view>
</template>
<script setup>
import { ref, reactive, onMounted, watch, nextTick } from 'vue';
import { useStore } from 'vuex';
// 接口
import { getDetail, getPickup } from '@/pages/api/index.js';
// 导入组件
// 导航组件
import UniNav from '@/components/uni-nav/index.vue';
// 地址
import Address from './components/address.vue';
// 物品信息
import GoodsInfo from '@/components/uni-goods/index.vue';
// 身份认证
import Authentication from './components/authentication.vue';
// 付款方式先择、物品名称弹层
import Uppop from './components/uppop.vue';
// ------定义变量------
const store = useStore(); //vuex获取、储存数据
const users = store.state.user;
// 定义ref 获取子组件方法或者值
const goods = ref(); //
const card = ref(); //
const method = ref(); //
const emit = defineEmits(''); //子组件向父组件事件传递
// 获取列表页传过来的id 有两种方法
// 第一种
// const pages = getCurrentPages(); //获取加载的页面获取当前页面路由信息uniapp 做安卓不支持 vue-router
// const currentPage = pages[pages.length - 1]; //获取当前页面的对象
// 第二种 用vuexs
const taskId = store.state.user.taskId; //用vuex获取列表页传过来的任务id
const title = ref('去取件'); //nav标题
let type = ref(1); //物品名称和付款方式公用一个弹层根据不同type值来做判断 物品:1,付款方式:2,备注:3
const detailsData = ref({}); //详情数据
let isFreigthEdit = ref(false);
let freight = ref(0); //金额
let isPickUp = ref(false); //是否去取件
let isCollect = ref(false); //到付的情况下,是否触发去取件后到,显示按钮为已取件
const stopClick = ref(true); //防止连续提交
// 监听修改金额数值,小数点后保留一位
watch(freight, (newValue, oldValue) => {
const val = Number(newValue);
// 最大输入99999最小输入1
nextTick(() => {
if (val < 99999 && val > 1) {
freight.value = parseInt(val * 100) / 100;
}
if (val > 99999) {
freight.value = 99999;
}
});
});
// ------生命周期------
onMounted(() => {
getDetails(taskId);
//
if (users.isPickUp) {
isPickUp.value = true;
} else {
isPickUp.value = false;
}
//
if (users.isCollect) {
isCollect.value = true;
} else {
isCollect.value = false;
}
});
// ------定义方法------
// 获取详情
const getDetails = async id => {
await getDetail(id).then(res => {
detailsData.value = res.data;
freight.value = detailsData.value.freight;
if (users.paymentMethod) {
if (users.paymentMethod === 1) {
detailsData.value.paymentMethod = 1;
} else {
detailsData.value.paymentMethod = 2;
}
}
goods.value.weight = Number(detailsData.value.weight);
goods.value.volume = Number(detailsData.value.volume);
// 设置当前是到付还是寄付
store.commit('user/setPaymentMethod', detailsData.value.paymentMethod);
store.commit('user/setDetailsData', res.data);
});
};
// 去取件
const handleSubmit = async () => {
if (stopClick.value) {
stopClick.value = false;
// 表单校验
const cards = card.value;
const good = goods.value;
// 未验证的身份证需要做校验
if (!cards.isValidate && detailsData.value.idCardNoVerify !== 1) {
stopClick.value = true;
return uni.showToast({
title: '请输入正确的身份证',
duration: 1000,
icon: 'none'
});
return false;
} else {
// 网络慢的时候添加按钮loading
let times =
setTimeout(()=>{
uni.showLoading({
title: 'loading',
});
},500)
const details = detailsData.value;
// 要提交给后端的参数
if (freight.value !== 0) {
details.freight = freight.value;
}
const params = {
amount: good.freightData ? good.freightData : Number(details.freight), //总额
id: taskId, //任务id
goodName: details.goodsType, //物品名称
idCard: details.idCardNoVerify === 1 ? null : cards.idCard, //身份证号
name: details.idCardNoVerify === 1 ? null : cards.name, //真实姓名
payMethod: details.paymentMethod, //付款方式
remark: details.remark, //备注
volume: Number(good.volume), //体积
weight: good.weight //重量
};
// 存储信息,二维码支付页面要用
const payData = {
memo: details.remark,
productOrderNo: details.orderId,
tradingAmount: params.amount
};
store.commit('user/setPayData', payData);
await getPickup(params)
.then(res => {
if (res.code === 200) {
// 操作成功后清除loading
setTimeout(function () {
uni.hideLoading();
}, 500);
clearTimeout(times)
// TODO先保留次代码后期需求可能有变更
// // const type = details.paymentMethod;
// // 跳转到取件成功页
// uni.redirectTo({
// url: '/pages/pay/index?type=' + type
// });
// store.commit('user/setIsPickUp', true);
}
setTimeout(()=>{
stopClick.value = true;
},3000)
})
.catch(err => {
return uni.showToast({
title: err.msg,
duration: 1000,
icon: 'none'
});
});
const type = details.paymentMethod;
// // 跳转到取件成功页
uni.redirectTo({
url: '/pages/pay/index?type=' + type
});
store.commit('user/setIsPickUp', true);
}
}
};
// 复制订单号
const handleCopy = () => {
uni.setClipboardData({
data: detailsData.value.orderId, // 要保存的内容
success: function() {
uni.showToast({
title: '复制成功',
icon: 'none'
});
}
});
};
// 是否修改总计金额
const handleFreight = () => {
isFreigthEdit.value = true;
};
// 获取运费金额
const getFreight = val => {
detailsData.value.freight = val;
freight.value = detailsData.value.freight;
};
// 输入金额是否小于1
const handleAmount = () => {
nextTick(() => {
if (freight.value < 1) {
freight.value = 1;
}
});
};
// 物品
// 获取物品名称,获取子组件传的值
const getGoodType = val => {
detailsData.value.goodsType = val;
};
// 物品名称
const handleGoods = () => {
type.value = 1;
handleOpen();
};
// 付款方式
// 获取付款方式,获取子组件传的值
const getPayMethod = val => {
if (val === '寄付') {
detailsData.value.paymentMethod = 1;
} else {
detailsData.value.paymentMethod = 2;
}
store.commit('user/setPaymentMethod', detailsData.value.paymentMethod);
};
// 付款方式选择
const handlePayMethod = () => {
type.value = 2;
handleOpen();
};
// 备注
// 获取备注内容,获取子组件传的值
const getRemark = val => {
detailsData.value.remark = val;
};
// 打开弹层写备注
const handleRemark = () => {
if (users.isBack !== 'collect') {
type.value = 3;
handleOpen();
}
};
// 打开弹层
const handleOpen = () => {
method.value.dialogOpen();
};
// 返回上一页
const goBack = () => {
store.commit('user/setPaymentMethod', null);
store.commit('user/setCardData', null);
store.commit('user/setIsPickUp', false);
store.commit('user/setIsCollect', false);
if (users.newType === 301) {
uni.redirectTo({
url: '/pages/news/system?title=取件相关&type=301'
});
} else if (users.detailType === 1) {
// 如果是从历史取派的取件列表进入的,返回的时候进入到历史取派列表
store.commit('user/setTabIndex', 0);
uni.redirectTo({
url: '/pages/history/index'
});
} else if (users.isSearch) {
store.commit('user/setIsSearch', false);
uni.redirectTo({
url: '/pages/search/index'
});
} else {
store.commit('user/setTabIndex', 0);
uni.redirectTo({
url: '/pages/pickup/index'
});
}
};
// 去收款
const handleReceipt = () => {
store.commit('user/setPayData', {});
uni.redirectTo({
url: '/pages/pay/scanPay'
});
};
</script>
<style src="./index.scss" lang="scss" scoped></style>