<template>
|
<div class="system-menu-dialog-container">
|
<el-dialog :title="reportDialogState.title" v-model="reportDialogState.reportDialogVisible" width="80%">
|
<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-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 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>
|
</tr>
|
<tr>
|
<td class="w-25 m-color required">负责人</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>
|
</td>
|
<td class="w-25 m-color required">电话</td>
|
<td class="w-25 m-color">
|
<el-input readonly v-model="reportDialogState.reportForm.liabilityUserPhone" />
|
</td>
|
</tr>
|
<tr>
|
<td class="w-25 m-color required">安全负责人</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" />
|
</td>
|
<td class="w-25 m-color required">电话</td>
|
<td class="w-25 m-color">
|
<el-input readonly v-model="reportDialogState.reportForm.safeLiabilityUserPhone" />
|
</td>
|
</tr>
|
<tr>
|
<td class="w-25 m-color required">部门</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>
|
</tr>
|
<tr v-for="(item,index) in reportDialogState.reportForm.siteList" :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>
|
</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-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>
|
<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="(简要描述实验原理、实验步骤、所用试剂或材料设备等)" />
|
</tr>
|
<tr class="m-color b-font" style="text-align: center">实验涉及的危险源</tr>
|
<tr>
|
<td class="w-25 m-color required">危险源种类</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>
|
</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>
|
<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="" />
|
</tr>
|
<tr class="m-color b-font" 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-group>
|
</td>
|
</tr>
|
<tr>
|
<el-input type="textarea" :autosize="{ minRows: 3}" :disabled="reportDialogState.disabled" v-model="reportDialogState.reportForm.reskLevelReason" 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>
|
</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";
|
|
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,
|
liabilityUserId: null,
|
liabilityUserPhone: '',
|
safeLiabilityUserId: null,
|
safeLiabilityUser: '',
|
safeLiabilityUserPhone: '',
|
dep: "",
|
siteList: [],
|
experimentDesc: '',
|
safeRiskAnalysis: '',
|
emergencyMeasure: '',
|
assessLevel:null,
|
riskSource: []
|
},
|
reportFormRules: {},
|
allPersonList: [],
|
allRoomList: [],
|
systemPersonList: [],
|
})
|
|
const showReportDialog = (title: string, value: ProjectType, allRoomList: RoomType []) => {
|
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{
|
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 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);
|
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 projectApi().modProject(reportDialogState.reportForm)
|
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;
|
|
&: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%;
|
}
|
|
.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>
|