修复bug

This commit is contained in:
2026-04-14 17:45:41 +08:00
parent d2077f5844
commit a89610c245
12 changed files with 454 additions and 125 deletions
@@ -48,6 +48,13 @@ function getDishPromoLabel(item: Record<string, unknown>): string {
return typeof raw === 'string' && raw.trim() ? raw.trim() : ''
}
function getFeaturedDishDisplayPrice(item: Record<string, any>) {
const firstSpecPrice = item?.merchantSideDishVoList?.[0]?.merchantSideDishItemVoList?.[0]?.price
if (firstSpecPrice != null && String(firstSpecPrice) !== '') return firstSpecPrice
if (item?.actualSalePrice != null && String(item.actualSalePrice) !== '') return item.actualSalePrice
return item?.discountPrice ?? 0
}
function navigateTo(url: string) {
if(userStore.checkLogin()) {
uni.navigateTo({
@@ -445,7 +452,7 @@ const debouncedEmit = debounce(1300, (isCollected: boolean, id: string, type: Co
<view class="featured-dish-body">
<view class="featured-dish-meta flex items-start justify-between gap-12rpx mb-14rpx">
<view class="min-w-0 flex-1">
<text class="featured-dish-price">US${{ item?.discountPrice }}</text>
<text class="featured-dish-price">US${{ getFeaturedDishDisplayPrice(item) }}</text>
<!-- <text
v-if="Number(item?.originalPrice) > Number(item?.discountPrice)"
class="featured-dish-original"
@@ -42,6 +42,16 @@ const {paging, dataList, loading, queryList, firstLoaded} = usePage<MerchantOrde
}
})
function fillI18nParams(template: string, params: Record<string, string | number>) {
let text = template
Object.keys(params).forEach((key) => {
const value = String(params[key] ?? '')
text = text.replace(new RegExp(`\\{${key}\\}`, 'g'), value)
text = text.replace(new RegExp(`\\$\\{${key}\\}`, 'g'), value)
})
return text
}
function normalizeTimestamp(input: unknown): number | null {
if (input == null || input === '') return null
@@ -71,7 +81,14 @@ function formatOrderCardTime(item: MerchantOrderVo) {
}
function formatOrderPrice(item: MerchantOrderVo) {
return (item.paidAmount ?? item.actualPrice ?? 0).toFixed(2)
const raw = item?.paidAmount ?? item?.actualPrice ?? 0
if (raw == null || raw === '') return '0.00'
if (typeof raw === 'number') return raw.toFixed(2)
const str = String(raw).trim()
if (!str) return '0.00'
if (!str.includes('.')) return `${str}.00`
const [intPart, decimalPart = ''] = str.split('.')
return `${intPart}.${(decimalPart + '00').slice(0, 2)}`
}
function getOrderDishes(item: MerchantOrderVo): Array<Record<string, any>> {
@@ -94,6 +111,42 @@ function getTotalDishCount(item: MerchantOrderVo) {
return getOrderDishes(item).reduce((s, d) => s + (d.count || 0), 0)
}
function getTotalDishCountText(item: MerchantOrderVo) {
return fillI18nParams(t('pages.order.totalItemCount'), {
count: getTotalDishCount(item),
})
}
function isSameCode(value: unknown, code: unknown) {
return String(value ?? '') === String(code ?? '')
}
function isRefundApplied(item: MerchantOrderVo) {
return isSameCode(item.refundStatus, OrderCancelStatus.APPLIED)
}
function isRefundApproved(item: MerchantOrderVo) {
return isSameCode(item.refundStatus, OrderCancelStatus.APPROVED)
}
function isRefundRejected(item: MerchantOrderVo) {
return isSameCode(item.refundStatus, OrderCancelStatus.REJECTED)
}
function getOrderStatusText(item: MerchantOrderVo) {
if (isRefundApplied(item)) return t('pages-store.order.orderStatus.refund')
if (isRefundApproved(item)) return t('pages-store.order.orderStatus.agreeRefund')
if (isRefundRejected(item)) return t('pages-store.order.orderStatus.rejectRefund')
if (isSameCode(item.orderStatus, OrderStatus.CANCELLED)) return t('pages-store.order.orderStatus.cancelled')
if (isSameCode(item.orderStatus, OrderStatus.PENDING_PAYMENT)) return t('pages-store.order.orderStatus.pendingPayment')
if (isSameCode(item.orderStatus, OrderStatus.HAS_PENDING_PAYMENT)) return t('pages-store.order.orderStatus.hasPendingPayment')
if (isSameCode(item.orderStatus, OrderStatus.MERCHANT_ACCEPTED)) return t('pages-store.order.orderStatus.received')
if (isSameCode(item.receiveMethod, 1) && isSameCode(item.orderStatus, OrderStatus.DELIVERING)) return t('pages-store.order.orderStatus.delivering')
if (isSameCode(item.orderStatus, OrderStatus.COMPLETED)) return t('pages-store.order.orderStatus.delivered')
if (isSameCode(item.orderStatus, OrderStatus.MERCHANT_REJECTED)) return t('pages-store.store.orderStatus.rejected')
return '--'
}
function handleClick(item: MerchantOrderVo) {
uni.navigateTo({
url: '/pages-store/pages/order/index?id=' + item.id
@@ -171,43 +224,18 @@ defineExpose({
>
<view class="flex-center-sb items-start gap-16rpx">
<text class="order-time">{{ formatOrderCardTime(item) }}</text>
<text class="order-status shrink-0">
<template v-if="
item.refundStatus === OrderCancelStatus.APPLIED ||
item.refundStatus === OrderCancelStatus.APPROVED ||
item.refundStatus === OrderCancelStatus.REJECTED
">
<template v-if="item.refundStatus === OrderCancelStatus.APPLIED">
{{ t('pages-store.order.orderStatus.refund') }}
</template>
<template v-else-if="item.refundStatus === OrderCancelStatus.APPROVED">
{{ t('pages-store.order.orderStatus.agreeRefund') }}
</template>
<template v-else-if="item.refundStatus === OrderCancelStatus.REJECTED">
{{ t('pages-store.order.orderStatus.rejectRefund') }}
</template>
</template>
<template v-else>
<template v-if="item.orderStatus === OrderStatus.CANCELLED">{{ t('pages-store.order.orderStatus.cancelled') }}</template>
<template v-if="item.orderStatus === OrderStatus.PENDING_PAYMENT">{{ t('pages-store.order.orderStatus.pendingPayment') }}</template>
<template v-if="item.orderStatus === OrderStatus.HAS_PENDING_PAYMENT">{{ t('pages-store.order.orderStatus.hasPendingPayment') }}</template>
<template v-if="item.orderStatus === OrderStatus.MERCHANT_ACCEPTED">{{ t('pages-store.order.orderStatus.received') }}</template>
<template v-if="item.receiveMethod === 1 && item.orderStatus === OrderStatus.DELIVERING">{{ t('pages-store.order.orderStatus.delivering') }}</template>
<template v-if="item.orderStatus === OrderStatus.COMPLETED">{{ t('pages-store.order.orderStatus.delivered') }}</template>
<template v-if="item.orderStatus === OrderStatus.MERCHANT_REJECTED">
<text class="text-#FF6106">{{ t('pages-store.store.orderStatus.rejected') }}</text>
</template>
</template>
<text class="order-status shrink-0" :class="{ 'text-#FF6106': isSameCode(item.orderStatus, OrderStatus.MERCHANT_REJECTED) }">
{{ getOrderStatusText(item) }}
</text>
</view>
<view class="store-row">
<image src="@img/chef/126.png" class="store-icon" mode="aspectFit"></image>
<text class="store-name line-clamp-1">{{ item.merchantVo?.merchantName }}</text>
<view v-if="item.receiveMethod === 1" class="recv-tag recv-tag--del">
<view v-if="isSameCode(item.receiveMethod, 1)" class="recv-tag recv-tag--del">
{{ t('pages.order.DEL') }}
</view>
<view v-if="item.receiveMethod === 2" class="recv-tag recv-tag--pu">
<view v-if="isSameCode(item.receiveMethod, 2)" class="recv-tag recv-tag--pu">
{{ t('pages.order.PU') }}
</view>
</view>
@@ -237,38 +265,38 @@ defineExpose({
</scroll-view>
<view class="price-block shrink-0">
<text class="price-num">${{ formatOrderPrice(item) }}</text>
<text class="price-meta">{{ t('pages.order.totalItemCount', { count: getTotalDishCount(item) }) }}</text>
<text class="price-meta">{{ getTotalDishCountText(item) }}</text>
</view>
</view>
<view class="action-row" @click.stop>
<view class="action-left">
<image
v-if="item.receiveMethod === 2 && item.orderStatus === OrderStatus.MERCHANT_ACCEPTED"
v-if="isSameCode(item.receiveMethod, 2) && isSameCode(item.orderStatus, OrderStatus.MERCHANT_ACCEPTED)"
src="@img/chef/127.png"
class="action-icon"
/>
<image
v-if="item.orderStatus >= OrderStatus.MERCHANT_ACCEPTED && item.receiveMethod === 1"
v-if="!isSameCode(item.orderStatus, OrderStatus.PENDING_PAYMENT) && !isSameCode(item.orderStatus, OrderStatus.CANCELLED) && isSameCode(item.receiveMethod, 1)"
src="@img/chef/128.png"
class="action-icon"
@click="callPhone(item.merchantVo?.phone)"
/>
</view>
<view class="action-btns">
<template v-if="item.refundStatus !== OrderCancelStatus.APPLIED && item.refundStatus !== OrderCancelStatus.APPROVED">
<template v-if="!isRefundApplied(item) && !isRefundApproved(item)">
<view
v-if="item.orderStatus !== OrderStatus.CANCELLED && item.orderStatus !== OrderStatus.COMPLETED && item.orderStatus !== OrderStatus.MERCHANT_REJECTED"
v-if="!isSameCode(item.orderStatus, OrderStatus.CANCELLED) && !isSameCode(item.orderStatus, OrderStatus.COMPLETED) && !isSameCode(item.orderStatus, OrderStatus.MERCHANT_REJECTED)"
class="btn-outline"
@click="handleCancelClick(item)"
>{{ t('pages.order.cancelOrder') }}</view>
<view
v-if="item.receiveMethod === 2 && item.orderStatus === OrderStatus.MERCHANT_ACCEPTED"
v-if="isSameCode(item.receiveMethod, 2) && isSameCode(item.orderStatus, OrderStatus.MERCHANT_ACCEPTED)"
class="btn-primary"
@click="handleClick(item)"
>{{ t('pages-store.order.writeOff') }}</view>
<view
v-if="item.orderStatus === OrderStatus.COMPLETED && item?.dishReviewVoList?.length === 0"
v-if="isSameCode(item.orderStatus, OrderStatus.COMPLETED) && item?.dishReviewVoList?.length === 0"
class="btn-primary"
@click="handleClick(item)"
>{{ t('common.evaluate') }}</view>