竞赛文件上传

dev_review
yujialong 1 year ago
parent e78aca3957
commit a6cec79bdc
  1. 4
      src/libs/aliyun/aliyun-oss-sdk-6.17.1.min.js
  2. 7
      src/libs/aliyun/aliyun-upload-sdk-1.5.6.min.js
  3. 8
      src/libs/util.js
  4. 2
      src/utils/api.js
  5. 94
      src/views/course/contentSettings.vue
  6. 99
      src/views/match/add/step3.vue
  7. 9
      src/views/match/manage/matchArch.vue
  8. 822
      src/views/match/manage/matchArchList.vue
  9. 2
      src/views/serve/projectAdd.vue

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -7,7 +7,8 @@ const exts = {
video: 'mp4,3gp,mov,m4v,avi,dat,mkv,flv,vob,rmvb,rm,qlv', video: 'mp4,3gp,mov,m4v,avi,dat,mkv,flv,vob,rmvb,rm,qlv',
audio: 'mp3,aac,ape,flac,wav,wma,amr,mid', audio: 'mp3,aac,ape,flac,wav,wma,amr,mid',
img: 'jpg,jpeg,png,gif,svg,psd', img: 'jpg,jpeg,png,gif,svg,psd',
doc: 'doc,docx,txt,xls,xlsx,csv,xml,ppt,pptx' doc: 'doc,docx,txt,xls,xlsx,csv,xml,ppt,pptx',
compress: 'zip,rar,7z,tar,gz,bz2',
} }
const util = { const util = {
cookies, cookies,
@ -86,6 +87,11 @@ const util = {
if (exts.doc.includes(ext)) return true; if (exts.doc.includes(ext)) return true;
return false; return false;
}, },
// 传入文件后缀判断是否是压缩包
isCompress(ext) {
if (exts.compress.includes(ext)) return true;
return false;
},
// 判断是否能够预览 // 判断是否能够预览
canPreview(ext) { canPreview(ext) {
if (!util.isVideo(ext) && !util.isAudio(ext) && !util.isImg(ext) && !util.isDoc(ext)) return false if (!util.isVideo(ext) && !util.isAudio(ext) && !util.isImg(ext) && !util.isDoc(ext)) return false

@ -412,6 +412,8 @@ export default {
cancelCompetitionStageRankingTime: `competition/competitionReleaseTime/cancelCompetitionStageRankingTime`, cancelCompetitionStageRankingTime: `competition/competitionReleaseTime/cancelCompetitionStageRankingTime`,
getCompetitionStageRankingTime: `competition/competitionReleaseTime/getCompetitionStageRankingTime`, getCompetitionStageRankingTime: `competition/competitionReleaseTime/getCompetitionStageRankingTime`,
frontOfficeCompetitionRanking: `competition/competition/rank/frontOfficeCompetitionRanking`, frontOfficeCompetitionRanking: `competition/competition/rank/frontOfficeCompetitionRanking`,
cCompetitionStageFileList: `competition/cCompetitionStageFile/listByEntity`,
derive: `${host}competition/cCompetitionStageFile/deriveAll`,
gradeImport: `https://www.occupationlab.com/template/赛事成绩导入模板.xlsx`, gradeImport: `https://www.occupationlab.com/template/赛事成绩导入模板.xlsx`,
rankImportTeam: `https://www.occupationlab.com/template/赛事排名导入模板(团队赛).xlsx`, rankImportTeam: `https://www.occupationlab.com/template/赛事排名导入模板(团队赛).xlsx`,
rankImportPerson: `https://www.occupationlab.com/template/赛事排名导入模板(个人赛).xlsx`, rankImportPerson: `https://www.occupationlab.com/template/赛事排名导入模板(个人赛).xlsx`,

@ -357,6 +357,11 @@
import { Loading } from "element-ui"; import { Loading } from "element-ui";
import pdf from "@/components/pdf"; import pdf from "@/components/pdf";
import axios from 'axios' import axios from 'axios'
import Util from '@/libs/util'
import OSS from '@/libs/aliyun/aliyun-oss-sdk-6.17.1.min'
window.OSS = OSS;
import '@/libs/aliyun/aliyun-upload-sdk-1.5.6.min'
export default { export default {
name: "contentSettings", name: "contentSettings",
data () { data () {
@ -539,31 +544,74 @@ export default {
}, },
// //
handleRequest (data) { handleRequest (data) {
const param = new FormData() console.log(33, Util.isVideo(this.fileType))
param.append('file', data.file) //
const config = { if (Util.isVideo(this.fileType)) {
timeout: 10000000000,
headers: { console.log("🚀 ~ file: contentSettings.vue:587 ~ handleRequest ~ AliyunUpload:", AliyunUpload)
'Accept': '*/*', var uploader = new AliyunUpload.Vod({
'Content-Type': 'multipart/form-data' // userID使访https://account.console.aliyun.com/ID
}, userId: "1686385620732064",
// // 1 MB100 KB100*1024
onUploadProgress: progressEvent => { partSize: 1048576,
const per = Number((progressEvent.loaded / progressEvent.total * 100).toFixed(2)) // 5
console.log("🚀 ~ file: contentSettings.vue ~ line 329 ~ handleRequest ~ per", per, this.progressPercent) parallel: 5,
if (this.progressPercent <= 80) this.progressPercent = (per > 80) ? (Math.random() * 10 + 80).toFixed(2) : per // 3
retryCount: 3,
// 2
retryDuration: 2,
//
'onUploadstarted': function (uploadInfo) {
console.log("🚀 ~ file: contentSettings.vue:567 ~ handleRequest ~ uploadInfo:", uploadInfo)
debugger
},
//
'onUploadSucceed': function (uploadInfo) {
console.log("🚀 ~ file: contentSettings.vue:571 ~ handleRequest ~ uploadInfo:", uploadInfo)
},
//
'onUploadFailed': function (uploadInfo, code, message) {
console.log("🚀 ~ file: contentSettings.vue:576 ~ handleRequest ~ uploadInfo, code, message:", uploadInfo, code, message)
},
//
'onUploadProgress': function (uploadInfo, totalSize, loadedPercent) {
console.log("🚀 ~ file: contentSettings.vue:578 ~ handleRequest ~ uploadInfo, totalSize, loadedPercent:", uploadInfo, totalSize, loadedPercent)
},
// STS token
'onUploadTokenExpired': function (uploadInfo) {
},
//
'onUploadEnd': function (uploadInfo) {
}
});
} else {
const param = new FormData()
param.append('file', data.file)
const config = {
timeout: 10000000000,
headers: {
'Accept': '*/*',
'Content-Type': 'multipart/form-data'
},
//
onUploadProgress: progressEvent => {
const per = Number((progressEvent.loaded / progressEvent.total * 100).toFixed(2))
console.log("🚀 ~ file: contentSettings.vue ~ line 329 ~ handleRequest ~ per", per, this.progressPercent)
if (this.progressPercent <= 80) this.progressPercent = (per > 80) ? (Math.random() * 10 + 80).toFixed(2) : per
}
} }
axios.post(this.api.fileupload, param, config).then(res => {
this.progressPercent = 100
this.showProgress = false
const { fileId, fileType, fileUrl, ossFileName } = res.data.data.filesResult
this.uploading = false
this.fileId = fileId
this.fileType = fileType
this.fileUrl = fileUrl
this.fileName = ossFileName
})
} }
axios.post(this.api.fileupload, param, config).then(res => {
this.progressPercent = 100
this.showProgress = false
const { fileId, fileType, fileUrl, ossFileName } = res.data.data.filesResult
this.uploading = false
this.fileId = fileId
this.fileType = fileType
this.fileUrl = fileUrl
this.fileName = ossFileName
})
}, },
uploadError (err, file, fileList) { uploadError (err, file, fileList) {
this.$message({ this.$message({

@ -46,6 +46,40 @@
<el-input v-model="item.offlineAddress" <el-input v-model="item.offlineAddress"
style="width: 80%"></el-input> style="width: 80%"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="系统链接">
<el-input v-model="item.competitionStageContentSetting.systemLink"
style="width: 80%"></el-input>
</el-form-item>
<el-form-item label="是否支持上传文件">
<div>
<el-radio v-model="item.competitionStageContentSetting.whetherToUploadFiles"
:label="0"></el-radio>
</div>
<div class="flex a-center">
<el-radio v-model="item.competitionStageContentSetting.whetherToUploadFiles"
:label="1"></el-radio>
<template v-if="item.competitionStageContentSetting.whetherToUploadFiles">
<el-upload accept=".jpg,.png,.jpeg,.gif"
:on-remove="(file, fileList) => handleRemove(file, fileList, item)"
:on-error="uploadError"
:on-success="res => uploadSuccess(res, item)"
:before-remove="beforeRemove"
:action="api.fileUploadNakadai"
:headers="headers"
:file-list="item.competitionStageContentSetting.fileList"
name="file">
<el-button size="small"
type="primary">上传试卷</el-button>
</el-upload>
<span style="margin: 0 10px 0 30px;">说明</span>
<el-input maxlength="1000"
placeholder="请输入内容"
v-model="item.competitionStageContentSetting.stageExplain"
style="width: calc(80% - 216px);"></el-input>
</template>
</div>
</el-form-item>
<el-form-item class="req" <el-form-item class="req"
label="比赛内容"> label="比赛内容">
<el-input v-model="item.contentDescription" <el-input v-model="item.contentDescription"
@ -110,6 +144,9 @@ export default {
props: ['setupId', 'competitionId', 'editing'], props: ['setupId', 'competitionId', 'editing'],
data () { data () {
return { return {
headers: {
token: sessionStorage.getItem('token')
},
id: this.$route.query.id, id: this.$route.query.id,
updateTime: 0, updateTime: 0,
step1: this.$parent.$refs.step1.form, step1: this.$parent.$refs.step1.form,
@ -142,7 +179,7 @@ export default {
offlineButton: 0, offlineButton: 0,
onlineAddress: '', onlineAddress: '',
onlineButton: 0, onlineButton: 0,
time: [] time: [],
}, },
form: [], form: [],
setVisible: false, setVisible: false,
@ -185,6 +222,26 @@ export default {
} else { } else {
form.time = [] form.time = []
} }
// 线
if (e.method === 2) {
if (!form.competitionStageContentSetting) {
form.competitionStageContentSetting = {
whetherToUploadFiles: 0,
stageExplain: '',
fileUrl: '',
systemLink: '',
fileList: []
}
}
if (form.competitionStageContentSetting.fileUrl) {
form.competitionStageContentSetting.fileList = [{
name: form.competitionStageContentSetting.fileName,
url: form.competitionStageContentSetting.fileUrl,
}]
}
form.competitionStageContentSetting.competitionId = this.id
form.competitionStageContentSetting.stageId = e.stageId
}
if (!form.mallId) form.mallId = '' if (!form.mallId) form.mallId = ''
form.offlineButton = !!form.offlineButton form.offlineButton = !!form.offlineButton
form.onlineButton = !!form.onlineButton form.onlineButton = !!form.onlineButton
@ -232,6 +289,41 @@ export default {
} }
} }
}, },
//
beforeUpload (file) {
const isLt2M = file.size / 1024 / 1024 < 10
if (!isLt2M) util.warningMsg('请上传小于10MB的附件!')
if (isLt2M) {
this.fileName = file.name
return true
} else {
return false
}
},
uploadError (err, file, fileList) {
this.$message({
message: "上传出错,请重试!",
type: "error",
center: true
})
},
beforeRemove (file, fileList) {
return this.$confirm(`确定移除 ${file.name}`);
},
handleRemove (file, fileList, item) {
item.fileName = ''
item.fileUrl = ''
},
uploadSuccess (res, item) {
const { originalFileName, fileUrl } = res.filesResult
item.competitionStageContentSetting.fileUrl = fileUrl
item.competitionStageContentSetting.fileName = originalFileName
item.competitionStageContentSetting.fileList = [{
name: originalFileName,
url: fileUrl
}]
},
// //
publish () { publish () {
this.competitionId && this.$post(`${this.api.publishCompetition}?competitionId=${this.competitionId}&publishStatus=1`).then(res => { }).catch(err => { }) this.competitionId && this.$post(`${this.api.publishCompetition}?competitionId=${this.competitionId}&publishStatus=1`).then(res => { }).catch(err => { })
@ -283,6 +375,11 @@ export default {
util.errorMsg('请输入评分规则') util.errorMsg('请输入评分规则')
break break
} }
if (e.competitionStageContentSetting.whetherToUploadFiles && !e.competitionStageContentSetting.stageExplain) {
invalid = 1
util.errorMsg('请输入说明')
break
}
} else { } else {
if (e.onlineButton && !e.onlineAddress) { if (e.onlineButton && !e.onlineAddress) {
invalid = 1 invalid = 1

@ -44,7 +44,7 @@
<template slot-scope="scope"> <template slot-scope="scope">
<el-button type="primary" <el-button type="primary"
@click="toRank(scope.row, scope.$index)">排名</el-button> @click="toRank(scope.row, scope.$index)">排名</el-button>
<el-button @click="toArch(scope.row)">成绩管理</el-button> <el-button @click="toArch(scope.row, scope.$index)">成绩管理</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -111,15 +111,16 @@ export default {
} }
} }
}) })
console.log("🚀 ~ file: matchArch.vue:87 ~ handleStatus ~ this.status", this.list)
}, },
// //
toRank (row, i) { toRank (row, i) {
this.$router.push(`/matchRank?id=${this.id}&stageId=${row.stageId}&index=${i}&method=${row.method}&competitionType=${row.competitionType}&rule=${row.rule}`) this.$router.push(`/matchRank?id=${this.id}&stageId=${row.stageId}&index=${i}&method=${row.method}&competitionType=${row.competitionType}&rule=${row.rule}`)
}, },
// //
toArch (row) { toArch (row, i) {
this.$router.push(`/matchArchList?id=${this.id}&stageId=${row.stageId}&method=${row.method}&competitionType=${row.competitionType}`) const cur = this.form.competitionStage[i]
const showFile = !!(cur.method === 2 && cur.competitionStageContentSetting && cur.competitionStageContentSetting.whetherToUploadFiles)
this.$router.push(`/matchArchList?id=${this.id}&stageId=${row.stageId}&method=${row.method}&competitionType=${row.competitionType}&showFile=${showFile}`)
} }
} }
}; };

@ -1,111 +1,259 @@
<template> <template>
<div> <div>
<el-card shadow="hover" class="m-b-20 head-card"> <el-card shadow="hover"
<div class="flex-between m-b-20"> class="m-b-20 head-card">
<el-page-header @back="$router.back()" content="成绩管理"></el-page-header> <div class="flex-between m-b-20">
</div> <el-page-header @back="$router.back()"
content="成绩管理"></el-page-header>
</div>
</el-card> </el-card>
<el-card v-if="method != 2" shadow="hover" class="m-b-20"> <el-card v-if="method != 2"
<div class="stat"> shadow="hover"
<div class="nums"> class="m-b-20">
<div class="item"> <div class="stat">
<p class="name">实验总人数</p> <div class="nums">
<p class="val">{{ totalNumber }}</p> <div class="item">
</div> <p class="name">实验总人数</p>
<div class="item"> <p class="val">{{ totalNumber }}</p>
<p class="name">实验平均分</p> </div>
<p class="val">{{ avgScore }}</p> <div class="item">
</div> <p class="name">实验平均分</p>
</div> <p class="val">{{ avgScore }}</p>
<div class="chart" id="chart"></div> </div>
</div> </div>
</el-card> <div class="chart"
id="chart"></div>
</div>
</el-card>
<el-card shadow="hover" class="m-b-20"> <el-card shadow="hover"
<div class="flex-between m-b-20"> class="m-b-20">
<div> <div v-if="showFile"
<el-input class="tabs m-b-20">
size="small" <a class="item"
placeholder="请输入学校/学生姓名" v-for="(item, i) in tabs"
prefix-icon="el-icon-search" :key="i"
v-model="keyword" clearable :class="{active: i === active}"
style="width: 300px" @click="tabChange(i)">{{ item }}</a>
></el-input> </div>
</div>
<div>
<el-button v-if="method == 2" type="primary" @click="batchImport">上传成绩</el-button>
<el-button type="primary" @click="delAllData">批量删除</el-button>
<el-button type="primary" @click="exportData">导出</el-button>
</div>
</div>
<el-table :data="list" class="table" ref="table" stripe header-align="center" @selection-change="handleSelectionChange" row-key="reportId">
<el-table-column type="selection" width="55" align="center" :reserve-selection="true"></el-table-column>
<el-table-column type="index" width="60" label="序号" align="center">
<template slot-scope="scope">
{{ scope.$index + (page - 1) * pageSize + 1 }}
</template>
</el-table-column>
<el-table-column prop="schoolName" label="学校" min-width="150" align="center"></el-table-column>
<el-table-column v-if="competitionType" prop="teamName" label="团队名称" min-width="100" align="center"></el-table-column>
<el-table-column prop="userName" label="学生姓名" min-width="100" align="center"></el-table-column>
<el-table-column prop="workNumber" label="学号" min-width="100" align="center"></el-table-column>
<el-table-column prop="score" label="分数" width="90" align="center"></el-table-column>
<el-table-column prop="timeSum" label="耗时" width="90" align="center">
<template slot-scope="scope">
{{ scope.row.timeSum }}min
</template>
</el-table-column>
<el-table-column prop="submitTime" label="提交时间" min-width="150" align="center">
</el-table-column>
<el-table-column label="操作" align="center" width="160">
<template slot-scope="scope">
<el-button v-if="scope.row.reportId" type="text" @click="show(scope.row)">查看成绩报告</el-button>
<el-button type="text" @click="handleDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<div class="pagination">
<el-pagination background layout="total, prev, pager, next" :total="total" @current-change="handleCurrentChange" :current-page="page">
</el-pagination>
</div>
</el-card>
<el-dialog title="批量导入" :visible.sync="importVisible" width="24%" :close-on-click-modal="false"> <div class="flex-between m-b-20">
<div style="text-align: center"> <div>
<div style="margin-bottom: 10px;"> <el-input size="small"
<el-button type="primary" @click="download">模板下载<i class="el-icon-download el-icon--right"></i></el-button> placeholder="请输入学校/学生姓名"
</div> prefix-icon="el-icon-search"
<el-upload v-model="keyword"
ref="importStaff" clearable
name="file" style="width: 300px"></el-input>
accept=".xls,.xlsx" </div>
:on-remove="handleRemove" <div v-if="!active">
:on-error="uploadError" <el-button v-if="method == 2"
:on-success="uploadSuccess" type="primary"
:before-remove="beforeRemove" @click="batchImport">上传成绩</el-button>
:limit="1" <el-button type="primary"
:on-exceed="handleExceed" @click="delAllData">批量删除</el-button>
:action="this.api.batchImportGrades" <el-button type="primary"
:file-list="uploadList" @click="exportData">导出</el-button>
:headers="headers" </div>
:data="{ <div v-else>
<el-button type="primary"
@click="exportData1">批量导出</el-button>
</div>
</div>
<template v-if="!active">
<el-table :data="list"
class="table"
:key="1"
ref="table"
stripe
header-align="center"
@selection-change="handleSelectionChange"
row-key="reportId">
<el-table-column type="selection"
width="55"
align="center"
:reserve-selection="true"></el-table-column>
<el-table-column type="index"
width="60"
label="序号"
align="center">
<template slot-scope="scope">
{{ scope.$index + (page - 1) * pageSize + 1 }}
</template>
</el-table-column>
<el-table-column prop="schoolName"
label="学校"
min-width="150"
align="center"></el-table-column>
<el-table-column v-if="competitionType"
prop="teamName"
label="团队名称"
min-width="100"
align="center"></el-table-column>
<el-table-column prop="userName"
label="学生姓名"
min-width="100"
align="center"></el-table-column>
<el-table-column prop="workNumber"
label="学号"
min-width="100"
align="center"></el-table-column>
<el-table-column prop="score"
label="分数"
width="90"
align="center"></el-table-column>
<el-table-column prop="timeSum"
label="耗时"
width="90"
align="center">
<template slot-scope="scope">
{{ scope.row.timeSum }}min
</template>
</el-table-column>
<el-table-column prop="submitTime"
label="提交时间"
min-width="150"
align="center">
</el-table-column>
<el-table-column label="操作"
align="center"
width="160">
<template slot-scope="scope">
<el-button v-if="scope.row.reportId"
type="text"
@click="show(scope.row)">查看成绩报告</el-button>
<el-button type="text"
@click="handleDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<div class="pagination">
<el-pagination background
layout="total, prev, pager, next"
:total="total"
@current-change="handleCurrentChange"
:current-page="page">
</el-pagination>
</div>
</template>
<template v-else>
<el-table :data="list1"
class="table"
:key="2"
stripe
header-align="center"
@selection-change="handleSelectionChange1"
row-key="reportId">
<el-table-column type="selection"
width="55"
align="center"
:reserve-selection="true"></el-table-column>
<el-table-column type="index"
width="60"
label="序号"
align="center">
<template slot-scope="scope">
{{ scope.$index + (page1 - 1) * pageSize + 1 }}
</template>
</el-table-column>
<el-table-column prop="schoolName"
label="学校"
align="center"></el-table-column>
<el-table-column v-if="competitionType"
prop="teamName"
label="团队名称"
align="center"></el-table-column>
<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="fileName"
label="文件名"
align="center"></el-table-column>
<el-table-column prop="fileSize"
label="文件大小"
align="center"></el-table-column>
<el-table-column prop="fileFormat"
label="文件类型"
align="center"></el-table-column>
<el-table-column prop="fileFormat"
label="文件格式"
align="center"></el-table-column>
<el-table-column prop="createTime"
label="提交时间"
width="150"
align="center">
</el-table-column>
<el-table-column label="操作"
align="center"
width="160">
<template slot-scope="scope">
<el-button v-if="!isCompress(scope.row.fileFormat)"
type="text"
@click="preview(scope.row)">预览文件</el-button>
<el-button type="text"
@click="exportFile(scope.row)">导出文件</el-button>
</template>
</el-table-column>
</el-table>
<div class="pagination">
<el-pagination background
layout="total, prev, pager, next"
:total="total1"
@current-change="handleCurrentChange1"
:current-page="page1">
</el-pagination>
</div>
</template>
</el-card>
<el-dialog title="批量导入"
:visible.sync="importVisible"
width="24%"
:close-on-click-modal="false">
<div style="text-align: center">
<div style="margin-bottom: 10px;">
<el-button type="primary"
@click="download">模板下载<i class="el-icon-download el-icon--right"></i></el-button>
</div>
<el-upload ref="importStaff"
name="file"
accept=".xls,.xlsx"
:on-remove="handleRemove"
:on-error="uploadError"
:on-success="uploadSuccess"
:before-remove="beforeRemove"
:limit="1"
:on-exceed="handleExceed"
:action="this.api.batchImportGrades"
:file-list="uploadList"
:headers="headers"
:data="{
competitionId: this.id, competitionId: this.id,
stageId: this.stageId, stageId: this.stageId,
systemId: 0 systemId: 0
}" }">
> <el-button type="primary"
<el-button type="primary" class="ml20">上传文件<i class="el-icon-upload2 el-icon--right"></i></el-button> class="ml20">上传文件<i class="el-icon-upload2 el-icon--right"></i></el-button>
</el-upload> </el-upload>
<el-link v-if="uploadFaild" type="primary" @click="showFaild">部分数据导入失败查看失败原因</el-link> <el-link v-if="uploadFaild"
</div> type="primary"
<span slot="footer" class="dialog-footer"> @click="showFaild">部分数据导入失败查看失败原因</el-link>
<el-button size="small" @click="importVisible = false"> </el-button> </div>
<el-button size="small" type="primary" @click="uploadSure"> </el-button> <span slot="footer"
</span> class="dialog-footer">
</el-dialog> <el-button size="small"
</div> @click="importVisible = false"> </el-button>
<el-button size="small"
type="primary"
@click="uploadSure"> </el-button>
</span>
</el-dialog>
</div>
</template> </template>
<script> <script>
@ -114,221 +262,287 @@ import util from "@/libs/util";
import * as echarts from "echarts"; import * as echarts from "echarts";
import axios from 'axios'; import axios from 'axios';
export default { export default {
data() { data () {
return { return {
id: +this.$route.query.id, id: +this.$route.query.id,
stageId: +this.$route.query.stageId, stageId: +this.$route.query.stageId,
method: +this.$route.query.method, method: +this.$route.query.method,
competitionType: +this.$route.query.competitionType, competitionType: +this.$route.query.competitionType,
keyword: "", showFile: this.$route.query.showFile === 'true',
searchTimer: null, isCompress: util.isCompress,
list: [], keyword: "",
multipleSelection: [], searchTimer: null,
page: 1, list: [],
pageSize: 10, multipleSelection: [],
total: 0, page: 1,
totalNumber: 0, // pageSize: 10,
avgScore: 0, // total: 0,
importVisible: false,
uploadList: [], list1: [],
uploadFaild: false, multipleSelection1: [],
exportCode: '', page1: 1,
headers: { total1: 0,
token: sessionStorage.getItem("token")
}, totalNumber: 0, //
statData: {} avgScore: 0, //
}; importVisible: false,
uploadList: [],
uploadFaild: false,
exportCode: '',
headers: {
token: sessionStorage.getItem("token")
},
statData: {},
tabs: ['成绩列表', '文件列表'],
active: 0
};
},
watch: {
keyword: function (val) {
clearTimeout(this.searchTimer);
this.searchTimer = setTimeout(() => {
this.initData();
}, 500);
}
},
mounted () {
this.getData()
},
methods: {
getData () {
//
if (this.active) {
this.$post(this.api.cCompetitionStageFileList, {
pageNum: this.page1,
pageSize: this.pageSize,
competitionId: this.id,
stageId: this.stageId,
keyWord: this.keyword,
}).then(({ data }) => {
this.list1 = data.records
this.total1 = data.total
}).catch(res => { })
} else { //
this.$post(this.api.stageGradeManagementList, {
pageNum: this.page,
pageSize: this.pageSize,
competitionId: this.id,
keyWord: this.keyword,
stageId: this.stageId,
isNakadai: 1
}).then(({ data, page }) => {
this.total = page.total
this.list = page.records
this.statData = data
this.avgScore = (+data.avgScore).toFixed(2)
this.totalNumber = data.totalNumber
this.getChart()
}).catch(res => { })
}
}, },
watch: { initData () {
keyword: function(val) { this.page = 1
clearTimeout(this.searchTimer); this.getData()
this.searchTimer = setTimeout(() => {
this.initData();
}, 500);
}
}, },
mounted() { //
this.getData() show (row) {
this.$router.push(`/matchReport?reportId=${row.reportId}`)
}, },
methods: { // ()
getData() { exportData () {
this.$post(this.api.stageGradeManagementList, { // id
pageNum: this.page, if (this.multipleSelection.length) {
pageSize: this.pageSize, const ids = this.multipleSelection.map(e => e.reportId)
competitionId: this.id, url += `&ids=${ids.toString()}`
keyWord: this.keyword, }
stageId: this.stageId, axios.post(this.api.exportExperimentalResultsInBatch, this.list, {
isNakadai: 1 headers: this.headers,
}).then(({ data, page }) => { responseType: 'blob'
this.total = page.total }).then((res) => {
this.list = page.records util.downloadFileDirect(`赛事成绩.xls`, new Blob([res.data]))
this.statData = data }).catch(res => { })
this.avgScore = (+data.avgScore).toFixed(2) },
this.totalNumber = data.totalNumber // ()
this.getChart() exportData1 () {
}).catch(res => {}) // id
}, let ids
initData() { if (this.multipleSelection1.length) {
this.page = 1 ids = this.multipleSelection1.map(e => e.id)
this.getData() }
}, const data = {
// pageNum: 1,
show(row) { pageSize: 1000,
this.$router.push(`/matchReport?reportId=${row.reportId}`) competitionId: this.id,
}, stageId: this.stageId,
// () }
exportData() { if (ids) data.ids = ids
// id axios.post(this.api.derive, data, {
if (this.multipleSelection.length) { headers: this.headers,
const ids = this.multipleSelection.map(e => e.reportId) responseType: 'blob'
url += `&ids=${ids.toString()}` }).then((res) => {
} console.log("🚀 ~ file: matchArchList.vue:378 ~ exportData1 ~ res:", res)
axios.post(this.api.exportExperimentalResultsInBatch, this.list, { util.downloadFileDirect(`批量导出.zip`, new Blob([res.data]))
headers: this.headers, }).catch(res => { })
responseType: 'blob' },
}).then((res) => { handleDelete (row) { //
util.downloadFileDirect(`赛事成绩.xls`,new Blob([res.data])) this.$confirm("确定要删除吗?", "提示", {
}).catch(res => {}) type: "warning"
}, }).then(() => {
handleDelete(row) { // this.$post(this.api.batchDeleteContestGrade, {
this.$confirm("确定要删除吗?", "提示", { ids: [this.method == 2 ? row.scoreId : row.reportId],
type: "warning" competitionId: this.id,
}).then(() => { stageId: row.stageId
this.$post(this.api.batchDeleteContestGrade, { }).then(res => {
ids: [this.method == 2 ? row.scoreId : row.reportId], util.successMsg("删除成功");
competitionId: this.id, this.getData();
stageId: row.stageId }).catch(res => {
}).then(res => { });
util.successMsg("删除成功"); }).catch(() => {
this.getData(); });
}).catch(res => { },
}); delAllData () { //
}).catch(() => { if (this.multipleSelection.length) {
}); this.$confirm("该项目下的所有成绩报告将会删除,是否继续?", "提示", {
}, type: "warning"
delAllData() { // }).then(() => {
if (this.multipleSelection.length) { let ids = this.multipleSelection.map(item => {
this.$confirm("该项目下的所有成绩报告将会删除,是否继续?", "提示", { return this.method == 2 ? item.scoreId : item.reportId
type: "warning" });
}).then(() => { this.$post(this.api.batchDeleteContestGrade, {
let ids = this.multipleSelection.map(item => { ids,
return this.method == 2 ? item.scoreId : item.reportId competitionId: this.id,
}); stageId: this.stageId
this.$post(this.api.batchDeleteContestGrade, { }).then(res => {
ids, this.multipleSelection = [];
competitionId: this.id, this.$refs.table.clearSelection();
stageId: this.stageId util.successMsg("删除成功");
}).then(res => {
this.multipleSelection = [];
this.$refs.table.clearSelection();
util.successMsg("删除成功");
this.getData();
}).catch(res => {
});
}).catch(() => {
});
} else {
util.errorMsg("请先选择数据 !");
}
},
handleSelectionChange(val) { //
this.multipleSelection = val;
},
handleCurrentChange(val) { //
this.page = val;
this.getData(); this.getData();
}).catch(res => {
});
}).catch(() => {
});
} else {
util.errorMsg("请先选择数据 !");
}
},
handleSelectionChange (val) { //
this.multipleSelection = val;
},
handleCurrentChange (val) { //
this.page = val;
this.getData();
},
handleSelectionChange1 (val) { //
this.multipleSelection1 = val;
},
handleCurrentChange1 (val) { //
this.page1 = val;
this.getData();
},
getChart () { // 线
const data = []
const { statData } = this
for (let i = 1; i <= 10; i++) {
data.push(statData['num' + i])
}
let myChart = echarts.init(document.getElementById("chart"));
myChart.setOption({
title: { text: "实验分数分布图" },
tooltip: {},
xAxis: {
name: "分数",
type: "category",
boundaryGap: false,
interval: 10,
data: ["0-10", "11-20", "21-30", "31-40", "41-50", "51-60", "61-70", "71-80", "81-90", "91-100"]
}, },
getChart() { // 线 yAxis: {
const data = [] name: "人数",
const { statData } = this type: "value",
for (let i = 1; i <= 10; i++) { interval: 1
data.push(statData['num' + i])
}
let myChart = echarts.init(document.getElementById("chart"));
myChart.setOption({
title: { text: "实验分数分布图" },
tooltip: {},
xAxis: {
name: "分数",
type: "category",
boundaryGap: false,
interval: 10,
data: ["0-10", "11-20", "21-30", "31-40", "41-50", "51-60", "61-70", "71-80", "81-90", "91-100"]
},
yAxis: {
name: "人数",
type: "value",
interval: 1
},
series: [{
data,
type: "line",
areaStyle: {},
color: ["#8191fd"]
}]
});
},
//
batchImport() {
this.importVisible = true
this.uploadList = []
this.uploadFaild = false
},
//
download() {
location.href = this.api.gradeImport
},
//
handleExceed(files, fileList) {
util.warningMsg(
`当前限制选择 1 个文件,如需更换,请删除上一个文件再重新选择!`
)
},
//
showFaild() {
axios.get(`${this.api.performanceExportFailure}?exportCode=${this.exportCode}`, {
headers: this.headers,
responseType: 'blob'
}).then((res) => {
util.downloadFileDirect(`批量导入成绩管理失败数据导出.xls`, new Blob([res.data]))
}).catch(res => {})
},
uploadSuccess(res, file, fileList) {
this.uploadFaild = false
if (res.status === 200) {
if (res.data.exportCode) {
this.exportCode = res.data.exportCode
this.uploadFaild = true
util.errorMsg(`本次上传有${res.data.failureNum}个错误信息录入`)
}
} else {
res.message ? util.errorMsg(res.message) : util.errorMsg("上传失败,请检查数据")
}
},
uploadError(err, file, fileList) {
this.$message({
message: "上传出错,请重试!",
type: "error",
center: true
})
},
beforeRemove(file, fileList) {
return this.$confirm(`确定移除 ${file.name}`)
},
handleRemove(file, fileList) {
this.uploadList = fileList
this.uploadFaild = false
}, },
uploadSure() { series: [{
this.importVisible = false data,
this.getData() type: "line",
areaStyle: {},
color: ["#8191fd"]
}]
});
},
//
batchImport () {
this.importVisible = true
this.uploadList = []
this.uploadFaild = false
},
//
download () {
location.href = this.api.gradeImport
},
//
handleExceed (files, fileList) {
util.warningMsg(
`当前限制选择 1 个文件,如需更换,请删除上一个文件再重新选择!`
)
},
//
showFaild () {
axios.get(`${this.api.performanceExportFailure}?exportCode=${this.exportCode}`, {
headers: this.headers,
responseType: 'blob'
}).then((res) => {
util.downloadFileDirect(`批量导入成绩管理失败数据导出.xls`, new Blob([res.data]))
}).catch(res => { })
},
uploadSuccess (res, file, fileList) {
this.uploadFaild = false
if (res.status === 200) {
if (res.data.exportCode) {
this.exportCode = res.data.exportCode
this.uploadFaild = true
util.errorMsg(`本次上传有${res.data.failureNum}个错误信息录入`)
} }
} } else {
res.message ? util.errorMsg(res.message) : util.errorMsg("上传失败,请检查数据")
}
},
uploadError (err, file, fileList) {
this.$message({
message: "上传出错,请重试!",
type: "error",
center: true
})
},
beforeRemove (file, fileList) {
return this.$confirm(`确定移除 ${file.name}`)
},
handleRemove (file, fileList) {
this.uploadList = fileList
this.uploadFaild = false
},
uploadSure () {
this.importVisible = false
this.getData()
},
// tab
tabChange (i) {
this.active = i
this.getData()
},
//
preview (item) {
window.open((util.isDoc(item.fileFormat) ? 'https://view.officeapps.live.com/op/view.aspx?src=' : '') + item.filePath)
},
//
exportFile (item) {
util.downloadFile(item.userName + '-' + item.fileName, item.filePath)
},
}
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
/deep/ .head-card { /deep/ .head-card {
.el-card__body { .el-card__body {
padding-bottom: 0px; padding-bottom: 0px;

@ -248,7 +248,7 @@
:type.sync="projectManage.experimentHintType" :type.sync="projectManage.experimentHintType"
radio radio
:minHeight="150" :minHeight="150"
:height="150" /> :height="400" />
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>

Loading…
Cancel
Save