This commit is contained in:
lcw
2025-09-19 23:10:52 +08:00
parent a8834e6c73
commit 48cb481fe5
21 changed files with 1552 additions and 20871 deletions

20668
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -38,6 +38,7 @@
"pinia": "^3.0.1", "pinia": "^3.0.1",
"tesseract.js": "^6.0.1", "tesseract.js": "^6.0.1",
"vue": "^3.2.8", "vue": "^3.2.8",
"vue-draggable-plus": "^0.6.0",
"vue-router": "^4.0.11", "vue-router": "^4.0.11",
"vuex": "^4.0.2", "vuex": "^4.0.2",
"xlsx": "^0.18.5" "xlsx": "^0.18.5"

25
src/api/yj.js Normal file
View File

@ -0,0 +1,25 @@
import request from "@/utils/request";
const api = "/mosty-api/mosty-gsxt";
// 预警轨迹
export const tbYjxxGsgj = (data) => {
return request({
url: api + `/tbYjxx/gsgj`,
method: "POST",
data
})
}
export const tbYjxxGetPageList = (data) => {
return request({
url: api + `/tbYjxx/getPageList`,
method: "post",
data
})
}
export const tbYjxxQueryYjxx = (params) => {
return request({
url: api + `/tbYjxx/getList`,
method: "get",
params
})
}

View File

@ -165,3 +165,11 @@ export const tbGsxtZdryCzrzSelectCzrz = (params) => {
}); });
} }
// 不分页查询
export const tbGsxtZdrySelectList = (params) => {
return request({
url: api + `/tbGsxtZdry/selectList`,
method: "get",
params,
});
}

View File

