fix:单据工单联调,订阅联调

This commit is contained in:
SunTao 2024-11-28 11:12:21 +08:00
parent 5d316b5e3b
commit 669552cce1
12 changed files with 643 additions and 205 deletions

View File

@ -1,3 +1,12 @@
/*
* @Author: SunTao 328867980@qq.com
* @Date: 2024-11-27 10:58:33
* @LastEditors: SunTao 328867980@qq.com
* @LastEditTime: 2024-11-27 10:58:33
* @FilePath: \znxjxt-ui\src\api\xj\document.js
* @Description: 养护通知单相关接口
*/
import request from "@/utils/request"; import request from "@/utils/request";
// 路段下拉数据 // 路段下拉数据
@ -24,3 +33,30 @@ export function getDefectStatus() {
method: "get", method: "get",
}); });
} }
// 获取养护通知单列表
export function getMaintenanceNoticeList(params) {
return request({
url: "/maintenance-notice/list",
method: "get",
params,
});
}
// 生成养护通知单
export function addMaintenanceNotice(data) {
return request({
url: "/maintenance-notice/create",
method: "post",
data,
});
}
// 根据id查询养护通知单
export function getMaintenanceNoticeById(params) {
return request({
url: `/maintenance-notice/getNoticeByDefectId`,
method: "get",
params,
});
}

View File

@ -0,0 +1,44 @@
/*
* @Author: SunTao 328867980@qq.com
* @Date: 2024-11-20 11:58:33
* @LastEditors: SunTao 328867980@qq.com
* @LastEditTime: 2024-11-20 15:49:28
* @FilePath: \znxjxt-ui\src\api\xj\subscription.js
* @Description: 订阅中心相关接口
*/
import request from "@/utils/request";
/**
* @description: 获取订阅列表
* @return {Promise<any>}
*/
export const getSubscriptionList = (data) => {
return request({
url: "/subscriptions/list",
method: "get",
params: data,
});
};
/**
* @description: 订阅
*/
export const subscribe = (data) => {
return request({
url: "/subscriptions/add",
method: "post",
data,
});
};
/**
* @description: 取消订阅
*/
export const unsubscribe = (data) => {
return request({
url: "/subscriptions/remove",
method: "post",
data,
});
};

View File

