马宇豪
2024-01-18 18e2812133add57c3b707f39555321e2a598eea2
新增
已修改8个文件
已添加3个文件
1530 ■■■■ 文件已修改
src/views/safetyReview/baseSet/expertsType/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/projectManage/components/employNoticeRecord.vue 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/projectManage/components/evaluatePlan.vue 306 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/projectManage/components/evaluateTaskNotice.vue 112 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/projectManage/components/expertsList.vue 375 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/projectManage/components/mapLocation.vue 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/projectManage/components/riskAnalysis.vue 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/projectManage/components/siteCheckRcd.vue 179 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/projectManage/process.vue 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/userManage/expertUsers/components/expertDialog.vue 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/userManage/expertUsers/index.vue 143 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/baseSet/expertsType/index.vue
@@ -44,7 +44,7 @@
<!--      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>-->
    </el-row>
    <el-table v-loading="state.loading" :data="state.expertList" :tree-props="{children: 'children', hasChildren: 'hasChildren'}" :border="true">
    <el-table v-loading="state.loading" :data="state.expertList" row-key="id" :border="true">
      <el-table-column label="分类名称" align="center" prop="classifyName" />
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
        <template #default="scope">
src/views/safetyReview/projectManage/components/employNoticeRecord.vue
对比新文件
@@ -0,0 +1,190 @@
<template>
  <div class="riskBox">
    <el-form ref="formRef" :model="state.formData" :rules="state.rules" class="register-form" label-position="top">
      <el-row :gutter="30">
        <el-col :span="12">
          <el-form-item prop="timeRange" label="技术服务期限">
            <el-date-picker
                v-model="state.formData.timeRange"
                style="width: 100%"
                type="daterange"
                range-separator="至"
                start-placeholder="开始日期"
                end-placeholder="结束日期"
                value-format="YYYY-MM-DD 00:00:00"
                size="large"
            />
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item prop="investigationPlanDate" label="计划现场勘验时间">
            <el-date-picker
                style="width: 100%"
                v-model="state.formData.investigationPlanDate"
                type="date"
                value-format="YYYY-MM-DD 00:00:00"
                placeholder="选择日期"
                size="large"
            />
          </el-form-item>
        </el-col>
      </el-row>
<!--      <el-row :gutter="30">-->
<!--        <el-col :span="6">-->
<!--          <el-form-item label="附件上传">-->
<!--            <el-upload-->
<!--                accept="image/*"-->
<!--                :action="state.uploadUrl"-->
<!--                :headers="state.header"-->
<!--                method="post"-->
<!--                :on-success="(response, file, fileList) => handleAvatarSuccess(response, file, fileList, 1)"-->
<!--                :on-preview="handlePictureCardPreview"-->
<!--                v-model:file-list="state.socialList"-->
<!--                list-type="picture-card"-->
<!--                :before-upload="picSize"-->
<!--                :on-remove="(file, file_list)=>{handleRemove(file, file_list, 1)}"-->
<!--            >-->
<!--              <el-icon><Plus /></el-icon>-->
<!--              <template #tip>-->
<!--                <div class="el-upload__tip">上传jpg/png图片尺寸小于5M</div>-->
<!--              </template>-->
<!--            </el-upload>-->
<!--          </el-form-item>-->
<!--        </el-col>-->
<!--      </el-row>-->
      <el-row>
        <el-col :span="18">
          <div style="display: flex;align-items: center">项目组成员<el-icon style="margin-left: 10px;margin-right: 4px"><InfoFilled /></el-icon><span style="font-size: 13px">金属、非金属矿及其他矿采选业:安全、机械、电气、采矿、通风、地质、水工结构</span></div>
        </el-col>
      </el-row>
      <el-table  :data="state.planPersons" :border="true" style="margin: 20px 0">
        <el-table-column label="序号" width="60" align="center" type="index"></el-table-column>
        <el-table-column label="评价组成员" prop="person.name" header-align="center" :show-overflow-tooltip="true"/>
        <el-table-column label="资格证书" prop="person.certificateNo" header-align="center" :show-overflow-tooltip="true"/>
        <el-table-column label="专业能力" prop="person.major" header-align="center" :show-overflow-tooltip="true"/>
        <el-table-column label="承担工作" header-align="center" class-name="small-padding fixed-width">
          <template #default="scope">
            <el-select v-model="scope.row.work" multiple placeholder="承担工作" style="width: 100%" size="large" disabled>
              <el-option v-for="item in state.workList" :key="item.value" :label="item.label" :value="item.value"/>
            </el-select>
          </template>
        </el-table-column>
        <el-table-column label="承诺后期前往现场勘验" header-align="center" class-name="small-padding fixed-width">
          <template #default="scope">
            <el-radio-group v-model="scope.row.laterPromise" size="large" disabled>
              <el-radio :label="1" size="large">是</el-radio>
              <el-radio :label="0" size="large">否</el-radio>
            </el-radio-group>
          </template>
        </el-table-column>
        <el-table-column label="未到现场勘验原因" header-align="center" class-name="small-padding fixed-width">
          <template #default="scope">
            <el-input v-model="scope.row.reason" maxlength="30" show-word-limit type="text" size="large" readonly/>
          </template>
        </el-table-column>
        <el-table-column label="是否已告知" header-align="center" class-name="small-padding fixed-width">
          <template #default="scope">
            <el-radio-group v-model="scope.row.informed" size="large">
              <el-radio :label="1" size="large">是</el-radio>
              <el-radio :label="0" size="large">否</el-radio>
            </el-radio-group>
          </template>
        </el-table-column>
      </el-table>
    </el-form>
  </div>
