You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
shop-app/pages/order/submit.vue

340 lines
7.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!--
* @Author: ch
* @Date: 2022-03-20 14:14:53
* @LastEditors: ch
* @LastEditTime: 2022-05-17 14:48:12
* @Description: file content
-->
<template>
<view>
<UiWhiteBox>
<u-cell class="address" :border="false" isLink @click="selectAddress">
<view slot="title" class="address--title">
{{address.province ? address.province + address.city + address.area : '请选择收货地址'}}
</view>
<image class="address--icon" slot="icon" src="@/static/order/dw.png" />
<view slot="label" class="address--label" v-if="address.province">
<text>收货人:{{address.name}}</text>
<text>{{address.phone}}</text>
</view>
</u-cell>
</UiWhiteBox>
<UiWhiteBox>
<UiGoodsInfo v-for="item in orderInfo.products"
:key="item.productId" :data="item" />
</UiWhiteBox>
<UiWhiteBox>
<UiCell class="service--cell" title="配送方式" value="快递配送" :rightIcon="false"></UiCell>
<UiCell class="service--cell service--cell__last" title="买家留言" value="快递配送" :rightIcon="false">
<textarea slot="value" class="service--remark" auto-height v-model="userMessage"
maxlength="50" placeholder="填写您想要备注的信息50字以内" />
</UiCell>
</UiWhiteBox>
<UiWhiteBox>
<text class="play--title">支付方式</text>
<radio-group>
<u-cell title="微信支付" :border="false" @click="payType = 'wxpay'">
<image class="play--icon" slot="icon" src="@/static/order/wx.png"/>
<radio class="play--radio" slot="right-icon" color="#FF875B"
:checked="payType == 'wxpay'" ></radio>
</u-cell>
<!-- <u-cell title="支付宝支付" :border="false" @click="payType = 'alipay'">
<image class="play--icon" slot="icon" src="@/static/order/zfb.png"/>
<radio class="play--radio" slot="right-icon" color="#FF875B"
:checked="payType == 'alipay'"></radio>
</u-cell> -->
</radio-group>
</UiWhiteBox>
<UiWhiteBox class="amount">
<u-cell title="商品总额" :value="`¥${orderInfo.productAmount}`" :border="false"></u-cell>
<u-cell title="运费" :value="`¥${orderInfo.shippingAmount}`" :border="false"></u-cell>
</UiWhiteBox>
<view class="footer">
<view class="footer--total">
<text>合计</text>
<text class="footer--amount">{{orderInfo.payAmount}}</text>
</view>
<UiButton class="footer--btn" type="solid" @click="submit"></UiButton>
</view>
</view>
</template>
<script>
import UiCell from '@/components/UiCell';
import {ApiPostSubmitOrder, ApiGetBeforeOrder, ApiGetBeforeCartOrder} from '@/common/api/order';
import {ApiGetAddress } from '@/common/api/base';
import {Wxpay} from '@/common/utils';
import UiButton from '@/components/UiButton.vue';
import UiWhiteBox from '../../components/UiWhiteBox.vue';
import UiGoodsInfo from '../../components/UiGoodsInfo.vue';
export default {
components : {UiCell, UiButton, UiWhiteBox, UiGoodsInfo },
data(){
return {
address : {},
userMessage : '',
orderInfo : {},
payType : 'wxpay'
}
},
onLoad(){
// 从地址列表页改变了收货地址
uni.$on('changeAddress',(item)=>{
this.address = item;
});
},
onShow(){
// 默认选择设为默认的地址
if(!this.address.id){
this.getAddressList()
}
this.getBeforeOrder();
},
methods:{
async getAddressList(){
const {error, result} = await ApiGetAddress();
if(error){
uni.$u.toast(error.message);
return false;
}
this.address = result.find(i => i.isDefault) || {};
console.log(this.address);
this.$store.commit('SET_ADDRESS', result);
},
/**
* 获取预订单信息,将要提交的订单信息
*/
async getBeforeOrder(){
const query = this.$Route.query;
let res = {};
// 购物车结算
if(query.mode === 'cart'){
res = await ApiGetBeforeCartOrder({
cartIds: query.ids,
recipientAddressId : this.address.id
})
}
// 立即购买
if(query.mode === 'buyNow'){
res = await ApiGetBeforeOrder({
productSkuId : query.skuId,
quantity : query.num,
activityId : query.activityId,
activityTimeId : query.activityTimeId,
// 1正常购买 2活动购买
activityType : query.activityType,
recipientAddressId : this.address.id
});
}
if(res.error){
uni.$u.toast(res.error.message);
return false;
}
this.orderInfo = res.result;
},
selectAddress(){
const selectedId = this.address.id;
const selectedPar = selectedId ? `&id=${selectedId}` : '&status=created';
this.$Router.push(`/addressList?source=submitOrder${selectedPar}`);
},
/**
* 提交订单
*/
async submit(){
const {query} = this.$Route;
if(!this.address.id){
uni.$u.toast('请选择收货地址');
return false;
}
const {error, result} = await ApiPostSubmitOrder({
// #ifdef APP-PLUS
orderSource : 2,
// #endif
// #ifdef H5
orderSource : this.$store.state.openId ? 5 : 4,
// #endif
recipientAddressId : this.address.id,
shoppingCartIds : query.ids ? query.ids.split(',') : [],
products : this.orderInfo.products.map(i => ({
activityId : query.activityId,
activityTimeId : query.activityTimeId,
productId : i.productId,
productSkuId : i.productSkuId,
quantity : i.quantity,
activityType : query.activityType
})),
userMessage : this.userMessage
});
if(error){
uni.$u.toast(error.message);
return false;
}
if(this.payType === 'wxpay'){
Wxpay({orderId : result.orderId, openId : this.$store.state.openId});
}else{
uni.$u.toast('暂不支持支付宝支付');
}
}
}
}
</script>
<style lang="scss">
page {
background: $color-grey1;
padding-bottom: 140rpx;
}
</style>
<style lang="scss" scoped>
.address{
/deep/.u-cell__body__content{
padding: 10rpx 0;
}
&--title{
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 500rpx;
&__grey{
color: $color-grey4;
}
}
&--icon{
width: 28rpx;
height: 34rpx;
margin-right: 30rpx;
}
&--label{
margin-top: 26rpx;
text{
font-size: $font-size-sm;
color: $color-grey4;
margin-right: 40rpx;
}
}
}
.goods-group{
background: $color-grey0;
margin: 20rpx 0;
&--item{
display: flex;
justify-content: space-between;
padding: 30rpx;
border-bottom: 1px solid $color-grey2;
&-image{
width: 180rpx;
height: 180rpx;
margin-right: 30rpx;
}
&-con{
width: 510rpx;
display: flex;
justify-content: space-between;
font-size: $font-size-base;
color: $color-grey6;
line-height: 39rpx;
}
&-title{
overflow:hidden;
text-overflow:ellipsis;
display:-webkit-box;
-webkit-box-orient:vertical;
-webkit-line-clamp:2;
}
&-pirce{
font-size: 22rpx;
margin-left: 60rpx;
}
&-desc{
width: 510rpx;
font-size: $font-size-sm;
color: $color-grey4;
margin-top: 20rpx;
line-height: 39rpx;
display: flex;
justify-content: space-between;
}
&-num{
font-size: $font-size-base;
margin-left: 60rpx;
}
}
}
.service{
&--cell{
border-radius: 16rpx;
padding: 0 30rpx;
&__last{
border: 0;
}
}
&--remark{
font-size: $font-size-base;
width: 500rpx;
text-align: right;
}
}
.play{
background: $color-grey0;
margin: 20rpx 0;
&--title{
font-size: $font-size-base;
padding: 30rpx;
display: block;
}
&--icon{
width: 39rpx;
height: 39rpx;
margin-right: 20rpx;
}
&--radio{
transform: scale(70%);
}
}
.amount{
background: $color-grey0;
}
.footer{
display: flex;
align-items: center;
justify-content: space-between;
height: 120rpx;
background: $color-grey0;
padding: 0 30rpx;
position: fixed;
bottom: 0;
right: 0;
left: 0;
&--total{
color: $color-grey5;
font-size: $font-size-sm;
display: flex;
align-items: center;
}
&--amount{
font-size: $font-size-lg;
color: $color-yellow4;
margin-left: 10rpx;
}
&--btn{
margin: 0;
}
}
</style>