| | |
| | | v-model="dialogVisible" |
| | | :title="title" |
| | | width="60%" |
| | | :before-close="handleClose" |
| | | > |
| | | <el-form :model="state.queryParams" ref="queryForm" :inline="true" v-show="state.showSearch" label-width="90px"> |
| | | <el-form :model="queryParams" :inline="true" label-width="90px"> |
| | | <el-form-item label="专业类别"> |
| | | <el-cascader |
| | | clearable |
| | | v-model="state.classiFy" |
| | | :options="state.expertTypes" |
| | | :props="{ expandTrigger: 'hover', value: 'id',label: 'classifyName'}" |
| | | @change="handleChange"></el-cascader> |
| | | <el-radio-group v-model="queryParams.expertType"> |
| | | <el-radio-button label="">全部</el-radio-button> |
| | | <el-radio-button label="1">安全评价</el-radio-button> |
| | | <el-radio-button label="2">检验检测</el-radio-button> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="在岗情况" prop="dutyStatus"> |
| | | <el-select v-model="state.queryParams.dutyStatus" placeholder="岗位状态" clearable> |
| | | <el-option :key="0" label="在岗" :value="0"/> |
| | | <el-option :key="1" label="退休" :value="1"/> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="时间范围" prop="searchTime"> |
| | | <el-date-picker |
| | | v-model="state.searchTime" |
| | | type="daterange" |
| | | @change="changeTime" |
| | | range-separator="至" |
| | | start-placeholder="开始日期" |
| | | end-placeholder="结束日期" |
| | | value-format="YYYY-MM-DD" |
| | | <el-form-item label="姓名"> |
| | | <el-input |
| | | v-model="queryParams.name" |
| | | placeholder="姓名" |
| | | style="width: 250px" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="手机号"> |
| | | <el-input |
| | | v-model="queryParams.phone" |
| | | placeholder="手机号" |
| | | style="width: 250px" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="评价师等级"> |
| | | <el-select v-model="queryParams.level" style="width: 250px" placeholder="评价师等级" > |
| | | <el-option |
| | | v-for="item in levelList" |
| | | :key="item.id" |
| | | :label="item.name" |
| | | :value="item.name" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="专业方向"> |
| | | <el-select v-model="queryParams.major" value-key="id" style="width: 250px" placeholder="专业方向"> |
| | | <el-option |
| | | v-for="item in majorList" |
| | | :key="item.id" |
| | | :label="item.label" |
| | | :value="item.id" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="专业方向"> |
| | | <el-select v-model="queryParams.post" style="width: 250px" placeholder="请选择职务"> |
| | | <el-option |
| | | v-for="item in postList" |
| | | :key="item.id" |
| | | :label="item.name" |
| | | :value="item.name" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">重置</el-button> |
| | | <el-button type="primary" icon="Search" @click="search">搜索</el-button> |
| | | <el-button icon="Refresh" @click="research">重置</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | <el-table ref="tableRef" v-loading="loading" :data="state.expertList" :border="true" @select="select" @selection-change="handleSelectionChange"> |
| | | <el-table v-loading="loading" ref="tableRef" :data="dataList" :border="true" @select="select" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" width="55" /> |
| | | <el-table-column type="index" width="55" align="center" /> |
| | | <el-table-column label="姓名" align="center" prop="name" /> |
| | | <el-table-column label="出生日期" align="center" prop="birthday" /> |
| | | <el-table-column label="学历" align="center" prop="degree" /> |
| | | <el-table-column label="职称" align="center" prop="title"/> |
| | | <el-table-column label="专业" align="center" prop="speciality" /> |
| | | <el-table-column label="推荐类别组别" align="center"> |
| | | <el-table-column label="用户ID" prop="id" align="center" /> |
| | | <el-table-column label="姓名" prop="name" align="center" width="110" /> |
| | | <el-table-column label="手机号" prop="phone" align="center" width="125" /> |
| | | <el-table-column label="用户名" prop="username" align="center" width="110" /> |
| | | <el-table-column label="性别" prop="sex" align="center" > |
| | | <template #default="scope"> |
| | | {{findNodeById(state.expertTypes,scope.row.bigClassify)}}/{{findNodeById(state.expertTypes,scope.row.smallClassify)}} |
| | | <span v-if="scope.row.sex === 0">男</span> |
| | | <span v-if="scope.row.sex === 1">女</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="联系电话" align="center" prop="phone"/> |
| | | <el-table-column label="申请时间" align="center" prop="createTime"> |
| | | <el-table-column label="所属机构" prop="agency.name" align="center" width="110" /> |
| | | <el-table-column label="社保" prop="socialSecurity" align="center" width="120"> |
| | | <template #default="scope"> |
| | | {{scope.row.createTime?scope.row.createTime.substring(0,10):''}} |
| | | <div class="demo-image__preview" v-if="scope.row.socialAttach && scope.row.socialAttach.length>0"> |
| | | <el-image |
| | | style="width: 100px; height: 100px" |
| | | :src= "scope.row.socialAttach[0]" |
| | | :zoom-rate="1.2" |
| | | :max-scale="7" |
| | | :min-scale="0.2" |
| | | :preview-src-list="scope.row.socialAttach" |
| | | :initial-index="0" |
| | | fit="cover" |
| | | preview-teleported="true" |
| | | /> |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="医保" prop="medicalInsurance" align="center" width="120"> |
| | | <template #default="scope"> |
| | | <div class="demo-image__preview" v-if="scope.row.medicalAttach && scope.row.medicalAttach.length>0"> |
| | | <el-image |
| | | style="width: 100px; height: 100px" |
| | | :src="scope.row.medicalAttach[0]" |
| | | :zoom-rate="1.2" |
| | | :max-scale="7" |
| | | :min-scale="0.2" |
| | | :preview-src-list="scope.row.medicalAttach" |
| | | :initial-index="0" |
| | | fit="cover" |
| | | preview-teleported="true" |
| | | /> |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="工资清单" prop="salaryList" align="center" width="120"> |
| | | <template #default="scope"> |
| | | <div class="demo-image__preview" v-if="scope.row.salaryAttach && scope.row.salaryAttach.length>0"> |
| | | <el-image |
| | | style="width: 100px; height: 100px" |
| | | :src= "scope.row.salaryAttach[0]" |
| | | :zoom-rate="1.2" |
| | | :max-scale="7" |
| | | :min-scale="0.2" |
| | | :preview-src-list="scope.row.salaryAttach" |
| | | :initial-index="0" |
| | | fit="cover" |
| | | preview-teleported="true" |
| | | /> |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="职务" prop="post" align="center" width="120" /> |
| | | <el-table-column label="职称" prop="jobTitle" align="center" /> |
| | | <el-table-column label="专业方向" prop="majorNames" align="center" width="100" /> |
| | | <el-table-column label="评价师等级" prop="level" align="center" width="100" /> |
| | | <el-table-column label="业绩汇总" prop="summary" align="center" /> |
| | | <el-table-column label="最近评价时间" prop="lastTime" align="center" width="120" /> |
| | | </el-table> |
| | | |
| | | <pagination |
| | | v-show="state.total > 0" |
| | | :total="state.total" |
| | | v-model:page="state.queryParams.pageNum" |
| | | v-model:limit="state.queryParams.pageSize" |
| | | v-show="total > 0" |
| | | :total="total" |
| | | v-model:page="queryParams.pageNum" |
| | | v-model:limit="queryParams.pageSize" |
| | | @pagination="getList" |
| | | /> |
| | | <template #footer> |
| | | <span class="dialog-footer"> |
| | | <el-button @click="handleClose" size="default">取 消</el-button> |
| | | <el-button @click="dialogVisible = false" size="default">取 消</el-button> |
| | | <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> |
| | | </span> |
| | | </template> |
| | |
| | | </div> |
| | | </template> |
| | | <script setup> |
| | | import {defineEmits, reactive, ref, toRefs} from 'vue' |
| | | import Editor from "@/components/Editor/index.vue"; |
| | | import {ElMessage} from "element-plus"; |
| | | import {addArea, editArea, getArea} from "@/api/backManage/area"; |
| | | import {getExpertsList, getExpertTypes} from "../../../../api/form"; |
| | | |
| | | const dialogVisible = ref(false) |
| | | const title = ref("") |
| | | const loading = ref(false) |
| | | const tableRef = ref() |
| | | const emit = defineEmits([""]); |
| | | const state = reactive({ |
| | | showSearch: true, |
| | | total: 0, |
| | | expertTypes: [], |
| | | expertList: [], |
| | | import {getCurrentInstance, onMounted, reactive, ref, toRefs,defineEmits} from "vue"; |
| | | import {getDictList} from "@/api/backManage/evaluate"; |
| | | import {ElMessage, ElMessageBox} from "element-plus"; |
| | | import Cookies from "js-cookie"; |
| | | import {delMonitor, getExpertList, getMonitorList} from "@/api/sysUsers"; |
| | | const { proxy } = getCurrentInstance(); |
| | | const loading = ref(false); |
| | | const emit = defineEmits(['getName']) |
| | | const data = reactive({ |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | state: 2, |
| | | bigClassify: null, |
| | | smallClassify: null, |
| | | dutyStatus: null, |
| | | params: { |
| | | startTime: '', |
| | | endTime: '' |
| | | } |
| | | expertType: "", |
| | | name: '', |
| | | phone: '', |
| | | level: '', |
| | | major: null, |
| | | post: '' |
| | | }, |
| | | classiFy: [], |
| | | searchTime: [], |
| | | total: 0, |
| | | dataList: [], |
| | | majorList: [], |
| | | levelList: [ |
| | | { |
| | | id: '1', |
| | | name: '一级' |
| | | }, |
| | | { |
| | | id: '2', |
| | | name: '二级' |
| | | }, |
| | | { |
| | | id: '3', |
| | | name: '三级' |
| | | }, |
| | | { |
| | | id: '4', |
| | | name: '其他' |
| | | }, |
| | | ], |
| | | postList: [ |
| | | { |
| | | id: '1', |
| | | name: '法人' |
| | | }, |
| | | { |
| | | id: '2', |
| | | name: '过程控制负责人' |
| | | }, |
| | | { |
| | | id: '3', |
| | | name: '机构负责人' |
| | | }, |
| | | { |
| | | id: '4', |
| | | name: '技术负责人' |
| | | }, |
| | | { |
| | | id: '5', |
| | | name: '员工' |
| | | }, |
| | | ], |
| | | dialogVisible: false, |
| | | title: '', |
| | | selected: [] |
| | | }) |
| | | const tableRef = ref() |
| | | const { queryParams, total, dataList, majorList, levelList, postList, dialogVisible,title,selected } = toRefs(data); |
| | | |
| | | const openDialog = (type) => { |
| | | resetQuery() |
| | | getTypes() |
| | | state.selected = [] |
| | | title.value = type |
| | | dialogVisible.value = true |
| | | getMajor() |
| | | research() |
| | | data.selected = [] |
| | | data.title = type |
| | | data.dialogVisible = true |
| | | } |
| | | |
| | | const onSubmit = async () => { |
| | | if(state.selected.length>0) |
| | | emit('getName',title.value,state.selected[state.selected.length - 1]) |
| | | dialogVisible.value = false |
| | | } |
| | | |
| | | const handleQuery=()=> { |
| | | state.queryParams.pageNum = 1 |
| | | if(state.classiFy && state.classiFy.length>0){ |
| | | state.queryParams.bigClassify = state.classiFy[0] |
| | | state.queryParams.smallClassify = state.classiFy[1] |
| | | } |
| | | if(state.searchTime && state.searchTime.length>0){ |
| | | state.queryParams.params.startTime = state.searchTime[0] |
| | | state.queryParams.params.endTime = state.searchTime[1] |
| | | } |
| | | getList() |
| | | if(data.selected.length>0) |
| | | emit('getName',data.title,data.selected[data.selected.length - 1]) |
| | | data.dialogVisible = false |
| | | } |
| | | |
| | | const getList = async () => { |
| | | loading.value = true; |
| | | const res = await getExpertsList(state.queryParams) |
| | | loading.value = true |
| | | const res = await getExpertList(data.queryParams) |
| | | if(res.code == 200){ |
| | | state.expertList = res.data.list |
| | | state.total = res.data.total |
| | | data.dataList = res.data.list.map(item => { |
| | | return{ |
| | | ...item, |
| | | socialAttach: item.socialAttach.map(s => { return import.meta.env.VITE_APP_BASE_API + '/' + s.path}), |
| | | medicalAttach: item.medicalAttach.map(s => { return import.meta.env.VITE_APP_BASE_API + '/' + s.path}), |
| | | salaryAttach: item.salaryAttach.map(s => { return import.meta.env.VITE_APP_BASE_API + '/' + s.path}) |
| | | } |
| | | }) |
| | | console.log('RES',data.dataList) |
| | | data.total = res.data.total |
| | | }else{ |
| | | ElMessage.warning(res.msg) |
| | | ElMessage.warning(res.message) |
| | | } |
| | | loading.value = false; |
| | | loading.value = false |
| | | } |
| | | |
| | | const getTypes = async()=> { |
| | | const res = await getExpertTypes() |
| | | if(res.code == 200){ |
| | | state.expertTypes = res.data |
| | | const getMajor = async () => { |
| | | const queryParams = { |
| | | pageNum: 1, |
| | | pageSize: 50, |
| | | dictType: 'sys_major_orientation' |
| | | } |
| | | const res = await getDictList(queryParams); |
| | | if(res.code === 200){ |
| | | data.majorList = res.data.list |
| | | }else{ |
| | | ElMessage.warning(res.msg) |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | |
| | |
| | | }) |
| | | |
| | | const handleSelectionChange = (val) => { |
| | | state.selected = val |
| | | data.selected = val |
| | | } |
| | | |
| | | const resetQuery=()=> { |
| | | state.queryParams = { |
| | | const search = ()=>{ |
| | | data.queryParams.pageNum = 1 |
| | | getList() |
| | | } |
| | | |
| | | const research = ()=>{ |
| | | data.queryParams = { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | state: 2, |
| | | bigClassify: null, |
| | | smallClassify: null, |
| | | dutyStatus: null, |
| | | params: { |
| | | startTime: '', |
| | | endTime: '' |
| | | } |
| | | }; |
| | | state.classiFy = [] |
| | | state.searchTime = [] |
| | | handleQuery() |
| | | } |
| | | |
| | | const handleChange=(value)=> { |
| | | if(!value){ |
| | | data.classiFy = [] |
| | | data.queryParams.bigClassify = "" |
| | | data.queryParams.smallClassify = "" |
| | | expertType: "", |
| | | name: '', |
| | | phone: '', |
| | | level: '', |
| | | major: null, |
| | | post: '' |
| | | } |
| | | } |
| | | const changeTime=(value)=>{ |
| | | if(!value){ |
| | | data.queryParams.params.endTime = "" |
| | | data.queryParams.params.startTime = "" |
| | | } |
| | | } |
| | | |
| | | const findNodeById = (data,value)=> { |
| | | for (const node of data) { |
| | | if (node.id === value) { |
| | | return node.classifyName; |
| | | } |
| | | if (node.children) { |
| | | const foundNode = findNodeById(node.children, value); |
| | | if (foundNode) { |
| | | return foundNode; |
| | | } |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | const handleClose = () => { |
| | | dialogVisible.value = false; |
| | | getList() |
| | | } |
| | | |
| | | defineExpose({ |