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); } }); }); }