| | |
| | | }) |
| | | } |
| | | |
| | | export function getReviewList(params) { |
| | | return request({ |
| | | url: '/system/evaluation/list', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | export function addReview(data) { |
| | | return request({ |
| | | url: '/system/evaluation/add', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | export function editReview(params) { |
| | | return request({ |
| | | url: `/system/evaluation/edit`, |
| | | method: 'put', |
| | | data: params |
| | | }) |
| | | } |
| | | |
| | | export function delReview(data) { |
| | | return request({ |
| | | url: `/system/evaluation/` + data.id, |
| | | method: 'delete' |
| | | }) |
| | | } |
| | | |
| | | export function getApplyList(params) { |
| | | return request({ |
| | | url: '/system/settings/applyList', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | export function getSettings(params) { |
| | | return request({ |
| | | url: '/system/settings/getSettings', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | export function updateSettings(params) { |
| | | return request({ |
| | | url: '/system/settings/updateSettings', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | // 事后评价分页 |
| | | export function getProjectExpertList(params) { |
| | | return request({ |
| | | url: '/system/management/projectExpertList', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | // 专家考评记录 |
| | | export function getExpertEvaList(params) { |
| | | return request({ |
| | | url: '/system/management/projectExpertEvaList', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | export function getExpertEvaDetail(params) { |
| | | return request({ |
| | | url: '/system/management/selectProjectExpertDetailList', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | |
| | | // 获取专家列表 |
| | | export function delExpert(id) { |
| | | return request({ |
| | | url: '/expert/info/del/'+id, |
| | | method: 'get' |
| | | url: '/system/expert_info/del/'+id, |
| | | method: 'delete' |
| | | }) |
| | | } |
| | | |
| | |
| | | }) |
| | | } |
| | | |
| | | // 查询审批结果 |
| | | export function queryApprove(data) { |
| | | return request({ |
| | | url: '/system/expert_info/queryApprove', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // 根据id获取专家信息 |
| | | export function getInfo(id) { |
| | | return request({ |
| | |
| | | // 删除图片 |
| | | export function delPic(path) { |
| | | return request({ |
| | | url: '/system/common/removeFile', |
| | | headers: { |
| | | isToken: false |
| | | }, |
| | | url: '/common/removeFile', |
| | | method: 'delete', |
| | | params: path, |
| | | timeout: 20000 |
| | |
| | | }) |
| | | } |
| | | |
| | | // 查询部门列表 |
| | | export function listOutDept(query) { |
| | | return request({ |
| | | url: '/system/dept/getOutDeptList', |
| | | method: 'get', |
| | | params: query |
| | | }) |
| | | } |
| | | |
| | | // 查询部门列表(排除节点) |
| | | export function listDeptExcludeChild(deptId) { |
| | | return request({ |
| | |
| | | // 新增部门 |
| | | export function addDept(data) { |
| | | return request({ |
| | | url: '/system/dept', |
| | | url: '/system/dept/add', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | |
| | | |
| | | <script setup> |
| | | import variables from '@/assets/styles/variables.module.scss' |
| | | import logo from '@/assets/logo/logo.png' |
| | | import logo from '@/assets/logo/logo2.png' |
| | | import useSettingsStore from '@/store/modules/settings' |
| | | import usePermissionStore from '@/store/modules/permission' |
| | | defineProps({ |
| | |
| | | </el-form-item> |
| | | <div style="display: flex;justify-content: space-between;align-items: center;margin-bottom: 25px"> |
| | | <div class="btn-cont"> |
| | | <button class="login-btn" @click.prevent="handleLogin"> |
| | | <button class="login-btn" @click.prevent="handleLogin" v-preReClick> |
| | | <span v-if="!loading">登 录</span> |
| | | <span v-else>登 录 中...</span> |
| | | </button> |
| | |
| | | </div> |
| | | </el-form> |
| | | <div class="other-btns"> |
| | | <el-button link type="primary" style="color: #fff" @click="openApply()">专家申请</el-button> |
| | | <el-button link type="primary" style="color: #fff" @click="openCheck">专家评定进度查询</el-button> |
| | | <el-button link type="primary" style="color: #fff" @click="openApply()" v-preReClick>专家申请</el-button> |
| | | <el-button link type="primary" style="color: #fff" @click="openCheck" v-preReClick>专家评定进度查询</el-button> |
| | | </div> |
| | | </div> |
| | | </el-col> |
| | |
| | | <script setup> |
| | | import {onMounted, ref, watch, defineAsyncComponent, nextTick, computed} from "vue" |
| | | import { getCodeImg } from "@/api/login"; |
| | | import {getSettings} from "@/api/backManage/evaluate"; |
| | | import Cookies from "js-cookie"; |
| | | import { encrypt, decrypt } from "@/utils/jsencrypt"; |
| | | import useUserStore from '@/store/modules/user' |
| | |
| | | import { Base64 } from 'js-base64' |
| | | import ExpertForm from "../safetyReview/expertManage/applyRecords/components/expertForm"; |
| | | import usePermissionStore from '@/store/modules/permission' |
| | | import {ElMessage} from "element-plus"; |
| | | const permissionStore = usePermissionStore() |
| | | const sidebarRouters = computed(() => permissionStore.sidebarRouters); |
| | | const userStore = useUserStore() |
| | |
| | | const regRef = ref(null) |
| | | // 验证码开关 |
| | | const captchaEnabled = ref(true); |
| | | const applyStatus = ref('1') |
| | | // 注册开关 |
| | | const isRegister = ref(true); |
| | | const redirect = ref(undefined); |
| | |
| | | |
| | | |
| | | const expertFormRef = ref() |
| | | const openApply = () => { |
| | | // expertFormRef.value.openApply(type, value) |
| | | const routePath = '/fillForm'; |
| | | const resolvedRoute = router.resolve(routePath); |
| | | const fullPath = resolvedRoute.href |
| | | window.open(fullPath, '_blank'); |
| | | |
| | | const getApplyStatus = async ()=>{ |
| | | const res = await getSettings() |
| | | if(res.code == 200){ |
| | | return res.data |
| | | }else{ |
| | | ElMessage.warning(res.msg) |
| | | return '0' |
| | | } |
| | | } |
| | | |
| | | const openApply = async () => { |
| | | const status = await getApplyStatus(); |
| | | if(status == '1'){ |
| | | const routePath = '/fillForm'; |
| | | const resolvedRoute = router.resolve(routePath); |
| | | const fullPath = resolvedRoute.href |
| | | window.open(fullPath, '_blank'); |
| | | }else{ |
| | | ElMessage.warning('抱歉,专家申请暂未开启,请联系相关人员进行处理') |
| | | } |
| | | } |
| | | |
| | | |
| | |
| | | > |
| | | <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="110px" > |
| | | <el-form-item label="类型:" prop="label"> |
| | | <el-radio-group v-model="state.form.type"> |
| | | <el-radio :label="0" size="large" border>加分项</el-radio> |
| | | <el-radio :label="1" size="large" border>扣分项</el-radio> |
| | | <el-radio-group v-model="state.form.scoreType"> |
| | | <el-radio label="1" size="large" border>加分项</el-radio> |
| | | <el-radio label="2" size="large" border>扣分项</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="标准分值:" prop="score"> |
| | |
| | | import Editor from "@/components/Editor/index.vue"; |
| | | import {ElMessage} from "element-plus"; |
| | | import {addNotice} from "@/api/backManage/notice"; |
| | | import {addDict, editDict, getDictDetail} from "@/api/backManage/evaluate"; |
| | | import {addDict, addReview, editDict, editReview, getDictDetail} from "@/api/backManage/evaluate"; |
| | | |
| | | const dialogVisible = ref(false); |
| | | const title = ref(""); |
| | |
| | | const emit = defineEmits(["getList"]); |
| | | const state = reactive({ |
| | | form: { |
| | | id: '', |
| | | label: '', |
| | | value: '', |
| | | dictType: "sys_assess_type", |
| | | id: '', |
| | | score: '', |
| | | content: '', |
| | | scoreType: null |
| | | }, |
| | | formRules:{ |
| | | label: [{ required: true, message: '请输入类型', trigger: 'blur' }], |
| | | scoreType: [{ required: true, message: '请选择类型', trigger: 'blur' }], |
| | | score: [{ required: true, message: '请输入标准分值', trigger: 'blur' }], |
| | | content: [{ required: true, message: '请输入内容', trigger: 'blur' }] |
| | | }, |
| | | |
| | | }) |
| | | |
| | | const openDialog = async (type, value) => { |
| | | length.value = value.listLength |
| | | title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ; |
| | | title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看'; |
| | | if(type === 'edit') { |
| | | state.form = value; |
| | | const param = { |
| | | dictId: value.id |
| | | } |
| | | const res = await getDictDetail(param); |
| | | if(res.code === 200){ |
| | | state.form = res.data |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | state.form = value |
| | | } |
| | | dialogVisible.value = true; |
| | | dialogVisible.value = true |
| | | } |
| | | |
| | | const onSubmit = async () => { |
| | |
| | | if(valid){ |
| | | if(title.value === '新增'){ |
| | | const param = { |
| | | dictType: "sys_assess_type", |
| | | label: state.form.label, |
| | | value: length.value.toString() |
| | | score: state.form.score, |
| | | content: state.form.content, |
| | | scoreType: state.form.scoreType |
| | | } |
| | | const res = await addDict(param) |
| | | const res = await addReview(param) |
| | | if(res.code === 200){ |
| | | ElMessage({ |
| | | type: 'success', |
| | |
| | | } |
| | | emit("getList") |
| | | busRef.value.clearValidate(); |
| | | reset(); |
| | | dialogVisible.value = false; |
| | | }else if(title.value === '编辑'){ |
| | | const param = { |
| | | id: state.form.id, |
| | | dictType: state.form.dictType, |
| | | label: state.form.label, |
| | | value: state.form.value |
| | | id: state.form.id, |
| | | score: state.form.score, |
| | | content: state.form.content, |
| | | scoreType: state.form.scoreType |
| | | } |
| | | const res = await editDict(param) |
| | | const res = await editReview(param) |
| | | if(res.code === 200){ |
| | | ElMessage({ |
| | | type: 'success', |
| | | message: '新增成功' |
| | | message: '修改成功' |
| | | }); |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | emit("getList") |
| | | busRef.value.clearValidate(); |
| | | reset(); |
| | | dialogVisible.value = false; |
| | | } |
| | | } |
| | |
| | | } |
| | | const reset = () => { |
| | | state.form = { |
| | | id: '', |
| | | label: '', |
| | | value: '', |
| | | dictType: "sys_assess_type", |
| | | id: '', |
| | | score: '', |
| | | content: '', |
| | | scoreType: null |
| | | } |
| | | } |
| | | defineExpose({ |
| | |
| | | >新增</el-button> |
| | | </div> |
| | | <div style="margin-top: 15px;margin-bottom: 15px;"> |
| | | <el-radio-group v-model="queryParams.expertType"> |
| | | <el-radio-group v-model="queryParams.scoreType" @change="reSearch()"> |
| | | <el-radio-button label="">全部</el-radio-button> |
| | | <el-radio-button label="1">加分项</el-radio-button> |
| | | <el-radio-button label="2">扣分项</el-radio-button> |
| | |
| | | </div> |
| | | <!-- 表格数据 --> |
| | | <el-table v-loading="loading" :data="dataList" :border="true"> |
| | | <el-table-column label="项目内容" prop="label" align="center" /> |
| | | <el-table-column label="类型" prop="label" align="center" /> |
| | | <el-table-column label="标准分值" prop="label" align="center" /> |
| | | <el-table-column label="项目内容" prop="content" align="center"/> |
| | | <el-table-column label="类型" prop="scoreType" align="center"> |
| | | <template #default="scope"> |
| | | {{scope.row.scoreType == '1'?'加分项':scope.row.scoreType == '2'?'扣分项':''}} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="标准分值" prop="score" align="center" /> |
| | | <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > |
| | | <template #default="scope"> |
| | | <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button> |
| | |
| | | import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue"; |
| | | import typeDialog from "./components/typeDialog.vue" |
| | | import {ElMessage, ElMessageBox} from "element-plus"; |
| | | import {delDict, getDictList,} from "@/api/backManage/evaluate"; |
| | | import {delDict, delReview, getDictList, getReviewList,} from "@/api/backManage/evaluate"; |
| | | const { proxy } = getCurrentInstance(); |
| | | const loading = ref(false); |
| | | const typeRef = ref(); |
| | | const dictType = ref("sys_assess_type") |
| | | const data = reactive({ |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | scoreType: '', |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | }, |
| | | total: 0, |
| | | dataList: [ |
| | |
| | | |
| | | const { queryParams, total, dataList } = toRefs(data); |
| | | onMounted(() => { |
| | | // getList(); |
| | | getList(); |
| | | }); |
| | | const getList = async () => { |
| | | loading.value = true; |
| | | const res = await getDictList({dictType: dictType.value}); |
| | | if(res.code === 200){ |
| | | dataList.value = res.data.list |
| | | total.value = res.data.total |
| | | const res = await getReviewList(data.queryParams); |
| | | if(res.code == 200){ |
| | | dataList.value = res.rows |
| | | total.value = res.total |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | |
| | | function reset() { |
| | | proxy.resetForm("roleRef"); |
| | | } |
| | | |
| | | const reSearch=()=>{ |
| | | data.queryParams.pageNum = 1 |
| | | getList() |
| | | } |
| | | |
| | | const handleDelete = (val) => { |
| | | ElMessageBox.confirm( |
| | | '确定删除此条数据?', |
| | |
| | | type: 'warning', |
| | | }) |
| | | .then( async() => { |
| | | const res = await delDict(val); |
| | | const res = await delReview(val); |
| | | if(res.code === 200){ |
| | | ElMessage({ |
| | | type: 'success', |
| | | message: '删除成功' |
| | | }); |
| | | getList(); |
| | | await getList(); |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | |
| | | const formRef = ref() |
| | | |
| | | onMounted(()=>{ |
| | | // getList() |
| | | getList() |
| | | }) |
| | | /** 查询岗位列表 */ |
| | | const getList = async()=> { |
| | | const getList = async()=> { |
| | | state.loading = true; |
| | | const res = await getExpertTypes() |
| | | if(res.code == 200){ |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <div style="margin-bottom: 10px"> |
| | | <el-button type="primary" plain icon="Open">开启专家申请</el-button> |
| | | <el-button type="danger" plain icon="TurnOff">关闭专家申请</el-button> |
| | | <!-- <el-button type="primary" plain icon="Open">开启专家申请</el-button>--> |
| | | <!-- <el-button type="danger" plain icon="TurnOff">关闭专家申请</el-button>--> |
| | | <el-switch |
| | | v-model="applyStatus" |
| | | inline-prompt |
| | | style="--el-switch-on-color: #ff4949; --el-switch-off-color: #13ce66" |
| | | active-text="关闭专家申请" |
| | | inactive-text="开启专家申请" |
| | | active-value="2" |
| | | inactive-value="1" |
| | | @change="handleChange" |
| | | /> |
| | | </div> |
| | | <!-- 表格数据 --> |
| | | <el-table v-loading="loading" :data="dataList" :border="true"> |
| | |
| | | <script setup> |
| | | import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue"; |
| | | import {ElMessage, ElMessageBox} from "element-plus"; |
| | | import {delDict, getDictList} from "@/api/backManage/evaluate"; |
| | | import {getApplyList, getSettings, updateSettings} from "@/api/backManage/evaluate"; |
| | | const { proxy } = getCurrentInstance(); |
| | | const loading = ref(false); |
| | | const busRef = ref(); |
| | |
| | | const data = reactive({ |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | dictType: dictType.value |
| | | pageSize: 10 |
| | | }, |
| | | total: 0, |
| | | dataList: [ |
| | |
| | | const { queryParams, total, dataList } = toRefs(data); |
| | | |
| | | onMounted(() => { |
| | | // getList(); |
| | | getList() |
| | | getApplyStatus() |
| | | }); |
| | | const applyStatus = ref() |
| | | const isInitialized = ref(false) |
| | | |
| | | const getApplyStatus = async ()=>{ |
| | | const res = await getSettings() |
| | | if(res.code == 200){ |
| | | applyStatus.value = res.data |
| | | isInitialized.value = true |
| | | }else{ |
| | | ElMessage.warning(res.msg) |
| | | } |
| | | } |
| | | |
| | | const handleChange = (val)=>{ |
| | | if (!isInitialized.value) return |
| | | changeStatus(val); |
| | | } |
| | | |
| | | const changeStatus = async (val) => { |
| | | const res = await updateSettings({ sysSettings: val }); |
| | | if (res.code == 200) { |
| | | ElMessage.success('专家申请设置已更新'); |
| | | await getList() |
| | | } else { |
| | | ElMessage.warning(res.msg); |
| | | } |
| | | } |
| | | |
| | | const getList = async () => { |
| | | loading.value = true; |
| | | const res = await getDictList(data.queryParams); |
| | | const res = await getApplyList(data.queryParams); |
| | | if(res.code === 200){ |
| | | dataList.value = res.data.list |
| | | total.value = res.data.total |
| | | dataList.value = res.rows |
| | | total.value = res.total |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | ElMessage.warning(res.msg) |
| | | } |
| | | loading.value = false; |
| | | } |
| | |
| | | </script> |
| | | <style> |
| | | .pag-container{ |
| | | float: right; |
| | | margin-top: 10px; |
| | | float: right; |
| | | margin-top: 10px; |
| | | } |
| | | .el-switch__core{ |
| | | height: 32px; |
| | | padding: 10px 30px; |
| | | border-radius: 16px; |
| | | |
| | | .el-switch__inner{ |
| | | height: 32px; |
| | | } |
| | | .el-switch__action{ |
| | | width: 24px; |
| | | height: 24px; |
| | | left: 4px; |
| | | } |
| | | } |
| | | |
| | | .el-switch.is-checked .el-switch__core .el-switch__action{ |
| | | left: calc(100% - 28px); |
| | | } |
| | | |
| | | </style> |
| | |
| | | <el-form :model="state.form" :rules="state.rules" ref="ruleFormRef" label-width="200px"> |
| | | <el-row> |
| | | <el-col :span="20"> |
| | | <el-form-item label="专业类别" prop="profession"> |
| | | <el-form-item label="专业类别" prop="domain"> |
| | | <el-cascader |
| | | :disabled="state.disable" |
| | | style="width: 100%" |
| | | v-model="state.form.profession" |
| | | v-model="state.form.domain" |
| | | :options="state.expertsType" |
| | | :props="{ expandTrigger: 'hover',value: 'id',label: 'classifyName' }" |
| | | :props="{ expandTrigger: 'hover',value: 'classifyName',label: 'classifyName',emitPath: false }" |
| | | @change="professionChange"></el-cascader> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <!-- <el-row>--> |
| | | <!-- <el-col :span="20">--> |
| | | <!-- <el-form-item label="填报日期" prop="date">--> |
| | | <!-- <el-date-picker--> |
| | | <!-- style="width: 100%"--> |
| | | <!-- v-model="form.date"--> |
| | | <!-- type="date"--> |
| | | <!-- placeholder="选择日期">--> |
| | | <!-- </el-date-picker>--> |
| | | <!-- </el-form-item>--> |
| | | <!-- </el-col>--> |
| | | <!-- </el-row>--> |
| | | <el-row> |
| | | <el-col :span="20"> |
| | | <el-form-item label="业务处室:" prop="deptId"> |
| | | <el-cascader |
| | | style="width: 100%" |
| | | clearable |
| | | v-model="state.form.deptId" |
| | | :options="state.deptList" |
| | | :props="{ expandTrigger: 'hover', value: 'deptId',label: 'deptName',emitPath: false}"></el-cascader> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="20"> |
| | | <el-form-item label="姓名" prop="name"> |
| | |
| | | <el-date-picker |
| | | style="width: 100%" |
| | | v-model="state.form.birthday" |
| | | value-format="YYYY-MM-DD 00:00:00" |
| | | value-format="YYYY-MM-DD" |
| | | type="date" |
| | | placeholder="选择日期" :disabled="state.disable"> |
| | | </el-date-picker> |
| | |
| | | </el-row> |
| | | </el-form> |
| | | <el-dialog v-model="imgDialog"> |
| | | <img w-full :src="state.dialogImageUrl" alt=""> |
| | | <img style="width: 100%" w-full :src="state.dialogImageUrl" alt=""> |
| | | </el-dialog> |
| | | <el-dialog |
| | | v-model="state.assessDialog" |
| | | title="评定详情" |
| | | width="50%" |
| | | :before-close="closeAssess" |
| | | > |
| | | <el-form :model="state.assessForm" :rules="state.assessRules" ref="assessFormRef" label-width="200px"> |
| | | <el-form-item label="专家聘用期限" prop="employTime"> |
| | | <el-date-picker |
| | | v-model="state.assessForm.employTime" |
| | | type="daterange" |
| | | range-separator="至" |
| | | start-placeholder="开始日期" |
| | | end-placeholder="结束日期" |
| | | value-format="YYYY-MM-DD" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="专家评定等级" prop="ratingLevel"> |
| | | <el-radio-group v-model="state.assessForm.ratingLevel"> |
| | | <el-radio label="1">一级</el-radio> |
| | | <el-radio label="2">二级</el-radio> |
| | | <el-radio label="3">三级</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <span class="dialog-footer"> |
| | | <el-button @click="closeAssess" size="default">取 消</el-button> |
| | | <el-button type="primary" @click="assessSubmit(assessFormRef)" size="default" v-preReClick>确认</el-button> |
| | | </span> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | <template #footer> |
| | |
| | | <el-button type="primary" @click="onSubmit(ruleFormRef)" size="default" v-preReClick>确认</el-button> |
| | | </span> |
| | | <span class="dialog-footer" v-if="state.title == '评定'"> |
| | | <el-button type="danger" size="default" @click="assess(3)" v-preReClick>评定驳回</el-button> |
| | | <el-button type="primary" @click="assess(2)" size="default" v-preReClick>评定通过</el-button> |
| | | <el-button type="danger" size="default" @click="startAssess(3)" v-preReClick>评定驳回</el-button> |
| | | <el-button type="primary" @click="startAssess(2)" size="default" v-preReClick>评定通过</el-button> |
| | | </span> |
| | | </template> |
| | | </el-dialog> |
| | | |
| | | </div> |
| | | </template> |
| | | <script setup> |
| | | import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue' |
| | | import {reactive, ref, toRefs, defineEmits, nextTick, onMounted, getCurrentInstance} from 'vue' |
| | | import {ElMessage, ElMessageBox} from "element-plus" |
| | | import {verifyPhone, verifyIdCard} from "../../../../../utils/validate" |
| | | import {addExpertInfo, getExpertTypes, getInfo, modExpertInfo, uploadFile, changeApprove} from "@/api/form" |
| | | import {delPic} from "@/api/login" |
| | | import { getToken } from "@/utils/auth" |
| | | import {Base64} from "js-base64" |
| | | import {listOutDept} from "@/api/system/dept"; |
| | | const emit = defineEmits(["getList"]) |
| | | const dialogVisible = ref(false) |
| | | const imgDialog = ref(false) |
| | | const ruleFormRef = ref() |
| | | const assessFormRef = ref() |
| | | const { proxy } = getCurrentInstance() |
| | | var validatePass = (rule, value, callback) => { |
| | | if (state.fileList.length == 0) { |
| | | callback(new Error('请上传证件照')); |
| | |
| | | } |
| | | |
| | | const state = reactive({ |
| | | assessDialog: false, |
| | | form:{ |
| | | id: null, |
| | | name:'', |
| | | sex:'', |
| | | profession: [], |
| | | bigClassify:null, |
| | | smallClassify: null, |
| | | domain: '', |
| | | deptId: null, |
| | | birthday: '', |
| | | phone:'', |
| | | title: '', |
| | |
| | | remark: '', |
| | | source: 2 |
| | | }, |
| | | assessForm: { |
| | | employTime: [], |
| | | ratingLevel: '' |
| | | }, |
| | | hasDeleteFile: false, |
| | | disable: false, |
| | | expertsType: [], |
| | | deptList: [], |
| | | directionList: [ |
| | | { |
| | | value: 1, |
| | |
| | | label: '其他' |
| | | } |
| | | ], |
| | | uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', |
| | | uploadUrl: import.meta.env.VITE_APP_BASE_API + '/common/upload', |
| | | header: { |
| | | Authorization: 'Bearer ' + getToken() |
| | | }, |
| | |
| | | rules:{ |
| | | name:[{ required: true, message: '请填写姓名', trigger: 'blur' }], |
| | | sex:[{ required: true, message: '请选择性别', trigger: 'blur' }], |
| | | profession: [{ required: true, message: '请选择专业类别', trigger: 'blur' }], |
| | | domain: [{ required: true, message: '请选择专业类别', trigger: 'blur' }], |
| | | deptId: [{ required: true, message: '请选择业务处室', trigger: 'blur' }], |
| | | birthday: [{ required: true, message: '请选择出生日期', trigger: 'blur' }], |
| | | phone:[{ required: true, validator: validatePhone, trigger: 'blur' }], |
| | | title: [{ required: true, message: '请填写职称', trigger: 'blur' }], |
| | |
| | | dutyStatus: [{ required: true, message: '请选择在岗情况', trigger: 'blur' }], |
| | | companyName: [{ required: true, message: '请填写单位全称', trigger: 'blur' }], |
| | | degree: [{ required: true, message: '请填写最高学历', trigger: 'blur' }] |
| | | }, |
| | | assessRules:{ |
| | | employTime: [{ required: true, message: '请选择聘用期限', trigger: 'blur' }], |
| | | ratingLevel: [{ required: true, message: '请选择评定等级', trigger: 'blur' }] |
| | | } |
| | | }) |
| | | |
| | |
| | | const openDialog = (type, value) => { |
| | | state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : type ==='view' ?'查看':'评定' |
| | | getExpertsType() |
| | | if(type == 'edit'||type=='view'||type=='assess'){ |
| | | getInfo(value.id).then((res)=>{ |
| | | if(res.code == 200){ |
| | | if(res.data) { |
| | | const val = res.data |
| | | for(let i in state.form) { |
| | | if (validKey(i, val)) { |
| | | state.form[i] = val[i] |
| | | } |
| | | } |
| | | state.form.profession[0] = val.bigClassify |
| | | state.form.profession[1] = val.smallClassify |
| | | if(val.supportDirectionSafety){ |
| | | state.form.supportDirectionSafety = val.supportDirectionSafety.split(',').map(i=>Number(i)) |
| | | } |
| | | if(val.supportDirectionPrevention){ |
| | | state.form.supportDirectionPrevention = val.supportDirectionPrevention.split(',').map(i=>Number(i)) |
| | | } |
| | | if(val.supportDirectionEmergency){ |
| | | state.form.supportDirectionEmergency = val.supportDirectionEmergency.split(',').map(i=>Number(i)) |
| | | } |
| | | state.fileList.push({ |
| | | name: state.form.electronicPhoto, |
| | | url: import.meta.env.VITE_APP_BASE_API + '/' + state.form.electronicPhoto, |
| | | }) |
| | | if(state.form.resumeKey !== ''){ |
| | | state.resumeList = state.form.resumeKey.split(',').map(i=>{ |
| | | return { |
| | | name: i, |
| | | url: import.meta.env.VITE_APP_BASE_API + '/' + i, |
| | | } |
| | | }) |
| | | } |
| | | if(state.form.paperSituationKey !== ''){ |
| | | state.inventionList = state.form.paperSituationKey.split(',').map(i=>{ |
| | | return { |
| | | name: i, |
| | | url: import.meta.env.VITE_APP_BASE_API + '/' + i, |
| | | } |
| | | }) |
| | | } |
| | | if(state.form.rewardKey !== ''){ |
| | | state.rewardList = state.form.rewardKey.split(',').map(i=>{ |
| | | return { |
| | | name: i, |
| | | url: import.meta.env.VITE_APP_BASE_API + '/' + i, |
| | | } |
| | | }) |
| | | } |
| | | if(state.form.achievementKey !== ''){ |
| | | state.achievementList = state.form.achievementKey.split(',').map(i=>{ |
| | | return { |
| | | name: i, |
| | | url: import.meta.env.VITE_APP_BASE_API + '/' + i, |
| | | } |
| | | }) |
| | | } |
| | | if(state.form.personalOpinionKey !== ''){ |
| | | state.proAdviceList = state.form.personalOpinionKey.split(',').map(i=>{ |
| | | return { |
| | | name: i, |
| | | url: import.meta.env.VITE_APP_BASE_API + '/' + i, |
| | | } |
| | | }) |
| | | } |
| | | if(state.form.recommendUnitOpinionKey !== ''){ |
| | | state.adviceList = state.form.recommendUnitOpinionKey.split(',').map(i=>{ |
| | | return { |
| | | name: i, |
| | | url: import.meta.env.VITE_APP_BASE_API + '/' + i, |
| | | } |
| | | }) |
| | | getDepList() |
| | | state.fileList = [] |
| | | if(type == 'edit'||type=='view'||type=='assess'){ |
| | | getInfo(value.id).then((res)=>{ |
| | | if(res.code == 200){ |
| | | if(res.data) { |
| | | const val = res.data |
| | | for(let i in state.form) { |
| | | if (validKey(i, val)) { |
| | | state.form[i] = val[i] |
| | | } |
| | | } |
| | | dialogVisible.value = true |
| | | }else{ |
| | | ElMessage.warning('数据获取失败:'+res.message) |
| | | if(val.supportDirectionSafety && val.supportDirectionSafety!==''){ |
| | | state.form.supportDirectionSafety = val.supportDirectionSafety.split(',').map(i=>Number(i)) |
| | | }else{ |
| | | state.form.supportDirectionSafety = [] |
| | | } |
| | | if(val.supportDirectionPrevention && val.supportDirectionPrevention!==''){ |
| | | state.form.supportDirectionPrevention = val.supportDirectionPrevention.split(',').map(i=>Number(i)) |
| | | }else{ |
| | | state.form.supportDirectionPrevention = [] |
| | | } |
| | | if(val.supportDirectionEmergency && val.supportDirectionEmergency!==''){ |
| | | state.form.supportDirectionEmergency = val.supportDirectionEmergency.split(',').map(i=>Number(i)) |
| | | }else{ |
| | | state.form.supportDirectionEmergency = [] |
| | | } |
| | | state.fileList.push({ |
| | | name: state.form.electronicPhoto, |
| | | url: state.form.electronicPhoto, |
| | | }) |
| | | if(state.form.resumeKey !== ''){ |
| | | state.resumeList = state.form.resumeKey.split(',').map(i=>{ |
| | | return { |
| | | name: i, |
| | | url: i, |
| | | } |
| | | }) |
| | | } |
| | | if(state.form.paperSituationKey !== ''){ |
| | | state.inventionList = state.form.paperSituationKey.split(',').map(i=>{ |
| | | return { |
| | | name: i, |
| | | url: i, |
| | | } |
| | | }) |
| | | } |
| | | if(state.form.rewardKey !== ''){ |
| | | state.rewardList = state.form.rewardKey.split(',').map(i=>{ |
| | | return { |
| | | name: i, |
| | | url: i, |
| | | } |
| | | }) |
| | | } |
| | | if(state.form.achievementKey !== ''){ |
| | | state.achievementList = state.form.achievementKey.split(',').map(i=>{ |
| | | return { |
| | | name: i, |
| | | url: i, |
| | | } |
| | | }) |
| | | } |
| | | if(state.form.personalOpinionKey !== ''){ |
| | | state.proAdviceList = state.form.personalOpinionKey.split(',').map(i=>{ |
| | | return { |
| | | name: i, |
| | | url: i, |
| | | } |
| | | }) |
| | | } |
| | | if(state.form.recommendUnitOpinionKey !== ''){ |
| | | state.adviceList = state.form.recommendUnitOpinionKey.split(',').map(i=>{ |
| | | return { |
| | | name: i, |
| | | url: i, |
| | | } |
| | | }) |
| | | } |
| | | } |
| | | }) |
| | | if(type == 'edit'){ |
| | | state.disable = false |
| | | console.log(state.form,'form') |
| | | dialogVisible.value = true |
| | | }else{ |
| | | state.disable = true |
| | | ElMessage.warning('数据获取失败:'+res.msg) |
| | | } |
| | | }else{ |
| | | }) |
| | | if(type == 'edit'){ |
| | | state.disable = false |
| | | dialogVisible.value = true |
| | | }else{ |
| | | state.disable = true |
| | | } |
| | | }else{ |
| | | state.disable = false |
| | | dialogVisible.value = true |
| | | } |
| | | } |
| | | |
| | | const validKey=(key,obj)=>{ |
| | | return key in obj |
| | | } |
| | | |
| | | const startAssess = async (num)=>{ |
| | | if(num == 2){ |
| | | state.assessDialog = true |
| | | }else{ |
| | | await assess(num) |
| | | } |
| | | } |
| | | |
| | | const assess = (num)=>{ |
| | |
| | | type: 'warning', |
| | | }) |
| | | .then(async() => { |
| | | const res = await changeApprove({id:state.form.id,state: num}) |
| | | let params = {} |
| | | if(num == 2){ |
| | | params = { |
| | | id: state.form.id, |
| | | state: num, |
| | | employmentDateStart: state.assessForm.employTime[0], |
| | | employmentDateEnd: state.assessForm.employTime[1], |
| | | ratingLevel: state.assessForm.ratingLevel |
| | | } |
| | | }else{ |
| | | params = { |
| | | id:state.form.id, |
| | | state: num |
| | | } |
| | | } |
| | | const res = await changeApprove(params) |
| | | if(res.code == 200){ |
| | | ElMessage({ |
| | | type: 'success', |
| | | message: '审批成功' |
| | | }); |
| | | emit('getList') |
| | | state.assessDialog = false |
| | | dialogVisible.value = false |
| | | }else{ |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: res.message |
| | | message: res.msg |
| | | }); |
| | | } |
| | | }) |
| | |
| | | }); |
| | | } |
| | | } |
| | | |
| | | function getDepList() { |
| | | listOutDept({}).then(response => { |
| | | state.deptList = proxy.handleTree(response.data, "deptId",'parentId','children'); |
| | | }); |
| | | } |
| | | |
| | | const professionChange=(value)=> { |
| | | console.log(value,'val') |
| | |
| | | const handleAvatarSuccess = (res, uploadFile,type) => { |
| | | if(res.code == 200){ |
| | | if(type == '证件照'){ |
| | | state.form.electronicPhoto = res.data.path |
| | | state.form.electronicPhoto = res.url |
| | | }else{ |
| | | uploadFile.name = res.data.path |
| | | uploadFile.name = res.url |
| | | } |
| | | }else{ |
| | | ElMessage({ |
| | |
| | | } |
| | | |
| | | const handleRemove = (file, uploadFiles,type) => { |
| | | console.log(file, uploadFiles) |
| | | if(file && file.status == 'success') { |
| | | ElMessageBox.confirm( |
| | | '该操作将永久删除此文件内容,是否继续?', |
| | |
| | | } else { |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: res.message |
| | | message: res.msg |
| | | }) |
| | | } |
| | | }) |
| | |
| | | return |
| | | } |
| | | let data = JSON.parse(JSON.stringify(state.form)) |
| | | data.supportDirectionSafety = data.supportDirectionSafety.join(',') |
| | | data.supportDirectionPrevention = data.supportDirectionPrevention.join(',') |
| | | data.supportDirectionEmergency = data.supportDirectionEmergency.join(',') |
| | | data.bigClassify = data.profession[0] |
| | | data.smallClassify = data.profession[1] |
| | | data.supportDirectionSafety = Array.isArray(data.supportDirectionSafety)?data.supportDirectionSafety.join(','):'' |
| | | data.supportDirectionPrevention = Array.isArray(data.supportDirectionPrevention)?data.supportDirectionPrevention.join(','):'' |
| | | data.supportDirectionEmergency = Array.isArray(data.supportDirectionEmergency)?data.supportDirectionEmergency.join(','):'' |
| | | data.resumeKey = state.resumeList.map(i=>i.name).join(',') |
| | | data.paperSituationKey = state.inventionList.map(i=>i.name).join(',') |
| | | data.rewardKey = state.rewardList.map(i=>i.name).join(',') |
| | | data.achievementKey = state.achievementList.map(i=>i.name).join(',') |
| | | data.personalOpinionKey = state.proAdviceList.map(i=>i.name).join(',') |
| | | data.recommendUnitOpinionKey = state.adviceList.map(i=>i.name).join(',') |
| | | delete data.profession |
| | | if(state.title == '新增'){ |
| | | delete data.id |
| | | const res= await addExpertInfo(data) |
| | | if(res.code == 200){ |
| | | ElMessage.success(res.message) |
| | | ElMessage.success(res.msg) |
| | | state.fileList = [] |
| | | state.resumeList = [] |
| | | state.inventionList = [] |
| | |
| | | state.hasDeleteFile = false |
| | | dialogVisible.value = false |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | ElMessage.warning(res.msg) |
| | | } |
| | | }else{ |
| | | const res= await modExpertInfo(data) |
| | | if(res.code == 200){ |
| | | ElMessage.success(res.message) |
| | | ElMessage.success(res.msg) |
| | | state.fileList = [] |
| | | state.resumeList = [] |
| | | state.inventionList = [] |
| | |
| | | state.hasDeleteFile = false |
| | | dialogVisible.value = false |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | ElMessage.warning(res.msg) |
| | | } |
| | | } |
| | | } else { |
| | | ElMessage.warning('请完善必填信息') |
| | | } |
| | | }) |
| | | } |
| | | |
| | | const assessSubmit = async (formEl)=> { |
| | | if (!formEl) return |
| | | await formEl.validate(async (valid, fields) => { |
| | | if (valid) { |
| | | await assess(2) |
| | | }else { |
| | | ElMessage.warning('请完善必填信息') |
| | | } |
| | | }) |
| | | } |
| | | |
| | | const closeAssess = ()=>{ |
| | | assessFormRef.value.clearValidate() |
| | | state.assessForm = { |
| | | employTime: [], |
| | | ratingLevel: '' |
| | | } |
| | | state.assessDialog = false; |
| | | } |
| | | |
| | | const handleClose = () => { |
| | |
| | | id: null, |
| | | name:'', |
| | | sex:'', |
| | | profession: [], |
| | | bigClassify:null, |
| | | smallClassify: null, |
| | | domain: '', |
| | | deptId: null, |
| | | birthday: '', |
| | | phone:'', |
| | | title: '', |
| | |
| | | <el-form-item label="专业类别"> |
| | | <el-cascader |
| | | clearable |
| | | v-model="classiFy" |
| | | v-model="queryParams.domain" |
| | | :options="expertTypes" |
| | | :props="{ expandTrigger: 'hover', value: 'id',label: 'classifyName'}" |
| | | :props="{ expandTrigger: 'hover', value: 'classifyName',label: 'classifyName'}" |
| | | @change="handleChange"></el-cascader> |
| | | </el-form-item> |
| | | <el-form-item label="姓名"> |
| | |
| | | <el-table v-loading="loading" :data="expertList" :border="true"> |
| | | <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="birthday"> |
| | | <template #default="scope"> |
| | | {{scope.row.birthday.slice(0,10)}} |
| | | </template> |
| | | </el-table-column> |
| | | <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"> |
| | | <template #default="scope"> |
| | | {{findNodeById(expertTypes,scope.row.bigClassify)}}/{{findNodeById(expertTypes,scope.row.smallClassify)}} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="推荐类别组别" align="center" prop="domain"/> |
| | | <el-table-column label="联系电话" align="center" prop="phone"/> |
| | | <el-table-column label="申请时间" align="center" prop="createTime"> |
| | | <template #default="scope"> |
| | |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | bigClassify: null, |
| | | smallClassify: null, |
| | | domain: '', |
| | | dutyStatus: null, |
| | | name: '', |
| | | params: { |
| | |
| | | |
| | | const handleQuery=()=> { |
| | | data.queryParams.pageNum = 1 |
| | | if(data.classiFy && data.classiFy.length>0){ |
| | | data.queryParams.bigClassify = data.classiFy[0] |
| | | data.queryParams.smallClassify = data.classiFy[1] |
| | | } |
| | | if(data.searchTime && data.searchTime.length>0){ |
| | | data.queryParams.params.startTime = data.searchTime[0] |
| | | data.queryParams.params.endTime = data.searchTime[1] |
| | |
| | | loading.value = true; |
| | | const res = await getExpertsList(data.queryParams) |
| | | if(res.code == 200){ |
| | | data.expertList = res.data.list |
| | | data.total = res.data.total |
| | | data.expertList = res.rows |
| | | data.total = res.total |
| | | }else{ |
| | | ElMessage.warning(res.msg) |
| | | } |
| | |
| | | data.queryParams = { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | bigClassify: null, |
| | | smallClassify: null, |
| | | domain: '', |
| | | dutyStatus: null, |
| | | name: '', |
| | | params: { |
| | |
| | | <template> |
| | | <div class="form-container"> |
| | | <el-dialog |
| | | v-model="dialogVisible" |
| | | title="专家申请进度查询" |
| | | width="550px" |
| | | :before-close="handleClose" |
| | | center |
| | | > |
| | | <el-form :model="state.form" size="default" ref="formRef" :rules="state.formRules" label-width="110px" > |
| | | <el-form-item label="身份证号:" prop="idCard"> |
| | | <el-input v-model.trim="state.form.idCard" placeholder="请输入身份证号"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="手机号:" prop="phone"> |
| | | <el-input v-model.trim="state.form.phone" placeholder="请输入申报时预留的手机号"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="业务处室:" prop="roomId"> |
| | | <el-select v-model="state.form.roomId" style="width: 100%" class="m-2" placeholder="请选择申请的业务处室"> |
| | | <el-option |
| | | v-for="item in state.agencyList" |
| | | :key="item.id" |
| | | :label="item.name" |
| | | :value="item.name" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <span class="dialog-footer"> |
| | | <el-button type="primary" @click="onSubmit" size="default" v-preReClick>进度查询</el-button> |
| | | </span> |
| | | </template> |
| | | </el-dialog> |
| | | <div class="pro-map"> |
| | | <el-form :model="queryParams" size="default" ref="formRef" inline :rules="formRules" label-width="110px" > |
| | | <el-form-item label="身份证号:" prop="idCard"> |
| | | <el-input v-model.trim="queryParams.idCard" placeholder="请输入身份证号"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="手机号:" prop="phone"> |
| | | <el-input v-model.trim="queryParams.phone" placeholder="请输入申报时预留的手机号"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="业务处室:" prop="deptId"> |
| | | <el-cascader |
| | | clearable |
| | | placeholder="请选择申请的业务处室" |
| | | v-model="queryParams.deptId" |
| | | :options="deptList" |
| | | :props="{ expandTrigger: 'hover', value: 'deptId',label: 'deptName',checkStrictly: true,emitPath: false}"></el-cascader> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="onSubmit(formRef)" v-preReClick>进度查询</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">重置</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div class="pro-map" v-if="showProgress"> |
| | | <button class="pro-btn-active">申请提交</button> |
| | | <button class="pro-btn"> |
| | | <span>待评定</span> |
| | | <button :class="(result.state == 4 ||result.state == 2) ?'pro-btn-active':result.state == 3?'pro-btn-red':result.state == 1?'pro-btn-blue':'pro-btn'"> |
| | | <span v-if="result.state == 1">待评定</span> |
| | | <span v-if="result.state == 3">评定不符合</span> |
| | | <span v-if="result.state == 2">评定通过</span> |
| | | </button> |
| | | <button class="pro-btn"> |
| | | <button :class="result.state == 4?'pro-btn-active':'pro-btn'"> |
| | | 专家入库 |
| | | </button> |
| | | <button class="pro-btn"> |
| | | <button :class="result.state == 4?'pro-download-active':'pro-download'"> |
| | | 专家证书下载 |
| | | </button> |
| | | </div> |
| | |
| | | import {ElMessage, ElMessageBox} from "element-plus" |
| | | import {verifyPhone, verifyIdCard} from "../../../../utils/validate" |
| | | import { getToken } from "@/utils/auth" |
| | | import {getExpertsList, queryApprove} from "@/api/form"; |
| | | import {listOutDept} from "@/api/system/dept"; |
| | | |
| | | const { proxy } = getCurrentInstance(); |
| | | |
| | | let validatePhone = (rule, value, callback)=>{ |
| | | if(value === ''){ |
| | |
| | | } |
| | | } |
| | | |
| | | const dialogVisible = ref(false) |
| | | const formRef = ref() |
| | | const handleClose = () => { |
| | | reset(); |
| | | formRef.value.clearValidate(); |
| | | dialogVisible.value = false; |
| | | } |
| | | |
| | | |
| | | const state = reactive({ |
| | | form:{ |
| | | idCard: null, |
| | | const data = reactive({ |
| | | queryParams: { |
| | | idCard: '', |
| | | phone: '', |
| | | roomId: null |
| | | deptId: null |
| | | }, |
| | | formRules:{ |
| | | idCard:[{ required: true, validator: verifyId, trigger: 'blur' }], |
| | | phone:[{ required: true, validator: validatePhone, trigger: 'blur' }], |
| | | roomId: [{ required: true, message: '请选择申请的业务处室', trigger: 'blur' }] |
| | | } |
| | | deptId: [{ required: true, message: '请选择申请的业务处室', trigger: 'blur' }] |
| | | }, |
| | | result: {} |
| | | }) |
| | | |
| | | const {queryParams,formRules,result} = toRefs(data) |
| | | const deptList = ref([]); |
| | | onMounted(()=>{ |
| | | getDepList() |
| | | }) |
| | | |
| | | const showProgress = ref(false) |
| | | const formRef = ref() |
| | | |
| | | function getDepList() { |
| | | listOutDept({}).then(response => { |
| | | deptList.value = proxy.handleTree(response.data, "deptId",'parentId','children'); |
| | | }) |
| | | } |
| | | |
| | | onMounted(()=>{ |
| | | |
| | |
| | | if (!formEl) return |
| | | await formEl.validate(async (valid, fields) => { |
| | | if (valid) { |
| | | |
| | | const res = await queryApprove(data.queryParams) |
| | | if(res.code == 200){ |
| | | data.result = res.data |
| | | showProgress.value = true |
| | | }else{ |
| | | showProgress.value = false |
| | | ElMessage.warning(res.msg) |
| | | } |
| | | } else { |
| | | ElMessage.warning('请完善必填信息') |
| | | } |
| | | }) |
| | | } |
| | | |
| | | |
| | | const resetQuery = ()=>{ |
| | | data.queryParams = { |
| | | idCard: '', |
| | | phone: '', |
| | | deptId: null |
| | | } |
| | | showProgress.value = false |
| | | } |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | .form-container{ |
| | | padding: 20px; |
| | | display: flex; |
| | | flex-direction: column; |
| | | justify-content: center; |
| | | align-items: center; |
| | | |
| | |
| | | display: flex; |
| | | justify-content: space-around; |
| | | |
| | | .pro-btn { |
| | | .pro-btn,.pro-download{ |
| | | width: calc(25% - 20px); |
| | | color: #fff; |
| | | color: #333; |
| | | cursor: pointer; |
| | | border: 1px solid #000; |
| | | border: 1px solid #666; |
| | | border-radius: 40px 99px 99px 40px; |
| | | padding: 2em 4em; |
| | | background: #000; |
| | | background: #ccc; |
| | | transition: 0.2s; |
| | | } |
| | | |
| | | .pro-btn-active { |
| | | .pro-btn-active,.pro-btn-red,.pro-btn-blue,.pro-download-active { |
| | | width: calc(25% - 20px); |
| | | color: #fff; |
| | | cursor: pointer; |
| | | border: 1px solid #000; |
| | | border: 1px solid #666; |
| | | border-radius: 40px 99px 99px 40px; |
| | | padding: 2em 4em; |
| | | transition: 0.2s; |
| | | transform: translate(-0.25rem, -0.25rem); |
| | | background: #03a9f4; |
| | | box-shadow: 0.25rem 0.25rem #000; |
| | | background: #67C23A; |
| | | box-shadow: 0.25rem 0.25rem #ccc; |
| | | } |
| | | |
| | | .pro-download-active,.pro-download{ |
| | | border-radius: 20px; |
| | | } |
| | | |
| | | .pro-btn-red{ |
| | | color: #fff; |
| | | background: #F56C6C; |
| | | } |
| | | |
| | | .pro-btn-blue{ |
| | | color: #fff; |
| | | background: #2563EB; |
| | | } |
| | | } |
| | | } |
| | |
| | | :before-close="handleClose" |
| | | > |
| | | <el-form :model="state.form" inline size="default" ref="busRef" :rules="state.formRules" label-width="140px" > |
| | | <el-form-item label="姓名:" prop="score"> |
| | | <el-input v-model.trim="state.form.score" readonly></el-input> |
| | | <el-form-item label="姓名:" prop="name"> |
| | | <el-input v-model.trim="state.form.name" readonly></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="身份证号:" prop="content"> |
| | | <el-input v-model.trim="state.form.content" readonly></el-input> |
| | | <el-form-item label="身份证号:" prop="idCard"> |
| | | <el-input v-model.trim="state.form.idCard" readonly></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="项目名称:" prop="score"> |
| | | <el-form-item label="项目名称:" prop="projectName"> |
| | | <el-input v-model.trim="state.form.projectName" readonly></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="是否为专家组组长:" prop="leader"> |
| | | <el-input v-model.trim="state.form.leader" readonly></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="考评记录时间:" prop="updateTime"> |
| | | <el-input v-model.trim="state.form.updateTime" readonly></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="总计:" prop="score"> |
| | | <el-input v-model.trim="state.form.score" readonly></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="是否为专家组组长:" prop="content"> |
| | | <el-input v-model.trim="state.form.content" readonly></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="考评记录时间:" prop="content"> |
| | | <el-input v-model.trim="state.form.content" readonly></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="总计:" prop="content"> |
| | | <el-input v-model.trim="state.form.content" readonly></el-input> |
| | | </el-form-item> |
| | | </el-form> |
| | | <el-table :data="tableData" border style="width: 100%"> |
| | | <el-table-column prop="name" label="加(扣)分项目"/> |
| | | <el-table :data="state.form.tableData" border style="width: 100%"> |
| | | <el-table-column prop="content" label="加(扣)分项目"/> |
| | | <el-table-column prop="score" label="分值明细" /> |
| | | </el-table> |
| | | <template #footer> |
| | |
| | | import Editor from "@/components/Editor/index.vue"; |
| | | import {ElMessage} from "element-plus"; |
| | | import {addNotice} from "@/api/backManage/notice"; |
| | | import {addDict, editDict, getDictDetail} from "@/api/backManage/evaluate"; |
| | | import {addDict, editDict, getDictDetail, getExpertEvaDetail} from "@/api/backManage/evaluate"; |
| | | |
| | | const dialogVisible = ref(false); |
| | | const title = ref(""); |
| | | const busRef = ref(); |
| | | const length = ref() |
| | | const emit = defineEmits(["getList"]); |
| | | const state = reactive({ |
| | | form: { |
| | | score: null, |
| | | id: '', |
| | | label: '', |
| | | value: '', |
| | | dictType: "sys_assess_type", |
| | | name: '', |
| | | idCard: '', |
| | | projectName: '', |
| | | leader: '', |
| | | updateTime: '', |
| | | score: '', |
| | | tableData: [] |
| | | }, |
| | | formRules:{ |
| | | label: [{ required: true, message: '请输入类型', trigger: 'blur' }], |
| | |
| | | }) |
| | | |
| | | const openDialog = async (type, value) => { |
| | | length.value = value.listLength |
| | | title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ; |
| | | if(type === 'edit') { |
| | | state.form = value; |
| | | if(type === 'edit' || type === 'view') { |
| | | state.form = value |
| | | state.form.leader = value.teamLeader==1?'是':'否' |
| | | const param = { |
| | | dictId: value.id |
| | | projectExpertId: value.projectExpertId |
| | | } |
| | | const res = await getDictDetail(param); |
| | | const res = await getExpertEvaDetail(param); |
| | | if(res.code === 200){ |
| | | state.form = res.data |
| | | state.form.tableData = res.data |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | ElMessage.warning(res.msg) |
| | | } |
| | | } |
| | | console.log(state.form,'form') |
| | | dialogVisible.value = true; |
| | | } |
| | | |
| | |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form-item label="项目名称"> |
| | | <el-input v-model="queryParams.name" placeholder="请输入项目名称" /> |
| | | <el-input v-model="queryParams.projectName" placeholder="请输入项目名称" /> |
| | | </el-form-item> |
| | | <el-form-item label="姓名"> |
| | | <el-form-item label="专家姓名"> |
| | | <el-input v-model="queryParams.name" placeholder="请输入姓名" /> |
| | | </el-form-item> |
| | | <el-form-item label="身份证号"> |
| | | <el-input v-model="queryParams.name" placeholder="请输入身份证号" /> |
| | | <el-input v-model="queryParams.idCard" placeholder="请输入身份证号" /> |
| | | </el-form-item> |
| | | <el-form-item label="领域" prop="dutyStatus"> |
| | | <el-select v-model="queryParams.dutyStatus" placeholder="岗位状态" clearable> |
| | | <el-option :key="0" label="已评估" :value="0"/> |
| | | <el-option :key="1" label="未评估" :value="1"/> |
| | | </el-select> |
| | | <el-form-item label="专家领域"> |
| | | <el-cascader |
| | | clearable |
| | | v-model="queryParams.domain" |
| | | :options="expertTypes" |
| | | :props="{ expandTrigger: 'hover', value: 'classifyName',label: 'classifyName',emitPath: false}"></el-cascader> |
| | | </el-form-item> |
| | | <el-form-item label="时间范围" prop="searchTime"> |
| | | <el-date-picker |
| | | v-model="searchTime" |
| | | type="daterange" |
| | | @change="changeTime" |
| | | type="datetimerange" |
| | | range-separator="至" |
| | | start-placeholder="开始日期" |
| | | end-placeholder="结束日期" |
| | | value-format="YYYY-MM-DD" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | |
| | | </el-form-item> |
| | | </el-form> |
| | | |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain :icon="Plus" @click="openDialog('add',{})">新增</el-button> |
| | | </el-col> |
| | | </el-row> |
| | | <!-- <el-row :gutter="10" class="mb8">--> |
| | | <!-- <el-col :span="1.5">--> |
| | | <!-- <el-button type="primary" plain :icon="Plus" @click="openDialog('add',{})">新增</el-button>--> |
| | | <!-- </el-col>--> |
| | | <!-- </el-row>--> |
| | | <el-table v-loading="loading" :data="expertList" :border="true"> |
| | | <el-table-column type="index" width="55" align="center" /> |
| | | <el-table-column label="考评时间" align="center" prop="birthday" /> |
| | | <el-table-column label="姓名" align="center" prop="birthday" /> |
| | | <el-table-column label="身份证号" align="center" prop="birthday" /> |
| | | <el-table-column label="考评应用领域" align="center" prop="birthday" /> |
| | | <el-table-column label="项目名称" align="center" prop="name" /> |
| | | <el-table-column label="是否为专家组" align="center"> |
| | | <el-table-column label="考评时间" align="center" prop="updateTime" /> |
| | | <el-table-column label="姓名" align="center" prop="name" /> |
| | | <el-table-column label="身份证号" align="center" prop="idCard" /> |
| | | <el-table-column label="考评应用领域" align="center" prop="domain" /> |
| | | <el-table-column label="项目名称" align="center" prop="projectName" /> |
| | | <el-table-column label="是否为专家组组长" align="center" prop="teamLeader"> |
| | | <template #default="scope"> |
| | | {{findNodeById(expertTypes,scope.row.bigClassify)}}/{{findNodeById(expertTypes,scope.row.smallClassify)}} |
| | | {{scope.row.teamLeader == 1?'是':'否'}} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="考评分数" align="center"> |
| | | <template #default="scope"> |
| | | {{findNodeById(expertTypes,scope.row.bigClassify)}}/{{findNodeById(expertTypes,scope.row.smallClassify)}} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="考评分数" align="center" prop="score"/> |
| | | <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-button type="primary" link @click="openDialog('view',scope.row)">查看明细</el-button> |
| | |
| | | import EvaluateDetail from "./components/evaluateDetail"; |
| | | import {delExpert, getExpertsList, getExpertTypes} from "../../../../api/form"; |
| | | import { Plus } from '@element-plus/icons-vue' |
| | | import {getExpertEvaList, getProjectExpertList} from "@/api/backManage/evaluate"; |
| | | |
| | | const loading = ref(false); |
| | | const data = reactive({ |
| | |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | bigClassify: null, |
| | | smallClassify: null, |
| | | dutyStatus: null, |
| | | projectName: '', |
| | | name: '', |
| | | params: { |
| | | startTime: '', |
| | | endTime: '' |
| | | } |
| | | idCard: '', |
| | | domain: '', |
| | | startTime: '', |
| | | endTime: '' |
| | | }, |
| | | classiFy: [], |
| | | searchTime: [] |
| | | }); |
| | | |
| | | const { showSearch,total, expertTypes,expertList,queryParams,classiFy,searchTime} = toRefs(data); |
| | | const evaluateFormRef = ref() |
| | | onMounted(()=>{ |
| | | // getList() |
| | | // getTypes() |
| | | getList() |
| | | getTypes() |
| | | }) |
| | | |
| | | onUnmounted(()=>{ |
| | |
| | | if(res.code == 200){ |
| | | data.expertTypes = res.data |
| | | }else{ |
| | | ElMessage.warning(res.msg) |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | |
| | | const handleChange=(value)=> { |
| | | if(!value){ |
| | | data.classiFy = [] |
| | | data.queryParams.bigClassify = "" |
| | | data.queryParams.smallClassify = "" |
| | | } |
| | | } |
| | | const changeTime=(value)=>{ |
| | | if(!value){ |
| | | data.queryParams.params.endTime = "" |
| | | data.queryParams.params.startTime = "" |
| | | } |
| | | } |
| | | |
| | | const findNodeById = (data,value)=> { |
| | |
| | | |
| | | const handleQuery=()=> { |
| | | data.queryParams.pageNum = 1 |
| | | if(data.classiFy && data.classiFy.length>0){ |
| | | data.queryParams.bigClassify = data.classiFy[0] |
| | | data.queryParams.smallClassify = data.classiFy[1] |
| | | } |
| | | if(data.searchTime && data.searchTime.length>0){ |
| | | data.queryParams.params.startTime = data.searchTime[0] |
| | | data.queryParams.params.endTime = data.searchTime[1] |
| | | } |
| | | getList() |
| | | } |
| | | |
| | | const getList = async () => { |
| | | loading.value = true; |
| | | const res = await getExpertsList(data.queryParams) |
| | | loading.value = true |
| | | data.queryParams.startTime = data.searchTime[0] || '' |
| | | data.queryParams.endTime = data.searchTime[1] || '' |
| | | const res = await getExpertEvaList(data.queryParams) |
| | | if(res.code == 200){ |
| | | data.expertList = res.data.list |
| | | data.total = res.data.total |
| | | data.expertList = res.rows |
| | | data.total = res.total |
| | | }else{ |
| | | ElMessage.warning(res.msg) |
| | | } |
| | |
| | | } |
| | | |
| | | const openDialog = async (type, value) => { |
| | | console.log(evaluateFormRef.value,666) |
| | | evaluateFormRef.value.openDialog(type, value) |
| | | } |
| | | |
| | |
| | | data.queryParams = { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | bigClassify: null, |
| | | smallClassify: null, |
| | | dutyStatus: null, |
| | | projectName: '', |
| | | name: '', |
| | | params: { |
| | | startTime: '', |
| | | endTime: '' |
| | | } |
| | | }; |
| | | data.classiFy = [] |
| | | idCard: '', |
| | | domain: '', |
| | | startTime: '', |
| | | endTime: '' |
| | | } |
| | | data.searchTime = [] |
| | | handleQuery() |
| | | } |
| | |
| | | <el-form-item label="姓名"> |
| | | <el-input v-model.trim="queryParams.name" placeholder="请输入姓名"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="身份证号"> |
| | | <el-input v-model.trim="queryParams.idCard" placeholder="请输入身份证号"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="专业类别"> |
| | | <el-cascader |
| | | clearable |
| | | v-model="classiFy" |
| | | v-model="queryParams.domain" |
| | | :options="expertTypes" |
| | | :props="{ expandTrigger: 'hover', value: 'id',label: 'classifyName'}" |
| | | :props="{ expandTrigger: 'hover', value: 'classifyName',label: 'classifyName'}" |
| | | @change="handleChange"></el-cascader> |
| | | </el-form-item> |
| | | <el-form-item label="在岗情况" prop="dutyStatus"> |
| | |
| | | value-format="YYYY-MM-DD" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="评定级别"> |
| | | <el-radio-group v-model="queryParams.ratingLevel"> |
| | | <el-radio-button label="1">一级</el-radio-button> |
| | | <el-radio-button label="2">二级</el-radio-button> |
| | | <el-radio-button label="3">三级</el-radio-button> |
| | | </el-radio-group> |
| | | </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-table-column type="index" width="55" align="center" /> |
| | | <el-table-column label="姓名" align="center" prop="name" /> |
| | | <el-table-column label="身份证号" align="center" prop="idCard" /> |
| | | <el-table-column label="出生日期" align="center" prop="birthdayName" /> |
| | | <el-table-column label="出生日期" align="center" prop="birthday"> |
| | | <template #default="scope"> |
| | | {{scope.row.birthday.slice(0,10)}} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="性别" align="center" prop="sex" > |
| | | <template #default="scope"> |
| | | <span>{{scope.row.sex === 0 ? '男' : '女'}}</span> |
| | |
| | | <el-table-column label="单位全称" align="center" prop="companyName"/> |
| | | <el-table-column label="现从事专业及方向" align="center" prop="currentProfession"/> |
| | | <el-table-column label="联系方式" align="center" prop="phone"/> |
| | | <el-table-column label="支撑方向" align="center" prop="supportDirectionSafety"/> |
| | | <el-table-column label="支撑方向" align="center"> |
| | | <template #default="scope"> |
| | | {{ getSupport(scope.row.supportDirectionSafety, scope.row.supportDirectionPrevention, scope.row.supportDirectionEmergency) }} |
| | | <!-- directionList--> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="专家领域" align="center" prop="domain"/> |
| | | <el-table-column label="入库分级" align="center" prop="level"/> |
| | | <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> |
| | | <el-table-column label="评定级别" align="center" prop="ratingLevel"> |
| | | <template #default="scope"> |
| | | {{scope.row.ratingLevel == 1?'一级':scope.row.ratingLevel == 2?'二级':scope.row.ratingLevel == 3?'三级':'--'}} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="聘书有效时间" align="center" prop=""> |
| | | <template #default="scope"> |
| | | {{scope.row.employmentDateStart}}/{{scope.row.employmentDateEnd}} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="专家聘书" align="center" prop="expertCertificate"> |
| | | <template #default="scope"> |
| | | <div class="demo-image__preview" v-if="scope.row.expertCertificate && scope.row.expertCertificate!==''"> |
| | | <el-image |
| | | style="width: 100px; height: 100px" |
| | | :src= "scope.row.expertCertificate" |
| | | :zoom-rate="1.2" |
| | | :max-scale="7" |
| | | :min-scale="0.2" |
| | | :preview-src-list="[scope.row.expertCertificate]" |
| | | :initial-index="0" |
| | | fit="cover" |
| | | :preview-teleported=true |
| | | /> |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-button type="primary" link @click="openDialog('view',scope.row)">查看</el-button> |
| | | </template> |
| | |
| | | expertTypes: [], |
| | | expertList: [], |
| | | queryParams: { |
| | | name: '', |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | state: 2, |
| | | bigClassify: null, |
| | | smallClassify: null, |
| | | dutyStatus: null, |
| | | idCard: '', |
| | | dutyStatus: '', |
| | | domain: '', |
| | | ratingLevel: null, |
| | | params: { |
| | | startTime: '', |
| | | endTime: '' |
| | | } |
| | | }, |
| | | classiFy: [], |
| | | searchTime: [] |
| | | searchTime: [], |
| | | directionList: [ |
| | | { |
| | | value: '1', |
| | | label: '现场检查' |
| | | }, |
| | | { |
| | | value: '2', |
| | | label: '调查评估' |
| | | }, |
| | | { |
| | | value: '3', |
| | | label: '咨询服务' |
| | | }, |
| | | { |
| | | value: '4', |
| | | label: '教育培训' |
| | | }, |
| | | { |
| | | value: '5', |
| | | label: '其他' |
| | | } |
| | | ], |
| | | }); |
| | | |
| | | const { showSearch,total, expertTypes,expertList,queryParams,classiFy,searchTime} = toRefs(data); |
| | | const expertFormRef = ref() |
| | | onMounted(()=>{ |
| | | // getList() |
| | | // getTypes() |
| | | getList() |
| | | getTypes() |
| | | }) |
| | | |
| | | onUnmounted(()=>{ |
| | |
| | | return null; |
| | | } |
| | | |
| | | const getSupport =(safety,prevention,emergency)=>{ |
| | | let str = [] |
| | | let safeArr = safety?.split(',') |
| | | let preventArr = prevention?.split(',') |
| | | let emergencyArr = emergency?.split(',') |
| | | if(Array.isArray(safeArr) && !safeArr.includes("")){ |
| | | safeArr = safeArr.map(i=>{ |
| | | return data.directionList.find(item=>item.value == i)?.label |
| | | }) |
| | | str.push(`安全生产(${safeArr.join('、')})`) |
| | | } |
| | | if(Array.isArray(preventArr) && !preventArr.includes("")){ |
| | | preventArr = preventArr.map(i=>{ |
| | | return data.directionList.find(item=>item.value == i)?.label |
| | | }) |
| | | str.push(`防灾减灾(${preventArr.join('、')})`) |
| | | } |
| | | if(Array.isArray(emergencyArr) && !emergencyArr.includes("")){ |
| | | emergencyArr = emergencyArr.map(i=>{ |
| | | return data.directionList.find(item=>item.value == i)?.label |
| | | }) |
| | | str.push(`应急救援(${emergencyArr.join('、')})`) |
| | | } |
| | | return str.join(',') |
| | | } |
| | | |
| | | const handleQuery=()=> { |
| | | data.queryParams.pageNum = 1 |
| | | if(data.classiFy && data.classiFy.length>0){ |
| | | data.queryParams.bigClassify = data.classiFy[0] |
| | | data.queryParams.smallClassify = data.classiFy[1] |
| | | } |
| | | if(data.searchTime && data.searchTime.length>0){ |
| | | data.queryParams.params.startTime = data.searchTime[0] |
| | | data.queryParams.params.endTime = data.searchTime[1] |
| | |
| | | loading.value = true; |
| | | const res = await getExpertsList(data.queryParams) |
| | | if(res.code == 200){ |
| | | data.expertList = res.data.map(item => { |
| | | return{ |
| | | ...item, |
| | | birthdayName: item.birthday ? item.birthday.slice(0,10) : '' |
| | | } |
| | | }) |
| | | data.total = res.data.total |
| | | data.expertList = res.rows |
| | | data.total = res.total |
| | | }else{ |
| | | ElMessage.warning(res.msg) |
| | | } |
| | |
| | | |
| | | const resetQuery=()=> { |
| | | data.queryParams = { |
| | | name: '', |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | state: 2, |
| | | bigClassify: null, |
| | | smallClassify: null, |
| | | dutyStatus: null, |
| | | idCard: '', |
| | | dutyStatus: '', |
| | | domain: '', |
| | | ratingLevel: null, |
| | | params: { |
| | | startTime: '', |
| | | endTime: '' |
| | |
| | | <el-form :model="state.form" :rules="state.rules" ref="ruleFormRef" label-width="200px"> |
| | | <el-row> |
| | | <el-col :span="20"> |
| | | <el-form-item label="专业类别" prop="profession"> |
| | | <el-form-item label="专业类别" prop="domain"> |
| | | <el-cascader |
| | | style="width: 100%" |
| | | v-model="state.form.profession" |
| | | clearable |
| | | v-model="state.form.domain" |
| | | :options="state.expertsType" |
| | | :props="{ expandTrigger: 'hover',value: 'id',label: 'classifyName' }" |
| | | :props="{ expandTrigger: 'hover',value: 'classifyName',label: 'classifyName',emitPath: false }" |
| | | @change="professionChange"></el-cascader> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <!-- <el-row>--> |
| | | <!-- <el-col :span="20">--> |
| | | <!-- <el-form-item label="填报日期" prop="date">--> |
| | | <!-- <el-date-picker--> |
| | | <!-- style="width: 100%"--> |
| | | <!-- v-model="form.date"--> |
| | | <!-- type="date"--> |
| | | <!-- placeholder="选择日期">--> |
| | | <!-- </el-date-picker>--> |
| | | <!-- </el-form-item>--> |
| | | <!-- </el-col>--> |
| | | <!-- </el-row>--> |
| | | <el-row> |
| | | <el-col :span="20"> |
| | | <el-form-item label="业务处室:" prop="deptId"> |
| | | <el-cascader |
| | | style="width: 100%" |
| | | clearable |
| | | v-model="state.form.deptId" |
| | | :options="state.deptList" |
| | | :props="{ expandTrigger: 'hover', value: 'deptId',label: 'deptName',emitPath: false}"></el-cascader> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="20"> |
| | | <el-form-item label="姓名" prop="name"> |
| | |
| | | <el-date-picker |
| | | style="width: 100%" |
| | | v-model="state.form.birthday" |
| | | value-format="YYYY-MM-DD 00:00:00" |
| | | value-format="YYYY-MM-DD" |
| | | type="date" |
| | | placeholder="选择日期"> |
| | | </el-date-picker> |
| | |
| | | import {delPic} from "@/api/login" |
| | | import { getToken } from "@/utils/auth" |
| | | import {Base64} from "js-base64" |
| | | import {listDept, listOutDept} from "@/api/system/dept"; |
| | | |
| | | const { proxy } = getCurrentInstance(); |
| | | const imgDialog = ref(false) |
| | | const ruleFormRef = ref() |
| | | var validatePass = (rule, value, callback) => { |
| | |
| | | form:{ |
| | | name:'', |
| | | sex:'', |
| | | profession: [], |
| | | bigClassify:null, |
| | | smallClassify: null, |
| | | domain: '', |
| | | deptId: null, |
| | | birthday: '', |
| | | phone:'', |
| | | title: '', |
| | |
| | | source: 1 |
| | | }, |
| | | expertsType: [], |
| | | deptList: [], |
| | | directionList: [ |
| | | { |
| | | value: 1, |
| | |
| | | label: '其他' |
| | | } |
| | | ], |
| | | uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', |
| | | uploadUrl: import.meta.env.VITE_APP_BASE_API + '/common/upload', |
| | | header: { |
| | | Authorization: 'Bearer ' + getToken() |
| | | }, |
| | |
| | | rules:{ |
| | | name:[{ required: true, message: '请填写姓名', trigger: 'blur' }], |
| | | sex:[{ required: true, message: '请选择性别', trigger: 'blur' }], |
| | | profession: [{ required: true, message: '请选择专业类别', trigger: 'blur' }], |
| | | domain: [{ required: true, message: '请选择专业类别', trigger: 'blur' }], |
| | | deptId: [{ required: true, message: '请选择业务处室', trigger: 'blur' }], |
| | | birthday: [{ required: true, message: '请选择出生日期', trigger: 'blur' }], |
| | | phone:[{ required: true, validator: validatePhone, trigger: 'blur' }], |
| | | title: [{ required: true, message: '请填写职称', trigger: 'blur' }], |
| | |
| | | |
| | | onMounted(()=>{ |
| | | getExpertsType() |
| | | getDepList() |
| | | }) |
| | | |
| | | const getExpertsType = async ()=>{ |
| | |
| | | message: res.message |
| | | }); |
| | | } |
| | | } |
| | | |
| | | function getDepList() { |
| | | listOutDept({}).then(response => { |
| | | state.deptList = proxy.handleTree(response.data, "deptId",'parentId','children'); |
| | | }); |
| | | } |
| | | |
| | | const professionChange=(value)=> { |
| | |
| | | const handleAvatarSuccess = (res, uploadFile,type) => { |
| | | if(res.code == 200){ |
| | | if(type == '证件照'){ |
| | | state.form.electronicPhoto = res.data.path |
| | | state.form.electronicPhoto = res.url |
| | | }else{ |
| | | uploadFile.name = res.data.path |
| | | uploadFile.name = res.url |
| | | } |
| | | }else{ |
| | | ElMessage({ |
| | |
| | | data.supportDirectionSafety = data.supportDirectionSafety.join(',') |
| | | data.supportDirectionPrevention = data.supportDirectionPrevention.join(',') |
| | | data.supportDirectionEmergency = data.supportDirectionEmergency.join(',') |
| | | data.bigClassify = data.profession[0] |
| | | data.smallClassify = data.profession[1] |
| | | data.resumeKey = state.resumeList.map(i=>i.name).join(',') |
| | | data.paperSituationKey = state.inventionList.map(i=>i.name).join(',') |
| | | data.rewardKey = state.rewardList.map(i=>i.name).join(',') |
| | | data.achievementKey = state.achievementList.map(i=>i.name).join(',') |
| | | data.personalOpinionKey = state.proAdviceList.map(i=>i.name).join(',') |
| | | data.recommendUnitOpinionKey = state.adviceList.map(i=>i.name).join(',') |
| | | delete data.profession |
| | | delete data.id |
| | | const res= await addExpertInfo(data) |
| | | if(res.code == 200){ |
| | | ElMessage.success(res.message) |
| | | ElMessage.success(res.msg) |
| | | state.form = { |
| | | name:'', |
| | | sex:'', |
| | | profession: [], |
| | | bigClassify:null, |
| | | smallClassify: null, |
| | | domain: '', |
| | | birthday: '', |
| | | phone:'', |
| | | title: '', |
| | |
| | | state.proAdviceList = [] |
| | | state.adviceList = [] |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | ElMessage.warning(res.msg) |
| | | } |
| | | } else { |
| | | ElMessage.warning('请完善必填信息') |
| | |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form-item label="项目名称"> |
| | | <el-input v-model="queryParams.name" placeholder="请输入姓名" /> |
| | | <el-input v-model="queryParams.projectName" placeholder="请输入项目名称" /> |
| | | </el-form-item> |
| | | <el-form-item label="评估情况" prop="dutyStatus"> |
| | | <el-form-item label="评估情况" prop="evaluationState"> |
| | | <el-select v-model="queryParams.dutyStatus" placeholder="岗位状态" clearable> |
| | | <el-option :key="0" label="已评估" :value="0"/> |
| | | <el-option :key="1" label="未评估" :value="1"/> |
| | | <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-form-item label="审批时间" prop="projectCheckTime"> |
| | | <el-date-picker |
| | | v-model="searchTime" |
| | | type="date" |
| | | type="datetime" |
| | | @change="changeTime" |
| | | value-format="YYYY-MM-DD" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | |
| | | import ExpertDialog from "./components/expertList"; |
| | | import {delExpert, getExpertsList, getExpertTypes} from "../../../../api/form"; |
| | | import { Plus } from '@element-plus/icons-vue' |
| | | import {getProjectExpertList} from "@/api/backManage/evaluate"; |
| | | |
| | | const loading = ref(false) |
| | | const data = reactive({ |
| | |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | bigClassify: null, |
| | | smallClassify: null, |
| | | projectName: '', |
| | | dutyStatus: null, |
| | | name: '', |
| | | params: { |
| | | startTime: '', |
| | | endTime: '' |
| | | } |
| | | projectCheckTime: '' |
| | | }, |
| | | classiFy: [], |
| | | searchTime: [] |
| | |
| | | const expertListRef = ref() |
| | | |
| | | onMounted(()=>{ |
| | | // getList() |
| | | getList() |
| | | // getTypes() |
| | | }) |
| | | |
| | |
| | | }else{ |
| | | ElMessage.warning(res.msg) |
| | | } |
| | | } |
| | | |
| | | const handleChange=(value)=> { |
| | | if(!value){ |
| | | data.classiFy = [] |
| | | data.queryParams.bigClassify = "" |
| | | data.queryParams.smallClassify = "" |
| | | } |
| | | } |
| | | const changeTime=(value)=>{ |
| | | if(!value){ |
| | | data.queryParams.params.endTime = "" |
| | | data.queryParams.params.startTime = "" |
| | | } |
| | | } |
| | | |
| | | const findNodeById = (data,value)=> { |
| | |
| | | |
| | | const handleQuery=()=> { |
| | | data.queryParams.pageNum = 1 |
| | | if(data.classiFy && data.classiFy.length>0){ |
| | | data.queryParams.bigClassify = data.classiFy[0] |
| | | data.queryParams.smallClassify = data.classiFy[1] |
| | | } |
| | | if(data.searchTime && data.searchTime.length>0){ |
| | | data.queryParams.params.startTime = data.searchTime[0] |
| | | data.queryParams.params.endTime = data.searchTime[1] |
| | | } |
| | | getList() |
| | | } |
| | | |
| | | const getList = async () => { |
| | | loading.value = true; |
| | | const res = await getExpertsList(data.queryParams) |
| | | const res = await getProjectExpertList(data.queryParams) |
| | | if(res.code == 200){ |
| | | data.expertList = res.data.list |
| | | data.total = res.data.total |
| | | data.expertList = res.rows |
| | | data.total = res.total |
| | | }else{ |
| | | ElMessage.warning(res.msg) |
| | | } |
| | |
| | | data.queryParams = { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | bigClassify: null, |
| | | smallClassify: null, |
| | | projectName: '', |
| | | dutyStatus: null, |
| | | name: '', |
| | | params: { |
| | | startTime: '', |
| | | endTime: '' |
| | | } |
| | | }; |
| | | data.classiFy = [] |
| | | data.searchTime = [] |
| | | projectCheckTime: '' |
| | | } |
| | | handleQuery() |
| | | } |
| | | |
| | |
| | | <script setup name="Dept"> |
| | | import { listDept, getDept, delDept, addDept, updateDept, listDeptExcludeChild } from "@/api/system/dept"; |
| | | import {onMounted,ref} from "vue"; |
| | | |
| | | import {parseTime} from "@/utils/ruoyi"; |
| | | const { proxy } = getCurrentInstance(); |
| | | // const { sys_normal_disable } = proxy.useDict("sys_normal_disable"); |
| | | const { sys_normal_disable } = proxy.useDict("sys_normal_disable"); |
| | | |
| | | const deptList = ref([]); |
| | | const open = ref(false); |
| | |
| | | const { queryParams, form, rules } = toRefs(data); |
| | | |
| | | onMounted(()=>{ |
| | | // getList() |
| | | getList() |
| | | }) |
| | | |
| | | /** 查询部门列表 */ |
| | | function getList() { |
| | | loading.value = true; |
| | | listDept(queryParams.value).then(response => { |
| | | deptList.value = proxy.handleTree(response.data, "deptId"); |
| | | deptList.value = proxy.handleTree(response.data, "deptId",'parentId','children'); |
| | | loading.value = false; |
| | | }); |
| | | } |