| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534 |
- <template>
- <div class="safety-platform-container">
- <header class="safety-platform-container__header">
- <div class="breadcrumb-title">
- <BreadcrumbBack />
- 变更风险清单
- </div>
- </header>
- <main class="safety-platform-container__main">
- <el-form ref="formRef" :inline="true" label-width="auto" :model="formValue" :rules="rules">
- <el-form-item label="楼号/区域" prop="buildingArea">
- <el-input
- disabled
- v-model="formValue.buildingArea"
- size="large"
- placeholder="例如:A栋、东区"
- style="width: 330px"
- />
- </el-form-item>
- <el-form-item label="楼宇名称" prop="buildingName">
- <el-input
- v-model="formValue.buildingName"
- size="large"
- disabled
- placeholder="例如:科研楼、实验中心"
- style="width: 330px"
- />
- </el-form-item>
- <el-form-item label="安全责任人" prop="safetyResponsibleBuilding">
- <el-select
- disabled
- v-model="formValue.safetyResponsibleBuilding"
- placeholder="请选择"
- size="large"
- style="width: 330px"
- filterable
- >
- <el-option v-for="item in userOptions" :key="item.value" :label="item.label" :value="item.value" />
- </el-select>
- </el-form-item>
- <el-form-item label="楼层/位置" prop="floorLocation">
- <el-input
- disabled
- v-model="formValue.floorLocation"
- size="large"
- placeholder="例如:3层、地下一层、走廊东侧"
- style="width: 330px"
- />
- </el-form-item>
- <el-form-item label="安全责任人" prop="safetyResponsibleFloor">
- <el-select
- disabled
- v-model="formValue.safetyResponsibleFloor"
- placeholder="请选择"
- size="large"
- style="width: 330px"
- filterable
- >
- <el-option v-for="item in userOptions" :key="item.value" :label="item.label" :value="item.value" />
- </el-select>
- </el-form-item>
- <el-form-item label="房间号(名称)" prop="roomName">
- <el-input
- disabled
- v-model="formValue.roomName"
- size="large"
- placeholder="例如:301、高压配电室"
- style="width: 330px"
- />
- </el-form-item>
- <el-form-item label="责任部门" prop="responsibleDepartment">
- <el-cascader
- disabled
- style="width: 330px"
- v-model="formValue.responsibleDepartmentId"
- size="large"
- ref="cascaderRef"
- :options="firstLevelDepts"
- :props="cascaderProp"
- :show-all-levels="false"
- placeholder="请选择责任部门"
- filterable
- @change="handleChangeDept('responsibleDepartment')"
- />
- </el-form-item>
- <el-form-item label="安全责任人" prop="roomSafetyResponsible">
- <el-select
- disabled
- v-model="formValue.roomSafetyResponsible"
- placeholder="请选择"
- size="large"
- style="width: 330px"
- filterable
- >
- <el-option v-for="item in userOptions" :key="item.value" :label="item.label" :value="item.value" />
- </el-select>
- </el-form-item>
- <el-form-item label="是否存在风险点" prop="hasRiskPoint">
- <el-select
- disabled
- v-model="formValue.hasRiskPoint"
- size="large"
- placeholder="请选择是否存有风险点"
- style="width: 330px"
- >
- <el-option label="是" :value="1" />
- <el-option label="否" :value="0" />
- </el-select>
- </el-form-item>
- <el-form-item label="风险点类别" prop="riskCategory">
- <el-select
- disabled
- v-model="formValue.riskCategory"
- size="large"
- placeholder="请选择风险点类别"
- style="width: 330px"
- >
- <el-option :value="1" label="III级危险点" />
- <el-option :value="2" label="II级危险点" />
- <el-option :value="3" label="I级危险点" />
- <el-option :value="4" label="UPS" />
- <el-option :value="5" label="电力设施(强电)" />
- <el-option :value="6" label="高低温气体液体、高压气体" />
- <el-option :value="7" label="试验设施设备" />
- <el-option :value="8" label="特种设备" />
- <el-option :value="9" label="危化品、易燃易爆固液气体" />
- <el-option :value="10" label="有限空间" />
- </el-select>
- </el-form-item>
- <el-form-item label="风险点名称" prop="riskPointName">
- <el-input
- disabled
- v-model="formValue.riskPointName"
- size="large"
- placeholder="例如:液氮储罐、高压开关柜"
- style="width: 330px"
- />
- </el-form-item>
- <el-form-item label="风险点编号" prop="riskPointNumber">
- <el-input
- disabled
- v-model="formValue.riskPointNumber"
- size="large"
- placeholder="请输入唯一风险点编号"
- style="width: 330px"
- />
- </el-form-item>
- <el-form-item label="风险点规格" prop="riskPointSpec">
- <el-input
- disabled
- v-model="formValue.riskPointSpec"
- size="large"
- placeholder="例如:容量500L、电压10kV"
- style="width: 330px"
- />
- </el-form-item>
- <el-form-item label="培训要求" prop="trainingRequirement">
- <el-input
- disabled
- v-model="formValue.trainingRequirement"
- size="large"
- placeholder="例如:持证上岗、年度复训"
- style="width: 330px"
- />
- </el-form-item>
- <el-form-item label="安全风险" prop="safetyRisk">
- <el-input
- disabled
- v-model="formValue.safetyRisk"
- size="large"
- placeholder="描述该风险点可能引发的安全问题"
- style="width: 330px"
- />
- </el-form-item>
- <el-form-item label="可能造成伤害" prop="possibleHarm">
- <el-input
- disabled
- v-model="formValue.possibleHarm"
- size="large"
- placeholder="例如:爆炸、中毒、触电、窒息等"
- style="width: 330px"
- />
- </el-form-item>
- <el-form-item label="主要管控措施" prop="mainControlMeasures">
- <el-input
- disabled
- v-model="formValue.mainControlMeasures"
- size="large"
- placeholder="例如:定期巡检、设置警示标识、配备防护装备"
- style="width: 330px"
- />
- </el-form-item>
- <el-form-item label="目前是否存在安全隐患" prop="currentHazard">
- <el-input
- disabled
- v-model="formValue.currentHazard"
- size="large"
- placeholder="例如:设备老化、线路裸露、通风不良"
- style="width: 330px"
- />
- </el-form-item>
- <el-form-item label="隐患内容" prop="hazardContent">
- <el-input
- disabled
- v-model="formValue.hazardContent"
- size="large"
- placeholder="详细描述当前存在的隐患情况"
- style="width: 330px"
- />
- </el-form-item>
- <el-form-item label="应急预案名称" prop="emergencyPlanName">
- <el-input
- disabled
- v-model="formValue.emergencyPlanName"
- size="large"
- placeholder="例如:《危化品泄漏应急处置预案》"
- style="width: 330px"
- />
- </el-form-item>
- <el-form-item label="应急预案编号" prop="emergencyPlanNumber">
- <el-input
- disabled
- v-model="formValue.emergencyPlanNumber"
- size="large"
- placeholder="例如:YJYA-2024-001"
- style="width: 330px"
- />
- </el-form-item>
- <el-form-item label="演练计划及实施情况" prop="rectificationPlan">
- <el-input
- disabled
- v-model="formValue.rectificationPlan"
- size="large"
- placeholder="例如:每季度演练一次,最近一次于2025年12月完成"
- style="width: 330px"
- />
- </el-form-item>
- <el-form-item label="风险等级" prop="riskLevel">
- <el-select
- disabled
- v-model="formValue.riskLevel"
- size="large"
- placeholder="请选择风险等级"
- style="width: 330px"
- >
- <el-option :value="1" label="高" />
- <el-option :value="2" label="中" />
- <el-option :value="3" label="低" />
- </el-select>
- </el-form-item>
- <el-form-item>
- <div style="width: 330px"></div>
- </el-form-item>
- <el-form-item label="备注" prop="remarks" style="width: 87.2%">
- <el-input
- disabled
- type="textarea"
- v-model="formValue.remarks"
- size="large"
- :rows="7"
- placeholder="可填写其他补充说明"
- />
- </el-form-item>
- <h4>信息变更</h4>
- <el-form-item label="部门名称" prop="responsibleDepartmentTodo">
- <el-cascader
- style="width: 330px"
- ref="cascaderTodoRef"
- size="large"
- :options="firstLevelDepts"
- :props="cascaderProp"
- :show-all-levels="false"
- placeholder="请选择责任部门"
- filterable
- @change="() => handleChangeDept('responsibleDepartmentTodo')"
- />
- </el-form-item>
- <el-form-item label="责任人姓名" prop="roomSafetyResponsibleTodo">
- <el-select
- v-model="formValue.roomSafetyResponsibleTodo"
- placeholder="请选择"
- size="large"
- style="width: 330px"
- filterable
- >
- <el-option
- v-for="item in roomSafetyResponsibleTodoOptions"
- :key="item.value"
- :label="item.label"
- :value="item.value"
- />
- </el-select>
- </el-form-item>
- <el-form-item>
- <div style="width: 330px"></div>
- </el-form-item>
- <el-form-item label="变更原因" prop="changeReason" style="width: 87.2%">
- <el-input
- type="textarea"
- v-model="formValue.changeReason"
- size="large"
- :rows="7"
- placeholder="请填写驳回审批原因"
- />
- </el-form-item>
- </el-form>
- </main>
- <footer class="safety-platform-container__footer">
- <el-button @click="$router.push({ name: 'areaResponsibilities:public' })">返回</el-button>
- <el-button type="primary" :loading="submiting" @click="handleSubmit">提交</el-button>
- </footer>
- </div>
- </template>
- <script lang="ts" setup>
- import { ref, reactive, onMounted, nextTick } from 'vue';
- import { useRouter, useRoute } from 'vue-router';
- import { ElMessage } from 'element-plus';
- import { getAllDepartments } from '@/api/auth/dept';
- import { formatDeptTree } from '@/views/disaster/utils/formatDeptTree';
- import {
- queryAvailableUserList,
- safetyRiskListChange,
- safetyRiskListQueryDetail,
- } from '@/api/production-safety/responsibility-implementation';
- const router = useRouter();
- const route = useRoute();
- const formRef = ref<any>(null);
- const submiting = ref(false);
- const userOptions = ref<any[]>([]);
- const firstLevelDepts = ref<any[]>([]);
- const cascaderProp = {
- expandTrigger: 'click',
- checkStrictly: true,
- value: 'id',
- label: 'deptName',
- };
- const cascaderRef = ref<any>();
- const cascaderTodoRef = ref<any>();
- const roomSafetyResponsibleTodoOptions = ref<any[]>([]);
- const formValue = reactive({
- buildingArea: '',
- buildingName: '',
- safetyResponsibleBuilding: '',
- floorLocation: '',
- safetyResponsibleFloor: '',
- roomName: '',
- responsibleDepartment: '',
- roomSafetyResponsible: '',
- hasRiskPoint: '',
- riskCategory: '',
- riskPointName: '',
- riskPointNumber: '',
- riskPointSpec: '',
- trainingRequirement: '',
- safetyRisk: '',
- possibleHarm: '',
- mainControlMeasures: '',
- currentHazard: '',
- hazardContent: '',
- emergencyPlanName: '',
- emergencyPlanNumber: '',
- rectificationPlan: '',
- riskLevel: '',
- remarks: '',
- changeReason: '',
- responsibleDepartmentTodo: '',
- roomSafetyResponsibleTodo: '',
- responsibleDepartmentId: [],
- });
- const rules = reactive({
- buildingArea: [{ required: true, message: '请输入楼号', trigger: 'blur' }],
- buildingName: [{ required: true, message: '请输入楼宇/区域', trigger: 'blur' }],
- safetyResponsibleBuilding: [{ required: true, message: '请输入楼层/房号', trigger: 'blur' }],
- floorLocation: [{ required: true, message: '请输入名称/功能', trigger: 'blur' }],
- safetyResponsibleFloor: [{ required: true, message: '请选择安全责任所/中心', trigger: 'change' }],
- roomName: [{ required: true, message: '请选择安全责任所/中心负责人', trigger: 'change' }],
- responsibleDepartment: [{ required: true, message: '请选择安全责任部门', trigger: 'change' }],
- roomSafetyResponsible: [{ required: true, message: '请输入房间安全责任人', trigger: 'blur' }],
- hasRiskPoint: [{ required: true, message: '请选择是否有风险点', trigger: 'change' }],
- riskCategory: [{ required: true, message: '请选择风险类别', trigger: 'change' }],
- riskPointName: [{ required: true, message: '请输入风险点名称', trigger: 'blur' }],
- riskPointNumber: [{ required: true, message: '请输入风险点编号', trigger: 'blur' }],
- riskPointSpec: [{ required: true, message: '请输入风险点规格/参数', trigger: 'blur' }],
- trainingRequirement: [{ required: true, message: '请输入培训要求', trigger: 'blur' }],
- safetyRisk: [{ required: true, message: '请输入安全风险描述', trigger: 'blur' }],
- possibleHarm: [{ required: true, message: '请输入可能造成的伤害', trigger: 'blur' }],
- mainControlMeasures: [{ required: true, message: '请输入主要控制措施', trigger: 'blur' }],
- currentHazard: [{ required: true, message: '请选择当前隐患状态', trigger: 'change' }],
- hazardContent: [{ required: true, message: '请输入隐患内容', trigger: 'blur' }],
- emergencyPlanName: [{ required: true, message: '请输入应急预案名称', trigger: 'blur' }],
- emergencyPlanNumber: [{ required: true, message: '请输入应急预案编号', trigger: 'blur' }],
- rectificationPlan: [{ required: true, message: '请输入整改方案', trigger: 'blur' }],
- riskLevel: [{ required: true, message: '请选择风险等级', trigger: 'change' }],
- responsibleDepartmentTodo: [{ required: true, message: '请选择变更后的责任部门', trigger: 'change' }],
- roomSafetyResponsibleTodo: [{ required: true, message: '请选择变更后的责任人', trigger: 'change' }],
- changeReason: [{ required: true, message: '请输入变更原因', trigger: 'blur' }],
- remarks: [],
- });
- const handleChangeDept = (prop) => {
- const cascader = cascaderTodoRef.value;
- const deptInfo = cascader?.getCheckedNodes();
- formValue[prop] = deptInfo[0].label;
- formRef.value.validateField(prop);
- nextTick(() => {
- handleQueryAvailableUserList(deptInfo[0].label, prop);
- });
- };
- const getDeptData = () => {
- getAllDepartments().then((res) => {
- firstLevelDepts.value = formatDeptTree(res);
- });
- };
- const handleQueryAvailableUserList = (deptName = '', prop = '', realname = '') => {
- queryAvailableUserList({
- pageNumber: 1,
- pageSize: 200,
- queryParam: {
- deptName,
- realname,
- },
- }).then((res: any) => {
- switch (prop) {
- case 'responsibleDepartmentTodo':
- formValue.roomSafetyResponsibleTodo = '';
- roomSafetyResponsibleTodoOptions.value = (res.records || []).map((u: any) => ({
- value: u.userId || u.id,
- label: u.realname,
- }));
- break;
- default:
- break;
- }
- });
- };
- const loadDetailData = (id: number) => {
- safetyRiskListQueryDetail(id).then((res: any) => {
- Object.keys(formValue).forEach((key) => {
- if (res[key] !== undefined) {
- formValue[key] = res[key];
- formValue['responsibleDepartmentId'] = res['responsibleDepartmentId']
- ? res['responsibleDepartmentId'].split(',').map((item: string) => Number(item))
- : [];
- }
- });
- });
- };
- // const getUserData = () => {
- // getUserList({ pageNumber: 1, pageSize: 200, queryParam: {} }).then((res: any) => {
- // userOptions.value = (res.records || []).map((u: any) => ({
- // id: u.userId || u.id,
- // name: u.realName || u.username,
- // }));
- // });
- // };
- onMounted(() => {
- getDeptData();
- loadDetailData(Number(route.query.id));
- handleQueryAvailableUserList('');
- });
- const handleSubmit = () => {
- formRef.value?.validate((valid: boolean) => {
- if (valid) {
- submiting.value = true;
- safetyRiskListChange({
- id: route.query.id,
- responsibleDepartmentTodo: formValue.responsibleDepartmentTodo,
- roomSafetyResponsibleTodo: formValue.roomSafetyResponsibleTodo,
- changeReason: formValue.changeReason,
- })
- .then(() => {
- ElMessage.success('变更成功!');
- router.push({ name: 'riskManage' });
- })
- .finally(() => {
- submiting.value = false;
- });
- }
- });
- };
- </script>
- <style lang="scss" scoped>
- @use '@/styles/page-main-layout.scss' as *;
- @use '@/styles/page-details-layout.scss' as *;
- @use '@/styles/basic-table-action.scss' as *;
- .editor-container {
- border: 1px solid #dcdfe6;
- border-radius: 4px;
- margin-right: 20px;
- overflow: hidden;
- // :deep(.w-e-text-container) {
- // min-height: 400px;
- // overflow-y: auto;
- // }
- }
- // :deep(.breadcrumb .title) {
- // margin-left: 0;
- // }
- // .main {
- // display: flex;
- // flex-direction: column;
- // padding: 20px;
- // flex: 1;
- // overflow: hidden;
- // background-color: #fff;
- // }
- // .button-content {
- // margin-bottom: 20px;
- // }
- // .page-content {
- // display: flex;
- // justify-content: flex-end;
- // }
- // // :deep(.el-form) {
- // // flex: 1;
- // // overflow: hidden;
- // // overflow-y: auto;
- // // }
- </style>
|