马宇豪
2024-12-02 02ad7cd1aaa98f25b9a3dd6a73a037c70006f001
src/views/safetyReview/projectManage/components/expertsList.vue
@@ -6,140 +6,73 @@
            width="60%"
        >
          <el-form :model="queryParams" :inline="true" label-width="90px">
            <el-form-item label="专业类别">
              <el-radio-group v-model="queryParams.expertType">
                <el-radio-button label="">全部</el-radio-button>
                <el-radio-button label="1">安全评价</el-radio-button>
                <el-radio-button label="2">检验检测</el-radio-button>
              </el-radio-group>
            </el-form-item>
            <el-form-item label="姓名">
              <el-input
                  v-model="queryParams.name"
                  v-model.trim="queryParams.name"
                  placeholder="姓名"
                  clearable
                  style="width: 250px"
              />
            </el-form-item>
            <el-form-item label="手机号">
              <el-input
                  v-model="queryParams.phone"
                  v-model.trim="queryParams.phone"
                  placeholder="手机号"
                  clearable
                  style="width: 250px"
              />
            </el-form-item>
            <el-form-item label="评价师等级">
              <el-select v-model="queryParams.level" style="width: 250px" placeholder="评价师等级" >
            <el-form-item label="等级">
              <el-select v-model="queryParams.ratingLevel"   clearable style="width: 250px" placeholder="等级" >
                <el-option
                    v-for="item in levelList"
                    :key="item.id"
                    :label="item.name"
                    :value="item.name"
                />
              </el-select>
            </el-form-item>
            <el-form-item label="专业方向">
              <el-select v-model="queryParams.major" clearable value-key="id" style="width: 250px" placeholder="专业方向">
                <el-option
                    v-for="item in majorList"
                    :key="item.id"
                    :label="item.label"
                    :value="item.id"
                />
              </el-select>
            </el-form-item>
            <el-form-item label="职务">
              <el-select v-model="queryParams.post" clearable style="width: 250px" placeholder="请选择职务">
                <el-option
                    v-for="item in postList"
                    :key="item.id"
                    :label="item.name"
                    :value="item.name"
                />
              </el-select>
            <el-form-item label="专业领域">
              <el-cascader
                  clearable
                  style="width: 100%"
                  v-model="expertType"
                  :options="domainList"
                  :props="{ expandTrigger: 'hover',value: 'classifyName',label: 'classifyName' }"
                  @change="professionChange"
                  >
              </el-cascader>
            </el-form-item>
            <el-form-item>
              <el-button type="primary" icon="Search" @click="search">搜索</el-button>
              <el-button icon="Refresh" @click="research">重置</el-button>
            </el-form-item>
          </el-form>
          <el-table v-loading="loading" ref="tableRef" :data="dataList" :border="true" @select="select" @selection-change="handleSelectionChange">
            <el-table-column type="selection" width="55" />
            <el-table-column label="用户ID" prop="id" align="center"  />
            <el-table-column label="姓名" prop="name" align="center" width="110" />
            <el-table-column label="手机号" prop="phone" align="center" width="125" />
            <el-table-column label="用户名" prop="username" align="center" width="110" />
            <el-table-column label="性别" prop="sex" align="center" >
          <el-table v-loading="loading" ref="tableRef" :data="expertList" :border="true" row-key="id" @select="select" @selection-change="handleSelectionChange">
            <el-table-column type="selection" :reserve-selection="true" width="55" />
            <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="sex"  >
              <template #default="scope">
                <span v-if="scope.row.sex === 0">男</span>
                <span v-if="scope.row.sex === 1">女</span>
                <span>{{scope.row.sex === 0 ? '男' : '女'}}</span>
              </template>
            </el-table-column>
            <el-table-column label="所属机构" prop="agency.name" align="center" width="110"  />
            <el-table-column label="社保" prop="socialSecurity" align="center" width="120">
            <el-table-column label="学历" align="center" prop="degree" />
            <el-table-column label="所学专业" align="center" prop="speciality" />
            <el-table-column label="职称" align="center" prop="title"/>
            <el-table-column label="在岗情况" align="center" prop="dutyStatus" >
              <template #default="scope">
                <div class="demo-image__preview" v-if="scope.row.socialAttach && scope.row.socialAttach.length>0">
                  <el-image
                      style="width: 100px; height: 100px"
                      :src= "scope.row.socialAttach[0]"
                      :zoom-rate="1.2"
                      :max-scale="7"
                      :min-scale="0.2"
                      :preview-src-list="scope.row.socialAttach"
                      :initial-index="0"
                      fit="cover"
                      :preview-teleported= true
                  />
                </div>
                <span>{{scope.row.dutyStatus === 0 ? '在岗' : '退休'}}</span>
              </template>
            </el-table-column>
            <el-table-column label="医保" prop="medicalInsurance" align="center" width="120">
              <template #default="scope">
                <div class="demo-image__preview" v-if="scope.row.medicalAttach && scope.row.medicalAttach.length>0">
                  <el-image
                      style="width: 100px; height: 100px"
                      :src="scope.row.medicalAttach[0]"
                      :zoom-rate="1.2"
                      :max-scale="7"
                      :min-scale="0.2"
                      :preview-src-list="scope.row.medicalAttach"
                      :initial-index="0"
                      fit="cover"
                      :preview-teleported= true
                  />
                </div>
              </template>
            </el-table-column>
            <el-table-column label="工资清单" prop="salaryList" align="center" width="120">
              <template #default="scope">
                <div class="demo-image__preview" v-if="scope.row.salaryAttach && scope.row.salaryAttach.length>0">
                  <el-image
                      style="width: 100px; height: 100px"
                      :src= "scope.row.salaryAttach[0]"
                      :zoom-rate="1.2"
                      :max-scale="7"
                      :min-scale="0.2"
                      :preview-src-list="scope.row.salaryAttach"
                      :initial-index="0"
                      fit="cover"
                      :preview-teleported= true
                  />
                </div>
              </template>
            </el-table-column>
            <el-table-column label="职务" prop="post" align="center" width="120" />
            <el-table-column label="职称" prop="jobTitle" align="center"  />
            <el-table-column label="专业方向" prop="majorNames" align="center" width="100" />
            <el-table-column label="评价师等级" prop="level" align="center" width="100" />
            <el-table-column label="业绩汇总" prop="summary" align="center">
              <template #default="scope">
                <div style="cursor:pointer;color: #3b82f6;" @click="openList(scope.row)">
                  <span>{{scope.row.projectCount}}</span>
                </div>
              </template>
            </el-table-column>
            <el-table-column label="最近评价时间" prop="lastEstimateTime" align="center" width="120" />
            <el-table-column label="单位全称" align="center" prop="companyName" width="180"/>
            <el-table-column label="现从事专业及方向" align="center" prop="currentProfession"/>
            <el-table-column label="联系方式" align="center" prop="phone"/>
            <el-table-column label="支撑方向" align="center" prop="supportName" width="165"/>
            <el-table-column label="专家领域" align="center" prop="domain"/>
            <el-table-column label="入库分级" align="center" prop="level"/>
          </el-table>
          <pagination
              v-show="total > 0"
              :total="total"
