zhouwenxuan
2024-01-17 b215fb6dfd4ede3cb1b08985bb04ef5803a52454
bug修改
已修改9个文件
已添加2个文件
798 ■■■■ 文件已修改
src/api/projectManage/project.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/components/Sidebar/menu.js 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/baseSet/major/components/majorDialog.vue 143 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/baseSet/major/index.vue 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/projectManage/components/contractManage.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/projectManage/components/riskAnalysis.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/projectManage/index.vue 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/projectManage/process.vue 300 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/userManage/expertUsers/components/expertDialog.vue 165 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/userManage/expertUsers/index.vue 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/projectManage/project.js
@@ -24,5 +24,11 @@
    })
}
export function delProject(data) {
    return request({
        url: `/manage/project/remove/` + data.id,
        method: 'delete'
    })
}
src/layout/components/Sidebar/menu.js
@@ -78,12 +78,17 @@
                {
                    path: 'business',
                    name: 'business',
                    meta: { title: '业务范围',icon: 'form'}
                    meta: { title: '业务范围管理',icon: 'form'}
                },
                {
                    path: 'area',
                    name: 'area',
                    meta: { title: '地区维护',icon: 'form'}
                    meta: { title: '地区维护管理',icon: 'form'}
                },
                {
                    path: 'major',
                    name: 'major',
                    meta: { title: '专业方向管理',icon: 'form'}
                }
            ]
src/router/index.js
@@ -238,6 +238,12 @@
        name: 'area',
        meta: { title: '地区维护',icon: 'form'}
      },
      {
        path: 'major',
        component: () => import('@/views/safetyReview/baseSet/major/index.vue'),
        name: 'major',
        meta: { title: '专业方向',icon: 'form'}
      },
    ]
  },
src/views/safetyReview/baseSet/major/components/majorDialog.vue
对比新文件
@@ -0,0 +1,143 @@
<template>
    <div class="notice">
        <el-dialog
            v-model="dialogVisible"
            :title="title"
            width="500px"
            :before-close="handleClose"
        >
            <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="110px" >
                <el-form-item label="专业方向:" prop="label">
                    <el-input v-model.trim="state.form.label"></el-input>
                </el-form-item>
            </el-form>
            <template #footer>
                    <span class="dialog-footer">
                        <el-button @click="handleClose" size="default">取 消</el-button>
                        <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
                    </span>
            </template>
        </el-dialog>
    </div>
</template>
<script setup>
import {reactive, ref, toRefs} from 'vue'
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";
const dialogVisible = ref(false);
const title = ref("");
const busRef = ref();
const length = ref()
const emit = defineEmits(["getList"]);
const state = reactive({
    form: {
        id: '',
        label: '',
        value: '',
        dictType: "sys_major_orientation",
    },
    formRules:{
        label: [{ required: true, message: '请输入业务范围', trigger: 'blur' }],
    },
})
const openDialog = async (type, value) => {
    length.value = value.listLength
    title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
    if(type === 'edit') {
        state.form = value;
        const param = {
            dictId: value.id
        }
        const res = await getDictDetail(param);
        if(res.code === 200){
           state.form = res.data
        }else{
            ElMessage.warning(res.message)
        }
    }
    dialogVisible.value = true;
}
const onSubmit = async () => {
    const valid = await busRef.value.validate();
    if(valid){
        if(title.value === '新增'){
            const param = {
                dictType: "sys_major_orientation",
                label: state.form.label,
                value: length.value.toString()
            }
            const res = await addDict(param)
            if(res.code === 200){
                ElMessage({
                    type: 'success',
                    message: '新增成功'
                });
            }else{
                ElMessage.warning(res.message)
            }
            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
            }
            const res = await editDict(param)
            if(res.code === 200){
                ElMessage({
                    type: 'success',
                    message: '新增成功'
                });
            }else{
                ElMessage.warning(res.message)
            }
            emit("getList")
            busRef.value.clearValidate();
            reset();
            dialogVisible.value = false;
        }
    }
}
const handleClose = () => {
    busRef.value.clearValidate();
    reset();
    dialogVisible.value = false;
}
const reset = () => {
    state.form = {
        id: '',
        label: '',
        value: '',
        dictType: "sys_major_orientation",
    }
}
defineExpose({
    openDialog
});
</script>
<style scoped lang="scss">
.notice{
    :deep(.el-form .el-form-item__label) {
        font-size: 15px;
    }
    .file {
        display: flex;
        flex-direction: column;
        align-items: flex-start;
    }
}
</style>
src/views/safetyReview/baseSet/major/index.vue
对比新文件
@@ -0,0 +1,123 @@
<template>
    <div class="app-container">
        <div style="margin-bottom: 10px">
            <el-button
                type="primary"
                plain
                icon="Plus"
                @click="openDialog('add',{})"
            >新增</el-button>
        </div>
        <!-- 表格数据 -->
        <el-table v-loading="loading" :data="dataList" :border="true">
            <el-table-column label="专业方向" prop="label" 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>
                    <el-button link type="danger"  @click="handleDelete(scope.row)" >删除</el-button>
                </template>
            </el-table-column>
        </el-table>
        <div class="pag-container">
            <el-pagination
                v-model:current-page="data.queryParams.pageNum"
                v-model:page-size="data.queryParams.pageSize"
                :page-sizes="[10,15,20,25]"
                layout="total, sizes, prev, pager, next, jumper"
                :total="total"
                @size-change="handleSizeChange"
                @current-change="handleCurrentChange"
            />
        </div>
        <major-dialog ref="busRef" @getList=getList></major-dialog>
    </div>
