qa-prevention-gwj-vue/src/views/gf/confinedspace/pigeonhole/components/detail.vue

412 lines
15 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div>
<div id="printTest" class="app-container print-work">
<el-page-header content="审批表详情" class="no-print" @back="goBack"/>
<div v-for="pdf in 2" :key="pdf" :name="pdf === 2 ? 'pdf-box' : ''" class="pdf-content">
<table :class="['table-ui','table-ui' + pdf]">
<tr>
<td colspan="10" style="border: none">
<div class="level-title mt-20">
<h1>受限空间安全作业票</h1>
<div class="level-code">编号:{{ pd.CHECK_NO }}</div>
</div>
</td>
</tr>
<tr>
<td class="bbg">作业申请单位</td>
<td colspan="5">{{ pd.APPLY_DEPARTMENT_NAME }}</td>
<td class="bbg">作业申请时间</td>
<td colspan="3">{{ pd.CREATTIME }}</td>
</tr>
<tr>
<td class="bbg">受限空间名称</td>
<td colspan="5">{{ pd.LIMITSPACE_NAME }}</td>
<td class="bbg">受限空间内原有介质名称</td>
<td colspan="3">{{ pd.MEDIUM_NAME }}</td>
</tr>
<tr>
<td class="bbg">作业内容</td>
<td colspan="9">{{ pd.WORK_CONTENT }}</td>
</tr>
<tr>
<td class="bbg">作业单位</td>
<td colspan="5">{{ pd.CONFIRM_DEPARTMENT_NAME }}</td>
<td class="bbg">作业负责人</td>
<td colspan="3">{{ pd.CONFIRM_USER_NAME }}</td>
</tr>
<tr>
<td class="bbg">作业人</td>
<td colspan="5">{{ pd.WORK_USER }}</td>
<td class="bbg">监护人</td>
<td colspan="5">
<div v-if="pd.GUARDIAN_USER_SIGNER_PATH" style="text-align: right">
<span>签字:</span>
<img v-viewer :src="config.fileUrl + pd.GUARDIAN_USER_SIGNER_PATH" alt="" width="100" height="100">
<span>{{ pd.GUARDIAN_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr>
<td class="bbg">关联的其他特殊作业及安全作业票编号</td>
<td colspan="9">{{ pd.SPECIAL_WORK }}</td>
</tr>
<tr>
<td class="bbg">风险辨识结果</td>
<td colspan="9">{{ pd.RISK_IDENTIFICATION }}</td>
</tr>
<tr>
<td :rowspan="3 + gasList.length" class="bbg">气体分析</td>
<td class="bbg" rowspan="2">分析项目</td>
<td class="bbg" colspan="2">有毒有害气体名称</td>
<td class="bbg" colspan="2">可燃气体名称</td>
<td class="bbg" rowspan="2">氧气含量</td>
<td class="bbg" rowspan="3">取样分析时间</td>
<td class="bbg" rowspan="3">分析部位</td>
<td class="bbg" rowspan="3">分析人</td>
</tr>
<tr>
<td :style="{padding:gas.GAS_NAME1 ? '8px' : '16px'}">{{ gas.GAS_NAME1 }}</td>
<td :style="{padding:gas.GAS_NAME2 ? '8px' : '16px'}">{{ gas.GAS_NAME2 }}</td>
<td :style="{padding:gas.GAS_NAME3 ? '8px' : '16px'}">{{ gas.GAS_NAME3 }}</td>
<td :style="{padding:gas.GAS_NAME4 ? '8px' : '16px'}">{{ gas.GAS_NAME4 }}</td>
</tr>
<tr>
<td class="bbg">合格标准</td>
<td>{{ gas.GAS_STANDARD1 }}</td>
<td>{{ gas.GAS_STANDARD2 }}</td>
<td>{{ gas.GAS_STANDARD3 }}</td>
<td>{{ gas.GAS_STANDARD4 }}</td>
<td>19.5% 〜21%(体积分数)</td>
</tr>
<tr v-for="(item,index) in gasList" :key="index">
<td v-if="index === 0" :rowspan="gasList.length" class="bbg">分析数据</td>
<td><span v-if="gas.GAS_NAME1">{{ item.DATA1 }}</span></td>
<td><span v-if="gas.GAS_NAME2">{{ item.DATA2 }}</span></td>
<td><span v-if="gas.GAS_NAME3">{{ item.DATA3 }}</span></td>
<td><span v-if="gas.GAS_NAME4">{{ item.DATA4 }}</span></td>
<td>{{ item.OXYGEN_CONTENT }}</td>
<td>{{ item.ANALYZE_TIME }}</td>
<td>{{ item.ANALYZE_PLACE }}</td>
<td>{{ item.ANALYZE_USER }}</td>
</tr>
<tr>
<td class="bbg">作业实施时间</td>
<td colspan="9">{{ pd.WORK_START_DATE }}至{{ pd.WORK_END_DATE }}止</td>
</tr>
<tr>
<td colspan="10">
<table class="table-ui">
<tr>
<td>序号</td>
<td>安全措施</td>
<td style="width: 100px">是否涉及</td>
<td style="width: 100px">确认人</td>
</tr>
<tr v-for="(item,index) in measuresList" :key="index">
<td>{{ index + 1 }}</td>
<td>
{{ item.PROTECTIVE_MEASURES }}
</td>
<td>
<span v-if="item.STATUS=='1'"><input type="radio" disabled checked>&nbsp;&nbsp;&nbsp;</span>
<span v-if="item.STATUS=='-1'"><input type="radio" disabled checked>不涉及</span>
</td>
<td>
{{ item.CONFIRM_NAME }}
</td>
</tr>
<tr v-if="pd.CONFIRM_USER_MEASURES || pd.APPROVE_USER_MEASURES" >
<td >{{ measuresList.length + 1 }}</td>
<td colspan="3">
<div v-if="pd.CONFIRM_USER_MEASURES" style="display: flex;justify-content: space-between;">
<span>其他安全措施:{{ pd.CONFIRM_USER_MEASURES }}</span>
<span>编制人:{{ pd.CONFIRM_USER_NAME }}</span>
</div>
<div v-if="pd.APPROVE_USER_MEASURES" style="display: flex;justify-content: space-between;">
<span>其他安全措施:{{ pd.APPROVE_USER_MEASURES }}</span>
<span>编制人:{{ pd.APPROVE_USER_NAME }}</span>
</div>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="bbg">安全交底人</td>
<td colspan="10">
<div v-if="pd.CONFESS_USER_SIGNER_PATH" style="text-align: right">
<span>签字:</span>
<img v-viewer :src="config.fileUrl + pd.CONFESS_USER_SIGNER_PATH" alt="" width="100" height="100">
<span>{{ pd.CONFESS_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr>
<td class="bbg">接受交底人</td>
<td colspan="10">
<div v-for="item in imgList" :key="item.ACCEPT_CONFESS_ID" style="text-align: right">
<span>签字:</span>
<img v-viewer :src="config.fileUrl + item.ACCEPT_CONFESS_USER_SIGNER_PATH" alt="" width="100" height="100">
<span>{{ item.ACCEPT_CONFESS_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr v-if="pd.CONFIRM_USER_SIGNER_PATH">
<td colspan="10">
<div>作业负责人意见:{{ pd.CONFIRM_CONTENT }}</div>
<div style="text-align: right">
<span>签字:</span>
<img v-viewer :src="config.fileUrl + pd.CONFIRM_USER_SIGNER_PATH" alt="" width="100" height="100">
<span>{{ pd.CONFIRM_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr v-if="pd.APPROVE_USER_SIGNER_PATH">
<td colspan="10">
<div>所在单位意见:{{ pd.APPROVE_CONTENT }}</div>
<div style="text-align: right">
<span>签字:</span>
<img v-viewer :src="config.fileUrl + pd.APPROVE_USER_SIGNER_PATH" alt="" width="100" height="100">
<span>{{ pd.APPROVE_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr v-if="imgList1.length>0">
<td colspan="10">
<div>完工验收:{{ pd.ACCEPT_CONTENT }}</div>
<div v-for="item in imgList1" :key="item.ACCEPT_CONFESS_ID" style="text-align: right">
<span>签字:</span>
<img v-viewer :src="config.fileUrl + item.ACCEPT_USER_SIGNER_PATH" alt="" width="100" height="100">
<span>{{ item.ACCEPT_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
</table>
</div>
</div>
<div style="padding-top: 100px"/>
<div class="ui-foot">
<!-- <el-button v-print="'#printTest'" icon="el-icon-printer" type="primary">打 印</el-button>-->
<el-button type="primary" icon="el-icon-printer" @click="handle2PDF">PDF导出</el-button>
<el-button icon="el-icon-arrow-left" @click="goBack">返 回</el-button>
</div>
</div>
</template>
<script>
import { requestFN } from '@/utils/request'
import dateformat from '@/utils/dateformat'
import JsPDF from 'jspdf'
import html2Canvas from 'html2canvas'
export default {
data() {
return {
config: config,
CONFINEDSPACE_ID: this.$parent.CONFINEDSPACE_ID, // 主键ID
pd: [], // 存放字段参数
measuresList: [],
gasList: [],
imgList: [],
imgList1: [],
gas: {},
otherProtectiveMeasures: []
}
},
created() {
this.getData()
},
methods: {
handle2PDF() {
const loading = this.$loading({
lock: true,
text: '正在生成,请稍候...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
})
const elements = document.querySelectorAll('div[name="pdf-box"]')
console.log(elements)
this.html2pdf(this.pd.CHECK_NO + '审批表详情', elements, loading)
},
html2pdf(filename, els, loading) {
const flagArr = []
for (let i = 0, len = els.length; i < len; i++) {
flagArr.push(0)
}
console.log(flagArr)
runself(0)
const pdf = new JsPDF('', 'pt', 'a4') // A4纸纵向
function runself(index) {
const html = els[index]
html2Canvas(html, {
allowTaint: true,
taintTest: false,
logging: false,
useCORS: true,
scale: 2 // 按比例增加分辨率
}).then(canvas => {
// eslint-disable-next-line one-var
var ctx = canvas.getContext('2d'),
a4w = 532.28, a4h = 781.89, // A4大小210mm x 297mm四边各保留10mm的边距显示区域190x277 pt:592.28 * 841.89
renderedHeight = 0
const allTrs = html.querySelectorAll('tr')
while (renderedHeight < canvas.height) {
let imgHeight = Math.floor(a4h * canvas.width / a4w) // 按A4显示比例换算一页图像的像素高度
for (let i = 0; i < allTrs.length; i++) {
const tr = allTrs[i]
const trHeight = tr.offsetHeight + tr.offsetTop
console.log('offsetHeight:' + tr.offsetHeight + 'offsetTop:' + tr.offsetTop + 'offsetParent:' + tr.offsetParent.offsetTop)
if (trHeight * 2 > (imgHeight + renderedHeight)) {
const btr = allTrs[i - 1]
const btrHeight = btr.offsetHeight + btr.offsetTop
console.log('i:' + (i - 1) + 'btrHeight:' + btrHeight)
imgHeight = btrHeight * 2 - renderedHeight
break
}
}
var page = document.createElement('canvas')
page.width = canvas.width
page.height = Math.min(imgHeight, canvas.height - renderedHeight)// 可能内容不足一页
// 用getImageData剪裁指定区域并画到前面创建的canvas对象中
page.getContext('2d').putImageData(ctx.getImageData(0, renderedHeight, canvas.width, Math.min(imgHeight, canvas.height - renderedHeight)), 0, 0)
pdf.addImage(page.toDataURL('image/jpeg', 1.0), 'JPEG', 30, 30, a4w, Math.min(a4h, a4w * page.height / page.width)) // 添加图像到页面保留10mm边距
renderedHeight += imgHeight
if (renderedHeight < canvas.height) {
pdf.addPage()// 如果后面还有内容,添加一个空页
}
}
if (index < els.length - 1) {
pdf.addPage()
}
return 1
}).then(item => {
flagArr[index] = item
if (flagArr.every(f => f === 1)) {
pdf.save(filename)
}
index++
if (index < els.length) {
runself(index)
} else {
loading.close()
}
})
}
},
validStr(str) {
if (str != null && str != '' && typeof (str) != 'undefined' && str != 0) { return true }
return false
},
formatTime(date, column) {
if (date) {
return dateformat(date, 'YYYY年MM月DD日HH时mm分')
} else {
return ''
}
},
formatDate(date, column) {
if (date) {
return dateformat(date, 'YYYY-MM-DD')
} else {
return ''
}
},
getRowKey(row) {
return row.CONFINEDSPACE_ID
},
getData() {
this.listLoading = true
requestFN(
'/gfConfinedSpace/goEdit',
{
CONFINEDSPACE_ID: this.CONFINEDSPACE_ID
}
).then((data) => {
this.listLoading = false
this.pd = data.pd // 参数map
this.imgList = data.imgList
this.imgList1 = data.imgList1
for (let i = 0; i < data.measuresList.length; i++) {
// 将字符串转成数组
const PROTECTIVE_MEASURES = data.measuresList[i].PROTECTIVE_MEASURES.split('')
for (let j = 1; j <= 3; j++) {
// 判断字符串是否存在
if (this.findCharIndex(PROTECTIVE_MEASURES, '', j) !== -1) {
// 给字符串后面添加上需要的数据
PROTECTIVE_MEASURES.splice(
this.findCharIndex(PROTECTIVE_MEASURES, '', j) + 1,
0,
data.measuresList[i]['ANSWER' + j]
)
}
}
// 将数组转回字符串
data.measuresList[i].PROTECTIVE_MEASURES = PROTECTIVE_MEASURES.join('')
}
this.measuresList = data.measuresList // 参数map
this.gasList = data.gasList // 参数map
this.gas = data.gas || {} // 参数map
this.pd.CONFIRM_USER_MEASURES = this.pd.OTHER_PROTECTIVE_MEASURES.split(';_;')[0]
this.pd.APPROVE_USER_MEASURES = this.pd.OTHER_PROTECTIVE_MEASURES.split(';_;')[1]
}).catch((e) => {
this.listLoading = false
})
},
// 查找字符串第几次出现的位置
findCharIndex(str, char, num) {
let index = str.indexOf(char)
for (let i = 0; i < num - 1; i++) {
index = str.indexOf(char, index + 1)
}
return index
},
goBack() {
this.$parent.activeName = 'List'
}
}
}
</script>
<style lang="sass" scoped>
.print-approval-p10
padding: 20px 0
span
vertical-align: middle
.print-approval-img
width: 200px
height: 97px
display: inline-block
img
width: 100%
height: 100%
</style>
<style scoped lang="scss">
.table-ui td{
line-height: unset;
}
.pdf-content[name=pdf-box]{
position: absolute;
left: -999999px;
.level-title {
h1{
font-size: 20px;
}
.level-code{
font-size: 20px;
}
}
td{
font-size: 20px;
}
.bbg {
width: 180px;
}
}
</style>