From 37ddf55c782ea3d128e7755a60f5e09f8e9cba09 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期五, 04 九月 2026 13:40:56 +0800
Subject: [PATCH] feat(qc): 添加质检方案选择和检测日期筛选功能

---
 src/api/hrm/leave/index.ts                         |   20 +
 src/views/hrm/leave/detail/approve/index.vue       |    2 
 src/views/mes/qc/iqc/index.vue                     |   25 ++
 src/views/mes/qc/ipqc/data.ts                      |   43 +++++
 src/views/hrm/leave/data.ts                        |   15 +
 src/views/mes/qc/iqc/data.ts                       |   28 +++
 src/views/mes/qc/oqc/data.ts                       |   37 ++++
 src/views/mes/qc/ipqc/index.vue                    |   25 ++
 src/views/mes/qc/oqc/index.vue                     |   25 ++
 src/views/mes/qc/rqc/index.vue                     |   25 ++
 src/api/mes/qc/template/item/index.ts              |   28 +++
 src/views/hrm/leave/index.vue                      |   50 +++++
 src/views/mes/qc/components/export-range-modal.vue |   89 +++++++++++
 src/views/hrm/leave/modules/form.vue               |    6 
 src/views/mes/qc/rqc/data.ts                       |   37 ++++
 15 files changed, 415 insertions(+), 40 deletions(-)

diff --git a/src/api/hrm/leave/index.ts b/src/api/hrm/leave/index.ts
index e280286..ee16a80 100644
--- a/src/api/hrm/leave/index.ts
+++ b/src/api/hrm/leave/index.ts
@@ -7,8 +7,8 @@
   /** 璇峰亣鐢宠 */
   export interface Leave {
     id?: number;
-    employeeId?: number;
-    employeeName?: string;
+    userId?: number;
+    userName?: string;
     deptName?: string;
     leaveType?: number;
     startTime?: string;
@@ -21,6 +21,12 @@
     processInstanceId?: string;
     remark?: string;
     createTime?: string;
+  }
+
+  /** 瀹℃壒娴佺▼ */
+  export interface ApproveProcess {
+    key: string;
+    name: string;
   }
 }
 
@@ -53,8 +59,10 @@
 }
 
 /** 鎻愪氦璇峰亣鐢宠锛堝彂璧峰鎵癸級 */
-export function submitLeave(id: number) {
-  return requestClient.post(`/hrm/leave/submit?id=${id}`);
+export function submitLeave(id: number, processDefinitionKey: string) {
+  return requestClient.post('/hrm/leave/submit', null, {
+    params: { id, processDefinitionKey },
+  });
 }
 
 /** 鎾ら攢璇峰亣鐢宠 */
@@ -64,5 +72,7 @@
 
 /** 鑾峰彇鍙敤娴佺▼瀹氫箟鍒楄〃 */
 export function getLeaveApproveProcessDefinitionList() {
-  return requestClient.get<any[]>('/hrm/leave/approve-process-definition-list');
+  return requestClient.get<HrmLeaveApi.ApproveProcess[]>(
+    '/hrm/leave/approve-process-definition-list',
+  );
 }
\ No newline at end of file
diff --git a/src/api/mes/qc/template/item/index.ts b/src/api/mes/qc/template/item/index.ts
index a7b92c1..d10c641 100644
--- a/src/api/mes/qc/template/item/index.ts
+++ b/src/api/mes/qc/template/item/index.ts
@@ -21,6 +21,21 @@
   }
 }
 