</template>
<script setup>
import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
import majorDialog from './components/majorDialog.vue'
import {ElMessage, ElMessageBox} from "element-plus";
import {delDict, getDictList} from "@/api/backManage/evaluate";
import {delNotice} from "@/api/backManage/notice";
const { proxy } = getCurrentInstance();
const loading = ref(false);
const busRef = ref();
const dictType = ref("sys_major_orientation")
const data = reactive({
    queryParams: {
        pageNum: 1,
        pageSize: 10,
        dictType: dictType.value
    },
    total: 0,
    dataList: [
    ]
});
const { queryParams, total, dataList } = toRefs(data);
onMounted(() => {
    getList();
});
const getList = async () => {
    loading.value = true;
    const res = await getDictList(data.queryParams);
    if(res.code === 200){
        dataList.value = res.data.list
        total.value = res.data.total
    }else{
        ElMessage.warning(res.message)
    }
    loading.value = false;
}
const handleSizeChange = (val) => {
    data.queryParams.pageNum = 1;
    data.queryParams.pageSize = val
    getList()
}
const handleCurrentChange = (val) => {
    data.queryParams.pageNum = val
    getList()
}
const openDialog = (type, value) => {
    value.listLength = dataList.value.length> 0 ?dataList.value.length:0;
    busRef.value.openDialog(type, value);
}
/** 重置新增的表单以及其他数据  */
function reset() {
    proxy.resetForm("roleRef");
}
const handleDelete = (val) => {
    ElMessageBox.confirm(
        '确定删除此条数据?',
        '提示',
        {
            confirmButtonText: '确定',
            cancelButtonText: '取消',
            type: 'warning',
        })
        .then( async() => {
            const res = await delDict(val);
            if(res.code === 200){
                ElMessage({
                    type: 'success',
                    message: '删除成功'
                });
                getList();
            }else{
                ElMessage.warning(res.message)
            }
        })
}
</script>
<style>
.pag-container{
float: right;
margin-top: 10px;
}
</style>
src/views/safetyReview/projectManage/components/contractManage.vue
@@ -74,6 +74,7 @@
});
const riskOpen = async (type,val) => {
  state.formData.projectId = val;
  if(type === 'detail' || type === 'edit' ){
    const res = await getDetail({projectId: val});
    if(res.code == 200){
@@ -95,7 +96,7 @@
        if (res.code == 200) {
          ElMessage.success('保存成功')
          formRef.value.clearValidate();
          emit('getNextStatus', res.data);
          emit('getNextStatus', state.formData.projectId);
        } else {
          ElMessage.warning(res.message)
        }
src/views/safetyReview/projectManage/components/riskAnalysis.vue
@@ -405,6 +405,8 @@
        }
      }else if(type === 'clickEdit'){
        const { ...data} = JSON.parse(JSON.stringify(state.formData))
        data.id = val;
        data.project.id = val;
        delete data.project.area;
        data.isInBusiness = state.tableData[0].status === 1;
        data.isSatisfyNeed = state.tableData[1].status === 1;
src/views/safetyReview/projectManage/index.vue
@@ -86,7 +86,7 @@
        <template #default="scope">
          <el-button link type="primary" @click="toProcess('view',scope.row)">查看</el-button>
          <el-button link type="primary" @click="toProcess('edit',scope.row)">编辑</el-button>
          <el-button link type="danger">删除</el-button>
          <el-button link type="danger" @click="del(scope.row)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
@@ -108,8 +108,9 @@
<script setup>
import {onMounted, reactive, ref} from "vue";
import {getProjectList, getProjectStatistics} from "@/api/projectManage/project";
import {ElMessage} from "element-plus";
import {delProject, getProjectList, getProjectStatistics} from "@/api/projectManage/project";
import {ElMessage, ElMessageBox} from "element-plus";
import {delMonitor} from "@/api/sysUsers";
const router = useRouter();
const loading = ref(false);
@@ -185,6 +186,25 @@
  value.type = type;
  router.push({ path: '/process', query: {id: value.id, type: type}});
}
const del = (val) => {
  ElMessageBox.confirm(
      '确定删除此条数据?',
      '提示',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      })
      .then( async() => {
        const res = await delProject(val)
        if(res.code == 200){
          ElMessage.success('数据删除成功')
          getList()
        }else{
          ElMessage.warning(res.message)
        }
      })
}
</script>
<style scoped lang="scss">
src/views/safetyReview/projectManage/process.vue
@@ -15,8 +15,8 @@
                <span class="text-eclipse" style="margin-left: 5px">{{item.name}}</span>
              </div>
            </div>
            <div v-for="child in item.subMenus" :key="child.id">
              <div class="down-item" :class="{itemActive: child.status === 1 || child.status === 3, itemPrev: child.status === 2}" @click="chooseSubMenu(child,true)">
            <div v-for="child in item.subMenus" :key="child.id" @click="chooseSubMenu(child,true)">
              <div class="down-item" :class="{itemActive: child.status === 1 || child.status === 3, itemPrev: child.status === 2}">
                <div class="item-icon-status0" v-if="child.status === 0">{{child.id}}</div>
                <div class="item-icon-status0 item-icon-status1" v-else-if="child.status === 1 || (selectedObj.status === 3 && child.id === selectedObj.id)">{{child.id}}</div>
                <div  class="item-icon-status0 item-icon-status2" v-else-if="child.status === 2 "><img :src="itemStatus2Png"></div>
