From 2d45e281e59a5ba6881068ac7240e084feed7e04 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期三, 22 四月 2026 16:56:55 +0800
Subject: [PATCH] 军泰伟业 1.产品维护加一个备注字段 2.产品维护列表加一个图纸预览
---
src/views/basicData/product/index.vue | 178 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 177 insertions(+), 1 deletions(-)
diff --git a/src/views/basicData/product/index.vue b/src/views/basicData/product/index.vue
index e795e27..857ec8b 100644
--- a/src/views/basicData/product/index.vue
+++ b/src/views/basicData/product/index.vue
@@ -64,7 +64,46 @@
@selection-change="handleSelectionChange"
:tableLoading="tableLoading"
@pagination="pagination"
- ></PIMTable>
+ >
+ <template #drawingFiles="{ row }">
+ <div v-if="row.salesLedgerFiles && row.salesLedgerFiles.length" class="drawing-thumbs-list">
+ <div
+ v-for="(file, index) in row.salesLedgerFiles.slice(0, 3)"
+ :key="index"
+ class="drawing-thumb-item"
+ @click="handlePreviewFile(file)"
+ >
+ <img
+ v-if="isImageFile(file)"
+ :src="getDrawingFileUrl(file)"
+ class="drawing-thumb-img"
+ />
+ <div v-else class="drawing-thumb-placeholder">
+ {{ getDrawingFileExtension(file).toUpperCase() }}
+ </div>
+ </div>
+ <div v-if="row.salesLedgerFiles.length > 3" class="drawing-thumb-more">
+ +{{ row.salesLedgerFiles.length - 3 }}
+ </div>
+ </div>
+ <div v-else-if="row.drawingFile" class="drawing-thumbs-list">
+ <div
+ class="drawing-thumb-item"
+ @click="handlePreviewDrawing(row.drawingFile)"
+ >
+ <img
+ v-if="isDrawingImageFile(row.drawingFile)"
+ :src="row.drawingFile"
+ class="drawing-thumb-img"
+ />
+ <div v-else class="drawing-thumb-placeholder">
+ {{ getFileExtensionFromUrl(row.drawingFile).toUpperCase() }}
+ </div>
+ </div>
+ </div>
+ <span v-else>-</span>
+ </template>
+ </PIMTable>
</div>
<FormDialog
@@ -181,6 +220,16 @@
</div>
</div>
</el-form-item>
+ <el-form-item label="澶囨敞" prop="remark">
+ <el-input
+ v-model="modelForm.remark"
+ placeholder="璇疯緭鍏ュ娉�"
+ clearable
+ type="textarea"
+ :rows="3"
+ show-word-limit
+ />
+ </el-form-item>
</el-form>
</FormDialog>
@@ -237,6 +286,7 @@
downloadTemplate,
} from "@/api/basicData/product.js";
import { listPage as getProcessRouteList } from "@/api/productionManagement/processRoute.js";
+import { delLedgerFile } from "@/api/salesManagement/salesLedger.js";
import ImportExcel from "./ImportExcel/index.vue";
const { proxy } = getCurrentInstance();
@@ -308,6 +358,19 @@
return typeMap[String(v)] || "info";
},
},
+ {
+ label: "澶囨敞",
+ prop: "remark",
+ minWidth: 150,
+ showOverflowTooltip: true,
+ },
+ {
+ label: "鍥剧焊",
+ prop: "salesLedgerFiles",
+ minWidth: 200,
+ dataType: "slot",
+ slot: "drawingFiles",
+ },
{
label: "鍒涘缓鏃堕棿",
prop: "createTime",
@@ -346,6 +409,7 @@
drawingFile: "",
tempFileIds: [],
salesLedgerFiles: [],
+ remark: "",
},
modelRules: {
productName: [
@@ -367,6 +431,7 @@
productType: null,
routeId: null,
drawingFile: "",
+ remark: "",
tempFileIds: [],
salesLedgerFiles: [],
});
@@ -686,12 +751,40 @@
return ["jpg", "jpeg", "png", "gif", "bmp", "webp"].includes(getDrawingFileExtension(file));
};
+const isDrawingImageFile = (url) => {
+ if (!url) return false;
+ const ext = url.split("?")[0].split(".").pop()?.toLowerCase();
+ return ["jpg", "jpeg", "png", "gif", "bmp", "webp"].includes(ext);
+};
+
+const getFileExtensionFromUrl = (url) => {
+ if (!url) return "file";
+ const cleanUrl = url.split("?")[0];
+ const parts = cleanUrl.split(".");
+ return parts.length > 1 ? parts.pop().toLowerCase() : "file";
+};
+
const handleDrawingPreview = (file) => {
const fileUrl = getDrawingFileUrl(file);
if (!fileUrl) {
return;
}
filePreviewRef.value?.open(fileUrl);
+};
+
+const handlePreviewFile = (file) => {
+ const fileUrl = file.url || file.tempPath || "";
+ if (!fileUrl) {
+ return;
+ }
+ filePreviewRef.value?.open(fileUrl);
+};
+
+const handlePreviewDrawing = (drawingFile) => {
+ if (!drawingFile) {
+ return;
+ }
+ filePreviewRef.value?.open(drawingFile);
};
const handleDrawingRemove = (file) => {
@@ -806,6 +899,89 @@
object-fit: cover;
}
+.drawing-files-list {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 4px;
+ align-items: center;
+}
+
+.drawing-file-tag {
+ cursor: pointer;
+ max-width: 120px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.drawing-file-tag:hover {
+ color: #409eff;
+}
+
+.drawing-file-link {
+ color: #409eff;
+ cursor: pointer;
+ text-decoration: underline;
+}
+
+.drawing-file-link:hover {
+ color: #66b1ff;
+}
+
+.drawing-thumbs-list {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+ align-items: center;
+}
+
+.drawing-thumb-item {
+ width: 50px;
+ height: 50px;
+ border-radius: 4px;
+ overflow: hidden;
+ cursor: pointer;
+ border: 1px solid #dcdfe6;
+ transition: all 0.2s;
+}
+
+.drawing-thumb-item:hover {
+ border-color: #409eff;
+ box-shadow: 0 2px 8px rgba(64, 158, 255, 0.3);
+ transform: scale(1.05);
+}
+
+.drawing-thumb-img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+}
+
+.drawing-thumb-placeholder {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 12px;
+ font-weight: 600;
+ color: #606266;
+ background: #f5f7fa;
+}
+
+.drawing-thumb-more {
+ width: 50px;
+ height: 50px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 12px;
+ color: #909399;
+ background: #f5f7fa;
+ border-radius: 4px;
+ border: 1px dashed #dcdfe6;
+}
+
.drawing-preview-placeholder {
display: flex;
align-items: center;
--
Gitblit v1.9.3