Files
2025-11-17 14:11:46 +08:00

275 lines
8.4 KiB
JavaScript
Raw Permalink 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 { 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);
}
});
});
}