马宇豪
2023-04-14 36e71978a92ee64375b2c339e5e05d47b6b23fba
修改接口和页面
已修改21个文件
已添加4个文件
2335 ■■■■ 文件已修改
src/api/analyse/assessApply/index.ts 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/analyse/plan/index.ts 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/navMenu/vertical.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/stores/userInfo.ts 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/theme/app.scss 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/theme/element.scss 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/analyse/applyReview/components/reportDialog.vue 583 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/analyse/applyReview/components/selectDanger.vue 191 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/analyse/applyReview/index.ts 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/analyse/applyReview/index.vue 375 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/analyse/assessApply/components/reportDialog.vue 329 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/analyse/assessApply/components/riskDialog.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/analyse/assessApply/components/riskUnitDialog.vue 318 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/analyse/assessApply/components/selectDanger.vue 51 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/analyse/assessApply/index.ts 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/analyse/assessApply/index.vue 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/analyse/evaluate/components/evaluateDialog.vue 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/analyse/evaluate/index.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/analyse/identify/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/analyse/plan/components/planDialog.vue 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/analyse/plan/index.ts 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/analyse/plan/index.vue 214 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/experiment/developing/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/experiment/project/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/loginPage/component/accountLogin.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/analyse/assessApply/index.ts
@@ -9,5 +9,45 @@
                data: params
            });
        },
        getRiskReportPage: (params: object) => {
            return request({
                url: import.meta.env.VITE_API_URL + '/report/select/selectRiskReportPage',
                method: 'post',
                data: params
            });
        },
        toRiskReport: (params: object) => {
            return request({
                url: import.meta.env.VITE_API_URL + '/report/insert/insertRiskReport',
                method: 'post',
                data: params
            });
        },
        updateRiskReport: (params: object) => {
            return request({
                url: import.meta.env.VITE_API_URL + '/report/update/updateRiskReport',
                method: 'post',
                data: params
            });
        },
        updateRiskReportInfo: (params: object) => {
            return request({
                url: import.meta.env.VITE_API_URL + '/report/update/updateRiskReportInfo',
                method: 'post',
                data: params
            });
        },
        uploadReport: (params: object) => {
            return request({
                url: import.meta.env.VITE_API_URL + '/report/update/report',
                method: 'post',
                data: params
            });
        },
    };
}
src/api/analyse/plan/index.ts
@@ -72,6 +72,14 @@
                method: 'post',
                data: params
            });
        },
        reSendJob: (params: object)=>{
            return request({
                url: import.meta.env.VITE_API_URL + '/risk/update/appoint',
                method: 'post',
                data: params
            });
        }
    };
}
src/layout/navMenu/vertical.vue
@@ -2,10 +2,12 @@
    <el-menu
        router
        :default-active="defaultActive"
        background-color="transparent"
        :collapse="isCollapse"
        :unique-opened="true"
        :collapse-transition="false"
    active-text-color="#6ff8ff"
    background-color="transparent"
    text-color="#fff"
    >
        <template v-for="val in menuLists">
            <el-sub-menu :index="val.path" v-if="val.children && val.children.length > 0" :key="val.path">
