1404/11/20-add inventory for product

This commit is contained in:
2026-02-09 11:59:33 +03:30
parent e5a76193b7
commit e5503f8864
4 changed files with 106 additions and 97 deletions
-3
View File
@@ -32,10 +32,7 @@ declare module '@vue/runtime-core' {
AMenuItem: typeof import('ant-design-vue/es')['MenuItem']
AModal: typeof import('ant-design-vue/es')['Modal']
APagination: typeof import('ant-design-vue/es')['Pagination']
APopconfirm: typeof import('ant-design-vue/es')['Popconfirm']
APopover: typeof import('ant-design-vue/es')['Popover']
ARadio: typeof import('ant-design-vue/es')['Radio']
ARadioButton: typeof import('ant-design-vue/es')['RadioButton']
ARadioGroup: typeof import('ant-design-vue/es')['RadioGroup']
ASelect: typeof import('ant-design-vue/es')['Select']
ASelectOption: typeof import('ant-design-vue/es')['SelectOption']
+1 -1
View File
@@ -8,7 +8,7 @@ export const createProduct = async (obj: Customer) =>
await useAxios.post<AddId>(`/admin/product`, obj)
export const deleteCustomer = async (id: number) => await useAxios.delete(`/admin/product/${id}`)
export const updateCustomer = async (id: number, obj: Customer) =>
export const updateProduct = async (id: number, obj: Customer) =>
await useAxios.put<AddId>(`/admin/product/${id}`, obj)
export const getCustomerTable = async (params: TableInput) =>
+46 -44
View File
@@ -1,57 +1,59 @@
import type { User } from '@/model/user'
import type { Wallet } from '@/model/wallet'
import type {User} from '@/model/user'
import type {Wallet} from '@/model/wallet'
export interface AddId {
id: number
id: number
}
export interface Product{
id: number,
amount: number,
percent_fee_buy: number,
cash_fee_buy: number,
percent_fee_sell: number,
cash_fee_sell: number
group_type: string
unit: string
active: boolean
created_at: string
open_buy: boolean
open_sell: boolean
show: boolean
title: string
updated_at: string
methodOption: number
prices: MethodePrices[]
price: number
reading_method: string
weight: number
auto_open_at: string
auto_close_at: string
description:string
file_id:number| null
export interface Product {
id: number,
amount: number,
percent_fee_buy: number,
cash_fee_buy: number,
percent_fee_sell: number,
cash_fee_sell: number
group_type: string
unit: string
active: boolean
created_at: string
open_buy: boolean
open_sell: boolean
show: boolean
title: string
updated_at: string
methodOption: number
prices: MethodePrices[]
price: number
reading_method: string
weight: number
auto_open_at: string
auto_close_at: string
description: string
file_id: number | null
inventory: number
}
export interface MethodePrices {
id: string
name: string
price: number
profit: number
id: string
name: string
price: number
profit: number
}
export interface SetActiveTime {
auto_open_at: string
auto_close_at: string
auto_open_at: string
auto_close_at: string
}
export interface Balance {
cashBalance: number
cashBalanceOfKalhor: number
cashBalanceOfLiman: number
goldBalance: number
goldBalanceOfKalhor: number
goldBalanceOfLiman: number
mazanehBalance: number
mazanehBalanceOfKalhor: number
income_money: number
mazanehBalanceOfLiman: number
cashBalance: number
cashBalanceOfKalhor: number
cashBalanceOfLiman: number
goldBalance: number
goldBalanceOfKalhor: number
goldBalanceOfLiman: number
mazanehBalance: number
mazanehBalanceOfKalhor: number
income_money: number
mazanehBalanceOfLiman: number
}
+59 -49
View File
@@ -69,11 +69,11 @@
</template>
</AButton>
</div>
<div v-if="methodOption === '2'" class="md:flex justify-between items-center">
<div v-if="methodOption === '2'" class=" md:flex justify-between items-center">
<div class="ml-4">قیمت :</div>
<div class="">
<BasicSelect
class="w-11rem method_style"
class="w-11rem method_style"
allowClear
:items="pricesList"
valueName="name"
@@ -124,22 +124,26 @@
keyName="value"
/>
</a-form-item>
<a-form-item v-if="form?.group_type !== 'آبشده'"
label="تعداد موجودی" name="inventory" :rules="inputRules()">
<BasicInput v-model:value="form.inventory" type="number" />
</a-form-item>
<!-- <a-form-item v-if="weightOption === '1'" label="وزن به گرم" name="amount" :rules="inputRules()">
<BasicInput v-model:value="form.amount" type="number" />
</a-form-item>-->
<a-form-item v-if="form.group_type === '' || form.group_type !== 'آبشده'"
<a-form-item v-if="form?.group_type !== 'آبشده'"
label="کارمزد درصدی موقع خرید" name="percent_fee_buy" :rules="inputRules()">
<BasicInput v-model:value="form.percent_fee_buy" type="number" />
</a-form-item>
<a-form-item v-if="form.group_type === '' || form.group_type !== 'آبشده'"
<a-form-item v-if="form?.group_type !== 'آبشده'"
label="هزینه نقدی موقع خرید" name="cash_fee_buy" :rules="inputRules()">
<BasicInput v-model:value="form.cash_fee_buy" type="number" />
</a-form-item>
<a-form-item v-if="form.group_type === '' || form.group_type !== 'آبشده'"
<a-form-item v-if="form?.group_type !== 'آبشده'"
label="کارمزد درصدی موقع فروش" name="percent_fee_sell" :rules="inputRules()">
<BasicInput v-model:value="form.percent_fee_sell" type="number" />
</a-form-item>
<a-form-item v-if="form.group_type === '' || form.group_type !== 'آبشده'"
<a-form-item v-if="form?.group_type !== 'آبشده'"
label="هزینه نقدی موقع فروش" name="cash_fee_sell" :rules="inputRules()">
<BasicInput v-model:value="form.cash_fee_sell" type="number" />
</a-form-item>
@@ -161,6 +165,9 @@
/>
<!-- <a-time-picker v-model:value="form.auto_close_at"/>-->
</a-form-item>
<a-form-item label="توضیحات" name="description" >
<BasicTextArea v-model:value="form.description" />
</a-form-item>
</div>
</a-form>
</template>
@@ -179,24 +186,6 @@
@delete="deleteFile"
/>
</div>
<!-- <div class="flex gap-2">
<BasicImageUploader
v-model:file-list="ProductIndexImage"
:url="`${baseURL}site/file`"
:max-count="1"
@ok="uploadedIndexFile"
@delete="deleteIndexFile"
/>
<BasicImageUploader
v-model:file-list="ImageFileList"
:url="`${baseURL}site/file`"
:max-count="10"
@ok="uploadedFile"
@delete="deleteFile"
/>
</div>-->
</template>
</BaseCollapse>
</Collapse>
@@ -388,7 +377,7 @@ import { confirmDeleteItem } from "@/utils/confirmModal";
import { cloneDeep } from "lodash";
import type { Item } from "@/model/Item";
import type { Customer } from "@/model/customer";
import { createProduct, deleteCustomer, updateCustomer } from "@/api/product";
import {createProduct, deleteCustomer, updateProduct} from "@/api/product";
import type { Charge } from "@/model/wallet";
import customers from "@/router/routes/products";
import { chargeWallet } from "@/api/wallet";
@@ -404,29 +393,28 @@ import Icon from "@core/components/BaseIcon/src/Icon.vue";
import type { MethodePrices, Product } from "@/model/product";
import IndexImageUploader from "@/components/ProductUploader/IndexImageUploader.vue";
import ProductImageUploader from "@/components/ProductUploader/ProductImageUploader.vue";
import {baseURL} from '@root/config'
//tabs
const activeKey = ref("اطلاعات جامع");
//loading
const loading = ref<boolean>(false)
const loading = ref<boolean>(false);
//define store
const store = useStaticApiListsStore()
const store = useStaticApiListsStore();
//define tbl
const table = ref(null)
const orderTable = ref(null)
const transactionTable = ref(null)
const smsTable = ref(null)
const referralTable = ref(null)
const fundTable = ref(null)
const refreshTable = () => table?.value?.fetch()
const refreshOrderTable = () => orderTable?.value?.fetch()
const refreshTransactionTable = () => transactionTable?.value?.fetch()
const refreshSMSTable = () => smsTable?.value?.fetch()
const refreshReferralTable = () => referralTable?.value?.fetch()
const table = ref(null);
const orderTable = ref(null);
const transactionTable = ref(null);
const smsTable = ref(null);
const referralTable = ref(null);
const fundTable = ref(null);
const refreshTable = () => table?.value?.fetch();
const refreshOrderTable = () => orderTable?.value?.fetch();
const refreshTransactionTable = () => transactionTable?.value?.fetch();
const refreshSMSTable = () => smsTable?.value?.fetch();
const refreshReferralTable = () => referralTable?.value?.fetch();
const refreshFundTable = () => fundTable?.value?.fetch();
const methodOption = ref<string>("1");
const weightOption = ref<string>("1");
@@ -454,12 +442,12 @@ const ProductIndexImage = ref<Array<FileList>>([]);
function uploadedIndexFile(id: number) {
// console.log(id)
form.value.original_image_id = id;
form.value.file_id = id;
}
function deleteIndexFile() {
form.value.original_image_id = null;
form.value.original_image = null;
form.value.file_id = null;
form.value.file_id = null;
ProductIndexImage.value = [];
}
@@ -626,6 +614,20 @@ async function edit(record: Customer) {
form.value.auto_open_at = dayjs(customForm.auto_open_at, "HH:mm:ss");
form.value.auto_close_at = dayjs(customForm.auto_close_at, "HH:mm:ss");
// نمایش فایل موجود اگر وجود داشته باشد
const file = (record as any).file;
if (file && file.src) {
ProductIndexImage.value = [{
uid: `file-${file.id}`,
name: file.original_name || `index-image-${file.id}`,
url: file.src,
src: file.src,
status: 'done' as const
}] as any;
} else {
ProductIndexImage.value = [];
}
}
//add
@@ -693,6 +695,8 @@ const resetData = () => {
percent_fee_sell: 0,
cash_fee_sell: 0
};
ProductIndexImage.value = [];
ImageFileList.value = [];
};
//delete
@@ -717,24 +721,28 @@ async function ok() {
formRef.value?.validateFields().then(async () => {
// console.log('salam', form.value)
// return
loading.value = true;
try {
if (methodOption.value === "1") delete form.value.reading_method;
else delete form.value.price;
if (weightOption.value === "2")
form.value.amount = 1;
form.value.auto_open_at = dayjs(form.value.auto_open_at).format("HH:mm:ss");
form.value.auto_close_at = dayjs(form.value.auto_close_at).format("HH:mm:ss");
await methodePrices(form.value);
const payload = cloneDeep(form.value);
payload.auto_open_at = dayjs(payload.auto_open_at).format("HH:mm:ss");
payload.auto_close_at = dayjs(payload.auto_close_at).format("HH:mm:ss");
// await methodePrices();
if (editId) {
await updateCustomer(editId, form.value);
await updateProduct(editId, payload);
} else {
await createProduct(form.value);
await createProduct(payload);
}
addUserVisible.value = false;
refreshTable();
resetData();
message.success("عملیات با موفقیت انجام شد");
resetData();
// await getResponsible()
// await getQC()
// await getManager()
@@ -743,6 +751,7 @@ async function ok() {
// message.error('خطا در بارگذاری اطلاعات')
} finally {
loading.value = false;
}
});
}
@@ -799,7 +808,8 @@ const categoryItems: Array<Item> = [
{
value: "شمش پرنیا"
}
]
];
const data = ref<MethodePrices[]>([]);
const fetchData = async () => {