| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { VxeTableGridOptions } from '#/adapter/vxe-table'; |
| | | import type { ErpPurchaseOrderApi } from '#/api/erp/purchase/order'; |
| | | |
| | | import { computed, nextTick, ref, watch } from 'vue'; |
| | | |
| | | import { DICT_TYPE } from '@vben/constants'; |
| | | import { IconifyIcon } from '@vben/icons'; |
| | | |
| | | import { Input, message, Modal } from 'ant-design-vue'; |
| | | |
| | | import { useVbenVxeGrid } from '#/adapter/vxe-table'; |
| | | import { |
| | | getPurchaseOrder, |
| | | getPurchaseOrderPage, |
| | | } from '#/api/erp/purchase/order'; |
| | | |
| | | defineOptions({ name: 'ErpPurchaseInvoiceOrderSelect' }); |
| | | |
| | | const props = withDefaults( |
| | | defineProps<{ |
| | | disabled?: boolean; |
| | | modelValue?: number; |
| | | placeholder?: string; |
| | | }>(), |
| | | { |
| | | disabled: false, |
| | | modelValue: undefined, |
| | | placeholder: 'è¯·éæ©éè´è®¢å', |
| | | }, |
| | | ); |
| | | const emit = defineEmits<{ |
| | | change: [order: ErpPurchaseOrderApi.PurchaseOrder | undefined]; |
| | | 'update:modelValue': [value: number | undefined]; |
| | | }>(); |
| | | |
| | | const open = ref(false); // éæ©å¼¹çªæ¯å¦æå¼ |
| | | const order = ref<ErpPurchaseOrderApi.PurchaseOrder>(); // å½åéä¸éè´è®¢å |
| | | |
| | | const displayNo = computed(() => order.value?.no ?? ''); |
| | | |
| | | /** æ ¹æ®è®¢åç¼å·åæ¾éæ©å¨ */ |
| | | async function resolveOrderById(id: number | undefined) { |
| | | if (!id) { |
| | | order.value = undefined; |
| | | return; |
| | | } |
| | | if (order.value?.id === id) { |
| | | return; |
| | | } |
| | | order.value = await getPurchaseOrder(id); |
| | | } |
| | | |
| | | watch( |
| | | () => props.modelValue, |
| | | (value) => { |
| | | resolveOrderById(value); |
| | | }, |
| | | { immediate: true }, |
| | | ); |
| | | |
| | | /** è¡¨æ ¼é
ç½® */ |
| | | const [Grid, gridApi] = useVbenVxeGrid({ |
| | | formOptions: { |
| | | schema: [ |
| | | { |
| | | fieldName: 'no', |
| | | label: '订ååå·', |
| | | component: 'Input', |
| | | componentProps: { |
| | | placeholder: '请è¾å
¥è®¢ååå·', |
| | | allowClear: true, |
| | | }, |
| | | }, |
| | | ], |
| | | }, |
| | | gridOptions: { |
| | | columns: [ |
| | | { type: 'radio', width: 50, fixed: 'left' }, |
| | | { field: 'no', title: '订ååå·', width: 200, fixed: 'left' }, |
| | | { field: 'supplierName', title: 'ä¾åºå', minWidth: 120 }, |
| | | { |
| | | field: 'orderTime', |
| | | title: 'è®¢åæ¶é´', |
| | | width: 160, |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | field: 'totalPrice', |
| | | title: 'å«ç¨éé¢', |
| | | formatter: 'formatAmount2', |
| | | minWidth: 120, |
| | | }, |
| | | { |
| | | field: 'remainInvoicePrice', |
| | | title: 'æªå¼ç¥¨éé¢', |
| | | formatter: 'formatAmount2', |
| | | minWidth: 120, |
| | | }, |
| | | { |
| | | field: 'status', |
| | | title: 'ç¶æ', |
| | | minWidth: 100, |
| | | cellRender: { |
| | | name: 'CellDict', |
| | | props: { type: DICT_TYPE.ERP_AUDIT_STATUS }, |
| | | }, |
| | | }, |
| | | ], |
| | | height: 520, |
| | | keepSource: true, |
| | | proxyConfig: { |
| | | ajax: { |
| | | query: async ({ page }, formValues) => { |
| | | return await getPurchaseOrderPage({ |
| | | pageNo: page.currentPage, |
| | | pageSize: page.pageSize, |
| | | status: 20, // ä»
å±ç¤ºå·²å®¡æ ¸éè¿çéè´è®¢å |
| | | remainPriceEnable: true, // ä»
å±ç¤ºå©ä½å¯å¼ç¥¨éé¢å¤§äº 0 ç订åï¼éé¢å·²å¼å®çä¸å±ç¤ºï¼ |
| | | ...formValues, |
| | | }); |
| | | }, |
| | | }, |
| | | }, |
| | | rowConfig: { |
| | | keyField: 'id', |
| | | isHover: true, |
| | | }, |
| | | radioConfig: { |
| | | trigger: 'row', |
| | | highlight: true, |
| | | }, |
| | | toolbarConfig: { |
| | | refresh: true, |
| | | search: true, |
| | | }, |
| | | } as VxeTableGridOptions<ErpPurchaseOrderApi.PurchaseOrder>, |
| | | gridEvents: { |
| | | radioChange: ({ row }: { row: ErpPurchaseOrderApi.PurchaseOrder }) => { |
| | | order.value = row; |
| | | }, |
| | | }, |
| | | }); |
| | | |
| | | /** æå¼éæ©å¼¹çª */ |
| | | async function handleOpen() { |
| | | if (props.disabled) { |
| | | return; |
| | | } |
| | | open.value = true; |
| | | await nextTick(); |
| | | gridApi.query(); |
| | | } |
| | | |
| | | /** ç¡®è®¤éæ©éè´è®¢å */ |
| | | function handleOk() { |
| | | if (!order.value?.id) { |
| | | message.warning('è¯·éæ©éè´è®¢å'); |
| | | return; |
| | | } |
| | | emit('update:modelValue', order.value.id); |
| | | emit('change', order.value); |
| | | open.value = false; |
| | | } |
| | | </script> |
| | | |
| | | <template> |
| | | <div> |
| | | <Input |
| | | readonly |
| | | :disabled="disabled" |
| | | :placeholder="placeholder" |
| | | :value="displayNo" |
| | | @click="handleOpen" |
| | | > |
| | | <template #suffix> |
| | | <IconifyIcon |
| | | class="size-4 cursor-pointer" |
| | | icon="lucide:search" |
| | | :style="{ cursor: disabled ? 'not-allowed' : 'pointer' }" |
| | | /> |
| | | </template> |
| | | </Input> |
| | | <Modal |
| | | v-model:open="open" |
| | | title="éæ©éè´è®¢åï¼ä»
å·²å®¡æ ¸éè¿ï¼" |
| | | width="80%" |
| | | @cancel.stop="open = false" |
| | | @ok.stop="handleOk" |
| | | > |
| | | <Grid table-title="éè´è®¢åå表" /> |
| | | </Modal> |
| | | </div> |
| | | </template> |