From 5620ab475b200182a4d990ee04b029396f1db2dd Mon Sep 17 00:00:00 2001
From: 吴羡 <16976746+Xian-TT3@user.noreply.gitee.com>
Date: 星期三, 30 九月 2026 19:31:14 +0800
Subject: [PATCH] feat: 质检四模块导出按筛选条件、考勤节假日配置改为时间段

---
 src/views/mes/qc/ipqc/index.vue                   |   21 +----
 src/api/hrm/attendance/holiday/index.ts           |    5 +
 src/views/hrm/attendance/holiday/index.vue        |    5 +
 /dev/null                                         |   89 ----------------------
 src/views/mes/qc/oqc/index.vue                    |   21 +----
 src/views/hrm/attendance/holiday/data.ts          |   16 ++-
 src/views/hrm/attendance/holiday/modules/form.vue |   19 ++++
 src/views/mes/qc/iqc/index.vue                    |   21 +----
 src/views/mes/qc/rqc/index.vue                    |   21 +----
 9 files changed, 57 insertions(+), 161 deletions(-)

diff --git a/src/api/hrm/attendance/holiday/index.ts b/src/api/hrm/attendance/holiday/index.ts
index 89da4ec..b030fac 100644
--- a/src/api/hrm/attendance/holiday/index.ts
+++ b/src/api/hrm/attendance/holiday/index.ts
@@ -7,7 +7,10 @@
   export interface Holiday {
     id?: number;
     name?: string;
-    date?: string;
+    /** 寮�濮嬫棩鏈� */
+    startDate?: string;
+    /** 缁撴潫鏃ユ湡 */
+    endDate?: string;
     type?: number;
     typeName?: string;
     isLegal?: number;
diff --git a/src/views/hrm/attendance/holiday/data.ts b/src/views/hrm/attendance/holiday/data.ts
index 822451b..9ae34ac 100644
--- a/src/views/hrm/attendance/holiday/data.ts
+++ b/src/views/hrm/attendance/holiday/data.ts
@@ -29,11 +29,10 @@
       rules: 'required',
     },
     {
-      fieldName: 'date',
-      label: '鏃ユ湡',
-      component: 'DatePicker',
+      fieldName: 'dateRange',
+      label: '鏃ユ湡鍖洪棿',
+      component: 'RangePicker',
       componentProps: {
-        placeholder: '閫夋嫨鏃ユ湡',
         valueFormat: 'YYYY-MM-DD',
         style: { width: '100%' },
       },
@@ -126,7 +125,14 @@
 export function useGridColumns(): VxeTableGridOptions<HrmAttendanceHolidayApi.Holiday>['columns'] {
   return [
     { field: 'name', title: '鑺傚亣鏃ュ悕绉�', minWidth: 150 },
-    { field: 'date', title: '鏃ユ湡', width: 120 },
+    {
+      field: 'startDate',
+      title: '鏃ユ湡鍖洪棿',
+      minWidth: 200,
+      slots: {
+        default: 'dateRange',
+      },
+    },
     {
       field: 'type',
       title: '绫诲瀷',
diff --git a/src/views/hrm/attendance/holiday/index.vue b/src/views/hrm/attendance/holiday/index.vue
index 8a33871..e5e0b51 100644
--- a/src/views/hrm/attendance/holiday/index.vue
+++ b/src/views/hrm/attendance/holiday/index.vue
@@ -114,6 +114,11 @@
           ]"
         />
       </template>
+      <template #dateRange="{ row }">
+        <span v-if="!row.startDate && !row.endDate">-</span>
+        <span v-else-if="row.startDate === row.endDate">{{ row.startDate }}</span>
+        <span v-else>{{ row.startDate }} ~ {{ row.endDate }}</span>
+      </template>
       <template #isLegal="{ row }">
         <Tag v-if="row.isLegal === 1" color="red">娉曞畾</Tag>
         <span v-else>-</span>
diff --git a/src/views/hrm/attendance/holiday/modules/form.vue b/src/views/hrm/attendance/holiday/modules/form.vue
index 2ae9c5d..614daa0 100644
--- a/src/views/hrm/attendance/holiday/modules/form.vue
+++ b/src/views/hrm/attendance/holiday/modules/form.vue
@@ -53,7 +53,15 @@
       return;
     }
     modalApi.lock();
-    const data = (await formApi.getValues()) as HrmAttendanceHolidayApi.Holiday;
+    const values = (await formApi.getValues()) as HrmAttendanceHolidayApi.Holiday & {
+      dateRange?: string[];
+    };
+    const { dateRange, ...rest } = values;
+    const data: HrmAttendanceHolidayApi.Holiday = {
+      ...rest,
+      startDate: dateRange?.[0],
+      endDate: dateRange?.[1],
+    };
     try {
       if (formType.value === 'update') {
         await updateAttendanceHoliday(data);
@@ -81,7 +89,14 @@
     }
     modalApi.lock();
     try {
-      await formApi.setValues(await getAttendanceHoliday(data.id));
+      const detail = await getAttendanceHoliday(data.id);
+      await formApi.setValues({
+        ...detail,
+        dateRange:
+          detail.startDate && detail.endDate
+            ? [detail.startDate, detail.endDate]
+            : undefined,
+      });
     } finally {
       modalApi.unlock();
     }
diff --git a/src/views/mes/qc/components/export-range-modal.vue b/src/views/mes/qc/components/export-range-modal.vue
deleted file mode 100644
index 19fedfe..0000000
--- a/src/views/mes/qc/components/export-range-modal.vue
+++ /dev/null
@@ -1,89 +0,0 @@
-<script lang="ts" setup>
-import { ref } from 'vue';
-
-import { useVbenModal } from '@vben/common-ui';
-import { downloadFileFromBlobPart } from '@vben/utils';
-
-import { DatePicker, message } from 'ant-design-vue';
-
-import { getRangePickerDefaultProps } from '#/utils';
-
-/** 瀵煎嚭鍙傛暟锛堝悗绔� PageReqVO 浠ユ暟缁勮В鏋� inspectDate 璧锋锛� */
-interface ExportParams {
-  inspectDate?: [string, string];
-}
-
-interface ExportModalData {
-  /** 寮圭獥鏍囬 */
-  title?: string;
-  /** 妯″潡瀵煎嚭鍑芥暟锛歳equestClient.download(...) 杩斿洖 Blob */
-  exportApi: (params: ExportParams) => Promise<Blob>;
-  /** 瀵煎嚭鏂囦欢鍚� */
-  fileName: string;
-}
-
-defineOptions({ name: 'QcExportRangeModal' });
-
-const rangePickerProps = getRangePickerDefaultProps();
-
-const modalData = ref<ExportModalData>();
-const range = ref<[string, string] | undefined>(undefined);
-const exporting = ref(false);
-const title = ref('瀵煎嚭');
-
-const [Modal, modalApi] = useVbenModal({
-  async onConfirm() {
-    if (exporting.value) {
-      return;
-    }
-    const data = modalData.value;
-    if (!data) {
-      return;
-    }
-    exporting.value = true;
-    modalApi.lock();
-    try {
-      const params: ExportParams =
-        range.value && range.value.length === 2
-          ? { inspectDate: range.value }
-          : {};
-      const blob = await data.exportApi(params);
-      downloadFileFromBlobPart({ fileName: data.fileName, source: blob });
-      message.success('瀵煎嚭鎴愬姛');
-      await modalApi.close();
-    } finally {
-      exporting.value = false;
-      modalApi.unlock();
-    }
-  },
-  onOpenChange(isOpen: boolean) {
-    if (!isOpen) {
-      modalData.value = undefined;
-      range.value = undefined;
-      return;
-    }
-    const data = modalApi.getData<ExportModalData>();
-    modalData.value = data;
-    range.value = undefined;
-    title.value = data?.title ?? '瀵煎嚭';
-    modalApi.setState({ confirmText: '瀵煎嚭' });
-  },
-});
-</script>
-
-<template>
-  <Modal :title="title" class="w-2/5" :mask-closable="false">
-    <div class="px-1 py-3">
-      <div class="mb-2 text-sm font-medium text-gray-700">妫�楠屾椂闂�</div>
-      <DatePicker.RangePicker
-        v-model:value="range"
-        v-bind="rangePickerProps"
-        allow-clear
-        class="w-full"
-      />
-      <div class="mt-2 text-xs text-gray-400">
-        涓嶉�夋椂闂村垯瀵煎嚭鍏ㄩ儴鏁版嵁锛涘鍑烘寜銆屾娴嬫棩鏈熴�嶈繃婊�
-      </div>
-    </div>
-  </Modal>
-</template>
diff --git a/src/views/mes/qc/ipqc/index.vue b/src/views/mes/qc/ipqc/index.vue
index b879b96..5906711 100644
--- a/src/views/mes/qc/ipqc/index.vue
+++ b/src/views/mes/qc/ipqc/index.vue
@@ -4,6 +4,7 @@
 
 import { Page, useVbenModal } from '@vben/common-ui';
 import { MesQcStatusEnum } from '@vben/constants';
+import { downloadFileFromBlobPart } from '@vben/utils';
 
 import { Button, message } from 'ant-design-vue';
 
@@ -16,7 +17,6 @@
   importIpqcTemplate,
 } from '#/api/mes/qc/ipqc';
 import { $t } from '#/locales';
-import QcExportRangeModal from '#/views/mes/qc/components/export-range-modal.vue';
 import QcImportFormModal from '#/views/mes/qc/components/import-form-modal.vue';
 import QcReportGenerateModal from '#/views/mes/qc/components/report-generate-modal.vue';
 
@@ -28,11 +28,6 @@
 
 const [FormModal, formModalApi] = useVbenModal({
   connectedComponent: Form,
-  destroyOnClose: true,
-});
-
-const [ExportRangeModal, exportRangeModalApi] = useVbenModal({
-  connectedComponent: QcExportRangeModal,
   destroyOnClose: true,
 });
 
@@ -101,15 +96,10 @@
   }
 }
 