+/** 璐ㄦ鏂规閫夐」锛堟柟妗�-浜у搧鍏宠仈锛� */
+export namespace MesQcTemplateItemOptionApi {
+  export interface Option {
+    id?: number; // 浜у搧鍏宠仈缂栧彿
+    templateId?: number; // 璐ㄦ鏂规 ID
+    templateCode?: string; // 璐ㄦ鏂规缂栧彿
+    templateName?: string; // 璐ㄦ鏂规鍚嶇О
+    quantityCheck?: number; // 鏈�浣庢娴嬫暟
+    quantityUnqualified?: number; // 鏈�澶т笉鍚堟牸鏁�
+    criticalRate?: number; // 鏈�澶ц嚧鍛界己闄风巼锛�%锛�
+    majorRate?: number; // 鏈�澶т弗閲嶇己闄风巼锛�%锛�
+    minorRate?: number; // 鏈�澶ц交寰己闄风巼锛�%锛�
+  }
+}
+
 /** 鏌ヨ浜у搧鍏宠仈鍒嗛〉 */
 export function getTemplateItemPage(
   params: PageParam & { templateId?: number },
@@ -52,3 +67,16 @@
 export function deleteTemplateItem(id: number) {
   return requestClient.delete(`/mes/qc/template/item/delete?id=${id}`);
 }
+
+/** 鏍规嵁鐗╂枡鎴栧伐鍗�/浠诲姟鍜屾娴嬬绫昏幏鍙栧彲鐢ㄨ川妫�鏂规鍒楄〃 */
+export function getTemplateItemOptionList(params: {
+  itemId?: number;
+  qcType: number;
+  taskId?: number;
+  workOrderId?: number;
+}) {
+  return requestClient.get<MesQcTemplateItemOptionApi.Option[]>(
+    '/mes/qc/template/item/list-by-item-and-type',
+    { params },
+  );
+}
diff --git a/src/views/hrm/leave/data.ts b/src/views/hrm/leave/data.ts
index c6d5154..6e8570e 100644
--- a/src/views/hrm/leave/data.ts
+++ b/src/views/hrm/leave/data.ts
@@ -2,8 +2,12 @@
 import type { VxeTableGridOptions } from '#/adapter/vxe-table';
 import type { HrmLeaveApi } from '#/api/hrm/leave';
 
+import { markRaw } from 'vue';
+
 import { DICT_TYPE } from '#/packages/constants/src';
 import { getDictOptions } from '#/packages/effects/hooks/src';
+
+import { UserSelect } from '#/views/system/user/components';
 
 /** 琛ㄥ崟绫诲瀷 */
 export type FormType = 'create' | 'detail' | 'update';
@@ -18,6 +22,15 @@
         triggerFields: [''],
         show: () => false,
       },
