From 4adce5c0784baf7de2ec62a12dacf207ea2a164e Mon Sep 17 00:00:00 2001
From: guoyujie <guoyujie@ng.com>
Date: 星期二, 30 十二月 2025 08:14:20 +0800
Subject: [PATCH] Merge branch 'master' of http://10.153.19.25:10101/r/ERP_override

---
 north-glass-erp/northglass-erp/src/components/pp/PrintCustomLabelTwo.vue |  303 ++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 242 insertions(+), 61 deletions(-)

diff --git a/north-glass-erp/northglass-erp/src/components/pp/PrintCustomLabelTwo.vue b/north-glass-erp/northglass-erp/src/components/pp/PrintCustomLabelTwo.vue
index fba7a6f..31bc34b 100644
--- a/north-glass-erp/northglass-erp/src/components/pp/PrintCustomLabelTwo.vue
+++ b/north-glass-erp/northglass-erp/src/components/pp/PrintCustomLabelTwo.vue
@@ -23,7 +23,8 @@
 let filterData = ref({})
 
 const data = ref({
-  printList: []
+  printList: [],
+  isRepeat:false
 })
 
 let props = defineProps({
@@ -31,7 +32,8 @@
   faceOrientation:null,//鍐呭闈�
   type:null,//鏍囩妯℃澘
   lableType:null,//鏍囩绫诲瀷
-  switch:null//鍒ゆ柇鏄惁涓烘柊鎵撳嵃
+  switch:null,//鍒ゆ柇鏄惁涓烘柊鎵撳嵃
+  lastList:[],
 })
 
 const {currentRoute} = useRouter()
@@ -46,25 +48,64 @@
 }
 let lableType = props.lableType
 data.value.printList = JSON.parse(props.list)
