From 594ace25f134e2b68d6b9d75b74b7a2fec739a1f Mon Sep 17 00:00:00 2001 From: adonis Date: Wed, 17 Jun 2026 16:03:19 +0330 Subject: [PATCH] fix fallback base on show product --- src/models/products.ts | 1 + src/utils/productCategories.ts | 14 ++++++++++++++ src/utils/productDealMethod.ts | 18 ++++++++++++++++-- src/utils/productPrice.ts | 8 +++++--- src/views/base/gold/index.vue | 4 ++-- .../base/products/components/ProductItem.vue | 7 ++++++- .../desktop/components/DesktopProductCard.vue | 13 ++++--------- src/views/base/products/index.vue | 6 +++--- 8 files changed, 51 insertions(+), 20 deletions(-) diff --git a/src/models/products.ts b/src/models/products.ts index c743fe0..fcedf49 100644 --- a/src/models/products.ts +++ b/src/models/products.ts @@ -26,6 +26,7 @@ export interface Product { direct_price: number | undefined price_offset_percent?: number | null use_last_price_if_zero?: boolean + trade_by_quantity?: boolean reading_method: any created_at: any updated_at: any diff --git a/src/utils/productCategories.ts b/src/utils/productCategories.ts index ee0350f..b09c11f 100644 --- a/src/utils/productCategories.ts +++ b/src/utils/productCategories.ts @@ -32,6 +32,20 @@ export function isMeltedTradeGroup(groupType?: string | null) { return group === PRODUCT_CATEGORY_ABSHODE || LEGACY_MELTED_GROUP_TYPES.includes(group as typeof LEGACY_MELTED_GROUP_TYPES[number]) } +export interface QuantityTradeProductSource { + group_type?: string | null + trade_by_quantity?: boolean | number | null +} + +/** معامله مقداری: فقط فیلد trade_by_quantity — بدون وابستگی به دسته‌بندی */ +export function usesQuantityTrade(product?: QuantityTradeProductSource | null) { + if (!product) { + return false + } + + return product.trade_by_quantity === true || Number(product.trade_by_quantity) === 1 +} + export function isMetalCommodityGroup(groupType?: string | null) { const group = normalizeProductGroupType(groupType) return group === 'مس' || group === 'نقره' diff --git a/src/utils/productDealMethod.ts b/src/utils/productDealMethod.ts index 63d3323..9e2c27f 100644 --- a/src/utils/productDealMethod.ts +++ b/src/utils/productDealMethod.ts @@ -56,10 +56,24 @@ export function isWeightBasedProductUnit(unit?: string | null) { const COUNT_BASED_GROUP_TYPES = ['سکه', 'گوی', 'مکعب', 'شمش', 'سکه پارسیان'] -/** مطابق ادمین: وزن «دارد» یعنی amount مقدار واقعی است؛ «ندارد» یعنی amount = 1 */ +/** مطابق ادمین: وزن «دارد» => amount > 0 ؛ «ندارد» => amount = 0 */ export function hasProductUnitWeight(product?: ProductUnitSource | null) { + if (isMeltedTradeGroup(product?.group_type)) { + return false + } + const amount = Number(product?.amount ?? 0) - return amount > 0 && amount !== 1 + return amount > 0 +} + +/** ضریب قیمت — محصول بدون وزن قطعه همیشه ۱ */ +export function productPriceAmountFactor(product?: ProductUnitSource | null) { + if (hasProductUnitWeight(product)) { + const amount = Number(product?.amount ?? 0) + return amount > 0 ? amount : 1 + } + + return 1 } export function getProductWeightUnit(product?: ProductUnitSource | null) { diff --git a/src/utils/productPrice.ts b/src/utils/productPrice.ts index 75308b6..0422309 100644 --- a/src/utils/productPrice.ts +++ b/src/utils/productPrice.ts @@ -1,6 +1,7 @@ import type { Product } from '@/models/products' import { getTradeBuyPrice, getTradeSellPrice, lastPrice } from '@/utils/price' -import { isMetalCommodityGroup, isMeltedProductUsingAppPrice, isMeltedTradeGroup } from '@/utils/productCategories' +import { isMetalCommodityGroup, isMeltedProductUsingAppPrice, isMeltedTradeGroup, usesQuantityTrade } from '@/utils/productCategories' +import { productPriceAmountFactor } from '@/utils/productDealMethod' function productUsesLastPriceIfZero(product: Product): boolean { return Boolean(product.use_last_price_if_zero) @@ -89,13 +90,14 @@ export function getProductBuyPrice(product: Product): number { isMeltedProductUsingAppPrice(product) || isMeltedTradeGroup(product.group_type) || isMetalCommodityGroup(product.group_type) + || usesQuantityTrade(product) ) { return base + fee } const withFee = base + fee return product.direct_price === 0 - ? withFee * Number(product.amount ?? 0) + ? withFee * productPriceAmountFactor(product) : withFee } @@ -138,7 +140,7 @@ export function getProductSellPrice(product: Product): number { return 0 } - if (isMeltedProductUsingAppPrice(product) || isMeltedTradeGroup(product.group_type)) { + if (isMeltedProductUsingAppPrice(product) || isMeltedTradeGroup(product.group_type) || usesQuantityTrade(product)) { return base - Number(product.cash_fee_sell ?? 0) } diff --git a/src/views/base/gold/index.vue b/src/views/base/gold/index.vue index 2d538ca..a14f040 100644 --- a/src/views/base/gold/index.vue +++ b/src/views/base/gold/index.vue @@ -300,7 +300,7 @@ import { isStoreClosed, getStoreClosedMessage } from '@/utils/storeHours' import { formatCashWalletBalanceText, getWeightUnit } from '@/utils/productDealMethod' import { formatProductWalletBalanceText, getCashWalletBalance, getProductInventoryQuantity } from '@/utils/productAssets' import { useWalletAssets } from '@/composables/useWalletAssets' -import { isMeltedTradeGroup } from '@/utils/productCategories' +import { usesQuantityTrade } from '@/utils/productCategories' import { useSettingsStore } from '@/store/settingsStore' import { storeToRefs } from 'pinia' import { @@ -381,7 +381,7 @@ const sellPagination = ref({ const unitPrice = computed(() => { const product = props.ProductItem - if (isMeltedTradeGroup(product?.group_type)) { + if (usesQuantityTrade(product)) { return isBuy.value ? getProductBuyPrice(product!) : getProductSellPrice(product!) } return isBuy.value ? getTradeBuyPrice(lastPrice.value) : getTradeSellPrice(lastPrice.value) diff --git a/src/views/base/products/components/ProductItem.vue b/src/views/base/products/components/ProductItem.vue index 8a36820..941895a 100644 --- a/src/views/base/products/components/ProductItem.vue +++ b/src/views/base/products/components/ProductItem.vue @@ -89,7 +89,7 @@ const displayImage = computed(() => {
{{ props.ProductItem.title }}

-
{{usePrice(goldPriceValue)}}
+
{{usePrice(goldPriceValue)}}
{{usePrice(price)}}
@@ -111,6 +111,8 @@ import type {Product} from "@/models/products"; import {usePrice} from "../../../../utils/usePrice"; import {computed, ref} from "vue"; import type {Price} from "@/models/home"; +import { usesQuantityTrade } from '@/utils/productCategories' +import { getProductBuyPrice } from '@/utils/productPrice' interface Prop { ProductItem: Product @@ -132,6 +134,9 @@ const price = computed(()=>{ const priceLast = computed((): Price => lastPrice.value ?? 0) const goldPriceValue = computed(() => { + if (usesQuantityTrade(props.ProductItem)) { + return getProductBuyPrice(props.ProductItem) + } if (!priceLast.value) return 0 return priceLast.value.buy }) diff --git a/src/views/base/products/desktop/components/DesktopProductCard.vue b/src/views/base/products/desktop/components/DesktopProductCard.vue index f0c13df..098da33 100644 --- a/src/views/base/products/desktop/components/DesktopProductCard.vue +++ b/src/views/base/products/desktop/components/DesktopProductCard.vue @@ -13,7 +13,7 @@ {{ product.group_type }}

{{ product.title }}

-