+    },
+    {
+      fieldName: 'userId',
+      label: '鐢宠浜�',
+      component: markRaw(UserSelect),
+      componentProps: {
+        placeholder: '璇烽�夋嫨鐢宠浜�',
+      },
+      rules: 'selectRequired',
     },
     {
       fieldName: 'leaveType',
@@ -134,7 +147,7 @@
 export function useGridColumns(): VxeTableGridOptions<HrmLeaveApi.Leave>['columns'] {
   return [
     { field: 'id', title: '鐢宠缂栧彿', width: 80 },
-    { field: 'employeeName', title: '鐢宠浜�', minWidth: 100 },
+    { field: 'userName', title: '鐢宠浜�', minWidth: 100 },
     { field: 'deptName', title: '閮ㄩ棬', minWidth: 120 },
     {
       field: 'leaveType',
diff --git a/src/views/hrm/leave/detail/approve/index.vue b/src/views/hrm/leave/detail/approve/index.vue
index 59248e4..0573837 100644
--- a/src/views/hrm/leave/detail/approve/index.vue
+++ b/src/views/hrm/leave/detail/approve/index.vue
@@ -30,7 +30,7 @@
   bordered: true,
   column: 2,
   schema: [
-    { label: '鍛樺伐濮撳悕', field: 'employeeName', render: textRender },
+    { label: '鐢宠浜�', field: 'userName', render: textRender },
     { label: '鎵�灞為儴闂�', field: 'deptName', render: textRender },
     {
       label: '璇峰亣绫诲瀷',
diff --git a/src/views/hrm/leave/index.vue b/src/views/hrm/leave/index.vue
index e7ae028..d088fc2 100644
--- a/src/views/hrm/leave/index.vue
+++ b/src/views/hrm/leave/index.vue
@@ -2,9 +2,11 @@
 import type { VxeTableGridOptions } from '#/adapter/vxe-table';
 import type { HrmLeaveApi } from '#/api/hrm/leave';
 
+import { ref } from 'vue';
+
 import { Page, useVbenModal } from '#/packages/effects/common-ui/src';
 
-import { message, Tag } from 'ant-design-vue';
+import { message, Modal, Select, Tag } from 'ant-design-vue';
 
 import { DICT_TYPE } from '#/packages/constants/src';
 import { getDictLabel } from '#/packages/effects/hooks/src';
@@ -13,6 +15,7 @@
 import {
   cancelLeave,
   deleteLeave,
+  getLeaveApproveProcessDefinitionList,
   getLeavePage,
   submitLeave,
 } from '#/api/hrm/leave';
@@ -61,11 +64,34 @@
   }
 }
 
-/** 鎻愪氦璇峰亣鐢宠 */
+const submitModalVisible = ref(false);
+const currentRow = ref<HrmLeaveApi.Leave>();
+const processList = ref<HrmLeaveApi.ApproveProcess[]>([]);
+const selectedProcessKey = ref<string>();
+const submitLoading = ref(false);
+
+/** 鎻愪氦璇峰亣鐢宠锛堝厛閫夋嫨瀹℃壒娴佺▼锛� */
 async function handleSubmit(row: HrmLeaveApi.Leave) {
-  await submitLeave(row.id!);
-  message.success('鎻愪氦鎴愬姛');
-  handleRefresh();
+  processList.value = await getLeaveApproveProcessDefinitionList();
+  currentRow.value = row;
+  selectedProcessKey.value = undefined;
+  submitModalVisible.value = true;
+}
+
+async function confirmSubmit() {
+  if (!selectedProcessKey.value) {
+    message.warning('璇烽�夋嫨璇峰亣瀹℃壒娴佺▼');
+    return;
+  }
+  submitLoading.value = true;
+  try {
+    await submitLeave(currentRow.value!.id!, selectedProcessKey.value);
+    message.success('鎻愪氦鎴愬姛');
+    submitModalVisible.value = false;
+    handleRefresh();
+  } finally {
+    submitLoading.value = false;
+  }
 }
 
 /** 鎾ら攢璇峰亣鐢宠 */
@@ -187,5 +213,19 @@
         />
       </template>
     </Grid>
+    <Modal
+      v-model:open="submitModalVisible"
+      title="鎻愪氦鑷冲崗鍚屽姙鍏�"
+      width="420px"
+      :confirm-loading="submitLoading"
+      @ok="confirmSubmit"
+    >
+      <Select
+        v-model:value="selectedProcessKey"
+        class="w-full"
+        placeholder="璇烽�夋嫨璇峰亣瀹℃壒娴佺▼"
+        :options="processList.map((item) => ({ label: item.name, value: item.key }))"
+      />
+    </Modal>
   </Page>
 </template>
\ No newline at end of file
diff --git a/src/views/hrm/leave/modules/form.vue b/src/views/hrm/leave/modules/form.vue
index 4aab581..f701b81 100644
--- a/src/views/hrm/leave/modules/form.vue
+++ b/src/views/hrm/leave/modules/form.vue
@@ -4,6 +4,8 @@
 
 import { computed, ref } from 'vue';
 
+import { useUserStore } from '@vben/stores';
+
 import { useVbenModal } from '#/packages/effects/common-ui/src';
 
 import { message } from 'ant-design-vue';
@@ -16,6 +18,8 @@
 
 const emit = defineEmits(['success']);
 const formType = ref<FormType>('create');
+
+const userStore = useUserStore();
 
 const isDetail = computed(() => formType.value === 'detail');
 const getTitle = computed(() => {
@@ -74,6 +78,8 @@
     formApi.setDisabled(data.formType === 'detail');
     modalApi.setState({ showConfirmButton: data.formType !== 'detail' });
     if (!data?.id) {
+      // 鏂板鏃堕粯璁ょ敵璇蜂汉涓哄綋鍓嶇櫥褰曠敤鎴凤紝鍙慨鏀�
+      await formApi.setFieldValue('userId', userStore.userInfo?.id);
       return;
     }
     modalApi.lock();
diff --git a/src/views/mes/qc/components/export-range-modal.vue b/src/views/mes/qc/components/export-range-modal.vue
new file mode 100644
index 0000000..19fedfe
--- /dev/null
+++ b/src/views/mes/qc/components/export-range-modal.vue
@@ -0,0 +1,89 @@
+<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/data.ts b/src/views/mes/qc/ipqc/data.ts
index 58f1e88..86522b9 100644
--- a/src/views/mes/qc/ipqc/data.ts
+++ b/src/views/mes/qc/ipqc/data.ts
@@ -16,7 +16,9 @@
 import { Button } from 'ant-design-vue';
 
 import { generateAutoCode } from '#/api/mes/md/autocode/record';
+import { getTemplateItemOptionList } from '#/api/mes/qc/template/item';
 import { getSimpleUserList } from '#/api/system/user';
+import { getRangePickerDefaultProps } from '#/utils';
 import { MdItemSelect } from '#/views/mes/md/item/components';
 import { MdWorkstationSelect } from '#/views/mes/md/workstation/components';
 import { ProTaskSelect } from '#/views/mes/pro/task/components';
@@ -202,6 +204,39 @@
           statuses: [MesProTaskStatusEnum.PREPARE],
           workOrderId: values.workOrderId,
           workstationId: values.workstationId,
+        }),
+      },
+    },
+    {
+      fieldName: 'templateId',
+      label: '璐ㄦ鏂规',
+      component: 'ApiSelect',
+      componentProps: {
+        api: getTemplateItemOptionList,
+        autoSelect: 'first',
+        labelField: 'templateName',
+        valueField: 'templateId',
+        placeholder: '璇烽�夋嫨璐ㄦ鏂规',
+      },
+      rules: 'selectRequired',
+      dependencies: {
+        triggerFields: ['workOrderId', 'taskId'],
+        componentProps: (values) => ({
+          api: getTemplateItemOptionList,
+          autoSelect: 'first',
+          labelField: 'templateName',
+          valueField: 'templateId',
+          disabled: formType !== 'create' || !values.workOrderId,
+          params: values.workOrderId
+            ? {
+                qcType: 2,
+                workOrderId: values.workOrderId,
+                taskId: values.taskId,
+              }
+            : {},
+          placeholder: values.workOrderId
+            ? '璇烽�夋嫨璐ㄦ鏂规'
+            : '璇峰厛閫夋嫨鐢熶骇璁㈠崟',
         }),
       },
     },
@@ -404,6 +439,14 @@
         placeholder: '璇烽�夋嫨妫�娴嬬粨鏋�',
       },
     },
