提交 a4686548 authored 作者: 王鹏飞's avatar 王鹏飞

chore: update

上级 b6d51968
<script setup>
import { getExperimentReport } from '../api'
const props = defineProps({ id: String })
let experiment = $ref()
let report = $ref()
const teacherText = $computed(() => {
if (!experiment) return ''
return experiment.teachers.map(item => item.name).join('、')
})
const classText = $computed(() => {
if (!experiment) return ''
return experiment.student.classes.map(item => item.name).join('、')
})
function fetchInfo() {
getExperimentReport({ experiment_id: props.id }).then(res => {
experiment = res.data.experiment
report = res.data.report
let detail = []
try {
detail = JSON.parse(report.detail)
} catch (error) {
console.log(error)
}
report = Object.assign(report, { detail })
})
}
onMounted(() => {
fetchInfo()
})
// 关闭
function handleClose() {
window.close()
}
</script>
<template>
<h1 class="report-title">实验报告</h1>
<el-form label-suffix=":" hide-required-asterisk v-if="experiment">
<el-row>
<el-col :span="12">
<el-form-item label="课程名称">{{ experiment.course.name }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="实验名称">{{ experiment.name }}</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="实验地点">{{ report.experiment_address }} </el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="实验日期"> {{ report.experiment_date }} </el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="实验类型">{{ experiment.type_level }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="指导教师">{{ teacherText }}</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="专业">{{ experiment.student.specialty.name }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="班级">{{ classText }}</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="姓名">{{ experiment.student.name }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="学号">{{ experiment.student.sno_number }}</el-form-item>
</el-col>
</el-row>
<el-divider />
<el-form-item :label="item.name" v-for="item in report.detail" :key="item.id" class="report-form-item">
<!-- 内容 -->
<template v-if="item.type === 1">
{{ item.notice_message }}
<div class="report-form-item__content" v-html="item.content"></div>
</template>
<!-- 附件 -->
<template v-if="item.type === 2">
<el-table :data="item.files" stripe :header-cell-style="{ background: '#ededed' }" style="margin-top: 20px">
<el-table-column label="序号" type="index" width="80" align="center"></el-table-column>
<el-table-column label="附件类型" prop="type" align="center">
<template #default="{ row }">
{{ row.type === '1' ? '本地上传' : '实验截图' }}
</template>
</el-table-column>
<el-table-column label="附件名称" prop="name" align="center"></el-table-column>
<el-table-column label="更新时间" prop="updated_time" align="center"></el-table-column>
<el-table-column label="操作" width="100" align="center">
<template #default="{ row }">
<el-button text type="primary"><a :href="row.url" target="_blank">查看</a></el-button>
</template>
</el-table-column>
</el-table>
</template>
<!-- 思考题 -->
<template v-if="item.type === 3">
{{ item.question_stem }}
<div class="report-form-item__content" v-html="item.content"></div>
</template>
</el-form-item>
</el-form>
<el-row justify="center">
<el-button type="primary" plain auto-insert-space @click="handleClose">关闭</el-button>
</el-row>
</template>
<style lang="scss">
.report-title {
padding: 20px;
font-size: 20px;
text-align: center;
}
.report-form-item {
flex-direction: column;
.el-form-item__label {
font-weight: bold;
text-align: left;
justify-content: flex-start;
}
}
.report-form-item__content {
clear: both;
width: 100%;
padding: 10px;
background-color: #efefef;
border-radius: 6px;
box-sizing: border-box;
}
</style>
<script setup>
import { getExperimentReport } from '../api'
const props = defineProps({ id: String })
let experiment = $ref()
let report = $ref()
const isCommit = $computed(() => {
return report.is_comment === '1'
})
const teacherText = $computed(() => {
if (!experiment) return ''
return experiment.teachers.map(item => item.name).join('、')
})
const classText = $computed(() => {
if (!experiment) return ''
return experiment.student.classes.map(item => item.name).join('、')
})
function fetchInfo() {
getExperimentReport({ experiment_id: props.id }).then(res => {
experiment = res.data.experiment
report = res.data.report
let detail = []
// 已批改
if (report.status === '3') {
try {
detail = JSON.parse(report.score_detail).map(item => {
return { ...item, commit_score: parseFloat(item.commit_score) }
})
} catch (error) {
console.log(error)
}
} else {
try {
detail = JSON.parse(report.detail)
} catch (error) {
console.log(error)
}
}
report = Object.assign(report, { detail, score: parseFloat(report.score) })
})
}
onMounted(() => {
fetchInfo()
})
// 关闭
function handleClose() {
window.close()
}
</script>
<template>
<div class="report-preview">
<h1 class="report-title">实验报告</h1>
<el-form label-suffix=":" hide-required-asterisk v-if="experiment">
<el-row>
<el-col :span="12">
<el-form-item label="课程名称">{{ experiment.course.name }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="实验名称">{{ experiment.name }}</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="实验地点">{{ report.experiment_address }} </el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="实验日期"> {{ report.experiment_date }} </el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="实验类型">{{ experiment.type_level }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="指导教师">{{ teacherText }}</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="专业">{{ experiment.student.specialty.name }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="班级">{{ classText }}</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="姓名">{{ experiment.student.name }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="学号">{{ experiment.student.sno_number }}</el-form-item>
</el-col>
</el-row>
<el-divider />
<template v-if="isCommit">
<p class="report-score">实验报告得分:{{ report.score }}</p>
<div class="comment is-all">
<div class="comment-hd">实验报告整体评价</div>
<div class="comment-bd">{{ report.comment }}</div>
</div>
</template>
<el-form-item v-for="(item, index) in report.detail" :key="item.id" class="report-form-item">
<div class="form-hd">
<h3>{{ index + 1 }}、{{ item.name }}</h3>
<p>得分:{{ item.commit_score }}分</p>
</div>
<!-- 内容 -->
<template v-if="item.type === 1">
<p class="report-form-item__tips">{{ item.notice_message }}</p>
<div class="report-form-item__content" v-html="item.content"></div>
</template>
<!-- 附件 -->
<template v-if="item.type === 2">
<el-table :data="item.files" stripe :header-cell-style="{ background: '#ededed' }" style="margin-top: 20px">
<el-table-column label="序号" type="index" width="80" align="center"></el-table-column>
<el-table-column label="附件类型" prop="type" align="center">
<template #default="{ row }">
{{ row.type === '1' ? '本地上传' : '实验截图' }}
</template>
</el-table-column>
<el-table-column label="附件名称" prop="name" align="center"></el-table-column>
<el-table-column label="更新时间" prop="updated_time" align="center"></el-table-column>
<el-table-column label="操作" width="100" align="center">
<template #default="{ row }">
<el-button text type="primary"><a :href="row.url" target="_blank">查看</a></el-button>
</template>
</el-table-column>
</el-table>
</template>
<!-- 思考题 -->
<template v-if="item.type === 3">
<p class="report-form-item__tips">{{ item.question_stem }}</p>
<div class="report-form-item__content" v-html="item.content"></div>
</template>
<div class="comment" v-if="isCommit">
<div class="comment-hd">教师评价:</div>
<div class="comment-bd">{{ item.comment }}</div>
</div>
</el-form-item>
</el-form>
<el-row justify="center">
<el-button type="primary" plain auto-insert-space @click="handleClose">关闭</el-button>
</el-row>
</div>
</template>
<style lang="scss" scoped>
.report-title {
padding: 20px;
font-size: 20px;
text-align: center;
}
.report-score {
text-align: center;
font-size: 24px;
font-weight: bold;
color: var(--main-color);
margin: 40px 0;
}
.report-form-item {
margin-bottom: 40px;
.form-hd {
display: flex;
width: 100%;
font-size: 14px;
font-weight: bold;
justify-content: space-between;
span {
padding: 0 40px;
}
}
}
.report-form-item__content {
clear: both;
width: 100%;
padding: 10px;
background-color: #efefef;
border-radius: 6px;
box-sizing: border-box;
}
.comment {
width: 100%;
padding: 20px 0;
&.is-all {
margin-bottom: 60px;
.comment-hd {
font-size: 16px;
font-weight: bold;
color: var(--main-color);
}
}
}
.comment-hd {
line-height: 30px;
}
.comment-bd {
padding: 10px;
border: 1px solid var(--main-color);
border-radius: 6px;
}
</style>
...@@ -6,11 +6,28 @@ interface Props { ...@@ -6,11 +6,28 @@ interface Props {
} }
const props = defineProps<Props>() const props = defineProps<Props>()
let experiment = $ref<any>()
let detail = $ref<any>() let detail = $ref<any>()
const classText = $computed(() => {
if (!experiment) return ''
return experiment.student.classes.map((item: any) => item.name).join('、')
})
function fetchInfo() { function fetchInfo() {
getExperimentScore({ experiment_id: props.experiment_id }).then(res => { getExperimentScore({ experiment_id: props.experiment_id }).then(res => {
detail = res.data experiment = res.data.experiment
let scoreDetails = []
try {
scoreDetails = JSON.parse(res.data.achievement.score_details).map((item: any) => {
return { ...item, percent: parseFloat(item.percent), commit_score: parseFloat(item.commit_score) }
})
} catch (error) {
console.log(error)
}
detail = Object.assign(res.data.achievement, {
score: parseFloat(res.data.achievement.score),
score_details: scoreDetails
})
}) })
} }
onMounted(() => { onMounted(() => {
...@@ -19,52 +36,86 @@ onMounted(() => { ...@@ -19,52 +36,86 @@ onMounted(() => {
</script> </script>
<template> <template>
<el-dialog title="实验成绩详情" width="600px" :close-on-click-modal="false"> <el-dialog title="实验成绩详情" width="600px">
<el-form label-width="120px" label-suffix=":" v-if="detail"> <el-form label-width="120px" label-suffix=":" v-if="detail">
<el-form-item label="实验名称">{{ detail.experiment.name }}</el-form-item> <el-form-item label="实验名称">{{ experiment.name }}</el-form-item>
<el-form-item label="实验课程名称">{{ detail.experiment.course.name }}</el-form-item> <el-form-item label="实验课程名称">{{ experiment.course.name }}</el-form-item>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="学生姓名">{{ detail.experiment.student.name }}</el-form-item> <el-form-item label="学生姓名">{{ experiment.student.name }}</el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="学生学号">{{ detail.experiment.student.sno_number }}</el-form-item> <el-form-item label="学生学号">{{ experiment.student.sno_number }}</el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="所属专业">{{ detail.experiment.student.specialty.name }}</el-form-item> <el-form-item label="所属专业">{{ experiment.student.specialty.name }}</el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="所属班级">{{ detail.experiment.student.specialty.name }}</el-form-item> <el-form-item label="所属班级">{{ classText }}</el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="评分教师"> <el-form-item label="评分教师">
{{ {{
detail.achievement.checker_sso_user.real_name || detail.checker_sso_user.real_name || detail.checker_sso_user.nickname || detail.checker_sso_user.username
detail.achievement.checker_sso_user.nickname ||
detail.achievement.checker_sso_user.username
}} }}
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="评分时间">{{ detail.achievement.check_time }}</el-form-item> <el-form-item label="评分时间">{{ detail.check_time }}</el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<div> <div class="form-result">
<p>实验得分{{ detail.achievement.score }}</p> <div class="form-result__score">
<!-- <el-table :data="item.files" stripe :header-cell-style="{ background: '#ededed' }"> <p>实验得分</p>
<el-table-column label="实验成绩组成项" align="center"></el-table-column> <p class="t1">{{ detail.score }}</p>
<el-table-column label="权重" prop="type" align="center"> </el-table-column> </div>
<el-table
:data="detail.score_details"
stripe
:header-cell-style="{ background: '#ededed' }"
v-if="detail.is_show === '1'">
<el-table-column label="实验成绩组成项" prop="name" align="center"></el-table-column>
<el-table-column label="权重" prop="percent" align="center">
<template #default="{ row }">{{ row.percent }}%</template>
</el-table-column>
<el-table-column label="得分" width="100" align="center"> <el-table-column label="得分" width="100" align="center">
<template #default="{ row }"> <template #default="{ row }">
<el-button text type="primary"><a :href="row.url" target="_blank">查看明细</a></el-button> {{ row.commit_score }}
<template v-if="row.type === 1 && experiment.report_upload_way === 2">
<el-button text type="primary">
<a :href="`/student/lab/report/view/${experiment.id}`" target="_blank">查看明细</a>
</el-button>
</template>
</template> </template>
</el-table-column> </el-table-column>
</el-table> --> </el-table>
</div> </div>
</el-form> </el-form>
<template #footer>
<el-row justify="center">
<el-button round auto-insert-space @click="$emit('update:modelValue', false)">关闭</el-button>
</el-row>
</template>
</el-dialog> </el-dialog>
</template> </template>
<style lang="scss" scoped>
.form-result {
display: flex;
align-items: center;
justify-content: center;
}
.form-result__score {
padding: 40px;
white-space: nowrap;
text-align: center;
.t1 {
font-size: 30px;
color: var(--main-color);
}
}
</style>
...@@ -7,6 +7,7 @@ import { useGetCourseList } from '../composables/useGetCourseList' ...@@ -7,6 +7,7 @@ import { useGetCourseList } from '../composables/useGetCourseList'
import { upload } from '@/utils/upload' import { upload } from '@/utils/upload'
import { getExperiment, getExperimentRecord, uploadExperimentPicture, submitExperimentRecord } from '../api' import { getExperiment, getExperimentRecord, uploadExperimentPicture, submitExperimentRecord } from '../api'
import dayjs from 'dayjs' import dayjs from 'dayjs'
import { saveAs } from 'file-saver'
const Info = defineAsyncComponent(() => import('../components/Info.vue')) const Info = defineAsyncComponent(() => import('../components/Info.vue'))
const Book = defineAsyncComponent(() => import('../components/Book.vue')) const Book = defineAsyncComponent(() => import('../components/Book.vue'))
...@@ -17,6 +18,7 @@ const ReportDialog = defineAsyncComponent(() => import('../components/ReportDial ...@@ -17,6 +18,7 @@ const ReportDialog = defineAsyncComponent(() => import('../components/ReportDial
const ReportFilePreview = defineAsyncComponent(() => import('../components/ReportFilePreview.vue')) const ReportFilePreview = defineAsyncComponent(() => import('../components/ReportFilePreview.vue'))
const PrepareDialog = defineAsyncComponent(() => import('../components/PrepareDialog.vue')) const PrepareDialog = defineAsyncComponent(() => import('../components/PrepareDialog.vue'))
const ResultDialog = defineAsyncComponent(() => import('../components/ResultDialog.vue')) const ResultDialog = defineAsyncComponent(() => import('../components/ResultDialog.vue'))
// const ReportPreview = defineAsyncComponent(() => import('../components/ReportPreview.vue'))
const route = useRoute() const route = useRoute()
...@@ -178,7 +180,14 @@ function handleReportView() { ...@@ -178,7 +180,14 @@ function handleReportView() {
// 导出实验报告 // 导出实验报告
function handleReportExport() { function handleReportExport() {
console.log(1) if (!detail) return
const fileName = `${detail.student.sno_number}_${detail.student.name}_${detail.experiment.name}_实验报告`
// 在线报告
if (experimentInfo?.report_upload_way === 2) {
console.log('在线报告导出')
} else {
saveAs(detail.file.url, fileName)
}
} }
</script> </script>
...@@ -248,7 +257,12 @@ function handleReportExport() { ...@@ -248,7 +257,12 @@ function handleReportExport() {
<el-button type="primary" @click="handleReportView" v-if="experimentInfo?.is_commit_report" <el-button type="primary" @click="handleReportView" v-if="experimentInfo?.is_commit_report"
>查看实验报告</el-button >查看实验报告</el-button
> >
<el-button type="primary" @click="handleReportExport" v-if="detail?.status === 2">导出实验报告</el-button> <el-button
type="primary"
@click="handleReportExport"
v-if="detail?.status === 2 && experimentInfo?.is_commit_report"
>导出实验报告</el-button
>
</div> </div>
</el-row> </el-row>
</AppCard> </AppCard>
...@@ -280,6 +294,11 @@ function handleReportExport() { ...@@ -280,6 +294,11 @@ function handleReportExport() {
v-model="resultDialogVisible" v-model="resultDialogVisible"
:data="experimentInfo" :data="experimentInfo"
v-if="resultDialogVisible && experimentInfo"></ResultDialog> v-if="resultDialogVisible && experimentInfo"></ResultDialog>
<!-- 导出在线报告 -->
<!-- <template v-if="experimentInfo?.id">
<ReportPreview :id="experimentInfo?.id"></ReportPreview>
</template> -->
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
......
<script setup> <script setup>
import ReportPreview from '../components/ReportPreivew.vue' import ReportPreview from '../components/ReportPreview.vue'
</script> </script>
<template> <template>
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论