评阅中心前端
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

<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" />&emsp;人<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>