From baf74fc6ba071853f6bcb23150bb19d5ba872b39 Mon Sep 17 00:00:00 2001
From: 于杰 <1210123631@qq.com>
Date: 星期日, 28 九月 2025 09:34:39 +0800
Subject: [PATCH] 修改调整后坐标保存逻辑,实现优化后保存opt文件,并显示地址

---
 north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/OptimizationRect.vue |   66 +++++++++++++++++++++
 north-glass-erp/src/main/resources/mapper/pp/GlassOptimize.xml                      |    1 
 north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizeControl.vue       |   54 +++++++++--------
 north-glass-erp/src/main/java/com/example/erp/service/pp/GlassOptimizeService.java  |   18 ++++++
 4 files changed, 112 insertions(+), 27 deletions(-)

diff --git a/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizeControl.vue b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizeControl.vue
index b5a8092..939ff1d 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizeControl.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizeControl.vue
@@ -21,7 +21,7 @@
 import RectRenderer from './page/RectRenderer.vue';
 import request from "@/utils/request";
 import { useI18n } from "vue-i18n";
-import { ElMessage } from "element-plus";
+import {ElMessage, ElMessageBox} from "element-plus";
 import requestOptimize from "@/utils/requestOptimize";
 import useUserInfoStore from "@/stores/userInfo";
 
@@ -180,41 +180,45 @@
     const response = await requestOptimize.post('api/cutFiles', {
       fileName: processId,
       projectNo: processId,
-      glassThickness:inventoryData.value[0].thickness,
-      glassType:inventoryData.value[0].model,
+      glassThickness: inventoryData.value[0].thickness,
+      glassType: inventoryData.value[0].model,
       quantity: inventoryData.value[0].processingQuantity,
-      fileType:"OPT",
-      fileSaveMode:fileMode.value,
-      glassIdMode:glassIdMode.value,
-      haveMark:haveMark.value,
-      haveOptimaMark:haveOptimaMark.value,
-      haveQMark:haveQMark.value,
-      optimaMarkPosition:optimaMarkPosition.value,
-      optimaMarkName:optimaMarkName.value,
-      optimaMarkWidth:optimaMarkWidth.value,
-      optimaMarkHeight:optimaMarkHeight.value,
+      fileType: "OPT",
+      fileSaveMode: fileMode.value,
+      glassIdMode: glassIdMode.value,
+      haveMark: haveMark.value,
+      haveOptimaMark: haveOptimaMark.value,
+      haveQMark: haveQMark.value,
+      optimaMarkPosition: optimaMarkPosition.value,
+      optimaMarkName: optimaMarkName.value,
+      optimaMarkWidth: optimaMarkWidth.value,
+      optimaMarkHeight: optimaMarkHeight.value,
       layouts: optimizeLayouts.value.layouts
     }, {
       headers: {
         'Content-Type': 'application/json'
-      },
-      responseType: 'blob'
+      }
     });
 
-    // 澶勭悊涓嬭浇
-    const downloadUrl = window.URL.createObjectURL(response);
-    const a = document.createElement('a');
-    a.href = downloadUrl;
-    a.download = 'output.opt';
-    document.body.appendChild(a);
-    a.click();
-    document.body.removeChild(a);
-    window.URL.revokeObjectURL(downloadUrl);
-    ElMessage.success('OPT鏂囦欢淇濆瓨鎴愬姛');
+    // 浣跨敤 MessageBox 鏄剧ず鏂囦欢淇濆瓨浣嶇疆淇℃伅
+    if (response.data && response.data.length > 0) {
+      const filePath = response.data[0];
+      ElMessageBox.alert(`OPT鏂囦欢淇濆瓨鎴愬姛锛屼綅缃細${filePath}`, '淇濆瓨鎴愬姛', {
+        confirmButtonText: '纭畾',
+        type: 'success',
+        dangerouslyUseHTMLString: true
+      });
+    } else {
+      ElMessageBox.alert('OPT鏂囦欢淇濆瓨鎴愬姛', '淇濆瓨鎴愬姛', {
+        confirmButtonText: '纭畾',
+        type: 'success'
+      });
+    }
   } catch (error) {
     console.error('淇濆瓨澶辫触:', error);
     ElMessage.error('淇濆瓨澶辫触锛岃绋嶅悗鍐嶈瘯');
   }
 };
