马宇豪
2024-11-21 cc3e08bda13360c88b7189e8f8d043b60783c7fb
新增
已修改19个文件
1332 ■■■■■ 文件已修改
src/api/backManage/evaluate.js 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/form.js 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/login.js 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/system/dept.js 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/components/Sidebar/Logo.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/components/loginForm.vue 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/baseSet/evaluateType/components/typeDialog.vue 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/baseSet/evaluateType/index.vue 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/baseSet/expertsType/index.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/baseSet/openApply/index.vue 81 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/expertManage/applyRecords/components/expertForm.vue 348 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/expertManage/applyRecords/index.vue 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/expertManage/checkProgress/index.vue 152 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/expertManage/evaluateRecord/components/evaluateDetail.vue 62 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/expertManage/evaluateRecord/index.vue 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/expertManage/experts/index.vue 141 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/expertManage/fillForm/index.vue 68 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/expertManage/postEvaluation/index.vue 67 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/dept/index.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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
    })
}
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({
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
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
  })
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({
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('抱歉,专家申请暂未开启,请联系相关人员进行处理')
  }
}
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({
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)
            }
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){
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>
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: '',
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: {
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;
    }
  }
}
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;
}
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()
}
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: ''
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('请完善必填信息')
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()
}
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;
  });
}