退料单打印优化

This commit is contained in:
bb_pan 2025-08-20 11:21:28 +08:00
parent ca70f1c2cd
commit 2cefc795da
1 changed files with 400 additions and 356 deletions

View File

@ -8,185 +8,214 @@
append-to-body append-to-body
width="1090px" width="1090px"
> >
<div id="printcontent" style="height: 600px;overflow-y: scroll;padding: 0 20px;"> <div id="printcontent" style="height: 600px; overflow-y: scroll; padding: 0 20px">
<!-- <vue-easy-print tableShow ref="printRef"> --> <!-- <vue-easy-print tableShow ref="printRef"> -->
<div id="checkId"> <div id="checkId">
<div style="text-align: center;font-weight: 600;font-size: 16px;"> <div style="text-align: center; font-weight: 600; font-size: 16px">机具设备退料单</div>
机具设备退料单 <div class="info" style="margin-top: 10px; display: flex; align-items: center">
</div> <div class="item" style="width: 50%; flex-shrink: 0; margin-bottom: 5px; font-size: 14px">
<div class="info" style="margin-top: 10px; display: flex; align-items: center;">
<div class="item" style="width: 50%;flex-shrink: 0;margin-bottom: 5px;font-size: 14px;">
<div> <div>
<span>工程名称</span><span>{{ rowObj.proName }}</span> <span>工程名称</span>
<span>{{ rowObj.proName }}</span>
</div> </div>
<div> <div>
<span>退料时间</span><span>{{ rowObj.createTime }}</span> <span>退料时间</span>
<span>{{ rowObj.createTime }}</span>
</div> </div>
</div> </div>
<div class="item" style="width: 50%;flex-shrink: 0;margin-bottom: 5px;font-size: 14px;text-align: right;"> <div class="item" style="width: 50%; flex-shrink: 0; margin-bottom: 5px; font-size: 14px; text-align: right">
<div> <div>
<span>退料单位</span><span>{{ rowObj.unitName }}</span> <span>退料单位</span>
<span>{{ rowObj.unitName }}</span>
</div> </div>
<div> <div>
<span>单号</span><span>{{ rowObj.code }}</span> <span>单号</span>
<span>{{ rowObj.code }}</span>
</div> </div>
</div> </div>
</div> </div>
<el-table :data="tableData" border style="width: 100%;">
<el-table-column label="编号" align="center" type="index" width="60px"/> <table border="1.5" cellspacing="0" cellpadding="8" style="width: 100%; border-collapse: collapse">
<el-table-column label="物资类型" <thead>
align="center" <tr>
prop="materialType" <th style="width: 60px; text-align: center">编号</th>
:show-overflow-tooltip="true" <th style="width: 120px; text-align: center">物资类型</th>
width="120px" <th style="text-align: center">物资名称</th>
/> <th style="text-align: center">规格型号</th>
<el-table-column <th style="text-align: center">计量单位</th>
label="物资名称" <th style="width: 200px; text-align: center">退料数量</th>
align="center" <th style="width: 200px; text-align: center">编号</th>
prop="typeName" </tr>
:show-overflow-tooltip="true" </thead>
/> <tbody>
<el-table-column <tr v-for="(row, index) in tableData" :key="index">
label="规格型号" <!-- 序号 -->
align="center" <td style="text-align: center">{{ index + 1 }}</td>
prop="typeModel"
:show-overflow-tooltip="true" <!-- 物资类型 -->
/> <td style="text-align: center" :title="row.materialType">{{ row.materialType }}</td>
<el-table-column
label="计量单位" <!-- 物资名称 -->
align="center" <td style="text-align: center" :title="row.typeName">{{ row.typeName }}</td>
prop="unitName"
:show-overflow-tooltip="true" <!-- 规格型号 -->
/> <td style="text-align: center" :title="row.typeModel">{{ row.typeModel }}</td>
<el-table-column
label="退料数量" <!-- 计量单位 -->
align="center" <td style="text-align: center" :title="row.unitName">{{ row.unitName }}</td>
class-name="small-padding fixed-width"
width="200" <!-- 退料数量 -->
prop="preNum" <td style="text-align: center">{{ row.preNum }}</td>
>
</el-table-column> <!-- 编号 -->
<el-table-column <td style="text-align: center">
label="编号" <span v-if="row.manageType == 1">无编码</span>
align="center"
class-name="small-padding fixed-width"
width="200"
prop="num"
>
<template slot-scope="scope">
<span v-if="scope.row.manageType==1">无编码</span>
<span v-if="scope.row.manageType==0" style="color: rgb(2, 167, 240);" @click="checkDetail(scope.row)">查看明细</span>
</template>
</el-table-column>
<!-- <el-table-column prop="remarks" label="备注" align="center">
<template slot-scope="scope">
<span <span
@click="remarksClick" v-if="row.manageType == 0"
style="color: #1890ff; cursor: pointer" style="color: rgb(2, 167, 240); cursor: pointer"
>{{ scope.row.remarks }}</span @click="checkDetail(row)"
> >
</template> 查看明细
</el-table-column> --> </span>
</el-table> </td>
</tr>
</tbody>
</table>
<div class="order_footer"> <div class="order_footer">
<!-- <div>审核人</div> --> <!-- <div>审核人</div> -->
<div class="item" style="width: 28%;display: flex;align-items: center;flex-wrap: wrap;"> <div class="item" style="width: 28%; display: flex; align-items: center; flex-wrap: wrap">
<div style="width: 35%;">审核人</div> <div style="width: 35%">审核人</div>
<!-- <div style="width: 65%;display: flex;align-items: center;flex-wrap: wrap;" v-if="directAuditSignUrl"> <!-- <div style="width: 65%;display: flex;align-items: center;flex-wrap: wrap;" v-if="directAuditSignUrl">
<div style="width: 80%;margin-left: 10px;"> <div style="width: 80%;margin-left: 10px;">
<img :src="directAuditSignUrl" style="width: 40px;height: 100px;transform: rotate(-90deg);max-width: 100%;" alt=""> <img :src="directAuditSignUrl" style="width: 40px;height: 100px;transform: rotate(-90deg);max-width: 100%;" alt="">
</div> </div>
</div> --> </div> -->
</div> </div>
<div class="item" style="width: 24%;display: flex;align-items: center;flex-wrap: wrap;"> <div class="item" style="width: 24%; display: flex; align-items: center; flex-wrap: wrap">
<div style="width: 30%;">退料人</div> <div style="width: 30%">退料人</div>
<div style="width: 70%;display: flex;align-items: center;flex-wrap: wrap;" v-if="rowObj.backSignUrl"> <div style="width: 70%; display: flex; align-items: center; flex-wrap: wrap" v-if="rowObj.backSignUrl">
<div style="width: 80%;margin-left: 20px;"> <div style="width: 80%; margin-left: 20px">
<img :src="rowObj.backSignUrl" style="width: 40px;height: 100px;max-width: 100%;" :class="{'is-rotate': rowObj.backSignType == 0}" alt=""> <img
:src="rowObj.backSignUrl"
style="width: 40px; height: 100px; max-width: 100%"
:class="{ 'is-rotate': rowObj.backSignType == 0 }"
alt=""
/>
</div> </div>
</div> </div>
</div> </div>
<div class="item" style="width: 24%;display: flex;align-items: center;flex-wrap: wrap;"> <div class="item" style="width: 24%; display: flex; align-items: center; flex-wrap: wrap">
<span>制单</span> <div style="width: 30%">制单</div>
</div> </div>
</div> </div>
</div> </div>
<!-- </vue-easy-print> --> <!-- </vue-easy-print> -->
<div>
<el-button type="primary" @click="print">打印</el-button>
</div>
</div> </div>
<el-dialog :title="title" :visible.sync="open" width="1000px" append-to-body> <el-dialog :title="title" :visible.sync="open" width="1000px" append-to-body>
<div style="height: 500px;overflow-y: scroll;padding: 0 20px;"> <div style="height: 500px; overflow-y: scroll; padding: 0 20px">
<!-- <vue-easy-print tableShow ref="remarksPrintRef"> --> <!-- <vue-easy-print tableShow ref="remarksPrintRef"> -->
<div id="checkIdTwo"> <div id="checkIdTwo">
<div class="remarks_box"> <div class="remarks_box">
<div class="remarks_box_title">退料编码明细</div> <div class="remarks_box_title">退料编码明细</div>
</div> </div>
<div class="info" style="margin-top: 10px; display: flex; align-items: center;"> <div class="info" style="margin-top: 10px; display: flex; align-items: center">
<div class="item" style="width: 50%;flex-shrink: 0;margin-bottom: 5px;font-size: 14px;"> <div class="item" style="width: 50%; flex-shrink: 0; margin-bottom: 5px; font-size: 14px">
<div> <div>
<span>工程名称</span><span>{{ rowObj.proName }}</span> <span>工程名称</span>
<span>{{ rowObj.proName }}</span>
</div> </div>
<div> <div>
<span>退料时间</span><span>{{ rowObj.createTime }}</span> <span>退料时间</span>
<span>{{ rowObj.createTime }}</span>
</div> </div>
</div> </div>
<div class="item" style="width: 50%;flex-shrink: 0;margin-bottom: 5px;font-size: 14px;text-align: right;"> <div
class="item"
style="width: 50%; flex-shrink: 0; margin-bottom: 5px; font-size: 14px; text-align: right"
>
<div> <div>
<span>退料单位</span><span>{{ rowObj.unitName }}</span> <span>退料单位</span>
<span>{{ rowObj.unitName }}</span>
</div> </div>
<div> <div>
<span>单号</span><span>{{ rowObj.code }}</span> <span>单号</span>
<span>{{ rowObj.code }}</span>
</div> </div>
</div> </div>
</div> </div>
<el-table :data="tableSubData" border style="width: 100%;">
<el-table-column label="序号" align="center" type="index" width="60px"/> <table border="1" cellspacing="0" cellpadding="8" style="width: 100%; border-collapse: collapse">
<el-table-column prop="materialType" label="物资类型" align="center"> <thead>
</el-table-column> <tr>
<el-table-column prop="typeName" label="物资名称" align="center"> <th style="width: 60px; text-align: center">序号</th>
</el-table-column> <th style="text-align: center">物资类型</th>
<el-table-column prop="materialName" label="规格型号" align="center"> <th style="text-align: center">物资名称</th>
</el-table-column> <th style="text-align: center">规格型号</th>
<el-table-column prop="maCode" label="设备编号" align="center"> <th style="text-align: center">设备编号</th>
</el-table-column> </tr>
</el-table> </thead>
<tbody>
<tr v-for="(row, index) in tableSubData" :key="index">
<!-- 序号 -->
<td style="text-align: center">{{ index + 1 }}</td>
<!-- 物资类型 -->
<td style="text-align: center">{{ row.materialType }}</td>
<!-- 物资名称 -->
<td style="text-align: center">{{ row.typeName }}</td>
<!-- 规格型号 -->
<td style="text-align: center">{{ row.materialName }}</td>
<!-- 设备编号 -->
<td style="text-align: center">{{ row.maCode }}</td>
</tr>
</tbody>
</table>
<div class="order_footer"> <div class="order_footer">
<div class="item" style="width: 28%;display: flex;align-items: center;flex-wrap: wrap;"> <div class="item" style="width: 28%; display: flex; align-items: center; flex-wrap: wrap">
<div style="width: 35%;">审核人</div> <div style="width: 35%">审核人</div>
<div style="width: 65%;display: flex;align-items: center;flex-wrap: wrap;" v-if="directAuditSignUrl"> <div style="width: 65%; display: flex; align-items: center; flex-wrap: wrap" v-if="directAuditSignUrl">
<div style="width: 80%;margin-left: 10px;"> <div style="width: 80%; margin-left: 10px">
<img :src="directAuditSignUrl" style="width: 40px;height: 100px;transform: rotate(-90deg);max-width: 100%;" alt=""> <img
:src="directAuditSignUrl"
style="width: 40px; height: 100px; transform: rotate(-90deg); max-width: 100%"
alt=""
/>
</div> </div>
</div> </div>
</div> </div>
<div class="item" style="width: 24%;display: flex;align-items: center;flex-wrap: wrap;"> <div class="item" style="width: 24%; display: flex; align-items: center; flex-wrap: wrap">
<span>退料人</span> <div style="width: 30%">退料人</div>
</div> </div>
<div class="item" style="width: 24%;display: flex;align-items: center;flex-wrap: wrap;"> <div class="item" style="width: 24%; display: flex; align-items: center; flex-wrap: wrap">
<span>制单</span> <div style="width: 30%">制单</div>
</div> </div>
</div> </div>
</div> </div>
<!-- </vue-easy-print> --> <!-- </vue-easy-print> -->
</div> </div>
<div style="margin-top: 10px"> <div slot="footer" class="dialog-footer" style="text-align: center">
<el-button type="primary" @click="remarksPrint">打印</el-button> <el-button type="primary" @click="remarksPrint">打印</el-button>
<el-button @click="open = false"> </el-button>
</div> </div>
</el-dialog> </el-dialog>
<div slot="footer" class="dialog-footer" style="text-align: center">
<el-button type="primary" @click="print">打印</el-button>
<el-button @click="dialogShowFlag = false"> </el-button>
</div>
</el-dialog> </el-dialog>
</template> </template>
<script> <script>
import vueEasyPrint from 'vue-easy-print'; import vueEasyPrint from 'vue-easy-print'
import { import { getBackApplyInfo, updatePrintStatus } from '@/api/back/index.js'
getBackApplyInfo, import html2canvas from 'html2canvas'
updatePrintStatus, import jsPDF from 'jspdf'
} from '@/api/back/index.js' import printJS from 'print-js'
import html2canvas from 'html2canvas'; import request from '@/utils/request'
import jsPDF from 'jspdf';
import printJS from 'print-js';
import request from "@/utils/request";
// import { getViewByApply,materialReturnNoteByApply } from "@/api/claimAndRefund/return.js" // import { getViewByApply,materialReturnNoteByApply } from "@/api/claimAndRefund/return.js"
export default { export default {
components: { vueEasyPrint }, components: { vueEasyPrint },
@ -199,12 +228,12 @@ export default {
// //
priKey: { priKey: {
type: [String, Number], type: [String, Number],
default: "" default: ''
}, },
// //
dialogTitle: { dialogTitle: {
type: String, type: String,
default: "" default: ''
}, },
rowObj: { rowObj: {
type: Object, type: Object,
@ -214,17 +243,17 @@ export default {
watch: { watch: {
isShowFlag(val) { isShowFlag(val) {
if (val) { if (val) {
this.init(); this.init()
} }
} }
}, },
computed: { computed: {
dialogShowFlag: { dialogShowFlag: {
get() { get() {
return this.isShowFlag; return this.isShowFlag
}, },
set(v) { set(v) {
this.$emit("update:isShowFlag", v); this.$emit('update:isShowFlag', v)
} }
} }
}, },
@ -234,9 +263,9 @@ export default {
tableData: [], tableData: [],
tableSubData: [], tableSubData: [],
open: false, open: false,
title: "", title: '',
directAuditSignUrl: '', directAuditSignUrl: ''
}; }
}, },
methods: { methods: {
init() { init() {
@ -248,158 +277,167 @@ export default {
console.log(res) console.log(res)
this.tableData = res.data.backApplyDetailsList this.tableData = res.data.backApplyDetailsList
this.directAuditSignUrl = res.data.backApplyInfo.directAuditSignUrl this.directAuditSignUrl = res.data.backApplyInfo.directAuditSignUrl
console.log('222222222',this.directAuditSignUrl) console.log('222222222', this.directAuditSignUrl)
}) })
}, },
// //
cancel() { cancel() {
this.dialogShowFlag = false; this.dialogShowFlag = false
}, },
print() { print() {
const element = document.getElementById('checkId'); const element = document.getElementById('checkId')
// //
if (!element) { if (!element) {
this.$message.error('未找到要打印的元素'); this.$message.error('未找到要打印的元素')
return; return
} }
this.$modal.loading('正在生成单据,请稍候...'); this.$modal.loading('正在生成单据,请稍候...')
// //
const images = element.querySelectorAll('img'); const images = element.querySelectorAll('img')
const imagePromises = []; const imagePromises = []
// Promise // Promise
images.forEach(img => { images.forEach(img => {
// //
if (img.complete) return; if (img.complete) return
const promise = new Promise((resolve) => { const promise = new Promise(resolve => {
const originalSrc = img.src; const originalSrc = img.src
// //
img.onload = function() { img.onload = function () {
resolve(); resolve()
}; }
// 使 // 使
img.onerror = function() { img.onerror = function () {
console.log('图片加载失败,使用空白图片替代:', originalSrc); console.log('图片加载失败,使用空白图片替代:', originalSrc)
img.src = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=='; // 1x1 img.src = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==' // 1x1
resolve(); resolve()
}; }
}); })
imagePromises.push(promise); imagePromises.push(promise)
}); })
// PDF // PDF
Promise.all(imagePromises).then(() => { Promise.all(imagePromises)
.then(() => {
// 使html2canvasDOMcanvas // 使html2canvasDOMcanvas
html2canvas(element, { html2canvas(element, {
scale: 2, // scale: 2, //
useCORS: true, // useCORS: true, //
allowTaint: true, allowTaint: true,
ignoreElements: (element) => { ignoreElements: element => {
// //
return element.nodeName === 'IMG' && !element.complete; return element.nodeName === 'IMG' && !element.complete
}, },
logging: false, // logging: false, //
imageTimeout: 3000, // imageTimeout: 3000, //
backgroundColor: '#ffffff' backgroundColor: '#ffffff'
}).then(canvas => { })
.then(canvas => {
// PDF // PDF
const pdf = new jsPDF('p', 'mm', 'a4'); const pdf = new jsPDF('p', 'mm', 'a4')
// canvas // canvas
const imgWidth = 210; // A4(mm) const imgWidth = 210 // A4(mm)
const pageHeight = 297; // A4(mm) const pageHeight = 297 // A4(mm)
const imgHeight = canvas.height * imgWidth / canvas.width; const imgHeight = (canvas.height * imgWidth) / canvas.width
// canvas // canvas
const imgData = canvas.toDataURL('image/jpeg', 1.0); const imgData = canvas.toDataURL('image/jpeg', 1.0)
// PDF // PDF
pdf.addImage(imgData, 'JPEG', 0, 0, imgWidth, imgHeight); pdf.addImage(imgData, 'JPEG', 0, 0, imgWidth, imgHeight)
// PDF // PDF
const fileName = `退料单_${this.rowObj.code || '未命名'}_${new Date().getTime()}.pdf`; const fileName = `退料单_${this.rowObj.code || '未命名'}_${new Date().getTime()}.pdf`
// PDFBlob // PDFBlob
const pdfBlob = pdf.output('blob'); const pdfBlob = pdf.output('blob')
// FormData // FormData
const formData = new FormData(); const formData = new FormData()
formData.append('file', pdfBlob, fileName); formData.append('file', pdfBlob, fileName)
formData.append('id', this.rowObj.proId); formData.append('id', this.rowObj.proId)
// //
this.$modal.closeLoading(); this.$modal.closeLoading()
// API - 使request // API - 使request
request.post('/material/back_apply_info/uploadPdf', formData, { request
.post('/material/back_apply_info/uploadPdf', formData, {
headers: { headers: {
'Content-Type': 'multipart/form-data' 'Content-Type': 'multipart/form-data'
} }
}).then(response => { })
.then(response => {
if (response.code === 200) { if (response.code === 200) {
this.$modal.msgSuccess('单据文件已保存到服务器'); this.$modal.msgSuccess('单据文件已保存到服务器')
// //
printJS({ printJS({
printable: 'checkId', printable: 'checkId',
type: 'html', type: 'html',
targetStyles: ['*'], targetStyles: ['*'],
maxWidth:'1400' maxWidth: '1400'
}); })
// //
updatePrintStatus(this.rowObj.id).then(response => { updatePrintStatus(this.rowObj.id)
.then(response => {
if (response.code === 200) { if (response.code === 200) {
// //
this.$emit('refresh'); this.$emit('refresh')
} }
}).catch(() => { })
this.$modal.msgError("打印状态更新失败"); .catch(() => {
}); this.$modal.msgError('打印状态更新失败')
})
} else { } else {
this.$modal.msgError('保存单据文件失败'); this.$modal.msgError('保存单据文件失败')
} }
}).catch(() => { })
this.$modal.msgError('上传单据文件时发生错误'); .catch(() => {
this.$modal.msgError('上传单据文件时发生错误')
// 使 // 使
printJS({ printJS({
printable: 'checkId', printable: 'checkId',
type: 'html', type: 'html',
targetStyles: ['*'], targetStyles: ['*'],
maxWidth:'1400' maxWidth: '1400'
}); })
// //
updatePrintStatus(this.rowObj.id).then(response => { updatePrintStatus(this.rowObj.id)
.then(response => {
if (response.code === 200) { if (response.code === 200) {
// //
this.$emit('refresh'); this.$emit('refresh')
} }
}).catch(() => { })
this.$modal.msgError("打印状态更新失败"); .catch(() => {
}); this.$modal.msgError('打印状态更新失败')
}); })
}).catch(error => { })
this.$modal.closeLoading(); })
this.$modal.msgError('生成单据时发生错误'); .catch(error => {
console.error('生成单据错误:', error); this.$modal.closeLoading()
}); this.$modal.msgError('生成单据时发生错误')
}).catch(error => { console.error('生成单据错误:', error)
this.$modal.closeLoading(); })
this.$modal.msgError('处理图片时发生错误'); })
console.error('处理图片错误:', error); .catch(error => {
}); this.$modal.closeLoading()
this.$modal.msgError('处理图片时发生错误')
console.error('处理图片错误:', error)
})
}, },
checkDetail(row) { checkDetail(row) {
this.title = '查看' this.title = '查看'
@ -407,131 +445,137 @@ export default {
this.open = true this.open = true
}, },
remarksPrint() { remarksPrint() {
const element = document.getElementById('checkIdTwo'); const element = document.getElementById('checkIdTwo')
// //
if (!element) { if (!element) {
this.$message.error('未找到要打印的元素'); this.$message.error('未找到要打印的元素')
return; return
} }
this.$modal.loading('正在生成单据,请稍候...'); this.$modal.loading('正在生成单据,请稍候...')
// //
const images = element.querySelectorAll('img'); const images = element.querySelectorAll('img')
const imagePromises = []; const imagePromises = []
// Promise // Promise
images.forEach(img => { images.forEach(img => {
// //
if (img.complete) return; if (img.complete) return
const promise = new Promise((resolve) => { const promise = new Promise(resolve => {
const originalSrc = img.src; const originalSrc = img.src
// //
img.onload = function() { img.onload = function () {
resolve(); resolve()
}; }
// 使 // 使
img.onerror = function() { img.onerror = function () {
console.log('图片加载失败,使用空白图片替代:', originalSrc); console.log('图片加载失败,使用空白图片替代:', originalSrc)
img.src = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=='; // 1x1 img.src = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==' // 1x1
resolve(); resolve()
}; }
}); })
imagePromises.push(promise); imagePromises.push(promise)
}); })
// PDF // PDF
Promise.all(imagePromises).then(() => { Promise.all(imagePromises)
.then(() => {
// 使html2canvasDOMcanvas // 使html2canvasDOMcanvas
html2canvas(element, { html2canvas(element, {
scale: 2, // scale: 2, //
useCORS: true, // useCORS: true, //
allowTaint: true, allowTaint: true,
ignoreElements: (element) => { ignoreElements: element => {
// //
return element.nodeName === 'IMG' && !element.complete; return element.nodeName === 'IMG' && !element.complete
}, },
logging: false, // logging: false, //
imageTimeout: 3000, // imageTimeout: 3000, //
backgroundColor: '#ffffff' backgroundColor: '#ffffff'
}).then(canvas => { })
.then(canvas => {
// PDF // PDF
const pdf = new jsPDF('p', 'mm', 'a4'); const pdf = new jsPDF('p', 'mm', 'a4')
// canvas // canvas
const imgWidth = 210; // A4(mm) const imgWidth = 210 // A4(mm)
const pageHeight = 297; // A4(mm) const pageHeight = 297 // A4(mm)
const imgHeight = canvas.height * imgWidth / canvas.width; const imgHeight = (canvas.height * imgWidth) / canvas.width
// canvas // canvas
const imgData = canvas.toDataURL('image/jpeg', 1.0); const imgData = canvas.toDataURL('image/jpeg', 1.0)
// PDF // PDF
pdf.addImage(imgData, 'JPEG', 0, 0, imgWidth, imgHeight); pdf.addImage(imgData, 'JPEG', 0, 0, imgWidth, imgHeight)
// PDF // PDF
const fileName = `退料编码明细_${this.rowObj.code || '未命名'}_${new Date().getTime()}.pdf`; const fileName = `退料编码明细_${this.rowObj.code || '未命名'}_${new Date().getTime()}.pdf`
// PDFBlob // PDFBlob
const pdfBlob = pdf.output('blob'); const pdfBlob = pdf.output('blob')
// FormData // FormData
const formData = new FormData(); const formData = new FormData()
formData.append('file', pdfBlob, fileName); formData.append('file', pdfBlob, fileName)
formData.append('id', this.rowObj.proId); formData.append('id', this.rowObj.proId)
// //
this.$modal.closeLoading(); this.$modal.closeLoading()
// API - 使request // API - 使request
request.post('/material/back_apply_info/uploadPdf', formData, { request
.post('/material/back_apply_info/uploadPdf', formData, {
headers: { headers: {
'Content-Type': 'multipart/form-data' 'Content-Type': 'multipart/form-data'
} }
}).then(response => { })
.then(response => {
if (response.code === 200) { if (response.code === 200) {
this.$modal.msgSuccess('单据PDF文件已保存到服务器'); this.$modal.msgSuccess('单据PDF文件已保存到服务器')
// //
printJS({ printJS({
printable: 'checkIdTwo', printable: 'checkIdTwo',
type: 'html', type: 'html',
targetStyles: ['*'], targetStyles: ['*'],
maxWidth:'1400' maxWidth: '1400'
}); })
} else { } else {
this.$modal.msgError('保存明细单据文件失败'); this.$modal.msgError('保存明细单据文件失败')
} }
}).catch(() => { })
this.$modal.msgError('上传明细单据文件时发生错误'); .catch(() => {
this.$modal.msgError('上传明细单据文件时发生错误')
// 使 // 使
printJS({ printJS({
printable: 'checkIdTwo', printable: 'checkIdTwo',
type: 'html', type: 'html',
targetStyles: ['*'], targetStyles: ['*'],
maxWidth:'1400' maxWidth: '1400'
}); })
}); })
}).catch(error => { })
this.$modal.closeLoading(); .catch(error => {
this.$modal.msgError('生成单据时发生错误'); this.$modal.closeLoading()
console.error('生成单据错误:', error); this.$modal.msgError('生成单据时发生错误')
}); console.error('生成单据错误:', error)
}).catch(error => { })
this.$modal.closeLoading(); })
this.$modal.msgError('处理图片时发生错误'); .catch(error => {
console.error('处理图片错误:', error); this.$modal.closeLoading()
}); this.$modal.msgError('处理图片时发生错误')
}, console.error('处理图片错误:', error)
})
} }
}; }
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
// .order_box { // .order_box {