+    {
+      fieldName: 'inspectDate',
+      label: '妫�娴嬫棩鏈�',
+      component: 'RangePicker',
+      componentProps: {
+        ...getRangePickerDefaultProps(),
+      },
+    },
   ];
 }
 
diff --git a/src/views/mes/qc/ipqc/index.vue b/src/views/mes/qc/ipqc/index.vue
index 32d46c4..832a85a 100644
--- a/src/views/mes/qc/ipqc/index.vue
+++ b/src/views/mes/qc/ipqc/index.vue
@@ -4,19 +4,24 @@
 
 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 { deleteIpqc, exportIpqc, getIpqcPage } from '#/api/mes/qc/ipqc';
 import { $t } from '#/locales';
+import QcExportRangeModal from '#/views/mes/qc/components/export-range-modal.vue';
 
 import { useGridColumns, useGridFormSchema } from './data';
 import Form from './modules/form.vue';
 
 const [FormModal, formModalApi] = useVbenModal({
   connectedComponent: Form,
+  destroyOnClose: true,
+});
+
+const [ExportRangeModal, exportRangeModalApi] = useVbenModal({
+  connectedComponent: QcExportRangeModal,
   destroyOnClose: true,
 });
 
@@ -55,10 +60,15 @@
   }
 }
 
