mirror of
https://gitee.com/niucloud-team/niucloud-admin.git
synced 2026-01-22 02:58:10 +00:00
212 lines
7.5 KiB
TypeScript
212 lines
7.5 KiB
TypeScript
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
|