import { defineStore } from 'pinia' import { t } from '@/locale' import { redirect, getToken } from '@/utils/common' import { addCart, editCart, deleteCart, getCartList } from '@/addon/shop/api/cart'; interface Cart { cartList: AnyObject totalNum: number totalMoney: number isRepeat: boolean isAddCartRecommend: boolean // 是否添加购物车推荐 } const useCartStore = defineStore('cart', { state: (): Cart => { return { cartList: {}, // 购物车列表 totalNum: 0, // 购物车商品总数量 totalMoney: 0, // 购物车商品总价格 isRepeat: false, isAddCartRecommend: false } }, actions: { // 查询购物车列表 getList(callback: any = null) { if (!getToken()) { // 每次查询清空 for (let k in this.cartList) { delete this.cartList[k]; } this.totalNum = 0; this.totalMoney = 0; return; } getCartList({}).then((res: any) => { let data = res.data; // 每次查询清空 for (let k in this.cartList) { delete this.cartList[k]; } if (data) { data.forEach((item: any) => { if (item.goods.status == 1 && item.goods.delete_time == 0 && item.goodsSku) { let cart: any = { id: item.id, goods_id: item.goods_id, sku_id: item.sku_id, stock: item.goodsSku.stock, num: item.num, sale_price: item.goodsSku.show_price }; // if (item.goods.member_discount && getToken() && item.goodsSku.member_price != item.goodsSku.price) { // cart.sale_price = item.goodsSku.member_price ? item.goodsSku.member_price : item.goodsSku.price // 会员价 // } // todo sale_price 改成 price if (!this.cartList['goods_' + cart.goods_id]) { this.cartList['goods_' + cart.goods_id] = {}; } this.cartList['goods_' + cart.goods_id]['sku_' + cart.sku_id] = cart; } }) } this.calculateNum(); if (callback && typeof callback == 'function') callback(); }) }, /** * 购物车数量增加 * data:数据源 * step:记步数量,默认为:1,每次加一个,设置为:0时,按照 num 修改 */ increase(data: any, step = 1, callback: any = null) { if (!data || (data && Object.keys(data).length == 0) || !data.goods_id || !data.sku_id) return; if (!getToken()) return; let num = data.num || 0; // 当前数量 let updateNum = num + step; // 变更数量 let api = data.id ? editCart : addCart; if (updateNum > parseInt(data.stock)) { uni.showToast({ title: '商品库存不足', icon: 'none' }) return; } if (this.isRepeat) return; this.isRepeat = true; // 更新存储数据 if (data.id) { this.cartList['goods_' + data.goods_id]['sku_' + data.sku_id].num = updateNum; } else { // 如果商品第一次添加,则初始化数据 if (!this.cartList['goods_' + data.goods_id]) { this.cartList['goods_' + data.goods_id] = {}; } this.cartList['goods_' + data.goods_id]['sku_' + data.sku_id] = { id: data.id, goods_id: data.goods_id, sku_id: data.sku_id, stock: data.stock, num: updateNum, sale_price: data.sale_price }; } this.calculateNum(); api({ id: data.id, goods_id: data.goods_id, sku_id: data.sku_id, num: updateNum }).then(res => { this.getList(callback) this.isRepeat = false; }).catch(res => { this.isRepeat = false; }) }, /** * 购物车数量减少 * data:数据源 * step:记步数量,默认为:1,每次减一个,设置为:0时,按照 num 修改 */ reduce(data: any, step = 1, callback: any = null) { if (!data || (data && Object.keys(data).length == 0) || !data.goods_id || !data.sku_id) return; if (!getToken()) return; let num = data.num || 0; // 当前数量 let updateNum = num - step; // 变更数量 let api = updateNum > 0 ? editCart : deleteCart; if (this.isRepeat) return; this.isRepeat = true; // 更新存储数据 if (updateNum > 0) { this.cartList['goods_' + data.goods_id]['sku_' + data.sku_id].num = updateNum; } else { delete this.cartList['goods_' + data.goods_id]['sku_' + data.sku_id]; if (Object.keys(this.cartList['goods_' + data.goods_id]).length == 0) delete this.cartList['goods_' + data.goods_id]; } this.calculateNum(); api({ ids: data.id, // 删除接口用 id: data.id, goods_id: data.goods_id, sku_id: data.sku_id, num: updateNum }).then(res => { this.getList(callback); this.isRepeat = false; }).catch(res => { this.isRepeat = false; }) }, // 购物车删除 delete(ids: any, callback: any = null) { if (!ids) return; deleteCart({ ids }).then(res => { this.getList(); this.isRepeat = false; if (callback) callback(); }).catch(res => { this.isRepeat = false; }) }, // 计算购物车商品的总数量、总价格 calculateNum() { this.totalNum = 0; this.totalMoney = 0; if (Object.keys(this.cartList).length) { for (let goods in this.cartList) { let totalNum = 0; let totalMoney = 0; for (let sku in this.cartList[goods]) { if (typeof this.cartList[goods][sku] == 'object') { totalNum += this.cartList[goods][sku].num; totalMoney += this.cartList[goods][sku].num * this.cartList[goods][sku].sale_price; } } this.cartList[goods].totalNum = totalNum; this.cartList[goods].totalMoney = totalMoney.toFixed(2); this.totalNum += totalNum; this.totalMoney += totalMoney; } } this.totalMoney = this.totalMoney.toFixed(2); } } }) export default useCartStore