import React, { useEffect, useState } from 'react' import { View, Text, Image, ScrollView } from '@tarojs/components' import Taro, { useRouter } from '@tarojs/taro' import { getShopGroupBuy, listShopGroupBuyRecords, joinGroupBuy, createGroupBuy } from '@/api/shop/shopGroupBuy' import { getShopGoods } from '@/api/shop/shopGoods' import type { ShopGroupBuy, ShopGroupBuyRecord } from '@/api/shop/shopGroupBuy/model' import type { ShopGoods } from '@/api/shop/shopGoods/model' import type { ShopGoodsSku } from '@/api/shop/shopGoodsSku/model' import SkuSelector from '@/components/business/SkuSelector' definePageConfig({ navigationBarTitleText: '拼团详情', }) const GroupBuyDetailPage: React.FC = () => { const router = useRouter() const groupBuyId = Number(router.params.groupBuyId || 0) const [groupBuy, setGroupBuy] = useState(null) const [product, setProduct] = useState(null) const [records, setRecords] = useState([]) const [loading, setLoading] = useState(true) const [submitting, setSubmitting] = useState(false) const [skuVisible, setSkuVisible] = useState(false) const [pendingRecordId, setPendingRecordId] = useState(null) useEffect(() => { if (groupBuyId) { fetchData() } }, [groupBuyId]) const fetchData = async () => { try { setLoading(true) const [res1, res2] = await Promise.all([ getShopGroupBuy(groupBuyId), listShopGroupBuyRecords(groupBuyId), ]) if (res1.code === 0 && res1.data) { const data = res1.data setGroupBuy(data) // 加载商品完整信息(含规格/SKU) if (data.goodsId) { fetchGoodsDetail(data.goodsId) } } if (res2.code === 0 && res2.data) { setRecords(res2.data) } } catch (err) { console.error('获取拼团详情失败', err) Taro.showToast({ title: '加载失败', icon: 'none' }) } finally { setLoading(false) } } const fetchGoodsDetail = async (goodsId: number) => { try { const res = await getShopGoods(goodsId) if (res.code === 0 && res.data) { setProduct(res.data) } } catch (err) { console.error('获取商品详情失败', err) } } // 准备商品规格并显示选择器(开团) const handleCreateGroup = () => { if (!groupBuy) return setPendingRecordId(null) // 标记为开团 if (!product) { Taro.showLoading({ title: '加载规格...' }) getShopGoods(groupBuy.goodsId) .then(res => { Taro.hideLoading() if (res.code === 0 && res.data) { setProduct(res.data) setSkuVisible(true) } else { Taro.showToast({ title: '商品信息加载失败', icon: 'none' }) } }) .catch(() => { Taro.hideLoading() Taro.showToast({ title: '商品信息加载失败', icon: 'none' }) }) } else { setSkuVisible(true) } } // 去凑单(参团) const handleJoinGroup = (recordId: number) => { if (!groupBuy) return setPendingRecordId(recordId) if (!product) { Taro.showLoading({ title: '加载规格...' }) getShopGoods(groupBuy.goodsId) .then(res => { Taro.hideLoading() if (res.code === 0 && res.data) { setProduct(res.data) setSkuVisible(true) } else { Taro.showToast({ title: '商品信息加载失败', icon: 'none' }) } }) .catch(() => { Taro.hideLoading() Taro.showToast({ title: '商品信息加载失败', icon: 'none' }) }) } else { setSkuVisible(true) } } const handleSkuConfirm = async (sku: ShopGoodsSku, quantity: number) => { if (!groupBuy) return setSubmitting(true) try { let res: any if (pendingRecordId && pendingRecordId > 0) { // 参团 res = await joinGroupBuy({ recordId: pendingRecordId, goodsId: groupBuy.goodsId, skuId: sku.id || 0, quantity, }) Taro.showToast({ title: '参团成功', icon: 'success' }) } else { // 开团 res = await createGroupBuy({ groupBuyId: groupBuy.id!, goodsId: groupBuy.goodsId, skuId: sku.id || 0, quantity, }) Taro.showToast({ title: '开团成功', icon: 'success' }) } if (res.code === 0) { fetchData() // 刷新数据 } } catch (err: any) { Taro.showToast({ title: err?.message || '操作失败', icon: 'none' }) } finally { setSubmitting(false) } } if (loading) { return ( 加载中... ) } if (!groupBuy) { return ( 拼团活动不存在 ) } const remaining = groupBuy.groupSize - groupBuy.currentSize const isActive = groupBuy.status === 1 return ( {/* 商品信息 */} {groupBuy.goodsName || groupBuy.product?.name} ¥{groupBuy.groupPrice} ¥{groupBuy.product?.price || 0} {isActive && remaining > 0 && ( 拼团进行中 )} {remaining === 0 && ( 已成团 )} {/* 拼团进度 */} 拼团进度 成团人数 {groupBuy.groupSize}人 已参团 {groupBuy.currentSize}人 {remaining > 0 && ( 还差{remaining}人成团,快来参与吧! )} {remaining === 0 && ( 拼团已成功,人数已满 )} {/* 正在拼团的列表 */} {records.length > 0 && ( 以下小伙伴正在拼团,可直接参与 {records.map(record => ( {record.isLeader ? '团长' : '成员'} {record.isLeader ? '团长' : `团员${record.id}`} {record.groupSize - record.memberCount > 0 ? `还差${record.groupSize - record.memberCount}人` : '已成团'} {isActive && record.status === 1 && ( handleJoinGroup(record.id)} > 去凑单 )} ))} )} {/* 拼团规则 */} 拼团规则 • 支付开团或参加拼团后,需在24小时内凑齐人数 • 拼团失败,系统会自动退款 • 拼团商品享受拼团价格,不支持7天无理由退货 {/* 底部操作栏 */} 单独购买 {submitting ? '处理中...' : '立即拼团'} {/* SKU 选择器 */} setSkuVisible(false)} onConfirm={handleSkuConfirm} /> ) } export default GroupBuyDetailPage