@@ -158,12 +91,13 @@
    </div>
</template>
<script setup>
import {getCurrentInstance, onMounted, reactive, ref, toRefs,defineEmits} from "vue";
import {getCurrentInstance, onMounted, reactive, ref, toRefs, defineEmits, nextTick} from "vue";
import {getDictList} from "@/api/backManage/evaluate";
import {ElMessage, ElMessageBox} from "element-plus";
import projectDialog from "@/views/safetyReview/userManage/expertUsers/components/projectDialog.vue"
import Cookies from "js-cookie";
import {delMonitor, getExpertList, getMonitorList} from "@/api/sysUsers";
import {getExpertsList, getExpertTypes} from "@/api/form";
const { proxy } = getCurrentInstance();
const loading = ref(false);
const emit = defineEmits(['getName'])
@@ -171,123 +105,140 @@
  queryParams: {
    pageNum: 1,
    pageSize: 10,
    expertType: "",
    name: '',
    phone: '',
    level: '',
    major: null,
    post: ''
    ratingLevel: '',
    smallClassify: null,
    bigClassify: null,
  },
  total: 0,
  dataList: [],
  majorList: [],
  choosed: [],
  expertList: [],
  domainList: [],
  dialogVisible: false,
  title: '',
  selected: [],
  expertType: [],
  levelList: [
    {
      id: '1',
      id: 1,
      name: '一级'
    },
    {
      id: '2',
      id: 2,
      name: '二级'
    },
    {
      id: '3',
      id: 3,
      name: '三级'
    },
    {
      id: '4',
      name: '其他'
    },
  ],
  postList: [
    {
      id: '1',
      name: '法人'
    },
    {
      id: '2',
      name: '过程控制负责人'
    },
    {
      id: '3',
      name: '机构负责人'
    },
    {
      id: '4',
      name: '技术负责人'
    },
    {
      id: '5',
      name: '员工'
    },
  ],
  dialogVisible: false,
  title: '',
  selected: []
  ]
})
const tableRef = ref()
const { queryParams, total, dataList, majorList, levelList, postList, dialogVisible,title,selected } = toRefs(data);
const { queryParams, total, expertList, domainList, levelList , dialogVisible,title,selected, expertType } = toRefs(data);
const openDialog = (type) => {
  getMajor()
const openDialog = (type,choosedData,domainList) => {
  research()
  nextTick(() => {
    tableRef.value.clearSelection()
  })
  data.dialogVisible = true
  data.choosed = choosedData.map(item => {
    return{
      ...item,
      id: item.expertId ? item.expertId : item.id
    }
  })
  nextTick(() => {
    data.choosed.forEach(item => {
      tableRef.value.toggleRowSelection(item, true);
    })
  })
  data.domainList = domainList
  data.selected = []
  data.title = type
  data.dialogVisible = true
}
const onSubmit = async () => {
  if(data.selected.length>0)
  emit('getName',data.title,data.selected[data.selected.length - 1])
  data.dialogVisible = false
  if(data.selected.length>0){
    data.choosed = JSON.parse(JSON.stringify(data.selected))
    data.selected.length = 0
    data.queryParams.pageNum = 1
    data.queryParams.pageSize = 10
    emit('getName',data.title,data.choosed)
    tableRef.value.clearSelection()
    data.dialogVisible = false
  }else{
    ElMessage.warning('请选择专家')
  }
}
const getList = async () => {
  loading.value = true
  const res = await getExpertList(data.queryParams)
  loading.value = true;
  const res = await getExpertsList(data.queryParams)
  if(res.code == 200){
    data.dataList = res.data.list.map(item => {
    data.expertList = res.rows.map(item => {
      return{
        ...item,
        socialAttach: item.socialAttach.map(s => { return import.meta.env.VITE_APP_BASE_API + '/' + s.path}),
        medicalAttach: item.medicalAttach.map(s => { return import.meta.env.VITE_APP_BASE_API + '/' + s.path}),
        salaryAttach: item.salaryAttach.map(s => { return import.meta.env.VITE_APP_BASE_API + '/' + s.path}),
        lastEstimateTime: item.personProjectVO ? item.personProjectVO.lastEstimateTime.slice(0,10) : '',
        projectCount: item.personProjectVO ? item.personProjectVO.projectCount : ''
        birthdayName: item.birthday ? item.birthday.slice(0,10) : '',
        supportName: item.supportDirectionSafety.split(',')
      }
    })
    console.log('RES',data.dataList)
    data.total = res.data.total
    data.expertList.forEach(item => {
      item.supportName.forEach((s,index) => {
        switch (s){
          case '1':
            item.supportName[index] = '现场检查'
            break;
          case '2':
            item.supportName[index] = '调查评估'
            break;
          case '3':
            item.supportName[index] = '咨询服务'
            break;
          case '4':
            item.supportName[index] = '教育培训'
            break;
          case '5':
            item.supportName[index] = '其他'
            break;
        }
      })
    })
    data.total = res.total
  }else{
    ElMessage.warning(res.message)
    ElMessage.warning(res.msg)
  }
  loading.value = false
  loading.value = false;
}
const projectRef = ref();
const openList = (val) => {
  projectRef.value.openDialog(val);
}
const getMajor = async () => {
  const queryParams = {
    pageNum: 1,
    pageSize: 50,
    dictType: 'sys_major_orientation'
  }
  const res = await getDictList(queryParams);
  if(res.code === 200){
    data.majorList = res.data.list
  }else{
    ElMessage.warning(res.message)
  }
}
// const getDomain = async () => {
//   const res = await getExpertTypes()
//   if(res.code == 200){
//     data.domainList = res.data
//   }else{
//     ElMessage.warning(res.message)
//   }
// }
const select = ((selection, row) => {
  tableRef.value.clearSelection()
  if(selection.length == 0)  {
    return
  }
  tableRef.value.toggleRowSelection(row, true);
  // data.expertList.forEach(item => {
  //
  // })
  // nextTick(() => {
  //   tableRef.value.toggleRowSelection(item, true)
  // })
  // tableRef.value.clearSelection()
  // if(selection.length == 0)  {
  //   return
  // }
  // tableRef.value.toggleRowSelection(row, true);
})
const handleSelectionChange = (val) => {
@@ -300,19 +251,24 @@
}
const research = ()=>{
  data.expertType = []
  data.queryParams = {
    pageNum: 1,
    pageSize: 10,
    expertType: "",
    name: '',
    phone: '',
    level: '',
    major: null,
    post: ''
    ratingLevel: '',
    smallClassify: null,
    bigClassify: null,
  }
  getList()
}
const professionChange=(value)=> {
  console.log(value,'val')
  data.queryParams.domain = value[1]
}
defineExpose({
    openDialog
});