This commit is contained in:
lcw
2026-03-14 19:46:21 +08:00
parent 93489b06fa
commit 9fb505eb8e
248 changed files with 21714 additions and 1840 deletions

View File

@ -3,10 +3,12 @@
<keep-alive :include="store.getters.keepLiiveRoute">
<Watermark :text="content" :color="'rgba(0, 0, 0, .15)'">
<Component :is="Component"></Component>
</Watermark>
</keep-alive>
</router-view>
<Fzq />
<Fzq />
</template>
<script setup>
import Watermark from "@/components/Watermark.vue";
@ -128,12 +130,14 @@ v-deep .el-loading-mask {
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: "仿宋_GB2312";
src: url("~@/assets/font/仿宋_GB2312.ttf");
font-weight: normal;
font-style: normal;
}
.bk_drawer_box {
.el-drawer__header {
background: #fff !important;
@ -154,14 +158,16 @@ v-deep .el-loading-mask {
left: -10px;
transform: translateY(-50%) translateX(-50%);
}
.popupCustomBox{
.popupCustomBox {
width: 130px;
position: relative;
background: rgba(2, 55, 114, 0.99);
color: #fff;
border-radius: 4px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
.popupCustomTitle_title{
.popupCustomTitle_title {
padding: 4px;
box-sizing: border-box;
font-size: 12px;
@ -174,7 +180,8 @@ v-deep .el-loading-mask {
align-items: center;
flex-wrap: nowrap;
}
&::after{
&::after {
content: '';
position: absolute;
bottom: -10px;
@ -186,18 +193,65 @@ v-deep .el-loading-mask {
border-right: 10px solid transparent;
border-top: 10px solid rgba(2, 55, 114, 0.99);
}
.popupCustomTitle_li{
.popupCustomTitle_li {
font-size: 12px;
line-height: 22px;
text-transform: none;
margin-bottom: 0;
display: flex;
justify-content: space-between;
span{
span {
display: inline-block;
width: 60px;
text-align: center;
}
}
}
.blink-animation {
width: 10px !important;
height: 10px !important;
min-width: 10px;
min-height: 10px;
max-width: 10px;
max-height: 10px;
display: inline-block;
border-radius: 50%;
background: radial-gradient(circle, #ff4d4f 0%, #ff1f1f 60%, #b30000 100%);
transform: scaleY(0.58);
transform-origin: center center;
animation: alarmFlash 1.1s ease-in-out infinite, quakeRings 1.9s linear infinite;
}
@keyframes alarmFlash {
0%,
100% {
opacity: 0.95;
background: radial-gradient(circle, #ff6666 0%, #ff1f1f 62%, #b30000 100%);
}
50% {
opacity: 0.72;
background: radial-gradient(circle, #ff5252 0%, #e81919 62%, #990000 100%);
}
}
@keyframes quakeRings {
0% {
box-shadow:
0 0 0 0 rgba(255, 31, 31, 0.6),
0 0 0 0 rgba(255, 31, 31, 0.42),
0 0 0 0 rgba(255, 31, 31, 0.25);
}
100% {
box-shadow:
0 0 0 16px rgba(255, 31, 31, 0),
0 0 0 34px rgba(255, 31, 31, 0),
0 0 0 52px rgba(255, 31, 31, 0);
}
}
</style>

View File

@ -401,4 +401,91 @@
src: url("~@/assets/font/HANYILINGXINTIJIAN-1.TTF");
font-weight: normal;
font-style: normal;
}
}
.warning {
color: #df6c07;
cursor: pointer;
}
.success {
color: #00ff91;
cursor: pointer;
}
.primary {
color: #0b83f4;
cursor: pointer;
}
.info {
color: #808080;
cursor: pointer;
}
.danger {
color: #ff4d4f;
cursor: pointer;
}
// 警情闪速动画
@keyframes alert-flash {
0%, 100% {
opacity: 1;
transform: scale(1);
}
50% {
opacity: 0.3;
transform: scale(1.05);
}
}
@keyframes alert-pulse {
0% {
box-shadow: 0 0 0 0 rgba(255, 77, 79, 0.7);
}
70% {
box-shadow: 0 0 0 10px rgba(255, 77, 79, 0);
}
100% {
box-shadow: 0 0 0 0 rgba(255, 77, 79, 0);
}
}
@keyframes alert-blink {
0%, 49% {
opacity: 1;
}
50%, 100% {
opacity: 0;
}
}
// 警情闪速样式类
.alert-flash {
animation: alert-flash 1s ease-in-out infinite;
}
.alert-pulse {
animation: alert-pulse 1.5s ease-out infinite;
}
.alert-blink {
animation: alert-blink 1s step-start infinite;
}
// 组合效果 - 闪烁 + 脉冲
.alert-flash-pulse {
animation: alert-flash 1s ease-in-out infinite, alert-pulse 1.5s ease-out infinite;
}
// 警情颜色变体
.alert-danger-flash {
color: #ff4d4f;
animation: alert-flash 0.8s ease-in-out infinite;
}
.alert-warning-flash {
color: #df6c07;
animation: alert-flash 1s ease-in-out infinite;
}

BIN
src/assets/images/R_T.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
src/assets/images/rili.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -159,9 +159,9 @@ onMounted(() => {
emitter.on("drawShape", (res) => {
mapUtil.value.plot(res, resFun);
});
emitter.on("removeEara", (flag) => {
mapUtil.value.removeEara(flag);
});
// emitter.on("removeEara", (flag) => {
// mapUtil.value.removeEara(flag);
// });
// 回显图形
emitter.on("echoPlane", (res) => {
mapUtil.value.echoPlane(res);

View File

@ -1,8 +1,7 @@
<template>
<div :id="mapid" class="map"></div>
<div class="changeMap_box" v-if="props.isShow">
<el-switch v-model="conditionRoute" @change="handleSwitch" active-text="打开路况" inactive-text="关闭路况"
style="--el-switch-color: #13ce66; --el-switch-off-color: #ff4949" />
<!-- <el-switch v-model="conditionRoute" @change="handleSwitch" active-text="打开路况" inactive-text="关闭路况" style="--el-switch-color:#13ce66;--el-switch-off-color:#ff4949;" /> -->
<!-- <el-carousel type="card" height="75px" :autoplay="false" indicator-position="none" :initial-index="3" @change="onMapImageChange">
<el-carousel-item>
<div class="mapImageItem">
@ -31,7 +30,8 @@
</el-carousel> -->
<!-- 地图缩放 -->
<div class="zoomTargetBox">
<el-input-number :min="7" :max="18" v-model="zoomTarget" :step="1" step-strictly @change="handleZoom"></el-input-number>
<el-input-number :min="7" :max="18" v-model="zoomTarget" :step="1" step-strictly @change="handleZoom">
</el-input-number>
</div>
</div>
</template>
@ -44,7 +44,7 @@ import { getItem } from "@/utils/storage";
const conditionRoute = ref(true); //路况
const mMap = ref(null); //地图对象
const mapUtil = ref(null); //地图工具对象
const zoomTarget = ref(15);
const zoomTarget = ref(6);
const props = defineProps({
mapid: {
@ -70,11 +70,12 @@ const props = defineProps({
isShowDraw: {
type: Boolean,
default: false
}
},
});
try {
const userInfo = getItem("deptId")[0].deptCode;
} catch (error) { }
} catch (error) {}
let map;
let mapLayer;
let mapLayer1;
@ -88,37 +89,66 @@ onMounted(() => {
map = new EliMap({
id: props.mapid,
crs: "EPSG:4490",
crs: "EPSG:3857",
style: {
glyphs: "./fonts/{fontstack}/{range}.pbf",
center: [94.36057012, 29.64276831],
zoom: 15
center: [94.36,29.65],
zoom: 11
},
minZoom: 5,
minZoom: 7,
maxZoom: 18,
transformRequest: (url) => {
if (url.indexOf("TileMatrix=") != -1) {
const arr = url.split("TileMatrix=");
const arr1 = arr[1].split("&");
const nurl = `${arr[0]}&TileMatrix=${Number(arr1[0])}&${arr1[1]}&${arr1[2]}`;
}
}
});
window.map = map;
map.mapboxGLMap.on("load", () => {
map.addWMTSLayer(
"/PGIS_S_TileMapServer/Maps/XZDJ_DJ/EzMap"
,
{
Service: "getImage",
Type: "RGB",
ZoomOffset: "0",
V: "0.3",
Zoom: "{z}",
Row: "{y}",
Col: "{x}"
},
{
tileSize: 300
}
);
map.addGaudLayer({
url: 'http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}',
})
zoomTarget.value = map.mapboxGLMap.getZoom();
// 地图加载完成后发出事件
// emit('mapLoaded')
});
mapUtil.value = new MapUtil(map);
// map = new EliMap({
// id: props.mapid,
// crs: "EPSG:4490",
// style: {
// glyphs: "./fonts/{fontstack}/{range}.pbf",
// center: [94.36057012, 29.64276831],
// zoom: 15
// },
// minZoom: 7,
// maxZoom: 18,
// });
// window.map = map;
// map.mapboxGLMap.on("load", () => {
// map.addWMTSLayer(
// "/PGIS_S_TileMapServer/Maps/XZDJ_SL/EzMap"
// ,
// {
// Service: "getImage",
// Type: "RGB",
// ZoomOffset: "0",
// V: "0.3",
// Zoom: "{z}",
// Row: "{y}",
// Col: "{x}"
// },
// {
// tileSize: 300
// }
// );
// zoomTarget.value = map.mapboxGLMap.getZoom();
// });
// mapUtil.value = new MapUtil(map);
mapUtil.value.Drawplot(); //初始化加载绘制工具
// 设置地图中心点及图层
@ -154,10 +184,6 @@ onMounted(() => {
emitter.on("showSquire", (obj) => {
mapUtil.value.zdySquire(obj);
});
// 展示气泡框
emitter.on("makerPopup", (obj) => {
mapUtil.value.makerPopup(obj);
});
// 绘制图形 - 回显区域
emitter.on("drawShape", (res) => {
@ -263,6 +289,7 @@ const mapSetLayer = (id, source) => {
//获取地图绘制的数据
const resFun = (coord, type, flag, data) => {
emitter.emit("coordString", {
coord: coord,
type: type,
@ -276,6 +303,12 @@ const handleZoom = (val) => {
map.mapboxGLMap.setZoom(val);
};
emitter.on("map-resize", () => {
if (map && map.mapboxGLMap) {
map.mapboxGLMap.resize();
}
});
// 是否打开或者关闭路况
const handleSwitch = (val) => {
if (val) {
@ -292,7 +325,6 @@ onUnmounted(() => {
emitter.off("showPoint");
emitter.off("deletePointArea");
emitter.off("deletePointAreaOne");
emitter.off("makerPopup");
emitter.off("drawShape");
emitter.off("echoPlane");
emitter.off("removeEara");
@ -306,6 +338,7 @@ onUnmounted(() => {
emitter.off("diffusionCircle");
emitter.off("SsCircle");
emitter.off("ClearssCircle");
emitter.off("map-resize");
});
</script>
@ -328,35 +361,29 @@ onUnmounted(() => {
right: 398px;
bottom: 4px;
z-index: 9;
.mapImageItem {
border: 1px solid #08aae8;
background: rgb(9, 26, 70);
&>img {
& > img {
width: 100%;
height: 50px;
}
&>div {
& > div {
text-align: center;
position: relative;
top: -3px;
}
}
.zoomTargetBox {
margin-top: 10px;
margin-left: 23px;
}
::v-deep .el-input-number__decrease,
::v-deep .el-input-number__increase {
background: #133362;
color: #fff;
border: none;
}
::v-deep .el-input__inner {
background: #0c1641;
}

View File

@ -1,7 +1,8 @@
<template>
<div :id="mapid" class="map"></div>
<div class="changeMap_box" v-if="props.isShow">
<el-switch v-model="conditionRoute" @change="handleSwitch" active-text="打开路况" inactive-text="关闭路况" style="--el-switch-color:#13ce66;--el-switch-off-color:#ff4949;" />
<el-switch v-model="conditionRoute" @change="handleSwitch" active-text="打开路况" inactive-text="关闭路况"
style="--el-switch-color: #13ce66; --el-switch-off-color: #ff4949" />
<!-- <el-carousel type="card" height="75px" :autoplay="false" indicator-position="none" :initial-index="3" @change="onMapImageChange">
<el-carousel-item>
<div class="mapImageItem">
@ -30,21 +31,20 @@
</el-carousel> -->
<!-- 地图缩放 -->
<div class="zoomTargetBox">
<el-input-number :min="7" :max="18" v-model="zoomTarget" :step="1" step-strictly @change="handleZoom">
</el-input-number>
<el-input-number :min="7" :max="18" v-model="zoomTarget" :step="1" step-strictly @change="handleZoom"></el-input-number>
</div>
</div>
</template>
<script setup>
import { ref, onMounted, onUnmounted, defineProps, nextTick, computed } from "vue";
import { ref, onMounted, onUnmounted, defineProps, nextTick } from "vue";
import { MapUtil } from "./mapUtil";
import emitter from "@/utils/eventBus.js";
import { getItem } from "@/utils/storage";
const conditionRoute = ref(true); //
const mMap = ref(null); //
const mapUtil = ref(null); //
const zoomTarget = ref(6);
const zoomTarget = ref(15);
const props = defineProps({
mapid: {
@ -70,19 +70,11 @@ const props = defineProps({
isShowDraw: {
type: Boolean,
default: false
},
//
mapKey: {
type: String,
default: null
}
});
// 使mapid
const uniqueMapKey = computed(() => props.mapKey || props.mapid);
try {
const userInfo = getItem("deptId")[0].deptCode;
} catch (error) {}
} catch (error) { }
let map;
let mapLayer;
let mapLayer1;
@ -96,107 +88,76 @@ onMounted(() => {
map = new EliMap({
id: props.mapid,
crs: "EPSG:3857",
crs: "EPSG:4490",
style: {
glyphs: "./fonts/{fontstack}/{range}.pbf",
center: [94.36,29.65],
zoom: 10
center: [94.36057012, 29.64276831],
zoom: 15
},
transformRequest: (url) => {
if (url.indexOf("TileMatrix=") != -1) {
const arr = url.split("TileMatrix=");
const arr1 = arr[1].split("&");
const nurl = `${arr[0]}&TileMatrix=${Number(arr1[0])}&${arr1[1]}&${arr1[2]}`;
}
}
minZoom: 5,
maxZoom: 18,
});
//
// window.map = map;
//
mMap.value = map;
window.map = map;
map.mapboxGLMap.on("load", () => {
map.addGaudLayer({
url: 'http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}',
})
map.addWMTSLayer(
"/PGIS_S_TileMapServer/Maps/XZDJ_DJ/EzMap"
,
{
Service: "getImage",
Type: "RGB",
ZoomOffset: "0",
V: "0.3",
Zoom: "{z}",
Row: "{y}",
Col: "{x}"
},
{
tileSize: 300
}
);
zoomTarget.value = map.mapboxGLMap.getZoom();
//
// emit('mapLoaded')
});
mapUtil.value = new MapUtil(map);
mapUtil.value.Drawplot(); //
//
//
emitter.on(`setMapCenter_${uniqueMapKey.value}`, (res) => {
mapUtil.value.setMapCenter(res.location, res.zoomLevel);
});
//
emitter.on("setMapCenter", (res) => {
// flagflag
if (!res.flag || res.flag === uniqueMapKey.value) {
mapUtil.value.setMapCenter(res.location, res.zoomLevel);
}
mapUtil.value.setMapCenter(res.location, res.zoomLevel);
});
emitter.on("removePlot", (flag) => {
mapUtil.value.removePlot(flag);
});
emitter.on("removeAll", (flag) => {
mapUtil.value.removeAll(flag);
});
//
emitter.on("addPointArea", (obj) => {
//
if (!obj.baseFlag || obj.baseFlag === uniqueMapKey.value ||
obj.flag && obj.flag.includes(uniqueMapKey.value)) {
mapUtil.value.makerSki(obj);
}
mapUtil.value.makerSki(obj);
});
//
emitter.on("showPoint", (obj) => {
mapUtil.value.showPoint(obj);
});
//
emitter.on("makerPopup", (obj) => {
mapUtil.value.makerPopup(obj);
});
//
emitter.on("deletePointArea", (res) => {
//
if (typeof res === 'object' && res.baseFlag) {
if (res.baseFlag === uniqueMapKey.value) {
mapUtil.value.removeElement(res.baseFlag);
}
} else if (typeof res === 'string') {
if (res === uniqueMapKey.value || res.includes(uniqueMapKey.value)) {
mapUtil.value.removeElement(res);
}
}
mapUtil.value.removeElement(res);
});
//
emitter.on("deletePointAreaOne", (obj) => {
if (obj.flag === uniqueMapKey.value || obj.flag.includes(uniqueMapKey.value)) {
mapUtil.value.removeElementOne(obj.flag, obj.id);
}
mapUtil.value.removeElementOne(obj.flag, obj.id);
});
//
emitter.on("showSquire", (obj) => {
mapUtil.value.zdySquire(obj);
});
//
emitter.on("makerPopup", (obj) => {
mapUtil.value.makerPopup(obj);
});
// -
emitter.on("drawShape", (res) => {
@ -302,7 +263,6 @@ const mapSetLayer = (id, source) => {
//
const resFun = (coord, type, flag, data) => {
emitter.emit("coordString", {
coord: coord,
type: type,
@ -330,9 +290,9 @@ onUnmounted(() => {
emitter.off("setMapCenter");
emitter.off("addPointArea");
emitter.off("showPoint");
emitter.off("makerPopup");
emitter.off("deletePointArea");
emitter.off("deletePointAreaOne");
emitter.off("makerPopup");
emitter.off("drawShape");
emitter.off("echoPlane");
emitter.off("removeEara");
@ -368,29 +328,35 @@ onUnmounted(() => {
right: 398px;
bottom: 4px;
z-index: 9;
.mapImageItem {
border: 1px solid #08aae8;
background: rgb(9, 26, 70);
& > img {
&>img {
width: 100%;
height: 50px;
}
& > div {
&>div {
text-align: center;
position: relative;
top: -3px;
}
}
.zoomTargetBox {
margin-top: 10px;
margin-left: 23px;
}
::v-deep .el-input-number__decrease,
::v-deep .el-input-number__increase {
background: #133362;
color: #fff;
border: none;
}
::v-deep .el-input__inner {
background: #0c1641;
}

View File

@ -72,7 +72,7 @@ export function MapUtil(map) {
*/
MapUtil.prototype.makerSki = (res) => {
let { coords, icon, flag, showTitle, size, offset } = res
let { coords, icon, flag, showTitle, size, offset, flash } = res
if (!coords) return;
if (!_that._self[flag]) _that._self[flag] = []; //存储地图标识的容器
if (!_that.idsBox[flag]) _that.idsBox[flag] = []; //存储id的容器
@ -81,13 +81,19 @@ export function MapUtil(map) {
} else {
coords.forEach(item => {
let el = document.createElement("img");
el.src = item.icon || icon;
if (!flash) {
el.src = item.icon ? item.icon : icon;
} else {
el.className = 'blink-animation'
}
el.style.width = size ? size : "25px";
if (flag.includes('jczMap_')) el.style.width = '45px';
if (showTitle) _that.makerShowTitle(item, [item.jd, item.wd], flag, '', offset) //展示标题
// if (flag == 'hm') _that.makerPopup({data:item,flag:'hm_pop',type:'Custom'}) //展示气泡框
// 确保坐标格式正确,使用对象格式传递坐标
const marker = map.Marker(el, { lng: item.jd, lat: item.wd }, { anchor: 'bottom', offset: [0, 0] })
const marker = map.Marker(el, { lng: item.jd, lat: item.wd }, { anchor: 'bottom', offset: offset ? offset : [0, 0] })
el.addEventListener("click", () => {
_that.openInfoDetail(flag, item) //点击打开详情
})
@ -321,7 +327,9 @@ export function MapUtil(map) {
MapUtil.prototype.diffusionCircle = (obj) => {
let { coords, flag, isClear } = obj
if (!_that._self[flag]) _that._self[flag] = {}
if (isClear) _that._self[flag].destroy() //destroy销毁show(false) 移除
if (isClear && _that._self[flag] && typeof _that._self[flag].destroy === 'function') {
_that._self[flag].destroy() //destroy销毁show(false) 移除
}
let data = [{ position: coords }]
_that._self[flag] = map.DiffuseCircle(data, {
radius: 10,
@ -412,8 +420,11 @@ export function MapUtil(map) {
for (let i = 0; i < list.length; i++) {
const el = list[i];
console.log(el, 'el');
if (el && typeof el == 'object') el.destroy() //destory()销毁 , show(false) false:隐藏 true :展示
else _that.removePlot(key)
if (el && typeof el === 'object' && typeof el.destroy === 'function') {
el.destroy() //destory()销毁 , show(false) false:隐藏 true :展示
} else {
_that.removePlot(key)
}
}
_that._self[key] = [];
}
@ -430,7 +441,11 @@ export function MapUtil(map) {
for (let key in _that._self.gpsZb) {
let item = _that._self.gpsZb[key]
if (item && item.length > 0) {
for (let child in item) { item[child].destroy() }
for (let child in item) {
if (item[child] && typeof item[child].destroy === 'function') {
item[child].destroy()
}
}
_that._self.gpsZb[key] = []
}
}
@ -442,7 +457,9 @@ export function MapUtil(map) {
if (layer !== 'gpsZb') {
for (let i = 0; i < _that._self[layer].length; i++) {
const el = _that._self[layer][i];
el.destroy()//destory()销毁 , show(false) false:隐藏 true :展示
if (el && typeof el.destroy === 'function') {
el.destroy()//destory()销毁 , show(false) false:隐藏 true :展示
}
}
_that._self[layer] = [];
@ -452,7 +469,9 @@ export function MapUtil(map) {
if (!_that._self[flagT]) return false;
for (let i = 0; i < _that._self[flagT].length; i++) {
const el = _that._self[flagT][i];
el.destroy()//destory()销毁 , show(false) false:隐藏 true :展示
if (el && typeof el.destroy === 'function') {
el.destroy()//destory()销毁 , show(false) false:隐藏 true :展示
}
}
_that._self[flagT] = []
}
@ -467,11 +486,15 @@ export function MapUtil(map) {
list.forEach((el, index) => {
if (el == id) {
_that.idsBox[layer].splice(index, 1);
if (_that._self[layer][index]) _that._self[layer][index].destroy()
if (_that._self[layer][index] && typeof _that._self[layer][index].destroy === 'function') {
_that._self[layer][index].destroy()
}
_that._self[layer].splice(index, 1)
if (layer == 'rx') {
let flagT = layer + 'rxTitle';
if (_that._self[flagT][index]) _that._self[flagT][index].destroy()
if (_that._self[flagT][index] && typeof _that._self[flagT][index].destroy === 'function') {
_that._self[flagT][index].destroy()
}
_that._self[flagT].splice(index, 1)
_that.removeGpsZbOverlayById(id) //删除图标
}
@ -485,7 +508,11 @@ export function MapUtil(map) {
try {
let info = _that._self.gpsZb[id]
if (info) {
info.forEach(element => { element.destroy() });
info.forEach(element => {
if (element && typeof element.destroy === 'function') {
element.destroy()
}
});
delete _that._self.gpsZb[id]
}
} catch (err) { }
@ -759,7 +786,7 @@ export function MapUtil(map) {
// 移除轨迹
MapUtil.prototype.removeTrajectory = (flag) => {
if (_that._self[flag]) {
if (_that._self[flag] && typeof _that._self[flag].destroy === 'function') {
_that._self[flag].destroy();
_that._self[flag] = null
}
@ -848,7 +875,7 @@ export function MapUtil(map) {
// 移除边界
MapUtil.prototype.removeBj = (res) => {
// 移除单个polygonGeo为了向后兼容
if (_that.polygonGeo) {
if (_that.polygonGeo && typeof _that.polygonGeo.destroy === 'function') {
_that.polygonGeo.destroy();
_that.polygonGeo = null;
}
@ -856,7 +883,9 @@ export function MapUtil(map) {
// 移除所有添加到boundaryList中的多边形
if (_that.boundaryList && _that.boundaryList.length > 0) {
_that.boundaryList.forEach(polygon => {
polygon.destroy();
if (polygon && typeof polygon.destroy === 'function') {
polygon.destroy();
}
});
_that.boundaryList = [];
}
@ -882,6 +911,12 @@ export function MapUtil(map) {
case 'yj':
emitter.emit('yjShow', data);
break;
case 'jq':
emitter.emit('showJqXq', data);
break;
case 'sj':
emitter.emit('showZdsjXq', data);
break;
}
}
}

View File

@ -1,18 +1,8 @@
<template>
<div class="form-item-box" :style="{ width: width }">
<el-cascader
style="width: 100%"
class="el-cascader-zj"
:show-all-levels="false"
clearable
filterable
:disabled="props.disabled"
:placeholder="modelValue ? placeholder : '请选择部门'"
:options="tableData"
v-model="oldmodelValue"
@change="handleChange"
:props="endProps"
/>
<el-cascader style="width: 100%" class="el-cascader-zj" :show-all-levels="false" clearable filterable
:disabled="props.disabled" :placeholder="modelValue ? placeholder : '请选择部门'" :options="tableData"
v-model="oldmodelValue" @change="handleChange" :props="endProps" />
</div>
</template>
@ -41,14 +31,14 @@ const props = defineProps({
default: []
},
width: {
default: COMPONENT_WIDTH,
default: '',
type: String
},
isAll:{
isAll: {
default: false,
type: Boolean
},
disabled:{
disabled: {
default: false,
type: Boolean
},
@ -72,7 +62,7 @@ const endProps = {
lazyLoad(node, resolve) {
listQuery.value.parentid = node.data.id;
let params = { ...listQuery.value };
if(props.isAll && firstLoad.value) {
if (props.isAll && firstLoad.value) {
params.parentid = 1;
firstLoad.value = false;
}
@ -89,7 +79,7 @@ const endProps = {
const tableData = ref([]);
const getSysMenuTree = async () => {
let params = { ...listQuery.value }
if(props.isAll) params.parentid = 1;
if (props.isAll) params.parentid = 1;
const res = await selectDeptPage(params);
tableData.value = res;
depList.value = res
@ -101,29 +91,29 @@ onMounted(() => {
watch(
() => props.modelValue,
(val) => {
console.log(val,'val');
console.log(val, 'val');
oldmodelValue.value = val;
},
{ deep: true, immediate: true }
);
const emits = defineEmits(["update:modelValue",'getDepValue']);
const emits = defineEmits(["update:modelValue", 'getDepValue']);
const handleChange = (e) => {
if (props.multiple === true) {
const data = e.map((item) => {return item[item.length - 1];});
const data = e.map((item) => { return item[item.length - 1]; });
emits("update:modelValue", data);
const obj= data.map(items=>{
const obj = data.map(items => {
return {
... depList.value.find(item=>{ return item.orgCode == items})
...depList.value.find(item => { return item.orgCode == items })
}
})
console.log(obj);
emits("getDepValue", obj);
} else {
const data = e ? e[e.length - 1] : "";
emits("update:modelValue", data);
let obj = depList.value.find(item=>{ return item.orgCode == data})
let obj = depList.value.find(item => { return item.orgCode == data })
emits("getDepValue", obj);
}
};

View File

@ -173,7 +173,8 @@ const props = defineProps({
const emit = defineEmits([
"chooseData",
"rowdbClickHland",
"rowcontextmenuHland"
"rowcontextmenuHland",
"changePage"
]);
const multipleTableRef = ref();
const currentRow = ref();

View File

@ -31,7 +31,7 @@
</el-radio-group>
<!-- 时间选择 -->
<el-time-picker v-else-if="item.type == 'time'" v-model="listQuery[item.prop]" placeholder="选择时间" style="width: 100%" :disabled="item.disabled" />
<el-time-picker v-else-if="item.type == 'time'" v-model="listQuery[item.prop]" placeholder="选择时间" style="width: 100%" :disabled="item.disabled" value-format="HH:mm:ss"/>
<el-date-picker v-else-if="item.type == 'date'" v-model="listQuery[item.prop]" type="date" value-format="YYYY-MM-DD" placeholder="请选择日期" style="width: 100%" :disabled="item.disabled" />
<el-date-picker v-else-if="item.type == 'datetime'" v-model="listQuery[item.prop]" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择时间" style="width: 100%" :disabled="item.disabled" />
<el-date-picker v-else-if="item.type == 'datetimerange'" v-model="listQuery[item.prop]" type="datetimerange" :shortcuts="shortcuts" range-separator="To" value-format="YYYY-MM-DD HH:mm:ss" start-placeholder="选择开始时间" end-placeholder="选择结束时间" style="width: 100%" :disabled="item.disabled" />

View File

@ -41,6 +41,11 @@ export const publicRoutes = [
name: "home",
component: () => import("@/views/home/index") //系统登录
},
{
path: "/mapNavigation",
name: "mapNavigation",
component: () => import("@/views/home/model/mapNavigation.vue") //系统登录
},
{
path: "/KeyPopulations",
name: "KeyPopulations",
@ -484,6 +489,15 @@ export const publicRoutes = [
icon: "article-create"
}
},
{
path: "/policeManagement",
name: "policeManagement",
component: () => import("@/views/backOfficeSystem/policeManagement/index.vue"),
meta: {
title: "重大事件",
icon: "article-create"
}
},
{
path: "/ResearchHome",
name: "ResearchHome",
@ -658,6 +672,29 @@ export const publicRoutes = [
name: "dataApplication",
meta: { title: "数据应用", icon: "article-ranking" },
children: [
{
path: "/Gzqkgl",
name: "Gzqkgl",
meta: {
title: "工作情况管理",
icon: "article-create"
},
children: [
{
path: "/goingJob",
name: "goingJob",
meta: { title: "工作情况", icon: "article-ranking" },
component: () => import("@/views/backOfficeSystem/goingJob/index.vue")
}, {
path: "/workLogInfo",
name: "workLogInfo",
meta: { title: "值班信息", icon: "article-ranking" },
component: () => import("@/views/backOfficeSystem/workLogInfo/index.vue")
}
]
},
{
path: "/Cspz",
name: "Cspz",

View File

@ -4,6 +4,11 @@
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" />
</div>
<!-- <PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="addEdit('add')">新增</el-button>
</template>
</PageTitle> -->
<!-- 表格 -->
<div class="tabBox">
<MyTable
@ -82,6 +87,7 @@ import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import AddForm from "@/views/backOfficeSystem/DeploymentDisposal/mpvCar/components/addForm.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import { qcckGet, qcckPost,qcckDelete } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
const { proxy } = getCurrentInstance();
@ -157,7 +163,7 @@ onMounted(() => {
});
// 移入
const handleSend=()=>{
}
// 搜索
const onSearch = (val) => {

View File

@ -4,6 +4,12 @@
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" />
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="addEdit('add')">新增</el-button>
<!-- <el-button type="danger" size="small" @click="handleRow()">批量删除</el-button> -->
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox">
<MyTable
@ -36,6 +42,8 @@
<!-- 操作 -->
<template #controls="{ row }">
<el-link size="small" type="primary" @click="handleSend(row.id)">移入</el-link>
<el-link size="small" type="danger" @click="deleteRow(row.id)" v-if="isShiQzDelet">删除</el-link>
<el-link size="small" type="success" @click="addEdit('edit', row)">编辑</el-link>
<el-link size="small" type="success" @click="addEdit('detail', row)">详情</el-link>
</template>
</MyTable>
@ -45,7 +53,7 @@
}"></Pages>
</div>
<!-- 编辑 - 新增-->
<EditForm v-if="show" @updateDate="getList" ref="editFormDiloag" :dic="{D_BZ_XB,D_GS_ZDQT_LB,D_GS_ZDQT_FXDJ,D_GS_ZDR_CZZT}" />
<EditForm v-if="show" @updateDate="getList" qtlx="02" ref="editFormDiloag" :dic="{D_BZ_XB,D_GS_ZDQT_LB,D_GS_ZDQT_FXDJ,D_GS_ZDR_CZZT}" />
</div>
</template>
@ -57,6 +65,8 @@ import EditForm from "@/views/backOfficeSystem/DeploymentDisposal/mpvGroup/compo
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { ElMessage } from "element-plus";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import { getItem } from "@/utils/storage.js";
const { proxy } = getCurrentInstance();
const { D_GS_ZDR_CZZT,D_GS_BK_SQLX, D_GS_ZDQT_FXDJ, D_GS_ZDR_RYJB, D_GS_ZDQT_LB, D_GS_ZDR_BK_ZT, D_GS_BQ_LX, D_GS_ZDQT_ZT, D_BZ_SF, D_BZ_XB, D_GS_XS_LY, D_BZ_SSZT, D_GS_XS_LX, D_GS_XS_QTLX } = proxy.$dict("D_GS_ZDR_CZZT","D_GS_BK_SQLX", "D_GS_ZDQT_FXDJ", "D_GS_ZDR_RYJB", "D_GS_ZDQT_LB", "D_GS_ZDR_BK_ZT", "D_GS_BQ_LX", "D_GS_ZDQT_ZT", "D_BZ_SF", "D_BZ_XB", "D_GS_XS_LY", "D_BZ_SSZT", "D_GS_XS_LX", "D_GS_XS_QTLX"); //获取字典数据
const showzxs = ref(false);
@ -127,7 +137,7 @@ const pageData = reactive({
pageSize: 20,
pageCurrent: 1
},
controlsWidth: 150,
controlsWidth: 180,
tableColumn: [
{ label: "群体名称", prop: "qtMc",width:150 },
{ label: "群体类别", prop: "qtLb" , showSolt: true,width:150 },
@ -136,13 +146,16 @@ const pageData = reactive({
{ label: "背景信息", prop: "bgxx", showSolt: true ,width:150 },
{ label: "管辖单位", prop: "gxSsdwmc",width:150 },
{ label: "状态", prop: "qtZt", showSolt: true,width:150 },
{ label: "标签", prop: "bqList", showSolt: true ,showOverflowTooltip:true,width:400 },
{ label: "标签", prop: "bqList", showSolt: true ,showOverflowTooltip:true },
]
});
const isShiQzDelet = ref(false)
onMounted(() => {
tabHeightFn();
getList();
const isShiQz = getItem('roleList').find(item => item.roleCode == 'JS_777777') != undefined
if (isShiQz) isShiQzDelet.value = true
});
//移入

View File

@ -4,6 +4,13 @@
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" />
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="addEdit('add')">新增</el-button>
<!-- <el-button type="danger" size="small" @click="handleRow()">批量删除</el-button> -->
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
@ -46,6 +53,8 @@
<!-- 操作 -->
<template #controls="{ row }">
<el-link size="small" type="success" @click="handleSend(row.id)">移入</el-link>
<el-link size="small" type="primary" @click="addEdit('edit', row)">编辑</el-link>
<el-link size="small" type="danger" @click="deleteRow(row.id)" v-if="isShiQzDelet">删除</el-link>
<el-link size="small" type="primary" @click="addEdit('detail', row)">详情</el-link>
</template>
</MyTable>
@ -55,7 +64,7 @@
}"></Pages>
</div>
<!-- 详情 -->
<AddForm ref="addFormDiloag" @updateDate="getList"
<AddForm ref="addFormDiloag" @updateDate="getList" rylx="02"
:dic="{ D_GS_ZDR_RYJB, D_BZ_XB, D_BZ_MZ, D_BZ_XZQHDM, D_GS_ZDR_BK_ZT, D_GS_ZDR_CZZT, D_GS_BQ_ZL, D_GS_BQ_LB, D_GS_BQ_LX, D_GS_ZDR_YJDJ, D_GS_BK_SSJZ }" />
</div>
</template>
@ -69,6 +78,7 @@ import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import AddForm from "@/views/backOfficeSystem/DeploymentDisposal/mpvPeo/components/addForm.vue";
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { getItem } from "@/utils/storage.js";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
const { proxy } = getCurrentInstance();
const { D_GS_ZDQT_ZT, D_GS_ZDR_RYJB, D_BZ_XB, D_BZ_MZ, D_BZ_XZQHDM, D_GS_ZDR_BK_ZT, D_GS_ZDR_CZZT, D_GS_BQ_ZL, D_GS_BQ_LB, D_GS_BQ_LX, D_GS_ZDR_YJDJ, D_GS_BK_SSJZ, D_GS_BK_SQLX, D_BZ_SF, D_GS_XS_LY, D_BZ_SSZT, D_GS_XS_LX, D_GS_XS_QTLX } =
@ -126,7 +136,7 @@ const pageData = reactive({
tableColumn: [
{ label: "姓名", prop: "ryXm", width: 150 },
{ label: "性别", prop: "ryXb", showSolt: true, width: 100 },
{ label: "籍贯", prop: "ryJg", showSolt: true, width: 100},
{ label: "籍贯", prop: "ryJg", showSolt: true, width: 100 },
{ label: "身份证", prop: "rySfzh", width: 200 },
{ label: "民族", prop: "ryMz", showSolt: true, width: 100 },
{ label: "户籍地区划", prop: "hjdQh", showSolt: true, width: 150 },
@ -135,10 +145,12 @@ const pageData = reactive({
{ label: "审核状态", prop: "zdrZt", showSolt: true },
]
});
const isShiQzDelet = ref(false)
onMounted(() => {
getList();
tabHeightFn();
const isShiQz = getItem('roleList').find(item => item.roleCode == 'JS_777777') != undefined
if (isShiQz) isShiQzDelet.value = true
});
// 搜索
@ -161,7 +173,7 @@ const changeSize = (val) => {
const getList = () => {
pageData.tableConfiger.loading = true;
// 人员类型D_ZDRY_RYLX(01 重点 02 普通〉
let data = { rylx:'02',...pageData.pageConfiger, ...queryFrom.value };
let data = { rylx: '02', ...pageData.pageConfiger, ...queryFrom.value };
qcckGet(data, "/mosty-gsxt/tbGsxtZdry/selectPage").then((res) => {
pageData.tableData = res.records || [];
pageData.total = res.total;
@ -251,7 +263,7 @@ const addEdit = (type, row) => {
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 270;
window.onresize = function () {
tabHeightFn();
};

View File

@ -2,79 +2,89 @@
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<div ref="searchBox" class="mt10">
<Search :searchArr="searchConfiger" @submit="onSearch" />
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<!-- <el-popover placement="bottom" :visible="visible" :width="400" trigger="click">
<template #reference>
<el-button type="primary" @click="(visible = !visible), (visiblefp = false)" size="small">布控申请</el-button>
</template>
<div class="flex just-center">
<el-button size="small" type="primary" v-for="it in D_GS_BK_SQLX" :key="it.dm" @click="handleApplication(it)" >{{ it.zdmc }}</el-button>
</div>
</el-popover>
<el-popover placement="bottom" :visible="visiblefp" :width="400" trigger="click">
<template #reference>
<div class="flex just-center">
<el-button size="small" type="primary" v-for="it in D_GS_BK_SQLX" :key="it.dm" @click="handleApplication(it)">{{
it.zdmc }}</el-button>
</div>
</el-popover>
<el-popover placement="bottom" :visible="visiblefp" :width="400" trigger="click">
<template #reference>
<el-button size="small" type="primary" @click="(visiblefp = !visiblefp), (visible = false)" >指定分配</el-button>
</template>
<div>
<el-input readonly v-model="obj.fpmc" @click="chooseUserVisible = true" placeholder="请选择民警"></el-input>
<div class="flex just-center mt10">
<el-button @click="(visiblefp = false), (obj = {})" size="small">取消</el-button>
<el-button type="primary" @click="handlefp" size="small">分配</el-button>
</div>
</div>
</el-popover>
<el-button size="small" type="primary" @click="handleZxs">转线索</el-button>
<el-button size="small" type="primary" @click="handleMove">移交管控</el-button> -->
<div>
<el-input readonly v-model="obj.fpmc" @click="chooseUserVisible = true" placeholder="请选择民警"></el-input>
<div class="flex just-center mt10">
<el-button @click="(visiblefp = false), (obj = {})" size="small">取消</el-button>
<el-button type="primary" @click="handlefp" size="small">分配</el-button>
</div>
</div>
</el-popover>
<el-button size="small" type="primary" @click="handleZxs">转线索</el-button>
<el-button size="small" type="primary" @click="handleMove">移交管控</el-button> -->
<el-button type="primary" size="small" @click="addEdit('add', '')">
<el-icon style="vertical-align: middle"><CirclePlus /></el-icon>
<el-icon style="vertical-align: middle">
<CirclePlus />
</el-icon>
<span style="vertical-align: middle">新增</span>
</el-button>
</template>
</PageTitle>
</PageTitle>
<!-- 表格 -->
<div class="tabBox">
<MyTable
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
@chooseData="chooseData"
>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
@chooseData="chooseData">
<template #ryxx="{ row }">
<div class="flex">
<img src="" alt="" style="width: 80px;height: 90px;" />
<ul class="tl ml10" style="flex:1 0 0">
<li class="one_text_detail">姓名{{ row.ryXm }}</li>
<li class="flex one_text_detail">性别<DictTag :tag="false" :value="row.ryXb" :options="D_BZ_XB" /></li>
<li class="flex one_text_detail">籍贯<DictTag :tag="false" :value="row.ryJg" :options="D_BZ_XZQHDM"/></li>
<li class="flex one_text_detail">性别
<DictTag :tag="false" :value="row.ryXb" :options="D_BZ_XB" />
</li>
<li class="flex one_text_detail">籍贯
<DictTag :tag="false" :value="row.ryJg" :options="D_BZ_XZQHDM" />
</li>
<li class="one_text_detail">身份证{{ row.rySfzh }}</li>
<li class="one_text_detail">出生日期{{ row.ryCsrq }}</li>
<li class="flex one_text_detail">民族<DictTag :tag="false" :value="row.ryMz" :options="D_BZ_MZ" /></li>
<li class="flex one_text_detail">民族
<DictTag :tag="false" :value="row.ryMz" :options="D_BZ_MZ" />
</li>
</ul>
</div>
</template>
<template #jzxx="{ row }">
<div class="flex one_text_detail">户籍地区划<DictTag :tag="false" :value="row.hjdQh" :options="D_BZ_XZQHDM" /></div>
<div class="flex one_text_detail">户籍地区划
<DictTag :tag="false" :value="row.hjdQh" :options="D_BZ_XZQHDM" />
</div>
<div class="flex one_text_detail">户籍派出所{{ row.hjdPcsmc }}</div>
<div class="flex one_text_detail">户籍地详址{{ row.hjdXz }}</div>
</template>
<template #bqList="{ row }">
<ul >
<li class="one_text_detail marks mb4" :key="index" v-for="(item, index) in row.bqList">{{ item.bqMc }}({{ item.bqFz || 0 }} ) </li>
<ul>
<li class="one_text_detail marks mb4" :key="index" v-for="(item, index) in row.bqList">{{ item.bqMc }}({{
item.bqFz || 0 }} ) </li>
</ul>
</template>
<template #gxdw="{ row }">
<div class="flex one_text_detail">管辖单位{{ row.gxSsbmmc }}</div>
<div class="flex">人员级别<DictTag :tag="false" :value="row.zdrRyjb" :options="D_GS_ZDR_RYJB"/> </div>
<div class="flex">人员级别
<DictTag :tag="false" :value="row.zdrRyjb" :options="D_GS_ZDR_RYJB" />
</div>
<div class="flex one_text_detail">管控原因{{ row.zdrLkyy }}</div>
<div class="flex">管控状态<DictTag :tag="false" :value="row.zdrBkZt" :options="D_GS_ZDR_BK_ZT" /></div>
<div class="flex">管控状态
<DictTag :tag="false" :value="row.zdrBkZt" :options="D_GS_ZDR_BK_ZT" />
</div>
</template>
<template #zdrCzzt="{ row }">
<DictTag :tag="false" :value="row.zdrCzzt" :options="D_GS_ZDR_CZZT" />
@ -88,27 +98,24 @@
<!-- 操作 -->
<template #controls="{ row }">
<el-link size="small" type="primary" @click="addEdit('edit', row)" >编辑</el-link>
<el-link size="small" type="primary" @click="addEdit('detail', row)" >详情</el-link>
<el-link size="small" type="danger" @click="deleteRow(row.id)">删除</el-link>
<el-link size="small" type="primary" @click="addEdit('edit', row)">编辑</el-link>
<el-link size="small" type="primary" @click="addEdit('detail', row)">详情</el-link>
<el-link size="small" type="danger" @click="deleteRow(row.id)" v-if="isShiQzDelet">删除</el-link>
</template>
</MyTable>
<Pages
@changeNo="changeNo"
@changeSize="changeSize"
:tableHeight="pageData.tableHeight"
:pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"
></Pages>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
<!-- 详情 -->
<AddForm ref="addFormDiloag" @updateDate="getList" :dic="{BD_BK_CLYJBQ,D_GS_ZDR_RYJB,D_BZ_XB,D_BZ_MZ,D_BZ_XZQHDM,D_GS_ZDR_BK_ZT,D_GS_ZDR_CZZT,D_GS_BQ_ZL,D_GS_BQ_LB,D_GS_BQ_LX,D_GS_ZDR_YJDJ,D_GS_BK_SSJZ}"/>
<AddForm ref="addFormDiloag" @updateDate="getList"
:dic="{ BD_BK_CLYJBQ, D_GS_ZDR_RYJB, D_BZ_XB, D_BZ_MZ, D_BZ_XZQHDM, D_GS_ZDR_BK_ZT, D_GS_ZDR_CZZT, D_GS_BQ_ZL, D_GS_BQ_LB, D_GS_BQ_LX, D_GS_ZDR_YJDJ, D_GS_BK_SSJZ }" />
<!-- 选择用户 -->
<ChooseUser v-model="chooseUserVisible" @choosedUsers="handleUserSelected" :roleIds="roleIds"/>
<ChooseUser v-model="chooseUserVisible" @choosedUsers="handleUserSelected" :roleIds="roleIds" />
<!-- 转线索 -->
<ZxsForm v-if="showzxs" ref="zxsDilof" @change="getList" :dic="{D_BZ_SF,D_BZ_XB,D_GS_XS_LY,D_BZ_SSZT,D_GS_XS_LX,D_GS_XS_QTLX }"></ZxsForm>
<ZxsForm v-if="showzxs" ref="zxsDilof" @change="getList"
:dic="{ D_BZ_SF, D_BZ_XB, D_GS_XS_LY, D_BZ_SSZT, D_GS_XS_LX, D_GS_XS_QTLX }"></ZxsForm>
</div>
</template>
@ -121,10 +128,11 @@ import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import AddForm from "./components/addForm.vue";
import { qcckGet, qcckPost,qcckDelete } from "@/api/qcckApi.js";
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { getItem } from "@/utils/storage.js";
const { proxy } = getCurrentInstance();
const { D_GS_ZDQT_ZT,D_GS_ZDR_RYJB, D_BZ_XB,BD_BK_CLYJBQ, D_BZ_MZ, D_BZ_XZQHDM, D_GS_ZDR_BK_ZT, D_GS_ZDR_CZZT, D_GS_BQ_ZL, D_GS_BQ_LB, D_GS_BQ_LX, D_GS_ZDR_YJDJ, D_GS_BK_SSJZ, D_GS_BK_SQLX, D_BZ_SF, D_GS_XS_LY, D_BZ_SSZT, D_GS_XS_LX, D_GS_XS_QTLX } = proxy.$dict("D_GS_ZDQT_ZT","D_GS_ZDR_RYJB","D_BZ_XB","D_BZ_MZ","D_BZ_XZQHDM","D_GS_ZDR_BK_ZT","D_GS_ZDR_CZZT","D_GS_BQ_ZL","D_GS_BQ_LB","D_GS_BQ_LX","D_GS_BK_SSJZ","D_GS_BK_SQLX","D_BZ_SF","D_GS_XS_LY","D_BZ_SSZT","D_GS_XS_LX","D_GS_XS_QTLX","BD_BK_CLYJBQ","D_GS_ZDR_YJDJ");
const { D_GS_ZDQT_ZT, D_GS_ZDR_RYJB, D_BZ_XB, BD_BK_CLYJBQ, D_BZ_MZ, D_BZ_XZQHDM, D_GS_ZDR_BK_ZT, D_GS_ZDR_CZZT, D_GS_BQ_ZL, D_GS_BQ_LB, D_GS_BQ_LX, D_GS_ZDR_YJDJ, D_GS_BK_SSJZ, D_GS_BK_SQLX, D_BZ_SF, D_GS_XS_LY, D_BZ_SSZT, D_GS_XS_LX, D_GS_XS_QTLX } = proxy.$dict("D_GS_ZDQT_ZT", "D_GS_ZDR_RYJB", "D_BZ_XB", "D_BZ_MZ", "D_BZ_XZQHDM", "D_GS_ZDR_BK_ZT", "D_GS_ZDR_CZZT", "D_GS_BQ_ZL", "D_GS_BQ_LB", "D_GS_BQ_LX", "D_GS_BK_SSJZ", "D_GS_BK_SQLX", "D_BZ_SF", "D_GS_XS_LY", "D_BZ_SSZT", "D_GS_XS_LX", "D_GS_XS_QTLX", "BD_BK_CLYJBQ", "D_GS_ZDR_YJDJ");
const obj = ref({});
const showzxs = ref(false);
const zxsDilof = ref();
@ -179,9 +187,9 @@ const pageData = reactive({
},
controlsWidth: 150,
tableColumn: [
{ label: "车牌号", prop: "hphm",showOverflowTooltip:true },
{ label: "车牌号", prop: "hphm", showOverflowTooltip: true },
{ label: "车架号", prop: "clCjh" },
{ label: "车辆颜色", prop: "clYs",showOverflowTooltip:true},
{ label: "车辆颜色", prop: "clYs", showOverflowTooltip: true },
{ label: "车辆所有人", prop: "clSyr" },
{ label: "管辖单位", prop: "gxSsbmmc", showSolt: true },
{ label: "管控民警姓名", prop: "gkMjXm", showSolt: true },
@ -189,8 +197,12 @@ const pageData = reactive({
// { label: "审核状态", prop: "zdrZt", showSolt: true },
]
});
const isShiQzDelet = ref(false)
onMounted(() => {
console.log( getItem('roleList'));
const isShiQz = getItem('roleList').find(item => item.roleCode == 'JS_777777') != undefined
if (isShiQz) isShiQzDelet.value = true
getList();
tabHeightFn();
});
@ -249,7 +261,7 @@ const handleUserSelected = (val) => {
// 处理分配
const handlefp = () => {
if (ids.value.length === 0) return ElMessage.error("请先选择需要布控的重点人");
qcckPost({ ids: ids.value, uid: obj.value.fpid },"/mosty-gsxt/tbGsxtZdry/addGkmj").then(() => {
qcckPost({ ids: ids.value, uid: obj.value.fpid }, "/mosty-gsxt/tbGsxtZdry/addGkmj").then(() => {
ElMessage.success("分配成功");
visible.value = false;
visiblefp.value = false;
@ -285,7 +297,7 @@ const handleZxs = () => {
const deleteRow = (id) => {
proxy.$confirm("确定要删除", "警告", { type: "warning" }).then(() => {
qcckPost({id}, "/mosty-gsxt/tbGsxtZdcl/delete" ).then((res) => {
qcckPost({ id }, "/mosty-gsxt/tbGsxtZdcl/delete").then((res) => {
ElMessage.success("删除成功");
getList();
});
@ -296,7 +308,7 @@ const deleteRow = (id) => {
//新增编辑
const addEdit = (type, row) => {
show.value = true;
nextTick(()=>{
nextTick(() => {
addFormDiloag.value.init(type, row);
})
};
@ -311,7 +323,7 @@ const tabHeightFn = () => {
</script>
<style lang="scss" scoped>
.marks{
.marks {
padding: 0 4px;
white-space: nowrap;
background: #73acf1;
@ -323,5 +335,4 @@ const tabHeightFn = () => {
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
</style>

View File

@ -67,6 +67,14 @@ const disabled = ref(false)
const showBut = ref()
const title = ref('新增')
const portrayal = ref(false)
const props = defineProps({
qtlx: {
type: String,
default: '01'
}
})
const emit = defineEmits(['updateDate'])
const init = (type, row) => {
dialogForm.value = true
if (type == 'add') {
@ -168,7 +176,6 @@ const submit = async () => {
requestInfo.value.throwData(),
personnel.value.throwData()
]);
const datamasg = {
...infoData,
qtBjzl: backinfoData.qtbjxx,
@ -177,7 +184,8 @@ const submit = async () => {
qttz: featinfoData,
zyxx: demandsInfoData,
sqfj: requestInfoData.fileList.length > 0 ? JSON.stringify(requestInfoData.fileList) : "",
zdryList: personnelData
zdryList: personnelData,
qtlx: props.qtlx
}
const res = await tbGsxtZdqtAdd(datamasg)
@ -206,7 +214,7 @@ const submit = async () => {
message: '新增成功',
type: 'success',
})
emit('updateDate')
close()
} catch (error) {
console.log(error);

View File

@ -68,7 +68,7 @@
<el-link size="small" type="primary" v-if="row.qtZt == '01'" @click="handleSend(row.id)">办结</el-link>
<el-link size="small" type="success" v-if="row.qtZt == '01'" @click="addEdit('edit', row)">编辑</el-link>
<el-link size="small" type="success" @click="addEdit('detail', row)">详情</el-link>
<el-link size="small" type="danger" @click="deleteRow(row.id)">删除</el-link>
<el-link size="small" type="danger" @click="deleteRow(row.id)" v-if="isShiQzDelet">删除</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
@ -97,6 +97,7 @@ import EditForm from "./components/addForm.vue";
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { ElMessage } from "element-plus";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { getItem } from "@/utils/storage.js";
const { proxy } = getCurrentInstance();
const { D_GS_ZDR_CZZT, D_GS_BK_SQLX, D_GS_ZDQT_FXDJ, D_GS_ZDR_RYJB, D_GS_ZDQT_LB, D_GS_ZDR_BK_ZT, D_GS_BQ_LX, D_GS_ZDQT_ZT, D_BZ_SF, D_BZ_XB, D_GS_XS_LY, D_BZ_SSZT, D_GS_XS_LX, D_GS_XS_QTLX } = proxy.$dict("D_GS_ZDR_CZZT", "D_GS_BK_SQLX", "D_GS_ZDQT_FXDJ", "D_GS_ZDR_RYJB", "D_GS_ZDQT_LB", "D_GS_ZDR_BK_ZT", "D_GS_BQ_LX", "D_GS_ZDQT_ZT", "D_BZ_SF", "D_BZ_XB", "D_GS_XS_LY", "D_BZ_SSZT", "D_GS_XS_LX", "D_GS_XS_QTLX"); //获取字典数据
const showzxs = ref(false);
@ -185,8 +186,10 @@ const pageData = reactive({
{ label: "标签", prop: "bqList", showSolt: true, showOverflowTooltip: true, },
]
});
const isShiQzDelet = ref(false)
onMounted(() => {
const isShiQz = getItem('roleList').find(item => item.roleCode == 'JS_777777') != undefined
if (isShiQz) isShiQzDelet.value = true
tabHeightFn();
getList();
});

View File

@ -114,7 +114,13 @@ const showBut = ref(false)
const listQuery = ref({});
const butShow = ref(false)
const title = ref('新增')
const showData=ref(false)
const showData = ref(false)
const props = defineProps({
rylx: {
type: String,
default: '01'
}
})
// 初始化数据
const init = (type, row) => {
dialogForm.value = true;
@ -207,7 +213,7 @@ const submit = async () => {
info.value.throwData()
// personnelTags.value.throwData(),
]);
tbGsxtZdrySave({...infoData,rylx:'01'}).then(res => {
tbGsxtZdrySave({...infoData,rylx:props.rylx}).then(res => {
proxy.$message({
message: '新增成功',
type: 'success',

View File

@ -117,6 +117,7 @@ import AddForm from "./components/addForm.vue";
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { useRouter, useRoute } from 'vue-router'
import { getItem } from "@/utils/storage.js";
const router = useRouter()
const route = useRoute()
const { proxy } = getCurrentInstance();
@ -188,9 +189,11 @@ const pageData = reactive({
{ label: "入库时间", prop: "zdrRkkssj", },
]
});
const isShiQzDelet = ref(false)
onMounted(() => {
tabHeightFn();
tabHeightFn();
const isShiQz = getItem('roleList').find(item => item.roleCode == 'JS_777777') != undefined
if (isShiQz) isShiQzDelet.value = true
if (route.query.id) {
addEdit('x', {
id: route.query.id

View File

@ -17,7 +17,7 @@
<div class="phone-input-container">
<div class="inputGroup" v-for="(item, index) in listQuery.ryLxdh" :key="index">
<el-input v-model="listQuery.ryLxdh[index]" class="group" placeholder="请输入电话号码" />
<div class="flex align-center but" v-if="showBut">
<div class="flex align-center but" >
<el-button type="primary" :icon="Plus" circle @click="addPhone" title="添加电话号码"
v-if="listQuery.ryLxdh.length - 1 == index" />
<el-button type="success" :icon="Minus" circle @click="removePhone(index)" title="删除电话号码" />

View File

@ -0,0 +1,308 @@
<template>
<section class="query-wrap">
<div class="query-title">{{ title }}</div>
<div class="query-grid">
<div v-for="field in renderFields" :key="field.key" class="query-cell">
<div class="cell-label">{{ field.label }}</div>
<div class="cell-control" :class="{ 'is-checkbox': field.type === 'checkbox' }">
<el-input clearable v-if="field.type === 'input'" v-model="formState[field.key]" class="control-input"
:placeholder="field.placeholder || ''" />
<el-input clearable v-else-if="field.type === 'number'" v-model="formState[field.key]" class="control-input"
type="number" :placeholder="field.placeholder || ''" />
<el-select clearable v-else-if="field.type === 'select'" v-model="formState[field.key]" class="control-select"
:placeholder="field.placeholder || '请选择'" :multiple="field.multiple || false" collapse-tags
collapse-tags-tooltip>
<el-option v-for="item in field.options || []" :key="item.value ?? item" :label="item.label ?? item"
:value="item.value ?? item" />
</el-select>
<el-date-picker clearable v-else-if="field.type === 'date'" v-model="formState[field.key]"
class="control-date" type="date" :placeholder="field.placeholder || '请选择日期'" value-format="YYYY-MM-DD" />
<el-date-picker clearable v-else-if="field.type === 'datetime'" v-model="formState[field.key]"
class="control-date" type="datetime" :placeholder="field.placeholder || '请选择时间'"
value-format="YYYY-MM-DD HH:mm:ss" />
<el-date-picker clearable v-else-if="field.type === 'daterange'" v-model="formState[field.key]"
class="control-date" type="daterange" range-separator="" start-placeholder="开始日期" end-placeholder="结束日期"
value-format="YYYY-MM-DD" />
<el-date-picker clearable v-else-if="field.type === 'datetimerange'" v-model="formState[field.key]"
class="control-date" type="datetimerange" range-separator="" start-placeholder="开始时间"
end-placeholder="结束时间" value-format="YYYY-MM-DD HH:mm:ss" />
<template v-else-if="field.type === 'department'">
<MOSTY.Department clearable v-model="formState[field.key]" class="control-select" />
</template>
<div v-else-if="field.type === 'checkbox'" class=" checkbox-wrap">
<el-checkbox v-model="formState[field.key]" />
</div>
</div>
</div>
</div>
<div class="query-action">
<div>
<slot name="but"></slot>
</div>
<div>
<el-button size="small" type="primary" @click="handleSearch">{{ searchText }}</el-button>
<el-button size="small" type="button" @click="handleReset">重置 </el-button>
</div>
</div>
</section>
</template>
<script setup>
import { computed, reactive, watch } from 'vue'
import * as MOSTY from "@/components/MyComponents/index";
const props = defineProps({
title: {
type: String,
default: '查询条件'
},
searchText: {
type: String,
default: '查询'
},
fields: {
type: Array,
default: () => []
},
searchArr: {
type: Array,
default: () => []
}
})
const emit = defineEmits(['search', 'submit', 'reset'])
const formState = reactive({})
const renderFields = computed(() => {
const source = props.searchArr.length ? props.searchArr : props.fields
return source.map((field) => ({
...field,
key: field.key || field.prop,
type: field.type || field.showType || 'input'
})).filter((field) => field.key)
})
const getResetValue = (field) => {
if (field.defaultVal !== undefined) {
return Array.isArray(field.defaultVal) ? [...field.defaultVal] : field.defaultVal
}
if (field.type === 'checkbox') {
return false
}
if (field.type === 'daterange' || field.type === 'datetimerange') {
return []
}
if (field.type === 'select') {
if (field.multiple) {
return []
}
return null
}
return ''
}
const buildResetPayload = () => {
const payload = {}
renderFields.value.forEach((field) => {
payload[field.key] = getResetValue(field)
})
return payload
}
const setFormState = (value = {}) => {
Object.keys(formState).forEach((key) => {
delete formState[key]
})
renderFields.value.forEach((field) => {
if (value[field.key] !== undefined) {
formState[field.key] = Array.isArray(value[field.key]) ? [...value[field.key]] : value[field.key]
return
}
formState[field.key] = getResetValue(field)
})
}
const getFormSnapshot = () => {
const snapshot = {}
renderFields.value.forEach((field) => {
const value = formState[field.key]
if (Array.isArray(value)) {
snapshot[field.key] = [...value]
return
}
snapshot[field.key] = value
})
return snapshot
}
const handleSearch = () => {
const payload = getFormSnapshot()
emit('search', payload)
emit('submit', payload)
}
const handleReset = () => {
const payload = buildResetPayload()
setFormState(payload)
emit('reset', true)
emit('search', payload)
emit('submit', payload)
}
watch(
renderFields,
() => {
setFormState(buildResetPayload())
},
{ immediate: true }
)
defineExpose({
formState,
handleSearch,
handleReset
})
</script>
<style scoped lang="scss">
.query-wrap {
border: 1px solid #b8d3ff;
background: #fff;
}
.query-title {
height: 32px;
background: linear-gradient(to right, #9ed7ff, #e6f0f8);
line-height: 32px;
padding-left: 10px;
font-size: 16px;
font-weight: 700;
color: #0d2148;
border-bottom: 1px solid #b8d3ff;
}
.query-grid {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
}
.query-cell {
display: flex;
min-height: 40px;
border-right: 1px solid #b8d3ff;
border-bottom: 1px solid #b8d3ff;
}
.query-cell:nth-child(4n) {
border-right: 0;
}
.cell-label {
width: 130px;
flex-shrink: 0;
border-right: 1px solid #b8d3ff;
font-size: 14px;
color: #0d2148;
display: flex;
align-items: center;
justify-content: center;
white-space: nowrap;
}
.cell-control {
flex: 1;
min-width: 0;
padding: 4px 8px;
display: flex;
align-items: center;
overflow: hidden;
}
.cell-control.is-checkbox {
justify-content: center;
padding: 0;
}
.control-input,
.control-select,
.control-date {
width: 100%;
max-width: 100%;
min-width: 0;
}
:deep(.control-input .el-input__wrapper),
:deep(.control-select .el-select__wrapper),
:deep(.control-date .el-input__wrapper) {
width: 100%;
max-width: 100%;
min-height: 28px;
border-radius: 0;
box-shadow: 0 0 0 1px #b8d3ff inset;
}
:deep(.control-date.el-date-editor) {
width: 100%;
max-width: 100%;
min-width: 0;
}
:deep(.control-date.el-date-editor .el-range-input) {
min-width: 0;
}
:deep(.control-input .el-input__inner),
:deep(.control-select .el-select__placeholder),
:deep(.control-date .el-input__inner) {
font-size: 14px;
color: #0d2148;
}
:deep(.control-date .el-range-input) {
font-size: 14px;
color: #0d2148;
}
:deep(.control-date .el-range__icon),
:deep(.control-date .el-range__close-icon) {
line-height: 1;
}
.checkbox-wrap {
width: 100%;
display: flex;
align-items: center;
justify-content: center;
height: 100%;
}
:deep(.checkbox-wrap .el-checkbox) {
margin-right: 0;
height: 100%;
display: flex;
align-items: center;
}
:deep(.checkbox-wrap .el-checkbox__inner) {
width: 14px;
height: 14px;
}
.query-action {
height: 36px;
display: flex;
// justify-content: flex-end;
justify-content: space-between;
align-items: center;
padding: 0 8px;
}
.search-btn {
height: 26px;
min-width: 70px;
border: 1px solid #0f5bbd;
background: #0f5bbd;
color: #fff;
font-size: 14px;
cursor: pointer;
}
</style>

View File

@ -0,0 +1,170 @@
<template>
<section class="table-wrap">
<div class="table-box">
<el-table ref="tableRef" v-loading="loading" :data="data" :row-key="rowKey" border stripe class="warn-data-table"
@selection-change="onSelectionChange" :height="height">
<el-table-column v-if="selectionMode !== 'none'" type="selection" :width="selectionColumnWidth"
:align="selectionColumnAlign" />
<el-table-column v-for="column in columns" :key="column.prop || column.label || column.type" :prop="column.prop"
:type="column.type" :label="column.label" :width="column.width" :min-width="column.minWidth"
:align="column.align" :show-overflow-tooltip="true">
<template v-if="column.slotName" #default="scope">
<slot v-if="column.slotName" :name="column.slotName" :row="scope.row" :column="column"
:$index="scope.$index">
{{ column.prop ? scope.row[column.prop] : '' }}
</slot>
</template>
</el-table-column>
</el-table>
</div>
</section>
</template>
<script setup>
import { ref, watch } from 'vue'
const props = defineProps({
data: {
type: Array,
default: () => []
},
columns: {
type: Array,
default: () => []
},
selectionMode: {
type: String,
default: 'multiple'
},
rowKey: {
type: [String, Function],
default: 'id'
},
selectionColumnWidth: {
type: Number,
default: 38
},
selectionColumnAlign: {
type: String,
default: 'center'
},
toolbarActions: {
type: Array,
default: () => [
{ key: 'sign', text: '批量签收', red: true },
{ key: 'export', text: '批量导出' },
{ key: 'analysis', text: '批量分析' },
{ key: 'count', text: '计算人数' }
]
},
tableHeight: {
type: [Number, String],
default: '600px'
},
loading: {
type: Boolean,
default: false
}
})
const height = ref()
watch(() => props.tableHeight, (newVal) => {
if (newVal) {
height.value = newVal
}
})
const emit = defineEmits(['selection-change', 'row-change'])
const tableRef = ref()
const onSelectionChange = (selection) => {
if (props.selectionMode === 'single' && selection.length > 1) {
const selectedRow = selection[selection.length - 1]
tableRef.value.clearSelection()
tableRef.value.toggleRowSelection(selectedRow, true)
emit('selection-change', [selectedRow])
emit('row-change', selectedRow)
return
}
emit('selection-change', selection)
emit('row-change', selection[0] || null)
}
</script>
<style scoped lang="scss">
.table-wrap {
margin-top: 10px;
background: #fff;
}
:deep(.el-table--fit) {
position: static;
// width: calc(100% - 20px) !important;
height: calc(100% - 100px);
}
.tool-bar {
height: 24px;
display: flex;
align-items: center;
gap: 16px;
font-size: 14px;
color: #1f56ab;
}
.tool-link {
cursor: pointer;
}
.tool-link.red {
color: #e51414;
}
.table-box {
border: 1px solid #b5ccf2;
overflow: hidden;
}
:deep(.warn-data-table) {
width: 100%;
}
:deep(.warn-data-table .el-table__inner-wrapper::before) {
display: none;
}
:deep(.warn-data-table .el-table__header-wrapper th.el-table__cell) {
background: #16263e !important;
color: #fff !important;
border-color: #b5ccf2;
padding:0;
}
:deep(.warn-data-table .el-table__header-wrapper th.el-table__cell .cell) {
text-align: center;
overflow: visible;
white-space: normal;
text-overflow: clip;
word-break: break-word;
}
:deep(.warn-data-table .el-table__body-wrapper td.el-table__cell) {
border-color: #b5ccf2;
padding: 3px 0;
}
:deep(.warn-data-table .el-table__cell) {
font-size: 13px;
color: #0f223f;
}
:deep(.warn-data-table .el-table__cell .cell) {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
:deep(.warn-data-table.el-table--border::after),
:deep(.warn-data-table.el-table--group::after),
:deep(.warn-data-table::before) {
background-color: #b5ccf2;
}
</style>

View File

@ -0,0 +1,139 @@
<template>
<div class="ces-page">
<QueryFormPanel :fields="queryFields" @search="handleSearch" />
<WarnDataTable :data="tableData" :columns="columns" :selection-mode="selectionMode" :loading="loading">
<template #status="{ row }">
<span class="status" :class="row.statusClass">{{ row.status }}</span>
</template>
<template #level="{ row }">
<span class="level" :class="row.levelClass">{{ row.level }}</span>
</template>
<template #operation>
<span class="operation">签收 详情 指派 报错 关注</span>
</template>
<template #timeout="{ row }">
<span class="timeout">{{ row.timeout }}</span>
</template>
</WarnDataTable>
</div>
</template>
<script setup>
import { ref } from 'vue'
import QueryFormPanel from './components/QueryFormPanel.vue'
import WarnDataTable from './components/WarnDataTable.vue'
const selectionMode = ref('multiple')
const loading = ref(false)
const lastQueryParams = ref({})
const handleSearch = (params) => {
lastQueryParams.value = params
}
const queryFields = [
{ key: 'warnDate', label: '预警时间', type: 'input', placeholder: '年 / 月 / 日' },
{ key: 'warnLevel', label: '预警级别', type: 'select', options: ['全部', '红色', '橙色', '黄色', '蓝色'] },
{ key: 'receiveUnit', label: '接收单位', type: 'input' },
{ key: 'relatedWarn', label: '关联预警', type: 'checkbox' },
{ key: 'name', label: '姓名(精确、模糊)', type: 'input' },
{ key: 'gender', label: '性别', type: 'select', options: ['全部', '男', '女'] },
{ key: 'timeout', label: '超时状态', type: 'select', options: ['全部', '超时签收', '超时反馈'] },
{ key: 'personType', label: '人员类别', type: 'select', options: ['全部', '刑事前科类', '在逃人员', '重点关注'] },
{ key: 'focus', label: '重点关注', type: 'checkbox' },
{ key: 'secondDispatch', label: '二次指派', type: 'checkbox' },
{ key: 'idCard', label: '身份证号码(精确、模糊)', type: 'input' },
{ key: 'age', label: '年龄', type: 'input' },
{ key: 'warnCount', label: '预警次数', type: 'input' },
{ key: 'personLevel', label: '人员级别', type: 'select', options: ['全部', '一级', '二级', '三级'] },
{ key: 'traceType', label: '轨迹类别', type: 'select', options: ['全部', '人校核查', '轨迹追踪'] },
{ key: 'activePlace', label: '活动发生地模糊查询', type: 'input' },
{ key: 'groupType', label: '人员组类模糊查询', type: 'input' }
]
const columns = [
{ type: 'index', label: '序号', width: 60, align: 'center' },
{ label: '预警状态', width: 86, align: 'center', slotName: 'status' },
{ prop: 'time', label: '预警时间', width: 150 },
{ prop: 'name', label: '人员姓名', width: 80 },
{ prop: 'idCard', label: '身份证号', width: 158 },
{ prop: 'gender', label: '性别', width: 56, align: 'center' },
{ prop: 'age', label: '年龄', width: 56, align: 'center' },
{ label: '预警级别', width: 88, align: 'center', slotName: 'level' },
{ prop: 'category', label: '人员类别', width: 108 },
{ prop: 'group', label: '人员组类', width: 92 },
{ prop: 'trace', label: '轨迹类别', width: 92 },
{ prop: 'place', label: '活动发生地', minWidth: 130 },
{ prop: 'unit', label: '接收单位', width: 100 },
{ prop: 'count', label: '预警次数', width: 80, align: 'center' },
{ label: '操作', width: 180, slotName: 'operation' },
{ label: '超时状态', width: 80, align: 'center', slotName: 'timeout' }
]
const tableData = [
{ id: 1, status: '未签收', statusClass: 'danger', time: '2026-03-10 14:23:05', name: '张三', idCard: '513701199606095613', gender: '男', age: 30, level: '蓝色', levelClass: 'blue', category: '刑事前科类', group: '盗窃案', trace: '人校核查', place: '波密县玉许检查站出口', unit: '波密县公安局', count: 13, timeout: '' },
{ id: 2, status: '已签收', statusClass: 'ok', time: '2026-03-10 13:15:30', name: '曾海峰', idCard: '513701199606095613', gender: '男', age: 31, level: '红色', levelClass: 'red', category: '刑事前科类', group: '盗窃案', trace: '人校核查', place: '波密县玉许检查站', unit: '波密县公安局', count: 14, timeout: '超时签收' },
{ id: 3, status: '已签收', statusClass: 'ok', time: '2026-03-10 12:08:45', name: '曾海峰', idCard: '513701199606095613', gender: '男', age: 32, level: '红色', levelClass: 'red', category: '刑事前科类', group: '盗窃案', trace: '人校核查', place: '波密县玉许检查站', unit: '波密县公安局', count: 15, timeout: '' },
{ id: 4, status: '已反馈', statusClass: 'ok', time: '2026-03-10 11:42:18', name: '曾海峰', idCard: '513701199606095613', gender: '男', age: 33, level: '红色', levelClass: 'red', category: '刑事前科类', group: '盗窃案', trace: '人校核查', place: '波密县玉许检查站', unit: '波密县公安局', count: 16, timeout: '' },
{ id: 5, status: '未签收', statusClass: 'danger', time: '2026-03-09 16:30:22', name: '李明', idCard: '510105199203156789', gender: '男', age: 34, level: '橙色', levelClass: 'orange', category: '刑事前科类', group: '诈骗案', trace: '轨迹追踪', place: '成都市武侯区人民南路', unit: '武侯区公安局', count: 8, timeout: '超时签收' },
{ id: 6, status: '已签收', statusClass: 'ok', time: '2026-03-09 15:20:11', name: '王丽', idCard: '320106198807234561', gender: '女', age: 38, level: '黄色', levelClass: 'yellow', category: '重点关注', group: '涉毒人员', trace: '人校核查', place: '南京市鼓楼区中央路', unit: '鼓楼区公安局', count: 5, timeout: '' },
{ id: 7, status: '未签收', statusClass: 'danger', time: '2026-03-09 10:05:33', name: '赵强', idCard: '440101199505189012', gender: '男', age: 31, level: '红色', levelClass: 'red', category: '在逃人员', group: '抢劫案', trace: '轨迹追踪', place: '广州市荔湾区芳村大道', unit: '荔湾区公安局', count: 22, timeout: '超时签收' },
{ id: 8, status: '已反馈', statusClass: 'ok', time: '2026-03-08 22:18:44', name: '陈静', idCard: '350102199108267890', gender: '女', age: 35, level: '蓝色', levelClass: 'blue', category: '刑事前科类', group: '盗窃案', trace: '人校核查', place: '福州市鼓楼区东街口', unit: '鼓楼区公安局', count: 3, timeout: '' },
{ id: 9, status: '已签收', statusClass: 'ok', time: '2026-03-08 18:45:09', name: '孙伟', idCard: '210102199307123456', gender: '男', age: 33, level: '橙色', levelClass: 'orange', category: '重点关注', group: '逃犯人员', trace: '轨迹追踪', place: '沈阳市和平区太原街', unit: '和平区公安局', count: 11, timeout: '' },
{ id: 10, status: '未签收', statusClass: 'danger', time: '2026-03-08 09:30:56', name: '周芳', idCard: '420106199612085678', gender: '女', age: 30, level: '黄色', levelClass: 'yellow', category: '刑事前科类', group: '故意伤害', trace: '人校核查', place: '武汉市武昌区中南路', unit: '武昌区公安局', count: 7, timeout: '' }
]
</script>
<style scoped lang="scss">
.ces-page {
width: 100%;
padding: 8px;
box-sizing: border-box;
background: #fff;
}
.status {
color: #0f5bbd;
}
.status.danger {
color: #ff2424;
}
.status.ok {
color: #1d72e8;
}
.level {
display: inline-block;
min-width: 42px;
line-height: 1.2;
color: #fff;
font-weight: 700;
text-align: center;
padding: 2px 6px;
}
.level.red {
background: #e11212;
}
.level.orange {
background: #f39a14;
}
.level.yellow {
background: #d9bb17;
}
.level.blue {
background: #1b76eb;
}
.operation {
color: #1b59bf;
}
.timeout {
color: #ff1f1f;
text-align: center;
}
</style>

View File

@ -2,19 +2,22 @@
<div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button v-for="(item,index) in butList" :key="index" :type="qh == item ? 'primary' : 'default'" @click="qh = item" size="small">{{item}}</el-button>
<el-button v-for="(item, index) in butList" :key="index" :type="qh == item ? 'primary' : 'default'"
@click="qh = item" size="small">{{ item }}</el-button>
</template>
</PageTitle>
<FouColorWarning v-if="qh=='预警整合'" />
<SevenWarning v-if="qh=='七类重点'" />
<PortraitWarning v-if="qh=='人像预警'" />
<VehicleWarning v-if="qh=='车辆预警'" />
<ControlWarning v-if="qh=='布控预警'" />
<RegionalControl v-if="qh=='区域预警'" />
<WrjWarning v-if="qh=='无人机预警'" />
<IdentityWarning v-if="qh=='身份预警'" />
<BehaviorWarning v-if="qh=='行为预警'" />
<CombinedWarning v-if="qh=='组合预警'" />
<FouColorWarning v-if="qh == '预警整合'" />
<SevenWarning v-if="qh == '七类重点'" />
<PortraitWarning v-if="qh == '人像预警'" />
<VehicleWarning v-if="qh == '车辆预警'" />
<ControlWarning v-if="qh == '布控预警'" />
<RegionalControl v-if="qh == '区域预警'" />
<WrjWarning v-if="qh == '无人机预警'" />
<PoliticalSecurityWarning v-if="qh == '政保预警'" />
<IdentityWarning v-if="qh == '身份预警'" />
<BehaviorWarning v-if="qh == '行为预警'" />
<CombinedWarning v-if="qh == '组合预警'" />
<!-- <Cs v-if="qh == '测试'" /> -->
</div>
</template>
<script setup>
@ -30,23 +33,30 @@ import VehicleWarning from "@/views/backOfficeSystem/fourColorManage/warningList
import ControlWarning from "@/views/backOfficeSystem/fourColorManage/warningControl/controlWarning/index.vue"
import RegionalControl from "@/views/backOfficeSystem/fourColorManage/warningControl/regionalControl/index.vue"
import WrjWarning from "@/views/backOfficeSystem/fourColorManage/warningControl/wrjWarning/index.vue"
import PoliticalSecurityWarning from "@/views/backOfficeSystem/fourColorManage/warningControl/politicalSecurity/index.vue"
import Cs from '@/views/backOfficeSystem/ces/index.vue'
import { onMounted, ref } from "vue";
const butList=ref(["预警整合","七类重点","人像预警","车辆预警","布控预警","区域预警","无人机预警",])
const butList = ref(["七类重点", '政保预警', "人像预警", "车辆预警", "布控预警", "区域预警", "无人机预警", "预警整合",])
const qh = ref('预警整合')
const hasPermissin = ref(false)
onMounted(() => {
// rolCode : 市情指领导(JS_666666)、市情指权限(JS_777777)、县情指权限(JS_888888)、县情指领导权限(JS_999999);
// depCode : 市情指领导(513030199509084123 )、市情指(340827200404141028)、县情指领导(540421196805217650)、朗县公安局指挥中心(县情指)(540422200010197030)、朗县公安局县城派出所(部门)(513425199305205211)
let rolCode = ['JS_666666','JS_777777','JS_888888','JS_999999']
let depCode = ['513030199509084123','340827200404141028','540421196805217650','540422200010197030','513425199305205211']
let rolCode = ['JS_666666', 'JS_777777', 'JS_888888', 'JS_999999']
let depCode = ['513030199509084123', '340827200404141028', '540421196805217650', '540422200010197030', '513425199305205211']
let roleData = getItem('roleList');
let deptData = getItem('deptId');
roleData.forEach(item => {
if(rolCode.includes(item.roleCode)) hasPermissin.value = true
if (rolCode.includes(item.roleCode)) hasPermissin.value = true
})
deptData.forEach(item => {
if(depCode.includes(item.deptCode)) hasPermissin.value = true
if (depCode.includes(item.deptCode)) hasPermissin.value = true
})
if(hasPermissin.value) butList.value = [...butList.value,...["身份预警","行为预警","组合预警"]]
if (hasPermissin.value) {
const data = butList.value.filter(item => item !== "预警整合")
butList.value = [...data, ...["身份预警", "行为预警", "组合预警", "预警整合"]]
}
})
</script>

View File

@ -1,324 +0,0 @@
<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

@ -1,178 +0,0 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<!-- <el-button>
<span style="vertical-align: middle">调级</span>
</el-button>
<el-button>
<span style="vertical-align: middle">导出</span>
</el-button>
<el-button>
<span style="vertical-align: middle">导入</span>
</el-button> -->
<el-button size="small" type="primary" @click="addEdit('add', '')">
<el-icon style="vertical-align: middle">
<CirclePlus />
</el-icon>
<span style="vertical-align: middle">新增</span>
</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<template #bqYs="{ row }">
<DictTag :value="row.bqYs" :tag="false" :options="D_GS_SSYJ" />
</template>
<template #bqDj="{ row }">
<DictTag :tag="false" :value="row.bqDj" :options="D_GS_BQ_DJ" />
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="primary" @click="chooseJfFun(row)">配置系统</el-link>
<el-link type="primary" @click="addEdit('edit', row)">编辑</el-link>
<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>
<!-- 编辑详情 -->
<EditAddForm v-if="show" ref="detailDiloag" :dic="{ D_GS_BQ_LX, D_GS_BQ_DJ, D_GS_SSYJ, D_GS_BQ_LB }"
@updateDate="getList" />
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false"
:chooseJfBh="chooseJfBh" url="/tbGsxtBqzh/sjxspz" :roleIds="roleIds"/>
</div>
</template>
<script setup>
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import EditAddForm from "./components/editAddForm.vue";
import ChooseJf from '@/components/ChooseList/ChooseJf/index.vue'
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { tbGsxtBqzhId } from "@/api/yj.js";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
const { proxy } = getCurrentInstance();
const { D_GS_BQ_DJ, D_GS_SSYJ, D_GS_BQ_LB, D_GS_BQ_LX } = proxy.$dict("D_GS_BQ_DJ", "D_GS_SSYJ", "D_GS_BQ_LB", "D_GS_BQ_LX"); //获取字典数据
const detailDiloag = ref();
const show = ref(false)
const searchBox = ref(); //搜索框
const searchConfiger = ref(
[
{ label: "组合标签名称", prop: 'bqMc', placeholder: "请输入组合标签名称", showType: "input" },
// { label: "组合标签标签等级", prop: 'bqDj', placeholder: "请选择组合标签标签等级", showType: "select",options: D_GS_BQ_DJ },
{ label: "组合标签颜色", prop: 'bqYs', placeholder: "请选择组合标签标签颜色", showType: "select", options: D_GS_SSYJ },
]);
const queryFrom = ref({});
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 160, //操作栏宽度
tableColumn: [
{ label: "组合标签名称", prop: "bqMc" },
{ label: "标签代码", prop: "bqDm" },
// { label: "组合标签等级", prop: "bqDj",showSolt:true },
{ label: "组合标签颜色", prop: "bqYs", showSolt: true },
{ label: "组合标签分值", prop: "bqFz" },
{ label: "组合标签说明", prop: "bqSm", showOverflowTooltip: true },
]
});
onMounted(() => {
tabHeightFn();
getList()
});
// 搜索
const onSearch = (val) => {
queryFrom.value = { ...val }
pageData.pageConfiger.pageCurrent = 1;
getList()
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList()
}
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList()
}
const getList = () => {
pageData.tableConfiger.loading = true;
qcckGet(queryFrom.value, '/mosty-gsxt/tbGsxtBqzh/selectPage').then((res) => {
pageData.tableData = res.records;
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
})
}
// 删除
const delDictItem = (id) => {
proxy.$confirm("确定要删除", "警告", { type: "warning" }).then(() => {
qcckDelete({}, '/mosty-gsxt/tbGsxtBqzh/' + id).then(() => {
proxy.$message({ type: "success", message: "删除成功" });
getList();
})
}).catch(() => { });
}
// 新增
const addEdit = (type, row) => {
show.value = true;
nextTick(() => {
detailDiloag.value.init(type, row,);
})
};
// 选择系数
const chooseJfShow = ref(false)
const chooseJfBh = ref()
const roleIds=ref()
const chooseJfFun = (val) => {
chooseJfBh.value=val.id
tbGsxtBqzhId(val.id).then(res => {
roleIds.value=res.sjxspzList.map(item => item.xsid)
chooseJfShow.value = true
})
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 270;
window.onresize = function () {
tabHeightFn();
};
};
</script>
<style>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
</style>

View File

@ -0,0 +1,415 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<Searchs :searchArr="searchConfiger" @submit="onSearch" @reset="reset" :key="pageData.keyCount">
<template #jfd>
<div>
<el-input v-model="queryFrom.ksfz" type="number" placeholder="开始身份分值" style="width: 130px"></el-input>
<span style="color: #333;margin: 0 4px;"></span>
<el-input v-model="queryFrom.jsfz" type="number" placeholder="结束身份分值" style="width: 130px"></el-input>
</div>
</template>
</Searchs>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox tabBox_zdy" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
:expand="true" @chooseData="handleChooseData">
<template #xwcs="{ row }">
<span style="color: #0072ff;" @click="handleClick(row)">{{ row.xwcs }}</span>
</template>
<template #bqys="{ row }">
<DictTag :value="row.bqys" :tag="false" :color="bqYs(row.bqys)" :options="D_GS_SSYJ" />
</template>
<template #czzt="{ row }">
<DictTag :value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
</template>
<template #xwfz>
<el-table-column prop="bqfz" width="80" align="center" label="标签分值" />
<el-table-column prop="pzxs" width="60" align="center" label="系数" />
<el-table-column prop="xwfz" width="90" align="center" label="计算分值"/>
</template>
<template #expand="{ props }">
<div class="expand-content" style="max-width: 100%">
<Items :row="props" :dict="dict" />
</div>
</template>
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<el-link type="primary" @click="chooseJfFun(row)" >配置系统</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link>
<el-link type="danger" @click="delDictItem(row.id)">转会商</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs ">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')" v-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<el-link type="primary" @click="openAddModel(row)">详情</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
<!-- 详情 -->
<Detail ref="detailRef"></Detail>
<HolographicArchive v-model="assessShow" :dataList="dataList" />
<FkDialog @change="getList" lx="02" />
<Information v-model="showDialog" title="发送指令" @submit='submit' @close='closeFszl'>
<SemdFqzl
ref="semdFqzlRef"
:itemData="itemData"
@handleClose="handleClose"
identification="yj"
:tacitly="tacitly" />
</Information>
<!-- 详情 -->
<AddFrom ref="addModelRef" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_GS_SSYJ }"></AddFrom>
<!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false"
:chooseJfBh="chooseJfBh" url="/yjzxXwyj/sjxspz" :roleIds="roleIds"/>
</template>
<script setup>
import Czjy from './components/czjy.vue'
import { getItem, setItem } from '@/utils/storage'
import * as XLSX from "xlsx";
import Detail from './components/detail.vue'
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Searchs from "@/components/aboutTable/Search.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Items from "./item/items.vue";
import {yjzxXwyjSelectList } from "@/api/yj.js";
import ChooseJf from '@/components/ChooseList/ChooseJf/index.vue'
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import { tbGsxtBqglSelectList } from '@/api/zdr'
import Information from "@/views/home/model/information.vue";
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import emitter from "@/utils/eventBus.js";
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import { reactive, ref, onMounted, getCurrentInstance, computed, watch, nextTick } from "vue";
import AddFrom from './components/addFrom.vue'
import { holographicProfileJump } from "@/utils/tools.js"
import { getMultiDictVal } from "@/utils/dict.js"
import { exportExlByObj } from "@/utils/exportExcel.js"
const czjyRef = ref()
const permission_sfqs = ref(false)
const roleCode = ref(false)
const { proxy } = getCurrentInstance();
const { D_BZ_YJJB,D_GS_SSYJ, D_GSXT_YJXX_CZZT } = proxy.$dict('D_BZ_YJJB',"D_GS_SSYJ", "D_GSXT_YJXX_CZZT"); //获取字典数据
// 字典数据集合
const dict = ref({
D_GS_SSYJ,
D_GSXT_YJXX_CZZT
})
const searchBox = ref(); //搜索框
/** 选中项 */
const selectRows = ref([])
const bqLbData = ref({
bqXl: []
})
const searchConfiger = ref(
[
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "电话号码", prop: 'dh', placeholder: "请输入电话号码", showType: "input" },
{ label: "预警标签", prop: 'xwms', placeholder: "请输入预警标签", showType: "input" },
{ label: "部门", prop: 'ssbmdm', placeholder: "请选择部门", showType: "department" },
{ label: "级别", prop: 'bqys', placeholder: "请选择级别", showType: "select" ,options: D_BZ_YJJB},
{ label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" },
{ label: "预警时间", prop: 'times', showType: "datetimerange" },
]);
const detailRef = ref()
const queryFrom = ref({});
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkBox",
loading: false,
haveControls: true
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 300, //操作栏宽度
tableColumn: [
{ label: "状态", prop: "czzt", showSolt: true },
{ label: "预警时间", prop: "yjsj" },
{ label: "姓名", prop: "xm" },
{ label: "身份证号", prop: "sfzh" },
{ label: "标签", prop: "xwms" },
{ label: "接收单位", prop: "ssbm" },
{ label: "活动频次", prop: "xwcs", showSolt: true,width: 90 },
{ label: "预警分值", prop: "xwfz",showSolt: true },
]
});
const gettbGsxtBqglSelectList = (val) => {
tbGsxtBqglSelectList({ bqLx: '02', bqlb: val, bqDlId: '241cc7b69a50428287cc79445e310180' }).then((res) => {
bqLbData.value.bqXl = res.map(item => {
return {
label: item.bqMc,
value: item.id
}
}) || []
})
}
onMounted(() => {
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
permission_sfqs.value = str.startsWith('2'||'3') ? false : true;
let rols = getItem('roleList') ? getItem('roleList'):[]
let obj = rols.find(item => {
return ['JS_666666','JS_777777','JS_888888'].includes(item.roleCode)
})
roleCode.value = obj ? true : false;
tabHeightFn();
getList()
gettbGsxtBqglSelectList('02')
});
const handleCzjy = (row) => {
czjyRef.value.init( row)
}
// 搜索
const onSearch = (val) => {
queryFrom.value = { ...queryFrom.value,...val };
queryFrom.value.startTime = val.times ? val.times[0] : ''
queryFrom.value.endTime = val.times ? val.times[1] : ''
pageData.pageConfiger.pageCurrent = 1;
getList()
}
const reset = () => {
delete queryFrom.value.ksfz
delete queryFrom.value.jsfz
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList()
}
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList()
}
const getList = () => {
pageData.tableConfiger.loading = true;
const promes = {
...queryFrom.value,
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize
}
delete promes.times;
qcckGet(promes, '/mosty-gsxt/yjzxXwyj/getPageList').then((res) => {
pageData.total = res.total || 0;
pageData.tableConfiger.loading = false;
pageData.tableData = res.records.map(item => {
return { ...item }
}) || [];
}).catch(() => {
pageData.tableConfiger.loading = false;
})
}
const handleClick = (row) => {
detailRef.value.init(row)
}
const exportExcel = () => {
if (pageData.tableData.length === 0) return ElMessage({ message: "暂无数据", type: "warning" });
const headers = pageData.tableColumn.map(item => item.label);
const data = pageData.tableData.map(item => {
return [item.xm, item.sfzh, item.dh, item.xldlmc, item.xwzlmc, item.xwms, item.xwcs, item.xwfz];
});
const worksheet = XLSX.utils.aoa_to_sheet([headers, ...data]);
const workbook = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(workbook, worksheet, "sheet1");
XLSX.writeFile(workbook, "行为预警.xlsx");
}
const bqYs = (val) => {
if (val == '01') { // 红
return '#ff0202'
} else if (val == '02') { // 橙
return '#ff8c00'
} else if (val == '03') { // 黄
return '#c2c203' // 原亮黄色ffff00
} else if (val == '04') { // 蓝
return '#0000ff'
}
}
// 全息档案
const assessShow = ref(false)
const dataList = ref()
const pushAssess = (val) => {
return holographicProfileJump(val.yjlx,val) // 全息档案跳转
// assessShow.value = true;
// dataList.value = val;
}
// 发送指令
const showDialog = ref(false)
const itemData = ref()
const showDetail = (item) => {
showDialog.value = true;
itemData.value = item
}
const handleClose = () => {
showDialog.value = false;
}
const semdFqzlRef = ref()
const tacitly = {
title: 'yjbt',
instructionContent: 'yjnr'
}
const submit = () => {
semdFqzlRef.value.getsendFqzl()
}
const closeFszl = () => {
semdFqzlRef.value.close()
}
// 处理签收
const handleQsFk = (val, type) => {
switch (type) {
case '签收':
proxy.$confirm("是否确定要签收?", "警告", { type: "warning" }).then(() => {
qcckPost({ id: val.id }, "/mosty-gsxt/yjzxXwyj/yjqs").then(() => {
val.czzt = '02'
getList()
proxy.$message({ type: "success", message: "签收成功" });
});
})
break;
case '反馈':
case '查看反馈':
emitter.emit("openFkDialog", { id: val.id, type });
break;
}
}
const addModelRef = ref(null)
const openAddModel = (row) => {
console.log(row);
addModelRef.value.init(row)
}
// 选择系数
const chooseJfShow = ref(false)
const chooseJfBh = ref()
const roleIds=ref()
const chooseJfFun = (val) => {
chooseJfBh.value=val.id
yjzxXwyjSelectList(val.id).then(res => {
roleIds.value=res.sjxspzList.map(item => item.xsid)
chooseJfShow.value = true
})
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 280;
window.onresize = function() {
tabHeightFn();
};
};
/** 触发选中 */
const handleChooseData = (val) => {
selectRows.value = val
}
const exportExl = () => {
const titleObj = {
czzt_cname: "状态",
yjsj: "预警时间",
xm: "姓名",
sfzh: "身份证号",
xwms: "标签",
ssbm: "接收单位",
sfcs: "活动频次",
sffz: "预警分值",
}
/** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
const data = needArr.map(item => {
return {
...item,
bqys_cname: getMultiDictVal(item.bqys, D_GS_SSYJ),
czzt_cname: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
}
})
exportExlByObj(titleObj, data, '行为预警')
}
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ids}, '/mosty-gsxt/yjzxXwyj/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
</script>
<style lang="scss">
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
/** 方便查看对应的颜色, */
.test-top-color {
color: #ff0202;
background-color: #ff8c00;
border-color: #c2c203;
outline-color: #0000ff;
}
.tabBox_zdy{
.el-table--fit {
overflow: unset !important;
}
}
</style>

View File

@ -2,7 +2,7 @@
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<Searchs :searchArr="searchConfiger" @submit="onSearch" @reset="reset" :key="pageData.keyCount">
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search='onSearch'>
<template #jfd>
<div>
<el-input v-model="queryFrom.ksfz" type="number" placeholder="开始身份分值" style="width: 130px"></el-input>
@ -10,24 +10,24 @@
<el-input v-model="queryFrom.jsfz" type="number" placeholder="结束身份分值" style="width: 130px"></el-input>
</div>
</template>
</Searchs>
<template #but>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</QueryFormPanel>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox tabBox_zdy" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
:expand="true" @chooseData="handleChooseData">
<div class="bgTable" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
<WarnDataTable :loading="pageData.tableConfiger.loading" :tableHeight="pageData.tableHeight"
:data="pageData.tableData" :columns="pageData.tableColumn" table-class="warn-table"
@selectionChange="handleChooseData">
<template #xwcs="{ row }">
<span style="color: #0072ff;" @click="handleClick(row)">{{ row.xwcs }}</span>
</template>
<template #bqys="{ row }">
<DictTag :value="row.bqys" :tag="false" :color="bqYs(row.bqys)" :options="D_GS_SSYJ" />
<div :style="{ 'background-color': bqYs(row.bqys) }">
<DictTag :value="row.bqys" :tag="false" color="#fff" :options="D_GS_SSYJ" />
</div>
</template>
<template #czzt="{ row }">
<DictTag :value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
@ -35,25 +35,19 @@
<template #xwfz>
<el-table-column prop="bqfz" width="80" align="center" label="标签分值" />
<el-table-column prop="pzxs" width="60" align="center" label="系数" />
<el-table-column prop="xwfz" width="90" align="center" label="计算分值"/>
<el-table-column prop="xwfz" width="90" align="center" label="计算分值" />
</template>
<template #expand="{ props }">
<div class="expand-content" style="max-width: 100%">
<Items :row="props" :dict="dict" />
<template #operation="{ row }">
<div style="display: flex;justify-content: space-between;">
<span class="warning" @click="pushAssess(row)">全息档案</span>
<span class="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</span>
<span class="primary" @click="chooseJfFun(row)">配置系统</span>
<span class="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</span>
<span class="success" @click="handleQsFk(row, '反馈')" v-if="row.czzt == '02' && permission_sfqs">反馈</span>
<span class="primary" @click="openAddModel(row)">详情</span>
</div>
</template>
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<el-link type="primary" @click="chooseJfFun(row)" >配置系统</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link>
<el-link type="danger" @click="delDictItem(row.id)">转会商</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs ">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')" v-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<el-link type="primary" @click="openAddModel(row)">详情</el-link>
</template>
</MyTable>
</WarnDataTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
@ -65,33 +59,26 @@
<HolographicArchive v-model="assessShow" :dataList="dataList" />
<FkDialog @change="getList" lx="02" />
<Information v-model="showDialog" title="发送指令" @submit='submit' @close='closeFszl'>
<SemdFqzl
ref="semdFqzlRef"
:itemData="itemData"
@handleClose="handleClose"
identification="yj"
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj"
:tacitly="tacitly" />
</Information>
<!-- 详情 -->
<AddFrom ref="addModelRef" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_GS_SSYJ }"></AddFrom>
<!-- 处置建议 -->
<!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false"
:chooseJfBh="chooseJfBh" url="/yjzxXwyj/sjxspz" :roleIds="roleIds"/>
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false" :chooseJfBh="chooseJfBh" url="/yjzxXwyj/sjxspz"
:roleIds="roleIds" />
</template>
<script setup>
import Czjy from './components/czjy.vue'
import { getItem, setItem } from '@/utils/storage'
import * as XLSX from "xlsx";
import { getItem } from '@/utils/storage'
import Detail from './components/detail.vue'
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Searchs from "@/components/aboutTable/Search.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import WarnDataTable from '@/views/backOfficeSystem/ces/components/WarnDataTable.vue'
import QueryFormPanel from "@/views/backOfficeSystem/ces/components/QueryFormPanel.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Items from "./item/items.vue";
import {yjzxXwyjSelectList } from "@/api/yj.js";
import { yjzxXwyjSelectList } from "@/api/yj.js";
import ChooseJf from '@/components/ChooseList/ChooseJf/index.vue'
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
@ -100,16 +87,17 @@ import Information from "@/views/home/model/information.vue";
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import emitter from "@/utils/eventBus.js";
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import { reactive, ref, onMounted, getCurrentInstance, computed, watch, nextTick } from "vue";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import AddFrom from './components/addFrom.vue'
import { holographicProfileJump } from "@/utils/tools.js"
import { getMultiDictVal } from "@/utils/dict.js"
import { exportExlByObj } from "@/utils/exportExcel.js"
import { bqYs } from '@/utils/tools.js'
const czjyRef = ref()
const permission_sfqs = ref(false)
const roleCode = ref(false)
const { proxy } = getCurrentInstance();
const { D_BZ_YJJB,D_GS_SSYJ, D_GSXT_YJXX_CZZT } = proxy.$dict('D_BZ_YJJB',"D_GS_SSYJ", "D_GSXT_YJXX_CZZT"); //获取字典数据
const { D_BZ_YJJB, D_GS_SSYJ, D_GSXT_YJXX_CZZT } = proxy.$dict('D_BZ_YJJB', "D_GS_SSYJ", "D_GSXT_YJXX_CZZT"); //获取字典数据
// 字典数据集合
const dict = ref({
@ -125,17 +113,18 @@ const bqLbData = ref({
const searchConfiger = ref(
[
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "电话号码", prop: 'dh', placeholder: "请输入电话号码", showType: "input" },
{ label: "预警标签", prop: 'xwms', placeholder: "请输入预警标签", showType: "input" },
{ label: "部门", prop: 'ssbmdm', placeholder: "请选择部门", showType: "department" },
{ label: "级别", prop: 'bqys', placeholder: "请选择级别", showType: "select" ,options: D_BZ_YJJB},
{ label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" },
{ label: "预警时间", prop: 'times', showType: "datetimerange" },
{ key: 'xm', label: "姓名", placeholder: "请输入姓名", type: "input" },
{ key: 'sfzh', label: "身份证号码", placeholder: "请输入身份证号码", type: "input" },
{ key: 'dh', label: "电话号码", placeholder: "请输入电话号码", type: "input" },
{ key: 'xwms', label: "预警标签", placeholder: "请输入预警标签", type: "input" },
{ key: 'ssbmdm', label: "部门", placeholder: "请选择部门", type: "department" },
{ key: 'bqys', label: "级别", placeholder: "请选择级别", type: "select", options: D_BZ_YJJB },
{ key: 'jfd', label: "积分段", placeholder: "请选择积分段", type: "Slot" },
{ key: 'startTime', label: "预警时间", type: "datetimerange" },
]);
const detailRef = ref()
const listQuery = ref({});
const queryFrom = ref({});
const pageData = reactive({
tableData: [], //表格数据
@ -153,14 +142,16 @@ const pageData = reactive({
}, //分页
controlsWidth: 300, //操作栏宽度
tableColumn: [
{ label: "状态", prop: "czzt", showSolt: true },
{ label: "预警时间", prop: "yjsj" },
{ label: "姓名", prop: "xm" },
{ label: "身份证号", prop: "sfzh" },
{ label: "标签", prop: "xwms" },
{ type: 'index', label: '序号', width: 55, align: 'center' },
{ label: "状态", slotName: "czzt", width: 100 },
{ label: "预警时间", prop: "yjsj", width: 200 },
{ label: "姓名", prop: "xm", width: 100 },
{ label: "身份证号", prop: "sfzh", width: 170 },
{ label: "标签", prop: "xwms", width: 120 },
{ label: "接收单位", prop: "ssbm" },
{ label: "活动频次", prop: "xwcs", showSolt: true,width: 90 },
{ label: "预警分值", prop: "xwfz",showSolt: true },
{ label: "活动频次", slotName: "xwcs", width: 90, align: 'center' },
{ label: "预警分值", slotName: "xwfz", width: 230 },
{ label: '操作', width: 300, slotName: 'operation', align: 'center' },
]
});
@ -178,11 +169,11 @@ const gettbGsxtBqglSelectList = (val) => {
onMounted(() => {
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
permission_sfqs.value = str.startsWith('2'||'3') ? false : true;
permission_sfqs.value = str.startsWith('2' || '3') ? false : true;
let rols = getItem('roleList') ? getItem('roleList'):[]
let rols = getItem('roleList') ? getItem('roleList') : []
let obj = rols.find(item => {
return ['JS_666666','JS_777777','JS_888888'].includes(item.roleCode)
return ['JS_666666', 'JS_777777', 'JS_888888'].includes(item.roleCode)
})
roleCode.value = obj ? true : false;
@ -193,14 +184,14 @@ onMounted(() => {
});
const handleCzjy = (row) => {
czjyRef.value.init( row)
czjyRef.value.init(row)
}
// 搜索
const onSearch = (val) => {
queryFrom.value = { ...queryFrom.value,...val };
queryFrom.value.startTime = val.times ? val.times[0] : ''
queryFrom.value.endTime = val.times ? val.times[1] : ''
queryFrom.value = { ...queryFrom.value, ...val };
queryFrom.value.startTime = val.startTime ? val.startTime[0] : ''
queryFrom.value.endTime = val.startTime ? val.startTime[1] : ''
pageData.pageConfiger.pageCurrent = 1;
getList()
}
@ -223,7 +214,7 @@ const getList = () => {
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize
}
delete promes.times;
delete promes.startTime;
qcckGet(promes, '/mosty-gsxt/yjzxXwyj/getPageList').then((res) => {
pageData.total = res.total || 0;
pageData.tableConfiger.loading = false;
@ -238,34 +229,11 @@ const getList = () => {
const handleClick = (row) => {
detailRef.value.init(row)
}
const exportExcel = () => {
if (pageData.tableData.length === 0) return ElMessage({ message: "暂无数据", type: "warning" });
const headers = pageData.tableColumn.map(item => item.label);
const data = pageData.tableData.map(item => {
return [item.xm, item.sfzh, item.dh, item.xldlmc, item.xwzlmc, item.xwms, item.xwcs, item.xwfz];
});
const worksheet = XLSX.utils.aoa_to_sheet([headers, ...data]);
const workbook = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(workbook, worksheet, "sheet1");
XLSX.writeFile(workbook, "行为预警.xlsx");
}
const bqYs = (val) => {
if (val == '01') { // 红
return '#ff0202'
} else if (val == '02') { // 橙
return '#ff8c00'
} else if (val == '03') { // 黄
return '#c2c203' // 原亮黄色ffff00
} else if (val == '04') { // 蓝
return '#0000ff'
}
}
// 全息档案
const assessShow = ref(false)
const dataList = ref()
const pushAssess = (val) => {
return holographicProfileJump(val.yjlx,val) // 全息档案跳转
return holographicProfileJump(val.yjlx, val) // 全息档案跳转
// assessShow.value = true;
// dataList.value = val;
}
@ -274,10 +242,6 @@ const pushAssess = (val) => {
// 发送指令
const showDialog = ref(false)
const itemData = ref()
const showDetail = (item) => {
showDialog.value = true;
itemData.value = item
}
const handleClose = () => {
showDialog.value = false;
}
@ -327,20 +291,20 @@ const openAddModel = (row) => {
// 选择系数
const chooseJfShow = ref(false)
const chooseJfBh = ref()
const roleIds=ref()
const roleIds = ref()
const chooseJfFun = (val) => {
chooseJfBh.value=val.id
chooseJfBh.value = val.id
yjzxXwyjSelectList(val.id).then(res => {
roleIds.value=res.sjxspzList.map(item => item.xsid)
chooseJfShow.value = true
})
roleIds.value = res.sjxspzList.map(item => item.xsid)
chooseJfShow.value = true
})
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 280;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function() {
window.onresize = function () {
tabHeightFn();
};
};
@ -375,14 +339,14 @@ const exportExl = () => {
}
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ids}, '/mosty-gsxt/yjzxXwyj/batchQs').then(() => {
qcckPost({ ids }, '/mosty-gsxt/yjzxXwyj/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
@ -393,7 +357,7 @@ const handleQs = () => {
</script>
<style lang="scss">
<style lang="scss" scoped>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
@ -406,10 +370,13 @@ const handleQs = () => {
outline-color: #0000ff;
}
.tabBox_zdy{
.tabBox_zdy {
.el-table--fit {
overflow: unset !important;
}
}
.bgTable {
background-color: #fff;
}
</style>

View File

@ -0,0 +1,387 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox">
<Searchs :searchArr="searchConfiger" @submit="onSearch" @reset="reset" :key="pageData.keyCount">
<template #jfd>
<div>
<el-input v-model="queryFrom.ksfz" type="number" placeholder="开始身份分值" style="width: 130px"></el-input>
<span style="color: #333;margin: 0 4px;"></span>
<el-input v-model="queryFrom.jsfz" type="number" placeholder="结束身份分值" style="width: 130px"></el-input>
</div>
</template>
</Searchs>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox tabBox_zdy" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
:expand="true" @chooseData="handleChooseData">
<template #sfcs="{ row }">
<span style="color: #0072ff;" @click="handleClick(row)">{{ row.sfcs }}</span>
</template>
<template #bqys="{ row }">
<DictTag :value="row.bqys" :tag="false" :color="bqYs(row.bqys)" :options="D_GS_SSYJ" />
</template>
<template #czzt="{ row }">
<DictTag :value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
</template>
<template #sffz>
<el-table-column prop="bqfz" width="80" align="center" label="标签分值" />
<el-table-column prop="pzxs" width="60" align="center" label="系数" />
<el-table-column prop="sffz" width="90" align="center" label="计算分值"/>
</template>
<template #expand="{ props }">
<div>
<Items :row="props || {}" :dict="dict" />
</div>
</template>
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<el-link type="primary" @click="chooseJfFun(row)">配置系统</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link>
<el-link type="danger" @click="delDictItem(row.id)">转会商</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<el-link type="primary" @click="openAddModel(row)">详情</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
<Detail ref="detailRef" />
<HolographicArchive v-model="assessShow" :dataList="dataList" />
<FkDialog @change="getList" lx="04" />
<Information v-model="showDialog" title="发送指令" @submit='submit' @close='closeFszl'>
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj"
:tacitly="tacitly" />
</Information>
<AddFrom ref="addModelRef" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_GS_SSYJ }" />
<!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false" :chooseJfBh="chooseJfBh" url="/yjzxZhyj/sjxspz"
:roleIds="roleIds" />
</template>
<script setup>
import Czjy from './components/czjy.vue'
import { getItem, setItem } from '@/utils/storage'
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Searchs from "@/components/aboutTable/Search.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Items from "./item/items.vue";
import ChooseJf from '@/components/ChooseList/ChooseJf/index.vue'
import { tbYjxxGetZbtj, tbGsxtBqzhSelectList, yjzxZhyjSelectList } from '@/api/yj.js'
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import Information from "@/views/home/model/information.vue";
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import AddFrom from "./components/addFrom.vue";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import Detail from './components/detail.vue'
import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js"
import emitter from "@/utils/eventBus.js";
const permission_sfqs = ref(false)
const roleCode = ref(false)
const searchBox = ref();
const czjyRef = ref()
const { proxy } = getCurrentInstance();
const { D_GSXT_YJXX_CZZT, D_GS_SSYJ, D_BZ_YJJB } = proxy.$dict("D_GSXT_YJXX_CZZT", "D_GS_SSYJ", "D_BZ_YJJB");
// 字典数据集合
const dict = ref({
D_GS_SSYJ,
D_GSXT_YJXX_CZZT
})
import { holographicProfileJump } from "@/utils/tools.js"
// 搜索配置
const searchConfiger = ref([
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "预警标签", prop: 'yjbqmc', placeholder: "请输入预警标签", showType: "input" },
{ label: "部门", prop: 'ssbmdm', placeholder: "请选择部门", showType: "department" },
{ label: "级别", prop: 'bqys', placeholder: "请选择级别", showType: "select", options: D_BZ_YJJB },
{ label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" },
{ label: "预警时间", prop: 'times', showType: "datetimerange" },
]);
const queryFrom = ref({});
// 页面数据
const pageData = reactive({
tableData: [{ sfcs: 1 }],
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkBox",
loading: false,
haveControls: true,
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
},
controlsWidth: 300,
tableColumn: [
{ label: "状态", prop: "czzt", showSolt: true },
{ label: "预警时间", prop: "yjsj" },
{ label: "姓名", prop: "xm" },
{ label: "身份证号", prop: "sfzh" },
{ label: "标签", prop: "yjbqmc" },
{ label: "接收单位", prop: "ssbm" },
{ label: "活动频次", prop: "sfcs",width:'90' },
{ label: "预警分值", prop: "sffz",showSolt: true },
]
});
onMounted(() => {
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
permission_sfqs.value = str.startsWith('2' || '3') ? false : true;
let rols = getItem('roleList') ? getItem('roleList') : []
let obj = rols.find(item => {
return ['JS_666666', 'JS_777777', 'JS_888888'].includes(item.roleCode)
})
roleCode.value = obj ? true : false;
tabHeightFn();
getList();
gettbGsxtBqglSelectList()
});
const handleCzjy = (row) => {
czjyRef.value.init(row)
}
const onSearch = (val) => {
queryFrom.value = { ...queryFrom.value, ...val };
queryFrom.value.startTime = val.times ? val.times[0] : ''
queryFrom.value.endTime = val.times ? val.times[1] : ''
pageData.pageConfiger.pageCurrent = 1;
getList();
};
const reset = () => {
delete queryFrom.value.ksfz
delete queryFrom.value.jsfz
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList();
};
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList();
};
const getList = () => {
pageData.tableConfiger.loading = true;
// TODO: 替换为实际的组合预警API接口
const promes = {
...queryFrom.value,
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize
}
delete promes.times;
tbYjxxGetZbtj(promes).then((res) => {
pageData.tableData = res.records || [];
pageData.total = res.total || 0;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
});
};
const bqYs = (val) => {
if (val == '01') {
return '#ff0202'
} else if (val == '02') {
return '#ff8c00'
} else if (val == '03') {
return '#e6a23c'
} else if (val == '04') {
return '#0000ff'
}
}
const bqLbData = ref({
bqXl: []
})
const gettbGsxtBqglSelectList = (val) => {
tbGsxtBqzhSelectList({}).then((res) => {
bqLbData.value.bqXl = res.map(item => {
return {
label: item.bqMc,
value: item.bqDm
}
}) || []
})
}
// 查看详情
const detailRef = ref()
const handleClick = (row) => {
detailRef.value.init(row)
}
const assessShow = ref(false)
/** 选中项 */
const selectRows = ref([])
const dataList = ref()
const pushAssess = (val) => {
return holographicProfileJump(val.yjlx, val) // 全息档案跳转
// assessShow.value = true;
// dataList.value = val;
}
// 发送指令
const showDialog = ref(false)
const itemData = ref()
const showDetail = (item) => {
showDialog.value = true;
itemData.value = item
}
const handleClose = () => {
showDialog.value = false;
}
const semdFqzlRef = ref()
const tacitly = {
title: 'yjbt',
instructionContent: 'yjnr'
}
const submit = () => {
semdFqzlRef.value.getsendFqzl()
}
const closeFszl = () => {
semdFqzlRef.value.close()
}
// 处理签收
const handleQsFk = (val, type) => {
switch (type) {
case '签收':
proxy.$confirm("是否确定要签收?", "警告", { type: "warning" }).then(() => {
qcckPost({ id: val.id }, "/mosty-gsxt/yjzxZhyj/yjqs").then(() => {
val.czzt = '02'
getList()
proxy.$message({ type: "success", message: "签收成功" });
});
})
break;
case '反馈':
case '查看反馈':
emitter.emit("openFkDialog", { id: val.id, type });
break;
}
}
const addModelRef = ref(null)
const openAddModel = (row) => {
console.log(row);
addModelRef.value.init(row)
}
// 选择系数
const chooseJfShow = ref(false)
const chooseJfBh = ref()
const roleIds = ref()
const chooseJfFun = (val) => {
chooseJfBh.value = val.id
yjzxZhyjSelectList(val.id).then(res => {
roleIds.value = res.sjxspzList.map(item => item.xsid)
chooseJfShow.value = true
})
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 270;
window.onresize = function () {
tabHeightFn();
};
};
const handleChooseData = (val) => {
selectRows.value = val
}
const exportExl = () => {
const titleObj = {
czzt_cname: "状态",
yjsj: "预警时间",
xm: "姓名",
sfzh: "身份证号",
yjbqmc: "标签",
ssbm: "接收单位",
sfcs: "活动频次",
sffz: "预警分值",
}
/** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
const data = needArr.map(item => {
return {
...item,
bqys_cname: getMultiDictVal(item.bqys, D_GS_SSYJ),
czzt_cname: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
}
})
exportExlByObj(titleObj, data, '组合预警')
}
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ids}, '/mosty-gsxt/yjzxZhyj/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
</script>
<style lang="scss">
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
.tabBox_zdy {
.el-table--fit {
overflow: unset !important;
}
}
</style>

View File

@ -3,7 +3,7 @@
<!-- 搜索 -->
<div ref="searchBox">
<Searchs :searchArr="searchConfiger" @submit="onSearch" @reset="reset" :key="pageData.keyCount">
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search='onSearch'>
<template #jfd>
<div>
<el-input v-model="queryFrom.ksfz" type="number" placeholder="开始身份分值" style="width: 130px"></el-input>
@ -11,24 +11,24 @@
<el-input v-model="queryFrom.jsfz" type="number" placeholder="结束身份分值" style="width: 130px"></el-input>
</div>
</template>
</Searchs>
<template #but>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</QueryFormPanel>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox tabBox_zdy" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
:expand="true" @chooseData="handleChooseData">
<div class=" tabBox_zdy" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
<WarnDataTable :loading="pageData.tableConfiger.loading" :tableHeight="pageData.tableHeight"
:data="pageData.tableData" :columns="pageData.tableColumn" table-class="warn-table"
@selectionChange="handleChooseData">
<template #sfcs="{ row }">
<span style="color: #0072ff;" @click="handleClick(row)">{{ row.sfcs }}</span>
</template>
<template #bqys="{ row }">
<DictTag :value="row.bqys" :tag="false" :color="bqYs(row.bqys)" :options="D_GS_SSYJ" />
<div :style="{ 'background-color': bqYs(row.bqys) }">
<DictTag :value="row.bqys" :tag="false" color="#fff" :options="D_GS_SSYJ" />
</div>
</template>
<template #czzt="{ row }">
<DictTag :value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
@ -36,26 +36,20 @@
<template #sffz>
<el-table-column prop="bqfz" width="80" align="center" label="标签分值" />
<el-table-column prop="pzxs" width="60" align="center" label="系数" />
<el-table-column prop="sffz" width="90" align="center" label="计算分值"/>
<el-table-column prop="sffz" width="90" align="center" label="计算分值" />
</template>
<template #expand="{ props }">
<div>
<Items :row="props || {}" :dict="dict" />
<template #operation="{ row }">
<div style="display: flex;justify-content: space-between;">
<span class="warning" @click="pushAssess(row)">全息档案</span>
<span class="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</span>
<span class="primary" @click="chooseJfFun(row)">配置系统</span>
<span class="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</span>
<span class="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</span>
<span class="primary" @click="openAddModel(row)">详情</span>
</div>
</template>
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<el-link type="primary" @click="chooseJfFun(row)">配置系统</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link>
<el-link type="danger" @click="delDictItem(row.id)">转会商</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<el-link type="primary" @click="openAddModel(row)">详情</el-link>
</template>
</MyTable>
</WarnDataTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
@ -79,12 +73,10 @@
<script setup>
import Czjy from './components/czjy.vue'
import { getItem, setItem } from '@/utils/storage'
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Searchs from "@/components/aboutTable/Search.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import { getItem } from '@/utils/storage'
import WarnDataTable from '@/views/backOfficeSystem/ces/components/WarnDataTable.vue'
import QueryFormPanel from "@/views/backOfficeSystem/ces/components/QueryFormPanel.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Items from "./item/items.vue";
import ChooseJf from '@/components/ChooseList/ChooseJf/index.vue'
import { tbYjxxGetZbtj, tbGsxtBqzhSelectList, yjzxZhyjSelectList } from '@/api/yj.js'
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
@ -92,12 +84,13 @@ import Information from "@/views/home/model/information.vue";
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import AddFrom from "./components/addFrom.vue";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { qcckPost } from "@/api/qcckApi.js";
import Detail from './components/detail.vue'
import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js"
import emitter from "@/utils/eventBus.js";
import { bqYs } from '@/utils/tools.js'
const permission_sfqs = ref(false)
const roleCode = ref(false)
const searchBox = ref();
@ -114,15 +107,16 @@ import { holographicProfileJump } from "@/utils/tools.js"
// 搜索配置
const searchConfiger = ref([
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "预警标签", prop: 'yjbqmc', placeholder: "请输入预警标签", showType: "input" },
{ label: "部门", prop: 'ssbmdm', placeholder: "请选择部门", showType: "department" },
{ label: "级别", prop: 'bqys', placeholder: "请选择级别", showType: "select", options: D_BZ_YJJB },
{ label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" },
{ label: "预警时间", prop: 'times', showType: "datetimerange" },
{ key: 'xm', label: "姓名", placeholder: "请输入姓名", type: "input" },
{ key: 'sfzh', label: "身份证号码", placeholder: "请输入身份证号码", type: "input" },
{ key: 'yjbqmc', label: "预警标签", placeholder: "请输入预警标签", type: "input" },
{ key: 'ssbmdm', label: "部门", placeholder: "请选择部门", type: "department" },
{ key: 'bqys', label: "级别", placeholder: "请选择级别", type: "select", options: D_BZ_YJJB },
{ key: 'jfd', label: "积分段", placeholder: "请选择积分段", type: "Slot" },
{ key: 'startTime', label: "预警时间", type: "datetimerange" },
]);
const listQuery = ref({});
const queryFrom = ref({});
// 页面数据
@ -142,14 +136,16 @@ const pageData = reactive({
},
controlsWidth: 300,
tableColumn: [
{ label: "状态", prop: "czzt", showSolt: true },
{ label: "预警时间", prop: "yjsj" },
{ label: "姓名", prop: "xm" },
{ label: "身份证号", prop: "sfzh" },
{ label: "标签", prop: "yjbqmc" },
{ type: 'index', label: '序号', width: 55, align: 'center' },
{ label: "状态", slotName: "czzt", width: 100 },
{ label: "预警时间", prop: "yjsj", width: 200 },
{ label: "姓名", prop: "xm", width: 100 },
{ label: "身份证号", prop: "sfzh", width: 170 },
{ label: "标签", prop: "yjbqmc", width: 120 },
{ label: "接收单位", prop: "ssbm" },
{ label: "活动频次", prop: "sfcs",width:'90' },
{ label: "预警分值", prop: "sffz",showSolt: true },
{ label: "活动频次", slotName: "sfcs", width: 90, align: 'center' },
{ label: "预警分值", slotName: "sffz", width: 230 },
{ label: '操作', width: 300, slotName: 'operation', align: 'center' },
]
});
@ -175,8 +171,8 @@ const handleCzjy = (row) => {
const onSearch = (val) => {
queryFrom.value = { ...queryFrom.value, ...val };
queryFrom.value.startTime = val.times ? val.times[0] : ''
queryFrom.value.endTime = val.times ? val.times[1] : ''
queryFrom.value.startTime = val.startTime ? val.startTime[0] : ''
queryFrom.value.endTime = val.startTime ? val.startTime[1] : ''
pageData.pageConfiger.pageCurrent = 1;
getList();
};
@ -204,7 +200,7 @@ const getList = () => {
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize
}
delete promes.times;
delete promes.startTime;
tbYjxxGetZbtj(promes).then((res) => {
pageData.tableData = res.records || [];
@ -214,17 +210,6 @@ const getList = () => {
pageData.tableConfiger.loading = false;
});
};
const bqYs = (val) => {
if (val == '01') {
return '#ff0202'
} else if (val == '02') {
return '#ff8c00'
} else if (val == '03') {
return '#e6a23c'
} else if (val == '04') {
return '#0000ff'
}
}
const bqLbData = ref({
bqXl: []
})
@ -321,7 +306,7 @@ const chooseJfFun = (val) => {
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 270;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () {
tabHeightFn();
@ -356,14 +341,14 @@ const exportExl = () => {
}
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ids}, '/mosty-gsxt/yjzxZhyj/batchQs').then(() => {
qcckPost({ ids }, '/mosty-gsxt/yjzxZhyj/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
@ -380,8 +365,6 @@ const handleQs = () => {
}
.tabBox_zdy {
.el-table--fit {
overflow: unset !important;
}
background-color: #fff;
}
</style>

View File

@ -0,0 +1,403 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<Searchs :searchArr="searchConfiger" @submit="onSearch" @reset="reset" :key="pageData.keyCount">
<template #jfd>
<div>
<el-input v-model="queryFrom.ksfz" type="number" placeholder="开始身份分值" style="width: 130px"></el-input>
<span style="color: #333;margin: 0 4px;"></span>
<el-input v-model="queryFrom.jsfz" type="number" placeholder="结束身份分值" style="width: 130px"></el-input>
</div>
</template>
</Searchs>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox tabBox_zdy" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth" expand
@chooseData="handleChooseData">
<template #expand="{ props }">
<Items :row="props || {}" :dict="dict" />
</template>
<template #yjTp="{ row }">
<template v-if="!row.yjTp || row.yjTp.includes('baidu')">
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="30" height="30" v-else />
</template>
<el-image v-else style="width: 30px; height:30px" :src="row.yjTp" :preview-src-list="[row.yjTp]"
show-progress>
<template #error>
<div class="image-slot error">
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="30" height="30" v-else />
</div>
</template>
</el-image>
</template>
<template #yjJb="{ row }">
<DictTag :value="row.yjJb" :tag="false" :color="bqYs(row.yjJb)" :options="D_GS_SSYJ" />
</template>
<template #czzt="{ row }">
<DictTag :value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
</template>
<template #sex="{ row }">
<span v-if="row.yjRysfzh"> {{ IdCard(row.yjRysfzh, 2) }} </span>
</template>
<template #age="{ row }">
<span v-if="row.yjRysfzh"> {{ IdCard(row.yjRysfzh, 3) }} </span>
</template>
<template #yjLylx="{ row }">
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" />
</template>
<template #bqdl="{ row }">
<DictTag :value="row.bqdl" :tag="false" :options="D_GS_QLZDRLX" />
</template>
<template #xsd="{ row }">
{{ row.xsd }}%
</template>
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')" v-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="primary" @click="openAddFrom(row)">详情</el-link> -->
<el-link type="primary" @click="pushWarning(row)">指派</el-link>
<el-link type="primary" @click="openBox(row)">详情</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
<FkDialog @change="getList" lx="05" />
<AddFrom ref="addModelRef" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_GS_SSYJ }" />
<!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<ZpForm v-model="warningShow" :dataList="dataList" />
<!-- <Pagination v-model="paginationOpen" /> -->
<Pagination v-model="paginationOpen" :dataList="dataPres" :dict="{D_BZ_XB,D_BZ_YJJB,D_GS_QLZDRLX,D_GS_ZDR_RYJB,D_GS_ZDR_GJLB,D_GS_BK_CZYQ}" />
</template>
<script setup>
import { IdCard } from '@/utils/validate.js'
import Czjy from './components/czjy.vue'
import { getItem, setItem } from '@/utils/storage'
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Searchs from "@/components/aboutTable/Search.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import AddFrom from "./components/addFrom.vue";
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import ZpForm from "@/views/backOfficeSystem/fourColorManage/warningControl/sevenWarning/zpForm.vue";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { holographicProfileJump } from "@/utils/tools.js"
import Items from "./item/items.vue"
import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js"
import Pagination from "./components/particulars.vue";
const czjyRef = ref()
const { proxy } = getCurrentInstance();
const searchBox = ref();
const { D_GS_QLZDRLX, D_BZ_YJLY, D_GSXT_YJXX_CZZT, D_GS_SSYJ, D_BZ_YJJB, D_BZ_BKLYS, D_BZ_XB, D_BZ_SF, D_GS_CSZT, D_GS_BKZT, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB,D_GS_BK_CZYQ } = proxy.$dict('D_GS_QLZDRLX', 'D_BZ_YJLY', "D_GSXT_YJXX_CZZT", "D_GS_SSYJ", 'D_BZ_YJJB', 'D_BZ_BKLYS', 'D_BZ_XB', 'D_BZ_SF', 'D_GS_CSZT', 'D_GS_BKZT', 'D_GS_ZDR_RYJB', 'D_GS_ZDR_GJLB','D_GS_BK_CZYQ'
)
const dict = reactive({ D_GSXT_YJXX_CZZT, D_GS_SSYJ })
// 搜索配置
const searchConfiger = ref([
{ label: "布控开始时间", prop: 'bkkssj', showType: "date", placeholder: "请选择布控开始时间" },
{ label: "布控结束时间", prop: 'bkjssj', showType: "date", placeholder: "请选择布控结束时间" },
{ label: "预警时间", prop: 'startTime', showType: "datetimerange", placeholder: "请选择预警时间" },
{ label: "预警级别", prop: 'yjJb', showType: "select", options: D_BZ_YJJB, placeholder: "请选择预警级别", multiple: true },
{ label: "布控来源", prop: 'bkly', showType: "select", options: D_BZ_BKLYS, placeholder: "请选择布控来源" },
{ label: "布控范围", prop: 'bkfw', showType: "input", placeholder: "请输入布控范围" },
{ label: "布控单位", prop: 'gkbmdm', showType: "department", placeholder: "请选择布控单位" },
{ label: "所属单位", prop: 'ssbmdm', showType: "department", placeholder: "请选择所属单位" },
{ label: "相似度", prop: 'xsd', showType: "input", placeholder: "请输入相似度" },
{ prop: 'sfglyj', showType: "checkbox", showSelectAll: false, options: [{ label: '关联预警', value: '1' }] },
{ prop: 'sfgz', showType: "checkbox", showSelectAll: false, options: [{ label: '重点关注', value: '1' }] },
{ prop: 'sfzp', showType: "checkbox", showSelectAll: false, options: [{ label: '二次指派', value: '1' }] },
{ label: "签收状态", prop: 'czzt', showType: "select", options: D_GSXT_YJXX_CZZT },
{ label: "超时状态", prop: 'cszt', placeholder: "请选择超时状态", showType: "select", options: D_GS_CSZT },
{ label: "布控状态", prop: 'zkzt', showType: "select", options: D_GS_BKZT, placeholder: "请选择布控状态" },
{ label: "姓名", prop: 'yjRyxm', showType: "input", placeholder: "请输入姓名" },
{ label: "性别", prop: 'xbdm', showType: "select", options: D_BZ_XB, placeholder: "请选择性别" },
{ label: "开始年龄", prop: 'ksnl', placeholder: "请输入年龄", showType: "number" },
{ label: "结束年龄", prop: 'jsnl', placeholder: "请输入年龄", showType: "number" },
{ label: "跨地区", prop: 'sflksd', showType: "select", options: D_BZ_SF, placeholder: "请选择是否跨地区" },
{ label: "身份证号", prop: 'yjRysfzh', showType: "input", placeholder: "请输入身份证号" },
{ label: "预警内容", prop: 'yjNr', showType: "input", placeholder: "请输入预警内容" },
// { label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
// { label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
// { label: "预警标签", prop: 'yjbqmc', placeholder: "请输入预警标签", showType: "input" },
// { label: "部门", prop: 'ssbmdm', placeholder: "请选择部门", showType: "department" },
// { label: "级别", prop: 'yjJb', placeholder: "请选择级别", showType: "select" ,options: D_BZ_YJJB},
// { label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" },
// { label: "布控时间", prop: 'startTime', placeholder: "请选择布控时间", showType: "datetimerange" },
]);
const ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
const permission_sfqs = ref(false)
const roleCode = ref(false)
const queryFrom = ref({});
// 页面数据
const pageData = reactive({
tableData: [],
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkBox",
loading: false,
haveControls: true,
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
},
controlsWidth: 180, //操作栏宽度
tableColumn: [
{ label: "状态", prop: "czzt", showSolt: true, width: 80 },
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true },
{ label: "姓名", prop: "yjRyxm" , width: 50},
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true },
{ label: "性别", prop: "sex", showSolt: true , width: 50},
{ label: "年龄", prop: "age", showSolt: true, width: 50 },
{ label: "预警级别", prop: "yjJb", showSolt: true , width: 50},
{ label: "布控单位", prop: "gkbmdm", showSolt: true , width: 50},
{ label: "布控来源", prop: "bkly", showSolt: true , width: 50},
{ label: "布控范围", prop: "bkfw", showSolt: true },
{ label: "布控开始时间", showOverflowTooltip: true, prop: "bkkssj", showSolt: true },
{ label: "布控结束时间", showOverflowTooltip: true, prop: "bkjssj", showSolt: true },
{ label: "处置要求", prop: "bkczyq", showSolt: true, showOverflowTooltip: true },
{ label: "相似度", prop: "xsd", showSolt: true, width: 50 },
{ label: "预警内容", prop: "yjNr", showOverflowTooltip: true, showSolt: true },
{ label: "所属部门", prop: "ssbm", showOverflowTooltip: true },
{ label: "数据来源", prop: "yjLylx", showOverflowTooltip: true, showSolt: true },
{ label: "超时状态", prop: "cszt", showOverflowTooltip: true, showSolt: true, width: 50 },
{ label: "在控状态", prop: "zkzt", showOverflowTooltip: true, showSolt: true, width: 50 },
]
});
onMounted(() => {
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
permission_sfqs.value = str.startsWith('2' || '3') ? false : true;
let rols = getItem('roleList') ? getItem('roleList') : []
let obj = rols.find(item => {
return ['JS_666666', 'JS_777777', 'JS_888888'].includes(item.roleCode)
})
roleCode.value = obj ? true : false;
tabHeightFn();
getList();
});
const onSearch = (val) => {
queryFrom.value = {
...queryFrom.value, ...val,
startTime: val.startTime ? val.startTime[0] : '',
endTime: val.startTime ? val.startTime[1] : '',
yjJb: val.yjJb?.join(',') || '',
sfglyj: val.sfglyj?.join(',') || '',
sfgz: val.sfgz?.join(',') || '',
sfzp: val.sfzp?.join(',') || ''
};
pageData.pageConfiger.pageCurrent = 1;
getList();
};
const reset = () => {
delete queryFrom.value.ksfz
delete queryFrom.value.jsfz
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList();
};
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList();
};
const getList = () => {
pageData.tableConfiger.loading = true;
let params = {
...queryFrom.value,
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize,
}
qcckPost(params, '/mosty-gsxt/tbYjxx/getBdbkPageList').then((res) => {
pageData.tableData = res?.records || []
pageData.total = res?.total || 0;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
});
};
// 处理签收
const handleQsFk = (val, type) => {
switch (type) {
case '签收':
proxy.$confirm("是否确定要签收?", "警告", { type: "warning" }).then(() => {
qcckPost({ id: val.id }, "/mosty-gsxt/mosty-gsxt/tbYjxx/yjqs").then(() => {
val.czzt = '02'
getList()
proxy.$message({ type: "success", message: "签收成功" });
});
})
break;
case '反馈':
case '查看反馈':
emitter.emit("openFkDialog", { id: val.id, type });
break;
}
}
const pushAssess = (val) => {
return holographicProfileJump(val?.yjLx, val) // 全息档案跳转
}
const bqYs = (val) => {
switch (val) {
case '01':
return '#ff0202'
case '02':
return '#ff8c00'
case '03':
return '#ffff00'
case '04':
return '#0000ff'
default:
return ''
}
}
// 新增
const addModelRef = ref(null)
const openAddFrom = (row) => {
addModelRef.value.init('add', row)
}
const handleCzjy = (row) => {
czjyRef.value.init(row)
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 270;
window.onresize = function () {
tabHeightFn();
};
};
// 指派
const dataList = ref(null)
const warningShow = ref(false)
const pushWarning = (val) => {
warningShow.value = true;
dataList.value = val;
}
/** 选中项 */
const selectRows = ref([])
const handleChooseData = (val) => {
selectRows.value = val
}
const exportExl = () => {
const titleObj = {
czzt_cname: "处置状态",
yjSj: "预警时间",
yjRyxm: "姓名",
nl_cname: "年龄", // IdCard(row.yjRysfzh, 3)
yjLylx: "数据来源",
xb_cname: "性别",
yjJb_cname: "预警级别",
xsd_cname: "相似度",
yjDz: "预警地点",
yjCs: "预警次数",
yjRysjh: "布控手机号",
yjClcph: "布控车牌号",
yjRysfzh: "身份证",
}
/** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
const data = needArr.map(item => {
return {
...item,
nl_cname: IdCard(item.yjRysfzh, 3),
xb_cname: IdCard(item.yjRysfzh, 2),
xsd_cname: (item.xsd > 0 ? item.xsd : 0) + '%',
yjJb_name: getMultiDictVal(item.yjJb, D_GS_SSYJ),
czzt_name: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
yjJb_cname: getMultiDictVal(item.yjJb, D_BZ_YJJB),
}
})
exportExlByObj(titleObj, data, '预警布控')
}
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ ids }, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
// 详情
const paginationOpen = ref(false)
const dataPres = ref({})
const openBox = (val) => {
paginationOpen.value = true
dataPres.value = val
}
</script>
<style lang="scss" scoped>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
.tabBox_zdy {
.el-table--fit {
overflow: unset !important;
}
}
::v-deep .el-table .cell {
padding: 0;
}
::v-deep .el-table .el-table__cell {
padding: 4px 0;
}
</style>

View File

@ -2,30 +2,18 @@
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<Searchs :searchArr="searchConfiger" @submit="onSearch" @reset="reset" :key="pageData.keyCount">
<template #jfd>
<div>
<el-input v-model="queryFrom.ksfz" type="number" placeholder="开始身份分值" style="width: 130px"></el-input>
<span style="color: #333;margin: 0 4px;"></span>
<el-input v-model="queryFrom.jsfz" type="number" placeholder="结束身份分值" style="width: 130px"></el-input>
</div>
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search='onSearch'>
<template #but>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</Searchs>
</QueryFormPanel>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox tabBox_zdy" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth" expand
@chooseData="handleChooseData">
<template #expand="{ props }">
<Items :row="props || {}" :dict="dict" />
</template>
<div class=" tabBox_zdy" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
<WarnDataTable :loading="pageData.tableConfiger.loading" :tableHeight="pageData.tableHeight"
:data="pageData.tableData" :columns="pageData.tableColumn" table-class="warn-table"
@selectionChange="handleChooseData">
<template #yjTp="{ row }">
<template v-if="!row.yjTp || row.yjTp.includes('baidu')">
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
@ -41,40 +29,48 @@
</template>
</el-image>
</template>
<template #yjJb="{ row }">
<DictTag :value="row.yjJb" :tag="false" :color="bqYs(row.yjJb)" :options="D_GS_SSYJ" />
</template>
<template #czzt="{ row }">
<DictTag :value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
<DictTag :value="row.czzt" :color="row.czzt === '01' ? '#ff2424' : '#1d72e8'" :tag="false"
:options="D_GSXT_YJXX_CZZT" />
</template>
<template #sex="{ row }">
<span v-if="row.yjRysfzh"> {{ IdCard(row.yjRysfzh, 2) }} </span>
<template #xbdm="{ row }">
<DictTag :value="row.xbdm" :tag="false" :options="D_BZ_XB" />
</template>
<template #age="{ row }">
<span v-if="row.yjRysfzh"> {{ IdCard(row.yjRysfzh, 3) }} </span>
<template #yjJb="{ row }">
<div :style="{ 'background-color': bqYs(row.yjJb) }">
<DictTag :value="row.yjJb" color="#fff" :tag="false" :options="D_BZ_YJJB" />
</div>
</template>
<template #yjLylx="{ row }">
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" />
<template #bkly="{ row }">
<DictTag :value="row.bkly" :tag="false" :options="D_BZ_BKLYS" />
</template>
<template #bqdl="{ row }">
<DictTag :value="row.bqdl" :tag="false" :options="D_GS_QLZDRLX" />
<template #bkczyq="{ row }">
<DictTag :value="row.bkczyq" :tag="false" :options="D_GS_BK_CZYQ" />
</template>
<template #xsd="{ row }">
{{ row.xsd }}%
</template>
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')" v-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="primary" @click="openAddFrom(row)">详情</el-link> -->
<el-link type="primary" @click="pushWarning(row)">指派</el-link>
<el-link type="primary" @click="openBox(row)">详情</el-link>
<template #yjLylx="{ row }">
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_SJLY" />
</template>
</MyTable>
<template #cszt="{ row }">
<DictTag :value="row.cszt" :tag="false" :options="D_GS_CSZT" />
</template>
<template #operation="{ row }">
<div style="display: flex;justify-content: space-between;">
<span class="warning" @click="pushAssess(row)">全息档案</span>
<span class="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</span>
<!-- <span type="primary" @click="showDetail(row)">转合成</span> -->
<!-- <span type="danger" @click="delDictItem(row.id)">转会商</span> -->
<span class="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</span>
<span class="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</span>
<!-- <span type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</span> -->
<span class="primary" @click="openBox(row)">详情</span>
<span class="primary" @click="pushWarning(row)">指派</span>
</div>
</template>
</WarnDataTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
@ -87,16 +83,16 @@
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<ZpForm v-model="warningShow" :dataList="dataList" />
<!-- <Pagination v-model="paginationOpen" /> -->
<Pagination v-model="paginationOpen" :dataList="dataPres" :dict="{D_BZ_XB,D_BZ_YJJB,D_GS_QLZDRLX,D_GS_ZDR_RYJB,D_GS_ZDR_GJLB,D_GS_BK_CZYQ}" />
<Pagination v-model="paginationOpen" :dataList="dataPres"
:dict="{ D_BZ_XB, D_BZ_YJJB, D_GS_QLZDRLX, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB, D_GS_BK_CZYQ }" />
</template>
<script setup>
import { IdCard } from '@/utils/validate.js'
import Czjy from './components/czjy.vue'
import { getItem, setItem } from '@/utils/storage'
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Searchs from "@/components/aboutTable/Search.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import WarnDataTable from '@/views/backOfficeSystem/ces/components/WarnDataTable.vue'
import QueryFormPanel from "@/views/backOfficeSystem/ces/components/QueryFormPanel.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import AddFrom from "./components/addFrom.vue";
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
@ -112,9 +108,7 @@ import Pagination from "./components/particulars.vue";
const czjyRef = ref()
const { proxy } = getCurrentInstance();
const searchBox = ref();
const { D_GS_QLZDRLX, D_BZ_YJLY, D_GSXT_YJXX_CZZT, D_GS_SSYJ, D_BZ_YJJB, D_BZ_BKLYS, D_BZ_XB, D_BZ_SF, D_GS_CSZT, D_GS_BKZT, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB,D_GS_BK_CZYQ } = proxy.$dict('D_GS_QLZDRLX', 'D_BZ_YJLY', "D_GSXT_YJXX_CZZT", "D_GS_SSYJ", 'D_BZ_YJJB', 'D_BZ_BKLYS', 'D_BZ_XB', 'D_BZ_SF', 'D_GS_CSZT', 'D_GS_BKZT', 'D_GS_ZDR_RYJB', 'D_GS_ZDR_GJLB','D_GS_BK_CZYQ'
)
const { D_GS_QLZDRLX, D_BZ_YJLY, D_GSXT_YJXX_CZZT, D_GS_SSYJ, D_BZ_YJJB, D_BZ_BKLYS, D_BZ_XB, D_BZ_SF, D_GS_CSZT, D_GS_BKZT, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB, D_GS_BK_CZYQ, D_BZ_SJLY } = proxy.$dict('D_GS_QLZDRLX', 'D_BZ_YJLY', "D_GSXT_YJXX_CZZT", "D_GS_SSYJ", 'D_BZ_YJJB', 'D_BZ_BKLYS', 'D_BZ_XB', 'D_BZ_SF', 'D_GS_CSZT', 'D_GS_BKZT', 'D_GS_ZDR_RYJB', 'D_GS_ZDR_GJLB', 'D_GS_BK_CZYQ', 'D_BZ_SJLY')
const dict = reactive({ D_GSXT_YJXX_CZZT, D_GS_SSYJ })
// 搜索配置
const searchConfiger = ref([
@ -127,9 +121,9 @@ const searchConfiger = ref([
{ label: "布控单位", prop: 'gkbmdm', showType: "department", placeholder: "请选择布控单位" },
{ label: "所属单位", prop: 'ssbmdm', showType: "department", placeholder: "请选择所属单位" },
{ label: "相似度", prop: 'xsd', showType: "input", placeholder: "请输入相似度" },
{ prop: 'sfglyj', showType: "checkbox", showSelectAll: false, options: [{ label: '关联预警', value: '1' }] },
{ prop: 'sfgz', showType: "checkbox", showSelectAll: false, options: [{ label: '重点关注', value: '1' }] },
{ prop: 'sfzp', showType: "checkbox", showSelectAll: false, options: [{ label: '二次指派', value: '1' }] },
{ key: 'sfglyj', label: '关联预警', type: 'select', options: D_BZ_SF, placeholder: '请选择关联预警' },
{ key: 'sfgz', label: '重点关注', type: 'select', options: D_BZ_SF, placeholder: '请选择重点关注' },
{ key: 'sfzp', label: '二次指派', type: 'select', options: D_BZ_SF, placeholder: '请选择二次指派' },
{ label: "签收状态", prop: 'czzt', showType: "select", options: D_GSXT_YJXX_CZZT },
{ label: "超时状态", prop: 'cszt', placeholder: "请选择超时状态", showType: "select", options: D_GS_CSZT },
{ label: "布控状态", prop: 'zkzt', showType: "select", options: D_GS_BKZT, placeholder: "请选择布控状态" },
@ -140,13 +134,7 @@ const searchConfiger = ref([
{ label: "跨地区", prop: 'sflksd', showType: "select", options: D_BZ_SF, placeholder: "请选择是否跨地区" },
{ label: "身份证号", prop: 'yjRysfzh', showType: "input", placeholder: "请输入身份证号" },
{ label: "预警内容", prop: 'yjNr', showType: "input", placeholder: "请输入预警内容" },
// { label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
// { label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
// { label: "预警标签", prop: 'yjbqmc', placeholder: "请输入预警标签", showType: "input" },
// { label: "部门", prop: 'ssbmdm', placeholder: "请选择部门", showType: "department" },
// { label: "级别", prop: 'yjJb', placeholder: "请选择级别", showType: "select" ,options: D_BZ_YJJB},
// { label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" },
// { label: "布控时间", prop: 'startTime', placeholder: "请选择布控时间", showType: "datetimerange" },
]);
const ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
@ -172,25 +160,27 @@ const pageData = reactive({
},
controlsWidth: 180, //操作栏宽度
tableColumn: [
{ label: "状态", prop: "czzt", showSolt: true, width: 80 },
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true },
{ label: "姓名", prop: "yjRyxm" , width: 50},
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true },
{ label: "性别", prop: "sex", showSolt: true , width: 50},
{ label: "年龄", prop: "age", showSolt: true, width: 50 },
{ label: "预警级别", prop: "yjJb", showSolt: true , width: 50},
{ label: "布控单位", prop: "gkbmdm", showSolt: true , width: 50},
{ label: "布控来源", prop: "bkly", showSolt: true , width: 50},
{ label: "布控范围", prop: "bkfw", showSolt: true },
{ label: "布控开始时间", showOverflowTooltip: true, prop: "bkkssj", showSolt: true },
{ label: "布控结束时间", showOverflowTooltip: true, prop: "bkjssj", showSolt: true },
{ label: "处置要求", prop: "bkczyq", showSolt: true, showOverflowTooltip: true },
{ label: "相似度", prop: "xsd", showSolt: true, width: 50 },
{ label: "预警内容", prop: "yjNr", showOverflowTooltip: true, showSolt: true },
{ label: "所属部门", prop: "ssbm", showOverflowTooltip: true },
{ label: "数据来源", prop: "yjLylx", showOverflowTooltip: true, showSolt: true },
{ label: "超时状态", prop: "cszt", showOverflowTooltip: true, showSolt: true, width: 50 },
{ label: "在控状态", prop: "zkzt", showOverflowTooltip: true, showSolt: true, width: 50 },
{ type: 'index', label: '序号', width: 55, align: 'center' },
{ label: "处置状态", align: 'center', width: 70, slotName: 'czzt' },
{ prop: 'yjSj', label: '预警时间', width: 80 },
{ prop: 'yjRyxm', label: '人员姓名', width: 70 },
{ prop: 'yjRysfzh', label: '身份证号', width: 80 },
{ label: '性别', width: 50, align: 'center', slotName: 'xbdm' },
{ prop: 'nl', label: '年龄', width: 50, align: 'center' },
{ label: '预警级别', width: 80, align: 'center', slotName: 'yjJb' },
{ label: "布控单位", prop: "gkbmmc", align: 'center' },
{ label: "布控来源", align: 'center', slotName: 'bkly', width: 70 },
{ prop: 'bkfw', label: "布控范围", align: 'center', width: 70 },
{ prop: 'bkkssj', label: "布控开始时间", align: 'center' },
{ prop: 'bkjssj', label: "布控结束时间", align: 'center' },
{ label: "处置要求", width: 70, slotName: 'bkczyq', align: 'center' },
{ label: "预警内容", prop: "yjNr", align: 'center' },
{ label: "相似度", slotName: "xsd", align: 'center', width: 50 },
{ label: "所属部门", prop: "ssbm", align: 'center' },
{ label: "数据来源", slotName: "yjLylx", align: 'center' },
{ label: '操作', width: 180, slotName: 'operation' },
{ label: '超时状态', width: 80, align: 'center', slotName: 'cszt' },
{ label: "在控状态", width: 70, align: 'center', slotName: "zkzt" },
]
});
@ -303,7 +293,7 @@ const handleCzjy = (row) => {
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 270;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () {
tabHeightFn();
@ -389,10 +379,9 @@ const openBox = (val) => {
}
.tabBox_zdy {
.el-table--fit {
overflow: unset !important;
}
background-color: #fff;
}
::v-deep .el-table .cell {
padding: 0;
}

View File

@ -0,0 +1,205 @@
<template>
<div>
<div ref="searchBox" class="mt10 mb10">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
</div>
<!-- 搜索 -->
<!-- 表格 -->
<div class="tabBox heightBox">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
expand :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<template #expand="{ props }">
<div style="max-width: 100%">
<Items :row="props || {}" />
</div>
</template>
<template #yjtp="{ row }">
<div v-if="!row.yjtp || row.yjtp.includes('baidu')">
<img src="@/assets/images/car.png" width="30" height="40" v-if="row.yjlb == 2" />
<img src="@/assets/images/default_male.png" width="30" height="40" v-else />
</div>
<el-image preview-teleported v-else @click.stop style="width: 30px; height: 40px" :src="row.yjtp"
:preview-src-list="[row.yjtp]" show-progress>
<template #error>
<div class="image-slot error">
<img src="@/assets/images/car.png" width="30" height="40" v-if="row.yjlb == 2" />
<img src="@/assets/images/default_male.png" width="30" height="40" v-else />
</div>
</template>
</el-image>
</template>
<template #yjjb="{ row }">
<DictTag :value="row.yjjb" :tag="false" :color="bqYs(row.yjjb)" :options="D_BZ_YJJB" />
</template>
<template #yjLylx="{ row }">
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" />
</template>
<template #yjlb="{ row }">
<DictTag :value="row.yjlb" :options="D_BZ_YJLX" />
</template>
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link> -->
<!-- <el-link type="danger" @click="delDictItem(row.id)">转会商</el-link> -->
<!-- <el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01'">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')" v-else-if="row.czzt == '02'">反馈</el-link>
<el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<!-- <el-link type="primary" @click="openAddModel(row)">详情</el-link> -->
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
<!-- 详情 -->
<HolographicArchive v-model="assessShow" :dataList="dataList" />
</template>
<script setup>
import Items from "./item/items.vue"
import Search from "@/components/aboutTable/Search.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import { qcckPost } from "@/api/qcckApi.js";
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import { reactive, ref, onMounted, getCurrentInstance, computed, watch } from "vue";
const { proxy } = getCurrentInstance();
const { D_BZ_YJJB, D_BZ_YJLX,D_BZ_YJLY } = proxy.$dict("D_BZ_YJJB","D_BZ_YJLX",'D_BZ_YJLY'); //获取字典数据
const searchBox = ref(); //搜索框
import { holographicProfileJump } from "@/utils/tools.js"
const searchConfiger = ref(
[
{ label: "预警级别", prop: 'yjjbList', placeholder: "请选择预警级别", showType: "select", options: D_BZ_YJJB },
{ label: "来源类型", prop: 'yjlxList', placeholder: "请选择来源类型", showType: "select", options: D_BZ_YJLY,multiple:true },
{ label: "身份证号", prop: 'rysfzh', placeholder: "请输入身份证", showType: "input",},
{ label: "部门", prop: 'ssbmdm', showType: "department"},
{ label: "时间", prop: 'timeRange', showType: "datetimerange"},
]);
const queryFrom = ref({});
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false,
haveControls: true
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 100, //操作栏宽度
tableColumn: [
{ label: "预警图片", prop: "yjtp", showSolt: true, width: 100 },
{ label: "预警标签", prop: "yjbq", width: 120 },
{ label: "预警地址", prop: "yjdz" },
{ label: "预警级别", prop: "yjjb", showSolt: true, width: 85 },
{ label: "预警类别", prop: "yjlb", showSolt: true },
{ label: "来源类型", prop: "yjLylx", showSolt: true,width: 100 },
{ label: "预警时间", prop: "yjsj", width: 200 },
{ label: "所属部门", prop: "ssbm" },
{ label: "姓名", prop: "ryxm",width: 100 },
{ label: "身份证号", prop: "rysfzh", width: 170 },
{ label: "车牌号", prop: "cph" ,width: 100},
]
});
onMounted(() => {
tabHeightFn();
getList()
});
// 搜索
const onSearch = (val) => {
queryFrom.value = { ...val }
queryFrom.value.startTime = val.timeRange ? val.timeRange[0] : ''
queryFrom.value.endTime = val.timeRange ? val.timeRange[1] : ''
pageData.pageConfiger.pageCurrent = 1;
getList()
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList()
}
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList()
}
const ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
const getList = () => {
pageData.tableConfiger.loading = true;
const promes = {
...queryFrom.value,
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize
}
delete promes.timeRange;
qcckPost(promes, '/mosty-gsxt/tbYjxx/getPageAllList').then((res) => {
console.log(res);
pageData.total = res.total || 0;
pageData.tableConfiger.loading = false;
pageData.tableData = res.records.map(item => {
return {
...item,
yjtp: item.yjlx == '01' ? item.yjtp.replace(ORDIMG, IMGYM) : item.yjtp
}
}) || [];
}).catch(() => {
pageData.tableConfiger.loading = false;
})
}
const bqYs = (val) => {
if (val == '01') {
return '#ff0202'
} else if (val == '02') {
return '#ff8c00'
} else if (val == '03') {
return '#ffd325'
} else if (val == '04') {
return '#0000ff'
}
}
// 全息档案
const assessShow = ref(false)
const dataList = ref()
const pushAssess = (val) => {
return holographicProfileJump(val?.yjlb, val) // 全息档案跳转
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 240;
window.onresize = function () { tabHeightFn(); };
};
</script>
<style>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
</style>

View File

@ -1,24 +1,19 @@
<template>
<div>
<div ref="searchBox" class="mt10 mb10">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
</div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10 mb10">
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search='onSearch' />
</div>
<!-- 表格 -->
<div class="tabBox heightBox">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
expand :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<template #expand="{ props }">
<div style="max-width: 100%">
<Items :row="props || {}" />
</div>
</template>
<div class="bgTable">
<WarnDataTable :loading="pageData.tableConfiger.loading" :tableHeight="pageData.tableHeight"
:data="pageData.tableData" :columns="pageData.tableColumn" table-class="warn-table">
<template #yjtp="{ row }">
<div v-if="!row.yjtp || row.yjtp.includes('baidu')">
<template v-if="!row.yjtp || row.yjtp.includes('baidu')">
<img src="@/assets/images/car.png" width="30" height="40" v-if="row.yjlb == 2" />
<img src="@/assets/images/default_male.png" width="30" height="40" v-else />
</div>
</template>
<el-image preview-teleported v-else @click.stop style="width: 30px; height: 40px" :src="row.yjtp"
:preview-src-list="[row.yjtp]" show-progress>
<template #error>
@ -31,7 +26,9 @@
</template>
<template #yjjb="{ row }">
<DictTag :value="row.yjjb" :tag="false" :color="bqYs(row.yjjb)" :options="D_BZ_YJJB" />
<div :style="{ 'background-color': bqYs(row.yjjb) }">
<DictTag :value="row.yjjb" :tag="false" color="#fff" :options="D_BZ_YJJB" />
</div>
</template>
<template #yjLylx="{ row }">
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" />
@ -39,16 +36,12 @@
<template #yjlb="{ row }">
<DictTag :value="row.yjlb" :options="D_BZ_YJLX" />
</template>
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link> -->
<!-- <el-link type="danger" @click="delDictItem(row.id)">转会商</el-link> -->
<!-- <el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01'">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')" v-else-if="row.czzt == '02'">反馈</el-link>
<el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<!-- <el-link type="primary" @click="openAddModel(row)">详情</el-link> -->
<template #operation="{ row }">
<div style="display: flex;justify-content: space-between;">
<span class="warning" @click="pushAssess(row)">全息档案</span>
</div>
</template>
</MyTable>
</WarnDataTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
@ -60,26 +53,27 @@
</template>
<script setup>
import Items from "./item/items.vue"
import Search from "@/components/aboutTable/Search.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import WarnDataTable from '@/views/backOfficeSystem/ces/components/WarnDataTable.vue'
import QueryFormPanel from "@/views/backOfficeSystem/ces/components/QueryFormPanel.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import { qcckPost } from "@/api/qcckApi.js";
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import { reactive, ref, onMounted, getCurrentInstance, computed, watch } from "vue";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { bqYs } from '@/utils/tools.js'
const { proxy } = getCurrentInstance();
const { D_BZ_YJJB, D_BZ_YJLX,D_BZ_YJLY } = proxy.$dict("D_BZ_YJJB","D_BZ_YJLX",'D_BZ_YJLY'); //获取字典数据
const { D_BZ_YJJB, D_BZ_YJLX, D_BZ_YJLY } = proxy.$dict("D_BZ_YJJB", "D_BZ_YJLX", 'D_BZ_YJLY'); //获取字典数据
const searchBox = ref(); //搜索框
import { holographicProfileJump } from "@/utils/tools.js"
const searchConfiger = ref(
[
{ label: "预警级别", prop: 'yjjbList', placeholder: "请选择预警级别", showType: "select", options: D_BZ_YJJB },
{ label: "来源类型", prop: 'yjlxList', placeholder: "请选择来源类型", showType: "select", options: D_BZ_YJLY,multiple:true },
{ label: "身份证号", prop: 'rysfzh', placeholder: "请输入身份证", showType: "input",},
{ label: "部门", prop: 'ssbmdm', showType: "department"},
{ label: "时间", prop: 'timeRange', showType: "datetimerange"},
{ key: 'yjjbList', label: "预警级别", placeholder: "请选择预警级别", type: "select", options: D_BZ_YJJB },
{ key: 'yjlxList', label: "来源类型", placeholder: "请选择来源类型", type: "select", options: D_BZ_YJLY, multiple: true },
{ key: 'rysfzh', label: "身份证号", placeholder: "请输入身份证", type: "input" },
{ key: 'ssbmdm', label: "部门", type: "department" },
{ key: 'startTime', label: "时间", type: "datetimerange" },
]);
const listQuery = ref({});
const queryFrom = ref({});
const pageData = reactive({
tableData: [], //表格数据
@ -97,17 +91,19 @@ const pageData = reactive({
}, //分页
controlsWidth: 100, //操作栏宽度
tableColumn: [
{ label: "预警图片", prop: "yjtp", showSolt: true, width: 100 },
{ type: 'index', label: '序号', width: 55, align: 'center' },
{ label: "预警图片", slotName: "yjtp", width: 100, align: 'center' },
{ label: "预警标签", prop: "yjbq", width: 120 },
{ label: "预警地址", prop: "yjdz" },
{ label: "预警级别", prop: "yjjb", showSolt: true, width: 85 },
{ label: "预警类别", prop: "yjlb", showSolt: true },
{ label: "来源类型", prop: "yjLylx", showSolt: true,width: 100 },
{ label: "预警级别", slotName: "yjjb", width: 85, align: 'center' },
{ label: "预警类别", slotName: "yjlb", width: 100 },
{ label: "来源类型", slotName: "yjLylx", width: 100 },
{ label: "预警时间", prop: "yjsj", width: 200 },
{ label: "所属部门", prop: "ssbm" },
{ label: "姓名", prop: "ryxm",width: 100 },
{ label: "姓名", prop: "ryxm", width: 100 },
{ label: "身份证号", prop: "rysfzh", width: 170 },
{ label: "车牌号", prop: "cph" ,width: 100},
{ label: "车牌号", prop: "cph", width: 100 },
{ label: '操作', width: 100, slotName: 'operation', align: 'center' },
]
});
@ -120,8 +116,8 @@ onMounted(() => {
// 搜索
const onSearch = (val) => {
queryFrom.value = { ...val }
queryFrom.value.startTime = val.timeRange ? val.timeRange[0] : ''
queryFrom.value.endTime = val.timeRange ? val.timeRange[1] : ''
queryFrom.value.startTime = val.startTime ? val.startTime[0] : ''
queryFrom.value.endTime = val.startTime ? val.startTime[1] : ''
pageData.pageConfiger.pageCurrent = 1;
getList()
}
@ -142,7 +138,7 @@ const getList = () => {
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize
}
delete promes.timeRange;
delete promes.startTime;
qcckPost(promes, '/mosty-gsxt/tbYjxx/getPageAllList').then((res) => {
console.log(res);
pageData.total = res.total || 0;
@ -160,17 +156,7 @@ const getList = () => {
const bqYs = (val) => {
if (val == '01') {
return '#ff0202'
} else if (val == '02') {
return '#ff8c00'
} else if (val == '03') {
return '#ffd325'
} else if (val == '04') {
return '#0000ff'
}
}
// 全息档案
const assessShow = ref(false)
const dataList = ref()
@ -197,9 +183,13 @@ const tabHeightFn = () => {
};
</script>
<style>
<style scoped lang="scss">
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
.bgTable {
background-color: #fff;
}
</style>

View File

@ -0,0 +1,402 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10 mb10">
<Searchs :searchArr="searchConfiger" @submit="onSearch" @reset="reset" :key="pageData.keyCount">
<template #jfd>
<div>
<el-input v-model="queryFrom.ksfz" type="number" placeholder="开始身份分值" style="width: 130px"></el-input>
<span style="color: #333;margin: 0 4px;"></span>
<el-input v-model="queryFrom.jsfz" type="number" placeholder="结束身份分值" style="width: 130px"></el-input>
</div>
</template>
</Searchs>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="exportExl">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox tabBox_zdy heightBox" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth" expand
@chooseData="handleChooseData">
<template #expand="{ props }">
<div style="max-width: 100%">
<Items :row="props || {}" :dict="dict" />
</div>
</template>
<template #sfcs="{ row }">
<span style="color: #0072ff;" @click="handleClick(row)">{{ row.sfcs }}</span>
</template>
<template #czzt="{ row }">
<DictTag :value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
</template>
<template #sffz>
<el-table-column prop="bqfz" width="80" align="center" label="标签分值" />
<el-table-column prop="pzxs" width="60" align="center" label="系数" />
<el-table-column prop="sffz" width="90" align="center" label="计算分值"/>
</template>
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<el-link type="primary" @click="chooseJfFun(row)">配置系统</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link>
<el-link type="danger" @click="handleQsFk(row)">转会商</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<el-link type="primary" @click="openAddFrom(row)">详情</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
<Detail ref="detailRef" />
<HolographicArchive v-model="assessShow" :dataList="dataList" />
<FkDialog @change="getList" lx="03" />
<Information v-model="showDialog" title="发送指令" @submit='submit' @close='closeFszl'>
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj"
:tacitly="tacitly" />
</Information>
<AddFrom ref="addModelRef" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_GS_SSYJ }" />
<!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false" :chooseJfBh="chooseJfBh" url="/yjzxSfyj/sjxspz"
:roleIds="roleIds" />
</template>
<script setup>
import Czjy from './components/czjy.vue'
import { getItem, setItem } from '@/utils/storage'
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Searchs from "@/components/aboutTable/Search.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import Information from "@/views/home/model/information.vue";
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import AddFrom from "./components/addFrom.vue";
import ChooseJf from '@/components/ChooseList/ChooseJf/index.vue'
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { yjzxSfyjSelectList, yjzxyjzxSfyjSelectList } from "@/api/yj.js";
import { tbGsxtBqglSelectList } from '@/api/zdr'
import Detail from './components/detail.vue'
import { watch } from "vue";
import emitter from "@/utils/eventBus.js";
import { holographicProfileJump } from "@/utils/tools.js"
import Items from "./item/items.vue"
import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js"
const czjyRef = ref()
const { proxy } = getCurrentInstance();
const searchBox = ref();
const { D_GSXT_YJXX_CZZT, D_GS_SSYJ, D_BZ_YJJB } = proxy.$dict("D_GSXT_YJXX_CZZT", "D_GS_SSYJ", 'D_BZ_YJJB')
const dict = reactive({ D_GSXT_YJXX_CZZT, D_GS_SSYJ })
// 搜索配置
const searchConfiger = ref([
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "预警标签", prop: 'yjbqmc', placeholder: "请输入预警标签", showType: "input" },
{ label: "部门", prop: 'ssbmdm', placeholder: "请选择部门", showType: "department" },
{ label: "级别", prop: 'bqys', placeholder: "请选择级别", showType: "select", options: D_BZ_YJJB },
{ label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" },
{ label: "预警时间", prop: 'times', showType: "datetimerange" },
]);
const permission_sfqs = ref(false)
const roleCode = ref(false)
const queryFrom = ref({});
// 页面数据
const pageData = reactive({
tableData: [],
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkBox",
loading: false,
haveControls: true,
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
},
controlsWidth: 300, //操作栏宽度
tableColumn: [
{ label: "状态", prop: "czzt", showSolt: true },
{ label: "预警时间", prop: "yjsj" ,width: 180},
{ label: "姓名", prop: "xm" },
{ label: "身份证号", prop: "sfzh" ,width: 180},
{ label: "标签", prop: "yjbqmc" },
{ label: "接收单位", prop: "ssbm" },
{ label: "活动频次", prop: "sfcs",width: 90 },
{ label: "预警分值", prop: "sffz",showSolt: true },
]
});
onMounted(() => {
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
permission_sfqs.value = str.startsWith('2' || '3') ? false : true;
let rols = getItem('roleList') ? getItem('roleList') : []
let obj = rols.find(item => {
return ['JS_666666', 'JS_777777', 'JS_888888'].includes(item.roleCode)
})
roleCode.value = obj ? true : false;
gettbGsxtBqglSelectList()
tabHeightFn();
getList();
});
const onSearch = (val) => {
queryFrom.value = { ...queryFrom.value, ...val };
queryFrom.value.startTime = val.times ? val.times[0] : ''
queryFrom.value.endTime = val.times ? val.times[1] : ''
pageData.pageConfiger.pageCurrent = 1;
getList();
};
const reset = () => {
delete queryFrom.value.ksfz
delete queryFrom.value.jsfz
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList();
};
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList();
};
const getList = () => {
pageData.tableConfiger.loading = true;
// TODO: 替换为实际的身份预警API接口
let params = {
...queryFrom.value,
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize,
}
delete params.times;
yjzxSfyjSelectList(params).then((res) => {
pageData.tableData = Array.isArray(res?.records) ? res.records : [];
pageData.tableData = pageData.tableData.map(item => {
return {
...item,
bqys_cname: getMultiDictVal(item.bqys, D_GS_SSYJ),
czzt_cname: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
}
})
pageData.total = res?.total || 0;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
});
};
// 标签
const bqLbData = ref({
bqDl: [],
bqXl: []
})
const gettbGsxtBqglSelectList = (val) => {
const promes = {
bqLx: '01',
bqLb: val ? '02' : "01",
bqDlId: val ? bqLbData.value.bqDl.find(item => item.value == val)?.id : ""
}
tbGsxtBqglSelectList(promes).then((res) => {
if (val) {
queryFrom.value.bqxl = ''
bqLbData.value.bqXl = res.data ? res.data.map(item => {
return {
label: item.bqMc,
value: item.bqDm,
}
}) : []
} else {
bqLbData.value.bqDl = res ? res.map(item => {
return {
label: item.bqMc,
value: item.bqDm,
id: item.id
}
}) : []
}
})
}
watch(() => bqLbData.value.bqXl, (res) => {
bqLbData.value.bqXl = res
}, { deep: true })
// 查看详情
const detailRef = ref()
const handleClick = (row) => {
detailRef.value.init(row)
}
// 处理签收
const handleQsFk = (val, type) => {
switch (type) {
case '签收':
proxy.$confirm("是否确定要签收?", "警告", { type: "warning" }).then(() => {
qcckPost({ id: val.id }, "/mosty-gsxt//yjzxSfyj/yjqs").then(() => {
val.czzt = '02'
getList()
proxy.$message({ type: "success", message: "签收成功" });
});
})
break;
case '反馈':
case '查看反馈':
emitter.emit("openFkDialog", { id: val.id, type });
break;
}
}
// 全息档案
const assessShow = ref(false)
const dataList = ref()
const pushAssess = (val) => {
return holographicProfileJump(val.yjlb, val) // 全息档案跳转
}
// 发送指令
const showDialog = ref(false)
const itemData = ref()
const showDetail = (item) => {
showDialog.value = true;
itemData.value = item
}
const handleClose = () => {
showDialog.value = false;
}
const semdFqzlRef = ref()
const tacitly = {
title: 'yjbt',
instructionContent: 'yjnr'
}
const submit = () => {
semdFqzlRef.value.getsendFqzl()
}
const closeFszl = () => {
semdFqzlRef.value.close()
}
const bqYs = (val) => {
if (val == '01') {
return '#ff0202'
} else if (val == '02') {
return '#ff8c00'
} else if (val == '03') {
return '#ffff00'
} else if (val == '04') {
return '#0000ff'
}
}
// 新增
const addModelRef = ref(null)
const openAddFrom = (row) => {
addModelRef.value.init('add', row)
}
// 选择系数
const chooseJfShow = ref(false)
const chooseJfBh = ref()
const roleIds = ref()
const chooseJfFun = (val) => {
chooseJfBh.value = val.id
yjzxyjzxSfyjSelectList(val.id).then(res => {
roleIds.value = res.sjxspzList.map(item => item.xsid)
chooseJfShow.value = true
})
}
const handleCzjy = (row) => {
czjyRef.value.init(row)
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 280;
window.onresize = function () {
tabHeightFn();
};
};
/** 选中项 */
const selectRows = ref([])
const handleChooseData = (val) => {
selectRows.value = val
}
const exportExl = () => {
const titleObj = {
czzt_cname: "状态",
yjsj: "预警时间",
xm: "姓名",
sfzh: "身份证号",
yjbqmc: "标签",
ssbm: "接收单位",
sfcs: "活动频次",
sffz: "预警分值",
}
/** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
const data = needArr.map(item => {
return {
...item,
bqys_cname: getMultiDictVal(item.bqys, D_GS_SSYJ),
czzt_cname: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
}
})
exportExlByObj(titleObj, data, '身份预警')
}
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ids}, '/mosty-gsxt/yjzxSfyj/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
</script>
<style scoped></style>
<style lang="scss">
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
.tabBox_zdy {
.el-table--fit {
overflow: unset !important;
}
}
</style>

View File

@ -1,57 +1,44 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10 mb10">
<Searchs :searchArr="searchConfiger" @submit="onSearch" @reset="reset" :key="pageData.keyCount">
<template #jfd>
<div>
<el-input v-model="queryFrom.ksfz" type="number" placeholder="开始身份分值" style="width: 130px"></el-input>
<span style="color: #333;margin: 0 4px;"></span>
<el-input v-model="queryFrom.jsfz" type="number" placeholder="结束身份分值" style="width: 130px"></el-input>
</div>
<div ref="searchBox" class="mt10">
<QueryFormPanel :fields="searchConfiger" @search='onSearch'>
<template #but>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</Searchs>
</QueryFormPanel>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="exportExl">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox tabBox_zdy heightBox" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth" expand
@chooseData="handleChooseData">
<template #expand="{ props }">
<div style="max-width: 100%">
<Items :row="props || {}" :dict="dict" />
</div>
</template>
<div :style="{ height: (pageData.tableHeight + 40) + 'px' }" class="bgTable">
<WarnDataTable :loading="pageData.tableConfiger.loading" :tableHeight="pageData.tableHeight"
:data="pageData.tableData" :columns="pageData.tableColumn" table-class="warn-table"
@selectionChange="handleChooseData">
<template #sfcs="{ row }">
<span style="color: #0072ff;" @click="handleClick(row)">{{ row.sfcs }}</span>
</template>
<template #czzt="{ row }">
<DictTag :value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
<DictTag :value="row.czzt" :color="row.czzt === '01' ? '#ff2424' : '#1d72e8'" :tag="false"
:options="D_GSXT_YJXX_CZZT" />
</template>
<template #sffz>
<el-table-column prop="bqfz" width="80" align="center" label="标签分值" />
<el-table-column prop="pzxs" width="60" align="center" label="系数" />
<el-table-column prop="sffz" width="90" align="center" label="计算分值"/>
<template #bqys="{ row }">
<div :style="{ 'background-color': bqYs(row.bqys) }">
<DictTag :value="row.bqys" color="#fff" :tag="false" :options="D_GS_SSYJ" />
</div>
</template>
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<el-link type="primary" @click="chooseJfFun(row)">配置系统</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link>
<el-link type="danger" @click="handleQsFk(row)">转会商</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<el-link type="primary" @click="openAddFrom(row)">详情</el-link>
<template #operation="{ row }">
<div style="display: flex;justify-content: space-between;">
<span class="warning" @click="pushAssess(row)">全息档案</span>
<span class="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</span>
<span class="primary" @click="chooseJfFun(row)">配置系统</span>
<span class="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</span>
<span class="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</span>
<span class="primary" @click="openAddFrom(row)">详情</span>
</div>
</template>
</MyTable>
</WarnDataTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
@ -76,10 +63,7 @@
<script setup>
import Czjy from './components/czjy.vue'
import { getItem, setItem } from '@/utils/storage'
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Searchs from "@/components/aboutTable/Search.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import { getItem } from '@/utils/storage'
import Pages from "@/components/aboutTable/Pages.vue";
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import Information from "@/views/home/model/information.vue";
@ -87,31 +71,34 @@ import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import AddFrom from "./components/addFrom.vue";
import ChooseJf from '@/components/ChooseList/ChooseJf/index.vue'
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { qcckPost } from "@/api/qcckApi.js";
import { yjzxSfyjSelectList, yjzxyjzxSfyjSelectList } from "@/api/yj.js";
import { tbGsxtBqglSelectList } from '@/api/zdr'
import Detail from './components/detail.vue'
import { watch } from "vue";
import emitter from "@/utils/eventBus.js";
import { holographicProfileJump } from "@/utils/tools.js"
import Items from "./item/items.vue"
import { holographicProfileJump, bqYs } from "@/utils/tools.js"
import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js"
import WarnDataTable from '@/views/backOfficeSystem/ces/components/WarnDataTable.vue'
import QueryFormPanel from "@/views/backOfficeSystem/ces/components/QueryFormPanel.vue";
const czjyRef = ref()
const { proxy } = getCurrentInstance();
const searchBox = ref();
const { D_GSXT_YJXX_CZZT, D_GS_SSYJ, D_BZ_YJJB } = proxy.$dict("D_GSXT_YJXX_CZZT", "D_GS_SSYJ", 'D_BZ_YJJB')
const dict = reactive({ D_GSXT_YJXX_CZZT, D_GS_SSYJ })
// 搜索配置
const searchConfiger = ref([
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "预警标签", prop: 'yjbqmc', placeholder: "请输入预警标签", showType: "input" },
{ label: "部门", prop: 'ssbmdm', placeholder: "请选择部门", showType: "department" },
{ label: "级别", prop: 'bqys', placeholder: "请选择级别", showType: "select", options: D_BZ_YJJB },
{ label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" },
{ label: "预警时间", prop: 'times', showType: "datetimerange" },
{ key: 'xm', label: '姓名', type: 'input', placeholder: '请输入姓名' },
{ key: 'sfzh', label: '身份证号码', type: 'input', placeholder: '请输入身份证号码' },
{ key: 'yjbqmc', label: '预警标签', type: 'input', placeholder: '请输入预警标签' },
{ key: 'ssbmdm', label: '部门', type: 'department', placeholder: '请选择部门' },
{ key: 'bqys', label: '级别', type: 'select', options: D_BZ_YJJB, placeholder: '请选择级别' },
{ key: 'ksfz', label: '开始身份分值', type: 'number', placeholder: '请输入开始身份分值' },
{ key: 'jsfz', label: '结束身份分值', type: 'number', placeholder: '请输入结束身份分值' },
{ key: 'startTime', label: '预警时间', type: 'datetimerange', placeholder: '请选择预警时间' },
]);
const permission_sfqs = ref(false)
@ -136,14 +123,19 @@ const pageData = reactive({
},
controlsWidth: 300, //操作栏宽度
tableColumn: [
{ label: "状态", prop: "czzt", showSolt: true },
{ label: "预警时间", prop: "yjsj" ,width: 180},
{ label: "姓名", prop: "xm" },
{ label: "身份证号", prop: "sfzh" ,width: 180},
{ label: "标签", prop: "yjbqmc" },
{ label: "接收单位", prop: "ssbm" },
{ label: "活动频次", prop: "sfcs",width: 90 },
{ label: "预警分值", prop: "sffz",showSolt: true },
{ type: 'index', label: '序号', width: 55, align: 'center' },
{ label: '状态', width: 80, align: 'center', slotName: 'czzt' },
{ prop: 'yjsj', label: '预警时间', width: 180, align: 'center' },
{ prop: 'xm', label: '姓名', width: 100, align: 'center' },
{ prop: 'sfzh', label: '身份证号', width: 180, align: 'center' },
{ prop: 'yjbqmc', label: '标签', width: 120, align: 'center' },
{ label: '级别', width: 88, align: 'center', slotName: 'bqys' },
{ prop: 'ssbm', label: '接收单位', align: 'center' },
{ label: '活动频次', slotName: 'sfcs', width: 90, align: 'center' },
{ prop: 'bqfz', label: '标签分值', width: 80, align: 'center' },
{ prop: 'pzxs', label: '系数', width: 60, align: 'center' },
{ prop: 'sffz', label: '计算分值', width: 90, align: 'center' },
{ label: '操作', width: 240, slotName: 'operation' },
]
});
@ -163,18 +155,15 @@ onMounted(() => {
const onSearch = (val) => {
queryFrom.value = { ...queryFrom.value, ...val };
queryFrom.value.startTime = val.times ? val.times[0] : ''
queryFrom.value.endTime = val.times ? val.times[1] : ''
queryFrom.value = { ...val };
if (val.startTime && Array.isArray(val.startTime)) {
queryFrom.value.startTime = val.startTime[0]
queryFrom.value.endTime = val.startTime[1]
}
pageData.pageConfiger.pageCurrent = 1;
getList();
};
const reset = () => {
delete queryFrom.value.ksfz
delete queryFrom.value.jsfz
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList();
@ -193,16 +182,8 @@ const getList = () => {
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize,
}
delete params.times;
yjzxSfyjSelectList(params).then((res) => {
pageData.tableData = Array.isArray(res?.records) ? res.records : [];
pageData.tableData = pageData.tableData.map(item => {
return {
...item,
bqys_cname: getMultiDictVal(item.bqys, D_GS_SSYJ),
czzt_cname: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
}
})
pageData.total = res?.total || 0;
pageData.tableConfiger.loading = false;
}).catch(() => {
@ -299,17 +280,6 @@ const submit = () => {
const closeFszl = () => {
semdFqzlRef.value.close()
}
const bqYs = (val) => {
if (val == '01') {
return '#ff0202'
} else if (val == '02') {
return '#ff8c00'
} else if (val == '03') {
return '#ffff00'
} else if (val == '04') {
return '#0000ff'
}
}
// 新增
const addModelRef = ref(null)
@ -336,7 +306,7 @@ const handleCzjy = (row) => {
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 280;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () {
tabHeightFn();
};
@ -353,9 +323,12 @@ const exportExl = () => {
xm: "姓名",
sfzh: "身份证号",
yjbqmc: "标签",
bqys_cname: "级别",
ssbm: "接收单位",
sfcs: "活动频次",
sffz: "预警分值",
bqfz: "标签分值",
pzxs: "系数",
sffz: "计算分值",
}
/** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
@ -370,14 +343,14 @@ const exportExl = () => {
}
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ids}, '/mosty-gsxt/yjzxSfyj/batchQs').then(() => {
qcckPost({ ids }, '/mosty-gsxt/yjzxSfyj/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
@ -388,15 +361,20 @@ const handleQs = () => {
</script>
<style scoped></style>
<style lang="scss">
<style lang="scss" scoped>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
.tabBox_zdy {
.el-table--fit {
overflow: unset !important;
}
::v-deep .el-table .cell {
padding: 0;
}
::v-deep .el-table .el-table__cell {
padding: 4px 0;
}
.bgTable {
background-color: #fff;
}
</style>

View File

@ -0,0 +1,332 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10 mb10">
<Search :searchArr="searchConfiger" @submit="onSearch" ref="searchDom" :key="pageData.keyCount">
</Search>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="exportExl">批量导出</el-button>
<el-button type="primary" size="small" @click="handleQs">批量签收</el-button>
<el-button type="primary" size="small" @click="handleQs">批量分析</el-button>
<el-button type="primary" size="small" @click="countPeople">计算人数</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox heightBox">
<MyTable expand :tableData="pageData.tableData" :tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight" :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth" @chooseData="handleChooseData">
<template #expand="{ props }">
<div style="max-width: 100%">
<Items :row="props || {}" />
</div>
</template>
<template #czzt="{ row }">
<DictTag :value="row.czzt" :tag="false" :options="D_GSXT_YJXX_CZZT" />
</template>
<template #xbdm="{ row }">
<DictTag :value="row.xbdm" :tag="false" :options="D_BZ_XB" />
</template>
<template #age="{ row }">
<span v-if="row.yjRysfzh"> {{ IdCard(row.yjRysfzh, 3) }} </span>
</template>
<template #yjJb="{ row }">
<DictTag :value="row.yjJb" :tag="false" :options="D_BZ_YJJB" />
</template>
<template #bqdl="{ row }">
<DictTag :value="row.bqdl" :tag="false" :options="D_GS_QLZDRLX" />
</template>
<template #yjLylx="{ row }">
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" />
</template>
<template #yjLx="{ row }">
<DictTag :value="row.yjLx" :tag="false" :options="D_GS_QLZDRYXX" />
</template>
<template #controls="{ row }">
<el-link type="primary" @click="handleQsSingle(row)">签收</el-link>
<el-link type="primary" @click="particularsOpen(row)">详情</el-link>
<el-link type="warning" @click="pushWarning(row)">指派</el-link>
<el-link type="warning" v-if="row.sfbc != '1'" @click="failWarning(row)">报错</el-link>
<el-link type="primary" @click="payAttention(row)">关注</el-link>
</template>
<template #cszt="{ row }">
<DictTag :value="row.cszt" :tag="false" :options="D_GSXT_YJXX_CZZT" />
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
<ZpForm v-model="warningShow" :dataList="dataList" />
<Particulars v-model="particularsShow" :dataList="dataPres"
:dict="{ D_BZ_XB, D_BZ_YJJB, D_GS_QLZDRLX, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB }" />
<peopleConut v-model="searchOpen" :dataConut="dataConut" />
</template>
<script setup>
import { getMultiDictVal } from "@/utils/dict.js"
import { exportExlByObj } from "@/utils/exportExcel.js"
import Items from '@/views/backOfficeSystem/fourColorManage/warningList/portraitWarning/item/items.vue'
import ZpForm from "./zpForm.vue";
import Particulars from "./particulars.vue";
import { IdCard } from '@/utils/validate.js'
import Search from "@/components/aboutTable/Search.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance, } from "vue";
import peopleConut from "./peopleConut.vue";
const { proxy } = getCurrentInstance();
const { D_BZ_YJLY, D_GS_QLZDRLX, D_GS_ZDR_GJLB, D_BZ_YJJB, D_GS_CSZT, D_GS_QLZDRYXX, D_BZ_XB, D_GSXT_YJXX_CZZT, D_GS_ZDR_RYJB } = proxy.$dict('D_BZ_YJLY', 'D_GS_QLZDRLX', "D_BZ_YJJB", "D_GS_QLZDRYXX", "D_BZ_XB", "D_GSXT_YJXX_CZZT", "D_GS_ZDR_RYJB", 'D_GS_ZDR_GJLB', 'D_GS_CSZT'); //获取字典数据
const searchBox = ref(); //搜索框
const warningShow = ref(false);
const dataList = ref([]);
const searchConfiger = ref(
[
{ label: "预警时间", prop: 'startTime', showType: "datetimerange", placeholder: "请选择预警时间" },
{ label: "预警级别", prop: 'yjJb', placeholder: "请选择预警级别", showType: "select", options: D_BZ_YJJB, multiple: true },
{ label: "接收单位", prop: 'ssbmdm', showType: "department" },
{ prop: 'sfglyj', showType: "checkbox", showSelectAll: false, options: [{ label: '关联预警', value: '1' }] },
{ prop: 'sfgz', showType: "checkbox", showSelectAll: false, options: [{ label: '重点关注', value: '1' }] },
{ prop: 'sfzp', showType: "checkbox", showSelectAll: false, options: [{ label: '二次指派', value: '1' }] },
{ label: "超时状态", prop: 'cszt', placeholder: "请选择超时状态", showType: "select", options: D_GS_CSZT },
{ label: "人员类别", prop: 'bqdl', placeholder: "请选择人员类别", showType: "select", options: D_GS_QLZDRLX },
{ label: "预警次数", prop: 'yjCs', placeholder: "请输入预警次数", showType: "number" },
{ label: "人员级别", prop: 'yjJb', showType: "select", options: D_GS_ZDR_RYJB },
{ label: "轨迹类别", prop: 'yjLylx', showType: "select", options: D_GS_ZDR_GJLB },
{ label: "姓名", prop: 'yjRyxm', placeholder: "请输入姓名", showType: "input" },
{ label: "性别", prop: 'xbdm', placeholder: "请选择性别", showType: "select", options: D_BZ_XB },
{ label: "身份证", prop: 'yjRysfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "开始年龄", prop: 'ksnl', placeholder: "请输入年龄", showType: "number" },
{ label: "结束年龄", prop: 'jsnl', placeholder: "请输入年龄", showType: "number" },
{ label: "活动发生地", prop: 'yjDz', placeholder: "请输入活动发生地", showType: "input" },
{ label: "人员细类", prop: 'yjbqmc', placeholder: "请输入人员细类", showType: "input" },
])
const queryFrom = ref({});
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkBox",
loading: false,
haveControls: true
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 200, //操作栏宽度
tableColumn: [
{ label: "预警状态", prop: "czzt", showSolt: true, width: 70 },
{ label: "预警时间", prop: "yjSj", width: 148 },
{ label: "人员姓名", prop: "yjRyxm", },
{ label: "身份证号", prop: "yjRysfzh", width: 148 },
{ label: "性别", prop: "xbdm", showSolt: true, width: 60 },
{ label: "年龄", prop: "age", showSolt: true, width: 50 },
{ label: "级别", prop: "yjJb", showSolt: true, width: 50 },
{ label: "人员类别", prop: "bqdl", showSolt: true, width: 100 },
{ label: "人员细类", prop: "yjbqmc" },
{ label: "轨迹类别", prop: "yjLylx", showSolt: true },
{ label: "活动发生地", prop: "yjDz" },
{ label: "接收单位", prop: "ssbm", width: 148 },
{ label: "次数", prop: "yjCs", width: 50 },
{ label: "超时状态", prop: "cszt" },
]
});
onMounted(() => {
tabHeightFn();
getList()
});
// 搜索
const onSearch = (val) => {
queryFrom.value = { ...val, yjJb: val.yjJb?.join(',') || '' }
queryFrom.value.startTime = val.startTime ? val.startTime[0] : ''
queryFrom.value.endTime = val.startTime ? val.startTime[1] : ''
queryFrom.value.sfglyj = val.sfglyj?.join(',') || ''
queryFrom.value.sfgz = val.sfgz?.join(',') || ''
queryFrom.value.sfzp = val.sfzp?.join(',') || ''
pageData.pageConfiger.pageCurrent = 1;
getList()
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList()
}
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList()
}
const getList = () => {
pageData.tableConfiger.loading = true;
const promes = {
...queryFrom.value,
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize,
}
delete promes.times;
qcckPost(promes, '/mosty-gsxt/tbYjxx/getQlzdrPageList').then((res) => {
pageData.total = res.total || 0;
pageData.tableConfiger.loading = false;
pageData.tableData = res.records || []
}).catch(() => {
pageData.tableConfiger.loading = false;
})
}
const pushWarning = (val) => {
warningShow.value = true;
dataList.value = val;
}
const failWarning = (val) => {
let ids = [val.id]
qcckPost({ ids }, '/mosty-gsxt/tbYjxx/yjbc').then((res) => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}
/** 选中项 */
const selectRows = ref([])
const handleChooseData = (val) => {
selectRows.value = val
}
const exportExl = () => {
const titleObj = {
czzt_name: "状态",
yjSj: "预警时间",
yjRyxm: "人员姓名",
yjRysfzh: "身份证号",
yjJb_name: "预警级别",
bqdl_name: "人员类别",
yjbqmc: "细类",
yjDz: "活动发生地",
ssbm: "接收单位",
yjCs: "预警次数",
}
/** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
const data = needArr.map(item => {
return {
...item,
czzt_name: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
yjJb_name: getMultiDictVal(item.yjJb, D_BZ_YJJB),
bqdl_name: getMultiDictVal(item.bqdl, D_GS_QLZDRLX),
}
})
exportExlByObj(titleObj, data, '七类重点')
}
// 批量签收
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ ids }, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
// 详情
const dataPres = ref({})
const particularsShow = ref(false);
const particularsOpen = (row) => {
dataPres.value = row
particularsShow.value = true;
}
// 单条签收
const handleQsSingle = (row) => {
if (row.czzt == '02') return proxy.$message({ type: "warning", message: "数据已签收,无需重复签收" });
proxy.$confirm('确认要签收该条预警数据吗?', "警告", { type: "warning" }).then(() => {
qcckPost({ ids: [row.id] }, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
// 关注
const payAttention = (row) => {
let promes = {}
if (row.sfgz == '1') {
promes.sfgz = '0'
promes.msg = '取消关注'
} else {
promes.sfgz = '1'
promes.msg = '关注'
}
proxy.$confirm('确认要关注该条预警数据吗?', "警告", { type: "warning" }).then(() => {
qcckPost({ sfgz: promes.sfgz, id: row.id }, '/mosty-gsxt/tbYjxx/yjgz').then(() => {
proxy.$message({ type: "success", message: `${promes.msg}成功` });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: `${promes.msg}失败` });
});
}).catch(() => { });
}
// 人数计算
const searchDom = ref(null)
const dataConut = ref(0)
const searchOpen = ref(false)
const countPeople = () => {
const promes = {
...searchDom.value.searchObj,
yjJb: searchDom.value.searchObj.yjJb?.join(',') || '',
startTime: searchDom.value.searchObj.startTime ? searchDom.value.searchObj.startTime[0] : '',
endTime: searchDom.value.searchObj.endTime ? searchDom.value.searchObj.endTime[1] : '',
sfglyj: searchDom.value.searchObj.sfglyj?.join(',') || '',
sfgz: searchDom.value.searchObj.sfgz?.join(',') || '',
sfzp: searchDom.value.searchObj.sfzp?.join(',') || '',
}
qcckPost(promes, '/mosty-gsxt/tbYjxx/bkyjQctj').then((res) => {
dataConut.value = res || 0
searchOpen.value = true
}).catch(() => {
// proxy.$message({ type: "error", message: `${promes.msg}失败` });
});
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
window.onresize = function () { tabHeightFn(); };
};
</script>
<style lang="scss" scoped>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
::v-deep .el-table .cell {
padding: 0;
}
::v-deep .el-table .el-table__cell {
padding: 4px 0;
}
</style>

View File

@ -0,0 +1,335 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10 mb10">
<!-- <Search :searchArr="searchConfiger" @submit="onSearch" ref="searchDom" :key="pageData.keyCount">
</Search> -->
<QueryFormPanel v-model="queryFrom" :fields="searchConfiger" ref="searchDom" @search='onSearch'>
<template #but>
<el-button type="primary" size="small" @click="exportExl">批量导出</el-button>
<el-button type="primary" size="small" @click="handleQs">批量签收</el-button>
<el-button type="primary" size="small" @click="handleQs">批量分析</el-button>
<el-button type="primary" size="small" @click="countPeople">计算人数</el-button>
</template>
</QueryFormPanel>
</div>
<!-- <PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="exportExl">批量导出</el-button>
<el-button type="primary" size="small" @click="handleQs">批量签收</el-button>
<el-button type="primary" size="small" @click="handleQs">批量分析</el-button>
<el-button type="primary" size="small" @click="countPeople">计算人数</el-button>
</template>
</PageTitle> -->
<!-- 表格 -->
<div style="background-color: #fff;">
<WarnDataTable :loading="pageData.tableConfiger.loading" :tableHeight="pageData.tableHeight"
:data="pageData.tableData" :columns="pageData.tableColumn" table-class="warn-table"
@selectionChange="handleChooseData">
<template #status="{ row }">
<DictTag :value="row.czzt" :color="row.czzt === '01' ? '#ff2424' : '#1d72e8'" :tag="false"
:options="D_GSXT_YJXX_CZZT" />
</template>
<template #xbdm="{ row }">
<DictTag :value="row.xbdm" :tag="false" :options="D_BZ_XB" />
</template>
<template #yjJb="{ row }">
<div :style="{ 'background-color': bqYs(row.yjJb) }">
<DictTag :value="row.yjJb" color="#fff" :tag="false" :options="D_BZ_YJJB" />
</div>
</template>
<template #bqdl="{ row }">
<DictTag :value="row.bqdl" :tag="false" :options="D_GS_QLZDRLX" />
</template>
<template #yjLylx="{ row }">
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" />
</template>
<template #cszt="{ row }">
<DictTag :value="row.cszt" :tag="false" :options="D_GS_CSZT" />
</template>
<template #operation="{ row }">
<div style="display: flex;justify-content: space-between;">
<span class="primary" @click="handleQsSingle(row)">签收</span>
<span class="primary" @click="particularsOpen(row)">详情</span>
<span class="warning" @click="pushWarning(row)">指派</span>
<span class="warning" v-if="row.sfbc != '1'" @click="failWarning(row)">报错</span>
<span class="primary" @click="payAttention(row)">关注</span>
</div>
</template>
</WarnDataTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
<ZpForm v-model="warningShow" :dataList="dataList" />
<Particulars v-model="particularsShow" :dataList="dataPres"
:dict="{ D_BZ_XB, D_BZ_YJJB, D_GS_QLZDRLX, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB }" />
<peopleConut v-model="searchOpen" :dataConut="dataConut" />
</template>
<script setup>
import { getMultiDictVal } from "@/utils/dict.js"
import { exportExlByObj } from "@/utils/exportExcel.js"
import ZpForm from "./zpForm.vue";
import { bqYs } from '@/utils/tools.js'
import Particulars from "./particulars.vue";
import Search from "@/components/aboutTable/Search.vue";
import WarnDataTable from '@/views/backOfficeSystem/ces/components/WarnDataTable.vue'
import QueryFormPanel from "@/views/backOfficeSystem/ces/components/QueryFormPanel.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
// import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance, } from "vue";
import peopleConut from "./peopleConut.vue";
const { proxy } = getCurrentInstance();
const { D_BZ_YJLY, D_GS_QLZDRLX, D_GS_ZDR_GJLB, D_BZ_YJJB, D_GS_CSZT, D_GS_QLZDRYXX, D_BZ_XB, D_GSXT_YJXX_CZZT, D_GS_ZDR_RYJB, D_BZ_SF } = proxy.$dict('D_BZ_YJLY', 'D_GS_QLZDRLX', "D_BZ_YJJB", "D_GS_QLZDRYXX", "D_BZ_XB", "D_GSXT_YJXX_CZZT", "D_GS_ZDR_RYJB", 'D_GS_ZDR_GJLB', 'D_GS_CSZT', "D_BZ_SF"); //获取字典数据
const searchBox = ref(); //搜索框
const warningShow = ref(false);
const dataList = ref([]);
const searchConfiger = ref(
[
{ key: 'startTime', label: '预警时间', type: 'datetimerange', placeholder: '请选择预警时间' },
{ key: 'yjJb', label: '预警级别', type: 'select', options: D_BZ_YJJB, multiple: true, placeholder: '请选择预警级别' },
{ key: 'ssbmdm', label: '接收单位', type: 'department', placeholder: '请选择接收单位' },
{ key: 'sfglyj', label: '关联预警', type: 'select', options: D_BZ_SF, placeholder: '请选择关联预警' },
{ key: 'yjRyxm', label: '姓名', type: 'input', placeholder: '请输入姓名' },
{ key: 'xbdm', label: '性别', type: 'select', options: D_BZ_XB, placeholder: '请选择性别' },
{ key: 'cszt', label: '超时状态', type: 'select', options: D_GS_CSZT, placeholder: '请选择超时状态' },
{ key: 'bqdl', label: '人员类别', type: 'select', options: D_GS_QLZDRLX, placeholder: '请选择人员类别' },
{ key: 'sfgz', label: '重点关注', type: 'select', options: D_BZ_SF, placeholder: '请选择重点关注' },
{ key: 'sfzp', label: '二次指派', type: 'select', options: D_BZ_SF, placeholder: '请选择二次指派' },
{ key: 'yjRysfzh', label: '身份证号码', type: 'input', placeholder: '请输入身份证号码' },
{ key: 'ksnl', label: '开始年龄', type: 'input', placeholder: '请输入开始年龄' },
{ key: 'jsnl', label: '结束年龄', type: 'input', placeholder: '请输入结束年龄' },
{ key: 'yjCs', label: '预警次数', type: 'input', placeholder: '请输入预警次数' },
{ key: 'bqdl', label: '人员级别', type: 'select', options: D_GS_ZDR_RYJB },
{ key: 'yjLylx', label: '轨迹类别', type: 'select', options: D_GS_ZDR_GJLB },
{ key: 'yjDz', label: '活动发生地', type: 'input', placeholder: '请输入活动发生地' },
{ key: 'yjbqmc', label: '人员细类', type: 'input', placeholder: '请输入人员细类' }
])
const queryFrom = ref({});
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableHeight: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkBox",
loading: false,
haveControls: true
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 200, //操作栏宽度
tableColumn: [
{ type: 'index', label: '序号', width: 55, align: 'center' },
{ label: '预警状态', width: 86, align: 'center', slotName: 'status' },
{ prop: 'yjSj', label: '预警时间', width: 150 },
{ prop: 'yjRyxm', label: '人员姓名', width: 80 },
{ prop: 'yjRysfzh', label: '身份证号', width: 158 },
{ label: '性别', width: 56, align: 'center', slotName: 'xbdm' },
{ prop: 'nl', label: '年龄', width: 56, align: 'center' },
{ label: '预警级别', width: 88, align: 'center', slotName: 'yjJb' },
{ label: '人员类别', width: 90, align: 'center', slotName: 'bqdl' },
{ prop: 'yjbqmc', label: '人员细类', width: 92 },
{ label: '轨迹类别', width: 92, align: 'center', slotName: 'yjLylx' },
{ prop: 'yjDz', label: '活动发生地' },
{ prop: 'ssbm', label: '接收单位' },
{ prop: 'yjCs', label: '次数', width: 60, align: 'center' },
{ label: '操作', width: 180, slotName: 'operation' },
{ label: '超时状态', width: 80, align: 'center', slotName: 'cszt' }
]
});
onMounted(() => {
tabHeightFn();
getList()
});
// 搜索
const onSearch = (val) => {
queryFrom.value = { ...val, yjJb: val.yjJb?.join(',') || '' }
queryFrom.value.startTime = val.startTime ? val.startTime[0] : ''
queryFrom.value.endTime = val.startTime ? val.startTime[1] : ''
// queryFrom.value.sfglyj = val.sfglyj?.join(',') || ''
// queryFrom.value.sfgz = val.sfgz?.join(',') || ''
// queryFrom.value.sfzp = val.sfzp?.join(',') || ''
pageData.pageConfiger.pageCurrent = 1;
getList()
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList()
}
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList()
}
const getList = () => {
pageData.tableConfiger.loading = true;
const promes = {
...queryFrom.value,
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize,
yjlb: '03'
}
delete promes.times;
qcckPost(promes, '/mosty-gsxt/tbYjxx/getPageList').then((res) => {
pageData.total = res.total || 0;
pageData.tableConfiger.loading = false;
pageData.tableData = res.records || []
}).catch(() => {
pageData.tableConfiger.loading = false;
})
}
const pushWarning = (val) => {
warningShow.value = true;
dataList.value = val;
}
const failWarning = (val) => {
let ids = [val.id]
qcckPost({ ids }, '/mosty-gsxt/tbYjxx/yjbc').then((res) => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}
/** 选中项 */
const selectRows = ref([])
const handleChooseData = (val) => {
selectRows.value = val
}
const exportExl = () => {
const titleObj = {
czzt_name: "状态",
yjSj: "预警时间",
yjRyxm: "人员姓名",
yjRysfzh: "身份证号",
yjJb_name: "预警级别",
bqdl_name: "人员类别",
yjbqmc: "细类",
yjDz: "活动发生地",
ssbm: "接收单位",
yjCs: "预警次数",
}
/** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
const data = needArr.map(item => {
return {
...item,
czzt_name: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
yjJb_name: getMultiDictVal(item.yjJb, D_BZ_YJJB),
bqdl_name: getMultiDictVal(item.bqdl, D_GS_QLZDRLX),
}
})
exportExlByObj(titleObj, data, '七类重点')
}
// 批量签收
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ ids }, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
// 详情
const dataPres = ref({})
const particularsShow = ref(false);
const particularsOpen = (row) => {
dataPres.value = row
particularsShow.value = true;
}
// 单条签收
const handleQsSingle = (row) => {
if (row.czzt == '02') return proxy.$message({ type: "warning", message: "数据已签收,无需重复签收" });
proxy.$confirm('确认要签收该条预警数据吗?', "警告", { type: "warning" }).then(() => {
qcckPost({ ids: [row.id] }, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
// 关注
const payAttention = (row) => {
let promes = {}
if (row.sfgz == '1') {
promes.sfgz = '0'
promes.msg = '取消关注'
} else {
promes.sfgz = '1'
promes.msg = '关注'
}
proxy.$confirm('确认要关注该条预警数据吗?', "警告", { type: "warning" }).then(() => {
qcckPost({ sfgz: promes.sfgz, id: row.id }, '/mosty-gsxt/tbYjxx/yjgz').then(() => {
proxy.$message({ type: "success", message: `${promes.msg}成功` });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: `${promes.msg}失败` });
});
}).catch(() => { });
}
// 人数计算
const searchDom = ref(null)
const dataConut = ref(0)
const searchOpen = ref(false)
const countPeople = () => {
const promes = {
...searchDom.value.formState,
yjJb: searchDom.value.formState.yjJb?.join(',') || '',
startTime: searchDom.value.formState.startTime ? searchDom.value.formState.startTime[0] : '',
endTime: searchDom.value.formState.endTime ? searchDom.value.formState.endTime[1] : '',
}
qcckPost(promes, '/mosty-gsxt/tbYjxx/bkyjQctj').then((res) => {
dataConut.value = res || 0
searchOpen.value = true
}).catch(() => {
// proxy.$message({ type: "error", message: `${promes.msg}失败` });
});
}
// 表格高度计算
const tabHeightFn = () => {
console.log("xxxxxxx");
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () { tabHeightFn(); };
};
</script>
<style lang="scss" scoped>
.danger {
color: #ff2424;
}
.ok {
color: #1d72e8;
}
</style>

View File

@ -0,0 +1,472 @@
<!--预警指派展示组件 -->
<template>
<el-dialog :draggable="true" :model-value="modelValue" :title="title" :width="width" @close="close" append-to-body>
<div class="archive-container" v-loading="loading">
<div class="three-column-layout">
<!-- 重点人员基本信息页 -->
<div class="column">
<div class="column-header">重点人员基本信息页</div>
<div class="info-section">
<div class="info-row">
<div class="info-item">
<span class="info-label">人员姓名</span>
<span class="info-value">{{ dataForm.yjRyxm }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">性别</span>
<span class="info-value">
<DictTag :value="dataForm.xbdm" :tag="false" :options="dict.D_BZ_XB" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">年龄</span>
<span class="info-value">{{ dataForm.nl }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">身份证号码</span>
<span class="info-value">{{ dataForm.yjRysfzh }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">户籍地</span>
<span class="info-value">{{ dataForm.hjdXz }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">现住地址</span>
<span class="info-value">{{ dataForm.xzdXz }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">入库时间</span>
<span class="info-value">{{ dataForm.zdrRkkssj }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">预警级别</span>
<span class="info-value warning-level" :class="ys()">
<DictTag :value="dataForm.yjJb" :tag="false" :options="dict.D_BZ_YJJB" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">人员类别</span>
<span class="info-value">
<DictTag :value="dataForm.bqdl" :tag="false" :options="dict.D_GS_QLZDRLX" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">人员级别</span>
<span class="info-value">
<DictTag :value="dataForm.yjJb" :tag="false" :options="dict.D_GS_ZDR_RYJB" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">人员细类</span>
<span class="info-value">{{ dataForm.yjbqmc }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">立案单位</span>
<span class="info-value"></span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">简要案情</span>
<span class="info-value text-area"></span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">一标三实</span>
<span class="info-value text-area"></span>
</div>
</div>
</div>
</div>
<!-- 重点人员活动信息页 -->
<div class="column">
<div class="column-header">重点人员活动信息页</div>
<div class="info-section blue-bg">
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">轨迹类别</span>
<span class="info-value">
<DictTag :value="dataForm.yjLylx" :tag="false" :options="dict.D_GS_ZDR_GJLB" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">核查时间</span>
<span class="info-value">
<span v-if="dataForm.fkList && dataForm.fkList.length > 0">{{ dataForm.fkList[0].czsj }}</span>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">比对时间</span>
<span class="info-value">{{ dataForm.yjSj }}</span>
</div>
</div>
<!-- <div class="info-row">
<div class="info-item full-width">
<span class="info-label">活动发生地</span>
<span class="info-value">{{ dataForm.xxdz }}</span>
</div>
</div> -->
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">活动场所</span>
<span class="info-value">
<span v-if="dataForm.fkList && dataForm.fkList.length > 0">{{ dataForm.fkList[0].xxdz }}</span>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">活动信息</span>
<span class="info-value">{{ dataForm.yjNr }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">信息提供单位</span>
<span class="info-value">{{ dataForm.jczmc }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">信息接收单位</span>
<span class="info-value">{{ dataForm.ssbm }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">二次指派单位</span>
<span class="info-value">
<div v-if="dataForm.zpList && dataForm.zpList.length > 0">
<span v-for="(item, index) in dataForm.zpList" :key="item.id">
{{ item.zpbm }}<span v-if="index < dataForm.zpList.length - 1">,</span>
</span>
</div>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">签收时限</span>
<span class="info-value">{{ dataForm.qssj }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">反馈时限</span>
<span class="info-value">{{ dataForm.fksj }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">处置建议</span>
<span class="info-value">
<div v-if="dataForm.czjyList && dataForm.czjyList.length > 0">
<div v-for="(item, index) in dataForm.czjyList" :key="item.id">
<span>{{ `${index + 1}` + item.jynr }}</span>
</div>
</div>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">反馈内容</span>
<span class="info-value">
<div v-if="dataForm.fkList && dataForm.fkList.length > 0">
<div v-for="(item, index) in dataForm.fkList" :key="item.id">
<span v-if="item.ckczbcxx">{{ `${index + 1}` + item.ckczbcxx }}</span>
</div>
</div>
</span>
</div>
</div>
</div>
</div>
<!-- 历史预警信息页 -->
<div class="column">
<div class="column-header">历史预警信息页</div>
<div class="info-section">
<div class="history-item" v-for="(item, index) in dataForm.yjgjList" :key="item.id">
<span class="history-index">{{ `${index + 1}` }}</span>
<span class="history-content">{{ item.yjNr }}</span>
</div>
</div>
</div>
</div>
</div>
<template #footer>
<div class="dialog-footer" style="text-align: center;">
<el-button @click="close">关闭</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { defineProps, getCurrentInstance, watch, ref } from 'vue';
import { qcckGet } from '@/api/qcckApi.js'
const { proxy } = getCurrentInstance();
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
title: {
type: String,
default: '预警详情'
},
width: {
type: String,
default: '90%'
}, dataList: {
type: Object,
default: () => ({})
},
dict: {
type: Object,
default: () => ({})
}
});
// 定义事件
const emit = defineEmits(['update:modelValue']);
const loading = ref(false)
let abortController = null
const close = () => {
if (abortController) {
abortController.abort()
abortController = null
}
loading.value = false
emit('update:modelValue', false);
};
const dataForm = ref({});
watch(() => props.modelValue, (newVal) => {
if (newVal) {
getPart(props.dataList.id)
}
}, { deep: true });
const getPart = (id) => {
if (abortController) {
abortController.abort()
}
abortController = new AbortController()
loading.value = true
qcckGet({}, `/mosty-gsxt/tbYjxx/getInfo/${id}`, { signal: abortController.signal }).then(res => {
if (res) {
dataForm.value = res
} else {
dataForm.value = {}
}
}).catch(err => {
if (err.name !== 'AbortError') {
console.error('请求失败:', err)
}
}).finally(() => {
loading.value = false
})
}
const ys = () => {
switch (dataForm.value.yjJb) {
case '01':
return 'red';
case '02':
return 'orange';
case '03':
return 'yellow';
case '04':
return 'blue';
default:
return '';
}
}
</script>
<style scoped>
.archive-container {
padding: 20px;
height: 600px;
overflow-y: auto;
}
.three-column-layout {
display: flex;
gap: 20px;
height: 100%;
}
.column {
flex: 1;
display: flex;
flex-direction: column;
min-width: 300px;
}
.column-header {
font-size: 16px;
font-weight: bold;
margin-bottom: 15px;
padding: 10px;
background: #f0f2f5;
border: 1px solid #e4e7ed;
border-radius: 4px 4px 0 0;
text-align: center;
color: #303133;
}
.column .info-section {
flex: 1;
border-radius: 0 0 4px 4px;
overflow-y: auto;
}
.info-section {
border: 1px solid #e4e7ed;
border-radius: 4px;
padding: 15px;
background: #ffffff;
}
.info-section.blue-bg {
background: #e6f0f8;
border-color: #9ed7ff;
}
.info-row {
display: flex;
flex-wrap: wrap;
margin-bottom: 12px;
}
.info-item {
flex: 1;
min-width: 300px;
display: flex;
align-items: center;
}
.info-item.full-width {
flex: 100%;
min-width: 100%;
}
.info-label {
width: 80px;
font-weight: bold;
margin-right: 10px;
white-space: nowrap;
color: #333;
}
.info-value {
flex: 1;
padding: 4px 8px;
border: 1px solid #dcdfe6;
border-radius: 4px;
background: #ffffff;
min-height: 28px;
display: flex;
align-items: center;
}
.info-value.text-area {
min-height: 80px;
align-items: flex-start;
padding: 8px;
resize: vertical;
}
/* 红 */
.warning-level.red {
background: #fef0f0;
border-color: #ffccc7;
color: #f56c6c !important;
font-weight: bold;
}
/* 橙 */
.warning-level.orange {
background: #fffbe6;
border-color: #ffe58f;
color: #d48806 !important;
font-weight: bold;
}
/* 黄 */
.warning-level.yellow {
background: #fdf6ec;
border-color: #faecd8;
color: #e6a23c !important;
font-weight: bold;
}
/* 蓝 */
.warning-level.blue {
background: #ecf5ff;
border-color: #d9ecff;
color: #409eff !important;
font-weight: bold;
}
.history-item {
margin-bottom: 10px;
padding: 8px 12px;
border: 1px solid #e4e7ed;
border-radius: 4px;
background: #ffffff;
display: flex;
/* align-items: center; */
}
.history-index {
font-weight: bold;
margin-right: 10px;
color: #409eff;
}
.history-content {
flex: 1;
color: #606266;
}
.demo-tabs {
margin-bottom: 20px;
}
::v-deep .el-tabs__header {
margin-bottom: 20px;
}
::v-deep .el-tabs__content {
min-height: 400px;
}
</style>

View File

@ -0,0 +1,80 @@
<!--预警指派展示组件 -->
<template>
<el-dialog :draggable="true" :model-value="modelValue" :title="title" :width="width" @close="close" append-to-body>
<div class="count-container">
<div class="count-number">{{dataConut}}</div>
<div class="count-label">预警人数</div>
</div>
<template #footer>
<div class="dialog-footer" style="text-align: center;">
<el-button @click="close">关闭</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { defineProps,getCurrentInstance } from 'vue';
const { proxy } = getCurrentInstance();
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
title: {
type: String,
default: '人数查询'
},
dataConut: {
type: Number,
default: 0
},width: {
type: String,
default: '20%'
},
});
// 定义事件
const emit = defineEmits(['update:modelValue']);
const close = () => {
emit('update:modelValue', false);
};
</script>
<style scoped>
.count-container {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 40px 0;
text-align: center;
}
.count-number {
font-size: 48px;
font-weight: bold;
color: #409eff;
margin-bottom: 16px;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
animation: pulse 2s infinite;
}
.count-label {
font-size: 18px;
color: #606266;
font-weight: 500;
}
@keyframes pulse {
0% {
transform: scale(1);
}
50% {
transform: scale(1.05);
}
100% {
transform: scale(1);
}
}
</style>

View File

@ -0,0 +1,76 @@
<!--预警指派展示组件 -->
<template>
<el-dialog :draggable="true" :model-value="modelValue" :title="title" :width="width" @close="close" append-to-body>
<div class="archive-container">
<FormMessage :formList="formData" v-model="listQuery" ref="elform" :rules="rules" :labelWidth="90">
</FormMessage>
</div>
<template #footer>
<div class="dialog-footer" style="text-align: center;">
<el-button type="primary" @click="submit">确定</el-button>
<el-button @click="close">关闭</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { ref, defineProps, defineEmits, reactive, getCurrentInstance } from 'vue';
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { tbYjxxYjzp } from '@/api/yj'
const { proxy } = getCurrentInstance();
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
title: {
type: String,
default: '预警指派'
},
width: {
type: String,
default: '50%'
},
url: {
type: String,
default: ''
},
dataList: {
type: Object,
default: () => ({})
}
});
const listQuery = ref()
const formData = ref([
{ label: "指派部门", prop: "zpbmdm", depMc: 'zpbm', type: "department", width: '45%' },
{ label: "指派原因", prop: "zpyy", type: "textarea", width: '80%' },
])
const rules = reactive({
zpbmdm: [{ required: true, message: "请选择指派部门", trigger: "blur" }],
zpyy: [{ required: true, message: "请输入指派原因", trigger: "change" }],
});
const elform = ref(null)
const submit = async () => {
elform.value.submit(() => {
const params = { ...listQuery.value, yjid: props.dataList.id };
tbYjxxYjzp(params).then((res) => {
proxy.$message({ type: "success", message: "成功" });
close();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
});
}
// 定义事件
const emit = defineEmits(['update:modelValue']);
const close = () => {
elform.value.reset()
emit('update:modelValue', false);
};
</script>
<style scoped>
</style>

View File

@ -0,0 +1,441 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<Searchs :searchArr="searchConfiger" @submit="onSearch" @reset="reset" :key="pageData.keyCount">
<template #jfd>
<div>
<el-input v-model="queryFrom.ksfz" type="number" placeholder="开始身份分值" style="width: 130px"></el-input>
<span style="color: #333;margin: 0 4px;"></span>
<el-input v-model="queryFrom.jsfz" type="number" placeholder="结束身份分值" style="width: 130px"></el-input>
</div>
</template>
</Searchs>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
:expand="true" @chooseData="handleChooseData">
<template #xsd="{ row }">
{{ `${row.xsd}%` }}
</template>
<template #czzt="{ row }">
<DictTag :value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
</template>
<template #yjJb="{ row }">
<DictTag :value="row.yjJb" :tag="false" :color="bqYs(row.yjJb)" :options="D_BZ_YJJB" />
</template>
<template #yjLylx="{ row }">
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" />
</template>
<template #xbdm="{ row }">
<DictTag :value="row.xbdm" :tag="false" :options="D_BZ_XB" />
</template>
<template #expand="{ props }">
<div class="expand-content" style="max-width: 100%; max-height: 400px; overflow-y: auto; padding: 10px;">
<Items :row="props || {}" :dict="dict" />
</div>
</template>
<template #yjLx="{ row }">
<DictTag :value="row.yjLx" :tag="false" :options="D_BZ_YJLX" />
</template>
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<el-link type="primary" @click="openBox(row)">详情</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
<Detail ref="detailRef" />
<HolographicArchive v-model="assessShow" :dataList="dataList" />
<FkDialog @change="getList" lx="04" />
<Information v-model="showDialog" title="发送指令" @submit='submit' @close='closeFszl'>
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj"
:tacitly="tacitly" />
</Information>
<AddFrom ref="addModelRef" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_GS_SSYJ }" />
<!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false" :chooseJfBh="chooseJfBh" url="/yjzxZhyj/sjxspz"
:roleIds="roleIds" />
<!-- <Pagination v-model="paginationOpen" /> -->
<Pagination v-model="paginationOpen" :dataList="dataPres" :dict="{D_BZ_XB,D_BZ_YJJB,D_GS_QLZDRLX,D_GS_ZDR_RYJB,D_GS_ZDR_GJLB,D_GS_BK_CZYQ}" />
</template>
<script setup>
import Czjy from './components/czjy.vue'
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Searchs from "@/components/aboutTable/Search.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Items from "./item/items.vue";
import ChooseJf from '@/components/ChooseList/ChooseJf/index.vue'
import { tbYjxxGetZbtj, tbGsxtBqzhSelectList, yjzxZhyjSelectList } from '@/api/yj.js'
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import Information from "@/views/home/model/information.vue";
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import AddFrom from "./components/addFrom.vue";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import Detail from './components/detail.vue'
import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js"
import emitter from "@/utils/eventBus.js";
import Pagination from "./components/particulars.vue";
const permission_sfqs = ref(false)
const roleCode = ref(false)
const searchBox = ref();
const czjyRef = ref()
const { proxy } = getCurrentInstance();
const { D_GSXT_YJXX_CZZT, D_GS_SSYJ, D_BZ_YJJB, D_BZ_YJLY, D_BZ_YJLX, D_BZ_BKLYS, D_GS_CSZT, D_GS_BKZT, D_BZ_XB,D_GS_QLZDRLX,D_GS_ZDR_RYJB,D_GS_ZDR_GJLB,D_GS_BK_CZYQ } =
proxy.$dict("D_GSXT_YJXX_CZZT", "D_GS_SSYJ", "D_BZ_YJJB", "D_BZ_YJLY", "D_BZ_YJLX", "D_BZ_BKLYS", "D_GS_CSZT", "D_GS_BKZT", "D_BZ_XB","D_GS_QLZDRLX","D_GS_ZDR_RYJB","D_GS_ZDR_GJLB","D_GS_BK_CZYQ");
// 字典数据集合
const dict = ref({
D_GS_SSYJ,
D_GSXT_YJXX_CZZT,
D_BZ_YJLY,
D_BZ_YJJB,
D_BZ_YJLX
})
import { holographicProfileJump } from "@/utils/tools.js"
// 搜索配置
const searchConfiger = ref([
{ label: "布控开始时间", prop: 'bkkssj', showType: "date", placeholder: "请选择布控开始时间" },
{ label: "布控结束时间", prop: 'bkjssj', showType: "date", placeholder: "请选择布控结束时间" },
{ label: "预警时间", prop: 'startTime', showType: "datetimerange", placeholder: "请选择预警时间" },
{ label: "比中项", prop: 'yjLx', showType: "checkbox", showSelectAll: true, options: [{ label: '人员', value: '1', }, { label: '车辆', value: '2', }] },
{ label: "布控来源", prop: 'bkly', showType: "select", options: D_BZ_BKLYS, placeholder: "请选择布控来源" },
{ label: "区域所属单位", prop: 'ssbmdm', placeholder: "请选择区域所属单位", showType: "department" },
{ label: "布控单位", prop: 'ssbmdm', placeholder: "请选择布控单位", showType: "department" },
{ label: "所属部门", prop: 'ssbmdm', placeholder: "请选择所属部门", showType: "department" },
{ label: "签收状态", prop: 'czzt', showType: "select", options: D_GSXT_YJXX_CZZT },
{ label: "超时状态", prop: 'cszt', placeholder: "请选择超时状态", showType: "select", options: D_GS_CSZT },
{ label: "布控状态", prop: 'zkzt', showType: "select", options: D_GS_BKZT, placeholder: "请选择布控状态" },
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
{ label: "性别", prop: 'xbdm', showType: "select", options: D_BZ_XB, placeholder: "请选择性别" },
{ label: "开始年龄", prop: 'ksnl', placeholder: "请输入年龄", showType: "number" },
{ label: "结束年龄", prop: 'jsnl', placeholder: "请输入年龄", showType: "number" },
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "车牌号码", prop: 'clcph', placeholder: "请输入车牌号码", showType: "input" },
{ label: "预警内容", prop: 'yjNr', showType: "input", placeholder: "请输入预警内容" },
// { label: "预警标签", prop: 'yjbqmc', placeholder: "请输入预警标签", showType: "input" },
// { label: "部门", prop: 'ssbmdm', placeholder: "请选择部门", showType: "department" },
// { label: "级别", prop: 'bqys', placeholder: "请选择级别", showType: "select", options: D_BZ_YJJB },
// { label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" },
]);
const queryFrom = ref({});
// 页面数据
const pageData = reactive({
tableData: [{ sfcs: 1 }],
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkBox",
loading: false,
haveControls: true,
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
},
controlsWidth:160,
tableColumn: [
{ label: "状态", prop: "czzt", showOverflowTooltip: true, showSolt: true, width: 80 },
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true, width: 50 },
{ label: "区域名称", prop: "bkqymc", showOverflowTooltip: true, width: 50 },
{ label: "区域范围", prop: "bkfw", showOverflowTooltip: true, width: 50},
// { label: "区域所属", prop: "gkbmmc", showOverflowTooltip: true, width: 50 },
{ label: "比中", prop: "yjLx", showOverflowTooltip: true, width: 60, showSolt: true },
{ label: "姓名", prop: "yjRyxm", showOverflowTooltip: true, width: 60 },
{ label: "身份证号", prop: "yjRysfzh", showOverflowTooltip: true },
{ label: "性别", prop: "xbdm", showOverflowTooltip: true, showSolt: true, width: 50 },
{ label: "年龄", prop: "nl", showOverflowTooltip: true, width: 50 },
{ label: "预警级别", prop: "yjJb", showOverflowTooltip: true,showSolt: true, width: 60 },
{ label: "布控单位", prop: "gkbmmc", showOverflowTooltip: true, width: 60 },
{ label: "布控来源", prop: "bkly", showOverflowTooltip: true ,showSolt: true, width: 60 },
{ label: "布控范围", prop: "bkfw", showOverflowTooltip: true, width: 60 },
{ label: "布控开始时间", prop: "bkkssj", showOverflowTooltip: true },
{ label: "布控结束时间", prop: "bkjssj", showOverflowTooltip: true },
{ label: "处置要求", prop: "bkczyq",showSolt: true, showOverflowTooltip: true, width: 50 },
{ label: "相似度", prop: "xsd", showSolt: true, showOverflowTooltip: true, width:45 },
{ label: "预警内容", prop: "yjNr", showOverflowTooltip: true, width: 50 },
{ label: "所属单位", prop: "ssbm", showOverflowTooltip: true, width: 50 },
{ label: "数据来源", prop: "yjLylx", showOverflowTooltip: true,showSolt: true, width: 65 },
{ label: "超时状态", prop: "cszt", showOverflowTooltip: true,showSolt: true, width: 50 },
{ label: "在控状态", prop: "zkzt", showOverflowTooltip: true,showSolt: true, width: 50 },
// { label: "相似度", prop: "xsd", showSolt: true },
// { label: "处置状态", prop: "czzt", showSolt: true },
// { label: "预警时间", prop: "yjSj", width: 200 },
// { label: "预警标签", prop: "yjbqmc" },
// { label: "身份证号", prop: "yjRysfzh", width: 200 },
// { label: "预警来源", prop: "yjLylx", showSolt: true },
// { label: "预警级别", prop: "yjJb", showSolt: true },
// { label: "车牌号", prop: "yjClcph" },
// { label: "布控区域名称", prop: "bkqymc" },
// { label: "所属部门", prop: "ssbm" },
]
});
onMounted(() => {
// let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
// permission_sfqs.value = str.startsWith('2'||'3') ? false : true;
// let rols = getItem('roleList') ? getItem('roleList'):[]
// let obj = rols.find(item => {
// return ['JS_666666','JS_777777','JS_888888'].includes(item.roleCode)
// })
// roleCode.value = obj ? true : false;
tabHeightFn();
getList();
gettbGsxtBqglSelectList()
});
const handleCzjy = (row) => {
czjyRef.value.init(row)
}
const onSearch = (val) => {
queryFrom.value = { ...queryFrom.value, ...val,sfglyj:val.sfglyj.join(',') };
pageData.pageConfiger.pageCurrent = 1;
getList();
};
const reset = () => {
delete queryFrom.value.ksfz
delete queryFrom.value.jsfz
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList();
};
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList();
};
const getList = () => {
pageData.tableConfiger.loading = true;
// TODO: 替换为实际的组合预警API接口
const promes = {
...queryFrom.value,
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize
}
qcckPost({ promes }, "/mosty-gsxt/tbYjxx/getQybkPageList").then((res) => {
pageData.tableData = res.records || [];
pageData.total = res.total || 0;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
});
};
const bqYs = (val) => {
if (val == '01') {
return '#ff0202'
} else if (val == '02') {
return '#ff8c00'
} else if (val == '03') {
return '#e6a23c'
} else if (val == '04') {
return '#0000ff'
}
}
const bqLbData = ref({
bqXl: []
})
const gettbGsxtBqglSelectList = (val) => {
tbGsxtBqzhSelectList({}).then((res) => {
bqLbData.value.bqXl = res.map(item => {
return {
label: item.bqMc,
value: item.bqDm
}
}) || []
})
}
// 查看详情
const detailRef = ref()
const handleClick = (row) => {
detailRef.value.init(row)
}
const assessShow = ref(false)
/** 选中项 */
const selectRows = ref([])
const dataList = ref()
const pushAssess = (val) => {
return holographicProfileJump(val.yjlx, val) // 全息档案跳转
// assessShow.value = true;
// dataList.value = val;
}
// 发送指令
const showDialog = ref(false)
const itemData = ref()
const showDetail = (item) => {
showDialog.value = true;
itemData.value = item
}
const handleClose = () => {
showDialog.value = false;
}
const semdFqzlRef = ref()
const tacitly = {
title: 'yjbt',
instructionContent: 'yjnr'
}
const submit = () => {
semdFqzlRef.value.getsendFqzl()
}
const closeFszl = () => {
semdFqzlRef.value.close()
}
// 处理签收
const handleQsFk = (val, type) => {
switch (type) {
case '签收':
proxy.$confirm("是否确定要签收?", "警告", { type: "warning" }).then(() => {
qcckPost({ id: val.id }, "/mosty-gsxt/yjzxZhyj/yjqs").then(() => {
val.czzt = '02'
getList()
proxy.$message({ type: "success", message: "签收成功" });
});
})
break;
case '反馈':
case '查看反馈':
emitter.emit("openFkDialog", { id: val.id, type });
break;
}
}
const addModelRef = ref(null)
const openAddModel = (row) => {
console.log(row);
addModelRef.value.init(row)
}
// 选择系数
const chooseJfShow = ref(false)
const chooseJfBh = ref()
const roleIds = ref()
const chooseJfFun = (val) => {
chooseJfBh.value = val.id
yjzxZhyjSelectList(val.id).then(res => {
roleIds.value = res.sjxspzList.map(item => item.xsid)
chooseJfShow.value = true
})
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 270;
window.onresize = function () {
tabHeightFn();
};
};
const handleChooseData = (val) => {
selectRows.value = val
}
const exportExl = () => {
const titleObj = {
yjRyxm: "姓名",
yjRysfzh: "身份证号",
yjRysjh: "电话",
xsd: "相似度",
yjJrcs: "预警次数",
yjLx: "预警类型",
yjLylx: "预警来源",
yjJb: " 预警级别",
yjbqmc: "预警标签",
yjSj: "预警时间",
czzt_cname: "处置状态",
ssbm: "所属部门",
}
/** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
const data = needArr.map(item => {
return {
...item,
bqys_cname: getMultiDictVal(item.yjLx, D_BZ_YJLX),
czzt_cname: getMultiDictVal(item.yjLylx, D_BZ_YJLY),
bqys_cname: getMultiDictVal(item.yjJb, D_BZ_YJJB),
czzt_cname: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
}
})
exportExlByObj(titleObj, data, '组合预警')
}
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ ids }, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
// 详情
const paginationOpen = ref(false)
const dataPres = ref()
const openBox = (val) => {
dataPres.value = val
paginationOpen.value = true
}
</script>
<style lang="scss" scoped>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
::v-deep .el-table .cell {
padding: 0;
}
::v-deep .el-table .el-table__cell {
padding: 4px 0;
}
</style>

View File

@ -2,59 +2,82 @@
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<Searchs :searchArr="searchConfiger" @submit="onSearch" @reset="reset" :key="pageData.keyCount">
<template #jfd>
<div>
<el-input v-model="queryFrom.ksfz" type="number" placeholder="开始身份分值" style="width: 130px"></el-input>
<span style="color: #333;margin: 0 4px;"></span>
<el-input v-model="queryFrom.jsfz" type="number" placeholder="结束身份分值" style="width: 130px"></el-input>
</div>
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search='onSearch'>
<template #but>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</Searchs>
</QueryFormPanel>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
:expand="true" @chooseData="handleChooseData">
<template #xsd="{ row }">
{{ `${row.xsd}%` }}
<div :style="{ height: (pageData.tableHeight + 40) + 'px' }" class="bgTable">
<WarnDataTable :loading="pageData.tableConfiger.loading" :tableHeight="pageData.tableHeight"
:data="pageData.tableData" :columns="pageData.tableColumn" table-class="warn-table"
@selectionChange="handleChooseData">
<template #yjTp="{ row }">
<template v-if="!row.yjTp || row.yjTp.includes('baidu')">
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="30" height="30" v-else />
</template>
<el-image v-else style="width: 30px; height:30px" :src="row.yjTp" :preview-src-list="[row.yjTp]"
show-progress>
<template #error>
<div class="image-slot error">
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="30" height="30" v-else />
</div>
</template>
</el-image>
</template>
<template #czzt="{ row }">
<DictTag :value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
<DictTag :value="row.czzt" :color="row.czzt === '01' ? '#ff2424' : '#1d72e8'" :tag="false"
:options="D_GSXT_YJXX_CZZT" />
</template>
<template #yjJb="{ row }">
<DictTag :value="row.yjJb" :tag="false" :color="bqYs(row.yjJb)" :options="D_BZ_YJJB" />
</template>
<template #yjLylx="{ row }">
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" />
<template #yjRyxm="{ row }">
{{ row.yjLx == 2 ? row.yjClcph : row.yjRyxm }}
</template>
<template #xbdm="{ row }">
<DictTag :value="row.xbdm" :tag="false" :options="D_BZ_XB" />
</template>
<template #expand="{ props }">
<div class="expand-content" style="max-width: 100%; max-height: 400px; overflow-y: auto; padding: 10px;">
<Items :row="props || {}" :dict="dict" />
<template #yjJb="{ row }">
<div :style="{ 'background-color': bqYs(row.yjJb) }">
<DictTag :value="row.yjJb" color="#fff" :tag="false" :options="D_BZ_YJJB" />
</div>
</template>
<template #bkly="{ row }">
<DictTag :value="row.bkly" :tag="false" :options="D_BZ_YJLY" />
</template>
<template #bkczyq="{ row }">
<DictTag :value="row.bkczyq" :tag="false" :options="D_GS_BK_CZYQ" />
</template>
<template #xsd="{ row }">
{{ row.xsd }}%
</template>
<template #yjLylx="{ row }">
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" />
</template>
<template #yjLx="{ row }">
<DictTag :value="row.yjLx" :tag="false" :options="D_BZ_YJLX" />
{{ row.yjLx == 2 ? '车辆' : '人员' }}
</template>
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<el-link type="primary" @click="openBox(row)">详情</el-link>
<template #cszt="{ row }">
<DictTag :value="row.cszt" :tag="false" :options="D_GS_CSZT" />
</template>
</MyTable>
<template #operation="{ row }">
<div style="display: flex;justify-content: space-between;">
<span class="warning" @click="pushAssess(row)">全息档案</span>
<span class="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</span>
<!-- <span type="primary" @click="showDetail(row)">转合成</span> -->
<!-- <span type="danger" @click="delDictItem(row.id)">转会商</span> -->
<span class="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</span>
<span class="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</span>
<!-- <span type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</span> -->
<span class="primary" @click="openBox(row)">详情</span>
<span class="primary" @click="pushWarning(row)">指派</span>
</div>
</template>
</WarnDataTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
@ -74,8 +97,9 @@
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false" :chooseJfBh="chooseJfBh" url="/yjzxZhyj/sjxspz"
:roleIds="roleIds" />
<!-- <Pagination v-model="paginationOpen" /> -->
<Pagination v-model="paginationOpen" :dataList="dataPres" :dict="{D_BZ_XB,D_BZ_YJJB,D_GS_QLZDRLX,D_GS_ZDR_RYJB,D_GS_ZDR_GJLB,D_GS_BK_CZYQ}" />
<!-- <Pagination v-model="paginationOpen" /> -->
<Pagination v-model="paginationOpen" :dataList="dataPres"
:dict="{ D_BZ_XB, D_BZ_YJJB, D_GS_QLZDRLX, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB, D_GS_BK_CZYQ }" />
</template>
<script setup>
@ -99,13 +123,16 @@ import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js"
import emitter from "@/utils/eventBus.js";
import Pagination from "./components/particulars.vue";
import WarnDataTable from '@/views/backOfficeSystem/ces/components/WarnDataTable.vue'
import QueryFormPanel from "@/views/backOfficeSystem/ces/components/QueryFormPanel.vue";
import { bqYs } from '@/utils/tools.js'
const permission_sfqs = ref(false)
const roleCode = ref(false)
const searchBox = ref();
const czjyRef = ref()
const { proxy } = getCurrentInstance();
const { D_GSXT_YJXX_CZZT, D_GS_SSYJ, D_BZ_YJJB, D_BZ_YJLY, D_BZ_YJLX, D_BZ_BKLYS, D_GS_CSZT, D_GS_BKZT, D_BZ_XB,D_GS_QLZDRLX,D_GS_ZDR_RYJB,D_GS_ZDR_GJLB,D_GS_BK_CZYQ } =
proxy.$dict("D_GSXT_YJXX_CZZT", "D_GS_SSYJ", "D_BZ_YJJB", "D_BZ_YJLY", "D_BZ_YJLX", "D_BZ_BKLYS", "D_GS_CSZT", "D_GS_BKZT", "D_BZ_XB","D_GS_QLZDRLX","D_GS_ZDR_RYJB","D_GS_ZDR_GJLB","D_GS_BK_CZYQ");
const { D_GSXT_YJXX_CZZT, D_GS_SSYJ, D_BZ_YJJB, D_BZ_YJLY, D_BZ_YJLX, D_BZ_BKLYS, D_GS_CSZT, D_GS_BKZT, D_BZ_XB, D_GS_QLZDRLX, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB, D_GS_BK_CZYQ, D_GS_QLZDRYXX } =
proxy.$dict("D_GSXT_YJXX_CZZT", "D_GS_SSYJ", "D_BZ_YJJB", "D_BZ_YJLY", "D_BZ_YJLX", "D_BZ_BKLYS", "D_GS_CSZT", "D_GS_BKZT", "D_BZ_XB", "D_GS_QLZDRLX", "D_GS_ZDR_RYJB", "D_GS_ZDR_GJLB", "D_GS_BK_CZYQ", "D_GS_QLZDRYXX");
// 字典数据集合
const dict = ref({
@ -122,21 +149,20 @@ const searchConfiger = ref([
{ label: "布控开始时间", prop: 'bkkssj', showType: "date", placeholder: "请选择布控开始时间" },
{ label: "布控结束时间", prop: 'bkjssj', showType: "date", placeholder: "请选择布控结束时间" },
{ label: "预警时间", prop: 'startTime', showType: "datetimerange", placeholder: "请选择预警时间" },
{ label: "比中项", prop: 'yjLx', showType: "checkbox", showSelectAll: true, options: [{ label: '人员', value: '1', }, { label: '车辆', value: '2', }] },
{ label: "比中项", prop: 'yjLx', showType: "select", options: [{ label: '人员', value: '1', }, { label: '车辆', value: '2', }], multiple: true },
{ label: "布控来源", prop: 'bkly', showType: "select", options: D_BZ_BKLYS, placeholder: "请选择布控来源" },
{ label: "区域所属单位", prop: 'ssbmdm', placeholder: "请选择区域所属单位", showType: "department" },
{ label: "布控单位", prop: 'ssbmdm', placeholder: "请选择布控单位", showType: "department" },
{ label: "所属部门", prop: 'ssbmdm', placeholder: "请选择所属部门", showType: "department" },
{ label: "所属单位", prop: 'ssbmdm', showType: "department", placeholder: "请选择所属单位" },
{ label: "布控单位", prop: 'gkbmdm', showType: "department", placeholder: "请选择布控单位" },
{ label: "签收状态", prop: 'czzt', showType: "select", options: D_GSXT_YJXX_CZZT },
{ label: "超时状态", prop: 'cszt', placeholder: "请选择超时状态", showType: "select", options: D_GS_CSZT },
{ label: "布控状态", prop: 'zkzt', showType: "select", options: D_GS_BKZT, placeholder: "请选择布控状态" },
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
{ label: "性别", prop: 'xbdm', showType: "select", options: D_BZ_XB, placeholder: "请选择性别" },
{ label: "开始年龄", prop: 'ksnl', placeholder: "请输入年龄", showType: "number" },
{ label: "结束年龄", prop: 'jsnl', placeholder: "请输入年龄", showType: "number" },
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "车牌号码", prop: 'clcph', placeholder: "请输入车牌号码", showType: "input" },
{ label: "预警内容", prop: 'yjNr', showType: "input", placeholder: "请输入预警内容" },
{ key: 'yjRyxm', label: '姓名', type: 'input', placeholder: '请输入姓名' },
{ key: 'xbdm', label: '性别', type: 'select', options: D_BZ_XB, placeholder: '请选择性别' },
{ key: 'yjRysfzh', label: '身份证号码', type: 'input', placeholder: '请输入身份证号码' },
{ key: 'ksnl', label: '开始年龄', type: 'number', placeholder: '请输入开始年龄' },
{ key: 'jsnl', label: '结束年龄', type: 'number', placeholder: '请输入结束年龄' },
{ key: 'clcph', label: '车牌号码', type: 'input', placeholder: '请输入车牌号码' },
{ key: 'yjNr', label: '预警内容', type: 'input', placeholder: '请输入预警内容' },
// { label: "预警标签", prop: 'yjbqmc', placeholder: "请输入预警标签", showType: "input" },
// { label: "部门", prop: 'ssbmdm', placeholder: "请选择部门", showType: "department" },
// { label: "级别", prop: 'bqys', placeholder: "请选择级别", showType: "select", options: D_BZ_YJJB },
@ -160,42 +186,31 @@ const pageData = reactive({
pageSize: 20,
pageCurrent: 1
},
controlsWidth:160,
controlsWidth: 160,
tableColumn: [
{ label: "状态", prop: "czzt", showOverflowTooltip: true, showSolt: true, width: 80 },
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true, width: 50 },
{ label: "区域名称", prop: "bkqymc", showOverflowTooltip: true, width: 50 },
{ label: "区域范围", prop: "bkfw", showOverflowTooltip: true, width: 50},
// { label: "区域所属", prop: "gkbmmc", showOverflowTooltip: true, width: 50 },
{ label: "比中", prop: "yjLx", showOverflowTooltip: true, width: 60, showSolt: true },
{ label: "姓名", prop: "yjRyxm", showOverflowTooltip: true, width: 60 },
{ label: "身份证号", prop: "yjRysfzh", showOverflowTooltip: true },
{ label: "性别", prop: "xbdm", showOverflowTooltip: true, showSolt: true, width: 50 },
{ label: "年龄", prop: "nl", showOverflowTooltip: true, width: 50 },
{ label: "预警级别", prop: "yjJb", showOverflowTooltip: true,showSolt: true, width: 60 },
{ label: "布控单位", prop: "gkbmmc", showOverflowTooltip: true, width: 60 },
{ label: "布控来源", prop: "bkly", showOverflowTooltip: true ,showSolt: true, width: 60 },
{ label: "布控范围", prop: "bkfw", showOverflowTooltip: true, width: 60 },
{ label: "布控开始时间", prop: "bkkssj", showOverflowTooltip: true },
{ label: "布控结束时间", prop: "bkjssj", showOverflowTooltip: true },
{ label: "处置要求", prop: "bkczyq",showSolt: true, showOverflowTooltip: true, width: 50 },
{ label: "相似度", prop: "xsd", showSolt: true, showOverflowTooltip: true, width:45 },
{ label: "预警内容", prop: "yjNr", showOverflowTooltip: true, width: 50 },
{ label: "所属单位", prop: "ssbm", showOverflowTooltip: true, width: 50 },
{ label: "数据来源", prop: "yjLylx", showOverflowTooltip: true,showSolt: true, width: 65 },
{ label: "超时状态", prop: "cszt", showOverflowTooltip: true,showSolt: true, width: 50 },
{ label: "在控状态", prop: "zkzt", showOverflowTooltip: true,showSolt: true, width: 50 },
// { label: "相似度", prop: "xsd", showSolt: true },
// { label: "处置状态", prop: "czzt", showSolt: true },
// { label: "预警时间", prop: "yjSj", width: 200 },
// { label: "预警标签", prop: "yjbqmc" },
// { label: "身份证号", prop: "yjRysfzh", width: 200 },
// { label: "预警来源", prop: "yjLylx", showSolt: true },
// { label: "预警级别", prop: "yjJb", showSolt: true },
// { label: "车牌号", prop: "yjClcph" },
// { label: "布控区域名称", prop: "bkqymc" },
// { label: "所属部门", prop: "ssbm" },
{ type: 'index', label: '序号', width: 55, align: 'center' },
{ label: '预警状态', width: 80, align: 'center', slotName: 'czzt' },
{ prop: 'yjSj', label: '预警时间', width: 80, align: 'center' },
{ prop: 'bkqymc', label: '区域名称', width: 80, align: 'center' },
{ label: "比中", slotName: 'yjLx', width: 60, align: 'center' },
{ label: '人员姓名', slotName: 'yjRyxm', width: 80, align: 'center' },
{ prop: 'yjRysfzh', label: '身份证号', width: 80, align: 'center' },
{ label: '性别', width: 56, align: 'center', slotName: 'xbdm' },
{ prop: 'nl', label: '年龄', width: 56, align: 'center' },
{ label: '预警级别', width: 88, align: 'center', slotName: 'yjJb' },
{ label: "布控单位", prop: "gkbmmc", align: 'center' },
{ label: "布控来源", align: 'center', slotName: 'bkly', width: 70 },
{ prop: 'bkfw', label: "布控范围", align: 'center', width: 70 },
{ prop: 'bkkssj', label: "布控开始时间", align: 'center' },
{ prop: 'bkjssj', label: "布控结束时间", align: 'center' },
{ label: "处置要求", width: 70, slotName: 'bkczyq', align: 'center' },
{ label: "相似度", slotName: "xsd", align: 'center', width: 50 },
{ label: "预警内容", prop: "yjNr", align: 'center' },
{ label: "所属部门", prop: "ssbm", align: 'center' },
{ label: "数据来源", slotName: "yjLylx", align: 'center' },
{ label: '操作', width: 180, slotName: 'operation' },
{ label: '超时状态', width: 80, align: 'center', slotName: 'cszt' },
{ label: "在控状态", width: 70, align: 'center', slotName: "zkzt" },
]
});
@ -219,7 +234,7 @@ const handleCzjy = (row) => {
}
const onSearch = (val) => {
queryFrom.value = { ...queryFrom.value, ...val,sfglyj:val.sfglyj.join(',') };
queryFrom.value = { ...queryFrom.value, ...val, yjLx: val.yjLx.join(',') };
pageData.pageConfiger.pageCurrent = 1;
getList();
};
@ -255,17 +270,6 @@ const getList = () => {
pageData.tableConfiger.loading = false;
});
};
const bqYs = (val) => {
if (val == '01') {
return '#ff0202'
} else if (val == '02') {
return '#ff8c00'
} else if (val == '03') {
return '#e6a23c'
} else if (val == '04') {
return '#0000ff'
}
}
const bqLbData = ref({
bqXl: []
})
@ -362,7 +366,7 @@ const chooseJfFun = (val) => {
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 270;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () {
tabHeightFn();
};
@ -431,6 +435,7 @@ const openBox = (val) => {
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
::v-deep .el-table .cell {
padding: 0;
}
@ -438,4 +443,8 @@ const openBox = (val) => {
::v-deep .el-table .el-table__cell {
padding: 4px 0;
}
.bgTable {
background-color: #fff;
}
</style>

View File

@ -0,0 +1,332 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10 mb10">
<Search :searchArr="searchConfiger" @submit="onSearch" ref="searchDom" :key="pageData.keyCount">
</Search>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="exportExl">批量导出</el-button>
<el-button type="primary" size="small" @click="handleQs">批量签收</el-button>
<el-button type="primary" size="small" @click="handleQs">批量分析</el-button>
<el-button type="primary" size="small" @click="countPeople">计算人数</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox heightBox">
<MyTable expand :tableData="pageData.tableData" :tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight" :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth" @chooseData="handleChooseData">
<template #expand="{ props }">
<div style="max-width: 100%">
<Items :row="props || {}" />
</div>
</template>
<template #czzt="{ row }">
<DictTag :value="row.czzt" :tag="false" :options="D_GSXT_YJXX_CZZT" />
</template>
<template #xbdm="{ row }">
<DictTag :value="row.xbdm" :tag="false" :options="D_BZ_XB" />
</template>
<template #age="{ row }">
<span v-if="row.yjRysfzh"> {{ IdCard(row.yjRysfzh, 3) }} </span>
</template>
<template #yjJb="{ row }">
<DictTag :value="row.yjJb" :tag="false" :options="D_BZ_YJJB" />
</template>
<template #bqdl="{ row }">
<DictTag :value="row.bqdl" :tag="false" :options="D_GS_QLZDRLX" />
</template>
<template #yjLylx="{ row }">
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" />
</template>
<template #yjLx="{ row }">
<DictTag :value="row.yjLx" :tag="false" :options="D_GS_QLZDRYXX" />
</template>
<template #controls="{ row }">
<el-link type="primary" @click="handleQsSingle(row)">签收</el-link>
<el-link type="primary" @click="particularsOpen(row)">详情</el-link>
<el-link type="warning" @click="pushWarning(row)">指派</el-link>
<el-link type="warning" v-if="row.sfbc != '1'" @click="failWarning(row)">报错</el-link>
<el-link type="primary" @click="payAttention(row)">关注</el-link>
</template>
<template #cszt="{ row }">
<DictTag :value="row.cszt" :tag="false" :options="D_GSXT_YJXX_CZZT" />
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
<ZpForm v-model="warningShow" :dataList="dataList" />
<Particulars v-model="particularsShow" :dataList="dataPres"
:dict="{ D_BZ_XB, D_BZ_YJJB, D_GS_QLZDRLX, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB }" />
<peopleConut v-model="searchOpen" :dataConut="dataConut" />
</template>
<script setup>
import { getMultiDictVal } from "@/utils/dict.js"
import { exportExlByObj } from "@/utils/exportExcel.js"
import Items from '@/views/backOfficeSystem/fourColorManage/warningList/portraitWarning/item/items.vue'
import ZpForm from "./zpForm.vue";
import Particulars from "./particulars.vue";
import { IdCard } from '@/utils/validate.js'
import Search from "@/components/aboutTable/Search.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance, } from "vue";
import peopleConut from "./peopleConut.vue";
const { proxy } = getCurrentInstance();
const { D_BZ_YJLY, D_GS_QLZDRLX, D_GS_ZDR_GJLB, D_BZ_YJJB, D_GS_CSZT, D_GS_QLZDRYXX, D_BZ_XB, D_GSXT_YJXX_CZZT, D_GS_ZDR_RYJB } = proxy.$dict('D_BZ_YJLY', 'D_GS_QLZDRLX', "D_BZ_YJJB", "D_GS_QLZDRYXX", "D_BZ_XB", "D_GSXT_YJXX_CZZT", "D_GS_ZDR_RYJB", 'D_GS_ZDR_GJLB', 'D_GS_CSZT'); //获取字典数据
const searchBox = ref(); //搜索框
const warningShow = ref(false);
const dataList = ref([]);
const searchConfiger = ref(
[
{ label: "预警时间", prop: 'startTime', showType: "datetimerange", placeholder: "请选择预警时间" },
{ label: "预警级别", prop: 'yjJb', placeholder: "请选择预警级别", showType: "select", options: D_BZ_YJJB, multiple: true },
{ label: "接收单位", prop: 'ssbmdm', showType: "department" },
{ prop: 'sfglyj', showType: "checkbox", showSelectAll: false, options: [{ label: '关联预警', value: '1' }] },
{ prop: 'sfgz', showType: "checkbox", showSelectAll: false, options: [{ label: '重点关注', value: '1' }] },
{ prop: 'sfzp', showType: "checkbox", showSelectAll: false, options: [{ label: '二次指派', value: '1' }] },
{ label: "超时状态", prop: 'cszt', placeholder: "请选择超时状态", showType: "select", options: D_GS_CSZT },
{ label: "人员类别", prop: 'bqdl', placeholder: "请选择人员类别", showType: "select", options: D_GS_QLZDRLX },
{ label: "预警次数", prop: 'yjCs', placeholder: "请输入预警次数", showType: "number" },
{ label: "人员级别", prop: 'yjJb', showType: "select", options: D_GS_ZDR_RYJB },
{ label: "轨迹类别", prop: 'yjLylx', showType: "select", options: D_GS_ZDR_GJLB },
{ label: "姓名", prop: 'yjRyxm', placeholder: "请输入姓名", showType: "input" },
{ label: "性别", prop: 'xbdm', placeholder: "请选择性别", showType: "select", options: D_BZ_XB },
{ label: "身份证", prop: 'yjRysfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "开始年龄", prop: 'ksnl', placeholder: "请输入年龄", showType: "number" },
{ label: "结束年龄", prop: 'jsnl', placeholder: "请输入年龄", showType: "number" },
{ label: "活动发生地", prop: 'yjDz', placeholder: "请输入活动发生地", showType: "input" },
{ label: "人员细类", prop: 'yjbqmc', placeholder: "请输入人员细类", showType: "input" },
])
const queryFrom = ref({});
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkBox",
loading: false,
haveControls: true
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 200, //操作栏宽度
tableColumn: [
{ label: "预警状态", prop: "czzt", showSolt: true, width: 70 },
{ label: "预警时间", prop: "yjSj", width: 148 },
{ label: "人员姓名", prop: "yjRyxm", },
{ label: "身份证号", prop: "yjRysfzh", width: 148 },
{ label: "性别", prop: "xbdm", showSolt: true, width: 60 },
{ label: "年龄", prop: "age", showSolt: true, width: 50 },
{ label: "级别", prop: "yjJb", showSolt: true, width: 50 },
{ label: "人员类别", prop: "bqdl", showSolt: true, width: 100 },
{ label: "人员细类", prop: "yjbqmc" },
{ label: "轨迹类别", prop: "yjLylx", showSolt: true },
{ label: "活动发生地", prop: "yjDz" },
{ label: "接收单位", prop: "ssbm", width: 148 },
{ label: "次数", prop: "yjCs", width: 50 },
{ label: "超时状态", prop: "cszt" },
]
});
onMounted(() => {
tabHeightFn();
getList()
});
// 搜索
const onSearch = (val) => {
queryFrom.value = { ...val, yjJb: val.yjJb?.join(',') || '' }
queryFrom.value.startTime = val.startTime ? val.startTime[0] : ''
queryFrom.value.endTime = val.startTime ? val.startTime[1] : ''
queryFrom.value.sfglyj = val.sfglyj?.join(',') || ''
queryFrom.value.sfgz = val.sfgz?.join(',') || ''
queryFrom.value.sfzp = val.sfzp?.join(',') || ''
pageData.pageConfiger.pageCurrent = 1;
getList()
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList()
}
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList()
}
const getList = () => {
pageData.tableConfiger.loading = true;
const promes = {
...queryFrom.value,
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize,
}
delete promes.times;
qcckPost(promes, '/mosty-gsxt/tbYjxx/getQlzdrPageList').then((res) => {
pageData.total = res.total || 0;
pageData.tableConfiger.loading = false;
pageData.tableData = res.records || []
}).catch(() => {
pageData.tableConfiger.loading = false;
})
}
const pushWarning = (val) => {
warningShow.value = true;
dataList.value = val;
}
const failWarning = (val) => {
let ids = [val.id]
qcckPost({ ids }, '/mosty-gsxt/tbYjxx/yjbc').then((res) => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}
/** 选中项 */
const selectRows = ref([])
const handleChooseData = (val) => {
selectRows.value = val
}
const exportExl = () => {
const titleObj = {
czzt_name: "状态",
yjSj: "预警时间",
yjRyxm: "人员姓名",
yjRysfzh: "身份证号",
yjJb_name: "预警级别",
bqdl_name: "人员类别",
yjbqmc: "细类",
yjDz: "活动发生地",
ssbm: "接收单位",
yjCs: "预警次数",
}
/** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
const data = needArr.map(item => {
return {
...item,
czzt_name: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
yjJb_name: getMultiDictVal(item.yjJb, D_BZ_YJJB),
bqdl_name: getMultiDictVal(item.bqdl, D_GS_QLZDRLX),
}
})
exportExlByObj(titleObj, data, '七类重点')
}
// 批量签收
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ ids }, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
// 详情
const dataPres = ref({})
const particularsShow = ref(false);
const particularsOpen = (row) => {
dataPres.value = row
particularsShow.value = true;
}
// 单条签收
const handleQsSingle = (row) => {
if (row.czzt == '02') return proxy.$message({ type: "warning", message: "数据已签收,无需重复签收" });
proxy.$confirm('确认要签收该条预警数据吗?', "警告", { type: "warning" }).then(() => {
qcckPost({ ids: [row.id] }, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
// 关注
const payAttention = (row) => {
let promes = {}
if (row.sfgz == '1') {
promes.sfgz = '0'
promes.msg = '取消关注'
} else {
promes.sfgz = '1'
promes.msg = '关注'
}
proxy.$confirm('确认要关注该条预警数据吗?', "警告", { type: "warning" }).then(() => {
qcckPost({ sfgz: promes.sfgz, id: row.id }, '/mosty-gsxt/tbYjxx/yjgz').then(() => {
proxy.$message({ type: "success", message: `${promes.msg}成功` });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: `${promes.msg}失败` });
});
}).catch(() => { });
}
// 人数计算
const searchDom = ref(null)
const dataConut = ref(0)
const searchOpen = ref(false)
const countPeople = () => {
const promes = {
...searchDom.value.searchObj,
yjJb: searchDom.value.searchObj.yjJb?.join(',') || '',
startTime: searchDom.value.searchObj.startTime ? searchDom.value.searchObj.startTime[0] : '',
endTime: searchDom.value.searchObj.endTime ? searchDom.value.searchObj.endTime[1] : '',
sfglyj: searchDom.value.searchObj.sfglyj?.join(',') || '',
sfgz: searchDom.value.searchObj.sfgz?.join(',') || '',
sfzp: searchDom.value.searchObj.sfzp?.join(',') || '',
}
qcckPost(promes, '/mosty-gsxt/tbYjxx/bkyjQctj').then((res) => {
dataConut.value = res || 0
searchOpen.value = true
}).catch(() => {
// proxy.$message({ type: "error", message: `${promes.msg}失败` });
});
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
window.onresize = function () { tabHeightFn(); };
};
</script>
<style lang="scss" scoped>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
::v-deep .el-table .cell {
padding: 0;
}
::v-deep .el-table .el-table__cell {
padding: 4px 0;
}
</style>

View File

@ -0,0 +1,334 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10 mb10">
<!-- <Search :searchArr="searchConfiger" @submit="onSearch" ref="searchDom" :key="pageData.keyCount">
</Search> -->
<QueryFormPanel v-model="queryFrom" :fields="searchConfiger" ref="searchDom" @search='onSearch'>
<template #but>
<el-button type="primary" size="small" @click="exportExl">批量导出</el-button>
<el-button type="primary" size="small" @click="handleQs">批量签收</el-button>
<el-button type="primary" size="small" @click="handleQs">批量分析</el-button>
<el-button type="primary" size="small" @click="countPeople">计算人数</el-button>
</template>
</QueryFormPanel>
</div>
<!-- <PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="exportExl">批量导出</el-button>
<el-button type="primary" size="small" @click="handleQs">批量签收</el-button>
<el-button type="primary" size="small" @click="handleQs">批量分析</el-button>
<el-button type="primary" size="small" @click="countPeople">计算人数</el-button>
</template>
</PageTitle> -->
<!-- 表格 -->
<div style="background-color: #fff;">
<WarnDataTable :loading="pageData.tableConfiger.loading" :tableHeight="pageData.tableHeight"
:data="pageData.tableData" :columns="pageData.tableColumn" table-class="warn-table"
@selectionChange="handleChooseData">
<template #status="{ row }">
<DictTag :value="row.czzt" :color="row.czzt === '01' ? '#ff2424' : '#1d72e8'" :tag="false"
:options="D_GSXT_YJXX_CZZT" />
</template>
<template #xbdm="{ row }">
<DictTag :value="row.xbdm" :tag="false" :options="D_BZ_XB" />
</template>
<template #yjJb="{ row }">
<div :style="{ 'background-color': bqYs(row.yjJb) }">
<DictTag :value="row.yjJb" color="#fff" :tag="false" :options="D_BZ_YJJB" />
</div>
</template>
<template #bqdl="{ row }">
<DictTag :value="row.bqdl" :tag="false" :options="D_GS_QLZDRLX" />
</template>
<template #yjLylx="{ row }">
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" />
</template>
<template #cszt="{ row }">
<DictTag :value="row.cszt" :tag="false" :options="D_GS_CSZT" />
</template>
<template #operation="{ row }">
<div style="display: flex;justify-content: space-between;">
<span class="primary" @click="handleQsSingle(row)">签收</span>
<span class="primary" @click="particularsOpen(row)">详情</span>
<span class="warning" @click="pushWarning(row)">指派</span>
<span class="warning" v-if="row.sfbc != '1'" @click="failWarning(row)">报错</span>
<span class="primary" @click="payAttention(row)">关注</span>
</div>
</template>
</WarnDataTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
<ZpForm v-model="warningShow" :dataList="dataList" />
<Particulars v-model="particularsShow" :dataList="dataPres"
:dict="{ D_BZ_XB, D_BZ_YJJB, D_GS_QLZDRLX, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB }" />
<peopleConut v-model="searchOpen" :dataConut="dataConut" />
</template>
<script setup>
import { getMultiDictVal } from "@/utils/dict.js"
import { exportExlByObj } from "@/utils/exportExcel.js"
import ZpForm from "./zpForm.vue";
import { bqYs } from '@/utils/tools.js'
import Particulars from "./particulars.vue";
import Search from "@/components/aboutTable/Search.vue";
import WarnDataTable from '@/views/backOfficeSystem/ces/components/WarnDataTable.vue'
import QueryFormPanel from "@/views/backOfficeSystem/ces/components/QueryFormPanel.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
// import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance, } from "vue";
import peopleConut from "./peopleConut.vue";
const { proxy } = getCurrentInstance();
const { D_BZ_YJLY, D_GS_QLZDRLX, D_GS_ZDR_GJLB, D_BZ_YJJB, D_GS_CSZT, D_GS_QLZDRYXX, D_BZ_XB, D_GSXT_YJXX_CZZT, D_GS_ZDR_RYJB, D_BZ_SF } = proxy.$dict('D_BZ_YJLY', 'D_GS_QLZDRLX', "D_BZ_YJJB", "D_GS_QLZDRYXX", "D_BZ_XB", "D_GSXT_YJXX_CZZT", "D_GS_ZDR_RYJB", 'D_GS_ZDR_GJLB', 'D_GS_CSZT', "D_BZ_SF"); //获取字典数据
const searchBox = ref(); //搜索框
const warningShow = ref(false);
const dataList = ref([]);
const searchConfiger = ref(
[
{ key: 'startTime', label: '预警时间', type: 'datetimerange', placeholder: '请选择预警时间' },
{ key: 'yjJb', label: '预警级别', type: 'select', options: D_BZ_YJJB, multiple: true, placeholder: '请选择预警级别' },
{ key: 'ssbmdm', label: '接收单位', type: 'department', placeholder: '请选择接收单位' },
{ key: 'sfglyj', label: '关联预警', type: 'select', options: D_BZ_SF, placeholder: '请选择关联预警' },
{ key: 'yjRyxm', label: '姓名', type: 'input', placeholder: '请输入姓名' },
{ key: 'xbdm', label: '性别', type: 'select', options: D_BZ_XB, placeholder: '请选择性别' },
{ key: 'cszt', label: '超时状态', type: 'select', options: D_GS_CSZT, placeholder: '请选择超时状态' },
{ key: 'bqdl', label: '人员类别', type: 'select', options: D_GS_QLZDRLX, placeholder: '请选择人员类别' },
{ key: 'sfgz', label: '重点关注', type: 'select', options: D_BZ_SF, placeholder: '请选择重点关注' },
{ key: 'sfzp', label: '二次指派', type: 'select', options: D_BZ_SF, placeholder: '请选择二次指派' },
{ key: 'yjRysfzh', label: '身份证号码', type: 'input', placeholder: '请输入身份证号码' },
{ key: 'ksnl', label: '开始年龄', type: 'input', placeholder: '请输入开始年龄' },
{ key: 'jsnl', label: '结束年龄', type: 'input', placeholder: '请输入结束年龄' },
{ key: 'yjCs', label: '预警次数', type: 'input', placeholder: '请输入预警次数' },
{ key: 'bqdl', label: '人员级别', type: 'select', options: D_GS_ZDR_RYJB },
{ key: 'yjLylx', label: '轨迹类别', type: 'select', options: D_GS_ZDR_GJLB },
{ key: 'yjDz', label: '活动发生地', type: 'input', placeholder: '请输入活动发生地' },
{ key: 'yjbqmc', label: '人员细类', type: 'input', placeholder: '请输入人员细类' }
])
const queryFrom = ref({});
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableHeight: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkBox",
loading: false,
haveControls: true
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 200, //操作栏宽度
tableColumn: [
{ type: 'index', label: '序号', width: 55, align: 'center' },
{ label: '预警状态', width: 86, align: 'center', slotName: 'status' },
{ prop: 'yjSj', label: '预警时间', width: 150 },
{ prop: 'yjRyxm', label: '人员姓名', width: 80 },
{ prop: 'yjRysfzh', label: '身份证号', width: 158 },
{ label: '性别', width: 56, align: 'center', slotName: 'xbdm' },
{ prop: 'nl', label: '年龄', width: 56, align: 'center' },
{ label: '预警级别', width: 88, align: 'center', slotName: 'yjJb' },
{ label: '人员类别', width: 90, align: 'center', slotName: 'bqdl' },
{ prop: 'yjbqmc', label: '人员细类', width: 92 },
{ label: '轨迹类别', width: 92, align: 'center', slotName: 'yjLylx' },
{ prop: 'yjDz', label: '活动发生地' },
{ prop: 'ssbm', label: '接收单位' },
{ prop: 'yjCs', label: '次数', width: 60, align: 'center' },
{ label: '操作', width: 180, slotName: 'operation' },
{ label: '超时状态', width: 80, align: 'center', slotName: 'cszt' }
]
});
onMounted(() => {
tabHeightFn();
getList()
});
// 搜索
const onSearch = (val) => {
queryFrom.value = { ...val, yjJb: val.yjJb?.join(',') || '' }
queryFrom.value.startTime = val.startTime ? val.startTime[0] : ''
queryFrom.value.endTime = val.startTime ? val.startTime[1] : ''
// queryFrom.value.sfglyj = val.sfglyj?.join(',') || ''
// queryFrom.value.sfgz = val.sfgz?.join(',') || ''
// queryFrom.value.sfzp = val.sfzp?.join(',') || ''
pageData.pageConfiger.pageCurrent = 1;
getList()
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList()
}
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList()
}
const getList = () => {
pageData.tableConfiger.loading = true;
const promes = {
...queryFrom.value,
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize,
}
delete promes.times;
qcckPost(promes, '/mosty-gsxt/tbYjxx/getQlzdrPageList').then((res) => {
pageData.total = res.total || 0;
pageData.tableConfiger.loading = false;
pageData.tableData = res.records || []
}).catch(() => {
pageData.tableConfiger.loading = false;
})
}
const pushWarning = (val) => {
warningShow.value = true;
dataList.value = val;
}
const failWarning = (val) => {
let ids = [val.id]
qcckPost({ ids }, '/mosty-gsxt/tbYjxx/yjbc').then((res) => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}
/** 选中项 */
const selectRows = ref([])
const handleChooseData = (val) => {
selectRows.value = val
}
const exportExl = () => {
const titleObj = {
czzt_name: "状态",
yjSj: "预警时间",
yjRyxm: "人员姓名",
yjRysfzh: "身份证号",
yjJb_name: "预警级别",
bqdl_name: "人员类别",
yjbqmc: "细类",
yjDz: "活动发生地",
ssbm: "接收单位",
yjCs: "预警次数",
}
/** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
const data = needArr.map(item => {
return {
...item,
czzt_name: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
yjJb_name: getMultiDictVal(item.yjJb, D_BZ_YJJB),
bqdl_name: getMultiDictVal(item.bqdl, D_GS_QLZDRLX),
}
})
exportExlByObj(titleObj, data, '七类重点')
}
// 批量签收
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ ids }, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
// 详情
const dataPres = ref({})
const particularsShow = ref(false);
const particularsOpen = (row) => {
dataPres.value = row
particularsShow.value = true;
}
// 单条签收
const handleQsSingle = (row) => {
if (row.czzt == '02') return proxy.$message({ type: "warning", message: "数据已签收,无需重复签收" });
proxy.$confirm('确认要签收该条预警数据吗?', "警告", { type: "warning" }).then(() => {
qcckPost({ ids: [row.id] }, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
// 关注
const payAttention = (row) => {
let promes = {}
if (row.sfgz == '1') {
promes.sfgz = '0'
promes.msg = '取消关注'
} else {
promes.sfgz = '1'
promes.msg = '关注'
}
proxy.$confirm('确认要关注该条预警数据吗?', "警告", { type: "warning" }).then(() => {
qcckPost({ sfgz: promes.sfgz, id: row.id }, '/mosty-gsxt/tbYjxx/yjgz').then(() => {
proxy.$message({ type: "success", message: `${promes.msg}成功` });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: `${promes.msg}失败` });
});
}).catch(() => { });
}
// 人数计算
const searchDom = ref(null)
const dataConut = ref(0)
const searchOpen = ref(false)
const countPeople = () => {
const promes = {
...searchDom.value.formState,
yjJb: searchDom.value.formState.yjJb?.join(',') || '',
startTime: searchDom.value.formState.startTime ? searchDom.value.formState.startTime[0] : '',
endTime: searchDom.value.formState.endTime ? searchDom.value.formState.endTime[1] : '',
}
qcckPost(promes, '/mosty-gsxt/tbYjxx/bkyjQctj').then((res) => {
dataConut.value = res || 0
searchOpen.value = true
}).catch(() => {
// proxy.$message({ type: "error", message: `${promes.msg}失败` });
});
}
// 表格高度计算
const tabHeightFn = () => {
console.log("xxxxxxx");
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () { tabHeightFn(); };
};
</script>
<style lang="scss" scoped>
.danger {
color: #ff2424;
}
.ok {
color: #1d72e8;
}
</style>

View File

@ -0,0 +1,472 @@
<!--预警指派展示组件 -->
<template>
<el-dialog :draggable="true" :model-value="modelValue" :title="title" :width="width" @close="close" append-to-body>
<div class="archive-container" v-loading="loading">
<div class="three-column-layout">
<!-- 重点人员基本信息页 -->
<div class="column">
<div class="column-header">重点人员基本信息页</div>
<div class="info-section">
<div class="info-row">
<div class="info-item">
<span class="info-label">人员姓名</span>
<span class="info-value">{{ dataForm.yjRyxm }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">性别</span>
<span class="info-value">
<DictTag :value="dataForm.xbdm" :tag="false" :options="dict.D_BZ_XB" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">年龄</span>
<span class="info-value">{{ dataForm.nl }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">身份证号码</span>
<span class="info-value">{{ dataForm.yjRysfzh }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">户籍地</span>
<span class="info-value">{{ dataForm.hjdXz }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">现住地址</span>
<span class="info-value">{{ dataForm.xzdXz }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">入库时间</span>
<span class="info-value">{{ dataForm.zdrRkkssj }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">预警级别</span>
<span class="info-value warning-level" :class="ys()">
<DictTag :value="dataForm.yjJb" :tag="false" :options="dict.D_BZ_YJJB" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">人员类别</span>
<span class="info-value">
<DictTag :value="dataForm.bqdl" :tag="false" :options="dict.D_GS_QLZDRLX" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">人员级别</span>
<span class="info-value">
<DictTag :value="dataForm.yjJb" :tag="false" :options="dict.D_GS_ZDR_RYJB" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">人员细类</span>
<span class="info-value">{{ dataForm.yjbqmc }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">立案单位</span>
<span class="info-value"></span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">简要案情</span>
<span class="info-value text-area"></span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">一标三实</span>
<span class="info-value text-area"></span>
</div>
</div>
</div>
</div>
<!-- 重点人员活动信息页 -->
<div class="column">
<div class="column-header">重点人员活动信息页</div>
<div class="info-section blue-bg">
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">轨迹类别</span>
<span class="info-value">
<DictTag :value="dataForm.yjLylx" :tag="false" :options="dict.D_GS_ZDR_GJLB" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">核查时间</span>
<span class="info-value">
<span v-if="dataForm.fkList && dataForm.fkList.length > 0">{{ dataForm.fkList[0].czsj }}</span>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">比对时间</span>
<span class="info-value">{{ dataForm.yjSj }}</span>
</div>
</div>
<!-- <div class="info-row">
<div class="info-item full-width">
<span class="info-label">活动发生地</span>
<span class="info-value">{{ dataForm.xxdz }}</span>
</div>
</div> -->
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">活动场所</span>
<span class="info-value">
<span v-if="dataForm.fkList && dataForm.fkList.length > 0">{{ dataForm.fkList[0].xxdz }}</span>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">活动信息</span>
<span class="info-value">{{ dataForm.yjNr }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">信息提供单位</span>
<span class="info-value">{{ dataForm.jczmc }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">信息接收单位</span>
<span class="info-value">{{ dataForm.ssbm }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">二次指派单位</span>
<span class="info-value">
<div v-if="dataForm.zpList && dataForm.zpList.length > 0">
<span v-for="(item, index) in dataForm.zpList" :key="item.id">
{{ item.zpbm }}<span v-if="index < dataForm.zpList.length - 1">,</span>
</span>
</div>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">签收时限</span>
<span class="info-value">{{ dataForm.qssj }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">反馈时限</span>
<span class="info-value">{{ dataForm.fksj }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">处置建议</span>
<span class="info-value">
<div v-if="dataForm.czjyList && dataForm.czjyList.length > 0">
<div v-for="(item, index) in dataForm.czjyList" :key="item.id">
<span>{{ `${index + 1}` + item.jynr }}</span>
</div>
</div>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">反馈内容</span>
<span class="info-value">
<div v-if="dataForm.fkList && dataForm.fkList.length > 0">
<div v-for="(item, index) in dataForm.fkList" :key="item.id">
<span v-if="item.ckczbcxx">{{ `${index + 1}` + item.ckczbcxx }}</span>
</div>
</div>
</span>
</div>
</div>
</div>
</div>
<!-- 历史预警信息页 -->
<div class="column">
<div class="column-header">历史预警信息页</div>
<div class="info-section">
<div class="history-item" v-for="(item, index) in dataForm.yjgjList" :key="item.id">
<span class="history-index">{{ `${index + 1}` }}</span>
<span class="history-content">{{ item.yjNr }}</span>
</div>
</div>
</div>
</div>
</div>
<template #footer>
<div class="dialog-footer" style="text-align: center;">
<el-button @click="close">关闭</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { defineProps, getCurrentInstance, watch, ref } from 'vue';
import { qcckGet } from '@/api/qcckApi.js'
const { proxy } = getCurrentInstance();
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
title: {
type: String,
default: '预警详情'
},
width: {
type: String,
default: '90%'
}, dataList: {
type: Object,
default: () => ({})
},
dict: {
type: Object,
default: () => ({})
}
});
// 定义事件
const emit = defineEmits(['update:modelValue']);
const loading = ref(false)
let abortController = null
const close = () => {
if (abortController) {
abortController.abort()
abortController = null
}
loading.value = false
emit('update:modelValue', false);
};
const dataForm = ref({});
watch(() => props.modelValue, (newVal) => {
if (newVal) {
getPart(props.dataList.id)
}
}, { deep: true });
const getPart = (id) => {
if (abortController) {
abortController.abort()
}
abortController = new AbortController()
loading.value = true
qcckGet({}, `/mosty-gsxt/tbYjxx/getInfo/${id}`, { signal: abortController.signal }).then(res => {
if (res) {
dataForm.value = res
} else {
dataForm.value = {}
}
}).catch(err => {
if (err.name !== 'AbortError') {
console.error('请求失败:', err)
}
}).finally(() => {
loading.value = false
})
}
const ys = () => {
switch (dataForm.value.yjJb) {
case '01':
return 'red';
case '02':
return 'orange';
case '03':
return 'yellow';
case '04':
return 'blue';
default:
return '';
}
}
</script>
<style scoped>
.archive-container {
padding: 20px;
height: 600px;
overflow-y: auto;
}
.three-column-layout {
display: flex;
gap: 20px;
height: 100%;
}
.column {
flex: 1;
display: flex;
flex-direction: column;
min-width: 300px;
}
.column-header {
font-size: 16px;
font-weight: bold;
margin-bottom: 15px;
padding: 10px;
background: #f0f2f5;
border: 1px solid #e4e7ed;
border-radius: 4px 4px 0 0;
text-align: center;
color: #303133;
}
.column .info-section {
flex: 1;
border-radius: 0 0 4px 4px;
overflow-y: auto;
}
.info-section {
border: 1px solid #e4e7ed;
border-radius: 4px;
padding: 15px;
background: #ffffff;
}
.info-section.blue-bg {
background: #e6f0f8;
border-color: #9ed7ff;
}
.info-row {
display: flex;
flex-wrap: wrap;
margin-bottom: 12px;
}
.info-item {
flex: 1;
min-width: 300px;
display: flex;
align-items: center;
}
.info-item.full-width {
flex: 100%;
min-width: 100%;
}
.info-label {
width: 80px;
font-weight: bold;
margin-right: 10px;
white-space: nowrap;
color: #333;
}
.info-value {
flex: 1;
padding: 4px 8px;
border: 1px solid #dcdfe6;
border-radius: 4px;
background: #ffffff;
min-height: 28px;
display: flex;
align-items: center;
}
.info-value.text-area {
min-height: 80px;
align-items: flex-start;
padding: 8px;
resize: vertical;
}
/* 红 */
.warning-level.red {
background: #fef0f0;
border-color: #ffccc7;
color: #f56c6c !important;
font-weight: bold;
}
/* 橙 */
.warning-level.orange {
background: #fffbe6;
border-color: #ffe58f;
color: #d48806 !important;
font-weight: bold;
}
/* 黄 */
.warning-level.yellow {
background: #fdf6ec;
border-color: #faecd8;
color: #e6a23c !important;
font-weight: bold;
}
/* 蓝 */
.warning-level.blue {
background: #ecf5ff;
border-color: #d9ecff;
color: #409eff !important;
font-weight: bold;
}
.history-item {
margin-bottom: 10px;
padding: 8px 12px;
border: 1px solid #e4e7ed;
border-radius: 4px;
background: #ffffff;
display: flex;
/* align-items: center; */
}
.history-index {
font-weight: bold;
margin-right: 10px;
color: #409eff;
}
.history-content {
flex: 1;
color: #606266;
}
.demo-tabs {
margin-bottom: 20px;
}
::v-deep .el-tabs__header {
margin-bottom: 20px;
}
::v-deep .el-tabs__content {
min-height: 400px;
}
</style>

View File

@ -0,0 +1,80 @@
<!--预警指派展示组件 -->
<template>
<el-dialog :draggable="true" :model-value="modelValue" :title="title" :width="width" @close="close" append-to-body>
<div class="count-container">
<div class="count-number">{{dataConut}}</div>
<div class="count-label">预警人数</div>
</div>
<template #footer>
<div class="dialog-footer" style="text-align: center;">
<el-button @click="close">关闭</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { defineProps,getCurrentInstance } from 'vue';
const { proxy } = getCurrentInstance();
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
title: {
type: String,
default: '人数查询'
},
dataConut: {
type: Number,
default: 0
},width: {
type: String,
default: '20%'
},
});
// 定义事件
const emit = defineEmits(['update:modelValue']);
const close = () => {
emit('update:modelValue', false);
};
</script>
<style scoped>
.count-container {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 40px 0;
text-align: center;
}
.count-number {
font-size: 48px;
font-weight: bold;
color: #409eff;
margin-bottom: 16px;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
animation: pulse 2s infinite;
}
.count-label {
font-size: 18px;
color: #606266;
font-weight: 500;
}
@keyframes pulse {
0% {
transform: scale(1);
}
50% {
transform: scale(1.05);
}
100% {
transform: scale(1);
}
}
</style>

View File

@ -0,0 +1,76 @@
<!--预警指派展示组件 -->
<template>
<el-dialog :draggable="true" :model-value="modelValue" :title="title" :width="width" @close="close" append-to-body>
<div class="archive-container">
<FormMessage :formList="formData" v-model="listQuery" ref="elform" :rules="rules" :labelWidth="90">
</FormMessage>
</div>
<template #footer>
<div class="dialog-footer" style="text-align: center;">
<el-button type="primary" @click="submit">确定</el-button>
<el-button @click="close">关闭</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { ref, defineProps, defineEmits, reactive, getCurrentInstance } from 'vue';
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { tbYjxxYjzp } from '@/api/yj'
const { proxy } = getCurrentInstance();
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
title: {
type: String,
default: '预警指派'
},
width: {
type: String,
default: '50%'
},
url: {
type: String,
default: ''
},
dataList: {
type: Object,
default: () => ({})
}
});
const listQuery = ref()
const formData = ref([
{ label: "指派部门", prop: "zpbmdm", depMc: 'zpbm', type: "department", width: '45%' },
{ label: "指派原因", prop: "zpyy", type: "textarea", width: '80%' },
])
const rules = reactive({
zpbmdm: [{ required: true, message: "请选择指派部门", trigger: "blur" }],
zpyy: [{ required: true, message: "请输入指派原因", trigger: "change" }],
});
const elform = ref(null)
const submit = async () => {
elform.value.submit(() => {
const params = { ...listQuery.value, yjid: props.dataList.id };
tbYjxxYjzp(params).then((res) => {
proxy.$message({ type: "success", message: "成功" });
close();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
});
}
// 定义事件
const emit = defineEmits(['update:modelValue']);
const close = () => {
elform.value.reset()
emit('update:modelValue', false);
};
</script>
<style scoped>
</style>

View File

@ -0,0 +1,332 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10 mb10">
<Search :searchArr="searchConfiger" @submit="onSearch" ref="searchDom" :key="pageData.keyCount">
</Search>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="exportExl">批量导出</el-button>
<el-button type="primary" size="small" @click="handleQs">批量签收</el-button>
<el-button type="primary" size="small" @click="handleQs">批量分析</el-button>
<el-button type="primary" size="small" @click="countPeople">计算人数</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox heightBox">
<MyTable expand :tableData="pageData.tableData" :tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight" :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth" @chooseData="handleChooseData">
<template #expand="{ props }">
<div style="max-width: 100%">
<Items :row="props || {}" />
</div>
</template>
<template #czzt="{ row }">
<DictTag :value="row.czzt" :tag="false" :options="D_GSXT_YJXX_CZZT" />
</template>
<template #xbdm="{ row }">
<DictTag :value="row.xbdm" :tag="false" :options="D_BZ_XB" />
</template>
<template #age="{ row }">
<span v-if="row.yjRysfzh"> {{ IdCard(row.yjRysfzh, 3) }} </span>
</template>
<template #yjJb="{ row }">
<DictTag :value="row.yjJb" :tag="false" :options="D_BZ_YJJB" />
</template>
<template #bqdl="{ row }">
<DictTag :value="row.bqdl" :tag="false" :options="D_GS_QLZDRLX" />
</template>
<template #yjLylx="{ row }">
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" />
</template>
<template #yjLx="{ row }">
<DictTag :value="row.yjLx" :tag="false" :options="D_GS_QLZDRYXX" />
</template>
<template #controls="{ row }">
<el-link type="primary" @click="handleQsSingle(row)">签收</el-link>
<el-link type="primary" @click="particularsOpen(row)">详情</el-link>
<el-link type="warning" @click="pushWarning(row)">指派</el-link>
<el-link type="warning" v-if="row.sfbc != '1'" @click="failWarning(row)">报错</el-link>
<el-link type="primary" @click="payAttention(row)">关注</el-link>
</template>
<template #cszt="{ row }">
<DictTag :value="row.cszt" :tag="false" :options="D_GSXT_YJXX_CZZT" />
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
<ZpForm v-model="warningShow" :dataList="dataList" />
<Particulars v-model="particularsShow" :dataList="dataPres"
:dict="{ D_BZ_XB, D_BZ_YJJB, D_GS_QLZDRLX, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB }" />
<peopleConut v-model="searchOpen" :dataConut="dataConut" />
</template>
<script setup>
import { getMultiDictVal } from "@/utils/dict.js"
import { exportExlByObj } from "@/utils/exportExcel.js"
import Items from '@/views/backOfficeSystem/fourColorManage/warningList/portraitWarning/item/items.vue'
import ZpForm from "./zpForm.vue";
import Particulars from "./particulars.vue";
import { IdCard } from '@/utils/validate.js'
import Search from "@/components/aboutTable/Search.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance, } from "vue";
import peopleConut from "./peopleConut.vue";
const { proxy } = getCurrentInstance();
const { D_BZ_YJLY, D_GS_QLZDRLX, D_GS_ZDR_GJLB, D_BZ_YJJB, D_GS_CSZT, D_GS_QLZDRYXX, D_BZ_XB, D_GSXT_YJXX_CZZT, D_GS_ZDR_RYJB } = proxy.$dict('D_BZ_YJLY', 'D_GS_QLZDRLX', "D_BZ_YJJB", "D_GS_QLZDRYXX", "D_BZ_XB", "D_GSXT_YJXX_CZZT", "D_GS_ZDR_RYJB", 'D_GS_ZDR_GJLB', 'D_GS_CSZT'); //获取字典数据
const searchBox = ref(); //搜索框
const warningShow = ref(false);
const dataList = ref([]);
const searchConfiger = ref(
[
{ label: "预警时间", prop: 'startTime', showType: "datetimerange", placeholder: "请选择预警时间" },
{ label: "预警级别", prop: 'yjJb', placeholder: "请选择预警级别", showType: "select", options: D_BZ_YJJB, multiple: true },
{ label: "接收单位", prop: 'ssbmdm', showType: "department" },
{ prop: 'sfglyj', showType: "checkbox", showSelectAll: false, options: [{ label: '关联预警', value: '1' }] },
{ prop: 'sfgz', showType: "checkbox", showSelectAll: false, options: [{ label: '重点关注', value: '1' }] },
{ prop: 'sfzp', showType: "checkbox", showSelectAll: false, options: [{ label: '二次指派', value: '1' }] },
{ label: "超时状态", prop: 'cszt', placeholder: "请选择超时状态", showType: "select", options: D_GS_CSZT },
{ label: "人员类别", prop: 'bqdl', placeholder: "请选择人员类别", showType: "select", options: D_GS_QLZDRLX },
{ label: "预警次数", prop: 'yjCs', placeholder: "请输入预警次数", showType: "number" },
{ label: "人员级别", prop: 'yjJb', showType: "select", options: D_GS_ZDR_RYJB },
{ label: "轨迹类别", prop: 'yjLylx', showType: "select", options: D_GS_ZDR_GJLB },
{ label: "姓名", prop: 'yjRyxm', placeholder: "请输入姓名", showType: "input" },
{ label: "性别", prop: 'xbdm', placeholder: "请选择性别", showType: "select", options: D_BZ_XB },
{ label: "身份证", prop: 'yjRysfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "开始年龄", prop: 'ksnl', placeholder: "请输入年龄", showType: "number" },
{ label: "结束年龄", prop: 'jsnl', placeholder: "请输入年龄", showType: "number" },
{ label: "活动发生地", prop: 'yjDz', placeholder: "请输入活动发生地", showType: "input" },
{ label: "人员细类", prop: 'yjbqmc', placeholder: "请输入人员细类", showType: "input" },
])
const queryFrom = ref({});
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkBox",
loading: false,
haveControls: true
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 200, //操作栏宽度
tableColumn: [
{ label: "预警状态", prop: "czzt", showSolt: true, width: 70 },
{ label: "预警时间", prop: "yjSj", width: 148 },
{ label: "人员姓名", prop: "yjRyxm", },
{ label: "身份证号", prop: "yjRysfzh", width: 148 },
{ label: "性别", prop: "xbdm", showSolt: true, width: 60 },
{ label: "年龄", prop: "age", showSolt: true, width: 50 },
{ label: "级别", prop: "yjJb", showSolt: true, width: 50 },
{ label: "人员类别", prop: "bqdl", showSolt: true, width: 100 },
{ label: "人员细类", prop: "yjbqmc" },
{ label: "轨迹类别", prop: "yjLylx", showSolt: true },
{ label: "活动发生地", prop: "yjDz" },
{ label: "接收单位", prop: "ssbm", width: 148 },
{ label: "次数", prop: "yjCs", width: 50 },
{ label: "超时状态", prop: "cszt" },
]
});
onMounted(() => {
tabHeightFn();
getList()
});
// 搜索
const onSearch = (val) => {
queryFrom.value = { ...val, yjJb: val.yjJb?.join(',') || '' }
queryFrom.value.startTime = val.startTime ? val.startTime[0] : ''
queryFrom.value.endTime = val.startTime ? val.startTime[1] : ''
queryFrom.value.sfglyj = val.sfglyj?.join(',') || ''
queryFrom.value.sfgz = val.sfgz?.join(',') || ''
queryFrom.value.sfzp = val.sfzp?.join(',') || ''
pageData.pageConfiger.pageCurrent = 1;
getList()
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList()
}
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList()
}
const getList = () => {
pageData.tableConfiger.loading = true;
const promes = {
...queryFrom.value,
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize,
}
delete promes.times;
qcckPost(promes, '/mosty-gsxt/tbYjxx/getQlzdrPageList').then((res) => {
pageData.total = res.total || 0;
pageData.tableConfiger.loading = false;
pageData.tableData = res.records || []
}).catch(() => {
pageData.tableConfiger.loading = false;
})
}
const pushWarning = (val) => {
warningShow.value = true;
dataList.value = val;
}
const failWarning = (val) => {
let ids = [val.id]
qcckPost({ ids }, '/mosty-gsxt/tbYjxx/yjbc').then((res) => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}
/** 选中项 */
const selectRows = ref([])
const handleChooseData = (val) => {
selectRows.value = val
}
const exportExl = () => {
const titleObj = {
czzt_name: "状态",
yjSj: "预警时间",
yjRyxm: "人员姓名",
yjRysfzh: "身份证号",
yjJb_name: "预警级别",
bqdl_name: "人员类别",
yjbqmc: "细类",
yjDz: "活动发生地",
ssbm: "接收单位",
yjCs: "预警次数",
}
/** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
const data = needArr.map(item => {
return {
...item,
czzt_name: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
yjJb_name: getMultiDictVal(item.yjJb, D_BZ_YJJB),
bqdl_name: getMultiDictVal(item.bqdl, D_GS_QLZDRLX),
}
})
exportExlByObj(titleObj, data, '七类重点')
}
// 批量签收
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ ids }, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
// 详情
const dataPres = ref({})
const particularsShow = ref(false);
const particularsOpen = (row) => {
dataPres.value = row
particularsShow.value = true;
}
// 单条签收
const handleQsSingle = (row) => {
if (row.czzt == '02') return proxy.$message({ type: "warning", message: "数据已签收,无需重复签收" });
proxy.$confirm('确认要签收该条预警数据吗?', "警告", { type: "warning" }).then(() => {
qcckPost({ ids: [row.id] }, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
// 关注
const payAttention = (row) => {
let promes = {}
if (row.sfgz == '1') {
promes.sfgz = '0'
promes.msg = '取消关注'
} else {
promes.sfgz = '1'
promes.msg = '关注'
}
proxy.$confirm('确认要关注该条预警数据吗?', "警告", { type: "warning" }).then(() => {
qcckPost({ sfgz: promes.sfgz, id: row.id }, '/mosty-gsxt/tbYjxx/yjgz').then(() => {
proxy.$message({ type: "success", message: `${promes.msg}成功` });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: `${promes.msg}失败` });
});
}).catch(() => { });
}
// 人数计算
const searchDom = ref(null)
const dataConut = ref(0)
const searchOpen = ref(false)
const countPeople = () => {
const promes = {
...searchDom.value.searchObj,
yjJb: searchDom.value.searchObj.yjJb?.join(',') || '',
startTime: searchDom.value.searchObj.startTime ? searchDom.value.searchObj.startTime[0] : '',
endTime: searchDom.value.searchObj.endTime ? searchDom.value.searchObj.endTime[1] : '',
sfglyj: searchDom.value.searchObj.sfglyj?.join(',') || '',
sfgz: searchDom.value.searchObj.sfgz?.join(',') || '',
sfzp: searchDom.value.searchObj.sfzp?.join(',') || '',
}
qcckPost(promes, '/mosty-gsxt/tbYjxx/bkyjQctj').then((res) => {
dataConut.value = res || 0
searchOpen.value = true
}).catch(() => {
// proxy.$message({ type: "error", message: `${promes.msg}失败` });
});
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
window.onresize = function () { tabHeightFn(); };
};
</script>
<style lang="scss" scoped>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
::v-deep .el-table .cell {
padding: 0;
}
::v-deep .el-table .el-table__cell {
padding: 4px 0;
}
</style>

View File

@ -2,38 +2,41 @@
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10 mb10">
<Search :searchArr="searchConfiger" @submit="onSearch" ref="searchDom" :key="pageData.keyCount">
</Search>
<!-- <Search :searchArr="searchConfiger" @submit="onSearch" ref="searchDom" :key="pageData.keyCount">
</Search> -->
<QueryFormPanel v-model="queryFrom" :fields="searchConfiger" ref="searchDom" @search='onSearch'>
<template #but>
<el-button type="primary" size="small" @click="exportExl">批量导出</el-button>
<el-button type="primary" size="small" @click="handleQs">批量签收</el-button>
<el-button type="primary" size="small" @click="handleQs">批量分析</el-button>
<el-button type="primary" size="small" @click="countPeople">计算人数</el-button>
</template>
</QueryFormPanel>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<!-- <PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="exportExl">批量导出</el-button>
<el-button type="primary" size="small" @click="handleQs">批量签收</el-button>
<el-button type="primary" size="small" @click="handleQs">批量分析</el-button>
<el-button type="primary" size="small" @click="countPeople">计算人数</el-button>
</template>
</PageTitle>
</PageTitle> -->
<!-- 表格 -->
<div class="tabBox heightBox">
<MyTable expand :tableData="pageData.tableData" :tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight" :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth" @chooseData="handleChooseData">
<template #expand="{ props }">
<div style="max-width: 100%">
<Items :row="props || {}" />
</div>
</template>
<template #czzt="{ row }">
<DictTag :value="row.czzt" :tag="false" :options="D_GSXT_YJXX_CZZT" />
<div style="background-color: #fff;">
<WarnDataTable :loading="pageData.tableConfiger.loading" :tableHeight="pageData.tableHeight"
:data="pageData.tableData" :columns="pageData.tableColumn" table-class="warn-table"
@selectionChange="handleChooseData">
<template #status="{ row }">
<DictTag :value="row.czzt" :color="row.czzt === '01' ? '#ff2424' : '#1d72e8'" :tag="false"
:options="D_GSXT_YJXX_CZZT" />
</template>
<template #xbdm="{ row }">
<DictTag :value="row.xbdm" :tag="false" :options="D_BZ_XB" />
</template>
<template #age="{ row }">
<span v-if="row.yjRysfzh"> {{ IdCard(row.yjRysfzh, 3) }} </span>
</template>
<template #yjJb="{ row }">
<DictTag :value="row.yjJb" :tag="false" :options="D_BZ_YJJB" />
<div :style="{ 'background-color': bqYs(row.yjJb) }">
<DictTag :value="row.yjJb" color="#fff" :tag="false" :options="D_BZ_YJJB" />
</div>
</template>
<template #bqdl="{ row }">
<DictTag :value="row.bqdl" :tag="false" :options="D_GS_QLZDRLX" />
@ -41,21 +44,19 @@
<template #yjLylx="{ row }">
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" />
</template>
<template #yjLx="{ row }">
<DictTag :value="row.yjLx" :tag="false" :options="D_GS_QLZDRYXX" />
</template>
<template #controls="{ row }">
<el-link type="primary" @click="handleQsSingle(row)">签收</el-link>
<el-link type="primary" @click="particularsOpen(row)">详情</el-link>
<el-link type="warning" @click="pushWarning(row)">指派</el-link>
<el-link type="warning" v-if="row.sfbc != '1'" @click="failWarning(row)">报错</el-link>
<el-link type="primary" @click="payAttention(row)">关注</el-link>
</template>
<template #cszt="{ row }">
<DictTag :value="row.cszt" :tag="false" :options="D_GSXT_YJXX_CZZT" />
<DictTag :value="row.cszt" :tag="false" :options="D_GS_CSZT" />
</template>
</MyTable>
<template #operation="{ row }">
<div style="display: flex;justify-content: space-between;">
<span class="primary" @click="handleQsSingle(row)">签收</span>
<span class="primary" @click="particularsOpen(row)">详情</span>
<span class="warning" @click="pushWarning(row)">指派</span>
<span class="warning" v-if="row.sfbc != '1'" @click="failWarning(row)">报错</span>
<span class="primary" @click="payAttention(row)">关注</span>
</div>
</template>
</WarnDataTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
@ -63,54 +64,58 @@
</div>
</div>
<ZpForm v-model="warningShow" :dataList="dataList" />
<Particulars v-model="particularsShow" :dataList="dataPres" :dict="{D_BZ_XB,D_BZ_YJJB,D_GS_QLZDRLX,D_GS_ZDR_RYJB,D_GS_ZDR_GJLB}" />
<Particulars v-model="particularsShow" :dataList="dataPres"
:dict="{ D_BZ_XB, D_BZ_YJJB, D_GS_QLZDRLX, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB }" />
<peopleConut v-model="searchOpen" :dataConut="dataConut" />
</template>
<script setup>
import { getMultiDictVal } from "@/utils/dict.js"
import { exportExlByObj } from "@/utils/exportExcel.js"
import Items from '@/views/backOfficeSystem/fourColorManage/warningList/portraitWarning/item/items.vue'
import ZpForm from "./zpForm.vue";
import { bqYs } from '@/utils/tools.js'
import Particulars from "./particulars.vue";
import { IdCard } from '@/utils/validate.js'
import Search from "@/components/aboutTable/Search.vue";
import WarnDataTable from '@/views/backOfficeSystem/ces/components/WarnDataTable.vue'
import QueryFormPanel from "@/views/backOfficeSystem/ces/components/QueryFormPanel.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
// import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance, } from "vue";
import peopleConut from "./peopleConut.vue";
const { proxy } = getCurrentInstance();
const { D_BZ_YJLY, D_GS_QLZDRLX, D_GS_ZDR_GJLB, D_BZ_YJJB, D_GS_CSZT, D_GS_QLZDRYXX, D_BZ_XB, D_GSXT_YJXX_CZZT, D_GS_ZDR_RYJB } = proxy.$dict('D_BZ_YJLY', 'D_GS_QLZDRLX', "D_BZ_YJJB", "D_GS_QLZDRYXX", "D_BZ_XB", "D_GSXT_YJXX_CZZT", "D_GS_ZDR_RYJB", 'D_GS_ZDR_GJLB', 'D_GS_CSZT'); //获取字典数据
const { D_BZ_YJLY, D_GS_QLZDRLX, D_GS_ZDR_GJLB, D_BZ_YJJB, D_GS_CSZT, D_GS_QLZDRYXX, D_BZ_XB, D_GSXT_YJXX_CZZT, D_GS_ZDR_RYJB, D_BZ_SF } = proxy.$dict('D_BZ_YJLY', 'D_GS_QLZDRLX', "D_BZ_YJJB", "D_GS_QLZDRYXX", "D_BZ_XB", "D_GSXT_YJXX_CZZT", "D_GS_ZDR_RYJB", 'D_GS_ZDR_GJLB', 'D_GS_CSZT', "D_BZ_SF"); //获取字典数据
const searchBox = ref(); //搜索框
const warningShow = ref(false);
const dataList = ref([]);
const searchConfiger = ref(
[
{ label: "预警时间xx", prop: 'startTime', showType: "datetimerange", placeholder: "请选择预警时间" },
{ label: "预警级别", prop: 'yjJb', placeholder: "请选择预警级别", showType: "select", options: D_BZ_YJJB, multiple: true },
{ label: "接收单位", prop: 'ssbmdm', showType: "department" },
{ prop: 'sfglyj', showType: "checkbox", showSelectAll: false, options: [{ label: '关联预警', value: '1' }] },
{ prop: 'sfgz', showType: "checkbox", showSelectAll: false, options: [{ label: '重点关注', value: '1' }] },
{ prop: 'sfzp', showType: "checkbox", showSelectAll: false, options: [{ label: '二次指派', value: '1' }] },
{label: "超时状态", prop: 'cszt', placeholder: "请选择超时状态", showType: "select", options: D_GS_CSZT},
{ label: "人员类别", prop: 'bqdl', placeholder: "请选择人员类别", showType: "select", options: D_GS_QLZDRLX },
{ label: "预警次数", prop: 'yjCs', placeholder: "请输入预警次数", showType: "number" },
{ label: "人员级别", prop: 'yjJb', showType: "select", options: D_GS_ZDR_RYJB },
{ label: "轨迹类别", prop: 'yjLylx', showType: "select", options: D_GS_ZDR_GJLB },
{ label: "姓名", prop: 'yjRyxm', placeholder: "请输入姓名", showType: "input" },
{ label: "性别", prop: 'xbdm', placeholder: "请选择性别", showType: "select", options: D_BZ_XB },
{ label: "身份证", prop: 'yjRysfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "开始年龄", prop: 'ksnl', placeholder: "请输入年龄", showType: "number" },
{ label: "结束年龄", prop: 'jsnl', placeholder: "请输入年龄", showType: "number" },
{ label: "活动发生地", prop: 'yjDz', placeholder: "请输入活动发生地", showType: "input" },
{ label: "人员细类", prop: 'yjbqmc', placeholder: "请输入人员细类", showType: "input" },
{ key: 'startTime', label: '预警时间', type: 'datetimerange', placeholder: '请选择预警时间' },
{ key: 'yjJb', label: '预警级别', type: 'select', options: D_BZ_YJJB, multiple: true, placeholder: '请选择预警级别' },
{ key: 'ssbmdm', label: '接收单位', type: 'department', placeholder: '请选择接收单位' },
{ key: 'sfglyj', label: '关联预警', type: 'select', options: D_BZ_SF, placeholder: '请选择关联预警' },
{ key: 'yjRyxm', label: '姓名', type: 'input', placeholder: '请输入姓名' },
{ key: 'xbdm', label: '性别', type: 'select', options: D_BZ_XB, placeholder: '请选择性别' },
{ key: 'cszt', label: '超时状态', type: 'select', options: D_GS_CSZT, placeholder: '请选择超时状态' },
{ key: 'bqdl', label: '人员类别', type: 'select', options: D_GS_QLZDRLX, placeholder: '请选择人员类别' },
{ key: 'sfgz', label: '重点关注', type: 'select', options: D_BZ_SF, placeholder: '请选择重点关注' },
{ key: 'sfzp', label: '二次指派', type: 'select', options: D_BZ_SF, placeholder: '请选择二次指派' },
{ key: 'yjRysfzh', label: '身份证号码', type: 'input', placeholder: '请输入身份证号码' },
{ key: 'ksnl', label: '开始年龄', type: 'input', placeholder: '请输入开始年龄' },
{ key: 'jsnl', label: '结束年龄', type: 'input', placeholder: '请输入结束年龄' },
{ key: 'yjCs', label: '预警次数', type: 'input', placeholder: '请输入预警次数' },
{ key: 'bqdl', label: '人员级别', type: 'select', options: D_GS_ZDR_RYJB },
{ key: 'yjLylx', label: '轨迹类别', type: 'select', options: D_GS_ZDR_GJLB },
{ key: 'yjDz', label: '活动发生地', type: 'input', placeholder: '请输入活动发生地' },
{ key: 'yjbqmc', label: '人员细类', type: 'input', placeholder: '请输入人员细类' }
])
const queryFrom = ref({});
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableHeight: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkBox",
@ -124,20 +129,23 @@ const pageData = reactive({
}, //分页
controlsWidth: 200, //操作栏宽度
tableColumn: [
{ label: "预警状态", prop: "czzt", showSolt: true, width: 70 },
{ label: "预警时间", prop: "yjSj", width: 148 },
{ label: "人员姓名", prop: "yjRyxm", },
{ label: "身份证号", prop: "yjRysfzh", width: 148 },
{ label: "性别", prop: "xbdm", showSolt: true, width: 60 },
{ label: "年龄", prop: "age", showSolt: true, width: 50 },
{ label: "级别", prop: "yjJb", showSolt: true, width: 50 },
{ label: "人员类别", prop: "bqdl", showSolt: true, width: 100 },
{ label: "人员细类", prop: "yjbqmc" },
{ label: "轨迹类别", prop: "yjLylx", showSolt: true },
{ label: "活动发生地", prop: "yjDz" },
{ label: "接收单位", prop: "ssbm", width: 148 },
{ label: "次数", prop: "yjCs", width: 50 },
{ label: "超时状态", prop: "cszt" },
{ type: 'index', label: '序号', width: 55, align: 'center' },
{ label: '预警状态', width: 86, align: 'center', slotName: 'status' },
{ prop: 'yjSj', label: '预警时间', width: 150 },
{ prop: 'yjRyxm', label: '人员姓名', width: 80 },
{ prop: 'yjRysfzh', label: '身份证号', width: 158 },
{ label: '性别', width: 56, align: 'center', slotName: 'xbdm' },
{ prop: 'nl', label: '年龄', width: 56, align: 'center' },
{ label: '预警级别', width: 88, align: 'center', slotName: 'yjJb' },
{ label: '人员类别', width: 90, align: 'center', slotName: 'bqdl' },
{ prop: 'yjbqmc', label: '人员细类', width: 92 },
{ label: '轨迹类别', width: 92, align: 'center', slotName: 'yjLylx' },
{ prop: 'yjDz', label: '活动发生地' },
{ prop: 'ssbm', label: '接收单位' },
{ prop: 'yjCs', label: '次数', width: 60, align: 'center' },
{ label: '操作', width: 180, slotName: 'operation' },
{ label: '超时状态', width: 80, align: 'center', slotName: 'cszt' }
]
});
@ -151,9 +159,9 @@ const onSearch = (val) => {
queryFrom.value = { ...val, yjJb: val.yjJb?.join(',') || '' }
queryFrom.value.startTime = val.startTime ? val.startTime[0] : ''
queryFrom.value.endTime = val.startTime ? val.startTime[1] : ''
queryFrom.value.sfglyj = val.sfglyj?.join(',') || ''
queryFrom.value.sfgz = val.sfgz?.join(',') || ''
queryFrom.value.sfzp = val.sfzp?.join(',') || ''
// queryFrom.value.sfglyj = val.sfglyj?.join(',') || ''
// queryFrom.value.sfgz = val.sfgz?.join(',') || ''
// queryFrom.value.sfzp = val.sfzp?.join(',') || ''
pageData.pageConfiger.pageCurrent = 1;
getList()
}
@ -171,6 +179,7 @@ const getList = () => {
...queryFrom.value,
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize,
}
delete promes.times;
qcckPost(promes, '/mosty-gsxt/tbYjxx/getQlzdrPageList').then((res) => {
@ -248,7 +257,7 @@ const handleQs = () => {
}).catch(() => { });
}
// 详情
const dataPres=ref({})
const dataPres = ref({})
const particularsShow = ref(false);
const particularsOpen = (row) => {
dataPres.value = row
@ -290,42 +299,37 @@ const payAttention = (row) => {
// 人数计算
const searchDom = ref(null)
const dataConut = ref(0)
const searchOpen=ref(false)
const searchOpen = ref(false)
const countPeople = () => {
const promes = {
...searchDom.value.searchObj,
yjJb: searchDom.value.searchObj.yjJb?.join(',') || '',
startTime: searchDom.value.searchObj.startTime ? searchDom.value.searchObj.startTime[0] : '',
endTime: searchDom.value.searchObj.endTime ? searchDom.value.searchObj.endTime[1] : '',
sfglyj: searchDom.value.searchObj.sfglyj?.join(',') || '',
sfgz: searchDom.value.searchObj.sfgz?.join(',') || '',
sfzp: searchDom.value.searchObj.sfzp?.join(',') || '',
...searchDom.value.formState,
yjJb: searchDom.value.formState.yjJb?.join(',') || '',
startTime: searchDom.value.formState.startTime ? searchDom.value.formState.startTime[0] : '',
endTime: searchDom.value.formState.endTime ? searchDom.value.formState.endTime[1] : '',
}
qcckPost(promes, '/mosty-gsxt/tbYjxx/bkyjQctj').then((res) => {
dataConut.value = res || 0
searchOpen.value=true
searchOpen.value = true
}).catch(() => {
// proxy.$message({ type: "error", message: `${promes.msg}失败` });
});
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
console.log("xxxxxxx");
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () { tabHeightFn(); };
};
</script>
<style lang="scss" scoped>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
.danger {
color: #ff2424;
}
::v-deep .el-table .cell {
padding: 0;
}
::v-deep .el-table .el-table__cell {
padding: 4px 0;
.ok {
color: #1d72e8;
}
</style>

View File

@ -0,0 +1,471 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" @reset="onReset" :key="pageData.keyCount">
<template #yjRyxms>
<el-select clearable v-model="listQuery.yjRyxm" filterable remote allow-create default-first-optionreserve-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>
</template>
</Search>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="exportExl">导出</el-button>
<el-button type="primary" size="small" @click="handleQs" v-if="permission_sfqs">签收</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox tabBox_zdy">
<MyTable
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
expand
@chooseData="handleChooseData"
:rowClassName="getRowClassName"
>
<template #expand="{ props }">
<Items :row="props"/>
</template>
<template #yjTp="{ row }">
<template v-if="!row.yjTp || row.yjTp.includes('baidu')">
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="30" height="30" v-else />
</template>
<el-image v-else style="width: 30px; height:30px" :src="row.yjTp" :preview-src-list="[row.yjTp]"
show-progress>
<template #error>
<div class="image-slot error">
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="30" height="30" v-else />
</div>
</template>
</el-image>
</template>
<template #nl="{ row }">
{{ IdCard(row.yjRysfzh, 3) }}
</template>
<template #xb="{ row }">
{{ IdCard(row.yjRysfzh, 2) }}
</template>
<template #xsd="{ row }">
{{ row.xsd }}%
</template>
<template #yjLylx="{ row }">
<DictTag v-model:value="row.yjLylx" :options="D_BZ_YJLY" />
</template>
<template #czzt="{ row }">
<DictTag v-model:value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
</template>
<template #yjJb="{ row }">
<DictTag v-model:value="row.yjJb" :options="D_BZ_YJJB" />
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')" v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<el-link type="primary" @click="openAddFrom(row)">详情</el-link>
<el-link type="primary" @click="pushWarning(row)">指派</el-link>
</template>
</MyTable>
<Pages
@changeNo="changeNo"
@changeSize="changeSize"
:tableHeight="pageData.tableHeight"
:pageConfiger="{ ...pageData.pageConfiger, total: pageData.total }">
</Pages>
</div>
</div>
<HolographicArchive v-model="assessShow" :dataList="dataList" />
<Information v-model="showDialog" title="发送指令" @submit='submitSendZl' @close='closeFszl'>
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj" :tacitly="tacitly" />
</Information>
<!-- 详情 -->
<AddFromz ref="addFromRefs" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLYXT }" />
<!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<!-- 指派 -->
<ZpForm v-model="warningShow" :dataList="dataList"/>
<!-- 反馈 -->
<FkDialog @change="getList" />
<Pagination v-model="paginationOpen" />
</template>
<script setup>
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { getItem, setItem } from '@/utils/storage'
import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js"
import { tbYjxxGetPageList } from '@/api/yj.js'
import { IdCard } from '@/utils/validate.js'
import { tbGsxtZdrySelectList } from "@/api/zdr.js"
import { holographicProfileJump } from "@/utils/tools.js"
import Items from './item/items.vue'
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import Information from "@/views/home/model/information.vue";
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import ZpForm from "@/views/backOfficeSystem/fourColorManage/warningControl/sevenWarning/zpForm.vue";
import Czjy from './components/czjy.vue';
import AddFromz from './components/addFrom.vue';
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Search from "@/components/aboutTable/Search.vue";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import Pagination from "./components/particulars.vue";
const ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
const { proxy } = getCurrentInstance();
const { D_GSXT_YJXX_CZZT,D_GS_QLZDRLX, D_BZ_YJJB, D_BZ_YJLYXT, D_BZ_YJLY, D_BZ_XB ,D_GS_CSZT} = proxy.$dict("D_GSXT_YJXX_CZZT",'D_GS_QLZDRLX ', "D_BZ_YJJB", "D_BZ_YJLYXT", "D_BZ_YJLY", "D_BZ_XB","D_GS_CSZT")
const searchBox = ref(); //搜索框
const roleCode = ref(false)
const czjyRef = ref()
const itemData = ref()
const semdFqzlRef = ref()
const warningShow = ref(false)
const dataList = ref([])
const showDialog = ref(false)// 发送指令
const assessShow = ref(false)// 全息档案
const searchConfiger = ref(
[
{ label: "预警时间", prop: 'times', showType: "datetimerange" },
{ label: "超时状态", prop: 'cszt', placeholder: "请选择超时状态", showType: "select", options: D_GS_CSZT },
{ label: "比中项", prop: 'yjLx', showType: "checkbox", showSelectAll: true, options: [{ label: '人员', value: '1', }, { label: '车辆', value: '2', }] },
{ label: "预警级别", prop: 'yjJb', showType: "select", options: D_BZ_YJJB, placeholder: "请选择预警级别", multiple: true },
{ label: "人员类别", prop: 'yjJb', showType: "select", options: D_BZ_YJJB, placeholder: "请选择预警级别", multiple: true },
{ label: "接收单位", prop: 'ssbmdm', placeholder: "请选择接收单位", showType: "department" },
{ label: "放飞开始时间", prop: 'bkkssj', showType: "date", placeholder: "请选择放飞开始时间" },
{ label: "放飞结束时间", prop: 'bkjssj', showType: "date", placeholder: "请选择放飞结束时间" },
{ label: "无人机型号", prop: 'xm', placeholder: "请输入无人机型号", showType: "input" },
{ label: "手机号码", prop: 'mobile', placeholder: "请输入手机号码", showType: "input" },
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
{ label: "放飞区域", prop: 'xm', placeholder: "请输入放飞区域", showType: "input" },
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
// { label: "布控人员", prop: 'yjRyxms', showType: "Slot" },
// { label: "性别", prop: 'xbdm', placeholder: "请选择性别", showType: "select", options: D_BZ_XB },
// { label: "身份证", prop: 'yjRysfzh', placeholder: "请输入身份证号码", showType: "input" },
// { label: "预警时间", prop: 'times', showType: "datetimerange" },
// { label: "状态", prop: 'czzt', placeholder: "请选择状态", showType: "select", options: D_GSXT_YJXX_CZZT },
// { label: "细类", prop: 'yjbqmc', placeholder: "请输入细类", showType: "input" },
// { label: "活动发生地址", prop: 'yjDz', placeholder: "请输入活动发生地址", showType: "input" },
// { label: "接收单位", prop: 'ssbmdm',showType: "department" },
]);
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkBox",
loading: false,
haveControls: true
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 160, //操作栏宽度
tableColumn: [
{ label: "处置状态", prop: "czzt", showSolt: true },
{ label: "姓名", prop: "yjRyxm" },
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true, width: 200 },
{ label: "比重类别", prop: "yjTp", showSolt: true, width: 100 },
{ label: "预警级别", prop: "yjJb", showSolt: true },
{ label: "细类", prop: "czzt", showSolt: true },
{ label: "开始放飞时间", prop: "czzt", showSolt: true },
{ label: "结束放飞时间", prop: "czzt", showSolt: true },
{ label: "飞行时间", prop: "czzt", showSolt: true },
{ label: "放飞区域", prop: "czzt", showSolt: true },
{ label: "无人机类型", prop: "czzt", showSolt: true },
{ label: "手机号", prop: "czzt", showSolt: true },
{ label: "所属单位", prop: "czzt", showSolt: true },
{ label: "超时状态", prop: "czzt", showSolt: true },
// { label: "预警图片", prop: "yjTp", showSolt: true, width: 100 },
// { label: "处置状态", prop: "czzt", showSolt: true },
// { label: "预警时间", prop: "yjSj", showOverflowTooltip: true, width: 200 },
// { label: "姓名", prop: "yjRyxm" },
// { label: "性别", prop: "xb", showSolt: true, width: 80 },
// { label: "年龄", prop: "nl", showSolt: true, width: 80 },
// { label: "数据来源", prop: "yjLylx", showOverflowTooltip: true, showSolt: true },
// { label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true, width: 200 },
// { label: "预警级别", prop: "yjJb", showSolt: true },
// { label: "相似度", prop: "xsd", showSolt: true },
// { label: "所属部门", prop: "ssbm", showOverflowTooltip: true },
]
});
const addFromRefs = ref()
const listQuery = ref({})
const opentions = ref([])
const loading = ref(false)
const selectRows = ref([])
const permission_sfqs = ref(false)
onMounted(() => {
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
permission_sfqs.value = str.startsWith('2'||'3') ? false : true;
let rols = getItem('roleList') ? getItem('roleList'):[]
let obj = rols.find(item => {
return ['JS_666666','JS_777777','JS_888888'].includes(item.roleCode)
})
roleCode.value = obj ? true : false;
tabHeightFn();
getList()
});
// 搜索
const onReset = () => {
listQuery.value.yjRyxm = ''
}
const onSearch = (val) => {
listQuery.value = { ...listQuery.value,...val };
listQuery.value.startTime = val.times ? val.times[0] : ''
listQuery.value.endTime = val.times ? val.times[1] : ''
getList()
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList()
}
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList()
}
const getList = () => {
pageData.tableConfiger.loading = true;
const promes = {
...listQuery.value,
yjLx: '14', // 无人机预警
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize
}
delete promes.times;
tbYjxxGetPageList(promes).then((res) => {
pageData.tableData = res.records.map(item => {
return {
...item,
yjTp: item.yjlx == '01' ? item.yjTpreplace(ORDIMG, IMGYM) : item.yjTp
}
}) || [];
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
})
}
const remoteMethod = (query) => {
if (!query) return opentions.value = [];
loading.value = true
tbGsxtZdrySelectList({ ryXm: query }).then(res => {
opentions.value = res || [];
loading.value = false;
}).catch(() => {
loading.value = false
})
}
const getRowClassName = (row) => {
if (!row.row.yjJb) return '';
const level = String(row.row.yjJb);
if (level === '01' || level.includes('红') || level.includes('高')) return 'warning-level-01';
if (level === '02' || level.includes('橙') || level.includes('中')) return 'warning-level-02';
if (level === '03' || level.includes('黄') || level.includes('低')) return 'warning-level-03';
if (level === '04' || level.includes('蓝')) return 'warning-level-04';
return '';
};
// 处理签收
const handleQsFk = (val, type) => {
switch (type) {
case '签收':
proxy.$confirm("是否确定要签收?", "警告", { type: "warning" }).then(() => {
qcckPost({ id: val.id }, "/mosty-gsxt/tbYjxx/yjqs").then(() => {
val.czzt = '02'
getList()
proxy.$message({ type: "success", message: "签收成功" });
});
})
break;
case '反馈':
case '查看反馈':
emitter.emit("openFkDialog", { id: val.id, type });
break;
}
}
const handleChooseData = (val) => {
selectRows.value = val
}
// 导出
const exportExl = () => {
const titleObj = {
czzt_cname: "处置状态",
yjSj: "预警时间",
yjRyxm: "姓名",
nl_cname: "年龄", // IdCard(row.yjRysfzh, 3)
yjLylx: "数据来源",
xb_cname: "性别",
yjJb_cname: "预警级别",
xsd_cname: "相似度",
yjDz: "预警地点",
yjCs: "预警次数",
yjRysjh: "布控手机号",
yjClcph: "布控车牌号",
yjRysfzh: "身份证",
}
/** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
const data = needArr.map(item => {
return {
...item,
nl_cname: IdCard(item.yjRysfzh, 3),
xb_cname: IdCard(item.yjRysfzh, 2),
xsd_cname: (item.xsd > 0 ? item.xsd : 0) + '%',
czzt_cname: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
yjJb_cname: getMultiDictVal(item.yjJb, D_BZ_YJJB),
}
})
exportExlByObj(titleObj, data, '无人机预警.xlsx')
}
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ids}, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
// 全息档案跳转
const pushAssess = (val) => {
return holographicProfileJump(val.yjLx,val)
}
const showDetail = (item) => {
showDialog.value = true;
itemData.value = item
}
const handleClose = () => {
showDialog.value = false;
}
const submitSendZl = () => {
semdFqzlRef.value.getsendFqzl()
}
const closeFszl = () => {
semdFqzlRef.value.close()
}
// 处置建议
const handleCzjy = (row) => {
czjyRef.value.init(row)
}
// 详情
const openAddFrom = (val) => {
addFromRefs.value.init('add', val)
}
// 指派
const pushWarning = (val) => {
warningShow.value = true
dataList.value = val;
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
window.onresize = function () {
tabHeightFn();
};
};
// 详情
const paginationOpen=ref(false)
const openBox = (val) => {
paginationOpen.value = true
}
</script>
<style lang="scss">
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
/* 预警级别行样式 */
.warning-level-01 {
background-color: rgba(255, 2, 2, 0.1) !important;
}
.warning-level-01:hover {
background-color: rgba(255, 2, 2, 0.15) !important;
}
.warning-level-02 {
background-color: rgba(255, 140, 0, 0.1) !important;
}
.warning-level-02:hover {
background-color: rgba(255, 140, 0, 0.15) !important;
}
.warning-level-03 {
background-color: rgba(255, 210, 8, 0.1) !important;
}
.warning-level-03:hover {
background-color: rgba(255, 210, 8, 0.15) !important;
}
.warning-level-04 {
background-color: rgba(0, 0, 255, 0.1) !important;
}
.warning-level-04:hover {
background-color: rgba(0, 0, 255, 0.15) !important;
}
/* 确保行样式应用到所有单元格 */
.warning-level-01 td,
.warning-level-02 td,
.warning-level-03 td,
.warning-level-04 td {
background-color: transparent !important;
}
.tabBox_zdy{
.el-table--fit {
overflow: unset !important;
}
}
</style>

View File

@ -1,87 +1,39 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" @reset="onReset" :key="pageData.keyCount">
<template #yjRyxms>
<el-select clearable v-model="listQuery.yjRyxm" filterable remote allow-create default-first-optionreserve-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>
</template>
</Search>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="exportExl">导出</el-button>
<el-button type="primary" size="small" @click="handleQs" v-if="permission_sfqs">签收</el-button>
</template>
</PageTitle>
<div ref="searchBox">
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search='onSearch'>
<template #but>
<el-button type="primary" size="small" @click="exportExl">导出</el-button>
<el-button type="primary" size="small" @click="handleQs" v-if="permission_sfqs">签收</el-button>
</template>
</QueryFormPanel>
</div>
<!-- 表格 -->
<div class="tabBox tabBox_zdy">
<MyTable
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
expand
@chooseData="handleChooseData"
:rowClassName="getRowClassName"
>
<template #expand="{ props }">
<Items :row="props"/>
</template>
<template #yjTp="{ row }">
<template v-if="!row.yjTp || row.yjTp.includes('baidu')">
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="30" height="30" v-else />
</template>
<el-image v-else style="width: 30px; height:30px" :src="row.yjTp" :preview-src-list="[row.yjTp]"
show-progress>
<template #error>
<div class="image-slot error">
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="30" height="30" v-else />
</div>
</template>
</el-image>
</template>
<template #nl="{ row }">
{{ IdCard(row.yjRysfzh, 3) }}
</template>
<template #xb="{ row }">
{{ IdCard(row.yjRysfzh, 2) }}
</template>
<template #xsd="{ row }">
{{ row.xsd }}%
</template>
<template #yjLylx="{ row }">
<DictTag v-model:value="row.yjLylx" :options="D_BZ_YJLY" />
</template>
<div class="tabBox_zdy">
<WarnDataTable :loading="pageData.tableConfiger.loading" :tableHeight="pageData.tableHeight"
:data="pageData.tableData" :columns="pageData.tableColumn" table-class="warn-table"
@selectionChange="handleChooseData">
<template #czzt="{ row }">
<DictTag v-model:value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
<DictTag :value="row.czzt" :color="row.czzt === '01' ? '#ff2424' : '#1d72e8'" :tag="false"
:options="D_GSXT_YJXX_CZZT" />
</template>
<template #yjJb="{ row }">
<DictTag v-model:value="row.yjJb" :options="D_BZ_YJJB" />
<template #operation="{ row }">
<div style="display: flex;justify-content: space-between;">
<span class="warning" @click="pushAssess(row)">全息档案</span>
<span class="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</span>
<!-- <span type="primary" @click="showDetail(row)">转合成</span> -->
<!-- <span type="danger" @click="delDictItem(row.id)">转会商</span> -->
<span class="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</span>
<span class="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</span>
<!-- <span type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</span> -->
<span class="primary" @click="openBox(row)">详情</span>
<span class="primary" @click="pushWarning(row)">指派</span>
</div>
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')" v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<el-link type="primary" @click="openAddFrom(row)">详情</el-link>
<el-link type="primary" @click="pushWarning(row)">指派</el-link>
</template>
</MyTable>
<Pages
@changeNo="changeNo"
@changeSize="changeSize"
:tableHeight="pageData.tableHeight"
</WarnDataTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight"
:pageConfiger="{ ...pageData.pageConfiger, total: pageData.total }">
</Pages>
</div>
@ -91,7 +43,8 @@
<HolographicArchive v-model="assessShow" :dataList="dataList" />
<Information v-model="showDialog" title="发送指令" @submit='submitSendZl' @close='closeFszl'>
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj" :tacitly="tacitly" />
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj"
:tacitly="tacitly" />
</Information>
<!-- 详情 -->
@ -99,7 +52,7 @@
<!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<!-- 指派 -->
<ZpForm v-model="warningShow" :dataList="dataList"/>
<ZpForm v-model="warningShow" :dataList="dataList" />
<!-- 反馈 -->
<FkDialog @change="getList" />
<Pagination v-model="paginationOpen" />
@ -111,6 +64,7 @@ import emitter from "@/utils/eventBus.js";
import { getItem, setItem } from '@/utils/storage'
import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js"
import { tbYjxxGetPageList } from '@/api/yj.js'
import { IdCard } from '@/utils/validate.js'
import { tbGsxtZdrySelectList } from "@/api/zdr.js"
@ -128,10 +82,12 @@ import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Search from "@/components/aboutTable/Search.vue";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import Pagination from "./components/particulars.vue";
import WarnDataTable from '@/views/backOfficeSystem/ces/components/WarnDataTable.vue'
import QueryFormPanel from "@/views/backOfficeSystem/ces/components/QueryFormPanel.vue";
const ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
const { proxy } = getCurrentInstance();
const { D_GSXT_YJXX_CZZT,D_GS_QLZDRLX, D_BZ_YJJB, D_BZ_YJLYXT, D_BZ_YJLY, D_BZ_XB ,D_GS_CSZT} = proxy.$dict("D_GSXT_YJXX_CZZT",'D_GS_QLZDRLX ', "D_BZ_YJJB", "D_BZ_YJLYXT", "D_BZ_YJLY", "D_BZ_XB","D_GS_CSZT")
const { D_GSXT_YJXX_CZZT, D_GS_QLZDRLX, D_BZ_YJJB, D_BZ_YJLYXT, D_BZ_YJLY, D_BZ_XB, D_GS_CSZT } = proxy.$dict("D_GSXT_YJXX_CZZT", 'D_GS_QLZDRLX ', "D_BZ_YJJB", "D_BZ_YJLYXT", "D_BZ_YJLY", "D_BZ_XB", "D_GS_CSZT")
const searchBox = ref(); //搜索框
const roleCode = ref(false)
const czjyRef = ref()
@ -143,28 +99,28 @@ const showDialog = ref(false)// 发送指令
const assessShow = ref(false)// 全息档案
const searchConfiger = ref(
[
{ label: "预警时间", prop: 'times', showType: "datetimerange" },
{ label: "预警时间", prop: 'times', showType: "datetimerange" },
{ label: "超时状态", prop: 'cszt', placeholder: "请选择超时状态", showType: "select", options: D_GS_CSZT },
{ label: "比中项", prop: 'yjLx', showType: "checkbox", showSelectAll: true, options: [{ label: '人员', value: '1', }, { label: '车辆', value: '2', }] },
{ label: "比中项", prop: 'bzx', showType: "select", options: [{ label: '人员', value: '1', }, { label: '车辆', value: '2', }] },
{ label: "预警级别", prop: 'yjJb', showType: "select", options: D_BZ_YJJB, placeholder: "请选择预警级别", multiple: true },
{ label: "人员类别", prop: 'yjJb', showType: "select", options: D_BZ_YJJB, placeholder: "请选择预警级别", multiple: true },
{ label: "接收单位", prop: 'ssbmdm', placeholder: "请选择接收单位", showType: "department" },
{ label: "放飞开始时间", prop: 'bkkssj', showType: "date", placeholder: "请选择放飞开始时间" },
{ label: "放飞结束时间", prop: 'bkjssj', showType: "date", placeholder: "请选择放飞结束时间" },
{ label: "无人机型号", prop: 'xm', placeholder: "请输入无人机型号", showType: "input" },
{ label: "手机号码", prop: 'mobile', placeholder: "请输入手机号码", showType: "input" },
{ label: "人员类别", prop: 'yjJb', showType: "select", options: D_BZ_YJJB, placeholder: "请选择预警级别", multiple: true },
{ label: "接收单位", prop: 'ssbmdm', placeholder: "请选择接收单位", showType: "department" },
{ label: "放飞开始时间", prop: 'bkkssj', showType: "date", placeholder: "请选择放飞开始时间" },
{ label: "放飞结束时间", prop: 'bkjssj', showType: "date", placeholder: "请选择放飞结束时间" },
{ label: "无人机型号", prop: 'xm', placeholder: "请输入无人机型号", showType: "input" },
{ label: "手机号码", prop: 'mobile', placeholder: "请输入手机号码", showType: "input" },
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
{ label: "放飞区域", prop: 'xm', placeholder: "请输入放飞区域", showType: "input" },
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "放飞区域", prop: 'xm', placeholder: "请输入放飞区域", showType: "input" },
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
// { label: "布控人员", prop: 'yjRyxms', showType: "Slot" },
// { label: "性别", prop: 'xbdm', placeholder: "请选择性别", showType: "select", options: D_BZ_XB },
// { label: "身份证", prop: 'yjRysfzh', placeholder: "请输入身份证号码", showType: "input" },
// { label: "预警时间", prop: 'times', showType: "datetimerange" },
// { label: "状态", prop: 'czzt', placeholder: "请选择状态", showType: "select", options: D_GSXT_YJXX_CZZT },
// { label: "细类", prop: 'yjbqmc', placeholder: "请输入细类", showType: "input" },
// { label: "活动发生地址", prop: 'yjDz', placeholder: "请输入活动发生地址", showType: "input" },
// { label: "接收单位", prop: 'ssbmdm',showType: "department" },
]);
// { label: "性别", prop: 'xbdm', placeholder: "请选择性别", showType: "select", options: D_BZ_XB },
// { label: "身份证", prop: 'yjRysfzh', placeholder: "请输入身份证号码", showType: "input" },
// { label: "预警时间", prop: 'times', showType: "datetimerange" },
// { label: "状态", prop: 'czzt', placeholder: "请选择状态", showType: "select", options: D_GSXT_YJXX_CZZT },
// { label: "细类", prop: 'yjbqmc', placeholder: "请输入细类", showType: "input" },
// { label: "活动发生地址", prop: 'yjDz', placeholder: "请输入活动发生地址", showType: "input" },
// { label: "接收单位", prop: 'ssbmdm',showType: "department" },
]);
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
@ -182,31 +138,23 @@ const pageData = reactive({
}, //分页
controlsWidth: 160, //操作栏宽度
tableColumn: [
{ label: "处置状态", prop: "czzt", showSolt: true },
{ label: "姓名", prop: "yjRyxm" },
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true, width: 200 },
{ label: "比重类别", prop: "yjTp", showSolt: true, width: 100 },
{ label: "预警级别", prop: "yjJb", showSolt: true },
{ label: "细类", prop: "czzt", showSolt: true },
{ label: "开始放飞时间", prop: "czzt", showSolt: true },
{ label: "结束放飞时间", prop: "czzt", showSolt: true },
{ label: "飞行时间", prop: "czzt", showSolt: true },
{ label: "放飞区域", prop: "czzt", showSolt: true },
{ label: "无人机类型", prop: "czzt", showSolt: true },
{ label: "手机号", prop: "czzt", showSolt: true },
{ label: "所属单位", prop: "czzt", showSolt: true },
{ label: "超时状态", prop: "czzt", showSolt: true },
// { label: "预警图片", prop: "yjTp", showSolt: true, width: 100 },
// { label: "处置状态", prop: "czzt", showSolt: true },
// { label: "预警时间", prop: "yjSj", showOverflowTooltip: true, width: 200 },
// { label: "姓名", prop: "yjRyxm" },
// { label: "性别", prop: "xb", showSolt: true, width: 80 },
// { label: "年龄", prop: "nl", showSolt: true, width: 80 },
// { label: "数据来源", prop: "yjLylx", showOverflowTooltip: true, showSolt: true },
// { label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true, width: 200 },
// { label: "预警级别", prop: "yjJb", showSolt: true },
// { label: "相似度", prop: "xsd", showSolt: true },
// { label: "所属部门", prop: "ssbm", showOverflowTooltip: true },
{ type: 'index', label: '序号', width: 55, align: 'center' },
{ label: "处置状态", align: 'center', width: 80, slotName: 'czzt' },
{ prop: 'yjRyxm', label: '人员姓名', align: 'center' },
{ prop: 'yjRysfzh', label: '身份证号', width: 80, align: 'center' },
{ label: '预警级别', width: 80, align: 'center', slotName: 'yjJb' },
{ label: '比重类别', width: 80, align: 'center', slotName: 'bzlb' },
{ prop: 'xl', label: '细类', width: 80, align: 'center' },
{ prop: 'ksffsj', label: '开始放飞时间', align: 'center' },
{ prop: 'jsffsj', label: '结束放飞时间', align: 'center' },
{ label: "所属部门", prop: "ssbm", align: 'center' },
{ label: "数据来源", slotName: "yjLylx", align: 'center' },
{ prop: 'mobile', label: '手机号', width: 80, align: 'center' },
{ prop: 'wrjlx', label: '无人机类型', align: 'center' },
{ prop: 'ffsj', label: '飞行时间', width: 80, align: 'center' },
{ prop: 'ffqy', label: '放飞区域', width: 80, align: 'center' },
{ label: '操作', width: 180, slotName: 'operation' },
{ label: '超时状态', width: 80, align: 'center', slotName: 'cszt' },
]
});
const addFromRefs = ref()
@ -218,11 +166,11 @@ const permission_sfqs = ref(false)
onMounted(() => {
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
permission_sfqs.value = str.startsWith('2'||'3') ? false : true;
permission_sfqs.value = str.startsWith('2' || '3') ? false : true;
let rols = getItem('roleList') ? getItem('roleList'):[]
let rols = getItem('roleList') ? getItem('roleList') : []
let obj = rols.find(item => {
return ['JS_666666','JS_777777','JS_888888'].includes(item.roleCode)
return ['JS_666666', 'JS_777777', 'JS_888888'].includes(item.roleCode)
})
roleCode.value = obj ? true : false;
@ -234,7 +182,7 @@ const onReset = () => {
listQuery.value.yjRyxm = ''
}
const onSearch = (val) => {
listQuery.value = { ...listQuery.value,...val };
listQuery.value = { ...listQuery.value, ...val };
listQuery.value.startTime = val.times ? val.times[0] : ''
listQuery.value.endTime = val.times ? val.times[1] : ''
getList()
@ -255,7 +203,8 @@ const getList = () => {
...listQuery.value,
yjLx: '14', // 无人机预警
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize
pageSize: pageData.pageConfiger.pageSize,
bzx: listQuery.value.bzx?.join(',') || '',
}
delete promes.times;
tbYjxxGetPageList(promes).then((res) => {
@ -276,13 +225,13 @@ const getList = () => {
const remoteMethod = (query) => {
if (!query) return opentions.value = [];
loading.value = true
tbGsxtZdrySelectList({ ryXm: query }).then(res => {
opentions.value = res || [];
loading.value = false;
}).catch(() => {
loading.value = false
})
loading.value = true
tbGsxtZdrySelectList({ ryXm: query }).then(res => {
opentions.value = res || [];
loading.value = false;
}).catch(() => {
loading.value = false
})
}
const getRowClassName = (row) => {
@ -351,14 +300,14 @@ const exportExl = () => {
}
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ids}, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
qcckPost({ ids }, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
@ -369,7 +318,7 @@ const handleQs = () => {
// 全息档案跳转
const pushAssess = (val) => {
return holographicProfileJump(val.yjLx,val)
return holographicProfileJump(val.yjLx, val)
}
const showDetail = (item) => {
@ -405,13 +354,13 @@ const pushWarning = (val) => {
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () {
tabHeightFn();
};
};
// 详情
const paginationOpen=ref(false)
const paginationOpen = ref(false)
const openBox = (val) => {
paginationOpen.value = true
}
@ -463,9 +412,7 @@ const openBox = (val) => {
background-color: transparent !important;
}
.tabBox_zdy{
.el-table--fit {
overflow: unset !important;
}
.tabBox_zdy {
background-color: #ffff;
}
</style>

View File

@ -0,0 +1,484 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" @reset="onReset" :key="pageData.keyCount">
<!-- <template #yjRyxms>
<el-select clearable v-model="listQuery.yjRyxm" filterable remote allow-create
default-first-optionreserve-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>
</template> -->
</Search>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="exportExl">导出</el-button>xxxx
<el-button type="primary" size="small" @click="handleQs" v-if="permission_sfqs">批量签收</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox tabBox_zdy">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth" expand
@chooseData="handleChooseData" :rowClassName="getRowClassName">
<template #expand="{ props }">
<Items :row="props" />
</template>
<template #yjTp="{ row }">
<template v-if="!row.yjTp || row.yjTp.includes('baidu')">
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="30" height="30" v-else />
</template>
<el-image v-else style="width: 30px; height:30px" :src="row.yjTp" :preview-src-list="[row.yjTp]"
show-progress>
<template #error>
<div class="image-slot error">
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="30" height="30" v-else />
</div>
</template>
</el-image>
</template>
<template #nl="{ row }">
{{ IdCard(row.yjRysfzh, 3) }}
</template>
<template #xb="{ row }">
{{ IdCard(row.yjRysfzh, 2) }}
</template>
<template #xsd="{ row }">
{{ row.xsd }}%
</template>
<template #yjLylx="{ row }">
<DictTag v-model:value="row.yjLylx" :options="D_BZ_YJLY" />
</template>
<template #czzt="{ row }">
<DictTag v-model:value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
</template>
<template #yjJb="{ row }">
<DictTag v-model:value="row.yjJb" :options="D_BZ_YJJB" />
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<!-- <el-link type="primary" @click="openAddFrom(row)">详情</el-link> -->
<el-link type="primary" @click="pushWarning(row)">指派</el-link>
<el-link type="primary" @click="openBox(row)">详情</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight"
:pageConfiger="{ ...pageData.pageConfiger, total: pageData.total }">
</Pages>
</div>
</div>
<HolographicArchive v-model="assessShow" :dataList="dataList" />
<Information v-model="showDialog" title="发送指令" @submit='submitSendZl' @close='closeFszl'>
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj"
:tacitly="tacitly" />
</Information>
<!-- 详情 -->
<AddFromz ref="addFromRefs" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLYXT }" />
<!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<!-- 指派 -->
<ZpForm v-model="warningShow" :dataList="dataList" />
<!-- 反馈 -->
<FkDialog @change="getList" />
<Particulars v-model="paginationOpen" :dataList="dataPres" :dict="{D_BZ_XB,D_BZ_YJJB,D_GS_QLZDRLX,D_GS_ZDR_RYJB,D_GS_ZDR_GJLB}" />
</template>
<script setup>
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { getItem, setItem } from '@/utils/storage'
import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js"
import { tbYjxxGetPageList } from '@/api/yj.js'
import { IdCard } from '@/utils/validate.js'
import { tbGsxtZdrySelectList } from "@/api/zdr.js"
import { holographicProfileJump } from "@/utils/tools.js"
import Items from './item/items.vue'
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import Information from "@/views/home/model/information.vue";
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import ZpForm from "@/views/backOfficeSystem/fourColorManage/warningControl/sevenWarning/zpForm.vue";
import Czjy from './components/czjy.vue';
import AddFromz from './components/addFrom.vue';
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Search from "@/components/aboutTable/Search.vue";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import Particulars from "./components/particulars.vue";
const ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
const { proxy } = getCurrentInstance();
const { D_GSXT_YJXX_CZZT, D_GS_QLZDRLX, D_GS_BKZT, D_GS_CSZT, D_BZ_BKLYS, D_BZ_YJJB, D_BZ_YJLYXT, D_BZ_YJLY, D_BZ_XB, D_BZ_SF,D_GS_ZDR_RYJB, D_GS_ZDR_GJLB} = proxy.$dict("D_GSXT_YJXX_CZZT", 'D_GS_QLZDRLX ', "D_BZ_YJJB", "D_BZ_YJLYXT", "D_BZ_YJLY", "D_BZ_XB", "D_BZ_BKLYS", "D_GS_BKZT", "D_GS_CSZT", "D_BZ_SF","D_GS_ZDR_RYJB","D_GS_ZDR_GJLB")
const searchBox = ref(); //搜索框
const roleCode = ref(false)
const czjyRef = ref()
const itemData = ref()
const semdFqzlRef = ref()
const warningShow = ref(false)
const dataList = ref([])
const showDialog = ref(false)// 发送指令
const assessShow = ref(false)// 全息档案
const searchConfiger = ref(
[
{ label: "布控开始时间", prop: 'bkkssj', showType: "date", placeholder: "请选择布控开始时间" },
{ label: "布控结束时间", prop: 'bkjssj', showType: "date", placeholder: "请选择布控结束时间" },
{ label: "预警时间", prop: 'startTime', showType: "datetimerange", placeholder: "请选择预警时间" },
// { label: "预警名称", prop: 'yjBt', showType: "input", placeholder: "请输入预警名称" },
{ label: "预警级别", prop: 'yjJb', showType: "select", options: D_BZ_YJJB, placeholder: "请选择预警级别", multiple: true },
{ label: "布控来源", prop: 'bkly', showType: "select", options: D_BZ_BKLYS, placeholder: "请选择布控来源" },
{ label: "布控范围", prop: 'bkfw', showType: "input", placeholder: "请输入布控范围" },
{ label: "布控单位", prop: 'gkbmdm', showType: "department", placeholder: "请选择布控单位" },
{ label: "所属单位", prop: 'ssbmdm', showType: "department", placeholder: "请选择所属单位" },
{ label: "相似度", prop: 'xsd', showType: "input", placeholder: "请输入相似度" },
{ prop: 'sfglyj', showType: "checkbox", showSelectAll: false, options: [{ label: '关联预警', value: '1' }] },
{ prop: 'sfgz', showType: "checkbox", showSelectAll: false, options: [{ label: '重点关注', value: '1' }] },
{ prop: 'sfzp', showType: "checkbox", showSelectAll: false, options: [{ label: '二次指派', value: '1' }] },
{ label: "签收状态", prop: 'czzt', showType: "select", options: D_GSXT_YJXX_CZZT },
{ label: "超时状态", prop: 'cszt', placeholder: "请选择超时状态", showType: "select", options: D_GS_CSZT },
{ label: "布控状态", prop: 'zkzt', showType: "select", options: D_GS_BKZT, placeholder: "请选择布控状态" },
{ label: "姓名", prop: 'yjRyxm', showType: "input", placeholder: "请输入姓名" },
{ label: "性别", prop: 'xbdm', showType: "select", options: D_BZ_XB, placeholder: "请选择性别" },
{ label: "开始年龄", prop: 'ksnl', placeholder: "请输入年龄", showType: "number" },
{ label: "结束年龄", prop: 'jsnl', placeholder: "请输入年龄", showType: "number" },
{ label: "跨地区", prop: 'sflksd', showType: "select", options: D_BZ_SF, placeholder: "请选择是否跨地区" },
{ label: "身份证号", prop: 'yjRysfzh', showType: "input", placeholder: "请输入身份证号" },
{ label: "预警内容", prop: 'yjNr', showType: "input", placeholder: "请输入预警内容" },
// { label: "布控人员", prop: 'yjRyxms', showType: "Slot" },
// { label: "性别", prop: 'xbdm', placeholder: "请选择性别", showType: "select", options: D_BZ_XB },
// { label: "身份证", prop: 'yjRysfzh', placeholder: "请输入身份证号码", showType: "input" },
// { label: "预警时间", prop: 'times', showType: "datetimerange" },
// { label: "状态", prop: 'czzt', placeholder: "请选择状态", showType: "select", options: D_GSXT_YJXX_CZZT },
// // { label: "人员类别", prop: 'bqdl', placeholder: "请选择人员类别", showType: "select", options: D_GS_QLZDRLX },
// { label: "细类", prop: 'yjbqmc', placeholder: "请输入细类", showType: "input" },
// { label: "活动发生地址", prop: 'yjDz', placeholder: "请输入活动发生地址", showType: "input" },
// { label: "接收单位", prop: 'ssbmdm',showType: "department" },
]);
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkBox",
loading: false,
haveControls: true
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 150, //操作栏宽度
tableColumn: [
{ label: "预警图片", prop: "yjTp", showSolt: true, width: 50 },
{ label: "处置状态", prop: "czzt", showOverflowTooltip: true, width: 50 },
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true },
{ label: "姓名", prop: "yjRyxm", width: 50 },
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true },
{ label: "性别", prop: "xbdm", showSolt: true, width: 50 },
{ label: "年龄", prop: "nl", showSolt: true, width: 50 },
{ label: "预警级别", prop: "yjJb", showSolt: true, width: 50 },
{ label: "布控单位", prop: "gkbmdm", showSolt: true, width: 50 },
{ label: "布控来源", prop: "bkly", showSolt: true, width: 50 },
{ label: "布控范围", prop: "bkfw", showSolt: true, width: 50 },
{ label: "布控开始时间", showOverflowTooltip: true, prop: "bkkssj", showSolt: true, width: 50 },
{ label: "布控结束时间", showOverflowTooltip: true, prop: "bkjssj", showSolt: true, width: 50 },
{ label: "处置要求", prop: "bkczyq", showSolt: true, showOverflowTooltip: true, width: 50 },
{ label: "相似度", prop: "xsd", showSolt: true, width: 50 },
{ label: "预警内容", prop: "yjNr", showOverflowTooltip: true, showSolt: true },
{ label: "数据来源", prop: "yjLylx", showOverflowTooltip: true, showSolt: true },
{ label: "超时状态", prop: "cszt", showOverflowTooltip: true, showSolt: true, width: 50, },
{ label: "在控状态", prop: "zkzt", showOverflowTooltip: true, showSolt: true, width: 50 },
{ label: "所属部门", prop: "ssbm", showOverflowTooltip: true },
]
});
const addFromRefs = ref()
const listQuery = ref({})
const opentions = ref([])
const loading = ref(false)
const selectRows = ref([])
const permission_sfqs = ref(false)
onMounted(() => {
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
permission_sfqs.value = str.startsWith('2' || '3') ? false : true;
let rols = getItem('roleList') ? getItem('roleList') : []
let obj = rols.find(item => {
return ['JS_666666', 'JS_777777', 'JS_888888'].includes(item.roleCode)
})
roleCode.value = obj ? true : false;
tabHeightFn();
getList()
});
// 搜索
const onReset = () => {
listQuery.value.yjRyxm = ''
}
const onSearch = (val) => {
listQuery.value = { ...listQuery.value, ...val, yjJb: val.yjJb?.join(',') || '' };
listQuery.value.startTime = val.startTime ? val.startTime[0] : ''
listQuery.value.endTime = val.startTime ? val.startTime[1] : ''
listQuery.value.sfglyj = val.sfglyj?.join(',') || ''
listQuery.value.sfgz = val.sfgz?.join(',') || ''
listQuery.value.sfzp = val.sfzp?.join(',') || ''
getList()
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList()
}
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList()
}
const getList = () => {
pageData.tableConfiger.loading = true;
const promes = {
...listQuery.value,
yjLx: '1', // 人员预警
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize
}
delete promes.times;
tbYjxxGetPageList(promes).then((res) => {
pageData.tableData = res.records.map(item => {
return {
...item,
yjTp: item.yjlx == '01' ? item.yjTp.replace(ORDIMG, IMGYM) : item.yjTp
}
}) || [];
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
})
}
const remoteMethod = (query) => {
if (!query) return opentions.value = [];
loading.value = true
tbGsxtZdrySelectList({ ryXm: query }).then(res => {
opentions.value = res || [];
loading.value = false;
}).catch(() => {
loading.value = false
})
}
const getRowClassName = (row) => {
if (!row.row.yjJb) return '';
const level = String(row.row.yjJb);
if (level === '01' || level.includes('红') || level.includes('高')) return 'warning-level-01';
if (level === '02' || level.includes('橙') || level.includes('中')) return 'warning-level-02';
if (level === '03' || level.includes('黄') || level.includes('低')) return 'warning-level-03';
if (level === '04' || level.includes('蓝')) return 'warning-level-04';
return '';
};
// 处理签收
const handleQsFk = (val, type) => {
switch (type) {
case '签收':
proxy.$confirm("是否确定要签收?", "警告", { type: "warning" }).then(() => {
qcckPost({ id: val.id }, "/mosty-gsxt/tbYjxx/yjqs").then(() => {
val.czzt = '02'
getList()
proxy.$message({ type: "success", message: "签收成功" });
});
})
break;
case '反馈':
case '查看反馈':
emitter.emit("openFkDialog", { id: val.id, type });
break;
}
}
const handleChooseData = (val) => {
selectRows.value = val
}
// 导出
const exportExl = () => {
const titleObj = {
czzt_cname: "处置状态",
yjSj: "预警时间",
yjRyxm: "姓名",
nl_cname: "年龄", // IdCard(row.yjRysfzh, 3)
yjLylx: "数据来源",
xb_cname: "性别",
yjJb_cname: "预警级别",
xsd_cname: "相似度",
yjDz: "预警地点",
yjCs: "预警次数",
yjRysjh: "布控手机号",
yjClcph: "布控车牌号",
yjRysfzh: "身份证",
}
/** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
const data = needArr.map(item => {
return {
...item,
nl_cname: IdCard(item.yjRysfzh, 3),
xb_cname: IdCard(item.yjRysfzh, 2),
xsd_cname: (item.xsd > 0 ? item.xsd : 0) + '%',
czzt_cname: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
yjJb_cname: getMultiDictVal(item.yjJb, D_BZ_YJJB),
}
})
exportExlByObj(titleObj, data, '人像预警.xlsx')
}
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ ids }, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
// 全息档案跳转
const pushAssess = (val) => {
return holographicProfileJump(val.yjLx, val)
}
const showDetail = (item) => {
showDialog.value = true;
itemData.value = item
}
const handleClose = () => {
showDialog.value = false;
}
const submitSendZl = () => {
semdFqzlRef.value.getsendFqzl()
}
const closeFszl = () => {
semdFqzlRef.value.close()
}
// 处置建议
const handleCzjy = (row) => {
czjyRef.value.init(row)
}
// 详情
const openAddFrom = (val) => {
addFromRefs.value.init('add', val)
}
// 指派
const pushWarning = (val) => {
warningShow.value = true
dataList.value = val;
}
// 详情
const paginationOpen = ref(false)
const dataPres = ref({})
const openBox = (val) => {
dataPres.value = val
paginationOpen.value = true
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
window.onresize = function () {
tabHeightFn();
};
};
</script>
<style lang="scss" scoped>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
::v-deep .el-table .cell {
padding: 0;
}
::v-deep .el-table .el-table__cell {
padding: 4px 0;
}
/* 预警级别行样式 */
.warning-level-01 {
background-color: rgba(255, 2, 2, 0.1) !important;
}
.warning-level-01:hover {
background-color: rgba(255, 2, 2, 0.15) !important;
}
.warning-level-02 {
background-color: rgba(255, 140, 0, 0.1) !important;
}
.warning-level-02:hover {
background-color: rgba(255, 140, 0, 0.15) !important;
}
.warning-level-03 {
background-color: rgba(255, 210, 8, 0.1) !important;
}
.warning-level-03:hover {
background-color: rgba(255, 210, 8, 0.15) !important;
}
.warning-level-04 {
background-color: rgba(0, 0, 255, 0.1) !important;
}
.warning-level-04:hover {
background-color: rgba(0, 0, 255, 0.15) !important;
}
/* 确保行样式应用到所有单元格 */
.warning-level-01 td,
.warning-level-02 td,
.warning-level-03 td,
.warning-level-04 td {
background-color: transparent !important;
}
.tabBox_zdy {
.el-table--fit {
overflow: unset !important;
}
}
</style>

View File

@ -2,31 +2,34 @@
<div>
<!-- 搜索 -->
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" @reset="onReset" :key="pageData.keyCount">
<!-- <template #yjRyxms>
<el-select clearable v-model="listQuery.yjRyxm" filterable remote allow-create
default-first-optionreserve-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>
</template> -->
</Search>
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search='onSearch'>
<template #but>
<el-button type="primary" size="small" @click="exportExl">导出</el-button>
<el-button type="primary" size="small" @click="handleQs" v-if="permission_sfqs">批量签收</el-button>
<!-- <el-button type="primary" size="small" @click="exportExl">批量导出</el-button>
<el-button type="primary" size="small" @click="handleQs">批量签收</el-button>
<el-button type="primary" size="small" @click="handleQs">批量分析</el-button>
<el-button type="primary" size="small" @click="countPeople">计算人数</el-button> -->
</template>
</QueryFormPanel>
<!-- <Search :searchArr="searchConfiger" @submit="onSearch" @reset="onReset" :key="pageData.keyCount">
</Search> -->
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<!-- <PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="exportExl">导出</el-button>xxxx
<el-button type="primary" size="small" @click="handleQs" v-if="permission_sfqs">批量签收</el-button>
</template>
</PageTitle>
</PageTitle> -->
<!-- 表格 -->
<div class="tabBox tabBox_zdy">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth" expand
@chooseData="handleChooseData" :rowClassName="getRowClassName">
<template #expand="{ props }">
<Items :row="props" />
</template>
<div class=" tabBox_zdy">
<WarnDataTable :loading="pageData.tableConfiger.loading" :tableHeight="pageData.tableHeight"
:data="pageData.tableData" :columns="pageData.tableColumn" table-class="warn-table"
@selectionChange="handleChooseData">
<template #yjTp="{ row }">
<template v-if="!row.yjTp || row.yjTp.includes('baidu')">
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
@ -42,38 +45,58 @@
</template>
</el-image>
</template>
<template #nl="{ row }">
{{ IdCard(row.yjRysfzh, 3) }}
<template #czzt="{ row }">
<DictTag :value="row.czzt" :color="row.czzt === '01' ? '#ff2424' : '#1d72e8'" :tag="false"
:options="D_GSXT_YJXX_CZZT" />
</template>
<template #xb="{ row }">
{{ IdCard(row.yjRysfzh, 2) }}
<template #xbdm="{ row }">
<DictTag :value="row.xbdm" :tag="false" :options="D_BZ_XB" />
</template>
<template #yjJb="{ row }">
<div :style="{ 'background-color': bqYs(row.yjJb) }">
<DictTag :value="row.yjJb" color="#fff" :tag="false" :options="D_BZ_YJJB" />
</div>
</template>
<template #bkly="{ row }">
<DictTag :value="row.bkly" :tag="false" :options="D_BZ_YJLY" />
</template>
<template #bkczyq="{ row }">
<DictTag :value="row.bkczyq" :tag="false" :options="D_GS_BK_CZYQ" />
</template>
<template #xsd="{ row }">
{{ row.xsd }}%
</template>
<template #yjLylx="{ row }">
<DictTag v-model:value="row.yjLylx" :options="D_BZ_YJLY" />
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" />
</template>
<template #czzt="{ row }">
<DictTag v-model:value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
<template #cszt="{ row }">
<DictTag :value="row.cszt" :tag="false" :options="D_GS_CSZT" />
</template>
<template #yjJb="{ row }">
<DictTag v-model:value="row.yjJb" :options="D_BZ_YJJB" />
<!-- <template #bqdl="{ row }">
<DictTag :value="row.bqdl" :tag="false" :options="D_GS_QLZDRLX" />
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<!-- <el-link type="primary" @click="openAddFrom(row)">详情</el-link> -->
<el-link type="primary" @click="pushWarning(row)">指派</el-link>
<el-link type="primary" @click="openBox(row)">详情</el-link>
-->
<template #operation="{ row }">
<div style="display: flex;justify-content: space-between;">
<span class="warning" @click="pushAssess(row)">全息档案</span>
<span class="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</span>
<!-- <span type="primary" @click="showDetail(row)">转合成</span> -->
<span class="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</span>
<span class="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</span>
<!-- <span type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</span> -->
<!-- <span type="primary" @click="openAddFrom(row)">详情</span> -->
<span class="primary" @click="pushWarning(row)">指派</span>
<span class="primary" @click="openBox(row)">详情</span>
<!-- <span class="primary" @click="handleQsSingle(row)">签收</span>
<span class="primary" @click="particularsOpen(row)">详情</span>
<span class="warning" @click="pushWarning(row)">指派</span>
<span class="warning" v-if="row.sfbc != '1'" @click="failWarning(row)">报错</span>
<span class="primary" @click="payAttention(row)">关注</span> -->
</div>
</template>
</MyTable>
</WarnDataTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight"
:pageConfiger="{ ...pageData.pageConfiger, total: pageData.total }">
</Pages>
@ -96,7 +119,8 @@
<ZpForm v-model="warningShow" :dataList="dataList" />
<!-- 反馈 -->
<FkDialog @change="getList" />
<Particulars v-model="paginationOpen" :dataList="dataPres" :dict="{D_BZ_XB,D_BZ_YJJB,D_GS_QLZDRLX,D_GS_ZDR_RYJB,D_GS_ZDR_GJLB}" />
<Particulars v-model="paginationOpen" :dataList="dataPres"
:dict="{ D_BZ_XB, D_BZ_YJJB, D_GS_QLZDRLX, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB }" />
</template>
<script setup>
@ -109,24 +133,27 @@ import { tbYjxxGetPageList } from '@/api/yj.js'
import { IdCard } from '@/utils/validate.js'
import { tbGsxtZdrySelectList } from "@/api/zdr.js"
import { holographicProfileJump } from "@/utils/tools.js"
import Items from './item/items.vue'
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import Information from "@/views/home/model/information.vue";
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import ZpForm from "@/views/backOfficeSystem/fourColorManage/warningControl/sevenWarning/zpForm.vue";
import Czjy from './components/czjy.vue';
import AddFromz from './components/addFrom.vue';
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Search from "@/components/aboutTable/Search.vue";
import WarnDataTable from '@/views/backOfficeSystem/ces/components/WarnDataTable.vue'
import QueryFormPanel from "@/views/backOfficeSystem/ces/components/QueryFormPanel.vue";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import Particulars from "./components/particulars.vue";
import { bqYs } from '@/utils/tools.js'
const ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
const { proxy } = getCurrentInstance();
const { D_GSXT_YJXX_CZZT, D_GS_QLZDRLX, D_GS_BKZT, D_GS_CSZT, D_BZ_BKLYS, D_BZ_YJJB, D_BZ_YJLYXT, D_BZ_YJLY, D_BZ_XB, D_BZ_SF,D_GS_ZDR_RYJB, D_GS_ZDR_GJLB} = proxy.$dict("D_GSXT_YJXX_CZZT", 'D_GS_QLZDRLX ', "D_BZ_YJJB", "D_BZ_YJLYXT", "D_BZ_YJLY", "D_BZ_XB", "D_BZ_BKLYS", "D_GS_BKZT", "D_GS_CSZT", "D_BZ_SF","D_GS_ZDR_RYJB","D_GS_ZDR_GJLB")
const { D_GSXT_YJXX_CZZT, D_GS_QLZDRLX, D_GS_BKZT, D_GS_CSZT, D_BZ_BKLYS, D_BZ_YJJB, D_BZ_YJLYXT,
D_BZ_YJLY, D_BZ_XB, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB, D_BZ_SF, D_GS_BK_CZYQ } = proxy.$dict("D_GSXT_YJXX_CZZT", 'D_GS_QLZDRLX ',
"D_BZ_YJJB", "D_BZ_YJLYXT", "D_BZ_YJLY", "D_BZ_XB", "D_BZ_BKLYS", "D_GS_BKZT",
"D_GS_CSZT", "D_BZ_SF", "D_GS_ZDR_RYJB", "D_GS_ZDR_GJLB", "D_GS_BK_CZYQ")
const searchBox = ref(); //搜索框
const roleCode = ref(false)
const czjyRef = ref()
@ -138,38 +165,29 @@ const showDialog = ref(false)// 发送指令
const assessShow = ref(false)// 全息档案
const searchConfiger = ref(
[
{ label: "布控开始时间", prop: 'bkkssj', showType: "date", placeholder: "请选择布控开始时间" },
{ label: "布控结束时间", prop: 'bkjssj', showType: "date", placeholder: "请选择布控结束时间" },
{ label: "预警时间", prop: 'startTime', showType: "datetimerange", placeholder: "请选择预警时间" },
// { label: "预警名称", prop: 'yjBt', showType: "input", placeholder: "请输入预警名称" },
{ label: "预警级别", prop: 'yjJb', showType: "select", options: D_BZ_YJJB, placeholder: "请选择预警级别", multiple: true },
{ label: "布控来源", prop: 'bkly', showType: "select", options: D_BZ_BKLYS, placeholder: "请选择布控来源" },
{ label: "布控范围", prop: 'bkfw', showType: "input", placeholder: "请输入布控范围" },
{ label: "布控单位", prop: 'gkbmdm', showType: "department", placeholder: "请选择布控单位" },
{ label: "所属单位", prop: 'ssbmdm', showType: "department", placeholder: "请选择所属单位" },
{ label: "相似度", prop: 'xsd', showType: "input", placeholder: "请输入相似度" },
{ prop: 'sfglyj', showType: "checkbox", showSelectAll: false, options: [{ label: '关联预警', value: '1' }] },
{ prop: 'sfgz', showType: "checkbox", showSelectAll: false, options: [{ label: '重点关注', value: '1' }] },
{ prop: 'sfzp', showType: "checkbox", showSelectAll: false, options: [{ label: '二次指派', value: '1' }] },
{ label: "签收状态", prop: 'czzt', showType: "select", options: D_GSXT_YJXX_CZZT },
{ label: "超时状态", prop: 'cszt', placeholder: "请选择超时状态", showType: "select", options: D_GS_CSZT },
{ label: "布控状态", prop: 'zkzt', showType: "select", options: D_GS_BKZT, placeholder: "请选择布控状态" },
{ label: "姓名", prop: 'yjRyxm', showType: "input", placeholder: "请输入姓名" },
{ label: "性别", prop: 'xbdm', showType: "select", options: D_BZ_XB, placeholder: "请选择性别" },
{ label: "开始年龄", prop: 'ksnl', placeholder: "请输入年龄", showType: "number" },
{ label: "结束年龄", prop: 'jsnl', placeholder: "请输入年龄", showType: "number" },
{ label: "跨地区", prop: 'sflksd', showType: "select", options: D_BZ_SF, placeholder: "请选择是否跨地区" },
{ label: "身份证号", prop: 'yjRysfzh', showType: "input", placeholder: "请输入身份证号" },
{ label: "预警内容", prop: 'yjNr', showType: "input", placeholder: "请输入预警内容" },
// { label: "布控人员", prop: 'yjRyxms', showType: "Slot" },
// { label: "性别", prop: 'xbdm', placeholder: "请选择性别", showType: "select", options: D_BZ_XB },
// { label: "身份证", prop: 'yjRysfzh', placeholder: "请输入身份证号码", showType: "input" },
// { label: "预警时间", prop: 'times', showType: "datetimerange" },
// { label: "状态", prop: 'czzt', placeholder: "请选择状态", showType: "select", options: D_GSXT_YJXX_CZZT },
// // { label: "人员类别", prop: 'bqdl', placeholder: "请选择人员类别", showType: "select", options: D_GS_QLZDRLX },
// { label: "细类", prop: 'yjbqmc', placeholder: "请输入细类", showType: "input" },
// { label: "活动发生地址", prop: 'yjDz', placeholder: "请输入活动发生地址", showType: "input" },
// { label: "接收单位", prop: 'ssbmdm',showType: "department" },
{ label: "布控开始时间", key: 'bkkssj', type: "date", placeholder: "请选择布控开始时间" },
{ label: "布控结束时间", key: 'bkjssj', type: "date", placeholder: "请选择布控结束时间" },
{ label: "预警时间", key: 'startTime', type: "datetimerange", placeholder: "请选择预警时间" },
// { label: "预警名称", prop: 'yjBt', type: "input", placeholder: "请输入预警名称" },
{ label: "预警级别", key: 'yjJb', type: "select", options: D_BZ_YJJB, placeholder: "请选择预警级别", multiple: true },
{ label: "布控来源", key: 'bkly', type: "select", options: D_BZ_BKLYS, placeholder: "请选择布控来源" },
{ label: "布控范围", key: 'bkfw', type: "input", placeholder: "请输入布控范围" },
{ label: "布控单位", key: 'gkbmdm', type: "department", placeholder: "请选择布控单位" },
{ label: "所属单位", key: 'ssbmdm', type: "department", placeholder: "请选择所属单位" },
{ label: "相似度", key: 'xsd', type: "input", placeholder: "请输入相似度" },
{ key: 'sfgz', label: '重点关注', type: 'select', options: D_BZ_SF, placeholder: '请选择重点关注' },
{ key: 'sfzp', label: '二次指派', type: 'select', options: D_BZ_SF, placeholder: '请选择二次指派' },
{ key: 'sfgz', label: '重点关注', type: 'select', options: D_BZ_SF, placeholder: '请选择重点关注' },
{ label: "签收状态", key: 'czzt', type: "select", options: D_GSXT_YJXX_CZZT },
{ label: "超时状态", key: 'cszt', placeholder: "请选择超时状态", type: "select", options: D_GS_CSZT },
{ label: "布控状态", key: 'zkzt', type: "select", options: D_GS_BKZT, placeholder: "请选择布控状态" },
{ label: "姓名", key: 'yjRyxm', type: "input", placeholder: "请输入姓名" },
{ label: "性别", key: 'xbdm', type: "select", options: D_BZ_XB, placeholder: "请选择性别" },
{ label: "开始年龄", key: 'ksnl', placeholder: "请输入年龄", type: "number" },
{ label: "结束年龄", key: 'jsnl', placeholder: "请输入年龄", type: "number" },
{ label: "跨地区", key: 'sflksd', type: "select", options: D_BZ_SF, placeholder: "请选择是否跨地区" },
{ label: "身份证号", key: 'yjRysfzh', type: "input", placeholder: "请输入身份证号" },
{ label: "预警内容", key: 'yjNr', type: "input", placeholder: "请输入预警内容" },
]);
const pageData = reactive({
tableData: [], //表格数据
@ -188,26 +206,28 @@ const pageData = reactive({
}, //分页
controlsWidth: 150, //操作栏宽度
tableColumn: [
{ label: "预警图片", prop: "yjTp", showSolt: true, width: 50 },
{ label: "处置状态", prop: "czzt", showOverflowTooltip: true, width: 50 },
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true },
{ label: "姓名", prop: "yjRyxm", width: 50 },
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true },
{ label: "性别", prop: "xbdm", showSolt: true, width: 50 },
{ label: "年龄", prop: "nl", showSolt: true, width: 50 },
{ label: "预警级别", prop: "yjJb", showSolt: true, width: 50 },
{ label: "布控单位", prop: "gkbmdm", showSolt: true, width: 50 },
{ label: "布控来源", prop: "bkly", showSolt: true, width: 50 },
{ label: "布控范围", prop: "bkfw", showSolt: true, width: 50 },
{ label: "布控开始时间", showOverflowTooltip: true, prop: "bkkssj", showSolt: true, width: 50 },
{ label: "布控结束时间", showOverflowTooltip: true, prop: "bkjssj", showSolt: true, width: 50 },
{ label: "处置要求", prop: "bkczyq", showSolt: true, showOverflowTooltip: true, width: 50 },
{ label: "相似度", prop: "xsd", showSolt: true, width: 50 },
{ label: "预警内容", prop: "yjNr", showOverflowTooltip: true, showSolt: true },
{ label: "数据来源", prop: "yjLylx", showOverflowTooltip: true, showSolt: true },
{ label: "超时状态", prop: "cszt", showOverflowTooltip: true, showSolt: true, width: 50, },
{ label: "在控状态", prop: "zkzt", showOverflowTooltip: true, showSolt: true, width: 50 },
{ label: "所属部门", prop: "ssbm", showOverflowTooltip: true },
{ type: 'index', label: '序号', width: 55, align: 'center' },
{ label: '照片', width: 50, align: 'center', slotName: 'yjTp' },
{ label: "处置状态", align: 'center', width: 70, slotName: 'czzt' },
{ prop: 'yjSj', label: '预警时间', width: 80, align: 'center' },
{ prop: 'yjRyxm', label: '姓名', width: 50, align: 'center' },
{ prop: 'yjRysfzh', label: '身份证号', align: 'center' },
{ label: '性别', width: 56, align: 'center', slotName: 'xbdm' },
{ prop: 'nl', label: '年龄', width: 56, align: 'center' },
{ label: '预警级别', width: 70, align: 'center', slotName: 'yjJb' },
{ label: "布控单位", prop: "gkbmmc", width: 70, align: 'center' },
{ label: "布控来源", align: 'center', slotName: 'bkly', width: 70 },
{ prop: 'bkfw', label: "布控范围", align: 'center', width: 70 },
{ prop: 'bkkssj', label: "布控开始时间", width: 80, align: 'center' },
{ prop: 'bkjssj', label: "布控结束时间", width: 80, align: 'center' },
{ label: "处置要求", width: 70, slotName: 'bkczyq', align: 'center' },
{ label: "相似度", width: 50, align: 'center', slotName: 'xsd' },
{ label: "预警内容", prop: "yjNr", width: 70, align: 'center' },
{ label: "所属部门", prop: "ssbm", width: 70, align: 'center'},
{ label: "数据来源", width: 70, align: 'center', slotName: 'yjLylx' },
{ label: '操作', width: 180, slotName: 'operation' },
{ label: '超时状态', width: 80, align: 'center', slotName: 'cszt' },
{ label: "在控状态", width: 70, align: 'center', slotName: "zkzt" },
]
});
const addFromRefs = ref()
@ -237,9 +257,9 @@ const onSearch = (val) => {
listQuery.value = { ...listQuery.value, ...val, yjJb: val.yjJb?.join(',') || '' };
listQuery.value.startTime = val.startTime ? val.startTime[0] : ''
listQuery.value.endTime = val.startTime ? val.startTime[1] : ''
listQuery.value.sfglyj = val.sfglyj?.join(',') || ''
listQuery.value.sfgz = val.sfgz?.join(',') || ''
listQuery.value.sfzp = val.sfzp?.join(',') || ''
// listQuery.value.sfglyj = val.sfglyj?.join(',') || ''
// listQuery.value.sfgz = val.sfgz?.join(',') || ''
// listQuery.value.sfzp = val.sfzp?.join(',') || ''
getList()
}
@ -416,7 +436,7 @@ const openBox = (val) => {
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () {
tabHeightFn();
};
@ -477,8 +497,6 @@ const tabHeightFn = () => {
}
.tabBox_zdy {
.el-table--fit {
overflow: unset !important;
}
background-color: #fff;
}
</style>

View File

@ -0,0 +1,491 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" @reset="onReset" :key="pageData.keyCount">
<template #yjRyxms>
<el-select clearable v-model="listQuery.yjRyxm" filterable remote allow-create
default-first-optionreserve-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>
</template>
</Search>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="exportExl">导出</el-button>
<el-button type="primary" size="small" @click="handleQs" v-if="permission_sfqs">批量签收</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox tabBox_zdy">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth" expand
@chooseData="handleChooseData" :rowClassName="getRowClassName">
<template #expand="{ props }">
<Items :row="props" />
</template>
<template #yjTp="{ row }">
<template v-if="!row.yjTp || row.yjTp.includes('baidu')">
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="30" height="30" v-else />
</template>
<el-image v-else style="width: 30px; height:30px" :src="row.yjTp" :preview-src-list="[row.yjTp]"
show-progress>
<template #error>
<div class="image-slot error">
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="30" height="30" v-else />
</div>
</template>
</el-image>
</template>
<template #nl="{ row }">
{{ IdCard(row.yjRysfzh, 3) }}
</template>
<template #xb="{ row }">
{{ IdCard(row.yjRysfzh, 2) }}
</template>
<template #xsd="{ row }">
{{ row.xsd }}%
</template>
<template #yjLylx="{ row }">
<DictTag v-model:value="row.yjLylx" :options="D_BZ_YJLY" />
</template>
<template #czzt="{ row }">
<DictTag v-model:value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
</template>
<template #yjJb="{ row }">
<DictTag v-model:value="row.yjJb" :options="D_BZ_YJJB" />
</template>
<template #bkly="{ row }">
<DictTag v-model:value="row.bkly" :options="D_BZ_BKLYS" />
</template>
<template #bkczyq="{ row }">
<DictTag v-model:value="row.bkczyq" :options="D_GS_BK_CZYQ" />
</template>
<template #xtSjly="{ row }">
<span>{{ row.xtSjly==1?'PC':row.xtSjly==2?'移动端':'一张网' }}</span>
</template>
<template #cszt="{ row }">
<DictTag v-model:value="row.cszt" :options="D_GS_CSZT" />
</template>
<template #zkzt="{ row }">
<DictTag v-model:value="row.zkzt" :options="D_GS_BKZT" />
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link> -->
<!-- <el-link type="danger" @click="delDictItem(row.id)">转会商</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<el-link type="primary" @click="openBox(row)">详情</el-link>
<el-link type="primary" @click="pushWarning(row)">指派</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight"
:pageConfiger="{ ...pageData.pageConfiger, total: pageData.total }">
</Pages>
</div>
</div>
<HolographicArchive v-model="assessShow" :dataList="dataList" />
<Information v-model="showDialog" title="发送指令" @submit='submitSendZl' @close='closeFszl'>
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj"
:tacitly="tacitly" />
</Information>
<!-- 详情 -->
<AddFromz ref="addFromRefs" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLYXT }" />
<!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<!-- 指派 -->
<ZpForm v-model="warningShow" :dataList="dataList" />
<!-- 反馈 -->
<FkDialog @change="getList" />
<Particulars v-model="particularsShow" :dataList="dataPres" :dict="{D_BZ_XB,D_BZ_YJJB,D_GS_QLZDRLX,D_GS_ZDR_RYJB,D_GS_ZDR_GJLB,D_GS_BK_CZYQ}" />
</template>
<script setup>
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { getItem, setItem } from '@/utils/storage'
import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js"
import { tbYjxxGetPageList } from '@/api/yj.js'
import { IdCard } from '@/utils/validate.js'
import { tbGsxtZdrySelectList } from "@/api/zdr.js"
import { holographicProfileJump } from "@/utils/tools.js"
import Items from './item/items.vue'
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import Information from "@/views/home/model/information.vue";
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import ZpForm from "@/views/backOfficeSystem/fourColorManage/warningControl/sevenWarning/zpForm.vue";
import Czjy from './components/czjy.vue';
import AddFromz from './components/addFrom.vue';
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Search from "@/components/aboutTable/Search.vue";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import Particulars from './components/particulars.vue'
const ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
const { proxy } = getCurrentInstance();
const { D_GSXT_YJXX_CZZT, D_GS_QLZDRLX,
D_BZ_XB,
D_BZ_BKLYS, D_BZ_YJJB, D_BZ_YJLYXT, D_GS_BKZT, D_BZ_SF,
D_BZ_YJLY, D_GS_CSZT, D_GS_BK_CZYQ } = proxy.$dict("D_GSXT_YJXX_CZZT", 'D_GS_QLZDRLX ', "D_GS_BKZT", "D_BZ_SF",
"D_BZ_YJJB", "D_BZ_YJLYXT", "D_BZ_YJLY", "D_BZ_XB", "D_BZ_BKLYS", "D_GS_CSZT", "D_GS_BK_CZYQ")
const searchBox = ref(); //搜索框
const roleCode = ref(false)
const czjyRef = ref()
const itemData = ref()
const semdFqzlRef = ref()
const warningShow = ref(false)
const dataList = ref([])
const showDialog = ref(false)// 发送指令
const assessShow = ref(false)// 全息档案
const searchConfiger = ref(
[
{ label: "布控开始时间", prop: 'bkkssj', showType: "date", placeholder: "请选择布控开始时间" },
{ label: "布控结束时间", prop: 'bkjssj', showType: "date", placeholder: "请选择布控结束时间" },
{ label: "预警时间", prop: 'startTime', showType: "datetimerange", placeholder: "请选择预警时间" },
{ label: "预警级别", prop: 'yjJb', showType: "select", options: D_BZ_YJJB, placeholder: "请选择预警级别", multiple: true },
{ label: "布控来源", prop: 'bkly', showType: "select", options: D_BZ_BKLYS, placeholder: "请选择布控来源" },
{ label: "布控范围", prop: 'bkfw', showType: "input", placeholder: "请输入布控范围" },
{ label: "布控单位", prop: 'gkbmdm', showType: "department", placeholder: "请选择布控单位" },
{ label: "所属单位", prop: 'ssbmdm', showType: "department", placeholder: "请选择所属单位" },
{ label: "签收状态", prop: 'czzt', showType: "select", options: D_GSXT_YJXX_CZZT },
{ label: "超时状态", prop: 'cszt', placeholder: "请选择超时状态", showType: "select", options: D_GS_CSZT },
{ label: "布控状态", prop: 'zkzt', showType: "select", options: D_GS_BKZT, placeholder: "请选择布控状态" },
{ label: "跨地区", prop: 'sflksd', showType: "select", options: D_BZ_SF, placeholder: "请选择是否跨地区" },
{ label: "车牌号", prop: 'yjClcph', showType: "input", placeholder: "请输入车牌号" },
{ label: "预警内容", prop: 'yjNr', showType: "input", placeholder: "请输入预警内容" },
// { label: "车牌号", prop: 'yjClcph', showType: "input", placeholder: "请输入车牌号", },
// { label: "预警时间", prop: 'times', showType: "datetimerange" },
// { label: "状态", prop: 'czzt', placeholder: "请选择状态", showType: "select", options: D_GSXT_YJXX_CZZT },
// { label: "预警级别", prop: 'yjJb', placeholder: "请选择预警级别", showType: "select", options: D_BZ_YJJB },
// { label: "细类", prop: 'yjbqmc', placeholder: "请输入细类", showType: "input" },
// { label: "活动发生地址", prop: 'yjDz', placeholder: "请输入活动发生地址", showType: "input" },
// { label: "接收单位", prop: 'ssbmdm',showType: "department" },
]);
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false,
haveControls: true
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 180, //操作栏宽度
tableColumn: [
{ label: "预警图片", prop: "yjTp", showSolt: true, width: 100 },
{ label: "状态", prop: "czzt", showSolt: true, width: 80 },
{ label: "车牌号", prop: "yjClcph", showOverflowTooltip: true },
{ label: "预警级别", prop: "yjJb", showSolt: true },
{ label: "布控单位", prop: "gkbmmc", showOverflowTooltip: true },
{ label: "布控来源", prop: "bkly", showOverflowTooltip: true, showSolt: true },
{ label: "布控范围", prop: "bkfw", showOverflowTooltip: true },
{ label: "布控开始时间", prop: "bkkssj", showOverflowTooltip: true },
{ label: "布控结束时间", prop: "bkjssj", showOverflowTooltip: true },
{ label: "处置要求", prop: "bkczyq", showOverflowTooltip: true, showSolt: true },
{ label: "内容", prop: "yjNr", showOverflowTooltip: true },
{ label: "所属部门", prop: "ssbm", showOverflowTooltip: true },
{ label: "数据来源", prop: "xtSjly", showSolt: true },
{ label: "超时状态", prop: "cszt", showSolt: true },
{ label: "在控状态", prop: "zkzt", showSolt: true},
]
});
const addFromRefs = ref()
const listQuery = ref({})
const opentions = ref([])
const loading = ref(false)
const selectRows = ref([])
const permission_sfqs = ref(false)
onMounted(() => {
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
permission_sfqs.value = str.startsWith('2' || '3') ? false : true;
let rols = getItem('roleList') ? getItem('roleList') : []
let obj = rols.find(item => {
return ['JS_666666', 'JS_777777', 'JS_888888'].includes(item.roleCode)
})
roleCode.value = obj ? true : false;
tabHeightFn();
getList()
});
// 搜索
const onReset = () => {
listQuery.value.yjRyxm = ''
}
const onSearch = (val) => {
listQuery.value = { ...listQuery.value, ...val };
listQuery.value = { ...val, yjJb: val.yjJb?.join(',') || '' }
listQuery.value.startTime = val.startTime ? val.startTime[0] : ''
listQuery.value.endTime = val.startTime ? val.startTime[1] : ''
getList()
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList()
}
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList()
}
const getList = () => {
pageData.tableConfiger.loading = true;
const promes = {
...listQuery.value,
yjLx: '2', // 车辆预警
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize
}
delete promes.times;
tbYjxxGetPageList(promes).then((res) => {
pageData.tableData = res.records.map(item => {
return {
...item,
yjTp: item.yjlx == '01' ? item.yjTpreplace(ORDIMG, IMGYM) : item.yjTp
}
}) || [];
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
})
}
const remoteMethod = (query) => {
if (!query) return opentions.value = [];
loading.value = true
tbGsxtZdrySelectList({ ryXm: query }).then(res => {
opentions.value = res || [];
loading.value = false;
}).catch(() => {
loading.value = false
})
}
// 根据预警级别设置行样式
const getRowClassName = (row) => {
if (!row.row.yjJb) return '';
const level = String(row.row.yjJb);
if (level === '01' || level.includes('红') || level.includes('高')) return 'warning-level-01';
if (level === '02' || level.includes('橙') || level.includes('中')) return 'warning-level-02';
if (level === '03' || level.includes('黄') || level.includes('低')) return 'warning-level-03';
if (level === '04' || level.includes('蓝')) return 'warning-level-04';
return '';
};
// 处理签收
const handleQsFk = (val, type) => {
switch (type) {
case '签收':
proxy.$confirm("是否确定要签收?", "警告", { type: "warning" }).then(() => {
qcckPost({ id: val.id }, "/mosty-gsxt/tbYjxx/yjqs").then(() => {
val.czzt = '02'
getList()
proxy.$message({ type: "success", message: "签收成功" });
});
})
break;
case '反馈':
case '查看反馈':
emitter.emit("openFkDialog", { id: val.id, type });
break;
}
}
const handleChooseData = (val) => {
selectRows.value = val
}
// 导出
const exportExl = () => {
const titleObj = {
czzt_cname: "处置状态",
yjSj: "预警时间",
yjRyxm: "姓名",
nl_cname: "年龄", // IdCard(row.yjRysfzh, 3)
yjLylx: "数据来源",
xb_cname: "性别",
yjJb_cname: "预警级别",
xsd_cname: "相似度",
yjDz: "预警地点",
yjCs: "预警次数",
yjRysjh: "布控手机号",
yjClcph: "布控车牌号",
yjRysfzh: "身份证",
}
/** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
const data = needArr.map(item => {
return {
...item,
nl_cname: IdCard(item.yjRysfzh, 3),
xb_cname: IdCard(item.yjRysfzh, 2),
xsd_cname: (item.xsd > 0 ? item.xsd : 0) + '%',
czzt_cname: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
yjJb_cname: getMultiDictVal(item.yjJb, D_BZ_YJJB),
}
})
exportExlByObj(titleObj, data, '人像预警.xlsx')
}
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ ids }, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
// 全息档案跳转
const pushAssess = (val) => {
return holographicProfileJump(val.yjLx, val)
}
const showDetail = (item) => {
showDialog.value = true;
itemData.value = item
}
const handleClose = () => {
showDialog.value = false;
}
const submitSendZl = () => {
semdFqzlRef.value.getsendFqzl()
}
const closeFszl = () => {
semdFqzlRef.value.close()
}
// 处置建议
const handleCzjy = (row) => {
czjyRef.value.init(row)
}
// 详情
const openAddFrom = (val) => {
addFromRefs.value.init('add', val)
}
// 指派
const pushWarning = (val) => {
warningShow.value = true
dataList.value = val;
}
// 详情
const particularsShow = ref(false)
const dataPres = ref()
const openBox = (val) => {
particularsShow.value = true
dataPres.value = val
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
window.onresize = function () {
tabHeightFn();
};
};
</script>
<style lang="scss" scoped>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
::v-deep .el-table .cell {
padding: 0;
}
::v-deep .el-table .el-table__cell {
padding: 4px 0;
}
/* 预警级别行样式 */
.warning-level-01 {
background-color: rgba(255, 2, 2, 0.1) !important;
}
.warning-level-01:hover {
background-color: rgba(255, 2, 2, 0.15) !important;
}
.warning-level-02 {
background-color: rgba(255, 140, 0, 0.1) !important;
}
.warning-level-02:hover {
background-color: rgba(255, 140, 0, 0.15) !important;
}
.warning-level-03 {
background-color: rgba(255, 210, 8, 0.1) !important;
}
.warning-level-03:hover {
background-color: rgba(255, 210, 8, 0.15) !important;
}
.warning-level-04 {
background-color: rgba(0, 0, 255, 0.1) !important;
}
.warning-level-04:hover {
background-color: rgba(0, 0, 255, 0.15) !important;
}
/* 确保行样式应用到所有单元格 */
.warning-level-01 td,
.warning-level-02 td,
.warning-level-03 td,
.warning-level-04 td {
background-color: transparent !important;
}
.tabBox_zdy {
.el-table--fit {
overflow: unset !important;
}
}
</style>

View File

@ -2,31 +2,20 @@
<div>
<!-- 搜索 -->
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" @reset="onReset" :key="pageData.keyCount">
<template #yjRyxms>
<el-select clearable v-model="listQuery.yjRyxm" filterable remote allow-create
default-first-optionreserve-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>
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search='onSearch'>
<template #but>
<el-button type="primary" size="small" @click="exportExl">导出</el-button>
<el-button type="primary" size="small" @click="handleQs" v-if="permission_sfqs">批量签收</el-button>
</template>
</Search>
</QueryFormPanel>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="exportExl">导出</el-button>
<el-button type="primary" size="small" @click="handleQs" v-if="permission_sfqs">批量签收</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox tabBox_zdy">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth" expand
@chooseData="handleChooseData" :rowClassName="getRowClassName">
<template #expand="{ props }">
<Items :row="props" />
</template>
<div class=" tabBox_zdy">
<WarnDataTable :loading="pageData.tableConfiger.loading" :tableHeight="pageData.tableHeight"
:data="pageData.tableData" :columns="pageData.tableColumn" table-class="warn-table"
@selectionChange="handleChooseData">
<template #yjTp="{ row }">
<template v-if="!row.yjTp || row.yjTp.includes('baidu')">
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
@ -42,55 +31,48 @@
</template>
</el-image>
</template>
<template #nl="{ row }">
{{ IdCard(row.yjRysfzh, 3) }}
<template #czzt="{ row }">
<DictTag :value="row.czzt" :color="row.czzt === '01' ? '#ff2424' : '#1d72e8'" :tag="false"
:options="D_GSXT_YJXX_CZZT" />
</template>
<template #xb="{ row }">
{{ IdCard(row.yjRysfzh, 2) }}
<template #xbdm="{ row }">
<DictTag :value="row.xbdm" :tag="false" :options="D_BZ_XB" />
</template>
<template #yjJb="{ row }">
<div :style="{ 'background-color': bqYs(row.yjJb) }">
<DictTag :value="row.yjJb" color="#fff" :tag="false" :options="D_BZ_YJJB" />
</div>
</template>
<template #bkly="{ row }">
<DictTag :value="row.bkly" :tag="false" :options="D_BZ_YJLY" />
</template>
<template #bkczyq="{ row }">
<DictTag :value="row.bkczyq" :tag="false" :options="D_GS_BK_CZYQ" />
</template>
<template #xsd="{ row }">
{{ row.xsd }}%
</template>
<template #yjLylx="{ row }">
<DictTag v-model:value="row.yjLylx" :options="D_BZ_YJLY" />
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" />
</template>
<template #czzt="{ row }">
<DictTag v-model:value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
</template>
<template #yjJb="{ row }">
<DictTag v-model:value="row.yjJb" :options="D_BZ_YJJB" />
</template>
<template #bkly="{ row }">
<DictTag v-model:value="row.bkly" :options="D_BZ_BKLYS" />
</template>
<template #bkczyq="{ row }">
<DictTag v-model:value="row.bkczyq" :options="D_GS_BK_CZYQ" />
</template>
<template #xtSjly="{ row }">
<span>{{ row.xtSjly==1?'PC':row.xtSjly==2?'移动端':'一张网' }}</span>
</template>
<template #cszt="{ row }">
<DictTag v-model:value="row.cszt" :options="D_GS_CSZT" />
<DictTag :value="row.cszt" :tag="false" :options="D_GS_CSZT" />
</template>
<template #zkzt="{ row }">
<DictTag v-model:value="row.zkzt" :options="D_GS_BKZT" />
<template #operation="{ row }">
<div style="display: flex;justify-content: space-between;">
<span class="warning" @click="pushAssess(row)">全息档案</span>
<span class="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</span>
<!-- <span type="primary" @click="showDetail(row)">转合成</span> -->
<!-- <span type="danger" @click="delDictItem(row.id)">转会商</span> -->
<span class="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</span>
<span class="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</span>
<!-- <span type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</span> -->
<span class="primary" @click="openBox(row)">详情</span>
<span class="primary" @click="pushWarning(row)">指派</span>
</div>
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link> -->
<!-- <el-link type="danger" @click="delDictItem(row.id)">转会商</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<el-link type="primary" @click="openBox(row)">详情</el-link>
<el-link type="primary" @click="pushWarning(row)">指派</el-link>
</template>
</MyTable>
</WarnDataTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight"
:pageConfiger="{ ...pageData.pageConfiger, total: pageData.total }">
</Pages>
@ -113,7 +95,8 @@
<ZpForm v-model="warningShow" :dataList="dataList" />
<!-- 反馈 -->
<FkDialog @change="getList" />
<Particulars v-model="particularsShow" :dataList="dataPres" :dict="{D_BZ_XB,D_BZ_YJJB,D_GS_QLZDRLX,D_GS_ZDR_RYJB,D_GS_ZDR_GJLB,D_GS_BK_CZYQ}" />
<Particulars v-model="particularsShow" :dataList="dataPres"
:dict="{ D_BZ_XB, D_BZ_YJJB, D_GS_QLZDRLX, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB, D_GS_BK_CZYQ }" />
</template>
<script setup>
@ -125,20 +108,20 @@ import { getMultiDictVal } from "@/utils/dict.js"
import { tbYjxxGetPageList } from '@/api/yj.js'
import { IdCard } from '@/utils/validate.js'
import { tbGsxtZdrySelectList } from "@/api/zdr.js"
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import { holographicProfileJump } from "@/utils/tools.js"
import Items from './item/items.vue'
import WarnDataTable from '@/views/backOfficeSystem/ces/components/WarnDataTable.vue'
import QueryFormPanel from "@/views/backOfficeSystem/ces/components/QueryFormPanel.vue";
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import Information from "@/views/home/model/information.vue";
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import ZpForm from "@/views/backOfficeSystem/fourColorManage/warningControl/sevenWarning/zpForm.vue";
import Czjy from './components/czjy.vue';
import AddFromz from './components/addFrom.vue';
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Search from "@/components/aboutTable/Search.vue";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import Particulars from './components/particulars.vue'
import { bqYs } from '@/utils/tools.js'
const ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
const { proxy } = getCurrentInstance();
@ -172,46 +155,37 @@ const searchConfiger = ref(
{ label: "跨地区", prop: 'sflksd', showType: "select", options: D_BZ_SF, placeholder: "请选择是否跨地区" },
{ label: "车牌号", prop: 'yjClcph', showType: "input", placeholder: "请输入车牌号" },
{ label: "预警内容", prop: 'yjNr', showType: "input", placeholder: "请输入预警内容" },
// { label: "车牌号", prop: 'yjClcph', showType: "input", placeholder: "请输入车牌号", },
// { label: "预警时间", prop: 'times', showType: "datetimerange" },
// { label: "状态", prop: 'czzt', placeholder: "请选择状态", showType: "select", options: D_GSXT_YJXX_CZZT },
// { label: "预警级别", prop: 'yjJb', placeholder: "请选择预警级别", showType: "select", options: D_BZ_YJJB },
// { label: "细类", prop: 'yjbqmc', placeholder: "请输入细类", showType: "input" },
// { label: "活动发生地址", prop: 'yjDz', placeholder: "请输入活动发生地址", showType: "input" },
// { label: "接收单位", prop: 'ssbmdm',showType: "department" },
]);
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false,
haveControls: true
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 180, //操作栏宽度
tableColumn: [
{ label: "预警图片", prop: "yjTp", showSolt: true, width: 100 },
{ label: "状态", prop: "czzt", showSolt: true, width: 80 },
{ label: "车牌号", prop: "yjClcph", showOverflowTooltip: true },
{ label: "预警级别", prop: "yjJb", showSolt: true },
{ label: "布控单位", prop: "gkbmmc", showOverflowTooltip: true },
{ label: "布控来源", prop: "bkly", showOverflowTooltip: true, showSolt: true },
{ label: "布控范围", prop: "bkfw", showOverflowTooltip: true },
{ label: "布控开始时间", prop: "bkkssj", showOverflowTooltip: true },
{ label: "布控结束时间", prop: "bkjssj", showOverflowTooltip: true },
{ label: "处置要求", prop: "bkczyq", showOverflowTooltip: true, showSolt: true },
{ label: "内容", prop: "yjNr", showOverflowTooltip: true },
{ label: "所属部门", prop: "ssbm", showOverflowTooltip: true },
{ label: "数据来源", prop: "xtSjly", showSolt: true },
{ label: "超时状态", prop: "cszt", showSolt: true },
{ label: "在控状态", prop: "zkzt", showSolt: true},
{ type: 'index', label: '序号', width: 55, align: 'center' },
{ label: '照片', width: 50, align: 'center', slotName: 'yjTp' },
{ label: "处置状态", align: 'center', width: 70, slotName: 'czzt' },
{ label: "车牌号", prop: "yjClcph", align: 'center', width: 80 },
{ label: '预警级别', width: 70, align: 'center', slotName: 'yjJb' },
{ label: "布控单位", prop: "gkbmmc", align: 'center' },
{ label: "布控来源", align: 'center', slotName: 'bkly', width: 70 },
{ prop: 'bkfw', label: "布控范围", align: 'center', width: 70 },
{ prop: 'bkkssj', label: "布控开始时间", align: 'center' },
{ prop: 'bkjssj', label: "布控结束时间", align: 'center' },
{ label: "处置要求", width: 70, slotName: 'bkczyq', align: 'center' },
{ label: "预警内容", prop: "yjNr", align: 'center' },
{ label: "数据来源", width: 70, align: 'center', slotName: 'yjLylx' },
{ label: '操作', width: 180, slotName: 'operation' },
{ label: '超时状态', width: 80, align: 'center', slotName: 'cszt' },
{ label: "在控状态", width: 70, align: 'center', slotName: "zkzt" },
]
});
const addFromRefs = ref()
@ -414,7 +388,7 @@ const pushWarning = (val) => {
const particularsShow = ref(false)
const dataPres = ref()
const openBox = (val) => {
particularsShow.value = true
particularsShow.value = true
dataPres.value = val
}
@ -422,7 +396,7 @@ const openBox = (val) => {
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () {
tabHeightFn();
};
@ -484,8 +458,6 @@ const tabHeightFn = () => {
}
.tabBox_zdy {
.el-table--fit {
overflow: unset !important;
}
background-color: #fff;
}
</style>

View File

@ -0,0 +1,256 @@
<template>
<div class="dialog" v-if="dialogForm">
<div class="head_box">
<span class="title">{{ title }}完成情况</span>
<div>
<el-button type="primary" size="small" v-if="!disabled" :loading="loading" @click="submit">保存</el-button>
<el-button size="small" @click="close">关闭</el-button>
</div>
</div>
<div class="form_cnt">
<FormMessage ref="elform" :disabled="disabled" v-model="listQuery" :formList="formData" :rules="rules">
</FormMessage>
<div>
<div class="btn_box">
<el-button :disabled="disabled" type="primary" size="small" @click="openZdsjLod">打开今日完成情况列表</el-button>
</div>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="300"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger">
<template #controls="{ row }">
<el-link type="primary" :disabled="disabled" size="small" @click="openZdsjLod('edit', row)">编辑</el-link>
<el-link type="danger" :disabled="disabled" size="small" @click="deleteZdsjLodList(row.id)">删除</el-link>
</template>
</MyTable>
</div>
<div>
<div class="btn_box">
<el-button :disabled="disabled" type="primary" size="small" @click="openToDayContent">明日值班工作列表</el-button>
</div>
<MyTable :tableData="toDayJobList.tableData" :tableColumn="toDayJobList.tableColumn" :tableHeight="300"
:key="toDayJobList.keyCount" :tableConfiger="toDayJobList.tableConfiger">
<template #controls="{ row }">
<el-link type="primary" :disabled="disabled" size="small"
@click="openToDayContent('edit', row)">编辑</el-link>
<el-link type="danger" :disabled="disabled" size="small" @click="deleteToDayContent(row.id)">删除</el-link>
</template>
</MyTable>
</div>
</div>
</div>
<ZdsjLod v-model="zdsjLodShow" @addZdsjLodList="addZdsjLodList" :zdsjLod="zdsjLod" />
<ToDayContent v-model="toDayContentShow" @addZdsjLodList="addToDayLodList" :toDayContent="toDayContent" />
</template>
<script setup>
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
import { ref, defineExpose, reactive, onMounted, defineEmits, getCurrentInstance, watch, onUnmounted } from "vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import ZdsjLod from "./zdsjLod.vue";
import ToDayContent from "./toDayContent.vue";
const emit = defineEmits(["getList"]);
const { proxy } = getCurrentInstance();
const dialogForm = ref(false); //弹窗
const rules = reactive({
jrzbrXm: [{ required: true, message: "请输入今日值班人", trigger: "blur" }],
jrzbrLxdh: [{ required: true, message: "请输入今日值班电话", trigger: "blur" }],
mrzbrXm: [{ required: true, message: "请输入明日值班人", trigger: "blur" }],
mrzbrLxdh: [{ required: true, message: "请输入明日值班电话", trigger: "blur" }],
kssj: [{ required: true, message: "请选择开始时间", trigger: "blur" }],
jssj: [{ required: true, message: "请选择结束时间", trigger: "blur" }],
gzrq: [{ required: true, message: "请选择工作日期", trigger: "blur" }],
});
const listQuery = ref({}); //表单
const formData = ref([
{ label: "今日值班人", prop: "jrzbrXm", type: "input" },
{ label: "今日值班电话", prop: "jrzbrLxdh", type: "input" },
{ label: "明日值班人", prop: "mrzbrXm", type: "input" },
{ label: "明日值班电话", prop: "mrzbrLxdh", type: "input" },
{ label: "开始时间", prop: "kssj", type: "datetime" },
{ label: "结束时间", prop: "jssj", type: "datetime" },
{ label: "工作日期", prop: "gzrq", type: "date" },
{ label: "备注", prop: "bz", type: "textarea", width: "100%" },
]);
const pageData = reactive({
tableData: [], //表格数据
tableConfiger: {
rowHieght: 61,
showSelectType: "null", //选择类型
},
tableColumn: [
{ label: "工作任务", prop: "grw", showOverflowTooltip: true },
{ label: "完成情况", prop: "wcqk", showOverflowTooltip: true },
{ label: " 来源", prop: "ly", showOverflowTooltip: true },
// { label: "序号", prop: "index", showOverflowTooltip: true },
]
});
const toDayJobList = reactive({
tableData: [], //表格数据
tableConfiger: {
rowHieght: 61,
showSelectType: "null", //选择类型
},
tableColumn: [
{ label: "工作内容", prop: "gznr", showOverflowTooltip: true },
]
});
const loading = ref(false);
const elform = ref();
const title = ref("");
const disabled = ref(false);
// 初始化数据
const init = (type, row) => {
title.value = type == 'edit' ? '编辑' : type == 'add' ? '新增' : '详情'
dialogForm.value = true;
if (type != 'add') {
qcckGet({}, '/mosty-gsxt/gzqk/' + row.id).then(res => {
listQuery.value = res;
pageData.tableData = res.wcqkList || [];
toDayJobList.tableData = res.zbgzList || [];
});
if (type == 'detail') {
disabled.value = true;
} else {
disabled.value = false;
}
}
};
// 提交
const submit = () => {
const promes = {
...listQuery.value,
wcqkList: pageData.tableData,
zbgzList: toDayJobList.tableData,
}
elform.value.submit((data) => {
loading.value = true;
if (title.value == "新增") {
qcckPost(promes, '/mosty-gsxt/gzqk/addEntity').then(() => {
proxy.$message({ type: "success", message: title.value + "成功" });
emit("getList");
close();
}).catch(() => {
}).finally(() => {
loading.value = false;
});
} else {
qcckPut(promes, '/mosty-gsxt/gzqk/editEntity').then(() => {
proxy.$message({ type: "success", message: title.value + "成功" });
emit("getList");
close();
}).catch(() => {
}).finally(() => {
loading.value = false;
});
}
});
};
//打开今日完成情况列表
const zdsjLodShow = ref();
const zdsjLod = ref();
const openZdsjLod = (type, row) => {
if (type == 'edit') {
console.log(row);
zdsjLod.value = { ...row };
}
zdsjLodShow.value = true;
}
const addZdsjLodList = (val) => {
const index = pageData.tableData.findIndex(v => v.id == val.id);
if (index != -1) {
pageData.tableData[index] = val;
} else {
pageData.tableData.push(val);
}
}
const deleteZdsjLodList = (id) => {
const index = pageData.tableData.findIndex(v => v.id == id);
if (index != -1) {
pageData.tableData.splice(index, 1);
}
}
// 打开明日值日列表
const toDayContentShow = ref();
const toDayContent = ref();
const openToDayContent = (type, row) => {
if (type == 'edit') {
toDayContent.value = { ...row };
}
toDayContentShow.value = true;
}
const addToDayLodList = (val) => {
const index = toDayJobList.tableData.findIndex(v => v.id == val.id);
if (index != -1) {
toDayJobList.tableData[index] = val;
} else {
toDayJobList.tableData.push(val);
}
}
const deleteToDayContent = (id) => {
const index = toDayJobList.tableData.findIndex(v => v.id == id);
if (index != -1) {
toDayJobList.tableData.splice(index, 1);
}
}
// 关闭
const close = () => {
listQuery.value = {};
dialogForm.value = false;
loading.value = false;
};
onMounted(() => {
});
defineExpose({ init });
</script>
<style lang="scss" scoped>
@import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss";
::v-deep .el-tabs--card>.el-tabs__header .el-tabs__item.is-active {
color: #0072ff;
background: rgba(0, 114, 255, 0.3);
}
.boxlist {
width: calc(99% - 50px);
margin-top: 10px;
overflow: hidden;
}
.depBox {
border: 1px solid #e9e9e9;
padding: 0 0 0 4px;
border-radius: 4px;
width: 100%;
.coolor {
color: #d3d3d3;
}
}
.zdy-taf {
width: 100%;
width: 100%;
min-height: 32px;
border: 1px solid #e9e9e9;
border-radius: 4px;
padding: 0px 5px;
box-sizing: border-box;
}
.map {
height: 520px;
margin-top: 10px;
}
.btn_box {
margin: 10px 0;
}
</style>

View File

@ -0,0 +1,175 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<Search :searchArr="searchConfiger" @submit="onSearch" />
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="handleAdd('add', null)">添加完成情况</el-button>
<el-button type="danger" size="small" @click="handleRow()">批量删除</el-button>
</template>
</PageTitle>
<!-- 按钮组 -->
<div class="content">
<!-- 表格 -->
<div class="tabBox">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
@chooseData="handleChooseData">
<!-- 操作 -->
<template #sjzt="{ row }">
<DictTag :tag="false" :value="row.sjzt" :options="D_BZ_ZDSJCZJG" />
</template>
<template #controls="{ row }">
<el-link type="primary" size="small" @click="handleAdd('edit', row)">编辑</el-link>
<el-link type="primary" size="small" @click="handleAdd('detail', row)">详情</el-link>
<el-link type="danger" size="small" @click="handleRow(row.id)">删除</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
</div>
<AddForm ref="addForm" @getList="getList" :dict="{ D_BZ_ZDSJCZJG }" />
</template>
<script setup>
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import AddForm from "./addForm.vue";
const { proxy } = getCurrentInstance();
const { D_BZ_ZDSJCZJG } = proxy.$dict("D_BZ_ZDSJCZJG"); //获取字典数据
const searchBox = ref(); //搜索框
const searchConfiger = ref([
{
label: "今日值班人",
prop: "jrzbrXm",
placeholder: "请输入今日值班人",
showType: "input",
},
{
label: "明日值班人",
prop: "mrzbrXm",
placeholder: "请输入明日值班人",
showType: "input",
}, {
label: "开始时间",
prop: "startTime",
placeholder: "请选择开始时间",
showType: "datetimerange",
},
]);
const queryFrom = ref({});
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkbox", //选择类型
loading: false
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 250, //操作栏宽度
tableColumn: [
{ label: "今日值班人", prop: "jrzbrXm", showOverflowTooltip: true },
{ label: "今日值班电话", prop: "jrzbrLxdh", showOverflowTooltip: true },
{ label: "明日值班人", prop: "mrzbrXm", showOverflowTooltip: true },
{ label: "明日值班电话", prop: "mrzbrLxdh", showOverflowTooltip: true },
{ label: "开始时间", prop: "kssj", showOverflowTooltip: true },
{ label: "结束时间", prop: "jssj" },
{ label: "工作日期", prop: "gzrq" },
{ label: "所属部门", prop: "ssbm" },
]
});
onMounted(() => {
getList();
tabHeightFn();
});
// 搜索
const onSearch = (val) => {
queryFrom.value = {
...val,
startTime: val.startTime ? val.startTime[0] : '',
endTime: val.startTime ? val.startTime[1] : ''
};
pageData.pageConfiger.pageCurrent = 1;
getList();
};
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList();
};
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList();
};
// 获取列表
const getList = () => {
const promes = {
...pageData.pageConfiger,
...queryFrom.value,
}
qcckGet(promes, "/mosty-gsxt/gzqk/getPageList").then((res) => {
pageData.tableData = res.records || [];
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
});
};
// 删除
const ids = ref([])
const handleChooseData = (val) => {
ids.value = val.map(item => item.id)
}
const handleRow = (id) => {
const promes = {
ids: id ? [id] : ids.value
}
proxy.$confirm("确定要删除?", "警告", { type: "warning" }).then(() => {
qcckDelete(promes, "/mosty-gsxt/gzqk/deleteEntity").then(() => {
proxy.$message({ type: "success", message: "删除成功" });
getList();
});
})
};
const addForm = ref(null);
const handleAdd = (type, row) => {
addForm.value.init(type, row);
};
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 270;
window.onresize = function () {
tabHeightFn();
};
};
</script>
<style lang="scss" scoped>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
</style>

View File

@ -0,0 +1,62 @@
<template>
<el-dialog :model-value="modelValue" :title="title" width="40%" @close="closeDialog" destroy-on-close append-to-body
:close-on-click-modal="false">
<div style="width: 100%;height:150px;">
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules">
</FormMessage>
</div>
<template #footer>
<div class="flex just-center">
<el-button @click="closeDialog">取消</el-button>
<el-button type="primary" @click="submitForm">确认</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { ref, reactive, onMounted, watch, onUnmounted, getCurrentInstance } from 'vue'
import {generateRandom10Digits} from "@/utils/tools";
const { proxy } = getCurrentInstance()
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
toDayContent: {
type: Object,
default: () => ({})
}
});
const listQuery = ref({})
const elform = ref()
const emit = defineEmits(["update:modelValue", "addZdsjLodList"]);
const title = ref("明日工作内容");
const formData = ref([
{ label: "工作内容", prop: "gznr", type: "textarea" ,width: "100%" },
]);
const rules = reactive({
gznr: [{ required: true, message: "请输入工作内容", trigger: "blur" }],
});
const closeDialog = () => {
elform.value.reset()
// 关闭对话框时移除事件监听器
emit("update:modelValue", false);
};
watch(() => props.modelValue, (newVal) => {
if (newVal) {
listQuery.value = { ...props.toDayContent }
}
})
const submitForm = () => {
elform.value.submit((val) => {
emit("addZdsjLodList", {...listQuery.value,id:listQuery.value.id?listQuery.value.id:generateRandom10Digits()})
closeDialog()
})
};
</script>
<style lang="scss" scoped></style>

View File

@ -0,0 +1,66 @@
<template>
<el-dialog :model-value="modelValue" :title="title" width="40%" @close="closeDialog" destroy-on-close append-to-body
:close-on-click-modal="false">
<div style="width: 100%;height: 300px;">
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules">
</FormMessage>
</div>
<template #footer>
<div class="flex just-center">
<el-button @click="closeDialog">取消</el-button>
<el-button type="primary" @click="submitForm">确认</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { ref, reactive, onMounted, watch, onUnmounted, getCurrentInstance } from 'vue'
import {generateRandom10Digits} from "@/utils/tools";
const { proxy } = getCurrentInstance()
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},zdsjLod: {
type: Object,
default: () => ({})
}
});
const listQuery = ref({})
const elform = ref()
const emit = defineEmits(["update:modelValue", "addZdsjLodList"]);
const title = ref("今日完成情况列表");
const formData = ref([{ label: "工作任务", prop: "grw", type: "input" },
{ label: "来源", prop: "ly", type: "textarea", width: "100%" },
{ label: "完成情况", prop: "wcqk", type: "textarea", width: "100%" },]);
const rules = reactive({
// xh: [{ required: true, message: "请输入序号", trigger: "blur" }],
grw: [{ required: true, message: "请输入工作任务", trigger: "blur" }],
ly: [{ required: true, message: "请输入工作来源", trigger: "blur" }],
wcqk: [{ required: true, message: "请输入完成情况", trigger: "blur" }],
});
watch(() => props.modelValue, (newVal) => {
if (newVal) {
listQuery.value = { ...props.zdsjLod }
}
})
const closeDialog = () => {
elform.value.reset()
// 关闭对话框时移除事件监听器
emit("update:modelValue", false);
};
const submitForm = () => {
elform.value.submit((val) => {
emit("addZdsjLodList", {...listQuery.value,id:listQuery.value.id?listQuery.value.id:generateRandom10Digits()})
closeDialog()
})
};
</script>
<style lang="scss" scoped></style>

View File

@ -0,0 +1,178 @@
<template>
<div class="dialog" v-if="dialogForm">
<div class="head_box">
<span class="title">{{ title }}事件</span>
<div>
<el-button type="primary" size="small" v-if="!disabled" :loading="loading" @click="submit">保存</el-button>
<el-button size="small" @click="close">关闭</el-button>
</div>
</div>
<div class="form_cnt">
<FormMessage ref="elform" :disabled="disabled" v-model="listQuery" :formList="formData" labelWidth="100px"
:rules="rules">
</FormMessage>
<div style="display: flex;justify-content: flex-end;margin-bottom: 10px;">
<el-button type="primary" style="margin-left: 10px;" @click="drawShape()">选择坐标</el-button>
</div>
<div style="height: 400px;width: 100%; position: absolute;">
<GdMap :mapid="'map-92'"></GdMap>
</div>
</div>
</div>
</template>
<script setup>
import * as rule from "@/utils/rules.js";
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
import { ref, defineExpose, reactive, onMounted, defineEmits, getCurrentInstance, watch, onUnmounted } from "vue";
import GdMap from "@/components/GdMap/index.vue";
import emitter from "@/utils/eventBus.js";
const emit = defineEmits(["getList"]);
const props = defineProps({
dict: {
type: Object,
default: () => ({})
}
});
const { proxy } = getCurrentInstance();
const dialogForm = ref(false); //弹窗
const rules = reactive({
sjbt: [{ required: true, message: "请输入事件标题", trigger: "blur" }],
shms: [{ required: true, message: "请输入事件描述", trigger: "blur" }],
jd: [{ required: true, message: "请输入经度", trigger: "blur" }],
wd: [{ required: true, message: "请输入纬度", trigger: "blur" }],
});
const listQuery = ref({
bqdlList: [],
bqxlList: [],
}); //表单
const formData = ref();
watch(() => props.dict.D_BZ_ZDSJCZJG, (newVal) => {
if (newVal) {
formData.value = [
{ label: "事件标题", prop: "sjbt", type: "input" },
// { label: "事件描述", prop: "shms", type: "input" },
{ label: "事件性质", prop: "sjxz", type: "input" },
{ label: "事件地址", prop: "sjdz", type: "input" },
// { label: "事件状态", prop: "sjzt", type: "select", options: props.dict.D_BZ_ZDSJCZJG },
{ label: "事发时间", prop: "fssj", type: "datetime" },
{ label: "事件描述", prop: "shms", type: "textarea", width: "100%" },
{ label: "处置结果", prop: "czjg", type: "textarea", width: "100%" },
{ label: "经度", prop: "jd", type: "input", disabled: true },
{ label: "纬度", prop: "wd", type: "input", disabled: true },
]
}
}, { deep: true });
const loading = ref(false);
const elform = ref();
const title = ref("");
const disabled = ref(false);
// 初始化数据
const init = (type, row) => {
title.value = type == 'edit' ? '编辑' : type == 'add' ? '新增' : '详情'
dialogForm.value = true;
if (type != 'add') {
listQuery.value = row;
emitter.emit('addPointArea', { coords: [{ jd: row.jd, wd: row.wd }], icon: require("@/assets/point/zl.png"), flag: "zdsj" })
}
if (type == 'detail') {
disabled.value = true;
}
};
// 提交
const submit = () => {
const promes = {
...listQuery.value
}
elform.value.submit((data) => {
let url = title.value == "新增" ? "/mosty-gsxt/zdsj/addEntity" : "/mosty-gsxt/zdsj/updateEntity";
loading.value = true;
qcckPost(promes, url).then(() => {
loading.value = false;
proxy.$message({ type: "success", message: title.value + "成功" });
emit("getList");
close();
}).catch(() => {
loading.value = false;
});
});
};
// 关闭
const close = () => {
listQuery.value = {};
dialogForm.value = false;
loading.value = false;
};
onMounted(() => {
emitter.on("coordString", coordStringHandler);
});
const coordStringHandler = (res) => {
if (res.type === "point") {
listQuery.value.jd = res.coord[0];
listQuery.value.wd = res.coord[1];
emitter.emit('addPointArea', { coords: [{ jd: res.coord[0], wd: res.coord[1] }], icon: require("@/assets/point/zl.png"), flag: "zdsj" })
emitter.emit('setMapCenter', { location: [res.coord[0], res.coord[1]], zoomLevel: 15 })
}
};
const drawShape = () => {
emitter.emit("drawShape", {
flag: "zdsj",
type: "point",
isclear: true
});
}
onUnmounted(() => {
emitter.off("coordString", coordStringHandler);
})
defineExpose({ init });
</script>
<style lang="scss" scoped>
@import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss";
::v-deep .el-tabs--card>.el-tabs__header .el-tabs__item.is-active {
color: #0072ff;
background: rgba(0, 114, 255, 0.3);
}
.boxlist {
width: calc(99% - 50px);
margin-top: 10px;
overflow: hidden;
}
.depBox {
border: 1px solid #e9e9e9;
padding: 0 0 0 4px;
border-radius: 4px;
width: 100%;
.coolor {
color: #d3d3d3;
}
}
.zdy-taf {
width: 100%;
width: 100%;
min-height: 32px;
border: 1px solid #e9e9e9;
border-radius: 4px;
padding: 0px 5px;
box-sizing: border-box;
}
.map {
height: 520px;
margin-top: 10px;
}
</style>

View File

@ -0,0 +1,177 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<Search :searchArr="searchConfiger" @submit="onSearch" />
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="handleAdd('add', null)">添加事件</el-button>
<el-button type="danger" size="small" @click="handleRow()">批量删除</el-button>
</template>
</PageTitle>
<!-- 按钮组 -->
<div class="content">
<!-- 表格 -->
<div class="tabBox">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
@chooseData="handleChooseData">
<!-- 操作 -->
<template #sjzt="{ row }">
<DictTag :tag="false" :value="row.sjzt" :options="D_BZ_ZDSJCZJG" />
</template>
<template #controls="{ row }">
<el-link type="primary" size="small" @click="handleAdd('edit', row)">编辑</el-link>
<el-link type="primary" size="small" @click="handleAdd('detail', row)">详情</el-link>
<el-link type="danger" size="small" @click="handleRow(row.id)">删除</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
</div>
<AddForm ref="addForm" @getList="getList" :dict="{D_BZ_ZDSJCZJG}" />
</template>
<script setup>
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import AddForm from "./addForm.vue";
const { proxy } = getCurrentInstance();
const { D_BZ_ZDSJCZJG } = proxy.$dict("D_BZ_ZDSJCZJG"); //获取字典数据
const searchBox = ref(); //搜索框
const searchConfiger = ref([
{
label: "事件标题",
prop: "sjbt",
placeholder: "请输入事件标题",
showType: "input",
},
{
label: "事件状态",
prop: "sjzt",
placeholder: "请选择事件状态",
showType: "select",
options: D_BZ_ZDSJCZJG
}, {
label: "开始时间",
prop: "startTime",
placeholder: "请选择开始时间",
showType: "datetimerange",
},
]);
const queryFrom = ref({});
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkbox", //选择类型
loading: false
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 250, //操作栏宽度
tableColumn: [
{ label: "事件标题", prop: "sjbt", showOverflowTooltip: true },
{ label: "事件地址", prop: "sjdz", showOverflowTooltip: true },
{ label: "事件性质", prop: "sjxz", showOverflowTooltip: true },
{ label: "事件描述", prop: "shms", showOverflowTooltip: true },
{ label: "发生时间", prop: "fssj" },
{ label: "处置结果", prop: "czjg", showOverflowTooltip: true },
{ label: "事件状态", prop: "sjzt", showSolt: true },
{ label: "所属部门", prop: "ssbm" },
]
});
onMounted(() => {
getList();
tabHeightFn();
});
// 搜索
const onSearch = (val) => {
queryFrom.value = {
...val,
startTime: val.startTime ? val.startTime[0] : '',
endTime: val.startTime ? val.startTime[1] : ''
};
pageData.pageConfiger.pageCurrent = 1;
getList();
};
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList();
};
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList();
};
// 获取列表
const getList = () => {
const promes = {
...pageData.pageConfiger,
...queryFrom.value,
}
qcckGet(promes, "/mosty-gsxt/zdsj/selectPage").then((res) => {
pageData.tableData = res.records || [];
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
});
};
// 删除
const ids = ref([])
const handleChooseData = (val) => {
ids.value = val.map(item => item.id)
}
const handleRow = (id) => {
const promes = {
ids: id ? [id] : ids.value
}
proxy.$confirm("确定要删除?", "警告", { type: "warning" }).then(() => {
qcckPost(promes, "/mosty-gsxt/zdsj/deletes").then(() => {
proxy.$message({ type: "success", message: "删除成功" });
getList();
});
})
};
// 事件操作
const addForm = ref(null);
const handleAdd = (type, row) => {
addForm.value.init(type, row);
};
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 270;
window.onresize = function () {
tabHeightFn();
};
};
</script>
<style lang="scss" scoped>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
</style>

View File

@ -21,14 +21,13 @@ const emit = defineEmits(["updateDate"]);
const props = defineProps({
dic: {
type: Object,
default: () => {}
default: () => { }
}
});
const { proxy } = getCurrentInstance();
const dialogForm = ref(false); //弹窗
const formData = ref( [
const formData = ref([
{ label: "报警电话", prop: "bjdh", type: "input" },
{ label: "报警电话用户地址", prop: "bjdhyhdz", type: "input" },
{ label: "报警电话用户名", prop: "bjdhyhm", type: "input" },
@ -36,7 +35,7 @@ const formData = ref( [
{ label: "报警人名称", prop: "bjrmc", type: "input" },
{ label: "报警人证件号码", prop: "bjrzjhm", type: "input" },
{ label: "报警时间", prop: "bjsj", type: "input" },
{ label: "警情颜色", prop: "color", type: "select",options: props.dic.D_GS_SSYJ },
{ label: "警情颜色", prop: "color", type: "select", options: props.dic.D_GS_SSYJ },
{ label: "管辖单位名称", prop: "gxdwmc", type: "input" },
{ label: "单位名称", prop: "jcjxtjsdwmc", type: "input" },
{ label: "接警单编号", prop: "jjdbh", type: "input" },
@ -46,13 +45,13 @@ const formData = ref( [
{ label: "接警完成时间", prop: "jjwcsj", type: "input" },
{ label: "接警员编号", prop: "jjybh", type: "input" },
{ label: "接警员姓名", prop: "jjyxm", type: "input" },
{ label: "警情标签", prop: "jqbq", type: "select",options: props.dic.D_BZ_JQBQ},
{ label: "警情标签", prop: "jqbq", type: "select", options: props.dic.D_BZ_JQBQ },
{ label: "警情地址", prop: "jqdz", type: "input" },
{ label: "警情类别代码", prop: "jqlbdm", type: "select", options: props.dic.JQLB },
{ label: "警情类型代码", prop: "jqlxdm", type: "select",options: props.dic.JQLX},
{ label: "警情来源", prop: "jqly", type: "select",options: props.dic.D_BZ_JQLY},
{ label: "警情细类代码", prop: "jqxldm", type: "select" ,options: props.dic.JQXL},
{ label: "警情子类代码", prop: "jqzldm", type: "select" ,options: props.dic.JQZL},
{ label: "警情类型代码", prop: "jqlxdm", type: "select", options: props.dic.JQLX },
{ label: "警情来源", prop: "jqly", type: "select", options: props.dic.D_BZ_JQLY },
{ label: "警情细类代码", prop: "jqxldm", type: "select", options: props.dic.JQXL },
{ label: "警情子类代码", prop: "jqzldm", type: "select", options: props.dic.JQZL },
{ label: "报警内容", prop: "bjnr", type: "textarea", width: "100%" },
{ label: "补充接警内容", prop: "bcjjnr", type: "textarea", width: "100%" },
{ label: "被困人员情况说明", prop: "bkryqksm", type: "textarea", width: "100%" },

View File

@ -0,0 +1,147 @@
<template>
<div class="dialog" v-if="dialogForm">
<div class="head_box">
<span class="title">{{ title }}值班</span>
<div>
<el-button type="primary" size="small" v-if="!disabled" :loading="loading" @click="submit">保存</el-button>
<el-button size="small" @click="close">关闭</el-button>
</div>
</div>
<div class="form_cnt">
<FormMessage ref="elform" :disabled="disabled" v-model="listQuery" :formList="formData" labelWidth="100px"
:rules="rules">
</FormMessage>
</div>
</div>
</template>
<script setup>
import * as rule from "@/utils/rules.js";
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
import { ref, defineExpose, reactive, onMounted, defineEmits, getCurrentInstance, watch, onUnmounted } from "vue";
const emit = defineEmits(["getList"]);
const props = defineProps({
dict: {
type: Object,
default: () => ({})
}
});
const { proxy } = getCurrentInstance();
const dialogForm = ref(false); //弹窗
const rules = reactive({
zbrxm: [{ required: true, message: "请输入值班人姓名", trigger: "blur" }],
zbrq: [{ required: true, message: "请输入值班日期", trigger: "blur" }],
lxdh: [{ required: true, message: "请输入值班人联系电话", trigger: "blur" }],
});
const listQuery = ref({}); //表单
const formData = ref([{ label: "值班人姓名", prop: "zbrxm", type: "input" },
{ label: "值班日期", prop: "zbrq", type: "date" },
{ label: "联系电话", prop: "lxdh", type: "input" },
{ label: "备注", prop: "bz", type: "textarea", width: '100%' },]);
const loading = ref(false);
const elform = ref();
const title = ref("");
const disabled = ref(false);
// 初始化数据
const init = (type, row) => {
title.value = type == 'edit' ? '编辑' : type == 'add' ? '新增' : '详情'
dialogForm.value = true;
if (type != 'add') {
listQuery.value = row;
if (type == 'detail') {
disabled.value = true;
} else {
disabled.value = false;
}
}
};
// 提交
const submit = () => {
const promes = {
...listQuery.value,
}
elform.value.submit((data) => {
loading.value = true;
if (title.value == "新增") {
qcckPost(promes, '/mosty-gsxt/gzzbxx/addEntity').then(() => {
proxy.$message({ type: "success", message: title.value + "成功" });
emit("getList");
close();
}).catch(() => {
}).finally(() => {
loading.value = false;
});
} else {
qcckPut(promes, '/mosty-gsxt/gzzbxx/editEntity').then(() => {
proxy.$message({ type: "success", message: title.value + "成功" });
emit("getList");
close();
}).catch(() => {
}).finally(() => {
loading.value = false;
});
}
});
};
// 关闭
const close = () => {
listQuery.value = {};
dialogForm.value = false;
loading.value = false;
};
onUnmounted(() => {
})
defineExpose({ init });
</script>
<style lang="scss" scoped>
@import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss";
::v-deep .el-tabs--card>.el-tabs__header .el-tabs__item.is-active {
color: #0072ff;
background: rgba(0, 114, 255, 0.3);
}
.boxlist {
width: calc(99% - 50px);
margin-top: 10px;
overflow: hidden;
}
.depBox {
border: 1px solid #e9e9e9;
padding: 0 0 0 4px;
border-radius: 4px;
width: 100%;
.coolor {
color: #d3d3d3;
}
}
.zdy-taf {
width: 100%;
width: 100%;
min-height: 32px;
border: 1px solid #e9e9e9;
border-radius: 4px;
padding: 0px 5px;
box-sizing: border-box;
}
.map {
height: 520px;
margin-top: 10px;
}
</style>

View File

@ -0,0 +1,164 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<Search :searchArr="searchConfiger" @submit="onSearch" />
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="handleAdd('add', null)">添加值班</el-button>
<el-button type="danger" size="small" @click="handleRow()">批量删除</el-button>
</template>
</PageTitle>
<!-- 按钮组 -->
<div class="content">
<!-- 表格 -->
<div class="tabBox">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
@chooseData="handleChooseData">
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="primary" size="small" @click="handleAdd('edit', row)">编辑</el-link>
<el-link type="primary" size="small" @click="handleAdd('detail', row)">详情</el-link>
<el-link type="danger" size="small" @click="handleRow(row.id)">删除</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
</div>
<AddForm ref="addForm" @getList="getList" />
</template>
<script setup>
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import AddForm from "./addForm.vue";
const { proxy } = getCurrentInstance();
const searchBox = ref(); //搜索框
const searchConfiger = ref([
{
label: "值班人姓名",
prop: "zbrxm",
placeholder: "请输入值班人姓名",
showType: "input",
},
{
label: "值班日期",
prop: "zbrq",
placeholder: "请选择值班日期",
showType: "daterange",
},
]);
const queryFrom = ref({});
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkbox", //选择类型
loading: false
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 250, //操作栏宽度
tableColumn: [
{ label: "值班人姓名", prop: "zbrxm", showOverflowTooltip: true },
{ label: "值班日期", prop: "zbrq", showOverflowTooltip: true },
{ label: "值班人联系电话", prop: "lxdh", showOverflowTooltip: true },
{ label: "录入人姓名", prop: "lrrXm", showOverflowTooltip: true },
{ label: "录入日期", prop: "xtCjsj" },
{ label: "所属部门", prop: "ssbm" },
]
});
onMounted(() => {
getList();
tabHeightFn();
});
// 搜索
const onSearch = (val) => {
queryFrom.value = {
...val,
startTime: val.startTime ? val.startTime[0] : '',
endTime: val.startTime ? val.startTime[1] : ''
};
pageData.pageConfiger.pageCurrent = 1;
getList();
};
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList();
};
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList();
};
// 获取列表
const getList = () => {
const promes = {
...pageData.pageConfiger,
...queryFrom.value,
}
qcckGet(promes, "/mosty-gsxt/gzzbxx/getPageList").then((res) => {
pageData.tableData = res.records || [];
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
});
};
// 删除
const ids = ref([])
const handleChooseData = (val) => {
ids.value = val.map(item => item.id)
}
const handleRow = (id) => {
const promes = {
ids: id ? [id] : ids.value
}
proxy.$confirm("确定要删除?", "警告", { type: "warning" }).then(() => {
qcckDelete(promes, "/mosty-gsxt/gzzbxx/deleteEntity").then(() => {
proxy.$message({ type: "success", message: "删除成功" });
getList();
});
})
};
// 值班操作
const addForm = ref(null);
const handleAdd = (type, row) => {
addForm.value.init(type, row);
};
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 270;
window.onresize = function () {
tabHeightFn();
};
};
</script>
<style lang="scss" scoped>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
</style>

View File

@ -1,41 +1,42 @@
<template>
<el-dialog :model-value="modelValue" width="70%" @close="closeDialog" :close-on-click-modal="false" destroy-on-close append-to-body>
<el-dialog :model-value="modelValue" width="70%" @close="closeDialog" :close-on-click-modal="false" destroy-on-close
append-to-body>
<template #title>
<div class="flex just-between align-center">
<span class="f18">警情总数</span>
<span @click="exportFile" class="f14 pointer" style="color: #0072ff;">下载</span>
<span @click="exportFile" class="f14 pointer" style="color: #0072ff;margin-right: 40px;">下载</span>
</div>
</template>
<div>
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<!-- <template #jjlx="{ row }">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<!-- <template #jjlx="{ row }">
<DictTag :tag="false" :value="row.jjlx" :options="D_BZ_JQBQ" />
</template> -->
<template #jqdjdm="{ row }">
<DictTag :tag="false" :value="row.jqdjdm" :options="D_GS_BQ_DJ" />
</template>
<template #jqlbdm="{ row }">
<DictTag :tag="false" :value="row.jqlbdm" :options="JQLB" />
</template>
<template #ypzt="{ row }">
{{ row.ypzt === '01' ? '已研判' : '未研判' }}
</template>
<!-- <template #jqdjdm="{ row }">
<template #jqdjdm="{ row }">
<DictTag :tag="false" :value="row.jqdjdm" :options="D_GS_BQ_DJ" />
</template>
<template #jqlbdm="{ row }">
<DictTag :tag="false" :value="row.jqlbdm" :options="JQLB" />
</template>
<template #ypzt="{ row }">
{{ row.ypzt === '01' ? '已研判' : '未研判' }}
</template>
<!-- <template #jqdjdm="{ row }">
<DictTag :tag="false" :value="row.jqdjdm" :options="D_BZ_JQDJ" />
</template> -->
<!-- 操作 -->
<!-- <template #controls="{ row }">
<!-- 操作 -->
<!-- <template #controls="{ row }">
<el-link type="primary" @click="addEdit('edit', row)">详情</el-link>
<el-link type="warning" @click="handleYP('研判', row)">研判</el-link>
<el-link type="danger" @click="handleYP('深度研判', row)">深度研判</el-link>
</template> -->
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
<template #footer>
<div class="dialog-footer">
@ -55,11 +56,11 @@ import Pages from "@/components/aboutTable/Pages.vue";
import { lzJcjPjdbSelectPage } from '@/api/semanticAnalysis.js'
import { ref, reactive, getCurrentInstance, watch } from "vue";
import { useRoute, useRouter } from 'vue-router'
import {timeValidate} from '@/utils/tools.js'
import { timeValidate } from '@/utils/tools.js'
const route = useRoute()
const router = useRouter()
const { proxy } = getCurrentInstance()
const { D_GS_BQ_DJ,JQLB,JQLX,JQXL,JQZL,D_BZ_JQLY,D_BZ_JQFL,JQLB_DP,D_BZ_JQBQ,D_GS_SSYJ } = proxy.$dict('D_GS_BQ_DJ',"JQLB",'JQLX','JQXL','JQZL','D_BZ_JQLY','D_BZ_JQFL','JQLB_DP','D_BZ_JQBQ','D_GS_SSYJ'); //获取字典数据
const { D_GS_BQ_DJ, JQLB, JQLX, JQXL, JQZL, D_BZ_JQLY, D_BZ_JQFL, JQLB_DP, D_BZ_JQBQ, D_GS_SSYJ } = proxy.$dict('D_GS_BQ_DJ', "JQLB", 'JQLX', 'JQXL', 'JQZL', 'D_BZ_JQLY', 'D_BZ_JQFL', 'JQLB_DP', 'D_BZ_JQBQ', 'D_GS_SSYJ'); //获取字典数据
const props = defineProps({
modelValue: {
type: Boolean,
@ -126,12 +127,12 @@ const pageData = reactive({
{ label: "报警时间", prop: "bjsj" },
{ label: "报警内容", prop: "bjnr", showOverflowTooltip: true },
{ label: "接警员姓名", prop: "jjyxm" },
{ label: "警情级别", prop: "jqdjdm",showSolt:true },
{ label: "警情级别", prop: "jqdjdm", showSolt: true },
// { label: "警情标签", prop: "jjlx", showSolt: true },
{ label: "警情类型", prop: "jqlbdm",showSolt:true },
{ label: "警情类型", prop: "jqlbdm", showSolt: true },
{ label: "警情地址", prop: "jqdz" },
{ label: "补充接警内容", prop: "bcjjnr", showOverflowTooltip: true },
{ label: "研判状态", prop: "ypzt",showSolt:true },
{ label: "研判状态", prop: "ypzt", showSolt: true },
],
tableHeight: "40vh",
});
@ -147,12 +148,12 @@ const onSearch = (val) => {
}
watch(() => props.modelValue, (val) => {
if (val) {
parameter.value = {startTime:timeValidate(new Date(),'ymd'),endTime:timeValidate(new Date(),'ymd')}
parameter.value = { startTime: timeValidate(new Date(), 'ymd'), endTime: timeValidate(new Date(), 'ymd') }
changePage()
}
})
const changePage = () => {
pageData.tableConfiger.loading = true;
pageData.tableConfiger.loading = true;
const params = {
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize,
@ -177,7 +178,7 @@ const changeSize = (val) => {
}
// 导出
const exportFile = () =>{
const exportFile = () => {
const titleObj = {
jjdbh: "接警单编号",
bjdh: "报警电话",
@ -190,13 +191,13 @@ const exportFile = () =>{
bcjjnr: "补充接警内容",
ypzt_name: "研判状态",
}
let list = pageData.tableData.map(item => ({
...item,
jqdjdm_name: getMultiDictVal(item.jqdjdm, D_GS_BQ_DJ),
jqlbdm_name: getMultiDictVal(item.jqlbdm, JQLB),
ypzt_name: item.ypzt == '01' ? '已研判' : '未研判'
}))
exportExlByObj(titleObj, list, '警情总数')
let list = pageData.tableData.map(item => ({
...item,
jqdjdm_name: getMultiDictVal(item.jqdjdm, D_GS_BQ_DJ),
jqlbdm_name: getMultiDictVal(item.jqlbdm, JQLB),
ypzt_name: item.ypzt == '01' ? '已研判' : '未研判'
}))
exportExlByObj(titleObj, list, '警情总数')
}
</script>

View File

@ -0,0 +1,820 @@
<template>
<el-dialog :model-value="props.modelValue" width="82%" @close="closeDialog" destroy-on-close append-to-body
:close-on-click-modal="false">
<div class="job-log-page">
<div class="page-title">情报研判大队工作日报</div>
<div class="top-row">
<div class="date-card panel">
<div class="date-head">
<div class="date-value">{{ todayText }}</div>
</div>
<div class="date-body">
<div class="weekday">{{ weekText }}</div>
<div>
<el-popover placement="right" :width="400" trigger="click">
<template #reference>
<img src="@/assets/images/rili.png" alt="" srcset="">
</template>
<el-date-picker v-model="promes.zbrq" style="width: 100%" type="date" placeholder="选择日期"
value-format="YYYY-MM-DD" @change="dateChange" />
</el-popover>
</div>
</div>
</div>
<div class="duty-boxes">
<div class="duty-card duty-today">
<div class="duty-line">
<div class="label">今日值班人员</div>
<div class="value">{{ zbData.jrzbrXm }}</div>
</div>
<div class="phone" v-if="zbData.jrzbrLxdh">{{ zbData.jrzbrLxdh }}</div>
</div>
<div class="duty-card duty-tomorrow">
<div class="duty-line">
<div class="label">明日值班人员</div>
<div class="value">{{ zbData.mrzbrXm }}</div>
</div>
<div class="phone">{{ zbData.mrzbrLxdh }}</div>
</div>
</div>
<div class="summary-card panel">
<div class="summary-head">{{ summaryDateText }}</div>
<div class="summary-grid">
<div class="grid-item">
<div class="grid-title">公安部重点人员四色预警</div>
<div class="stat-list">
<div v-for="(item, index) in warningStats" :key="item.level" class="stat-line">
<span class="dot" :class="item.className"></span>
<span class="name">{{ item.level }}</span>
<span class="num">{{ item.personnel }}</span>
<span class="num">{{ item.yjContent }}</span>
</div>
</div>
</div>
<div class="grid-item">
<div class="grid-title">签收反馈情况</div>
<div class="feedback-list">
<div v-for="item in feedbackStats" :key="item.name" class="feedback-line">
<span>{{ item.name }}</span>
<span>{{ item.value }}</span>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="bottom-row">
<div class="notice-panel panel">
<div class="panel-title panel-title-yellow">公告栏</div>
<div class="notice-list" v-infinite-scroll="loadMoreDuty" :infinite-scroll-disabled="dutyScrollDisabled"
:infinite-scroll-immediate="false" :infinite-scroll-distance="10">
<div class="notice-table-title">值班表</div>
<div class="notice-head">
<span>时间</span>
<span>值班人员</span>
<span>电话</span>
</div>
<template v-if="noticeList.length">
<div v-for="(item, index) in noticeList" :key="`${item.zbrq}-${item.lxdh}-${index}`" class="notice-item">
<span>{{ item.zbrq }}</span>
<span>{{ item.zbrxm }}</span>
<span>{{ item.lxdh }}</span>
</div>
</template>
<div v-else-if="dutyLoaded" class="notice-empty">暂无数据</div>
</div>
</div>
<div class="table-panel panel pdDate">
<div class="work-grid">
<div class="work-section">
<div class="panel-title panel-title-blue">今日已完成工作</div>
<div class="work-table-wrap">
<div class="complete-grid" :class="{ 'is-empty-grid': !completeWorks.length }">
<div class="complete-grid-row complete-grid-head">
<div class="complete-grid-cell complete-col-index"><span class="cell-text" title="序号">序号</span>
</div>
<div class="complete-grid-cell complete-col-main"><span class="cell-text" title="来源">来源</span></div>
<div class="complete-grid-cell complete-col-main"><span class="cell-text" title="工作任务">工作任务</span>
</div>
<div class="complete-grid-cell complete-col-main"><span class="cell-text" title="完成情况">完成情况</span>
</div>
</div>
<template v-if="completeWorks.length">
<div class="complete-grid-row" v-for="(item, index) in completeWorks" :key="item.id">
<div class="complete-grid-cell complete-col-index"><span class="cell-text"
:title="String(index + 1)">{{ index + 1 }}</span></div>
<div class="complete-grid-cell complete-col-main"><span class="cell-text" :title="item.ly">{{
item.ly }}</span></div>
<div class="complete-grid-cell complete-col-main"><span class="cell-text" :title="item.grw">{{
item.grw }}</span></div>
<div class="complete-grid-cell complete-col-main"><span class="cell-text" :title="item.wcqk">{{
item.wcqk }}</span></div>
</div>
</template>
<div v-else class="complete-grid-empty">暂无数据</div>
</div>
</div>
</div>
<div class="work-section">
<div class="panel-title panel-title-red">每日值班工作</div>
<div class="work-table-wrap">
<div class="duty-list" :class="{ 'is-empty-list': !dutyWorks.length }">
<template v-if="dutyWorks.length">
<div class="duty-row" v-for="(row, index) in dutyWorks" :key="index">
<div class="duty-col-index"><span class="cell-text">{{ index + 1 }}</span></div>
<div class="duty-col-content"><span class="cell-text">{{ row.gznr || "" }}</span></div>
</div>
</template>
<div v-else class="empty-cell">暂无数据</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</el-dialog>
</template>
<script setup>
import { computed, reactive, ref, watch } from "vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
const props = defineProps({
modelValue: {
type: Boolean,
default: false
}
});
const emit = defineEmits(["update:modelValue"]);
const closeDialog = () => emit("update:modelValue", false);
const weekList = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
const pad = (v) => `${v}`.padStart(2, "0");
const formatPickerDate = (value) => `${value.getFullYear()}-${pad(value.getMonth() + 1)}-${pad(value.getDate())}`;
const getDateByPickerValue = (value) => {
if (!value) return new Date();
const [year, month, day] = value.split("-").map(Number);
return new Date(year, month - 1, day);
};
const noticeList = ref([]);
const completeWorks = ref([]);
const dutyWorks = ref([]);
// 查询值班列表
const promes = reactive({
pageSize: 10,
pageCurrent: 1,
zbrq: formatPickerDate(new Date())
});
const selectedDate = computed(() => getDateByPickerValue(promes.zbrq));
const todayText = computed(() => {
const current = selectedDate.value;
return `${current.getFullYear()}/${pad(current.getMonth() + 1)}/${pad(current.getDate())}`;
});
const weekText = computed(() => weekList[selectedDate.value.getDay()]);
const formatDateMinute = (value) => `${value.getFullYear()}-${pad(value.getMonth() + 1)}-${pad(value.getDate())} ${pad(value.getHours())}:${pad(value.getMinutes())}:${pad(value.getSeconds())}`;
const getSummaryRange = () => {
const now = new Date();
const end = new Date(selectedDate.value);
end.setHours(now.getHours(), now.getMinutes(), now.getSeconds(), 0);
const start = new Date(end);
start.setDate(start.getDate() - 1);
return { start, end };
};
const summaryDateText = computed(() => {
const { start, end } = getSummaryRange();
return `${start.getFullYear()}${start.getMonth() + 1}${start.getDate()}${pad(start.getHours())}${pad(start.getMinutes())}${end.getFullYear()}${end.getMonth() + 1}${end.getDate()}${pad(end.getHours())}${pad(end.getMinutes())} `;
});
const total = ref(0);
const dutyLoading = ref(false);
const dutyLoaded = ref(false);
const dutyScrollDisabled = computed(() => dutyLoading.value || (dutyLoaded.value && noticeList.value.length >= total.value));
const resetDutyList = () => {
noticeList.value = [];
total.value = 0;
promes.pageCurrent = 1;
dutyLoaded.value = false;
};
const getDutyList = (force = false) => {
if (dutyLoading.value) return;
if (!force && dutyLoaded.value && noticeList.value.length >= total.value) return;
dutyLoading.value = true;
qcckGet({ ...promes }, "/mosty-gsxt/gzzbxx/getPageList")
.then((res) => {
const records = res?.records || [];
noticeList.value = promes.pageCurrent === 1 ? records : noticeList.value.concat(records);
total.value = Number(res?.total || 0);
promes.pageCurrent += 1;
})
.finally(() => {
dutyLoading.value = false;
dutyLoaded.value = true;
});
};
const zbData = ref({})
// 获取值班列表情况
const gzqkGetPageList = () => {
const paramsList = {
gzrq: promes.zbrq,
};
qcckGet({ ...paramsList }, "/mosty-gsxt/gzqk/selectList")
.then((res) => {
zbData.value = res[0] || {};
})
.finally(() => {
});
};
const gzqkQueryByDate = () => {
qcckGet({ date: promes.zbrq }, "/mosty-gsxt/gzqk/queryByDate")
.then((res) => {
dutyWorks.value = res ? (res.zbgzList || []) : [];
completeWorks.value = res ? (res.wcqkList || []) : [];
})
.finally(() => {
});
}
const warningStats = ref([
{ level: "红色预警", personnel: "0", perKey: 'hsrysl', yjContent: '0', className: "dot-red", yjKey: 'hsyjsl' },
{ level: "橙色预警", personnel: "0", perKey: 'csrysl', yjContent: '0', className: "dot-orange", yjKey: 'csyjsl' },
{ level: "黄色预警", personnel: "0", perKey: 'ysrysl', yjContent: '0', className: "dot-yellow", yjKey: 'ysyjsl' },
{ level: "蓝色预警", personnel: "0", perKey: 'lsrysl', yjContent: '0', className: "dot-blue", yjKey: 'lsyjsl' }
])
const feedbackStats = ref([
{ name: "按时签收", value: "", key: 'zcqs' },
{ name: "按时反馈", value: "", key: 'zcfk' },
{ name: "超时签收", value: "", key: 'csqs' },
{ name: "超时反馈", value: "", key: 'csfk' }
]);
// 预警级别
const getYjxxTj = () => {
const { start, end } = getSummaryRange();
qcckPost({ startTime: formatDateMinute(start), endTime: formatDateMinute(end) }, "/mosty-gsxt/tbYjxx/gzqkYjdj")
.then((res) => {
warningStats.value = warningStats.value.map((item) => {
item.personnel = res[item.perKey] || 0;
item.yjContent = res[item.yjKey] || 0;
return item
})
})
.finally(() => {
});
}
// 反馈情况
const getYjCzztTj = () => {
const { start, end } = getSummaryRange();
qcckPost({ kssj: formatDateMinute(start), jssj: formatDateMinute(end) }, "/mosty-gsxt/tbYjxx/qsfktj")
.then((res) => {
feedbackStats.value = feedbackStats.value.map((item) => {
item.value = res[item.key] || 0;
return item
})
})
.finally(() => {
});
}
const loadMoreDuty = () => {
getDutyList();
};
watch(() => props.modelValue, (newVal) => {
if (newVal) {
dateChange()
}
});
const dateChange = () => {
resetDutyList();
getDutyList(true);
gzqkGetPageList()
gzqkQueryByDate()
getYjxxTj()
getYjCzztTj()
};
</script>
<style lang="scss" scoped>
.job-log-page {
width: 100%;
height: 700px;
max-height: 700px;
padding: 10px;
display: flex;
flex-direction: column;
background: #f1f6ff;
border: 1px solid #9db6dd;
box-sizing: border-box;
overflow: hidden;
}
.page-title {
height: 44px;
line-height: 44px;
font-size: 26px;
font-weight: 700;
text-align: center;
color: #fff;
background: linear-gradient(180deg, #4b96e7 0%, #2f6dbb 100%);
margin-bottom: 12px;
letter-spacing: 2px;
}
.top-row {
display: grid;
grid-template-columns: 300px 300px 1fr;
gap: 8px;
margin-bottom: 8px;
flex-shrink: 0;
}
.panel {
border: 1px solid #9ab0cf;
background: #fff;
}
.pdDate {
padding: 5px;
}
.date-card {
display: grid;
grid-template-rows: 58px 1fr;
overflow: hidden;
}
.date-head {
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(180deg, #d6c75f 0%, #cab84d 100%);
}
.date-body {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background: #f7f3ad;
}
.date-value {
font-size: 24px;
font-weight: 700;
color: #3a3a3a;
}
.weekday {
margin-top: 2px;
font-size: 30px;
font-weight: 700;
color: #1f1f1f;
}
.calendar-icon {
width: 66px;
height: 56px;
margin-top: 8px;
border-radius: 8px;
border: 3px solid #005ca7;
color: #005ca7;
display: flex;
justify-content: center;
align-items: center;
font-size: 30px;
background: #fff7cf;
}
.duty-boxes {
display: grid;
grid-template-rows: 1fr 1fr;
gap: 8px;
}
.duty-card {
border-radius: 10px;
color: #fff;
text-align: center;
align-content: center;
padding: 8px 10px 7px;
border: 1px solid rgba(255, 255, 255, 0.4);
}
.duty-line {
display: flex;
justify-content: center;
align-items: baseline;
gap: 6px;
white-space: nowrap;
}
.duty-today {
background: linear-gradient(180deg, #5aa0ef 0%, #3b7fd1 100%);
}
.duty-tomorrow {
background: linear-gradient(180deg, #ed7070 0%, #ce4242 100%);
}
.duty-card .label {
font-size: 16px;
font-weight: 700;
}
.duty-card .value {
font-size: 16px;
line-height: 1.1;
font-weight: 700;
}
.duty-card .phone {
margin-top: 2px;
font-size: 16px;
line-height: 1.15;
font-weight: 700;
}
.summary-card {
padding: 0 10px 8px;
}
.summary-head {
height: 38px;
line-height: 38px;
text-align: center;
font-size: 18px;
font-weight: 700;
color: #655825;
background: #f5ed8d;
margin-bottom: 6px;
}
.summary-grid {
display: grid;
grid-template-columns: 1fr 1fr;
border: 1px solid #d9d9d9;
}
.grid-item {
border-right: 1px solid #d9d9d9;
}
.grid-item:last-child {
border-right: none;
}
.grid-title {
height: 34px;
line-height: 34px;
text-align: center;
border-bottom: 1px solid #d9d9d9;
font-size: 16px;
font-weight: 700;
color: #2f2f2f;
}
.stat-list,
.feedback-list {
padding: 8px 12px;
}
.stat-line {
display: flex;
align-items: center;
font-size: 18px;
margin-bottom: 2px;
font-weight: 700;
}
.stat-line .dot {
width: 14px;
height: 14px;
border-radius: 50%;
margin-right: 8px;
}
.stat-line .name {
width: 98px;
}
.dot-red {
background: #ff4d4f;
}
.dot-orange {
background: #ff9f43;
}
.dot-yellow {
background: #f6d34d;
}
.dot-blue {
background: #4a90e2;
}
.feedback-line {
display: flex;
justify-content: space-between;
font-size: 18px;
margin-bottom: 3px;
font-weight: 700;
}
.bottom-row {
display: grid;
grid-template-columns: 300px 1fr;
gap: 8px;
flex: 1;
min-height: 0;
}
.panel-title {
height: 60px;
line-height: 60px;
text-align: center;
font-size: 24px;
font-weight: 700;
border-bottom: 1px solid #99abcb;
}
.panel-title-yellow {
background: #f5ed8d;
color: #2d2d2d;
}
.panel-title-blue {
background: #5ea3ef;
color: #fff;
}
.panel-title-red {
background: #de4d5e;
color: #fff;
}
.notice-panel {
height: 100%;
display: flex;
flex-direction: column;
overflow: hidden;
}
.notice-list {
flex: 1;
padding: 6px;
font-size: 14px;
color: #1d5d97;
overflow: auto;
}
.notice-table-title {
text-align: center;
font-size: 24px;
font-weight: 700;
color: inherit;
margin-bottom: 2px;
}
.notice-head,
.notice-item {
display: grid;
grid-template-columns: 1fr 1fr 1.4fr;
gap: 4px;
padding: 4px 2px;
border-bottom: 1px dashed #d8d8d8;
color: inherit;
text-align: center;
}
.notice-head {
font-size: 16px;
font-weight: 700;
}
.notice-empty {
padding: 20px 0;
text-align: center;
font-size: 16px;
font-weight: 700;
color: inherit;
}
.table-panel {
height: 100%;
display: flex;
flex-direction: column;
overflow: hidden;
}
.work-grid {
display: grid;
grid-template-columns: 3fr 2fr;
gap: 8px;
flex: 1;
min-height: 0;
}
.work-grid>div {
min-width: 0;
}
.work-section {
min-width: 0;
min-height: 0;
display: flex;
flex-direction: column;
}
.work-table-wrap {
flex: 1;
min-height: 0;
overflow: auto;
}
.complete-grid {
height: 100%;
display: flex;
flex-direction: column;
border-left: 1px solid #9bacca;
border-top: 1px solid #9bacca;
}
.complete-grid-row {
display: grid;
grid-template-columns: 12% 29.33% 29.33% 29.33%;
min-height: 40px;
flex-shrink: 0;
}
.complete-grid-cell {
border-right: 1px solid #9bacca;
border-bottom: 1px solid #9bacca;
padding: 5px;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
overflow: hidden;
box-sizing: border-box;
}
.complete-grid-head .complete-grid-cell {
background: #f1f5fe;
font-size: 16px;
font-weight: 700;
}
.complete-col-index {
width: 100%;
}
.complete-col-main {
width: 100%;
}
.is-empty-grid .complete-grid-empty {
flex: 1;
}
.complete-grid-empty {
border-right: 1px solid #9bacca;
border-bottom: 1px solid #9bacca;
min-height: 70px;
display: flex;
align-items: center;
justify-content: center;
font-size: 16px;
font-weight: 700;
color: #8a8a8a;
}
.work-table {
width: 100%;
border-collapse: collapse;
font-size: 15px;
table-layout: fixed;
min-height: 100%;
}
.work-table th,
.work-table td {
border: 1px solid #9bacca;
padding: 5px;
text-align: center;
overflow: hidden;
}
.complete-row {
height: 40px;
}
.empty-cell {
height: 100%;
min-height: 70px;
font-size: 16px;
font-weight: 700;
color: #8a8a8a;
vertical-align: middle;
}
.is-empty-table tbody {
height: 100%;
}
.is-empty-table tbody tr {
height: 100%;
}
.cell-text {
display: block;
width: 100%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.col-index {
width: 12%;
}
.col-main {
width: 29.33%;
}
.work-table thead th {
background: #f1f5fe;
font-size: 16px;
}
.index-cell {
width: 40px;
background: #f8f8f8;
font-weight: 700;
}
.duty-list {
height: 100%;
display: flex;
flex-direction: column;
border-left: 1px solid #9bacca;
border-top: 1px solid #9bacca;
}
.duty-row {
display: grid;
grid-template-columns: 40px 1fr 40px 1fr;
min-height: 40px;
flex-shrink: 0;
}
.duty-col-index,
.duty-col-content {
border-right: 1px solid #9bacca;
border-bottom: 1px solid #9bacca;
padding: 5px;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
overflow: hidden;
}
.duty-col-index {
background: #f8f8f8;
font-weight: 700;
}
.duty-col-content {
font-size: 15px;
}
.is-empty-list {
display: flex;
}
.is-empty-list .empty-cell {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
border-right: 1px solid #9bacca;
border-bottom: 1px solid #9bacca;
}
:deep(.el-dialog__body) {
padding: 10px 12px;
}
.num {
width: 100px;
text-align: center;
}
</style>

View File

@ -0,0 +1,198 @@
<template>
<DialogDragger title="警情详情" top="150px" v-model="props.show" @close="closeDialog">
<div class="jqxq-wrap">
<div class="jqxq-row">
<div class="jqxq-label">报警人名称</div>
<div class="jqxq-value">{{ fieldValue("bjrmc") }}</div>
</div>
<div class="jqxq-row">
<div class="jqxq-label">报警电话用户名</div>
<div class="jqxq-value">{{ fieldValue("bjdhyhm") }}</div>
</div>
<div class="jqxq-row">
<div class="jqxq-label">报警电话</div>
<div class="jqxq-value">{{ fieldValue("bjdh") }}</div>
</div>
<div class="jqxq-row">
<div class="jqxq-label">报警人证件号码</div>
<div class="jqxq-value">{{ fieldValue("bjrzjhm") }}</div>
</div>
<div class="jqxq-row">
<div class="jqxq-label">报警时间</div>
<div class="jqxq-value">{{ fieldValue("bjsj") }}</div>
</div>
<div class="jqxq-row">
<div class="jqxq-label">报警电话用户地址</div>
<div class="jqxq-value">{{ fieldValue("bjdhyhdz") }}</div>
</div>
<div class="jqxq-row">
<div class="jqxq-label">报警地址</div>
<div class="jqxq-value">{{ fieldValue("bjdz") }}</div>
</div>
<div class="jqxq-row">
<div class="jqxq-label">接警单编号</div>
<div class="jqxq-value">{{ fieldValue("jjdbh") }}</div>
</div>
<div class="jqxq-row">
<div class="jqxq-label">接警单位名称</div>
<div class="jqxq-value">{{ fieldValue("jjdwmc") }}</div>
</div>
<div class="jqxq-row">
<div class="jqxq-label">接警完成时间</div>
<div class="jqxq-value">{{ fieldValue("jjwcsj") }}</div>
</div>
<div class="jqxq-row">
<div class="jqxq-label">接警员编号</div>
<div class="jqxq-value">{{ fieldValue("jjybh") }}</div>
</div>
<div class="jqxq-row">
<div class="jqxq-label">接警员姓名</div>
<div class="jqxq-value">{{ fieldValue("jjyxm") }}</div>
</div>
<div class="jqxq-row">
<div class="jqxq-label">接警录音号</div>
<div class="jqxq-value">{{ fieldValue("jjlyh") }}</div>
</div>
<div class="jqxq-row">
<div class="jqxq-label">接警时间</div>
<div class="jqxq-value">{{ fieldValue("jjsj") }}</div>
</div>
<div class="jqxq-row">
<div class="jqxq-label">警情颜色</div>
<div class="jqxq-value">{{ fieldValue("jqdjdm", D_GS_SSYJ) }}</div>
</div>
<div class="jqxq-row">
<div class="jqxq-label">管辖单位名称</div>
<div class="jqxq-value">{{ fieldValue("gxdwmc") }}</div>
</div>
<div class="jqxq-row">
<div class="jqxq-label">单位名称</div>
<div class="jqxq-value">{{ fieldValue("jcjxtjsdwmc") }}</div>
</div>
<div class="jqxq-row">
<div class="jqxq-label">警情类别</div>
<div class="jqxq-value">{{ fieldValue("jqlbdm", JQLB) }}</div>
</div>
<div class="jqxq-row">
<div class="jqxq-label">警情类型</div>
<div class="jqxq-value">{{ fieldValue("jqlxdm", JQLX) }}</div>
</div>
<div class="jqxq-row">
<div class="jqxq-label">警情来源</div>
<div class="jqxq-value">{{ fieldValue("jqlyfs", D_BZ_JQLY) }}</div>
</div>
<div class="jqxq-row">
<div class="jqxq-label">警情细类</div>
<div class="jqxq-value">{{ fieldValue("jqxldm", JQXL) }}</div>
</div>
<div class="jqxq-row">
<div class="jqxq-label">警情子类</div>
<div class="jqxq-value">{{ fieldValue("jqzldm", JQZL) }}</div>
</div>
<div class="jqxq-row is-full">
<div class="jqxq-label">警情地址</div>
<div class="jqxq-value">{{ fieldValue("jqdz") }}</div>
</div>
<div class="jqxq-row is-full">
<div class="jqxq-label">报警内容</div>
<div class="jqxq-value">{{ fieldValue("bjnr") }}</div>
</div>
<div class="jqxq-row is-full">
<div class="jqxq-label">警情标签</div>
<div class="jqxq-value">{{ fieldValue("jqbq", D_BZ_JQBQ) }}</div>
</div>
<div class="jqxq-row is-full">
<div class="jqxq-label">补充接警内容</div>
<div class="jqxq-value">{{ fieldValue("bcjjnr") }}</div>
</div>
<div class="jqxq-row is-full">
<div class="jqxq-label">被困人员情况说明</div>
<div class="jqxq-value">{{ fieldValue("bkryqksm") }}</div>
</div>
</div>
</DialogDragger>
</template>
<script setup>
import { computed, getCurrentInstance } from "vue";
import emitter from "@/utils/eventBus.js";
import DialogDragger from "@/views/home/layout/dialogDragger.vue";
const { proxy } = getCurrentInstance();
const { JQLB, JQLX, JQXL, JQZL, D_BZ_JQLY, D_BZ_JQBQ, D_GS_SSYJ } = proxy.$dict("JQLB", "JQLX", "JQXL", "JQZL", "D_BZ_JQLY", "D_BZ_JQBQ", "D_GS_SSYJ");
const props = defineProps({
dict: {
type: Object,
default: () => ({})
},
zbData: {
type: Object,
default: () => ({})
}, show: {
type: Boolean,
default: false
}, data: {
type: Object,
default: () => ({})
}
});
const detailData = computed(() => (Array.isArray(props.data) ? (props.data[0] || {}) : (props.data || {})));
const getOptionLabel = (options, value) => {
if (!Array.isArray(options) || !options.length) return `${value}`;
const match = options.find((item) => {
const values = [item.value, item.dictValue, item.dictCode, item.code, item.key];
return values.some((v) => `${v}` === `${value}`);
});
if (!match) return `${value}`;
const label = match.label || match.dictLabel || match.name || match.text;
return label === undefined || label === null || label === "" ? `${value}` : label;
};
const formatValue = (raw, options) => {
if (raw === undefined || raw === null || raw === "") return "--";
if (options) return getOptionLabel(options, raw);
return `${raw}`;
};
const fieldValue = (prop, options) => formatValue(detailData.value[prop], options);
const closeDialog = () => {
emitter.emit("showJqXq", false);
};
</script>
<style lang="scss" scoped>
.jqxq-wrap {
max-height: 70vh;
overflow: auto;
padding: 8px;
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 8px;
}
.jqxq-row {
display: grid;
grid-template-columns: 160px 1fr;
border: 1px solid #d8e4f0;
border-radius: 4px;
overflow: hidden;
background: #fff;
}
.jqxq-row.is-full {
grid-column: 1 / -1;
}
.jqxq-label {
padding: 8px 10px;
background: #eef4fb;
color: #315a86;
border-right: 1px solid #d8e4f0;
font-weight: 600;
word-break: break-all;
display: flex;
align-items: center;
}
.jqxq-value {
padding: 10px;
color: #1f2d3d;
white-space: pre-wrap;
word-break: break-all;
}
</style>

View File

@ -5,6 +5,8 @@
<!-- 预警信息弹框 -->
<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" />
<jqXq v-if="isShow.showJqXq" :show="isShow.showJqXq" :data="list.Info_JqXq" />
<zdsjXq v-if="isShow.showZdsjXq" :show="isShow.showZdsjXq" :data="list.Info_ZdsjXq" />
</div>
</template>
@ -14,15 +16,21 @@ import Home_YJ from "./components/home_yj.vue";
import PopupWarning from './components/popupWarning'
import Intelligence from "@/views/home/model/mesgSwitch/intelligence.vue";
import { ref, onMounted, onUnmounted, reactive, getCurrentInstance } from "vue";
import jqXq from "./jqXq.vue";
import zdsjXq from "./zdsjXq.vue";
const { proxy } = getCurrentInstance();
const isShow = ref({
showYj: false, //预警弹窗
showWarning: false, //预警弹窗
showQbsb: false, //情报上报列表弹窗
showJqXq: false,
showZdsjXq: false,
});
const list = reactive({
Info_YJ: [], //预警数据
Info_Warning: [],
Info_JqXq: [],
Info_ZdsjXq: [],
});
onMounted(() => {
@ -40,10 +48,23 @@ onMounted(() => {
emitter.on("lookQbsbList", (res) => {
isShow.value.showQbsb = res ? true : false;
});
// 展示警情详情
emitter.on("showJqXq", (res) => {
isShow.value.showJqXq = res ? true : false;
if (res) list.Info_JqXq = res;
});
// 展示处置信息详情
emitter.on("showZdsjXq", (res) => {
isShow.value.showZdsjXq = res ? true : false;
if (res) list.Info_ZdsjXq = res;
});
});
onUnmounted(() => {
emitter.off("showHomeYJ");
emitter.off("showHomeWarning");
emitter.off("lookQbsbList");
emitter.off("showJqXq");
emitter.off("showZdsjXq");
});
</script>

View File

@ -0,0 +1,108 @@
<template>
<el-dialog :model-value="modelValue" :title="title" width="60%" @close="closeDialog" destroy-on-close append-to-body
:close-on-click-modal="false">
<div style="width: 100%;height: 650px;">
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules">
</FormMessage>
<div style="display: flex;justify-content: flex-end;">
<el-button type="primary" style="margin-left: 10px;" @click="drawShape()">选择坐标</el-button>
</div>
<div style="height: 300px;width: 96%; position: absolute;">
<GdMap :mapid="'map-92'" v-if="showMap"></GdMap>
</div>
</div>
<template #footer>
<div class="flex just-center">
<el-button @click="closeDialog">取消</el-button>
<el-button type="primary" @click="submitForm">确认</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import GdMap from "@/components/GdMap/index.vue";
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { ref, reactive, onMounted, watch, onUnmounted, getCurrentInstance } from 'vue'
import emitter from "@/utils/eventBus.js";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
const { proxy } = getCurrentInstance()
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
dict: {
type: Object,
default: () => ({})
},
zbData: {
type: Object,
default: () => ({})
}
});
const listQuery = ref({})
const elform = ref()
const emit = defineEmits(["update:modelValue",]);
const title = ref("新增重点事件");
const formData = ref([]);
const rules = reactive({
sjbt: [{ required: true, message: "请输入事件标题", trigger: "blur" }],
shms: [{ required: true, message: "请输入事件描述", trigger: "blur" }],
jd: [{ required: true, message: "请输入经度", trigger: "blur" }],
wd: [{ required: true, message: "请输入纬度", trigger: "blur" }],
});
const showMap = ref(false)
watch(() => props.modelValue, (newVal) => {
if (newVal) {
formData.value = [
{ label: "事件标题", prop: "sjbt", type: "input" },
// { label: "事件描述", prop: "shms", type: "input" },
{ label: "事件性质", prop: "sjxz", type: "input" },
{ label: "事件地址", prop: "sjdz", type: "input" },
// { label: "事件状态", prop: "sjzt", type: "select", options: props.dict.D_BZ_ZDSJCZJG },
{ label: "事发时间", prop: "fssj", type: "datetime" },
{ label: "事件描述", prop: "shms", type: "textarea", width: "100%" },
{ label: "处置结果", prop: "czjg", type: "textarea", width: "100%" },
{ label: "经度", prop: "jd", type: "input", disabled: true },
{ label: "纬度", prop: "wd", type: "input", disabled: true },
]
setTimeout(() => {
showMap.value = true
}, 1000);
}
})
const drawShape = () => {
emitter.emit("drawShape", {
flag: "zdsj",
type: "point",
isclear: true
});
}
watch(() => props.zbData, (newVal) => {
if (newVal) {
listQuery.value.jd = newVal[0]
listQuery.value.wd = newVal[1]
}
}, { deep: true })
const closeDialog = () => {
showMap.value = false
elform.value.reset()
// 关闭对话框时移除事件监听器
emit("update:modelValue", false);
};
const submitForm = () => {
elform.value.submit((val) => {
qcckPost({ ...listQuery.value }, '/mosty-gsxt/zdsj/addEntity').then(res => {
console.log(res);
proxy.$message.success("新增成功");
emit("update:modelValue", false);
})
})
};
</script>
<style lang="scss" scoped></style>

View File

@ -0,0 +1,109 @@
<template>
<DialogDragger title="重点事件详情" top="150px" v-model="props.show" @close="closeDialog">
<div class="jqxq-wrap">
<div class="jqxq-row">
<div class="jqxq-label">事件标题</div>
<div class="jqxq-value">{{ fieldValue("sjbt") }}</div>
</div>
<div class="jqxq-row">
<div class="jqxq-label">事件性质</div>
<div class="jqxq-value">{{ fieldValue("sjxz") }}</div>
</div>
<div class="jqxq-row">
<div class="jqxq-label">事件地址</div>
<div class="jqxq-value">{{ fieldValue("sjdz") }}</div>
</div>
<div class="jqxq-row">
<div class="jqxq-label">事发时间</div>
<div class="jqxq-value">{{ fieldValue("fssj") }}</div>
</div>
<div class="jqxq-row">
<div class="jqxq-label">经度</div>
<div class="jqxq-value">{{ fieldValue("jd") }}</div>
</div>
<div class="jqxq-row">
<div class="jqxq-label">纬度</div>
<div class="jqxq-value">{{ fieldValue("wd") }}</div>
</div>
<div class="jqxq-row is-full">
<div class="jqxq-label">事件描述</div>
<div class="jqxq-value">{{ fieldValue("shms") }}</div>
</div>
<div class="jqxq-row is-full">
<div class="jqxq-label">处置结果</div>
<div class="jqxq-value">{{ fieldValue("czjg") }}</div>
</div>
</div>
</DialogDragger>
</template>
<script setup>
import { computed, getCurrentInstance } from "vue";
import emitter from "@/utils/eventBus.js";
import DialogDragger from "@/views/home/layout/dialogDragger.vue";
const props = defineProps({
dict: {
type: Object,
default: () => ({})
},
zbData: {
type: Object,
default: () => ({})
}, show: {
type: Boolean,
default: false
}, data: {
type: Object,
default: () => ({})
}
});
const detailData = computed(() => (Array.isArray(props.data) ? (props.data[0] || {}) : (props.data || {})));
const formatValue = (raw) => {
if (raw === undefined || raw === null || raw === "") return "--";
return `${raw}`;
};
const fieldValue = (prop) => formatValue(detailData.value[prop]);
const closeDialog = () => {
emitter.emit("showZdsjXq", false);
};
</script>
<style lang="scss" scoped>
.jqxq-wrap {
max-height: 70vh;
overflow: auto;
padding: 8px;
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 8px;
}
.jqxq-row {
display: grid;
grid-template-columns: 160px 1fr;
border: 1px solid #d8e4f0;
border-radius: 4px;
overflow: hidden;
background: #fff;
}
.jqxq-row.is-full {
grid-column: 1 / -1;
}
.jqxq-label {
padding: 8px 10px;
background: #eef4fb;
color: #315a86;
border-right: 1px solid #d8e4f0;
font-weight: 600;
word-break: break-all;
display: flex;
align-items: center;
}
.jqxq-value {
padding: 10px;
color: #1f2d3d;
white-space: pre-wrap;
word-break: break-all;
}
</style>

View File

@ -1,6 +1,7 @@
<template>
<div class="homeBox" style="background-color: #07274d;">
<div class="homeBox">
<!-- 头部 -->
<Head></Head>
<!-- 左边 -->
<div class="home-aside asideL">
@ -10,20 +11,20 @@
<div class="asideL-Bottom">
<div class="commom-aside">
<transition name="flip" mode="out-in">
<div :key="'qb'" v-if="modelQbsb" class="flip-wrapper">
<QbsbCount @change="modelQbsb = !modelQbsb"></QbsbCount>
</div>
<div :key="'text'" v-else class="flip-wrapper">
<Statistics @change="modelQbsb = !modelQbsb" />
</div>
</transition>
<div :key="'qb'" v-if="modelQbsb" class="flip-wrapper">
<QbsbCount @change="modelQbsb = !modelQbsb"></QbsbCount>
</div>
<div :key="'text'" v-else class="flip-wrapper">
<Statistics @change="modelQbsb = !modelQbsb" />
</div>
</transition>
</div>
<div class="commom-aside">
<!-- <KeyPpersonneltypes /> -->
<MyCase/>
<MyCase />
</div>
<div class="commom-aside" @mouseenter="mouseEnter" @mouseleave="mouseLeave" >
<div style="position: relative; height: 100%;">
<div class="commom-aside" @mouseenter="mouseEnter" @mouseleave="mouseLeave">
<div class="relative-full-height">
<transition name="flip" mode="out-in">
<div :key="'qb'" v-if="reversalPushShow" class="flip-wrapper">
<QblyType @reversalPush="reversalPush"></QblyType>
@ -42,14 +43,14 @@
<Calendar />
</div>
<div class="commom-aside-big" @mouseenter="mouseEnter" @mouseleave="mouseLeave">
<transition name="flip" mode="out-in">
<div :key="'qb'" v-if="reversalShow" class="flip-wrapper">
<Experience @reversalPush="reversal"></Experience>
</div>
<div :key="'text'" v-else class="flip-wrapper">
<KeyPpersonneltypes @reversalPush="reversal"></KeyPpersonneltypes>
</div>
</transition>
<transition name="flip" mode="out-in">
<div :key="'qb'" v-if="reversalShow" class="flip-wrapper">
<Experience @reversalPush="reversal"></Experience>
</div>
<div :key="'text'" v-else class="flip-wrapper">
<KeyPpersonneltypes @reversalPush="reversal"></KeyPpersonneltypes>
</div>
</transition>
</div>
<div class="commom-aside-small">
<!-- <SituationAssessment /> -->
@ -58,29 +59,43 @@
</div>
<!-- 中间 -->
<div class="home-center">
<div class="middle-top"><Yszs /></div>
<div class="middle-top">
<Yszs />
</div>
<div class="flex middle-bottom mt10">
<div style="width: 30px;position: absolute;z-index: 100;left: 0;background-color: #07274d;height: 30px;text-align: center;line-height:30px;">
<div class="icon-button audio-button">
<el-icon :size="20" v-if="ispLayBack" @click="closeLayBack">
<Bell />
</el-icon>
<el-icon :size="20" v-else @click="ispLayBack=true">
<el-icon :size="20" v-else @click="ispLayBack = true">
<MuteNotification />
</el-icon>
</div>
<div style="width: 30px;position: absolute;z-index: 100;left: 34px;background-color: #07274d;height: 30px;text-align: center;line-height:30px;">
<div class="icon-button notification-button">
<el-tooltip class="item" effect="dark" :content="showNotification ? '通知关闭' : '通知打开'" placement="bottom">
<el-icon :size="20" @click="handleOpenNotification" style="top: 3px;">
<Open v-if="showNotification" />
<TurnOff v-else />
<el-icon :size="20" @click="handleOpenNotification" class="icon-top">
<Open v-if="showNotification" />
<TurnOff v-else />
</el-icon>
</el-tooltip>
</div>
<div class="flex" style="position: absolute;z-index: 100;left: 70px;background-color: #07274d;height: 30px;text-align: center;line-height:30px;">
<div style="width: 30px;">
<el-icon :size="20" @click="showSeatch = !showSeatch" style="top: 3px;"><Search /></el-icon>
<div class="icon-button map-button" @click="mapNavigationShowOk">
<el-icon :size="20">
<Rank />
</el-icon>
</div>
<div class="icon-button job-button" @click="jobLogShowOpen">
<el-icon :size="20">
<Message />
</el-icon>
</div>
<div class="search-container">
<div class="search-icon">
<el-icon :size="20" @click="showSeatch = !showSeatch" class="icon-top">
<Search />
</el-icon>
</div>
<div :style="{'width': showSeatch ? '270px' : '0'}" class="trnsitinForm">
<div :style="{ 'width': showSeatch ? '270px' : '0' }" class="trnsitinForm">
<el-input v-model="searchText" placeholder="请输入身份证" clearable>
<template #append>
<el-button type="primary" @click="handleSearch">搜索</el-button>
@ -89,25 +104,25 @@
</div>
<!-- 搜索 -->
</div>
<div style="width: 100%;border: 1px sienna;position: relative">
<GdMap></GdMap>
<div class="map-container">
<GdMap :mapid="'map-91'"></GdMap>
</div>
<div class="flex-1" style="width: 340px;position: absolute;z-index: 100;right: 0;">
<div class="deploy-control">
<DeployControl />
</div>
<div class="flex-1" style="width: 340px;position: absolute;z-index: 100;left: 0;top: 30%;">
<div class="general-window">
<GeneralWindow />
</div>
</div>
</div>
<!-- 底部 -->
<div class="home-foot-t">
<div style="width: 33%;">
<div class="foot-item">
<!-- <WarningDistrict></WarningDistrict> -->
<WarningPoints></WarningPoints>
</div>
<div style="width: 33%;">
<transition name="flip" mode="out-in">
<div class="foot-item">
<transition name="flip" mode="out-in">
<div :key="'qb'" v-if="modelWarning" class="flip-wrapper">
<SevenWarning @changeModel="changeModel"></SevenWarning>
<!-- <WarningLevels @changeModel="changeModel"></WarningLevels> -->
@ -115,9 +130,9 @@
<div :key="'text'" v-else class="flip-wrapper">
<BkWarning @changeModel="changeModel"></BkWarning>
</div>
</transition>
</transition>
</div>
<div style="width: 33%;">
<div class="foot-item">
<Bkcz></Bkcz>
</div>
</div>
@ -129,12 +144,13 @@
<PeoDialog ref="peoDialogRef"></PeoDialog>
<!-- 权限申请 -->
<QxsqDialog />
<JobLog v-model="jobLogShow" />
</template>
<script setup>
import QxsqDialog from './components/qxsqDialog.vue'
import { qcckGet ,qcckPost} from "@/api/qcckApi.js";
import { ref, onMounted, onUnmounted,getCurrentInstance } from 'vue'
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { ref, onMounted, onUnmounted, getCurrentInstance } from 'vue'
import PeoDialog from './components/peoDialog.vue'
import LeftDialog from './dialog/leftDialog'
import GdMap from "@/components/GdMap/index.vue";
@ -166,6 +182,9 @@ import MyCase from './model/myCase.vue'
// 导入音频播放器工具类
import audioPlayer from '@/utils/audioPlayer'
import TestDiv from "@/components/common/TestDiv.vue";
import router from '../../router';
import JobLog from './dialog/jobLog.vue'
const { proxy } = getCurrentInstance();
const modelWarning = ref(true)
const modelQbsb = ref(true)
@ -193,7 +212,7 @@ const changeXzqh = (val, trg) => {
type: "Polygon",
coordinates: [area] // 确保格式正确
},
properties: { },
properties: {},
type: "Feature"
}))
// 循环为每个区域创建单独的多边形,这样可以设置不同的样式
@ -272,11 +291,11 @@ const getDepId = () => {
const handleOpenNotification = () => {
clearInterval(popupTimer.value)
showNotification.value = !showNotification.value;
emitter.emit('deletePointArea','hm_pop')
if(showNotification.value){
emitter.emit('deletePointArea', 'hm_pop')
if (showNotification.value) {
// 主动展开提示,默认展示所有
allDep.value.forEach(item => {
emitter.emit("makerPopup", { data:item, flag: "hm_pop",type:'Custom'});
emitter.emit("makerPopup", { data: item, flag: "hm_pop", type: 'Custom' });
})
} else {
// 关闭主动展开后,恢复循环单条气泡展示
@ -289,7 +308,7 @@ const makerCenter = () => {
qcckGet({}, '/mosty-gsxt/lzJcjPjdb/selectCountNew').then(res => {
let list = res || [];
allDep.value = list;
emitter.emit("addPointArea", { coords:list, icon: dw, flag: "hm", size: '14px', showTitle: false, offset: [0, -25] });
emitter.emit("addPointArea", { coords: list, icon: dw, flag: "hm", size: '14px', showTitle: false, offset: [0, -25] });
})
}
@ -319,8 +338,8 @@ const startPopupLoop = () => {
clearInterval(popupTimer.value)
popupTimer.value = setInterval(() => {
if (!showNotification.value && allDep.value.length > 0) {
emitter.emit('deletePointArea','hm_pop')
emitter.emit("makerPopup", { data: allDep.value[indexNum.value], flag: "hm_pop", type:'Custom' })
emitter.emit('deletePointArea', 'hm_pop')
emitter.emit("makerPopup", { data: allDep.value[indexNum.value], flag: "hm_pop", type: 'Custom' })
indexNum.value = (indexNum.value + 1) % allDep.value.length
}
}, 10000)
@ -328,8 +347,8 @@ const startPopupLoop = () => {
// 搜索
const handleSearch = () => {
if(!searchText.value) return proxy.$message.warning('请输入身份证号');
qcckPost({ rysfzh: searchText.value },'/mosty-gsxt/tbYjxx/getPageAllList').then(res => {
if (!searchText.value) return proxy.$message.warning('请输入身份证号');
qcckPost({ rysfzh: searchText.value }, '/mosty-gsxt/tbYjxx/getPageAllList').then(res => {
peoDialogRef.value.init(res.records || [])
})
}
@ -340,7 +359,7 @@ const getTbYjxxGetList = () => {
const today = new Date();
const startTime = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0).getTime();
const endTime = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 23, 59, 59).getTime();
const promes = { startTime:timeValidate(startTime), endTime:timeValidate(endTime), }
const promes = { startTime: timeValidate(startTime), endTime: timeValidate(endTime), }
tbYjxxGetList(promes).then(res => {
const coords = res.map(item => {
return { id: item.id, jd: item.jd, wd: item.wd, yjtp: item.yjTp, yjnr: item.yjNr, yjLx: item.yjlx, yjlx: '01', yjsj: item.yjSj, rysfzh: item.yjRysfzh, ryxm: item.yjRyxm }
@ -355,7 +374,7 @@ const reversalPush = () => {
// 移除clearInterval调用避免定时器被清除
}
const reversal= () => {
const reversal = () => {
reversalShow.value = !reversalShow.value
// 移除clearInterval调用避免定时器被清除
}
@ -377,7 +396,7 @@ const mouseLeave = () => {
}, 30000)
}
function changeModel(){
function changeModel() {
modelWarning.value = !modelWarning.value
}
@ -385,9 +404,9 @@ function changeModel(){
onMounted(() => {
getDepId()
makerCenter()
bnTimer.value = setInterval(()=>{
bnTimer.value = setInterval(() => {
makerCenter()
},60000)
}, 60000)
startPopupLoop()
mouseLeave()
getTbYjxxGetList()
@ -425,7 +444,6 @@ onMounted(() => {
audioPlayer.pause()
})
})
onUnmounted(() => {
clearInterval(timing.value)
clearInterval(bnTimer.value)
@ -433,10 +451,101 @@ onUnmounted(() => {
// 组件卸载时停止音频播放并释放资源
if (audioPlayer) audioPlayer.destroy();
})
const mapNavigationShowOk = () => {
router.push({ path: '/mapNavigation' })
}
// 岗位日志
const jobLogShow = ref(false)
const jobLogShowOpen = () => {
jobLogShow.value = true
}
</script>
<style lang="scss" scoped>
@import "@/assets/css/homeScreen.scss";
.homeBox {
background-color: #07274d;
}
.relative-full-height {
position: relative;
height: 100%;
}
.icon-button {
width: 30px;
position: absolute;
z-index: 100;
background-color: #07274d;
height: 30px;
text-align: center;
line-height: 30px;
}
.audio-button {
left: 0;
}
.notification-button {
left: 34px;
}
.map-button {
left: 105px;
}
.job-button {
left: 140px;
}
.search-container {
display: flex;
position: absolute;
z-index: 100;
left: 70px;
background-color: #07274d;
height: 30px;
text-align: center;
line-height: 30px;
}
.search-icon {
width: 30px;
}
.icon-top {
position: relative;
top: 3px;
}
.map-container {
width: 100%;
border: 1px solid sienna;
position: relative;
}
.deploy-control {
width: 340px;
position: absolute;
z-index: 100;
right: 0;
}
.general-window {
width: 340px;
position: absolute;
z-index: 100;
left: 0;
top: 30%;
}
.foot-item {
width: 33%;
}
.fxq {
border-radius: 35px;
width: 35px;
@ -445,6 +554,7 @@ onUnmounted(() => {
transform-origin: left center;
overflow: hidden;
margin-bottom: 10px;
.icon {
display: flex;
align-items: center;
@ -469,24 +579,30 @@ onUnmounted(() => {
}
}
}
.fxq2 {
background-color: #9d88f9;
}
.fxq1:hover {
width: 120px;
}
.fxq2:hover {
width: 120px;
}
.fxq3:hover {
width: 120px;
}
::v-deep .badge-top-left .el-badge__content {
top: 0;
right: auto;
left: -10px;
transform: translateY(-50%) translateX(-50%);
}
.badge-content {
display: flex;
flex-direction: column;
@ -497,9 +613,11 @@ onUnmounted(() => {
min-height: 45px;
/* 确保收缩时有足够空间显示第一个图标 */
}
.badge-content:not(.expanded) {
max-height: 45px;
}
/* 收缩时只显示第一个图标,隐藏其他内容 */
.badge-content:not(.expanded)> :not(:first-child) {
opacity: 0;

View File

@ -75,7 +75,7 @@
<div class="flex align-center">
<img class="mr10" src="@/assets/images/icon_046.png" alt="" />
<div class="f14 user-info">
<div :style="{color:isRed ? '#ff5500' : '#fff',fontWeight:isRed ? 'bold' : 'normal'}">{{ userName }}</div>
<div :style="{ color: isRed ? '#ff5500' : '#fff', fontWeight: isRed ? 'bold' : 'normal' }">{{ userName }}</div>
<div class="dept-text" :title="dept">{{ dept }}</div>
</div>
@ -132,6 +132,9 @@ const props = defineProps({
type: {
type: String,
default: ''
}, defDay: {
type: Boolean,
default: true
}
});
const wekendays = ref([
@ -171,7 +174,7 @@ onMounted(() => {
});
/** 获取名字是否标红 */
function getIsRed() {
getUserIsRed().then(res=>{
getUserIsRed().then(res => {
isRed.value = res === true
})
}
@ -189,7 +192,13 @@ const handleBtns = (val) => {
router.push("/ResearchHome");
break;
case "后台":
router.push("/YjData");
if (props.defDay) {
router.push("/YjData");
} else {
router.push("/");
}
break;
case "安全监控":
router.push("/resourceMonitoring");

View File

@ -0,0 +1,635 @@
<template>
<div class="homeBox">
<!-- <div class="header">
<div class="title">
<el-icon><Map /></el-icon>
地图导航
</div>
<div class="close-button" @click="close">
<el-icon>
<Close />
</el-icon>
</div>
</div> -->
<Head :defDay="false"></Head>
<div class="map-container">
<GdMap :mapid="'map-99'"></GdMap>
<div class="button-container">
<template v-for="(value, index) in butList" :key="index">
<el-popover v-if="value.label === '警情' && value.onChage" placement="top" :width="200" trigger="hover">
<template #reference>
<div class="but" :class="{ 'butOk': value.onChage }" @click="changeBut(value)">
{{ value.label }}
</div>
</template>
<div class="jqdj-popover">
<el-checkbox-group v-model="jqdjdmFilter" @change="handleJqdjFilterChange">
<el-checkbox v-for="item in D_BZ_JQDJ" :key="item.dm" :label="item.dm">
{{ item.zdmc }}
</el-checkbox>
</el-checkbox-group>
</div>
</el-popover>
<div v-else class="but" :class="{ 'butOk': value.onChage }" @click="changeBut(value)">
{{ value.label }}
</div>
</template>
</div>
</div>
<div class="list">
<div class="titel">
<div class="levelOneAlert">{{ listTitle }}</div>
<div class="switchover" @click="change">切换</div>
</div>
<div class="search">
<div class="jqdj-filter" v-if="changeState">
<el-checkbox v-model="checkAll" :indeterminate="isIndeterminate" @change="handleCheckAllChange">
全选
</el-checkbox>
<el-checkbox-group v-model="selectedJqdj" @change="handleCheckedChange">
<el-checkbox v-for="item in D_BZ_JQDJ" :key="item.dm" :label="item.dm">
{{ item.zdmc }}
</el-checkbox>
</el-checkbox-group>
</div>
<div>
<el-input v-model="promes.jjdbh" :placeholder="changeState ? '输入接警单编号' : '输入事件标题'" class="input-with-select"
clearable />
<el-button class="button-model" type="primary" @click="search">搜索</el-button>
<el-button type="success" :icon="Plus" @click="changeChooseShow" v-if="!changeState" />
</div>
</div>
<div class="dataList" v-infinite-scroll="loadMore" infinite-scroll-disabled="loading"
infinite-scroll-distance="10">
<template v-if="changeState">
<div class="item" v-for="(item, index) in jqList" :key="index" @click="clickJq(item)">
<div class="data-title">接警单{{ item.jjdbh }}</div>
<div class="data-row">
<div class="data-title">报警人{{ item.bjrmc }}</div>
<div class="data-title">报警电话{{ item.bjdh }}</div>
</div>
<div class="data-row">
<div class="data-title data-row">
警情等级
<DictTag :tag="false" color="red" :value="item.jqdjdm" :options="D_GS_BQ_DJ" />
</div>
<div class="data-title data-row">警情类别
<DictTag :tag="false" :value="item.jqlbdm" :options="JQLB" color="#fff" />
</div>
</div>
<div class="data-title content">报警内容{{ item.bjnr }}</div>
<div class="data-title">报警时间{{ item.bjsj }}</div>
<div class="data-title imTyle" @click.stop="updetDz(item)">报警地址<img src="@/assets/point/dingwei.png"
alt="" />{{ item.bjdz }}</div>
</div>
</template>
<template v-else>
<div class="item" v-for="(item, index) in zdsjList" :key="index" @click="clickJq(item)">
<div class="data-title">事件标题:{{ item.sjbt }}</div>
<div class="data-title display-flex">事件状态
<DictTag :tag="false" color="#fff" :value="item.sjzt" :options="D_BZ_ZDSJCZJG" />
</div>
<div class="data-title">处置结果{{ item.czjg }}</div>
<div class="data-title">发生时间{{ item.fssj }}</div>
<div class="data-title">事件性质{{ item.sjxz }}</div>
<div class="data-title">事件描述{{ item.shms }}</div>
<div class="data-title imTyle" @click.stop="updetDz(item)">事件地址<img src="@/assets/point/dingwei.png"
alt="" />{{ item.sjdz }}</div>
<div class="data-title">所属部门{{ item.ssbm }}</div>
</div>
</template>
</div>
</div>
</div>
<ZdsjLod v-model="chooseShow" :dict="{ D_BZ_ZDSJCZJG }" :zbData="zbData" />
<!-- 左边弹窗 -->
<LeftDialog></LeftDialog>
</template>
<script setup>
import LeftDialog from '../dialog/leftDialog.vue'
import GdMap from "@/components/GdMap/index.vue";
import { ref, onMounted, getCurrentInstance, onUnmounted } from 'vue'
import { Close, Map, Plus } from '@element-plus/icons-vue';
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import ZdsjLod from "@/views/home/dialog/zdsjLod.vue";
import Head from '../layout/head.vue'
const { proxy } = getCurrentInstance();
const { D_GS_BQ_DJ, JQLB, D_BZ_ZDSJCZJG, D_BZ_JQDJ } = proxy.$dict('D_GS_BQ_DJ', "JQLB", "D_BZ_ZDSJCZJG", "D_BZ_JQDJ"); //获取字典数据
const butList = ref([
{
label: '警情',
onChage: true
},
{
label: '事件',
onChage: true
},
{
label: '清除',
onChage: false
}
])
const rowData = ref()
// 警情等级筛选底部按钮的popover
const jqdjdmFilter = ref([])
// 处理警情等级筛选变化
const handleJqdjFilterChange = () => {
getLzJcjPjdb()
}
// 底部按钮
const changeBut = (row) => {
if (row.label == '清除') {
emitter.emit('deletePointArea', 'sj_flash')
emitter.emit('deletePointArea', 'jq_flash')
return
}
let index = butList.value.findIndex(item => item.label == row.label)
butList.value[index].onChage = !butList.value[index].onChage
if (index == 0) {
if (butList.value[index].onChage) {
getLzJcjPjdb()
} else {
jqdjdmFilter.value = [] // 清空选中的警情等级
emitter.emit("deletePointArea", "jq")
}
} else {
if (butList.value[index].onChage) {
getZdsj()
} else {
emitter.emit("deletePointArea", "sj")
}
}
}
// 获取所有的一级警情
const getLzJcjPjdb = () => {
const jqdjdmStr = jqdjdmFilter.value.length > 0 ? jqdjdmFilter.value.join(',') : ''
emitter.emit("deletePointArea", "jq")
qcckGet({
jqdjdm: jqdjdmStr
}, "/mosty-gsxt/lzJcjPjdb/selectList").then(res => {
let list = res.filter(item => item.fxdwjd && item.fxdwjd).map(item => {
return {
...item,
jd: item.fxdwjd,
wd: item.fxdwwd
}
}) || [];
const dw = require("@/assets/point/jq.png")
emitter.emit("addPoint", { coords: list, icon: dw, flag: "jq" });
})
}
const loading = ref(false)
const changeState = ref(true)// 点击切换
// 获取所有的重点事件
const getZdsj = () => {
qcckGet({}, "/mosty-gsxt/zdsj/selectList").then(res => {
let list = res.filter(item => item.jd && item.wd).map(item => {
return {
...item,
}
}) || [];
const dw = require("@/assets/point/zl.png")
emitter.emit("addPoint", { coords: list, icon: dw, flag: "sj" });
})
}
// 分页查询一级警情
const jqList = ref([])
// 分页查询重点事件
const zdsjList = ref([])
// 警情等级多选
const checkAll = ref(false)
const isIndeterminate = ref(false)
const selectedJqdj = ref([])
// 全选/取消全选 - 点击全选按钮时触发
const handleCheckAllChange = (val) => {
if (val) {
// 全选:选中所有选项
selectedJqdj.value = D_BZ_JQDJ.value.map(item => item.dm)
} else {
// 取消全选:清空所有选项
selectedJqdj.value = []
}
isIndeterminate.value = false
promes.value.currentPage = 1
getList()
}
// 多选框变化 - 点击具体选项时触发
const handleCheckedChange = (value) => {
const checkedCount = value.length
const totalCount = D_BZ_JQDJ.value.length
// 只有当所有选项都选中时,全选按钮才为勾选状态
checkAll.value = checkedCount === totalCount
// 部分选中时显示半选状态
isIndeterminate.value = checkedCount > 0 && checkedCount < totalCount
promes.value.currentPage = 1
getList()
}
// 分页查询
const promes = ref({
currentPage: 1,
pageSize: 10,
jjdbh: ''
})
const getList = () => {
loading.value = true
if (changeState.value) {
// 将选中的警情等级转为字符串
const jqdjdmStr = selectedJqdj.value.length > 0 ? selectedJqdj.value.join(',') : ''
qcckGet({ ...promes.value, jqdjdm: jqdjdmStr }, "/mosty-gsxt/lzJcjPjdb/selectPage").then(res => {
jqList.value = promes.value.currentPage == 1 ? res.records : jqList.value.concat(res.records)
}).finally(() => {
loading.value = false
})
} else {
qcckGet({ ...promes.value, sjbt: promes.value.jjdbh }, "/mosty-gsxt/zdsj/selectPage").then(res => {
zdsjList.value = promes.value.currentPage == 1 ? res.records : zdsjList.value.concat(res.records)
}).finally(() => {
loading.value = false
})
}
}
// chooseShow 弹窗
const chooseShow = ref(false)
const changeChooseShow = (val) => {
chooseShow.value = true
}
// 滚动加载
const loadMore = () => {
if (loading.value) return
promes.value.currentPage++
getList()
}
// 搜索一级警情
const search = () => {
promes.value.currentPage = 1;
getList()
}
onMounted(() => {
emitter.on("coordString", coordStringHandler);
// 初始化选中所有警情等级
selectedJqdj.value = D_BZ_JQDJ.value.map(item => item.dm)
checkAll.value = false
getLzJcjPjdb()
getZdsj()
getList()
})
// 组件卸载时移除事件监听器
onUnmounted(() => {
emitter.off("coordString", coordStringHandler);
});
//点击
const updetDz = (row) => {
if (changeState.value) {
proxy.$confirm('是否进行定位?', "警告", { type: "warning" }
).then(() => {
rowData.value = row
emitter.emit("drawShape", {
flag: "jq",
type: "point",
isclear: true
});
})
} else {
proxy.$confirm('是否进行定位?', "警告", { type: "warning" }
).then(() => {
rowData.value = row
emitter.emit("drawShape", {
flag: "sj",
type: "point",
isclear: true
});
})
}
}
const clickJq = (row) => {
emitter.emit('deletePointArea', 'sj_flash')
emitter.emit('deletePointArea', 'jq_flash')
if (changeState.value) {
// 添加新的闪烁点位
emitter.emit('addPointArea', { flag: 'jq_flash', coords: [{ jd: row.fxdwjd, wd: row.fxdwwd }], flash: true, offset: [-1, 28] })
// 定位到该点
emitter.emit('setMapCenter', { location: [row.fxdwjd, row.fxdwwd], zoomLevel: 15 })
} else {
// 添加新的闪烁点位
emitter.emit('addPointArea', { flag: 'sj_flash', coords: [{ jd: row.jd, wd: row.wd }], flash: true, offset: [-1, 28] })
// 定位到该点
emitter.emit('setMapCenter', { location: [row.jd, row.wd], zoomLevel: 15 })
}
}
const listTitle = ref('一级警情')
const change = (row) => {
changeState.value = !changeState.value
listTitle.value = changeState.value ? '一级警情' : '重大事件'
getList()
}
const zbData = ref()
// 事件处理函数
const coordStringHandler = (res) => {
if (res.type === "point") {
if (chooseShow.value) {
zbData.value = res.coord
} else {
proxy.$confirm('确定定位吗?', "警告", { type: "warning" }
).then(() => {
if (changeState.value) {
qcckPost({
jjdbh: rowData.value.jjdbh,
fxdwjd: res.coord[0],
fxdwwd: res.coord[1],
}, "/mosty-gsxt/lzJcjPjdb/updateJqJwd").then(resData => {
// emitter.emit("addPoint", { coords: [{jd:res.coord[0],wd:res.coord[1]}], icon: require("@/assets/point/jq.png"), flag: "jq" });
proxy.$message({ type: "success", message: "定位成功" });
emitter.emit('deletePointArea', 'jq');
getLzJcjPjdb()
})
} else {
qcckPost({
id: rowData.value.id,
jd: res.coord[0],
wd: res.coord[1],
}, "/mosty-gsxt/zdsj/updateEntity").then(resData => {
proxy.$message({ type: "success", message: "定位成功" });
emitter.emit('deletePointArea', 'sj');
getZdsj()
})
}
})
}
}
};
</script>
<style lang="scss" scoped>
@import "@/assets/css/homeScreen.scss";
.qbfkBox {
width: 100%;
height: 100%;
background-color: #07274d;
}
.title {
font-size: 18px;
font-weight: bold;
color: #008efc;
display: flex;
align-items: center;
gap: 10px;
}
.close-button {
width: 40px;
height: 40px;
background-color: rgba(255, 255, 255, 0.1);
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
color: white;
font-size: 20px;
transition: all 0.3s ease;
&:hover {
background-color: rgba(255, 255, 255, 0.2);
border-color: rgba(255, 255, 255, 0.3);
transform: scale(1.1);
}
&:active {
transform: scale(0.95);
}
}
.map-container {
flex: 1;
width: 100%;
height: 100%;
position: relative;
animation: fadeIn 0.5s ease-out 0.2s both;
}
.list {
position: absolute;
top: 70px;
right: 20px;
width: 350px;
height: 600px;
background-color: rgba(255, 255, 255, 0.1);
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 5px;
// padding: 10px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
background: #052249;
overflow: auto;
z-index: 3;
.titel {
background: url('~@/assets/images/bg17.png') no-repeat center center;
background-size: 100% 100%;
width: 100%;
height: 40px;
line-height: 40px;
font-size: 16px;
font-weight: bold;
color: white;
display: flex;
justify-content: space-between;
padding: 0 20px;
align-items: center;
.levelOneAlert {
margin-left: 20px;
}
.switchover {
font-size: 14px;
color: #ff6702;
font-weight: bold;
cursor: pointer;
}
}
.search {
padding: 10px;
display: flex;
flex-direction: column;
gap: 10px;
.jqdj-filter {
display: flex;
flex-wrap: wrap;
gap: 10px;
align-items: center;
color: white;
:deep(.el-checkbox) {
color: white;
margin-right: 10px;
}
:deep(.el-checkbox__label) {
color: white;
}
}
>div:last-child {
display: flex;
justify-content: space-between;
flex-wrap: nowrap;
}
.button-model {
margin-left: 10px;
}
}
.dataList {
height: calc(100% - 135px);
background-color: #052249;
overflow: auto;
padding: 5px 0;
.item {
background-color: #0a3a6e;
border-radius: 5px;
padding: 5px;
margin: 0 10px 5px;
}
.data-title {
color: white;
font-size: 14px;
line-height: 1.5;
padding: 2px 0;
}
.content {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
text-overflow: ellipsis;
}
.data-row {
display: flex;
justify-content: space-between;
align-items: center;
gap: 10px;
.data-title {
// flex: 1;
}
}
}
}
.button-container {
// background-color: rgb(0, 0, 0);
position: absolute;
bottom: 20px;
width: 50%;
left: 50%;
transform: translateX(-50%);
z-index: 1;
display: flex;
justify-content: center;
.but {
width: 155px;
height: 33px;
background-image: url('~@/assets/images/home_btns_right.png');
background-size: cover;
background-repeat: no-repeat;
background-position: center;
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 16px;
font-weight: bold;
}
.butOk {
width: 155px;
height: 33px;
background-image: url('~@/assets/images/home_btns_right_active.png');
background-size: cover;
background-repeat: no-repeat;
background-position: center;
}
}
.jqdj-popover {
:deep(.el-checkbox-group) {
display: flex;
flex-direction: column;
gap: 8px;
}
:deep(.el-checkbox) {
margin-right: 0;
}
}
.display-flex {
display: flex;
}
.imTyle {
display: flex;
align-items: center;
img {
margin-right: 4px;
}
}
// 动画效果
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(-20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
</style>