From c77086ad2d7949ab36dd0c4e0b59907e672dd64f Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期五, 18 九月 2026 15:04:42 +0800
Subject: [PATCH] Merge remote-tracking branch 'refs/remotes/origin/dev_pro2.0' into dev_宁夏_九泓化工

---
 src/views/erp/purchase/invoice/modules/purchase-order-select.vue |  194 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 194 insertions(+), 0 deletions(-)

diff --git a/src/views/erp/purchase/invoice/modules/purchase-order-select.vue b/src/views/erp/purchase/invoice/modules/purchase-order-select.vue
new file mode 100644
index 0000000..59e969b
--- /dev/null
+++ b/src/views/erp/purchase/invoice/modules/purchase-order-select.vue
@@ -0,0 +1,194 @@
+<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>

--
Gitblit v1.9.3