From 4a212603b9f5b5328d34396e63e644bdab4d18df Mon Sep 17 00:00:00 2001
From: 马宇豪 <978517621@qq.com>
Date: 星期四, 20 三月 2025 14:38:06 +0800
Subject: [PATCH] 修改签名归档

---
 src/views/signProject/components/signFile.vue |  105 +++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 83 insertions(+), 22 deletions(-)

diff --git a/src/views/signProject/components/signFile.vue b/src/views/signProject/components/signFile.vue
index 315fa71..8ce903b 100644
--- a/src/views/signProject/components/signFile.vue
+++ b/src/views/signProject/components/signFile.vue
@@ -1,8 +1,8 @@
 <template>
-  <div>
+  <div v-loading="pdfLoading">
     <el-dialog
         v-model="dialogVisible"
-        width="80%"
+        width="50%"
         title="签名归档"
         :before-close="handleClose"
         :close-on-press-escape="false"
@@ -12,9 +12,8 @@
     <!-- 背景文件切换按钮 -->
     <div class="top">
       <div class="top-left">
-        <div>签名列表</div>
+        <h3>签名列表</h3>
         <img
-            style="width: 100px; height: auto"
             v-for="(image, index) in signatureImages"
             :src="image"
             :key="index"
@@ -22,23 +21,26 @@
         />
       </div>
       <div v-if="pageNum>1">
+        <span style="margin-right: 15px">{{currentBackgroundIndex + 1}}/{{pageNum}}</span>
         <el-button icon="arrow-left" @click="prevBackground">上一页</el-button>
         <el-button icon="arrow-right" @click="nextBackground">上一页</el-button>
+      </div>
+    </div>
+
+    <!-- 已放置的签名 -->
+    <div class="bottom" v-if="placedSignaturesByBackground[currentBackgroundIndex] && placedSignaturesByBackground[currentBackgroundIndex].length>0">
+      <h3>已放签名:</h3>
+      <div v-for="(sig, index) in placedSignaturesByBackground[currentBackgroundIndex]" :key="index" class="controlBtns">
+        <el-tag size="large" type="primary">签名{{index + 1}}</el-tag>
+        <el-button type="primary" @click="rotateSignature(index)" :icon="RefreshRight" circle/>
+        <el-button type="danger" @click="removeSignature(index)" :icon="Delete" circle/>
       </div>
     </div>
     <!-- 画布 -->
     <canvas ref="canvasRef" v-if="dialogVisible"></canvas>
 
-    <!-- 已放置的签名 -->
-    <div class="bottom">
-      <h3>已放置的签名:</h3>
-      <div v-for="(sig, index) in placedSignaturesByBackground[currentBackgroundIndex]" :key="index" style="margin-right: 10px">
-        <el-button type="danger" @click="removeSignature(index)">删除签名 {{ index + 1 }}</el-button>
-      </div>
-    </div>
-
     <!-- 导出PDF按钮 -->
-    <el-button type="primary" @click="saveAsPDF">确认归档</el-button>
+    <el-button type="primary" @click="saveAsPDF" style="margin-top: 20px">确认归档</el-button>
     </el-dialog>
   </div>
 </template>
@@ -48,6 +50,7 @@
 import {signArchive} from "@/api/signAgreement/signProject";
 import { jsPDF } from "jspdf"; // 导入 jsPDF
 import {ElMessage, ElMessageBox} from "element-plus";
+import {RefreshRight,Delete} from '@element-plus/icons-vue'
 import * as pdfjsLib from "pdfjs-dist";
 import {getToken} from "@/utils/auth";
 import axios from 'axios';
@@ -57,6 +60,7 @@
     import.meta.url
 ).href;
 const dialogVisible = ref(false)
+const pdfLoading = ref(false)
 const emit = defineEmits(["getList"]);
 // 画布引用
 const canvasRef = ref();