+
 </script>
   
\ No newline at end of file
diff --git a/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/OptimizationRect.vue b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/OptimizationRect.vue
index fab593e..6d16c5b 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/OptimizationRect.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/OptimizationRect.vue
@@ -80,9 +80,9 @@
 
 <script setup>
 import { ref, reactive, onMounted, onUnmounted } from 'vue';
-import { useRouter } from 'vue-router'; // 娣诲姞杩欒
+import { useRouter } from 'vue-router';
 import request from "@/utils/request";
-const router = useRouter(); // 娣诲姞杩欒
+const router = useRouter();
 import { useI18n } from "vue-i18n";
 import { ElMessage, ElMessageBox } from "element-plus";
 import useUserInfoStore from "@/stores/userInfo";
@@ -553,6 +553,11 @@
   const rectIndex = dragRect.value.rectIndex;
   const layout = layouts.value[layoutIndex];
   const glassDetail = layout.glassDetails[rectIndex];
+
+  // 淇濆瓨鍘熷鍧愭爣鐢ㄤ簬璁$畻鍋忕Щ閲�
+  const originalX = glassDetail.x;
+  const originalY = glassDetail.y;
+
   const scale = Math.min(
     (props.gw - 100) / layout.width,
     (props.gh - 100) / layout.height
@@ -583,6 +588,18 @@
   if (isValidMove) {
     glassDetail.x = newRect.x;
     glassDetail.y = newRect.y;
+
+    // 鏇存柊glassPoint鍧愭爣
+    if (glassDetail.glassPoint && Array.isArray(glassDetail.glassPoint)) {
+      const offsetX = glassDetail.x - originalX;
+      const offsetY = glassDetail.y - originalY;
+
+      glassDetail.glassPoint.forEach(point => {
+        point.X += offsetX;
+        point.Y += offsetY;
+      });
+    }
+
     dragStartPos.value = {
       x: event.clientX,
       y: event.clientY
@@ -819,6 +836,22 @@
   }
 
   if (isValidRotation) {
+    // 鏇存柊glassPoint鍧愭爣锛堝鏋滃瓨鍦級
+    if (glassDetail.glassPoint && Array.isArray(glassDetail.glassPoint)) {
+      // 淇濆瓨鍘熷鐐瑰潗鏍�
+      const originalPoints = JSON.parse(JSON.stringify(glassDetail.glassPoint));
+
+      // 鏃嬭浆鐐瑰潗鏍囷紙浠ョ煩褰㈠乏涓婅涓哄師鐐圭殑鏃嬭浆锛�
+      glassDetail.glassPoint.forEach((point, index) => {
+        // 璁$畻鐩稿浜庣煩褰㈠乏涓婅鐨勫潗鏍�
+        const relX = originalPoints[index].X - originalState.x;
+        const relY = originalPoints[index].Y - originalState.y;
+
+        // 鏃嬭浆90搴﹀悗鐨勫潗鏍囷紙椤烘椂閽堬級
+        point.X = originalState.x + relY;
+        point.Y = originalState.y + (originalState.width - relX);
+      });
+    }
     adjustGrayRectangles(layoutIndex);
   } else {
     glassDetail.width = originalState.width;
@@ -882,6 +915,11 @@
     return;
   }
 
+
+  // 淇濆瓨鍘熷鍧愭爣
+  const originalX = glassDetail.x;
+  const originalY = glassDetail.y;
+
   switch (direction) {
     case 'up':
       glassDetail.y += maxStep;
@@ -913,6 +951,16 @@
   }
 
   if (isValidMove) {
+    // 鏇存柊glassPoint鍧愭爣
+    if (glassDetail.glassPoint && Array.isArray(glassDetail.glassPoint)) {
+      const offsetX = glassDetail.x - originalX;
+      const offsetY = glassDetail.y - originalY;
+
+      glassDetail.glassPoint.forEach(point => {
+        point.X += offsetX;
+        point.Y += offsetY;
+      });
+    }
     adjustGrayRectangles(layoutIndex);
   } else {
     glassDetail.x = originalState.x;
@@ -1161,6 +1209,13 @@
     // 鏇存柊鐭╁舰浣嶇疆
     glassDetail.x = newX;
     glassDetail.y = newY;
+
+    // 鏇存柊glassPoint鍧愭爣
+    if (glassDetail.glassPoint && Array.isArray(glassDetail.glassPoint)) {
+      glassDetail.glassPoint.forEach(point => {
+        point.X = width - point.X;
+      });
+    }
   });
 
   // 鏇存柊甯冨眬
@@ -1181,6 +1236,13 @@
 
     // 鏇存柊鐭╁舰浣嶇疆
     glassDetail.y = newY;
+
+    // 鏇存柊glassPoint鍧愭爣
+    if (glassDetail.glassPoint && Array.isArray(glassDetail.glassPoint)) {
+      glassDetail.glassPoint.forEach(point => {
+        point.Y = height - point.Y;
+      });
+    }
   });
 
   // 鏇存柊甯冨眬
