2023-08-18 17:42:47 +08:00

495 lines
14 KiB
Vue

<!-- 项目的报警记录 -->
<template>
<div class="table-box">
<div class="form-top">
<el-form :model="form" :inline="true" @submit.prevent class="form" ref="FormRef">
<el-form-item label="监控名称">
<el-select clearable class="select" v-model="form.code" placeholder="请选择">
<el-option v-for="item in nameList" :key="item.code" :label="item.name" :value="item.code" />
</el-select>
</el-form-item>
<el-form-item label="创建时间">
<el-date-picker
v-model="form.createTime"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
@change="onDatePicker"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handSearch">查询</el-button>
</el-form-item>
</el-form>
</div>
<div class="imgPage">
<div class="imgTable" v-if="qusLength.length">
<div class="img_item" v-for="item in questList.records" @click="onShowImg(item)" :key="item.id">
<el-image style="width: 100%; height: 182px" class="item_image" :src="item.image" fit="fill" />
<div class="page_text flx-justify-column">
<div class="img_title">{{ item.typeName }}</div>
<div style="display: flex; justify-content: space-between">
<div style="font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis">
位置:{{ item.deviceName }}
</div>
<div style="font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis">
报警时间:{{ item.reportTime }}
</div>
</div>
</div>
</div>
</div>
<div v-else class="table-empty">
<img src="@/assets/images/notData.png" alt="notData" />
<div>暂无数据</div>
</div>
<Pagination
:pageable="pages"
:total="pages.total"
:page-size="pages.pageSize"
layout="prev, pager, next, jumper"
:handleSizeChange="handleSizeChange"
:handleCurrentChange="handleCurrentChange"
:background="background"
class="pagination"
/>
</div>
</div>
<el-dialog class="imgDialog" title="整改图片" width="50%" v-model="imgVisible" show-close>
<el-image style="width: 100%; height: 600px" :src="imgList.image" fit="fill" />
<template #footer>
<div class="flx-justify-between">
<div class="flx-center">
<span class="img_diatitle m-10">{{ imgList.typeName }}</span>
<span class="img_text m-10">位置:{{ imgList.deviceName }}</span>
<span class="img_text m-10">时间:{{ imgList.createTime }}</span>
<span class="img_text m-10 flx-center"
><div :class="imgList.state === -1 ? 'pending' : 'complete'"></div>
{{ imgList.state === -1 ? "待处理" : "已处理" }}</span
>
</div>
<div>
<el-button type="primary" v-if="imgList.state === -1" @click="onRecord"> 去整改 </el-button>
</div>
</div>
</template>
</el-dialog>
<el-dialog class="imgDialog" :title="title" width="50%" v-model="visible" show-close>
<div class="littleTitle Snap">抓拍隐患</div>
<el-form class="diaForm" :rules="rules" :model="formData" ref="ruleFormRef" label-width="160px">
<el-form-item label="名称:">
<el-input v-model="formData.engineeringName" placeholder="请输入" />
</el-form-item>
<el-form-item label="隐患类型:">
<el-input v-model="formData.typeName" placeholder="请输入" />
</el-form-item>
<el-form-item label="图片显示:">
<!-- <el-image v-model="form.image" placeholder="请输入" /> -->
<el-image style="width: 95px; height: 53px" :src="formData.image" fit="fill" />
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item label="下达人:">
<el-input v-model="formData.createBy" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="创建时间:">
<el-date-picker
style="width: 100%"
v-model="formData.createTime"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
type="datetime"
placeholder="请选择时间"
/>
</el-form-item>
</el-col>
</el-row>
<div class="littleTitle situation">整改情况</div>
<el-form-item label="整改状态:" prop="state">
<el-radio-group v-model="formData.state">
<el-radio :label="0">待整改</el-radio>
<el-radio :label="1">已整改</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="整改图片:">
<el-upload
class="avatar-uploader"
:action="`${baseUrl}` + '/xmgl/file/upload'"
:show-file-list="false"
:on-success="handleAvatarSuccess"
:before-upload="beforeAvatarUpload"
accept="image/jpg, image/jpeg, image/png"
v-if="title === '问题整改'"
>
<img v-if="formData.solveImage" :src="formData.solveImage" class="avatar" />
<el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
</el-upload>
<el-image v-else style="width: 95px; height: 53px" :src="formData.solveImage" fit="fill" />
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item label="整改人:">
<el-input v-model="formData.solveBy" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="整改时间:">
<!-- <el-input v-model="form.solveTime" placeholder="请输入" /> -->
<el-date-picker
style="width: 100%"
v-model="formData.solveTime"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
type="datetime"
placeholder="请选择时间"
/>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="备注:">
<el-input type="textarea" :autosize="{ minRows: 2, maxRows: 4 }" v-model="formData.remark" placeholder="请输入" />
</el-form-item>
</el-form>
<template #footer>
<div v-if="title === '问题整改'">
<el-button class="cancelButtonStyle" @click="visible = false">取消</el-button>
<el-button type="primary" @click="confirm(ruleFormRef, formData)"> 保存 </el-button>
</div>
<div v-else class="footer">
<el-button type="primary" @click="visible = false">关闭</el-button>
</div>
</template>
</el-dialog>
<engineeringEngDrawer v-model="engVisable" :active="activeValue" ref="engDrawer" :engList="engList" @select="tabsSelect">
<template #default="{ data }">
<span style="margin-left: 10px" @click="onUpdate(data)">{{
activeValue == "eng" ? data.engineeringName : data.projectName
}}</span>
</template>
</engineeringEngDrawer>
<allEngineering @click="engVisable = true" />
</template>
<script lang="ts" setup>
import { ref, reactive, onMounted, watch } from "vue";
import { getAIAlarmPage, addAIrecords, getAiMonitorDev, getIdAIrecords, getEngineeringName } from "@/api/modules/project";
import Pagination from "@/components/ProTable/components/Pagination.vue";
import { ElMessage } from "element-plus";
import type { ResAiProjectPage, ResAiEngineerPage } from "@/api/types/government/AIwaring";
import type { UploadProps, FormInstance, FormRules } from "element-plus";
import { getRelevanceList } from "@/api/modules/common";
import engineeringEngDrawer from "@/components/engineeringEngDrawer/index.vue";
import allEngineering from "@/components/allEngineering/index.vue";
interface nameList {
name: string;
code: number;
}
interface formData {
createBy: string;
createTime: string;
deviceCode: string;
engineeringName: string;
id: string;
image: string;
remark: string;
solveBy: string;
solveImage: string;
solveTime: string;
state: number | undefined;
type: undefined;
typeName: string | string;
// image:string
}
const imgVisible = ref(false);
const background = ref(true);
const visible = ref(false);
const title = ref("");
const baseUrl = import.meta.env.VITE_API_URL;
const ruleFormRef = ref<FormInstance>();
const searchSn = ref("");
const activeValue = ref("eng");
const engList = ref([]);
const engVisable = ref(false);
// 项目或者工程名字
const searchName = ref<string>("");
const qusLength = ref([]);
const pages = ref({
pageNo: 1,
pageSize: 12,
total: 0
});
const records = ref<ResAiProjectPage[] | ResAiEngineerPage[]>([]);
// 监控设备
const monitorList = ref<ResAiProjectPage[]>([]);
const questList = ref([]);
const form = ref({
code: "",
createTime: "",
startTime: "",
endTime: ""
});
const formData = ref<formData>({
createBy: "",
createTime: "",
deviceCode: "",
engineeringName: "",
id: "",
image: "",
remark: "",
solveBy: "",
solveImage: "",
solveTime: "",
state: undefined,
type: undefined,
typeName: ""
});
// form下拉框
const nameList = ref<nameList[]>([]);
// 点击图片存的数据
const imgList = ref({
createBy: "",
createTime: "",
deviceCode: "",
deviceName: "",
// engineeringSn: "",
id: "",
image: "",
// projectSn: "",
// remark: "",
// solveBy: "",
// solveImage: "",
// solveTime: "",
state: -1,
// type: 4,
typeName: ""
});
const rules = reactive<FormRules>({
state: {
required: true,
message: "请输入选择整改状态",
trigger: "blur"
}
});
const confirm = async (formEl: FormInstance | undefined, form: any) => {
// 标记表单校验
if (!formEl) return;
await formEl.validate(async (valid, fields) => {
if (valid) {
const res = await addAIrecords(form);
ElMessage.success("保存成功");
visible.value = false;
imgVisible.value = false;
getAIproPage();
} else {
console.log("error submit!", fields);
ElMessage({
showClose: true,
message: "请完善表单信息!",
type: "error"
});
}
});
};
const onShowImg = async (params: any) => {
imgVisible.value = true;
imgList.value = { ...params };
};
// 去整改的弹窗
const onRecord = async () => {
title.value = "问题整改";
formData.value = reactive({
createBy: "",
createTime: "",
deviceCode: "",
deviceName: "",
id: "",
image: "",
remark: "",
solveBy: "",
solveImage: "",
solveTime: "",
state: undefined,
type: undefined,
typeName: ""
});
formData.value.deviceName = imgList.value.deviceName;
formData.value.typeName = imgList.value.typeName;
formData.value.image = imgList.value.image;
formData.value.createBy = imgList.value.createBy;
formData.value.createTime = imgList.value.createTime;
formData.value.id = imgList.value.id;
visible.value = true;
};
// form日期选择后改变入参
const onDatePicker = () => {
form.value.startTime = form.value.createTime[0];
form.value.endTime = form.value.createTime[1];
};
// 页面的form搜索 这里
const handSearch = async () => {
const res = await getAIAlarmPage({ ...form.value, ...pages.value });
questList.value = res.result;
pages.value.total = +questList.value.total;
};
// 页面的分页
const handleCurrentChange = async (page: number) => {
const res = await getAIAlarmPage({
pageNo: page,
pageSize: pages.value.pageSize
});
questList.value = res.result;
pages.value.total = +questList.value.total;
};
const handleSizeChange = async (size: number) => {
const res = await getAIAlarmPage({
pageNo: pages.value.pageNo,
pageSize: size
});
questList.value = res.result;
pages.value.total = +questList.value.total;
};
// 图片上传成功后的钩子
const handleAvatarSuccess: UploadProps["onSuccess"] = (response, uploadFile) => {
formData.value.solveImage = response.result.url;
};
const beforeAvatarUpload: UploadProps["beforeUpload"] = rawFile => {
if (rawFile.type !== "image/png" && rawFile.type !== "image/jpg" && rawFile.type !== "image/jpeg") {
console.log(rawFile.type);
ElMessage.error("请上传jpg或者png格式的图片");
return false;
}
// 限制文件大小
// else if (rawFile.size / 1024 / 1024 > 2) {
// ElMessage.error('Avatar picture size can not exceed 2MB!')
// return false
// }
return true;
};
// 获取报警记录的分页
const getAIproPage = async () => {
let requestData = {
...pages.value
};
if (activeValue.value == "eng") {
requestData.engineeringSn = searchSn.value;
} else if (activeValue.value == "project") {
requestData.projectSn = searchSn.value;
}
if (requestData.engineeringSn || requestData.projectSn) {
const { result } = await getAIAlarmPage(requestData);
questList.value = result;
qusLength.value = result.records;
pages.value.total = Number(result.total);
} else {
questList.value = { records: [] };
qusLength.value = [];
pages.value.total = 0;
}
};
// 监控名称下拉框的value
const getAiMonitorDevList = async () => {
const res = await getAiMonitorDev({});
nameList.value = res.result;
};
watch(
() => form.value.createTime,
() => {
if (form.value.createTime === null) {
form.value.startTime = "";
form.value.endTime = "";
}
}
);
// 抽屉tab选择时
const tabsSelect = val => {
activeValue.value = val;
if (val == "eng") {
getengineering();
} else if (val == "project") {
getProject();
}
};
// 获取项目信息
const getProject = async () => {
const res = await getEngineeringName();
engList.value = [res.result];
if (res.result) {
searchSn.value = res.result.projectSn;
}
getAIproPage();
console.log(res);
};
const getengineering = async () => {
// let newParams = JSON.parse(JSON.stringify(params));
const res = await getRelevanceList();
engList.value = res.result;
if (res.result && res.result.length > 0) {
searchSn.value = res.result[0].engineeringSn;
}
getAIproPage();
console.log(res);
};
// 点击抽屉的工程名称更新页面
const onUpdate = async row => {
let requestData = {
...pages.value
};
if (activeValue.value == "eng") {
requestData.engineeringSn = row.engineeringSn;
} else if (activeValue.value == "project") {
requestData.projectSn = row.projectSn;
}
const { result } = await getAIAlarmPage(requestData);
questList.value = result;
pages.value.total = Number(result.total);
ElMessage.success("页面已更新");
};
onMounted(() => {
getengineering();
getAiMonitorDevList();
});
</script>
<style lang="scss" scoped>
@import "./index.scss";
</style>