From e5ea2c30e33f280ffc8a0ce78224ef99fb6679b1 Mon Sep 17 00:00:00 2001
From: chenlu <1320612696@qq.com>
Date: 星期二, 30 十二月 2025 08:16:06 +0800
Subject: [PATCH] 在制品报表导出修改

---
 north-glass-erp/northglass-erp/src/components/pp/PrintCustomLabel.vue |  152 +++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 112 insertions(+), 40 deletions(-)

diff --git a/north-glass-erp/northglass-erp/src/components/pp/PrintCustomLabel.vue b/north-glass-erp/northglass-erp/src/components/pp/PrintCustomLabel.vue
index 035f700..973760a 100644
--- a/north-glass-erp/northglass-erp/src/components/pp/PrintCustomLabel.vue
+++ b/north-glass-erp/northglass-erp/src/components/pp/PrintCustomLabel.vue
@@ -37,6 +37,12 @@
 const route = currentRoute.value
 let type = props.type
 let faceOrientation = props.faceOrientation
+if (type.indexOf("鑻辨枃")>-1 && faceOrientation==="姝ら潰涓哄鍐呴潰"){
+  faceOrientation='INSIDE'
+}
+else if (type.indexOf("鑻辨枃")>-1 && faceOrientation==="姝ら潰涓哄澶栭潰"){
+  faceOrientation='OUTSIDE'
+}
 let lableType = props.lableType
 data.value.printList = JSON.parse(props.list)
 onMounted(() => {
@@ -56,7 +62,6 @@
               }
             }
           }