-/** 瀵煎嚭琛ㄦ牸 */
-async function handleExport() {
-  const data = await exportIpqc(await gridApi.formApi.getValues());
-  downloadFileFromBlobPart({ fileName: '杩囩▼妫�楠屽崟.xls', source: data });
+/** 瀵煎嚭琛ㄦ牸锛堝脊绐楅�夋楠屾椂闂磋寖鍥达級 */
+function handleExport() {
+  exportRangeModalApi
+    .setData({
+      title: '鎸夋楠屾椂闂村鍑鸿繃绋嬫楠屽崟',
+      exportApi: exportIpqc,
+      fileName: '杩囩▼妫�楠屽崟.xls',
+    })
+    .open();
 }
 
 const [Grid, gridApi] = useVbenVxeGrid({
@@ -93,8 +103,9 @@
 </script>
 
 <template>
-  <Page auto-content-height><FormModal @success="handleRefresh" />
-
+  <Page auto-content-height>
+    <FormModal @success="handleRefresh" />
+    <ExportRangeModal />
     <Grid table-title="杩囩▼妫�楠屽崟鍒楄〃">
       <template #toolbar-tools>
         <TableAction
diff --git a/src/views/mes/qc/iqc/data.ts b/src/views/mes/qc/iqc/data.ts
index 40cb523..a59f777 100644
--- a/src/views/mes/qc/iqc/data.ts
+++ b/src/views/mes/qc/iqc/data.ts
@@ -11,6 +11,7 @@
 import { Button } from 'ant-design-vue';
 
 import { generateAutoCode } from '#/api/mes/md/autocode/record';
+import { getTemplateItemOptionList } from '#/api/mes/qc/template/item';
 import { getSupplierSimpleList } from '#/api/srm/supplier';
 import { getSimpleUserList } from '#/api/system/user';
 import { getRangePickerDefaultProps } from '#/utils';
@@ -135,6 +136,33 @@
       },
     },
     {
+      fieldName: 'templateId',
+      label: '璐ㄦ鏂规',
+      component: 'ApiSelect',
+      componentProps: {
+        api: getTemplateItemOptionList,
+        autoSelect: 'first',
+        labelField: 'templateName',
+        valueField: 'templateId',
+        placeholder: '璇烽�夋嫨璐ㄦ鏂规',
+      },
+      rules: 'selectRequired',
+      dependencies: {
+        triggerFields: ['itemId'],
+        componentProps: (values) => ({
+          api: getTemplateItemOptionList,
+          autoSelect: 'first',
+          labelField: 'templateName',
+          valueField: 'templateId',
+          disabled: formType !== 'create' || !values.itemId,
+          params: values.itemId
+            ? { itemId: values.itemId, qcType: 1 }
+            : {},
+          placeholder: values.itemId ? '璇烽�夋嫨璐ㄦ鏂规' : '璇峰厛閫夋嫨浜у搧鐗╂枡',
+        }),
+      },
+    },
+    {
       fieldName: 'vendorId',
       label: '渚涘簲鍟�',
       component: 'ApiSelect',
diff --git a/src/views/mes/qc/iqc/index.vue b/src/views/mes/qc/iqc/index.vue
index 44e0901..761305f 100644
--- a/src/views/mes/qc/iqc/index.vue
+++ b/src/views/mes/qc/iqc/index.vue
@@ -7,13 +7,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 { deleteIqc, exportIqc, getIqcPage } from '#/api/mes/qc/iqc';
 import { $t } from '#/locales';
+import QcExportRangeModal from '#/views/mes/qc/components/export-range-modal.vue';
 
 import { useGridColumns, useGridFormSchema } from './data';
 import Form from './modules/form.vue';
@@ -24,6 +24,11 @@
 
 const [FormModal, formModalApi] = useVbenModal({
   connectedComponent: Form,
+  destroyOnClose: true,
+});
+
+const [ExportRangeModal, exportRangeModalApi] = useVbenModal({
+  connectedComponent: QcExportRangeModal,
   destroyOnClose: true,
 });
 
@@ -62,10 +67,15 @@
   }
 }
 
