yujialong 2 months ago
parent 8d71f7c055
commit 1a8e6742a6
  1. 6
      src/api/index.js
  2. 4
      src/pages/allocationReview/list/index.vue
  3. 4
      src/pages/allocationReview/list/setup.vue
  4. 4
      src/pages/allocationReview/records/allocation.vue
  5. 38
      src/pages/allocationReview/records/index.vue
  6. 16
      src/pages/allocationReview/records/outline.vue
  7. 28
      src/pages/allocationReview/records/people.vue
  8. 158
      src/pages/myReview/list/index.vue
  9. 166
      src/pages/myReview/records/index.vue
  10. 174
      src/pages/myReview/theoryReview/index.vue
  11. 1
      src/store/modules/user.js

@ -19,4 +19,10 @@ export default {
examPaperDetails: `/exam/exam/paper/examPaperDetails`,
getPaperQuestionInfoByReviewSetting: `/nakadai/evaluation/getPaperQuestionInfoByReviewSetting`,
assignReviewers: `/nakadai/evaluationAssignments/assignReviewers`,
myReviewTask: `/nakadai/evaluation/myReviewTask`,
myReviewTaskByReviewList: `/nakadai/evaluation/myReviewTaskByReviewList`,
reviewTheDetailsReport: `/exam/exam/paper/reviewTheDetailsReport`,
reviewPaper: `/nakadai/evaluation/reviewPaper`,
setComments: `/nakadai/evaluation/setComments`,
getTheLabReportIdUpAndDown: `/nakadai/evaluation/getTheLabReportIdUpAndDown`,
}

