zhangwencui
2026-04-30 54274cf2cb44da9b7eac1f324cee9ad653936aef
Merge branch 'dev_NEW_pro' of http://114.132.189.42:9002/r/product-inventory-management into dev_NEW_pro
已添加1个文件
已修改3个文件
744 ■■■■■ 文件已修改
jsconfig.json 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Dialog/FileList.vue 308 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/financialManagement/revenueManagement/index.vue 423 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jsconfig.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@/*": ["src/*"],
      "~/*": ["./*"]
    }
  },
  "include": ["src/**/*.js", "src/**/*.vue", "vite.config.js"]
}
src/components/Dialog/FileList.vue
@@ -13,13 +13,15 @@
      </el-button>
    </div>
    <!-- ä¸Šä¼ ç»„件弹窗 -->
    <el-dialog v-model="uploadDialogVisible"
               title="上传附件"
               width="50%"
               @close="handleUploadClose">
      <AttachmentUpload v-model:file-list="newFileList" />
    <el-dialog
        v-model="uploadDialogVisible"
        title="上传附件"
        width="50%"
        @close="closeUpload">
      <AttachmentUpload v-model:file-list="newFileList"/>
      <template #footer>
        <el-button @click="handleUploadClose">关闭</el-button>
        <el-button @click="saveUpload">保存</el-button>
        <el-button @click="closeUpload">关闭</el-button>
      </template>
    </el-dialog>
    <!-- æ–‡ä»¶åˆ—表表格 -->
@@ -30,7 +32,7 @@
                :height="tableData.length > 0 ? 'auto' : '120px'">
        <el-table-column label="附件名称"
                         prop="originalFilename"
                         show-overflow-tooltip />
                         show-overflow-tooltip/>
        <el-table-column v-if="showActions"
                         fixed="right"
                         label="操作"
@@ -40,8 +42,8 @@
            <el-button link
                       type="primary"
                       size="small"
                       :href="scope.row.downloadURL"
                       class="download-link">
                       class="download-link"
                       @click="downloadFile(scope.row.downloadURL)">
              ä¸‹è½½
            </el-button>
            <el-button link
@@ -58,173 +60,181 @@
</template>
<script setup>
  import { ref, computed, getCurrentInstance, onMounted, watch } from "vue";
  import AttachmentUpload from "@/components/AttachmentUpload/file/index.vue";
  import {
    attachmentList,
    deleteAttachment,
    createAttachment,
  } from "@/api/basicData/storageAttachment.js";
import {ref, computed, getCurrentInstance, onMounted, watch} from "vue";
import AttachmentUpload from "@/components/AttachmentUpload/file/index.vue";
import {
  attachmentList,
  deleteAttachment,
  createAttachment,
} from "@/api/basicData/storageAttachment.js";
  const props = defineProps({
    visible: {
      type: Boolean,
      required: true,
    },
    recordType: {
      type: String,
      default: "",
      required: true,
    },
    recordId: {
      type: Number,
      default: 0,
      required: true,
    },
    title: {
      type: String,
      default: "附件",
    },
    width: {
      type: String,
      default: "50%",
    },
    showActions: {
      type: Boolean,
      default: true,
    },
  });
const props = defineProps({
  visible: {
    type: Boolean,
    required: true,
  },
  recordType: {
    type: String,
    default: "",
    required: true,
  },
  recordId: {
    type: Number,
    default: 0,
    required: true,
  },
  title: {
    type: String,
    default: "附件",
  },
  width: {
    type: String,
    default: "50%",
  },
  showActions: {
    type: Boolean,
    default: true,
  },
});
  const emit = defineEmits(["close", "download", "upload", "delete"]);
const emit = defineEmits(["close", "download", "upload", "delete"]);
  const { proxy } = getCurrentInstance();
  const tableData = ref([]);
  const uploadDialogVisible = ref(false);
  const newFileList = ref([]);
const {proxy} = getCurrentInstance();
const tableData = ref([]);
const uploadDialogVisible = ref(false);
const newFileList = ref([]);
  const isShow = computed({
    get() {
      return props.visible;
    },
    set(val) {
      emit("update:visible", val);
    },
  });
const isShow = computed({
  get() {
    return props.visible;
  },
  set(val) {
    emit("update:visible", val);
  },
});
  const handleClose = () => {
    isShow.value = false;
  };