@ -52,13 +52,7 @@ import { Tile as TileLayer } from "ol/layer";
import { defaults as defaultControls } from "ol/control"; import { defaults as defaultControls } from "ol/control";
import VectorLayer from "ol/layer/Vector"; import VectorLayer from "ol/layer/Vector";
import { Vector as VectorSource } from "ol/source"; import { Vector as VectorSource } from "ol/source";
import { import { Draw, Modify, Select, Snap } from "ol/interaction";
Draw,
Modify,
Select,
Snap,
defaults as defaultInteractions,
} from "ol/interaction";
import * as styleExports from "ol/style"; import * as styleExports from "ol/style";
import { Polygon, LineString } from "ol/geom"; import { Polygon, LineString } from "ol/geom";
@ -117,7 +111,7 @@ export default {
default: () => [], default: () => [],
}, },
// 线 // 线
editCoordinatesLine:{ editCoordinatesLine: {
type: Array, type: Array,
default: () => [], default: () => [],
}, },
@ -460,7 +454,7 @@ export default {
}); });
modify.on("modifyend", (e) => { modify.on("modifyend", (e) => {
console.log(11111111); console.log(11111111);
e.features.forEach((feature) => { e.features.forEach((feature) => {
this.drawMarkers = feature.getGeometry().getCoordinates().flat(); this.drawMarkers = feature.getGeometry().getCoordinates().flat();
this.$emit("endEoordinate", this.drawMarkers); this.$emit("endEoordinate", this.drawMarkers);
@ -635,7 +629,7 @@ export default {
* @description: 删除绘制线段功能 * @description: 删除绘制线段功能
* @return {*} * @return {*}
*/ */
deleteLinedraw(){ deleteLinedraw() {
const map = this.instance.get("map"); const map = this.instance.get("map");
map.removeInteraction(this.drawLine); map.removeInteraction(this.drawLine);
this.drawLineLayer.getSource().clear(); this.drawLineLayer.getSource().clear();

View File

@ -153,25 +153,12 @@
{{ item.stakeStart || "暂无数据" }} 终止桩号: {{ item.stakeStart || "暂无数据" }} 终止桩号:
{{ item.stakeEnd || "暂无数据" }} {{ item.stakeEnd || "暂无数据" }}
病害类型: 病害类型:
{{ item.type || "暂无数据" }} 病害面积{{ item.area }}平方米 {{ item.type || "暂无数据" }}
病害长度{{ item.length }}</el-checkbox <span v-if="bottomTipClick === '1'">
> 病害面积{{ item.area }}平方米 病害长度{{ item.length }}
</span>
</el-checkbox>
</el-checkbox-group> </el-checkbox-group>
<!-- <div
class="image-info"
v-for="(item, index) in rectItem"
:key="`image-info-${index}`"
:style="{ color: colorList[index] }"
>
采集时间:
{{ new Date(item.createdTime).toLocaleString() }} 起始桩号:
{{ item.stakeStart || "暂无数据" }} 终止桩号:
{{ item.stakeEnd || "暂无数据" }}
病害类型:
{{ item.type || "暂无数据" }} 病害面积{{ item.area }}平方米
病害长度{{ item.length }}
</div> -->
</div> </div>
<img <img
:src="currentImage" :src="currentImage"

View File

@ -26,7 +26,7 @@
placement="bottom-end" placement="bottom-end"
width="400" width="400"
popper-class="screen-message-popover" popper-class="screen-message-popover"
trigger="click" trigger="hover"
> >
<div class="screen-message-content"> <div class="screen-message-content">
<div class="message-content"> <div class="message-content">
@ -511,7 +511,10 @@ export default {
// this.initWebSocket(); // this.initWebSocket();
}, },
methods: { methods: {
/* 获取当前时间 */ /**
* @description: 获取当前时间
* @return {*}
*/
setTime() { setTime() {
this.timeFlag = setInterval(() => { this.timeFlag = setInterval(() => {
const weekMap = [ const weekMap = [
@ -544,7 +547,10 @@ export default {
}, 1000); }, 1000);
}, },
/* 获取消息中心数据 */ /**
* @description: 获取消息中心数据
* @return {void}
*/
getMessageList() { getMessageList() {
// getMessageList().then(({ code, data }) => { // getMessageList().then(({ code, data }) => {
// if (code === 200) { // if (code === 200) {
@ -592,7 +598,10 @@ export default {
this.$router.push("/inspection_warn/warning-center"); this.$router.push("/inspection_warn/warning-center");
}, },
/* 获取数据栏右上角选项数据 */ /**
* @description: 获取数据栏右上角选项数据
* @return {void}
*/
getSelect() { getSelect() {
selectTypeList().then(({ code, data }) => { selectTypeList().then(({ code, data }) => {
if (code === 200) { if (code === 200) {
@ -600,8 +609,11 @@ export default {
} }
}); });
}, },
/* 获取路段下拉数据 */ /**
* @description: 获取路段下拉数据
* @return {void}
*/
getRoadList() { getRoadList() {
getRoadListTypes().then(({ code, data }) => { getRoadListTypes().then(({ code, data }) => {
if (code === 200) { if (code === 200) {
@ -610,7 +622,10 @@ export default {
}); });
}, },
/* 获取图片背景左上角病害类型下拉 */ /**
* @description: 获取图片背景左上角病害类型下拉
* @return {void}
*/
getDieaseTypeList() { getDieaseTypeList() {
getDefectTypes().then(({ code, data }) => { getDefectTypes().then(({ code, data }) => {
if (code === 200) { if (code === 200) {
@ -619,7 +634,10 @@ export default {
}); });
}, },
/* 获取图片背景下坐标数据 */ /**
* @description: 获取图片背景下坐标数据
* @return {void}
*/
getMapCare(value) { getMapCare(value) {
const data = { const data = {
classType: value ? value[0] : "", classType: value ? value[0] : "",
@ -632,7 +650,10 @@ export default {
}); });
}, },
/* 点击病害日志详情打开弹窗进行地图打点 */ /**
* @description: 点击病害日志详情打开弹窗进行地图打点
* @return {void}
*/
getimagePoint(item) { getimagePoint(item) {
this.imgTitle = "查看"; this.imgTitle = "查看";
this.imageItem = item; this.imageItem = item;
@ -650,20 +671,29 @@ export default {
this.getCenterPiont(); this.getCenterPiont();
}, },
/* 关闭图片查看弹窗 */ /**
* @description: 关闭图片查看弹窗
* @return {void}
*/
imgCancel() { imgCancel() {
this.imgTitle = ""; this.imgTitle = "";
this.imageItem = {}; this.imageItem = {};
this.imgVisible = false; this.imgVisible = false;
}, },
/* 关闭查看点位大图弹窗 */ /**
* @description: 关闭查看点位大图弹窗
* @return {void}
*/
screenImgCancel() { screenImgCancel() {
this.$refs.roadMap.removeSelectClick(); this.$refs.roadMap.removeSelectClick();
this.showImageDialog = false; this.showImageDialog = false;
}, },
/* 切换icon类型多选框事件 */ /**
* @description: 切换icon类型多选框事件
* @return {void}
*/
handleChecked(value) { handleChecked(value) {
this.centerPiont = this.drawPointList.filter( this.centerPiont = this.drawPointList.filter(
(item) => value.indexOf(item.iconType) > -1 (item) => value.indexOf(item.iconType) > -1
@ -676,7 +706,10 @@ export default {
}); });
}, },
/* 获取地图点位信息 */ /**
* @description: 获取地图点位信息
* @return {void}
*/
getCenterPiont() { getCenterPiont() {
// //
if (this.clusters) { if (this.clusters) {
@ -719,7 +752,10 @@ export default {
}); });
}, },
/* 绘制地图点位 */ /**
* @description: 绘制地图点位
* @return {void}
*/
drawPoint() { drawPoint() {
const features = []; const features = [];
this.centerPiont.forEach((element) => { this.centerPiont.forEach((element) => {
@ -815,7 +851,10 @@ export default {
}); });
}, },
/* 获取地图线段点位信息 */ /**
* @description: 获取地图线段点位信息
* @return {void}
*/
getLinePoint() { getLinePoint() {
if (!this.markLayerLines) { if (!this.markLayerLines) {
mapPciList().then(({ code, data }) => { mapPciList().then(({ code, data }) => {
@ -827,7 +866,10 @@ export default {
} }
}, },
/* 绘制地图线段 */ /**
* @description: 绘制地图线段
* @return {void}
*/
drawLine() { drawLine() {
const features = []; const features = [];
this.lineString.forEach((element) => { this.lineString.forEach((element) => {
@ -856,6 +898,16 @@ export default {
color: "#ffffff", color: "#ffffff",
}), }),
}), }),
// text: new Text({
// text: "121454",
// color: "#ffffff",
// textAlign: "center", //
// textBaseline: "middle",
// offsetY: 0,
// fill: new Fill({
// color: "#ffffff",
// }),
// }),
}), }),
]); ]);
features.push(line); features.push(line);
@ -875,7 +927,11 @@ export default {
}); });
}, },
/* 地图线段颜色区分 */ /**
* @description: 地图线段颜色区分
* @param {number} value
* @return {string}
*/
getLineColor(value) { getLineColor(value) {
if (value > 92) { if (value > 92) {
return "#0ABE67"; return "#0ABE67";
@ -889,8 +945,12 @@ export default {
return "#E64548"; return "#E64548";
} }
}, },
/* 地图下方4图标类别切换点击事件 */ /**
* @description: 地图下方4图标类别切换点击事件
* @param {string} value
* @return {void}
*/
changeIconType(value) { changeIconType(value) {
if (this.bottomTipClick !== value) { if (this.bottomTipClick !== value) {
this.bottomTipClick = value; this.bottomTipClick = value;
@ -908,7 +968,10 @@ export default {
} }
}, },
/* 获取icon多选数据 */ /**
* @description: 获取icon多选数据
* @return {void}
*/
getIconType() { getIconType() {
this.mapLogeList = {}; this.mapLogeList = {};
getItemTypes({ getItemTypes({
@ -927,7 +990,11 @@ export default {
}); });
}, },
/* 传回来的地图图层 */ /**
* @description: 传回来的地图图层
* @param {number} zoom
* @return {void}
*/
getZoom(zoom) { getZoom(zoom) {
this.mapZoom = zoom; this.mapZoom = zoom;
if (this.clusters && zoom * 1 > 15) { if (this.clusters && zoom * 1 > 15) {
@ -937,7 +1004,11 @@ export default {
} }
}, },
/* 地图选中feature事件 */ /**
* @description: 地图选中feature事件
* @param {object} e
* @return {void}
*/
featureSelect(e) { featureSelect(e) {
const map = this.$refs.roadMap.instance.get("map"); const map = this.$refs.roadMap.instance.get("map");
const selectedFeatures = e.selected; const selectedFeatures = e.selected;
@ -970,7 +1041,11 @@ export default {
} }
}, },
/* 数据栏切换事件 */ /**
* @description: 数据栏切换事件
* @param {object} item
* @return {void}
*/
changeElement(item) { changeElement(item) {
if (this.elementDiv !== item) { if (this.elementDiv !== item) {
this.elementDiv = item.component; this.elementDiv = item.component;
@ -1137,12 +1212,18 @@ export default {
} }
}, },
/* 跳转系统首页 */ /**
* @description: 跳转系统首页
* @return {void}
*/
goIndex() { goIndex() {
this.$router.push("/index"); this.$router.push("/index");
}, },
/* 图片位置信息获取 */ /**
* @description: 图片位置信息获取
* @return {void}
*/
updateScreenRects() { updateScreenRects() {
1; 1;
this.screenRects = []; this.screenRects = [];
@ -1158,7 +1239,14 @@ export default {
]; ];
}, },
/* 图片红框位置 */ /**
* @description: 图片红框位置
* @param {object} left
* @param {object} top
* @param {object} width
* @param {object} height
* @return {object}
*/
getScreenRectStyle({ left, top, width, height }) { getScreenRectStyle({ left, top, width, height }) {
const image = this.$refs.mainImage; const image = this.$refs.mainImage;
const container = this.$refs.imageContainer; const container = this.$refs.imageContainer;
@ -1185,7 +1273,10 @@ export default {
}; };
}, },
/* 初始化websocket */ /**
* @description: 初始化websocket
* @return {void}
*/
initWebSocket() { initWebSocket() {
const url = `ws://192.168.1.188:8080/websocket?token=${getToken()}`; const url = `ws://192.168.1.188:8080/websocket?token=${getToken()}`;
const data = { type: "carLocation", status: true }; const data = { type: "carLocation", status: true };
@ -1202,7 +1293,10 @@ export default {
); );
}, },
/* 发送消息 */ /**
* @description: 发送消息
* @return {void}
*/
sendMsg() { sendMsg() {
sendMsg(5555); //value sendMsg(5555); //value
// this.value = ""; // this.value = "";

View File

@ -19,7 +19,6 @@
<el-col :span="24"> <el-col :span="24">
<el-form-item label="道路名称:" prop="segmentId"> <el-form-item label="道路名称:" prop="segmentId">
<el-select <el-select
disabled
v-model="editForm.segmentId" v-model="editForm.segmentId"
placeholder="请选择路段" placeholder="请选择路段"
clearable clearable
@ -38,7 +37,6 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item label="开始桩号:" prop="stakeStart"> <el-form-item label="开始桩号:" prop="stakeStart">
<el-input <el-input
disabled
v-model="editForm.stakeStart" v-model="editForm.stakeStart"
placeholder="请输入开始桩号" placeholder="请输入开始桩号"
/> />
@ -47,7 +45,6 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item label="结束桩号:" prop="stakeEnd"> <el-form-item label="结束桩号:" prop="stakeEnd">
<el-input <el-input
disabled
v-model="editForm.stakeEnd" v-model="editForm.stakeEnd"
placeholder="请输入结束桩号" placeholder="请输入结束桩号"
/> />
@ -56,21 +53,21 @@
</el-row> </el-row>
<el-row :gutter="24"> <el-row :gutter="24">
<el-col :span="24"> <el-col :span="24">
<el-form-item label="养护负责人:" prop="projectLeader"> <el-form-item label="养护负责人:" prop="receiver">
<el-input <el-input
clearable clearable
v-model="editForm.projectLeader" v-model="editForm.receiver"
placeholder="请输入负责人名称" placeholder="请输入负责人名称"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="24"> <el-row :gutter="24">
<el-form-item label="养护内容:" prop="content"> <el-form-item label="养护内容:" prop="taskDescription">
<fssm-scroll style="max-height: 10rem"> <fssm-scroll style="max-height: 10rem">
<div <div
class="content-box" class="content-box"
v-for="(item, index) in editForm.content" v-for="(item, index) in editForm.taskDescription"
:key="`content-box-${index}`" :key="`content-box-${index}`"
> >
<el-col :span="21"> <el-col :span="21">
@ -78,7 +75,7 @@
type="textarea" type="textarea"
resize="none" resize="none"
placeholder="请输入养护内容" placeholder="请输入养护内容"
v-model="editForm.content[index]" v-model="editForm.taskDescription[index]"
/> />
</el-col> </el-col>
<el-col :span="2"> <el-col :span="2">
@ -107,13 +104,26 @@
<script> <script>
import FssmScroll from "@/components/scroll/fssm-scroll.vue"; import FssmScroll from "@/components/scroll/fssm-scroll.vue";
import { addMaintenanceNotice } from "@/api/xj/document";
export default { export default {
name: "EditDialog", name: "EditDialog",
components: { FssmScroll }, components: { FssmScroll },
props: {
dialogItem: {
type: Object,
default: () => {},
},
segmentList: {
type: Array,
default: () => [],
},
},
data() { data() {
return { return {
// //
editForm: { editForm: {
// id
defectId: "",
// //
segmentId: "", segmentId: "",
// //
@ -121,18 +131,25 @@ export default {
// //
stakeEnd: "", stakeEnd: "",
// //
projectLeader: "", receiver: "",
// //
content: ["asdadasda", "asdasfddd"], taskDescription: [""],
}, },
//
segmentList: [],
// //
rules: { rules: {
projectLeader: [ segmentId: [
{ required: true, message: "请选择路段", trigger: "change" },
],
stakeStart: [
{ required: true, message: "请输入开始桩号", trigger: "blur" },
],
stakeEnd: [
{ required: true, message: "请输入结束桩号", trigger: "blur" },
],
receiver: [
{ required: true, message: "请输入负责人名称", trigger: "blur" }, { required: true, message: "请输入负责人名称", trigger: "blur" },
], ],
content: [ taskDescription: [
{ {
type: "array", type: "array",
required: true, required: true,
@ -146,19 +163,40 @@ export default {
}, },
}; };
}, },
watch: {
dialogItem: {
handler(val) {
this.editForm = {
...val,
id: null,
defectId: val.id,
createdTime: null,
taskDescription: [
`${val.createdTimeLocal} ${val.roadName || ""}-${
val.segmentName || ""
} 主线 ${val.stakeStart || ""}-${val.stakeEnd || ""} 有${
val.defectTypeName
}`,
],
};
},
deep: true,
immediate: true,
},
},
methods: { methods: {
/** /**
* @description: 添加养护内容 * @description: 添加养护内容
*/ */
handleAddContent() { handleAddContent() {
this.editForm.content.push(""); this.editForm.taskDescription.push("");
}, },
/** /**
* @description: 删除养护内容 * @description: 删除养护内容
*/ */
handleDeleteContent(index) { handleDeleteContent(index) {
this.editForm.content.splice(index, 1); this.editForm.taskDescription.splice(index, 1);
}, },
/** /**
@ -174,8 +212,14 @@ export default {
submitForm() { submitForm() {
this.$refs.editForm.validate((valid) => { this.$refs.editForm.validate((valid) => {
if (valid) { if (valid) {
console.log(this.editForm); addMaintenanceNotice(this.editForm).then(({ code, data }) => {
this.$emit("cancel"); if (code === 200) {
this.$message.success("生成成功");
this.$emit("cancel");
} else {
this.$message.error(data);
}
});
} }
}); });
}, },

View File

@ -9,28 +9,30 @@
<template> <template>
<div class="view-content"> <div class="view-content">
<div class="view-title">高速公路道路养护作业通知单</div> <div class="view-title">高速公路道路养护作业通知单</div>
<div class="view-title-card">编号</div> <div class="view-title-card">编号{{ viewData.noticeNo || "" }}</div>
<div class="view-table"> <div class="view-table">
<div class="view-table-top"> <div class="view-table-top">
<div class="left-item"> <div class="left-item">
<div class="left-item-content"> <div class="left-item-content">
<div class="name">通知时间</div> <div class="name">通知时间</div>
<div class="value">2024-11-20日10:32</div> <div class="value">{{ viewData.issueDate || "" }}</div>
</div> </div>
<div class="left-item-content"> <div class="left-item-content">
<div class="name">作业完成时间</div> <div class="name">作业完成时间</div>
<div class="value">2024-11月20日 18:00</div> <div class="value">{{ viewData.handleTime || "" }}</div>
</div> </div>
</div> </div>
<div class="left-item-title">地点</div> <div class="left-item-title">地点</div>
<div class="left-item"> <div class="left-item">
<div class="left-item-content"> <div class="left-item-content">
<div class="name">里程桩号</div> <div class="name">里程桩号</div>
<div class="value">2024-11-20日10:32</div> <div class="value">
{{ viewData.stakeStart || "" }}{{ viewData.stakeEnd || "" }}
</div>
</div> </div>
<div class="left-item-content"> <div class="left-item-content">
<div class="name">位置</div> <div class="name">位置</div>
<div class="value">2024-11月20日 18:00</div> <div class="value">{{ viewData.segmentName }}</div>
</div> </div>
</div> </div>
</div> </div>
@ -43,7 +45,7 @@
<fssm-scroll :showBar="false" style="max-height: 16rem"> <fssm-scroll :showBar="false" style="max-height: 16rem">
<div <div
class="content-left-item" class="content-left-item"
v-for="(item, index) in tableContent" v-for="(item, index) in viewData.taskDescription"
:key="`content-left-item-${index}`" :key="`content-left-item-${index}`"
> >
<div class="name">{{ index + 1 }}</div> <div class="name">{{ index + 1 }}</div>
@ -56,30 +58,55 @@
</fssm-scroll> </fssm-scroll>
</div> </div>
<div class="view-table-bottom"> <div class="view-table-bottom">
<span>管理处道路养护工程师</span> <span>管理处道路养护工程师{{ viewData.creator || "" }}</span>
<span>制表人</span> <span>制表人{{ viewData.creator || "" }}</span>
<span>养护单位项目负责人</span> <span>养护单位项目负责人{{ viewData.receiver || "" }}</span>
</div> </div>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import fssmScroll from "../../../../../components/scroll/fssm-scroll.vue"; import { getMaintenanceNoticeById } from "@/api/xj/document";
import fssmScroll from "@/components/scroll/fssm-scroll.vue";
export default { export default {
components: { fssmScroll }, components: { fssmScroll },
name: "ViewDialog", name: "ViewDialog",
props: {
dialogItem: {
type: Object,
default: () => {},
},
},
data() { data() {
return { return {
// //
tableContent: [ viewData: {},
"2024年-11月-20日18:00沈吉高速-沈抚段主线K0+000-K45+000双向 LJ↑,LJ↓沈吉线 K0-45 硬路肩有垃圾",
"2024年-11月-20日18:00沈吉高速-沈抚段主线K0+000-K45+000双向 LJ↑,LJ↓沈吉线 K0-45 硬路肩有垃圾",
"2024年-11月-20日18:00沈吉高速-沈抚段主线K0+000-K45+000双向 LJ↑,LJ↓沈吉线 K0-45 硬路肩有垃圾",
],
}; };
}, },
methods: {}, watch: {
dialogItem: {
handler(val) {
this.getNoticeById(val.id);
},
immediate: true,
deep: true,
},
},
methods: {
/**
* @description: 根据id查询养护通知单
* @param {*} id
* @return {*}
*/
getNoticeById(id) {
getMaintenanceNoticeById({ id }).then(({ code, data }) => {
if (code === 200) {
this.viewData = data;
}
});
},
},
}; };
</script> </script>

View File

@ -10,6 +10,7 @@
<div class="content"> <div class="content">
<el-form <el-form
:model="noticeForm" :model="noticeForm"
:rules="noticeFormRules"
ref="noticeForm" ref="noticeForm"
size="small" size="small"
:inline="true" :inline="true"
@ -163,31 +164,57 @@
v-if="item.status === '2'" v-if="item.status === '2'"
style="color: #e6a23c" style="color: #e6a23c"
class="el-icon-info" class="el-icon-info"
></i>
<i
v-if="item.status === '3'"
style="color: #909399"
class="el-icon-warning"
></i ></i
>{{ item.title }}</span >{{ item.title }}</span
> >
<!-- 表格 --> <!-- 表格 -->
<el-table <el-table
class="notice-table"
ref="noticeTable" ref="noticeTable"
:data="noticeList" :data="noticeList"
v-loading="loading" v-loading="loading"
style="width: 100%" style="width: 100%"
> >
<el-table-column type="index" label="序号"> </el-table-column> <el-table-column type="index" label="序号"> </el-table-column>
<el-table-column <el-table-column label="路段名称" align="center" prop="segmentName" />
width="200" <el-table-column label="采集时间" align="center" prop="createdTime">
label="时间"
align="center"
prop="segmentName"
>
<template slot-scope="scope"> <template slot-scope="scope">
<span class="table-index">asd</span> <span>{{
{{ scope.row.segmentName }} new Date(scope.row.createdTime).toLocaleString()
}}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="消息内容" align="center" prop="stakeStart" /> <el-table-column
<el-table-column label="车牌号" align="center" prop="stakeEnd" /> label="病害类型"
<el-table-column label="设备id" align="center" prop="stakeEnd" /> align="center"
prop="defectTypeName"
>
</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">
<template slot-scope="scope">
{{
scope.row.targetLen * 1 <= 0 ? "" : `${scope.row.targetLen}`
}}
</template>
</el-table-column>
<el-table-column label="病害面积" align="center" prop="targetArea" />
<el-table-column label="状态" align="center" prop="noticeStatus" />
<el-table-column <el-table-column
label="操作" label="操作"
align="center" align="center"
@ -195,7 +222,7 @@
> >
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
v-if="activeName === '1'" v-if="activeName === '已生成'"
size="mini" size="mini"
type="text" type="text"
icon="el-icon-view" icon="el-icon-view"
@ -204,16 +231,16 @@
>查看 >查看
</el-button> </el-button>
<el-button <el-button
v-if="activeName === '2'" v-if="activeName === '未生成'"
size="mini" size="mini"
type="text" type="text"
icon="el-icon-edit" icon="el-icon-edit"
@click="handleUpdate(scope.row)" @click="handleUpdate(scope.row)"
v-hasPermi="['system:defect:edit']" v-hasPermi="['system:defect:edit']"
>编辑 >生成工单
</el-button> </el-button>
<el-button <el-button
v-if="activeName === '1'" v-if="activeName === '已生成'"
size="mini" size="mini"
type="text" type="text"
icon="el-icon-delete" icon="el-icon-delete"
@ -250,7 +277,12 @@
destroy-on-close destroy-on-close
@close="editCancel" @close="editCancel"
> >
<edit-dialog v-if="editVisible" @cancel="editCancel" /> <edit-dialog
v-if="editVisible"
:segmentList="segmentList"
:dialogItem="dialogItem"
@cancel="editCancel"
/>
</el-dialog> </el-dialog>
<!-- 查看弹窗 --> <!-- 查看弹窗 -->
@ -263,7 +295,36 @@
destroy-on-close destroy-on-close
@close="viewCancel" @close="viewCancel"
> >
<view-dialog v-if="viewVisible" @cancel="viewCancel" /> <view-dialog
v-if="viewVisible"
:dialogItem="dialogItem"
@cancel="viewCancel"
/>
</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> </el-dialog>
</div> </div>
</template> </template>
@ -271,7 +332,12 @@
<script> <script>
import EditDialog from "./components/edit-dialog.vue"; import EditDialog from "./components/edit-dialog.vue";
import ViewDialog from "./components/view-dialog.vue"; import ViewDialog from "./components/view-dialog.vue";
import { getSegment, getDefectList, getDefectStatus } from "@/api/xj/document"; import {
getSegment,
getDefectList,
getDefectStatus,
getMaintenanceNoticeList,
} from "@/api/xj/document";
export default { export default {
name: "MaintenanceNotice", name: "MaintenanceNotice",
components: { components: {
@ -289,17 +355,48 @@ export default {
// //
inspectDirection: "", inspectDirection: "",
// //
stakeStart: "", stakeStart: undefined,
stakeEnd: "", stakeEnd: undefined,
// //
minLen: "", minLen: undefined,
maxLen: "", maxLen: undefined,
// //
minArea: "", minArea: undefined,
maxArea: "", maxArea: undefined,
}, },
// //
searchForm: {}, searchForm: {},
//
noticeFormRules: {
stakeRange: [
{
required: false,
trigger: "blur",
validator: (rules, value, callback) => {
if (!this.noticeForm.stakeStart && !this.noticeForm.stakeEnd) {
callback();
}
// K1234+123
const pattern = /^K\d{4}\+\d{3}$/;
if (!pattern.test(this.noticeForm.stakeStart)) {
callback(new Error("起始公里桩格式错误"));
return;
}
if (!pattern.test(this.noticeForm.stakeEnd)) {
callback(new Error("终止公里桩格式错误"));
return;
}
callback();
},
},
],
stakeStart: [
{ required: true, pattern: /^K\d{4}\+\d{3}$/, trigger: "blur" },
],
stakeEnd: [
{ required: true, pattern: /^K\d{4}\+\d{3}$/, trigger: "blur" },
],
},
// //
dateTime: [], dateTime: [],
// //
@ -311,11 +408,12 @@ export default {
// //
defectStatus: [], defectStatus: [],
// //
activeName: "1", activeName: "已完成",
// //
editableTabs: [ editableTabs: [
{ title: "已生成", value: "1", status: "1" }, { title: "已完成", value: "已完成", status: "1" },
{ title: "未生成", value: "2", status: "2" }, { title: "已生成", value: "已生成", status: "2" },
{ title: "未生成", value: "未生成", status: "3" },
], ],
// //
@ -331,10 +429,19 @@ export default {
size: 10, size: 10,
}, },
//
dialogItem: {},
// //
editVisible: false, editVisible: false,
// //
viewVisible: false, viewVisible: false,
//
showImageDialog: false,
//
currentImageItem: {},
//
rects: [],
}; };
}, },
created() { created() {
@ -386,9 +493,13 @@ export default {
* @return {*} * @return {*}
*/ */
handleQuery() { handleQuery() {
this.searchForm = JSON.parse(JSON.stringify(this.noticeForm)); this.$refs.noticeForm.validate((valid) => {
this.pagination.page = 1; if (valid) {
this.getList(); this.searchForm = JSON.parse(JSON.stringify(this.noticeForm));
this.pagination.page = 1;
this.getList();
}
});
}, },
/** /**
@ -405,14 +516,14 @@ export default {
// //
inspectDirection: "", inspectDirection: "",
// //
stakeStart: "", stakeStart: undefined,
stakeEnd: "", stakeEnd: undefined,
// //
minLen: "", minLen: undefined,
maxLen: "", maxLen: undefined,
// //
minArea: "", minArea: undefined,
maxArea: "", maxArea: undefined,
}; };
this.searchForm = {}; this.searchForm = {};
this.pagination.page = 1; this.pagination.page = 1;
@ -428,14 +539,20 @@ export default {
const data = { const data = {
...this.searchForm, ...this.searchForm,
...this.pagination, ...this.pagination,
activeName: this.activeName, maintenanceStatus: this.activeName,
startTime: this.dateTime ? this.dateTime[0] : "", startTime: this.dateTime ? this.dateTime[0] : "",
endTime: this.dateTime ? this.dateTime[1] : "", endTime: this.dateTime ? this.dateTime[1] : "",
}; };
setTimeout(() => { getMaintenanceNoticeList(data)
this.noticeList = [{ id: "1", segmentName: "sSSSSSS" }]; .then(({ code, rows, total }) => {
this.loading = false; if (code === 200) {
}, 100); this.noticeList = rows;
this.tableTotal = total;
}
})
.finally(() => {
this.loading = false;
});
}, },
/** /**
@ -444,6 +561,7 @@ export default {
* @return {*} * @return {*}
*/ */
handleView(row) { handleView(row) {
this.dialogItem = row;
this.viewVisible = true; this.viewVisible = true;
}, },
@ -453,6 +571,7 @@ export default {
* @return {*} * @return {*}
*/ */
handleUpdate(row) { handleUpdate(row) {
this.dialogItem = row;
this.editVisible = true; this.editVisible = true;
}, },
@ -501,6 +620,7 @@ export default {
*/ */
editCancel() { editCancel() {
this.editVisible = false; this.editVisible = false;
this.dialogItem = {};
this.getList(); this.getList();
}, },
@ -510,8 +630,83 @@ export default {
* @return {*} * @return {*}
*/ */
viewCancel() { viewCancel() {
this.dialogItem = {};
this.viewVisible = false; this.viewVisible = false;
}, },
/**
* @description: 打开查看图片弹窗
* @param {*} item
* @return {*}
*/
showScreenImg(item) {
this.currentImageItem = item;
this.showImageDialog = true;
},
/**
* @description: 图片位置信息获取
* @param {*} val
* @return {*}
*/
updateRects() {
this.rects = [];
this.rectsItem = {};
const rects = this.currentImageItem?.rect?.split(",").map(Number) || [];
this.rects = [
{
left: rects[0],
top: rects[1],
width: rects[2],
height: rects[3],
},
];
},
/**
* @description: 图片红框位置
* @param {*} left
* @param {*} top
* @param {*} width
* @param {*} height
* @return {*}
*/
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",
};
},
/**
* @description: 关闭查看图片弹窗
* @param {*} val
* @return {*}
*/
imgCancel() {
this.showImageDialog = false;
this.currentImageItem = {};
this.rects = [];
},
}, },
}; };
</script> </script>
@ -521,6 +716,7 @@ export default {
width: 100%; width: 100%;
height: calc(100vh - 5.4rem); height: calc(100vh - 5.4rem);
padding: 1rem; padding: 1rem;
overflow-y: auto;
} }
/* 分页样式 */ /* 分页样式 */
@ -530,4 +726,27 @@ export default {
padding-top: 1rem; padding-top: 1rem;
justify-content: flex-end; justify-content: flex-end;
} }
/* 查看大图弹窗 */
.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> </style>

View File

@ -251,7 +251,11 @@
/> />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="病害长度" align="center" prop="targetLen" /> <el-table-column label="病害长度" align="center" prop="targetLen">
<template slot-scope="scope">
{{ scope.row.targetLen * 1 <= 0 ? "" : `${scope.row.targetLen}` }}
</template>
</el-table-column>
<el-table-column label="病害面积" align="center" prop="targetArea" /> <el-table-column label="病害面积" align="center" prop="targetArea" />
<el-table-column label="预警标识" align="center" prop="warningFlag"> <el-table-column label="预警标识" align="center" prop="warningFlag">
<template slot-scope="scope"> <template slot-scope="scope">

View File

@ -68,7 +68,7 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="上下行" prop="inspectDirection"> <!-- <el-form-item label="上下行" prop="inspectDirection">
<el-select <el-select
v-model="queryParams.inspectDirection" v-model="queryParams.inspectDirection"
placeholder="请选择" placeholder="请选择"
@ -77,6 +77,17 @@
<el-option label="上行" value="0" /> <el-option label="上行" value="0" />
<el-option label="下行" value="1" /> <el-option label="下行" value="1" />
</el-select> </el-select>
</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>
<el-form-item label="公里桩" prop="stakeRange"> <el-form-item label="公里桩" prop="stakeRange">
<el-input <el-input
@ -101,15 +112,12 @@
<i class="el-icon-info"></i> <i class="el-icon-info"></i>
</el-tooltip> </el-tooltip>
</el-form-item> </el-form-item>
<el-form-item label="预警标识" prop="warningFlag"> <el-form-item label="病害id" prop="id">
<el-select <el-input
v-model="queryParams.warningFlag" v-model="queryParams.id"
placeholder="请选择" placeholder="请填写病害id"
clearable clearable
> />
<el-option label="是" :value="1" />
<el-option label="否" :value="0" />
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="病害长度" prop="lengthRange"> <el-form-item label="病害长度" prop="lengthRange">
<el-input-number <el-input-number
@ -126,13 +134,6 @@
:min="0" :min="0"
></el-input-number> ></el-input-number>
</el-form-item> </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-form-item label="病害面积" prop="areaRange">
<el-input-number <el-input-number
v-model="queryParams.minArea" v-model="queryParams.minArea"
@ -210,39 +211,6 @@
>删除 >删除
</el-button> </el-button>
</el-col> </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-col :span="1.5">
<el-button <el-button
type="success" type="success"
@ -301,7 +269,11 @@
/> />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="病害长度" align="center" prop="targetLen" /> <el-table-column label="病害长度" align="center" prop="targetLen">
<template slot-scope="scope">
{{ scope.row.targetLen * 1 <= 0 ? "" : `${scope.row.targetLen}` }}
</template>
</el-table-column>
<el-table-column label="病害面积" align="center" prop="targetArea" /> <el-table-column label="病害面积" align="center" prop="targetArea" />
<el-table-column label="预警标识" align="center" prop="warningFlag"> <el-table-column label="预警标识" align="center" prop="warningFlag">
<template slot-scope="scope"> <template slot-scope="scope">

View File

@ -66,9 +66,10 @@ import { defaults as defaultControls } from "ol/control";
import { Vector as VectorSource } from "ol/source"; import { Vector as VectorSource } from "ol/source";
import logo from "@/assets/xc.png"; import logo from "@/assets/xc.png";
import { Point } from "ol/geom"; import { Point } from "ol/geom";
import { Style, Icon } from "ol/style"; import { Style, Icon, Stroke } from "ol/style";
import VectorLayer from "ol/layer/Vector"; import VectorLayer from "ol/layer/Vector";
import { getMapInfo, updateMapInfo } from "@/api/xj/parameter"; import { getMapInfo, updateMapInfo } from "@/api/xj/parameter";
import GeoJSON from "ol/format/GeoJSON.js";
export default { export default {
name: "Parameter", name: "Parameter",
@ -195,14 +196,22 @@ export default {
layers: [ layers: [
new TileLayer({ new TileLayer({
source: new XYZ({ source: new XYZ({
url: "http://t{0-7}.tianditu.com/DataServer?x={x}&y={y}&l={z}&T=vec_c&tk=1eb44fae5b9dc454442b322e9a41d233", url: "https://webrd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}",
projection: "EPSG:4326", // projection: "EPSG:4326",
}), }),
}), }),
new TileLayer({ // GeoJSON
source: new XYZ({ new VectorLayer({
url: "http://t{0-7}.tianditu.com/DataServer?x={x}&y={y}&l={z}&T=cva_c&tk=1eb44fae5b9dc454442b322e9a41d233", source: new VectorSource({
projection: "EPSG:4326", // url: "http://localhost:8080/defectfile/output.geojson", // GeoJSON
url: "", // GeoJSON
format: new GeoJSON(),
}),
style: new Style({
stroke: new Stroke({
color: "#ff0000",
width: 2,
}),
}), }),
}), }),
], ],
@ -211,7 +220,7 @@ export default {
map.on("click", (e) => { map.on("click", (e) => {
this.mapClick(e); this.mapClick(e);
}); });
// map.on("click", (e) => { // map.on("click", (e) => {
// point // point
// const pointSource = map // const pointSource = map
// .getAllLayers() // .getAllLayers()

View File

@ -16,14 +16,7 @@
style="width: 100%" style="width: 100%"
> >
<el-table-column type="index" width="70" label="序号"> </el-table-column> <el-table-column type="index" width="70" label="序号"> </el-table-column>
<el-table-column <el-table-column label="消息类型" align="center" prop="messageTypeName" />
width="200"
label="时间"
align="center"
prop="segmentName"
>
</el-table-column>
<el-table-column label="消息类型" align="center" prop="stakeStart" />
<el-table-column <el-table-column
label="操作" label="操作"
align="center" align="center"
@ -31,6 +24,7 @@
> >
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
v-if="scope.row.status === 1"
size="mini" size="mini"
type="text" type="text"
icon="el-icon-circle-check" icon="el-icon-circle-check"
@ -39,6 +33,7 @@
>订阅 >订阅
</el-button> </el-button>
<el-button <el-button
v-if="scope.row.status === 2"
size="mini" size="mini"
type="text" type="text"
icon="el-icon-circle-close" icon="el-icon-circle-close"
@ -53,12 +48,17 @@
</template> </template>
<script> <script>
import {
getSubscriptionList,
subscribe,
unsubscribe,
} from "@/api/xj/subscription";
export default { export default {
name: "SubscriptionCenter", name: "SubscriptionCenter",
data() { data() {
return { return {
// //
subscriptionList: [{ segmentName: "assssssssss" }], subscriptionList: [],
// loading // loading
loading: false, loading: false,
}; };
@ -71,7 +71,11 @@ export default {
* @description: 获取订阅列表 * @description: 获取订阅列表
*/ */
getList() { getList() {
this.subscriptionList = [{ segmentName: "ccccccccc" }]; getSubscriptionList().then(({ code, data }) => {
if (code === 200) {
this.subscriptionList = data;
}
});
}, },
/** /**
@ -79,9 +83,11 @@ export default {
*/ */
handleConfirm(row) { handleConfirm(row) {
this.$modal this.$modal
.confirm(`是否确认订阅选中的${[row.id].length}条记录`) .confirm(`是否确认订阅选中的${row.messageTypeName}】消息`)
.then(() => { .then(() => {
// return deleteRoad([row.id]); return subscribe({
messageType: row.messageType,
});
}) })
.then(() => { .then(() => {
this.getList(); this.getList();
@ -95,9 +101,11 @@ export default {
*/ */
handleCancel(row) { handleCancel(row) {
this.$modal this.$modal
.confirm(`是否取消订阅选中的${[row.id].length}条记录`) .confirm(`是否取消订阅选中的${row.messageTypeName}】消息`)
.then(() => { .then(() => {
// return deleteRoad([row.id]); return unsubscribe({
messageType: row.messageType,
});
}) })
.then(() => { .then(() => {
this.getList(); this.getList();