fix bug 22/4
This commit is contained in:
@@ -1,81 +1,100 @@
|
||||
<template>
|
||||
<a-form :model="form" ref="formRef" autocomplete="off">
|
||||
<div class="space-y-3">
|
||||
<div class="flex flex-col items-center gap-1 rounded-xl bg-gray-50 px-4 py-3 sm:flex-row sm:justify-center sm:gap-4">
|
||||
<div
|
||||
class="flex flex-col items-center gap-1 rounded-xl bg-gray-50 px-4 py-3 sm:flex-row sm:justify-center sm:gap-4"
|
||||
>
|
||||
<span class="text-sm text-gray-600">{{ metalLabel.goldTradeBuySell(form.direction) }}</span>
|
||||
<span class="text-sm font-700 text-gray-900">{{ marketPriceLabel }}</span>
|
||||
</div>
|
||||
|
||||
<a-form-item label="نوع تراکنش" name="direction" :rules="inputRules()">
|
||||
<a-radio-group v-model:value="form.direction" button-style="solid" @change="$emit('changePrice')">
|
||||
<a-radio-button :value="1">خرید</a-radio-button>
|
||||
<a-radio-button :value="2">فروش</a-radio-button>
|
||||
</a-radio-group>
|
||||
</a-form-item>
|
||||
<div class="grid gap-3 md:grid-cols-2 md:gap-4 md:items-start">
|
||||
<div class="space-y-3">
|
||||
<a-form-item label="نوع تراکنش" name="direction" :rules="inputRules()" class="mb-0">
|
||||
<a-radio-group
|
||||
v-model:value="form.direction"
|
||||
button-style="solid"
|
||||
@change="$emit('changePrice')"
|
||||
>
|
||||
<a-radio-button :value="1">خرید</a-radio-button>
|
||||
<a-radio-button :value="2">فروش</a-radio-button>
|
||||
</a-radio-group>
|
||||
</a-form-item>
|
||||
|
||||
<a-form-item
|
||||
:label="`قیمت ${form.direction === 1 ? 'خرید' : 'فروش'} هر گرم`"
|
||||
name="price"
|
||||
:rules="inputRules()"
|
||||
>
|
||||
<BasicInput
|
||||
v-model:value="form.price"
|
||||
addon-before="ریال"
|
||||
type="price"
|
||||
@change="$emit('changePriceValue')"
|
||||
/>
|
||||
</a-form-item>
|
||||
<a-form-item
|
||||
:label="`قیمت ${form.direction === 1 ? 'خرید' : 'فروش'} هر گرم`"
|
||||
name="price"
|
||||
:rules="inputRules()"
|
||||
class="mb-0"
|
||||
>
|
||||
<BasicInput
|
||||
v-model:value="form.price"
|
||||
addon-before="ریال"
|
||||
type="price"
|
||||
@onchange="$emit('changePriceValue')"
|
||||
/>
|
||||
</a-form-item>
|
||||
|
||||
<a-form-item label="تاریخ سفارش" name="pay_at" :rules="inputRules()">
|
||||
<BaseDatePicker v-model:value="form.pay_at" format="YYYY-MM-DD HH:mm:ss" />
|
||||
</a-form-item>
|
||||
<a-form-item label="تاریخ سفارش" name="pay_at" :rules="inputRules()" class="mb-0">
|
||||
<BaseDatePicker v-model:value="form.pay_at" format="YYYY-MM-DD HH:mm:ss" />
|
||||
</a-form-item>
|
||||
|
||||
<a-form-item label="سود" name="difference" :rules="inputRules()">
|
||||
<BasicInput v-model:value="form.difference" addon-before="ریال" type="price" />
|
||||
</a-form-item>
|
||||
<a-form-item label="سود" name="difference" :rules="inputRules()" class="mb-0">
|
||||
<BasicInput v-model:value="form.difference" addon-before="ریال" type="price" />
|
||||
</a-form-item>
|
||||
</div>
|
||||
|
||||
<!-- <a-form-item label="کل قیمت لیمان" name="total_price_liman">
|
||||
<BasicInput v-model:value="form.total_price_liman" addon-before="ریال" type="price" />
|
||||
</a-form-item>-->
|
||||
<div class="space-y-3">
|
||||
<div class="space-y-2 rounded-xl bg-orange-50 p-3">
|
||||
<a-form-item label="انتخاب کاربر" name="customer_id" :rules="inputRules()" class="mb-0">
|
||||
<BasicSelect
|
||||
v-model:value="form.customer_id"
|
||||
:items="userItems"
|
||||
valueName="name"
|
||||
keyName="id"
|
||||
@change="$emit('changeUser', $event)"
|
||||
/>
|
||||
</a-form-item>
|
||||
<BasicInfoItem
|
||||
is-line
|
||||
:title="metalLabel.goldWalletTitle()"
|
||||
:value="selectedCustomer?.wallet?.[0]?.gold ?? '_'"
|
||||
/>
|
||||
<BasicInfoItem
|
||||
is-line
|
||||
title="کیف پول ریالی"
|
||||
:value="selectedCustomer?.wallet?.[0]?.cash ?? '_'"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="space-y-2 rounded-xl bg-orange-50 p-3">
|
||||
<a-form-item label="انتخاب کاربر" name="customer_id" :rules="inputRules()" class="mb-0">
|
||||
<BasicSelect
|
||||
v-model:value="form.customer_id"
|
||||
:items="userItems"
|
||||
valueName="name"
|
||||
keyName="id"
|
||||
@change="$emit('changeUser', $event)"
|
||||
/>
|
||||
</a-form-item>
|
||||
<BasicInfoItem is-line :title="metalLabel.goldWalletTitle()" :value="selectedCustomer?.wallet?.[0]?.gold ?? '_'" />
|
||||
<BasicInfoItem is-line title="کیف پول ریالی" :value="selectedCustomer?.wallet?.[0]?.cash ?? '_'" />
|
||||
</div>
|
||||
|
||||
<div class="space-y-2 rounded-xl bg-blue-50 p-3">
|
||||
<div class="text-sm font-600 text-gray-700">مقدار {{ form.direction === 1 ? 'خرید' : 'فروش' }}:</div>
|
||||
<a-form-item name="goldCash" :rules="inputRulesNumber()" class="mb-0">
|
||||
<BasicInput
|
||||
v-model:value="form.goldCash"
|
||||
addon-before="ریال"
|
||||
addon-bg-color="#0A1B37"
|
||||
addon-text-color="white"
|
||||
place-holder="ارزش کل"
|
||||
type="price"
|
||||
@onchange="$emit('calculateGold', $event)"
|
||||
/>
|
||||
</a-form-item>
|
||||
<a-form-item name="goldValue" :rules="inputRulesNumber()" class="mb-0">
|
||||
<BasicInput
|
||||
v-model:value="form.goldValue"
|
||||
addon-before="گرم"
|
||||
addon-bg-color="#0A1B37"
|
||||
addon-text-color="white"
|
||||
:place-holder="metalLabel.goldPlaceholder()"
|
||||
type="tel"
|
||||
@onchange="$emit('calculateCash', $event)"
|
||||
/>
|
||||
</a-form-item>
|
||||
<div class="space-y-2 rounded-xl bg-blue-50 p-3">
|
||||
<div class="text-sm font-600 text-gray-700">
|
||||
مقدار {{ form.direction === 1 ? 'خرید' : 'فروش' }}:
|
||||
</div>
|
||||
<a-form-item name="goldCash" :rules="inputRulesNumber()" class="mb-0">
|
||||
<BasicInput
|
||||
v-model:value="form.goldCash"
|
||||
addon-before="ریال"
|
||||
addon-bg-color="#0A1B37"
|
||||
addon-text-color="white"
|
||||
place-holder="ارزش کل"
|
||||
type="price"
|
||||
@onchange="$emit('calculateGold', $event)"
|
||||
/>
|
||||
</a-form-item>
|
||||
<a-form-item name="goldValue" :rules="inputRulesNumber()" class="mb-0">
|
||||
<BasicInput
|
||||
v-model:value="form.goldValue"
|
||||
addon-before="گرم"
|
||||
addon-bg-color="#0A1B37"
|
||||
addon-text-color="white"
|
||||
:place-holder="metalLabel.goldPlaceholder()"
|
||||
type="text"
|
||||
@onchange="$emit('calculateCash', $event)"
|
||||
/>
|
||||
</a-form-item>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</a-form>
|
||||
@@ -101,8 +120,8 @@ defineEmits<{
|
||||
(e: 'changePrice'): void
|
||||
(e: 'changePriceValue'): void
|
||||
(e: 'changeUser', value: Customer): void
|
||||
(e: 'calculateGold', value: number): void
|
||||
(e: 'calculateCash', value: number): void
|
||||
(e: 'calculateGold', value: number | string): void
|
||||
(e: 'calculateCash', value: number | string): void
|
||||
}>()
|
||||
|
||||
const formRef = ref<FormInstance>()
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
<BasicActionSheet
|
||||
v-model:visible="addOrderVisible"
|
||||
:title="orderSheetTitle"
|
||||
modal-width="25rem"
|
||||
modal-width="48rem"
|
||||
drawer-height="90vh"
|
||||
:loading="loading"
|
||||
:showButton="true"
|
||||
@@ -32,6 +32,15 @@
|
||||
@cancel="closeAddOrder"
|
||||
>
|
||||
<div v-if="isMobile" class="mb-3 text-base font-700">{{ orderSheetTitle }}</div>
|
||||
<a-alert
|
||||
v-if="submitError"
|
||||
type="error"
|
||||
:message="submitError"
|
||||
show-icon
|
||||
closable
|
||||
class="mb-3"
|
||||
@close="submitError = ''"
|
||||
/>
|
||||
<OrderEditorFormBody
|
||||
ref="orderEditorRef"
|
||||
:form="form"
|
||||
@@ -85,6 +94,7 @@ import { formatAmountWithUnit } from '@/utils/weightUnit'
|
||||
|
||||
//loading
|
||||
const loading = ref<boolean>(false)
|
||||
const submitError = ref('')
|
||||
|
||||
//define store
|
||||
const store = useStaticApiListsStore()
|
||||
@@ -131,10 +141,21 @@ let interval: ReturnType<typeof setInterval> | undefined
|
||||
|
||||
const orderSheetTitle = computed(() => `${editId ? 'ویرایش' : 'افزودن'} سفارش`)
|
||||
|
||||
function clearSubmitError() {
|
||||
submitError.value = ''
|
||||
}
|
||||
|
||||
function closeAddOrder() {
|
||||
clearSubmitError()
|
||||
stopGetPrice()
|
||||
}
|
||||
|
||||
function getOrderSubmitError(e: unknown): string {
|
||||
const msg = (e as { response?: { data?: { message?: string } } })?.response?.data?.message
|
||||
if (typeof msg === 'string' && msg.trim()) return msg
|
||||
return 'خطا در ثبت سفارش'
|
||||
}
|
||||
|
||||
async function setIntervalGetPrice() {
|
||||
try {
|
||||
interval = setInterval(async () => {
|
||||
@@ -149,6 +170,7 @@ async function setIntervalGetPrice() {
|
||||
|
||||
function changePrice() {
|
||||
form.value.price = form.value.direction === 1 ? dataLast.value?.buy : dataLast.value?.sell
|
||||
changePriceValue()
|
||||
}
|
||||
|
||||
async function getPrices() {
|
||||
@@ -270,42 +292,56 @@ function info(val: Order) {
|
||||
userInfoVisible.value = true
|
||||
}
|
||||
|
||||
function calculateCash(val: number) {
|
||||
// console.log(val)
|
||||
if (form.value.price) {
|
||||
if (form.value.direction === 1) {
|
||||
if (val >= 0.001) form.value.goldCash = parseFloat((val * form.value.price).toFixed(0))
|
||||
else form.value.goldCash = undefined
|
||||
} else {
|
||||
if (val >= 0.001) form.value.goldCash = parseFloat((val * form.value.price).toFixed(0))
|
||||
else form.value.goldCash = undefined
|
||||
}
|
||||
}
|
||||
function toOrderNumber(val: unknown): number | undefined {
|
||||
if (val === undefined || val === null || val === '') return undefined
|
||||
const n = Number(String(val).replaceAll(',', ''))
|
||||
return Number.isFinite(n) ? n : undefined
|
||||
}
|
||||
|
||||
function calculateGold(val: number) {
|
||||
// console.log(val)
|
||||
// form.value.goldCash = usePriceWithoutType(form.value.goldCash)
|
||||
if (form.value.price) {
|
||||
if (form.value.direction === 1) {
|
||||
if (val / form.value.price >= 0.001)
|
||||
form.value.goldValue = toFixedDownTwoChar(parseFloat(val / form.value.price))
|
||||
else if (val.toString() === '') form.value.goldValue = undefined
|
||||
else form.value.goldValue = 0
|
||||
} else {
|
||||
if (val >= form.value.price)
|
||||
form.value.goldValue = toFixedDownTwoChar(parseFloat(val / form.value.price))
|
||||
else if (val.toString() === '') form.value.goldValue = undefined
|
||||
else form.value.goldValue = 0
|
||||
}
|
||||
/** آخرین فیلدی که کاربر ویرایش کرده — برای همگامسازی هنگام تغییر قیمت هر گرم */
|
||||
const amountInputLock = ref<'rial' | 'gram' | null>(null)
|
||||
|
||||
function calculateCash(val: unknown) {
|
||||
amountInputLock.value = 'gram'
|
||||
const grams = toOrderNumber(val)
|
||||
const price = toOrderNumber(form.value.price)
|
||||
if (grams === undefined) {
|
||||
form.value.goldCash = undefined
|
||||
amountInputLock.value = null
|
||||
return
|
||||
}
|
||||
if (!price) return
|
||||
if (grams >= 0.001) form.value.goldCash = Math.round(grams * price)
|
||||
else form.value.goldCash = undefined
|
||||
}
|
||||
|
||||
function calculateGold(val: unknown) {
|
||||
amountInputLock.value = 'rial'
|
||||
const rial = toOrderNumber(val)
|
||||
const price = toOrderNumber(form.value.price)
|
||||
if (rial === undefined) {
|
||||
form.value.goldValue = undefined
|
||||
amountInputLock.value = null
|
||||
return
|
||||
}
|
||||
if (!price) return
|
||||
const grams = rial / price
|
||||
if (grams >= 0.001) form.value.goldValue = toFixedDownTwoChar(grams)
|
||||
else if (rial === 0) form.value.goldValue = 0
|
||||
else form.value.goldValue = undefined
|
||||
}
|
||||
|
||||
function changePriceValue() {
|
||||
calculateCash(form.value.goldValue)
|
||||
if (amountInputLock.value === 'rial' || (form.value.goldValue == null && form.value.goldCash != null)) {
|
||||
calculateGold(form.value.goldCash)
|
||||
return
|
||||
}
|
||||
if (form.value.goldValue != null) {
|
||||
calculateCash(form.value.goldValue)
|
||||
}
|
||||
}
|
||||
|
||||
function toFixedDownTwoChar(num) {
|
||||
function toFixedDownTwoChar(num: number) {
|
||||
return Math.floor(num * 100) / 100
|
||||
}
|
||||
|
||||
@@ -322,6 +358,7 @@ async function edit(record: Customer) {
|
||||
async function add() {
|
||||
loading.value = true
|
||||
editId = undefined
|
||||
clearSubmitError()
|
||||
// await store.getUsersList()
|
||||
resetData()
|
||||
addOrderVisible.value = true
|
||||
@@ -335,6 +372,7 @@ async function add() {
|
||||
//reset data
|
||||
const resetData = () => {
|
||||
orderEditorRef.value?.resetFields?.()
|
||||
amountInputLock.value = null
|
||||
form.value = {
|
||||
direction: 1,
|
||||
price: 0,
|
||||
@@ -366,6 +404,7 @@ const userInfoVisible = ref<boolean>(false)
|
||||
//submit user
|
||||
async function ok() {
|
||||
await orderEditorRef.value?.validateFields?.().then(async () => {
|
||||
clearSubmitError()
|
||||
loading.value = true
|
||||
try {
|
||||
form.value.amount = form.value.goldValue
|
||||
@@ -380,6 +419,7 @@ async function ok() {
|
||||
refreshTable()
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
submitError.value = getOrderSubmitError(e)
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user