-/** 瀵煎嚭琛ㄦ牸锛堝脊绐楅�夋楠屾椂闂磋寖鍥达級 */
-function handleExport() {
-  exportRangeModalApi
-    .setData({
-      title: '鎸夋楠屾椂闂村鍑鸿繃绋嬫楠屽崟',
-      exportApi: exportIpqc,
-      fileName: '杩囩▼妫�楠屽崟.xls',
-    })
-    .open();
+/** 瀵煎嚭琛ㄦ牸锛堟寜鍒楄〃绛涢�夋潯浠跺鍑猴級 */
+async function handleExport() {
+  const data = await exportIpqc(await gridApi.formApi.getValues());
+  downloadFileFromBlobPart({ fileName: '杩囩▼妫�楠屽崟.xls', source: data });
 }
 
 /** 鍑烘姤鍛婏細鏁版嵁鐢卞悗绔粠璇ヨ川妫�鍗曞彇锛屽墠绔彧閫夋ā鏉� */
@@ -153,7 +143,6 @@
 <template>
   <Page auto-content-height>
     <FormModal @success="handleRefresh" />
-    <ExportRangeModal />
     <ReportModal />
     <ImportModal @success="handleRefresh" />
     <Grid table-title="杩囩▼妫�楠屽崟鍒楄〃">
diff --git a/src/views/mes/qc/iqc/index.vue b/src/views/mes/qc/iqc/index.vue
index 4be3aed..4b1f1c5 100644
--- a/src/views/mes/qc/iqc/index.vue
+++ b/src/views/mes/qc/iqc/index.vue
@@ -7,6 +7,7 @@
 
 import { Page, useVbenModal } from '@vben/common-ui';
 import { MesQcStatusEnum } from '@vben/constants';
+import { downloadFileFromBlobPart } from '@vben/utils';
 
 import { Button, message } from 'ant-design-vue';
 
@@ -19,7 +20,6 @@
   importIqcTemplate,
 } from '#/api/mes/qc/iqc';
 import { $t } from '#/locales';
