|
@@ -9,7 +9,22 @@
|
|
</template>
|
|
</template>
|
|
</custom-search-bar>
|
|
</custom-search-bar>
|
|
<custom-button-bar :fields="buttonFields" @add="toAdd" @select="toMoreDelect"></custom-button-bar>
|
|
<custom-button-bar :fields="buttonFields" @add="toAdd" @select="toMoreDelect"></custom-button-bar>
|
|
- <custom-table :data="data" :fields="fields" @query="search" :total="total" :opera="opera" @score="toScore" @process="toProcess" @sign="toSign" @exam="toExam" @edit="toEdit" @delete="toDelete" @toSelect="toSelect" :select="false">
|
|
|
|
|
|
+ <custom-table
|
|
|
|
+ :data="data"
|
|
|
|
+ :fields="fields"
|
|
|
|
+ @query="search"
|
|
|
|
+ :total="total"
|
|
|
|
+ :opera="opera"
|
|
|
|
+ @score="toScore"
|
|
|
|
+ @preliminary="toPreliminary"
|
|
|
|
+ @process="toProcess"
|
|
|
|
+ @sign="toSign"
|
|
|
|
+ @exam="toExam"
|
|
|
|
+ @edit="toEdit"
|
|
|
|
+ @delete="toDelete"
|
|
|
|
+ @toSelect="toSelect"
|
|
|
|
+ :select="false"
|
|
|
|
+ >
|
|
<template #is_use="{ row }">
|
|
<template #is_use="{ row }">
|
|
<el-tag v-if="row.is_use == '0'" type="success" @click="toUse(row, '1')">启用</el-tag>
|
|
<el-tag v-if="row.is_use == '0'" type="success" @click="toUse(row, '1')">启用</el-tag>
|
|
<el-tag v-else type="info" @click="toUse(row, '0')">禁用</el-tag>
|
|
<el-tag v-else type="info" @click="toUse(row, '0')">禁用</el-tag>
|
|
@@ -146,6 +161,25 @@
|
|
</template>
|
|
</template>
|
|
</custom-form>
|
|
</custom-form>
|
|
</el-tab-pane>
|
|
</el-tab-pane>
|
|
|
|
+ <el-tab-pane label="调查问卷" name="fourth" v-if="form.form == '4'">
|
|
|
|
+ <el-col :span="24" class="add">
|
|
|
|
+ <el-button type="primary" @click="addInvest()">添加</el-button>
|
|
|
|
+ </el-col>
|
|
|
|
+ <el-table :data="investigateList" border>
|
|
|
|
+ <el-table-column type="index" label="序号" width="80" align="center"> </el-table-column>
|
|
|
|
+ <el-table-column prop="problem" label="问题" align="center"> </el-table-column>
|
|
|
|
+ <el-table-column label="操作" align="center" width="200">
|
|
|
|
+ <template #default="scope">
|
|
|
|
+ <el-button size="mini" type="primary" @click="updateInvest(scope.row)">修改</el-button>
|
|
|
|
+ <el-button size="mini" type="danger" @click="delInvest(scope.row)">删除</el-button>
|
|
|
|
+ </template>
|
|
|
|
+ </el-table-column>
|
|
|
|
+ </el-table>
|
|
|
|
+ <div class="button">
|
|
|
|
+ <el-button type="warning" @click="InvestSave('-2')">保存草稿</el-button>
|
|
|
|
+ <el-button type="primary" @click="InvestSave('0')">保存并提交审核</el-button>
|
|
|
|
+ </div>
|
|
|
|
+ </el-tab-pane>
|
|
</el-tabs>
|
|
</el-tabs>
|
|
</el-col>
|
|
</el-col>
|
|
<el-col :span="24" v-if="dialog.type == '2'">
|
|
<el-col :span="24" v-if="dialog.type == '2'">
|
|
@@ -162,8 +196,44 @@
|
|
<el-col :span="24" v-if="dialog.type === '4'">
|
|
<el-col :span="24" v-if="dialog.type === '4'">
|
|
<score :matchInfo="matchInfo"></score>
|
|
<score :matchInfo="matchInfo"></score>
|
|
</el-col>
|
|
</el-col>
|
|
|
|
+ <el-col :span="24" v-if="dialog.type === '5'">
|
|
|
|
+ <preliminary :matchInfo="matchInfo"></preliminary>
|
|
|
|
+ </el-col>
|
|
</el-row>
|
|
</el-row>
|
|
</el-dialog>
|
|
</el-dialog>
|
|
|
|
+ <el-dialog v-model="dialogVisible" title="调查问卷填写" width="800" :destroy-on-close="false" @close="toInvestClose">
|
|
|
|
+ <custom-form v-model="investigateForm" :fields="fourformFields" :rules="fourRules" @save="toInvestigateSave" submitText="保存" :DraftSave="false">
|
|
|
|
+ <template #type>
|
|
|
|
+ <el-option v-for="i in proTypeList" :key="i.value" :label="i.label" :value="i.value"></el-option>
|
|
|
|
+ </template>
|
|
|
|
+ <template #answer>
|
|
|
|
+ <div class="answer" v-if="investigateForm.type == '0' || investigateForm.type == '1' || investigateForm.type == '2' || investigateForm.type == '6'">
|
|
|
|
+ <el-col :span="24" class="add">
|
|
|
|
+ <el-button type="primary" @click="addAnswer()">添加</el-button>
|
|
|
|
+ </el-col>
|
|
|
|
+ <el-table :data="answerList" border>
|
|
|
|
+ <el-table-column type="index" label="序号" width="80" align="center"> </el-table-column>
|
|
|
|
+ <el-table-column prop="text" label="答案" align="center" width="500">
|
|
|
|
+ <template #default="scope">
|
|
|
|
+ <el-input v-model="scope.row.text" placeholder="请输入答案" />
|
|
|
|
+ </template>
|
|
|
|
+ </el-table-column>
|
|
|
|
+ <el-table-column label="操作" align="center" width="100">
|
|
|
|
+ <template #default="scope">
|
|
|
|
+ <el-button type="danger" @click="delAnswer(scope.row)">删除</el-button>
|
|
|
|
+ </template>
|
|
|
|
+ </el-table-column>
|
|
|
|
+ </el-table>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="answer" v-if="investigateForm.type == '7'">
|
|
|
|
+ <custom-upload model="file" :list="answerFile" :limit="1" url="/files/web/cxyy_match/upload" @change="onaUpload"></custom-upload>
|
|
|
|
+ </div>
|
|
|
|
+ </template>
|
|
|
|
+ <template #is_must>
|
|
|
|
+ <el-radio v-for="i in isUseList" :key="i.id" :label="i.value">{{ i.label }}</el-radio>
|
|
|
|
+ </template>
|
|
|
|
+ </custom-form>
|
|
|
|
+ </el-dialog>
|
|
</template>
|
|
</template>
|
|
|
|
|
|
<script setup>
|
|
<script setup>
|
|
@@ -172,10 +242,12 @@ import moment from 'moment'
|
|
import { cloneDeep, get } from 'lodash-es'
|
|
import { cloneDeep, get } from 'lodash-es'
|
|
const $checkRes = inject('$checkRes')
|
|
const $checkRes = inject('$checkRes')
|
|
const { t } = useI18n()
|
|
const { t } = useI18n()
|
|
|
|
+const router = useRouter()
|
|
// 组件
|
|
// 组件
|
|
import table1 from '../match/sign/table-1.vue'
|
|
import table1 from '../match/sign/table-1.vue'
|
|
import table2 from '../match/sign/table-2.vue'
|
|
import table2 from '../match/sign/table-2.vue'
|
|
import score from '../match/score/index.vue'
|
|
import score from '../match/score/index.vue'
|
|
|
|
+import preliminary from '../match/preliminary/index.vue'
|
|
// 接口
|
|
// 接口
|
|
import { MatchStore } from '@/store/api/platform/match'
|
|
import { MatchStore } from '@/store/api/platform/match'
|
|
import { ProcessStore } from '@/store/api/platform/process'
|
|
import { ProcessStore } from '@/store/api/platform/process'
|
|
@@ -199,6 +271,7 @@ const fields = [
|
|
{ label: t('pages.match.status'), model: 'status', format: (i) => getDict(i, 'status') }
|
|
{ label: t('pages.match.status'), model: 'status', format: (i) => getDict(i, 'status') }
|
|
]
|
|
]
|
|
const opera = [
|
|
const opera = [
|
|
|
|
+ { label: t('common.preliminary'), method: 'preliminary', display: (i) => i.form === '4' },
|
|
{ label: t('common.score'), method: 'score', display: (i) => i.match_status == '2' && i.form != '3' },
|
|
{ label: t('common.score'), method: 'score', display: (i) => i.match_status == '2' && i.form != '3' },
|
|
{ label: t('common.sign'), method: 'sign', type: 'warning' },
|
|
{ label: t('common.sign'), method: 'sign', type: 'warning' },
|
|
{
|
|
{
|
|
@@ -295,6 +368,38 @@ const rulesFields = ref([
|
|
{ label: t('pages.match.rules11'), model: 'rules11', custom: true },
|
|
{ label: t('pages.match.rules11'), model: 'rules11', custom: true },
|
|
{ label: t('pages.match.rules12'), model: 'rules12', custom: true }
|
|
{ label: t('pages.match.rules12'), model: 'rules12', custom: true }
|
|
])
|
|
])
|
|
|
|
+// 调查问卷
|
|
|
|
+const investigateList = ref([])
|
|
|
|
+const investigateForm = ref({})
|
|
|
|
+const fourformFields = ref([
|
|
|
|
+ { label: '问题', model: 'problem' },
|
|
|
|
+ { label: '类型', model: 'type', type: 'select' },
|
|
|
|
+ {
|
|
|
|
+ label: '答案',
|
|
|
|
+ model: 'answer',
|
|
|
|
+ custom: true,
|
|
|
|
+ display: () => investigateForm.value.type == '0' || investigateForm.value.type == '1' || investigateForm.value.type == '2' || investigateForm.value.type == '6' || investigateForm.value.type == '7'
|
|
|
|
+ },
|
|
|
|
+ { label: '是否必填', model: 'is_must', type: 'radio' },
|
|
|
|
+ { label: '备注', model: 'remark', type: 'textarea' }
|
|
|
|
+])
|
|
|
|
+const fourRules = reactive({
|
|
|
|
+ problem: [{ required: true, message: '请输入问题', trigger: 'blur' }]
|
|
|
|
+})
|
|
|
|
+const dialogVisible = ref(false)
|
|
|
|
+const proTypeList = ref([
|
|
|
|
+ { value: '0', label: '单选' },
|
|
|
|
+ { value: '1', label: '多选' },
|
|
|
|
+ { value: '2', label: '下拉' },
|
|
|
|
+ { value: '3', label: '单行文本' },
|
|
|
|
+ { value: '4', label: '多行文本' },
|
|
|
|
+ { value: '5', label: '图片/文件' },
|
|
|
|
+ { value: '6', label: '数组' },
|
|
|
|
+ { value: '7', label: '附件模板' }
|
|
|
|
+])
|
|
|
|
+// 答案
|
|
|
|
+const answerList = ref([])
|
|
|
|
+const answerFile = ref([])
|
|
// 请求
|
|
// 请求
|
|
onMounted(async () => {
|
|
onMounted(async () => {
|
|
loading.value = true
|
|
loading.value = true
|
|
@@ -384,14 +489,19 @@ const toMoreDelect = () => {
|
|
const toAdd = () => {
|
|
const toAdd = () => {
|
|
dialog.value = { type: '1', show: true, title: t('pages.match.addDialogTitle') }
|
|
dialog.value = { type: '1', show: true, title: t('pages.match.addDialogTitle') }
|
|
}
|
|
}
|
|
|
|
+
|
|
// 修改
|
|
// 修改
|
|
const toEdit = async (data) => {
|
|
const toEdit = async (data) => {
|
|
- data.time = [data.start_time, data.end_time]
|
|
|
|
- if (!data.file) data.file = []
|
|
|
|
- if (!data.video) data.video = []
|
|
|
|
- form.value = data
|
|
|
|
- await searchProcess()
|
|
|
|
- dialog.value = { type: '1', show: true, title: t('pages.match.upDialogTitle') }
|
|
|
|
|
|
+ let res = await store.fetch(data.id)
|
|
|
|
+ if (res.errcode == '0') {
|
|
|
|
+ res.data.time = [data.start_time, data.end_time]
|
|
|
|
+ if (!res.data.file) res.data.file = []
|
|
|
|
+ if (!res.data.video) res.data.video = []
|
|
|
|
+ form.value = res.data
|
|
|
|
+ if (res.data.ext_info && res.data.ext_info.length > 0) investigateList.value = res.data.ext_info
|
|
|
|
+ await searchProcess()
|
|
|
|
+ dialog.value = { type: '1', show: true, title: t('pages.match.upDialogTitle') }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
// 报名管理
|
|
// 报名管理
|
|
const toSign = (data) => {
|
|
const toSign = (data) => {
|
|
@@ -403,6 +513,11 @@ const toScore = (data) => {
|
|
matchInfo.value = data
|
|
matchInfo.value = data
|
|
dialog.value = { type: '4', show: true, title: t('pages.match.scoreDialogTitle') }
|
|
dialog.value = { type: '4', show: true, title: t('pages.match.scoreDialogTitle') }
|
|
}
|
|
}
|
|
|
|
+// 查看初赛信息
|
|
|
|
+const toPreliminary = (data) => {
|
|
|
|
+ matchInfo.value = data
|
|
|
|
+ dialog.value = { type: '5', show: true, title: t('pages.match.limiDialogTitle') }
|
|
|
|
+}
|
|
// 删除
|
|
// 删除
|
|
const toDelete = async (data) => {
|
|
const toDelete = async (data) => {
|
|
const res = await store.del(data.id)
|
|
const res = await store.del(data.id)
|
|
@@ -437,7 +552,7 @@ const toExamSave = async () => {
|
|
const data = cloneDeep(examForm.value)
|
|
const data = cloneDeep(examForm.value)
|
|
let res = await store.update({ id: data.id, status: data.status })
|
|
let res = await store.update({ id: data.id, status: data.status })
|
|
if ($checkRes(res, true)) {
|
|
if ($checkRes(res, true)) {
|
|
- search({ skip, limit })
|
|
|
|
|
|
+ await search({ skip, limit })
|
|
toClose()
|
|
toClose()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -491,6 +606,7 @@ const toReset = async () => {
|
|
const toClose = () => {
|
|
const toClose = () => {
|
|
form.value = { rules: {}, video: [], file: [] }
|
|
form.value = { rules: {}, video: [], file: [] }
|
|
dialog.value = { show: false }
|
|
dialog.value = { show: false }
|
|
|
|
+ investigateList.value = []
|
|
activeName.value = 'first'
|
|
activeName.value = 'first'
|
|
}
|
|
}
|
|
// 上传图片
|
|
// 上传图片
|
|
@@ -498,6 +614,69 @@ const onUpload = (e) => {
|
|
const { model, value } = e
|
|
const { model, value } = e
|
|
form.value[model] = value
|
|
form.value[model] = value
|
|
}
|
|
}
|
|
|
|
+// 调查问卷填写
|
|
|
|
+const addInvest = () => {
|
|
|
|
+ dialogVisible.value = true
|
|
|
|
+ investigateForm.value = { sid: moment().valueOf(), problem: '', type: '', is_must: '', reply: '', answer: '', remark: '' }
|
|
|
|
+}
|
|
|
|
+// 调查问卷修改
|
|
|
|
+const updateInvest = (e) => {
|
|
|
|
+ dialogVisible.value = true
|
|
|
|
+ if (e.answer && e.answer.length > 0) answerList.value = e.answer
|
|
|
|
+ investigateForm.value = e
|
|
|
|
+}
|
|
|
|
+// 删除调查问卷
|
|
|
|
+const delInvest = async (e) => {
|
|
|
|
+ let list = investigateList.value.filter((i) => i.sid != e.sid)
|
|
|
|
+ investigateList.value = list
|
|
|
|
+}
|
|
|
|
+// 保存
|
|
|
|
+const toInvestigateSave = (data) => {
|
|
|
|
+ if (answerList.value && answerList.value.length > 0) data.answer = answerList.value
|
|
|
|
+ else data.answer = answerFile.value
|
|
|
|
+ let investigate = investigateList.value.find((i) => i.sid == data.sid)
|
|
|
|
+ if (investigate) {
|
|
|
|
+ investigateList.value = investigateList.value.map((i) => {
|
|
|
|
+ if (i.sid == data.sid) return data
|
|
|
|
+ else return i
|
|
|
|
+ })
|
|
|
|
+ } else investigateList.value.push(data)
|
|
|
|
+ toInvestClose()
|
|
|
|
+}
|
|
|
|
+const toInvestClose = () => {
|
|
|
|
+ investigateForm.value = {}
|
|
|
|
+ answerList.value = []
|
|
|
|
+ dialogVisible.value = false
|
|
|
|
+}
|
|
|
|
+// 答案添加
|
|
|
|
+const addAnswer = () => {
|
|
|
|
+ let list = answerList.value || []
|
|
|
|
+ list.push({ sid: moment().valueOf(), text: '' })
|
|
|
|
+ answerList.value = list
|
|
|
|
+}
|
|
|
|
+// 答案删除
|
|
|
|
+const delAnswer = async (e) => {
|
|
|
|
+ let list = answerList.value.filter((i) => i.sid != e.sid)
|
|
|
|
+ answerList.value = list
|
|
|
|
+}
|
|
|
|
+// 保存并提交审核
|
|
|
|
+const InvestSave = async (status) => {
|
|
|
|
+ const data = cloneDeep(form.value)
|
|
|
|
+ const other = { status }
|
|
|
|
+ let res
|
|
|
|
+ if (get(data, 'id')) res = await store.update({ id: data.id, ext_info: investigateList.value, ...other, ...data })
|
|
|
|
+ else res = await store.create({ ext_info: investigateList.value, ...other, ...data })
|
|
|
|
+ if (res.errcode == 0) {
|
|
|
|
+ ElMessage({ message: `发布成功可以上历史发布查看`, type: 'success' })
|
|
|
|
+ await search({ skip, limit })
|
|
|
|
+ await toClose()
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+// 上传图片
|
|
|
|
+const onaUpload = (e) => {
|
|
|
|
+ const { value } = e
|
|
|
|
+ answerFile.value = value
|
|
|
|
+}
|
|
</script>
|
|
</script>
|
|
<style scoped lang="scss">
|
|
<style scoped lang="scss">
|
|
.rules {
|
|
.rules {
|
|
@@ -512,6 +691,13 @@ const onUpload = (e) => {
|
|
margin-left: 0 !important;
|
|
margin-left: 0 !important;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+.add {
|
|
|
|
+ margin: 0 0 10px 0;
|
|
|
|
+}
|
|
|
|
+.button {
|
|
|
|
+ text-align: center;
|
|
|
|
+ margin: 10px 0 0 0;
|
|
|
|
+}
|
|
.tables {
|
|
.tables {
|
|
.tables_1 {
|
|
.tables_1 {
|
|
margin: 0 0 10px 0;
|
|
margin: 0 0 10px 0;
|