</template>
<script setup>
import {defineEmits, onMounted, reactive, ref} from "vue"
import {ElMessage} from "element-plus"
import {Search} from '@element-plus/icons-vue'
import {addRisk, editRisk, getRiskDetail} from "@/api/projectManage/riskAnalysis"
import Cookies from "js-cookie"
const emit = defineEmits(["getNextStatus"])
const state = reactive({
  formData: {
    projectId: null,
    timeRange: [],
    serviceStartDate: '',
    serviceEndDate: '',
    investigationPlanDate: ''
  },
  planPersons: [],
  rules: {
    timeRange: [{required: true, message: '请选择技术服务期限', trigger: 'blur'}],
    investigationPlanDate: [{required: true, message: '请选择计划现场勘验时间', trigger: 'blur'}],
  }
})
const isAmin = ref(false)
const formRef = ref()
onMounted(() => {
  const userInfo = JSON.parse(Cookies.get('userInfo'))
  if(userInfo.identity === 0){
    isAmin.value = true;
  }
});
const riskOpen = async (type,val) => {
  console.log("type",type,val)
  if(type === 'detail' || type === 'edit' ){
    const res = await getRiskDetail({projectId: val});
    if(res.code == 200){
      state.formData = res.data;
      state.formData.project.business = parseInt(res.data.project.business);
      state.formData.project.area = [res.data.project.province,res.data.project.city];
    }else {
      ElMessage.warning(res.message)
    }
  }
  if(type === 'add' || type === 'clickEdit') {
    const valid = await formRef.value.validate();
    if(valid){
      if (isAmin.value) {
        ElMessage.warning("当前用户暂无权限");
        return;
      }
      state.formData.serviceStartDate = state.formData.timeRange[0]
      state.formData.serviceEndDate = state.formData.timeRange[1]
      if(type === 'add'){
        const {projectId,timeRange, ...data} = JSON.parse(JSON.stringify(state.formData))
        const res = await addRisk(data);
        if (res.code == 200) {
          ElMessage.success('保存成功')
          formRef.value.clearValidate();
          emit('getNextStatus', res.data);
        } else {
          ElMessage.warning(res.message)
        }
      }else if(type === 'clickEdit'){
        const {timeRange, ...data} = JSON.parse(JSON.stringify(state.formData))
        const res = await editRisk(data);
        if (res.code == 200) {
          ElMessage.success('变更成功')
          formRef.value.clearValidate();
          // emit('getNextStatus', data.project.id);
        } else {
          ElMessage.warning(res.message)
        }
      }
    }
  }
}
defineExpose({
  riskOpen
});
</script>
<style scoped lang="scss">
.riskBox{
  :deep(.el-form .el-form-item__label) {
    font-size: 15px;
  }
}
</style>
src/views/safetyReview/projectManage/components/evaluatePlan.vue
@@ -3,10 +3,10 @@
    <el-form ref="formRef" :model="state.formData" :rules="state.rules" class="register-form" label-position="top">
      <el-row :gutter="30">
        <el-col :span="6">
          <el-form-item prop="evalStartDate" label="评价开始时间">
          <el-form-item prop="startDate" label="评价开始时间">
            <el-date-picker
                style="width: 100%"
                v-model="state.formData.evalStartDate"
                v-model="state.formData.startDate"
                type="date"
                value-format="YYYY-MM-DD 00:00:00"
                placeholder="选择日期"
@@ -15,10 +15,10 @@
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item prop="evalEndDate" label="评价结束时间">
          <el-form-item prop="endDate" label="评价结束时间">
            <el-date-picker
                style="width: 100%"
                v-model="state.formData.evalEndDate"
                v-model="state.formData.endDate"
                type="date"
                value-format="YYYY-MM-DD 00:00:00"
                placeholder="选择日期"
@@ -27,9 +27,9 @@
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item prop="deliver" label="机构评价负责人">
          <el-form-item prop="auser.name" label="机构评价负责人">
            <el-input
                v-model="state.formData.deliver"
                v-model="state.formData.auser.name"
                size="large"
                placeholder="请选择机构评价负责人"
            >
@@ -39,23 +39,28 @@
            </el-input>
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item prop="deliver" label="技术负责人">
            <el-input
                v-model="state.formData.deliver"
                size="large"
                placeholder="请选择技术负责人"
            >
              <template #append>
                <el-button :icon="Search" @click="openExperts('技术负责人')"/>
              </template>
            </el-input>
          </el-form-item>
<!--        <el-col :span="6">-->
<!--          <el-form-item prop="deliver" label="技术负责人">-->
<!--            <el-input-->
<!--                v-model="state.formData.deliver"-->
<!--                size="large"-->
<!--                placeholder="请选择技术负责人"-->
<!--            >-->
<!--              <template #append>-->
<!--                <el-button :icon="Search" @click="openExperts('技术负责人')"/>-->
<!--              </template>-->
<!--            </el-input>-->
<!--          </el-form-item>-->
<!--        </el-col>-->
      </el-row>
      <el-row>
        <el-col :span="18">
          <div style="display: flex;align-items: center">评价日程安排</div>
        </el-col>
      </el-row>
      <el-table  :data="state.tableData" :border="true" style="margin: 20px 0">
      <el-table :data="state.formData.estimateSchedules" :border="true" style="margin: 20px 0">
        <el-table-column label="序号" width="60" align="center" type="index"></el-table-column>
        <el-table-column label="评价日程安排" prop="content" header-align="center" :show-overflow-tooltip="true"/>
        <el-table-column label="评价日程安排" prop="name" header-align="center" :show-overflow-tooltip="true"/>
        <el-table-column label="开始时间" header-align="center" class-name="small-padding fixed-width">
          <template #default="scope">
            <el-date-picker
@@ -81,6 +86,94 @@
          </template>
        </el-table-column>
      </el-table>
      <el-row>
        <el-col :span="18">
          <div style="display: flex;align-items: center">项目组成员<el-icon style="margin-left: 10px;margin-right: 4px"><InfoFilled /></el-icon><span style="font-size: 13px">金属、非金属矿及其他矿采选业:安全、机械、电气、采矿、通风、地质、水工结构</span></div>
        </el-col>
        <el-col :span="6">
          <div style="width: 100%;display: flex;justify-content: right">
            <el-button type="primary" icon="Plus" @click="openExperts('项目组成员')">添加成员</el-button>
          </div>
        </el-col>
      </el-row>
      <el-table  :data="state.formData.planPersons" :border="true" style="margin: 20px 0">
        <el-table-column label="序号" width="60" align="center" type="index"></el-table-column>
        <el-table-column label="评价组成员" prop="person.name" header-align="center" :show-overflow-tooltip="true"/>
        <el-table-column label="资格证书" prop="person.certificateNo" header-align="center" :show-overflow-tooltip="true"/>
        <el-table-column label="专业能力" prop="person.major" header-align="center" :show-overflow-tooltip="true"/>
        <el-table-column label="承担工作" header-align="center" class-name="small-padding fixed-width">
          <template #default="scope">
            <el-select v-model="scope.row.work" multiple placeholder="承担工作" style="width: 100%" size="large">
              <el-option v-for="item in state.workList" :key="item.value" :label="item.label" :value="item.value"/>
            </el-select>
          </template>
        </el-table-column>
        <el-table-column label="承诺后期前往现场勘验" header-align="center" class-name="small-padding fixed-width">
          <template #default="scope">
            <el-radio-group v-model="scope.row.laterPromise" size="large">
              <el-radio :label="1" size="large">是</el-radio>
              <el-radio :label="0" size="large">否</el-radio>
            </el-radio-group>
          </template>
        </el-table-column>
        <el-table-column label="未到现场勘验原因" header-align="center" class-name="small-padding fixed-width">
          <template #default="scope">
            <el-input v-model="scope.row.reason" maxlength="30" show-word-limit type="text" size="large"/>
          </template>
        </el-table-column>
        <el-table-column label="操作" header-align="center" class-name="small-padding fixed-width">
          <template #default="scope">
            <el-button link type="danger" @click="delMember(scope.$index)">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
      <el-row>
        <el-col :span="18">
          <div style="display: flex;align-items: center">所需仪器设备</div>
        </el-col>
        <el-col :span="6">
          <div style="width: 100%;display: flex;justify-content: right">
            <el-button type="primary" icon="Plus" @click="addDevice">添加设备</el-button>
          </div>
        </el-col>
      </el-row>
      <el-table  :data="state.formData.devices" :border="true" style="margin: 20px 0">
        <el-table-column label="序号" width="60" align="center" type="index"></el-table-column>
        <el-table-column label="设备名称" header-align="center" class-name="small-padding fixed-width">
          <template #default="scope">
            <el-input v-model="scope.row.deviceName" maxlength="30" show-word-limit type="text" size="large"/>
          </template>
        </el-table-column>
        <el-table-column label="开始时间" header-align="center" class-name="small-padding fixed-width">
          <template #default="scope">
            <el-date-picker
                style="width: 100%"
                v-model="scope.row.startDate"
                type="date"
                value-format="YYYY-MM-DD 00:00:00"
                placeholder="选择日期"
                size="large"
            />
          </template>
        </el-table-column>
        <el-table-column label="结束时间" header-align="center" class-name="small-padding fixed-width">
          <template #default="scope">
            <el-date-picker
                style="width: 100%"
                v-model="scope.row.endDate"
                type="date"
                value-format="YYYY-MM-DD 00:00:00"
                placeholder="选择日期"
                size="large"
            />
          </template>
        </el-table-column>
        <el-table-column label="操作" header-align="center" class-name="small-padding fixed-width">
          <template #default="scope">
            <el-button link type="danger" @click="delDevice(scope.$index)">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
    </el-form>
    <experts-list ref="expertsListRef" @getName="getSelected"></experts-list>
  </div>