-let switchType = props.switch
 onMounted(() => {
       request.post(`/processCard/getSelectPrintCustomLabel/${type}/${lableType}`, data.value).then((res) => {
         if (res.code == 200) {
-
           produceList.value = deepClone(res.data.title)
           list.value = deepClone(res.data.data)
           const data = produceList.value[0].value
           dataList = JSON.parse(`[${data}]`);
-          if (switchType===true){
-            labelList = props.titleList
-          }else {
-            labelList = dataList[0]
-          }
-          for (let i = 0; i < list.value.length; i++) {
-            let count = list.value[i].data.length
-            for (let j = 0; j < count; j++) {
-              for (let k = 0; k < list.value[i].data[j].quantity; k++) {
-                lastList.value.push(list.value[i].data[j])
+          const printElements = dataList[0].panels[0].printElements;
+          let a = []
+          printElements.forEach(element => {
+            if(element.options.field==='table'){
+              element.options.columns[0].forEach(elements => {
+                if(elements.field){
+                  a.push({
+                        title: elements.title,
+                        name: elements.field
+                      }
+                  )
+                }
+              })
+            }else{
+              a.push({
+                title: element.options.title,
+                name: element.options.field
+              })
+            }
+          })
+          labelList = a
+
+          props.lastList.length = 0;
+          // 閬嶅巻鍒楄〃锛堟浛鎹� i 涓烘洿璇箟鍖栫殑鍙橀噺鍚嶏級
+          for (const group of list.value) {
+            // 閬嶅巻姣忕粍涓殑鏁版嵁锛堟浛鎹� j锛�
+            for (const item of group.data) {
+              const { quantity, newList } = item;
+              // 璺宠繃 quantity 涓� 0 鎴栨棤鏁堢殑鎯呭喌
+              if (!quantity || quantity <= 0) continue;
+
+              // 澶勭悊 newList锛氱‘淇濇槸鏁扮粍锛屼笉瓒虫椂鐢ㄧ┖瀵硅薄鍏滃簳
+              const safeNewList = Array.isArray(newList) ? newList : [];
+              // 寰幆 quantity 娆★紝娣诲姞鏁版嵁鍒� lastList
+              for (let k = 0; k < quantity; k++) {
+                // 娣辨嫹璐� item锛岄伩鍏嶉噸澶嶅紩鐢紙鍏抽敭锛侊級
+                const newItem = JSON.parse(JSON.stringify(item));
+
+                // 鑻� newList 鏈夊搴旂储寮曟暟鎹紝濉厖瀛楁锛涘惁鍒欑疆绌�
+                const listItem = safeNewList[k];
+                if (listItem) {
+                  newItem.heat_layout_sort = listItem.glass_id || ''; // 鍏滃簳绌哄瓧绗︿覆
+                  newItem.stockPolysId = `${listItem.stock_id || ''}/${listItem.polys_id || ''}`; // 閬垮厤 undefined/
+                } else {
+                  // 鏃犲搴旀暟鎹椂锛屽瓧娈电疆绌猴紙閬垮厤淇濈暀鍘熷鍊硷級
+                  newItem.heat_layout_sort = '';
+                  newItem.stockPolysId = '';
+                }
+
+                // 娣诲姞鍒扮洰鏍囧垪琛�
+                props.lastList.push(newItem);
               }
             }
           }
@@ -76,66 +117,206 @@
     }
 )
 
-//淇敼鐩稿悓浜у搧鍚嶇О鏍囩
-const updateProductName = (event, index,id) => {
-  // 鍒涘缓鏄犲皠瀵硅薄
-  const propertyMapping = {};
-  labelList.forEach(item => {
-    propertyMapping[item.name] = item.title;
-  });
-  // 杈撳叆鐨勫��
-  const newValue = event.target.innerText;
-  const parts = newValue.split('锛�');
-  const result = parts[1]; // 鑾峰彇鍐掑彿鍚庣殑閮ㄥ垎
 
-  // 鑾峰彇鏄犲皠涓墍鏈夌殑閿�
-  const keys = Object.keys(propertyMapping);
+const isComposing = ref(false)
 
-  // 鏍规嵁 index 鑾峰彇瀵瑰簲鐨勫睘鎬у悕
-  const propertyName = keys[index];
 
-  // 濡傛灉鏄犲皠涓病鏈夎 index锛岀洿鎺ヨ繑鍥�
-  if (!propertyName) {
-    console.warn('Unsupported index:', index);
-    return;
+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
+
+  const preRange = range.cloneRange()
+  preRange.selectNodeContents(el)
+  preRange.setEnd(range.startContainer, range.startOffset)
+  return preRange.toString().length
+}
+
+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 = lastList.value[index].processId.substring(0, 11);
-    const orderId = obj.orderId;
-    const glassNumber=lastList.value[index].glassNumber
-    // 鏍规嵁 propertyName 鏇存柊灞炴��
-    if (propertyName === 'productAbbreviation' && prefix === obj.processId.substring(0, 11)) {
-      obj.productAbbreviation = result;
-    }
-
-    if (propertyName === 'project' && orderId === obj.orderId) {
-      obj.project = result;
-    }
-    if (propertyName === 'productName' && prefix === obj.processId.substring(0, 11)){
-      obj.productName = result;
-    }
-    if (propertyName === 'customerName' && orderId === obj.orderId){
-      obj.customerName = result;
-    }
-  });
+  // 瓒呭嚭闀垮害鍒欐斁鍒版湯灏�
+  range.collapse(false)
+  sel.removeAllRanges()
+  sel.addRange(range)
 }
+// =============================================
+
+//淇敼鐩稿悓浜у搧鍚嶇О鏍囩
+const updateProductName = async (event, fieldIndex, rowIndex) => {
+  // 杈撳叆娉曠粍璇嶉樁娈典笉瑕佸悓姝ワ紝鍚﹀垯浼氭姈鍔�/閿欎贡
+  if (isComposing.value) return
+
+  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)
+}
+
+//淇敼鐩稿悓浜у搧鍚嶇О鏍囩
+// const updateProductName = (event, index,id) => {
+//   // 鍒涘缓鏄犲皠瀵硅薄
+//   const propertyMapping = {};
+//   labelList.forEach(item => {
+//     propertyMapping[item.name] = item.title;
+//   });
+//   // 杈撳叆鐨勫��
+//   const newValue = event.target.innerText;
+//   const parts = newValue.split('锛�');
+//   const result = parts[1]; // 鑾峰彇鍐掑彿鍚庣殑閮ㄥ垎
+//
+//   // 鑾峰彇鏄犲皠涓墍鏈夌殑閿�
+//   const keys = Object.keys(propertyMapping);
+//
+//   // 鏍规嵁 index 鑾峰彇瀵瑰簲鐨勫睘鎬у悕
+//   const propertyName = keys[index];
+//   // 濡傛灉鏄犲皠涓病鏈夎 index锛岀洿鎺ヨ繑鍥�
+//   if (!propertyName) {
+//     console.warn('Unsupported index:', index);
+//     return;
+//   }
+//
+//   // 閬嶅巻 lastList 骞舵洿鏂板搴旂殑灞炴��
+//   props.lastList.forEach(obj => {
+//     // 鑾峰彇鍓嶇紑鍜� orderId
+//     const prefix = props.lastList[id].processId.substring(0, 11);
+//     const orderId = obj.orderId;
+//     const glassNumber=props.lastList[id].glassNumber
+//     // 鏍规嵁 propertyName 鏇存柊灞炴��
+//     if (propertyName === 'productAbbreviation' && prefix === obj.processId.substring(0, 11)) {
+//       obj.productAbbreviation = result;
+//     }
+//
+//     if (propertyName === 'project' && orderId === obj.orderId) {
+//       obj.project = result;
+//     }
+//     if (propertyName === 'productName' && prefix === obj.processId.substring(0, 11)){
+//       obj.productName = result;
+//     }
+//     if (propertyName === 'customerName' && orderId === obj.orderId){
+//       obj.customerName = result;
+//     }
+//     if (propertyName === 'orderId' && orderId === obj.orderId){
+//       obj.orderId = result;
+//     }
+//     if (propertyName === 'glassNumber' && glassNumber === obj.glassNumber){
+//       obj.glassNumber = result;
+//     }
+//     if (propertyName === 'width' && glassNumber === obj.glassNumber){
+//       obj.width = result;
+//     }
+//     if (propertyName === 'height' && glassNumber === obj.glassNumber){
+//       obj.height = result;
+//     }
+//     if (propertyName === 'custom1' && orderId === obj.orderId){
+//       obj.custom1 = result;
+//     }
+//     if (propertyName === 'custom2' && orderId === obj.orderId){
+//       obj.custom2 = result;
+//     }
+//     if (propertyName === 'custom3' && orderId === obj.orderId){
+//       obj.custom3 = result;
+//     }
+//     if (propertyName === 'custom4' && orderId === obj.orderId){
+//       obj.custom4 = result;
+//     }
+//     if (propertyName === 'custom5' && orderId === obj.orderId){
+//       obj.custom5 = result;
+//     }
+//   });
+// }
 
 </script>
 
 <template>
-  <div id="print" :class="company.printLabel.className.semi.printFlowCardName()">
-    <div v-for="(item1,id) in lastList" :class="company.printLabel.className.semi.entiretyName()">
+  <div id="print" class="printFlowCard_semi">
+
+      <template v-for="(item1,index) in props.lastList">
+        <div class="entirety_semi">
       <div class="row4">{{ faceOrientation }}</div>
-      <div  v-for="(item,id) in labelList" :class="company.printLabel.className.semi.contentRowName()">
-        <div contenteditable="true" v-if="item1[item.name] != null && item1[item.name] !== ''" class="row1" @input="updateProductName($event, id,index)">{{ item.title }}锛歿{ item1[item.name] }}</div>
-        <!--        <div v-if="item1[item.name] != null && item1[item.name] !== ''" class="row2">{{ item1[item.name] }}</div>-->
+      <div  v-for="(item,id) in labelList" class="contentRow">
+        <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.customSemi(item1)"></div>
-      <div v-if="(id + 1) % 2 === 0" class="pagebreak"></div>
-    </div>
+        </div>
+        <div v-if="(id + 1) % 2 === 0" class="pagebreak"></div>
+      </template>
+
   </div>
 
 

--
Gitblit v1.8.0