2026-09-04 37ddf55c782ea3d128e7755a60f5e09f8e9cba09
feat(qc): 添加质检方案选择和检测日期筛选功能

- 在IPQC、IQQ、OQC、RQC质检模块中新增质检方案下拉选择组件
- 添加检测日期范围筛选功能,支持按时间段导出质检数据
- 新增通用质检导出时间范围选择弹窗组件
- 实现质检方案与生产订单、任务、物料的动态关联
- 优化导出功能,增加时间范围参数支持
- 统一质检模块的数据结构和表单验证规则
已添加1个文件
已修改14个文件
455 ■■■■■ 文件已修改
src/api/hrm/leave/index.ts 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/mes/qc/template/item/index.ts 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/hrm/leave/data.ts 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/hrm/leave/detail/approve/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/hrm/leave/index.vue 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/hrm/leave/modules/form.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/qc/components/export-range-modal.vue 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/qc/ipqc/data.ts 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/qc/ipqc/index.vue 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/qc/iqc/data.ts 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/qc/iqc/index.vue 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/qc/oqc/data.ts 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/qc/oqc/index.vue 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/qc/rqc/data.ts 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/qc/rqc/index.vue 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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',
  );
}
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 },
  );
}
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',
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: '请假类型',
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>
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();
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;
  /** æ¨¡å—导出函数:requestClient.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>
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(),
      },
    },
  ];
}
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
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',
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
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(),
      },
    },
  ];
}
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
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(),
      },
    },
  ];
}
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