-/** 瀵煎嚭琛ㄦ牸 */
-async function handleExport() {
-  const data = await exportIqc(await gridApi.formApi.getValues());
-  downloadFileFromBlobPart({ fileName: '鏉ユ枡妫�楠屽崟.xls', source: data });
+/** 瀵煎嚭琛ㄦ牸锛堝脊绐楅�夋楠屾椂闂磋寖鍥达級 */
+function handleExport() {
+  exportRangeModalApi
+    .setData({
+      title: '鎸夋楠屾椂闂村鍑烘潵鏂欐楠屽崟',
+      exportApi: exportIqc,
+      fileName: '鏉ユ枡妫�楠屽崟.xls',
+    })
+    .open();
 }
 
 const [Grid, gridApi] = useVbenVxeGrid({
@@ -107,8 +117,9 @@
 </script>
 
 <template>
-  <Page auto-content-height><FormModal @success="handleRefresh" />
-
+  <Page auto-content-height>
+    <FormModal @success="handleRefresh" />
+    <ExportRangeModal />
     <Grid table-title="鏉ユ枡妫�楠屽崟鍒楄〃">
       <template #toolbar-tools>
         <TableAction
diff --git a/src/views/mes/qc/oqc/data.ts b/src/views/mes/qc/oqc/data.ts
index 0183a35..54b6766 100644
--- a/src/views/mes/qc/oqc/data.ts
+++ b/src/views/mes/qc/oqc/data.ts
@@ -11,7 +11,9 @@
 import { Button } from 'ant-design-vue';
 
 import { generateAutoCode } from '#/api/mes/md/autocode/record';
+import { getTemplateItemOptionList } from '#/api/mes/qc/template/item';
 import { getSimpleUserList } from '#/api/system/user';
+import { getRangePickerDefaultProps } from '#/utils';
 import CrmCustomerSelect from '#/components/crm-customer-select.vue';
 import { MdmItemSelect } from '#/views/basicData/mdm/components';
 
@@ -129,6 +131,33 @@
         componentProps: (values) => ({
           disabled: !!values.sourceDocId,
           placeholder: '璇烽�夋嫨浜у搧鐗╂枡',
+        }),
+      },
+    },
+    {
+      fieldName: 'templateId',
+      label: '璐ㄦ鏂规',
+      component: 'ApiSelect',
+      componentProps: {
+        api: getTemplateItemOptionList,
+        autoSelect: 'first',
+        labelField: 'templateName',
+        valueField: 'templateId',
+        placeholder: '璇烽�夋嫨璐ㄦ鏂规',
+      },
+      rules: 'selectRequired',
+      dependencies: {
+        triggerFields: ['itemId'],
+        componentProps: (values) => ({
+          api: getTemplateItemOptionList,
+          autoSelect: 'first',
+          labelField: 'templateName',
+          valueField: 'templateId',
+          disabled: formType !== 'create' || !values.itemId,
+          params: values.itemId
+            ? { itemId: values.itemId, qcType: 3 }
+            : {},
+          placeholder: values.itemId ? '璇烽�夋嫨璐ㄦ鏂规' : '璇峰厛閫夋嫨浜у搧鐗╂枡',
         }),
       },
     },
@@ -340,6 +369,14 @@
         placeholder: '璇烽�夋嫨妫�娴嬬粨鏋�',
       },
     },
+    {
+      fieldName: 'inspectDate',
+      label: '妫�娴嬫棩鏈�',
+      component: 'RangePicker',
+      componentProps: {
+        ...getRangePickerDefaultProps(),
+      },
+    },
   ];
 }
 
diff --git a/src/views/mes/qc/oqc/index.vue b/src/views/mes/qc/oqc/index.vue
index 965cfda..f9043b1 100644
--- a/src/views/mes/qc/oqc/index.vue
+++ b/src/views/mes/qc/oqc/index.vue
@@ -4,19 +4,24 @@
 
 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 { deleteOqc, exportOqc, getOqcPage } from '#/api/mes/qc/oqc';
 import { $t } from '#/locales';
+import QcExportRangeModal from '#/views/mes/qc/components/export-range-modal.vue';
 
 import { useGridColumns, useGridFormSchema } from './data';
 import Form from './modules/form.vue';
 
 const [FormModal, formModalApi] = useVbenModal({
   connectedComponent: Form,
+  destroyOnClose: true,
+});
+
+const [ExportRangeModal, exportRangeModalApi] = useVbenModal({
+  connectedComponent: QcExportRangeModal,
   destroyOnClose: true,
 });
 
@@ -55,10 +60,15 @@
   }
 }
 
