shop-applet/components/checkCoupon/index.vue

389 lines
10 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view>
<view class='coupon-list-window animated' :class='coupon.status==true?"slideInUp":""'>
<view class='title'>
<view class="item">优惠券</view>
</view>
<block v-if="couponArr.length">
<view class='coupon-list'>
<view class='item acea-row row-center-wrapper' v-for="(item,index) in couponArr" @click="getCouponUser(index,item)"
:key='index'>
<view class='money acea-row row-column row-center-wrapper'>
<view>¥<text class='num'>{{item.coupon_price}}</text></view>
<view class="pic-num">满{{item.use_min_price}}元可用</view>
</view>
<view class='text'>
<view class='condition line1'>
<span class='line-title' v-if='item.coupon.type===0'>店铺券</span>
<span class='line-title' v-else-if='item.coupon.type===1'>商品券</span>
<span>{{item.coupon_title}}</span>
</view>
<view class='data acea-row row-between-wrapper'>
<view>{{ item.start_time |timeYMD }} ~ {{ item.end_time |timeYMD}}</view>
<view class="iconfont icon-weixuanzhong" v-if="!item.checked"></view>
<view class='iconfont icon-xuanzhong1' v-else></view>
</view>
</view>
</view>
</view>
<view class="foot-box">
<view class="left">
已选择{{allNum}}张,可优惠<text>¥{{allCouponNum}}</text>
</view>
<view class="btn" @click="confirm">确定</view>
</view>
</block>
<!-- 无优惠券 -->
<view class='pictrue' v-else>
<image src='../../static/images/noCoupon.png'></image>
</view>
</view>
<view class='mask' catchtouchmove="true" :hidden='coupon.status==false' @click='close'></view>
</view>
</template>
<script>
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import {
setCouponReceive
} from '@/api/api.js';
export default {
props: {
//打开状态 0=领取优惠券,1=使用优惠券
openType: {
type: Number,
default: 0,
},
coupon: {
type: Object,
default: function() {
return {};
}
},
subCoupon: {
type: Object
}
},
filters: {
timeYMD: function(value) {
if(value){
var newDate=/\d{4}-(\d{1,2}\d{1,2}-\d{1,2}\d{1,2})/g.exec(value)
return newDate?.[1]||''
}
}
},
data() {
return {
couponArr: [],
couponData: {},
// 选中的数据存放
active: {},
allNum: 0,
allCouponNum: 0,
// 选中店铺优惠券id
use_store_coupon: 0,
// 单个店铺总价
pay_price: 0,
// 商品有优惠订单
goodsOrder: ''
};
},
mounted() {
this.couponData = this.coupon
// 深拷贝数据 不影响原来数据使用
this.couponArr = JSON.parse(JSON.stringify(this.coupon.coupon))
// 深拷贝数据 不影响原来数据使用
this.goodsOrder = JSON.parse(JSON.stringify(this.coupon.order))
let tempObj = this.active[this.couponData.mer_id] = {}
tempObj.product = []
tempObj.store = ''
this.allActive()
},
methods: {
close: function() {
this.$emit('ChangCouponsClone');
},
// 使用优惠券
getCouponUser: function(index, item) {
let self = this
// 先判断是哪个券 1商品 0店铺
if (item.coupon.type == 1) {
let order = this.goodsOrder
let orderToalPrice = 0
if (item.checked) {
/**
* 取消选中 并且删除 use_coupon_product里的值
* use_coupon_product 哪些商品可以用的券的id
* */
for (let key in order.use_coupon_product) {
if (order.use_coupon_product[key] == item.coupon_user_id) {
delete order.use_coupon_product[key]
}
}
item.checked = false
} else {
/**
* 选中
* @item.product 该优惠券可以使用的商品
* order.product_price 产品的价格 key是id
* */
for (let i = 0; i < item.product.length; i++) {
if (order.product_price[item.product[i].product_id]) {
orderToalPrice = order.product_price[item.product[i].product_id]
//价格的值大于等于最小值就可以使用
if (orderToalPrice >= parseFloat(item.use_min_price)) {
// 可以用
if (!order.use_coupon_product[item.product[i].product_id]) {
item.checked = true
order.use_coupon_product[item.product[i].product_id] = item.coupon_user_id
} else {
// 上个商品用了就取消选中,点击的这个添加选中
this.couponArr.forEach(el => {
if (el.coupon_user_id == order.use_coupon_product[item.product[i].product_id]) {
el.checked = false
}
})
item.checked = true
order.use_coupon_product[item.product[i].product_id] = item.coupon_user_id
}
break
}
}
}
}
} else {
let order = this.couponData.order
// 店铺券
if (item.checked) {
item.checked = false
// this.pay_price = order.total_price
} else {
this.couponArr.forEach(el => {
if (el.coupon.type == 0 && el.checked) {
el.checked = false
}
})
item.checked = true
}
this.pay_price = this.$util.$h.Sub(order.total_price, item.coupon_price)
}
this.allActive()
},
// 选中计算
allActive() {
let tempObj = this.active[this.couponData.mer_id]
let sotreTotal = 0 //商铺券优惠
let goodsTotal = 0 //商品券优惠
tempObj.product = []
tempObj.store = ''
this.couponArr.forEach(el => {
/**
* @el.coupon.type 0店铺 1商品
*/
if (el.coupon.type == 0 && el.checked) {
tempObj.store = el.coupon_user_id
sotreTotal = el.coupon_price
this.use_store_coupon = el.coupon_user_id
}
if (el.coupon.type == 1 && el.checked) {
tempObj.product.push(el.coupon_user_id)
goodsTotal = this.$util.$h.Add(goodsTotal, el.coupon_price)
}
})
if (tempObj.store) {
this.allNum = this.$util.$h.Add(tempObj.product.length, 1)
} else {
this.allNum = tempObj.product.length
}
let tempAllCouponNum = this.$util.$h.Add(sotreTotal, goodsTotal)
if (parseFloat(tempAllCouponNum) >= parseFloat(this.couponData.order.total_price)) {
this.allCouponNum = this.couponData.order.total_price
} else {
if(this.allNum !== 0 ){
if(sotreTotal || goodsTotal){
this.allCouponNum = tempAllCouponNum
}else{
this.allCouponNum = this.couponData.order.total_price
}
}else{
this.allCouponNum = tempAllCouponNum
}
}
},
// 确认
confirm() {
// 商品类
this.couponData.order = this.goodsOrder
// 店铺类
// 支付价格
let tempTotal = 0
tempTotal = this.$util.$h.Sub(this.couponData.order.total_price, this.allCouponNum)
if (tempTotal > 0) {
this.couponData.order.pay_price = this.$util.$h.Add(tempTotal, this.couponData.order.postage_price)
} else {
// 如果没有用优惠券
if(this.allNum == 0){
this.couponData.order.pay_price = this.$util.$h.Add(this.couponData.order.total_price, this.couponData.order.postage_price)
}else{
this.couponData.order.pay_price = this.couponData.order.postage_price
}
}
// 列表的优惠总金额
this.couponData.order.coupon_price = this.allCouponNum
this.couponData.order.use_store_coupon = this.use_store_coupon
this.couponData.coupon = this.couponArr
this.active[this.coupon.mer_id].product = this.goodsOrder.use_coupon_product
this.subCoupon[this.coupon.mer_id] = this.active[this.coupon.mer_id]
this.$emit('ChangCoupons',this.couponData);
}
}
}
</script>
<style scoped lang="scss">
.animated {
animation-duration: .3s
}
.title {
display: flex;
.item {
position: relative;
flex: 1;
font-size: 28rpx;
color: #999999;
&::after {
content: ' ';
position: absolute;
left: 50%;
bottom: 18rpx;
width: 50rpx;
height: 5rpx;
background: transparent;
border-radius: 3px;
transform: translateX(-50%);
}
&.on {
color: #282828;
&::after {
background: $theme-color;
}
}
}
}
.coupon-list {
padding: 30rpx;
.item {
box-shadow: 0px 2px 10px 0px rgba(0, 0, 0, 0.06);
}
}
.coupon-list-window {
position: fixed;
bottom: 0;
left: 0;
width: 100%;
background-color: #fff;
border-radius: 16rpx 16rpx 0 0;
z-index: 555;
transform: translate3d(0, 100%, 0);
transition: all .3s cubic-bezier(.25, .5, .5, .9);
}
.coupon-list-window.on {
animation: aminup;
}
.coupon-list-window .title {
height: 106rpx;
width: 100%;
text-align: center;
line-height: 106rpx;
font-size: 32rpx;
font-weight: bold;
position: relative;
border: 1px solid #f5f5f5;
}
.coupon-list-window .title .iconfont {
position: absolute;
right: 30rpx;
top: 50%;
transform: translateY(-50%);
font-size: 35rpx;
color: #8a8a8a;
font-weight: normal;
}
.coupon-list-window .coupon-list {
margin: 0 0 0rpx 0;
height: 550rpx;
overflow: auto;
}
.coupon-list-window .pictrue {
width: 414rpx;
height: 336rpx;
margin: 0 auto 50rpx auto;
}
.coupon-list-window .pictrue image {
width: 100%;
height: 100%;
}
.pic-num {
color: #fff;
font-size: 24rpx;
}
.line-title {
width: 90rpx;
padding: 0 10rpx;
box-sizing: border-box;
background: rgba(255, 247, 247, 1);
border: 1px solid rgba(232, 51, 35, 1);
opacity: 1;
border-radius: 20rpx;
font-size: 20rpx;
color: #E83323;
margin-right: 12rpx;
}
.line-title.gray {
border-color: #BBB;
color: #bbb;
background-color: #F5F5F5;
}
.foot-box {
display: flex;
align-items: center;
justify-content: space-between;
height: 100rpx;
padding: 0 30rpx;
border-top: 1px solid #F5F5F5;
.btn {
width: 240rpx;
height: 70rpx;
line-height: 70rpx;
text-align: center;
background: $theme-color;
border-radius: 35rpx;
color: #fff;
font-size: 30rpx;
}
.left {
text {
color: $theme-color;
}
}
}
.coupon-list .item .text .data .iconfont {
font-size: 36rpx;
&.icon-weixuanzhong {
color: #BFBFBF;
}
&.icon-xuanzhong1 {
color: $theme-color;
}
}
</style>