web-africa-h5/pages/cart/cart.vue

596 lines
15 KiB
Vue

<template>
<view v-if="isInit" class="pb200">
<view class="top-type f30" v-if="typeList.length > 0">
<view class="d-s-c">
<view
class="radio-check d-c-c"
:class="{ checked: checkedAll }"
@click="checkedAllFunc()"
><u-icon name="checkbox-mark" color="#fff" size="26rpx"></u-icon
></view>
<view class="gray3">{{ $t("MY_ORD_2") }}</view>
</view>
<picker :range="typeList" range-key="specialAreaVal" @change="changeType">
<view class="gray9" v-if="typeList[typeIndex]">
{{ typeList[typeIndex].specialAreaVal }}
<text class="icon iconfont icon-jiantou"></text>
</view>
</picker>
</view>
<view class="cart-list" v-if="listData && listData.length > 0">
<view class="cart-item" v-for="(item, index) in listData" :key="index">
<view
class="radio-check d-c-c"
:class="{ checked: item.checked }"
@click="checkedFunc(index)"
>
<u-icon name="checkbox-mark" color="#fff" size="26rpx"></u-icon>
</view>
<view class="order-product">
<view class="product-item">
<view class="d-b-s mb20">
<image class="product-img" :src="item.cover1" mode=""></image>
<view class="product-info d-c d-b-s flex-1">
<view class="text-ellipsis-2 f28 gray3">{{
item.waresName
}}</view>
<view class="price-color f24">
{{ currencyIcon() }}
<text class="f32 fb">{{ formatNum(item.waresPrice) }}</text>
</view>
</view>
<!-- <view class="f24 gray9 ml20">X{{ item.number }}</view> -->
</view>
<view class="gray9 mb10 f24" v-if="specialAreas != 30"
>{{ $t("ENU_TOTAL_V_1") }}:{{ formatNum(item.achieve) }}</view
>
<view class="secend-product">
<view
:class="{ mb20: pindex != item.productParams.length - 1 }"
class="d-b-s"
v-for="(pitem, pindex) in item.productParams"
:key="pindex"
>
<view class="d-s-c">
<image
:src="pitem.cover"
mode=""
class="s-product-img f-s-0"
></image>
<view class="f28">
{{ pitem.productName }}
<text class="ml20">{{
pitem.waresItemsParamsList[0].specsName
}}</text>
</view>
</view>
<view class="f24 gray9 ml20"
>X{{ pitem.waresItemsParamsList[0].quantity }}</view
>
</view>
<view
:class="{ mb20: windex != item.waresSkuList.length - 1 }"
class="d-b-s"
v-for="(witem, windex) in item.waresSkuList"
:key="windex"
>
<view class="d-s-c">
<image
:src="witem.image"
mode=""
class="s-product-img f-s-0"
></image>
<view class="f28">
{{ witem.productName }}
<text class="ml20">{{ witem.specValueNames }}</text>
</view>
</view>
</view>
</view>
<view class="d-b-c mt20">
<view class="counter-box">
<view
class="d-c-c counter-add"
@click="plusReduceShopping(item, 'reduce', index)"
><u-icon name="minus" size="26rpx" color="#666"></u-icon
></view>
<view class="counter-num">{{ item.number }}</view>
<view
class="d-c-c counter-add"
@click="plusReduceShopping(item, 'add', index)"
><u-icon name="plus" size="26rpx" color="#666"></u-icon
></view>
</view>
<u-icon
@click="deleteCart(item, index)"
width="34rpx"
height="36rpx"
name="/static/icon/product/cart-delete.png"
></u-icon>
</view>
</view>
</view>
</view>
</view>
<view class="cart-null-box" v-else
><image class="cart-null" src="/static/bg/cart-null.png" mode=""></image
></view>
<!--底部按钮-->
<view class="bottom-btns d-e-c f28" v-if="listData.length > 0">
<view class="total d-s-c flex-1 mr20">
<view class="cart-img">
<image src="/static/icon/cart-cart.png" mode=""></image>
<!-- <view class="cart-num">10</view> -->
</view>
<view>
<view class="price f32">
{{ currencyIcon() }}
<text class="num f38 fb">{{ formatNum(cartMoney) }}</text>
</view>
<view class="f24 gray3" v-if="specialAreas != 30"
>{{ $t("ENU_TOTAL_V_1") }}:{{ formatNum(cartAchieve) }}</view
>
</view>
</view>
<button
:disabled="payClock()"
type="primary"
class="buy-btn theme-btn"
@click="toPay()"
>
{{ $t("w_0312") }}
</button>
</view>
</view>
</template>
<script>
export default {
data() {
return {
isInit: false,
typeList: [],
typeIndex: 0,
listData: [],
addLock: false,
specialAreas: "",
};
},
onShow() {
this.typeIndex = 0;
this.getType();
this.getCartNum();
},
computed: {
cartMoney: function () {
let self = this;
let price = 0;
self.listData.forEach((item) => {
if (item.checked) {
price += item.waresPrice * 1 * item.number;
}
});
return price.toFixed(2);
},
cartAchieve: function () {
let self = this;
let achieve = 0;
self.listData.forEach((item) => {
if (item.checked) {
achieve += item.achieve * 1 * item.number;
}
});
return achieve.toFixed(2);
},
checkedAll: function () {
let self = this;
let flag = true;
if (self.listData) {
self.listData.forEach((item, index) => {
if (!item.checked) {
flag = false;
return;
}
});
} else {
flag = false;
}
return flag;
},
},
methods: {
checkedAllFunc() {
let self = this;
self.listData.forEach((item, index) => {
self.checkedFunc(index);
});
},
payClock() {
let self = this;
let n = true;
if (self.listData && self.listData.length > 0) {
self.listData.forEach((item) => {
if (item.checked) {
n = false;
return;
}
});
}
console.log(n);
return n;
},
getCartNum() {
let self = this;
self._get(
"sale/api/shopping/getShoppingCount",
{
specialArea: "",
pkCountry: "",
},
(res) => {
uni.setTabBarBadge({
index: 2,
text: res.data.cont + "",
});
}
);
},
checkresorder(deleteList, callback) {
let self = this;
let params = {
specialArea: self.typeList[self.typeIndex].specialArea,
deleteList: deleteList,
};
callback();
// self._post('/sale/api/order/valid-enough-shop', params, res => {
// if (res.code != 500) {
// callback();
// }
// });
},
toPay() {
let self = this;
let arr = [];
self.listData.forEach((item) => {
if (item.checked) {
arr.push(item.shoppingId);
}
});
let callback = function () {
uni.setStorageSync("cartinfo", arr);
self.gotoPage(
"/pages/prefecture/confirm-order?specialArea=" +
self.typeList[self.typeIndex].specialArea
);
};
if (
self.typeList[self.typeIndex].specialArea == 1 ||
self.typeList[self.typeIndex].specialArea == 2
) {
let deleteList = [];
self.listData.forEach((item) => {
if (item.checked) {
deleteList.push({
shoppingId: item.shoppingId,
});
}
});
self.checkresorder(deleteList, callback);
return;
}
if (self.typeList[self.typeIndex].specialArea == 21) {
arr = [];
self.listData.forEach((item) => {
if (item.checked) {
arr.push({
pkTWares: item.waresSkuList[0].pkTWares,
pkTWaresSku: item.waresSkuList[0].pkThWaresSku,
quantity: item.number,
shoppingId: item.shoppingId,
source: 2,
});
}
});
// self.listData.forEach(item => {
// })
}
callback();
},
checkedFunc(n) {
let item = this.listData[n];
if (item.checked) {
this.$set(this.listData[n], "checked", false);
} else {
this.$set(this.listData[n], "checked", true);
}
console.log(item.checked);
},
changeType(e) {
this.typeIndex = e.detail.value;
this.getData();
},
getData() {
let self = this;
// self.isInit = false;
console.log(self.typeList);
console.log(self.typeIndex);
let specialArea = self.typeList[self.typeIndex].specialArea;
self._get(
"sale/api/shopping/getShopping",
{
specialArea: specialArea,
},
(res) => {
if (self.typeList && self.typeList.length > 0) {
res.data[0].shoppingCartList.forEach((item) => {
if (!item.checked) {
item.checked = false;
}
});
self.listData = res.data[0].shoppingCartList;
}
self.specialAreas = res.data[0].specialArea;
// self.isInit = true;
}
);
},
getType() {
let self = this;
self.isInit = false;
self._get("sale/api/shopping/getShopping", {}, (res) => {
self.typeList = res.data;
if (self.typeList && self.typeList.length > 0) {
self.listData = self.typeList[0].shoppingCartList;
}
self.specialAreas = res.data[0].specialArea;
self.isInit = true;
});
},
deleteCart(e, n) {
let self = this;
if (self.addLock) {
return;
}
self.addLock = true;
self._post(
"sale/api/shopping/batchDelShopping",
{
deleteList: [
{
shoppingId: e.shoppingId,
},
],
},
(res) => {
uni.showToast({
title: self.$t("fn_056"),
icon: "none",
success() {
self.listData.splice(n, 1);
},
});
},
false,
() => {
self.addLock = false;
}
);
},
plusReduceShopping(e, type, n) {
let self = this;
if (self.addLock) {
return;
}
self.addLock = true;
let num = e.number;
if (type == "add") {
num++;
}
if (type == "reduce") {
num--;
if (num <= 0) {
num = 1;
}
}
let specialArea = self.typeList[self.typeIndex].specialArea;
self._post(
"sale/api/shopping/plusReduceShopping",
{
number: num,
shoppingId: e.shoppingId,
specialArea: specialArea,
},
(res) => {
self.getCartNum();
uni.showToast({
title: self.$t("fn_056"),
icon: "none",
success() {
self.$set(self.listData[n], "number", num);
// self.getData();
},
});
},
false,
() => {
self.addLock = false;
}
);
},
},
};
</script>
<style lang="scss">
.f-s-0 {
flex-shrink: 0;
}
.top-type {
margin-top: 20rpx;
width: 750rpx;
height: 112rpx;
background: #ffffff;
box-sizing: border-box;
padding: 0 24rpx;
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1rpx solid #eeeeee;
}
.radio-check {
width: 34rpx;
height: 34rpx;
background: #ffffff;
border: 1rpx solid #dddddd;
border-radius: 50%;
box-sizing: border;
position: relative;
margin-right: 20rpx;
flex-shrink: 0;
}
.radio-check.checked {
border: 1rpx solid #fb3024;
background: #fb3024;
}
.cart-null {
width: 348rpx;
height: 218rpx;
margin: 0 auto;
margin-top: 180rpx;
}
.icon-jiantou.icon {
font-size: 32rpx;
color: #999;
margin-left: 16rpx;
}
.cart-list {
background: #ffffff;
}
.cart-item {
background: #ffffff;
padding: 30rpx 20rpx 30rpx 24rpx;
border-bottom: 1rpx solid #eee;
display: flex;
justify-content: space-between;
align-items: center;
}
.cart-item:last-child {
border: none;
}
.order-product {
.product-item {
.secend-product {
width: 648rpx;
}
}
}
.counter-box {
width: 168rpx;
height: 50rpx;
border-radius: 30rpx;
border: 1rpx solid #eeeeee;
display: flex;
justify-content: center;
align-items: center;
font-size: 26rpx;
color: #333;
}
.counter-num {
height: 50rpx;
min-width: 56rpx;
padding: 0 10rpx;
box-sizing: border-box;
border-left: 1rpx solid #eeeeee;
border-right: 1rpx solid #eeeeee;
line-height: 50rpx;
text-align: center;
}
.counter-add {
height: 50rpx;
width: 56rpx;
flex-shrink: 0;
font-size: 26rpx;
color: #666;
font-weight: bold;
}
.bottom-btns {
position: fixed;
width: 100%;
padding: 0 24rpx 0 27rpx;
box-sizing: border-box;
display: flex;
justify-content: space-between;
align-items: center;
height: 96rpx;
// /* bottom: calc(var(--window-bottom); */
bottom: var(--window-bottom, 0);
left: 0;
box-shadow: 0 -2rpx 8rpx rgba(0, 0, 0, 0.1);
background: #ffffff;
z-index: 80;
}
.bottom-btns .buy-btn {
margin: 0;
padding: 0 24rpx;
height: 67rpx;
line-height: 67rpx;
border-radius: 38rpx;
// background: linear-gradient(90deg, #FF6B6B 4%, #F6220C 100%);
font-size: 28rpx;
flex-shrink: 0;
}
.bottom-btns .buy-btn[disabled][type="primary"] {
background-color: rgba(#fb3024, 0.6);
}
.bottom-btns .price {
color: $dominant-color;
}
.cart-img {
width: 50rpx;
height: 50rpx;
position: relative;
margin-right: 18rpx;
image {
width: 50rpx;
height: 50rpx;
}
}
.cart-num {
width: 28rpx;
height: 28rpx;
background: #fb3024;
box-shadow: 0px 3rpx 7rpx 0px rgba(0, 0, 0, 0.25);
border-radius: 50%;
font-size: 22rpx;
color: #ffffff;
display: flex;
justify-content: center;
align-items: center;
position: absolute;
top: -10rpx;
right: -14rpx;
}
.radio-check {
border: 4rpx solid #000;
}
</style>