You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
495 lines
21 KiB
495 lines
21 KiB
4 years ago
|
<template>
|
||
|
<div class="box">
|
||
|
<div class="exp-header">
|
||
|
<div class="flex-between">
|
||
|
<div class="per_title" v-preventReClick @click="goback()">
|
||
|
<i class="el-icon-arrow-left"></i>
|
||
|
<span class="per_back">返回</span>
|
||
|
<span class="per_school">查看报告</span>
|
||
|
</div>
|
||
|
<div>
|
||
|
<el-button type="primary" size="mini" @click="exportPage">导出实验报告</el-button>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
<el-row :gutter="200">
|
||
|
<el-col :span="24">
|
||
|
<div id="pdfDom">
|
||
|
<h6 style="text-align: center;font-size: 20px">标准实验报告</h6>
|
||
|
<div class="flex-center mgb20 user_header">
|
||
|
<p class="addhr_tag"></p>
|
||
|
<span style="font-size: 18px">基本信息</span>
|
||
|
</div>
|
||
|
|
||
|
<div>
|
||
|
<el-table :data="infoData" class="info-table" style="margin-bottom: 40px" header-align="center">
|
||
|
<el-table-column prop="userName" label="学生姓名" align="center">
|
||
|
</el-table-column>
|
||
|
<el-table-column prop="workNumber" label="学生学号" align="center">
|
||
|
</el-table-column>
|
||
|
<el-table-column prop="className" label="学生班级" align="center">
|
||
|
</el-table-column>
|
||
|
<el-table-column prop="teacherName" label="指导老师" align="center">
|
||
|
</el-table-column>
|
||
|
<el-table-column prop="period" label="实验学时" align="center">
|
||
|
</el-table-column>
|
||
|
<el-table-column prop="laboratory" label="实验室名称" align="center">
|
||
|
</el-table-column>
|
||
|
<el-table-column prop="startTime" label="实验时间" align="center">
|
||
|
</el-table-column>
|
||
|
<el-table-column prop="score" label="实验成绩" align="center">
|
||
|
</el-table-column>
|
||
|
</el-table>
|
||
|
</div>
|
||
|
|
||
|
<div class="mgb20">
|
||
|
<div class="meta-title-wrap">
|
||
|
<p class="meta-title"><i class="el-icon-discount"></i> 实验项目名称</p>
|
||
|
</div>
|
||
|
<el-input v-model="form.projectName" type="textarea" :disabled="true" rows="5"></el-input>
|
||
|
</div>
|
||
|
|
||
|
<div class="mgb20">
|
||
|
<div class="meta-title-wrap">
|
||
|
<p class="meta-title"><i class="el-icon-discount"></i> 实验目的</p>
|
||
|
</div>
|
||
|
<el-input v-model="form.purpose" type="textarea" :disabled="true" rows="5"></el-input>
|
||
|
</div>
|
||
|
|
||
|
<div class="mgb20">
|
||
|
<div class="meta-title-wrap">
|
||
|
<p class="meta-title"><i class="el-icon-discount"></i> 实验原理</p>
|
||
|
</div>
|
||
|
<el-input v-model="form.principle" type="textarea" :disabled="true" rows="5"></el-input>
|
||
|
</div>
|
||
|
|
||
|
<div class="mgb20">
|
||
|
<div class="meta-title-wrap">
|
||
|
<p class="meta-title"><i class="el-icon-discount"></i> 实验内容</p>
|
||
|
</div>
|
||
|
<el-input v-model="form.content" type="textarea" :disabled="true" rows="5"></el-input>
|
||
|
</div>
|
||
|
|
||
|
<div class="mgb20">
|
||
|
<div class="meta-title-wrap">
|
||
|
<p class="meta-title"><i class="el-icon-discount"></i> 实验器材(设备、元器件)</p>
|
||
|
</div>
|
||
|
<el-input v-model="form.equipment" type="textarea" :disabled="true" rows="5"></el-input>
|
||
|
</div>
|
||
|
|
||
|
<div class="mgb20">
|
||
|
<div class="meta-title-wrap">
|
||
|
<p class="meta-title"><i class="el-icon-discount"></i> 实验步骤</p>
|
||
|
</div>
|
||
|
<el-input v-model="form.step" type="textarea" :disabled="true" rows="5"></el-input>
|
||
|
</div>
|
||
|
|
||
|
<div class="mgb20">
|
||
|
<div class="meta-title-wrap">
|
||
|
<p class="meta-title">实验数据</p>
|
||
|
<!-- <span>得分:50/60</span> -->
|
||
|
</div>
|
||
|
<el-table :data="sjData" class="table" stripe header-align="center">
|
||
|
<el-table-column type="index" width="100" label="序号" align="center">
|
||
|
<template slot-scope="scope">
|
||
|
{{scope.$index + 1}}
|
||
|
</template>
|
||
|
</el-table-column>
|
||
|
<el-table-column prop="judgmentPointsName" label="考核点" align="center">
|
||
|
</el-table-column>
|
||
|
<el-table-column prop="userAnswers" label="学生答案" align="center">
|
||
|
<template slot-scope="scope">
|
||
|
<pre v-html="scope.row.userAnswers"></pre>
|
||
|
</template>
|
||
|
</el-table-column>
|
||
|
<el-table-column prop="referenceAnswer" label="参考答案" align="center">
|
||
|
<template slot-scope="scope">
|
||
|
<div v-html="scope.row.referenceAnswer"></div>
|
||
|
</template>
|
||
|
</el-table-column>
|
||
|
<el-table-column prop="score" label="得分" align="center">
|
||
|
</el-table-column>
|
||
|
</el-table>
|
||
|
</div>
|
||
|
|
||
|
<div class="mgb20">
|
||
|
<div class="meta-title-wrap">
|
||
|
<p class="meta-title"><i class="el-icon-discount"></i> 实验数据及结果分析</p>
|
||
|
</div>
|
||
|
<div >
|
||
|
<div class="data-wrap">
|
||
|
<el-table :data="goodsData" :span-method="objectSpanMethod" stripe header-align="center" style="flex: 1;margin-right: 10px">
|
||
|
<el-table-column prop="name" label="现货" align="center"></el-table-column>
|
||
|
<el-table-column prop="num" label="数量" align="center"></el-table-column>
|
||
|
<el-table-column prop="time" label="时间" align="center"></el-table-column>
|
||
|
<el-table-column prop="price" label="价格" align="center"></el-table-column>
|
||
|
<el-table-column prop="marketValue" label="现货市值" align="center"></el-table-column>
|
||
|
<el-table-column prop="proftAndLoss" label="累计盈亏" align="center"></el-table-column>
|
||
|
</el-table>
|
||
|
<el-table :data="futuresData" :span-method="objectSpanMethod1" stripe header-align="center" style="flex: 1;margin-right: 10px">
|
||
|
<el-table-column prop="name" label="期权名称" align="center"></el-table-column>
|
||
|
<el-table-column prop="dir" label="交易方向" align="center"></el-table-column>
|
||
|
<el-table-column prop="num" label="数量" align="center"></el-table-column>
|
||
|
<el-table-column prop="time" label="时间" align="center"></el-table-column>
|
||
|
<el-table-column prop="price" label="价格" align="center"></el-table-column>
|
||
|
<el-table-column prop="marketValue" label="期权市值" align="center"></el-table-column>
|
||
|
<el-table-column prop="proftAndLoss" label="累计盈亏" align="center"></el-table-column>
|
||
|
</el-table>
|
||
|
</div>
|
||
|
|
||
|
<div class="data-wrap">
|
||
|
<el-table :data="futuresLoss" stripe header-align="center">
|
||
|
<el-table-column prop="futuresLoss" label="策略总盈亏" align="center"></el-table-column>
|
||
|
</el-table>
|
||
|
<el-table :data="hisPositionData1" stripe header-align="center" class="mat20">
|
||
|
<el-table-column prop="percent" label="套期保值率" align="center"></el-table-column>
|
||
|
</el-table>
|
||
|
</div>
|
||
|
</div>
|
||
|
<el-input style="margin-top: 20px" v-model="form.analysis" type="textarea" :disabled="true" rows="5"></el-input>
|
||
|
</div>
|
||
|
|
||
|
<div class="mgb20">
|
||
|
<div class="meta-title-wrap">
|
||
|
<p class="meta-title"><i class="el-icon-discount"></i> 实验结论</p>
|
||
|
</div>
|
||
|
<el-input type="textarea" v-model="form.conclusion" rows="5" disabled></el-input>
|
||
|
</div>
|
||
|
|
||
|
<div class="mgb20">
|
||
|
<div class="meta-title-wrap">
|
||
|
<p class="meta-title"><i class="el-icon-discount"></i> 总结及心得体会</p>
|
||
|
</div>
|
||
|
<el-input type="textarea" v-model="form.summarize" rows="5" disabled></el-input>
|
||
|
</div>
|
||
|
|
||
|
<div class="mgb20">
|
||
|
<div class="meta-title-wrap">
|
||
|
<p class="meta-title"><i class="el-icon-discount"></i> 对本实验过程及方法、手段的改进建议</p>
|
||
|
</div>
|
||
|
<el-input type="textarea" rows="5" v-model="form.improvement" disabled></el-input>
|
||
|
</div>
|
||
|
|
||
|
<div class="mgb20">
|
||
|
<div class="meta-title-wrap">
|
||
|
<p class="meta-title"><i class="el-icon-discount"></i> 老师评语</p>
|
||
|
</div>
|
||
|
<el-input type="textarea" rows="5" v-model="form.comment" disabled></el-input>
|
||
|
</div>
|
||
|
|
||
|
<div class="mgb20" v-if="form.isSignature">
|
||
|
<div class="meta-title-wrap">
|
||
|
<p class="meta-title"><i class="el-icon-discount"></i> 老师签名</p>
|
||
|
</div>
|
||
|
<img :src="signSrc" alt="" style="max-width: 400px;">
|
||
|
</div>
|
||
|
</div>
|
||
|
</el-col>
|
||
|
</el-row>
|
||
|
</div>
|
||
|
</template>
|
||
|
|
||
|
<script>
|
||
|
import html2Canvas from 'html2canvas'
|
||
|
import JsPDF from 'jspdf'
|
||
|
export default {
|
||
|
data (){
|
||
|
return {
|
||
|
id: this.$route.query.id,
|
||
|
title: '实验报告',
|
||
|
userId: this.$store.state.userId,
|
||
|
studentId: this.$store.state.studentId,
|
||
|
userName: this.$store.state.userName,
|
||
|
form: {
|
||
|
analysis: '',
|
||
|
conclusion: '',
|
||
|
content: '',
|
||
|
equipment: '',
|
||
|
data: '',
|
||
|
purpose: '',
|
||
|
experimentId: '',
|
||
|
experimentalClassName: '',
|
||
|
improvement: '',
|
||
|
laboratory: '',
|
||
|
period: '',
|
||
|
principle: '',
|
||
|
projectName: '',
|
||
|
score: 0,
|
||
|
step: '',
|
||
|
submitTime: '',
|
||
|
summarize: '',
|
||
|
teacherName: '',
|
||
|
userId: this.userId,
|
||
|
userName: this.userName,
|
||
|
workNumber: '',
|
||
|
analysis: '',
|
||
|
comment: ''
|
||
|
},
|
||
|
signSrc: '',
|
||
|
sjData: [],
|
||
|
infoData: [],
|
||
|
expData: [],
|
||
|
goodsData: [],
|
||
|
futuresData: [],
|
||
|
futuresLoss: [],
|
||
|
hisPositionData1:[]
|
||
|
}
|
||
|
},
|
||
|
mounted(){
|
||
|
this.getData()
|
||
|
this.getSgin()
|
||
|
},
|
||
|
methods: {
|
||
|
getData(){
|
||
|
let data = {
|
||
|
reportId: this.id,
|
||
|
userId: this.userId,
|
||
|
}
|
||
|
this.$get(this.api.getReport,data).then(res => {
|
||
|
let report = res.data.experimentalReportEntity
|
||
|
let steps = []
|
||
|
for(let i in report){
|
||
|
if(i.includes('steps') && report[i]) steps.push(JSON.parse(report[i]))
|
||
|
}
|
||
|
this.form = report
|
||
|
if(report.steps9){
|
||
|
let steps9 = JSON.parse(report.steps9)
|
||
|
this.goodsData = steps9.goodsData ? steps9.goodsData: []
|
||
|
this.futuresData = steps9.futuresData ? steps9.futuresData: []
|
||
|
this.futuresLoss = steps9.futuresLoss ? steps9.futuresLoss: []
|
||
|
this.hisPositionData1 = steps9.hisPositionData1 ? steps9.hisPositionData1: []
|
||
|
}
|
||
|
|
||
|
let score = res.data.score
|
||
|
let answerList = []
|
||
|
for(let i in res.data.userAnswersList){
|
||
|
answerList = answerList.concat(res.data.userAnswersList[i])
|
||
|
}
|
||
|
let sjData = []
|
||
|
answerList.map(n => {
|
||
|
if(n.type == 1){
|
||
|
this.$post(this.api.queryItem,n.levelThree)
|
||
|
.then((res) => {
|
||
|
n.levelFour = res.subject.find(e => e.id == n.levelFour).itemDescription
|
||
|
}).catch((err) => {})
|
||
|
}
|
||
|
})
|
||
|
let ids = []
|
||
|
setTimeout(() => {
|
||
|
score.map(n => {
|
||
|
let item = answerList.find(e => e.tradingJudgmentPointsId == n.tradingJudgmentPointsId)
|
||
|
sjData.push({
|
||
|
judgmentPointsName: item.judgmentPointsName,
|
||
|
userAnswers: n.userAnswers,
|
||
|
referenceAnswer: item.levelFour,
|
||
|
score: n.userScore,
|
||
|
type: n.type
|
||
|
})
|
||
|
n.type == 1 && ids.push(`ids=${n.userAnswers}`)
|
||
|
})
|
||
|
this.$get(`${this.api.getItemContentByIds}?${ids.join('&')}`).then((res) => {
|
||
|
let list = res.data
|
||
|
sjData.map(n => {
|
||
|
if(n.type == 1){
|
||
|
let item = list.find(e => e.id == n.userAnswers)
|
||
|
if(item) n.userAnswers = item.itemDescription
|
||
|
}
|
||
|
})
|
||
|
}).catch((err) => {})
|
||
|
},500)
|
||
|
|
||
|
this.sjData = sjData
|
||
|
this.infoData.push({
|
||
|
workNumber: report.workNumber,
|
||
|
className: report.className,
|
||
|
teacherName: report.teacherName,
|
||
|
period: report.period,
|
||
|
laboratory: report.laboratory,
|
||
|
startTime: report.creationTime,
|
||
|
score: report.score,
|
||
|
userName: this.userName
|
||
|
})
|
||
|
}).catch(res => {})
|
||
|
},
|
||
|
//合并行
|
||
|
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
|
||
|
if (columnIndex === 0 || columnIndex === 1 || columnIndex === 5) {
|
||
|
if (rowIndex % 2 === 0) {
|
||
|
return {
|
||
|
rowspan: 2,
|
||
|
colspan: 1
|
||
|
};
|
||
|
} else {
|
||
|
return {
|
||
|
rowspan: 0,
|
||
|
colspan: 0
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
//合并行
|
||
|
objectSpanMethod1({ row, column, rowIndex, columnIndex }) {
|
||
|
if (columnIndex === 0 || columnIndex === 1 || columnIndex === 2 || columnIndex === 6) {
|
||
|
if (rowIndex % 2 === 0) {
|
||
|
return {
|
||
|
rowspan: 2,
|
||
|
colspan: 1
|
||
|
};
|
||
|
} else {
|
||
|
return {
|
||
|
rowspan: 0,
|
||
|
colspan: 0
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
getSgin(){
|
||
|
let data = {
|
||
|
reportId: this.id
|
||
|
}
|
||
|
this.$get(this.api.reportSignature,data).then(res => {
|
||
|
this.signSrc = res.data.signatureUrl
|
||
|
}).catch(res => {})
|
||
|
},
|
||
|
goback(){
|
||
|
this.$router.go(-1)
|
||
|
},
|
||
|
exportPage(){
|
||
|
var title = this.title;
|
||
|
html2Canvas(document.querySelector('#pdfDom'), {
|
||
|
allowTaint: true
|
||
|
}).then(function (canvas) {
|
||
|
let contentWidth = canvas.width
|
||
|
let contentHeight = canvas.height
|
||
|
let pageHeight = contentWidth / 592.28 * 841.89
|
||
|
let leftHeight = contentHeight
|
||
|
let position = 0
|
||
|
let imgWidth = 595.28
|
||
|
let imgHeight = 592.28 / contentWidth * contentHeight
|
||
|
let pageData = canvas.toDataURL('image/jpeg', 1.0)
|
||
|
let PDF = new JsPDF('', 'pt', 'a4')
|
||
|
if (leftHeight < pageHeight) {
|
||
|
PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
|
||
|
} else {
|
||
|
while (leftHeight > 0) {
|
||
|
PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
|
||
|
leftHeight -= pageHeight
|
||
|
position -= 841.89
|
||
|
if (leftHeight > 0) {
|
||
|
PDF.addPage()
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
PDF.save(title + '.pdf')
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
</script>
|
||
|
|
||
|
<style lang="scss" scoped>
|
||
|
.box{
|
||
|
background-color: #fff;
|
||
|
}
|
||
|
.exp-header{
|
||
|
padding: 20px 100px;
|
||
|
box-shadow:0px 0px 25px 2px rgba(48,115,248,0.14);
|
||
|
z-index: 999;
|
||
|
margin-top: 2px;
|
||
|
}
|
||
|
/deep/.el-textarea.is-disabled .el-textarea__inner{
|
||
|
background-color: #ebfafd;
|
||
|
}
|
||
|
#pdfDom{
|
||
|
padding: 100px;
|
||
|
/deep/.info-table{
|
||
|
border: 0;
|
||
|
th{
|
||
|
background-color: #fff !important;
|
||
|
.cell{
|
||
|
color: #444;
|
||
|
}
|
||
|
}
|
||
|
tr{
|
||
|
border: 0;
|
||
|
}
|
||
|
tr:hover,tr:hover>td{
|
||
|
background-color: #c6f2f8 !important;
|
||
|
}
|
||
|
td{
|
||
|
border: {
|
||
|
left: 4px solid #fff;
|
||
|
right: 4px solid #fff;
|
||
|
}
|
||
|
&:first-child{
|
||
|
border-left: 0;
|
||
|
}
|
||
|
&:last-child{
|
||
|
border-right: 0;
|
||
|
}
|
||
|
background-color: #c6f2f8;
|
||
|
border-bottom: 0;
|
||
|
}
|
||
|
}
|
||
|
/deep/.table th{
|
||
|
background-color: #a2a2a2 !important;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/deep/.cell{
|
||
|
font-size: 12px;
|
||
|
}
|
||
|
/deep/.el-row{
|
||
|
padding-top: 20px;
|
||
|
margin: 0 !important;
|
||
|
}
|
||
|
.form-item{
|
||
|
display: flex;
|
||
|
align-items: center;
|
||
|
}
|
||
|
.form-item .el-input{
|
||
|
width: auto;
|
||
|
}
|
||
|
.form-item span{
|
||
|
margin-right: 10px;
|
||
|
}
|
||
|
.meta-title-wrap{
|
||
|
display: flex;
|
||
|
justify-content: space-between;
|
||
|
align-items: center;
|
||
|
span{
|
||
|
font-size: 13px;
|
||
|
color: #444;
|
||
|
}
|
||
|
}
|
||
|
.flex-between{
|
||
|
span{
|
||
|
font-size: 13px;
|
||
|
color: #444;
|
||
|
}
|
||
|
}
|
||
|
.meta-title{
|
||
|
display: flex;
|
||
|
align-items: center;
|
||
|
padding: 10px 20px;
|
||
|
margin-bottom: 10px;
|
||
|
font-size: 16px;
|
||
|
color: #fff;
|
||
|
background-color: #328aff;
|
||
|
i{
|
||
|
margin-right: 10px;
|
||
|
}
|
||
|
}
|
||
|
.step-title{
|
||
|
margin-bottom: 10px;
|
||
|
font-size: 16px;
|
||
|
color: #328aff;
|
||
|
}
|
||
|
.bd-title{
|
||
|
padding-top: 20px;
|
||
|
border-top: 1px dashed #ccc;
|
||
|
}
|
||
|
/deep/.data-wrap{
|
||
|
display: flex;
|
||
|
}
|
||
|
</style>
|