599 lines
15 KiB
JavaScript
599 lines
15 KiB
JavaScript
export default {
|
||
data() {
|
||
return {
|
||
cartData: [], // 购物车
|
||
checkAll: true,
|
||
totalPrice: '0.00',
|
||
totalCount: 0,
|
||
isSub: false,
|
||
invalidGoods: [], // 失效商品集合
|
||
isIphoneX: false, //判断手机是否是iphoneX以上,
|
||
isAction: false, // 是否操作删除
|
||
goodsSkuDetail: null,
|
||
discount: {},
|
||
manjian: {},
|
||
receiveSub: false,
|
||
discountPopupShow: false,
|
||
startX: '', // 触摸开始位置
|
||
endX: '', // 触摸结束位置
|
||
refresherTriggered: false, // 设置当前下拉刷新状态,true 表示下拉刷新已经被触发,false 表示下拉刷新未被触发
|
||
timeout: {}
|
||
};
|
||
},
|
||
onLoad() {
|
||
uni.hideTabBar();
|
||
this.isIphoneX = this.$util.uniappIsIPhoneX();
|
||
},
|
||
onShow() {
|
||
if (this.storeToken) {
|
||
this.getCartData();
|
||
} else {
|
||
this.cartData = [];
|
||
this.invalidGoods = [];
|
||
this.calculationTotalPrice();
|
||
}
|
||
},
|
||
onHide() {
|
||
this.isAction = false;
|
||
},
|
||
onUnload() {
|
||
if (!this.storeToken && this.$refs.login) this.$refs.login.cancelCompleteInfo();
|
||
},
|
||
onReady() {
|
||
if (!this.storeToken) {
|
||
if (this.$refs.loadingCover) this.$refs.loadingCover.hide();
|
||
}
|
||
},
|
||
computed: {
|
||
hasData() {
|
||
return this.cartData.length > 0 || this.invalidGoods.length > 0;
|
||
}
|
||
},
|
||
methods: {
|
||
initNum(item) {
|
||
let max_buy = item.max_buy > 0 && item.max_buy < item.stock ? item.max_buy : item.stock;
|
||
max_buy = max_buy == 0 ? 1 : max_buy;
|
||
if (item.num > max_buy) return max_buy;
|
||
return item.num;
|
||
},
|
||
/**
|
||
* 获取购物车数据
|
||
*/
|
||
getCartData() {
|
||
this.$api.sendRequest({
|
||
url: '/api/cart/goodslists',
|
||
success: res => {
|
||
if (res.code >= 0) {
|
||
if (res.data.length) this.handleCartData(res.data);
|
||
else this.cartData = [];
|
||
}
|
||
this.refresherTriggered = false;
|
||
if (this.$refs.loadingCover) this.$refs.loadingCover.hide();
|
||
},
|
||
fail: res => {
|
||
if (this.$refs.loadingCover) this.$refs.loadingCover.hide();
|
||
}
|
||
});
|
||
},
|
||
/**
|
||
* 处理购物车数据结构
|
||
*/
|
||
handleCartData(data) {
|
||
this.invalidGoods = [];
|
||
this.cartData = [];
|
||
var temp = {};
|
||
data.forEach((item, index) => {
|
||
if (item.goods_state == 1) {
|
||
if (item.store_goods_status != undefined && item.store_goods_status != 1) {
|
||
this.invalidGoods.push(item);
|
||
} else if (item.min_buy > 0 && item.min_buy > item.stock) {
|
||
// 如果最小限购超出库存则该商品失效
|
||
this.invalidGoods.push(item);
|
||
} else {
|
||
item.checked = true;
|
||
item.edit = false;
|
||
if (temp['site_' + item.site_id] != undefined) {
|
||
temp['site_' + item.site_id].cartList.push(item);
|
||
} else {
|
||
temp['site_' + item.site_id] = {
|
||
siteId: item.site_id,
|
||
siteName: item.site_name,
|
||
edit: false,
|
||
checked: true,
|
||
cartList: [item]
|
||
};
|
||
}
|
||
}
|
||
} else {
|
||
this.invalidGoods.push(item);
|
||
}
|
||
});
|
||
|
||
this.cartData = [];
|
||
Object.keys(temp).forEach(key => {
|
||
this.cartData.push(temp[key]);
|
||
});
|
||
this.calculationTotalPrice();
|
||
if (this.cartData.length) {
|
||
this.cartData[0].cartList.forEach(v => {
|
||
if (v.sku_spec_format) {
|
||
v.sku_spec_format = JSON.parse(v.sku_spec_format);
|
||
} else {
|
||
v.sku_spec_format = [];
|
||
}
|
||
});
|
||
}
|
||
if (this.invalidGoods.length) {
|
||
this.invalidGoods.forEach(v => {
|
||
if (v.sku_spec_format) {
|
||
v.sku_spec_format = JSON.parse(v.sku_spec_format);
|
||
} else {
|
||
v.sku_spec_format = [];
|
||
}
|
||
});
|
||
}
|
||
},
|
||
/**
|
||
* 单选
|
||
* @param siteIndex
|
||
* @param index
|
||
*/
|
||
singleElection(siteIndex, index) {
|
||
this.cartData[siteIndex].cartList[index].checked = !this.cartData[siteIndex].cartList[index].checked;
|
||
this.calculationTotalPrice();
|
||
},
|
||
/**
|
||
* 店铺全选
|
||
* @param checked
|
||
* @param index
|
||
*/
|
||
siteAllElection(checked, index) {
|
||
this.cartData[index].checked = checked;
|
||
this.cartData[index].cartList.forEach(item => {
|
||
item.checked = checked;
|
||
});
|
||
this.calculationTotalPrice();
|
||
},
|
||
/**
|
||
* 全选
|
||
*/
|
||
allElection(checked) {
|
||
if (typeof checked == 'boolean') {
|
||
this.checkAll = checked;
|
||
} else {
|
||
this.checkAll = !this.checkAll;
|
||
}
|
||
if (this.cartData.length) {
|
||
this.cartData.forEach(siteItem => {
|
||
siteItem.checked = this.checkAll;
|
||
siteItem.cartList.forEach(item => {
|
||
item.checked = this.checkAll;
|
||
});
|
||
});
|
||
}
|
||
this.calculationTotalPrice();
|
||
},
|
||
/**
|
||
* 计算购物车总价
|
||
*/
|
||
calculationTotalPrice() {
|
||
if (this.cartData.length) {
|
||
let totalPrice = 0,
|
||
totalCount = 0,
|
||
siteAllElectionCount = 0;
|
||
|
||
this.cartData.forEach(siteItem => {
|
||
let siteGoodsCount = 0;
|
||
siteItem.cartList.forEach(item => {
|
||
if (item.checked) {
|
||
siteGoodsCount += 1;
|
||
totalCount += parseInt(item.num);
|
||
if (Number(item.member_price) > 0 && Number(item.member_price) < Number(item.discount_price)) {
|
||
totalPrice += item.member_price * item.num;
|
||
} else {
|
||
totalPrice += item.discount_price * item.num;
|
||
}
|
||
}
|
||
});
|
||
if (siteItem.cartList.length == siteGoodsCount) {
|
||
siteItem.checked = true;
|
||
siteAllElectionCount += 1;
|
||
} else {
|
||
siteItem.checked = false;
|
||
}
|
||
});
|
||
this.totalPrice = totalPrice.toFixed(2);
|
||
this.totalCount = totalCount;
|
||
this.checkAll = this.cartData.length == siteAllElectionCount;
|
||
} else {
|
||
this.totalPrice = '0.00';
|
||
this.totalCount = 0;
|
||
}
|
||
this.discountCalculate();
|
||
},
|
||
/**
|
||
* 删除购物车
|
||
* @param tag
|
||
* @param siteIndex
|
||
* @param cartIndex
|
||
*/
|
||
deleteCart(tag, siteIndex, cartIndex) {
|
||
var cart_id = [];
|
||
if (tag == 'all') {
|
||
for (let i = 0; i < this.cartData.length; i++) {
|
||
for (let j = 0; j < this.cartData[i].cartList.length; j++) {
|
||
if (this.cartData[i].cartList[j].checked) cart_id.push(this.cartData[i].cartList[j].cart_id);
|
||
}
|
||
}
|
||
} else {
|
||
cart_id.push(this.cartData[siteIndex].cartList[cartIndex].cart_id);
|
||
}
|
||
if (cart_id.length == 0) {
|
||
this.$util.showToast({
|
||
title: '请选择要删除的商品'
|
||
});
|
||
return;
|
||
}
|
||
|
||
uni.showModal({
|
||
title: '提示',
|
||
content: cart_id.length > 1 ? '确定要删除这些商品吗?' : '确定要删除该商品吗?',
|
||
success: res => {
|
||
if (res.confirm) {
|
||
cart_id = cart_id.toString();
|
||
|
||
this.$api.sendRequest({
|
||
url: '/api/cart/delete',
|
||
data: {
|
||
cart_id
|
||
},
|
||
success: res => {
|
||
if (res.code >= 0) {
|
||
|
||
if (tag == 'all') {
|
||
// 全选
|
||
for (var i = 0; i < this.cartData.length; i++) {
|
||
for (var j = 0; j < this.cartData[i].cartList.length; j++) {
|
||
var item = this.cartData[i].cartList[j];
|
||
if (item.checked) {
|
||
this.cartData[i].cartList.splice(j, 1);
|
||
j = -1;
|
||
}
|
||
}
|
||
if (this.cartData[i].cartList.length == 0) {
|
||
this.cartData.splice(i, 1);
|
||
i = -1;
|
||
}
|
||
}
|
||
|
||
this.$store.dispatch('emptyCart');
|
||
} else {
|
||
let item = this.cartData[siteIndex].cartList;
|
||
let goods_id = item[cartIndex].goods_id;
|
||
let sku_id = item[cartIndex].sku_id;
|
||
|
||
delete this.cartList['goods_' + goods_id]['sku_' + sku_id];
|
||
if (Object.keys(this.cartList['goods_' + goods_id]).length == 2) {
|
||
delete this.cartList['goods_' + goods_id];
|
||
}
|
||
this.$store.dispatch('cartCalculate');
|
||
|
||
item.splice(cartIndex, 1);
|
||
if (item.length == 0) this.cartData.splice(siteIndex, 1);
|
||
|
||
}
|
||
|
||
this.resetEditStatus();
|
||
this.calculationTotalPrice();
|
||
} else {
|
||
this.$util.showToast({
|
||
title: res.message
|
||
});
|
||
}
|
||
}
|
||
});
|
||
}
|
||
}
|
||
});
|
||
},
|
||
/**
|
||
* 变更购物车数量
|
||
* @param {Object} params
|
||
*/
|
||
cartNumChange(num, params) {
|
||
if (isNaN(num)) return;
|
||
let data = this.cartData[params.siteIndex].cartList[params.cartIndex],
|
||
max_buy = data.is_limit && data.max_buy > 0 && data.max_buy < data.stock ? data.max_buy : data.stock,
|
||
min_buy = data.min_buy > 0 ? data.min_buy : 1;
|
||
if (num > max_buy) num = max_buy;
|
||
if (num < min_buy) num = min_buy;
|
||
|
||
let cartId = this.cartData[params.siteIndex].cartList[params.cartIndex].cart_id
|
||
|
||
if (this.timeout[cartId]) clearTimeout(this.timeout[cartId])
|
||
|
||
this.timeout[cartId] = setTimeout(() => {
|
||
this.$api.sendRequest({
|
||
url: '/api/cart/edit',
|
||
data: {
|
||
num,
|
||
cart_id: cartId
|
||
},
|
||
success: res => {
|
||
if (res.code >= 0) {
|
||
let item = this.cartData[params.siteIndex].cartList[params.cartIndex];
|
||
let goods_id = item.goods_id;
|
||
let sku_id = item.sku_id;
|
||
item.num = num;
|
||
|
||
this.cartList['goods_' + goods_id]['sku_' + sku_id].num = num;
|
||
this.$store.dispatch('cartCalculate');
|
||
this.resetEditStatus();
|
||
|
||
this.calculationTotalPrice();
|
||
} else {
|
||
this.$util.showToast({
|
||
title: res.message
|
||
});
|
||
}
|
||
}
|
||
});
|
||
}, 800)
|
||
},
|
||
/**
|
||
* 结算
|
||
*/
|
||
settlement() {
|
||
if (this.totalCount > 0) {
|
||
let cart_ids = [];
|
||
this.cartData.forEach(siteItem => {
|
||
siteItem.cartList.forEach(item => {
|
||
if (item.checked) {
|
||
cart_ids.push(item.cart_id);
|
||
}
|
||
});
|
||
});
|
||
|
||
if (this.discount.coupon_info && this.discount.coupon_info.receive_type == 'wait') this.receiveCoupon(
|
||
this.discount.coupon_info.coupon_type_id, false);
|
||
|
||
if (this.isSub) return;
|
||
this.isSub = true;
|
||
|
||
uni.removeStorageSync('delivery');
|
||
uni.setStorage({
|
||
key: 'orderCreateData',
|
||
data: {
|
||
cart_ids: cart_ids.toString()
|
||
},
|
||
success: () => {
|
||
this.$util.redirectTo('/pages/order/payment');
|
||
this.isSub = false;
|
||
}
|
||
});
|
||
}
|
||
},
|
||
/**
|
||
* 清空失效商品
|
||
*/
|
||
clearInvalidGoods() {
|
||
uni.showModal({
|
||
title: '提示',
|
||
content: '确定要清空这些商品吗?',
|
||
success: res => {
|
||
if (res.confirm) {
|
||
var cart_ids = [];
|
||
this.invalidGoods.forEach(goodsItem => {
|
||
cart_ids.push(goodsItem.cart_id);
|
||
});
|
||
if (cart_ids.length) {
|
||
this.$api.sendRequest({
|
||
url: '/api/cart/delete',
|
||
data: {
|
||
cart_id: cart_ids.toString()
|
||
},
|
||
success: res => {
|
||
if (res.code >= 0) {
|
||
this.invalidGoods = [];
|
||
this.refreshCartNumber();
|
||
} else {
|
||
this.$util.showToast({
|
||
title: res.message
|
||
});
|
||
}
|
||
}
|
||
});
|
||
}
|
||
}
|
||
}
|
||
});
|
||
},
|
||
imageError(siteIndex, cartIndex) {
|
||
this.cartData[siteIndex].cartList[cartIndex].sku_image = this.$util.getDefaultImage().goods;
|
||
this.$forceUpdate();
|
||
},
|
||
toGoodsDetail(item) {
|
||
this.$util.redirectTo('/pages/goods/detail', {
|
||
sku_id: item.sku_id
|
||
});
|
||
},
|
||
// 购物车数量
|
||
refreshCartNumber() {
|
||
if (this.storeToken) {
|
||
this.$store.dispatch('getCartNumber');
|
||
this.resetEditStatus();
|
||
}
|
||
},
|
||
goodsLimit(event, params) {
|
||
let data = this.cartData[params.siteIndex].cartList[params.cartIndex];
|
||
if (event.type == 'plus') {
|
||
if (data.max_buy > 0 && data.max_buy < data.stock) {
|
||
this.$util.showToast({
|
||
title: '该商品每人限购' + data.max_buy + '件'
|
||
});
|
||
} else {
|
||
this.$util.showToast({
|
||
title: '库存不足'
|
||
});
|
||
}
|
||
} else {
|
||
// 数量减至最少时,则删除商品
|
||
this.deleteCart('single', params.siteIndex, params.cartIndex);
|
||
// this.$util.showToast({
|
||
// title: '最少购买' + event.value + '件'
|
||
// });
|
||
}
|
||
},
|
||
toLogin() {
|
||
this.$refs.login.open();
|
||
},
|
||
// 重置编辑状态
|
||
resetEditStatus() {
|
||
if (this.cartData.length) {
|
||
for (var i = 0; i < this.cartData[0].cartList.length; i++) {
|
||
this.cartData[0].cartList[i].edit = false;
|
||
}
|
||
this.$forceUpdate();
|
||
}
|
||
},
|
||
changeAction() {
|
||
this.isAction = !this.isAction;
|
||
this.resetEditStatus();
|
||
},
|
||
selectSku(data) {
|
||
let goodsSkuDetail = this.$util.deepClone(data);
|
||
if (goodsSkuDetail.goods_spec_format) goodsSkuDetail.goods_spec_format = JSON.parse(goodsSkuDetail.goods_spec_format);
|
||
this.goodsSkuDetail = goodsSkuDetail;
|
||
|
||
this.$nextTick(() => {
|
||
this.$refs.selectSku.show('confirm', (sku_id, num) => {
|
||
this.$api.sendRequest({
|
||
url: '/api/cart/editcartsku',
|
||
data: {
|
||
cart_id: data.cart_id,
|
||
sku_id: sku_id,
|
||
num: num
|
||
},
|
||
success: res => {
|
||
if (res.code >= 0) {
|
||
this.invalidGoods = [];
|
||
this.getCartData();
|
||
this.refreshCartNumber();
|
||
} else {
|
||
this.$util.showToast({
|
||
title: res.message
|
||
});
|
||
}
|
||
}
|
||
});
|
||
}, this.goodsSkuDetail);
|
||
})
|
||
},
|
||
toggleDiscountPopup() {
|
||
if (this.$refs.discountPopup.showPopup) this.$refs.discountPopup.close();
|
||
else this.$refs.discountPopup.open();
|
||
this.discountPopupShow = !this.discountPopupShow;
|
||
},
|
||
/**
|
||
* 优惠信息计算
|
||
*/
|
||
discountCalculate() {
|
||
if (this.cartData.length == 0) return;
|
||
let skuIds = [];
|
||
this.cartData.forEach(siteItem => {
|
||
siteItem.cartList.forEach(item => {
|
||
if (item.checked) {
|
||
skuIds.push({
|
||
sku_id: item.sku_id,
|
||
num: item.num
|
||
});
|
||
}
|
||
});
|
||
});
|
||
if (skuIds.length == 0) {
|
||
this.discount = {};
|
||
return;
|
||
}
|
||
|
||
this.$api.sendRequest({
|
||
url: '/api/cartcalculate/calculate',
|
||
data: {
|
||
sku_ids: JSON.stringify(skuIds)
|
||
},
|
||
success: res => {
|
||
if (res.code >= 0 && res.data && (res.data.coupon_money > 0 || res.data.promotion_money > 0)) {
|
||
this.discount = res.data;
|
||
let manjian = {};
|
||
res.data.goods_list.forEach(item => {
|
||
if (item.promotion && item.promotion.manjian) {
|
||
manjian['sku_' + item.sku_id] = JSON.parse(item.promotion.manjian.rule_json);
|
||
}
|
||
})
|
||
Object.assign(this.manjian, manjian);
|
||
this.refresherTriggered = false;
|
||
} else {
|
||
this.discount = {};
|
||
}
|
||
}
|
||
})
|
||
},
|
||
/**
|
||
* 领取优惠券
|
||
* tips 失败时是否提示
|
||
* @param {Object} couponTypeId
|
||
*/
|
||
receiveCoupon(couponTypeId, tips = true) {
|
||
if (this.receiveSub) return;
|
||
this.receiveSub = true;
|
||
this.$api.sendRequest({
|
||
url: '/coupon/api/coupon/receive',
|
||
data: {
|
||
coupon_type_id: couponTypeId,
|
||
get_type: 2 //获取方式:1订单2.直接领取3.活动领取
|
||
},
|
||
success: res => {
|
||
if (res.code == 0) {
|
||
this.$set(this.discount.coupon_info, 'receive_type', '');
|
||
} else {
|
||
if (tips) this.$util.showToast({
|
||
title: res.message
|
||
});
|
||
this.receiveSub = false;
|
||
}
|
||
}
|
||
});
|
||
},
|
||
// 手指触摸事件 用于菜单左滑
|
||
touchS(e) {
|
||
this.startX = e.touches[0].clientX;
|
||
// console.log('开始' + e.touches[0].clientX);
|
||
},
|
||
touchE(e, cartIndex) {
|
||
this.endX = e.changedTouches[0].clientX;
|
||
// 触摸开始到停止的差值,小于0左滑,大于0右滑
|
||
var disX = this.startX - this.endX;
|
||
// cartIndex.edit = disX > 50;
|
||
if (disX > 50) cartIndex.edit = true;
|
||
else if (disX < 0) cartIndex.edit = false;
|
||
this.$forceUpdate();
|
||
},
|
||
moneyFormat(money) {
|
||
if (isNaN(parseFloat(money))) return money;
|
||
return parseFloat(money).toFixed(2);
|
||
},
|
||
refreshSkuDetail(goodsSkuDetail) {
|
||
this.goodsSkuDetail = goodsSkuDetail;
|
||
},
|
||
onRefresh(e) {
|
||
this.refresherTriggered = true;
|
||
if (this.storeToken) {
|
||
this.getCartData();
|
||
this.refreshCartNumber();
|
||
} else {
|
||
this.cartData = [];
|
||
this.invalidGoods = [];
|
||
this.calculationTotalPrice();
|
||
}
|
||
}
|
||
},
|
||
} |