@@ -38,16 +38,16 @@
        <div class="card-header">{{selectedObj.id}}- {{selectedObj.name}}</div>
        <div class="card-content">
          <div :style="'height:' + middleContentHeight + 'px'" style="overflow-y: scroll;">
            <rickAnalysis ref="riskRef" v-if="selectedObj.id === 2" @getNextStatus="getNextStatus"></rickAnalysis>
            <contract-manage ref="contractMngRef" v-if="selectedObj.id === 1" @getNextStatus="getNextStatus"></contract-manage>
            <rickAnalysis ref="riskRef" v-if="selectedObj.id === 1" @getNextStatus="getNextStatus"></rickAnalysis>
            <contract-manage ref="contractMngRef" v-if="selectedObj.id === 2" @getNextStatus="getNextStatus"></contract-manage>
            <evaluate-task-notice ref="evaluteRef" v-if="selectedObj.id === 3" @getNextStatus="getNextStatus"></evaluate-task-notice>
            <evaluate-plan ref="evalPlanRef" v-if="selectedObj.id === 4" @getNextStatus="getNextStatus"></evaluate-plan>
          </div>
          <div style="display: flex;align-items: center;justify-content: center;margin-bottom: -20px">
            <el-button type="primary" v-if="selectedObj.id !== 1" style="width: 80px" @click="back">上一步</el-button>
            <el-button type="warning" style="width: 80px"  v-if="projectStatus === 'edit' && selectedObj.status !== 1" @click="clickEdit">变更</el-button>
<!--            <el-button type="warning" style="width: 80px"  v-if="selectedObj.status === 1" @click="save">暂存</el-button>-->
            <el-button type="primary" style="width: 80px" @click="next">下一步</el-button>
            <el-button type="warning" style="width: 80px"  v-if="(projectStatus === 'add'   && selectedObj.status === 1)||(projectStatus === 'edit' && selectedObj.status === 1) " @click="save">保存</el-button>
            <el-button type="warning" style="width: 80px"  v-if="(projectStatus === 'edit' && selectedObj.status !== 1) || (projectStatus === 'add'   && selectedObj.status !== 1) " @click="clickEdit">变更</el-button>
            <el-button type="primary" style="width: 80px" v-if="selectedObj.id !== 14" @click="next">下一步</el-button>
          </div>
        </div>
      </el-card>
@@ -232,9 +232,11 @@
        if(item.id <= res.data){
          item.status = 2
        }
        if(projectStatus.value !== 'view'){
        if(item.id  === res.data + 1){
          item.status = 4;
          nextObj.value = item;
          }
        }
        if(item.id === res.data){
          item.status = 3;
@@ -242,7 +244,6 @@
          setTimeout(() => {
            goRouter(selectedObj.value.id)
          }, 10)
        }
      })
      menuList.value[0].status = 1;
