From 65fe1c39960e475cc6d1f29d68e8171a48ec39da Mon Sep 17 00:00:00 2001 From: mohammad sedighi Date: Sat, 11 Jul 2026 00:50:28 +0330 Subject: [PATCH] change transition structure 5 --- .../DashboardTradingIncomeSummary.vue | 154 ++++++++++-------- src/pages/dashboard/dashboardSectionCopy.ts | 4 +- 2 files changed, 85 insertions(+), 73 deletions(-) diff --git a/src/pages/dashboard/components/DashboardTradingIncomeSummary.vue b/src/pages/dashboard/components/DashboardTradingIncomeSummary.vue index dc297d1..074bd50 100644 --- a/src/pages/dashboard/components/DashboardTradingIncomeSummary.vue +++ b/src/pages/dashboard/components/DashboardTradingIncomeSummary.vue @@ -10,11 +10,7 @@ v-for="row in rows" :key="row.key" class="dashboard-income-summary__card" - :class="{ - 'dashboard-income-summary__card--total': row.isTotal, - 'dashboard-income-summary__card--gold': row.tone === 'gold', - 'dashboard-income-summary__card--rial': row.tone === 'rial', - }" + :class="{ 'dashboard-income-summary__card--total': row.isTotal }" > {{ row.hint }}

{{ row.amount }} - {{ row.unit }} + {{ unit }}

-

{{ row.sub }}

