From a52ebf49d0a304697ec7af4f4c3e6b6e13f269e7 Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期三, 15 七月 2026 15:28:40 +0800
Subject: [PATCH] 修改生产核算,不合格管理,报表管理
---
src/views/productionManagement/workOrder/components/filesDia.vue | 66 ++++++++++++++++++++++++++++++++-
1 files changed, 64 insertions(+), 2 deletions(-)
diff --git a/src/views/productionManagement/workOrder/components/filesDia.vue b/src/views/productionManagement/workOrder/components/filesDia.vue
index 1336861..80e9fe6 100644
--- a/src/views/productionManagement/workOrder/components/filesDia.vue
+++ b/src/views/productionManagement/workOrder/components/filesDia.vue
@@ -5,7 +5,7 @@
<el-upload
v-model:file-list="fileList"
class="upload-demo"
- :action="uploadUrl"
+ :http-request="uploadFile"
:on-success="handleUploadSuccess"
:on-error="handleUploadError"
:before-upload="beforeUpload"
@@ -46,6 +46,7 @@
<script setup>
import { ref, reactive, getCurrentInstance } from "vue";
import { ElMessageBox } from "element-plus";
+import axios from "axios";
import { getToken } from "@/utils/auth.js";
import PIMTable from "@/components/PIMTable/PIMTable.vue";
import filePreview from "@/components/filePreview/index.vue";
@@ -104,6 +105,7 @@
Authorization: "Bearer " + getToken(),
});
const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/file/upload");
+const currentWorkOrderNo = ref("");
const beforeUpload = file => {
const isImage = file?.type?.startsWith("image/");
@@ -116,6 +118,7 @@
const openDialog = row => {
dialogVisible.value = true;
currentWorkOrderId.value = row.id;
+ currentWorkOrderNo.value = row.workOrderNo || row.work_order_no || "";
page.current = 1;
getList();
};
@@ -171,6 +174,66 @@
proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
}
+const createWatermarkImage = async file => {
+ const sourceImage = await loadImage(URL.createObjectURL(file));
+ const canvas = document.createElement("canvas");
+ const width = sourceImage.naturalWidth || sourceImage.width;
+ const height = sourceImage.naturalHeight || sourceImage.height;
+ canvas.width = width;
+ canvas.height = height;
+ const ctx = canvas.getContext("2d");
+ ctx.drawImage(sourceImage, 0, 0, width, height);
+
+ const watermarkText = [
+ "澶╂触甯傜幃鑻撲箰鍣ㄦ湁闄愬叕鍙�",
+ `${new Date().toLocaleString()}`,
+ ];
+
+ ctx.save();
+ ctx.globalAlpha = 0.28;
+ ctx.fillStyle = "#ffffff";
+ ctx.font = `bold ${Math.max(18, Math.floor(width / 28))}px Arial`;
+ ctx.textAlign = "right";
+ ctx.textBaseline = "bottom";
+ const padding = Math.max(24, Math.floor(width / 40));
+ const lineHeight = Math.max(24, Math.floor(width / 20));
+ const x = width - padding;
+ const y = height - padding;
+ watermarkText.reverse().forEach((text, index) => {
+ ctx.fillText(text, x, y - index * lineHeight);
+ });
+ ctx.restore();
+
+ const blob = await new Promise(resolve => canvas.toBlob(resolve, file.type || "image/jpeg", 0.92));
+ return new File([blob], file.name, { type: file.type || "image/jpeg" });
+};
+
+const loadImage = src =>
+ new Promise((resolve, reject) => {
+ const image = new Image();
+ image.crossOrigin = "anonymous";
+ image.onload = () => resolve(image);
+ image.onerror = reject;
+ image.src = src;
+ });
+
+const uploadFile = async options => {
+ try {
+ const watermarkedFile = await createWatermarkImage(options.file);
+ const formData = new FormData();
+ formData.append("file", watermarkedFile);
+ const response = await axios.post(uploadUrl.value, formData, {
+ headers: {
+ "Content-Type": "multipart/form-data",
+ Authorization: "Bearer " + getToken(),
+ },
+ });
+ options.onSuccess(response.data);
+ } catch (error) {
+ options.onError(error);
+ }
+};
+
const handleDelete = () => {
if (selectedRows.value.length === 0) {
proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
@@ -199,4 +262,3 @@
</script>
<style scoped></style>
-
--
Gitblit v1.9.3