|
@@ -0,0 +1,383 @@
|
|
|
+<template>
|
|
|
+ <div class="main">
|
|
|
+ <el-row class="one" v-if="info.ext_status == '2'">
|
|
|
+ <el-col :span="10">
|
|
|
+ <el-form ref="ruleFormRef" :model="timeForm" :rules="rules" label-width="auto" class="form" label-position="left">
|
|
|
+ <el-form-item label="设置初审时间" prop="start_time">
|
|
|
+ <el-date-picker format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" v-model="timeForm.start_time" type="datetime" placeholder="请选择初审时间" style="width: 50%" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="14">
|
|
|
+ <el-button type="primary" :disabled="selectionList && selectionList.length > 0 ? false : true" v-if="info.ext_status == '2'" @click="submitForm(ruleFormRef)">补充初审时间</el-button>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="24">
|
|
|
+ <el-alert title="请设置初审时间并选择要填写初审时间的用户!" type="warning" :closable="false" />
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ <el-col :span="6" class="export">
|
|
|
+ <div class="one_left" @click="toExport">导出</div>
|
|
|
+ <div class="one_left" :disabled="selectionList && selectionList.length > 0 ? false : true" @click="toFinals">选择决赛名单</div>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="24" class="two">
|
|
|
+ <el-table :data="list" style="width: 100%" size="large" :header-cell-style="{ backgroundColor: '#edf3ff' }" @selection-change="handleSelectionChange">
|
|
|
+ <template #empty>
|
|
|
+ <el-empty description="暂无数据" />
|
|
|
+ </template>
|
|
|
+ <el-table-column type="selection" width="55"> </el-table-column>
|
|
|
+ <el-table-column prop="no" align="center" label="编号" width="100"> </el-table-column>
|
|
|
+ <el-table-column prop="user_name" align="center" label="用户"> </el-table-column>
|
|
|
+ <el-table-column prop="time" align="center" label="报名时间" />
|
|
|
+ <el-table-column prop="start_time" align="center" v-if="info.ext_status !== '0' || info.ext_status == '1'" label="初审时间"> </el-table-column>
|
|
|
+ <el-table-column prop="score" align="center" label="初审分数" v-if="info.ext_status !== '0' || info.ext_status == '1' || info.ext_status == '2' || info.ext_status == '3'"> </el-table-column>
|
|
|
+ <el-table-column prop="ext_status" align="center" label="流程状态">
|
|
|
+ <template #default="scope">
|
|
|
+ {{ getDict(scope.row.ext_status, 'ext_status') || '暂无' }}
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="status" align="center" label="状态" width="100">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-tag v-if="scope.row.status == '0'" type="primary">待审核</el-tag>
|
|
|
+ <el-tag v-else-if="scope.row.status == '1'" type="success">已通过</el-tag>
|
|
|
+ <el-tag v-else type="info">已退回</el-tag>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column align="center" label="操作" width="160">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-link :underline="false" type="primary" size="mini" @click="toView(row, true)" style="margin-right: 10px">查看</el-link>
|
|
|
+ <el-link :underline="false" v-if="info.ext_status == '4'" type="primary" size="mini" @click="toScore(row)">上传初审分数</el-link>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="24" class="thr">
|
|
|
+ <el-pagination background layout="prev, pager, next" :total="total" :page-size="limit" v-model:current-page="currentPage" @current-change="changePage" @size-change="sizeChange" />
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="24" class="button">
|
|
|
+ <el-button type="primary" v-if="info.ext_status == '1'" @click="toStep2">进入组织初审阶段</el-button>
|
|
|
+ <el-button type="primary" v-if="info.ext_status == '2'" @click="toStep3">进入初审公示名单阶段</el-button>
|
|
|
+ <el-button type="primary" v-if="info.ext_status == '3'" @click="toStep4">进入初审赛事进行阶段</el-button>
|
|
|
+ <el-button type="primary" v-if="info.ext_status == '4'" @click="toStep5">进入决赛组织决赛阶段</el-button>
|
|
|
+ </el-col>
|
|
|
+ <el-dialog v-model="dialog.show" :title="dialog.title" :destroy-on-close="false" @close="toClose">
|
|
|
+ <div v-if="dialog.type == '1'">
|
|
|
+ <el-descriptions title="" :column="1" border>
|
|
|
+ <el-descriptions-item v-for="(item, index) in extInfo" :key="index" :label="item.problem">
|
|
|
+ <div class="type" v-if="item.type == '0' || item.type == '2' || item.type == '3' || item.type == '4' || item.type == '5'">{{ item.reply || '暂无内容' }}</div>
|
|
|
+ <div class="type" v-if="item.type == '1' && item.reply">{{ item.reply.join(',') }}</div>
|
|
|
+ <div class="type" v-if="item.type == '6'">
|
|
|
+ <div v-for="(as, img) in item.reply" :key="img">
|
|
|
+ <el-link :href="getUrl(as)" target="_blank">{{ as.name }}</el-link>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="type" v-if="item.type == '7'">
|
|
|
+ <div class="list">
|
|
|
+ <div v-for="(aa, ina) in item.answer" :key="ina" class="name">{{ aa.text }}</div>
|
|
|
+ </div>
|
|
|
+ <div class="list" v-for="(gg, inx) in item.reply" :key="inx">
|
|
|
+ <div v-for="(aa, ina) in item.answer" :key="ina" class="input">
|
|
|
+ {{ gg[aa.text] }}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="type" v-if="item.type == '8'">
|
|
|
+ <div v-for="(as, img) in item.answer" :key="img">
|
|
|
+ <el-link :href="getUrl(as)" target="_blank">{{ as.name }}</el-link>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </el-descriptions-item>
|
|
|
+ <el-descriptions-item v-if="is_look" label="初审时间">{{ form.start_time }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item v-if="is_look" label="初审分数">{{ form.score }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item v-if="is_look" label="是否进入决赛">{{ getDict(form.final_confirm, 'final_confirm') || '暂无' }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item v-if="is_look" label="决赛时间">{{ form.final_start_time }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item v-if="is_look" label="决赛分数">{{ form.final_score }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item v-if="is_look" label="流程状态">{{ getDict(form.ext_status, 'ext_status') || '暂无' }}</el-descriptions-item>
|
|
|
+ </el-descriptions>
|
|
|
+ </div>
|
|
|
+ <div v-else-if="dialog.type == '2'">
|
|
|
+ <el-form ref="scoreFormRef" :model="scoreForm" :rules="scoreRules" label-width="auto" class="form" label-position="left">
|
|
|
+ <el-form-item label="初审分数" prop="score">
|
|
|
+ <el-input v-model="scoreForm.score" type="number" placeholder="请输入初审分数" />
|
|
|
+ </el-form-item>
|
|
|
+ <div style="text-align: center">
|
|
|
+ <el-button type="primary" @click="onSubmit(scoreFormRef)">保存初审分数</el-button>
|
|
|
+ </div>
|
|
|
+ </el-form>
|
|
|
+ </div>
|
|
|
+ </el-dialog>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+<script setup>
|
|
|
+import { get } from 'lodash-es'
|
|
|
+const id = ref('')
|
|
|
+const props = defineProps({
|
|
|
+ info: { type: Object }
|
|
|
+})
|
|
|
+const match = computed({
|
|
|
+ get() {
|
|
|
+ return props.info
|
|
|
+ }
|
|
|
+})
|
|
|
+// 接口
|
|
|
+import { MatchRegStore } from '@/store/api/platform/matchReg'
|
|
|
+const store = MatchRegStore()
|
|
|
+
|
|
|
+// 加载中
|
|
|
+const loading = ref(false)
|
|
|
+
|
|
|
+const timeForm = ref({})
|
|
|
+// 表单
|
|
|
+const ruleFormRef = ref()
|
|
|
+const rules = reactive({
|
|
|
+ start_time: [{ required: true, message: '请选择初审时间', trigger: 'blur' }]
|
|
|
+})
|
|
|
+// 列表
|
|
|
+const list = ref([])
|
|
|
+let skip = 0
|
|
|
+let limit = inject('limit')
|
|
|
+const total = ref(0)
|
|
|
+const currentPage = ref(1)
|
|
|
+
|
|
|
+const extInfo = ref([])
|
|
|
+
|
|
|
+const form = ref({})
|
|
|
+const dialog = ref({ type: '1', show: false, title: '报名信息' })
|
|
|
+
|
|
|
+// 流程状态字典表
|
|
|
+const extList = inject('extList')
|
|
|
+const isUseList = inject('isUseList')
|
|
|
+
|
|
|
+// 批量导出
|
|
|
+const selectionList = ref([])
|
|
|
+const is_look = ref(false)
|
|
|
+
|
|
|
+// 上传分数
|
|
|
+const scoreForm = ref({})
|
|
|
+// 表单
|
|
|
+const scoreFormRef = ref()
|
|
|
+const scoreRules = reactive({
|
|
|
+ score: [{ required: true, message: '请输入初审分数', trigger: 'blur' }]
|
|
|
+})
|
|
|
+
|
|
|
+const emits = defineEmits(['toStep2', 'stepFill', 'toExport', 'toStep3', 'toStep4', 'step4Score', 'toFinals', 'toStep5'])
|
|
|
+
|
|
|
+const search = async (query = { skip, limit }) => {
|
|
|
+ skip = query.skip
|
|
|
+ limit = query.limit
|
|
|
+ const data = {
|
|
|
+ skip: query.skip,
|
|
|
+ limit: query.limit,
|
|
|
+ match_id: id.value,
|
|
|
+ ext_status: match.value.ext_status
|
|
|
+ }
|
|
|
+ if (match.value.ext_status == '2' || match.value.ext_status == '3' || match.value.ext_status == '4') {
|
|
|
+ data.status = '0'
|
|
|
+ }
|
|
|
+ const res = await store.query(data)
|
|
|
+ if (res.errcode == '0') {
|
|
|
+ list.value = res.data
|
|
|
+ total.value = res.total
|
|
|
+ }
|
|
|
+}
|
|
|
+// 字典数据转换
|
|
|
+const getDict = (data, model) => {
|
|
|
+ if (data) {
|
|
|
+ let res
|
|
|
+ if (model == 'ext_status') res = extList.value.find((f) => f.value == data)
|
|
|
+ if (model == 'final_confirm') res = isUseList.value.find((f) => f.value == data)
|
|
|
+ return get(res, 'label')
|
|
|
+ }
|
|
|
+}
|
|
|
+const handleSelectionChange = (val) => {
|
|
|
+ selectionList.value = val
|
|
|
+}
|
|
|
+// 补充初审时间
|
|
|
+const submitForm = async (formEl) => {
|
|
|
+ if (!formEl) return
|
|
|
+ await formEl.validate(async (valid, fields) => {
|
|
|
+ if (valid) {
|
|
|
+ const data = {
|
|
|
+ start_time: timeForm.value.start_time,
|
|
|
+ match_id: id.value,
|
|
|
+ ids: selectionList.value.map((i) => {
|
|
|
+ return i.id
|
|
|
+ })
|
|
|
+ }
|
|
|
+ emits('stepFill', data)
|
|
|
+ } else {
|
|
|
+ console.log('error submit!', fields)
|
|
|
+ }
|
|
|
+ })
|
|
|
+}
|
|
|
+// 审核
|
|
|
+const toView = (data, is_no) => {
|
|
|
+ is_look.value = is_no
|
|
|
+ form.value = data
|
|
|
+ extInfo.value = data.info
|
|
|
+ dialog.value = { type: '1', show: true, title: '报名信息' }
|
|
|
+}
|
|
|
+// 上传初审分数
|
|
|
+const toScore = (data) => {
|
|
|
+ scoreForm.value = data
|
|
|
+ dialog.value = { type: '2', show: true, title: '上传初审分数' }
|
|
|
+}
|
|
|
+// 图片处理
|
|
|
+const getUrl = (e) => {
|
|
|
+ if (e) return `${import.meta.env.VITE_APP_HOST}${get(e, 'uri')}`
|
|
|
+}
|
|
|
+// 组织初审
|
|
|
+const toStep2 = () => {
|
|
|
+ emits('toStep2')
|
|
|
+}
|
|
|
+// 公示公告
|
|
|
+const toStep3 = () => {
|
|
|
+ emits('toStep3')
|
|
|
+}
|
|
|
+// 赛事进行
|
|
|
+const toStep4 = () => {
|
|
|
+ emits('toStep4')
|
|
|
+}
|
|
|
+// 决赛组织决赛
|
|
|
+const toStep5 = () => {
|
|
|
+ emits('toStep5')
|
|
|
+}
|
|
|
+// 保存初审分数
|
|
|
+const onSubmit = async (formEl) => {
|
|
|
+ if (!formEl) return
|
|
|
+ await formEl.validate((valid, fields) => {
|
|
|
+ if (valid) {
|
|
|
+ const data = { id: id.value, reg_id: scoreForm.value.id, score: parseInt(scoreForm.value.score) }
|
|
|
+ emits('step4Score', data)
|
|
|
+ toClose()
|
|
|
+ } else {
|
|
|
+ console.log('error submit!', fields)
|
|
|
+ }
|
|
|
+ })
|
|
|
+}
|
|
|
+// 分页
|
|
|
+const changePage = (page = currentPage.value) => {
|
|
|
+ search({ skip: (page - 1) * limit, limit: limit })
|
|
|
+}
|
|
|
+const sizeChange = (limits) => {
|
|
|
+ limit = limits
|
|
|
+ currentPage.value = 1
|
|
|
+ search({ skip: 0, limit: limit })
|
|
|
+}
|
|
|
+// 导出
|
|
|
+const toExport = () => {
|
|
|
+ if (selectionList.value && selectionList.value.length > 0) {
|
|
|
+ emits('toExport', selectionList)
|
|
|
+ } else {
|
|
|
+ ElMessage({
|
|
|
+ message: '请选择要导出的数据!',
|
|
|
+ type: 'warning'
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|
|
|
+// 选择决赛名单
|
|
|
+const toFinals = () => {
|
|
|
+ if (selectionList.value && selectionList.value.length > 0) {
|
|
|
+ const data = {
|
|
|
+ id: id.value,
|
|
|
+ ids: selectionList.value.map((i) => {
|
|
|
+ return i.id
|
|
|
+ })
|
|
|
+ }
|
|
|
+ emits('toFinals', data)
|
|
|
+ } else {
|
|
|
+ ElMessage({
|
|
|
+ message: '请选择要进入决赛的名单数据!',
|
|
|
+ type: 'warning'
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|
|
|
+const toClose = async () => {
|
|
|
+ is_look.value = false
|
|
|
+ form.value = {}
|
|
|
+ scoreForm.value = {}
|
|
|
+ dialog.value = { show: false }
|
|
|
+ await search({ skip, limit })
|
|
|
+}
|
|
|
+watch(
|
|
|
+ match,
|
|
|
+ async (item) => {
|
|
|
+ if (item.id) {
|
|
|
+ id.value = item.id
|
|
|
+ loading.value = true
|
|
|
+ await search({ skip, limit })
|
|
|
+ loading.value = false
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ immediate: true //初始化立即执行
|
|
|
+ }
|
|
|
+)
|
|
|
+</script>
|
|
|
+<style scoped lang="scss">
|
|
|
+.main {
|
|
|
+ .export {
|
|
|
+ display: flex;
|
|
|
+ justify-content: flex-start;
|
|
|
+ margin: 10px 0;
|
|
|
+ .one_left {
|
|
|
+ margin: 0 10px 0 0;
|
|
|
+ background: #1875df;
|
|
|
+ padding: 0 10px;
|
|
|
+ height: 30px;
|
|
|
+ color: #fff;
|
|
|
+ line-height: 30px;
|
|
|
+ text-align: center;
|
|
|
+ font-size: 16px;
|
|
|
+ cursor: default;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .thr {
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ margin: 20px 0 0 0;
|
|
|
+ }
|
|
|
+ .button {
|
|
|
+ margin: 20px 0 0 0;
|
|
|
+ text-align: center;
|
|
|
+ button {
|
|
|
+ width: 400px;
|
|
|
+ height: 40px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .type {
|
|
|
+ .image {
|
|
|
+ width: 100%;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .list {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ margin: 10px 0;
|
|
|
+
|
|
|
+ .name {
|
|
|
+ width: 50%;
|
|
|
+ text-align: center;
|
|
|
+ }
|
|
|
+
|
|
|
+ .input {
|
|
|
+ width: 50%;
|
|
|
+ margin: 0 5px 0 0;
|
|
|
+ border: 1px solid #e5e5e5;
|
|
|
+ border-radius: 5px;
|
|
|
+ text-align: center;
|
|
|
+
|
|
|
+ .name {
|
|
|
+ width: 50%;
|
|
|
+ text-align: center;
|
|
|
+ margin: 0 0 10px 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ :deep(.el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell) {
|
|
|
+ text-align: center;
|
|
|
+ width: 10px !important; /* 设置你想要的宽度 */
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|