src/stores/userInfo.ts
@@ -25,7 +25,7 @@
        async setUserInfos(value: any) {
            this.userInfos.userName = value.realName;
            this.userInfos.uid = value.uid;
            this.userInfos.roles = value.role;
            this.userInfos.roles = value.roles;
            this.userInfos.depId = value.depId
            // const userName = Cookies.get('userName');
            // // 模拟数据
src/theme/app.scss
@@ -47,7 +47,8 @@
    width: 100%;
    height: 100%;
    .layout-aside {
        background: var(--next-bg-menuBar);
        //background: var(--next-bg-menuBar);
        background: #384358;
        box-shadow: 2px 0 6px rgb(0 21 41 / 1%);
        height: inherit;
        position: relative;
@@ -86,6 +87,8 @@
    .layout-aside-pc-220 {
        width: 220px !important;
        transition: width 0.3s ease;
        border-radius: 0 8px 8px 0;
        box-shadow: 5px 0 10px rgba(0,0,0,.15);
    }
    .layout-aside-pc-64 {
        width: 64px !important;
src/theme/element.scss
@@ -62,10 +62,12 @@
.el-menu {
    border-right: none !important;
    width: 220px;
    padding: 0 5px 0 0;
}
.el-menu-item {
    height: 56px !important;
    line-height: 56px !important;
    border-radius: 8px !important;;
}
.el-menu-item,
.el-sub-menu__title {
@@ -91,6 +93,12 @@
    @include generalIcon;
}
// 水平菜单、横向菜单高亮 背景色,鼠标 hover 时,有子级菜单的背景色
.el-menu-item.is-active{
    padding: 0 10px;
    box-sizing: border-box;
    border-radius: 8px;
    border: 1px solid rgba(111,248,255,.2);
}
.el-menu-item.is-active,
.el-sub-menu.is-active .el-sub-menu__title,
.el-sub-menu:not(.is-opened):hover .el-sub-menu__title {
src/views/analyse/applyReview/components/reportDialog.vue
对比新文件
@@ -0,0 +1,583 @@
<template>
    <div class="system-menu-dialog-container">
        <el-dialog :title="reportDialogState.title" v-model="reportDialogState.reportDialogVisible" width="80%">
          <div style="text-align: center;font-size: 20px;font-weight: bolder;color: #0c4995">{{reportDialogState.reportForm.experimentName}}实验安全风险评估报告表(带<span style="color: red">*</span>为填写内容)</div>
            <el-form ref="reportFormRef" :rules="reportDialogState.reportFormRules" :model="reportDialogState.reportForm" size="default" label-width="0">
                <table class="report-table">
                    <th class="m-color b-font" style="text-align: center">实验基本信息</th>
                    <tr>
                        <td class="w-25 m-color">实验名称</td>
                        <td class="w-75 m-color">
                            <el-form-item prop="experimentName">
                                <el-input readonly v-model="reportDialogState.reportForm.experimentName" placeholder="请输入实验名称" />
                            </el-form-item>
                        </td>
                    </tr>
                    <tr>
                        <td class="w-25 m-color">实验类型</td>
                        <td class="w-75" style="text-align: left;padding-left: 11px">
<!--                            <el-radio-group style="text-align: center" disabled v-model="reportDialogState.reportForm.experimentType">-->
<!--                                <el-radio :label="1">化学类</el-radio>-->
<!--                                <el-radio :label="2">生物类</el-radio>-->
<!--                                <el-radio :label="3">辐射类</el-radio>-->
<!--                                <el-radio :label="4">机电类</el-radio>-->
<!--                                <el-radio :label="5">特种设备类</el-radio>-->
<!--                                <el-radio :label="6">其他类</el-radio>-->
<!--                            </el-radio-group>-->
                            {{reportDialogState.experimentTypeList.find(i=>i.id === reportDialogState.reportForm.experimentType)?.name}}
                        </td>
                    </tr>
                    <tr>
                      <td class="w-25 m-color">负责人</td>
                      <td class="w-25 m-color">
<!--                        <el-select style="width: 100%" disabled v-model="reportDialogState.reportForm.liabilityUserId" clearable filterable @change="getLiabilityUserPhone($event)">-->
<!--                          <el-option-->
<!--                              v-for="item in reportDialogState.systemPersonList"-->
<!--                              :key="item.id"-->
<!--                              :value="item.id"-->
<!--                              :label="item.realName"-->
<!--                          ></el-option>-->
<!--                        </el-select>-->
                        <el-input readonly v-model="reportDialogState.reportForm.personUser" />
                      </td>
                      <td class="w-25 m-color">电话</td>
                      <td class="w-25 m-color">
                        <el-input disabled v-model="reportDialogState.reportForm.personUserPhone" />
                      </td>
                    </tr>
                    <tr>
                      <td class="w-25 m-color">安全负责人</td>
                      <td class="w-25 m-color">
<!--                        <el-select v-if="reportDialogState.reportForm.safeLiabilityUserId" style="width: 100%" disabled v-model="reportDialogState.reportForm.safeLiabilityUserId" @change="getSafeLiabilityUserPhone($event)" clearable filterable>-->
<!--                          <el-option-->
<!--                              v-for="item in reportDialogState.allPersonList"-->
<!--                              :key="item.id"-->
<!--                              :value="item.id"-->
<!--                              :label="item.personName"-->
<!--                          ></el-option>-->
<!--                        </el-select>-->
                        <el-input disabled v-model="reportDialogState.reportForm.safePersonUser" />
                      </td>
                      <td class="w-25 m-color">电话</td>
                      <td class="w-25 m-color">
                        <el-input readonly v-model="reportDialogState.reportForm.safePersonUserPhone" />
                      </td>
                    </tr>
                    <tr>
                      <td class="w-25 m-color">部门</td>
                      <td class="w-75 m-color">
                        <el-input readonly v-model="reportDialogState.reportForm.dep" />
                      </td>
                    </tr>
                    <tr class="m-color b-font" style="text-align: center">实验场所</tr>
                    <tr>
                      <td class="w-14 m-color">场所名称</td>
                      <td class="w-14 m-color">所在楼栋</td>
                      <td class="w-14 m-color">房间</td>
                      <td class="w-14 m-color">有无消防设施</td>
                      <td class="w-14 m-color">有无隔断</td>
                      <td class="w-14 m-color">场所性质</td>
                    </tr>
                    <tr v-for="(item,index) in reportDialogState.reportForm.experimentSite" :key="index">
                      <td class="w-14">
<!--                        <el-select disabled filterable v-model="item.siteId">-->
<!--                          <el-option-->
<!--                              v-for="item in reportDialogState.allRoomList"-->
<!--                              :key="item.id"-->
<!--                              :value="item.id"-->
<!--                              :label="item.siteName"-->
<!--                          >-->
<!--                          </el-option>-->
<!--                        </el-select>-->
                        <el-input disabled v-model="item.siteName" />
                      </td>
                      <td class="w-14">
                        <el-input disabled v-model="item.floor" />
                      </td>
                      <td class="w-14">
                        <el-input disabled v-model="item.room" />
                      </td>
                      <td class="w-14">
                        <div>{{item.fireFacilities== 1 ? '有' : item.fireFacilities== 2 ? '无' : ''}}</div>
                      </td>
                      <td class="w-14">
                        <div>{{item.partitionStatus == 1 ? '有' : item.partitionStatus == 2 ? '无' : ''}}</div>
                      </td>
                      <td class="w-14">
                        <div>{{item.siteType}}</div>
                      </td>
                    </tr>
                    <tr>
                      <td class="w-25 m-color required">评估人</td>
                      <td class="w-75 m-color">
<!--                        <el-select style="width: 100%" :disabled="reportDialogState.disabled" v-model="reportDialogState.reportForm.assessPerson" clearable filterable>-->
<!--                          <el-option-->
<!--                              v-for="item in reportDialogState.allPersonList"-->
<!--                              :key="item.id"-->
<!--                              :value="item.id"-->
<!--                              :label="item.personName"-->
<!--                          ></el-option>-->
<!--                        </el-select>-->
                        <el-input :disabled="reportDialogState.disabled" v-model="reportDialogState.reportForm.assessPerson" placeholder="评估人" />
                      </td>
<!--                      <td class="w-25 m-color required">评估时间</td>-->
<!--                      <td class="w-25 m-color">-->
<!--                        <el-date-picker :disabled="reportDialogState.disabled"  type="datetime" format="YYYY/MM/DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" v-model="reportDialogState.reportForm.assessTime" />-->
<!--                      </td>-->
                    </tr>
                    <tr class="m-color b-font" style="text-align: center">实验概况</tr>
                    <tr>
                        <el-input type="textarea" :autosize="{ minRows: 3}" disabled v-model="reportDialogState.reportForm.experimentDesc" placeholder="(简要描述实验原理、实验步骤、所用试剂或材料设备等)" />
                    </tr>
                    <tr class="m-color b-font" style="text-align: center">实验涉及的危险源</tr>
                    <tr>
                      <td class="w-25 m-color">危险源种类</td>
                      <td class="w-75 m-color">
<!--                        <el-radio-group disabled v-model="reportDialogState.reportForm.dangerSource">-->
<!--                          <el-radio :label="1">化学安全</el-radio>-->
<!--                          <el-radio :label="2">辐射安全</el-radio>-->
<!--                          <el-radio :label="3">特种设备安全</el-radio>-->
<!--                          <el-radio :label="4">机电安全</el-radio>-->
<!--                          <el-radio :label="5">电气安全</el-radio>-->
<!--                          <el-radio :label="6">生物安全</el-radio>-->
<!--                          <el-radio :label="7">激光安全</el-radio>-->
<!--                          <el-radio :label="8">其他安全</el-radio>-->
<!--                        </el-radio-group>-->
                        <el-checkbox-group disabled>
                          <el-checkbox v-for="item in reportDialogState.reportForm.riskSourceType" :label="item.riskSourceType" :checked="item.status==1?true:false"/>
                        </el-checkbox-group>
                      </td>
                    </tr>
                    <select-danger ref="selectDangerRef" v-model:data="reportDialogState.reportForm.riskSource" v-model:disabled="reportDialogState.disabled"></select-danger>
                    <tr class="m-color b-font required" style="text-align: center">安全风险分析(总结)</tr>
                    <tr>
                      <el-input type="textarea" :autosize="{ minRows: 3}" :disabled="reportDialogState.disabled" v-model="reportDialogState.reportForm.safeRiskAnalysis" placeholder="1.实验过程中是否有爆炸、火灾、腐蚀、中毒风险、产生危险废弃物等(根据危险源清单,分析实验过程中可能对人身安全、人体健康、实验室环境和周边环境等带来的负面影响)" />
                    </tr>
                    <tr class="m-color b-font" style="text-align: center">拟采取的防护和应急措施</tr>
                    <tr>
                      <el-input type="textarea" :autosize="{ minRows: 3}" disabled v-model="reportDialogState.reportForm.emergencyMeasure" placeholder="" />
                    </tr>
                    <tr class="m-color b-font required" style="text-align: center">实验和实验项目综合风险等级评定</tr>
                    <tr>
                      <td class="m-color" style="width: 100%">
                        <el-radio-group :disabled="reportDialogState.disabled"  v-model="reportDialogState.reportForm.assessLevel">
                          <el-radio :label="1">低风险(一级)</el-radio>
                          <el-radio :label="2">一般风险(二级)</el-radio>
                          <el-radio :label="3">较大风险(三级)</el-radio>
                          <el-radio :label="4">重大风险(四级)</el-radio>
                        </el-radio-group>
                      </td>
                    </tr>
                    <tr>
                      <el-input type="textarea" :autosize="{ minRows: 3}" :disabled="reportDialogState.disabled" v-model="reportDialogState.reportForm.description" placeholder="评定依据(必填)" />
                    </tr>
                    <tr v-if="reportDialogState.reportForm.person?.length>0" class="m-color b-font" style="text-align: center">审批内容</tr>
                    <template v-if="reportDialogState.reportForm.person?.length>0" v-for="item in reportDialogState.reportForm.person">
                      <tr>
                        <td class="w-25 m-color">{{item.approveStage}}</td>
                        <td class="w-25">{{item.approvePerson}}</td>
                        <td class="w-25 m-color">审批结果</td>
                        <td class="w-25">{{item.approveStatus==1?'未审批':item.approveStatus==2?'通过':'未通过'}}</td>
                      </tr>
                      <tr>
                        <td class="w-25 m-color autoheight">审批意见</td>
                        <td class="w-75 autoheight l-border">
                          {{ item.approveDesc }}
                        </td>
                      </tr>
                    </template>
                </table>
            </el-form>
            <template #footer>
              <span class="dialog-footer" style="padding-top:10px;text-align: center !important;">
                <el-button @click="reportDialogState.reportDialogVisible = !reportDialogState.reportDialogVisible" size="default">取 消</el-button>
                <el-button type="primary" v-if="!reportDialogState.disabled" @click="onSubmitProject()" size="default">提交审批</el-button>
              </span>
            </template>
        </el-dialog>
    </div>
</template>
<script setup lang="ts">
import {defineAsyncComponent, nextTick, onMounted, reactive, ref} from "vue";
import {ElMessage} from "element-plus";
import {projectApi} from "/@/api/experiment/project";
import {personApi} from "/@/api/basic/person";
import {userApi} from "/@/api/systemManage/user";
import {roomApi} from "/@/api/basic/room";
import {assessApplyApi} from "/@/api/analyse/assessApply";
const SelectDanger = defineAsyncComponent(() => import('./selectDanger.vue'))
const selectDangerRef = ref()
const reportFormRef = ref()
const reportDialogState = reactive<ReportDialogType>({
    title: '',
    disabled: false,
    reportDialogVisible: false,
    reportForm: {
        id: null,
        experimentName: "",
        experimentType: null,
        personUser: '',
        personUserId: null,
        personUserPhone: '',
        safePersonUserId: null,
        safePersonUser: '',
        safePersonUserPhone: '',
        dep: "",
        experimentSite: [],
        experimentDesc: '',
        emergencyMeasure: '',
        assessPerson:'',
        safeRiskAnalysis: '',
        assessLevel:null,
        riskSource: [],
        riskSourceType: [],
        description: '',
        person: []
    },
    reportFormRules: {
      assessPerson: [{ required: true, message: '请填写评估人员', trigger: 'blur' }],
      safeRiskAnalysis: [{ required: true, message: '请填写安全风险分析', trigger: 'blur' }],
      assessLevel: [{ required: true, message: '请选择风险等级评定', trigger: 'blur' }],
      description: [{ required: true, message: '请填写风险等级评定依据', trigger: 'blur' }],
    },
    allPersonList: [],
    allRoomList: [],
    systemPersonList: [],
    experimentTypeList: [
      {id: 1, name: '化学类'},
      {id: 2, name: '生物类'},
      {id: 3, name: '辐射类'},
      {id: 4, name: '机电类'},
      {id: 5, name: '特种设备类'},
      {id: 6, name: '其它类'}
    ]
})
const showReportDialog = (title: string, value: ProjectType, allRoomList: RoomType []) => {
    getReportData(value.experimentId)
    reportDialogState.reportDialogVisible = true;
    reportDialogState.allRoomList = allRoomList
    setTimeout(() => {
        reportFormRef.value.clearValidate();
    });
    if(title === '提交'){
      reportDialogState.title = '提交报告';
      reportDialogState.disabled = false
      // for(let i in reportDialogState.reportForm) {
      //   if(isValidKey(i, reportDialogState.reportForm)) {
      //     reportDialogState.reportForm[i] = value[i];
      //   }
      // }
    }else if(title === '修改'){
      reportDialogState.title = '修改报告';
      reportDialogState.disabled = false
    }else{
        reportDialogState.title = '查看';
        reportDialogState.disabled = true
        // for(let i in reportDialogState.reportForm) {
        //     if(isValidKey(i, reportDialogState.reportForm)) {
        //         reportDialogState.reportForm[i] = value[i];
        //     }
        // }
    }
};
const isValidKey = (key: string | number | symbol, object:object): key is keyof typeof object =>{
    return key in object;
};
const getReportData = async (id:number|null|undefined) => {
  let res = await assessApplyApi().getRiskReportPage({
    experimentId: id,
    pageIndex: 1,
    pageSize: 10,
    tag: 3
  });
  if(res.data.code === 100){
    for(let i in reportDialogState.reportForm) {
      if(isValidKey(i, reportDialogState.reportForm)) {
        reportDialogState.reportForm[i] = res.data.data[0][i];
      }
    }
    console.log(reportDialogState.reportForm,'reportDialogState.reportForm')
  }else{
    ElMessage({
      type: 'warning',
      message: res.data.msg
    });
  }
};
// const getLiabilityUserPhone = (value: number)=>{
//   const data = reportDialogState.systemPersonList.find(item => item.id === value) as AllPersonListType
//   reportDialogState.reportForm.liabilityUserPhone = data.phone
// }
//
// const getSafeLiabilityUserPhone = (value: number)=>{
//   const data = reportDialogState.allPersonList.find(item => item.id === value) as AllPersonListType
//   reportDialogState.reportForm.safeLiabilityUserPhone = data.phone
// }
// const hasSafeSystem = (value: number) =>{
//   if(value == 2){
//     reportDialogState.reportForm.safeInformationSystem = ''
//   }
// }
const onSubmitProject = () => {
    reportFormRef.value.validate(async(valid: boolean) => {
        if(valid){
          const { id,assessPerson,safeRiskAnalysis,assessLevel,description } = reportDialogState.reportForm
          const data = { id,assessPerson,safeRiskAnalysis,assessLevel,description }
            if(reportDialogState.title === '提交报告'){
                let res = await assessApplyApi().updateRiskReport(data);
                if(res.data.code === 100){
                    emit('refresh')
                    reportDialogState.reportDialogVisible = false;
                    ElMessage({
                        type: 'success',
                        message: '提交报告成功'
                    })
                }else{
                    ElMessage({
                        type: 'warning',
                        message: res.data.msg,
                    });
                }
            }else{
                let res = await assessApplyApi().updateRiskReportInfo(data)
                if(res.data.code === 100){
                  emit('refresh')
                  reportDialogState.reportDialogVisible = false;
                  ElMessage({
                    type: 'success',
                    message: '修改报告成功'
                  })
                }else{
                  ElMessage({
                    type: 'warning',
                    message: res.data.msg,
                  });
                }
            }
        }else{
            ElMessage({
                type: 'warning',
                message: '请完善基本信息',
            });
        }
    })
};
const getPersonList = async () => {
    let res = await userApi().getUserList({
        roleId: 1,
        usePage: false,
        pageIndex: 1,
        pageSize: 10
    });
    if(res.data.code === 100){
        reportDialogState.systemPersonList = JSON.parse(JSON.stringify(res.data.data));
    }else{
        ElMessage({
            type: 'warning',
            message: res.data.msg
        })
    }
};
const getAllPersonList = async () => {
    let res = await personApi().getAllPerson();
    if(res.data.code === 100){
        reportDialogState.allPersonList = JSON.parse(JSON.stringify(res.data.data));
    }else{
        ElMessage({
            type: 'warning',
            message: res.data.msg
        })
    }
};
const emit = defineEmits(['refresh']);
defineExpose({
    showReportDialog,
});
onMounted(() => {
    getAllPersonList();
    getPersonList()
});
</script>
<style scoped lang="scss">
.site-layout-background {
    background: #fff;
}
.report-table {
    width: 100%;
    border-collapse: collapse;
    border: 1px solid #337ecc;
    margin: 20px 0;
th {
    padding: 10px 0;
    border: 1px solid #337ecc;
    border-left: none;
}
tr {
    width: 100%;
    height: 44px;
    line-height: 42px;
    border-bottom: 1px solid #ccc;
  &.required {
    &::before {
      content: "*";
      display: inline-block;
      color: red;
    }
  }
&:last-of-type {
     border-bottom: none;
 }
  td {
      border-right: 1px solid #ccc;
      display: inline-block;
      height: 44px;
      vertical-align: middle;
      text-align: center;
      line-height: 42px;
    :deep(.el-input__wrapper ){
      box-shadow: none;
      margin-top: 6px;
    }
    &:last-of-type {
         border-right: none;
     }
    &.required {
      &::before {
        content: "*";
        display: inline-block;
        color: red;
      }
    }
    &.w-14 {
         width: calc((100/7)/100 * 100%);
     }
    &.w-16 {
         width: calc((100/6)/100 * 100%);
     }
    &.w-18 {
         width: 16.59%;
     }
    &.w-20 {
         width: 20%;
     }
    &.w-25 {
         width: 25%;
     }
    &.w-50 {
         width: 50%;
     }
    &.w-75 {
         width: 75%;
     }
    &.autoheight {
      min-height: 44px;
      height: auto;
    }
    &.l-border{
      border-left: 1px solid #ccc;
    }
    .ant-input {
        height: 100%;
        border: none;
        background: #f5f7fa;
    }
    .ant-picker {
        width: 100%;
        height: 100%;
    }
  }
}
.b-font {
    font-size: 16px;
    font-weight: bolder;
}
}
.m-color {
    color: #0c4995;
}
.roomSelect{
  ::v-deep(.el-popper){
    .el-select-dropdown__item{
      height: auto;
      padding: 0;
      .roomTable{
        width: 100%;
        display: flex;
        border-bottom: 1px solid #ebeef5;
        &:last-of-type{
          border-bottom: none;
        }
        &>div{
          width: 25%;
          border-right: 1px dashed #ebeef5;
          &:last-of-type{
            border-right: none;
          }
          div{
            width: 100%;
          }
          .roomTit{
            border-bottom: 1px solid #ebeef5;
          }
        }
      }
    }
    .el-select-dropdown__item.selected{
      .roomTit{
        color: #606266;
        font-weight: normal;
      }
    }
  }
}
:deep(.el-dialog__footer){
    padding-top: 20px;
    display: flex;
    justify-content: center;
}
</style>
src/views/analyse/applyReview/components/selectDanger.vue
对比新文件
@@ -0,0 +1,191 @@
<template>
    <tr class="m-color b-font" style="text-align: center">主要危险源或有害因素</tr>
    <tr>
        <td class="w-20 m-color">序号</td>
        <td class="w-20 m-color">危险源或有害因素</td>
        <td class="w-20 m-color">危险特性</td>
        <td class="w-20 m-color">数量</td>
        <td class="w-20 m-color">其他说明</td>
<!--        <td class="w-18 m-color">操作</td>-->
    </tr>
    <tr v-for="(item,index) in dangerSourceState.dangerList" :key="index">
        <td class="w-20">
            {{ index + 1 }}
        </td>
        <td class="w-20">
          <el-input disabled v-model="item.riskSource"></el-input>
        </td>
        <td class="w-20">
          <el-input disabled v-model="item.riskCharacteristic"></el-input>
        </td>
        <td class="w-20">
            <el-input disabled type="number" v-model="item.number"></el-input>
        </td>
        <td class="w-20">
          <el-input disabled v-model="item.description"></el-input>
        </td>
<!--        <td class="w-18">-->
<!--            <el-button disabled type="danger" @click="deleteDangerItem(index)">删除</el-button>-->
<!--        </td>-->
    </tr>
<!--    <tr style="text-align: center">-->
<!--        <el-button :disabled="dangerSourceState.disabled" type="primary" shape="round" @click="addDangerItem()">-->
<!--            添加行-->
<!--        </el-button>-->
<!--    </tr>-->
</template>
<script setup lang="ts">
import {reactive, watchEffect} from "vue";
let props = defineProps({
    disabled: Boolean,
    data: Array<DangerListType>
});
const dangerSourceState = reactive<DangerSourceType>({
    disabled: false,
    dangerList: [],
    classifyList:[
        {id:1, name: '有机'},
        {id:2, name: '酸'},
        {id:3, name: '碱性'},
        {id:4, name: '固体废弃物'},
        {id:5, name: '医疗废弃物'},
        {id:6, name: '过期化学品'},
        {id:7, name: '其他'}
    ],
    wasteStorageList: [
        {id:1, name: '吨袋'},
        {id:2, name: '吨桶'},
        {id:3, name: '小桶'},
        {id:4, name: '托盘'},
        {id:5, name: '其他'},
    ]
})
watchEffect(() => {
    dangerSourceState.dangerList = props.data as Array<DangerListType>
    dangerSourceState.disabled = props.disabled
});
const addDangerItem = () => {
    dangerSourceState.dangerList.push({riskSource: '', riskCharacteristic: '', number: null, description: ''});
};
const deleteDangerItem = (index: number) => {
    dangerSourceState.dangerList.splice(index,1);
};
const formatList = (formatList: Array<DangerListType>) => {
    dangerSourceState.dangerList = formatList
}
defineExpose({
    formatList,
    dataList: dangerSourceState.dangerList,
});
</script>
<style scoped lang="scss">
.site-layout-background {
    background: #fff;
}
.report-table {
    width: 100%;
    border-collapse: collapse;
    border: 1px solid #337ecc;
    margin: 20px 0;
    th {
        padding: 10px 0;
        border: 1px solid #337ecc;
        border-left: none;
    }
    tr {
        width: 100%;
        height: 44px;
        line-height: 42px;
        border-bottom: 1px solid #ccc;
        &:last-of-type {
            border-bottom: none;
        }
        td {
            border-right: 1px solid #ccc;
            display: inline-block;
            height: 44px;
            vertical-align: middle;
            text-align: center;
            line-height: 42px;
            &:last-of-type {
                border-right: none;
            }
            &.required {
              &::before {
                content: "*";
                display: inline-block;
                color: red;
              }
            }
            &.w-14 {
                width: calc((100/7)/100 * 100%);
            }
            &.w-16 {
                width: calc((100/6)/100 * 100%);
            }
            &.w-18 {
                width: 16.59%;
            }
            &.w-20 {
                width: 20%;
            }
            &.w-25 {
                width: 25%;
            }
            &.w-50 {
                width: 50%;
            }
            &.w-75 {
                width: 75%;
            }
            .ant-input {
                height: 100%;
                border: none;
                background: #f5f7fa;
            }
            .ant-picker {
                width: 100%;
                height: 100%;
            }
        }
    }
    .b-font {
        font-size: 16px;
        font-weight: bolder;
    }
}
.m-color {
    color: #0c4995;
}
:deep(.el-input__wrapper ){
    box-shadow: none;
}
</style>
src/views/analyse/applyReview/index.ts
对比新文件
@@ -0,0 +1,22 @@
declare interface reportReviewStateType {
    developData?: Array<ProjectType>
    searchQuery: {
        pageIndex: number | null,
        pageSize: number | null,
        tag: number | null,
        experimentName: string,
        experimentType: null | number,
    },
    total: 0,
    experimentTypeList: Type []
    allRoomList: RoomType [],
    reviewDialogVisible: boolean,
    reviewForm:{
        id: number | null
        approveStatus: null | number
        approveDesc: string
    },
    rules:object,
    isManage: boolean
    isLeader: boolean
}
src/views/analyse/applyReview/index.vue
对比新文件
@@ -0,0 +1,375 @@
<template>
    <div class="home-container">
        <div style="height: 100%">
            <el-row class="homeCard">
                <div class="basic-line">
                    <span>实验名称:</span>
                    <el-input v-model="developState.searchQuery.experimentName" clearable filterable class="input-box" placeholder="实验名称">
                    </el-input>
                </div>
<!--                <div class="basic-line">-->
<!--                    <span>实验类型:</span>-->
<!--                    <el-select v-model="developState.searchQuery.experimentType" clearable filterable class="input-box" placeholder="实验类型">-->
<!--                        <el-option v-for="item in developState.experimentTypeList" :key="item.id" :label="item.name" :value="item.id"></el-option>-->
<!--                    </el-select>-->
<!--                </div>-->
                <div style="padding-bottom: 10px">
                    <el-button type="primary" @click="getReportData">查询</el-button>
                    <el-button plain @click="reset">重置</el-button>
                </div>
            </el-row>
            <div class="homeCard">
                <div class="main-card">
                    <el-row class="cardTop">
                    </el-row>
                    <el-table ref="multipleTableRef" :data="developState.developData" style="width: 100%" height="calc(100% - 100px)" :header-cell-style="{ background: '#fafafa' }">
                        <el-table-column prop="experimentCode" label="实验编号"/>
                        <el-table-column prop="experimentName" label="实验名称"/>
                        <el-table-column prop="createExperimentTime" label="评价时间">
                          <template #default="scope">
                            <span>{{scope.row.evaluateTime?scope.row.evaluateTime.substring(0,16):'--'}}</span>
                          </template>
                        </el-table-column>
                        <el-table-column prop="startTime" label="报告提交时间" show-overflow-tooltip>
                          <template #default="scope">
                            <span>{{scope.row.updateTime?scope.row.updateTime.substring(0,16):'--'}}</span>
                          </template>
                        </el-table-column>
<!--                        <el-table-column prop="experimentSite" label="实验场所" show-overflow-tooltip>-->
<!--                          <template #default="scope">-->
<!--                            <span>{{scope.row.experimentSite?.map(i=>i.siteName).join(',')}}</span>-->
<!--                          </template>-->
<!--                        </el-table-column>-->
<!--                        <el-table-column prop="experimentType" label="实验类别">-->
<!--                          <template #default="scope">-->
<!--                            <span>{{developState.experimentTypeList.find(i=>i.id == scope.row.experimentType)?.name}}</span>-->
<!--                          </template>-->
<!--                        </el-table-column>-->
                        <el-table-column label="操作" width="250" fixed="right">
                            <template #default="scope">
                                <el-button size="small" text type="primary" v-if="(developState.isManage == true && !scope.row.person?.find(i=>i.approveIndex == 1))||(developState.isLeader == true && !scope.row.person?.find(i=>i.approveIndex == 2))" :icon="Edit" @click="openRiskDialog(scope.row)">审批</el-button>
                                <el-button size="small" text type="primary" :icon="Edit" @click="openReportDialog('查看',scope.row)">查看评估报告</el-button>
                            </template>
                        </el-table-column>
                    </el-table>
                    <div class="pageBtn">
                        <el-pagination @size-change="onHandleSizeChange" @current-change="onHandleCurrentChange" :pager-count="5" :page-sizes="[10, 20, 30]" v-model:current-page="developState.searchQuery.pageIndex" background v-model:page-size="developState.searchQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="developState.total" class="page-position"> </el-pagination>
                    </div>
                </div>
            </div>
        </div>
        <report-dialog ref="ReportDialogRef" @refresh="getReportData"></report-dialog>
        <el-dialog title="报告审批" v-model="developState.reviewDialogVisible" width="50%">
          <el-form ref="ruleFormRef" :rules="developState.rules" :model="developState.reviewForm" label-width="120px">
            <el-form-item label="审批结果" prop="approveStatus">
              <el-radio-group style="text-align: center" v-model="developState.reviewForm.approveStatus">
                  <el-radio :label="2">通过</el-radio>
                  <el-radio :label="3">不通过</el-radio>
              </el-radio-group>
            </el-form-item>
            <el-form-item label="意见填报" prop="approveDesc">
              <el-input v-model="developState.reviewForm.approveDesc" type="textarea" :autosize="{ minRows: 3 }" />
            </el-form-item>
          </el-form>
          <template #footer>
              <span class="dialog-footer" style="padding-top:10px;text-align: center !important;">
                <el-button @click="developState.reviewDialogVisible = !developState.reviewDialogVisible" size="default">取 消</el-button>
                <el-button type="primary" @click="onSubmitReview(ruleFormRef)" size="default">提交审批</el-button>
              </span>
          </template>
        </el-dialog>
    </div>
</template>
<script setup lang="ts">
import {defineAsyncComponent, onMounted, reactive, ref} from "vue";
import {projectApi} from "/@/api/experiment/project";
import {ElMessage, ElMessageBox} from "element-plus";
import type { FormInstance, FormRules } from 'element-plus'
import { View,Edit, Plus, RefreshLeft } from '@element-plus/icons-vue';
import {roomApi} from "/@/api/basic/room";
import {assessApplyApi} from "/@/api/analyse/assessApply";
import {useUserInfo} from "/@/stores/userInfo";
import {storeToRefs} from "pinia";
const userInfo = useUserInfo();
const { userInfos } = storeToRefs(userInfo);
const ReportDialog = defineAsyncComponent(() => import('./components/reportDialog.vue'));
const ReportDialogRef = ref();
const ruleFormRef = ref<FormInstance>()
const developState = reactive<reportReviewStateType>({
    developData: [],
    searchQuery: {
        pageIndex: 1,
        pageSize: 10,
        experimentName: '',
        experimentType: null,
        tag: 2
    },
    total: 0,
    experimentTypeList: [
        {id: 1, name: '化学类'},
        {id: 2, name: '生物类'},
        {id: 3, name: '辐射类'},
        {id: 4, name: '机电类'},
        {id: 5, name: '特种设备类'},
        {id: 6, name: '其它类'},
    ],
    allRoomList: [],
    reviewDialogVisible: false,
    reviewForm:{
      id: null,
      approveStatus: null,
      approveDesc: ''
    },
    isManage: false,
    isLeader: false,
    rules: {
      approveDesc: [{ required: true, message: '请输入审批意见', trigger: 'blur' }],
      approveStatus: [{ required: true, message: '请选择审批结果', trigger: 'blur' }]
    }
})
const getReportData = async () => {
    let res = await assessApplyApi().getRiskReportPage(developState.searchQuery);
    if(res.data.code === 100){
        developState.developData = res.data.data;
        developState.total = res.data.total;
    }else{
        ElMessage({
            type: 'warning',
            message: res.data.msg
        });
    }
};
const getAllRoom = async () => {
  let res = await roomApi().getAllRoom();
  if(res.data.code === 100){
    developState.allRoomList = JSON.parse(JSON.stringify(res.data.data));
  }else{
    ElMessage({
      type: 'warning',
      message: res.data.msg
    })
  }
};
const openReportDialog = (title: string,value: ProjectType) =>{
  ReportDialogRef.value.showReportDialog(title, value, developState.allRoomList);
}
const onSubmitReview = async (formEl: FormInstance | undefined) => {
  if (!formEl) return
  await formEl.validate(async(valid, fields) => {
    if (valid) {
      let res = await assessApplyApi().uploadReport(developState.reviewForm);
      if(res.data.code === 100){
        ElMessage({
          type: 'success',
          message: '审批提交成功'
        });
      }else{
        ElMessage({
          type: 'warning',
          message: res.data.msg
        });
      }
      developState.reviewForm = {
        id: null,
        approveStatus: null,
        approveDesc: ''
      },
      developState.reviewDialogVisible = false
      getReportData()
    } else {
      console.log('error submit!', fields)
    }
  })
}
const openRiskDialog = (val)=>{
  developState.reviewForm.id = val.id
  developState.reviewDialogVisible = true
}
const onHandleSizeChange = (val: number) => {
    developState.searchQuery.pageSize = val;
    getReportData();
};
const onHandleCurrentChange = (val: number) => {
    developState.searchQuery.pageIndex = val;
    getReportData();
};
const reset = () => {
    developState.searchQuery = {
      pageIndex: 1,
      pageSize: 10,
      experimentName: '',
      experimentType: null,
      tag: 2
    }
};
onMounted(() => {
    getReportData()
    getAllRoom()
    if(userInfos.value.roles?.find(i=>i.roleId == '4')){
      developState.isManage = true
    }
    if(userInfos.value.roles?.find(i=>i.roleId == '6')){
      developState.isLeader = true
    }
    console.log(developState.isManage,userInfos.value.roles)
})
</script>
<style scoped lang="scss">
$homeNavLengh: 8;
.home-container {
    height: calc(100vh - 144px);
    box-sizing: border-box;
    overflow: hidden;
    .homeCard {
        width: 100%;
        padding: 20px;
        box-sizing: border-box;
        background: #fff;
        border-radius: 4px;
        .main-card {
            width: 100%;
            height: 100%;
            .cardTop {
                display: flex;
                align-items: center;
                justify-content: space-between;
                margin-bottom: 20px;
                .mainCardBtn {
                    margin: 0;
                }
            }
            .pageBtn {
                height: 60px;
                display: flex;
                align-items: center;
                justify-content: right;
                .demo-pagination-block + .demo-pagination-block {
                    margin-top: 10px;
                }
                .demo-pagination-block .demonstration {
                    margin-bottom: 16px;
                }
            }
        }
        &:last-of-type {
            height: calc(100% - 100px);
        }
    }
    .el-row {
        display: flex;
        align-items: center;
        margin-bottom: 20px;
        &:last-child {
            margin-bottom: 0;
        }
        .grid-content {
            align-items: center;
            min-height: 36px;
        }
        .topInfo {
            display: flex;
            align-items: center;
            font-size: 16px;
            font-weight: bold;
            & > div {
                white-space: nowrap;
                margin-right: 20px;
            }
        }
    }
}
.stepItem {
    width: 100%;
    display: flex;
    align-items: flex-start;
    margin-bottom: 30px;
    margin-left: 30px;
    padding-bottom: 30px;
    border-left: 2px solid #ccc;
    &:first-of-type {
        margin-top: 30px;
    }
    &:last-of-type {
        margin-bottom: 0;
        border-left: none;
    }
    .stepNum {
        width: 30px;
        height: 30px;
        border-radius: 15px;
        box-sizing: border-box;
        color: #333;
        border: 1px solid #999;
        line-height: 28px;
        text-align: center;
        margin-right: 10px;
        margin-left: -16px;
        margin-top: -30px;
    }
    .stepCard {
        width: 100%;
        margin-top: -30px;
        .box-card {
            width: 100%;
            &:deep(.el-card__header) {
                padding: 10px 15px;
            }
            .card-header {
                width: 100%;
                display: flex;
                justify-content: space-between;
                align-items: center;
                & > div:first-of-type {
                    margin-right: 80px;
                    font-size: 18px;
                    font-weight: bold;
                }
            }
        }
    }
    &:hover .card-header {
        color: #0098f5;
    }
    &:hover .stepNum {
        border: 2px solid #0098f5;
        color: #0098f5;
    }
}
:deep(.el-date-editor) {
    width: 100%;
}
.el-select {
    width: 100%;
}
:deep(.el-textarea.is-disabled .el-textarea__inner) {
    background-color: var(--el-card-bg-color);
    color: var(--el-input-text-color, var(--el-text-color-regular));
}
:deep(.el-input.is-disabled .el-input__inner) {
    color: var(--el-input-text-color, var(--el-text-color-regular));
}
:deep(.el-input.is-disabled .el-input__wrapper) {
    background-color: var(--el-card-bg-color);
    box-shadow: none;
}
</style>
src/views/analyse/assessApply/components/reportDialog.vue
@@ -1,11 +1,12 @@
<template>
    <div class="system-menu-dialog-container">
        <el-dialog :title="reportDialogState.title" v-model="reportDialogState.reportDialogVisible" width="80%">
          <div style="text-align: center;font-size: 20px;font-weight: bolder;color: #0c4995">{{reportDialogState.reportForm.experimentName}}实验安全风险评估报告表(带<span style="color: red">*</span>为填写内容)</div>
            <el-form ref="reportFormRef" :rules="reportDialogState.reportFormRules" :model="reportDialogState.reportForm" size="default" label-width="0">
                <table class="report-table">
                    <th class="m-color b-font" style="text-align: center">实验基本信息</th>
                    <tr>
                        <td class="w-25 m-color required">实验名称</td>
                        <td class="w-25 m-color">实验名称</td>
                        <td class="w-75 m-color">
                            <el-form-item prop="experimentName">
                                <el-input readonly v-model="reportDialogState.reportForm.experimentName" placeholder="请输入实验名称" />
@@ -13,79 +14,82 @@
                        </td>
                    </tr>
                    <tr>
                        <td class="w-25 m-color required">实验类型</td>
                        <td class="w-75 m-color">
                            <el-radio-group style="text-align: center" disabled v-model="reportDialogState.reportForm.experimentType">
                                <el-radio :label="1">化学类</el-radio>
                                <el-radio :label="2">生物类</el-radio>
                                <el-radio :label="3">辐射类</el-radio>
                                <el-radio :label="4">机电类</el-radio>
                                <el-radio :label="5">特种设备类</el-radio>
                                <el-radio :label="6">其他类</el-radio>
                            </el-radio-group>
                        <td class="w-25 m-color">实验类型</td>
                        <td class="w-75" style="text-align: left;padding-left: 11px">
<!--                            <el-radio-group style="text-align: center" disabled v-model="reportDialogState.reportForm.experimentType">-->
<!--                                <el-radio :label="1">化学类</el-radio>-->
<!--                                <el-radio :label="2">生物类</el-radio>-->
<!--                                <el-radio :label="3">辐射类</el-radio>-->
<!--                                <el-radio :label="4">机电类</el-radio>-->
<!--                                <el-radio :label="5">特种设备类</el-radio>-->
<!--                                <el-radio :label="6">其他类</el-radio>-->
<!--                            </el-radio-group>-->
                            {{reportDialogState.experimentTypeList.find(i=>i.id === reportDialogState.reportForm.experimentType)?.name}}
                        </td>
                    </tr>
                    <tr>
                      <td class="w-25 m-color required">负责人</td>
                      <td class="w-25 m-color">负责人</td>
                      <td class="w-25 m-color">
                        <el-select style="width: 100%" disabled v-model="reportDialogState.reportForm.liabilityUserId" clearable filterable @change="getLiabilityUserPhone($event)">
                          <el-option
                              v-for="item in reportDialogState.systemPersonList"
                              :key="item.id"
                              :value="item.id"
                              :label="item.realName"
                          ></el-option>
                        </el-select>
<!--                        <el-select style="width: 100%" disabled v-model="reportDialogState.reportForm.liabilityUserId" clearable filterable @change="getLiabilityUserPhone($event)">-->
<!--                          <el-option-->
<!--                              v-for="item in reportDialogState.systemPersonList"-->
<!--                              :key="item.id"-->
<!--                              :value="item.id"-->
<!--                              :label="item.realName"-->
<!--                          ></el-option>-->
<!--                        </el-select>-->
                        <el-input readonly v-model="reportDialogState.reportForm.personUser" />
                      </td>
                      <td class="w-25 m-color required">电话</td>
                      <td class="w-25 m-color">电话</td>
                      <td class="w-25 m-color">
                        <el-input readonly v-model="reportDialogState.reportForm.liabilityUserPhone" />
                        <el-input disabled v-model="reportDialogState.reportForm.personUserPhone" />
                      </td>
                    </tr>
                    <tr>
                      <td class="w-25 m-color required">安全负责人</td>
                      <td class="w-25 m-color">安全负责人</td>
                      <td class="w-25 m-color">
                        <el-select v-if="reportDialogState.reportForm.safeLiabilityUserId" style="width: 100%" disabled v-model="reportDialogState.reportForm.safeLiabilityUserId" @change="getSafeLiabilityUserPhone($event)" clearable filterable>
                          <el-option
                              v-for="item in reportDialogState.allPersonList"
                              :key="item.id"
                              :value="item.id"
                              :label="item.personName"
                          ></el-option>
                        </el-select>
                        <el-input v-else disabled v-model="reportDialogState.reportForm.safeLiabilityUser" />
<!--                        <el-select v-if="reportDialogState.reportForm.safeLiabilityUserId" style="width: 100%" disabled v-model="reportDialogState.reportForm.safeLiabilityUserId" @change="getSafeLiabilityUserPhone($event)" clearable filterable>-->
<!--                          <el-option-->
<!--                              v-for="item in reportDialogState.allPersonList"-->
<!--                              :key="item.id"-->
<!--                              :value="item.id"-->
<!--                              :label="item.personName"-->
<!--                          ></el-option>-->
<!--                        </el-select>-->
                        <el-input disabled v-model="reportDialogState.reportForm.safePersonUser" />
                      </td>
                      <td class="w-25 m-color required">电话</td>
                      <td class="w-25 m-color">电话</td>
                      <td class="w-25 m-color">
                        <el-input readonly v-model="reportDialogState.reportForm.safeLiabilityUserPhone" />
                        <el-input readonly v-model="reportDialogState.reportForm.safePersonUserPhone" />
                      </td>
                    </tr>
                    <tr>
                      <td class="w-25 m-color required">部门</td>
                      <td class="w-25 m-color">部门</td>
                      <td class="w-75 m-color">
                        <el-input readonly v-model="reportDialogState.reportForm.dep" />
                      </td>
                    </tr>
                    <tr class="m-color b-font" style="text-align: center">实验场所</tr>
                    <tr>
                      <td class="w-14 m-color required">场所名称</td>
                      <td class="w-14 m-color">场所名称</td>
                      <td class="w-14 m-color">所在楼栋</td>
                      <td class="w-14 m-color">房间</td>
                      <td class="w-14 m-color">有无消防设施</td>
                      <td class="w-14 m-color">有无隔断</td>
                      <td class="w-14 m-color">场所性质</td>
                    </tr>
                    <tr v-for="(item,index) in reportDialogState.reportForm.siteList" :key="index">
                    <tr v-for="(item,index) in reportDialogState.reportForm.experimentSite" :key="index">
                      <td class="w-14">
                        <el-select disabled filterable v-model="item.siteId">
                          <el-option
                              v-for="item in reportDialogState.allRoomList"
                              :key="item.id"
                              :value="item.id"
                              :label="item.siteName"
                          >
                          </el-option>
                        </el-select>
<!--                        <el-select disabled filterable v-model="item.siteId">-->
<!--                          <el-option-->
<!--                              v-for="item in reportDialogState.allRoomList"-->
<!--                              :key="item.id"-->
<!--                              :value="item.id"-->
<!--                              :label="item.siteName"-->
<!--                          >-->
<!--                          </el-option>-->
<!--                        </el-select>-->
                        <el-input disabled v-model="item.siteName" />
                      </td>
                      <td class="w-14">
                        <el-input disabled v-model="item.floor" />
@@ -105,71 +109,75 @@
                    </tr>
                    <tr>
                      <td class="w-25 m-color required">评估人</td>
                      <td class="w-25 m-color">
                        <el-select style="width: 100%" :disabled="reportDialogState.disabled" v-model="reportDialogState.reportForm.assessUserId" clearable filterable>
                          <el-option
                              v-for="item in reportDialogState.allPersonList"
                              :key="item.id"
                              :value="item.id"
                              :label="item.personName"
                          ></el-option>
                        </el-select>
                      <td class="w-75 m-color">
<!--                        <el-select style="width: 100%" :disabled="reportDialogState.disabled" v-model="reportDialogState.reportForm.assessPerson" clearable filterable>-->
<!--                          <el-option-->
<!--                              v-for="item in reportDialogState.allPersonList"-->
<!--                              :key="item.id"-->
<!--                              :value="item.id"-->
<!--                              :label="item.personName"-->
<!--                          ></el-option>-->
<!--                        </el-select>-->
                        <el-input :disabled="reportDialogState.disabled" v-model="reportDialogState.reportForm.assessPerson" placeholder="评估人" />
                      </td>
                      <td class="w-25 m-color required">评估时间</td>
                      <td class="w-25 m-color">
                        <el-date-picker :disabled="reportDialogState.disabled"  type="datetime" format="YYYY/MM/DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" v-model="reportDialogState.reportForm.assessTime" />
                      </td>
<!--                      <td class="w-25 m-color required">评估时间</td>-->
<!--                      <td class="w-25 m-color">-->
<!--                        <el-date-picker :disabled="reportDialogState.disabled"  type="datetime" format="YYYY/MM/DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" v-model="reportDialogState.reportForm.assessTime" />-->
<!--                      </td>-->
                    </tr>
                    <tr class="m-color b-font" style="text-align: center">实验概况</tr>
                    <tr>
                        <el-input type="textarea" :autosize="{ minRows: 3}" :disabled="reportDialogState.disabled" v-model="reportDialogState.reportForm.experimentDesc" placeholder="(简要描述实验原理、实验步骤、所用试剂或材料设备等)" />
                        <el-input type="textarea" :autosize="{ minRows: 3}" disabled v-model="reportDialogState.reportForm.experimentDesc" placeholder="(简要描述实验原理、实验步骤、所用试剂或材料设备等)" />
                    </tr>
                    <tr class="m-color b-font" style="text-align: center">实验涉及的危险源</tr>
                    <tr>
                      <td class="w-25 m-color required">危险源种类</td>
                      <td class="w-25 m-color">危险源种类</td>
                      <td class="w-75 m-color">
                        <el-radio-group :disabled="reportDialogState.disabled"  v-model="reportDialogState.reportForm.dangerSource">
                          <el-radio :label="1">化学安全</el-radio>
                          <el-radio :label="2">辐射安全</el-radio>
                          <el-radio :label="3">特种设备安全</el-radio>
                          <el-radio :label="4">机电安全</el-radio>
                          <el-radio :label="5">电气安全</el-radio>
                          <el-radio :label="6">生物安全</el-radio>
                          <el-radio :label="7">激光安全</el-radio>
                          <el-radio :label="8">其他安全</el-radio>
                        </el-radio-group>
<!--                        <el-radio-group disabled v-model="reportDialogState.reportForm.dangerSource">-->
<!--                          <el-radio :label="1">化学安全</el-radio>-->
<!--                          <el-radio :label="2">辐射安全</el-radio>-->
<!--                          <el-radio :label="3">特种设备安全</el-radio>-->
<!--                          <el-radio :label="4">机电安全</el-radio>-->
<!--                          <el-radio :label="5">电气安全</el-radio>-->
<!--                          <el-radio :label="6">生物安全</el-radio>-->
<!--                          <el-radio :label="7">激光安全</el-radio>-->
<!--                          <el-radio :label="8">其他安全</el-radio>-->
<!--                        </el-radio-group>-->
                        <el-checkbox-group disabled>
                          <el-checkbox v-for="item in reportDialogState.reportForm.riskSourceType" :label="item.riskSourceType" :checked="item.status==1?true:false"/>
                        </el-checkbox-group>
                      </td>
                    </tr>
                    <select-danger ref="selectDangerRef" v-model:data="reportDialogState.reportForm.riskSource" v-model:disabled="reportDialogState.disabled"></select-danger>
                    <tr class="m-color b-font" style="text-align: center">安全风险分析(总结)</tr>
                    <tr class="m-color b-font required" style="text-align: center">安全风险分析(总结)</tr>
                    <tr>
                      <el-input type="textarea" :autosize="{ minRows: 3}" :disabled="reportDialogState.disabled" v-model="reportDialogState.reportForm.safeRiskAnalysis" placeholder="1.实验过程中是否有爆炸、火灾、腐蚀、中毒风险、产生危险废弃物等(根据危险源清单,分析实验过程中可能对人身安全、人体健康、实验室环境和周边环境等带来的负面影响)" />
                    </tr>
                    <tr class="m-color b-font" style="text-align: center">拟采取的防护和应急措施</tr>
                    <tr>
                      <el-input type="textarea" :autosize="{ minRows: 3}" :disabled="reportDialogState.disabled" v-model="reportDialogState.reportForm.emergencyMeasure" placeholder="" />
                      <el-input type="textarea" :autosize="{ minRows: 3}" disabled v-model="reportDialogState.reportForm.emergencyMeasure" placeholder="" />
                    </tr>
                    <tr class="m-color b-font" style="text-align: center">实验和实验项目综合风险等级评定</tr>
                    <tr class="m-color b-font required" style="text-align: center">实验和实验项目综合风险等级评定</tr>
                    <tr>
                      <td class="m-color" style="width: 100%">
                        <el-radio-group :disabled="reportDialogState.disabled"  v-model="reportDialogState.reportForm.assessLevel">
                          <el-radio :label="4">重大风险(一级)</el-radio>
                          <el-radio :label="3">较大风险(二级)</el-radio>
                          <el-radio :label="2">一般风险(三级)</el-radio>
                          <el-radio :label="1">低风险(四级)</el-radio>
                          <el-radio :label="1">低风险(一级)</el-radio>
                          <el-radio :label="2">一般风险(二级)</el-radio>
                          <el-radio :label="3">较大风险(三级)</el-radio>
                          <el-radio :label="4">重大风险(四级)</el-radio>
                        </el-radio-group>
                      </td>
                    </tr>
                    <tr>
                      <el-input type="textarea" :autosize="{ minRows: 3}" :disabled="reportDialogState.disabled" v-model="reportDialogState.reportForm.reskLevelReason" placeholder="请输入评定依据" />
                      <el-input type="textarea" :autosize="{ minRows: 3}" :disabled="reportDialogState.disabled" v-model="reportDialogState.reportForm.description" placeholder="评定依据(必填)" />
                    </tr>
                </table>
            </el-form>
            <template #footer>
              <span class="dialog-footer" style="padding-top:10px;text-align: center !important;">
                <el-button @click="reportDialogState.reportDialogVisible = !reportDialogState.reportDialogVisible" size="default">取 消</el-button>
                <el-button type="primary" v-if="!reportDialogState.disabled" @click="onSubmitProject" size="default">提交审批</el-button>
                <el-button type="primary" v-if="!reportDialogState.disabled" @click="onSubmitProject()" size="default">提交审批</el-button>
              </span>
            </template>
        </el-dialog>
@@ -183,6 +191,7 @@
import {personApi} from "/@/api/basic/person";
import {userApi} from "/@/api/systemManage/user";
import {roomApi} from "/@/api/basic/room";
import {assessApplyApi} from "/@/api/analyse/assessApply";
const SelectDanger = defineAsyncComponent(() => import('./selectDanger.vue'))
const selectDangerRef = ref()
@@ -191,30 +200,49 @@
    title: '',
    disabled: false,
    reportDialogVisible: false,
    reportForm:   {
    reportForm: {
        id: null,
        experimentName: "",
        experimentType: null,
        liabilityUserId: null,
        liabilityUserPhone: '',
        safeLiabilityUserId: null,
        safeLiabilityUser: '',
        safeLiabilityUserPhone: '',
        personUser: '',
        personUserId: null,
        personUserPhone: '',
        safePersonUserId: null,
        safePersonUser: '',
        safePersonUserPhone: '',
        dep: "",
        siteList: [],
        experimentSite: [],
        experimentDesc: '',
        safeRiskAnalysis: '',
        emergencyMeasure: '',
        assessPerson:'',
        safeRiskAnalysis: '',
        assessLevel:null,
        riskSource: []
        riskSource: [],
        riskSourceType: [],
        description: '',
        person:[]
    },
    reportFormRules: {},
    reportFormRules: {
      assessPerson: [{ required: true, message: '请填写评估人员', trigger: 'blur' }],
      safeRiskAnalysis: [{ required: true, message: '请填写安全风险分析', trigger: 'blur' }],
      assessLevel: [{ required: true, message: '请选择风险等级评定', trigger: 'blur' }],
      description: [{ required: true, message: '请填写风险等级评定依据', trigger: 'blur' }],
    },
    allPersonList: [],
    allRoomList: [],
    systemPersonList: [],
    experimentTypeList: [
      {id: 1, name: '化学类'},
      {id: 2, name: '生物类'},
      {id: 3, name: '辐射类'},
      {id: 4, name: '机电类'},
      {id: 5, name: '特种设备类'},
      {id: 6, name: '其它类'}
    ]
})
const showReportDialog = (title: string, value: ProjectType, allRoomList: RoomType []) => {
    getReportData(value.id)
    reportDialogState.reportDialogVisible = true;
    reportDialogState.allRoomList = allRoomList
    setTimeout(() => {
@@ -223,19 +251,22 @@
    if(title === '提交'){
      reportDialogState.title = '提交报告';
      reportDialogState.disabled = false
      for(let i in reportDialogState.reportForm) {
        if(isValidKey(i, reportDialogState.reportForm)) {
          reportDialogState.reportForm[i] = value[i];
        }
      }
      // for(let i in reportDialogState.reportForm) {
      //   if(isValidKey(i, reportDialogState.reportForm)) {
      //     reportDialogState.reportForm[i] = value[i];
      //   }
      // }
    }else if(title === '修改'){
      reportDialogState.title = '修改报告';
      reportDialogState.disabled = false
    }else{
        reportDialogState.title = '查看';
        reportDialogState.disabled = true
        for(let i in reportDialogState.reportForm) {
            if(isValidKey(i, reportDialogState.reportForm)) {
                reportDialogState.reportForm[i] = value[i];
            }
        }
        // for(let i in reportDialogState.reportForm) {
        //     if(isValidKey(i, reportDialogState.reportForm)) {
        //         reportDialogState.reportForm[i] = value[i];
        //     }
        // }
    }
};
@@ -243,33 +274,85 @@
    return key in object;
};
const getLiabilityUserPhone = (value: number)=>{
  const data = reportDialogState.systemPersonList.find(item => item.id === value) as AllPersonListType
  reportDialogState.reportForm.liabilityUserPhone = data.phone
}
const getSafeLiabilityUserPhone = (value: number)=>{
  const data = reportDialogState.allPersonList.find(item => item.id === value) as AllPersonListType
  reportDialogState.reportForm.safeLiabilityUserPhone = data.phone
}
const hasSafeSystem = (value: number) =>{
  if(value == 2){
    reportDialogState.reportForm.safeInformationSystem = ''
const getReportData = async (id:number|null|undefined) => {
  let res = await assessApplyApi().getRiskReportPage({
    experimentId: id,
    pageIndex: 1,
    pageSize: 10,
    tag: 3
  });
  if(res.data.code === 100){
    reportDialogState.reportForm = {
      id: null,
      experimentName: "",
      experimentType: null,
      personUser: '',
      personUserId: null,
      personUserPhone: '',
      safePersonUserId: null,
      safePersonUser: '',
      safePersonUserPhone: '',
      dep: "",
      experimentSite: [],
      experimentDesc: '',
      emergencyMeasure: '',
      assessPerson:'',
      safeRiskAnalysis: '',
      assessLevel:null,
      riskSource: [],
      riskSourceType: [],
      description: '',
      person:[]
    }
    if(res.data.data&&res.data.data.length==0){
      ElMessage({
        type: 'warning',
        message: '暂时无法获取实验信息,可能与用户身份有关'
      });
    }else{
      for(let i in reportDialogState.reportForm) {
        if(isValidKey(i, reportDialogState.reportForm)) {
          reportDialogState.reportForm[i] = res.data.data[0][i];
        }
      }
    }
  }else{
    ElMessage({
      type: 'warning',
      message: res.data.msg
    });
  }
}
};
// const getLiabilityUserPhone = (value: number)=>{
//   const data = reportDialogState.systemPersonList.find(item => item.id === value) as AllPersonListType
//   reportDialogState.reportForm.liabilityUserPhone = data.phone
// }
//
// const getSafeLiabilityUserPhone = (value: number)=>{
//   const data = reportDialogState.allPersonList.find(item => item.id === value) as AllPersonListType
//   reportDialogState.reportForm.safeLiabilityUserPhone = data.phone
// }
// const hasSafeSystem = (value: number) =>{
//   if(value == 2){
//     reportDialogState.reportForm.safeInformationSystem = ''
//   }
// }
const onSubmitProject = () => {
    reportFormRef.value.validate(async(valid: boolean) => {
        if(valid){
            if(reportDialogState.title === '新增'){
                let res = await projectApi().addDevelop(reportDialogState.reportForm);
          const { id,assessPerson,safeRiskAnalysis,assessLevel,description } = reportDialogState.reportForm
          const data = { id,assessPerson,safeRiskAnalysis,assessLevel,description }
            if(reportDialogState.title === '提交报告'){
                let res = await assessApplyApi().updateRiskReport(data);
                if(res.data.code === 100){
                    emit('refresh')
                    reportDialogState.reportDialogVisible = false;
                    ElMessage({
                        type: 'success',
                        message: '新增成功'
                        message: '提交报告成功'
                    })
                }else{
                    ElMessage({
@@ -278,13 +361,13 @@
                    });
                }
            }else{
                let res = await projectApi().modProject(reportDialogState.reportForm)
                let res = await assessApplyApi().updateRiskReportInfo(data)
                if(res.data.code === 100){
                  emit('refresh')
                  reportDialogState.reportDialogVisible = false;
                  ElMessage({
                    type: 'success',
                    message: '整改已提交'
                    message: '修改报告成功'
                  })
                }else{
                  ElMessage({
@@ -366,6 +449,14 @@
    line-height: 42px;
    border-bottom: 1px solid #ccc;
  &.required {
    &::before {
      content: "*";
      display: inline-block;
      color: red;
    }
  }
&:last-of-type {
     border-bottom: none;
 }
src/views/analyse/assessApply/components/riskDialog.vue
@@ -64,15 +64,15 @@
    assessApplyDialogState.assessApplyDialogVisible = true;
    assessApplyDialogState.id = <number>value.id
    assessApplyDialogState.liabilityUserId = <number>value.liabilityUserId
    getRiskData(<number>value.id)
    getRiskData()
};
const addUnit = (id: number, value: RiskUnitType) => {
  riskUnitDialogRef.value.showRiskUnitDialog(assessApplyDialogState.id, assessApplyDialogState.liabilityUserId, assessApplyDialogState.basicUnitList, assessApplyDialogState.allPersonList, assessApplyDialogState.allRiskTypeList);
};
const getRiskData = async (id: number|null) => {
  let res = await riskUnitApi().getRiskUnitByList({pageIndex: 1,pageSize: 9999,riskCode: '',riskName: '',experimentId: id});
const getRiskData = async () => {
  let res = await riskUnitApi().getRiskUnitByList({pageIndex: 1,pageSize: 9999,riskCode: '',riskName: '',experimentId: assessApplyDialogState.id});
  if(res.data.code === 100){
    assessApplyDialogState.riskUnitData = JSON.parse(JSON.stringify(res.data.data));
  }else{
src/views/analyse/assessApply/components/riskUnitDialog.vue
@@ -1,59 +1,59 @@
<template>
    <div class="system-menu-dialog-container">
        <el-dialog :title="riskUnitDialogState.title" v-model="riskUnitDialogState.riskUnitDialogVisible" width="600px">
            <el-form ref="riskUnitFormRef" :rules="riskUnitDialogState.riskUnitFormRules" :model="riskUnitDialogState.riskUnitForm" size="default" label-width="120px">
                <el-row :gutter="35">
                    <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
                        <el-form-item label="风险单元编号" prop="riskCode">
                            <el-input v-model="riskUnitDialogState.riskUnitForm.riskCode" placeholder="风险单元编号" clearable class="input-length"></el-input>
                        </el-form-item>
                    </el-col>
                    <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
                        <el-form-item label="风险单元名称" prop="riskName">
                            <el-input v-model="riskUnitDialogState.riskUnitForm.riskName" placeholder="风险单元名称" clearable class="input-length"></el-input>
                        </el-form-item>
                    </el-col>
                    <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
                      <el-form-item label="风险单元类型" prop="riskUnitTypeId">
                        <el-select v-model="riskUnitDialogState.riskUnitForm.riskUnitTypeId" placeholder="风险单元类型" clearable class="input-length">
                          <el-option v-for="item in riskUnitDialogState.riskTypeList" :key="item.id" :label="item.riskType" :value="item.id"></el-option>
                        </el-select>
                      </el-form-item>
                    </el-col>
                    <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
                        <el-form-item label="负责人" prop="liabilityUserId">
                            <el-select v-model="riskUnitDialogState.riskUnitForm.liabilityUserId" placeholder="负责人" clearable class="input-length">
                                <el-option v-for="item in riskUnitDialogState.allPersonList" :key="item.id" :label="item.personName" :value="item.id"></el-option>
                            </el-select>
                        </el-form-item>
                    </el-col>
                    <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
                        <el-form-item label="负责部门" prop="liabilityDep">
                            <el-input v-model="riskUnitDialogState.riskUnitForm.liabilityDep" placeholder="负责部门" clearable class="input-length"></el-input>
                        </el-form-item>
                    </el-col>
                    <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20" v-if="riskUnitDialogState.experimentType === 1">
                      <el-form-item label="基础风险单元" prop="basicRiskUnitId">
                        <el-select v-model="riskUnitDialogState.riskUnitForm.basicRiskUnitId" placeholder="基础风险单元" clearable class="input-length">
                          <el-option v-for="item in riskUnitDialogState.basicUnitList" :key="item.id" :label="item.riskName" :value="item.id"></el-option>
                        </el-select>
                      </el-form-item>
                    </el-col>
                    <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
                        <el-form-item label="风险单元描述">
                            <el-input type="textarea" :rows="3" v-model="riskUnitDialogState.riskUnitForm.description" placeholder="风险单元描述" clearable class="input-length"></el-input>
                        </el-form-item>
                    </el-col>
                </el-row>
            </el-form>
            <template #footer>
  <div class="system-menu-dialog-container">
    <el-dialog :title="riskUnitDialogState.title" v-model="riskUnitDialogState.riskUnitDialogVisible" width="600px">
      <el-form ref="riskUnitFormRef" :rules="riskUnitDialogState.riskUnitFormRules" :model="riskUnitDialogState.riskUnitForm" size="default" label-width="120px">
        <el-row :gutter="35">
          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
            <el-form-item label="风险单元编号" prop="riskCode">
              <el-input v-model="riskUnitDialogState.riskUnitForm.riskCode" placeholder="风险单元编号" clearable class="input-length"></el-input>
            </el-form-item>
          </el-col>
          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
            <el-form-item label="风险单元名称" prop="riskName">
              <el-input v-model="riskUnitDialogState.riskUnitForm.riskName" placeholder="风险单元名称" clearable class="input-length"></el-input>
            </el-form-item>
          </el-col>
          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
            <el-form-item label="风险单元类型" prop="riskUnitTypeId">
              <el-select v-model="riskUnitDialogState.riskUnitForm.riskUnitTypeId" placeholder="风险单元类型" clearable class="input-length">
                <el-option v-for="item in riskUnitDialogState.riskTypeList" :key="item.id" :label="item.riskType" :value="item.id"></el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
            <el-form-item label="负责人" prop="liabilityUserId">
              <el-select v-model="riskUnitDialogState.riskUnitForm.liabilityUserId" placeholder="负责人" clearable class="input-length">
                <el-option v-for="item in riskUnitDialogState.allPersonList" :key="item.id" :label="item.personName" :value="item.id"></el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
            <el-form-item label="负责部门" prop="liabilityDep">
              <el-input v-model="riskUnitDialogState.riskUnitForm.liabilityDep" placeholder="负责部门" clearable class="input-length"></el-input>
            </el-form-item>
          </el-col>
          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20" v-if="riskUnitDialogState.experimentType === 1">
            <el-form-item label="基础风险单元" prop="basicRiskUnitId">
              <el-select v-model="riskUnitDialogState.riskUnitForm.basicRiskUnitId" placeholder="基础风险单元" clearable class="input-length">
                <el-option v-for="item in riskUnitDialogState.basicUnitList" :key="item.id" :label="item.riskName" :value="item.id"></el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
            <el-form-item label="风险单元描述">
              <el-input type="textarea" :rows="3" v-model="riskUnitDialogState.riskUnitForm.description" placeholder="风险单元描述" clearable class="input-length"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <template #footer>
                <span class="dialog-footer">
                    <el-button @click="riskUnitDialogState.riskUnitDialogVisible = !riskUnitDialogState.riskUnitDialogVisible" size="default">取 消</el-button>
                    <el-button type="primary" @click="onSubmitRiskUnit" size="default">确定</el-button>
                </span>
            </template>
        </el-dialog>
    </div>
      </template>
    </el-dialog>
  </div>
</template>
<script setup lang="ts">
@@ -65,128 +65,128 @@
const riskUnitFormRef = ref()
const riskUnitDialogState = reactive<RiskUnitDialogType>({
    title: '新增',
    experimentType: 2,
    riskUnitDialogVisible: false,
    riskUnitForm: {
        experimentId: null,
        riskCode: '',
        riskName: '',
        riskUnitTypeId: null,
        liabilityUserId: null,
        liabilityDep: '',
        description: '',
        basicRiskUnitId: null,
    },
    riskUnitFormRules: {
        riskCode: [{ required: true, message: '请填写风险单元编号', trigger: 'blur' }],
        riskName: [{ required: true, message: '请填写风险单元名称', trigger: 'blur' }],
        riskUnitTypeId: [{ required: true, message: '请选择风险单元类型', trigger: 'blur' }],
        liabilityUserId: [{ required: true, message: '请选择负责人', trigger: 'change' }],
        basicRiskUnitId: [{ required: true, message: '请选择基础风险单元', trigger: 'change' }]
    },
    specialDeviceList: [],
    deviceUnitList: [
        {id:1, name: '台'},
        {id:2, name: '个'},
        {id:3, name: '件'}
    ],
    riskTypeList: [],
    basicUnitList: [],
    allPersonList: [],
    allExperimentList: [],
    experimentTypeList: [
        {id: 2, name: '实验风险'},
        {id: 1, name: '固有风险'},
    ],
  title: '新增',
  experimentType: 2,
  riskUnitDialogVisible: false,
  riskUnitForm: {
    experimentId: null,
    riskCode: '',
    riskName: '',
    riskUnitTypeId: null,
    liabilityUserId: null,
    liabilityDep: '',
    description: '',
    basicRiskUnitId: null,
  },
  riskUnitFormRules: {
    riskCode: [{ required: true, message: '请填写风险单元编号', trigger: 'blur' }],
    riskName: [{ required: true, message: '请填写风险单元名称', trigger: 'blur' }],
    riskUnitTypeId: [{ required: true, message: '请选择风险单元类型', trigger: 'blur' }],
    liabilityUserId: [{ required: true, message: '请选择负责人', trigger: 'change' }],
    basicRiskUnitId: [{ required: true, message: '请选择基础风险单元', trigger: 'change' }]
  },
  specialDeviceList: [],
  deviceUnitList: [
    {id:1, name: '台'},
    {id:2, name: '个'},
    {id:3, name: '件'}
  ],
  riskTypeList: [],
  basicUnitList: [],
  allPersonList: [],
  allExperimentList: [],
  experimentTypeList: [
    {id: 2, name: '实验风险'},
    {id: 1, name: '固有风险'},
  ],
})
const showRiskUnitDialog = (id: number, liabilityUserId: number, basicUnitList: UnitType [], allPersonList: AllPersonListType [], allRiskTypeList: RiskType []) => {
    riskUnitDialogState.riskUnitDialogVisible = true;
    riskUnitDialogState.basicUnitList = basicUnitList
    riskUnitDialogState.allPersonList = allPersonList
    riskUnitDialogState.riskTypeList = allRiskTypeList
    setTimeout(() => {
        riskUnitFormRef.value.clearValidate();
    });
    riskUnitDialogState.riskUnitForm = {
        experimentId: id,
        riskCode: '',
        riskName: '',
        riskUnitTypeId: null,
        liabilityUserId: liabilityUserId,
        liabilityDep: '',
        description: '',
        basicRiskUnitId: null,
    };
  riskUnitDialogState.riskUnitDialogVisible = true;
  riskUnitDialogState.basicUnitList = basicUnitList
  riskUnitDialogState.allPersonList = allPersonList
  riskUnitDialogState.riskTypeList = allRiskTypeList
  setTimeout(() => {
    riskUnitFormRef.value.clearValidate();
  });
  riskUnitDialogState.riskUnitForm = {
    experimentId: id,
    riskCode: '',
    riskName: '',
    riskUnitTypeId: null,
    liabilityUserId: liabilityUserId,
    liabilityDep: '',
    description: '',
    basicRiskUnitId: null,
  };
};
const onSubmitRiskUnit = () => {
    riskUnitFormRef.value.validate(async(valid: boolean) => {
        if(valid){
            if(riskUnitDialogState.title === '新增' && riskUnitDialogState.experimentType === 1){
                let { experimentId,basicRiskUnitId} = riskUnitDialogState.riskUnitForm
                let query = { experimentId,basicRiskUnitId }
                let res = await riskUnitApi().addBasicRiskUnit(query);
                if(res.data.code === 100){
                    emit('refresh')
                    riskUnitDialogState.riskUnitDialogVisible = false;
                    ElMessage({
                        type: 'success',
                        message: '新增成功'
                    })
                }else{
                    ElMessage({
                        type: 'warning',
                        message: res.data.msg,
                    });
                }
            }else if(riskUnitDialogState.title === '新增' && riskUnitDialogState.experimentType === 2){
                let { basicRiskUnitId, ...query} = riskUnitDialogState.riskUnitForm
                let res = await riskUnitApi().addRiskUnit(query);
                if(res.data.code === 100){
                    emit('refresh')
                    riskUnitDialogState.riskUnitDialogVisible = false;
                    ElMessage({
                        type: 'success',
                        message: '新增成功'
                    })
                }else{
                    ElMessage({
                        type: 'warning',
                        message: res.data.msg,
                    });
                }
            }else{
                let res = await riskUnitApi().modRiskUnit(riskUnitDialogState.riskUnitForm)
                if(res.data.code === 100){
                    emit('refresh')
                    riskUnitDialogState.riskUnitDialogVisible = false;
                    ElMessage({
                        type: 'success',
                        message: '编辑成功'
                    })
                }else{
                    ElMessage({
                        type: 'warning',
                        message: res.data.msg,
                    });
                }
            }
  riskUnitFormRef.value.validate(async(valid: boolean) => {
    if(valid){
      if(riskUnitDialogState.title === '新增' && riskUnitDialogState.experimentType === 1){
        let { experimentId,basicRiskUnitId} = riskUnitDialogState.riskUnitForm
        let query = { experimentId,basicRiskUnitId }
        let res = await riskUnitApi().addBasicRiskUnit(query);
        if(res.data.code === 100){
          emit('refresh')
          riskUnitDialogState.riskUnitDialogVisible = false;
          ElMessage({
            type: 'success',
            message: '新增成功'
          })
        }else{
            ElMessage({
                type: 'warning',
                message: '请完善基本信息',
            });
          ElMessage({
            type: 'warning',
            message: res.data.msg,
          });
        }
    })
      }else if(riskUnitDialogState.title === '新增' && riskUnitDialogState.experimentType === 2){
        let { basicRiskUnitId, ...query} = riskUnitDialogState.riskUnitForm
        let res = await riskUnitApi().addRiskUnit(query);
        if(res.data.code === 100){
          emit('refresh')
          riskUnitDialogState.riskUnitDialogVisible = false;
          ElMessage({
            type: 'success',
            message: '新增成功'
          })
        }else{
          ElMessage({
            type: 'warning',
            message: res.data.msg,
          });
        }
      }else{
        let res = await riskUnitApi().modRiskUnit(riskUnitDialogState.riskUnitForm)
        if(res.data.code === 100){
          emit('refresh')
          riskUnitDialogState.riskUnitDialogVisible = false;
          ElMessage({
            type: 'success',
            message: '编辑成功'
          })
        }else{
          ElMessage({
            type: 'warning',
            message: res.data.msg,
          });
        }
      }
    }else{
      ElMessage({
        type: 'warning',
        message: '请完善基本信息',
      });
    }
  })
}
const emit = defineEmits(['refresh'])
defineExpose({
    showRiskUnitDialog
  showRiskUnitDialog
})
</script>
src/views/analyse/assessApply/components/selectDanger.vue
@@ -1,38 +1,38 @@
<template>
    <tr class="m-color b-font" style="text-align: center">主要危险源或有害因素</tr>
    <tr>
        <td class="w-18 m-color">序号</td>
        <td class="w-18 m-color required">危险源或有害因素</td>
        <td class="w-18 m-color required">危险特性</td>
        <td class="w-18 m-color required">数量</td>
        <td class="w-18 m-color required">其他说明</td>
        <td class="w-18 m-color">操作</td>
        <td class="w-20 m-color">序号</td>
        <td class="w-20 m-color">危险源或有害因素</td>
        <td class="w-20 m-color">危险特性</td>
        <td class="w-20 m-color">数量</td>
        <td class="w-20 m-color">其他说明</td>
<!--        <td class="w-18 m-color">操作</td>-->
    </tr>
    <tr v-for="(item,index) in dangerSourceState.dangerList" :key="index">
        <td class="w-18">
        <td class="w-20">
            {{ index + 1 }}
        </td>
        <td class="w-18">
          <el-input :disabled="dangerSourceState.disabled" v-model="item.dangerFactor"></el-input>
        <td class="w-20">
          <el-input disabled v-model="item.riskSource"></el-input>
        </td>
        <td class="w-18">
          <el-input :disabled="dangerSourceState.disabled" v-model="item.feature"></el-input>
        <td class="w-20">
          <el-input disabled v-model="item.riskCharacteristic"></el-input>
        </td>
        <td class="w-18">
            <el-input :disabled="dangerSourceState.disabled" type="number" v-model="item.amount"></el-input>
        <td class="w-20">
            <el-input disabled type="number" v-model="item.number"></el-input>
        </td>
        <td class="w-18">
          <el-input :disabled="dangerSourceState.disabled" v-model="item.info"></el-input>
        <td class="w-20">
          <el-input disabled v-model="item.description"></el-input>
        </td>
        <td class="w-18">
            <el-button :disabled="dangerSourceState.disabled" type="danger" @click="deleteDangerItem(index)">删除</el-button>
        </td>
<!--        <td class="w-18">-->
<!--            <el-button disabled type="danger" @click="deleteDangerItem(index)">删除</el-button>-->
<!--        </td>-->
    </tr>
    <tr style="text-align: center">
        <el-button :disabled="dangerSourceState.disabled" type="primary" shape="round" @click="addDangerItem()">
            添加行
        </el-button>
    </tr>
<!--    <tr style="text-align: center">-->
<!--        <el-button :disabled="dangerSourceState.disabled" type="primary" shape="round" @click="addDangerItem()">-->
<!--            添加行-->
<!--        </el-button>-->
<!--    </tr>-->
</template>
<script setup lang="ts">
@@ -45,8 +45,7 @@
const dangerSourceState = reactive<DangerSourceType>({
    disabled: false,
    dangerList: [
    ],
    dangerList: [],
    classifyList:[
        {id:1, name: '有机'},
        {id:2, name: '酸'},
@@ -71,7 +70,7 @@
});
const addDangerItem = () => {
    dangerSourceState.dangerList.push({dangerFactor: '', feature: '', amount: null, info: ''});
    dangerSourceState.dangerList.push({riskSource: '', riskCharacteristic: '', number: null, description: ''});
};
const deleteDangerItem = (index: number) => {
src/views/analyse/assessApply/index.ts
@@ -6,11 +6,33 @@
    title: string
    disabled: boolean
    reportDialogVisible: boolean
    reportForm: object
    reportForm: {
        id: null | number,
        experimentName: string,
        experimentType: null | number,
        personUser: string,
        personUserId: null | number,
        personUserPhone: string,
        safePersonUserId: null | number,
        safePersonUser: string,
        safePersonUserPhone: string,
        dep: string,
        experimentSite: [],
        experimentDesc: string,
        emergencyMeasure: string,
        assessPerson: string,
        safeRiskAnalysis: string,
        assessLevel: null | number,
        riskSource: [],
        riskSourceType: [],
        description: string,
        person: []
    }
    reportFormRules: object
    allPersonList: Array<AllPersonListType>
    systemPersonList: Array<AllPersonListType>
    allRoomList: Array<RoomType>
    allRoomList: Array<RoomType>,
    experimentTypeList: Array<Type>
}
declare interface DangerSourceType {
src/views/analyse/assessApply/index.vue
@@ -58,15 +58,17 @@
                        <el-table-column prop="stage" label="评估状态">
                          <template #default="scope">
                            <el-tag :type="scope.row.stage == 4?'success':scope.row.stage == 1?'info':''">
                              {{scope.row.stage == 1?'未评估':scope.row.status == 2?'评估中':scope.row.status == 3?'评估完成':scope.row.status == 4?'生成报告':'--'}}
                              {{scope.row.stage == 1?'未评估':scope.row.stage == 2?'评估中':scope.row.stage == 3?'评估完成':scope.row.stage == 4?'生成报告':'--'}}
                            </el-tag>
                          </template>
                        </el-table-column>
                        <el-table-column label="操作" width="250" fixed="right">
                            <template #default="scope">
                                <el-button size="small" v-if="scope.row.stage == 3" text type="primary" :icon="Edit" @click="toReport(scope.row)">生成评估报告</el-button>
                                <el-button size="small" text type="primary" :icon="Edit" @click="openRiskDialog(scope.row)">管理实验现实风险</el-button>
                                <el-button size="small" text type="primary" :icon="View" @click="openReportDialog('提交', scope.row)">提交综合评估报告审批</el-button>
                                <el-button size="small" :disabled="scope.row.status == 2 ? true : false" text type="primary" :icon="Edit" @click="openReportDialog('查看',scope.row)">查看评估报告</el-button>
                                <el-button size="small" v-if="scope.row.stage == 4 && !scope.row.assessPerson" text type="primary" :icon="View" @click="openReportDialog('提交', scope.row)">提交审批</el-button>
                                <el-button size="small" v-if="scope.row.stage == 4 && scope.row.assessPerson" text type="primary" :icon="View" @click="openReportDialog('修改', scope.row)">修改</el-button>
                                <el-button size="small" v-if="scope.row.stage == 4 && scope.row.assessPerson" text type="primary" :icon="Edit" @click="openReportDialog('查看',scope.row)">查看</el-button>
                            </template>
                        </el-table-column>
                    </el-table>
@@ -130,6 +132,32 @@
    }
};
const toReport = (val: ProjectType)=>{
  ElMessageBox.confirm(`此操作将对该实验生成风险评估报告:“${val.experimentName}”,是否继续?`, '提示', {
    confirmButtonText: '确认',
    cancelButtonText: '取消',
    type: 'warning'
  })
      .then(async () => {
        let res = await assessApplyApi().toRiskReport({ id: val.id });
        if (res.data.code === 100) {
          ElMessage({
            type: 'success',
            duration: 2000,
            message: '生成报告成功'
          });
          await getAssessData();
        } else {
          ElMessage({
            type: 'warning',
            message: res.data.msg
          });
        }
      })
      .catch((error) => {
      });
}
const getAllRoom = async () => {
  let res = await roomApi().getAllRoom();
  if(res.data.code === 100){
@@ -157,7 +185,6 @@
        type: 'warning'
    })
        .then(async () => {
            debugger
            let res = await projectApi().deleteProjectById({ id: val.id });
            if (res.data.code === 100) {
                ElMessage({
src/views/analyse/evaluate/components/evaluateDialog.vue
@@ -148,7 +148,7 @@
                          <el-option v-for="item in evaluateDialogState.evaluateMethodList" :key="item.id" :label="item.name" :value="item.id"></el-option>
                        </el-select>
                      </el-form-item>
                      <el-button size="default" type="primary" @click="openChangeMethod()">修改评价方法</el-button>
                      <el-button :disabled="evaluateDialogState.disabled" size="default" type="primary" @click="openChangeMethod()">修改评价方法</el-button>
                    </el-col>
                    <div class="evaluateCard">
@@ -618,6 +618,7 @@
import {isValidKey, numFloat} from "/@/utils/methods";
import { BigNumber } from 'bignumber.js';
import {identifyApi} from "/@/api/analyse/identify";
import {ElMessageBox} from "element-plus/es";
const evaluateFormRef = ref()
@@ -801,21 +802,15 @@
    setTimeout(() => {
        evaluateFormRef.value.clearValidate();
    });
    if( value.riskValue){
    if( title === '评价'){
      if(value.riskValue){
        evaluateDialogState.title = '编辑评价';
        for(let i in evaluateDialogState.evaluateForm){
            if(isValidKey(i, evaluateDialogState.evaluateForm)){
                evaluateDialogState.evaluateForm[i] = value[i]
            }
          if(isValidKey(i, evaluateDialogState.evaluateForm)){
            evaluateDialogState.evaluateForm[i] = value[i]
          }
        }
    }else if(title === '查看'){
        evaluateDialogState.disabled = true
        for(let i in evaluateDialogState.evaluateForm){
            if(isValidKey(i, evaluateDialogState.evaluateForm)){
                evaluateDialogState.evaluateForm[i] = value[i]
            }
        }
    }else{
      }else{
        evaluateDialogState.title = '评价'
        evaluateDialogState.evaluateForm = {
          id: null,
@@ -868,6 +863,15 @@
          adviseEmergencyMeasure: '',
          evaluateDesc: ''
        };
      }
    }else {
        evaluateDialogState.title = '查看'
        evaluateDialogState.disabled = true
        for(let i in evaluateDialogState.evaluateForm){
            if(isValidKey(i, evaluateDialogState.evaluateForm)){
                evaluateDialogState.evaluateForm[i] = value[i]
            }
        }
    }
    evaluateDialogState.evaluateForm.id = value.id as number
    evaluateDialogState.evaluateForm.evaluateMethod = value.evaluateMethod as number
@@ -880,24 +884,33 @@
}
const conFirmChange = async () =>{
  let res = await evaluateApi().modEvaluateMethod({
    id: evaluateDialogState.evaluateForm.id,
    evaluateMethodId: evaluateDialogState.evaluateForm.evaluateMethod
  });
  if(res.data.code === 100){
    ElMessage({
      type: 'success',
      message: '评价方法修改成功'
    })
    emit('refresh')
  }else{
    ElMessage({
      type: 'warning',
      message: res.data.msg
    })
  }
  evaluateDialogState.evaluateMethodVisible = false
  evaluateDialogState.evaluateDialogVisible = false
  ElMessageBox.confirm(`此操作将修改该评价计划的评价方法并清除之前的所有评价信息,是否继续?`, '提示', {
    confirmButtonText: '确认',
    cancelButtonText: '取消',
    type: 'warning'
  })
      .then(async () => {
        let res = await evaluateApi().modEvaluateMethod({
          id: evaluateDialogState.evaluateForm.id,
          evaluateMethodId: evaluateDialogState.evaluateForm.evaluateMethod
        });
        if(res.data.code === 100){
          ElMessage({
            type: 'success',
            message: '评价方法修改成功'
          })
          emit('refresh')
        }else{
          ElMessage({
            type: 'warning',
            message: res.data.msg
          })
        }
        evaluateDialogState.evaluateMethodVisible = false
        evaluateDialogState.evaluateDialogVisible = false
      })
      .catch((error) => {
      });
}
const onSubmitEvaluate = () => {
src/views/analyse/evaluate/index.vue
@@ -57,10 +57,11 @@
                                  <el-table-column v-if="scope.row.identificationMethod == 5" prop="analogyReference" label="类比参照" show-overflow-tooltip align="center"></el-table-column>
                                  <el-table-column v-if="scope.row.identificationMethod == 5" prop="analogyRiskFactor" label="存在风险因素" show-overflow-tooltip align="center"></el-table-column>
                                  <el-table-column v-if="scope.row.identificationMethod == 5" prop="analogyResult" label="可能存在后果" show-overflow-tooltip align="center"></el-table-column>
                                  <el-table-column label="操作" width="250">
                                      <template #default="scope">
                                          <el-button size="small" text type="primary" :icon="Plus" @click="openEvaluateDialog('评价', scope.row)">评价</el-button>
                                      </template>
                                  <el-table-column label="操作" width="250" >
                                    <template #default="scope2">
                                        <el-button size="small" v-if="scope.row.planExecStatus === 3" text type="primary" :icon="Plus" @click="openEvaluateDialog('评价', scope2.row)">评价</el-button>
                                        <el-button size="small" v-if="scope2.row.riskValue" text type="primary" :icon="View" @click="openEvaluateDialog('查看', scope2.row)">查看</el-button>
                                    </template>
                                  </el-table-column>
                                </el-table>
                            </template>
@@ -241,7 +242,7 @@
};
const accessEvaluate = (val: IdentifyType) => {
    ElMessageBox.confirm(`此操作将提交该评价计划:“${val.assessPlanName}”,是否继续?`, '提示', {
    ElMessageBox.confirm(`此操作将提交该评价计划:“${val.assessPlanName}”的评价信息,是否继续?`, '提示', {
        confirmButtonText: '确认',
        cancelButtonText: '取消',
        type: 'warning'
src/views/analyse/identify/index.vue
@@ -203,7 +203,7 @@
const accessIdentify = (val: IdentifyType) => {
    if(val.factorQueryDTOList?.length > 0){
      ElMessageBox.confirm(`此操作将派发该计划:“${val.assessPlanName}”,是否继续?`, '提示', {
      ElMessageBox.confirm(`此操作将提交该计划:“${val.assessPlanName}”的辨识信息,是否继续?`, '提示', {
        confirmButtonText: '确认',
        cancelButtonText: '取消',
        type: 'warning'
src/views/analyse/plan/components/planDialog.vue
@@ -121,35 +121,34 @@
    }else if(title === '查看'){
        planDialogState.title = '查看';
        planDialogState.disabled = true
        planDialogState.planForm.assessTime = [value.assessStartTime, value.assessEndTime]
        for(let i in planDialogState.planForm){
            if(isValidKey(i, planDialogState.planForm)){
                planDialogState.planForm[i] = value[i]
            }
        }
        planDialogState.planForm.assessTime=[value.assessStartTime, value.assessEndTime]
        console.log(value,planDialogState.planForm.assessTime,'time')
    }else{
        planDialogState.title = '编辑';
        planDialogState.planForm.id = value.id
        planDialogState.planForm.assessTime=[value.assessStartTime, value.assessEndTime]
        console.log(planDialogState.planForm.assessTime,'5')
        formatTime()
        console.log(planDialogState.planForm.assessTime,'6 ')
        for(let i in planDialogState.planForm){
            if(isValidKey(i, planDialogState.planForm)){
                planDialogState.planForm[i] = value[i]
            }
        }
        planDialogState.planForm.assessTime=[value.assessStartTime, value.assessEndTime]
    }
};
const formatTime = () => {
    planDialogState.planForm.assessStartTime = planDialogState.planForm.assessTime === null ? '' : planDialogState.planForm.assessTime[0]
    planDialogState.planForm.assessEndTime = planDialogState.planForm.assessTime === null ? '' : planDialogState.planForm.assessTime[1]
    planDialogState.planForm.assessStartTime = planDialogState.planForm.assessTime == [] ? '' : planDialogState.planForm.assessTime[0]
    planDialogState.planForm.assessEndTime = planDialogState.planForm.assessTime == [] ? '' : planDialogState.planForm.assessTime[1]
};
const onSubmitPlan = () => {
    planFormRef.value.validate(async(valid: boolean) => {
        if(valid){
            formatTime()
            delete planDialogState.planForm.assessTime
            if(planDialogState.title === '新增'){
                let res = await planApi().addPlan(planDialogState.planForm);
src/views/analyse/plan/index.ts
@@ -11,7 +11,15 @@
    identificationMethodList: Array<Type>,
    evaluateMethodList: Array<Type>
    riskUnitList: Array<RiskUnitType>
    personList: Array<SystemPersonType>
    personList: Array<SystemPersonType>,
    reSendTitle:string
    reSendDialogVisible: boolean
    reSendForm: {
        id: null | number,
        identificationUserId: null | number,
        evaluateUserId: null | number,
    },
    rules: object
}
declare  interface SystemPersonType {
@@ -46,7 +54,7 @@
        riskUnitId: number | null,
        planUserId: number | null,
        assessPlanName: string,
        assessTime?: string[],
        assessTime: string[],
        assessStartTime: string,
        assessEndTime: string,
        identificationUserId: number | null,
src/views/analyse/plan/index.vue
@@ -70,7 +70,9 @@
                                <el-button v-if="scope.row.planSellStatus === 1" size="small" text type="primary" :icon="Edit" @click="openPlanDialog('修改', scope.row)">编辑</el-button>
                                <el-button v-if="scope.row.identificationUserId == planState.user" size="small" text type="primary" :icon="Edit" @click="refuseIdentify(scope.row)">拒绝辨识</el-button>
                                <el-button v-if="scope.row.evaluateUserId == planState.user" size="small" text type="primary" :icon="Edit" @click="refuseEvaluate(scope.row)">拒绝评价</el-button>
                                <el-button v-if="scope.row.sceneUserId == planState.user" size="small" text type="primary" :icon="Edit" @click="refuseScene(scope.row)">拒绝现场</el-button>
<!--                                <el-button v-if="scope.row.sceneUserId == planState.user" size="small" text type="primary" :icon="Edit" @click="refuseScene(scope.row)">拒绝现场</el-button>-->
                                <el-button v-if="scope.row.identificationUserId == null" size="small" text type="primary" :icon="Edit" @click="reSendJob(scope.row,'identification')">重新指派辨识</el-button>
                                <el-button v-if="scope.row.evaluateUserId == null" size="small" text type="primary" :icon="Edit" @click="reSendJob(scope.row,'evaluate')">重新指派评价</el-button>
                                <el-button v-if="scope.row.planSellStatus === 1" size="small" text type="danger" :icon="Delete" @click="onDelPlan(scope.row)">删除</el-button>
                            </template>
                        </el-table-column>
@@ -82,19 +84,42 @@
            </div>
        </div>
        <plan-dialog ref="planDialogRef" @refresh="getPlanData"></plan-dialog>
        <el-dialog :title="planState.reSendTitle" v-model="planState.reSendDialogVisible" width="50%">
          <el-form ref="ruleFormRef" :rules="planState.rules" :model="planState.reSendForm" label-width="120px">
            <el-form-item v-if="planState.reSendTitle == '指派辨识专家'" label="选择辨识专家" prop="identificationUserId">
              <el-select v-model="planState.reSendForm.identificationUserId" style="width:100%"  placeholder="辨识专家" clearable>
                <el-option v-for="item in planState.personList" :key="item.id" :label="item.realName" :value="item.id"></el-option>
              </el-select>
            </el-form-item>
            <el-form-item v-if="planState.reSendTitle == '指派评价专家'" label="选择评价专家" prop="evaluateUserId">
              <el-select v-model="planState.reSendForm.evaluateUserId" style="width:100%"  placeholder="评价专家" clearable>
                <el-option v-for="item in planState.personList" :key="item.id" :label="item.realName" :value="item.id"></el-option>
              </el-select>
            </el-form-item>
          </el-form>
          <template #footer>
                <span class="dialog-footer" style="padding-top:10px;text-align: center !important;">
                  <el-button @click="planState.reSendDialogVisible = !planState.reSendDialogVisible" size="default">取 消</el-button>
                  <el-button type="primary" @click="onSubmitReSend(ruleFormRef)" size="default">确认指派</el-button>
                </span>
          </template>
        </el-dialog>
    </div>
</template>
<script setup lang="ts">
import {defineAsyncComponent, onMounted, reactive, ref} from "vue";
import {planApi} from "/@/api/analyse/plan";
import {ElMessage, ElMessageBox} from "element-plus";
import {ElMessage, ElMessageBox, FormInstance} from "element-plus";
import { Edit, View, Plus, Delete } from '@element-plus/icons-vue';
import {riskUnitApi} from "/@/api/analyse/riskUnit";
import {personApi} from "/@/api/basic/person";
import {useUserInfo} from "/@/stores/userInfo";
import { storeToRefs } from 'pinia';
import {userApi} from "/@/api/systemManage/user";
import {assessApplyApi} from "/@/api/analyse/assessApply";
const PlanDialog = defineAsyncComponent(() => import('./components/planDialog.vue'));
@@ -102,7 +127,7 @@
const planDialogRef = ref();
const userInfo = useUserInfo();
const { userInfos } = storeToRefs(userInfo);
const ruleFormRef = ref<FormInstance>()
const planState = reactive<PlanStateType>({
    planData: [],
    user: null,
@@ -117,18 +142,29 @@
    ],
    personList: [],
    identificationMethodList: [
    {id:1, name: 'PHA'},
    {id:2, name: 'JHA'},
    {id:3, name: 'SCL'},
    {id:4, name: 'HAZOP'},
    {id:5, name: '类比法'},
],
    evaluateMethodList: [
    {id:1, name: 'LEC'},
    {id:2, name: 'LS'},
    {id:3, name: 'MES'},
    {id:4, name: 'RS'},
]
        {id:1, name: 'PHA'},
        {id:2, name: 'JHA'},
        {id:3, name: 'SCL'},
        {id:4, name: 'HAZOP'},
        {id:5, name: '类比法'},
    ],
        evaluateMethodList: [
        {id:1, name: 'LEC'},
        {id:2, name: 'LS'},
        {id:3, name: 'MES'},
        {id:4, name: 'RS'},
    ],
    reSendTitle:'',
    reSendDialogVisible: false,
    reSendForm: {
      id: null,
      identificationUserId: null,
      evaluateUserId: null
    },
    rules: {
      identificationUserId: [{ required: true, message: '请选择辨识专家', trigger: 'blur' }],
      evaluateUserId: [{ required: true, message: '请选择评价专家', trigger: 'blur' }]
    }
    // deviceUnitList: [
    //     {id:1, name: '台'},
    //     {id:2, name: '个'},
@@ -183,55 +219,117 @@
};
const refuseIdentify = async(val: PlanType)=>{
  let res = await planApi().refuseIdentify({ id: val.id });
  if (res.data.code === 100) {
    ElMessage({
      type: 'success',
      duration: 2000,
      message: '拒绝成功'
    });
    await getPlanData();
  } else {
    ElMessage({
      type: 'warning',
      message: res.data.msg
    });
  ElMessageBox.confirm(`此操作将拒绝作为该计划:“${val.assessPlanName}”的辨识专家,是否继续?`, '提示', {
    confirmButtonText: '确认',
    cancelButtonText: '取消',
    type: 'warning'
  })
      .then(async () => {
        let res = await planApi().refuseIdentify({ id: val.id });
        if (res.data.code === 100) {
          ElMessage({
            type: 'success',
            duration: 2000,
            message: '拒绝成功'
          });
          await getPlanData();
        } else {
          ElMessage({
            type: 'warning',
            message: res.data.msg
          });
        }
      })
      .catch((error) => {
      });
}
const reSendJob= async(val: PlanType,type:string)=>{
  planState.reSendForm = {
    id: val.id,
    identificationUserId: null,
    evaluateUserId: null
  }
  if(type=='identification'){
    planState.reSendTitle = '指派辨识专家'
  }else{
    planState.reSendTitle = '指派评价专家'
  }
  planState.reSendDialogVisible = true
}
const onSubmitReSend = async (formEl: FormInstance | undefined) => {
  if (!formEl) return
  await formEl.validate(async(valid, fields) => {
    if (valid) {
      let res = await planApi().reSendJob(planState.reSendForm);
      if(res.data.code === 100){
        ElMessage({
          type: 'success',
          message: '重新指派成功'
        });
      }else{
        ElMessage({
          type: 'warning',
          message: res.data.msg
        });
      }
      planState.reSendForm = {
        id: null,
        identificationUserId: null,
        evaluateUserId: null
      },
      planState.reSendDialogVisible = false
      getPlanData()
    } else {
      console.log('error submit!', fields)
    }
  })
}
const refuseEvaluate = async(val: PlanType)=>{
  let res = await planApi().refuseEvaluate({ id: val.id });
  if (res.data.code === 100) {
    ElMessage({
      type: 'success',
      duration: 2000,
      message: '拒绝成功'
    });
    await getPlanData();
  } else {
    ElMessage({
      type: 'warning',
      message: res.data.msg
    });
  }
  ElMessageBox.confirm(`此操作将拒绝作为该计划:“${val.assessPlanName}”的评价专家,是否继续?`, '提示', {
    confirmButtonText: '确认',
    cancelButtonText: '取消',
    type: 'warning'
  })
      .then(async () => {
        let res = await planApi().refuseEvaluate({ id: val.id });
        if (res.data.code === 100) {
          ElMessage({
            type: 'success',
            duration: 2000,
            message: '拒绝成功'
          });
          await getPlanData();
        } else {
          ElMessage({
            type: 'warning',
            message: res.data.msg
          });
        }
      })
      .catch((error) => {
      });
}
const refuseScene = async(val: PlanType)=>{
  let res = await planApi().refuseScene({ id: val.id });
  if (res.data.code === 100) {
    ElMessage({
      type: 'success',
      duration: 2000,
      message: '拒绝成功'
    });
    await getPlanData();
  } else {
    ElMessage({
      type: 'warning',
      message: res.data.msg
    });
  }
}
// const refuseScene = async(val: PlanType)=>{
//   let res = await planApi().refuseScene({ id: val.id });
//   if (res.data.code === 100) {
//     ElMessage({
//       type: 'success',
//       duration: 2000,
//       message: '拒绝成功'
//     });
//     await getPlanData();
//   } else {
//     ElMessage({
//       type: 'warning',
//       message: res.data.msg
//     });
//   }
// }
const onDelPlan = (val: PlanType) => {
    ElMessageBox.confirm(`此操作将永久删除该计划:“${val.assessPlanName}”,是否继续?`, '提示', {
src/views/experiment/developing/index.vue
@@ -64,7 +64,7 @@
                        <el-table-column prop="stage" label="评估状态">
                          <template #default="scope">
                            <el-tag :type="scope.row.stage == 4?'success':scope.row.stage == 1?'info':''">
                              {{scope.row.stage == 1?'未评估':scope.row.status == 2?'评估中':scope.row.status == 3?'评估完成':scope.row.status == 4?'生成报告':'--'}}
                              {{scope.row.stage == 1?'未评估':scope.row.stage == 2?'评估中':scope.row.stage == 3?'评估完成':scope.row.stage == 4?'生成报告':'--'}}
                            </el-tag>
                          </template>
                        </el-table-column>
src/views/experiment/project/index.vue
@@ -64,7 +64,7 @@
                        <el-table-column prop="stage" label="评估状态">
                          <template #default="scope">
                            <el-tag :type="scope.row.stage == 4?'success':scope.row.stage == 1?'info':''">
                              {{scope.row.stage == 1?'未评估':scope.row.status == 2?'评估中':scope.row.status == 3?'评估完成':scope.row.status == 4?'生成报告':'--'}}
                              {{scope.row.stage == 1?'未评估':scope.row.stage == 2?'评估中':scope.row.stage == 3?'评估完成':scope.row.stage == 4?'生成报告':'--'}}
                            </el-tag>
                          </template>
                        </el-table-column>
src/views/loginPage/component/accountLogin.vue
@@ -189,6 +189,7 @@
            // 存储 token 到浏览器缓存
            let res = await useLoginApi().signIn(state.ruleForm);
            if (res.data.code === 100) {
              console.log(res.data.data,'user')
                await userInfo.setUserInfos(res.data.data);
                Cookies.set('token', res.data.data.tk);
                Cookies.set('uid', res.data.data.uid);