廖井涛
2024-07-25 15fa56463061f1e94140e23e98987aa3131714bf
north-glass-erp/northglass-erp/src/components/pp/PrintCustomLabel.vue
New file
@@ -0,0 +1,292 @@
<script setup>
import request from "@/utils/request"
import {ElDatePicker, ElMessage} from "element-plus"
import {nextTick, onMounted, onUnmounted, reactive, ref, watch} from "vue"
import {Search} from "@element-plus/icons-vue"
import {useRouter} from 'vue-router'
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()
let produceList = ref([])
let labelList = ref([])
let titleList = ref([])
let dataList = ref([])
let list = ref([])
let lastList = ref([])
let filterData = ref({})
const data = ref({
  printList: []
})
let props = defineProps({
  list:null,//勾选的数据
  faceOrientation:null,//内外面
  type:null,//标签模板
  lableType:null//标签类型
})
const {currentRoute} = useRouter()
const route = currentRoute.value
let type = props.type
let faceOrientation = props.faceOrientation
let lableType = props.lableType
data.value.printList = JSON.parse(props.list)
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}]`);
          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])
              }
            }
          }
        } else {
          ElMessage.warning(res.msg)
          router.push("/login")
        }
      })
    }
)
// 打印方法
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;
  // 样式控制与打印无关的元素隐藏
  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);
  // 与style元素设置的样式相配合
  // 把打印内容的元素添加到body(作为body的子元素,可用body的子选择器 '>' 控制打印样式)
  body.appendChild(content);
  setTimeout(() => {
    window.print();
    body.removeChild(content);
    body.removeChild(style);
  }, 20);
}
//修改相同产品名称标签
const updataProductName = () => {
  for (let i = 0; i < lastList.value.length; i++) {
    let prefix = lastList.value[i].processId.substring(0, 11);
    let orderId= lastList.value[i].orderId
    let enName= lastList.value[i].productAbbreviation
    let project=lastList.value[i].project
    lastList.value.forEach(obj => {
      if (prefix === obj.processId.substring(0, 11)){
        obj.productAbbreviation = enName
      }
      if (orderId === obj.orderId){
        obj.project=project
      }
    })
  }
}
</script>
<template>
    <div id="print" :class="company.printLabel.className.custom.printFlowCardName()">
      <div v-for="(item1,id) 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="item.title==null" class="row1">{{ item.title }}</div>
          <div v-else class="row1">{{ item.title }}:</div>
          <div class="row2" style="width: 100%;"><input v-model="item1[item.name]"  @keyup="updataProductName()" style="border: none;"/></div>
        </div>
        <div v-html="company.printLabel.custom(item1)"></div>
      </div>
    </div>
</template>
<style scoped>
* {
  margin: 0;
  padding: 0;
}
body {
  overflow: hidden;
  font-family: Arial, sans-serif;
  font-size: 10px;
}
#printButton {
  margin-top: -20px;
  width: 100px;
}
.print{
  width: 100%;
  height: 100%;
}
/*成*/
.printFlowCard_finished {
  /*
  font-family: 'Microsoft YaHei', '微软雅黑', sans-serif;
  */
  flex-wrap: nowrap;
  display: flex;
  flex-direction: column;
}
/*成*/
.entirety_finished {
  display: flex;
  text-align: center;
  flex-direction: column;
  margin-left: 10px;
  width: 100%;
  height: 100%;
}
/*div{
  font-family: 'Microsoft YaHei', '微软雅黑', sans-serif;
}*/
.row3 {
  text-align: center;
  /*display: flex;
  justify-content:space-evenly;*/
}
.row3 label {
  margin-top: 28px;
}
.contentRow {
  font-weight: bolder;
  display: flex;
  text-align: center;
  width: 100%;
}
label {
  /*font-family: 'Microsoft YaHei', '微软雅黑', sans-serif;*/
}
.contentRow .row1 {
  width: 30%;
  font-weight: bolder;
}
.entirety_finished .row4 {
  font-weight: bolder;
  text-align: right;
  margin-right: 10px;
}
.contentRow .row1, .contentRow .row2 {
  text-align: left;
}
input{
  width: 100%;
  border: none;
}
@page {
  size: auto;  /* auto is the initial value */
  margin: 13mm 4mm 0mm 6mm;  /* this affects the margin in the printer settings */
}
@media print {
  div {
    page-break-inside: avoid;
  }
  .entirety_finished {
    page-break-before: always;
  }
}
.printFlowCard_finished1 {
  flex-wrap: wrap;
  display: flex;
  flex-direction: column;
}
/*成*/
.entirety_finished1 {
  display: flex;
  text-align: center;
  flex-direction: column;
  margin-left: 10px;
  width: 337px;
  height: 120px;
}
.contentRow1 {
  font-weight: bolder;
  display: flex;
  text-align: center;
  width: 100%;
}
.contentRow1 .row1 {
  width: 30%;
  font-weight: bolder;
}
.entirety_finished1 .row4 {
  font-weight: bolder;
  text-align: right;
  margin-right: 10px;
}
.contentRow1 .row1, .contentRow1 .row2 {
  text-align: left;
  font-weight: bolder;
}
</style>