全栈小学生 abaa4201fb add shop
2026-01-13 09:16:43 +08:00

212 lines
7.5 KiB
TypeScript
Raw 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.

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