@@ -97,57 +190,85 @@
const state = reactive({
  formData: {
    project: {
      id: '',
    projectId: null,
    auser: {
      name: ''
    },
    auserId: null,
    estimateSchedules: [
      {
        id: 1,
        name: '勘验准备',
        startDate: '',
        endDate: '',
        scheduleType: 1
      },
      {
        id: 2,
        name: '现场勘验',
        startDate: '',
        endDate: '',
        scheduleType: 2
      },
      {
        id: 3,
        name: '材料分析整理',
        startDate: '',
        endDate: '',
        scheduleType: 3
      },
      {
        id: 4,
        name: '评价报告编写',
        startDate: '',
        endDate: '',
        scheduleType: 4
      },
      {
        id: 5,
        name: '整改情况现场确认',
        startDate: '',
        endDate: '',
        scheduleType: 5
      },
      {
        id: 6,
        name: '整理评价报告',
        startDate: '',
        endDate: '',
        scheduleType: 6
      },
      {
        id: 7,
        name: '报告审核',
        startDate: '',
        endDate: '',
        scheduleType: 7
      },
      {
        id: 8,
        name: '报告修改',
        startDate: '',
        endDate: '',
        scheduleType: 8
      },
    ],
    planPersons: [],
    devices: [],
    startDate: '',
    endDate: '',
    id: ''
  },
  rules: {
    "project.name": [{required: true, message: '请填写项目名称', trigger: 'blur'}],
    riskCharacter: [{required: true, message: '请填写行业风险特性', trigger: 'blur'}],
    "auser.name": [{required: true, message: '请填写机构评价负责人', trigger: 'blur'}],
    startDate: [{required: true, message: '请选择评价开始时间', trigger: 'blur'}],
    endDate: [{required: true, message: '请选择评价结束时间', trigger: 'blur'}]
  },
  tableData: [
    {
      id: '1',
      content: '勘验准备',
      status: 1
    },
    {
      id: '2',
      content: '现场勘验',
      status: 1
    },
    {
      id: '3',
      content: '材料分析整理',
      status: 1
    },
    {
      id: '4',
      content: '评价报告编写',
      status: 1
    },
    {
      id: '5',
      content: '整改情况现场确认',
      status: 1
    },
    {
      id: '6',
      content: '整理评价报告',
      status: 1
    },
    {
      id: '7',
      content: '报告审核',
      status: 1
    },
    {
      id: '8',
      content: '报告修改',
      status: 1
    },
  workList: [
    {value: '报告编制',label: '报告编制'},
    {value: '文字校对',label: '文字校对'},
    {value: '现场勘验',label: '现场勘验'},
    {value: '资料收集整理',label: '资料收集整理'}
  ]
})
const props = {
@@ -173,12 +294,6 @@
      state.formData = res.data;
      state.formData.project.business = parseInt(res.data.project.business);
      state.formData.project.area = [res.data.project.province,res.data.project.city];
      state.tableData[0].status = res.data.isInBusiness ? 1 : 0;
      state.tableData[1].status = res.data.isSatisfyNeed ? 1 : 0;
      state.tableData[2].status = res.data.isNeedExpert ? 1 : 0;
      state.tableData[3].status = res.data.isFinishReport ? 1 : 0;
      state.tableData[4].status = res.data.isAcceptChargess ? 1 : 0;
      state.tableData[5].status = res.data.isFeasibility ? 1 : 0;
    }else {
      ElMessage.warning(res.message)
    }
@@ -194,12 +309,6 @@
        const {id, ...data} = JSON.parse(JSON.stringify(state.formData))
        delete data.project.area;
        delete data.project.id;
        data.isInBusiness = state.tableData[0].status === 1;
        data.isSatisfyNeed = state.tableData[1].status === 1;
        data.isNeedExpert = state.tableData[2].status === 1;
        data.isFinishReport = state.tableData[3].status === 1;
        data.isAcceptChargess = state.tableData[4].status === 1;
        data.isFeasibility = state.tableData[5].status === 1;
        console.log('data', data)
        const res = await addRisk(data);
        if (res.code == 200) {
@@ -213,12 +322,6 @@
      }else if(type === 'clickEdit'){
        const { ...data} = JSON.parse(JSON.stringify(state.formData))
        delete data.project.area;
        data.isInBusiness = state.tableData[0].status === 1;
        data.isSatisfyNeed = state.tableData[1].status === 1;
        data.isNeedExpert = state.tableData[2].status === 1;
        data.isFinishReport = state.tableData[3].status === 1;
        data.isAcceptChargess = state.tableData[4].status === 1;
        data.isFeasibility = state.tableData[5].status === 1;
        console.log('data', data)
        const res = await editRisk(data);
        if (res.code == 200) {
@@ -239,11 +342,40 @@
const getSelected = (type,obj)=>{
  if(type == '项目负责人'){
    state.formData.project.leader = obj.name
    state.formData.auser.name = obj.name
    state.formData.auserId = obj.id
  }else{
    let member = {
      person: {
        name: obj.name,
        certificateNo: obj.certificateNo?obj.certificateNo:'',
        major: obj.speciality,
      },
      informed: 0,
      work: '',
      laterPromise: 0,
      reason: ''
    }
    state.formData.planPersons.push(member)
  }
  if(type == '任务下达人'){
    state.formData.deliver = obj.name
}
const delMember = (index)=>{
  state.formData.planPersons.splice(index,1)
}
const addDevice = ()=>{
  let device = {
    projectId: null,
    deviceName: '',
    startDate: '',
    endDate: ''
  }
  state.formData.devices.push(device)
}
const delDevice = (index)=>{
  state.formData.devices.splice(index,1)
}
defineExpose({
src/views/safetyReview/projectManage/components/evaluateTaskNotice.vue
@@ -3,9 +3,9 @@
    <el-form ref="formRef" :model="state.formData" :rules="state.rules" class="register-form" label-position="top">
      <el-row :gutter="30">
        <el-col :span="6">
          <el-form-item prop="project.leader" label="项目负责人">
          <el-form-item prop="leader.name" label="项目负责人">
            <el-input
                v-model="state.formData.project.leader"
                v-model="state.formData.leader.name"
                size="large"
                placeholder="请选择项目负责人"
            >
@@ -16,9 +16,9 @@
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item prop="project.contactor" label="联系人">
          <el-form-item prop="linkMan" label="联系人">
            <el-input
                v-model="state.formData.project.contactor"
                v-model="state.formData.linkMan"
                size="large"
                placeholder="请选择联系人"
            >
@@ -26,9 +26,9 @@
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item prop="project.phone" label="联系电话">
          <el-form-item prop="linkPhone" label="联系电话">
            <el-input
                v-model="state.formData.project.phone"
                v-model="state.formData.linkPhone"
                size="large"
                placeholder="请选择联系电话"
            >
@@ -38,7 +38,7 @@
        <el-col :span="6">
          <el-form-item label="传真">
            <el-input
                v-model="state.formData.project.fax"
                v-model="state.formData.fax"
                size="large"
                placeholder="请选择传真"
            >
@@ -48,9 +48,9 @@
      </el-row>
      <el-row :gutter="30">
        <el-col :span="6">
          <el-form-item prop="deliver" label="任务下达人">
          <el-form-item label="任务下达人">
            <el-input
                v-model="state.formData.deliver"
                v-model="state.formData.transmitPerson"
                size="large"
                placeholder="请选择任务下达人"
            >
@@ -61,10 +61,10 @@
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item prop="deliverDate" label="任务下达时间">
          <el-form-item prop="transmitDate" label="任务下达时间">
            <el-date-picker
                style="width: 100%"
                v-model="state.formData.deliverDate"
                v-model="state.formData.transmitDate"
                type="date"
                value-format="YYYY-MM-DD 00:00:00"
                placeholder="选择日期"
@@ -90,56 +90,20 @@
const state = reactive({
  formData: {
    id: '',
    deliver: '',
    deliverDate: '',
    project: {
      id: '',
      leader: '',
      contactor: '',
      phone: ''
    }
    leader: {
      name: ''
    },
    leaderId: null,
    linkMan: '',
    transmitPerson: '',
    transmitDate: ''
  },
  rules: {
    "project.leader": [{required: true, message: '请选择项目负责人', trigger: 'blur'}],
    "project.contactor": [{required: true, message: '请输入联系人', trigger: 'blur'}],
    "project.phone": [{required: true, message: '请输入联系电话', trigger: 'blur'}],
    deliverDate: [{required: true, message: '请选择任务下达时间', trigger: 'blur'}]
  },
  estimateTypeList: [],
  addressList: [],
  businessList: [],
  tableData: [
    {
      id: '1',
      content: '评价项目是否在本机构资质业务范围内',
      status: 1
    },
    {
      id: '2',
      content: '评价人员专业构成是否满足评价项目需要',
      status: 1
    },
    {
      id: '3',
      content: '是否需要聘请相关专业的技术专家',
      status: 1
    },
    {
      id: '4',
      content: '是否能在约定的时间内完成评价报告',
      status: 1
    },
    {
      id: '5',
      content: '评价费用是否在本机构所接受的范围内',
      status: 1
    },
    {
      id: '6',
      content: '项目的可行性(风险分析结论)',
      status: 1
    },
  ]
    "leader.name": [{required: true, message: '请选择项目负责人', trigger: 'blur'}],
    linkMan: [{required: true, message: '请输入联系人', trigger: 'blur'}],
    linkPhone: [{required: true, message: '请输入联系电话', trigger: 'blur'}],
    transmitDate: [{required: true, message: '请选择任务下达时间', trigger: 'blur'}]
  }
})
const props = {
  expandTrigger: 'hover',
@@ -157,19 +121,10 @@
})
const riskOpen = async (type,val) => {
  console.log("type",type,val)
  if(type === 'detail' || type === 'edit' ){
    const res = await getRiskDetail({projectId: val});
    if(res.code == 200){
      state.formData = res.data;
      state.formData.project.business = parseInt(res.data.project.business);
      state.formData.project.area = [res.data.project.province,res.data.project.city];
      state.tableData[0].status = res.data.isInBusiness ? 1 : 0;
      state.tableData[1].status = res.data.isSatisfyNeed ? 1 : 0;
      state.tableData[2].status = res.data.isNeedExpert ? 1 : 0;
      state.tableData[3].status = res.data.isFinishReport ? 1 : 0;
      state.tableData[4].status = res.data.isAcceptChargess ? 1 : 0;
      state.tableData[5].status = res.data.isFeasibility ? 1 : 0;
    }else {
      ElMessage.warning(res.message)
    }
@@ -183,15 +138,6 @@
      }
      if(type === 'add'){
        const {id, ...data} = JSON.parse(JSON.stringify(state.formData))
        delete data.project.area;
        delete data.project.id;
        data.isInBusiness = state.tableData[0].status === 1;
        data.isSatisfyNeed = state.tableData[1].status === 1;
        data.isNeedExpert = state.tableData[2].status === 1;
        data.isFinishReport = state.tableData[3].status === 1;
        data.isAcceptChargess = state.tableData[4].status === 1;
        data.isFeasibility = state.tableData[5].status === 1;
        console.log('data', data)
        const res = await addRisk(data);
        if (res.code == 200) {
          ElMessage.success('保存成功')
@@ -203,13 +149,6 @@
        }
      }else if(type === 'clickEdit'){
        const { ...data} = JSON.parse(JSON.stringify(state.formData))
        delete data.project.area;
        data.isInBusiness = state.tableData[0].status === 1;
        data.isSatisfyNeed = state.tableData[1].status === 1;
        data.isNeedExpert = state.tableData[2].status === 1;
        data.isFinishReport = state.tableData[3].status === 1;
        data.isAcceptChargess = state.tableData[4].status === 1;
        data.isFeasibility = state.tableData[5].status === 1;
        const res = await editRisk(data);
        if (res.code == 200) {
          ElMessage.success('变更成功')
@@ -229,10 +168,11 @@
const getSelected = (type,obj)=>{
  if(type == '项目负责人'){
    state.formData.project.leader = obj.name
    state.formData.leader.name = obj.name
    state.formData.leaderId = obj.id
  }
  if(type == '任务下达人'){
    state.formData.deliver = obj.name
    state.formData.transmitPerson = obj.name
  }
}
src/views/safetyReview/projectManage/components/expertsList.vue
@@ -4,69 +4,146 @@
            v-model="dialogVisible"
            :title="title"
            width="60%"
            :before-close="handleClose"
        >
          <el-form :model="state.queryParams" ref="queryForm" :inline="true" v-show="state.showSearch" label-width="90px">
          <el-form :model="queryParams" :inline="true" label-width="90px">
            <el-form-item label="专业类别">
              <el-cascader
                  clearable
                  v-model="state.classiFy"
                  :options="state.expertTypes"
                  :props="{ expandTrigger: 'hover', value: 'id',label: 'classifyName'}"
                  @change="handleChange"></el-cascader>
              <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="在岗情况" prop="dutyStatus">
              <el-select v-model="state.queryParams.dutyStatus" placeholder="岗位状态" clearable>
                <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-date-picker
                  v-model="state.searchTime"
                  type="daterange"
                  @change="changeTime"
                  range-separator="至"
                  start-placeholder="开始日期"
                  end-placeholder="结束日期"
                  value-format="YYYY-MM-DD"
            <el-form-item label="姓名">
              <el-input
                  v-model="queryParams.name"
                  placeholder="姓名"
                  style="width: 250px"
              />
            </el-form-item>
            <el-form-item label="手机号">
              <el-input
                  v-model="queryParams.phone"
                  placeholder="手机号"
                  style="width: 250px"
              />
            </el-form-item>
            <el-form-item label="评价师等级">
              <el-select v-model="queryParams.level" 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" 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" 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>
            <el-form-item>
              <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
              <el-button icon="Refresh" @click="resetQuery">重置</el-button>
              <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 ref="tableRef" v-loading="loading" :data="state.expertList" :border="true" @select="select" @selection-change="handleSelectionChange">
          <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 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="degree" />
            <el-table-column label="职称" align="center" prop="title"/>
            <el-table-column label="专业" align="center" prop="speciality" />
            <el-table-column label="推荐类别组别" align="center">
            <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" >
              <template #default="scope">
                {{findNodeById(state.expertTypes,scope.row.bigClassify)}}/{{findNodeById(state.expertTypes,scope.row.smallClassify)}}
                <span v-if="scope.row.sex === 0">男</span>
                <span v-if="scope.row.sex === 1">女</span>
              </template>
            </el-table-column>
            <el-table-column label="联系电话" align="center" prop="phone"/>
            <el-table-column label="申请时间" align="center" prop="createTime">
            <el-table-column label="所属机构" prop="agency.name" align="center" width="110"  />
            <el-table-column label="社保" prop="socialSecurity" align="center" width="120">
              <template #default="scope">
                {{scope.row.createTime?scope.row.createTime.substring(0,10):''}}
                <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>
              </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"  />
            <el-table-column label="最近评价时间" prop="lastTime" align="center" width="120" />
          </el-table>
          <pagination
              v-show="state.total > 0"
              :total="state.total"
              v-model:page="state.queryParams.pageNum"
              v-model:limit="state.queryParams.pageSize"
              v-show="total > 0"
              :total="total"
              v-model:page="queryParams.pageNum"
              v-model:limit="queryParams.pageSize"
              @pagination="getList"
          />
            <template #footer>
                    <span class="dialog-footer">
                        <el-button @click="handleClose" size="default">取 消</el-button>
                        <el-button @click="dialogVisible = false" size="default">取 消</el-button>
                        <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
                    </span>
            </template>
@@ -74,84 +151,120 @@
    </div>
</template>
<script setup>
import {defineEmits, reactive, ref, toRefs} from 'vue'
import Editor from "@/components/Editor/index.vue";
import {ElMessage} from "element-plus";
import {addArea, editArea, getArea} from "@/api/backManage/area";
import {getExpertsList, getExpertTypes} from "../../../../api/form";
const dialogVisible = ref(false)
const title = ref("")
const loading = ref(false)
const tableRef = ref()
const emit = defineEmits([""]);
const state = reactive({
  showSearch: true,
  total: 0,
  expertTypes: [],
  expertList: [],
import {getCurrentInstance, onMounted, reactive, ref, toRefs,defineEmits} from "vue";
import {getDictList} from "@/api/backManage/evaluate";
import {ElMessage, ElMessageBox} from "element-plus";
import Cookies from "js-cookie";
import {delMonitor, getExpertList, getMonitorList} from "@/api/sysUsers";
const { proxy } = getCurrentInstance();
const loading = ref(false);
const emit = defineEmits(['getName'])
const data = reactive({
  queryParams: {
    pageNum: 1,
    pageSize: 10,
    state: 2,
    bigClassify: null,
    smallClassify: null,
    dutyStatus: null,
    params: {
      startTime: '',
      endTime: ''
    }
    expertType: "",
    name: '',
    phone: '',
    level: '',
    major: null,
    post: ''
  },
  classiFy: [],
  searchTime: [],
  total: 0,
  dataList: [],
  majorList: [],
  levelList: [
    {
      id: '1',
      name: '一级'
    },
    {
      id: '2',
      name: '二级'
    },
    {
      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 openDialog = (type) => {
  resetQuery()
  getTypes()
  state.selected = []
  title.value = type
  dialogVisible.value = true
  getMajor()
  research()
  data.selected = []
  data.title = type
  data.dialogVisible = true
}
const onSubmit = async () => {
  if(state.selected.length>0)
  emit('getName',title.value,state.selected[state.selected.length - 1])
  dialogVisible.value = false
}
const handleQuery=()=> {
  state.queryParams.pageNum = 1
  if(state.classiFy && state.classiFy.length>0){
    state.queryParams.bigClassify = state.classiFy[0]
    state.queryParams.smallClassify = state.classiFy[1]
  }
  if(state.searchTime && state.searchTime.length>0){
    state.queryParams.params.startTime = state.searchTime[0]
    state.queryParams.params.endTime = state.searchTime[1]
  }
  getList()
  if(data.selected.length>0)
  emit('getName',data.title,data.selected[data.selected.length - 1])
  data.dialogVisible = false
}
const getList = async () => {
  loading.value = true;
  const res = await getExpertsList(state.queryParams)
  loading.value = true
  const res = await getExpertList(data.queryParams)
  if(res.code == 200){
    state.expertList = res.data.list
    state.total = res.data.total
    data.dataList = res.data.list.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})
      }
    })
    console.log('RES',data.dataList)
    data.total = res.data.total
  }else{
    ElMessage.warning(res.msg)
    ElMessage.warning(res.message)
  }
  loading.value = false;
  loading.value = false
}
const getTypes = async()=> {
  const res = await getExpertTypes()
  if(res.code == 200){
    state.expertTypes = res.data
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.msg)
    ElMessage.warning(res.message)
  }
}
@@ -164,58 +277,26 @@
})
const handleSelectionChange = (val) => {
  state.selected = val
  data.selected = val
}
const resetQuery=()=> {
  state.queryParams = {
const search = ()=>{
  data.queryParams.pageNum = 1
  getList()
}
const research = ()=>{
  data.queryParams = {
    pageNum: 1,
    pageSize: 10,
    state: 2,
    bigClassify: null,
    smallClassify: null,
    dutyStatus: null,
    params: {
      startTime: '',
      endTime: ''
    }
  };
  state.classiFy = []
  state.searchTime = []
  handleQuery()
}
const handleChange=(value)=> {
  if(!value){
    data.classiFy = []
    data.queryParams.bigClassify = ""
    data.queryParams.smallClassify = ""
    expertType: "",
    name: '',
    phone: '',
    level: '',
    major: null,
    post: ''
  }
}
const changeTime=(value)=>{
  if(!value){
    data.queryParams.params.endTime = ""
    data.queryParams.params.startTime = ""
  }
}
const findNodeById = (data,value)=> {
  for (const node of data) {
    if (node.id === value) {
      return node.classifyName;
    }
    if (node.children) {
      const foundNode = findNodeById(node.children, value);
      if (foundNode) {
        return foundNode;
      }
    }
  }
  return null;
}
const handleClose = () => {
    dialogVisible.value = false;
  getList()
}
defineExpose({
src/views/safetyReview/projectManage/components/mapLocation.vue
对比新文件
@@ -0,0 +1,118 @@
<template>
    <el-dialog
        v-model="state.mapLocationVisible"
        append-to-body
        :close-on-click-modal="false"
        width="75%"
        :title="state.title"
    >
        <div class="mapLocation_head">
            <div>
                <el-alert
                    title="点击地点获取经纬度信息"
                    type="info"
                    :closable="false"
                >
                </el-alert>
            </div>
            <div class="mapLocation_latlng">
                <span>经度:</span>
                <el-input class="mapLocation_latlng_input" id="lng" v-model="state.longitude"></el-input>
            </div>
            <div class="mapLocation_latlng">
                <span>纬度:</span>
                <el-input class="mapLocation_latlng_input" id="lat" v-model="state.latitude"></el-input>
            </div>
        </div>
        <div class="mapLocation_body">
          <baidu-map class="map" ak="BkZdiHBj9aGrMdVFM48r2njNiMzsekga" v="3.0" type="API" :center="state.center" :zoom="15" scroll-wheel-zoom @ready="initMap" @click="getPosition">
            <bm-marker :position="{lng: state.longitude, lat: state.latitude}" :dragging="true" animation="BMAP_ANIMATION_BOUNCE">
              <bm-label content="选择地点" :labelStyle="{color: 'red', fontSize : '24px'}" :offset="{width: -35, height: 30}"/>
            </bm-marker>
          </baidu-map>
        </div>
        <div  align="right" style="margin-top: 10px">
            <el-button @click="state.mapLocationVisible = false">取消</el-button>
            <el-button type="primary" @click="submitLatLng()">确认</el-button>
        </div>
    </el-dialog>
</template>
<script setup>
import {ref, onMounted, reactive, toRefs, defineComponent,defineExpose,defineEmits} from 'vue';
import { BaiduMap,BmMarker } from 'vue-baidu-map-3x'
const state = reactive({
  title: '',
  longitude: '',
  latitude: '',
  mapLocationVisible: false,
  center: {
    lng: '116.404',
    lat: '39.915'
  }
})
const emit = defineEmits(['giveLatLng'])
onMounted(() => {
  // ...(mounted钩子中的代码不变)
});
const map = reactive({})
const getPosition = ({type, target, point, pixel, overlay})=>{
  state.longitude = point.lng
  state.latitude = point.lat
}
const openMapLocation=(longitude,latitude)=>{
  state.longitude = longitude
  state.latitude = latitude
  state.mapLocationVisible = true
}
const submitLatLng=()=>{
  state.mapLocationVisible = false
  emit('giveLatLng',state.longitude,state.latitude);
}
const initMap=()=>{
}
defineExpose({
  openMapLocation
})
</script>
<style lang="scss" scoped>
.map {
  width: 100%;
  height: 500px;
  :deep(.BMap_cpyCtrl){
    display: none!important;
    visibility: hidden!important;
  }
  :deep(.anchorBL) {
    display: none!important;
    visibility: hidden!important;
  }
}
.mapLocation_head{
    width:100%;
    height:100px;
}
.mapLocation_body{
    width:100%;
    height:500px
}
.mapLocation_latlng{
    padding-top:10px;
    display:inline-block;
    margin-right: 20px;
}
.mapLocation_latlng_input{
    width:250px;
}
</style>
src/views/safetyReview/projectManage/components/riskAnalysis.vue
@@ -195,7 +195,7 @@
                size="large"
                maxlength="30"
                show-word-limit
                placeholder="请输入风险评估人意见"
                placeholder="风险评估人意见"
            >
            </el-input>
          </el-form-item>
@@ -207,7 +207,7 @@
                show-word-limit
                v-model="state.formData.agencyOpinon"
                size="large"
                placeholder="请输入机构评价负责人意见"
                placeholder="机构评价负责人意见"
            >
            </el-input>
          </el-form-item>
@@ -408,13 +408,12 @@
        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;
        data.isNeedExpert = state.tableData[2].status === 1;
        data.isFinishReport = state.tableData[3].status === 1;
        data.isAcceptChargess = state.tableData[4].status === 1;
        data.isFeasibility = state.tableData[5].status === 1;
        console.log('data', data)
        data.isInBusiness = state.tableData[0].status === 1
        data.isSatisfyNeed = state.tableData[1].status === 1
        data.isNeedExpert = state.tableData[2].status === 1
        data.isFinishReport = state.tableData[3].status === 1
        data.isAcceptChargess = state.tableData[4].status === 1
        data.isFeasibility = state.tableData[5].status === 1
        const res = await editRisk(data);
        if (res.code == 200) {
          ElMessage.success('变更成功')
src/views/safetyReview/projectManage/components/siteCheckRcd.vue
对比新文件
@@ -0,0 +1,179 @@
<template>
  <div class="riskBox">
    <el-form ref="formRef" :model="state.formData" :rules="state.rules" class="register-form" label-position="top">
      <el-row :gutter="30">
        <el-col :span="6">
          <el-form-item prop="investigationDate" label="现场勘验时间">
            <el-date-picker
                style="width: 100%"
                v-model="state.formData.investigationPlanDate"
                type="date"
                value-format="YYYY-MM-DD 00:00:00"
                placeholder="选择日期"
                size="large"
            />
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item prop="investigationDate" label="现场勘验位置">
            <el-input
                v-model="state.formData.location"
                size="large"
                placeholder="请填写现场勘验位置"
            >
              <template #append>
                <el-button :icon="Search" @click="openLocation"/>
              </template>
            </el-input>
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item prop="isSafetyCheck" label="编制现场安全检查表">
            <el-radio-group v-model="state.formData.isSafetyCheck" size="large">
              <el-radio :label="true" size="large">是</el-radio>
              <el-radio :label="false" size="large">否</el-radio>
            </el-radio-group>
          </el-form-item>
        </el-col>
      </el-row>
<!--      <el-row :gutter="30">-->
<!--        <el-col :span="6">-->
<!--          <el-form-item label="附件上传">-->
<!--            <el-upload-->
<!--                accept="image/*"-->
<!--                :action="state.uploadUrl"-->
<!--                :headers="state.header"-->
<!--                method="post"-->
<!--                :on-success="(response, file, fileList) => handleAvatarSuccess(response, file, fileList, 1)"-->
<!--                :on-preview="handlePictureCardPreview"-->
<!--                v-model:file-list="state.socialList"-->
<!--                list-type="picture-card"-->
<!--                :before-upload="picSize"-->
<!--                :on-remove="(file, file_list)=>{handleRemove(file, file_list, 1)}"-->
<!--            >-->
<!--              <el-icon><Plus /></el-icon>-->
<!--              <template #tip>-->
<!--                <div class="el-upload__tip">上传jpg/png图片尺寸小于5M</div>-->
<!--              </template>-->
<!--            </el-upload>-->
<!--          </el-form-item>-->
<!--        </el-col>-->
<!--      </el-row>-->
      <el-form-item prop="recordData" label="现场勘验记录">
        <el-input
            v-model="state.formData.recordData"
            :autosize="{ minRows: 6 }"
            maxlength="200"
            show-word-limit
            type="textarea">
        </el-input>
      </el-form-item>
      <el-form-item label="企业陪同照片">
      </el-form-item>
    </el-form>
    <map-location ref="mapLocationRef" @giveLatLng="achieveLatLng"></map-location>
  </div>
</template>
<script setup>
import {defineEmits, onMounted, reactive, ref} from "vue"
import {ElMessage} from "element-plus"
import {Search} from '@element-plus/icons-vue'
import {addRisk, editRisk, getRiskDetail} from "@/api/projectManage/riskAnalysis"
import Cookies from "js-cookie"
const emit = defineEmits(["getNextStatus"])
import MapLocation from "./mapLocation.vue"
const state = reactive({
  formData: {
    id: null,
    projectId: null,
    investigationDate: '',
    location: '',
    isSafetyCheck: null,
    recordData: ''
  },
  planPersons: [],
  rules: {
    recordData: [{required: true, message: '请填写现场勘验记录', trigger: 'blur'}]
  }
})
const isAmin = ref(false)
const formRef = ref()
const mapLocationRef = ref()
onMounted(() => {
  const userInfo = JSON.parse(Cookies.get('userInfo'))
  if(userInfo.identity === 0){
    isAmin.value = true;
  }
});
const riskOpen = async (type,val) => {
  console.log("type",type,val)
  if(type === 'detail' || type === 'edit' ){
    const res = await getRiskDetail({projectId: val});
    if(res.code == 200){
      state.formData = res.data;
      state.formData.project.business = parseInt(res.data.project.business);
      state.formData.project.area = [res.data.project.province,res.data.project.city];
    }else {
      ElMessage.warning(res.message)
    }
  }
  if(type === 'add' || type === 'clickEdit') {
    const valid = await formRef.value.validate();
    if(valid){
      if (isAmin.value) {
        ElMessage.warning("当前用户暂无权限");
        return;
      }
      if(type === 'add'){
        const {projectId, ...data} = JSON.parse(JSON.stringify(state.formData))
        const res = await addRisk(data);
        if (res.code == 200) {
          ElMessage.success('保存成功')
          formRef.value.clearValidate();
          emit('getNextStatus', res.data);
        } else {
          ElMessage.warning(res.message)
        }
      }else if(type === 'clickEdit'){
        const { ...data} = JSON.parse(JSON.stringify(state.formData))
        const res = await editRisk(data);
        if (res.code == 200) {
          ElMessage.success('变更成功')
          formRef.value.clearValidate();
          // emit('getNextStatus', data.project.id);
        } else {
          ElMessage.warning(res.message)
        }
      }
    }
  }
}
const openLocation = ()=>{
  mapLocationRef.value.openMapLocation(state.formData.location.split(',')[0],state.formData.location.split(',')[1])
}
const achieveLatLng=(lng,lat)=>{
  state.formData.location = lng + ',' + lat
}
defineExpose({
  riskOpen
});
</script>
<style scoped lang="scss">
.riskBox{
  :deep(.el-form .el-form-item__label) {
    font-size: 15px;
  }
}
</style>
src/views/safetyReview/projectManage/process.vue
@@ -38,10 +38,12 @@
        <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 === 1" @getNextStatus="getNextStatus"></rickAnalysis>
            <rickAnalysis ref="riskRef" v-if="selectedObj.id === 2" @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>
            <employ-notice-record ref="employNoticeRcdRef" v-if="selectedObj.id === 5" @getNextStatus="getNextStatus"></employ-notice-record>
            <site-check-rcd ref="siteCheckRcdRef" v-if="selectedObj.id === 6" @getNextStatus="getNextStatus"></site-check-rcd>
          </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>
@@ -53,7 +55,7 @@
      </el-card>
    </div>
    <div class="bottom">
      <el-button type="primary" v-if="selectedObj.id === 1" plain @click="downloadFile">
      <el-button type="primary" v-if="selectedObj.id === 3" plain @click="downloadFile">
        评价任务通知书<el-icon class="el-icon--right"><Download /></el-icon>
      </el-button>
    </div>
@@ -74,10 +76,12 @@
import status2Png from "@/assets/images/status2.png"
import itemStatus2Png from "@/assets/images/itemStatus2.png"
import { useRoute } from 'vue-router'
import {getProjectStatus} from "@/api/projectManage/project";
import {getProjectStatus} from "@/api/projectManage/project"
import ContractManage from "./components/contractManage";
import EvaluateTaskNotice from "./components/evaluateTaskNotice";
import EvaluateTaskNotice from "./components/evaluateTaskNotice"
import EvaluatePlan from "./components/evaluatePlan";
import EmployNoticeRecord from "./components/employNoticeRecord"
import SiteCheckRcd from "./components/siteCheckRcd"
const route = useRoute()
const menuList = ref([
@@ -161,8 +165,7 @@
        id: 11,
        name: '过程控制负责人审核',
        status: 0
      },
      }
    ]
  },
  {
@@ -191,6 +194,9 @@
const riskRef = ref();
const contractMngRef = ref()
const evaluteRef = ref()
const evalPlanRef = ref()
const employNoticeRcdRef = ref()
const siteCheckRcdRef = ref()
const isShowMenu = ref(false);
const selectedObj = ref({})
const middleHeight = ref(0);
@@ -511,7 +517,6 @@
}
const clickEdit = () => {
  goRouter(selectedObj.value.id,'clickEdit')
}
const getNextStatus = async (val) => {
src/views/safetyReview/userManage/expertUsers/components/expertDialog.vue
@@ -54,7 +54,7 @@
<!--                            <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"
                                v-for="item in props.postList"
                                :key="item.id"
                                :label="item.name"
                                :value="item.name"
@@ -73,7 +73,7 @@
                        <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"
                                v-for="item in props.majorList"
                                :key="item.id"
                                :label="item.label"
                                :value="item"
@@ -112,7 +112,7 @@
                  <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"
                          v-for="item in props.levelList"
                          :key="item.id"
                          :label="item.name"
                          :value="item.name"
@@ -196,7 +196,7 @@
    </div>
</template>
<script setup>
import {reactive, ref, toRefs, defineEmits, onMounted, nextTick} from 'vue'
import {reactive, ref, toRefs, defineEmits, defineProps, onMounted, nextTick} from 'vue'
import { View } from "@element-plus/icons-vue";
import {ElMessage} from "element-plus";
import {verifyPhone, verifyPwd, verifyUsername} from "../../../../../utils/validate";
@@ -207,9 +207,8 @@
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 props = defineProps(['majorList','levelList','postList'])
const dialogVisible = ref(false)
const superRef = ref(null)
@@ -339,53 +338,11 @@
    dialogImageUrl: '',
    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: '其他'
    },
  ]
    pageSize: 10
})
onMounted(()=>{
    getAgency()
    getMajor()
})
const openDialog = async (type, value) => {
@@ -669,20 +626,6 @@
        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)
  }
}
//触底函数
src/views/safetyReview/userManage/expertUsers/index.vue
@@ -8,12 +8,50 @@
                @click="openDialog('add',{})"
            >新增</el-button>
        </div>
        <div style="margin-top: 15px;margin-bottom: 15px;">
            <el-radio-group v-model="queryParams.expertType" @change="changeType">
        <div style="margin-top: 15px;margin-bottom: 15px">
            <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>
        </div>
        <div style="margin-bottom: 15px; display: flex;align-items: center">
          <el-input
              v-model="queryParams.name"
              placeholder="姓名"
              style="width: 220px;margin-right: 12px"
          />
          <el-input
              v-model="queryParams.phone"
              placeholder="手机号"
              style="width: 220px;margin-right: 12px"
          />
          <el-select v-model="queryParams.level" style="width: 220px;margin-right: 12px" placeholder="评价师等级" >
            <el-option
                v-for="item in levelList"
                :key="item.id"
                :label="item.name"
                :value="item.name"
            />
          </el-select>
          <el-select v-model="queryParams.major" value-key="id" style="width: 220px;margin-right: 12px" placeholder="专业方向">
            <el-option
                v-for="item in majorList"
                :key="item.id"
                :label="item.label"
                :value="item.id"
            />
          </el-select>
          <el-select v-model="queryParams.post" style="width: 220px;margin-right: 12px" placeholder="请选择职务">
            <el-option
                v-for="item in postList"
                :key="item.id"
                :label="item.name"
                :value="item.name"
            />
          </el-select>
          <el-button type="primary"  icon="Filter" @click="search">查询</el-button>
          <el-button type="primary"  icon="Filter" @click="research">重置</el-button>
        </div>
        <!-- 表格数据 -->
@@ -102,13 +140,14 @@
            v-model:limit="queryParams.pageSize"
            @pagination="getList"
        />
        <expert-dialog ref="expertRef" @getList="getList"></expert-dialog>
        <expert-dialog ref="expertRef" @getList="getList" :majorList="majorList" :levelList="levelList" :postList="postList"></expert-dialog>
    </div>
</template>
<script setup>
import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
import expertDialog from "./components/expertDialog.vue"
import {getDictList} from "@/api/backManage/evaluate";
import {ElMessage, ElMessageBox} from "element-plus";
import Cookies from "js-cookie";
import {delMonitor, getExpertList, getMonitorList} from "@/api/sysUsers";
@@ -117,19 +156,64 @@
const expertRef = ref();
const data = reactive({
    queryParams: {
        pageNum: 1,
        pageSize: 10,
        expertType: ""
      pageNum: 1,
      pageSize: 10,
      expertType: "",
      name: '',
      phone: '',
      level: '',
      major: null,
      post: ''
    },
    total: 0,
    dataList: []
    dataList: [],
    majorList: [],
    levelList: [
      {
        id: '1',
        name: '一级'
      },
      {
        id: '2',
        name: '二级'
      },
      {
        id: '3',
        name: '三级'
      },
      {
        id: '4',
        name: '其他'
      },
    ],
    postList: [
      {
        id: '1',
        name: '法人'
      },
      {
        id: '2',
        name: '过程控制负责人'
      },
      {
        id: '3',
        name: '机构负责人'
      },
      {
        id: '4',
        name: '技术负责人'
      },
      {
        id: '5',
        name: '员工'
      },
    ]
});
const { queryParams, total, dataList } = toRefs(data);
const { queryParams, total, dataList, majorList, levelList, postList } = toRefs(data);
onMounted(()=>{
    getList()
  getMajor()
})
const getList = async () => {
    loading.value = true
@@ -151,14 +235,41 @@
    loading.value = false
}
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 search = ()=>{
  data.queryParams.pageNum = 1
  getList()
}
const research = ()=>{
  data.queryParams = {
    pageNum: 1,
    pageSize: 10,
    expertType: "",
    name: '',
    phone: '',
    level: '',
    major: null,
    post: ''
  }
  getList()
}
const openDialog = (type, value) => {
    expertRef.value.openDialog(type, value);
}
const changeType = (val) => {
    console.log("val", val)
    queryParams.expertType = val;
    queryParams.pageNum = 1;
    getList();
}
/** 重置新增的表单以及其他数据  */