const handleClose = () => {
  isShow.value = false;
};
  const handleUpload = () => {
    uploadDialogVisible.value = true;
  };
const handleUpload = () => {
  uploadDialogVisible.value = true;
};
  const handleUploadClose = async () => {
    // æ£€æŸ¥æ˜¯å¦æœ‰æ–°ä¸Šä¼ çš„æ–‡ä»¶
    if (newFileList.value.length > 0) {
      try {
        await createAttachment({
          application: "file",
          recordType: props.recordType,
          recordId: props.recordId,
          storageBlobDTOs: [...newFileList.value, ...tableData.value],
        });
        newFileList.value = [];
        // åˆ·æ–°åˆ—表
        setList();
      } catch (error) {
        proxy?.$modal?.msgError("上传失败");
      }
    }
    uploadDialogVisible.value = false;
  };
  const handleDelete = async (row, index) => {
const saveUpload = async () => {
  // æ£€æŸ¥æ˜¯å¦æœ‰æ–°ä¸Šä¼ çš„æ–‡ä»¶
  if (newFileList.value.length > 0) {
    try {
      await deleteAttachment([row.storageAttachmentId]);
      proxy?.$modal?.msgSuccess("删除成功");
      await createAttachment({
        application: "file",
        recordType: props.recordType,
        recordId: props.recordId,
        storageBlobDTOs: [...newFileList.value, ...tableData.value],
      });
      newFileList.value = [];
      // åˆ·æ–°åˆ—表
      setList();
    } catch (error) {
      proxy?.$modal?.msgError("删除失败");
      proxy?.$modal?.msgError("上传失败");
    }
  };
  }
  uploadDialogVisible.value = false;
};
  const setList = () => {
    attachmentList({
      recordType: props.recordType,
      recordId: props.recordId,
    }).then(res => {
      if (res && res.data) {
        tableData.value = res.data || [];
      }
    });
  };
