1420 lines
39 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!--
* @Author: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git
* @Date: 2024-10-08 10:58:25
* @LastEditors: SunTao 328867980@qq.com
* @LastEditTime: 2024-11-18 16:36:05
* @FilePath: \znxjxt-ui\src\views\xj\inspection\disease-management .vue
* @Description: 巡检信息管理-病害管理
-->
<template>
<div class="app-container">
<!-- 搜索表单 -->
<el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
v-show="showSearch"
label-width="100px"
>
<el-form-item label="道路名称" prop="segmentName">
<el-select
v-model="queryParams.segmentName"
placeholder="请选择路段"
clearable
>
<el-option
v-for="item in segmentList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="采集时间" prop="dateTime">
<el-date-picker
v-model="dateTime"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
clearable
/>
</el-form-item>
<el-form-item label="病害类型" prop="defectType">
<el-select
v-model="queryParams.defectType"
placeholder="请选择病害类型"
clearable
>
<el-option
v-for="item in tableDefect"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="病害状态" prop="state">
<el-select
v-model="queryParams.state"
placeholder="请选择病害状态"
clearable
>
<el-option
v-for="item in defectStatus"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="上下行" prop="inspectDirection">
<el-select
v-model="queryParams.inspectDirection"
placeholder="请选择"
clearable
>
<el-option label="上行" value="0" />
<el-option label="下行" value="1" />
</el-select>
</el-form-item>
<el-form-item label="公里桩" prop="stakeRange">
<el-input
v-model="queryParams.stakeStart"
placeholder="起始公里桩"
style="width: 10rem"
clearable
/>
<span style="margin: 0 5px">-</span>
<el-input
v-model="queryParams.stakeEnd"
placeholder="终止公里桩"
style="width: 10rem"
clearable
/>
<el-tooltip
class="item"
effect="dark"
content="格式为K0000+000"
placement="top"
>
<i class="el-icon-info"></i>
</el-tooltip>
</el-form-item>
<el-form-item label="预警标识" prop="warningFlag">
<el-select
v-model="queryParams.warningFlag"
placeholder="请选择"
clearable
>
<el-option label="是" :value="1" />
<el-option label="否" :value="0" />
</el-select>
</el-form-item>
<el-form-item label="病害长度" prop="lengthRange">
<el-input-number
v-model="queryParams.minLen"
controls-position="right"
placeholder="最小长度"
:min="0"
></el-input-number>
<span style="margin: 0 5px">-</span>
<el-input-number
v-model="queryParams.maxLen"
controls-position="right"
placeholder="最大长度"
:min="0"
></el-input-number>
</el-form-item>
<el-form-item label="病害id" prop="id">
<el-input
v-model="queryParams.id"
placeholder="请填写病害id"
clearable
/>
</el-form-item>
<el-form-item label="病害面积" prop="areaRange">
<el-input-number
v-model="queryParams.minArea"
controls-position="right"
placeholder="最小面积"
:min="0"
></el-input-number>
<span style="margin: 0 5px">-</span>
<el-input-number
v-model="queryParams.maxArea"
controls-position="right"
placeholder="最大面积"
:min="0"
></el-input-number>
</el-form-item>
<el-form-item label="快照id" prop="snapshotId">
<el-input
v-model="queryParams.snapshotId"
placeholder="请填写快照id"
clearable
/>
</el-form-item>
<el-form-item>
<el-button
type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>搜索</el-button
>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
>重置</el-button
>
</el-form-item>
</el-form>
<!-- 操作按钮 -->
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:defect:add']"
>新增
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete('')"
v-hasPermi="['system:defect:remove']"
>删除
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:defect:export']"
>导出日常监测报告
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:defect:export']"
>导出特殊事件报告
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:defect:export']"
>导出养护评估报告
</el-button>
</el-col>
<!-- <el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit-outline"
size="mini"
:disabled="multiple"
@click="handleUpdateBatch"
v-hasPermi="['system:defect:edit']"
>批量确认
</el-button>
</el-col> -->
</el-row>
<!-- 数据表格 -->
<el-table
ref="defectTable"
v-loading="loading"
:data="defectList"
@selection-change="handleSelectionChange"
style="width: 100%"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="路段名称" align="center" prop="segmentName" />
<el-table-column label="采集时间" align="center" prop="createdTime">
<template slot-scope="scope">
<span>{{ new Date(scope.row.createdTime).toLocaleString() }}</span>
</template>
</el-table-column>
<el-table-column label="病害类型" align="center" prop="defectType">
<template slot-scope="scope">
<span>{{ filterDefect(scope.row.defectType) }}</span>
</template>
</el-table-column>
<el-table-column label="病害状态" align="center" prop="state">
<template slot-scope="scope">
<span>{{ filterState(scope.row.state) }}</span>
</template>
</el-table-column>
<el-table-column label="校验状态" align="center" prop="dataStatus">
<template slot-scope="scope">
<span>{{
scope.row.dataStatus
? scope.row.dataStatus === 1
? "未校验"
: "已校验"
: ""
}}</span>
</template>
</el-table-column>
<el-table-column label="开始桩号" align="center" prop="stakeStart" />
<el-table-column label="结束桩号" align="center" prop="stakeEnd" />
<el-table-column label="病害图片" align="center" prop="media">
<template slot-scope="scope">
<img
@click="showScreenImg(scope.row)"
height="50"
:src="scope.row.mediaUrl"
/>
</template>
</el-table-column>
<el-table-column label="病害长度" align="center" prop="targetLen" />
<el-table-column label="病害面积" align="center" prop="targetArea" />
<el-table-column label="预警标识" align="center" prop="warningFlag">
<template slot-scope="scope">
<el-tag :type="scope.row.warningFlag === 1 ? 'danger' : 'success'">
{{ scope.row.warningFlag === 1 ? "是" : "否" }}
</el-tag>
</template>
</el-table-column>
<el-table-column
label="操作"
align="center"
width="180"
class-name="small-padding fixed-width"
>
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="viewDefect(scope.row)"
>查看
</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:defect:edit']"
>修改
</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:defect:remove']"
>删除
</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-bangzhu"
@click="mergeDefect(scope.row)"
>合并
</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-copy-document"
v-if="scope.row.id !== scope.row.snapshotId"
@click="splitDefect(scope.row)"
>拆分
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.page"
:limit.sync="queryParams.size"
@pagination="getList"
/>
<!-- 添加或修改缺陷对话框 -->
<el-dialog
:title="dialogTitle"
:visible.sync="dialogVisible"
width="60rem"
append-to-body
:close-on-click-modal="false"
destroy-on-close
@close="cancel"
>
<el-form
class="addForm"
ref="defectForm"
:model="form"
:rules="rules"
label-width="100px"
>
<el-row :gutter="24">
<el-col :span="dialogTitle === '添加缺陷' ? 12 : 24">
<el-form-item label="路段" prop="segmentId">
<el-select
v-model="form.segmentId"
placeholder="请选择路段"
clearable
>
<el-option
v-for="item in segmentList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" v-if="dialogTitle === '添加缺陷'">
<el-form-item label="病害类型" prop="defectType">
<el-select
v-model="form.defectType"
placeholder="请选择病害类型"
clearable
>
<el-option
v-for="item in tableDefect"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12" v-if="dialogTitle != '添加缺陷'">
<el-form-item label="校验状态" prop="dataStatus">
<el-select
v-model="form.dataStatus"
placeholder="请选择校验状态"
clearable
>
<el-option
v-for="item in states"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="dialogTitle === '添加缺陷' ? 24 : 12">
<el-form-item label="病害状态" prop="state">
<el-select
v-model="form.state"
placeholder="请选择病害状态"
clearable
>
<el-option
v-for="item in defectStatus"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="开始桩号" prop="stakeStart">
<el-input
v-model="form.stakeStart"
placeholder="请输入开始桩号"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="结束桩号" prop="stakeEnd">
<el-input v-model="form.stakeEnd" placeholder="请输入结束桩号" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="病害长度" prop="targetLen">
<el-input-number
v-model="form.targetLen"
:min="0"
placeholder="请输入病害长度"
style="width: 100%"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="病害面积" prop="targetArea">
<el-input-number
v-model="form.targetArea"
:min="0"
placeholder="请输入病害面积"
style="width: 100%"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="上下行" prop="inspectDirection">
<el-select
v-model="form.inspectDirection"
placeholder="请选择上下行"
clearable
>
<el-option label="上行" value="0" />
<el-option label="下行" value="1" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="病害位置">
<div ref="addMap" id="addMap" class="no-hand-cursor"></div>
</el-form-item>
<el-form-item label="上传病害图片">
<el-upload
ref="upload"
accept=".jpg, .png"
:action="upload.url"
:headers="upload.headers"
:file-list="upload.fileList"
:on-progress="handleFileUploadProgress"
:on-success="handleFileSuccess"
:auto-upload="false"
list-type="picture"
>
<el-button slot="trigger" size="small" type="primary"
>选取文件</el-button
>
<el-button
style="margin-left: 1rem"
size="small"
type="success"
:loading="upload.isUploading"
@click="submitUpload"
>上传到服务器</el-button
>
<div slot="tip" class="el-upload__tip">
只能上传jpg/png文件且不超过500kb
</div>
</el-upload>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<!-- 查看病害详细信息对话框 -->
<el-dialog
title="查看病害详细信息"
:visible.sync="openViewDialog"
width="55rem"
append-to-body
destroy-on-close
@close="cancel"
>
<div>
<!-- 上半部分 -->
<div style="display: flex; flex-direction: column; height: 50%">
<!-- 下拉选择框 -->
<div>
<el-select
v-model="viewCheck"
@change="changeView"
placeholder="请选择"
>
<el-option
v-for="item in viewOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</div>
<div style="display: flex">
<!-- 左侧病害信息 -->
<div style="width: 50%; padding: 10px">
<p>
上报日期{{ new Date(viewForm.createdTime).toLocaleString() }}
</p>
<p>路段名称{{ viewForm.segmentName }}</p>
<!-- <p>病害坐标{{ viewForm.geometry.coordinates }}</p> -->
<p>病害类型{{ filterDefect(viewForm.defectType) }}</p>
<p>病害长度{{ viewForm.targetLen }} </p>
<p>病害id{{ viewForm.id }}</p>
<p>快照id{{ viewForm.snapshotId }}</p>
</div>
<!-- 右侧图片展示 -->
<div style="width: 50%; padding: 10px">
<el-carousel class="view-carousel" height="15rem">
<el-carousel-item
v-for="(img, index) in viewForm.media"
:key="index"
>
<img :src="img.img" alt="病害图片" />
</el-carousel-item>
</el-carousel>
</div>
</div>
</div>
<!-- 下半部分显示天地图 -->
<div id="viewMap" style="height: 300px; margin-top: 20px"></div>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="closeDialog">关闭</el-button>
</div>
</el-dialog>
<!-- 合并病害弹窗 -->
<el-dialog
title="合并病害"
:visible.sync="mergeVisibleDialog"
width="75rem"
append-to-body
destroy-on-close
@close="mergeCancel"
>
<merge-dialog
:segmentList="segmentList"
:tableDefect="tableDefect"
:defectStatus="defectStatus"
:mergeItem="mergeItem"
@mergeCancel="mergeCancel"
></merge-dialog>
</el-dialog>
<!-- 查看图片大图 -->
<el-dialog
title="查看图片"
:visible.sync="showImageDialog"
width="75rem"
append-to-body
destroy-on-close
@close="imgCancel"
>
<div class="image-container" ref="imageContainer">
<img
:src="currentImageItem.mediaUrl"
alt="Main Image"
ref="mainImage"
@load="updateRects"
/>
<div
v-for="(rect, index) in rects"
:key="index"
class="rect-overlay"
:style="getRectStyle(rect)"
></div>
</div>
</el-dialog>
</div>
</template>
<script>
import {
listDefect,
delDefect,
addDefect,
updateDefect,
getDefectTypes,
getSegment,
getDefectList,
getStatesList,
getDefectStatus,
changeDefectStatus,
splitDefect,
getDefectById,
getDetailsBySnapShotId,
} from "@/api/xj/disease";
import { getToken } from "@/utils/auth";
import MergeDialog from "./components/merge-dialog.vue";
export default {
name: "Defect",
components: {
MergeDialog,
},
data() {
return {
typeInfo: [],
// 查看弹窗显隐控制
openViewDialog: false,
// 遮罩层
loading: false,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 缺陷表格数据
defectList: [],
// 弹出层标题
dialogTitle: "",
// 是否显示弹出层
dialogVisible: false,
// 查询表单参数
queryParams: {
page: 1,
size: 10,
segmentName: "",
defectType: "",
taskId: "",
state: "",
inspectDirection: "",
stakeStart: "",
stakeEnd: "",
warningFlag: null,
minLen: undefined,
maxLen: undefined,
minArea: undefined,
maxArea: undefined,
id: "",
snapshotId: "",
},
dateTime: [],
// 新增/编辑表单参数
form: {
id: null,
segmentId: "",
defectType: "",
dataStatus: "",
state: "",
stakeStart: "",
stakeEnd: "",
targetLen: undefined,
targetArea: undefined,
inspectDirection: "",
media: [],
},
// 上传参数设置
upload: {
// 是否禁用上传
isUploading: false,
// 设置上传的请求头部
headers: { Authorization: "Bearer " + getToken() },
// 上传的地址
url: process.env.VUE_APP_BASE_API + "/common/upload",
// 上传的文件列表
fileList: [],
},
// 表单校验规则
rules: {
segmentId: [
{ required: true, message: "请选择路段", trigger: "change" },
],
defectType: [
{ required: true, message: "请选择病害类型", trigger: "change" },
],
state: [
{ required: true, message: "请选择病害状态", trigger: "change" },
],
dataStatus: [
{ required: true, message: "请选择校验状态", trigger: "change" },
],
stakeStart: [
{ required: true, message: "请输入开始桩号", trigger: "blur" },
{
pattern: /^K\d{4}\+\d{3}$/,
message: "请按照K0000+000格式进行填写",
},
],
stakeEnd: [
{ required: true, message: "请输入结束桩号", trigger: "blur" },
{
pattern: /^K\d{4}\+\d{3}$/,
message: "请按照K0000+000格式进行填写",
},
],
targetLen: [
{ required: true, message: "请填写病害长度", trigger: "blur" },
{
type: "number",
min: 0,
message: "病害长度必须为正数",
trigger: "change",
},
],
targetArea: [
{ required: true, message: "请填写病害面积", trigger: "blur" },
{
type: "number",
min: 0,
message: "病害面积必须为正数",
trigger: "change",
},
],
inspectDirection: [
{ required: true, message: "请选择上下行", trigger: "change" },
],
},
// 病害类型级联下拉选项
defectTypeOptions: [],
// 路段下拉选项
segmentList: [],
// 列表病害状态数据
tableDefect: [],
defectTypes: [],
// 校验状态下拉选项
states: [],
// 病害状态下拉选项
defectStatus: [],
// 新增/编辑打点数组
markers: [],
// 查看弹窗选择绑定
viewCheck: "",
// 查看弹窗下拉数据绑定
viewOptions: [],
// 查看弹窗信息绑定
viewForm: {},
// 地图中心点
centerPoint: [123.30297096718999, 41.87942945541742],
// 查看图片大图弹窗显隐控制
showImageDialog: false,
// 查看大图片路径
currentImageItem: {},
// 图片病害位置信息
rects: [],
// 合并病害弹窗显隐控制
mergeVisibleDialog: false,
// 传合并病害弹窗数据
mergeItem: {},
};
},
created() {
this.getList();
this.getdefectTypes();
this.getSegmentList();
this.getTableDefect();
this.getStates();
this.getDefectStatusList();
},
methods: {
/* 获取路段下拉数据 */
getSegmentList() {
getSegment().then(({ code, data }) => {
if (code === 200) {
this.segmentList = data;
}
});
},
/* 获取列表病害类型对应数据 */
getTableDefect() {
getDefectList().then(({ code, data }) => {
if (code === 200) {
this.tableDefect = data;
}
});
},
/* 过滤列表病害类型 */
filterDefect(value) {
let a = null;
[a] = this.tableDefect.filter((item) => {
return item.value === value;
});
if (a) {
return a.label;
}
},
/* 过滤列表病害状态 */
filterState(value) {
let a = null;
[a] = this.defectStatus.filter((item) => {
return item.value === value;
});
if (a) {
return a.label;
}
},
/* 获取病害类型下拉数据 */
getdefectTypes() {
getDefectTypes().then((response) => {
this.defectTypeOptions = JSON.parse(response.msg).map((item) => {
return {
label: item.label,
value: item.value,
children: item.childrens,
};
});
});
},
/* 查询校验状态下拉数据 */
getStates() {
getStatesList().then(({ code, data }) => {
if (code === 200) {
this.states = data;
}
});
},
/* 查询病害状态下拉数据 */
getDefectStatusList() {
getDefectStatus().then(({ data, code }) => {
if (code === 200) {
this.defectStatus = data;
}
});
},
/** 查询缺陷列表 */
getList() {
// 处理日期范围
this.loading = true;
const params = {
...this.queryParams,
startTime: this.dateTime ? this.dateTime[0] : "",
endTime: this.dateTime ? this.dateTime[1] : "",
};
listDefect(params)
.then((response) => {
this.defectList = response.rows;
this.total = response.total;
this.loading = false;
})
.catch(() => {
this.loading = false;
});
},
/* 新增/编辑弹窗取消按钮 */
cancel() {
this.dialogVisible = false;
this.upload.fileList = [];
this.markers = [];
this.centerPoint = [123.30297096718999, 41.87942945541742];
this.form = {
id: null,
segmentId: "",
defectType: "",
dataStatus: "",
state: "",
stakeStart: "",
stakeEnd: "",
targetLen: undefined,
targetArea: undefined,
inspectDirection: "",
media: [],
};
if (this.$refs.addForm) {
this.$refs["addForm"].resetFields();
}
// this.resetFormData();
},
/* 重置表单方法 */
resetForm(formName) {
this.$refs[formName].resetFields();
},
/* 表单重置事件 */
resetQuery() {
this.resetForm("queryForm");
this.queryParams = {
page: 1,
size: 10,
segmentName: "",
defectType: [],
taskId: "",
state: "",
inspectDirection: "",
stakeStart: "",
stakeEnd: "",
warningFlag: null,
minLen: undefined,
maxLen: undefined,
minArea: undefined,
maxArea: undefined,
id: "",
snapshotId: "",
};
(this.dateTime = []), this.getList();
},
/** 点击搜索按钮操作 */
handleQuery() {
const phonereg = /^K\d{4}\+\d{3}$/;
if (this.queryParams.stakeStart) {
if (phonereg.test(this.queryParams.stakeStart)) {
this.queryParams.page = 1;
this.getList();
} else {
this.$modal.msgWarning("请按照格式填写公里桩进行修改");
}
} else if (this.queryParams.stakeEnd) {
if (phonereg.test(this.queryParams.stakeEnd)) {
this.queryParams.page = 1;
this.getList();
} else {
this.$modal.msgWarning("请按照格式填写公里桩进行修改");
}
} else {
this.queryParams.page = 1;
this.getList();
}
},
/* 多选框选中数据 */
handleSelectionChange(selection) {
this.ids = selection.map((item) => item.id);
this.single = selection.length !== 1;
this.multiple = !selection.length;
},
/** 新增按钮操作 */
handleAdd() {
this.dialogVisible = true;
this.dialogTitle = "添加缺陷";
this.$nextTick(() => {
this.initMap("addMap");
});
},
/** 修改按钮操作 */
handleUpdate(row) {
this.dialogVisible = true;
this.dialogTitle = "修改缺陷";
this.centerPoint = [
row.geometry.coordinates[0],
row.geometry.coordinates[1],
];
this.$nextTick(() => {
this.initMap("addMap");
const e = {
lnglat: {
lng: row.geometry.coordinates[0],
lat: row.geometry.coordinates[1],
},
};
this.onMapClick(e);
});
this.form = { ...row, dataStatus: row.dataStatus.toString() };
this.upload.fileList = row.media.map((item) => {
return {
...item,
url: item.img,
};
});
},
/* 批量确认操作 */
handleUpdateBatch() {
if (this.ids.length > 0) {
changeDefectStatus(this.ids).then(({ code, data }) => {
if (code === 200) {
this.$modal.msgSuccess(`修改${data}`);
this.$refs.defectTable.clearSelection();
this.ids = [];
}
});
} else {
this.$modal.msgWarning("请选择一条记录进行修改");
}
},
/* 文件提交处理 */
submitUpload() {
this.$refs.upload.submit();
},
/* 文件上传中处理 */
handleFileUploadProgress(event, file, fileList) {
this.upload.isUploading = true;
},
/* 文件上传成功处理 */
handleFileSuccess(response, file, fileList) {
this.upload.fileList = fileList.map((item) => {
if (item.response) {
return { ...item, img: item.response.url };
}
return item;
});
this.upload.isUploading = false;
},
/** 提交按钮 */
submitForm() {
this.$refs["defectForm"].validate((valid) => {
if (valid) {
// 验证点位
if (this.markers.length < 1) {
this.$modal.msgWarning("请选择病害位置");
return false;
}
// 验证文件上传列表
if (this.upload.fileList.length < 1) {
this.$modal.msgWarning("请上传图片");
return false;
}
const data = {
...this.form,
media: this.upload.fileList.map((item) => {
return { ...item, img: item.img };
}),
geometry: {
type: "Point",
coordinates: [this.markers[0].lng, this.markers[0].lat],
id: this.form?.geometry?.id,
},
};
if (this.form.id) {
// 更新缺陷
updateDefect(data)
.then(() => {
this.$modal.msgSuccess("修改成功");
this.$refs["defectForm"].resetFields();
this.upload.fileList = [];
this.markers = [];
this.dialogVisible = false;
this.getList();
})
.catch(() => {
this.$modal.msgError("修改失败");
});
} else {
// 添加缺陷
addDefect(data)
.then(() => {
this.$modal.msgSuccess("新增成功");
this.$refs["defectForm"].resetFields();
this.upload.fileList = [];
this.markers = [];
this.dialogVisible = false;
this.getList();
})
.catch(() => {
this.$modal.msgError("新增失败");
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row ? [row.id] : this.ids;
if (!ids.length) {
this.$modal.msgWarning("请选择要删除的记录");
return;
}
this.$modal
.confirm(`是否确认删除选中的${ids.length}条记录?`)
.then(() => {
return delDefect(ids);
})
.then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
})
.catch(() => {});
},
/* 合并按钮事件 */
mergeDefect(row) {
this.mergeItem = row;
this.mergeVisibleDialog = true;
},
/* 拆分按钮事件 */
splitDefect(row) {
const snapshotId = row.snapshotId;
this.$modal
.confirm(`是否确认拆分该条记录?`)
.then(() => {
return splitDefect({ snapshotId: snapshotId });
})
.then(() => {
this.getList();
this.$modal.msgSuccess("拆分成功");
})
.catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
this.download(
"xj/defect/export",
{
...this.queryParams,
},
`defect_${new Date().getTime()}.xlsx`
);
},
/** 重置表单数据 */
resetFormData() {
this.form = {
id: null,
segmentId: "",
defectType: "",
dataStatus: "",
state: "",
stakeStart: "",
stakeEnd: "",
targetLen: undefined,
targetArea: undefined,
inspectDirection: "",
media: [],
};
this.resetForm("defectForm");
},
/* 点击行列表查看事件 */
viewDefect(defect) {
// this.loadDefect(defect.id);
this.getSnapShotIdList(defect.id);
this.viewCheck = defect.snapshotId;
this.openViewDialog = true;
this.viewForm = defect;
this.$nextTick(() => {
this.centerPoint = [
defect.geometry.coordinates[0],
defect.geometry.coordinates[1],
];
this.initMap("viewMap");
const e = {
lnglat: {
lng: defect.geometry.coordinates[0],
lat: defect.geometry.coordinates[1],
},
};
this.onMapClick(e);
// 移除点击事件
this.map.removeEventListener("click", this.onMapClick);
});
},
/* 根据病害id获取所有下拉快照数据 */
getSnapShotIdList(id) {
getDefectById(id).then(({ code, data }) => {
if (code === 200) {
this.viewOptions = data;
}
});
},
/* 查看弹窗选择改变触发事件 */
changeView(val) {
getDetailsBySnapShotId(val).then(({ code, data }) => {
if (code === 200) {
console.log(data, "fff");
}
});
},
/* 初始化天地图 */
initMap(ele) {
// if (this.map) {
// this.map.remove(); // 如果已经有地图实例,先移除再重新加载
// }
// 初始化天地图
this.map = new T.Map(ele);
this.map.centerAndZoom(
new T.LngLat(this.centerPoint[0], this.centerPoint[1]),
9
); // 设置中心点和缩放级别
// 添加单击事件
this.map.on("click", this.onMapClick);
},
/* 新增/编辑地图单击事件 */
onMapClick(e) {
const marker = new T.Marker(e.lnglat);
if (this.markers.length > 0) {
this.markers.shift();
this.map.clearOverLays();
this.map.addOverLay(marker);
this.markers.push(e.lnglat);
} else {
this.map.addOverLay(marker);
this.markers.push(e.lnglat);
}
},
/* 关闭查看对话框 */
closeDialog() {
this.centerPoint = [123.30297096718999, 41.87942945541742];
this.openViewDialog = false;
},
/* 打开查看图片弹窗 */
showScreenImg(item) {
this.currentImageItem = item;
this.showImageDialog = true;
},
/* 图片位置信息获取 */
updateRects() {
this.rects = [];
this.rectsItem = {};
const image = this.$refs.mainImage;
const rects = this.currentImageItem?.rect?.split(",").map(Number) || [];
this.rects = [
{
left: rects[0],
top: rects[1],
width: rects[2],
height: rects[3],
},
];
// this.rectsItem = this.defectData[this.currentIndex];
},
/* 图片红框位置 */
getRectStyle({ left, top, width, height }) {
const image = this.$refs.mainImage;
const container = this.$refs.imageContainer;
if (!image || !container) return {};
const scaleX = container.clientWidth / image.naturalWidth;
const scaleY = container.clientHeight / image.naturalHeight;
const scale = Math.min(scaleX, scaleY);
const renderedWidth = image.naturalWidth * scale;
const renderedHeight = image.naturalHeight * scale;
const offsetX = (container.clientWidth - renderedWidth) / 2;
const offsetY = (container.clientHeight - renderedHeight) / 2;
return {
position: "absolute",
left: `${left * scale + offsetX}px`,
top: `${top * scale + offsetY}px`,
width: `${width * scale}px`,
height: `${height * scale}px`,
border: "2px solid #FF0000",
boxSizing: "border-box",
};
},
/* 关闭查看图片弹窗 */
imgCancel() {
this.showImageDialog = false;
this.currentImageItem = {};
this.rects = [];
},
/* 关闭合并病害弹窗 */
mergeCancel() {
this.mergeVisibleDialog = false;
this.getList();
},
},
};
</script>
<style lang="scss" scoped>
.app-container {
padding: 20px;
}
.mb8 {
margin-bottom: 8px;
}
.small-padding {
padding: 0 5px;
}
.fixed-width {
width: 120px;
}
/* 新增弹窗/编辑弹窗 */
.addForm {
.el-select,
.el-cascader {
width: 100%;
}
}
/* 新增地图框样式 */
.no-hand-cursor {
cursor: default !important;
width: 100%;
height: 20rem;
}
/* 上传文件列表样式 */
::v-deep .el-upload-list {
img {
width: auto;
}
}
/* 查看弹窗-图片框样式 */
.view-carousel {
height: 15rem;
// .el-carousel__item{
// height: 12rem;
img {
max-height: 15rem;
max-width: 25rem;
}
}
/* 查看大图弹窗 */
.image-container {
position: relative;
width: 100%;
height: 80%;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
}
.image-container img {
max-width: 100%;
max-height: 100%;
object-fit: contain;
}
.rect-overlay {
position: absolute;
pointer-events: none;
border: 2px solid red;
}
</style>