342 lines
9.0 KiB
Vue
342 lines
9.0 KiB
Vue
|
||
|
||
<template>
|
||
<Dialog title="打印预览" v-model="dialogVisible" :draggable="false" width="1400">
|
||
<!-- 打印预览 -->
|
||
<div class="print-wrap page" ref="print">
|
||
<table border="2" cellspacing="0" id="table">
|
||
<tbody>
|
||
<tr>
|
||
<td colspan="4">
|
||
<div style="width: 100px; text-align: center;">
|
||
<img :src="logoDataUrl" style="width:100%" alt="" />
|
||
</div>
|
||
</td>
|
||
<td colspan="32">
|
||
<span style="font-size: 22px; font-weight: 800;letter-spacing: 5px;">子项目跟踪表</span>
|
||
</td>
|
||
<td colspan="4" style="padding: 5px 0">
|
||
<div style="border-bottom: 1px solid #666; padding-bottom: 5px">项目编号</div>
|
||
<div style="padding-top: 5px">{{ `formData.code` }}</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td colspan="4">客户名称:</td>
|
||
<td colspan="12">{{`华东泰克西汽车铸造有限公司`}}</td>
|
||
<td colspan="2">编码:</td>
|
||
<td colspan="6">{{`1006`}}</td>
|
||
<td colspan="3">项目名称:</td>
|
||
<td colspan="15">{{`EA888-k系列摸具`}}</td>
|
||
|
||
</tr>
|
||
<tr>
|
||
<td colspan="4">子项目名称:</td>
|
||
<td colspan="8">{{ `曲轴芯盒`}}</td>
|
||
<td colspan="3">项目交货期:</td>
|
||
<td colspan="5">{{`2024/4/10`}}</td>
|
||
<td colspan="2">完成日期</td>
|
||
<td colspan="3">{{``}}</td>
|
||
<td colspan="2">完成日期</td>
|
||
<td colspan="3">{{``}}</td>
|
||
<td colspan="2">完成日期</td>
|
||
<td colspan="3">{{``}}</td>
|
||
</tr>
|
||
<tr>
|
||
<td colspan="3"> BOM清单: </td>
|
||
<td colspan="1"> 编号: </td>
|
||
<td colspan="6">{{`100062401006-HT-EA888-K-ZTX`}}</td>
|
||
<td colspan="30">工艺流程</td>
|
||
</tr>
|
||
</tbody>
|
||
|
||
<tbody>
|
||
<tr>
|
||
<td colspan="1"> 序号 </td>
|
||
<td colspan="3">
|
||
<span>名称</span>
|
||
</td>
|
||
<td colspan="1">材质(D)</td>
|
||
<td colspan="1">规格(E)</td>
|
||
<td colspan="1">数量(F)</td>
|
||
<td colspan="1">负责人</td>
|
||
<td colspan="2">完成时间</td>
|
||
<td colspan="1">下料</td>
|
||
<td colspan="1">预计</td>
|
||
<td colspan="1">实际</td>
|
||
<td colspan="1">车床</td>
|
||
<td colspan="1">预计</td>
|
||
<td colspan="1">实际</td>
|
||
<td colspan="1">热处理</td>
|
||
<td colspan="1">预计</td>
|
||
<td colspan="1">实际</td>
|
||
<td colspan="1">磨床</td>
|
||
<td colspan="1">预计</td>
|
||
<td colspan="1">实际</td>
|
||
<td colspan="1">线割</td>
|
||
<td colspan="1">预计</td>
|
||
<td colspan="1">实际</td>
|
||
<td colspan="1">数控</td>
|
||
<td colspan="1">预计</td>
|
||
<td colspan="1">实际</td>
|
||
<td colspan="1">火花</td>
|
||
<td colspan="1">预计</td>
|
||
<td colspan="1">实际</td>
|
||
<td colspan="1">刻字</td>
|
||
<td colspan="1">预计</td>
|
||
<td colspan="1">实际</td>
|
||
<td colspan="1">电焊</td>
|
||
<td colspan="1">预计</td>
|
||
<td colspan="1">实际</td>
|
||
<td colspan="1">钻孔</td>
|
||
<td colspan="1">预计</td>
|
||
<td colspan="1">实际</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
<template #footer>
|
||
<!-- 【打印】 -->
|
||
<el-button @click="onPrint" type="primary">打印</el-button>
|
||
<el-button @click="outopen">取消</el-button>
|
||
</template>
|
||
</Dialog>
|
||
</template>
|
||
<script setup lang="ts">
|
||
// import { ref, reactive } from 'vue'
|
||
import { Check } from '@element-plus/icons-vue'
|
||
import urlimg from '@/assets/imgs/exlogo.png'
|
||
const logoDataUrl = ref('') // 存储Logo的Base64编码数据URL
|
||
const dialogVisible = ref(false) // 弹窗的是否展示
|
||
|
||
const formData = ref({
|
||
tablename: [
|
||
{
|
||
index: 1,
|
||
name: '工序'
|
||
},
|
||
{
|
||
index: 2,
|
||
name: '自检'
|
||
},
|
||
{
|
||
index: 3,
|
||
name: '额定工时1'
|
||
},
|
||
{
|
||
index: 4,
|
||
name: '额定工时2'
|
||
},
|
||
{
|
||
index: 5,
|
||
name: '审核者'
|
||
},
|
||
{
|
||
index: 6,
|
||
name: '加工工时1'
|
||
},
|
||
{
|
||
index: 7,
|
||
name: '操作者1',
|
||
date: '日'
|
||
},
|
||
{
|
||
index: 8,
|
||
name: '加工工时2'
|
||
},
|
||
{
|
||
index: 9,
|
||
name: '操作者2',
|
||
date: '日'
|
||
},
|
||
{
|
||
index: 10,
|
||
name: '质检1',
|
||
date: '日'
|
||
},
|
||
{
|
||
index: 11,
|
||
name: '质检2',
|
||
date: '日'
|
||
},
|
||
{
|
||
index: 12,
|
||
name: '备注'
|
||
}
|
||
]
|
||
})
|
||
|
||
const onPrint = () => {
|
||
// 拿到打印页面dom节点
|
||
const printNode = document.querySelector('.print-wrap')
|
||
if (!printNode) return
|
||
// 页面文档创建一个空的内框架,用于挂载打印节点,并设置一定的样式
|
||
const newIframe: any = document.createElement('iframe')
|
||
newIframe.setAttribute(
|
||
'style',
|
||
'width:0px;height:0px;position:absolute;left:-9999px;top:-9999px;'
|
||
)
|
||
newIframe.setAttribute('align', 'center')
|
||
document.body.appendChild(newIframe)
|
||
// 将打印页面设置为内框架内容
|
||
let doc: any = null
|
||
doc = newIframe.contentWindow.document
|
||
doc.write(`
|
||
<style type="text/css">
|
||
/* 浏览器打印基本样式 */
|
||
.page {
|
||
width: 29.7cm;
|
||
min-height: 42cm;
|
||
padding: 10mm;
|
||
margin: 20px auto;
|
||
border: 1px #d3d3d3 solid;
|
||
border-radius: 5px;
|
||
background: white;
|
||
box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
|
||
position: relative;
|
||
font-size: 14px !important;
|
||
}
|
||
|
||
@page {
|
||
size: A3;
|
||
margin:1cm;
|
||
}
|
||
@media print {
|
||
.page {
|
||
margin: 10mm;
|
||
border: initial;
|
||
border-radius: initial;
|
||
width: initial;
|
||
min-height: initial;
|
||
box-shadow: initial;
|
||
background: initial;
|
||
page-break-after: always;
|
||
}
|
||
}
|
||
table {
|
||
width: 100%; /* 让表格宽度100%占满其父元素宽度 */
|
||
height: auto; /* 高度根据内容自适应 */
|
||
font-size: 14px;
|
||
text-align: center;
|
||
border-collapse: collapse;
|
||
margin-top: 5mm; /* 添加顶部外边距,替代原先的页内边距 */
|
||
tr{
|
||
td {
|
||
padding: 5px 0;
|
||
border: 1px solid #333;
|
||
}
|
||
}
|
||
}
|
||
.xh {
|
||
width: 50px !important;
|
||
}
|
||
.checkbox {
|
||
border: 2px solid #999;
|
||
width: 10px;
|
||
height: 10px;
|
||
display: flex;
|
||
justify-content: center;
|
||
align-items: center;
|
||
margin-left:10px ;
|
||
}
|
||
</style>
|
||
<div>
|
||
${printNode.innerHTML}
|
||
</div>`)
|
||
doc.close()
|
||
// 浏览器打印页面打开渲染
|
||
setTimeout(() => {
|
||
newIframe.contentWindow.focus()
|
||
newIframe.contentWindow.print()
|
||
document.body.removeChild(newIframe) // 移除打印内框架,下次打印下次再挂载
|
||
dialogVisible.value = false
|
||
}, 100)
|
||
}
|
||
const outopen = () => {
|
||
dialogVisible.value = false
|
||
}
|
||
const queryParams: any = ref({
|
||
code: undefined
|
||
})
|
||
const isSelected = ref([1, 3])
|
||
|
||
/** 打开弹窗 */
|
||
const open = async (type: string, id?: number) => {
|
||
dialogVisible.value = true
|
||
//图片处理
|
||
// 在组件挂载后,将Logo图片转换为Base64编码数据URL
|
||
const logoImage = new Image()
|
||
logoImage.src = urlimg // 替换为Logo图片路径
|
||
logoImage.onload = () => {
|
||
const canvas = document.createElement('canvas')
|
||
canvas.width = logoImage.width
|
||
canvas.height = logoImage.height
|
||
const context = canvas.getContext('2d')
|
||
context.drawImage(logoImage, 0, 0)
|
||
const base64String = canvas.toDataURL('image/png')
|
||
logoDataUrl.value = base64String
|
||
}
|
||
}
|
||
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
|
||
</script>
|
||
|
||
<style scoped lang="scss">
|
||
.page {
|
||
width: 29.7cm;
|
||
min-height: 42cm;
|
||
padding: 10mm;
|
||
margin: 20px auto;
|
||
border: 1px #d3d3d3 solid;
|
||
border-radius: 5px;
|
||
background: white;
|
||
box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
|
||
position: relative;
|
||
font-size: 14px !important;
|
||
}
|
||
|
||
@page {
|
||
size: A3;
|
||
margin: 0;
|
||
}
|
||
@media print {
|
||
.page {
|
||
margin: 0;
|
||
border: initial;
|
||
border-radius: initial;
|
||
width: initial;
|
||
min-height: initial;
|
||
box-shadow: initial;
|
||
background: initial;
|
||
page-break-after: always;
|
||
}
|
||
}
|
||
table {
|
||
width: 100%; /* 让表格宽度100%占满其父元素宽度 */
|
||
height: auto; /* 高度根据内容自适应 */
|
||
font-size: 14px;
|
||
text-align: center;
|
||
border-collapse: collapse;
|
||
margin-top: 5mm; /* 添加顶部外边距,替代原先的页内边距 */
|
||
tr {
|
||
td {
|
||
padding: 2px 0;
|
||
border: 1px solid #333;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
#lineTd {
|
||
background: #fff
|
||
url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiPjxsaW5lIHgxPSIwIiB5MT0iMCIgeDI9IjEwMCUiIHkyPSIxMDAlIiBzdHJva2U9ImJsYWNrIiBzdHJva2Utd2lkdGg9IjEiLz48L3N2Zz4=)
|
||
no-repeat 100% center;
|
||
}
|
||
.hr-dotted {
|
||
border: 0;
|
||
border-top: 1px dotted #a2a9b6;
|
||
border-left: 1px dotted #a2a9b6;
|
||
}
|
||
/*
|
||
A3的大小:29.7cm x 42cm( width: 419.53px; 调整为A3纸张宽度 min-height: 595.28px; 调整为A3纸张高度 )
|
||
单位换算:1 inch = 2.54 cm 1mm = 96 px 1 cm = 37.79528 px*/
|
||
</style>
|