diff --git a/src/views/base/home/composables/usePriceChart.ts b/src/views/base/home/composables/usePriceChart.ts index 60dd1b9..03e62c5 100644 --- a/src/views/base/home/composables/usePriceChart.ts +++ b/src/views/base/home/composables/usePriceChart.ts @@ -1,15 +1,22 @@ import { computed, ref, watch } from 'vue' import { getAllPrices } from '@/api/home' -import type { Product } from '@/models/products' import { getProductsCatalog, getProductsCatalogRef } from '@/composables/useProductsCatalog' -import { getProductBuyPrice, resolvePriceOffsetRatio } from '@/utils/productPrice' -import { isKatodMesGroup, isMaftolMesGroup, isShamshMesGroup } from '@/utils/productDealMethod' -import { getTradeBuyPrice, getTradeSellPrice, lastPrice } from '@/utils/price' +import { getTradeBuyPrice, getTradeSellPrice } from '@/utils/price' export type ChartMetalType = 'katod' | 'maftol' | 'shamsh' type ChartPoint = [number, number] +/** + * مارک‌آپ ثابت روی قیمت بورس کالا برای نمودار: + * کاتد +۳٪ ، مفتول +۶٪ ، شمش +۱۲٪ + */ +export const CHART_METAL_MARKUP_RATIO: Record = { + katod: 0.03, + maftol: 0.06, + shamsh: 0.12, +} + /** Module-level chart state — one dataset shared by mobile and desktop PriceChart instances. */ const priceChartSeries = ref<{ name: string; data: ChartPoint[] }[]>([ { name: 'قیمت', data: [] }, @@ -20,65 +27,18 @@ const chartLoading = ref(false) const selectedChartMetal = ref('katod') const catalogProducts = getProductsCatalogRef() -function resolveChartProducts(products: Product[]) { - return { - katod: findKatodProduct(products), - maftol: findMaftolProduct(products), - shamsh: findShamshProduct(products), - } -} +const maftolChartRatio = computed(() => CHART_METAL_MARKUP_RATIO.maftol) +const shamshChartRatio = computed(() => CHART_METAL_MARKUP_RATIO.shamsh) -/** نسبت مفتول به کاتد — reactive به قیمت لحظه‌ای و کاتالوگ محصولات */ -const maftolChartRatio = computed(() => { - void lastPrice.value?.price_last - - const { katod, maftol } = resolveChartProducts(catalogProducts.value) - return deriveMetalChartRatio(maftol, katod) -}) - -/** نسبت شمش مس به کاتد */ -const shamshChartRatio = computed(() => { - void lastPrice.value?.price_last - - const { katod, shamsh } = resolveChartProducts(catalogProducts.value) - return deriveMetalChartRatio(shamsh, katod) -}) - -const selectedMetalChartRatio = computed(() => { - if (selectedChartMetal.value === 'maftol') { - return maftolChartRatio.value - } - if (selectedChartMetal.value === 'shamsh') { - return shamshChartRatio.value - } - return 0 -}) +const selectedMetalChartRatio = computed( + () => CHART_METAL_MARKUP_RATIO[selectedChartMetal.value], +) let chartFetchPromise: Promise | null = null let chartInitialized = false let metalOffsetPromise: Promise | null = null let metalOffsetLoaded = false -function findKatodProduct(products: Product[]) { - return ( - products.find((product) => isKatodMesGroup(product.group_type)) - ?? products.find((product) => (product.title ?? '').includes('کاتد')) - ) -} - -function findMaftolProduct(products: Product[]) { - return ( - products.find((product) => isMaftolMesGroup(product.group_type)) - ?? products.find((product) => (product.title ?? '').includes('مفتول')) - ) -} - -function findShamshProduct(products: Product[]) { - return products.find((product) => - isShamshMesGroup(product.group_type, product.title) - ) -} - function applyChartRatio(basePrice: number, ratio: number) { if (!ratio) { return basePrice @@ -87,7 +47,7 @@ function applyChartRatio(basePrice: number, ratio: number) { return Math.round(basePrice + basePrice * ratio) } -/** بالاترین/پایین‌ترین امروز — برای boursecu با نسبت مفتول/شمش نسبت به کاتد */ +/** بالاترین/پایین‌ترین امروز — همان مارک‌آپ ثابت فلز روی قیمت بورس کالا */ export function resolveMetalDayRangePrices(options: { price: { up?: { buy?: number; sell?: number }; buy?: number; sell?: number; price_last?: number } | null | undefined metal: ChartMetalType @@ -95,44 +55,14 @@ export function resolveMetalDayRangePrices(options: { }) { const baseHigh = options.price?.up?.buy ?? getTradeBuyPrice(options.price as Parameters[0]) const baseLow = options.price?.up?.sell ?? getTradeSellPrice(options.price as Parameters[0]) - - if (options.metal === 'katod') { - return { high: baseHigh, low: baseLow } - } + const ratio = options.metalRatio || CHART_METAL_MARKUP_RATIO[options.metal] return { - high: applyChartRatio(baseHigh, options.metalRatio), - low: applyChartRatio(baseLow, options.metalRatio), + high: applyChartRatio(baseHigh, ratio), + low: applyChartRatio(baseLow, ratio), } } -function deriveMetalChartRatio(metalProduct?: Product, katodProduct?: Product) { - const metalOffset = resolvePriceOffsetRatio(metalProduct?.price_offset_percent) - if (metalOffset) { - return metalOffset - } - - if (!metalProduct) { - return 0 - } - - const liveBuy = getTradeBuyPrice(lastPrice.value) - const katodLive = katodProduct ? getProductBuyPrice(katodProduct) : liveBuy - const metalLive = getProductBuyPrice(metalProduct) - - const katodStatic = Number(katodProduct?.price ?? 0) + Number(katodProduct?.price_profit ?? 0) - const metalStatic = Number(metalProduct.price ?? 0) + Number(metalProduct.price_profit ?? 0) - - const referencePrice = katodLive || liveBuy || katodStatic - const derivedMetalPrice = metalLive || metalStatic - - if (!referencePrice || !derivedMetalPrice || referencePrice === derivedMetalPrice) { - return 0 - } - - return (derivedMetalPrice - referencePrice) / referencePrice -} - function normalizeChartTimestamp(timestamp: number) { return timestamp < 1_000_000_000_000 ? timestamp * 1000 : timestamp } @@ -165,15 +95,9 @@ function buildChartPoints(items: Array<{ timestamp: number; value: number }>): C function syncChartSeries() { const ratio = selectedMetalChartRatio.value - const data = - selectedChartMetal.value !== 'katod' - ? rawChartPoints.value.map( - ([timestamp, value]) => - [timestamp, applyChartRatio(value, ratio)] as ChartPoint - ) - : rawChartPoints.value - - priceChartSeries.value[0].data = data + priceChartSeries.value[0].data = rawChartPoints.value.map( + ([timestamp, value]) => [timestamp, applyChartRatio(value, ratio)] as ChartPoint, + ) } watch([selectedChartMetal, maftolChartRatio, shamshChartRatio], () => { @@ -242,10 +166,7 @@ function updateChartData(timeline: string) { function setChartMetal(metal: ChartMetalType) { selectedChartMetal.value = metal - - if (metal !== 'katod' && !catalogProducts.value.length) { - void loadMetalChartOffsets(true) - } + syncChartSeries() } export function usePriceChart() {