门店信息

This commit is contained in:
liu
2026-08-10 10:09:30 +08:00
parent 0203c84357
commit b288502e0e
19 changed files with 1001 additions and 748 deletions
+63 -5
View File
@@ -1,10 +1,12 @@
import { useCallback, useEffect, useRef, useState } from 'react'
import Taro, { useDidShow } from '@tarojs/taro'
import { View, Text, Image, Textarea, ScrollView } from '@tarojs/components'
import { Button, Empty, Popup, Stepper } from '@antmjs/vantui'
import { Button, Empty, Icon, Popup, Stepper } from '@antmjs/vantui'
import useCartStore from '@/stores/cart/useCartStore'
import { createOrderApi } from '@/services/order'
import { getStoreInfoApi } from '@/services/store'
import type { CartItem } from '@/types/cart'
import type { StoreDetail } from '@/types/store'
import './index.less'
export default function CartPage() {
@@ -27,12 +29,27 @@ export default function CartPage() {
const [remark, setRemark] = useState('')
const [submitting, setSubmitting] = useState(false)
/** 配送信息(下单弹层展示,打开时拉取) */
const [storeInfo, setStoreInfo] = useState<StoreDetail | null>(null)
const [storeLoading, setStoreLoading] = useState(false)
/** 可购项(status=1 */
const purchasable = items.filter(item => item.status === 1)
const hasInvalid = items.length > 0 && purchasable.length < items.length
/** 拉取门店配送信息 */
const fetchStoreInfo = useCallback(() => {
setStoreLoading(true)
getStoreInfoApi()
.then(res => setStoreInfo(res.data))
.catch(() => setStoreInfo(null))
.finally(() => setStoreLoading(false))
}, [])
useDidShow(() => {
fetchCart().catch(() => {})
// 从门店信息编辑页返回且弹层仍打开时 → 刷新配送信息
if (showOrder) fetchStoreInfo()
})
/** 同步本地编辑数量:删除不存在的项,保留在编数量 */
@@ -106,14 +123,24 @@ export default function CartPage() {
})
}, [clearCart])
/** 打开下单弹层 */
/** 打开下单弹层(同时拉取配送信息) */
const handleOrderTap = useCallback(() => {
if (!purchasable.length) {
Taro.showToast({ title: '没有可购买的商品', icon: 'none' })
return
}
setShowOrder(true)
}, [purchasable.length])
fetchStoreInfo()
}, [purchasable.length, fetchStoreInfo])
/** 配送信息点击:拉取失败时重试,否则前往门店信息编辑页 */
const handleDeliveryTap = useCallback(() => {
if (!storeLoading && !storeInfo) {
fetchStoreInfo()
return
}
Taro.navigateTo({ url: '/pages/store-info/index' })
}, [storeLoading, storeInfo, fetchStoreInfo])
/** 提交订单(金额一律服务端重算) */
const handleSubmitOrder = useCallback(async () => {
@@ -240,12 +267,43 @@ export default function CartPage() {
>
<View className='order-popup'>
<Text className='order-popup__title'></Text>
{/* 配送信息(点击前往修改门店信息) */}
<View className='order-popup__delivery' onClick={handleDeliveryTap}>
<Icon name='location-o' size={20} color='#ee0a24' className='order-popup__delivery-icon' />
{storeLoading ? (
<Text className='order-popup__delivery-tip'>...</Text>
) : storeInfo ? (
<View className='order-popup__delivery-info'>
<View className='order-popup__delivery-head'>
<Text className='order-popup__delivery-name'>{storeInfo.name}</Text>
{(storeInfo.contact || storeInfo.phone) && (
<Text className='order-popup__delivery-contact'>
{storeInfo.contact} {storeInfo.phone}
</Text>
)}
</View>
{storeInfo.address ? (
<Text className='order-popup__delivery-address'>{storeInfo.address}</Text>
) : (
<Text className='order-popup__delivery-warn'></Text>
)}
</View>
) : (
<Text className='order-popup__delivery-tip'></Text>
)}
<Text className='order-popup__delivery-arrow'></Text>
</View>
<ScrollView scrollY className='order-popup__list'>
{purchasable.map(item => (
<View key={item.id} className='order-popup__item'>
<View className='order-popup__item-info'>
<Text className='order-popup__item-name'>{item.name}</Text>
<Text className='order-popup__item-spec'>{item.spec} / {item.unit}</Text>
<Image className='order-popup__item-image' src={item.image} mode='aspectFill' lazyLoad />
<View className='order-popup__item-title'>
<Text className='order-popup__item-name'>{item.name}</Text>
<Text className='order-popup__item-spec'>{item.spec} / {item.unit}</Text>
</View>
</View>
<View className='order-popup__item-right'>
<Text className='order-popup__item-qty'>×{displayQty(item)}</Text>