wupengfei
2025-04-30 b3fda48ba53b36f6770f399f58290ed4d95d04a6
src/components/commonView/FourStreamsMaterialFileTable.vue
@@ -9,7 +9,7 @@
      :showTableColumnSetting="false"
    >
      <template #fileBusinessType="{ row }">
        {{ FourStreamsMaterialFileBusinessTypeEnumText[row.fileBusinessType] }}
        {{ BusinessTypeEnumText[row.fileBusinessType] }}
      </template>
      <template #operationBtn-uploadBtn="{ data, row }">
        <BlFileUpload
@@ -25,13 +25,20 @@
        </BlFileUpload>
      </template>
    </ProTableV2>
    <FourStreamsBatchMaterialFileDialog
      v-bind="dialogProps"
      :name="''"
      :zipName="`${BusinessTypeEnumText[currentFourStreamsMaterialFileTableItem.fileBusinessType as any]}`"
      v-model:fileList="currentFourStreamsMaterialFileTableItem.fileList"
      :showDeleteBtn="showDeleteBtn"
    />
  </div>
</template>
<script setup lang="ts">
<script setup lang="ts" generic="T">
import {
  FourStreamsMaterialFileTableProps,
  FourStreamsMaterialFileTableItem,
  BaseMaterialFileTableItem,
  FourStreamsMaterialFileBusinessTypeEnumText,
} from './types';
import {
@@ -40,10 +47,12 @@
  defineOperationBtns,
  BlFileUpload,
  bolePreview,
  useDialog,
} from '@bole-core/components';
import { downloadFileByUrl } from '@/utils';
import { Message, isFileCanPreview } from '@bole-core/core';
import { Message, isFileCanPreview, downloadWithZip } from '@bole-core/core';
import { useDefineColumns } from '@/hooks';
import FourStreamsBatchMaterialFileDialog from './FourStreamsBatchMaterialFileDialog.vue';
defineOptions({
  name: 'FourStreamsMaterialFileTable',
@@ -55,9 +64,10 @@
  showDownloadBtn: true,
  showDeleteBtn: true,
  downloadBtnText: '下载',
  BusinessTypeEnumText: () => FourStreamsMaterialFileBusinessTypeEnumText,
});
const list = defineModel<FourStreamsMaterialFileTableItem[]>('list');
const list = defineModel<BaseMaterialFileTableItem<T>[]>('list');
const columns = defineColumns([
  {
@@ -75,7 +85,7 @@
        name: '上传',
      },
      extraProps: {
        hide: (row: FourStreamsMaterialFileTableItem) => {
        hide: (row: BaseMaterialFileTableItem<T>) => {
          if (!props.showUploadBtn) return true;
          let fileList = row?.fileList?.filter?.((item) => item.status === 'success');
          return fileList?.length > 0;
@@ -91,7 +101,7 @@
        onClick: (row) => handlePreview(row),
      },
      extraProps: {
        hide: (row: FourStreamsMaterialFileTableItem) => {
        hide: (row: BaseMaterialFileTableItem<T>) => {
          if (!props.showCheckBtn) return true;
          let fileList = row?.fileList?.filter?.((item) => item.status === 'success');
          if (!fileList?.length) {
@@ -115,7 +125,7 @@
        onClick: (row) => handleBatchDownload(row),
      },
      extraProps: {
        hide: (row: FourStreamsMaterialFileTableItem) => {
        hide: (row: BaseMaterialFileTableItem<T>) => {
          return (
            !props.showDownloadBtn ||
            !row?.fileList?.filter?.((item) => item.status === 'success')?.length
@@ -135,7 +145,7 @@
        onClick: (row) => handleDelete(row),
      },
      extraProps: {
        hide: (row: FourStreamsMaterialFileTableItem) => {
        hide: (row: BaseMaterialFileTableItem<T>) => {
          if (!props.showDeleteBtn) return true;
          let fileList = row?.fileList?.filter?.((item) => item.status === 'success');
          return !fileList?.length;
@@ -145,18 +155,24 @@
  ],
});
async function handleDelete(row: FourStreamsMaterialFileTableItem) {
async function handleDelete(row: BaseMaterialFileTableItem<T>) {
  try {
    await Message.deleteMessage();
    row.fileList = [];
  } catch (error) {}
}
async function handlePreview(row: FourStreamsMaterialFileTableItem) {
const currentFourStreamsMaterialFileTableItem = ref<BaseMaterialFileTableItem<T>>({
  fileBusinessType: 0 as any,
  fileList: [],
});
const { dialogProps, dialogState } = useDialog();
async function handlePreview(row: BaseMaterialFileTableItem<T>) {
  if (row.fileList.length > 1) {
    // currentEnterpriseMaterialFileTableItem.value = row;
    // await nextTick();
    // dialogState.dialogVisible = true;
    currentFourStreamsMaterialFileTableItem.value = row;
    await nextTick();
    dialogState.dialogVisible = true;
  } else {
    bolePreview({
      fileUrl: row.fileList[0].url,
@@ -164,7 +180,7 @@
  }
}
function handleBatchDownload(row: FourStreamsMaterialFileTableItem) {
async function handleBatchDownload(row: BaseMaterialFileTableItem<T>) {
  const successFileList = row.fileList.filter((item) => item.status === 'success');
  if (successFileList.length === 0) {
    Message.errorMessage('没有可下载的文件');
@@ -175,8 +191,11 @@
  } else {
    // downloadWithZip(
    //   successFileList.map((item) => ({ data: item.url })),
    //   `${AllEnterpriseMaterialFileBusinessTypeEnumText[row.fileBusinessType]}材料文件`
    //   `${props.BusinessTypeEnumText[row.fileBusinessType as any]}`
    // );
    currentFourStreamsMaterialFileTableItem.value = row;
    await nextTick();
    dialogState.dialogVisible = true;
  }
}
</script>