@@ -257,13 +258,16 @@
        if(item.id <= res.data) {
          item.status = 2
        }
        if(projectStatus.value !== 'view'){
        if(item.id  === res.data + 1){
          item.status = 4;
          nextObj.value = item;
        }
        }
        if(item.id === res.data){
          item.status = 3;
          selectedObj.value =item;
          setTimeout(() => {
            goRouter(selectedObj.value.id)
          }, 10)
@@ -283,9 +287,11 @@
        if(item.id <= res.data) {
          item.status = 2
        }
        if(projectStatus.value !== 'view'){
        if(item.id  === res.data + 1){
          item.status = 4;
          nextObj.value = item;
          }
        }
        if(item.id === res.data){
          item.status = 3;
@@ -310,9 +316,11 @@
        if(item.id <= res.data) {
          item.status = 2
        }
        if(projectStatus.value !== 'view'){
        if(item.id  === res.data + 1){
          item.status = 4;
          nextObj.value = item;
          }
        }
        if(item.id === res.data){
          item.status = 3;
@@ -339,9 +347,11 @@
        if(item.id <= res.data) {
          item.status = 2
        }
        if(projectStatus.value !== 'view'){
        if(item.id  === res.data + 1){
          item.status = 4;
          nextObj.value = item;
          }
        }
        if(item.id === res.data){
          item.status = 3;
@@ -429,6 +439,11 @@
      selectedObj.value.status = 1;
      nextObj.value.status = 2;
      nextObj.value = val;
      // if(flag){
      //   setTimeout(() => {
      //     goRouter(selectedObj.value.id)
      //   }, 10)
      // }
      //跳转
    }, 10)
  }
@@ -447,19 +462,24 @@
      nextMenu(4)
    }
  } else {
    //下一步——保存
    goRouter(selectedObj.value.id,'add')
  }
  setTimeout( () => {
    goRouter(selectedObj.value.id)
  }, 100)
      isShowMenu.value = false;
      ElMessage({
        type: 'warning',
        message: '请按顺序操作,未完成步骤无法查看!'
      });
    }, 10)
  }
  //
  // setTimeout( () => {
  //   goRouter(selectedObj.value.id)
  // }, 100)
}
const  nextMenu =  (id) => {
  menuList.value[id].subMenus.forEach( item => {
    if(item.id === selectedObj.value.id + 1){
      chooseSubMenu(item,false);
      chooseSubMenu(item,true);
    }
  })
}
@@ -467,7 +487,7 @@
const backMenu = (id) => {
  menuList.value[id].subMenus.forEach(async item => {
    if(item.id === selectedObj.value.id - 1){
     await chooseSubMenu(item,false);
     await chooseSubMenu(item,true);
    }
  })
}
@@ -485,110 +505,146 @@
    }else if (selectedObj.value.id-1 >11){
      backMenu(4)
    }
  setTimeout( () => {
    goRouter(selectedObj.value.id)
    // switch (selectedObj.value.id){
    //   case 1:
    //     if(projectStatus.value === 'view'){
    //       riskRef.value.riskOpen('detail',projectId.value);
    //     }else {
    //       riskRef.value.riskOpen('edit',projectId.value);
    //     }
    //     break;
    //   case 2:
    //
    //     break;
    //   case 3:
    //
    //     break;
    //   case 4:
    //
    //     break;
    //   case 5:
    //
    //     break;
    //   case 6:
    //
    //     break;
    //   case 7:
    //
    //     break;
    //   case 8:
    //
    //     break;
    //   case 9:
    //
    //     break;
    //   case 10:
    //
    //     break;
    //   case 11:
    //
    //     break;
    //   case 12:
    //
    //     break;
    //   case 13:
    //
    //     break;
    //   case 14:
    //
    //     break;
    // }
  }, 100)
  // setTimeout( () => {
  //   goRouter(selectedObj.value.id)
  // }, 100)
}
const clickEdit = () => {
  goRouter(selectedObj.value.id,'clickEdit')
  // switch (selectedObj.value.id){
  //   case 1:
  //     riskRef.value.riskOpen('clickEdit',projectId.value);
  //     break;
  //   case 2:
  //
  //     break;
  //   case 3:
  //
  //     break;
  //   case 4:
  //
  //     break;
  //   case 5:
  //
  //     break;
  //   case 6:
  //
  //     break;
  //   case 7:
  //
  //     break;
  //   case 8:
  //
  //     break;
  //   case 9:
  //
  //     break;
  //   case 10:
  //
  //     break;
  //   case 11:
  //
  //     break;
  //   case 12:
  //
  //     break;
  //   case 13:
  //
  //     break;
  //   case 14:
  //
  //     break;
  // }
}
const getNextStatus = (val) => {
  getStatus(val);
const getNextStatus = async (val) => {
  projectId.value = val;
  console.log("val",val)
  const res = await getProjectStatus(val);
  if(res.code == 200){
    if(res.data <=4){
      menuList.value[0].subMenus.forEach(item => {
        if(item.id <= res.data){
          item.status = 2
        }
        if(item.id === res.data + 1){
          item.status = 1;
          selectedObj.value =item;
          nextObj.value = item;
        }
        // else if(item.id  === res.data ){
        //   item.status = 3;
        //   selectedObj.value =item;
        // }else if(item.id === res.data + 1){
        //   item.status = 4;
        //   nextObj.value = item;
        // }
      })
      menuList.value[0].status = 1;
      console.log("menu11",menuList.value)
    }
    if(res.data >=4 && res.data<=6){
      setMenuList(0)
      menuList.value[1].subMenus.forEach(item => {
        if(item.id <= res.data) {
          item.status = 2
        }
        if(item.id  === res.data + 1){
          item.status = 1;
          selectedObj.value =item;
          nextObj.value = item;
        }
        // if(item.id === res.data){
        //   item.status = 3;
        //   selectedObj.value =item;
        // }
      })
      menuList.value[0].status = 2;
      menuList.value[1].status = 1;
      console.log("menu22",menuList.value)
    }
    if(res.data >= 6 && res.data <= 9){
      setMenuList(0);
      setMenuList(1);
      menuList.value[2].subMenus.forEach(item => {
        if(item.id <= res.data) {
          item.status = 2
        }
        if(item.id  === res.data + 1){
          item.status = 1;
          selectedObj.value =item;
          nextObj.value = item;
        }
        // if(item.id === res.data){
        //   item.status = 3;
        //   selectedObj.value =item;
        // }
      })
      menuList.value[0].status = 2;
      menuList.value[1].status = 2;
      menuList.value[2].status = 1;
    }
    if(res.data >= 9 && res.data <=11){
      setMenuList(0);
      setMenuList(1);
      setMenuList(2);
      menuList.value[3].subMenus.forEach(item => {
        if(item.id <= res.data) {
          item.status = 2
        }
        if(item.id  === res.data + 1){
          item.status = 1;
          selectedObj.value =item;
          nextObj.value = item;
        }
        // if(item.id === res.data){
        //   item.status = 3;
        //   selectedObj.value =item;
        // }
      })
      menuList.value[0].status = 2;
      menuList.value[1].status = 2;
      menuList.value[2].status = 2;
      menuList.value[3].status = 1;
    }
    if(res.data >= 11){
      setMenuList(0);
      setMenuList(1);
      setMenuList(2);
      setMenuList(3);
      // if(res.data === 11){
      //   menuList.value[3].subMenus[1].status = 3;
      // }
      menuList.value[4].subMenus.forEach(item => {
        if(item.id <= res.data) {
          item.status = 2
        }
        if(item.id  === res.data + 1){
          item.status = 1;
          selectedObj.value =item;
          nextObj.value = item;
        }
        // if(item.id === res.data){
        //   item.status = 3;
        //   selectedObj.value =item;
        // }
        menuList.value[0].status = 2;
        menuList.value[1].status = 2;
        menuList.value[2].status = 2;
        menuList.value[3].status = 2;
        menuList.value[4].status = 1;
        if(res.data === 14 && res.data === item.id){
          item.status = 3;
          menuList.value[4].status = 2;
          selectedObj.value =item;
        }
      })
    }
  }
}
const save = () => {
  goRouter(selectedObj.value.id,'add')
}
const goRouter = (val,type) => {
  switch (val){
    case 1:
@@ -597,9 +653,9 @@
      }else if (type === 'clickEdit'){
        riskRef.value.riskOpen('clickEdit',projectId.value);
      }else {
        if(projectStatus.value === 'view'){
        if(projectStatus.value === 'view' || projectStatus.value === 'add'){
          riskRef.value.riskOpen('detail',projectId.value);
        }else {
        }else if(projectStatus.value === 'edit'){
          riskRef.value.riskOpen('edit',projectId.value);
        }
      }
@@ -607,13 +663,13 @@
      break;
    case 2:
      if(type === 'add'){
        contractMngRef.value.riskOpen('add','');
        contractMngRef.value.riskOpen('add',projectId.value);
      }else if (type === 'clickEdit'){
        contractMngRef.value.riskOpen('clickEdit',projectId.value);
      }else {
        if(projectStatus.value === 'view'){
        if(projectStatus.value === 'view' || projectStatus.value === 'add'){
          contractMngRef.value.riskOpen('detail',projectId.value);
        }else {
        }else if(projectStatus.value === 'edit'){
          contractMngRef.value.riskOpen('edit',projectId.value);
        }
      }
@@ -621,13 +677,13 @@
      break;
    case 3:
      if(type === 'add'){
        evaluteRef.value.riskOpen('add','');
        evaluteRef.value.riskOpen('add',projectId.value);
      }else if (type === 'clickEdit'){
        evaluteRef.value.riskOpen('clickEdit',projectId.value);
      }else {
        if(projectStatus.value === 'view'){
        if(projectStatus.value === 'view' || projectStatus.value === 'add'){
          evaluteRef.value.riskOpen('detail',projectId.value);
        }else {
        }else if(projectStatus.value === 'edit'){
          evaluteRef.value.riskOpen('edit',projectId.value);
        }
      }
@@ -776,6 +832,8 @@
        border-radius: 50%;
        background: #b9c2d5;
        margin-right: 10px;
        min-width: 21px;
        min-height: 21px;
      }
      .item-icon-status1{
        color: #3b75ff;
src/views/safetyReview/userManage/expertUsers/components/expertDialog.vue
@@ -3,20 +3,20 @@
        <el-dialog
            v-model="dialogVisible"
            :title="state.title"
            width="830px"
            width="900px"
            :before-close="handleClose"
        >
            <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="110px" >
            <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="150px" >
                <el-row :gutter="22">
                    <el-col :span="11">
                        <el-form-item label="姓名:" prop="name" v-if="state.title !== '修改密码'">
                            <el-input v-model.trim="state.form.name" ></el-input>
                            <el-input v-model.trim="state.form.name"   placeholder="请输入姓名"></el-input>
                        </el-form-item>
                    </el-col>
                    <el-col :span="11">
                        <el-form-item label="手机号:" prop="phone" v-if="state.title !== '修改密码'">
                            <el-input v-model.trim="state.form.phone" :maxlength="11" ></el-input>
                            <el-input v-model.trim="state.form.phone" :maxlength="11" placeholder="手机号"></el-input>
                        </el-form-item>
                    </el-col>
@@ -24,7 +24,7 @@
                <el-row :gutter="22">
                    <el-col :span="11">
                        <el-form-item label="用户名:"  prop="username" v-if="state.title !== '修改密码'">
                            <el-input v-model.trim="state.form.username" :disabled="state.title === '编辑'"></el-input>
                            <el-input v-model.trim="state.form.username" :disabled="state.title === '编辑'" placeholder="请输入用户名"></el-input>
                        </el-form-item>
                    </el-col>
                    <el-col :span="11">
@@ -39,7 +39,7 @@
                <el-row :gutter="22">
                    <el-col :span="11">
                        <el-form-item label="所属机构:"  prop="agencyId" v-if="state.title !== '修改密码'">
                            <el-select v-model="state.form.agencyId" v-loadMore="loadMore" class="m-2" placeholder="请选择机构" popper-class="more_select_dropdown"  @change="selectChange" >
                            <el-select v-model="state.form.agencyId"  style="width: 100%" v-loadMore="loadMore" class="m-2" placeholder="请选择机构" popper-class="more_select_dropdown"   >
                                <el-option
                                    v-for="item in state.agencyList"
                                    :key="item.id"
@@ -51,20 +51,40 @@
                    </el-col>
                    <el-col :span="11">
                        <el-form-item label="职务:" prop="post" v-if="state.title !== '修改密码'">
                            <el-input v-model.trim="state.form.post" :maxlength="11" ></el-input>
<!--                            <el-input v-model.trim="state.form.post" :maxlength="11" ></el-input>-->
                          <el-select v-model="state.form.post" class="m-2" style="width: 100%" placeholder="请选择职务" popper-class="more_select_dropdown"  >
                            <el-option
                                v-for="item in state.postList"
                                :key="item.id"
                                :label="item.name"
                                :value="item.name"
                            />
                          </el-select>
                        </el-form-item>
                    </el-col>
                </el-row>
                <el-row :gutter="22">
                    <el-col :span="11">
                        <el-form-item label="职称:"  prop="jobTitle" v-if="state.title !== '修改密码'">
                            <el-input v-model.trim="state.form.jobTitle" :maxlength="11" ></el-input>
                            <el-input v-model.trim="state.form.jobTitle" :maxlength="11" placeholder="请输入职称"></el-input>
                        </el-form-item>
                    </el-col>
                    <el-col :span="11">
                        <el-form-item label="专业方向:" prop="major" v-if="state.title !== '修改密码'">
                            <el-input v-model.trim="state.form.major" :maxlength="11" ></el-input>
                        <el-form-item label="专业方向:" prop="majorShow"  v-if="state.title !== '修改密码'" >
                          <el-select v-model="state.form.majorShow" value-key="id" class="m-2" style="width: 100%" multiple placeholder="请选择专业方向" popper-class="more_select_dropdown" @change="selectChange">
                            <el-option
                                v-for="item in state.majorList"
                                :key="item.id"
                                :label="item.label"
                                :value="item"
                            />
                          </el-select>
                        </el-form-item>
                      <div v-for="(item,index) in state.form.majorShow" :key="item.id" style="margin-bottom: 20px" >
                        <el-form-item :label="item.label+'证书编号:'" >
                          <el-input v-model="item.certificateNo" :placeholder="'请输入'+item.label+'证书编号'"></el-input>
                        </el-form-item>
                      </div>
                    </el-col>
                </el-row>
                <el-row :gutter="22">
@@ -79,12 +99,29 @@
                        </el-form-item>
                    </el-col>
                </el-row>
              <el-row :gutter="22">
                <el-col :span="11">
                <el-form-item label="专家类型:" prop="expertType" v-if="state.title !== '修改密码'">
                    <el-radio-group v-model="state.form.expertType" class="ml-4">
                        <el-radio :label="1" >安全评价</el-radio>
                        <el-radio :label="2" >检验检测</el-radio>
                    </el-radio-group>
                </el-form-item>
                </el-col>
                <el-col :span="11">
                  <el-form-item label="评价师等级:" prop="level" v-if="state.title !== '修改密码'">
                    <el-select v-model="state.form.level" class="m-2" style="width: 100%" placeholder="请选择评价师等级" popper-class="more_select_dropdown"  >
                      <el-option
                          v-for="item in state.levelList"
                          :key="item.id"
                          :label="item.name"
                          :value="item.name"
                      />
                    </el-select>
                  </el-form-item>
                </el-col>
              </el-row>
                <el-form-item prop="socialAttach" label="社保:" v-if="state.title !== '修改密码'">
                    <el-upload
@@ -170,6 +207,7 @@
import {resetUserPwd} from "../../../../../api/sysUsers";
import {getToken} from "@/utils/auth";
import {getInsitutionList} from "@/api/backManage/insitution";
import {getDictList} from "@/api/backManage/evaluate";
const emit = defineEmits(["getList"]);
const dialogVisible = ref(false)
@@ -267,6 +305,8 @@
        salaryAttach: [],
        post: '',
        jobTitle: '',
        level: '',
        majorShow: [],
        major: '',
        expertType: 1,
        password: '',
@@ -281,10 +321,11 @@
        password: [{ required: true, validator: validatePwd, trigger: 'blur' }],
        confirmPassword: [{ required: true, validator: equalToPassword, trigger: 'blur' }],
        phone: [{ required: true, validator: validateUserPhone, trigger: 'blur' }],
        post: [{ required: true, message: '请输入职务', trigger: 'blur' }],
        post: [{ required: true, message: '请选择职务', trigger: 'change' }],
        jobTitle:[{ required: true, message: '请输入职称', trigger: 'blur' }],
        major:[{ required: true, message: '请输入专业方向', trigger: 'blur' }],
        // agencyId: [{ required: true, message: '请选择所属机构', trigger: 'blur' }],
        level: [{ required: true, message: '请选择评价师等级', trigger: 'change' }],
        majorShow:[{ required: true, message: '请选择专业方向', trigger: 'change' }],
        agencyId: [{ required: true, message: '请选择所属机构', trigger: 'change' }],
        socialAttach: [{required: true, trigger: "blur", message: "请上传社保图片"}],
        medicalAttach: [{required: true, trigger: "blur", message: "请上传医保图片"}],
        salaryAttach: [{required: true, trigger: "blur", message: "请上传工资清单"}],
@@ -299,10 +340,52 @@
    dialogImg: false,
    pageNum: 1,
    pageSize: 10,
    postList: [
      {
        id: '1',
        name: '法人'
      },
      {
        id: '2',
        name: '过程控制负责人'
      },
      {
        id: '3',
        name: '机构负责人'
      },
      {
        id: '4',
        name: '技术负责人'
      },
      {
        id: '5',
        name: '员工'
      },
    ],
  majorList: [],
  levelList: [
    {
      id: '1',
      name: '一级'
    },
    {
      id: '2',
      name: '二级'
    },
    {
      id: '3',
      name: '三级'
    },
    {
      id: '4',
      name: '其他'
    },
  ]
})
onMounted(()=>{
    getAgency()
    getMajor()
})
const openDialog = async (type, value) => {
@@ -333,6 +416,19 @@
                    name: url.name
                }
            });
            const arr = []
            const certificateList = JSON.parse(res.data.certificateNo)
            for( let key in certificateList) {
              arr.push( {
                id: parseInt(key),
                certificateNo: certificateList[key],
              })
              arr.forEach((item,index) => {
                item.label = res.data.majorNames[index]
              })
            }
            state.form.majorShow = arr;
          console.log(state.form.majorShow,'certificateList')
        }else{
            ElMessage.warning(res.message)
        }
