fix(shop): 修复首页VIP价格显示及后端价格字段问题
- 首页index.tsx中接入useVipStatus,修复热销推荐价格未显示dealerPrice的问题 - 新增getHotDisplayPrice函数,VIP时显示dealerPrice及划线原价,并添加VIP金色角标 - 后端OrderCreateRequest.OrderGoodsItem增加price字段及校验,解决后端DTO缺失price字段问题 - 重构OrderBusinessService中价格校验逻辑,确保正确优先级及SKU库存校验 - 确认价格字段约定,前端传dealerPrice给后端下单 - Maven编译通过,后端需重启服务生效
This commit is contained in:
@@ -5,6 +5,7 @@ import { useUser } from '@/hooks/useUser'
|
||||
import { useShare } from '@/hooks/useShare'
|
||||
import { useScrollHeight } from '@/hooks/useScrollHeight'
|
||||
import { useNewOrderDetector } from '@/hooks/useNewOrderDetector'
|
||||
import { useVipStatus } from '@/hooks/useVipStatus'
|
||||
import { getMyClerk } from '@/api/shop/shopStoreUser'
|
||||
import { pageShopOrder } from '@/api/shop/shopOrder'
|
||||
import { listCmsAd } from '@/api/cms/cmsAd'
|
||||
@@ -29,6 +30,8 @@ const IndexPage: React.FC = () => {
|
||||
const [hotProducts, setHotProducts] = useState<ShopGoods[]>([])
|
||||
const [loading, setLoading] = useState(true)
|
||||
const scrollHeight = useScrollHeight(44)
|
||||
// VIP 状态:异步校验并更新缓存,isVip 变化时触发重渲染
|
||||
const { isVip } = useVipStatus()
|
||||
|
||||
// 首页分享:好友 + 朋友圈 + 复制链接(右上角三个按钮全亮)
|
||||
useShare({
|
||||
@@ -165,6 +168,17 @@ const IndexPage: React.FC = () => {
|
||||
Taro.navigateTo({ url: '/pages/index/notification' })
|
||||
}
|
||||
|
||||
/**
|
||||
* VIP 会员显示 dealerPrice(同时把 price 作为划线原价),非 VIP 维持原行为
|
||||
*/
|
||||
const getHotDisplayPrice = (item: ShopGoods): { price: string; original?: string } => {
|
||||
if (isVip && item.dealerPrice) {
|
||||
return { price: item.dealerPrice, original: item.price }
|
||||
}
|
||||
const original = item.salePrice && item.salePrice !== item.price ? item.salePrice : undefined
|
||||
return { price: item.price || '0', original }
|
||||
}
|
||||
|
||||
// tabBar 页面列表
|
||||
const tabBarPages = ['/pages/index/index', '/pages/shop/index', '/pages/order/list', '/pages/user/user']
|
||||
|
||||
@@ -330,11 +344,14 @@ const IndexPage: React.FC = () => {
|
||||
<Text className='text-sm text-gray-700 truncate block'>{item.goodsName || item.name}</Text>
|
||||
<View className='flex items-center mt-1'>
|
||||
<Price
|
||||
price={item.price || '0'}
|
||||
original={item.salePrice && item.salePrice !== item.price ? item.salePrice : undefined}
|
||||
price={getHotDisplayPrice(item).price}
|
||||
original={getHotDisplayPrice(item).original}
|
||||
size='small'
|
||||
loginMask
|
||||
/>
|
||||
{isVip && item.dealerPrice ? (
|
||||
<Text className='text-xs text-amber-600 ml-1'>VIP</Text>
|
||||
) : null}
|
||||
</View>
|
||||
{item.sales !== undefined && item.sales > 0 && (
|
||||
<Text className='text-xs text-gray-400 mt-1'>已售 {item.sales}</Text>
|
||||
|
||||
Reference in New Issue
Block a user