-import QcExportRangeModal from '#/views/mes/qc/components/export-range-modal.vue';
 import QcImportFormModal from '#/views/mes/qc/components/import-form-modal.vue';
 import QcReportGenerateModal from '#/views/mes/qc/components/report-generate-modal.vue';
 
@@ -35,11 +35,6 @@
 
 const [FormModal, formModalApi] = useVbenModal({
   connectedComponent: Form,
-  destroyOnClose: true,
-});
-
-const [ExportRangeModal, exportRangeModalApi] = useVbenModal({
-  connectedComponent: QcExportRangeModal,
   destroyOnClose: true,
 });
 
@@ -107,15 +102,10 @@
   }
 }
 
-/** 瀵煎嚭琛ㄦ牸锛堝脊绐楅�夋楠屾椂闂磋寖鍥达級 */
-function handleExport() {
-  exportRangeModalApi
-    .setData({
-      title: '鎸夋楠屾椂闂村鍑烘潵鏂欐楠屽崟',
-      exportApi: exportIqc,
-      fileName: '鏉ユ枡妫�楠屽崟.xls',
-    })
-    .open();
+/** 瀵煎嚭琛ㄦ牸锛堟寜鍒楄〃绛涢�夋潯浠跺鍑猴級 */
+async function handleExport() {
+  const data = await exportIqc(await gridApi.formApi.getValues());
+  downloadFileFromBlobPart({ fileName: '鏉ユ枡妫�楠屽崟.xls', source: data });
 }
 
 /** 鍑烘姤鍛婏細鏁版嵁鐢卞悗绔粠璇ヨ川妫�鍗曞彇锛屽墠绔彧閫夋ā鏉� */
@@ -166,7 +156,6 @@
 <template>
   <Page auto-content-height>
     <FormModal @success="handleRefresh" />
-    <ExportRangeModal />
     <ReportModal />
     <ImportModal @success="handleRefresh" />
     <Grid table-title="鏉ユ枡妫�楠屽崟鍒楄〃">
diff --git a/src/views/mes/qc/oqc/index.vue b/src/views/mes/qc/oqc/index.vue
index 7491ac7..3782c48 100644
--- a/src/views/mes/qc/oqc/index.vue
+++ b/src/views/mes/qc/oqc/index.vue
@@ -4,6 +4,7 @@
 
 import { Page, useVbenModal } from '@vben/common-ui';
 import { MesQcStatusEnum } from '@vben/constants';
+import { downloadFileFromBlobPart } from '@vben/utils';
 
 import { Button, message } from 'ant-design-vue';
 
@@ -16,7 +17,6 @@
   importOqcTemplate,
 } from '#/api/mes/qc/oqc';
 import { $t } from '#/locales';
