From cc3e08bda13360c88b7189e8f8d043b60783c7fb Mon Sep 17 00:00:00 2001 From: 马宇豪 <978517621@qq.com> Date: 星期四, 21 十一月 2024 16:46:32 +0800 Subject: [PATCH] 新增 --- src/views/safetyReview/baseSet/evaluateType/index.vue | 39 + src/api/login.js | 5 src/views/safetyReview/expertManage/applyRecords/index.vue | 30 src/views/safetyReview/expertManage/applyRecords/components/expertForm.vue | 348 +++++++++----- src/views/system/dept/index.vue | 8 src/views/safetyReview/baseSet/openApply/index.vue | 81 +++ src/api/system/dept.js | 11 src/views/safetyReview/expertManage/evaluateRecord/index.vue | 120 +--- src/api/backManage/evaluate.js | 79 +++ src/views/safetyReview/baseSet/evaluateType/components/typeDialog.vue | 66 +- src/views/safetyReview/expertManage/fillForm/index.vue | 68 +- src/views/safetyReview/baseSet/expertsType/index.vue | 4 src/views/safetyReview/expertManage/experts/index.vue | 141 ++++- src/layout/components/Sidebar/Logo.vue | 2 src/views/safetyReview/expertManage/checkProgress/index.vue | 152 ++++-- src/views/safetyReview/expertManage/evaluateRecord/components/evaluateDetail.vue | 62 +- src/views/components/loginForm.vue | 36 + src/api/form.js | 13 src/views/safetyReview/expertManage/postEvaluation/index.vue | 67 -- 19 files changed, 830 insertions(+), 502 deletions(-) diff --git a/src/api/backManage/evaluate.js b/src/api/backManage/evaluate.js index 0ff7148..c8ce9d7 100644 --- a/src/api/backManage/evaluate.js +++ b/src/api/backManage/evaluate.js @@ -36,3 +36,82 @@ }) } +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 + }) +} \ No newline at end of file diff --git a/src/api/form.js b/src/api/form.js index 78913d3..e4f2475 100644 --- a/src/api/form.js +++ b/src/api/form.js @@ -12,8 +12,8 @@ // 获取专家列表 export function delExpert(id) { return request({ - url: '/expert/info/del/'+id, - method: 'get' + url: '/system/expert_info/del/'+id, + method: 'delete' }) } @@ -78,6 +78,15 @@ }) } +// 查询审批结果 +export function queryApprove(data) { + return request({ + url: '/system/expert_info/queryApprove', + method: 'post', + data: data + }) +} + // 根据id获取专家信息 export function getInfo(id) { return request({ diff --git a/src/api/login.js b/src/api/login.js index 8539913..a494c70 100644 --- a/src/api/login.js +++ b/src/api/login.js @@ -82,10 +82,7 @@ // 删除图片 export function delPic(path) { return request({ - url: '/system/common/removeFile', - headers: { - isToken: false - }, + url: '/common/removeFile', method: 'delete', params: path, timeout: 20000 diff --git a/src/api/system/dept.js b/src/api/system/dept.js index fc943cd..2632179 100644 --- a/src/api/system/dept.js +++ b/src/api/system/dept.js @@ -9,6 +9,15 @@ }) } +// 查询部门列表 +export function listOutDept(query) { + return request({ + url: '/system/dept/getOutDeptList', + method: 'get', + params: query + }) +} + // 查询部门列表(排除节点) export function listDeptExcludeChild(deptId) { return request({ @@ -28,7 +37,7 @@ // 新增部门 export function addDept(data) { return request({ - url: '/system/dept', + url: '/system/dept/add', method: 'post', data: data }) diff --git a/src/layout/components/Sidebar/Logo.vue b/src/layout/components/Sidebar/Logo.vue index ff486bb..6beb78c 100644 --- a/src/layout/components/Sidebar/Logo.vue +++ b/src/layout/components/Sidebar/Logo.vue @@ -15,7 +15,7 @@ <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({ diff --git a/src/views/components/loginForm.vue b/src/views/components/loginForm.vue index 7d4fd1b..be9abc5 100644 --- a/src/views/components/loginForm.vue +++ b/src/views/components/loginForm.vue @@ -48,7 +48,7 @@ </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> @@ -59,8 +59,8 @@ </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> @@ -72,6 +72,7 @@ <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' @@ -79,6 +80,7 @@ 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() @@ -104,6 +106,7 @@ const regRef = ref(null) // 验证码开关 const captchaEnabled = ref(true); +const applyStatus = ref('1') // 注册开关 const isRegister = ref(true); const redirect = ref(undefined); @@ -122,12 +125,27 @@ 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('抱歉,专家申请暂未开启,请联系相关人员进行处理') + } } diff --git a/src/views/safetyReview/baseSet/evaluateType/components/typeDialog.vue b/src/views/safetyReview/baseSet/evaluateType/components/typeDialog.vue index 603ba8b..d188447 100644 --- a/src/views/safetyReview/baseSet/evaluateType/components/typeDialog.vue +++ b/src/views/safetyReview/baseSet/evaluateType/components/typeDialog.vue @@ -8,9 +8,9 @@ > <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"> @@ -34,7 +34,7 @@ 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(""); @@ -43,33 +43,25 @@ 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 () => { @@ -77,11 +69,11 @@ 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', @@ -92,27 +84,25 @@ } 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; } } @@ -126,10 +116,10 @@ } const reset = () => { state.form = { - id: '', - label: '', - value: '', - dictType: "sys_assess_type", + id: '', + score: '', + content: '', + scoreType: null } } defineExpose({ diff --git a/src/views/safetyReview/baseSet/evaluateType/index.vue b/src/views/safetyReview/baseSet/evaluateType/index.vue index a44c44f..3754b30 100644 --- a/src/views/safetyReview/baseSet/evaluateType/index.vue +++ b/src/views/safetyReview/baseSet/evaluateType/index.vue @@ -9,7 +9,7 @@ >新增</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> @@ -17,9 +17,13 @@ </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> @@ -47,15 +51,16 @@ 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: [ @@ -66,14 +71,14 @@ 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) } @@ -97,6 +102,12 @@ function reset() { proxy.resetForm("roleRef"); } + +const reSearch=()=>{ + data.queryParams.pageNum = 1 + getList() +} + const handleDelete = (val) => { ElMessageBox.confirm( '确定删除此条数据?', @@ -107,13 +118,13 @@ 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) } diff --git a/src/views/safetyReview/baseSet/expertsType/index.vue b/src/views/safetyReview/baseSet/expertsType/index.vue index 3808ca5..379022e 100644 --- a/src/views/safetyReview/baseSet/expertsType/index.vue +++ b/src/views/safetyReview/baseSet/expertsType/index.vue @@ -100,10 +100,10 @@ const formRef = ref() onMounted(()=>{ - // getList() + getList() }) /** 查询岗位列表 */ - const getList = async()=> { + const getList = async()=> { state.loading = true; const res = await getExpertTypes() if(res.code == 200){ diff --git a/src/views/safetyReview/baseSet/openApply/index.vue b/src/views/safetyReview/baseSet/openApply/index.vue index d50a03d..77d6aec 100644 --- a/src/views/safetyReview/baseSet/openApply/index.vue +++ b/src/views/safetyReview/baseSet/openApply/index.vue @@ -1,8 +1,18 @@ <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"> @@ -28,7 +38,7 @@ <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(); @@ -36,8 +46,7 @@ const data = reactive({ queryParams: { pageNum: 1, - pageSize: 10, - dictType: dictType.value + pageSize: 10 }, total: 0, dataList: [ @@ -49,16 +58,45 @@ 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; } @@ -102,7 +140,26 @@ </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> diff --git a/src/views/safetyReview/expertManage/applyRecords/components/expertForm.vue b/src/views/safetyReview/expertManage/applyRecords/components/expertForm.vue index 5e88339..59cf27e 100644 --- a/src/views/safetyReview/expertManage/applyRecords/components/expertForm.vue +++ b/src/views/safetyReview/expertManage/applyRecords/components/expertForm.vue @@ -12,29 +12,29 @@ <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"> @@ -58,7 +58,7 @@ <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> @@ -310,7 +310,39 @@ </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> @@ -319,25 +351,29 @@ <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('请上传证件照')); @@ -369,13 +405,13 @@ } const state = reactive({ + assessDialog: false, form:{ id: null, name:'', sex:'', - profession: [], - bigClassify:null, - smallClassify: null, + domain: '', + deptId: null, birthday: '', phone:'', title: '', @@ -405,9 +441,14 @@ remark: '', source: 2 }, + assessForm: { + employTime: [], + ratingLevel: '' + }, hasDeleteFile: false, disable: false, expertsType: [], + deptList: [], directionList: [ { value: 1, @@ -430,7 +471,7 @@ 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() }, @@ -445,7 +486,8 @@ 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' }], @@ -454,6 +496,10 @@ 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' }] } }) @@ -463,98 +509,113 @@ 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)=>{ @@ -567,18 +628,34 @@ 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 }); } }) @@ -595,6 +672,12 @@ }); } } + +function getDepList() { + listOutDept({}).then(response => { + state.deptList = proxy.handleTree(response.data, "deptId",'parentId','children'); + }); +} const professionChange=(value)=> { console.log(value,'val') @@ -628,9 +711,9 @@ 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({ @@ -641,6 +724,7 @@ } const handleRemove = (file, uploadFiles,type) => { + console.log(file, uploadFiles) if(file && file.status == 'success') { ElMessageBox.confirm( '该操作将永久删除此文件内容,是否继续?', @@ -667,7 +751,7 @@ } else { ElMessage({ type: 'warning', - message: res.message + message: res.msg }) } }) @@ -683,23 +767,20 @@ 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 = [] @@ -711,12 +792,12 @@ 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 = [] @@ -728,13 +809,33 @@ 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 = () => { @@ -744,9 +845,8 @@ id: null, name:'', sex:'', - profession: [], - bigClassify:null, - smallClassify: null, + domain: '', + deptId: null, birthday: '', phone:'', title: '', diff --git a/src/views/safetyReview/expertManage/applyRecords/index.vue b/src/views/safetyReview/expertManage/applyRecords/index.vue index 96084d0..c62e07f 100644 --- a/src/views/safetyReview/expertManage/applyRecords/index.vue +++ b/src/views/safetyReview/expertManage/applyRecords/index.vue @@ -4,9 +4,9 @@ <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="姓名"> @@ -52,15 +52,15 @@ <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"> @@ -112,8 +112,7 @@ queryParams: { pageNum: 1, pageSize: 10, - bigClassify: null, - smallClassify: null, + domain: '', dutyStatus: null, name: '', params: { @@ -176,10 +175,6 @@ 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] @@ -191,8 +186,8 @@ 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) } @@ -226,8 +221,7 @@ data.queryParams = { pageNum: 1, pageSize: 10, - bigClassify: null, - smallClassify: null, + domain: '', dutyStatus: null, name: '', params: { diff --git a/src/views/safetyReview/expertManage/checkProgress/index.vue b/src/views/safetyReview/expertManage/checkProgress/index.vue index 30173e0..b448ce7 100644 --- a/src/views/safetyReview/expertManage/checkProgress/index.vue +++ b/src/views/safetyReview/expertManage/checkProgress/index.vue @@ -1,45 +1,36 @@ <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> @@ -50,7 +41,10 @@ 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 === ''){ @@ -75,27 +69,34 @@ } } -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(()=>{ @@ -105,19 +106,36 @@ 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; @@ -127,28 +145,42 @@ 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; } } } diff --git a/src/views/safetyReview/expertManage/evaluateRecord/components/evaluateDetail.vue b/src/views/safetyReview/expertManage/evaluateRecord/components/evaluateDetail.vue index 5cc296e..09328b7 100644 --- a/src/views/safetyReview/expertManage/evaluateRecord/components/evaluateDetail.vue +++ b/src/views/safetyReview/expertManage/evaluateRecord/components/evaluateDetail.vue @@ -7,27 +7,27 @@ :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> @@ -43,20 +43,21 @@ 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' }], @@ -65,20 +66,21 @@ }) 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; } diff --git a/src/views/safetyReview/expertManage/evaluateRecord/index.vue b/src/views/safetyReview/expertManage/evaluateRecord/index.vue index f19dd68..a02fba2 100644 --- a/src/views/safetyReview/expertManage/evaluateRecord/index.vue +++ b/src/views/safetyReview/expertManage/evaluateRecord/index.vue @@ -2,29 +2,29 @@ <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> @@ -33,28 +33,24 @@ </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> @@ -78,6 +74,7 @@ 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({ @@ -88,24 +85,21 @@ 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(()=>{ @@ -117,22 +111,8 @@ 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)=> { @@ -152,23 +132,17 @@ 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) } @@ -176,7 +150,6 @@ } const openDialog = async (type, value) => { - console.log(evaluateFormRef.value,666) evaluateFormRef.value.openDialog(type, value) } @@ -203,16 +176,13 @@ 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() } diff --git a/src/views/safetyReview/expertManage/experts/index.vue b/src/views/safetyReview/expertManage/experts/index.vue index b8435a5..26a6f23 100644 --- a/src/views/safetyReview/expertManage/experts/index.vue +++ b/src/views/safetyReview/expertManage/experts/index.vue @@ -4,12 +4,15 @@ <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"> @@ -29,6 +32,13 @@ 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> @@ -38,7 +48,11 @@ <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> @@ -55,10 +69,42 @@ <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> @@ -89,26 +135,49 @@ 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(()=>{ @@ -153,12 +222,34 @@ 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] @@ -170,13 +261,8 @@ 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) } @@ -189,12 +275,13 @@ 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: '' diff --git a/src/views/safetyReview/expertManage/fillForm/index.vue b/src/views/safetyReview/expertManage/fillForm/index.vue index 543b20b..996a55d 100644 --- a/src/views/safetyReview/expertManage/fillForm/index.vue +++ b/src/views/safetyReview/expertManage/fillForm/index.vue @@ -5,28 +5,29 @@ <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"> @@ -50,7 +51,7 @@ <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> @@ -318,7 +319,9 @@ 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) => { @@ -355,9 +358,8 @@ form:{ name:'', sex:'', - profession: [], - bigClassify:null, - smallClassify: null, + domain: '', + deptId: null, birthday: '', phone:'', title: '', @@ -388,6 +390,7 @@ source: 1 }, expertsType: [], + deptList: [], directionList: [ { value: 1, @@ -410,7 +413,7 @@ 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() }, @@ -425,7 +428,8 @@ 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' }], @@ -439,6 +443,7 @@ onMounted(()=>{ getExpertsType() + getDepList() }) const getExpertsType = async ()=>{ @@ -451,6 +456,12 @@ message: res.message }); } + } + + function getDepList() { + listOutDept({}).then(response => { + state.deptList = proxy.handleTree(response.data, "deptId",'parentId','children'); + }); } const professionChange=(value)=> { @@ -485,9 +496,9 @@ 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({ @@ -542,25 +553,20 @@ 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: '', @@ -598,7 +604,7 @@ state.proAdviceList = [] state.adviceList = [] }else{ - ElMessage.warning(res.message) + ElMessage.warning(res.msg) } } else { ElMessage.warning('请完善必填信息') diff --git a/src/views/safetyReview/expertManage/postEvaluation/index.vue b/src/views/safetyReview/expertManage/postEvaluation/index.vue index 909d1fa..3f91c8e 100644 --- a/src/views/safetyReview/expertManage/postEvaluation/index.vue +++ b/src/views/safetyReview/expertManage/postEvaluation/index.vue @@ -2,20 +2,20 @@ <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> @@ -71,6 +71,7 @@ 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({ @@ -81,14 +82,9 @@ queryParams: { pageNum: 1, pageSize: 10, - bigClassify: null, - smallClassify: null, + projectName: '', dutyStatus: null, - name: '', - params: { - startTime: '', - endTime: '' - } + projectCheckTime: '' }, classiFy: [], searchTime: [] @@ -98,7 +94,7 @@ const expertListRef = ref() onMounted(()=>{ - // getList() + getList() // getTypes() }) @@ -113,20 +109,6 @@ }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)=> { @@ -146,23 +128,15 @@ 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) } @@ -196,17 +170,10 @@ data.queryParams = { pageNum: 1, pageSize: 10, - bigClassify: null, - smallClassify: null, + projectName: '', dutyStatus: null, - name: '', - params: { - startTime: '', - endTime: '' - } - }; - data.classiFy = [] - data.searchTime = [] + projectCheckTime: '' + } handleQuery() } diff --git a/src/views/system/dept/index.vue b/src/views/system/dept/index.vue index a4a3c8d..13afa61 100644 --- a/src/views/system/dept/index.vue +++ b/src/views/system/dept/index.vue @@ -143,9 +143,9 @@ <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); @@ -174,14 +174,14 @@ 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; }); } -- Gitblit v1.9.2