-/** 瀵煎嚭琛ㄦ牸 */
-async function handleExport() {
-  const data = await exportOqc(await gridApi.formApi.getValues());
-  downloadFileFromBlobPart({ fileName: '鍑鸿揣妫�楠屽崟.xls', source: data });
+/** 瀵煎嚭琛ㄦ牸锛堝脊绐楅�夋楠屾椂闂磋寖鍥达級 */
+function handleExport() {
+  exportRangeModalApi
+    .setData({
+      title: '鎸夋楠屾椂闂村鍑鸿揣妫�楠屽崟',
+      exportApi: exportOqc,
+      fileName: '鍑鸿揣妫�楠屽崟.xls',
+    })
+    .open();
 }
 
 const [Grid, gridApi] = useVbenVxeGrid({
@@ -93,8 +103,9 @@
 </script>
 
 <template>
-  <Page auto-content-height><FormModal @success="handleRefresh" />
-
+  <Page auto-content-height>
+    <FormModal @success="handleRefresh" />
+    <ExportRangeModal />
     <Grid table-title="鍑鸿揣妫�楠屽崟鍒楄〃">
       <template #toolbar-tools>
         <TableAction
diff --git a/src/views/mes/qc/rqc/data.ts b/src/views/mes/qc/rqc/data.ts
index 92d5e1e..ab9af37 100644
--- a/src/views/mes/qc/rqc/data.ts
+++ b/src/views/mes/qc/rqc/data.ts
@@ -15,7 +15,9 @@
 import { Button } from 'ant-design-vue';
 
 import { generateAutoCode } from '#/api/mes/md/autocode/record';
+import { getTemplateItemOptionList } from '#/api/mes/qc/template/item';
 import { getSimpleUserList } from '#/api/system/user';
+import { getRangePickerDefaultProps } from '#/utils';
 import { MdmItemSelect } from '#/views/basicData/mdm/components';
 
 /** 琛ㄥ崟绫诲瀷 */
@@ -154,6 +156,33 @@
         componentProps: (values) => ({
           disabled: !!values.sourceDocId,
           placeholder: '璇烽�夋嫨浜у搧鐗╂枡',
+        }),
+      },
+    },
+    {
+      fieldName: 'templateId',
+      label: '璐ㄦ鏂规',
+      component: 'ApiSelect',
+      componentProps: {
+        api: getTemplateItemOptionList,
+        autoSelect: 'first',
+        labelField: 'templateName',
+        valueField: 'templateId',
+        placeholder: '璇烽�夋嫨璐ㄦ鏂规',
+      },
+      rules: 'selectRequired',
+      dependencies: {
+        triggerFields: ['itemId'],
+        componentProps: (values) => ({
+          api: getTemplateItemOptionList,
+          autoSelect: 'first',
+          labelField: 'templateName',
+          valueField: 'templateId',
+          disabled: formType !== 'create' || !values.itemId,
+          params: values.itemId
+            ? { itemId: values.itemId, qcType: 4 }
+            : {},
+          placeholder: values.itemId ? '璇烽�夋嫨璐ㄦ鏂规' : '璇峰厛閫夋嫨浜у搧鐗╂枡',
         }),
       },
     },
@@ -330,6 +359,14 @@
         valueField: 'id',
       },
     },
+    {
+      fieldName: 'inspectDate',
+      label: '妫�娴嬫棩鏈�',
+      component: 'RangePicker',
+      componentProps: {
+        ...getRangePickerDefaultProps(),
+      },
+    },
   ];
 }
 
diff --git a/src/views/mes/qc/rqc/index.vue b/src/views/mes/qc/rqc/index.vue
index 0cfc6f2..2771b4c 100644
--- a/src/views/mes/qc/rqc/index.vue
+++ b/src/views/mes/qc/rqc/index.vue
@@ -4,19 +4,24 @@
 
 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 { useGridColumns, useGridFormSchema } from './data';
 import Form from './modules/form.vue';
 
 const [FormModal, formModalApi] = useVbenModal({
   connectedComponent: Form,
+  destroyOnClose: true,
+});
+
+const [ExportRangeModal, exportRangeModalApi] = useVbenModal({
+  connectedComponent: QcExportRangeModal,
   destroyOnClose: true,
 });
 
@@ -55,10 +60,15 @@
   }
 }
 
-/** 瀵煎嚭琛ㄦ牸 */
-async function handleExport() {
-  const data = await exportRqc(await gridApi.formApi.getValues());
-  downloadFileFromBlobPart({ fileName: '閫�璐ф楠屽崟.xls', source: data });
+/** 瀵煎嚭琛ㄦ牸锛堝脊绐楅�夋楠屾椂闂磋寖鍥达級 */
+function handleExport() {
+  exportRangeModalApi
+    .setData({
+      title: '鎸夋楠屾椂闂村閫�璐ф楠屽崟',
+      exportApi: exportRqc,
+      fileName: '閫�璐ф楠屽崟.xls',
+    })
+    .open();
 }
 
 const [Grid, gridApi] = useVbenVxeGrid({
@@ -93,8 +103,9 @@
 </script>
 
 <template>
-  <Page auto-content-height><FormModal @success="handleRefresh" />
-
+  <Page auto-content-height>
+    <FormModal @success="handleRefresh" />
+    <ExportRangeModal />
     <Grid table-title="閫�璐ф楠屽崟鍒楄〃">
       <template #toolbar-tools>
         <TableAction

--
Gitblit v1.9.3