From a984710c0a210aaea54fdccfffd7925b7b65c00b Mon Sep 17 00:00:00 2001 From: adonis Date: Sat, 6 Jun 2026 22:41:42 +0330 Subject: [PATCH] limit added --- components.d.ts | 1 + src/models/products.ts | 3 + src/utils/productOrderLimit.ts | 72 +++++++++++++++++++ src/views/base/gold/index.vue | 33 +++++++-- .../base/products/components/DealProduct.vue | 24 ++++++- 5 files changed, 127 insertions(+), 6 deletions(-) create mode 100644 src/utils/productOrderLimit.ts diff --git a/components.d.ts b/components.d.ts index 2da2181..d71d442 100644 --- a/components.d.ts +++ b/components.d.ts @@ -8,6 +8,7 @@ export {} declare module 'vue' { export interface GlobalComponents { AButton: typeof import('ant-design-vue/es')['Button'] + AConfigProvider: typeof import('ant-design-vue/es')['ConfigProvider'] ADivider: typeof import('ant-design-vue/es')['Divider'] AForm: typeof import('ant-design-vue/es')['Form'] AFormItem: typeof import('ant-design-vue/es')['FormItem'] diff --git a/src/models/products.ts b/src/models/products.ts index d1973e8..0781dc3 100644 --- a/src/models/products.ts +++ b/src/models/products.ts @@ -19,6 +19,9 @@ export interface Product { percent_fee_sell: number | undefined cash_fee_buy: number | undefined cash_fee_sell: number | undefined + order_limit_enabled?: boolean + min_order_cash?: number | null + max_order_cash?: number | null direct_price: number | undefined reading_method: any created_at: any diff --git a/src/utils/productOrderLimit.ts b/src/utils/productOrderLimit.ts new file mode 100644 index 0000000..7eac6f9 --- /dev/null +++ b/src/utils/productOrderLimit.ts @@ -0,0 +1,72 @@ +import type { Product } from '@/models/products' +import { usePriceWithoutType } from '@/utils/usePrice' + +type LimitProduct = Pick | null | undefined + +export function productOrderLimitEnabled(product?: LimitProduct): boolean { + if (!product?.order_limit_enabled) return false + return product.min_order_cash != null || product.max_order_cash != null +} + +export function productMinOrderCash(product?: LimitProduct, isBuy = true, defaultBuyMin = 500_000): number { + if (productOrderLimitEnabled(product) && product?.min_order_cash != null) { + return Number(product.min_order_cash) + } + return isBuy ? defaultBuyMin : 0 +} + +export function productMaxOrderCash(product?: LimitProduct): number | undefined { + if (productOrderLimitEnabled(product) && product?.max_order_cash != null) { + return Number(product.max_order_cash) + } + return undefined +} + +export function productCashValidationMessage( + product: LimitProduct, + goldCash: number | string | undefined, + isBuy: boolean, + formatPrice: (value: number) => string = usePriceWithoutType +): string { + if (goldCash === '' || goldCash === undefined) return '' + + const cash = Number(goldCash ?? 0) + const min = productMinOrderCash(product, isBuy) + const max = productMaxOrderCash(product) + + if (max != null && cash > max) { + return `حداکثر مبلغ این محصول ${formatPrice(max)} ریال است` + } + + if (min > 0 && cash < min) { + if (productOrderLimitEnabled(product) && product?.min_order_cash != null) { + return `حداقل مبلغ این محصول ${formatPrice(min)} ریال است` + } + return `حداقل مبلغ طلا جهت ${isBuy ? 'خرید' : 'فروش'} ${formatPrice(min)} ریال می باشد.` + } + + return '' +} + +export function validateProductOrderLimitForm(form: { + order_limit_enabled?: boolean + min_order_cash?: number | string | null + max_order_cash?: number | string | null +}): string | null { + if (!form.order_limit_enabled) return null + + const min = form.min_order_cash + const max = form.max_order_cash + const hasMin = min != null && min !== '' + const hasMax = max != null && max !== '' + + if (!hasMin && !hasMax) { + return 'با فعال بودن محدودیت مبلغ سفارش، حداقل یکی از حداقل یا حداکثر مبلغ باید وارد شود' + } + + if (hasMin && hasMax && Number(min) > Number(max)) { + return 'حداقل مبلغ نمی‌تواند بیشتر از حداکثر باشد' + } + + return null +} diff --git a/src/views/base/gold/index.vue b/src/views/base/gold/index.vue index d1ec275..cfb842e 100644 --- a/src/views/base/gold/index.vue +++ b/src/views/base/gold/index.vue @@ -58,6 +58,9 @@ place-holder="مقدار طلا" size="large" type="text" inputmode="decimal" @onchange="calculateCash" /> +
+ {{ cashValidationMessage }} +
@@ -119,9 +122,9 @@ ({{ walletStore?.walletInfo?.gold }}گرم) می باشد.
-
- حداقل مقدار طلا جهت خرید 500,000 ریال می باشد. + موجودی کیف پول ناکافی می باشد.
@@ -236,6 +239,11 @@ import { calcFeeInGrams, loadServiceFeeFromSettings } from '@/utils/serviceFee' import { formatCashWalletBalanceText, formatGoldWalletBalanceText } from '@/utils/productDealMethod' import { useSettingsStore } from '@/store/settingsStore' import { storeToRefs } from 'pinia' +import { + productCashValidationMessage, + productMaxOrderCash, + productMinOrderCash +} from '@/utils/productOrderLimit' const infoVisible = ref(false) const walletStore = useWalletStore() @@ -293,13 +301,25 @@ const payablePrice = computed(() => isBuy.value ? finalPrice.value + feeInRial.value : finalPrice.value - feeInRial.value ) +const minOrderCash = computed(() => productMinOrderCash(props.ProductItem, isBuy.value)) +const maxOrderCash = computed(() => productMaxOrderCash(props.ProductItem)) +const cashValidationMessage = computed(() => + productCashValidationMessage(props.ProductItem, form.value?.goldCash, isBuy.value, usePriceWithoutType) +) + const disableTransaction = computed(() => loading.value || form.value?.goldValue === undefined || form.value?.goldValue === '' || form.value?.goldCash === '' || form.value?.goldCash === undefined || - (isBuy.value ? (form.value?.goldCash ?? 0) < 500000 : (form.value?.goldValue ?? 0) < 0.001) || + (isBuy.value + ? (form.value?.goldCash ?? 0) < minOrderCash.value + : (productMinOrderCash(props.ProductItem, false) > 0 || productMaxOrderCash(props.ProductItem) != null + ? ((form.value?.goldCash ?? 0) < minOrderCash.value || (maxOrderCash.value != null && (form.value?.goldCash ?? 0) > maxOrderCash.value)) + : (form.value?.goldValue ?? 0) < 0.001)) || + (maxOrderCash.value != null && (form.value?.goldCash ?? 0) > maxOrderCash.value) || + cashValidationMessage.value !== '' || (!isBuy.value && form.value.goldValue > walletStore?.walletInfo?.gold) || !lastPrice.value || (isBuy.value ? getTradeBuyPrice(lastPrice.value) <= 0 : getTradeSellPrice(lastPrice.value) <= 0)) @@ -592,6 +612,10 @@ async function initPrice() { } function okConfirm() { + if (cashValidationMessage.value) { + message.warning(cashValidationMessage.value) + return + } confirmAction.value = true } @@ -602,7 +626,8 @@ async function ok() { await createOrder({ direction: isBuy.value ? 1 : 2, price: isBuy.value ? getTradeBuyPrice(lastPrice.value) : getTradeSellPrice(lastPrice.value), - amount: form.value.goldValue ?? 0 + amount: form.value.goldValue ?? 0, + abshode_id: props.ProductItem?.id, }) await walletStore.getMyWallet() await router.push({ name: 'transactions' }) diff --git a/src/views/base/products/components/DealProduct.vue b/src/views/base/products/components/DealProduct.vue index ed296c7..6732e76 100644 --- a/src/views/base/products/components/DealProduct.vue +++ b/src/views/base/products/components/DealProduct.vue @@ -79,6 +79,10 @@
{{ usePrice(form.goldCash ?? 0) }}
+
+ {{ cashValidationMessage }} +
+
وزن کل
{{ totalWeightDisplay }}
@@ -276,6 +280,11 @@ import { isCountBasedProduct, shouldShowProductTotalWeight, } from '@/utils/productDealMethod' +import { + productCashValidationMessage, + productMaxOrderCash, + productMinOrderCash +} from '@/utils/productOrderLimit' const typeDeal = computed(() => getProductDealMethodOptions(props?.ProductItem?.group_type)) @@ -377,14 +386,25 @@ const sellPagination = ref({ const finalPrice = computed(() => (form.value?.goldValue * (isBuy.value ? props.ProductItem?.price ?? 0 : props.ProductItem?.sellPrice ?? 0))) const payablePrice = computed(() => finalPrice.value) +const minOrderCash = computed(() => productMinOrderCash(props.ProductItem, isBuy.value)) +const maxOrderCash = computed(() => productMaxOrderCash(props.ProductItem)) +const cashValidationMessage = computed(() => + productCashValidationMessage(props.ProductItem, form.value?.goldCash, isBuy.value, usePriceWithoutType) +) + const disableTransaction = computed(() => loading.value || form.value?.goldValue === undefined || form.value?.goldValue === '' || form.value?.goldCash === '' || form.value?.goldCash === undefined || - (isBuy.value ? (form.value?.goldCash ?? 0) < 500000 : (form.value?.goldValue ?? 0) < 0.001) || - // (!isBuy.value && form.value.goldValue > walletStore?.walletInfo?.gold) || + (isBuy.value + ? (form.value?.goldCash ?? 0) < minOrderCash.value + : (productMinOrderCash(props.ProductItem, false) > 0 || productMaxOrderCash(props.ProductItem) != null + ? ((form.value?.goldCash ?? 0) < minOrderCash.value || (maxOrderCash.value != null && (form.value?.goldCash ?? 0) > maxOrderCash.value)) + : (form.value?.goldValue ?? 0) < 0.001)) || + (maxOrderCash.value != null && (form.value?.goldCash ?? 0) > maxOrderCash.value) || + cashValidationMessage.value !== '' || !lastPrice.value || (isBuy.value ? getTradeBuyPrice(lastPrice.value) <= 0 : getTradeSellPrice(lastPrice.value) <= 0))