廖井涛
2025-11-17 c069f2cce3c10a773e8c474c0031e316ffd8ad9e
north-glass-erp/northglass-erp/src/components/pp/PrintRepairCustomLabel.vue
@@ -7,6 +7,9 @@
import {changeFilterEvent, filterChanged} from "@/hook"
import {useI18n} from 'vue-i18n'
import deepClone from "@/utils/deepClone";
import companyInfo from "@/stores/sd/companyInfo";
const company = companyInfo()
//语言获取
const {t} = useI18n()
let router = useRouter()
@@ -15,7 +18,7 @@
let titleList = ref([])
let dataList = ref([])
let list = ref([])
let lastList=ref([])
let lastList = ref([])
let filterData = ref({})
@@ -27,30 +30,79 @@
  list:null,//勾选的数据
  faceOrientation:null,//内外面
  type:null,//标签模板
  lableType:null//标签类型
  lableType:null,//标签类型
  titleList:null,//标题
  switch:null,//判断是否为新打印,
  lastList:[],
  detailType:null
})
const {currentRoute} = useRouter()
const route = currentRoute.value
let type = props.type
let faceOrientation = props.faceOrientation
let lableType = props.lableType
let switchType = props.switch
let detailType= props.detailType
data.value.printList = JSON.parse(props.list)
onMounted(() => {
      request.post(`/Replenish/getSelectPrintCustomLabel/${type}`, data.value).then((res) => {
        if (res.code == 200) {
      request.post(`/Replenish/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}]`);
          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
          // 遍历列表(替换 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);
              }
            }
          }
@@ -65,58 +117,93 @@
)
// 打印方法
const printFlowCard = () => {
  // 需要打印的局部区域赋予"print-wrap"的id
  let el = document.getElementById("print");
  let doc = document;
  let body = doc.body || doc.getElementsByTagName("body")[0];
  let printId = "print-" + Date.now();
  // 创建无副作用的打印容器(因不确定页面的打印元素有无其它样式)
  let content = doc.createElement("div");
  content.id = printId;
//修改相同产品名称标签
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;
  }
  // 样式控制与打印无关的元素隐藏
  let style = doc.createElement("style");
  style.innerHTML =
      "body>#" +
      printId +
      "{display:none}@media print{body>:not(#" +
      printId +
      "){display:none !important}body>#" +
      printId +
      "{display:block;padding-top:1px}}";
  //
  content.innerHTML = el.outerHTML;
  body.appendChild(style);
  // 遍历 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;
    }
  // 与style元素设置的样式相配合
  // 把打印内容的元素添加到body(作为body的子元素,可用body的子选择器 '>' 控制打印样式)
  body.appendChild(content);
  setTimeout(() => {
    window.print();
    body.removeChild(content);
    body.removeChild(style);
  }, 20);
    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 class="printFlowCard_finished" id="print">
    <div v-for="(item1,id) in lastList"   class="entirety_finished">
        <div class="row4">{{faceOrientation}}</div>
        <div v-for="(item,id) in labelList"  class="contentRow">
          <div class="row1">{{ item.title }}:</div>
          <div class="row2">{{ item1[item.name] }}</div>
        </div>
        <div class="row3">
          <label>W:{{ item1.width }}</label>
          &nbsp;&nbsp;&nbsp;
          <label>H:{{ item1.height }}</label>
        </div>
  <div id="print" :class="company.printLabel.className.custom.printFlowCardName()">
    <div v-for="(item1,index) in props.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"  contenteditable="true" @input="updateProductName($event, id,index)" v-text="item.title+':'+item1[item.name]"></div>
        <div v-else class="row1"  contenteditable="true" @input="updateProductName($event, id,index)" v-text="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>
      <!--        <div v-html="company.printLabel.custom(item1)"></div>-->
      <div v-if="(id + 1) % 2 === 0" class="pagebreak"></div>
    </div>
  </div>
@@ -220,7 +307,9 @@
.entirety_finished{
  page-break-before: always;
}
  .pagebreak {
    page-break-after: always;
  }
}
</style>