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.
258 lines
9.3 KiB
258 lines
9.3 KiB
<template> |
|
<div> |
|
<el-drawer title="评阅设置" :visible.sync="setupVisible" size="1200px" :close-on-click-modal="false" |
|
custom-class="setup-dia" @closed="closeDia"> |
|
<div class="flex h-full"> |
|
<el-form class="p-r-10" :model="form" ref="form" label-width="220px" label-suffix=":"> |
|
<el-form-item prop="name" label="是否隐藏学生信息"> |
|
<el-radio-group v-model="form.anonymizeStudents"> |
|
<el-radio :label="1">是</el-radio> |
|
<el-radio :label="0">否</el-radio> |
|
</el-radio-group> |
|
</el-form-item> |
|
<el-form-item v-if="row.hasAutoScoreType" prop="name" label="自动判分题是否允许人工评阅"> |
|
<el-radio-group v-model="form.allowManualGrading"> |
|
<el-radio :label="1">是</el-radio> |
|
<el-tooltip placement="top"> |
|
<div slot="content">自动判分题最终得分取最新一次评分</div> |
|
<i class="el-icon-question explain"></i> |
|
</el-tooltip> |
|
<el-radio :label="0">否</el-radio> |
|
</el-radio-group> |
|
</el-form-item> |
|
<template v-if="row.hasManualScoreType"> |
|
<el-form-item prop="name" label="评阅的时间限制"> |
|
<el-radio-group v-model="form.isTimed"> |
|
<el-radio :label="0" :disabled="!row.resultsDetails">不限时</el-radio> |
|
<el-tooltip placement="top"> |
|
<div slot="content">成绩不公布时,可设置评阅时间不限时</div> |
|
<i class="el-icon-question explain"></i> |
|
</el-tooltip> |
|
<el-radio :label="1" :disabled="!row.resultsDetails">限时</el-radio> |
|
</el-radio-group> |
|
<el-date-picker v-show="form.isTimed" class="m-l-10" v-model="timed" align="right" unlink-panels |
|
type="datetimerange" start-placeholder="开始日期" end-placeholder="结束日期" clearable |
|
:picker-options="pickerOptions"></el-date-picker> |
|
</el-form-item> |
|
<el-form-item prop="name" label="每题的评阅人数"> |
|
<el-input class="hide-spin" style="width: 200px;" placeholder="请输入" type="number" |
|
v-model.number="form.reviewersPerQuestion" /> 人<span class="fs-12">(人工判分题和整体评分表的评阅人数)</span> |
|
</el-form-item> |
|
<el-form-item prop="name" label="人工判分题最终得分"> |
|
<el-radio-group v-model="form.scoreAggregationRule"> |
|
<el-radio :label="0">取平均分</el-radio> |
|
<el-radio :label="1">取修剪平均分</el-radio> |
|
<el-tooltip placement="top"> |
|
<div slot="content"> |
|
<p>去掉最高分、最低分,取平均分</p> |
|
<p class="m-t-5 m-b-5">1.建议评阅人员≥3人;</p> |
|
<p class="m-b-5">2.若评阅人员为2人,则最终得分为2人评分的平均值;</p> |
|
<p>3.若评阅人员为1人,则最终得分为评阅人的评分;</p> |
|
</div> |
|
<i class="el-icon-question explain"></i> |
|
</el-tooltip> |
|
<el-radio :label="2">取加权平均分</el-radio> |
|
<el-tooltip placement="top"> |
|
<div slot="content">每位评阅人员的最新评分乘以其对应的权重后求和</div> |
|
<i class="el-icon-question explain"></i> |
|
</el-tooltip> |
|
<el-radio :label="3">取中位分</el-radio> |
|
<el-radio :label="4">取最高分</el-radio> |
|
</el-radio-group> |
|
</el-form-item> |
|
</template> |
|
</el-form> |
|
|
|
<el-form class="info" label-width="110px" disabled> |
|
<h6>答卷信息</h6> |
|
<el-form-item prop="name" label="答卷类型"> |
|
<el-radio v-for="(item, i) in types" v-model="row.method" :key="i" :label="item.id">{{ item.name |
|
}}</el-radio> |
|
</el-form-item> |
|
<el-form-item prop="name" label="判分类型"> |
|
<el-checkbox v-model="row.hasAutoScoreType" :true-label="1">自动判分题</el-checkbox> |
|
<el-checkbox v-model="row.hasManualScoreType" :true-label="1">人工判分题</el-checkbox> |
|
<el-checkbox v-model="row.hasManualScoreType1" :true-label="1">整体评分表评分</el-checkbox> |
|
</el-form-item> |
|
<el-form-item prop="name" label="成绩是否公布"> |
|
<el-radio v-model="row.resultsDetails" :label="0">是</el-radio> |
|
<span style="margin: 0 10px 0 -20px;font-size: 12px;color: #333;">公布时间:{{ row.resultAnnouncementTime |
|
}}</span> |
|
<el-radio v-model="row.resultsDetails" style="margin-top: 10px" :label="1">否</el-radio> |
|
</el-form-item> |
|
</el-form> |
|
</div> |
|
|
|
<div class="btns"> |
|
<el-button @click="setupVisible = false">取消</el-button> |
|
<el-button type="primary" :loading="submiting" @click="submit">保存</el-button> |
|
</div> |
|
</el-drawer> |
|
</div> |
|
</template> |
|
<script> |
|
import Setting from '@/setting' |
|
import Util from '@/libs/util' |
|
import QuesConst from '@/const/ques' |
|
import TestPaperConst from '@/const/testPaper' |
|
import _ from 'lodash' |
|
import Decimal from 'decimal.js' |
|
import dayjs from 'dayjs' |
|
export default { |
|
props: ['visible', 'row'], |
|
data () { |
|
return { |
|
arabicToChinese: Util.arabicToChinese, |
|
difficults: TestPaperConst.difficults, |
|
questionTypes: QuesConst.questionTypes, |
|
setupVisible: false, |
|
form: { |
|
allowManualGrading: 0, |
|
anonymizeStudents: 0, |
|
evaluationId: '', |
|
isTimed: '', |
|
reviewersPerQuestion: '', |
|
scoreAggregationRule: 0, |
|
}, |
|
originForm: {}, |
|
timed: [], |
|
pickerOptions: { |
|
disabledDate: time => { |
|
return this.row.resultsDetails ? false : time.getTime() > new Date(this.row.resultAnnouncementTime) // 成绩公布时结束时间不可晚于成绩公布时间 |
|
} |
|
}, |
|
types: [ |
|
{ |
|
id: 0, |
|
name: '实训' |
|
}, |
|
{ |
|
id: 1, |
|
name: '理论' |
|
}, |
|
{ |
|
id: 3, |
|
name: '论文报告' |
|
}, |
|
{ |
|
id: 2, |
|
name: '其他' |
|
}, |
|
], |
|
submiting: false, |
|
}; |
|
}, |
|
watch: { |
|
visible () { |
|
this.setupVisible = this.visible |
|
this.visible && this.init() |
|
} |
|
}, |
|
mounted () { |
|
this.originForm = _.cloneDeep(this.form) |
|
}, |
|
methods: { |
|
// 初始化 |
|
async init () { |
|
this.form = _.cloneDeep(this.originForm) |
|
this.timed = [] |
|
// 成绩公布 |
|
if (!this.row.resultsDetails && this.row.hasManualScoreType) { |
|
const now = await Util.getNow() |
|
this.timed = [dayjs(now).format('YYYY-MM-DD HH:mm:ss'), ''] |
|
this.form.isTimed = 1 // 成绩公布时,默认显示(有主观题时) |
|
} |
|
this.getDetail() |
|
}, |
|
// 获取详情 |
|
async getDetail () { |
|
try { |
|
const id = this.row.evaluationId |
|
if (id) { |
|
const { data } = await this.$post(`${this.api.evaluationFind}?id=${id}`) |
|
this.form = { |
|
allowManualGrading: data.allowManualGrading, |
|
anonymizeStudents: data.anonymizeStudents, |
|
evaluationId: data.evaluationId, |
|
isTimed: data.isTimed, |
|
reviewersPerQuestion: data.reviewersPerQuestion, |
|
scoreAggregationRule: data.scoreAggregationRule, |
|
} |
|
if (data.startTime) this.timed = [data.startTime, data.endTime] |
|
} |
|
} catch (e) { } |
|
}, |
|
// 提交 |
|
async submit () { |
|
if (this.submiting) return false |
|
const form = _.cloneDeep(this.form) |
|
const { row } = this |
|
if (form.isTimed && !this.timed.length) return Util.warningMsg(`请选择时间限制`) |
|
if (this.timed.length) { |
|
form.startTime = dayjs(this.timed[0]).format('YYYY-MM-DD HH:mm:ss') |
|
form.endTime = dayjs(this.timed[1]).format('YYYY-MM-DD HH:mm:ss') |
|
} |
|
form.competitionId = row.id |
|
form.stageId = row.stageId |
|
this.submiting = true |
|
try { |
|
await this.$post(this.api.evaluationSave, form) |
|
this.submiting = false |
|
|
|
if (this.$route.path === '/allocationReview/list') { |
|
try { |
|
await this.$confirm('保存成功!', '提示', { |
|
confirmButtonText: '前往任务分配', |
|
cancelButtonText: '关闭', |
|
type: 'warning', |
|
closeOnClickModal: false, |
|
}) |
|
this.$router.push(`records?competitionId=${row.id}&stageId=${row.stageId}`) |
|
} catch (e) { |
|
this.close() |
|
} |
|
} else { |
|
this.close() |
|
} |
|
} catch (e) { |
|
this.submiting = false |
|
} |
|
}, |
|
close () { |
|
this.$parent.initData() |
|
this.setupVisible = false |
|
}, |
|
// 弹框关闭回调 |
|
closeDia () { |
|
this.$emit('update:visible', false) |
|
} |
|
} |
|
}; |
|
</script> |
|
|
|
<style lang="scss" scoped> |
|
/deep/.setup-dia { |
|
.el-drawer__header { |
|
margin-bottom: 10px; |
|
} |
|
|
|
.explain { |
|
margin: 0 20px 0 -20px; |
|
font-size: 16px; |
|
color: #8f8f8f; |
|
cursor: pointer; |
|
} |
|
|
|
.info { |
|
flex: 1; |
|
height: 100%; |
|
border-left: 1px solid #ccc; |
|
|
|
h6 { |
|
margin-bottom: 20px; |
|
font-size: 16px; |
|
text-align: center; |
|
} |
|
} |
|
} |
|
</style> |