ai-interview-ui/src/views/recruitment/components/JobSettingEndit.vue

632 lines
19 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<script setup>
import { ref } from 'vue'
import {
useGetJobById,
useUpdateJob,
useUpdateJobSetting
} from '@/api/recruitment'
import {
useGetImagesList,
useGetBackgroundList,
useGetLogoList
} from '@/api/interview'
import { Upload, Picture } from '@element-plus/icons-vue'
import { useCompanyStore, useUserStore } from '@/stores'
import { pcaTextArr } from 'element-china-area-data'
import { useGetTypeListByType } from '@/api/question'
import { ElMessage } from 'element-plus'
const region_data = ref()
region_data.value = pcaTextArr
const companyStore = useCompanyStore()
const emit = defineEmits(['getJobSettingList'])
const userStore = useUserStore()
const enditDialog = ref(false)
const active = ref(0)
const FormModel = ref({
id: '',
jobName: '',
address: [],
addressDetail: '',
details: '',
startTime: '',
endTime: '',
minSalary: '',
maxSalary: '',
minNumber: '',
maxNumber: '',
requirement: 1,
jobType: 1,
jobTips: [],
userId: '',
encoding: ''
})
const rules = {
jobName: [{ required: true, message: '请输入岗位名称', trigger: 'blur' }],
details: [{ required: true, message: '请输入岗位详情', trigger: 'blur' }],
address: [{ required: true, message: '请选择工作地址', trigger: 'blur' }],
startTime: [{ required: true, message: '请选择工作时间', trigger: 'blur' }],
minNumber: [{ required: true, message: '请输入招聘人数', trigger: 'blur' }],
minSalary: [{ required: true, message: '请输入薪资', trigger: 'blur' }],
jobTips: [{ required: true, message: '请输入/选择岗位标签', trigger: 'blur' }]
}
const submitFormModel = ref({
jobId: '',
imagesId: '',
backgroundId: '',
logoId: '',
professional: '',
comprehensive: '',
psychology: '',
userId: '',
encoding: '',
jobPromote: ''
})
const openProfessional = ref('0')
const openComprehensive = ref('0')
const openPsychology = ref('0')
const professionalList = ref([])
const comprehensiveList = ref([])
const psychologyList = ref([])
const imagesList = ref([])
const backgroundList = ref([])
const logoList = ref([])
const tips = ref([
{
value: 'HTML',
label: 'HTML'
},
{
value: 'CSS',
label: 'CSS'
},
{
value: 'JavaScript',
label: 'JavaScript'
}
])
const open = async (row) => {
submitFormModel.value = row
console.log(submitFormModel.value)
enditDialog.value = true
const res = await useGetJobById(row.jobId)
FormModel.value = res.data.data
FormModel.value.address = FormModel.value.address.slice(1, -1).split(', ')
FormModel.value.jobTips = FormModel.value.jobTips.slice(1, -1).split(', ')
FormModel.value.addressDetail = res.data.data.addressDetail
FormModel.value.encoding = companyStore.encoding
FormModel.value.userId = userStore.userInfo.id
if (submitFormModel.value.professional !== 0) {
openProfessional.value = '1'
}
if (submitFormModel.value.comprehensive !== 0) {
openComprehensive.value = '1'
}
if (submitFormModel.value.psychology !== 0) {
openPsychology.value = '1'
}
if (submitFormModel.value.professional === 0) {
submitFormModel.value.professional = ''
}
if (submitFormModel.value.comprehensive === 0) {
submitFormModel.value.comprehensive = ''
}
if (submitFormModel.value.psychology === 0) {
submitFormModel.value.psychology = ''
}
}
const handleEndit = async () => {
const res = await useUpdateJob(FormModel.value)
ElMessage.success(res.data.data)
}
const handleProfessional = async () => {
const res = await useGetTypeListByType(FormModel.value.encoding, 1)
professionalList.value = res.data.data
console.log(res)
}
const handleComprehensive = async () => {
const res = await useGetTypeListByType(FormModel.value.encoding, 2)
comprehensiveList.value = res.data.data
console.log(res)
}
const handlePsychology = async () => {
const res = await useGetTypeListByType(FormModel.value.encoding, 3)
psychologyList.value = res.data.data
console.log(res)
}
const next = async () => {
if (active.value === 0) {
const res = await useGetImagesList(FormModel.value.encoding)
imagesList.value = res.data.data
console.log(imagesList.value)
}
if (active.value === 1) {
if (!submitFormModel.value.imagesId) {
ElMessage.error('请选择面试官形象!')
return
}
const res = await useGetBackgroundList(FormModel.value.encoding)
backgroundList.value = res.data.data
}
if (active.value === 2) {
if (!submitFormModel.value.backgroundId) {
ElMessage.error('请选择面试背景图片!')
return
}
const res = await useGetLogoList(FormModel.value.encoding)
logoList.value = res.data.data
}
if (active.value === 3) {
if (!submitFormModel.value.logoId) {
ElMessage.error('请选择公司logo')
return
}
const res = await useGetLogoList(FormModel.value.encoding)
logoList.value = res.data.data
handleProfessional()
handleComprehensive()
handlePsychology()
}
if (active.value === 4) {
if (
openProfessional.value === '0' &&
openComprehensive.value === '0' &&
openPsychology.value === '0'
) {
ElMessage.error('请至少选择一个题库')
return
}
}
active.value = active.value + 1
}
const before = () => {
active.value = active.value - 1
}
const submit = async () => {
if (submitFormModel.value.professional === '') {
submitFormModel.value.professional = 0
}
if (submitFormModel.value.comprehensive === '') {
submitFormModel.value.comprehensive = 0
}
if (submitFormModel.value.psychology === '') {
submitFormModel.value.psychology = 0
}
submitFormModel.value.userId = userStore.userInfo.id
console.log(submitFormModel.value)
const res = await useUpdateJobSetting(submitFormModel.value)
ElMessage.success(res.data.data)
console.log(submitFormModel.value)
active.value = 0
enditDialog.value = false
emit('getJobSettingList')
}
defineExpose({
open
})
</script>
<template>
<el-dialog v-model="enditDialog" title="岗位面试设置" width="50%">
<el-scrollbar height="600px">
<el-steps :space="200" :active="active" simple finish-status="success">
<el-step title="修改岗位信息" :icon="Upload" />
<el-step title="选择形象" :icon="Picture" />
<el-step title="选择背景" :icon="Picture" />
<el-step title="选择logo" :icon="Picture" />
<el-step title="选择题库" :icon="Picture" />
<el-step title="填写岗位promote" :icon="Picture" />
</el-steps>
<div v-if="active === 0">
<el-form
ref="form"
label-width="150px"
style="padding-right: 30px; padding-top: 5%"
:model="FormModel"
:rules="rules"
>
<el-form-item label="岗位名称" prop="jobName">
<el-input
v-model="FormModel.jobName"
placeholder="请输入岗位名称"
id="jobName"
></el-input>
</el-form-item>
<el-form-item label="岗位详情" prop="details">
<el-input
v-model="FormModel.details"
:autosize="{ minRows: 2, maxRows: 4 }"
type="textarea"
placeholder="请输入岗位详情"
id="details"
/>
</el-form-item>
<el-form-item label="工作地址" prop="address">
<el-cascader
v-model="FormModel.address"
:options="region_data"
placeholder="请选择地址"
/>
<el-input
style="width: 50%; padding-left: 5%"
v-model="FormModel.addressDetail"
placeholder="请输入详细地址"
id="address"
></el-input>
</el-form-item>
<el-form-item label="工作时间" prop="startTime">
<div>
<el-time-select
v-model="FormModel.startTime"
:max-time="FormModel.endTime"
class="mr-4"
placeholder="上班时间"
start="06:30"
step="00:30"
end="22:00"
/>
-
<el-time-select
v-model="FormModel.endTime"
:min-time="FormModel.startTime"
placeholder="下班时间"
start="06:30"
step="00:30"
end="22:00"
/>
</div>
</el-form-item>
<el-form-item label="人数要求" prop="minNumber">
<el-input
style="width: 30%"
v-model="FormModel.minNumber"
placeholder="请输入最低人数--10"
id="min_number"
></el-input>
-
<el-input
style="width: 30%"
v-model="FormModel.maxNumber"
placeholder="请输入最高人数--200"
id="max_number"
></el-input>
</el-form-item>
<el-form-item label="薪资" prop="minSalary">
<el-input
style="width: 30%"
v-model="FormModel.minSalary"
placeholder="请输入最低薪资--5k"
id="min_salary"
></el-input>
-
<el-input
style="width: 30%"
v-model="FormModel.maxSalary"
placeholder="请输入最高薪资--10k"
id="max_salary"
></el-input>
</el-form-item>
<el-form-item label="学历要求" prop="requetment">
<el-radio-group v-model="FormModel.requirement">
<el-radio :label="1">无学历要求</el-radio>
<el-radio :label="2">小学/初中</el-radio>
<el-radio :label="3">高中/中专</el-radio>
<el-radio :label="4">大专及以上</el-radio>
<el-radio :label="5">本科及以上</el-radio>
<el-radio :label="6">研究生及以上</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="岗位类型" prop="jobType">
<el-radio-group v-model="FormModel.jobType">
<el-radio :label="1">行政</el-radio>
<el-radio :label="2">财务</el-radio>
<el-radio :label="3">技术</el-radio>
<el-radio :label="4">销售</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="岗位tips" prop="jobTips">
<el-select
v-model="FormModel.jobTips"
multiple
filterable
allow-create
default-first-option
:reserve-keyword="false"
placeholder="请选择岗位或添加标签"
>
<el-option
v-for="item in tips"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-form>
<div style="text-align: center">
<el-button type="primary" @click="handleEndit">保存修改</el-button>
</div>
</div>
<div :style="{ marginTop: '20px' }" v-if="active === 1">
<p>请选择面试官形象</p>
<a-radio-group v-model="submitFormModel.imagesId">
<template v-for="item in imagesList" :key="item.id">
<a-radio :value="item.id">
<template #radio="{ checked }">
<a-space
align="start"
class="custom-radio-card"
:class="{ 'custom-radio-card-checked': checked }"
>
<div className="custom-radio-card-mask">
<div className="custom-radio-card-mask-dot" />
</div>
<div>
<div className="custom-radio-card-title">
{{ item.picName }}
</div>
<a-image
width="200"
height="200"
:preview="false"
:src="item.image"
/>
</div>
</a-space>
</template>
</a-radio>
</template>
</a-radio-group>
</div>
<div :style="{ marginTop: '20px' }" v-if="active === 2">
<p>请选择面试背景图片</p>
<a-radio-group v-model="submitFormModel.backgroundId">
<template v-for="item in backgroundList" :key="item.id">
<a-radio :value="item.id">
<template #radio="{ checked }">
<a-space
align="start"
class="custom-radio-card"
:class="{ 'custom-radio-card-checked': checked }"
>
<div className="custom-radio-card-mask">
<div className="custom-radio-card-mask-dot" />
</div>
<div>
<div className="custom-radio-card-title">
{{ item.picName }}
</div>
<a-image
width="200"
height="200"
:preview="false"
:src="item.image"
/>
</div>
</a-space>
</template>
</a-radio>
</template>
</a-radio-group>
</div>
<div :style="{ marginTop: '20px' }" v-if="active === 3">
<p>请选择公司logo</p>
<a-radio-group v-model="submitFormModel.logoId">
<template v-for="item in logoList" :key="item.id">
<a-radio :value="item.id">
<template #radio="{ checked }">
<a-space
align="start"
class="custom-radio-card"
:class="{ 'custom-radio-card-checked': checked }"
>
<div className="custom-radio-card-mask">
<div className="custom-radio-card-mask-dot" />
</div>
<div>
<div className="custom-radio-card-title">
{{ item.picName }}
</div>
<a-image
width="200"
height="200"
:preview="false"
:src="item.image"
/>
</div>
</a-space>
</template>
</a-radio>
</template>
</a-radio-group>
</div>
<div :style="{ marginTop: '20px' }" v-if="active === 4">
<p>请选择题库</p>
<div style="margin-top: 30px">
<a-card class="card-demo" title="是否开启专业测试?" hoverable>
<template #extra>
<a-switch
v-model="openProfessional"
checked-value="1"
unchecked-value="0"
/>
</template>
请选择专业题库 <br />
<br />
<el-select
v-model="submitFormModel.professional"
clearable
placeholder="请选择专业题库"
:disabled="openProfessional === '0' ? true : false"
>
<el-option
v-for="item in professionalList"
:key="item.id"
:label="item.typeName"
:value="item.id"
/>
</el-select>
</a-card>
</div>
<div style="margin-top: 30px">
<a-card class="card-demo" title="是否开启综合测试?" hoverable>
<template #extra>
<a-switch
v-model="openComprehensive"
checked-value="1"
unchecked-value="0"
/>
</template>
请选择综合题库 <br />
<br />
<el-select
v-model="submitFormModel.comprehensive"
clearable
placeholder="请选择综合题库"
:disabled="openComprehensive === '0' ? true : false"
>
<el-option
v-for="item in comprehensiveList"
:key="item.id"
:label="item.typeName"
:value="item.id"
/>
</el-select>
</a-card>
</div>
<div style="margin-top: 30px">
<a-card class="card-demo" title="是否开启心理测试?" hoverable>
<template #extra>
<a-switch
v-model="openPsychology"
checked-value="1"
unchecked-value="0"
/>
</template>
请选择心理题库 <br />
<br />
<el-select
v-model="submitFormModel.psychology"
clearable
placeholder="请选择心理题库"
:disabled="openPsychology === '0' ? true : false"
>
<el-option
v-for="item in psychologyList"
:key="item.id"
:label="item.typeName"
:value="item.id"
/>
</el-select>
</a-card>
</div>
</div>
<div :style="{ marginTop: '20px' }" v-if="active === 5">
<p>请输入岗位promote,让面试官更加智能!</p>
<el-input
v-model="submitFormModel.jobPromote"
:autosize="{ minRows: 2, maxRows: 4 }"
type="textarea"
placeholder="请输入岗位的promote"
/>
</div>
</el-scrollbar>
<template #footer>
<span class="dialog-footer" v-if="active === 0">
<el-button @click="addEnditDialog = false">取消</el-button>
<el-button type="primary" @click="next"> 下一步 </el-button>
</span>
<span
class="dialog-footer"
v-if="active === 1 || active === 2 || active === 3 || active === 4"
>
<el-button @click="before">上一步</el-button>
<el-button type="primary" @click="next"> 下一步 </el-button>
</span>
<span class="dialog-footer" v-if="active === 5">
<el-button @click="before">上一步</el-button>
<el-button type="primary" @click="submit"> 提交 </el-button>
</span>
</template>
</el-dialog>
</template>
<style scoped>
.select {
text-align: center;
padding-top: 10%;
}
.custom-radio-card {
padding: 10px 16px;
border: 1px solid var(--color-border-2);
border-radius: 4px;
width: 250px;
box-sizing: border-box;
}
.custom-radio-card-mask {
height: 14px;
width: 14px;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 100%;
border: 1px solid var(--color-border-2);
box-sizing: border-box;
}
.custom-radio-card-mask-dot {
width: 8px;
height: 8px;
border-radius: 100%;
}
.custom-radio-card-title {
color: var(--color-text-1);
font-size: 14px;
font-weight: bold;
margin-bottom: 8px;
}
.custom-radio-card:hover,
.custom-radio-card-checked,
.custom-radio-card:hover .custom-radio-card-mask,
.custom-radio-card-checked .custom-radio-card-mask {
border-color: rgb(var(--primary-6));
}
.custom-radio-card-checked {
background-color: var(--color-primary-light-1);
}
.custom-radio-card:hover .custom-radio-card-title,
.custom-radio-card-checked .custom-radio-card-title {
color: rgb(var(--primary-6));
}
.custom-radio-card-checked .custom-radio-card-mask-dot {
background-color: rgb(var(--primary-6));
}
.card-demo {
width: 360px;
margin-left: 24px;
transition-property: all;
}
.card-demo:hover {
transform: translateY(-4px);
}
</style>