integrated_traffic_vue/src/components/risk_add/index.vue

397 lines
12 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<el-form ref="formRef" :rules="defineRules" :model="form" label-width="240px">
<el-row>
<el-col :span="24" v-if="!infoIsEmpty">
<el-form-item label="管控部门" prop="DEPTNAME">
<el-input :model-value="info.DEPTNAME" disabled />
</el-form-item>
</el-col>
<el-col :span="24" v-if="infoIsEmpty">
<el-form-item label="管控部门" prop="DEPARTMENT_ID">
<layout-department
v-model="form.DEPARTMENT_ID"
@update:model-value="fnDepartmentChange"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="管控责任人" prop="USER_ID">
<el-input v-model="form.USER_ID" />
</el-form-item>
</el-col>
<template v-if="!infoIsEmpty">
<el-col :span="24">
<el-form-item label="风险点(单元)" prop="RISKUNITNAME">
<el-input :model-value="info.RISKUNITNAME" disabled />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="辨识部位" prop="PARTSNAME">
<el-input :model-value="info.PARTSNAME" disabled />
</el-form-item>
</el-col>
</template>
<template v-if="infoIsEmpty">
<el-col :span="24">
<el-form-item label="风险点(单元)" prop="RISK_UNIT_ID">
<el-select v-model="form.RISK_UNIT_ID" @change="fnRiskUnitChange">
<el-option
v-for="item in unitList"
:key="item.RISKUNIT_ID"
:label="item.DEPT_NAME + '-' + item.RISKUNITNAME"
:value="item.RISKUNIT_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="辨识部位" prop="IDENTIFICATION_ID">
<el-select v-model="form.IDENTIFICATION_ID">
<el-option
v-for="item in partsList"
:key="item.IDENTIFICATIONPARTS_ID"
:label="item.PARTSNAME"
:value="item.IDENTIFICATIONPARTS_ID"
/>
</el-select>
</el-form-item>
</el-col>
</template>
<el-col :span="24">
<el-form-item label="存在风险" prop="RISK_DESCR">
<el-input
v-model="form.RISK_DESCR"
type="textarea"
:autosize="{
minRows: 3,
}"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="事故发生的可能性" prop="LIKELIHOOD">
<el-select v-model="form.LIKELIHOOD">
<el-option :value="10" label="完全可以预料" />
<el-option :value="6" label="相当可能" />
<el-option :value="3" label="可能,但不经常" />
<el-option :value="1" label="可能性小,完全意外" />
<el-option :value="0.5" label="很不可能,可以设想" />
<el-option :value="0.2" label="极不可能" />
<el-option :value="0.1" label="实际不可能" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="分值">
{{ form.LIKELIHOOD }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="人员暴露于危险环境中的频繁程度" prop="EXPOSURE">
<el-select v-model="form.EXPOSURE">
<el-option :value="10" label="连续暴露" />
<el-option :value="6" label="每天工作时间内暴露" />
<el-option :value="3" label="每周一次或偶然暴露" />
<el-option :value="2" label="每月一次暴露,完全意外" />
<el-option :value="1" label="每年几次暴露" />
<el-option :value="0.5" label="非常罕见暴露" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="分值">
{{ form.EXPOSURE }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="一旦发生事故可能造成的后果" prop="CONSEQUENCE">
<el-select v-model="form.CONSEQUENCE">
<el-option :value="100" label="10人以上死亡" />
<el-option :value="40" label="39人死亡" />
<el-option :value="15" label="12人死亡" />
<el-option :value="7" label="严重" />
<el-option :value="3" label="重大,伤残" />
<el-option :value="1" label="引人注意" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="分值">
{{ form.CONSEQUENCE }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="风险分级" prop="LEVEL_NAME">
{{ form.LEVEL_NAME }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="总分值" prop="DANGER">
{{ form.DANGER }}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="管控措施" prop="MEASURES">
<el-input
v-model="form.MEASURES"
type="textarea"
:autosize="{
minRows: 3,
}"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="事故类型" prop="ACCIDENTS">
<el-select v-model="form.ACCIDENTS" multiple>
<el-option
v-for="item in accidentTypeList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="应急处置措施" prop="EME_MEASURES">
<el-input
v-model="form.EME_MEASURES"
type="textarea"
:autosize="{
minRows: 3,
}"
/>
</el-form-item>
</el-col>
<template v-if="control">
<el-col :span="24">
<el-form-item label="管控措施分类1" prop="MANAGEMENT_CONTROL_ONE">
<el-select
v-model="form.MANAGEMENT_CONTROL_ONE"
@change="form.MANAGEMENT_CONTROL_TWO = ''"
>
<el-option
v-for="item in controlList1"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="管控措施分类2" prop="MANAGEMENT_CONTROL_TWO">
<el-select v-model="form.MANAGEMENT_CONTROL_TWO">
<el-option
v-for="item in controlList2"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="管控措施分类3" prop="MANAGEMENT_CONTROL_THREE">
<el-input
v-model="form.MANAGEMENT_CONTROL_THREE"
type="textarea"
:autosize="{
minRows: 3,
}"
/>
</el-form-item>
</el-col>
</template>
<slot />
</el-row>
</el-form>
</template>
<script setup>
import { ref, watch, watchEffect } from "vue";
import { useVModel } from "@vueuse/core";
import {
layoutFnGetAccidentType,
layoutFnGetControlMeasures1,
layoutFnGetControlMeasures2,
} from "@/assets/js/data_dictionary.js";
import useFormValidate from "@/assets/js/useFormValidate.js";
import LayoutDepartment from "@/components/department/index.vue";
import { isEmpty } from "lodash-es";
import {
getIdentifyingPartsListAll,
getRiskPointListAllById,
} from "@/request/risk_control.js";
defineOptions({
name: "LayoutRiskAdd",
});
const props = defineProps({
form: {
type: Object,
required: true,
default: () => ({}),
},
info: {
type: Object,
default: () => ({}),
},
control: {
type: Boolean,
default: false,
},
rules: {
type: Object,
default: () => ({}),
},
});
const emits = defineEmits(["update:form"]);
const form = useVModel(props, "form", emits);
const defineRules = {
USER_ID: [{ required: true, message: "管控责任人不能为空", trigger: "blur" }],
RISK_DESCR: [
{ required: true, message: "存在风险不能为空", trigger: "blur" },
],
LIKELIHOOD: [
{ required: true, message: "事故发生的可能性不能为空", trigger: "change" },
],
EXPOSURE: [
{
required: true,
message: "人员暴露于危险环境中的频繁程度不能为空",
trigger: "change",
},
],
CONSEQUENCE: [
{
required: true,
message: "一旦发生事故可能造成的后果不能为空",
trigger: "change",
},
],
LEVEL_NAME: [
{ required: true, message: "风险分级不能为空", trigger: "change" },
],
MEASURES: [{ required: true, message: "管控措施不能为空", trigger: "blur" }],
EME_MEASURES: [
{ required: true, message: "应急处置措施不能为空", trigger: "blur" },
],
ACCIDENTS: [
{ required: true, message: "事故类型不能为空", trigger: "change" },
],
DEPARTMENT_ID: [
{ required: true, message: "部门不能为空", trigger: "change" },
],
RISK_UNIT_ID: [
{ required: true, message: "风险点(单元)不能为空", trigger: "change" },
],
IDENTIFICATION_ID: [
{ required: true, message: "辨识部位不能为空", trigger: "change" },
],
...props.rules,
};
const formRef = ref(null);
const infoIsEmpty = ref(isEmpty(props.info));
const unitList = ref([]);
const partsList = ref([]);
const controlList2 = ref([]);
const fnGetLevelName = (LIKELIHOOD, EXPOSURE, CONSEQUENCE) => {
const DANGER = (LIKELIHOOD * EXPOSURE * CONSEQUENCE).toFixed(2);
if (DANGER > 320) {
form.value.LEVELID = "levelA";
form.value.LEVEL_NAME = "重大风险/A级";
} else if (DANGER > 160) {
form.value.LEVELID = "levelB";
form.value.LEVEL_NAME = "较大风险/B级";
} else if (DANGER > 70) {
form.value.LEVELID = "levelC";
form.value.LEVEL_NAME = "一般风险/C级";
} else {
form.value.LEVELID = "levelD";
form.value.LEVEL_NAME = "低风险/D级";
}
form.value.DANGER = DANGER;
};
watch(
[
() => props.form.LIKELIHOOD,
() => props.form.EXPOSURE,
() => props.form.CONSEQUENCE,
],
([LIKELIHOOD, EXPOSURE, CONSEQUENCE]) => {
if (!LIKELIHOOD || !EXPOSURE || !CONSEQUENCE) return;
fnGetLevelName(LIKELIHOOD, EXPOSURE, CONSEQUENCE);
},
{
immediate: true,
}
);
const fnGetUnitList = async () => {
const resData = await getRiskPointListAllById({
DEPARTMENT_ID: form.value.DEPARTMENT_ID,
});
unitList.value = resData.unitList;
};
const fnGetPartsList = async () => {
const resData = await getIdentifyingPartsListAll({
RISK_UNIT_ID: form.value.RISK_UNIT_ID,
});
partsList.value = resData.partsList;
};
const fnControlList1Change = () => {
controlList2.value = [];
const id = form.value.MANAGEMENT_CONTROL_ONE;
let BZ = "";
for (let i = 0; i < controlList1.value.length; i++) {
if (controlList1.value[i].id === id) {
BZ = controlList1.value[i].BZ;
break;
}
}
for (let i = 0; i < controlList2All.value.length; i++) {
if (controlList2All.value[i].TBFIELD === BZ) {
controlList2.value.push(controlList2All.value[i]);
}
}
};
const fnDepartmentChange = () => {
form.value.RISK_UNIT_ID = "";
form.value.IDENTIFICATION_ID = "";
unitList.value = [];
partsList.value = [];
};
const fnRiskUnitChange = () => {
form.value.IDENTIFICATION_ID = "";
partsList.value = [];
};
watchEffect(() => {
if (form.value.DEPARTMENT_ID) fnGetUnitList();
if (form.value.RISK_UNIT_ID) fnGetPartsList();
if (form.value.MANAGEMENT_CONTROL_ONE) fnControlList1Change();
});
const fnReset = () => {
formRef.value.resetFields();
};
const fnFormValidate = async () => {
await useFormValidate(formRef);
};
const fnAccidentsName = () => {
return accidentTypeList.value
.filter((item) => form.value.ACCIDENTS.includes(item.BIANMA))
.map((item) => item.NAME)
.join(",");
};
defineExpose({
reset: fnReset,
formValidate: fnFormValidate,
accidentsName: fnAccidentsName,
});
const accidentTypeList = await layoutFnGetAccidentType();
const controlList1 = props.control && (await layoutFnGetControlMeasures1());
const controlList2All = props.control && (await layoutFnGetControlMeasures2());
</script>
<style scoped lang="scss"></style>