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