@@ -364,9 +460,22 @@
const onSubmit = async () => {
    const valid = await superRef.value.validate();
    if(valid){
        state.form.majorShow.forEach(item => {
          if(item.certificateNo == ''){
            ElMessage.warning('请输入对应的证书编号')
            return ;
          }
        })
        if(state.title == '新增'){
            const {confirmPassword,id,socialList,salaryList,medicalList,...data} = state.form
            data.password = Base64.encode(data.password)
            let obj = {};
            data.majorShow.forEach(item => {
              obj[item.id] = item.certificateNo;
            })
            data.major = JSON.stringify(obj);
            delete data.majorShow;
            console.log('data',data)
            const res = await  addExpert(data);
            if(res.code == 200){
@@ -384,6 +493,14 @@
        }else if(state.title == '编辑'){
            const {confirmPassword,socialList,salaryList,medicalList,...data} = state.form
            data.password = Base64.encode(data.password)
            let obj = {};
            data.majorShow.forEach(item => {
              obj[item.id] = item.certificateNo;
            })
            data.major = JSON.stringify(obj);
            delete data.majorShow;
            delete data.certificateNo;
            delete data.majorNames;
            console.log('editdata',data)
            const res = await editExpert(data)
            if(res.code == 200){
@@ -433,6 +550,8 @@
       salaryAttach: [],
       post: '',
       jobTitle: '',
       level:'',
       majorShow: [],
       major: '',
       expertType: 1,
       password: '',
@@ -441,6 +560,7 @@
    state.salaryList = [];
    state.medicalList = [];
    state.socialList = [];
    state.form.selectMajorList = [];
}
const picSize = async (rawFile) => {
    if(rawFile.size / 1024 / 1024 > 5){
@@ -545,6 +665,19 @@
        ElMessage.warning(res.message)
    }
}
const getMajor = async () => {
  const queryParams = {
        pageNum: 1,
        pageSize: 50,
        dictType: 'sys_major_orientation'
  }
  const res = await getDictList(queryParams);
  if(res.code === 200){
    state.majorList = res.data.list
  }else{
    ElMessage.warning(res.message)
  }
}
@@ -558,9 +691,11 @@
        getAgency()
    }, 500)
}
//选中值发生变化时触发
const selectChange = () => {
    console.log('选中的xxxx')
const selectChange = (val) => {
    // state.form.selectMajorList= val;
    console.log('选中的xxxx',val)
}
defineExpose({
src/views/safetyReview/userManage/expertUsers/index.vue
@@ -19,16 +19,16 @@
        <!-- 表格数据 -->
        <el-table v-loading="loading" :data="dataList" :border="true">
            <el-table-column label="用户ID" prop="id" align="center"  />
            <el-table-column label="姓名" prop="name" align="center"  />
            <el-table-column label="手机号" prop="phone" align="center" />
            <el-table-column label="用户名" prop="username" align="center"  />
            <el-table-column label="姓名" prop="name" align="center" width="110" />
            <el-table-column label="手机号" prop="phone" align="center" width="125" />
            <el-table-column label="用户名" prop="username" align="center" width="110" />
            <el-table-column label="性别" prop="sex" align="center" >
                <template #default="scope">
                    <span v-if="scope.row.sex === 0">男</span>
                    <span v-if="scope.row.sex === 1">女</span>
                </template>
            </el-table-column>
            <el-table-column label="所属机构" prop="agency.name" align="center"  />
            <el-table-column label="所属机构" prop="agency.name" align="center" width="110"  />
            <el-table-column label="社保" prop="socialSecurity" align="center" width="120">
                <template #default="scope">
                    <div class="demo-image__preview" v-if="scope.row.socialAttach && scope.row.socialAttach.length>0">
@@ -80,12 +80,13 @@
                    </div>
                </template>
            </el-table-column>
            <el-table-column label="职务" prop="post" align="center"  />
            <el-table-column label="职务" prop="post" align="center" width="120" />
            <el-table-column label="职称" prop="jobTitle" align="center"  />
            <el-table-column label="专业方向" prop="major" align="center"  />
            <el-table-column label="专业方向" prop="majorNames" align="center" width="100" />
            <el-table-column label="评价师等级" prop="level" align="center" width="100" />
            <el-table-column label="业绩汇总" prop="summary" align="center"  />
            <el-table-column label="最近评价时间" prop="lastTime" align="center" width="120" />
            <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="120" >
            <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="140" >
                <template #default="scope">
                    <el-button link type="primary"  @click="openDialog('edit',scope.row)">编辑</el-button>
                    <el-button link type="danger"  @click="handleDelete(scope.row)" >删除</el-button>