<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 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>
|
<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 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>-->
|
<td class="w-25" :class="item.approveStatus==3?'redTit':''">{{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({
|
pageIndex: 1,
|
pageSize: 99999,
|
searchParams:{
|
roleId: null,
|
name: '',
|
realName: ''
|
}
|
});
|
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%;
|
}
|
|
&.redTit{
|
color: red;
|
}
|
|
&.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>
|