-
         } else {
           ElMessage.warning(res.msg)
           router.push("/login")
@@ -69,44 +74,105 @@
 
 
 
+const isComposing = ref(false)
 
-//淇敼鐩稿悓浜у搧鍚嶇О鏍囩
-const updateProductName = (event, index) => {
-  // 鍒涘缓鏄犲皠瀵硅薄
-  const propertyMapping = {};
-  labelList.forEach(item => {
-    propertyMapping[item.name] = item.title;
-  });
-  // 杈撳叆鐨勫��
-  const newValue = event.target.innerText;
 
-  // 鑾峰彇鏄犲皠涓墍鏈夌殑閿�
-  const keys = Object.keys(propertyMapping);
+const getCaretOffset = (el) => {
+  const sel = window.getSelection()
+  if (!sel || sel.rangeCount === 0) return 0
+  const range = sel.getRangeAt(0)
+  if (!el.contains(range.startContainer)) return 0
 
-  // 鏍规嵁 index 鑾峰彇瀵瑰簲鐨勫睘鎬у悕
-  const propertyName = keys[index];
+  const preRange = range.cloneRange()
+  preRange.selectNodeContents(el)
+  preRange.setEnd(range.startContainer, range.startOffset)
+  return preRange.toString().length
+}
 
-  // 濡傛灉鏄犲皠涓病鏈夎 index锛岀洿鎺ヨ繑鍥�
-  if (!propertyName) {
-    console.warn('Unsupported index:', index);
-    return;
+const setCaretOffset = (el, offset) => {
+  const sel = window.getSelection()
+  if (!sel) return
+
+  const range = document.createRange()
+  range.selectNodeContents(el)
+
+  let current = 0
+  const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT, null)
+  let node = walker.nextNode()
+
+  while (node) {
+    const next = current + (node.nodeValue?.length || 0)
+    if (offset <= next) {
+      range.setStart(node, Math.max(0, offset - current))
+      range.collapse(true)
+      sel.removeAllRanges()
+      sel.addRange(range)
+      return
+    }
+    current = next
+    node = walker.nextNode()
   }
 
-  // 閬嶅巻 lastList 骞舵洿鏂板搴旂殑灞炴��
-  lastList.value.forEach(obj => {
-    // 鑾峰彇鍓嶇紑鍜� orderId
-    const prefix = obj.processId.substring(0, 11);
-    const orderId = obj.orderId;
+  // 瓒呭嚭闀垮害鍒欐斁鍒版湯灏�
+  range.collapse(false)
+  sel.removeAllRanges()
+  sel.addRange(range)
+}
+// =============================================
 
-    // 鏍规嵁 propertyName 鏇存柊灞炴��
-    if (propertyName === 'productAbbreviation' && prefix === obj.processId.substring(0, 11)) {
-      obj.productAbbreviation = newValue;
-    }
+//淇敼鐩稿悓浜у搧鍚嶇О鏍囩
+const updateProductName = async (event, fieldIndex, rowIndex) => {
+  // 杈撳叆娉曠粍璇嶉樁娈典笉瑕佸悓姝ワ紝鍚﹀垯浼氭姈鍔�/閿欎贡
+  if (isComposing.value) return
 
-    if (propertyName === 'project' && orderId === obj.orderId) {
-      obj.project = newValue;
-    }
-  });
+  const el = event.target
+
+  //  淇濆瓨鍏夋爣
+  const caret = getCaretOffset(el)
+
+  //  鍙栤�滅函鍊尖�濇鏃� contenteditable 鍙寘鍚�硷紝涓嶅寘鍚爣棰橈細
+  const result = (el.innerText ?? '').trim()
+
+  //  鏄犲皠锛歠ieldIndex -> 瀛楁鍚�
+  const propertyMapping = {}
+  labelList.forEach(item => {
+    propertyMapping[item.name] = item.title
+  })
+  const keys = Object.keys(propertyMapping)
+  const propertyName = keys[fieldIndex]
+  if (!propertyName) return
+
+  //鏇存柊
+  const baseRow = props.lastList?.[rowIndex]
+  if (!baseRow) return
+
+  const basePrefix = (baseRow.processId ?? '').substring(0, 11)
+  const baseGlassNumber = baseRow.glassNumber
+  const baseOrderId = baseRow.orderId
+
+  props.lastList.forEach(obj => {
+    const objPrefix = (obj.processId ?? '').substring(0, 11)
+
+    if (propertyName === 'productAbbreviation' && basePrefix === objPrefix) obj.productAbbreviation = result
+    if (propertyName === 'project' && baseOrderId === obj.orderId) obj.project = result
+    if (propertyName === 'productName' && basePrefix === objPrefix) obj.productName = result
+    if (propertyName === 'customerName' && baseOrderId === obj.orderId) obj.customerName = result
+    if (propertyName === 'orderId' && baseOrderId === obj.orderId) obj.orderId = result
+
+    if (propertyName === 'glassNumber' && baseGlassNumber === obj.glassNumber) obj.glassNumber = result
+    if (propertyName === 'width' && baseGlassNumber === obj.glassNumber) obj.width = result
+    if (propertyName === 'height' && baseGlassNumber === obj.glassNumber) obj.height = result
+
+    if (propertyName === 'custom1' && baseOrderId === obj.orderId) obj.custom1 = result
+    if (propertyName === 'custom2' && baseOrderId === obj.orderId) obj.custom2 = result
+    if (propertyName === 'custom3' && baseOrderId === obj.orderId) obj.custom3 = result
+    if (propertyName === 'custom4' && baseOrderId === obj.orderId) obj.custom4 = result
+    if (propertyName === 'custom5' && baseOrderId === obj.orderId) obj.custom5 = result
+  })
+
+  // 5) 绛� Vue patch 瀹屾垚鍚庯紝鎶婂厜鏍囨斁鍥炲幓
+  await nextTick()
+  setCaretOffset(el, caret)
 }
 
 
@@ -115,12 +181,19 @@
 
 <template>
     <div id="print" :class="company.printLabel.className.custom.printFlowCardName()">
-      <div v-for="(item1,id) in lastList" :class="company.printLabel.className.custom.entiretyName()">
+      <div v-for="(item1,index) in lastList" :class="company.printLabel.className.custom.entiretyName()">
         <div class="row4">{{ faceOrientation }}</div>
         <div v-for="(item,id) in labelList" :class="company.printLabel.className.custom.contentRowName()">
-          <div v-if="item1[item.name] != null && item1[item.name] !== ''" class="row1">{{ item.title }}</div>
-<!--          <div class="row2" style="width: 100%;"><input class="contentRow2" v-model="item1[item.name]"  @keyup="updataProductName()" style="border: none;"/></div>-->
-          <div v-if="item1[item.name] != null && item1[item.name] !== ''" class="row2" style="width: 100%;" contenteditable="true" @input="updateProductName($event, id)" v-text="item1[item.name]"></div>
+          <div class="row1" v-show="item1[item.name] != null && item1[item.name] !== ''">
+            <span class="label">{{ item.title }}锛�</span>
+            <span
+                class="value"
+                contenteditable="true"
+                @compositionstart="isComposing.value = true"
+                @compositionend="(e) => { isComposing.value = false; updateProductName(e, id, index) }"
+                @input="(e) => updateProductName(e, id, index)"
+            >{{ item1[item.name] }}</span>
+          </div>
         </div>
         <div v-html="company.printLabel.custom(item1)"></div>
       </div>
@@ -155,7 +228,7 @@
 body {
   overflow: hidden;
   font-family: Arial;
-  font-size: 10px;
+  font-size: 7px;
 }
 
 #printButton {
@@ -216,14 +289,13 @@
 }
 
 .contentRow .row1 {
-  width: 20%;
-  font-weight: bolder;
+  width: 100%;
 }
 
 .entirety_finished .row4 {
   font-weight: bolder;
   text-align: right;
-  margin-right: 10px;
+  margin-right: 20px;
 }
 
 .contentRow .row1, .contentRow .row2 {
@@ -238,7 +310,7 @@
 
 @page {
   size: auto;  /* auto is the initial value */
-  margin: 18mm 4mm 0mm 4mm;  /* this affects the margin in the printer settings */
+  margin: 13mm 5mm 0mm 7mm;  /* this affects the margin in the printer settings */
 }
 
 @media print {

--
Gitblit v1.8.0