@@ -89,19 +93,21 @@
 })
 
 const openDialog= async (val)=>{
-  console.log(JSON.parse(Cookies.get('userInfo')).userId,'serr')
   dialogVisible.value = true
-  signatureImages.value = val.signatureFlows?.map(i=>i.signFile)
+  signatureImages.value = val.signatureFlows?.map(i=>import.meta.env.VITE_APP_BASE_API + i.signFile)
   pdfFileUrl.value = import.meta.env.VITE_APP_BASE_API + val.tempFile
   form.itemId = val.id
   form.userId = JSON.parse(Cookies.get('userInfo')).userId
+  pdfLoading.value = true
   await nextTick()
+  pdfLoading.value = true
   const canvas = canvasRef.value;
   if (canvas) {
     ctx = canvas.getContext("2d");
     // 替换为实际的 PDF 文件地址
+    console.log("pdfLoading before loadPDF:", pdfLoading.value);
     await loadPDF(pdfFileUrl.value);
-
+    console.log("pdfLoading after loadPDF:", pdfLoading.value);
     // 监听鼠标事件
     canvas.addEventListener("mousedown", (e) => {
       const mouseX = e.offsetX;
@@ -234,6 +240,7 @@
           placedSignaturesByBackground.value.push([]); // 为每一页初始化签名图列表
           resolve();
         };
+        pdfLoading.value = false
       });
     }
 
@@ -283,6 +290,7 @@
       y: 100,
       width: selectedImage.width, // 初始宽度为图片的原始宽度
       height: selectedImage.height, // 初始高度为图片的原始高度
+      rotation: 0 // 初始旋转角度为 0
     });
     redrawCanvas();
   };
@@ -296,6 +304,15 @@
 const removeSignature = (index) => {
   placedSignaturesByBackground.value[currentBackgroundIndex.value].splice(index, 1);
   redrawCanvas();
+};
+
+// 旋转签名图
+const rotateSignature = (index) => {
+  const currentSignatures = placedSignaturesByBackground.value[currentBackgroundIndex.value];
+  if (currentSignatures[index]) {
+    currentSignatures[index].rotation = (currentSignatures[index].rotation + 90) % 360; // 每次旋转 90 度
+    redrawCanvas();
+  }
 };
 
 // 重新绘制画布
@@ -325,8 +342,21 @@
 
   const currentSignatures = placedSignaturesByBackground.value[currentBackgroundIndex.value];
   currentSignatures.forEach((sig) => {
-    // 重新绘制所有签名图(包括大小)
-    ctx.drawImage(sig.image, sig.x, sig.y, sig.width, sig.height);
+    // 保存当前画布状态
+    ctx.save();
+
+    // 移动到签名图的中心点
+    ctx.translate(sig.x + sig.width / 2, sig.y + sig.height / 2);
+
+    // 旋转画布
+    ctx.rotate((sig.rotation * Math.PI) / 180);
+
+
+    // 绘制签名图
+    ctx.drawImage(sig.image, -sig.width / 2, -sig.height / 2, sig.width, sig.height);
+
+    // 恢复画布状态
+    ctx.restore();
 
     // 只有在非导出状态下才绘制缩放手柄
     if (!excludeHandle) {
@@ -367,7 +397,20 @@
     ctx.drawImage(background, 0, 0, canvas.width, canvas.height);
     const currentSignatures = placedSignaturesByBackground.value[index];
     currentSignatures.forEach((sig) => {
-      ctx.drawImage(sig.image, sig.x, sig.y, sig.width, sig.height);
+      // 保存当前画布状态
+      ctx.save();
+
+      // 移动到签名图的中心点
+      ctx.translate(sig.x + sig.width / 2, sig.y + sig.height / 2);
+
+      // 旋转画布
+      ctx.rotate((sig.rotation * Math.PI) / 180);
+
+      // 绘制签名图
+      ctx.drawImage(sig.image, -sig.width / 2, -sig.height / 2, sig.width, sig.height);
+
+      // 恢复画布状态
+      ctx.restore();
     });
     // 将画布内容添加到PDF
     const imgData = canvas.toDataURL("image/jpeg");
@@ -436,17 +479,26 @@
     display: flex;
     justify-content: space-between;
     align-items: center;
-    margin-bottom: 20px;
+    margin-bottom: 15px;
 
     .top-left{
       display: flex;
       align-items: center;
 
-      &>div{
+      h3{
         margin-right: 20px;
       }
       img{
         margin-right: 20px;
+        width: 120px;
+        height: auto;
+        border: 1px solid #f0f0f0;
+        cursor: pointer;
+        box-sizing: border-box;
+
+        &:hover{
+          border: 2px solid #2563EB;
+        }
       }
     }
   }
@@ -455,7 +507,16 @@
     width: 100%;
     display: flex;
     align-items: center;
-    margin: 20px 0;
+    margin-bottom: 20px;
+
+    .controlBtns{
+      margin-right: 20px;
+
+      .el-button{
+        margin: 0 0 0 5px;
+      }
+
+    }
   }
 }
 </style>
\ No newline at end of file

--
Gitblit v1.9.2