const closeUpload = () => {
  newFileList.value = [];
  uploadDialogVisible.value = false;
}
  onMounted(() => {
const handleDelete = async (row, index) => {
  try {
    await deleteAttachment([row.storageAttachmentId]);
    proxy?.$modal?.msgSuccess("删除成功");
    setList();
  } catch (error) {
    proxy?.$modal?.msgError("删除失败");
  }
};
const setList = () => {
  attachmentList({
    recordType: props.recordType,
    recordId: props.recordId,
  }).then(res => {
    if (res && res.data) {
      tableData.value = res.data || [];
    }
  });
};
const downloadFile = (url) => {
  window.open(url, "_blank");
};
onMounted(() => {
  setList();
});
</script>
<style scoped>
  .attachment-dialog {
    border-radius: 12px;
  }
.attachment-dialog {
  border-radius: 12px;
}
  .toolbar {
    margin-bottom: 16px;
    text-align: right;
  }
.toolbar {
  margin-bottom: 16px;
  text-align: right;
}
  .table-container {
    max-height: 40vh;
    overflow-y: auto;
    min-height: 120px;
    padding-bottom: 16px;
    box-sizing: border-box;
    will-change: scroll-position;
    transform: translateZ(0);
    -webkit-overflow-scrolling: touch;
  }
.table-container {
  max-height: 40vh;
  overflow-y: auto;
  min-height: 120px;
  padding-bottom: 16px;
  box-sizing: border-box;
  will-change: scroll-position;
  transform: translateZ(0);
  -webkit-overflow-scrolling: touch;
}
  :deep(.el-table) {
    margin-bottom: 0;
  }
:deep(.el-table) {
  margin-bottom: 0;
}
  :deep(.el-table__body-wrapper) {
    overflow-y: auto;
    will-change: transform;
    transform: translateZ(0);
  }
:deep(.el-table__body-wrapper) {
  overflow-y: auto;
  will-change: transform;
  transform: translateZ(0);
}
  :deep(.el-table__body tr) {
    transition: none;
  }
:deep(.el-table__body tr) {
  transition: none;
}
  :deep(.el-dialog__footer) {
    padding-top: 12px;
    border-top: 1px solid #e9ecef;
  }
:deep(.el-dialog__footer) {
  padding-top: 12px;
  border-top: 1px solid #e9ecef;
}
  .attachment-table {
    border-radius: 8px;
  }
.attachment-table {
  border-radius: 8px;
}
  :deep(.el-dialog__header) {
    background-color: #f8f9fa;
    border-bottom: 1px solid #e9ecef;
    padding: 16px 20px;
  }
:deep(.el-dialog__header) {
  background-color: #f8f9fa;
  border-bottom: 1px solid #e9ecef;
  padding: 16px 20px;
}
  :deep(.el-dialog__title) {
    font-size: 16px;
    font-weight: 600;
  }
:deep(.el-dialog__title) {
  font-size: 16px;
  font-weight: 600;
}
  :deep(.el-dialog__body) {
    padding: 16px 20px;
  }
:deep(.el-dialog__body) {
  padding: 16px 20px;
}
  :deep(.el-table__empty-text) {
    color: #999;
  }
:deep(.el-table__empty-text) {
  color: #999;
}
</style>
src/main.js
@@ -48,6 +48,8 @@
import ImageUpload from "@/components/AttachmentUpload/image";
// å›¾ç‰‡é¢„览组件
import ImagePreview from "@/components/AttachmentPreview/image";
// é™„件弹窗组件
import FileListDialog from "@/components/Dialog/FileList.vue";
// å­—典标签组件
import DictTag from "@/components/DictTag";
// è¡¨æ ¼ç»„ä»¶
@@ -92,6 +94,7 @@
app.component("FileUpload", FileUpload);
app.component("ImageUpload", ImageUpload);
app.component("ImagePreview", ImagePreview);
app.component("FileListDialog", FileListDialog);
app.component("RightToolbar", RightToolbar);
app.component("Editor", Editor);
app.component("PIMTable", PIMTable);
src/views/financialManagement/revenueManagement/index.vue
@@ -3,22 +3,22 @@
    <el-form :model="filters" :inline="true">
      <el-form-item label="收入日期:">
        <el-date-picker v-model="filters.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
                        placeholder="请选择" clearable @change="changeDaterange" />
                        placeholder="请选择" clearable @change="changeDaterange"/>
      </el-form-item>
      <el-form-item label="收款方式:">
        <el-select
                v-model="filters.incomeMethodLabel"
                placeholder="请选择"
                clearable
                style="width: 200px;"
              >
                <el-option
                  v-for="item in incomeMethodOptions"
                  :key="item.value"
                  :label="item.label"
                  :value="item.value"
                />
              </el-select>
            v-model="filters.incomeMethodLabel"
            placeholder="请选择"
            clearable
            style="width: 200px;"
        >
          <el-option
              v-for="item in incomeMethodOptions"
              :key="item.value"
              :label="item.label"
              :value="item.value"
          />
        </el-select>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="getTableData">搜索</el-button>
@@ -29,32 +29,32 @@
      <div class="actions">
        <div></div>
        <div>
          <el-button type="primary" @click="add" icon="Plus"> æ–°å¢ž </el-button>
          <el-button type="primary" @click="add" icon="Plus"> æ–°å¢ž</el-button>
          <el-button @click="handleOut" icon="download">导出</el-button>
          <el-button
            type="danger"
            icon="Delete"
            :disabled="multipleList.length <= 0 || hasBusinessIdInSelection"
            @click="handleBatchDelete"
              type="danger"
              icon="Delete"
              :disabled="multipleList.length <= 0 || hasBusinessIdInSelection"
              @click="handleBatchDelete"
          >
            æ‰¹é‡åˆ é™¤
          </el-button>
        </div>
      </div>
      <PIMTable
        rowKey="id"
        isSelection
        :column="columns"
        :tableData="dataList"
        :page="{
          rowKey="id"
          isSelection
          :column="columns"
          :tableData="dataList"
          :page="{
          current: pagination.currentPage,
          size: pagination.pageSize,
          total: pagination.total,
        }"
        :isShowSummary="true"
        :summaryMethod="summarizeMainTable"
        @selection-change="handleSelectionChange"
        @pagination="changePage"
          :isShowSummary="true"
          :summaryMethod="summarizeMainTable"
          @selection-change="handleSelectionChange"
          @pagination="changePage"
      >
        <template #incomeMethodSlot="{ row }">
          <el-tag>
@@ -62,18 +62,18 @@
          </el-tag>
        </template>
        <template #operation="{ row }">
          <el-button
            type="primary"
            link
            :disabled="!!row.businessId"
            @click="edit(row.id)"
          <el-button
              type="primary"
              link
              :disabled="!!row.businessId"
              @click="edit(row.id)"
          >
            ç¼–辑
          </el-button>
          <el-button
            type="primary"
                        link
            @click="openFilesFormDia(row)"
              type="primary"
              link
              @click="openFilesFormDia(row)"
          >
            é™„ä»¶
          </el-button>
@@ -81,28 +81,16 @@
      </PIMTable>
    </div>
    <Modal ref="modalRef" @success="getTableData"></Modal>
    <!--  todo é™„件预览相关 -->
    <FileListDialog
      ref="fileListRef"
      v-model="fileListDialogVisible"
      :show-upload-button="true"
      :show-delete-button="true"
      :upload-method="handleUpload"
      :delete-method="handleFileDelete"
    />
    <FileListDialog v-if="fileListDialogVisible" :record-id="currentRecordId" record-type="account_income" v-model:visible="fileListDialogVisible"/>
  </div>
</template>
<script setup>
import { usePaginationApi } from "@/hooks/usePaginationApi";
import { listPage, delAccountIncome, fileListPage, fileAdd, fileDel } from "@/api/financialManagement/revenueManagement";
import { onMounted, getCurrentInstance, ref, computed } from "vue";
import Modal from "./Modal.vue";
import { ElMessageBox, ElMessage } from "element-plus";
import {usePaginationApi} from "@/hooks/usePaginationApi";
import {listPage, delAccountIncome} from "@/api/financialManagement/revenueManagement";
import {onMounted, getCurrentInstance, ref, computed} from "vue";
import {ElMessageBox, ElMessage} from "element-plus";
import dayjs from "dayjs";
import FileListDialog from "@/components/Dialog/FileListDialog.vue";
import request from "@/utils/request";
import { getToken } from "@/utils/auth";
defineOptions({
  name: "收入管理",
@@ -110,15 +98,14 @@
// è¡¨æ ¼å¤šé€‰æ¡†é€‰ä¸­é¡¹
const multipleList = ref([]);
const { proxy } = getCurrentInstance();
const {proxy} = getCurrentInstance();
const modalRef = ref();
const { payment_methods } = proxy.useDict("payment_methods");
const { receipt_payment_type } = proxy.useDict("receipt_payment_type");
const { income_types } = proxy.useDict("income_types");
const {payment_methods} = proxy.useDict("payment_methods");
const {receipt_payment_type} = proxy.useDict("receipt_payment_type");
const {income_types} = proxy.useDict("income_types");
const fileListRef = ref(null);
const fileListDialogVisible = ref(false);
const currentFileRow = ref(null);
const accountType = ref('收入');
const currentRecordId = ref(0);
const incomeMethodOptions = computed(() => {
  const merged = [...(payment_methods.value || []), ...(receipt_payment_type.value || [])];
@@ -127,7 +114,7 @@
    const label = item?.label;
    if (!label) return;
    if (!uniqueMap.has(label)) {
      uniqueMap.set(label, { label, value: label });
      uniqueMap.set(label, {label, value: label});
    }
  });
  return Array.from(uniqueMap.values());
@@ -142,86 +129,86 @@
  resetFilters,
  onCurrentChange,
} = usePaginationApi(
  listPage,
  {
    incomeMethodLabel: undefined,
    entryDate: undefined,
  },
  [
    listPage,
    {
      label: "收入日期",
      prop: "incomeDate",
      incomeMethodLabel: undefined,
      entryDate: undefined,
    },
    {
      label: "收入类型",
      prop: "incomeType",
      dataType: "tag",
      formatData: (params) => {
        if (income_types.value.find((m) => m.value == params)) {
          return income_types.value.find((m) => m.value == params).label;
        } else {
          return null
        }
    [
      {
        label: "收入日期",
        prop: "incomeDate",
      },
    },
    {
      label: "客户名称",
      prop: "customerName",
            width: '200'
      {
        label: "收入类型",
        prop: "incomeType",
        dataType: "tag",
        formatData: (params) => {
          if (income_types.value.find((m) => m.value == params)) {
            return income_types.value.find((m) => m.value == params).label;
          } else {
            return null
          }
        },
      },
      {
        label: "客户名称",
        prop: "customerName",
        width: '200'
    },
    {
      label: "收入金额",
      prop: "incomeMoney",
      },
      {
        label: "收入金额",
        prop: "incomeMoney",
    },
    {
      label: "收入描述",
      prop: "incomeDescribed",
      },
      {
        label: "收入描述",
        prop: "incomeDescribed",
    },
    {
      label: "收款方式",
      prop: "incomeMethodLabel",
            align: 'center',
            width: '100',
      dataType: "slot",
      slot: "incomeMethodSlot",
    },
    {
      label: "发票号码",
      prop: "invoiceNumber",
      },
      {
        label: "收款方式",
        prop: "incomeMethodLabel",
        align: 'center',
        width: '100',
        dataType: "slot",
        slot: "incomeMethodSlot",
      },
      {
        label: "发票号码",
        prop: "invoiceNumber",
    },
    {
      label: "备注",
      prop: "note",
      },
      {
        label: "备注",
        prop: "note",
    },
    {
      label: "录入人",
      prop: "inputUser",
    },
    {
      label: "录入日期",
      prop: "inputTime",
      },
      {
        label: "录入人",
        prop: "inputUser",
      },
      {
        label: "录入日期",
        prop: "inputTime",
    },
      },
      {
        fixed: "right",
        label: "操作",
        dataType: "slot",
        slot: "operation",
        align: "center",
        width: "160px",
      },
    ],
    undefined,
    {
      fixed: "right",
      label: "操作",
      dataType: "slot",
      slot: "operation",
      align: "center",
      width: "160px",
    },
  ],
  undefined,
  {
    incomeMethodLabel: (value) => ({
      incomeMethodLabel: value || undefined,
    }),
  }
      incomeMethodLabel: (value) => ({
        incomeMethodLabel: value || undefined,
      }),
    }
);
// è¡¨æ ¼åˆè®¡ï¼šæ”¶å…¥é‡‘额
@@ -232,8 +219,8 @@
const getIncomeMethodLabel = (row) => {
  const methodValue = row?.incomeMethod;
  const dictList = String(row?.businessType) === "1"
    ? receipt_payment_type.value
    : payment_methods.value;
      ? receipt_payment_type.value
      : payment_methods.value;
  return dictList.find((item) => item.value == methodValue)?.label || "--";
};
@@ -259,9 +246,9 @@
  }
  modalRef.value.loadForm(id);
};
const changePage = ({ page, limit }) => {
const changePage = ({page, limit}) => {
  pagination.currentPage = page;
    pagination.pageSize = limit;
  pagination.pageSize = limit;
  onCurrentChange(page);
};
const deleteRow = (id) => {
@@ -283,13 +270,13 @@
      return;
    }
  }
  ElMessageBox.confirm("此操作将永久删除该数据, æ˜¯å¦ç»§ç»­?", "提示", {
    confirmButtonText: "确定",
    cancelButtonText: "取消",
    type: "warning",
  }).then(async () => {
    const { code } = await delAccountIncome(id);
    const {code} = await delAccountIncome(id);
    if (code == 200) {
      ElMessage({
        type: "success",
@@ -306,13 +293,13 @@
    proxy.$modal.msgWarning("请选择要删除的数据");
    return;
  }
  // æ£€æŸ¥æ˜¯å¦æœ‰ businessId
  if (hasBusinessIdInSelection.value) {
    proxy.$modal.msgWarning("选中的记录中包含已关联业务的记录,不能删除");
    return;
  }
  const ids = multipleList.value.map((item) => item.id);
  deleteRow(ids);
};
@@ -336,162 +323,17 @@
    cancelButtonText: "取消",
    type: "warning",
  })
    .then(() => {
      proxy.download(`/account/accountIncome/export`, {}, "收入台账.xlsx");
    })
    .catch(() => {
      proxy.$modal.msg("已取消");
    });
      .then(() => {
        proxy.download(`/account/accountIncome/export`, {}, "收入台账.xlsx");
      })
      .catch(() => {
        proxy.$modal.msg("已取消");
      });
};
// æ‰“开附件弹框
const openFilesFormDia = async (row) => {
  currentFileRow.value = row;
  accountType.value = '收入';
  try {
    const res = await fileListPage({
      accountId: row.id,
      accountType: accountType.value,
      current: 1,
      size: 100
    });
    if (res.code === 200 && fileListRef.value) {
      // å°†æ•°æ®è½¬æ¢ä¸º FileListDialog éœ€è¦çš„æ ¼å¼
      const fileList = (res.data?.records || []).map(item => ({
        name: item.name,
        url: item.url,
        id: item.id,
        ...item
      }));
      fileListRef.value.open(fileList);
      fileListDialogVisible.value = true;
    }
  } catch (error) {
    proxy.$modal.msgError("获取附件列表失败");
  }
};
// ä¸Šä¼ é™„ä»¶
const handleUpload = async () => {
  if (!currentFileRow.value) {
    proxy.$modal.msgWarning("请先选择数据");
    return null;
  }
  return new Promise((resolve) => {
    // åˆ›å»ºä¸€ä¸ªéšè—çš„æ–‡ä»¶è¾“入元素
    const input = document.createElement('input');
    input.type = 'file';
    input.style.display = 'none';
    input.onchange = async (e) => {
      const file = e.target.files[0];
      if (!file) {
        resolve(null);
        return;
      }
      try {
        // ä½¿ç”¨ FormData ä¸Šä¼ æ–‡ä»¶
        const formData = new FormData();
        formData.append('file', file);
        const uploadRes = await request({
          url: '/file/upload',
          method: 'post',
          data: formData,
          headers: {
            'Content-Type': 'multipart/form-data',
            Authorization: `Bearer ${getToken()}`
          }
        });
        if (uploadRes.code === 200) {
          // ä¿å­˜é™„件信息
          const fileData = {
            accountId: currentFileRow.value.id,
            accountType: accountType.value,
            name: uploadRes.data.originalName || file.name,
            url: uploadRes.data.tempPath || uploadRes.data.url
          };
          const saveRes = await fileAdd(fileData);
          if (saveRes.code === 200) {
            proxy.$modal.msgSuccess("文件上传成功");
            // é‡æ–°åŠ è½½æ–‡ä»¶åˆ—è¡¨
            const listRes = await fileListPage({
              accountId: currentFileRow.value.id,
              accountType: accountType.value,
              current: 1,
              size: 100
            });
            if (listRes.code === 200 && fileListRef.value) {
              const fileList = (listRes.data?.records || []).map(item => ({
                name: item.name,
                url: item.url,
                id: item.id,
                ...item
              }));
              fileListRef.value.setList(fileList);
            }
            // è¿”回新文件信息
            resolve({
              name: fileData.name,
              url: fileData.url,
              id: saveRes.data?.id
            });
          } else {
            proxy.$modal.msgError(saveRes.msg || "文件保存失败");
            resolve(null);
          }
        } else {
          proxy.$modal.msgError(uploadRes.msg || "文件上传失败");
          resolve(null);
        }
      } catch (error) {
        proxy.$modal.msgError("文件上传失败");
        resolve(null);
      } finally {
        document.body.removeChild(input);
      }
    };
    document.body.appendChild(input);
    input.click();
  });
};
// åˆ é™¤é™„ä»¶
const handleFileDelete = async (row) => {
  try {
    const res = await fileDel([row.id]);
    if (res.code === 200) {
      proxy.$modal.msgSuccess("删除成功");
      // é‡æ–°åŠ è½½æ–‡ä»¶åˆ—è¡¨
      if (currentFileRow.value && fileListRef.value) {
        const listRes = await fileListPage({
          accountId: currentFileRow.value.id,
          accountType: accountType.value,
          current: 1,
          size: 100
        });
        if (listRes.code === 200) {
          const fileList = (listRes.data?.records || []).map(item => ({
            name: item.name,
            url: item.url,
            id: item.id,
            ...item
          }));
          fileListRef.value.setList(fileList);
        }
      }
      return true; // è¿”回 true è¡¨ç¤ºåˆ é™¤æˆåŠŸï¼Œç»„ä»¶ä¼šæ›´æ–°åˆ—è¡¨
    } else {
      proxy.$modal.msgError(res.msg || "删除失败");
      return false;
    }
  } catch (error) {
    proxy.$modal.msgError("删除失败");
    return false;
  }
  currentRecordId.value = row.id;
  fileListDialogVisible.value = true;
};
onMounted(() => {
@@ -503,6 +345,7 @@
.table_list {
  margin-top: unset;
}
.actions {
  display: flex;
  justify-content: space-between;