pull/1/head
z 2024-01-13 17:35:14 +08:00
parent a46297da57
commit fef033926e
17 changed files with 2034 additions and 300 deletions
src
views
hazard_investigation
checklist_inspection_status
inventory_troubleshooting/components

View File

@ -427,6 +427,114 @@ export default [
},
],
},
{
path: "/hidden_danger_government",
redirect: "/hidden_danger_government/rectification",
meta: { title: "隐患治理", model: MODEL["1"] },
component: "children",
children: [
{
path: "/hidden_danger_government/rectification",
meta: { title: "隐患整改", isSubMenu: false },
component: "children",
children: [
{
path: "",
component: "hidden_danger_government/rectification/index",
},
{
path: "/hidden_danger_government/rectification/view",
meta: {
title: "查看",
activeMenu: "/hidden_danger_government/rectification",
},
component: "hidden_danger_government/rectification/view",
},
{
path: "/hidden_danger_government/rectification/rectification",
meta: {
title: "整改",
activeMenu: "/hidden_danger_government/rectification",
},
component: "hidden_danger_government/rectification/rectification",
},
],
},
{
path: "/hidden_danger_government/acceptance",
meta: { title: "隐患验收", isSubMenu: false },
component: "children",
children: [
{
path: "",
component: "hidden_danger_government/acceptance/index",
},
{
path: "/hidden_danger_government/acceptance/view",
meta: {
title: "查看",
activeMenu: "/hidden_danger_government/acceptance",
},
component: "hidden_danger_government/acceptance/view",
},
{
path: "/hidden_danger_government/acceptance/acceptance",
meta: {
title: "验收",
activeMenu: "/hidden_danger_government/acceptance",
},
component: "hidden_danger_government/acceptance/acceptance",
},
],
},
{
path: "/hidden_danger_government/major",
meta: { title: "重大隐患", isSubMenu: false },
component: "children",
children: [
{
path: "",
component: "hidden_danger_government/major/index",
},
{
path: "/hidden_danger_government/major/view",
meta: {
title: "查看",
activeMenu: "/hidden_danger_government/major",
},
component: "hidden_danger_government/major/view",
},
],
},
{
path: "/hidden_danger_government/ledger",
meta: { title: "隐患台账", isSubMenu: false },
component: "children",
children: [
{
path: "",
component: "hidden_danger_government/ledger/index",
},
{
path: "/hidden_danger_government/ledger/add",
meta: {
title: "新增",
activeMenu: "/hidden_danger_government/ledger",
},
component: "hidden_danger_government/ledger/add",
},
{
path: "/hidden_danger_government/ledger/view",
meta: {
title: "查看",
activeMenu: "/hidden_danger_government/ledger",
},
component: "hidden_danger_government/ledger/view",
},
],
},
],
},
{
path: "/platform_resource_library",
redirect: "/platform_resource_library/courseware",

View File

@ -0,0 +1,15 @@
import { post, upload } from "@/request/axios.js";
export const getHiddenDangerList = (params) => post("/hidden/list", params); // 隐患列表
export const getHiddenDangerRectificationWhy = (params) =>
post("/app/corpinfo/goqyzzh", params); // 隐患整改不知道在获取什么
export const setHiddenDangerRectificationNormalSubmit = (params) =>
upload("/hidden/rectify", params); // 隐患整改正常整改提交
export const setHiddenDangerRectificationAbnormalSubmit = (params) =>
post("/hidden/editRec", params); // 隐患整改不正常整改提交
export const setHiddenDangerAcceptSubmit = (params) =>
post("/hidden/check", params); // 隐患验证提交
export const setHiddenDangerCancelMajorHazards = (params) =>
post("/hidden/editHIDDENLEVEL", params); // 重大隐患管理取消重大隐患
export const setHiddenDangerConfirmMajorHazards = (params) =>
post("/hidden/editISCONFIRM", params); // 重大隐患管理确认重大隐患

View File

@ -27,6 +27,9 @@
<el-descriptions-item label="隐患级别">
{{ data.info.HIDDENLEVELNAME }}
</el-descriptions-item>
<el-descriptions-item label="隐患类型">
{{ data.info.HIDDENTYPE_NAME }}
</el-descriptions-item>
<el-descriptions-item label="隐患状态">
<span v-if="data.info.STATE === '1'"> </span>
<span v-else-if="data.info.STATE === '3'"> 已整改 </span>
@ -73,17 +76,22 @@
class="ml-10"
/>
</el-descriptions-item>
<el-descriptions-item label="隐患视频" v-if="data.videoSrc">
<el-descriptions-item
label="隐患视频"
v-if="data.videoDialog.src"
class-name="print_no_use"
label-class-name="print_no_use"
>
<el-icon
size="30px"
@click="data.videoVisible = true"
@click="data.videoDialog.visible = true"
style="cursor: pointer"
>
<video-play />
</el-icon>
<layout-video
v-model:visible="data.videoVisible"
:src="data.videoSrc"
v-model:visible="data.videoDialog.visible"
:src="data.videoDialog.src"
/>
</el-descriptions-item>
</el-descriptions>
@ -239,6 +247,7 @@ const props = defineProps({
default: "",
},
});
const emits = defineEmits(["throw-data"]);
const data = reactive({
info: {},
hs: {},
@ -247,8 +256,10 @@ const data = reactive({
sImgs: [],
pImgs: [],
checkList: [],
videoSrc: "",
videoVisible: false,
videoDialog: {
src: "",
visible: false,
},
});
const fnGetData = async () => {
const resData = await getHiddenDangerView({
@ -259,7 +270,7 @@ const fnGetData = async () => {
data.checkList = resData.checkList;
for (let i = 0; i < resData.hImgs.length; i++) {
if (getFileSuffix(resData.hImgs[i].FILEPATH) === "mp4") {
data.videoSrc = VITE_FILE_URL + resData.hImgs[i].FILEPATH;
data.videoDialog.src = VITE_FILE_URL + resData.hImgs[i].FILEPATH;
} else {
data.hImgs.push(resData.hImgs[i]);
}
@ -267,6 +278,7 @@ const fnGetData = async () => {
data.rImgs = resData.rImgs;
data.sImgs = resData.sImgs;
data.pImgs = resData.pImgs;
emits("throw-data", data.info);
};
fnGetData();
</script>

View File

@ -1,6 +1,11 @@
<template>
<layout-card>
<hidden-view :hidden-id="HIDDEN_ID" />
<div id="printContent">
<hidden-view :hidden-id="HIDDEN_ID" />
</div>
<div class="tc mt-10" v-if="print">
<el-button type="primary" v-print="'#printContent'"></el-button>
</div>
</layout-card>
</template>
@ -10,6 +15,12 @@ import { useRoute } from "vue-router";
const route = useRoute();
const { HIDDEN_ID } = route.query;
defineProps({
print: {
type: Boolean,
default: false,
},
});
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,348 @@
<template>
<el-row :gutter="24">
<el-col
:span="
hiddenType === 'unqualified' || hiddenType === 'otherHidden' ? 12 : 24
"
>
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
<el-row>
<el-col :span="24" v-if="hiddenType === 'unqualified'">
<el-form-item label="检查内容" prop="CHECK_CONTENT">
<el-input
:model-value="info.CHECK_CONTENT"
disabled
type="textarea"
autosize
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="隐患部位" prop="HIDDENPART">
<el-input
v-model="form.HIDDENPART"
placeholder="请输入内容"
@blur="fnGetHiddenDangerDatabaseList"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="隐患描述" prop="HIDDENDESCR">
<el-input
v-model="form.HIDDENDESCR"
placeholder="请输入内容"
type="textarea"
:autosize="{ minRows: 3 }"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="隐患级别" prop="HIDDENLEVEL">
<el-select
v-model="form.HIDDENLEVEL"
@change="
form.HIDDENLEVEL === 'hiddenLevel0002'
? (form.RECTIFICATIONTYPE = '2')
: null
"
>
<el-option
v-for="item in hazardLevelList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24" v-if="info.BAO_BAO_TYPE === '1'">
<el-form-item label="隐患类别" prop="HIDDEN_CATEGORY">
<el-select v-model="form.HIDDEN_CATEGORY">
<el-option
v-for="item in hazardCategoriesList"
:key="item.DICTIONARIES_ID"
:label="item.NAME"
:value="item.DICTIONARIES_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="隐患类型" prop="HIDDENTYPE">
<layout-hidden-danger-type
v-model="form.HIDDENTYPE"
ref="hiddenDangerTypeRef"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="隐患图片" prop="hiddenImgs">
<layout-upload
v-model:file-list="form.hiddenImgs"
list-type="picture-card"
accept=".jpg,.jpeg,.png"
:limit="99"
delete-to-server
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="隐患视频" prop="videoFiles">
<layout-upload
v-model:file-list="form.videoFiles"
accept=".mp4"
:size="50"
@preview="fnVideoPreview"
>
<template #tip>只能上传mp4文件且不超过50M</template>
</layout-upload>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="隐患处置" prop="RECTIFICATIONTYPE">
<el-radio-group v-model="form.RECTIFICATIONTYPE">
<el-radio
:disabled="form.HIDDENLEVEL === 'hiddenLevel0002'"
label="1"
>
立即整改
</el-radio>
<el-radio label="2">限期整改</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<template v-if="form.RECTIFICATIONTYPE === '1'">
<el-col :span="24">
<el-form-item prop="RECTIFYDESCR" label="整改描述">
<el-input
v-model="form.RECTIFYDESCR"
placeholder="请输入内容"
type="textarea"
:autosize="{ minRows: 3 }"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="整改后图片" prop="rectifyImgs">
<layout-upload
v-model:file-list="form.rectifyImgs"
list-type="picture-card"
accept=".jpg,.jpeg,.png"
:limit="99"
delete-to-server
/>
</el-form-item>
</el-col>
</template>
<template v-if="form.RECTIFICATIONTYPE === '2'">
<el-col :span="24">
<el-form-item prop="RECTIFICATIONDEADLINE" label="整改期限">
<el-date-picker
v-model="form.RECTIFICATIONDEADLINE"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
type="date"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="整改部门" prop="RECTIFICATIONDEPT">
<layout-department
v-model="form.RECTIFICATIONDEPT"
@update:model-value="form.RECTIFICATIONOR = ''"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="整改人" prop="RECTIFICATIONOR">
<el-select v-model="form.RECTIFICATIONOR">
<el-option
v-for="item in data.rectifyUserList"
:key="item.USER_ID"
:label="item.NAME"
:value="item.USER_ID"
/>
</el-select>
</el-form-item>
</el-col>
</template>
</el-row>
</el-form>
</el-col>
<el-col
:span="12"
v-if="hiddenType === 'unqualified' || hiddenType === 'otherHidden'"
>
<div
v-for="item in data.list"
:key="item.HIDDEN_LIBRARY_ID"
class="item"
@click="fnChoice(item)"
>
<el-descriptions :column="1" border>
<el-descriptions-item label="风险单元名称">
{{ item.RISK_UNIT_NAME }}
</el-descriptions-item>
<el-descriptions-item label="隐患部位">
{{ item.HIDDEN_PART }}
</el-descriptions-item>
<el-descriptions-item label="隐患描述">
{{ item.INSPECTION_BASIS }}
</el-descriptions-item>
</el-descriptions>
</div>
</el-col>
</el-row>
<layout-video
v-model:visible="data.videoDialog.visible"
:src="data.videoDialog.src"
/>
</template>
<script setup>
import LayoutDepartment from "@/components/department/index.vue";
import LayoutHiddenDangerType from "@/components/hazard_type/index.vue";
import LayoutUpload from "@/components/upload/index.vue";
import LayoutVideo from "@/components/video/index.vue";
import { reactive, ref, watchEffect } from "vue";
import { useVModel } from "@vueuse/core";
import { getHiddenDangerDatabaseList } from "@/request/hazard_investigation.js";
import {
layoutFnGetHazardCategories,
layoutFnGetHazardLevel,
} from "@/assets/js/data_dictionary.js";
import { getUserListAll } from "@/request/data_dictionary.js";
import useFormValidate from "@/assets/js/useFormValidate.js";
const props = defineProps({
form: {
type: Object,
required: true,
default: () => ({}),
},
info: {
type: Object,
default: () => ({}),
},
// unqualified
// otherHidden
// ledger
hiddenType: {
type: String,
required: true,
default: "",
},
});
const emits = defineEmits(["update:form"]);
const form = useVModel(props, "form", emits);
const rules = {
HIDDENPART: [{ required: true, message: "请输入隐患部位", trigger: "blur" }],
HIDDENDESCR: [{ required: true, message: "请输入隐患描述", trigger: "blur" }],
HIDDENLEVEL: [
{ required: true, message: "请选择隐患级别", trigger: "change" },
],
HIDDEN_CATEGORY: [
{ required: true, message: "请选择隐患类别", trigger: "change" },
],
HIDDENTYPE: [
{ required: true, message: "请选择隐患类型", trigger: "change" },
],
hiddenImgs: [
{ required: true, message: "请上传隐患图片", trigger: "change" },
],
RECTIFICATIONTYPE: [
{ required: true, message: "请选择隐患处置", trigger: "change" },
],
RECTIFYDESCR: [
{ required: true, message: "请输入整改描述", trigger: "blur" },
],
rectifyImgs: [
{ required: true, message: "请上传整改后图片", trigger: "change" },
],
RECTIFICATIONDEADLINE: [
{ required: true, message: "请选择整改期限", trigger: "change" },
],
RECTIFICATIONDEPT: [
{ required: true, message: "请选择整改部门", trigger: "change" },
],
RECTIFICATIONOR: [
{ required: true, message: "请选择整改人", trigger: "change" },
],
};
const formRef = ref(null);
const hiddenDangerTypeRef = ref(null);
const data = reactive({
list: [],
rectifyUserList: [],
videoDialog: {
visible: false,
src: "",
},
});
const fnVideoPreview = (event) => {
if (event.url) {
data.videoDialog.visible = true;
data.videoDialog.src = event.url;
}
};
const fnGetHiddenDangerDatabaseList = async () => {
if (props.hiddenType !== "unqualified" || props.hiddenType !== "otherHidden")
return;
if (!form.value.HIDDENPART) return;
const resData = await getHiddenDangerDatabaseList({
RISK_UNIT_NAME: props.info.RISKUNITNAME,
HIDDEN_PART: form.value.HIDDENPART,
});
data.list = resData.varList;
};
const fnChoice = (item) => {
form.value.HIDDENPART = item.HIDDEN_PART;
form.value.HIDDENDESCR = item.INSPECTION_BASIS;
form.value.HIDDENLEVEL = "hiddenLevel0001";
form.value.HIDDENTYPE = [
item.HIDDEN_TYPE_ONE,
item.HIDDEN_TYPE_TWO,
item.HIDDEN_TYPE_THREE,
];
};
const fnRectificationDepartmentChange = async (event) => {
const resData = await getUserListAll({
DEPARTMENT_ID: event,
});
data.rectifyUserList = resData.userList;
};
const fnReset = () => {
formRef.value.resetFields();
data.list = [];
data.rectifyUserList = [];
};
const fnFormValidate = async () => {
await useFormValidate(formRef);
};
const fnHiddenDangerTypeLabel = () => {
return hiddenDangerTypeRef.value.getCheckedNodes();
};
defineExpose({
reset: fnReset,
formValidate: fnFormValidate,
hiddenDangerTypeLabel: fnHiddenDangerTypeLabel,
});
const hazardLevelList = await layoutFnGetHazardLevel();
const hazardCategoriesList = await layoutFnGetHazardCategories();
watchEffect(() => {
if (form.value.RECTIFICATIONDEPT)
fnRectificationDepartmentChange(form.value.RECTIFICATIONDEPT);
});
</script>
<style scoped lang="scss">
.item {
cursor: pointer;
border-bottom: 1px dashed #ccc;
padding: 10px 0;
&:first-child {
padding-top: 0;
}
}
</style>

View File

@ -5,219 +5,31 @@
:on-close="fnClose"
width="1200"
>
<el-row :gutter="24">
<el-col :span="12">
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
<el-row>
<el-col :span="24" v-if="hiddenType === 'unqualified'">
<el-form-item label="检查内容" prop="CHECK_CONTENT">
<el-input
:model-value="info.CHECK_CONTENT"
disabled
type="textarea"
autosize
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="隐患部位" prop="HIDDENPART">
<el-input
v-model="form.HIDDENPART"
placeholder="请输入内容"
@blur="fnGetHiddenDangerDatabaseList"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="隐患描述" prop="HIDDENDESCR">
<el-input v-model="form.HIDDENDESCR" placeholder="请输入内容" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="隐患级别" prop="HIDDENLEVEL">
<el-select
v-model="form.HIDDENLEVEL"
@change="
form.HIDDENLEVEL === 'hiddenLevel0002'
? (form.RECTIFICATIONTYPE = '2')
: null
"
>
<el-option
v-for="item in hazardLevelList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24" v-if="info.BAO_BAO_TYPE === '1'">
<el-form-item label="隐患类别" prop="HIDDEN_CATEGORY">
<el-select v-model="form.HIDDEN_CATEGORY">
<el-option
v-for="item in hazardCategoriesList"
:key="item.DICTIONARIES_ID"
:label="item.NAME"
:value="item.DICTIONARIES_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="隐患类型" prop="HIDDENTYPE">
<layout-hidden-danger-type
v-model="form.HIDDENTYPE"
ref="hiddenDangerTypeRef"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="隐患图片" prop="hiddenImgs">
<layout-upload
v-model:file-list="form.hiddenImgs"
list-type="picture-card"
accept=".jpg,.jpeg,.png"
:limit="99"
delete-to-server
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="隐患视频" prop="videoFiles">
<layout-upload
v-model:file-list="form.videoFiles"
accept=".mp4"
:size="50"
@preview="fnVideoPreview"
>
<template #tip>只能上传mp4文件且不超过50M</template>
</layout-upload>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="隐患处置" prop="RECTIFICATIONTYPE">
<el-radio-group v-model="form.RECTIFICATIONTYPE">
<el-radio
:disabled="form.HIDDENLEVEL === 'hiddenLevel0002'"
label="1"
>
立即整改
</el-radio>
<el-radio label="2">限期整改</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<template v-if="form.RECTIFICATIONTYPE === '1'">
<el-col :span="24">
<el-form-item prop="RECTIFYDESCR" label="整改描述">
<el-input
v-model="form.RECTIFYDESCR"
placeholder="请输入内容"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="整改后图片" prop="rectifyImgs">
<layout-upload
v-model:file-list="form.rectifyImgs"
list-type="picture-card"
accept=".jpg,.jpeg,.png"
:limit="99"
delete-to-server
/>
</el-form-item>
</el-col>
</template>
<template v-if="form.RECTIFICATIONTYPE === '2'">
<el-col :span="24">
<el-form-item prop="RECTIFICATIONDEADLINE" label="整改期限">
<el-date-picker
v-model="form.RECTIFICATIONDEADLINE"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
type="date"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="整改部门" prop="RECTIFICATIONDEPT">
<layout-department
v-model="form.RECTIFICATIONDEPT"
@update:model-value="form.RECTIFICATIONOR = ''"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="整改人" prop="RECTIFICATIONOR">
<el-select v-model="form.RECTIFICATIONOR">
<el-option
v-for="item in data.rectifyUserList"
:key="item.USER_ID"
:label="item.NAME"
:value="item.USER_ID"
/>
</el-select>
</el-form-item>
</el-col>
</template>
</el-row>
</el-form>
</el-col>
<el-col :span="12">
<div
v-for="item in data.list"
:key="item.HIDDEN_LIBRARY_ID"
class="item"
@click="fnChoice(item)"
>
<el-descriptions :column="1" border>
<el-descriptions-item label="风险单元名称">
{{ item.RISK_UNIT_NAME }}
</el-descriptions-item>
<el-descriptions-item label="隐患部位">
{{ item.HIDDEN_PART }}
</el-descriptions-item>
<el-descriptions-item label="隐患描述">
{{ item.INSPECTION_BASIS }}
</el-descriptions-item>
</el-descriptions>
</div>
</el-col>
</el-row>
<hidden-add
:hidden-type="hiddenType"
:info="info"
v-model:form="form"
ref="hiddenAddRef"
/>
<template #footer>
<el-button @click="fnClose"></el-button>
<el-button type="primary" @click="fnSubmit"></el-button>
</template>
</el-dialog>
<layout-video
v-model:visible="data.videoDialog.visible"
:src="data.videoDialog.src"
/>
</template>
<script setup>
import { reactive, ref, watchEffect } from "vue";
import LayoutUpload from "@/components/upload/index.vue";
import { useVModels } from "@vueuse/core";
import { debounce } from "throttle-debounce";
import { ElMessage } from "element-plus";
import {
getHiddenDangerDatabaseList,
setHiddenDangerAdd,
setHiddenDangerEdit,
setHiddenDangerListAdd,
} from "@/request/hazard_investigation.js";
import {
layoutFnGetHazardCategories,
layoutFnGetHazardLevel,
} from "@/assets/js/data_dictionary.js";
import LayoutHiddenDangerType from "@/components/hazard_type/index.vue";
import LayoutVideo from "@/components/video/index.vue";
import LayoutDepartment from "@/components/department/index.vue";
import { getUserListAll } from "@/request/data_dictionary.js";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { setUploadImg } from "@/request/api.js";
import HiddenAdd from "./hidden_add.vue";
import { ref } from "vue";
const props = defineProps({
visible: {
@ -263,96 +75,15 @@ const props = defineProps({
});
const emits = defineEmits(["update:visible", "update:form", "submit"]);
const { visible, form } = useVModels(props, emits);
const rules = {
HIDDENPART: [{ required: true, message: "请输入隐患部位", trigger: "blur" }],
HIDDENDESCR: [{ required: true, message: "请输入隐患描述", trigger: "blur" }],
HIDDENLEVEL: [
{ required: true, message: "请选择隐患级别", trigger: "change" },
],
HIDDEN_CATEGORY: [
{ required: true, message: "请选择隐患类别", trigger: "change" },
],
HIDDENTYPE: [
{ required: true, message: "请选择隐患类型", trigger: "change" },
],
hiddenImgs: [
{ required: true, message: "请上传隐患图片", trigger: "change" },
],
RECTIFICATIONTYPE: [
{ required: true, message: "请选择隐患处置", trigger: "change" },
],
RECTIFYDESCR: [
{ required: true, message: "请输入整改描述", trigger: "blur" },
],
rectifyImgs: [
{ required: true, message: "请上传整改后图片", trigger: "change" },
],
RECTIFICATIONDEADLINE: [
{ required: true, message: "请选择整改期限", trigger: "change" },
],
RECTIFICATIONDEPT: [
{ required: true, message: "请选择整改部门", trigger: "change" },
],
RECTIFICATIONOR: [
{ required: true, message: "请选择整改人", trigger: "change" },
],
};
const formRef = ref(null);
const hiddenDangerTypeRef = ref(null);
const data = reactive({
list: [],
rectifyUserList: [],
videoDialog: {
visible: false,
src: "",
},
});
const hazardLevelList = await layoutFnGetHazardLevel();
const hazardCategoriesList = await layoutFnGetHazardCategories();
const fnGetHiddenDangerDatabaseList = async () => {
if (!form.value.HIDDENPART) return;
const resData = await getHiddenDangerDatabaseList({
RISK_UNIT_NAME: props.info.RISKUNITNAME,
HIDDEN_PART: form.value.HIDDENPART,
});
data.list = resData.varList;
};
const fnChoice = (item) => {
form.value.HIDDENPART = item.HIDDEN_PART;
form.value.HIDDENDESCR = item.INSPECTION_BASIS;
form.value.HIDDENLEVEL = "hiddenLevel0001";
form.value.HIDDENTYPE = [
item.HIDDEN_TYPE_ONE,
item.HIDDEN_TYPE_TWO,
item.HIDDEN_TYPE_THREE,
];
};
const fnVideoPreview = (event) => {
if (event.url) {
data.videoDialog.visible = true;
data.videoDialog.src = event.url;
}
};
const fnRectificationDepartmentChange = async (event) => {
const resData = await getUserListAll({
DEPARTMENT_ID: event,
});
data.rectifyUserList = resData.userList;
};
watchEffect(() => {
if (form.value.RECTIFICATIONDEPT)
fnRectificationDepartmentChange(form.value.RECTIFICATIONDEPT);
});
const hiddenAddRef = ref(null);
const fnClose = () => {
formRef.value.resetFields();
data.list = [];
data.rectifyUserList = [];
hiddenAddRef.value.reset();
visible.value = false;
};
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
await hiddenAddRef.value.formValidate();
let currentHiddenId = "";
let params = {
...form.value,
@ -360,7 +91,7 @@ const fnSubmit = debounce(
HIDDENTYPE1: form.value.HIDDENTYPE[0],
HIDDENTYPE2: form.value.HIDDENTYPE[1],
HIDDENTYPE3: form.value.HIDDENTYPE[2],
HIDDENTYPE_NAME: hiddenDangerTypeRef.value.getCheckedNodes(),
HIDDENTYPE_NAME: hiddenAddRef.value.hiddenDangerTypeLabel(),
LISTMANAGER_ID: props.listManagerId,
};
if (props.hiddenType === "unqualified") {
@ -428,14 +159,4 @@ const fnUploadImage = async (HIDDEN_ID, FFILE, TYPE) => {
};
</script>
<style scoped lang="scss">
.item {
cursor: pointer;
border-bottom: 1px dashed #ccc;
padding: 10px 0;
&:first-child {
padding-top: 0;
}
}
</style>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,125 @@
<template>
<layout-card>
<HiddenView :hidden-id="HIDDEN_ID" />
<el-divider content-position="left">隐患验收</el-divider>
<el-form
ref="formRef"
:model="data.form"
:rules="rules"
label-width="100px"
>
<el-row>
<el-col :span="24">
<el-form-item label="是否合格" prop="ISQUALIFIED">
<el-radio-group :model-value="data.form.ISQUALIFIED">
<el-radio label="1"></el-radio>
<el-radio label="2"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<template v-if="data.form.ISQUALIFIED === '1'">
<el-col :span="24">
<el-form-item prop="CHECKDESCR" label="验收描述">
<el-input
v-model="data.form.CHECKDESCR"
type="textarea"
:autosize="{ minRows: 3 }"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="CHECK_TIME" label="验收时间">
<el-date-picker
v-model="data.form.CHECK_TIME"
type="date"
value-format="YYYY-MM-DD"
format="YYYY-MM-DD"
placeholder="选择日期"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="验收图片" prop="acceptFile">
<layout-upload
v-model:file-list="data.form.acceptFile"
:limit="4"
accept=".jpg,.jpeg,.png"
list-type="picture-card"
/>
</el-form-item>
</el-col>
</template>
</el-row>
</el-form>
<div class="tc mt">
<el-button type="primary" @click="fnSubmit"></el-button>
</div>
</layout-card>
</template>
<script setup>
import HiddenView from "@/views/hazard_investigation/checklist_inspection_status/components/hidden_view.vue";
import { useRoute, useRouter } from "vue-router";
import { reactive, ref } from "vue";
import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { ElMessage } from "element-plus";
import LayoutUpload from "@/components/upload/index.vue";
import { setHiddenDangerAcceptSubmit } from "@/request/hidden_danger_government.js";
import { setUploadImg } from "@/request/api.js";
const route = useRoute();
const router = useRouter();
const { HIDDEN_ID } = route.query;
const formRef = ref(null);
const rules = {
ISQUALIFIED: [
{ required: true, message: "请选择是否合格", trigger: "change" },
],
CHECKDESCR: [{ required: true, message: "请输入验收描述", trigger: "blur" }],
CHECK_TIME: [
{ required: true, message: "请选择验收时间", trigger: "change" },
],
acceptFile: [
{ required: true, message: "请上传验收图片", trigger: "change" },
],
};
const data = reactive({
form: {
ISQUALIFIED: "1",
CHECKDESCR: "",
CHECK_TIME: "",
acceptFile: [],
},
});
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
const resData = await setHiddenDangerAcceptSubmit({
HIDDEN_ID,
...data.form,
});
for (let i = 0; i < data.form.acceptFile.length; i++) {
if (data.form.acceptFile[i].raw)
await fnUploadImage(
resData.check.HIDDENCHECK_ID,
data.form.acceptFile[i].raw,
5
);
}
ElMessage.success("保存成功");
router.back();
},
{ atBegin: true }
);
const fnUploadImage = async (HIDDENCHECK_ID, FFILE, TYPE) => {
const formData = new FormData();
formData.append("FOREIGN_KEY", HIDDENCHECK_ID);
formData.append("TYPE", TYPE);
formData.append("FFILE", FFILE);
await setUploadImg(formData);
};
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,156 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="100px"
@submit.prevent="fnResetPaginationTransfer"
>
<el-row>
<el-col :span="6">
<el-form-item label="隐患描述" prop="KEYWORDS">
<el-input v-model="searchForm.KEYWORDS" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="发现日期" prop="dates">
<el-date-picker
v-model="searchForm.dates"
type="daterange"
value-format="YYYY-MM-DD"
format="YYYY-MM-DD"
range-separator="至"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPaginationTransfer">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
:data="list"
@get-data="fnGetDataTransfer"
v-model:pagination="pagination"
>
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column
prop="HIDDENDESCR"
label="隐患描述"
show-overflow-tooltip
/>
<el-table-column label="隐患处置" width="100">
<template v-slot="{ row }">
<span v-if="row.RECTIFICATIONTYPE === '1'"></span>
<span v-else-if="row.RECTIFICATIONTYPE === '2'">限期整改</span>
</template>
</el-table-column>
<el-table-column prop="HIDDENLEVELNAME" label="隐患级别" width="120" />
<el-table-column label="隐患状态" width="100">
<template v-slot="{ row }">
{{ translationStatus(row.STATE, stateList) }}
</template>
</el-table-column>
<el-table-column
prop="RECTIFICATIONTIME"
label="整改时间"
width="160"
/>
<el-table-column
prop="RECTIFICATIONORNAME"
label="整改人"
width="100"
/>
<el-table-column prop="CHECKNAME" label="验收人" width="150" />
<el-table-column label="操作" width="100">
<template #default="{ row }">
<el-button
type="primary"
text
link
@click="
router.push({
path: '/hidden_danger_government/acceptance/view',
query: { HIDDEN_ID: row.HIDDEN_ID },
})
"
>
查看
</el-button>
<el-button
v-if="row.isUserself && buttonJurisdiction.del"
type="primary"
text
link
@click="
router.push({
path: '/hidden_danger_government/acceptance/acceptance',
query: { HIDDEN_ID: row.HIDDEN_ID },
})
"
>
验收
</el-button>
</template>
</el-table-column>
</layout-table>
</layout-card>
</div>
</template>
<script setup>
import { useRouter } from "vue-router";
import { serialNumber, translationStatus } from "@/assets/js/utils";
import useButtonJurisdiction from "@/assets/js/useButtonJurisdiction.js";
import useListData from "@/assets/js/useListData.js";
import { getHiddenDangerList } from "@/request/hidden_danger_government.js";
import { useUserStore } from "@/pinia/user.js";
const stateList = [
{ NAME: "未整改", ID: "1" },
{ NAME: "已整改", ID: "3" },
{ NAME: "已验收", ID: "4" },
{ NAME: "已过期", ID: "-1" },
];
const router = useRouter();
const userStore = useUserStore();
const USER_ID = userStore.getUserInfo.USER_ID;
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getHiddenDangerList, {
otherParams: {
HIDDENLEVEL: "hiddenLevel0001",
DISPOSESTATE: "3",
},
callbackFn: (list) => {
for (let i = 0; i < list.length; i++) {
list[i].isUserself = list[i].UNCHECKUSERS.indexOf(USER_ID) !== -1;
}
},
});
const fnGetDataTransfer = () => {
fnGetData({
STARTTIME: searchForm.value.dates?.[0],
ENDTIME: searchForm.value.dates?.[1],
});
};
const fnResetPaginationTransfer = () => {
fnResetPagination({
STARTTIME: searchForm.value.dates?.[0],
ENDTIME: searchForm.value.dates?.[1],
});
};
const buttonJurisdiction = await useButtonJurisdiction("hidden");
</script>
<style scoped></style>

View File

@ -0,0 +1,9 @@
<template>
<hidden-view print />
</template>
<script setup>
import HiddenView from "@/views/hazard_investigation/checklist_inspection_status/hidden_danger_view.vue";
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,75 @@
<template>
<layout-card>
<hidden-add hidden-type="ledger" v-model:form="form" ref="hiddenAddRef" />
<div class="tc mt-10">
<el-button type="primary" @click="fnSubmit"></el-button>
</div>
</layout-card>
</template>
<script setup>
import HiddenAdd from "@/views/hazard_investigation/inventory_troubleshooting/components/hidden_add.vue";
import { ref } from "vue";
import { debounce } from "throttle-debounce";
import { setHiddenDangerAdd } from "@/request/hazard_investigation.js";
import { setUploadImg } from "@/request/api.js";
import { ElMessage } from "element-plus";
import { useRouter } from "vue-router";
const router = useRouter();
const hiddenAddRef = ref(null);
const form = ref({
HIDDENPART: "",
HIDDENDESCR: "",
HIDDENLEVEL: "",
HIDDENTYPE: [],
hiddenImgs: [],
videoFiles: [],
RECTIFICATIONTYPE: "2",
RECTIFYDESCR: "",
rectifyImgs: [],
RECTIFICATIONDEADLINE: "",
RECTIFICATIONDEPT: "",
RECTIFICATIONOR: "",
});
const fnSubmit = debounce(
1000,
async () => {
await hiddenAddRef.value.formValidate();
const resData = await setHiddenDangerAdd({
...form.value,
SOURCE: "1",
HAVESCHEME: 0,
HIDDENTYPE1: form.value.HIDDENTYPE[0],
HIDDENTYPE2: form.value.HIDDENTYPE[1],
HIDDENTYPE3: form.value.HIDDENTYPE[2],
HIDDENTYPE_NAME: hiddenAddRef.value.hiddenDangerTypeLabel(),
});
const currentHiddenId = resData.pd.HIDDEN_ID;
for (let i = 0; i < form.value.hiddenImgs.length; i++) {
if (form.value.hiddenImgs[i].raw)
await fnUploadImage(currentHiddenId, form.value.hiddenImgs[i].raw, 3);
}
for (let i = 0; i < form.value.videoFiles.length; i++) {
if (form.value.videoFiles[i].raw)
await fnUploadImage(currentHiddenId, form.value.videoFiles[i].raw, 3);
}
for (let i = 0; i < form.value.rectifyImgs.length; i++) {
if (form.value.rectifyImgs[i].raw)
await fnUploadImage(currentHiddenId, form.value.rectifyImgs[i].raw, 4);
}
ElMessage.success("保存成功");
router.back();
},
{ atBegin: true }
);
const fnUploadImage = async (HIDDEN_ID, FFILE, TYPE) => {
const formData = new FormData();
formData.append("FOREIGN_KEY", HIDDEN_ID);
formData.append("TYPE", TYPE);
formData.append("FFILE", FFILE);
await setUploadImg(formData);
};
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,216 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="100px"
@submit.prevent="fnResetPaginationTransfer"
>
<el-row>
<el-col :span="6">
<el-form-item label="隐患描述" prop="KEYWORDS">
<el-input v-model="searchForm.KEYWORDS" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="发现日期" prop="dates">
<el-date-picker
v-model="searchForm.dates"
type="daterange"
value-format="YYYY-MM-DD"
format="YYYY-MM-DD"
range-separator="至"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="隐患发现人" prop="CREATORNAME">
<el-input v-model="searchForm.CREATORNAME" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="部门" prop="DEPTIDS">
<layout-department
v-model="searchForm.DEPTIDS"
multiple
show-checkbox
collapse-tags
root-disabled="Y"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="隐患状态" prop="STATE">
<el-select v-model="searchForm.STATE">
<el-option
v-for="item in stateList"
:key="item.ID"
:label="item.NAME"
:value="item.ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPaginationTransfer">
重置
</el-button>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label-width="10px" class="end">
<el-button>打印</el-button>
<el-button> 导出 </el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
:data="list"
@get-data="fnGetDataTransfer"
v-model:pagination="pagination"
ref="tableRef"
row-key="HIDDEN_ID"
>
<el-table-column reserve-selection type="selection" width="55" />
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column
prop="HIDDENDESCR"
label="隐患描述"
show-overflow-tooltip
/>
<el-table-column label="隐患处置" width="100">
<template v-slot="{ row }">
<span v-if="row.RECTIFICATIONTYPE === '1'"></span>
<span v-else-if="row.RECTIFICATIONTYPE === '2'">限期整改</span>
</template>
</el-table-column>
<el-table-column prop="HIDDENLEVELNAME" label="隐患级别" width="120" />
<el-table-column label="隐患状态" width="100">
<template v-slot="{ row }">
{{ translationStatus(row.STATE, stateList) }}
</template>
</el-table-column>
<el-table-column prop="CREATTIME" label="发现时间" width="160" />
<el-table-column prop="CREATORNAME" label="发现人" width="100" />
<el-table-column
prop="RECTIFICATIONTIME"
label="整改时间"
width="160"
/>
<el-table-column
prop="RECTIFICATIONORNAME"
label="整改人"
width="100"
/>
<el-table-column label="验收人" width="100">
<template v-slot="{ row }">
<span v-if="row.RECTIFICATIONTYPE === '2'">
{{ row.CHECKNAME }}
</span>
</template>
</el-table-column>
<el-table-column label="操作" width="100">
<template #default="{ row }">
<el-button
type="primary"
text
link
@click="
router.push({
path: '/hidden_danger_government/ledger/view',
query: { HIDDEN_ID: row.HIDDEN_ID },
})
"
>
查看
</el-button>
<el-button
v-if="buttonJurisdiction.del"
type="primary"
text
link
@click="fnDelete(row.HIDDEN_ID)"
>
删除
</el-button>
</template>
</el-table-column>
<template #button>
<el-button
v-if="buttonJurisdiction.add"
type="primary"
@click="
router.push({ path: '/hidden_danger_government/ledger/add' })
"
>
新增
</el-button>
</template>
</layout-table>
</layout-card>
</div>
</template>
<script setup>
import { useRouter } from "vue-router";
import { serialNumber, translationStatus } from "@/assets/js/utils";
import { setHiddenDangerDelete } from "@/request/hazard_investigation.js";
import { debounce } from "throttle-debounce";
import { ElMessage, ElMessageBox } from "element-plus";
import useButtonJurisdiction from "@/assets/js/useButtonJurisdiction.js";
import useListData from "@/assets/js/useListData.js";
import LayoutDepartment from "@/components/department/index.vue";
import { getHiddenDangerList } from "@/request/hidden_danger_government.js";
const stateList = [
{ NAME: "未整改", ID: "1" },
{ NAME: "已整改", ID: "3" },
{ NAME: "已验收", ID: "4" },
{ NAME: "已过期", ID: "-1" },
];
const router = useRouter();
const { list, pagination, searchForm, fnGetData, fnResetPagination, tableRef } =
useListData(getHiddenDangerList, {
otherParams: {
HIDDENLEVEL: "hiddenLevel0001",
DISPOSESTATE: "-1",
IS_SELF: "0",
},
});
const fnGetDataTransfer = () => {
fnGetData({
STARTTIME: searchForm.value.dates?.[0],
ENDTIME: searchForm.value.dates?.[1],
DEPTIDS: searchForm.value.DEPTIDS?.join(","),
});
};
const fnResetPaginationTransfer = () => {
fnResetPagination({
STARTTIME: searchForm.value.dates?.[0],
ENDTIME: searchForm.value.dates?.[1],
DEPTIDS: searchForm.value.DEPTIDS?.join(","),
});
};
const buttonJurisdiction = await useButtonJurisdiction("hidden");
const fnDelete = debounce(
1000,
async (HIDDEN_ID) => {
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
await setHiddenDangerDelete({ HIDDEN_ID });
ElMessage.success("删除成功");
fnResetPaginationTransfer();
},
{ atBegin: true }
);
</script>
<style scoped></style>

View File

@ -0,0 +1,9 @@
<template>
<hidden-view print />
</template>
<script setup>
import HiddenView from "@/views/hazard_investigation/checklist_inspection_status/hidden_danger_view.vue";
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,179 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="100px"
@submit.prevent="fnResetPaginationTransfer"
>
<el-row>
<el-col :span="6">
<el-form-item label="隐患描述" prop="KEYWORDS">
<el-input v-model="searchForm.KEYWORDS" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="发现日期" prop="dates">
<el-date-picker
v-model="searchForm.dates"
type="daterange"
value-format="YYYY-MM-DD"
format="YYYY-MM-DD"
range-separator="至"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPaginationTransfer">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
:data="list"
@get-data="fnGetDataTransfer"
v-model:pagination="pagination"
>
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column label="隐患来源" width="100">
<template v-slot="{ row }">
<span v-if="row.SOURCE === '1'"></span>
<span v-else-if="row.SOURCE === '2'">隐患排查</span>
<span v-else-if="row.SOURCE === '3'">隐患排查</span>
</template>
</el-table-column>
<el-table-column
prop="HIDDENDESCR"
label="隐患描述"
show-overflow-tooltip
/>
<el-table-column label="隐患处置" width="100">
<template v-slot="{ row }">
<span v-if="row.RECTIFICATIONTYPE === '1'"></span>
<span v-else-if="row.RECTIFICATIONTYPE === '2'">限期整改</span>
</template>
</el-table-column>
<el-table-column prop="HIDDENLEVELNAME" label="隐患级别" width="120" />
<el-table-column label="隐患状态" width="100">
<template v-slot="{ row }">
{{ translationStatus(row.STATE, stateList) }}
</template>
</el-table-column>
<el-table-column prop="CREATTIME" label="发现时间" width="160" />
<el-table-column prop="CREATORNAME" label="发现人" width="100" />
<el-table-column
prop="RECTIFICATIONTIME"
label="整改时间"
width="160"
/>
<el-table-column
prop="RECTIFICATIONORNAME"
label="整改人"
width="100"
/>
<el-table-column label="操作" width="100">
<template #default="{ row }">
<el-button
type="primary"
text
link
@click="
router.push({
path: '/hidden_danger_government/major/view',
query: { HIDDEN_ID: row.HIDDEN_ID },
})
"
>
查看
</el-button>
<el-button
v-if="ISMAIN === '1' && row.ISCONFIRM === '0'"
type="primary"
text
link
@click="fnConfirm(row.HIDDEN_ID)"
>
确定
</el-button>
</template>
</el-table-column>
</layout-table>
</layout-card>
</div>
</template>
<script setup>
import { useRouter } from "vue-router";
import { serialNumber, translationStatus } from "@/assets/js/utils";
import useListData from "@/assets/js/useListData.js";
import {
getHiddenDangerList,
setHiddenDangerCancelMajorHazards,
} from "@/request/hidden_danger_government.js";
import { useUserStore } from "@/pinia/user.js";
import { ElMessage, ElMessageBox } from "element-plus";
const stateList = [
{ NAME: "未整改", ID: "1" },
{ NAME: "已整改", ID: "3" },
{ NAME: "已验收", ID: "4" },
{ NAME: "已过期", ID: "-1" },
];
const router = useRouter();
const userStore = useUserStore();
const ISMAIN = userStore.getUserInfo.ISMAIN;
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getHiddenDangerList, {
otherParams: {
HIDDENLEVEL: "hiddenLevel0002",
DISPOSESTATE: "1",
},
});
const fnGetDataTransfer = () => {
fnGetData({
STARTTIME: searchForm.value.dates?.[0],
ENDTIME: searchForm.value.dates?.[1],
});
};
const fnResetPaginationTransfer = () => {
fnResetPagination({
STARTTIME: searchForm.value.dates?.[0],
ENDTIME: searchForm.value.dates?.[1],
});
};
const fnConfirm = async (HIDDEN_ID) => {
try {
await ElMessageBox.confirm("请确认该隐患是否为重大隐患?", {
type: "warning",
confirmButtonText: "确定为重大隐患",
cancelButtonText: "取消重大隐患",
distinguishCancelAndClose: true,
});
await router.push({
path: "/hidden_danger_government/major/view",
query: { HIDDEN_ID, type: "confirm" },
});
} catch (event) {
if (event === "cancel") {
await setHiddenDangerCancelMajorHazards({
HIDDEN_ID,
HIDDENLEVEL: "hiddenLevel0001",
});
ElMessage.success("取消成功");
fnResetPaginationTransfer();
}
}
};
</script>
<style scoped></style>

View File

@ -0,0 +1,41 @@
<template>
<layout-card>
<div id="printContent">
<hidden-view :hidden-id="HIDDEN_ID" />
</div>
<div class="tc mt-10">
<el-button type="primary" @click="fnConfirm" v-if="type === 'confirm'">
确认为重大隐患
</el-button>
<el-button type="primary" v-print="'#printContent'" v-else>
打印
</el-button>
</div>
</layout-card>
</template>
<script setup>
import HiddenView from "@/views/hazard_investigation/checklist_inspection_status/components/hidden_view.vue";
import { useRoute, useRouter } from "vue-router";
import { debounce } from "throttle-debounce";
import { ElMessage } from "element-plus";
import { setHiddenDangerConfirmMajorHazards } from "@/request/hidden_danger_government.js";
const route = useRoute();
const router = useRouter();
const { HIDDEN_ID, type } = route.query;
const fnConfirm = debounce(
1000,
async () => {
await setHiddenDangerConfirmMajorHazards({
ISCONFIRM: "1",
HIDDEN_ID,
});
ElMessage.success("确认成功");
router.back();
},
{ atBegin: true }
);
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,162 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="100px"
@submit.prevent="fnResetPaginationTransfer"
>
<el-row>
<el-col :span="6">
<el-form-item label="隐患描述" prop="KEYWORDS">
<el-input v-model="searchForm.KEYWORDS" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="发现日期" prop="dates">
<el-date-picker
v-model="searchForm.dates"
type="daterange"
value-format="YYYY-MM-DD"
format="YYYY-MM-DD"
range-separator="至"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPaginationTransfer">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
:data="list"
@get-data="fnGetDataTransfer"
v-model:pagination="pagination"
>
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column label="隐患来源" width="100">
<template v-slot="{ row }">
<span v-if="row.SOURCE === '1'"></span>
<span v-else-if="row.SOURCE === '2'">隐患排查</span>
<span v-else-if="row.SOURCE === '3'">隐患排查</span>
</template>
</el-table-column>
<el-table-column
prop="HIDDENDESCR"
label="隐患描述"
show-overflow-tooltip
/>
<el-table-column label="隐患处置" width="100">
<template v-slot="{ row }">
<span v-if="row.RECTIFICATIONTYPE === '1'"></span>
<span v-else-if="row.RECTIFICATIONTYPE === '2'">限期整改</span>
</template>
</el-table-column>
<el-table-column prop="HIDDENLEVELNAME" label="隐患级别" width="120" />
<el-table-column label="隐患状态" width="100">
<template v-slot="{ row }">
{{ translationStatus(row.STATE, stateList) }}
</template>
</el-table-column>
<el-table-column prop="CREATTIME" label="发现时间" width="160" />
<el-table-column prop="CREATORNAME" label="发现人" width="100" />
<el-table-column
prop="RECTIFICATIONDEADLINE"
label="整改期限"
width="160"
/>
<el-table-column
prop="RECTIFICATIONORNAME"
label="整改人"
width="100"
/>
<el-table-column label="操作" width="100">
<template #default="{ row }">
<el-button
type="primary"
text
link
@click="
router.push({
path: '/hidden_danger_government/rectification/view',
query: { HIDDEN_ID: row.HIDDEN_ID },
})
"
>
查看
</el-button>
<el-button
v-if="buttonJurisdiction.del"
type="primary"
text
link
@click="fnRectification(row)"
>
整改
</el-button>
</template>
</el-table-column>
</layout-table>
</layout-card>
</div>
</template>
<script setup>
import { useRouter } from "vue-router";
import { serialNumber, translationStatus } from "@/assets/js/utils";
import useButtonJurisdiction from "@/assets/js/useButtonJurisdiction.js";
import useListData from "@/assets/js/useListData.js";
import { getHiddenDangerList } from "@/request/hidden_danger_government.js";
import { ElMessage } from "element-plus";
const stateList = [
{ NAME: "未整改", ID: "1" },
{ NAME: "已整改", ID: "3" },
{ NAME: "已验收", ID: "4" },
{ NAME: "已过期", ID: "-1" },
];
const router = useRouter();
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getHiddenDangerList, {
otherParams: {
HIDDENLEVEL: "hiddenLevel0001",
DISPOSESTATE: "2",
},
});
const fnGetDataTransfer = () => {
fnGetData({
STARTTIME: searchForm.value.dates?.[0],
ENDTIME: searchForm.value.dates?.[1],
});
};
const fnResetPaginationTransfer = () => {
fnResetPagination({
STARTTIME: searchForm.value.dates?.[0],
ENDTIME: searchForm.value.dates?.[1],
});
};
const buttonJurisdiction = await useButtonJurisdiction("hidden");
const fnRectification = (row) => {
if (row.HIDDENLEVEL === "hiddenLevel0002" && row.ISCONFIRM === "0") {
ElMessage.warning("管理人员未确认该隐患");
return;
}
router.push({
path: "/hidden_danger_government/rectification/rectification",
query: { HIDDEN_ID: row.HIDDEN_ID },
});
};
</script>
<style scoped></style>

View File

@ -0,0 +1,538 @@
<template>
<layout-card>
<HiddenView :hidden-id="HIDDEN_ID" @throw-data="data.info = $event" />
<el-divider content-position="left">隐患整改</el-divider>
<el-row :gutter="24">
<el-col :span="12">
<el-form
ref="formRef"
:model="data.form"
:rules="rules"
label-width="100px"
>
<el-row>
<el-col :span="24">
<el-form-item label="正常整改" prop="IS_NORMAL">
<el-radio-group
:model-value="data.form.IS_NORMAL"
@change="fnIsNormalChange"
>
<el-radio label="1"></el-radio>
<el-radio label="2"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<template v-if="data.form.IS_NORMAL === '2'">
<el-col :span="12">
<el-form-item label="整改部门" prop="RECTIFICATIONDEPT">
<layout-department
v-model="data.form.RECTIFICATIONDEPT"
@update:model-value="fnRectificationDepartmentChange"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="整改人" prop="RECTIFICATIONOR">
<el-select v-model="data.form.RECTIFICATIONOR">
<el-option
v-for="item in data.rectifierUserList"
:disabled="item.USER_ID === USER_ID"
:key="item.USER_ID"
:label="item.NAME"
:value="item.USER_ID"
/>
</el-select>
</el-form-item>
</el-col>
</template>
<template v-if="data.form.IS_NORMAL === '1'">
<el-col :span="24">
<el-form-item prop="RECTIFYDESCR" label="整改描述">
<el-input
v-model="data.form.RECTIFYDESCR"
type="textarea"
:autosize="{ minRows: 3 }"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="整改时间" prop="RECTIFICATIONTIME">
<el-date-picker
v-model="data.form.RECTIFICATIONTIME"
value-format="YYYY-MM-DD"
format="YYYY-MM-DD"
type="date"
placeholder="选择日期"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="整改后图片" prop="afterRectificationFile">
<layout-upload
v-model:file-list="data.form.afterRectificationFile"
:limit="4"
accept=".jpg,.jpeg,.png"
list-type="picture-card"
/>
</el-form-item>
</el-col>
<template v-if="data.info.ISCONFIRM === '0'">
<template
v-for="(item, index) in data.form.acceptanceList"
:key="item.id"
>
<el-col :span="11">
<el-form-item
label="验收部门"
:prop="'acceptanceList.' + index + '.DEPARTMENT_ID'"
:rules="{
required: true,
message: '请选择验收部门',
trigger: 'change',
}"
>
<layout-department
v-model="item.DEPARTMENT_ID"
@update:model-value="
fnInspectDepartmentChange($event, index)
"
/>
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item
label="验收人"
:prop="'acceptanceList.' + index + '.USER_ID'"
:rules="{
required: true,
message: '请选择验收人',
trigger: 'change',
}"
>
<el-select
:model-value="item.USER_ID"
@change="
verifyDuplicateSelection(
data.form.acceptanceList,
index,
'USER_ID',
$event
)
"
>
<el-option
v-for="item in item.userList"
:key="item.USER_ID"
:label="item.NAME"
:value="item.USER_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="2">
<el-form-item label-width="10px">
<el-button
type="primary"
v-if="index === 0"
@click="fnAddInspectedList"
>
添加
</el-button>
<el-button
type="danger"
v-if="index !== 0"
@click="data.form.acceptanceList.splice(index, 1)"
>
删除
</el-button>
</el-form-item>
</el-col>
</template>
</template>
<template v-if="data.info.ISCONFIRM === '1'">
<el-col :span="12">
<el-form-item label="验收部门">
<el-input disabled v-model="data.form.DEPARTMENT_NAME" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="验收人">
<el-input disabled v-model="data.form.USER_NAME" />
</el-form-item>
</el-col>
</template>
<el-col :span="24">
<el-form-item label="整改方案" prop="HAVESCHEME">
<el-radio-group v-model="data.form.HAVESCHEME">
<el-radio label="1" value="1"></el-radio>
<el-radio :disabled="data.info.ISCONFIRM === '1'" label="0">
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<template v-if="data.form.HAVESCHEME === '1'">
<el-col :span="24">
<el-form-item prop="SCREENINGDATE" label="排查日期">
<el-date-picker
v-model="data.form.SCREENINGDATE"
value-format="YYYY-MM-DD"
format="YYYY-MM-DD"
type="date"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="LIST_NAME" label="隐患清单">
<el-input v-model="data.form.LIST_NAME" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="治理标准" prop="GOVERNSTANDARDS">
<el-input v-model="data.form.GOVERNSTANDARDS" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="治理方法" prop="GOVERNMETHOD">
<el-input v-model="data.form.GOVERNMETHOD" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="经费落实" prop="EXPENDITURE">
<el-input v-model="data.form.EXPENDITURE" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="负责人员" prop="PRINCIPAL">
<el-input v-model="data.form.PRINCIPAL" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="工时安排" prop="PROGRAMMING">
<el-input v-model="data.form.PROGRAMMING" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="时限要求" prop="TIMELIMITFOR">
<el-input v-model="data.form.TIMELIMITFOR" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="工作要求" prop="JOBREQUIREMENT">
<el-input v-model="data.form.JOBREQUIREMENT" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="其他事项" prop="OTHERBUSINESS">
<el-input v-model="data.form.OTHERBUSINESS" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="方案图片" prop="programmeFile">
<layout-upload
v-model:file-list="data.form.programmeFile"
:limit="99"
accept=".jpg,.jpeg,.png"
list-type="picture-card"
/>
</el-form-item>
</el-col>
</template>
<el-col :span="24">
<el-form-item label="整改计划" prop="HAVEPLAN">
<el-radio-group v-model="data.form.HAVEPLAN">
<el-radio label="1" value="1"></el-radio>
<el-radio :disabled="data.info.ISCONFIRM === '1'" label="0">
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="24" v-if="data.form.HAVEPLAN === '1'">
<el-form-item label="计划图片" prop="planFile">
<layout-upload
v-model:file-list="data.form.planFile"
:limit="99"
accept=".jpg,.jpeg,.png"
list-type="picture-card"
/>
</el-form-item>
</el-col>
</template>
</el-row>
</el-form>
</el-col>
<el-col :span="12">
<div
v-for="item in data.recordLibraryList"
:key="item.HIDDEN_LIBRARY_ID"
class="item"
@click="fnChoice(item)"
>
<el-descriptions :column="1" border>
<el-descriptions-item label="风险单元名称">
{{ item.RISK_UNIT_NAME }}
</el-descriptions-item>
<el-descriptions-item label="隐患部位">
{{ item.HIDDEN_PART }}
</el-descriptions-item>
<el-descriptions-item label="隐患描述">
{{ item.INSPECTION_BASIS }}
</el-descriptions-item>
<el-descriptions-item label="整改意见">
{{ item.RECTIFYDESCR }}
</el-descriptions-item>
</el-descriptions>
</div>
</el-col>
</el-row>
<div class="tc mt">
<el-button type="primary" @click="fnSubmit"></el-button>
</div>
</layout-card>
</template>
<script setup>
import HiddenView from "@/views/hazard_investigation/checklist_inspection_status/components/hidden_view.vue";
import { useRoute, useRouter } from "vue-router";
import { reactive, ref, watch } from "vue";
import LayoutDepartment from "@/components/department/index.vue";
import LayoutUpload from "@/components/upload/index.vue";
import { useUserStore } from "@/pinia/user.js";
import {
getHiddenDangerRectificationWhy,
setHiddenDangerRectificationAbnormalSubmit,
setHiddenDangerRectificationNormalSubmit,
} from "@/request/hidden_danger_government.js";
import { verifyDuplicateSelection } from "@/assets/js/utils.js";
import { getUserListAll } from "@/request/data_dictionary.js";
import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { cloneDeep } from "lodash-es";
import { ElMessage } from "element-plus";
import { getHiddenDangerDatabaseList } from "@/request/hazard_investigation.js";
const route = useRoute();
const router = useRouter();
const userStore = useUserStore();
const USER_ID = userStore.getUserInfo.USER_ID;
const CORPINFO_ID = userStore.getUserInfo.CORPINFO_ID;
const { HIDDEN_ID } = route.query;
const formRef = ref(null);
const rules = {
IS_NORMAL: [
{ required: true, message: "正常整改不能为空", trigger: "change" },
],
RECTIFICATIONDEPT: [
{ required: true, message: "整改部门不能为空", trigger: "change" },
],
RECTIFICATIONOR: [
{ required: true, message: "整改人不能为空", trigger: "change" },
],
RECTIFYDESCR: [
{ required: true, message: "整改描述不能为空", trigger: "blur" },
],
RECTIFICATIONTIME: [
{ required: true, message: "整改时间不能为空", trigger: "change" },
],
afterRectificationFile: [
{ required: true, message: "整改后图片不能为空", trigger: "change" },
],
HAVESCHEME: [
{ required: true, message: "整改方案不能为空", trigger: "change" },
],
SCREENINGDATE: [
{ required: true, message: "排查日期不能为空", trigger: "change" },
],
LIST_NAME: [{ required: true, message: "隐患清单不能为空", trigger: "blur" }],
GOVERNSTANDARDS: [
{ required: true, message: "治理标准不能为空", trigger: "blur" },
],
GOVERNMETHOD: [
{ required: true, message: "治理方法不能为空", trigger: "blur" },
],
EXPENDITURE: [
{ required: true, message: "经费落实不能为空", trigger: "blur" },
],
PRINCIPAL: [{ required: true, message: "负责人员不能为空", trigger: "blur" }],
PROGRAMMING: [
{ required: true, message: "工时安排不能为空", trigger: "blur" },
],
TIMELIMITFOR: [
{ required: true, message: "时限要求不能为空", trigger: "blur" },
],
JOBREQUIREMENT: [
{ required: true, message: "工作要求不能为空", trigger: "blur" },
],
OTHERBUSINESS: [
{ required: true, message: "其他事项不能为空", trigger: "blur" },
],
programmeFile: [
{ required: true, message: "方案图片不能为空", trigger: "change" },
],
HAVEPLAN: [
{ required: true, message: "整改计划不能为空", trigger: "change" },
],
planFile: [
{ required: true, message: "计划图片不能为空", trigger: "change" },
],
};
const data = reactive({
info: {},
form: {
IS_NORMAL: "1",
RECTIFICATIONDEPT: "",
RECTIFICATIONOR: "",
RECTIFYDESCR: "",
RECTIFICATIONTIME: "",
afterRectificationFile: [],
HAVESCHEME: "0",
SCREENINGDATE: "",
LIST_NAME: "",
GOVERNSTANDARDS: "",
GOVERNMETHOD: "",
EXPENDITURE: "",
PRINCIPAL: "",
PROGRAMMING: "",
TIMELIMITFOR: "",
JOBREQUIREMENT: "",
OTHERBUSINESS: "",
programmeFile: [],
HAVEPLAN: "0",
planFile: [],
acceptanceList: [
{
id: Math.random(),
DEPARTMENT_ID: "",
USER_ID: "",
userList: [],
},
],
},
rectifierUserList: [],
recordLibraryList: [],
defaultDepartmentId: "",
defaultUserId: "",
});
const fnGetData = async () => {
const resData = await getHiddenDangerRectificationWhy({
CORPINFO_ID,
});
data.defaultDepartmentId = resData.deppd.DEPARTMENT_ID;
data.defaultUserId = resData.userpd.USER_ID;
data.form.DEPARTMENT_NAME = resData.deppd.NAME;
data.form.USER_NAME = resData.userpd.USERNAME;
await fnInspectDepartmentChange(data.defaultDepartmentId, 0);
data.form.acceptanceList[0].DEPARTMENT_ID = data.defaultDepartmentId;
data.form.acceptanceList[0].USER_ID = data.defaultUserId;
};
fnGetData();
const fnAddInspectedList = () => {
data.form.acceptanceList.push({
id: Math.random(),
DEPARTMENT_ID: "",
USER_ID: "",
userList: [],
});
};
const fnInspectDepartmentChange = async (event, index) => {
data.form.acceptanceList[index].USER_ID = "";
const resData = await getUserListAll({
DEPARTMENT_ID: event,
});
data.form.acceptanceList[index].userList = resData.userList;
};
const fnRectificationDepartmentChange = async (event) => {
data.form.RECTIFICATIONOR = "";
const resData = await getUserListAll({
DEPARTMENT_ID: event,
});
data.rectifierUserList = resData.userList;
};
const fnIsNormalChange = async (event) => {
formRef.value.resetFields();
data.form.acceptanceList = [];
fnAddInspectedList();
await fnInspectDepartmentChange(data.defaultDepartmentId, 0);
data.form.acceptanceList[0].DEPARTMENT_ID = data.defaultDepartmentId;
data.form.acceptanceList[0].USER_ID = data.defaultUserId;
data.rectifierUserList = [];
data.form.IS_NORMAL = event;
};
const fnGetHiddenDangerDatabaseList = async () => {
const resData = await getHiddenDangerDatabaseList({
RISK_UNIT_NAME: data.info.RISK_UNIT,
HIDDEN_PART: data.info.HIDDENPART,
});
data.recordLibraryList = resData.varList;
};
watch(
() => data.info,
() => {
fnGetHiddenDangerDatabaseList();
}
);
const fnChoice = (item) => {
data.RECTIFYDESCR = item.RECTIFYDESCR;
};
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
if (data.form.IS_NORMAL === "1") {
const formData = new FormData();
Object.keys(data.form).forEach((key) => {
formData.append(key, data.form[key]);
});
formData.append("HIDDEN_ID", HIDDEN_ID);
formData.append(
"LISTNAME",
data.form.LIST_NAME ? data.form.LIST_NAME : ""
);
for (let i = 0; i < data.form.programmeFile.length; i++) {
formData.append("scheme_files", data.form.programmeFile[i].raw);
}
for (let i = 0; i < data.form.afterRectificationFile.length; i++) {
formData.append(
"rectify_files",
data.form.afterRectificationFile[i].raw
);
}
for (let i = 0; i < data.form.planFile.length; i++) {
formData.append("plan_files", data.form.planFile[i].raw);
}
formData.append("CHECKDEPT", data.form.acceptanceList[0].DEPARTMENT_ID);
formData.append("CHECKOR", data.form.acceptanceList[0].USER_ID);
const acceptanceList = cloneDeep(data.form.acceptanceList);
if (acceptanceList.length > 0) acceptanceList.splice(0, 1);
formData.append("OTHER", JSON.stringify(acceptanceList));
formData.delete("afterRectificationFile");
formData.delete("programmeFile");
formData.delete("planFile");
formData.delete("acceptanceList");
await setHiddenDangerRectificationNormalSubmit(formData);
} else {
await setHiddenDangerRectificationAbnormalSubmit({
HIDDEN_ID,
RECTIFICATIONOR: data.form.RECTIFICATIONOR,
RECTIFICATIONDEPT: data.form.RECTIFICATIONDEPT,
});
}
ElMessage.success("保存成功");
router.back();
},
{ atBegin: true }
);
</script>
<style scoped lang="scss">
.item {
cursor: pointer;
border-bottom: 1px dashed #ccc;
padding: 10px 0;
&:first-child {
padding-top: 0;
}
}
</style>

View File

@ -0,0 +1,9 @@
<template>
<hidden-view print />
</template>
<script setup>
import HiddenView from "@/views/hazard_investigation/checklist_inspection_status/hidden_danger_view.vue";
</script>
<style scoped lang="scss"></style>