@ -242,7 +242,7 @@ function multipleUser() {
multipleUserRef.value.toggleRowSelection(item, false); multipleUserRef.value.toggleRowSelection(item, false);
}); });
} }
// 根据 roleIds 进行回显 // 根据 roleIds 进行回显
tableData.value.forEach((item) => { tableData.value.forEach((item) => {
if (props.roleIds.some((id) => id == item.id)) { if (props.roleIds.some((id) => id == item.id)) {

View File

@ -79,8 +79,6 @@ let map;
let mapLayer; let mapLayer;
let mapLayer1; let mapLayer1;
onMounted(() => { onMounted(() => {
console.log("xxxxxxx");
emitter.on("followUp", (res) => { emitter.on("followUp", (res) => {
let box = document.getElementsByClassName("changeMap_box"); let box = document.getElementsByClassName("changeMap_box");
if (!box) return; if (!box) return;
@ -113,7 +111,7 @@ onMounted(() => {
}) })
zoomTarget.value = map.mapboxGLMap.getZoom(); zoomTarget.value = map.mapboxGLMap.getZoom();
// 地图加载完成后发出事件 // 地图加载完成后发出事件
emit('mapLoaded') // emit('mapLoaded')
}); });
mapUtil.value = new MapUtil(map); mapUtil.value = new MapUtil(map);
// map = new EliMap({ // map = new EliMap({

View File

@ -9,7 +9,7 @@ export function MapUtil(map) {
_that.idsBox = {} //存放id的容器需要某个标记单个删除的时候存储 _that.idsBox = {} //存放id的容器需要某个标记单个删除的时候存储
_that.isCheck = false _that.isCheck = false
/** /**
* 设置地图中心点以 * 设置地图中心点以
* @param {*} location 中心坐标 [jd,wd] * @param {*} location 中心坐标 [jd,wd]
* @param {*} zoomLevel 层级 10 * @param {*} zoomLevel 层级 10
*/ */
@ -141,10 +141,10 @@ export function MapUtil(map) {
} }
// 信息框展示 // 信息框展示
MapUtil.prototype.makerShowTitle = (item,points,flag,text) =>{ MapUtil.prototype.makerShowTitle = (item, points, flag, text) => {
let T = flag == 'rx' ? 'rxTitle' :'Title' let T = flag == 'rx' ? 'rxTitle' : 'Title'
let flagT = flag+T; let flagT = flag + T;
if(!_that._self[flagT]) _that._self[flagT] = []; if (!_that._self[flagT]) _that._self[flagT] = [];
// 展示名字 // 展示名字
let textTitle = item.jzMc ? item.jzMc : item.fzrXm + '警组'; let textTitle = item.jzMc ? item.jzMc : item.fzrXm + '警组';
@ -242,7 +242,7 @@ export function MapUtil(map) {
} }
/** /**
* 聚合撒点 * 聚合撒点
* @param {*} coords 点位数据 geojson lng lat * @param {*} coords 点位数据 geojson lng lat
* @param {*} icon 点位图 * @param {*} icon 点位图
*/ */
@ -287,9 +287,9 @@ export function MapUtil(map) {
* @param {*} coords 数组 * @param {*} coords 数组
*/ */
MapUtil.prototype.showHeatDrawing = (res) => { MapUtil.prototype.showHeatDrawing = (res) => {
let { coords, flag,isclear ,color} = res; let { coords, flag, isclear, color } = res;
if(!_that._self[flag]) _that._self[flag] = []; if (!_that._self[flag]) _that._self[flag] = [];
if(isclear) _that.removeElement(flag) //清除热力 if (isclear) _that.removeElement(flag) //清除热力
let data = { let data = {
type: 'FeatureCollection', type: 'FeatureCollection',
features: [] features: []
@ -315,12 +315,12 @@ export function MapUtil(map) {
// 清除所有 // 清除所有
MapUtil.prototype.removeAll = () => { MapUtil.prototype.removeAll = () => {
for(let key in _that._self){ for (let key in _that._self) {
if(key != 'rx' && key !='gpsZb' && !key.includes('rxTitle')){ if (key != 'rx' && key != 'gpsZb' && !key.includes('rxTitle')) {
let list = _that._self[key] let list = _that._self[key]
for (let i = 0; i < list.length; i++) { for (let i = 0; i < list.length; i++) {
const el = list[i]; const el = list[i];
if(el && typeof el == 'object') el.destroy() //destory()销毁 , show(false) false:隐藏 true :展示 if (el && typeof el == 'object') el.destroy() //destory()销毁 , show(false) false:隐藏 true :展示
} }
_that._self[key] = []; _that._self[key] = [];
} }
@ -342,7 +342,7 @@ export function MapUtil(map) {
} }
} }
} }
if(layer == 'rx') _that.idsBox[layer] = []; if (layer == 'rx') _that.idsBox[layer] = [];
// 其他图层 // 其他图层
if (!_that._self[layer]) return false; if (!_that._self[layer]) return false;
@ -354,8 +354,8 @@ export function MapUtil(map) {
_that._self[layer] = []; _that._self[layer] = [];
// d带标题的撒点 // d带标题的撒点
let T = layer == 'rx' ? 'rxTitle' :'Title' let T = layer == 'rx' ? 'rxTitle' : 'Title'
let flagT = layer+T; let flagT = layer + T;
if (!_that._self[flagT]) return false; if (!_that._self[flagT]) return false;
for (let i = 0; i < _that._self[flagT].length; i++) { for (let i = 0; i < _that._self[flagT].length; i++) {
const el = _that._self[flagT][i]; const el = _that._self[flagT][i];
@ -376,9 +376,9 @@ export function MapUtil(map) {
_that.idsBox[layer].splice(index, 1); _that.idsBox[layer].splice(index, 1);
if (_that._self[layer][index]) _that._self[layer][index].destroy() if (_that._self[layer][index]) _that._self[layer][index].destroy()
_that._self[layer].splice(index, 1) _that._self[layer].splice(index, 1)
if(layer == 'rx'){ if (layer == 'rx') {
let flagT = layer +'rxTitle'; let flagT = layer + 'rxTitle';
if(_that._self[flagT][index]) _that._self[flagT][index].destroy() if (_that._self[flagT][index]) _that._self[flagT][index].destroy()
_that._self[flagT].splice(index, 1) _that._self[flagT].splice(index, 1)
_that.removeGpsZbOverlayById(id) //删除图标 _that.removeGpsZbOverlayById(id) //删除图标
} }
@ -417,12 +417,12 @@ export function MapUtil(map) {
* (point 点, line 线, circle 圆, polygon 多边形, rectangle 矩形) , * (point 点, line 线, circle 圆, polygon 多边形, rectangle 矩形) ,
* geoJson:根据geojson回显图 * geoJson:根据geojson回显图
*/ */
MapUtil.prototype.plot = (res,resFun) => { MapUtil.prototype.plot = (res, resFun) => {
let {flag ,color,linecolor, type ,coords} = res let { flag, color, linecolor, type, coords } = res
if(!_that._self[flag]) _that._self[flag] = []; if (!_that._self[flag]) _that._self[flag] = [];
if(res.isclear) _that.removePlot(flag); //移除绘制工具 if (res.isclear) _that.removePlot(flag); //移除绘制工具
if(res.isclear && (res.type == 'polygon' || res.type == 'line')) _that.removeEara(flag); //移除回显的面和线条 if (res.isclear && (res.type == 'polygon' || res.type == 'line')) _that.removeEara(flag); //移除回显的面和线条
switch(type){ switch (type) {
case 'point': case 'point':
_that._CustomDraw.point((val) => { _that.handlePlot(val, type, flag, resFun) }) _that._CustomDraw.point((val) => { _that.handlePlot(val, type, flag, resFun) })
break; break;
@ -486,7 +486,7 @@ export function MapUtil(map) {
}) })
} }
/** /**
* 移除绘制面 * 移除绘制面
* @param {*} flag 唯一标识 * @param {*} flag 唯一标识
*/ */
MapUtil.prototype.removeEara = (flag) => { MapUtil.prototype.removeEara = (flag) => {
@ -499,11 +499,11 @@ export function MapUtil(map) {
* (solid 实线, dash 虚线, FlowColor 彩虹线, RoadLine 流线 * (solid 实线, dash 虚线, FlowColor 彩虹线, RoadLine 流线
*/ */
MapUtil.prototype.createLine = (res) => { MapUtil.prototype.createLine = (res) => {
let { type , coords , isclear ,flag ,color,width } = res; let { type, coords, isclear, flag, color, width } = res;
if(!coords) return false; // coords 是数组对象,可以同时撒多条数据 if (!coords) return false; // coords 是数组对象,可以同时撒多条数据
if(!_that._self[flag]) _that._self[flag] = [] ; if (!_that._self[flag]) _that._self[flag] = [];
if(isclear) _that.removeElement(flag); //移除回显的线条 if (isclear) _that.removeElement(flag); //移除回显的线条
let data = coords.map((item,index)=>{ let data = coords.map((item, index) => {
return { return {
position: item.coords[0], //二维数组 position: item.coords[0], //二维数组
text: '', text: '',
@ -670,22 +670,22 @@ export function MapUtil(map) {
} }
/**geojson 创建边界 /**geojson 创建边界
* let data = { * let data = {
* type: "FeatureCollection", * type: "FeatureCollection",
* features: [ * features: [
* { * {
geometry: { geometry: {
type: "Polygon", type: "Polygon",
coordinates: [it.coordinates] coordinates: [it.coordinates]
}, },
properties: { properties: {
}, },
type: "Feature", type: "Feature",
} }
* ] * ]
}; };
*/ */
MapUtil.prototype.createBoundarys = (res) => { MapUtil.prototype.createBoundarys = (res) => {
let { data } = res let { data } = res
if (!data) return false; if (!data) return false;
@ -713,8 +713,13 @@ export function MapUtil(map) {
MapUtil.prototype.openInfoDetail = (flag, data) => { MapUtil.prototype.openInfoDetail = (flag, data) => {
switch (flag) { switch (flag) {
case 'home_yj_map': case 'home_yj_map':
console.log(data);
emitter.emit("showHomeYJ", data); emitter.emit("showHomeYJ", data);
break; break;
case 'home_yj_detail':
console.log(data);
emitter.emit("showHomeWarning", data);
break;
} }
} }
} }

View File

@ -224,6 +224,14 @@ export const publicRoutes = [
title: "预警中心", title: "预警中心",
icon: "article" icon: "article"
} }
}, {
path: "/warningList",
name: "warningList",
component: () => import("@/views/backOfficeSystem/fourColorManage/warningList/index"),
meta: {
title: "预警列表",
icon: "article"
}
}, },
{ {
path: "/WarningModel", path: "/WarningModel",
@ -609,7 +617,7 @@ export const publicRoutes = [
icon: "article" icon: "article"
}, },
children: [ children: [
// { // {
// path: "/surveillanceControl", // path: "/surveillanceControl",
// name: "surveillanceControl", // name: "surveillanceControl",

View File

@ -0,0 +1,328 @@
<template>
<div class="historical-route-container" v-if="modelValue">
<!-- 头部标题 -->
<div class="header flex align-center just-between">
<span>轨迹历史</span>
<el-icon size="20px" @click="close" class="close-icon">
<Close />
</el-icon>
</div>
<!-- 筛选区域 -->
<div class="filter-section">
<div class="flex align-center just-between">
<el-date-picker class="date-picker" v-model="dateRange" type="datetimerange" range-separator="至"
start-placeholder="开始时间" end-placeholder="结束时间" format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss" />
<el-button type="primary" size="small" @click="search" class="search-btn">
查询
</el-button>
</div>
</div>
<!-- 轨迹列表区域 -->
<div class="track-list-container">
<div v-for="(item, index) in trackList" :key="index" class="track-item">
<div class="track-location">{{ item.yjNr }}</div>
</div>
<!-- 空状态 -->
<MOSTY.Empty :show="trackList.length <= 0" :imgSize="150"></MOSTY.Empty>
</div>
<!-- 底部按钮 -->
<div class="bottom-section">
<el-button type="primary" size="small" @click="showOnMap" class="show-map-btn">
轨迹上图
</el-button>
</div>
</div>
</template>
<script setup>
import * as MOSTY from "@/components/MyComponents/index";
import { tbYjxxGsgj } from '@/api/yj.js'
import { ref, defineProps, onMounted, watch } from "vue";
import emitter from "@/utils/eventBus.js";
import { ElMessage } from "element-plus";
import { Close } from '@element-plus/icons-vue';
// 参数传递
const props = defineProps({
// 某条预警详情
data: {
type: Array,
default: () => []
},
modelValue: {
type: Boolean,
default: false
},
});
const emit = defineEmits(["update:modelValue"]);
// 日期范围
const dateRange = ref([null, null]);
// 轨迹列表数据
const trackList = ref([]);
// 关闭窗口
function close() {
dateRange.value = [null, null];
emit("update:modelValue", false);
}
// 查询轨迹数据
function search() {
mockTrackData();
}
const mapData = ref([])
// 轨迹上图
function showOnMap() {
if (trackList.value.length === 0) {
ElMessage({ message: '暂无轨迹数据', type: 'warning' });
return;
}
for (let i = 0; i < 2; i++) {
let coords = mapData.value[i].list.map(item => {
return [item.jd, item.wd]
})
// const coords =[ [
// [
// 94.354613,
// 22.658568
// ],
// [
// 94.354613,
// 23.658568
// ],
// [
// 94.354613,
// 24.658568
// ],
// [
// 94.354613,
// 25.658568
// ],
// [
// 94.354613,
// 26.658568
// ],
// [
// 94.354613,
// 27.658568
// ],
// [
// 94.354613,
// 28.658568
// ],
// [
// 94.354613,
// 29.658568
// ]
// ],[
// [
// 89.354613,
// 22.658568
// ],
// [
// 90.354613,
// 23.658568
// ],
// [
// 91.354613,
// 24.658568
// ],
// [
// 92.354613,
// 25.658568
// ],
// [
// 93.354613,
// 26.658568
// ],
// [
// 94.354613,
// 27.658568
// ],
// [
// 95.354613,
// 28.658568
// ],
// [
// 96.354613,
// 29.658568
// ]
// ]]
emitter.emit('drawLineAnimation', {
type: "solid",
coords: coords,
isclear: true,
flag: "yjLine"
})
}
// const coords = mapData.value.map(item => {
// console.log(item);
// return item.list.map(items => {
// return [items.jd, items.wd]
// })
// })
// emitter.emit('drawLineAnimation',
// {
// type: "solid",
// coords: coords,
// isclear: true,
// flag: "yjLine"
// }
// // { coords: coords, flag: 'yjLine' }
// );
}
// mapUtil.value.createLine(res, res.flag);
// 模拟轨迹数据
function mockTrackData() {
const promes = {
yjRysfzh: props.data.yjRysfzh,
startTime: dateRange.value[0] ? dateRange.value[0] : null,
endTime: dateRange.value[1] ? dateRange.value[1] : null,
}
tbYjxxGsgj(promes).then(res => {
mapData.value = res
trackList.value = []
for (let i = 0; i < res.length; i++) {
trackList.value = [...trackList.value, ...res[i].list]
}
});
}
watch(() => props.data, (newVal) => {
if (newVal.length > 0) {
mockTrackData();
}
})
// 组件挂载时获取默认数据
// onMounted(() => {
// mockTrackData();
// });
// 监听modelValue变化
watch(() => props.modelValue, (newVal) => {
if (newVal) {
mockTrackData();
}
});
</script>
<style lang="scss" scoped>
@import "@/assets/css/homeScreen.scss";
// 容器样式
.historical-route-container {
position: absolute;
top: 80%;
left: 100%;
z-index: 2;
width: 300px;
height: 400px;
}
// 头部样式
.header {
width: 100%;
background: #1d5db4e3;
padding: 8px 5px;
}
// 关闭图标样式
.close-icon {
cursor: pointer;
}
// 筛选区域样式
.filter-section {
background: rgba(10, 49, 88, 0.6);
padding: 10px;
}
// 日期选择器样式
.date-picker {
width: 80%;
}
// 查询按钮样式
.search-btn {
font-size: 12px;
background: #1890ff;
border-color: #1890ff;
}
// 轨迹列表区域样式
.track-list-container {
background: rgba(10, 49, 88, 0.6);
box-shadow: inset 0px 0px 10px 0px rgba(56, 119, 242, 0.5);
height: 280px;
overflow-y: auto;
}
// 列表项样式
.track-item {
border-bottom: 1px solid rgba(56, 119, 242, 0.3);
padding: 8px;
}
// 轨迹时间样式
.track-time {
color: #b7e4ff;
font-size: 12px;
line-height: 1.5;
}
// 轨迹位置样式
.track-location {
color: white;
font-size: 12px;
line-height: 1.5;
}
// 空状态样式
.empty-state {
display: flex;
justify-content: center;
align-items: center;
height: 200px;
color: #b7e4ff;
font-size: 12px;
}
// 底部按钮区域样式
.bottom-section {
background: rgba(10, 49, 88, 0.6);
padding: 10px;
}
// 轨迹上图按钮样式
.show-map-btn {
width: 100%;
font-size: 12px;
background: #1890ff;
border-color: #1890ff;
}
// 自定义滚动条样式
::-webkit-scrollbar {
width: 6px;
}
::-webkit-scrollbar-track {
background: rgba(56, 119, 242, 0.1);
}
::-webkit-scrollbar-thumb {
background: rgba(56, 119, 242, 0.5);
border-radius: 3px;
}
::-webkit-scrollbar-thumb:hover {
background: rgba(56, 119, 242, 0.8);
}
::v-deep .el-range-input {
color: #000 !important;
}
</style>

View File

@ -1,18 +1,48 @@
<template> <template>
<div class="personCard relative flex mb10 pointer" > <div class="personCard relative mb10 pointer">
<div class="avatarBox relative"> <div class="flex nowrap align-center just-between boderBox">
<div class="marks f12 absolute" :class="changeBg(props.item.yjJb)"> <div class="avatarBox relative">
<span>{{ changetText(props.item.yjJb) }}</span> <div class="marks f12 absolute" :class="changeBg(props.item.yjJb)">
<span>{{ changetText(props.item.yjJb) }}</span>
</div>
<div>
<el-image :preview-teleported="true" style="width: 80px; height: 110px" :src="props.item.yjTp"
:preview-src-list="[props.item.yjTp]" />
</div>
<div>
<span class="smallbtn" @click.stop="() => { }">全息档案{{ props.item.id }}</span>
</div>
</div> </div>
<div> <div class="infoBox">
<el-image :preview-teleported="true" style="width: 80px; height: 110px" :src="props.item.yjTp" :preview-src-list="[props.item.yjTp]"/> <div style="height: 110px">
</div> <div class="flex nowrap align-center just-between linItem">
<div> <div class="wichAlian3">{{ props.item.yjRyxm }}</div>
<span class="smallbtn" @click.stop="()=>{}">全息档案</span> <div>|</div>
</div> <div class="wichAlian">{{ IdCard(props.item.yjRysfzh, 2) }}</div>
</div> <div>|</div>
<div class="infoBox"> <div class="wichAlian2"> {{ IdCard(props.item.yjRysfzh, 3) }}</div>
<div class="items"> <div>|</div>
<div class="wichAlian3"> <span class="bqbox ml6">{{ props.item.yjbq }}</span></div>
</div>
<div class="linItem">身份证号{{ props.item.yjRysfzh }}</div>
<div class="linItem">预警时间{{ props.item.yjSj }}</div>
<div class="linItem flex nowrap align-center just-between">预警次数{{ props.item.yjCs }}<div></div>
<div>相似度90%</div>
</div>
</div>
<div class="infoItem flex nowrap" style="margin-top: 6px;">
<span class="smllbtn" @click.stop="handleQsFk(props.item, '签收')"
v-if="props.item.yjJb != 10 && props.item.czzt == '01' && deptLevel == '40'">签收</span>
<span class="smllbtn" @click.stop="handleQsFk(props.item, '反馈')"
v-if="props.item.yjJb != 10 && props.item.czzt == '02' && deptLevel == '40'"> 反馈 </span>
<span class="smllbtn" @click.stop="handleQsFk(props.item, '查看反馈')"
v-if="props.item.yjJb != 10 && props.item.czzt == '03'"> 查看反馈 </span>
<div>
<span class="smllbtn" v-if="track" @click.stop="showDetail(props.item)">发送指令</span>
<span class="smllbtn" v-else @click.stop="openTrack(props.item)">历史轨迹</span>
</div>
</div>
<!-- <div class="items">
<div class="infoItem flex nowrap mb10">{{ props.item.yjRyxm }} <span class="bqbox ml6">{{ props.item.yjbq }}</span></div> <div class="infoItem flex nowrap mb10">{{ props.item.yjRyxm }} <span class="bqbox ml6">{{ props.item.yjbq }}</span></div>
<div class="infoItem ellipsis">性别<span class="value">{{ IdCard(props.item.yjRysfzh , 2 )}}</span></div> <div class="infoItem ellipsis">性别<span class="value">{{ IdCard(props.item.yjRysfzh , 2 )}}</span></div>
<div class="infoItem ellipsis">身份证号<span class="value">{{ props.item.yjRysfzh }}</span></div> <div class="infoItem ellipsis">身份证号<span class="value">{{ props.item.yjRysfzh }}</span></div>
@ -33,30 +63,24 @@
<div class="infoItem ellipsis">预警时间<span class="value">{{ props.item.yjSj }}</span></div> <div class="infoItem ellipsis">预警时间<span class="value">{{ props.item.yjSj }}</span></div>
<div class="infoItem ellipsis">签收时间<span class="value">{{ props.item.qssj }}</span></div> <div class="infoItem ellipsis">签收时间<span class="value">{{ props.item.qssj }}</span></div>
<div class="infoItem ellipsis">反馈时间<span class="value">{{ props.item.fksj }}</span></div> <div class="infoItem ellipsis">反馈时间<span class="value">{{ props.item.fksj }}</span></div>
</div> -->
</div> </div>
</div> </div>
</div> <div class="infoItem ellipsis flex align-center">
<img src="@/assets/images/ddtb.png" />
<!-- 虚拟触发 --> <span class="value">{{ props.item.yjDz }}</span>
<!-- <el-popover ref="popoverRef" :visible="isShowVisble" :width="400" :virtual-ref="buttonRef" trigger="click" title="反馈" virtual-triggering >
<el-form :model="chooseRow" ref="elRowForm" :inline="true" label-width="100px" :rules="rules">
<el-form-item label="反馈内容" prop="fknr" style="width: 100%;">
<MOSTY.Other style="width: 100%;" clearable v-model="chooseRow.fknr" type="textarea" placeholder="请输入不通过原因"/>
</el-form-item>
</el-form>
<div class="flex just-center mt10">
<el-button @click.stop="cancelRowSp">取消</el-button>
<el-button type="primary" @click.stop="handleSendSp(props.item)" v-loading="btnloading">确定</el-button>
</div> </div>
</el-popover> --> </div>
<HistoricalRoute v-model="showTrack" :data="props.item" />
</template> </template>
<script setup> <script setup>
import emitter from "@/utils/eventBus.js"; import emitter from "@/utils/eventBus.js";
import { qcckGet, qcckPost } from "@/api/qcckApi.js"; import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import * as MOSTY from "@/components/MyComponents/index";
import { IdCard } from '@/utils/validate.js' import { IdCard } from '@/utils/validate.js'
import { defineProps ,ref, reactive,getCurrentInstance, onMounted } from "vue"; import HistoricalRoute from './historicalRoute.vue'
import { defineProps, ref, reactive, getCurrentInstance, onMounted, watch } from "vue";
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const props = defineProps({ const props = defineProps({
item: { item: {
@ -70,28 +94,29 @@ const props = defineProps({
type: { type: {
type: String, type: String,
default: "" default: ""
}, track: {
type: Boolean,
default: true
} }
}); });
watch(() => props.item, (newVal) => {
if (newVal) {
console.log(newVal);
}
},{deep:true})
const deptLevel = ref(null) const deptLevel = ref(null)
const buttonRef = ref() const emit = defineEmits(['showDetail'])
const popoverRef = ref() const showDetail = (val) => {
const elRowForm = ref() emit('showDetail', val)
const isShowVisble = ref(false) }
const chooseRow = ref({})
const rules = reactive({
fknr: [{ required: true, message: "请输入反馈内容", trigger: "blur" }],
})
onMounted(() => {
// deptLevel.value = localStorage.getItem("deptId") ? JSON.parse(localStorage.getItem("deptId"))[0].deptLevel : null;
});
// 处理签收 // 处理签收
const handleQsFk = (val,type) =>{ const handleQsFk = (val, type) => {
switch(type){ switch (type) {
case '签收': case '签收':
proxy.$confirm("是否确定要签收?", "警告", { type: "warning" }).then(() => { proxy.$confirm("是否确定要签收?", "警告", { type: "warning" }).then(() => {
qcckPost({id:val.id}, "/mosty-gsxt/tbYjxx/yjqs").then(() => { qcckPost({ id: val.id }, "/mosty-gsxt/tbYjxx/yjqs").then(() => {
val.czzt = '02' val.czzt = '02'
proxy.$message({ type: "success", message: "签收成功" }); proxy.$message({ type: "success", message: "签收成功" });
}); });
@ -99,7 +124,7 @@ const handleQsFk = (val,type) =>{
break; break;
case '反馈': case '反馈':
case '查看反馈': case '查看反馈':
emitter.emit("openFkDialog", {id:val.id,type}); emitter.emit("openFkDialog", { id: val.id, type });
break; break;
} }
} }
@ -133,14 +158,42 @@ const changetText = (type) => {
return "不关注"; return "不关注";
} }
}; };
const showDetail = () => { const showTrack=ref(false)
emit('showDetail',props.item) const openTrack = () => {
} showTrack.value=true
};
// <!-- 虚拟触发 -->
// <!-- <el-popover ref="popoverRef" :visible="isShowVisble" :width="400" :virtual-ref="buttonRef" trigger="click" title="反馈" virtual-triggering >
// <el-form :model="chooseRow" ref="elRowForm" :inline="true" label-width="100px" :rules="rules">
// <el-form-item label="反馈内容" prop="fknr" style="width: 100%;">
// <MOSTY.Other style="width: 100%;" clearable v-model="chooseRow.fknr" type="textarea" placeholder="请输入不通过原因"/>
// </el-form-item>
// </el-form>
// <div class="flex just-center mt10">
// <el-button @click.stop="cancelRowSp">取消</el-button>
// <el-button type="primary" @click.stop="handleSendSp(props.item)" v-loading="btnloading">确定</el-button>
// </div>
// </el-popover> -->
// const showDetail = () => {
// emit('showDetail',props.item)
// }
// const buttonRef = ref()
// const popoverRef = ref()
// const elRowForm = ref()
// const isShowVisble = ref(false)
// const chooseRow = ref({})
// const rules = reactive({
// fknr: [{ required: true, message: "请输入反馈内容", trigger: "blur" }],
// })
// onMounted(() => {
// deptLevel.value = localStorage.getItem("deptId") ? JSON.parse(localStorage.getItem("deptId"))[0].deptLevel : null;
// });
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.personCard { .personCard {
position: relative;
background: rgba(10, 49, 88, 0.6); background: rgba(10, 49, 88, 0.6);
box-shadow: inset 0px 0px 10px 0px rgba(56, 119, 242, 0.5); box-shadow: inset 0px 0px 10px 0px rgba(56, 119, 242, 0.5);
border-radius: 0px 0px 0px 0px; border-radius: 0px 0px 0px 0px;
@ -149,12 +202,41 @@ const showDetail = () => {
box-sizing: border-box; box-sizing: border-box;
transition: all 0.3s; transition: all 0.3s;
.boderBox {
border-bottom: 1px solid #217ce1;
padding-bottom: 10px;
}
.infoItem {
font-size: 13px;
margin-bottom: 2px;
color: #fff;
margin-top: 4px;
.value {
color: #89afcf;
}
.smllbtn {
display: inline-block;
padding: 4px 8px;
box-sizing: border-box;
border-radius: 4px;
background: #0072ff;
border-radius: 5px 5px 5px 5px;
margin-right: 6px;
margin-top: 4px;
cursor: pointer;
}
}
&:hover { &:hover {
background: rgba(17, 66, 96, 0.8); background: rgba(17, 66, 96, 0.8);
} }
::v-deep .el-button{ ::v-deep .el-button {
span{ span {
color: #fff; color: #fff;
} }
} }
@ -163,6 +245,7 @@ const showDetail = () => {
margin-right: 5px; margin-right: 5px;
overflow: hidden; overflow: hidden;
width: 80px; width: 80px;
.marks { .marks {
width: 70px; width: 70px;
height: 32px; height: 32px;
@ -203,31 +286,28 @@ const showDetail = () => {
.infoBox { .infoBox {
width: calc(100% - 90px); width: calc(100% - 90px);
display: flex;
justify-content: space-between; // display: flex;
.items{ // justify-content: space-between;
width: 50%; .linItem {
line-height: 28px;
} }
.infoItem {
font-size: 13px; .wichAlian {
margin-bottom: 2px; // width: 10%;
color: #fff; text-align: center;
.value { }
color: #89afcf;
} .wichAlian3 {
.smllbtn { // width: 40%;
display: inline-block; }
padding: 4px 8px;
box-sizing: border-box; .wichAlian2 {
border-radius: 4px; // width: 10%;
background: #0072ff; text-align: center;
border-radius: 5px 5px 5px 5px; }
margin-right: 6px;
margin-top: 4px;
cursor: pointer;
}
}
} }
} }
@ -239,7 +319,8 @@ const showDetail = () => {
border-radius: 5px 5px 5px 5px; border-radius: 5px 5px 5px 5px;
margin-top: 6px; margin-top: 6px;
} }
.num{
.num {
color: #00ffff; color: #00ffff;
} }
</style> </style>

View File

@ -11,77 +11,88 @@
</el-form> </el-form>
<el-button type="primary">搜索</el-button> <el-button type="primary">搜索</el-button>
</div> </div>
<div class="systemBox"> <div class="systemBox">
<!-- 左边列表 --> <!-- 左边列表 -->
<div class="leftList"> <div class="leftList">
<div class="hed flex just-between align center"> <div class="hed flex just-between align center">
<span class="f14">预警列表</span> <span class="f14">预警列表</span>
<span style="color: #00b7ff" class="pointer" @click="seeMoreFn">查看更多</span> <span style="color: #00b7ff" class="pointer" @click="seeMoreFn">查看更多</span>
</div>
<div class="ml10 mr10 mt10">
<el-input v-model="keyword" placeholder="姓名、证件号码搜索">
<template #append><el-icon><Search /></el-icon></template>
</el-input>
</div>
<ul class="listContent noScollLine mt10" v-infinite-scroll="loadList" style="overflow: auto" v-loading="loading">
<!-- @click.stop="showDetail(item)" -->
<li v-for="(item, index) in personList" :key="index" >
<YjItem :item="item" type="yj" :dic="{D_BZ_YJCZZT}"></YjItem>
</li>
<MOSTY.Empty :show="!loading && personList.length <= 0"></MOSTY.Empty>
</ul>
</div>
<!-- 右边模块 -->
<div class="rightList">
<!-- 第一部门 -->
<div class="model-commom">
<div class="hed flex align-center">预警处置统计</div>
<div class="comm-cnt" v-loading="list.YjczDate.loading">
<BarHatEcharts echartsId="qylxEcharts" :data="list.YjczDate"></BarHatEcharts>
</div> </div>
</div> <div class="ml10 mr10 mt10">
<!-- 第二部分 --> <el-input v-model="keyword" placeholder="姓名、证件号码搜索">
<div class="model-commom mt10"> <template #append>
<div class="hed flex align-center">布控区域统计</div> <el-button type="primary" @click="getKeyword">搜索</el-button>
<div class="comm-cnt" v-loading="list.RylxDate.loading"> <!-- <div >
<BarHatEcharts echartsId="rylxEcharts" :data="list.RylxDate"></BarHatEcharts> <el-icon >
<Search />
</el-icon>
</div> -->
</template>
</el-input>
</div> </div>
<ul class="listContent noScollLine mt10" v-infinite-scroll="loadList" style="overflow: auto"
v-loading="loading">
<!-- @click.stop="showDetail(item)" -->
<li v-for="(item, index) in personList" :key="index" @click="markAbove(item)">
<YjItem :item="item" type="yj" :dic="{ D_BZ_YJCZZT }" @showDetail="showDetail"></YjItem>
</li>
<MOSTY.Empty :show="!loading && personList.length <= 0"></MOSTY.Empty>
</ul>
</div> </div>
<!-- 第三部分 --> <!-- 右边模块 -->
<div class="model-commom mt10"> <div class="rightList">
<div class="hed flex align-center">感知源统计</div> <!-- 第一部门 -->
<div class="comm-cnt" v-loading="list.GzyDate.loading"> <div class="model-commom">
<BarHatEcharts echartsId="gzyEcharts" :data="list.GzyDate"></BarHatEcharts> <div class="hed flex align-center">预警处置统计</div>
<div class="comm-cnt" v-loading="list.YjczDate.loading">
<BarHatEcharts echartsId="qylxEcharts" :data="list.YjczDate"></BarHatEcharts>
</div>
</div> </div>
</div> <!-- 第二部分 -->
<!-- 第四部分 --> <div class="model-commom mt10">
<div class="model-commom mt10"> <div class="hed flex align-center">布控区域统计</div>
<div class="hed flex align-center">预警等级统计</div> <div class="comm-cnt" v-loading="list.RylxDate.loading">
<div class="comm-cnt" v-loading="loadingyj"> <BarHatEcharts echartsId="rylxEcharts" :data="list.RylxDate"></BarHatEcharts>
<WarningCount ref="yjjbRef"></WarningCount> </div>
</div>
<!-- 第三部分 -->
<div class="model-commom mt10">
<div class="hed flex align-center">感知源统计</div>
<div class="comm-cnt" v-loading="list.GzyDate.loading">
<BarHatEcharts echartsId="gzyEcharts" :data="list.GzyDate"></BarHatEcharts>
</div>
</div>
<!-- 第四部分 -->
<div class="model-commom mt10">
<div class="hed flex align-center">预警等级统计</div>
<div class="comm-cnt" v-loading="loadingyj">
<WarningCount ref="yjjbRef"></WarningCount>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> <Information v-model="showDialog" title="发送指令" @submit='submit' @close='close'>
<Information v-model="showDialog" title="发送指令" @submit='submit' @close='close'> <SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj"
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj" :tacitly="tacitly"/> :tacitly="tacitly" />
</Information> </Information>
<!-- 反馈按钮 --> <!-- 反馈按钮 -->
<FkDialog @change="getList"></FkDialog> <FkDialog @change="getList"></FkDialog>
<LeftDialog></LeftDialog>
</template> </template>
<script setup> <script setup>
import LeftDialog from '@/views/home/dialog/leftDialog.vue'
import FkDialog from './components/fkDialog.vue' import FkDialog from './components/fkDialog.vue'
import * as MOSTY from "@/components/MyComponents/index"; import * as MOSTY from "@/components/MyComponents/index";
import { qcckPost,qcckGet } from "@/api/qcckApi.js"; import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import GdMap from "@/components/GdMap/index.vue"; import GdMap from "@/components/GdMap/index.vue";
import emitter from "@/utils/eventBus.js";
import YjItem from "./components/yjItem.vue"; import YjItem from "./components/yjItem.vue";
import WarningCount from "./components/WarningCount.vue"; import WarningCount from "./components/WarningCount.vue";
import BarHatEcharts from "@/views/home/echarts/barHatEcharts.vue"; import BarHatEcharts from "@/views/home/echarts/barHatEcharts.vue";
import { onMounted, reactive, ref,getCurrentInstance } from "vue"; import { onMounted, reactive, ref, getCurrentInstance } from "vue";
import { useRouter } from "vue-router"; import { useRouter } from "vue-router";
import Information from "@/views/home/model/information.vue"; import Information from "@/views/home/model/information.vue";
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue' import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
@ -114,13 +125,13 @@ const loadingyj = ref(false)
const list = reactive({ const list = reactive({
// 预警处置统计 // 预警处置统计
YjczDate: { YjczDate: {
loading:false, loading: false,
xDate: [], xDate: [],
list: [], list: [],
}, },
// 布控区域统计 // 布控区域统计
RylxDate: { RylxDate: {
loading:false, loading: false,
xDate: [], xDate: [],
list: [], list: [],
}, },
@ -128,68 +139,71 @@ const list = reactive({
GzyDate: { GzyDate: {
xDate: [], xDate: [],
list: [], list: [],
loading:false, loading: false,
}, },
}) })
const personList = ref([]); const personList = ref([]);
const pageNum = ref(1) const pageNum = ref(1)
const total = ref(0) const total = ref(0)
onMounted(()=>{ onMounted(() => {
getList() getList()
init() init()
}) })
// 触底加载 // 触底加载
const loadList = () => { const loadList = () => {
if( personList.value.length == total.value) return; if (personList.value.length == total.value) return;
pageNum.value++; pageNum.value++;
getList() getList()
} }
const getList = () =>{ const getList = () => {
let params = { pageSize:10, pageNum:pageNum.value }; let params = { pageSize: 10, pageNum: pageNum.value,keyword:keyword.value };
loading.value = true; loading.value = true;
qcckPost(params,'/mosty-gsxt/tbYjxx/getPageList').then(res=>{ qcckPost(params, '/mosty-gsxt/tbYjxx/getPageList').then(res => {
loading.value = false; loading.value = false;
let arr = res.records || []; let arr = res.records || [];
personList.value = pageNum.value == 1 ? arr : personList.value.concat(arr); personList.value = pageNum.value == 1 ? arr : personList.value.concat(arr);
total.value = res.total; total.value = res.total;
}).catch(()=>{ }).catch(() => {
loading.value = false; loading.value = false;
}) })
} }
const getKeyword = () => {
const init = () =>{ pageNum.value=1
getList()
}
const init = () => {
// 预警处置统计 // 预警处置统计
list.YjczDate.loading = true; list.YjczDate.loading = true;
qcckGet({},'/mosty-gsxt/tbYjxx/getYjCzztTj').then(res=>{ qcckGet({}, '/mosty-gsxt/tbYjxx/getYjCzztTj').then(res => {
list.YjczDate.loading = false; list.YjczDate.loading = false;
list.YjczDate.xDate = res.map(item=>item.zdmc); list.YjczDate.xDate = res.map(item => item.zdmc);
list.YjczDate.list = [{ list.YjczDate.list = [{
value: res.map(item=>item.count), value: res.map(item => item.count),
color: ['rgba(0,244,255,1)', 'rgba(0,77,167,1)'], color: ['rgba(0,244,255,1)', 'rgba(0,77,167,1)'],
hatColor: '#087df9' hatColor: '#087df9'
}] }]
}) })
// 布控区域统计 // 布控区域统计
list.RylxDate.loading = true; list.RylxDate.loading = true;
qcckGet({},'/mosty-gsxt/tbGsxtBkQy/getBkQytj').then(res=>{ qcckGet({}, '/mosty-gsxt/tbGsxtBkQy/getBkQytj').then(res => {
list.RylxDate.loading = false; list.RylxDate.loading = false;
list.RylxDate.xDate = res.map(item=>item.qymc); list.RylxDate.xDate = res.map(item => item.qymc);
list.RylxDate.list = [{ list.RylxDate.list = [{
value: res.map(item=>item.num), value: res.map(item => item.num),
color: ['rgba(0,244,255,1)', 'rgba(0,77,167,1)'], color: ['rgba(0,244,255,1)', 'rgba(0,77,167,1)'],
hatColor: '#087df9' hatColor: '#087df9'
}] }]
}) })
// 感知元统计 // 感知元统计
list.GzyDate.loading= true; list.GzyDate.loading = true;
qcckGet({},'/mosty-gsxt/tbYjxx/getGzyTj').then(res=>{ qcckGet({}, '/mosty-gsxt/tbYjxx/getGzyTj').then(res => {
list.GzyDate.loading = false; list.GzyDate.loading = false;
list.GzyDate.xDate = res.map(item=>item.yj_gzymc); list.GzyDate.xDate = res.map(item => item.yj_gzymc);
list.GzyDate.list = [{ list.GzyDate.list = [{
value: res.map(item=>item.num), value: res.map(item => item.num),
color: ['rgba(0,244,255,1)', 'rgba(0,77,167,1)'], color: ['rgba(0,244,255,1)', 'rgba(0,77,167,1)'],
hatColor: '#087df9' hatColor: '#087df9'
}] }]
@ -197,7 +211,7 @@ const init = () =>{
// 预警级别 // 预警级别
loadingyj.value = true; loadingyj.value = true;
qcckGet({},'/mosty-gsxt/tbYjxx/getYjxxTj').then(res=>{ qcckGet({}, '/mosty-gsxt/tbYjxx/getYjxxTj').then(res => {
loadingyj.value = false; loadingyj.value = false;
yjjbRef.value.initCharts(res) yjjbRef.value.initCharts(res)
}) })
@ -207,25 +221,34 @@ const seeMoreFn = () => {
router.push('/ControlApproval') router.push('/ControlApproval')
} }
const showDialog = ref(false) const showDialog = ref(false)
const itemData=ref() const itemData = ref()
const showDetail = (item) => { const showDetail = (item) => {
showDialog.value = true; showDialog.value = true;
itemData.value=item itemData.value = item
} }
const handleClose = () => { const handleClose = () => {
showDialog.value = false; showDialog.value = false;
} }
const semdFqzlRef = ref() const semdFqzlRef = ref()
const tacitly = { const tacitly = {
title:'yjBt', title: 'yjBt',
instructionContent:'yjNr' instructionContent: 'yjNr'
} }
const submit=()=>{ const submit = () => {
semdFqzlRef.value.getsendFqzl() semdFqzlRef.value.getsendFqzl()
} }
const close = () => { const close = () => {
semdFqzlRef.value.close() semdFqzlRef.value.close()
} }
// 标点上图
const markAbove = (val) => {
const icon = require('@/assets/point/yj.png')
emitter.emit('setMapCenter', { location: [val.jd, val.wd], zoomLevel: 15 });
emitter.emit("addPointArea", { flag: 'home_yj_detail', icon, coords: [val] })
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@ -314,13 +337,13 @@ const close = () => {
height: 40px; height: 40px;
line-height: 40px; line-height: 40px;
padding-left: 10px; padding-left: 10px;
background: linear-gradient(90deg, #124cb3 0%, rgba(18, 76, 179, 0.23) 77%, rgba(18, 76, 179, 0) 100%); background: linear-gradient(90deg, #124cb3 0%, rgba(18, 76, 179, 0.23) 77%, rgba(18, 76, 179, 0) 100%);
} }
} }
</style> </style>
<style> <style>
.el-loading-mask{ .el-loading-mask {
background: rgba(0,0,0,0.5); background: rgba(0, 0, 0, 0.5);
} }
</style> </style>

View File

@ -8,16 +8,22 @@
</div> </div>
</div> </div>
<div class="form_cnt"> <div class="form_cnt">
<div> <VueDraggable @update="onUpdate"
@add="onAdd"
@remove="remove">
<el-button type="primary" v-for="(item,index) in listBut" :key="index">{{ item }}</el-button> <el-button type="primary" v-for="(item,index) in listBut" :key="index">{{ item }}</el-button>
</VueDraggable>
<VueDraggable>
<el-button type="primary" v-for="(item,index) in listBut" :key="index">{{ item }}</el-button>
</VueDraggable>
</div> </div>
</div>
</div> </div>
</template> </template>
<script setup> <script setup>
import { reactive, ref } from 'vue' import { reactive, ref } from 'vue'
import FormMessage from "@/components/aboutTable/FormMessage.vue"; import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { VueDraggable } from 'vue-draggable-plus'
const dialogForm = ref(false) const dialogForm = ref(false)
const title = ref("新增") const title = ref("新增")
const init = (type, row) => { const init = (type, row) => {
@ -41,6 +47,18 @@ const listBut = ref(["物品", "人员", "组织", "次数", "事件", "地点",
const close = () => { const close = () => {
dialogForm.value = false dialogForm.value = false
} }
const onUpdate = (evt) => {
console.log(evt)
}
// 新增
const onAdd = (evt) => {
console.log(evt)
}
// 删除
const remove = (evt) => {
console.log(evt)
}
defineExpose({ defineExpose({
init init
}) })

View File

@ -13,7 +13,7 @@
</div> </div>
<ul class="cntlsit mb10" v-if="show" v-infinite-scroll="load" :style="{ height: listHeight + 'px' }" <ul class="cntlsit mb10" v-if="show" v-infinite-scroll="load" :style="{ height: listHeight + 'px' }"
v-loading="loading"> v-loading="loading">
<li class="cntItem" v-for="(it, idx) in list" :key="idx"> <li class="cntItem" v-for="(it, idx) in 10" :key="idx">
<div class="ww100" @click.stop="openAddModel('detail', it)"><img class="ww100" style="height: 168px;" <div class="ww100" @click.stop="openAddModel('detail', it)"><img class="ww100" style="height: 168px;"
src="@/assets/images/mxbg.jpg" alt=""></div> src="@/assets/images/mxbg.jpg" alt=""></div>
<div class="foot"> <div class="foot">

View File

@ -0,0 +1,324 @@
<template>
<div class="dialog" v-if="dialogForm">
<div class="head_box">
<span class="title">组合标签管理{{ title }} </span>
<div>
<el-button
type="primary"
size="small"
:loading="loading"
@click="submit"
>保存</el-button
>
<el-button size="small" @click="close">关闭</el-button>
</div>
</div>
<div class="form_cnt">
<FormMessage
v-model="listQuery"
:formList="formData"
ref="elform"
:rules="rules"
>
<!-- 身份标签细类 -->
<template #sfbqIdList>
<el-button @click="openDialog('01')">选择</el-button>
<div class="boxlist">
<MyTable
:tableData="tableDate.sfbqIdList"
:tableColumn="tableDate.tableColumn"
:tableHeight="tableDate.tableHeight"
:key="tableDate.keyCount"
:tableConfiger="tableDate.tableConfiger"
:controlsWidth="tableDate.controlsWidth"
>
<template #bqLx="{ row }">
<DictTag
:value="row.bqLx"
:tag="false"
:options="props.dic.D_GS_BQ_LX"
/>
</template>
<template #bqLb="{ row }">
<DictTag
:value="row.bqLb"
:tag="false"
:options="props.dic.D_GS_BQ_LB"
/>
</template>
<template #bqYs="{ row }">
<DictTag
:value="row.bqYs"
:tag="false"
:options="props.dic.D_GS_SSYJ"
/>
</template>
<template #bqDj="{ row }">
<DictTag
:tag="false"
:value="row.bqDj"
:options="props.dic.D_GS_BQ_DJ"
/>
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link
type="danger"
@click="delDictItem(row.id, '身份标签细类')"
>删除</el-link
>
</template>
</MyTable>
</div>
</template>
<!-- 行为标签细类 -->
<template #xwbqIdList>
<el-button @click="openDialog('02')">选择</el-button>
<div class="boxlist">
<MyTable
:tableData="tableDate.xwbqIdList"
:tableColumn="tableDate.tableColumn"
:tableHeight="tableDate.tableHeight"
:key="tableDate.keyCount"
:tableConfiger="tableDate.tableConfiger"
:controlsWidth="tableDate.controlsWidth"
>
<template #bqLx="{ row }">
<DictTag
:value="row.bqLx"
:tag="false"
:options="props.dic.D_GS_BQ_LX"
/>
</template>
<template #bqLb="{ row }">
<DictTag
:value="row.bqLb"
:tag="false"
:options="props.dic.D_GS_BQ_LB"
/>
</template>
<template #bqYs="{ row }">
<DictTag
:value="row.bqYs"
:tag="false"
:options="props.dic.D_GS_SSYJ"
/>
</template>
<template #bqDj="{ row }">
<DictTag
:tag="false"
:value="row.bqDj"
:options="props.dic.D_GS_BQ_DJ"
/>
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link
type="danger"
@click="delDictItem(row.id, '行为标签细类')"
>删除</el-link
>
</template>
</MyTable>
</div>
</template>
</FormMessage>
</div>
<!-- 列表弹窗 -->
<DialogList
:Single="false"
:roleIds="roleIds"
v-if="chooseShow"
:dic="props.dic"
@chooseDate="chooseDate"
:titleValue="chooseTitle"
v-model="chooseShow"
:bqLx="chooseType"
bqDl="02"
></DialogList>
</div>
</template>
<script setup>
import MyTable from "@/components/aboutTable/MyTable.vue";
import DialogList from "@/views/backOfficeSystem/fourColorManage/components/dialogList.vue";
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
import {
ref,
defineExpose,
defineProps,
reactive,
defineEmits,
getCurrentInstance
} from "vue";
const emit = defineEmits(["updateDate"]);
const { proxy } = getCurrentInstance();
const props = defineProps({
dic: Object
});
const roleIds = ref([]); //角色id
const chooseType = ref("01"); //选择弹窗类型
const chooseShow = ref(false); //选择弹窗
const chooseTitle = ref(""); //选择弹窗
const dialogForm = ref(false); //弹窗
const formData = reactive([
{ label: "组合标签名称", prop: "bqMc", type: "input" },
{ label: "组合标签代码", prop: "bqDm", type: "input" },
{
label: "标签等级",
prop: "bqDj",
type: "select",
options: props.dic.D_GS_BQ_DJ
},
{
label: "标签颜色",
prop: "bqYs",
type: "select",
options: props.dic.D_GS_SSYJ
},
{ label: "组合标签分值", prop: "bqFz", type: "input" },
{ label: "组合标签说明", prop: "bqSm", type: "input" },
{ label: "身份标签细类", prop: "sfbqIdList", type: "slot", width: "100%" },
{ label: "行为标签细类", prop: "xwbqIdList", type: "slot", width: "100%" }
]);
const rules = reactive({
bqMc: [{ required: true, message: "请输入组合标签名称", trigger: "blur" }],
bqDm: [{ required: true, message: "请输入组合标签代码", trigger: "blur" }],
zhbqjf: [{ required: true, message: "请输入组合标签积分", trigger: "blur" }],
sfbqIdList: [
{ required: true, message: "请选择身份标签细类", trigger: "change" }
],
xwbqIdList: [
{ required: true, message: "请选择行为标签细类", trigger: "change" }
]
});
const tableDate = reactive({
sfbqIdList: [], //表格数据
xwbqIdList: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false
},
total: 0,
tableHeight: 225,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 90, //操作栏宽度
tableColumn: [
{ label: "标签名称", prop: "bqMc", showOverflowTooltip: true },
{ label: "标签代码", prop: "bqDm" },
{ label: "标签大类名称", prop: "bqDlMc" },
{ label: "标签类型", prop: "bqLx", showSolt: true },
{ label: "标签类别", prop: "bqLb", showSolt: true },
{ label: "标签颜色", prop: "bqYs", showSolt: true },
{ label: "标签等级", prop: "bqDj", showSolt: true }
]
});
const listQuery = ref({}); //表单
const loading = ref(false);
const elform = ref();
const title = ref("");
// 初始化数据
const init = (type, row) => {
dialogForm.value = true;
title.value = type == "add" ? "新增" : "编辑";
if (row) getDataById(row.id);
};
// 根据id查询详情
const getDataById = (id) => {
qcckGet({}, "/mosty-gsxt/tbGsxtBqzh/selectVoById/" + id).then((res) => {
listQuery.value = res;
tableDate.sfbqIdList = res.sfbqList;
listQuery.value.sfbqIdList = res.sfbqList.map((item) => item.id);
tableDate.xwbqIdList = res.xwbqList;
listQuery.value.xwbqIdList = res.xwbqList.map((item) => item.id);
tableDate.keyCount++;
});
};
// 提交
const submit = () => {
elform.value.submit((data) => {
let url =
title.value == "新增"
? "/mosty-gsxt/tbGsxtBqzh/save"
: "/mosty-gsxt/tbGsxtBqzh/update";
let params = { ...data };
loading.value = true;
qcckPost(params, url)
.then((res) => {
proxy.$message({ type: "success", message: title.value + "成功" });
emit("updateDate");
loading.value = false;
close();
})
.catch(() => {
loading.value = false;
});
});
};
// 打开弹窗
const openDialog = (type) => {
chooseShow.value = true;
chooseType.value = type;
chooseTitle.value = type == "01" ? "选择身份标签细类" : "选择行为标签细类";
roleIds.value =
type == "01"
? tableDate.sfbqIdList.map((item) => item.id)
: tableDate.xwbqIdList.map((item) => item.id);
};
// 选择数据
const chooseDate = (data) => {
if (chooseType.value == "01") {
tableDate.sfbqIdList = data;
listQuery.value.sfbqIdList = tableDate.sfbqIdList.map((item) => item.id);
} else {
tableDate.xwbqIdList = data;
listQuery.value.xwbqIdList = tableDate.xwbqIdList.map((item) => item.id);
}
};
// 删除
const delDictItem = (id, type) => {
switch (type) {
case "身份标签细类":
tableDate.sfbqIdList = tableDate.sfbqIdList.filter(
(item) => item.id !== id
);
listQuery.value.sfbqIdList = tableDate.sfbqIdList.map((item) => item.id);
break;
case "行为标签细类":
tableDate.xwbqIdList = tableDate.xwbqIdList.filter(
(item) => item.id !== id
);
listQuery.value.xwbqIdList = tableDate.xwbqIdList.map((item) => item.id);
break;
}
};
// 关闭
const close = () => {
listQuery.value = {};
tableDate.sfbqIdList = [];
tableDate.xwbqIdList = [];
dialogForm.value = false;
loading.value = false;
};
defineExpose({ init });
</script>
<style lang="scss" scoped>
@import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss";
.boxlist {
width: 99%;
height: 225px;
margin-top: 10px;
overflow: hidden;
}
</style>

View File

@ -0,0 +1,141 @@
<template>
<div>
<!-- 表格 -->
<div class="tabBox">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<template #yjTp="{ row }">
<el-image :preview-teleported="true" style="width: 80px; height: 110px" :src="row.yjTp"
:preview-src-list="[row.yjTp]" />
</template>
<template #nl="{ row }">
{{ IdCard(row.yjRysfzh, 3) }}
</template>
<template #xb="{ row }">
{{ IdCard(row.yjRysfzh, 2) }}
</template>
<template #xsd="{ row }">
90%
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="danger" @click="delDictItem(row.id)">删除</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
</template>
<script setup>
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { IdCard } from '@/utils/validate.js'
import { tbYjxxGetPageList } from '@/api/yj.js'
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
const { proxy } = getCurrentInstance();
const detailDiloag = ref();
const queryFrom = ref({});
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false,
haveControls:false
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 160, //操作栏宽度
tableColumn: [
{ label: "人像照片", prop: "yjTp", showSolt: true },
{ label: "姓名", prop: "yjRyxm" },
{ label: "年龄", prop: "nl", showSolt: true },
{ label: "性别", prop: "xb", showSolt: true },
{ label: "预警级别", prop: "yjJb" },
{ label: "相似度", prop: "xsd", showSolt: true },
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true },
{ label: "预警地点", prop: "yjDz", showOverflowTooltip: true },
{ label: "预警次数", prop: "yjCs", showOverflowTooltip: true },
{ label: "布控手机号", prop: "yjRysjh", showOverflowTooltip: true },
{ label: "布控车牌号", prop: "yjClcph", showOverflowTooltip: true },
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true },
]
});
onMounted(() => {
tabHeightFn();
getList()
});
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList()
}
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList()
}
const getList = (val) => {
pageData.tableConfiger.loading = true;
const promes = {
...val,
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize
}
tbYjxxGetPageList(promes).then((res) => {
pageData.tableData = res.records;
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
})
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - 430;
window.onresize = function () {
tabHeightFn();
};
};
defineExpose({
getList
})
</script>
<style>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
</style>

View File

@ -0,0 +1,313 @@
<template>
<div>
<div class="titleBox">
<PageTitle title="预警列表" />
</div>
<!-- 搜索 -->
<div ref="searchBox" class="searchBox">
<el-form :model="listQuery" label-width="auto" :inline="true" ref="searchArr">
<el-form-item label="布控类型" prop="yjlx">
<el-select v-model="listQuery.yjlx" placeholder="请选择预警类型">
<el-option v-for="item in D_BZ_YJLX" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="布控人员" prop="yjRyxm ">
<el-select v-model="listQuery.yjRyxm" filterable remote reserve-keyword placeholder="请选择布控人员"
:remote-method="remoteMethod" :loading="loading" style="width: 240px">
<el-option v-for="item in opentions" :key="item.rySfzh" :label="item.ryXm" :value="item.rySfzh" />
</el-select>
</el-form-item>
<el-form-item label="时间筛选">
<el-date-picker v-model="listQuery.time" type="datetimerange" :shortcuts="shortcuts" range-separator="To"
start-placeholder="开始时间" end-placeholder="结束时间" value-format="YYYY-MM-DD HH:mm:ss"
format="YYYY-MM-DD HH:mm:ss" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSearch">查询</el-button>
<el-button @click="resetForm(searchArr)">重置</el-button>
</el-form-item>
</el-form>
</div>
<!-- 表格 -->
<div class="tabBox" :style="{ height: pageData.tableHeight + 'px' }">
<el-tabs v-model="activeName" type="card" class="demo-tabs" @tab-click="handleClick">
<el-tab-pane label="本地预警" name="local">
<div style="padding:0 10px;"> <el-button type="primary" @click="exportExcel">导出</el-button></div>
<LocalWarning ref="localWarningRef" />
</el-tab-pane>
<el-tab-pane label="区厅预警" name="district">区厅预警</el-tab-pane>
</el-tabs>
</div>
</div>
<el-dialog v-model="showDc" title="导出预警" width="80%" align-center>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="500"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<template #yjTp="{ row }">
<el-image :preview-teleported="true" style="width: 80px; height: 110px" :src="row.yjTp"
:preview-src-list="[row.yjTp]" />
</template>
<template #nl="{ row }">
{{ IdCard(row.yjRysfzh, 3) }}
</template>
<template #xb="{ row }">
{{ IdCard(row.yjRysfzh, 2) }}
</template>
<template #xsd="{ row }">
90%
</template>
<!-- 操作 -->
</MyTable>
<template #footer>
<div class="dialog-footer">
<el-button @click="showDc = false">关闭</el-button>
<el-button type="primary" @click="handleExport">
导出
</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Search from "@/components/aboutTable/Search.vue";
import * as MOSTY from "@/components/MyComponents/index";
import { IdCard } from '@/utils/validate.js'
import { tbGsxtZdrySelectList } from "@/api/zdr.js"
import { tbYjxxQueryYjxx } from "@/api/yj.js";
import LocalWarning from "./components/localWarning.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import FileSaver from "file-saver";
import * as XLSX from "xlsx";
const { proxy } = getCurrentInstance();
const { D_BZ_YJLX } = proxy.$dict("D_BZ_YJLX")
const searchBox = ref(); //搜索框
const form = ref({});
const shortcuts = [
{
text: '近一周',
value: () => {
const end = new Date()
const start = new Date()
start.setDate(start.getDate() - 7)
return [start, end]
},
},
{
text: '近一月',
value: () => {
const end = new Date()
const start = new Date()
start.setMonth(start.getMonth() - 1)
return [start, end]
},
},
{
text: '近三月',
value: () => {
const end = new Date()
const start = new Date()
start.setMonth(start.getMonth() - 3)
return [start, end]
},
},
]
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false,
haveControls: false
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 160, //操作栏宽度
tableColumn: [
{ label: "人像照片", prop: "yjTp", showSolt: true },
{ label: "姓名", prop: "yjRyxm" },
{ label: "年龄", prop: "nl", showSolt: true },
{ label: "性别", prop: "xb", showSolt: true },
{ label: "预警级别", prop: "yjJb" },
{ label: "相似度", prop: "xsd", showSolt: true },
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true },
{ label: "预警地点", prop: "yjDz", showOverflowTooltip: true },
{ label: "预警次数", prop: "yjCs", showOverflowTooltip: true },
{ label: "布控手机号", prop: "yjRysjh", showOverflowTooltip: true },
{ label: "布控车牌号", prop: "yjClcph", showOverflowTooltip: true },
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true },
]
});
const showDc = ref(false)
const activeName = ref('local')
onMounted(() => {
tabHeightFn();
});
const listQuery = reactive({})
const opentions = ref([])
const localWarningRef = ref(null);
// 搜索
const onSearch = () => {
const promes = {
yjRyxm: listQuery.yjRyxm,
yjlx: listQuery.yjlx,
startTime: listQuery.time ? listQuery.time[0] : '',
endTime: listQuery.time ? listQuery.time[1] : '',
}
localWarningRef.value.getList(promes)
}
const loading = ref(false)
const remoteMethod = (query) => {
if (query) {
loading.value = true
tbGsxtZdrySelectList({ ryXm: query }).then(res => {
opentions.value = res
}).finally(() => {
loading.value = false
})
} else {
opentions.value = []
}
}
const searchArr = ref(null)
const resetForm = (formEl) => {
if (!formEl) return
formEl.resetFields()
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
window.onresize = function () {
tabHeightFn();
};
};
// 导出
const exportExcel = () => {
const promes = {
yjRyxm: listQuery.yjRyxm,
yjlx: listQuery.yjlx,
startTime: listQuery.time ? listQuery.time[0] : '',
endTime: listQuery.time ? listQuery.time[1] : '',
}
tbYjxxQueryYjxx(promes).then(res => {
pageData.tableData = res
showDc.value = true
})
}
// 处理Excel导出
const handleExport = () => {
// 创建一个临时表格用于导出
const tempTable = document.createElement('table');
// 创建表头
const thead = document.createElement('thead');
const headerRow = document.createElement('tr');
// 添加序号列
const indexTh = document.createElement('th');
indexTh.textContent = '序号';
headerRow.appendChild(indexTh);
// 添加其他列头
pageData.tableColumn.forEach(column => {
const th = document.createElement('th');
th.textContent = column.label;
headerRow.appendChild(th);
});
thead.appendChild(headerRow);
tempTable.appendChild(thead);
// 创建表体
const tbody = document.createElement('tbody');
// 处理表格数据
pageData.tableData.forEach((row, index) => {
const tr = document.createElement('tr');
// 添加序号
const indexTd = document.createElement('td');
indexTd.textContent = index + 1;
tr.appendChild(indexTd);
// 添加其他单元格数据
pageData.tableColumn.forEach(column => {
const td = document.createElement('td');
// 处理自定义插槽的情况
if (column.showSolt) {
if (column.prop === 'yjTp') {
// 照片字段只显示文字描述
td.textContent = '有照片';
} else if (column.prop === 'nl') {
// 年龄字段
td.textContent = IdCard(row.yjRysfzh, 3);
} else if (column.prop === 'xb') {
// 性别字段
td.textContent = IdCard(row.yjRysfzh, 2);
} else if (column.prop === 'xsd') {
// 相似度字段
td.textContent = '90%';
} else {
// 其他字段
td.textContent = row[column.prop] || '';
}
} else {
// 普通字段
td.textContent = row[column.prop] || '';
}
tr.appendChild(td);
});
tbody.appendChild(tr);
});
tempTable.appendChild(tbody);
// 执行Excel导出
let xlsxParam = { raw: true };
let wb = XLSX.utils.table_to_book(tempTable, xlsxParam);
let wbout = XLSX.write(wb, {
bookType: "xlsx",
bookSST: true,
type: "array"
});
// 保存文件
try {
const exportTime = new Date().toLocaleString('zh-CN').replace(/\//g, '-').replace(/:/g, '-');
FileSaver.saveAs(
new Blob([wbout], { type: "application/octet-stream" }),
`预警数据导出_${exportTime}.xlsx`
);
showDc.value = false;
} catch (e) {
console.error('导出Excel失败:', e);
}
}
</script>
<style>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
.searchBox {
background-color: #fff;
margin-bottom: 10px;
}
</style>

View File

@ -8,7 +8,6 @@
</li> </li>
<MOSTY.Empty :show="props.data.length <= 0" :imgSize="150"></MOSTY.Empty> <MOSTY.Empty :show="props.data.length <= 0" :imgSize="150"></MOSTY.Empty>
</ul> </ul>
<!-- :style="{height: `calc(100vh - ${handleHs}px)`}" --> <!-- :style="{height: `calc(100vh - ${handleHs}px)`}" -->
<div style="position:relative;width: 100%;" :style="{ height: `calc(100vh - ${handleHs}px)` }"> <div style="position:relative;width: 100%;" :style="{ height: `calc(100vh - ${handleHs}px)` }">

View File

@ -0,0 +1,43 @@
<template>
<div style="position: absolute;top: 34%;left: 42%;transform: translate(-50%, -50%);z-index: 1;" v-if="show">
<div style="width: 100%;background: #1d5db4e3;padding: 8px 5px;" class="flex align-center just-between ">
<span >详情</span><el-icon size="20px" @click="close" style="cursor: pointer;">
<Close />
</el-icon>
</div>
<YjItem :item="data" :track="false" />
</div>
</template>
<script setup>
import YjItem from "@/views/backOfficeSystem/IntelligentControl/warningControl/components/yjItem.vue";
import { ref, defineProps, onMounted, watch } from "vue";
import emitter from "@/utils/eventBus.js";
//参数传递
const props = defineProps({
//某条预警详情
data: {
type: Array,
default: []
},
show: {
type: Boolean,
default: false
},
});
console.log(props.show);
//关闭
function close() {
emitter.emit('deletePointArea', 'home_yj_detail');
emitter.emit("showHomeWarning", false);
}
onMounted(() => {
})
</script>
<style lang="scss" scoped>
@import "@/assets/css/homeScreen.scss";
</style>

View File

@ -2,19 +2,23 @@
<div class="noScollLine"> <div class="noScollLine">
<!-- 预警信息弹框 --> <!-- 预警信息弹框 -->
<Home_YJ v-if="isShow.showYj" :show="isShow.showYj" :data="list.Info_YJ" /> <Home_YJ v-if="isShow.showYj" :show="isShow.showYj" :data="list.Info_YJ" />
<PopupWarning v-if="isShow.showWarning" :show="isShow.showWarning" :data="list.Info_Warning" />
</div> </div>
</template> </template>
<script setup> <script setup>
import emitter from "@/utils/eventBus.js"; import emitter from "@/utils/eventBus.js";
import Home_YJ from "./components/home_yj.vue"; import Home_YJ from "./components/home_yj.vue";
import PopupWarning from './components/popupWarning'
import { ref, onMounted, onUnmounted, reactive, getCurrentInstance } from "vue"; import { ref, onMounted, onUnmounted, reactive, getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const isShow = ref({ const isShow = ref({
showYj: false, //预警弹窗 showYj: false, //预警弹窗
showWarning: false
}); });
const list = reactive({ const list = reactive({
Info_YJ: [], //预警数据 Info_YJ: [], //预警数据
Info_Warning: [],
}); });
onMounted(() => { onMounted(() => {
@ -23,11 +27,16 @@ onMounted(() => {
isShow.value.showYj = res ? true : false; isShow.value.showYj = res ? true : false;
if (res) list.Info_YJ = res; if (res) list.Info_YJ = res;
}); });
// 展示预警
emitter.on("showHomeWarning", (res) => {
isShow.value.showWarning = res ? true : false;
if (res) list.Info_Warning = res;
});
}); });
onUnmounted(() => { onUnmounted(() => {
emitter.off("showHomeYJ"); emitter.off("showHomeYJ");
emitter.off("showHomeWarning");
}); });
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped></style>
</style>

View File

@ -1,7 +1,7 @@
<template> <template>
<div style="pointer-events: none" :class="props.parentClass"> <div style="pointer-events: none" :class="props.parentClass">
<el-dialog :top="props.top" style="pointer-events: auto !important;" :modal="false" draggable v-model="props.modelValue" :destroy-on-close="true" <el-dialog :top="props.top" style="pointer-events: auto !important;" :modal="false" draggable v-model="props.modelValue" :destroy-on-close="true"
:show-close="false" :close-on-click-modal="false" :width="width" :custom-class="coumClass"> :show-close="false" :close-on-click-modal="false" :width="width" :custom-class="coumClass" :append-to-body="true">
<template #title> <template #title>
<div class="my-header"> <div class="my-header">
<span class="imgIcon"> {{props.title}}</span> <span class="imgIcon"> {{props.title}}</span>
@ -82,9 +82,8 @@ function closeDialog(params) {
padding: 8px 10px; padding: 8px 10px;
box-sizing: border-box; box-sizing: border-box;
pointer-events: auto !important; pointer-events: auto !important;
height:calc(100% - 300px); /* height:calc(100% - 300px); */
overflow: auto; overflow: auto;
} }
.zdy-model-dialog .el-dialog__header { .zdy-model-dialog .el-dialog__header {
padding: 0 !important; padding: 0 !important;

View File

@ -4,7 +4,7 @@ function resolve(dir) {
return path.join(__dirname, dir); return path.join(__dirname, dir);
} }
// const serverHost = "http://192.168.8.15:8006"//波哥 // const serverHost = "http://47.108.232.77:9537"//波哥
const serverHost = "http://192.168.0.231:8006"//线上 const serverHost = "http://192.168.0.231:8006"//线上
// const serverHost = "http://192.168.1.117:8006"//周 // const serverHost = "http://192.168.1.117:8006"//周
// const serverHost = "http://192.168.1.98:8006"//毛毛 // const serverHost = "http://192.168.1.98:8006"//毛毛