@ -178,8 +178,8 @@ export default {
},
date: function (val) {
if (val) {
this.filter.startTime = val[0];
this.filter.endTime = val[1];
this.filter.startTime = val[0]
this.filter.endTime = val[1]
} else {
this.filter.startTime = ''
this.filter.endTime = ''

@ -198,7 +198,7 @@ export default {
form.stageId = row.stageId
this.submiting = true
try {
await this.$post(this.api.evaluationSave, form)
const res = await this.$post(this.api.evaluationSave, form)
this.submiting = false
if (this.$route.path === '/allocationReview/list' && (hasManualScoreType || form.allowManualGrading)) { //
@ -209,6 +209,8 @@ export default {
type: 'warning',
closeOnClickModal: false,
})
row.evaluationId = res.evaluationId
localStorage.setItem('reviewRow', JSON.stringify(row))
this.$router.push(`records?competitionId=${row.id}&stageId=${row.stageId}`)
} catch (e) {
this.close()

@ -144,7 +144,7 @@ export default {
const res = await this.$post(this.api.getPaperQuestionInfoByReviewSetting, {
paperId,
evaluationId: this.row.evaluationId,
keyword: this.outlineKeyword
// keyword: this.outlineKeyword
})
this.manualJudgeCount = res.manualJudgeCount
const paper = res.examPaperOutlineList
@ -260,7 +260,7 @@ export default {
taskType: this.taskType,
})
this.allocationVisible = false
this.$parent.calcDifficult()
this.$parent.initData()
this.submiting = false
} catch (e) {
this.submiting = false

@ -53,7 +53,7 @@
</div>
</div>
<el-table :data="list" class="table" ref="table" stripe header-align="center" row-key="id"
<el-table :data="list" :loading="loading" class="table" ref="table" stripe header-align="center" row-key="id"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" :reserve-selection="true"></el-table-column>
<el-table-column type="index" width="50" label="序号" align="center"></el-table-column>
@ -69,12 +69,13 @@
<template slot-scope="scope">{{ scope.row.timeSum }}min</template>
</el-table-column>
<el-table-column prop="submitTime" label="提交时间" align="center" width="150"></el-table-column>
<el-table-column prop="submitName" label="提交名称" align="center" width="120"
<el-table-column prop="submitName" label="提交名称" align="center" min-width="120"
show-overflow-tooltip></el-table-column>
<el-table-column prop="lastEditor" label="是否完成分配" align="center" width="100">
<template slot-scope="scope">{{ scope.row.isDistribution ? '是' : '否' }}</template>
</el-table-column>
<el-table-column prop="evaluator" label="评阅人员" align="center" width="90" show-overflow-tooltip></el-table-column>
<el-table-column prop="evaluator" label="评阅人员" align="center" min-width="90"
show-overflow-tooltip></el-table-column>
<el-table-column prop="evaluatorCount" label="评阅人数" align="center" width="80"></el-table-column>
<el-table-column prop="evaluationStatus" label="评阅状态" align="center" width="90">
<template slot-scope="scope">
@ -177,34 +178,26 @@ export default {
const { query } = this.$route
if (query.page) {
const { questionTypes, correctRateEnd, correctRateStart, difficultys, specialtyIds, status, keyword, questionTypeSort, givenYearSort, difficultySort, correctRateSort, updateTimeSort, referenceCountSort, givenYears, knowledgePointIds, questionBankId, questionBankName, questionBankCategory } = query
const { cityId, provinceId, realSchoolId, status, keyword } = query
this.filter = {
questionTypes: questionTypes ? questionTypes.split(',') : [],
correctRateEnd: correctRateEnd || '',
correctRateStart: correctRateStart || '',
difficultys: difficultys ? difficultys.split(',') : [],
specialtyIds: specialtyIds ? specialtyIds.split(',').map(e => +e) : [],
cityId: cityId ? +cityId : '',
provinceId: provinceId ? +provinceId : '',
realSchoolId: realSchoolId ? +realSchoolId : '',
status: status ? +status : '',
keyword: keyword || '',
questionTypeSort: questionTypeSort || '',
givenYearSort: givenYearSort || '',
difficultySort: difficultySort || '',
correctRateSort: correctRateSort || '',
updateTimeSort: updateTimeSort || '',
referenceCountSort: referenceCountSort || '',
keyWord: keyword || '',
}
this.givenYears = givenYears || ''
this.knowledgePointIds = knowledgePointIds ? JSON.parse(knowledgePointIds) : []
this.$router.push(`/myReview?questionBankId=${questionBankId}&questionBankName=${questionBankName}&questionBankCategory=${questionBankCategory}`).catch(() => { })
provinceId && this.getCity()
cityId && this.getSchool()
this.$router.push(`records?competitionId=${query.competitionId}&stageId=${query.stageId}`).catch(() => { })
}
this.getProvince()
this.getList()
// this.getKnowledge()
},
methods: {
async getList () {
try {
this.loading = true
const { page } = await this.$post(this.api.competitionUserReport, {
...this.filter,
pageNum: this.page,
@ -214,6 +207,9 @@ export default {
})
this.list = page.records
this.total = page.total
} finally {
this.loading = false
}
},
//
currentChange (val) {

@ -1,10 +1,10 @@
<template>
<div>
<h6 class="page-name m-t-20" style="margin-bottom: 10px;">评阅范围</h6>
<div v-if="!dia" class="m-b-10">
<!-- <div v-if="!dia" class="m-b-10">
<el-input style="width: 300px;" placeholder="请输入题干" prefix-icon="el-icon-search" v-model="outlineKeyword"
clearable />
</div>
</div> -->
<!-- <el-checkbox class="m-b-5" style="margin-left: 24px;" v-model="checkAllQues"
@change="checkAllQuesChange">全选</el-checkbox> -->
<div :class="['scopes', { dia }]">
@ -27,12 +27,12 @@ export default {
submiting: false,
};
},
watch: {
outlineKeyword: function (val) {
clearTimeout(this.searchTimer)
this.searchTimer = setTimeout(this.getOutline, 500)
},
},
// watch: {
// outlineKeyword: function (val) {
// clearTimeout(this.searchTimer)
// this.searchTimer = setTimeout(this.getOutline, 500)
// },
// },
mounted () {
},

@ -3,19 +3,24 @@
<h6 class="page-name m-t-20" style="margin-bottom: 10px;">选择评阅人员</h6>
<div :class="['wrap', { dia }]">
<div class="item">
<el-radio-group class="m-b-10" v-model="userType" size="small">
<el-radio-group class="m-b-10" v-model="userType" size="small" @change="userTypeChange">
<el-radio-button :label="0">平台用户</el-radio-button>
<el-radio-button :label="1">专家</el-radio-button>
</el-radio-group>
<div class="dep-wrap">
<el-tree :data="nakadais" default-expand-all ref="nakadais" node-key="id" highlight-current
<div v-if="userType" class="empty m-t-20">
<img class="icon" src="@/assets/images/empty.svg" alt="">
<p>请在右侧选择专家</p>
</div>
<div v-else class="dep-wrap">
<el-tree :data="nakadaiDeps" default-expand-all ref="nakadais" node-key="id" highlight-current
:expand-on-click-node="false" @node-click="depClick"
:props="{ children: 'children', label: 'organizationName', isLeaf: 'leaf' }"></el-tree>
</div>
</div>
<div class="item">
<p class="total m-b-10">用户</p>
<p class="total m-b-10">{{ userType ? '专家' : '用户' }}</p>
<el-input class="m-b-10" placeholder="请输入姓名、现所在单位" prefix-icon="el-icon-search" v-model="userKeyword"
clearable />
@ -84,7 +89,7 @@ export default {
props: ['dia'],
data () {
return {
nakadais: [],
nakadaiDeps: [],
curDep: {},
searchTimer: null,
@ -119,7 +124,13 @@ export default {
const res = await this.$post(this.api.treeListArch)
const list = res.treeList
this.handleList(list)
this.nakadais = list
this.nakadaiDeps = [
{
id: 0,
organizationName: '全部',
children: list
}
]
},
//
handleList (list) {
@ -131,6 +142,11 @@ export default {
}
})
},
//
userTypeChange () {
const el = this.$refs.nakadais
el && el.setCurrentKey(null)
},
//
depClick (data) {
this.curDep = data

@ -15,14 +15,14 @@
</li>
<li>
<label>评阅阶段</label>
<el-select v-model="filter.status" clearable placeholder="请选择评阅阶段" @change="initData">
<el-option v-for="(item, i) in status" :key="i" :label="item.name" :value="item.id"></el-option>
<el-select v-model="filter.evaluationStatus" clearable placeholder="请选择评阅阶段" @change="initData">
<el-option v-for="(item, i) in reviewStage" :key="i" :label="item.name" :value="item.id"></el-option>
</el-select>
</li>
<li>
<label>评阅情况</label>
<el-select v-model="filter.status" clearable placeholder="请选择评阅情况" @change="initData">
<el-option v-for="(item, i) in status" :key="i" :label="item.name" :value="item.id"></el-option>
<el-select v-model="filter.evaluationResult" clearable placeholder="请选择评阅情况" @change="initData">
<el-option v-for="(item, i) in reviewStatus" :key="i" :label="item.name" :value="item.id"></el-option>
</el-select>
</li>
<li>
@ -33,20 +33,21 @@
</ul>
</div>
<el-table :data="list" class="table" ref="table" stripe header-align="center" row-key="id">
<el-table :data="list" :loading="loading" class="table" ref="table" stripe header-align="center" row-key="id">
<el-table-column type="index" width="50" label="序号" align="center"></el-table-column>
<el-table-column prop="stem" label="大赛名称" align="center" min-width="120" show-overflow-tooltip></el-table-column>
<el-table-column prop="professionalName" label="阶段赛名称" align="center" min-width="100"></el-table-column>
<el-table-column prop="knowledgePointName" label="比赛内容" align="center" min-width="100"></el-table-column>
<el-table-column prop="lastEditor" label="分配答卷数" align="center" width="90"></el-table-column>
<el-table-column prop="lastEditor" label="待评答卷数" align="center" width="90"></el-table-column>
<el-table-column prop="lastEditor" label="已评答卷数" align="center" width="90"></el-table-column>
<el-table-column prop="lastEditor" label="评阅时间" align="center" width="90"></el-table-column>
<el-table-column prop="lastEditor" label="评阅阶段" align="center" width="90"></el-table-column>
<el-table-column prop="lastEditor" label="评阅情况" align="center" width="90"></el-table-column>
<el-table-column prop="competitionName" label="大赛名称" align="center" min-width="120"
show-overflow-tooltip></el-table-column>
<el-table-column prop="stageName" label="阶段赛名称" align="center" min-width="100"></el-table-column>
<el-table-column prop="competitionContent" label="比赛内容" align="center" min-width="100"></el-table-column>
<el-table-column prop="totalAnswer" label="分配答卷数" align="center" width="90"></el-table-column>
<el-table-column prop="unReviewedAnswer" label="待评答卷数" align="center" width="90"></el-table-column>
<el-table-column prop="reviewedAnswer" label="已评答卷数" align="center" width="90"></el-table-column>
<el-table-column prop="time" label="评阅时间" align="center" width="300"></el-table-column>
<el-table-column prop="stage" label="评阅阶段" align="center" width="90"></el-table-column>
<el-table-column prop="reviewStatusName" label="评阅情况" align="center" width="90"></el-table-column>
<el-table-column label="操作" align="center" width="90" fixed="right">
<template slot-scope="scope">
<el-button type="text" @click="review(scope.row)">评阅</el-button>
<el-button type="text" @click="toReview(scope.row)">评阅</el-button>
</template>
</el-table-column>
</el-table>
@ -92,6 +93,30 @@ export default {
name: '近六个月'
}
],
reviewStage: [
{
id: 0,
name: '未开始'
},
{
id: 1,
name: '进行中'
},
{
id: 2,
name: '已完成'
},
],
reviewStatus: [
{
id: 0,
name: '未完成'
},
{
id: 1,
name: '已完成'
},
],
status: [
{
id: 1,
@ -105,12 +130,15 @@ export default {
date: [],
filter: {
month: '',
startTime: null,
endTime: null,
status: '',
keyword: '',
startTime: '',
endTime: '',
evaluationResult: '',
evaluationStatus: '',
keyWord: '',
},
list: [{}],
now: '',
timer: null,
list: [],
page: +this.$route.query.page || 1,
pageSize: 10,
total: 0,
@ -127,20 +155,24 @@ export default {
},
date: function (val) {
if (val) {
this.filter.startTime = val[0];
this.filter.endTime = val[1];
this.filter.startTime = val[0]
this.filter.endTime = val[1]
} else {
this.filter.startTime = ''
this.filter.endTime = ''
}
// this.initData();
this.initData()
},
'filter.keyword': function () {
'filter.keyWord': function () {
clearTimeout(this.searchTimer)
this.searchTimer = setTimeout(this.initData, 500)
},
},
mounted () {
this.$once('hook:beforeDestroy', function () {
clearInterval(this.timer)
})
const { query } = this.$route
if (query.page) {
const { questionTypes, correctRateEnd, correctRateStart, difficultys, specialtyIds, status, keyword, questionTypeSort, givenYearSort, difficultySort, correctRateSort, updateTimeSort, referenceCountSort, givenYears, knowledgePointIds, questionBankId, questionBankName, questionBankCategory } = query
@ -165,32 +197,34 @@ export default {
this.$router.push(`/myReview?questionBankId=${questionBankId}&questionBankName=${questionBankName}&questionBankCategory=${questionBankCategory}`).catch(() => { })
}
// this.getType()
// this.getProfessional()
// this.getKnowledge()
this.getList()
},
methods: {
async getList () {
let type = this.$refs.typeTree.getCurrentKey()
const k = this.knowledgePointIds
if (k.length) { //
type = k.map(e => {
return e[e.length - 1]
})
} else if (type) {
type = [type]
}
const { message } = await this.$post(this.api.listQuestion, {
try {
this.loading = true
const { page } = await this.$post(this.api.myReviewTask, {
...this.filter,
givenYears: this.givenYears ? [this.givenYears] : [],
isNotJoin: this.isNotJoin || '',
pageNum: this.page,
pageSize: this.pageSize,
questionBankId: this.questionBankId,
knowledgePointIds: type || [],
})
this.list = Util.removeTag(message.records)
this.total = message.total
const list = page.records
list.forEach(e => {
// e.reviewStageName = this.reviewStage.find(n => n.id === e.reviewStage).name
if (e.reviewStatus !== null) e.reviewStatusName = this.reviewStatus.find(n => n.id === +e.reviewStatus).name
// e.reviewStageName = this.reviewStage.find(n => n.id === e.reviewStage).name
e.stage = '-'
e.time = e.isTimed ?
e.startTime + ' ~ ' + e.endTime :
'不限时'
})
this.list = list
this.getNow()
this.handleStage()
this.total = page.total
} finally {
this.loading = false
}
},
//
currentChange (val) {
@ -206,11 +240,43 @@ export default {
this.page = 1
this.getList()
},
//
async handleStage () {
this.list.forEach(e => {
let stage = '-'
if (e.isTimed) {
if (e.startTime && e.endTime) {
const startTime = new Date(e.startTime)
const endTime = new Date(e.endTime)
stage = this.now < startTime ?
'未开始' :
this.now > endTime ?
'已结束' :
'进行中'
}
} else {
stage = '进行中'
}
e.stage = stage
})
},
//
async getNow () {
this.now = await Util.getNow()
clearInterval(this.timer)
this.timer = setInterval(() => {
this.now = new Date(this.now.setSeconds(this.now.getSeconds() + 1))
this.handleStage()
}, 1000)
},
//
review () {
// this.setReferrer()
this.$router.push('records')
toReview (row) {
this.$store.commit('user/setReferrer', {
i: 1,
url: `${this.$route.path}?${Qs.stringify(this.filter)}&page=${this.page}&pageSize=${this.pageSize}`
})
this.$router.push(`records?competitionId=${row.competitionId}&stageId=${row.stageId}`)
},
}
};

@ -4,6 +4,7 @@
<h6 class="page-name">筛选</h6>
<div class="tool">
<ul class="filter">
<template v-if="showUserInfo">
<li>
<label>省份</label>
<el-select v-model="filter.provinceId" clearable placeholder="请选择省份" @change="provinceChange"
@ -15,28 +16,29 @@
<li>
<label>城市</label>
<el-select v-model="filter.cityId" clearable placeholder="请选择城市" :disabled="!filter.provinceId"
@clear="clearcity" @change="getSchool">
@clear="clearcity" @change="cityChange">
<el-option v-for="(item, i) in cities" :key="i" :label="item.cityName" :value="item.cityId"></el-option>
</el-select>
</li>
<li>
<label>学校</label>
<el-select v-model="filter.schoolId" clearable filterable placeholder="请选择学校" :disabled="!filter.cityId"
<el-select v-model="filter.realSchoolId" clearable filterable placeholder="请选择学校" :disabled="!filter.cityId"
@change="initData">
<el-option v-for="(item, i) in schools" :key="i" :label="item.schoolName"
:value="item.schoolId"></el-option>
</el-select>
</li>
</template>
<li>
<label>评阅状态</label>
<el-select v-model="filter.status" clearable placeholder="请选择评阅情况" @change="initData">
<el-select v-model="filter.status" clearable placeholder="请选择评阅状态" @change="initData">
<el-option v-for="(item, i) in status" :key="i" :label="item.name" :value="item.id"></el-option>
</el-select>
</li>
<li>
<label>搜索</label>
<el-input style="width: 400px;" placeholder="请输入学生姓名、学生学号、团队名称、答卷ID、提交名称" prefix-icon="el-icon-search"
v-model="filter.keyword" clearable />
<el-input style="width: 400px;" :placeholder="`请输入${showUserInfo ? '学生姓名、学生学号、团队名称、' : ''}答卷ID、提交名称`"
prefix-icon="el-icon-search" v-model="filter.keyword" clearable />
</li>
</ul>
<!-- <div>
@ -44,24 +46,37 @@
</div> -->
</div>
<el-table :data="list" class="table" ref="table" stripe header-align="center" row-key="id"
<el-table :data="list" :loading="loading" class="table" ref="table" stripe header-align="center" row-key="id"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" :reserve-selection="true"></el-table-column>
<el-table-column type="index" width="50" label="序号" align="center"></el-table-column>
<el-table-column prop="stem" label="省份" align="center" min-width="120"></el-table-column>
<el-table-column prop="professionalName" label="城市" align="center" min-width="100"></el-table-column>
<el-table-column prop="knowledgePointName" label="学生所在学校" align="center" min-width="100"></el-table-column>
<el-table-column prop="lastEditor" label="团队名称" align="center" width="90"></el-table-column>
<el-table-column prop="lastEditor" label="学生姓名" align="center" width="90"></el-table-column>
<el-table-column prop="lastEditor" label="学号" align="center" width="90"></el-table-column>
<el-table-column prop="lastEditor" label="答卷ID" align="center" width="90"></el-table-column>
<el-table-column prop="lastEditor" label="用时" align="center" width="90"></el-table-column>
<el-table-column prop="lastEditor" label="提交时间" align="center" width="90"></el-table-column>
<el-table-column prop="lastEditor" label="提交名称" align="center" width="90"></el-table-column>
<el-table-column prop="lastEditor" label="评阅状态" align="center" width="90"></el-table-column>
<template v-if="showUserInfo">
<el-table-column prop="provinceName" label="省份" align="center" min-width="100"
show-overflow-tooltip></el-table-column>
<el-table-column prop="cityName" label="城市" align="center" min-width="100"
show-overflow-tooltip></el-table-column>
<el-table-column prop="realSchool" label="学生所在院校" align="center" min-width="100"
show-overflow-tooltip></el-table-column>
<el-table-column prop="teamName" label="团队名称" align="center" min-width="90"></el-table-column>
<el-table-column prop="userName" label="学生姓名" align="center" min-width="80"></el-table-column>
<el-table-column prop="workNumber" label="学号" align="center" min-width="70"></el-table-column>
</template>
<el-table-column prop="reportId" label="答卷ID" align="center" min-width="60"></el-table-column>
<el-table-column prop="lastEditor" label="用时" align="center" min-width="60">
<template slot-scope="scope">{{ scope.row.timeSum }}min</template>
</el-table-column>
<el-table-column prop="submitTime" label="提交时间" align="center" min-width="150"></el-table-column>
<el-table-column prop="submitName" label="提交名称" align="center" min-width="120"
show-overflow-tooltip></el-table-column>
<el-table-column prop="evaluationStatus" label="评阅状态" align="center" width="90">
<template slot-scope="scope">
<el-tag :type="scope.row.evaluationStatus === '待评阅' ? 'danger' : 'success'">{{ scope.row.evaluationStatus
}}</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="90" fixed="right">
<template slot-scope="scope">
<el-button type="text" @click="review(scope.row)">评阅</el-button>
<el-button type="text" @click="toReview(scope.row, scope.$index)">评阅</el-button>
</template>
</el-table-column>
</el-table>
@ -85,9 +100,8 @@ export default {
data () {
return {
crumbs: [],
paperName: this.$route.query.paperName,
difficults: Const.difficults,
questionTypes: Const.questionTypes,
competitionId: this.$route.query.competitionId,
stageId: this.$route.query.stageId,
loading: false,
provinces: [],
@ -105,13 +119,16 @@ export default {
],
date: [],
filter: {
month: '',
startTime: null,
endTime: null,
cityId: '',
provinceId: '',
realSchoolId: '',
status: '',
keyword: '',
},
list: [{}],
showUserInfo: true,
rowData: null,
setup: null,
list: [],
page: +this.$route.query.page || 1,
pageSize: 10,
total: 0,
@ -119,34 +136,17 @@ export default {
};
},
watch: {
'filter.month': function (val) {
if (val) {
let unit = 24 * 60 * 60 * 1000
this.date = [dayjs(new Date(Date.now() - unit * 30 * val)).format('YYYY-MM-DD'), dayjs(new Date(Date.now() + unit)).format('YYYY-MM-DD')]
} else {
this.date = []
}
},
date: function (val) {
if (val) {
this.filter.startTime = val[0];
this.filter.endTime = val[1];
} else {
this.filter.startTime = ''
this.filter.endTime = ''
}
// this.initData();
},
'filter.keyword': function () {
clearTimeout(this.searchTimer)
this.searchTimer = setTimeout(this.initData, 500)
},
},
mounted () {
const { referrer1 } = this.$store.state.user
this.crumbs = [
{
name: this.paperName || '我的评阅任务',
route: '/myReview'
name: '我的评阅任务',
route: referrer1 || '/myReview'
},
{
name: '评阅'
@ -156,54 +156,44 @@ export default {
const { query } = this.$route
if (query.page) {
const { questionTypes, correctRateEnd, correctRateStart, difficultys, specialtyIds, status, keyword, questionTypeSort, givenYearSort, difficultySort, correctRateSort, updateTimeSort, referenceCountSort, givenYears, knowledgePointIds, questionBankId, questionBankName, questionBankCategory } = query
const { cityId, provinceId, realSchoolId, status, keyword } = query
this.filter = {
questionTypes: questionTypes ? questionTypes.split(',') : [],
correctRateEnd: correctRateEnd || '',
correctRateStart: correctRateStart || '',
difficultys: difficultys ? difficultys.split(',') : [],
specialtyIds: specialtyIds ? specialtyIds.split(',').map(e => +e) : [],
cityId: cityId ? +cityId : '',
provinceId: provinceId ? +provinceId : '',
realSchoolId: realSchoolId ? +realSchoolId : '',
status: status ? +status : '',
keyword: keyword || '',
questionTypeSort: questionTypeSort || '',
givenYearSort: givenYearSort || '',
difficultySort: difficultySort || '',
correctRateSort: correctRateSort || '',
updateTimeSort: updateTimeSort || '',
referenceCountSort: referenceCountSort || '',
keyWord: keyword || '',
}
this.givenYears = givenYears || ''
this.knowledgePointIds = knowledgePointIds ? JSON.parse(knowledgePointIds) : []
this.$router.push(`/myReview?questionBankId=${questionBankId}&questionBankName=${questionBankName}&questionBankCategory=${questionBankCategory}`).catch(() => { })
provinceId && this.getCity()
cityId && this.getSchool()
this.$router.push(`records?competitionId=${query.competitionId}&stageId=${query.stageId}`).catch(() => { })
}
this.getProvince()
// this.getProfessional()
// this.getKnowledge()
this.getList()
},
methods: {
async getList () {
let type = this.$refs.typeTree.getCurrentKey()
const k = this.knowledgePointIds
if (k.length) { //
type = k.map(e => {
return e[e.length - 1]
})
} else if (type) {
type = [type]
}
const { message } = await this.$post(this.api.listQuestion, {
try {
this.loading = true
const { page } = await this.$post(this.api.myReviewTaskByReviewList, {
...this.filter,
givenYears: this.givenYears ? [this.givenYears] : [],
isNotJoin: this.isNotJoin || '',
pageNum: this.page,
pageSize: this.pageSize,
questionBankId: this.questionBankId,
knowledgePointIds: type || [],
competitionId: this.competitionId,
stageId: this.stageId,
})
this.list = Util.removeTag(message.records)
this.total = message.total
const list = page.records
if (list.length) {
this.rowData = list[0]
this.getSetup()
}
this.list = list
this.total = page.total
} finally {
this.loading = false
}
},
//
currentChange (val) {
@ -222,6 +212,17 @@ export default {
this.page = 1
this.getList()
},
//
async getSetup () {
try {
const row = this.rowData
if (row && !this.setup) {
const { data } = await this.$post(`${this.api.evaluationFind}?id=${row.evaluationId}&paperId=${row.paperId}`)
this.setup = data
this.showUserInfo = !data.anonymizeStudents //
}
} catch (e) { }
},
//
async getProvince () {
@ -290,9 +291,8 @@ export default {
}
},
//
review (row) {
// this.setReferrer()
window.open(this.$router.resolve(`/theoryReview?id=${row.paperId}`).href)
toReview (row, i) {
window.open(this.$router.resolve(`/theoryReview?id=${row.reportId}&u=${+this.showUserInfo}&m=${this.setup.hasManualScoreType}&c=${this.competitionId}&s=${this.stageId}&i=${(this.page - 1) * this.pageSize + i + 1}`).href)
},
}
};

@ -4,8 +4,8 @@
<p class="paper-name">{{ paperName }}</p>
<div class="actions">
<el-button class="btn" @click="prev">上一个</el-button>
<el-button class="btn" @click="prev">下一个</el-button>
<el-button v-if="curIndex > 0" class="btn" @click="prev">上一个</el-button>
<el-button v-if="recordTotal - 1 > curIndex" class="btn" @click="next">下一个</el-button>
<el-button class="btn" @click="saveAll">一键保存分数</el-button>
<img class="exit" src="@/assets/images/exit.svg" alt="" @click="close">
</div>
@ -14,7 +14,7 @@
<div class="report" v-loading="loading">
<div class="left">
<h6 class="title">答题卡</h6>
<ul class="review-type">
<ul v-if="hasManualScoreType" class="review-type">
<li v-for="(item, i) in reviews" :key="i" :class="{ active: curReview === item.id }"
@click="reviewClick(item)">
{{ item.name }}</li>
@ -85,18 +85,18 @@
@click="download(ques.fileName || ques.stemAttachment, ques.stemAttachment)">下载</el-button>
</div>
<div v-if="ques.uploadInstructions" class="line m-b-10">
<span>考生上传附件说明</span>
<span class="line-label">考生上传附件说明</span>
<div v-html="ques.uploadInstructions" class="html-parse"></div>
</div>
</template>
<div v-if="ques.knowledgePointList && ques.knowledgePointList.length" class="m-b-10">
<span>知识点</span>
<span class="line-label">知识点</span>
<el-tag v-for="(kp, k) in ques.knowledgePointList" :key="k" class="m-r-5" type="info">{{ kp.name
}}</el-tag>
</div>
<div class="flex m-b-10">
<span>解析</span>
<span class="line-label">解析</span>
<div
v-if="ques.questionAnswerVersionsList.length && ques.questionAnswerVersionsList[0].answerAnalysis"
v-html="ques.questionAnswerVersionsList[0].answerAnalysis" class="html-parse"></div>
@ -139,15 +139,17 @@
<div class="line">题目分值{{ ques.questionScore }}</div>
<div class="line">
考生得分<el-input class="score-input" size="small" :value="ques.userScore" />&emsp;
考生得分<el-input class="score-input hide-spin" type="number" placeholder="请输入分数" size="small"
v-model.number="ques.userScore" />&emsp;
<el-button type="primary" size="mini" @click="saveScore(ques)">保存分数</el-button>
<el-popover class="m-l-10" placement="bottom" width="400" trigger="click">
<el-input type="textarea" :rows="3" autosize placeholder="请输入" />
<el-input type="textarea" :rows="3" autosize resize="none" placeholder="请输入"
v-model="ques.comments" />
<div class="m-t-10 text-right">
<el-button type="primary" size="mini" @click="saveComment(ques)">保存</el-button>
</div>
<div slot="reference">
<el-button type="primary" size="mini" @click="showComment(ques)">评语</el-button>
<el-button type="primary" size="mini">评语</el-button>
</div>
</el-popover>
</div>
@ -155,7 +157,7 @@
评语
<div>
<span>2024-12-12</span>
<i class="el-icon-delete-solid del-comment"></i>
<i class="el-icon-delete-solid del-comment" @click="delComment(ques)"></i>
<div class="comment">xxx</div>
</div>
</div>
@ -168,14 +170,16 @@
<div class="right">
<h6>基本信息</h6>
<div class="lines">
<p>考生所在院校xx</p>
<p>团队名称xx</p>
<p>考生班级xx</p>
<p>考生姓名xx</p>
<p>考生学号xx</p>
<p>答卷IDxx</p>
<p>提交时间xx</p>
<p>用时xx</p>
<template v-if="showUserInfo">
<p>考生所在院校{{ info.realSchool }}</p>
<p>团队名称{{ info.teamName }}</p>
<p>考生班级{{ info.className }}</p>
<p>考生姓名{{ info.userName }}</p>
<p>考生学号{{ info.workNumber }}</p>
</template>
<p>答卷ID{{ info.reportId }}</p>
<p>提交时间{{ info.submitTime }}</p>
<p>用时{{ info.timeSum }}min</p>
</div>
</div>
</div>
@ -203,24 +207,28 @@ export default {
return {
numToLetter: Util.numToLetter,
arabicToChinese: Util.arabicToChinese,
// reportId: this.$route.query.reportId,
reportId: '',
competitionId: this.$route.query.c,
stageId: this.$route.query.s,
showUserInfo: +this.$route.query.u, //
hasManualScoreType: +this.$route.query.m, //
curIndex: 0,
paperName: '',
reportId: 3791,
outline: [],
editing: false,
loading: false,
curReview: 1,
curReview: +this.$route.query.m ? 0 : '',
reviews: [
{
id: '',
name: '全部'
},
{
id: 1,
id: 0,
name: '待评阅'
},
{
id: 2,
id: 1,
name: '已评阅'
},
],
@ -243,9 +251,11 @@ export default {
name: '待判分'
},
],
outlines: [],
info: {},
paper: [],
essayExist: 0,
records: [],
page: 1,
recordTotal: 0,
previewImgVisible: false,
previewImg: '',
pdfVisible: false,
@ -253,24 +263,36 @@ export default {
exporting: false,
};
},
mounted () {
watch: {
$route: {
handler () {
this.curIndex = +this.$route.query.i
this.reportId = this.$route.query.id
this.getData()
},
immediate: true
}
},
mounted () {
this.getRecords()
},
methods: {
async getData () {
this.loading = true
try {
const { userAnswers: outline, report, paper } = await this.$get(`${this.api.getDetailedExamScores}?reportId=${this.reportId}`)
this.form = report
const { userAnswers: outline, report } = await this.$get(`${this.api.reviewTheDetailsReport}?reportId=${this.reportId}&status=${this.curReview}`)
this.info = report
//
const { questionTypes: types, difficults } = QuesConst
const { numToLetter } = Util
const paper = []
outline.map(e => {
if (e.userAnswerList && e.userAnswerList.length) {
e.shrink = false
const type = e.questionType
e.questionTypeName = types.find(n => n.id === type).name
e.userAnswerList && e.userAnswerList.map(n => {
e.userAnswerList.map(n => {
if (n.difficulty) {
const curDiff = difficults.find(m => m.id === n.difficulty)
if (curDiff) {
@ -278,6 +300,7 @@ export default {
n.difficultTheme = curDiff.theme
}
}
if (!n.comments) n.comments = ''
const opts = n.questionAnswerVersionsList
if (type !== 'fill_blank' && type !== 'essay') { //
@ -329,18 +352,34 @@ export default {
if (n.userAnswerFill) rightLen = n.userAnswerFill.filter(m => m.correct).length //
n.isCorrect = n.userScore && n.questionScore === n.userScore ? 1 : (rightLen ? 3 : 2)
} else if (type === 'essay') { //
if (!n.userScore) n.userScore = ''
n.isCorrect = 4 //
}
})
paper.push(e)
}
})
this.paper = outline
this.paper = paper
this.loading = false
} catch (e) {
this.loading = false
}
},
//
async getRecords () {
this.page = Math.ceil(this.curIndex / 10) || 1
const { page } = await this.$post(this.api.myReviewTaskByReviewList, {
pageNum: this.page,
pageSize: 10,
competitionId: this.competitionId,
stageId: this.stageId,
})
const list = page.records
this.records = list
this.recordTotal = page.total
},
scrollToSmooth (position, duration) {
let startTime = Date.now()
@ -367,6 +406,7 @@ export default {
//
reviewClick (item) {
this.curReview = item.id
this.getData()
},
//
filterStatus (e) {
@ -390,16 +430,28 @@ export default {
Util.downloadFile(name, url)
},
//
saveScore (ques) {
},
//
showComment (ques) {
async saveScore (ques) {
await this.$post(this.api.reviewPaper, [{
assignmentDetailId: ques.assignmentDetailId,
score: ques.userScore,
}])
Util.successMsg('保存成功')
},
//
saveComment (ques) {
async saveComment (ques) {
await this.$post(this.api.setComments, {
assignmentDetailId: ques.assignmentDetailId,
comments: ques.comments,
})
Util.successMsg('保存成功')
},
//
async delComment (ques) {
await this.$post(this.api.reviewPaper, {
assignmentDetailId: ques.assignmentDetailId,
score: ques.userScore,
})
Util.successMsg('删除成功')
},
//
@ -417,29 +469,31 @@ export default {
},
//
async next () {
this.exporting = true
const res = await axios.get(`${this.api.exportExamPaperReport}?reportId=${this.reportId}`, {
headers: {
token: this.token
},
responseType: 'blob'
})
const name = res.headers['content-disposition']
Util.downloadFileDirect(name ? decodeURI(name) : '标准成绩报告.docx', new Blob([res.data]))
this.exporting = false
const i = this.curIndex + 1
const newPage = Math.ceil(i / 10) || 1
// debugger
if (newPage > this.page) {
await this.getRecords()
}
if (this.records[i % 10 - 1]) {
let reportId = this.records[i % 10 - 1].reportId
this.$router.push(`/theoryReview?id=${reportId}&u=${this.showUserInfo}&c=${this.competitionId}&s=${this.stageId}&i=${i}`)
}
},
//
async saveAll () {
this.exporting = true
const res = await axios.get(`${this.api.exportExamPaperReport}?reportId=${this.reportId}`, {
headers: {
token: this.token
},
responseType: 'blob'
const { paper } = this
const params = []
paper.forEach(e => {
e.userAnswerList.forEach(n => {
n.userScore !== '' && params.push({
assignmentDetailId: n.assignmentDetailId,
score: n.userScore,
})
const name = res.headers['content-disposition']
Util.downloadFileDirect(name ? decodeURI(name) : '标准成绩报告.docx', new Blob([res.data]))
this.exporting = false
})
})
await this.$post(this.api.reviewPaper, params)
Util.successMsg('保存成功')
},
close () {
window.close()
@ -527,10 +581,14 @@ export default {
background-color: $main-color;
}
}
&+.type-wrap {
height: calc(100vh - 185px);
}
}
.type-wrap {
height: calc(100vh - 185px);
height: calc(100vh - 137px);
padding: 10px 0;
overflow: auto;

@ -1,6 +1,5 @@
import Setting from '@/setting'
import util from '@/libs/util'
import addRoutes from '@/libs/route/addRoutes'
/**
* 用户信息

Loading…
Cancel
Save