275 lines
8.4 KiB
JavaScript
275 lines
8.4 KiB
JavaScript
|
|
import { config } from '../../config/index';
|
|||
|
|
|
|||
|
|
/** 获取购物车mock数据 */
|
|||
|
|
function mockFetchCartGroupData(params) {
|
|||
|
|
const { delay } = require('../_utils/delay');
|
|||
|
|
const { genCartGroupData } = require('../../model/cart');
|
|||
|
|
|
|||
|
|
return delay().then(() => genCartGroupData(params));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/** 获取购物车数据 */
|
|||
|
|
export function fetchCartGroupData(params) {
|
|||
|
|
if (config.useMock) {
|
|||
|
|
return mockFetchCartGroupData(params);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return new Promise((resolve, reject) => {
|
|||
|
|
wx.request({
|
|||
|
|
url: `${config.apiBase}/cart`,
|
|||
|
|
method: 'GET',
|
|||
|
|
header: {
|
|||
|
|
'Authorization': `Bearer ${wx.getStorageSync('token') || ''}`
|
|||
|
|
},
|
|||
|
|
success: (res) => {
|
|||
|
|
if (res.statusCode === 200 && res.data.code === 200) {
|
|||
|
|
// 转换后端数据格式为前端期望的格式
|
|||
|
|
const cartItems = res.data.data.items || [];
|
|||
|
|
const cartData = {
|
|||
|
|
isNotEmpty: cartItems.length > 0,
|
|||
|
|
storeGoods: [{
|
|||
|
|
storeId: '1',
|
|||
|
|
storeName: '默认店铺',
|
|||
|
|
storeStatus: 1,
|
|||
|
|
isSelected: true,
|
|||
|
|
storeStockShortage: false,
|
|||
|
|
shortageGoodsList: [],
|
|||
|
|
promotionGoodsList: [{
|
|||
|
|
title: '普通商品',
|
|||
|
|
promotionCode: 'NORMAL',
|
|||
|
|
promotionId: '1',
|
|||
|
|
tagText: [],
|
|||
|
|
promotionStatus: 1,
|
|||
|
|
tag: '',
|
|||
|
|
description: '',
|
|||
|
|
doorSillRemain: null,
|
|||
|
|
isNeedAddOnShop: 0,
|
|||
|
|
goodsPromotionList: cartItems.map(item => ({
|
|||
|
|
uid: item.id.toString(),
|
|||
|
|
saasId: '1',
|
|||
|
|
storeId: '1',
|
|||
|
|
spuId: item.product_id.toString(),
|
|||
|
|
skuId: item.sku_id ? item.sku_id.toString() : item.product_id.toString(),
|
|||
|
|
isSelected: item.selected ? 1 : 0,
|
|||
|
|
thumb: item.product?.main_image || item.product?.image || 'https://tdesign.gtimg.com/miniprogram/template/retail/goods/default.png',
|
|||
|
|
title: item.product?.name || '商品名称',
|
|||
|
|
primaryImage: item.product?.main_image || item.product?.image || 'https://tdesign.gtimg.com/miniprogram/template/retail/goods/default.png',
|
|||
|
|
quantity: item.quantity,
|
|||
|
|
stockStatus: true,
|
|||
|
|
stockQuantity: item.product?.stock || 999,
|
|||
|
|
// 修复:优先使用SKU价格,如果没有SKU价格则使用SPU价格
|
|||
|
|
price: item.sku?.price || item.product?.price || '0',
|
|||
|
|
originPrice: item.sku?.original_price || item.product?.original_price || item.sku?.price || item.product?.price || '0',
|
|||
|
|
tagPrice: null,
|
|||
|
|
titlePrefixTags: [],
|
|||
|
|
roomId: null,
|
|||
|
|
specInfo: item.sku && item.sku.spec_values ?
|
|||
|
|
Object.entries(item.sku.spec_values).map(([key, value]) => ({ specTitle: key, specValue: value })) :
|
|||
|
|
[],
|
|||
|
|
specs: item.sku && item.sku.spec_values ?
|
|||
|
|
Object.values(item.sku.spec_values) :
|
|||
|
|
[],
|
|||
|
|
joinCartTime: item.created_at,
|
|||
|
|
available: 1,
|
|||
|
|
putOnSale: 1,
|
|||
|
|
etitle: null,
|
|||
|
|
}))
|
|||
|
|
}]
|
|||
|
|
}],
|
|||
|
|
isAllSelected: cartItems.every(item => item.selected),
|
|||
|
|
selectedGoodsCount: cartItems.filter(item => item.selected).reduce((sum, item) => sum + item.quantity, 0),
|
|||
|
|
// 修复:总金额计算使用SKU价格,而不是SPU价格
|
|||
|
|
totalAmount: cartItems.filter(item => item.selected).reduce((sum, item) => {
|
|||
|
|
const price = parseInt(item.sku?.price || item.product?.price || 0);
|
|||
|
|
return sum + price * item.quantity;
|
|||
|
|
}, 0).toString(),
|
|||
|
|
totalDiscountAmount: '0',
|
|||
|
|
invalidGoodItems: []
|
|||
|
|
};
|
|||
|
|
resolve({ data: cartData });
|
|||
|
|
} else {
|
|||
|
|
reject(new Error(res.data.message || '获取购物车失败'));
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
fail: (err) => {
|
|||
|
|
reject(err);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/** 添加商品到购物车 */
|
|||
|
|
export function addToCart(productId, skuId, quantity) {
|
|||
|
|
return new Promise((resolve, reject) => {
|
|||
|
|
wx.request({
|
|||
|
|
url: `${config.apiBase}/cart`,
|
|||
|
|
method: 'POST',
|
|||
|
|
header: {
|
|||
|
|
'Authorization': `Bearer ${wx.getStorageSync('token') || ''}`,
|
|||
|
|
'Content-Type': 'application/json'
|
|||
|
|
},
|
|||
|
|
data: {
|
|||
|
|
product_id: parseInt(productId) || 0,
|
|||
|
|
sku_id: skuId ? parseInt(skuId) : 0,
|
|||
|
|
quantity: parseInt(quantity) || 1
|
|||
|
|
},
|
|||
|
|
success: (res) => {
|
|||
|
|
if (res.statusCode === 200 && res.data.code === 200) {
|
|||
|
|
resolve(res.data);
|
|||
|
|
} else {
|
|||
|
|
reject(new Error(res.data.message || '添加到购物车失败'));
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
fail: (err) => {
|
|||
|
|
reject(err);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 更新购物车商品数量
|
|||
|
|
* @param {number} productId - 商品ID
|
|||
|
|
* @param {number} quantity - 数量
|
|||
|
|
* @param {number} skuId - SKU ID(可选)
|
|||
|
|
* @returns {Promise}
|
|||
|
|
*/
|
|||
|
|
export function updateCartItem(productId, quantity, skuId = null) {
|
|||
|
|
const data = { quantity };
|
|||
|
|
if (skuId) {
|
|||
|
|
data.sku_id = parseInt(skuId);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return new Promise((resolve, reject) => {
|
|||
|
|
wx.request({
|
|||
|
|
url: `${config.apiBase}/cart/${productId}`,
|
|||
|
|
method: 'PUT',
|
|||
|
|
header: {
|
|||
|
|
'Authorization': `Bearer ${wx.getStorageSync('token') || ''}`,
|
|||
|
|
'Content-Type': 'application/json'
|
|||
|
|
},
|
|||
|
|
data,
|
|||
|
|
success: (res) => {
|
|||
|
|
if (res.statusCode === 200 && res.data.code === 200) {
|
|||
|
|
resolve(res.data);
|
|||
|
|
} else {
|
|||
|
|
reject(new Error(res.data.message || '更新购物车失败'));
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
fail: (err) => {
|
|||
|
|
reject(err);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 删除购物车商品
|
|||
|
|
* @param {number} productId - 商品ID
|
|||
|
|
* @param {number} skuId - SKU ID(可选)
|
|||
|
|
* @returns {Promise}
|
|||
|
|
*/
|
|||
|
|
export function removeFromCart(productId, skuId = null) {
|
|||
|
|
let url = `${config.apiBase}/cart/${productId}`;
|
|||
|
|
if (skuId) {
|
|||
|
|
url += `?sku_id=${skuId}`;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return new Promise((resolve, reject) => {
|
|||
|
|
wx.request({
|
|||
|
|
url,
|
|||
|
|
method: 'DELETE',
|
|||
|
|
header: {
|
|||
|
|
'Authorization': `Bearer ${wx.getStorageSync('token') || ''}`
|
|||
|
|
},
|
|||
|
|
success: (res) => {
|
|||
|
|
if (res.statusCode === 200 && res.data.code === 200) {
|
|||
|
|
resolve(res.data);
|
|||
|
|
} else {
|
|||
|
|
reject(new Error(res.data.message || '删除商品失败'));
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
fail: (err) => {
|
|||
|
|
reject(err);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/** 选择/取消选择购物车商品 */
|
|||
|
|
export function selectCartItem(cartId, selected) {
|
|||
|
|
return new Promise((resolve, reject) => {
|
|||
|
|
wx.request({
|
|||
|
|
url: `${config.apiBase}/cart/${cartId}/select`,
|
|||
|
|
method: 'PUT',
|
|||
|
|
header: {
|
|||
|
|
'Authorization': `Bearer ${wx.getStorageSync('token') || ''}`,
|
|||
|
|
'Content-Type': 'application/json'
|
|||
|
|
},
|
|||
|
|
data: {
|
|||
|
|
selected: selected
|
|||
|
|
},
|
|||
|
|
success: (res) => {
|
|||
|
|
if (res.statusCode === 200 && res.data.code === 200) {
|
|||
|
|
resolve(res.data);
|
|||
|
|
} else {
|
|||
|
|
reject(new Error(res.data.message || '操作失败'));
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
fail: (err) => {
|
|||
|
|
reject(err);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/** 全选/取消全选购物车商品 */
|
|||
|
|
export function selectAllCartItems(selected) {
|
|||
|
|
return new Promise((resolve, reject) => {
|
|||
|
|
wx.request({
|
|||
|
|
url: `${config.apiBase}/cart/select-all`,
|
|||
|
|
method: 'PUT',
|
|||
|
|
header: {
|
|||
|
|
'Authorization': `Bearer ${wx.getStorageSync('token') || ''}`,
|
|||
|
|
'Content-Type': 'application/json'
|
|||
|
|
},
|
|||
|
|
data: {
|
|||
|
|
selected: selected
|
|||
|
|
},
|
|||
|
|
success: (res) => {
|
|||
|
|
if (res.statusCode === 200 && res.data.code === 200) {
|
|||
|
|
resolve(res.data);
|
|||
|
|
} else {
|
|||
|
|
reject(new Error(res.data.message || '操作失败'));
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
fail: (err) => {
|
|||
|
|
reject(err);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/** 清空购物车 */
|
|||
|
|
export function clearCart() {
|
|||
|
|
return new Promise((resolve, reject) => {
|
|||
|
|
wx.request({
|
|||
|
|
url: `${config.apiBase}/cart`,
|
|||
|
|
method: 'DELETE',
|
|||
|
|
header: {
|
|||
|
|
'Authorization': `Bearer ${wx.getStorageSync('token') || ''}`
|
|||
|
|
},
|
|||
|
|
success: (res) => {
|
|||
|
|
if (res.statusCode === 200 && res.data.code === 200) {
|
|||
|
|
resolve(res.data);
|
|||
|
|
} else {
|
|||
|
|
reject(new Error(res.data.message || '清空购物车失败'));
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
fail: (err) => {
|
|||
|
|
reject(err);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
}
|