From 676e73b8780c6cb49596865de81e6d806544ef10 Mon Sep 17 00:00:00 2001
From: 张诺 <zhang_12370@163.com>
Date: 星期四, 09 四月 2026 13:29:28 +0800
Subject: [PATCH] fix: 阳光印刷:添加附件功能,新增时可以上传附件、审核时要求可以预览附件.公司电话为必填项,改为选填 fix:调整供应商管理表单验证及优化知识库文件处理 - 将供应商管理中的公司电话字段改为非必填 - 移除销售报价中未使用的 delLedgerFile 导入 - 优化知识库文件上传组件,添加文件操作按钮和预览功能 - 修复知识库编辑时文件列表显示异常问题 - 统一文件下载和预览的处理逻辑
---
src/views/salesManagement/salesQuotation/index.vue | 2
src/views/collaborativeApproval/knowledgeBase/index.vue | 78 +++++++++++++++++++++++++++++++++++---
src/views/basicData/supplierManage/components/HomeTab.vue | 2
3 files changed, 73 insertions(+), 9 deletions(-)
diff --git a/src/views/basicData/supplierManage/components/HomeTab.vue b/src/views/basicData/supplierManage/components/HomeTab.vue
index 85c3265..f3b3ef7 100644
--- a/src/views/basicData/supplierManage/components/HomeTab.vue
+++ b/src/views/basicData/supplierManage/components/HomeTab.vue
@@ -376,7 +376,7 @@
{ required: true, message: "璇疯緭鍏�", trigger: "blur" },
],
companyAddress: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- companyPhone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+ companyPhone: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
bankAccountName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
bankAccountNum: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
contactUserName: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
diff --git a/src/views/collaborativeApproval/knowledgeBase/index.vue b/src/views/collaborativeApproval/knowledgeBase/index.vue
index 7f970d6..ff8da1b 100644
--- a/src/views/collaborativeApproval/knowledgeBase/index.vue
+++ b/src/views/collaborativeApproval/knowledgeBase/index.vue
@@ -149,6 +149,18 @@
:show-file-list="true"
>
<el-button type="primary">涓婁紶</el-button>
+ <template #file="{ file }">
+ <div style="display:flex; align-items:center; gap: 10px; width: 100%;">
+ <span style="flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;">
+ {{ file.name }}
+ </span>
+ <div style="display:flex; align-items:center; gap: 6px;">
+ <el-button link type="success" :icon="Download" @click="handleDownload(file)" />
+ <el-button link type="primary" :icon="View" @click="handlePreview(file)" />
+ <el-button link type="danger" :icon="Delete" @click="triggerRemoveFile(file)" />
+ </div>
+ </div>
+ </template>
<template #tip>
<div class="el-upload__tip">
鏀寔鏂囨。锛坉oc, docx, xls, xlsx, pdf, txt锛夊拰鍥剧墖锛坖pg, jpeg, png, gif锛夋牸寮�
@@ -259,15 +271,17 @@
</div>
</div>
</FormDialog>
+ <filePreview ref="filePreviewRef" />
</div>
</template>
<script setup>
-import { Search } from "@element-plus/icons-vue";
+import { Search, Download, View, Delete } from "@element-plus/icons-vue";
import { onMounted, ref, reactive, toRefs, getCurrentInstance, computed, watch } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";
import PIMTable from "@/components/PIMTable/PIMTable.vue";
import FormDialog from '@/components/Dialog/FormDialog.vue';
+import filePreview from '@/components/filePreview/index.vue'
import { listKnowledgeBase, delKnowledgeBase,addKnowledgeBase,updateKnowledgeBase, delKnowledgeBaseFile } from "@/api/collaborativeApproval/knowledgeBase.js";
import useUserStore from '@/store/modules/user';
import { userListNoPageByTenantId } from '@/api/system/user.js';
@@ -347,9 +361,30 @@
// 琛ㄥ崟寮曠敤
const formRef = ref();
+const fileUpload = ref()
+const filePreviewRef = ref()
// 鐢ㄦ埛鐩稿叧
const userStore = useUserStore();
const userList = ref([]);
+
+const normalizeKnowledgeFiles = (files = []) => {
+ const list = Array.isArray(files) ? files : []
+ return list.map((f, index) => {
+ const name = f?.name || f?.originalName || f?.fileName || ''
+ const url = f?.url || f?.path || ''
+ return {
+ ...f,
+ name,
+ url,
+ uid: f?.uid || f?.id || `${Date.now()}_${index}`,
+ status: f?.status || 'success',
+ }
+ })
+}
+
+const getUploadFileUrl = (file) => {
+ return file?.url || file?.response?.data?.tempPath || file?.response?.data?.url
+}
// 琛ㄦ牸鍒楅厤缃�
const tableColumn = ref([
@@ -522,7 +557,9 @@
});
} else if (type === "edit" && row) {
dialogTitle.value = "缂栬緫鐭ヨ瘑";
- fileList.value = row.files || [];
+ const existingFiles = row.files || row.commonFileList || [];
+ const normalizedFiles = normalizeKnowledgeFiles(existingFiles);
+ fileList.value = normalizedFiles;
Object.assign(form.value, {
id: row.id,
title: row.title,
@@ -534,7 +571,13 @@
keyPoints: row.keyPoints,
creator: row.creator,
usageCount: row.usageCount,
- files: row.files || [],
+ files: normalizedFiles.map(f => ({
+ id: f.id,
+ tempId: f.tempId,
+ name: f.name,
+ url: f.url,
+ uid: f.uid
+ })),
});
}
@@ -676,11 +719,19 @@
if (!form.value.files) {
form.value.files = [];
}
- form.value.files.push({url:res.data.tempPath,name:res.data.originalName});
+ file.tempId = res?.data?.tempId
+ file.url = res?.data?.tempPath || res?.data?.url
+ file.name = res?.data?.originalName || file?.name
+ form.value.files.push({
+ tempId: file.tempId,
+ url: file.url,
+ name: file.name,
+ uid: file.uid,
+ });
proxy.$modal.msgSuccess("涓婁紶鎴愬姛");
} else {
proxy.$modal.msgError(res.msg);
- proxy.$refs.fileUpload.handleRemove(file);
+ fileUpload.value?.handleRemove?.(file) || proxy.$refs.fileUpload?.handleRemove?.(file);
}
}
// 绉婚櫎鏂囦欢
@@ -715,9 +766,22 @@
}
// 鏂囦欢棰勮/涓嬭浇
+const handleDownload = (file) => {
+ const url = getUploadFileUrl(file)
+ if (!url) return
+ proxy?.$modal?.loading?.("姝e湪涓嬭浇鏂囦欢锛岃绋嶅��...")
+ proxy.$download.name(url);
+ proxy?.$modal?.closeLoading?.()
+}
+
function handlePreview(file) {
- // 鍒涘缓涓�涓殣钘忕殑a鏍囩鏉ヨЕ鍙戜笅杞�
- proxy.$download.name(file.url);
+ const url = getUploadFileUrl(file)
+ if (!url) return
+ filePreviewRef.value?.open?.(url)
+}
+
+function triggerRemoveFile(file) {
+ fileUpload.value?.handleRemove?.(file) || proxy.$refs.fileUpload?.handleRemove?.(file);
}
// 鎻愪氦鐭ヨ瘑琛ㄥ崟
diff --git a/src/views/salesManagement/salesQuotation/index.vue b/src/views/salesManagement/salesQuotation/index.vue
index 82a2cdb..ae87a9f 100644
--- a/src/views/salesManagement/salesQuotation/index.vue
+++ b/src/views/salesManagement/salesQuotation/index.vue
@@ -409,7 +409,7 @@
import FormDialog from '@/components/Dialog/FormDialog.vue'
import {getQuotationList,addQuotation,updateQuotation,deleteQuotation,deleteFile} from '@/api/salesManagement/salesQuotation.js'
import {userListNoPage} from "@/api/system/user.js";
-import { customerList, delLedgerFile } from "@/api/salesManagement/salesLedger.js";
+import { customerList } from "@/api/salesManagement/salesLedger.js";
import {modelList, productTreeList} from "@/api/basicData/product.js";
import { getToken } from "@/utils/auth";
import filePreview from "@/components/filePreview/index.vue";
--
Gitblit v1.9.3