From 4bc9476d59f7a85004047d154cef868f262d4860 Mon Sep 17 00:00:00 2001 From: mohammad sedighi Date: Sat, 11 Jul 2026 00:24:30 +0330 Subject: [PATCH] change transition structure 3 --- .../components/DashboardProfitSplit.vue | 394 ++++++++++++------ src/pages/dashboard/index.vue | 7 +- 2 files changed, 279 insertions(+), 122 deletions(-) diff --git a/src/pages/dashboard/components/DashboardProfitSplit.vue b/src/pages/dashboard/components/DashboardProfitSplit.vue index 091b1e8..d949820 100644 --- a/src/pages/dashboard/components/DashboardProfitSplit.vue +++ b/src/pages/dashboard/components/DashboardProfitSplit.vue @@ -1,123 +1,169 @@ @@ -197,33 +243,82 @@ import { computed, ref, watch } from 'vue' import moment from 'moment-jalaali' import { message } from 'ant-design-vue' import DashboardSectionHeader from '@/pages/dashboard/components/DashboardSectionHeader.vue' +import DashboardLabelWithHelp from '@/pages/dashboard/components/DashboardLabelWithHelp.vue' import BasicActionSheet from '@/components/BasicActionSheet.vue' import { formatDashboardAmount } from '@/pages/dashboard/dashboardFormat' import { deleteProfitConversion, + getDashboardFinance, getProfitConversions, storeProfitConversion, } from '@/api/dashboard' import type { DashboardFinance, ProfitConversion } from '@/model/dashboard' +import type { DashboardHelp } from '@/pages/dashboard/dashboardSectionCopy' import { toJalali } from '@core/utils/useDataTime' const props = defineProps<{ - finance?: DashboardFinance | null - startDate?: string - endDate?: string /** قیمت هر گرم برای مقدار پیش‌فرض سند */ unitPrice?: number }>() -const profitGoldGrams = computed(() => Number(props.finance?.profitGoldGrams ?? 0)) -const profitRial = computed(() => Number(props.finance?.profitRial ?? 0)) -const profitGoldValueRial = computed(() => Number(props.finance?.profitGoldValueRial ?? 0)) -const dailyRows = computed(() => props.finance?.daily ?? []) +const DEFAULT_RANGE_DAYS = 10 +const DATE_FMT = 'YYYY-MM-DD HH:mm:ss' +function defaultStart() { + return moment().subtract(DEFAULT_RANGE_DAYS, 'days').startOf('day').format(DATE_FMT) +} +function defaultEnd() { + return moment().endOf('day').format(DATE_FMT) +} + +const rangeStart = ref(defaultStart()) +const rangeEnd = ref(defaultEnd()) +// بازه‌ای که هم‌اکنون داده بر اساس آن بارگذاری شده +const activeStart = ref(rangeStart.value) +const activeEnd = ref(rangeEnd.value) + +const sectionHelp: DashboardHelp = { + description: + 'کارمزد معاملات بر اساس فیلدی که مشتری وارد می‌کند تفکیک می‌شود: وقتی مشتری «مبلغ ریالی» ثابت می‌زند کارمزد از طلا کسر می‌شود (سود طلایی)، و وقتی «وزن» ثابت می‌زند کارمزد از ریال کسر می‌شود (سود ریالی). اعداد بر اساس بازهٔ انتخابی همین بخش محاسبه می‌شوند.', + formula: 'سود طلایی = جمع کارمزدِ کسرشده از طلا (گرم) | سود ریالی = جمع کارمزدِ کسرشده از ریال (ریال)', +} +const goldHelp: DashboardHelp = { + description: 'مجموع کارمزدهایی که در معامله‌های «مبلغ‌محور» (مشتری مبلغ ریالی ثابت زده) از طلا کسر شده است.', + formula: 'مجموع کارمزد طلا (گرم) × قیمت روز = ارزش ریالی تقریبی', +} +const rialHelp: DashboardHelp = { + description: 'مجموع کارمزدهایی که در معامله‌های «وزن‌محور» (مشتری وزن ثابت زده) از ریال کسر شده است.', + formula: 'مجموع کارمزد ریالی معامله‌های وزن‌محور', +} + +const loading = ref(false) +const finance = ref(null) + +const profitGoldGrams = computed(() => Number(finance.value?.profitGoldGrams ?? 0)) +const profitRial = computed(() => Number(finance.value?.profitRial ?? 0)) +const profitGoldValueRial = computed(() => Number(finance.value?.profitGoldValueRial ?? 0)) +const dailyRows = computed(() => finance.value?.daily ?? []) + +// صفحه‌بندی جدول روزانه +const dailyPage = ref(1) +const dailyPageSize = 10 +const pagedDaily = computed(() => + dailyRows.value.slice((dailyPage.value - 1) * dailyPageSize, dailyPage.value * dailyPageSize), +) + +// سندها const conversions = ref([]) const conversionsLoading = ref(false) const conversionsTotalRial = ref(0) const conversionsTotalGram = ref(0) +const conversionsPage = ref(1) +const conversionsPageSize = 6 +const pagedConversions = computed(() => + conversions.value.slice( + (conversionsPage.value - 1) * conversionsPageSize, + conversionsPage.value * conversionsPageSize, + ), +) const sanadVisible = ref(false) const submitting = ref(false) @@ -241,13 +336,17 @@ function emptyForm(): SanadForm { rial_amount: null, gram_amount: null, unit_price: props.unitPrice ? Number(props.unitPrice) : null, - converted_at: moment().format('YYYY-MM-DD HH:mm:ss'), + converted_at: moment().format(DATE_FMT), description: null, } } const form = ref(emptyForm()) +const activeRangeLabel = computed( + () => `${jalaliDate(activeStart.value)} تا ${jalaliDate(activeEnd.value)}`, +) + function formatGram(value?: number | null) { return Number(value ?? 0).toLocaleString('fa-IR', { maximumFractionDigits: 4 }) } @@ -281,13 +380,26 @@ function syncFromGram() { } } +async function loadFinance() { + loading.value = true + try { + finance.value = await getDashboardFinance(activeStart.value, activeEnd.value) + dailyPage.value = 1 + } catch (e) { + console.error(e) + } finally { + loading.value = false + } +} + async function loadConversions() { conversionsLoading.value = true try { - const res = await getProfitConversions(props.startDate, props.endDate) + const res = await getProfitConversions(activeStart.value, activeEnd.value) conversions.value = res?.items ?? [] conversionsTotalRial.value = Number(res?.totalRial ?? 0) conversionsTotalGram.value = Number(res?.totalGram ?? 0) + conversionsPage.value = 1 } catch (e) { console.error(e) } finally { @@ -295,6 +407,23 @@ async function loadConversions() { } } +function reloadAll() { + void loadFinance() + void loadConversions() +} + +function applyRange() { + activeStart.value = rangeStart.value + activeEnd.value = rangeEnd.value + reloadAll() +} + +function resetRange() { + rangeStart.value = defaultStart() + rangeEnd.value = defaultEnd() + applyRange() +} + function openSanad() { form.value = emptyForm() sanadVisible.value = true @@ -347,13 +476,7 @@ async function removeConversion(id: number) { } } -watch( - () => [props.startDate, props.endDate], - () => { - void loadConversions() - }, - { immediate: true }, -) +reloadAll()