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.

636 lines
13 KiB

<template>
<view class="order" :class="['theme', themeObj.name ]">
<!-- 选择配送方式 -->
<!-- @tap="selectMode" -->
<view class="mode" >
<text class="text1">配送方式</text>
<text class="text2">{{modes || "请选择配送方式"}}</text>
<image src="/static/images/home/right.png"></image>
</view>
<!-- 收货地址 -->
<view class="order_address" v-if="tapIndex == 0">
<image src="/static/images/home/bottom.png"></image>
<view class="address_box" @tap="setAddress">
<view class="weizhi_icon">
<text class="iconfont icon-dizhi"></text>
</view>
<block v-if="address">
<view class="center">
<view class="name">
<text class="text1">{{address.recipient}}</text>
<text class="phones">{{address.telephone}}</text>
</view>
<view class="address_name">{{address.detail}}</view>
</view>
</block>
<view class="noaddress" v-else>
请添加收货地址
</view>
</view>
</view>
<!-- 商品详情 -->
<view v-for="(item, index) in goodsList" :key="index" class="goods">
<view class="goods_data">
<image :src="item.selectSku.img" mode="widthFix" v-if="item.selectSku"></image>
<image :src="item.url" mode="widthFix" ></image>
<view class="goods_title">
<view class="g_name">
{{item.title}}
</view>
<view class="goods_sku">
<!-- 判断当前商品是否存在规格 -->
规格: <text style="margin-right: 10upx;" v-if="item._selectedSku.length">
<text v-for="_it in item._selectedSku" :key="_it.tagname">{{_it.tagname}}</text>
</text>
<text style="margin-right: 10upx;" v-else>暂无规格</text>
</view>
<view class="price">
<view class="t1">¥{{item.price}}</view>
<view class="t2" v-if="item.hmoney">
<text>¥{{item.hmoney}}</text>
</view>
<view class="t3">
x{{item.number}}/{{ item.unit }}
</view>
</view>
</view>
</view>
<!-- <view class="morelist" style="border-bottom:none">
<view class="title">
<text class="quan" :style="'background:' + colors">券</text>
<text>优惠券</text>
</view>
<view class="right_title" :style="'color:' + colors + ';font-size:24upx'" @tap="openCoupon(index)">
{{item.couponName || '请选择优惠券'}}
</view>
</view> -->
</view>
<!-- 订单详情 -->
<view class="order_more">
<view class="morelist">
<text class="title">商品总价</text>
<view class="right_title">
¥{{sumprice}}
</view>
</view>
<view class="morelist">
<view class="title">
<text class="quan">运</text>
<text>运费</text>
</view>
<view class="right_title">
¥{{ freight }}
</view>
</view>
<view class="morelist">
<text class="title">实付款</text>
<view class="right_title">
¥{{sumprice}}
</view>
</view>
<view class="tips">
<view class="tips_name">备注信息</view>
<view class="textarea_box">
<textarea placeholder="请输入备注信息" v-model="remark" placeholder-class="font-size: 24upx" maxlength="-1" v-if="couponshow == false"></textarea>
</view>
</view>
</view>
<view class="bottom_btn">
<view class="moneys">
合计: <text class="price">¥{{sumprice}}</text>
</view>
<view class="btns" @tap="submit">
提交订单
</view>
</view>
<!-- 优惠券弹出层 -->
<view class="mask" catchtouchmove="preventTouchMove" v-if="couponshow == true" @tap="hidecoupon"></view>
<view class="coupon" :style="'bottom:' + (couponshow == true ? '0':'')">
<view class="buyong" @click="notUsed()">不使用优惠券</view>
<scroll-view class="scrolls" scroll-y>
<coupon :couponList="couponList" @onReceive="onReceive"></coupon>
</scroll-view>
</view>
</view>
</template>
<script>
var app = getApp();
import coupon from "../../commponent/public/coupon";
import {getGoodsData,getAddress,removeAddress, getCart, resetCart, getUserInfo} from '@/utils/auth.js'
import {resetNum, setTabBarBadge } from '@/utils/util.js'
import { addOrder } from "../../../api";
export default {
data() {
return {
couponshow: false,
modes: '物流寄送',
tapIndex: 0,
goodsList:getGoodsData(),
couponIndex: 0,
freight: 0,
nowprice: 0, //临时存储总金额的变量 用于计算优惠券
sumprice: 0,
address: null,
remark: '',
isConfirm: false,
couponList: [ //优惠券列表
{
money: 30,
reduce: 5,
date: '2020-02-09 2020-10-02',
id: 1,
status: 0,
condition: ['新人专享', '仅在支付时使用', '可与其他产品共享']
}, {
money: 30,
reduce: 5,
date: '2020-02-09 2020-10-02',
id: 2,
status: 0,
condition: ['新人专享']
}
],
themeObj: app.globalData.themeObj
};
},
components: {
coupon
},
props: {},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
removeAddress() //清空存储的地址
// 计算所有的商品总价
this.getSumPrice()
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
let address = getAddress() //判断是否存在重新选择的地址
if(address){
this.address = address
}
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {},
methods: {
getSumPrice(){
let sumprice = 0
this.goodsList.forEach(e=>{
sumprice += e.number * resetNum(e.price)
})
sumprice += resetNum(this.freight)
this.sumprice = resetNum(sumprice, 'end')
this.nowprice = resetNum(sumprice, 'end')
},
openCoupon(index) {
this.setData({
couponshow: true,
couponIndex: index
});
},
hidecoupon() {
this.setData({
couponshow: false
});
},
submit() {
if (!this.address) {
this.$toast('请先选择地址')
return
}
const cartList = getCart()
const goodsIds = this.goodsList.map(v => v.id)
const newCartList = cartList.filter(v => !goodsIds.includes(v.id))
const params = {
"recipient": this.address.recipient,
"addr": this.address.detail,
"mobile": this.address.telephone,
"orderDetailList": this.goodsList.map(v => {
return {
goodsId: v.id,
goodsName: v.goodsName,
goodsNo: v.number,
price: v.price
}
}),
state: 0,
"remark": this.remark,
"totalAmount": this.sumprice,
"userId": getUserInfo().id
}
if (this.isConfirm) return
this.isConfirm = true
uni.showLoading({
mask: true
})
addOrder(params).then(res => {
uni.hideLoading()
this.isConfirm = false
if (res.result) {
this.$toast('添加成功')
resetCart(newCartList)
setTabBarBadge(newCartList.length)
//提交订单
uni.redirectTo({
url: '/pages/views/order/success'
});
}
})
},
selectMode() {
let that = this;
let list = ['物流寄送', '到店自提']
uni.showActionSheet({
itemList: list,
success: function (res) {
that.setData({
modes: list[res.tapIndex],
tapIndex: res.tapIndex
});
}
});
},
setAddress() {
uni.navigateTo({
url: '/pages/views/user/myaddress'
});
},
onReceive(item, index){ //选择优惠券
this.couponshow = false
/**
* 自定义变量 到goodsList中 用户计算合计金额与优惠券
*/
this.goodsList[this.couponIndex].couponName = '满'+item.money+'减'+item.reduce
this.goodsList[this.couponIndex].couponReduce = item.reduce //优惠券金额
this.sumprice = this.sumprice - item.reduce
},
notUsed(){ //不使用优惠券 重置金额
this.couponshow = false
this.goodsList[this.couponIndex].couponName = ''
if(this.goodsList[this.couponIndex].couponReduce){
this.sumprice = this.sumprice + Number(this.goodsList[this.couponIndex].couponReduce)
}
}
}
};
</script>
<style lang="scss" scoped>
page {
background-color: #FFFFFF;
}
.order {
padding: 20upx 4%;
}
.mode{
height: 80upx;
line-height: 80upx;
display: flex;
justify-content: space-between;
background-color: #fff;
padding: 0 20upx;
border-radius: 10upx;
align-items: center;
margin-bottom: 20upx;
box-shadow: 0upx 0upx 10upx #ddd;
}
.mode:active{
background-color: #f5f5f5;
}
.mode .text1{
color: #999;
font-size: 24upx;
}
.mode .text2{
font-size: 24upx;
color: #333;
display: block;
width: 50%;
font-weight: bold;
}
.mode image{
width: 40upx;
height: 40upx;
display: block;
}
.order_address {
height: 150upx;
width: 100%;
background-color: #fff;
border-radius: 10upx;
overflow: hidden;
position: relative;
box-shadow: 0upx 0upx 10upx #ddd;
}
.order_address image {
width: 100%;
height: 100%;
display: block;
position: absolute;
top: 0;
left: 0;
z-index: 10;
}
.address_box {
width: 100%;
height: 100%;
display: block;
position: absolute;
top: 0;
left: 0;
z-index: 10;
box-sizing: border-box;
padding: 20upx;
display: flex;
align-items: center;
}
.weizhi_icon text {
font-size: 40upx;
margin-left: 10upx;
}
.address_box .center {
margin-left: 20upx;
}
.address_box .center .name {
height: 60upx;
line-height: 60upx;
}
.address_box .center .name .text1 {
font-size: 26upx;
font-weight: bold;
color: #333;
display: inline-block;
margin-right: 20upx;
}
.phones {
font-size: 24upx;
color: #999;
z-index: 0;
}
.address_box .address_name {
font-size: 26upx;
font-weight: bold;
color: #333;
}
.noaddress {
margin-left: 40upx;
font-weight: bold;
color: #333;
font-size: 26upx;
}
.goods {
background-color: #fff;
margin-top: 20upx;
box-shadow: 0upx 0upx 10upx #ddd;
border-radius: 10upx;
padding: 20upx;
padding-bottom: 10upx;
}
.goods_data {
width: 100%;
display: flex;
margin-bottom: 15upx;
}
.goods_data image {
min-width: 150upx;
max-width: 150upx;
height: 150upx;
display: block;
border-radius: 10upx;
}
.goods_title {
margin-left: 20upx;
line-height: 40upx;
width: 100%;
}
.goods_title .price{
width: 100%;
display: flex;
height: 40upx;
line-height: 40upx;
margin-top: 20upx;
position: relative;
}
.goods_title .price .t1{
font-size: 30upx;
font-weight: bold;
display: block;
}
.goods_title .price .t2{
font-size: 24upx;
margin-left: 15upx;
display: block;
color: #999;
text-decoration: line-through;
}
.goods_title .price .t3{
float: right;
font-weight: bold;
font-size: 28upx;
color: #999;
position: absolute;
right: 0upx;
top: 0;
}
.goods_title .g_name {
font-size: 26upx;
font-weight: bold;
max-height: 80upx;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.goods_title .goods_sku{
color: #999;
/* margin-top: 20upx; */
}
.numbers{
/* text-align: right; */
}
.shop{
margin-top: 20upx;
font-size: 24upx;
color: #333;
display: flex;
align-content: center;
}
.shop .iconfont{
margin-right: 20upx;
}
.order_more{
padding: 0 2%;
margin-top: 20upx;
}
.morelist{
height: 80upx;
line-height: 80upx;
display: flex;
justify-content: space-between;
border-bottom: 1upx dashed #eee;
}
.morelist .title{
color: #333;
font-size: 26upx;
font-weight: bold;
display: flex;
align-items: center;
}
.morelist .title .quan{
font-size: 20upx;
width: 35upx;
height: 35upx;
line-height: 36upx;
text-align: center;
border-radius: 8upx;
margin-right: 10upx;
align-items: center;
color: #fff;
}
.morelist .right_title{
color: #999;
}
.tips{
padding: 10upx 0;
margin-bottom: 120upx;
}
.tips .tips_name{
font-size: 26upx;
font-weight: bold;
line-height: 60upx;
}
.textarea_box{
min-height: 100upx;
width: 100%;
border: 1upx solid #eee;
border-radius: 10upx;
padding: 20upx;
}
.textarea_box textarea{
font-size: 24upx;
height: 150upx;
}
.bottom_btn{
height: 100upx;
width: 100vw;
background-color: #fff;
position: fixed;
left: 0;
bottom: 0;
line-height: 100upx;
display: flex;
justify-content: flex-end;
padding: 0 30upx;
z-index: 100;
font-weight: bold;
}
.bottom_btn .moneys{
font-size: 28upx;
font-weight: bold;
margin-right: 100upx;
}
.bottom_btn .btns{
font-size: 28upx;
color: #fff;
height: 60upx;
line-height: 60upx;
padding: 0 25upx;
text-align: center;
border-radius: 40upx;
margin-top: 20upx;
font-weight: bold;
}
/* 优惠券 */
.coupon{
background-color: #fff;
border-radius: 10upx 10upx 0 0;
position: fixed;
left: 0;
bottom: -1000upx;
z-index: 150;
transition: all 0.3s;
}
.coupon .buyong{
line-height: 80upx;
padding: 0 4%;
text-align: right;
color: #999;
}
.mask{
width: 100%;
height: 100%;
position: fixed;
top: 0;
left: 0;
background: #000;
z-index: 10;
opacity: 0.7;
}
.scrolls{
width: 100vw;
height: 55vh;
z-index: 500;
}
</style>