-import QcExportRangeModal from '#/views/mes/qc/components/export-range-modal.vue';
 import QcImportFormModal from '#/views/mes/qc/components/import-form-modal.vue';
 import QcReportGenerateModal from '#/views/mes/qc/components/report-generate-modal.vue';
 
@@ -28,11 +28,6 @@
 
 const [FormModal, formModalApi] = useVbenModal({
   connectedComponent: Form,
-  destroyOnClose: true,
-});
-
-const [ExportRangeModal, exportRangeModalApi] = useVbenModal({
-  connectedComponent: QcExportRangeModal,
   destroyOnClose: true,
 });
 
@@ -100,15 +95,10 @@
   }
 }
 
-/** 瀵煎嚭琛ㄦ牸锛堝脊绐楅�夋楠屾椂闂磋寖鍥达級 */
-function handleExport() {
-  exportRangeModalApi
-    .setData({
-      title: '鎸夋楠屾椂闂村鍑鸿揣妫�楠屽崟',
-      exportApi: exportOqc,
-      fileName: '鍑鸿揣妫�楠屽崟.xls',
-    })
-    .open();
+/** 瀵煎嚭琛ㄦ牸锛堟寜鍒楄〃绛涢�夋潯浠跺鍑猴級 */
+async function handleExport() {
+  const data = await exportOqc(await gridApi.formApi.getValues());
+  downloadFileFromBlobPart({ fileName: '鍑鸿揣妫�楠屽崟.xls', source: data });
 }
 
 /** 鍑烘姤鍛婏細鏁版嵁鐢卞悗绔粠璇ヨ川妫�鍗曞彇锛屽墠绔彧閫夋ā鏉� */
@@ -152,7 +142,6 @@
 <template>
   <Page auto-content-height>
     <FormModal @success="handleRefresh" />
-    <ExportRangeModal />
     <ReportModal />
     <ImportModal @success="handleRefresh" />
     <Grid table-title="鍑鸿揣妫�楠屽崟鍒楄〃">
diff --git a/src/views/mes/qc/rqc/index.vue b/src/views/mes/qc/rqc/index.vue
index 64564a9..a5d1e36 100644
--- a/src/views/mes/qc/rqc/index.vue
+++ b/src/views/mes/qc/rqc/index.vue
@@ -4,13 +4,13 @@
 
 import { Page, useVbenModal } from '@vben/common-ui';
 import { MesQcStatusEnum } from '@vben/constants';
+import { downloadFileFromBlobPart } from '@vben/utils';
 
 import { Button, message } from 'ant-design-vue';
 
 import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
 import { deleteRqc, exportRqc, getRqcPage } from '#/api/mes/qc/rqc';
 import { $t } from '#/locales';
-import QcExportRangeModal from '#/views/mes/qc/components/export-range-modal.vue';
 import QcReportGenerateModal from '#/views/mes/qc/components/report-generate-modal.vue';
 
 import { useGridColumns, useGridFormSchema } from './data';
@@ -21,11 +21,6 @@
 
 const [FormModal, formModalApi] = useVbenModal({
   connectedComponent: Form,
-  destroyOnClose: true,
-});
-
-const [ExportRangeModal, exportRangeModalApi] = useVbenModal({
-  connectedComponent: QcExportRangeModal,
   destroyOnClose: true,
 });
 
@@ -69,15 +64,10 @@
   }
 }
 
-/** 瀵煎嚭琛ㄦ牸锛堝脊绐楅�夋楠屾椂闂磋寖鍥达級 */
-function handleExport() {
-  exportRangeModalApi
-    .setData({
-      title: '鎸夋楠屾椂闂村閫�璐ф楠屽崟',
-      exportApi: exportRqc,
-      fileName: '閫�璐ф楠屽崟.xls',
-    })
-    .open();
+/** 瀵煎嚭琛ㄦ牸锛堟寜鍒楄〃绛涢�夋潯浠跺鍑猴級 */
+async function handleExport() {
+  const data = await exportRqc(await gridApi.formApi.getValues());
+  downloadFileFromBlobPart({ fileName: '閫�璐ф楠屽崟.xls', source: data });
 }
 
 /** 鍑烘姤鍛婏細鏁版嵁鐢卞悗绔粠璇ヨ川妫�鍗曞彇锛屽墠绔彧閫夋ā鏉� */
@@ -121,7 +111,6 @@
 <template>
   <Page auto-content-height>
     <FormModal @success="handleRefresh" />
-    <ExportRangeModal />
     <ReportModal />
     <Grid table-title="閫�璐ф楠屽崟鍒楄〃">
       <template #toolbar-tools>

--
Gitblit v1.9.3