+ +
+ + ریالی + + {{ formatDashboardAmount(rialFee) }} ریال + + + + طلایی + + {{ formatGram(goldFeeGrams) }} گرم ≈ {{ formatDashboardAmount(goldFeeRial) }} ریال + + +
@@ -39,7 +49,7 @@ import { computed } from 'vue' import DashboardSectionHeader from '@/pages/dashboard/components/DashboardSectionHeader.vue' import DashboardLabelWithHelp from '@/pages/dashboard/components/DashboardLabelWithHelp.vue' -import { dashboardTradingIncomeSummary } from '@/pages/dashboard/dashboardSectionCopy' +import { dashboardTradingIncomeSummary, dashboardKpi } from '@/pages/dashboard/dashboardSectionCopy' import { DASHBOARD_RIAL_UNIT, formatDashboardAmount } from '@/pages/dashboard/dashboardFormat' import type { DashboardFinance } from '@/model/dashboard' import type { DashboardHelp } from '@/pages/dashboard/dashboardSectionCopy' @@ -54,61 +64,56 @@ const props = withDefaults( ) const help = dashboardTradingIncomeSummary +const unit = DASHBOARD_RIAL_UNIT +// سود اختلاف قیمت +const priceDiffRial = computed(() => Number(props.finance?.fullPriceSood ?? 0)) +// کارمزد ریالی: از معامله‌های وزن‌محور (fee_asset = rial) const rialFee = computed(() => Number(props.finance?.profitRial ?? 0)) +// کارمزد طلایی: از معامله‌های مبلغ‌محور (fee_asset = gold) const goldFeeGrams = computed(() => Number(props.finance?.profitGoldGrams ?? 0)) const goldFeeRial = computed(() => Number(props.finance?.profitGoldValueRial ?? 0)) -const totalFeeRial = computed(() => rialFee.value + goldFeeRial.value) +// کارمزد ترکیبی به ریال = کارمزد ریالی + معادل ریالی کارمزد طلایی +const commissionRial = computed(() => rialFee.value + goldFeeRial.value) +// جمع سود = اختلاف قیمت + کارمزد ترکیبی +const totalRial = computed(() => priceDiffRial.value + commissionRial.value) function formatGram(value: number) { return value.toLocaleString('fa-IR', { maximumFractionDigits: 4 }) } -const rialFeeHelp: DashboardHelp = { - description: 'مجموع کارمزدهایی که در معاملات «وزن‌محور» از مبلغ ریالی مشتری کسر شده است.', - formula: 'جمع service_charge_price سفارش‌هایی که fee_asset = rial', -} -const goldFeeHelp: DashboardHelp = { - description: 'مجموع کارمزدهایی که در معاملات «مبلغ‌محور» از طلای مشتری کسر شده است.', - formula: 'گرم کارمزد × قیمت روز = معادل ریالی', -} -const totalFeeHelp: DashboardHelp = { - description: 'جمع کل درآمد کارمزدی فروشگاه در بازه — ریالی مستقیم به‌علاوهٔ معادل ریالی کارمزد طلایی.', - formula: 'جمع = کارمزد ریالی + معادل ریالی کارمزد طلایی', +const commissionHelp: DashboardHelp = { + description: + 'کارمزد ترکیبی از دو نوع معامله است: در معامله‌های مبلغ‌محور (مشتری مبلغ ریالی ثابت زده) کارمزد از طلا کسر می‌شود، و در معامله‌های وزن‌محور (مشتری وزن ثابت زده) از ریال. این مبلغ مجموع کارمزد ریالی به‌علاوهٔ معادل ریالی کارمزد طلایی است.', + formula: 'کارمزد = کارمزد ریالی + (گرم کارمزد طلایی × قیمت روز)', } const rows = computed(() => [ { - key: 'rialFee', - label: 'کارمزد ریالی', - hint: 'کسرشده از مبلغ ریالی معامله', - amount: formatDashboardAmount(rialFee.value), - unit: DASHBOARD_RIAL_UNIT, - sub: undefined as string | undefined, - help: rialFeeHelp, - tone: 'rial' as const, + key: 'priceDiff', + label: 'سود اختلاف قیمت', + hint: 'فاصله بین قیمت پایه و قیمت مشتری', + amount: formatDashboardAmount(priceDiffRial.value), + help: dashboardKpi.priceDiffProfit, + breakdown: false, isTotal: false, }, { - key: 'goldFee', - label: 'کارمزد طلایی', - hint: 'کسرشده از وزن طلای معامله', - amount: formatGram(goldFeeGrams.value), - unit: 'گرم', - sub: `معادل ${formatDashboardAmount(goldFeeRial.value)} ${DASHBOARD_RIAL_UNIT}`, - help: goldFeeHelp, - tone: 'gold' as const, + key: 'commission', + label: 'کارمزد', + hint: 'ترکیبی از کارمزد ریالی و طلایی', + amount: formatDashboardAmount(commissionRial.value), + help: commissionHelp, + breakdown: true, isTotal: false, }, { key: 'total', - label: 'جمع کارمزد', - hint: 'کارمزد ریالی + معادل ریالی طلا', - amount: formatDashboardAmount(totalFeeRial.value), - unit: DASHBOARD_RIAL_UNIT, - sub: undefined as string | undefined, - help: totalFeeHelp, - tone: undefined, + label: 'جمع سود', + hint: 'اختلاف قیمت + کارمزد ترکیبی', + amount: formatDashboardAmount(totalRial.value), + help: dashboardKpi.totalTradingProfit, + breakdown: false, isTotal: true, }, ]) @@ -130,32 +135,33 @@ const rows = computed(() => [ } .dashboard-income-summary__grid { - display: flex; - flex-direction: column; + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 0.5rem; } +/* در حالت کناری، کارت‌ها زیر هم */ +.dashboard-income-summary--sidebar .dashboard-income-summary__grid { + grid-template-columns: 1fr; +} + +@media (max-width: 640px) { + .dashboard-income-summary__grid { + grid-template-columns: 1fr; + } +} + .dashboard-income-summary__card { display: flex; flex-direction: column; gap: 0.15rem; - min-height: 4.5rem; + min-height: 4.75rem; padding: 0.5rem 0.6rem; border-radius: 0.5rem; border: 1px solid var(--admin-border); background: var(--admin-bg-muted); } -.dashboard-income-summary__card--gold { - border-color: rgba(245, 158, 11, 0.4); - background: rgba(245, 158, 11, 0.1); -} - -.dashboard-income-summary__card--rial { - border-color: rgba(14, 165, 233, 0.35); - background: rgba(14, 165, 233, 0.1); -} - .dashboard-income-summary__card--total { border-color: rgba(245, 158, 11, 0.4); background: rgba(245, 158, 11, 0.1); @@ -181,7 +187,6 @@ const rows = computed(() => [ direction: ltr; text-align: right; unicode-bidi: isolate; - color: var(--admin-text); } .dashboard-income-summary__amount { @@ -202,12 +207,29 @@ const rows = computed(() => [ color: var(--admin-text-secondary); } -.dashboard-income-summary__sub { - margin: 0; - font-size: 0.6875rem; +.dashboard-income-summary__breakdown { + margin-top: 0.35rem; + display: flex; + flex-direction: column; + gap: 0.2rem; + padding-top: 0.35rem; + border-top: 1px dashed var(--admin-border); +} + +.dashboard-income-summary__breakdown-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 0.5rem; + font-size: 0.625rem; color: var(--admin-text-secondary); +} + +.dashboard-income-summary__breakdown-val { + font-weight: 700; + color: var(--admin-text); + font-variant-numeric: tabular-nums; direction: ltr; - text-align: right; unicode-bidi: isolate; } @@ -220,15 +242,5 @@ html.is-dark { .dashboard-income-summary__card--total .dashboard-income-summary__amount { color: #fcd34d; } - - .dashboard-income-summary__card--gold { - border-color: rgba(245, 158, 11, 0.45); - background: rgba(245, 158, 11, 0.14); - } - - .dashboard-income-summary__card--rial { - border-color: rgba(14, 165, 233, 0.4); - background: rgba(14, 165, 233, 0.14); - } } diff --git a/src/pages/dashboard/dashboardSectionCopy.ts b/src/pages/dashboard/dashboardSectionCopy.ts index 055d8b6..c22c99a 100644 --- a/src/pages/dashboard/dashboardSectionCopy.ts +++ b/src/pages/dashboard/dashboardSectionCopy.ts @@ -58,8 +58,8 @@ export const dashboardKpi = { } as const satisfies Record export const dashboardTradingIncomeSummary = help( - 'تفکیک کارمزد فروشگاه در بازهٔ انتخابی: بخشی از ریال مشتری کسر شده (کارمزد ریالی) و بخشی از طلا (کارمزد طلایی با معادل ریالی). جمع = مجموع هر دو به ریال.', - 'جمع کارمزد = کارمزد ریالی + (گرم کارمزد طلایی × قیمت روز)' + 'در بازهٔ انتخابی، درآمد معاملات به سه بخش دیده می‌شود: سود اختلاف قیمت، کارمزد (ترکیبی از کارمزد ریالی و معادل ریالی کارمزد طلایی)، و جمع این دو. همهٔ مبالغ به ریال هستند (نه تومان).', + 'جمع سود = سود اختلاف قیمت + [کارمزد ریالی + (گرم کارمزد طلایی × قیمت روز)]' ) export const dashboardDateRange = help(