diff --git a/north-glass-erp/src/main/java/com/example/erp/service/pp/GlassOptimizeService.java b/north-glass-erp/src/main/java/com/example/erp/service/pp/GlassOptimizeService.java
index 2130651..560d062 100644
--- a/north-glass-erp/src/main/java/com/example/erp/service/pp/GlassOptimizeService.java
+++ b/north-glass-erp/src/main/java/com/example/erp/service/pp/GlassOptimizeService.java
@@ -393,6 +393,24 @@
                             }
                         }
                     }
+                    // 澶勭悊 glassPoint 搴忓垪鍖�
+                    if (detail.containsKey("glassPoint")) {
+                        Object glassPointObj = detail.get("glassPoint");
+                        if (glassPointObj != null) {
+                            try {
+                                // 濡傛灉 glassPointObj 宸茬粡鏄瓧绗︿覆锛屽垯涓嶉渶瑕佽浆鎹�
+                                if (!(glassPointObj instanceof String)) {
+                                    // 灏嗗璞¤浆鎹负 JSON 瀛楃涓�
+                                    String glassPointStr = mapper.writeValueAsString(glassPointObj);
+                                    detail.put("glassPoint", glassPointStr);
+                                }
+                            } catch (Exception e) {
+                                // 濡傛灉杞崲澶辫触锛岃褰曢敊璇苟绉婚櫎璇ュ瓧娈�
+                                System.err.println("杞崲 glassPoint 澶辫触: " + e.getMessage());
+                                detail.remove("glassPoint");
+                            }
+                        }
+                    }
 
                     if (isRemain) {
                         offCutDetails.add(detail);
diff --git a/north-glass-erp/src/main/resources/mapper/pp/GlassOptimize.xml b/north-glass-erp/src/main/resources/mapper/pp/GlassOptimize.xml
index 6dd579c..f684745 100644
--- a/north-glass-erp/src/main/resources/mapper/pp/GlassOptimize.xml
+++ b/north-glass-erp/src/main/resources/mapper/pp/GlassOptimize.xml
@@ -1523,6 +1523,7 @@
     <update id="updateNormalDetails">
         UPDATE pp.optimize_detail
         SET
+            glass_point = #{detail.glassPoint},
             x_axis = #{detail.x},
             y_axis = #{detail.y}
         WHERE

--
Gitblit v1.8.0