From 3baaad59171ded6aca17340fcc907acbeeb45b7b Mon Sep 17 00:00:00 2001
From: zhuguifei <zhuguifei@zhuguifeideiMac.local>
Date: 星期二, 08 四月 2025 08:14:43 +0800
Subject: [PATCH] Merge branch 'main' of http://lanpucloud.cn:1111/r/eims-master

---
 eims-ui/apps/web-antd/src/views/eims/spare/index.vue |  217 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 217 insertions(+), 0 deletions(-)

diff --git a/eims-ui/apps/web-antd/src/views/eims/spare/index.vue b/eims-ui/apps/web-antd/src/views/eims/spare/index.vue
new file mode 100644
index 0000000..1682ab2
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/spare/index.vue
@@ -0,0 +1,217 @@
+<script setup lang="ts">
+import type { Recordable } from '@vben/types';
+
+import { onMounted, ref } from 'vue';
+
+import { Page, useVbenDrawer, type VbenFormProps } from '@vben/common-ui';
+import { $t } from '@vben/locales';
+import { getVxePopupContainer } from '@vben/utils';
+
+import { Image, Modal, Popconfirm, Space } from 'ant-design-vue';
+
+import { useVbenVxeGrid, vxeCheckboxChecked, type VxeGridProps, vxeSortEvent } from '#/adapter/vxe-table';
+import { delSpare, listSpare, spareExport } from '#/api/eims/spare';
+import { configInfoByKey } from '#/api/system/config';
+import { commonDownloadExcel } from '#/utils/file/download';
+
+import { columns, querySchema } from './data';
+import spareDrawer from './spare-drawer.vue';
+import SpareTypeTree from './spare-type-tree.vue';
+
+// 宸﹁竟閮ㄩ棬鐢�
+const selectTypeId = ref<any[]>([]);
+
+defineExpose({
+  tableSelect
+});
+
+const formOptions: VbenFormProps = {
+  commonConfig: {
+    labelWidth: 80,
+    componentProps: {
+      allowClear: true
+    }
+  },
+  collapsed: true,
+  schema: querySchema(),
+  wrapperClass: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4',
+  handleReset: async () => {
+    selectTypeId.value = [];
+    // eslint-disable-next-line no-use-before-define
+    const { formApi, reload } = tableApi;
+    await formApi.resetForm();
+    const formValues = formApi.form.values;
+    formApi.setLatestSubmissionValues(formValues);
+    await reload(formValues);
+  }
+};
+
+const gridOptions: VxeGridProps = {
+  checkboxConfig: {
+    // 楂樹寒
+    highlight: true,
+    // 缈婚〉鏃朵繚鐣欓�変腑鐘舵��
+    reserve: true
+    // 鐐瑰嚮琛岄�変腑
+    // trigger: 'row'
+  },
+  columns,
+  height: 'auto',
+  keepSource: true,
+  pagerConfig: {
+    enabled: false,
+  },
+  proxyConfig: {
+    enabled: true,
+    ajax: {
+      query: async ({ page }, formValues = {}) => {
+        // 閮ㄩ棬鏍戦�夋嫨澶勭悊
+        if (selectTypeId.value.length === 1 && selectTypeId.value[0] !== 0) {
+          formValues.type = selectTypeId.value[0];
+        } else {
+          Reflect.deleteProperty(formValues, 'type');
+        }
+        return await listSpare({
+          pageNum: page.currentPage,
+          pageSize: page.pageSize,
+          ...formValues
+        });
+      }
+    }
+  },
+  rowConfig: {
+    isHover: true,
+    keyField: 'id'
+  },
+  columnConfig: {
+    resizable: true,
+  },
+  sortConfig: {
+    // 杩滅▼鎺掑簭
+    remote: true,
+    // 鏀寔澶氬瓧娈垫帓搴� 榛樿鍏抽棴
+    multiple: true
+  },
+  id: 'eims-spare-index'
+};
+
+const [BasicTable, tableApi] = useVbenVxeGrid({
+  formOptions,
+  gridOptions,
+  gridEvents: {
+    sortChange: (sortParams) => vxeSortEvent(tableApi, sortParams)
+  }
+});
+
+const [SpareDrawer, spareDrawerApi] = useVbenDrawer({
+  connectedComponent: spareDrawer
+});
+
+function handleAdd() {
+  spareDrawerApi.setData({});
+  spareDrawerApi.open();
+}
+
+async function handleEdit(record: Recordable<any>) {
+  spareDrawerApi.setData({ id: record.id });
+  spareDrawerApi.open();
+}
+
+async function handleDelete(row: Recordable<any>) {
+  await delSpare(row.id);
+  await tableApi.query();
+}
+
+function handleMultiDelete() {
+  const rows = tableApi.grid.getCheckboxRecords();
+  const ids = rows.map((row: any) => row.id);
+  Modal.confirm({
+    title: '鎻愮ず',
+    okType: 'danger',
+    content: `纭鍒犻櫎閫変腑鐨�${ids.length}鏉¤褰曞悧锛焋,
+    onOk: async () => {
+      await delSpare(ids);
+      await tableApi.query();
+    }
+  });
+}
+
+function handleDownloadExcel() {
+  commonDownloadExcel(spareExport, '澶囦欢鍙拌处', tableApi.formApi.form.values, {
+    fieldMappingTime: formOptions.fieldMappingTime
+  });
+}
+
+const preview = ref(false);
+onMounted(async () => {
+  const resp = await configInfoByKey('sys.oss.previewListResource');
+  preview.value = Boolean(resp);
+});
+
+function isImageFile(ext: string) {
+  const supportList = ['jpg', 'jpeg', 'png', 'gif', 'webp'];
+  return supportList.some((item) => ext.toLocaleLowerCase().includes(item));
+}
+
+// 閫変腑鏁版嵁
+function tableSelect() {
+  return tableApi.grid.getCheckboxRecords();
+}
+</script>
+
+<template>
+  <Page :auto-content-height="true">
+    <div class="flex h-full gap-[8px]">
+      <SpareTypeTree v-model:select-type-id="selectTypeId" class="w-[260px]" @reload="() => tableApi.reload()" @select="() => tableApi.reload()" />
+      <BasicTable class="flex-1 overflow-hidden" table-title="澶囦欢鍙拌处">
+        <template #toolbar-tools>
+          <Space>
+            <a-button v-access:code="['eims:spare:export']" @click="handleDownloadExcel">
+              {{ $t('pages.common.export') }}
+            </a-button>
+            <a-button
+              :disabled="!vxeCheckboxChecked(tableApi)"
+              danger
+              type="primary"
+              v-access:code="['eims:spare:remove']"
+              @click="handleMultiDelete"
+            >
+              {{ $t('pages.common.delete') }}
+            </a-button>
+            <a-button type="primary" v-access:code="['eims:spare:add']" @click="handleAdd">
+              {{ $t('pages.common.add') }}
+            </a-button>
+          </Space>
+        </template>
+
+        <template #imgUrl="{ row }">
+          <Image v-if="preview && isImageFile(row.imgUrl)" :src="row.imgUrl" height="38px" />
+          <span v-else>{{ row.imgUrl }}</span>
+        </template>
+
+        <template #action="{ row }">
+          <Space>
+            <ghost-button v-access:code="['eims:spare:edit']" @click.stop="handleEdit(row)">
+              {{ $t('pages.common.edit') }}
+            </ghost-button>
+            <Popconfirm :get-popup-container="getVxePopupContainer" placement="left" title="纭鍒犻櫎锛�" @confirm="handleDelete(row)">
+              <ghost-button danger v-access:code="['eims:spare:remove']" @click.stop="">
+                {{ $t('pages.common.delete') }}
+              </ghost-button>
+            </Popconfirm>
+          </Space>
+        </template>
+      </BasicTable>
+    </div>
+    <SpareDrawer @reload="tableApi.query()" />
+  </Page>
+</template>
+
+<style>
+/* 缁熶竴鎵�鏈夊垪鐨勮竟妗嗗拰琛岄珮 */
+.vxe-table--body .vxe-body--row .vxe-body--column {
+  height: 56px !important;
+  box-sizing: border-box !important;
+  padding-top: 1px !important; /* 淇濇寔鍜屾櫘閫氬垪涓�鑷寸殑padding */
+}
+</style>

--
Gitblit v1.9.3