This commit is contained in:
lcw
2025-07-21 17:47:27 +08:00
parent 1b567a8e75
commit 30d5a663ef
111 changed files with 1663 additions and 393 deletions

View File

@ -404,6 +404,18 @@ export const JczdeleteById = (id) => {
method: "delete"
});
};
// 检查站详情
export const JczselectById = (params) => {
return request({
url: api + `/jcz/selectById`,
method: "get",
params
});
};
//盘查管理
// 人
export const BpcryselectCrewList = (params) => {
@ -438,11 +450,11 @@ export const GjrytxeditEntity = (data) => {
});
};
// 查询过检人员图像
export const GjrytxselectPage = (data) => {
export const GjrytxselectPage = (params) => {
return request({
url: api + `/jczGjrytx/selectPage`,
method: "get",
data
params
});
};
// 删除过检人员图像
@ -670,3 +682,35 @@ export const tbJczXfbbdeleteJyQxzb = (data) => {
data
});
};
/**
* 新增摄像头
*/
export const sxtBatch = (data) => {
return request({
url: api + `/tbJczSxt/batch`,
method: "post",
data
});
};
/**
* 完成报备
*/
export const finishEntity = (id) => {
return request({
url: api + `/tbJczXfbb/finishEntity/${id}`,
method: "get",
});
};
/**
* 获取摄像头列表
*/
export const sxtGetList = (data) => {
return request({
url: api + `/tbJczSxt/getList`,
method: "POST",
data
});
};

330
src/api/service.js Normal file
View File

@ -0,0 +1,330 @@
import request from "@/utils/request";
const api = "/mosty-api/mosty-jmxf";
const apibase = "/mosty-api/mosty-jmxf";
export const http = {
// 获取视频ws地址
getSpWs: (params) => {
return request({
url: "/jcApi/api/haikang/cameras/getws",
method: "GET",
params
});
},
// 警力 全部list
getJlAllList: (params) => {
return request({
url: api + "/jlqk/jmjl/qbList",
method: "GET",
params
});
},
// 警力 在岗list
getJlZgList: (params) => {
return request({
url: api + "/jlqk/jmjl/zgList",
method: "GET",
params
});
},
// 街面警力 - 民警辅警统计
getJmjlDate: (params) => {
return request({
url: api + "/tbQwXfbb/selectMfjCount",
method: "GET",
params
});
},
// 街面警力 - 民警list
getJmjlDateMJList: (params) => {
return request({
url: api + "/jlqk/jmjl/mjlb",
method: "GET",
params
});
},
// 街面警力 - fu警list
getJmjlDateFJList: (params) => {
return request({
url: api + "/jlqk/jmjl/fjlb",
method: "GET",
params
});
},
// 警力情况 - 警力全部
getJlAll: (params) => {
return request({
url: api + "/jlqk/jmjl/qb",
method: "GET",
params
});
},
// 警力情况 - 警力在岗
getJlZg: (params) => {
return request({
url: api + "/jlqk/jmjl/zg",
method: "GET",
params
});
},
// 警力情况 - 民警全部
getMjAll: (params) => {
return request({
url: api + "/jlqk/mj/qbmj",
method: "GET",
params
});
},
// 警力情况 - 民警在岗
getMjZg: (params) => {
return request({
url: api + "/jlqk/mj/zgmj",
method: "GET",
params
});
},
// 警力情况 - 民警全部
getMjAllList: (params) => {
return request({
url: api + "/jlqk/mj/qbmj",
method: "GET",
params
});
},
// 警力情况 - 民警在岗
getMjZgList: (params) => {
return request({
url: api + "/jlqk/mj/zgmj",
method: "GET",
params
});
},
// 警力情况 - 辅警全部
getFjAll: (params) => {
return request({
url: api + "/jlqk/fj/qbfj",
method: "GET",
params
});
},
// 警力情况 -辅警在岗
getFjZg: (params) => {
return request({
url: api + "/jlqk/fj/zgfj",
method: "GET",
params
});
},
// 可抽调 -民警 - 辅警
getKcd(params) {
return request({
url: api + "/jlqk/kcd/zbtj",
method: "GET",
params: params
});
},
// 警力情况 - 辅警全部列表
getFjAllList: (params) => {
return request({
url: api + "/jlqk/fj/qblb",
method: "GET",
params
});
},
// 警力情况 - 辅警在岗列表
getFjAllListZG: (params) => {
return request({
url: api + "/jlqk/fj/zglb",
method: "GET",
params
});
},
// 警力情况 -请休假Mj-FJ
getRest: (params) => {
return request({
url: api + "/jlqk/qxj/mjfjtj",
method: "GET",
params
});
},
// 街面警力统计 app查询界面警力民警辅警数量
getJmjlTj: (data) => {
return request({
url: api + "/tbQwXfbb/selectMfjCount",
method: "GET",
params: data
});
},
// 请休假
getQxj: (data) => {
return request({
url: api + "/jlqk/qxj/mjfjtj",
method: "GET",
params: data
});
},
// 警力情况 -请休假Mj
getRestMj: (params) => {
return request({
url: api + "/jlqk/qxj/mjlb",
method: "GET",
params
});
},
// 警力情况 -请休假FJ
getRestFj: (params) => {
return request({
url: api + "/jlqk/qxj/fjlb",
method: "GET",
params
});
},
// 勤务列表 - 警力清单
getJlList: (params) => {
return request({
url: api + "/tbQwBmjlbb/getJlqdList",
method: "GET",
params
});
},
// 勤务列表 - 不在岗警力清单
getBZGlist: (params) => {
return request({
url: api + "/qwlb/bzgjlqd",
method: "GET",
params
});
},
// 大屏首页统计 - 在岗警力 - 民警
getJlmj: (params) => {
return request({
url: api + "/jlqk/mj/zglb",
method: "GET",
params
});
},
getJlfj: (params) => {
return request({
url: api + "/jlqk/fj/zglb",
method: "GET",
params
});
},
getJlqbmj: (params) => {
return request({
url: api + "/jlqk/mj/qblb",
method: "GET",
params
});
},
// 大屏首页统计 - 街面巡组 - 计划 列表
getJMXZ: (params) => {
return request({
url: api + "/tbQwXfbb/selectJhjmxzList",
method: "GET",
params
});
},
// 大屏首页统计 - 街面巡组 - 实际 列表
selectSjjmxzList: (params) => {
return request({
url: api + "/tbQwXfbb/selectSjjmxzList",
method: "GET",
params
});
},
// 大屏首页统计 - 街面力量 - 计划、实际
getJMLL: (params) => {
return request({
url: api + "/tbQwXfbb/selectJmllList",
method: "GET",
params
});
},
// 大屏首页统计 - 街面警力- 民警
getjMJLmj: (params) => {
return request({
url: api + "/tbQwXfbb/selectJmllList",
method: "GET",
params
});
},
// 大屏首页统计- 可抽查 - 值班
getZB: (params) => {
return request({
url: api + "/jlqk/kcd/zbtj",
method: "GET",
params
});
},
// 大屏首页统计- 可抽查 - 辅警列表
getKccFjList: (params) => {
return request({
url: api + "/jlqk/kcd/fjlb",
method: "GET",
params
});
},
// 大屏首页统计- 可抽查 - 民警列表
getKccMjList: (params) => {
return request({
url: api + "/jlqk/kcd/mjlb",
method: "GET",
params
});
},
// 根据监控点编号进行云台操作
controllingSbbh: (data) => {
return request({
url: apibase + "/tbYsSxt/controlling",
method: "POST",
data
});
},
// 获取HLS地址
getGbHls: (params) => {
return request({
url: apibase + "/tbYsSxt/getGbHls",
method: "GET",
params
});
},
// 获取HLS地址
previewURLs: (params) => {
return request({
url: apibase + "/tbYsSxt/previewURLs",
method: "GET",
params
});
},
// 获取回放地址
rebackURLs: (params) => {
return request({
url: apibase + "/tbYsSxt/playbackURLs",
method: "GET",
params
});
},
}

26
src/api/yszx.js Normal file
View File

@ -0,0 +1,26 @@
import request from "@/utils/request";
const api = "/mosty-api/mosty-yszx";
/*
* 查询摄像头列表
* return promise 查询摄像头列表
*/
export const ysSxtGetList = (data = {}) => {
return request({
url: api + "/tbYsSxt/getList",
method: "POST",
data
});
};
/**
* 获取摄像头列表
* @param {*} data
*/
export const ysSxtgetPageList = (data = {}) => {
return request({
url: api + "/tbYsSxt/getPageList",
method: "POST",
data
});
};

View File

@ -116,6 +116,7 @@
.relative {
position: relative;
}
.absolute {
position: absolute;
}
@ -159,9 +160,11 @@
.flex {
display: flex;
}
.flex-grow1 {
flex-grow: 1;
}
.shrink0 {
flex-shrink: 0;
}
@ -169,6 +172,7 @@
.flex-warp {
flex-wrap: wrap;
}
.flex-nowrap {
flex-wrap: nowrap;
}
@ -180,6 +184,7 @@
.just-between {
justify-content: space-between;
}
.just-around {
justify-content: space-around;
}
@ -207,11 +212,13 @@
.align-bottom {
align-items: flex-end;
}
.flexcc {
display: flex;
justify-content: center;
align-items: center;
}
.flexcb {
display: flex;
justify-content: space-between;
@ -317,11 +324,11 @@
}
.ww#{$i} {
width: #{$i}+ "%";
width: #{$i}+"%";
}
.hh#{$i} {
height: #{$i}+ "%";
height: #{$i}+"%";
}
//高度
@ -333,26 +340,32 @@
.lh#{$i} {
line-height: #{$i}px;
}
//自适应大号字体(通常为统计数字 18-30)
.font_size_big {
font-size: clamp(1.125rem, -0.894rem + 2.31vw, 1.875rem);
}
//自适应一号字体(通常为一级标题 14-18)
.font_size_title {
font-size: clamp(0.875rem, 0.37rem + 0.58vw, 1.063rem);
}
//自适应统计字体(通常为统计数字 14-22)
.font_size1 {
font-size: clamp(0.875rem, -0.471rem + 1.54vw, 1.375rem);
}
//自适应二号字体(通常为二级标题 14-16)
.font_size2 {
font-size: clamp(0.75rem, 0.077rem + 0.77vw, 1rem);
}
//自适应普通字体(通常为默认大小 10-14)
.font_size_default {
font-size: clamp(0.625rem, -0.048rem + 0.77vw, 0.875rem);
}
.flex#{$i} {
flex: #{$i};
}
@ -364,9 +377,29 @@
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: "HANYILINGXINTIJIAN";
src: url("~@/assets/font/HANYILINGXINTIJIAN-1.TTF");
font-weight: normal;
font-style: normal;
}
/* 自定义滚动条样式 */
::-webkit-scrollbar {
width: 0.5em;
height: 0.5em;
}
::-webkit-scrollbar-track {
background: #000000;
}
::-webkit-scrollbar-thumb {
background: #021b31;
border-radius: 0.25em;
}
::-webkit-scrollbar-thumb:hover {
background: #011733cd;
}

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">
@ -75,7 +74,7 @@ const props = defineProps({
});
try {
const userInfo = getItem("deptId")[0].deptCode;
} catch (error) { }
} catch (error) {}
let map;
let mapLayer;
let mapLayer1;
@ -89,33 +88,27 @@ 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: 10
},
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(
"http://89.0.23.24/PGIS_S_TileMapServer/Maps/XZDJ_SL/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();
});
mapUtil.value = new MapUtil(map);
@ -135,6 +128,8 @@ onMounted(() => {
});
//
emitter.on("addPointArea", (obj) => {
console.log(obj);
mapUtil.value.makerSki(obj);
});
//
@ -173,7 +168,7 @@ onMounted(() => {
});
// 线
emitter.on("echoLine", (res) => {
mapUtil.value.createLine(res, res.flag);
mapUtil.value.createLine(res);
});
//geojson
emitter.on("setBoundarys", (res) => {
@ -204,6 +199,11 @@ onMounted(() => {
mapUtil.value.diffusionCircle(res);
});
//
emitter.on("removeElementAll", () => {
mapUtil.value.removeElementAll();
});
//
emitter.on("showGapText", (obj) => {
mapUtil.value.gapText(obj);
@ -302,6 +302,7 @@ onUnmounted(() => {
emitter.off("diffusionCircle");
emitter.off("SsCircle");
emitter.off("ClearssCircle");
emitter.off("removeElementAll");
});
</script>
@ -324,35 +325,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">
@ -74,7 +75,7 @@ const props = defineProps({
});
try {
const userInfo = getItem("deptId")[0].deptCode;
} catch (error) {}
} catch (error) { }
let map;
let mapLayer;
let mapLayer1;
@ -88,27 +89,32 @@ 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: 7,
maxZoom: 18,
});
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_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);
@ -128,8 +134,6 @@ onMounted(() => {
});
// 撒点
emitter.on("addPointArea", (obj) => {
console.log(obj);
mapUtil.value.makerSki(obj);
});
// 鼠标滑过提示文字的点位
@ -168,7 +172,7 @@ onMounted(() => {
});
// 回显线
emitter.on("echoLine", (res) => {
mapUtil.value.createLine(res);
mapUtil.value.createLine(res, res.flag);
});
//创建边界面geojson
emitter.on("setBoundarys", (res) => {
@ -199,11 +203,6 @@ onMounted(() => {
mapUtil.value.diffusionCircle(res);
});
// 清除全部覆盖物
emitter.on("removeElementAll", () => {
mapUtil.value.removeElementAll();
});
// 展示盘曲
emitter.on("showGapText", (obj) => {
mapUtil.value.gapText(obj);
@ -302,7 +301,6 @@ onUnmounted(() => {
emitter.off("diffusionCircle");
emitter.off("SsCircle");
emitter.off("ClearssCircle");
emitter.off("removeElementAll");
});
</script>
@ -325,29 +323,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

@ -0,0 +1,334 @@
<template>
<div>
<el-dialog
:title="titleValue"
width="1400px"
v-model="modelValue"
@close="closed"
>
<div v-if="modelValue">
<el-form :model="listQuery" class="mosty-from-wrap" :inline="true">
<el-form-item label="所属部门">
<MOSTY.Department
width="100%"
clearable
v-model="listQuery.ssbmdm"
/>
</el-form-item>
<el-form-item label="感知源名称">
<el-input
v-model="listQuery.sbmc"
placeholder="请输入感知源名称"
clearable
/>
</el-form-item>
<el-form-item>
<el-button type="success" @click="handleFilter">查询</el-button>
<el-button type="info" @click="reset()"> 重置 </el-button>
</el-form-item>
</el-form>
<div class="tabBox" style="margin-top: 0px" v-if="modelValue">
<el-table
ref="multipleUserRef"
@selection-change="handleSelectionChange"
:data="tableData"
:highlight-current-row="props.Single"
border
v-loading="loading"
style="width: 100%"
:row-key="keyid"
height="450"
>
<el-table-column
type="selection"
width="55"
:reserve-selection="true"
v-if="!props.Single"
/>
<el-table-column width="55" #default="{ row }" v-else>
<el-radio v-model="ridioIndex" :label="row.id"></el-radio>
</el-table-column>
<el-table-column
label="序号"
type="index"
align="center"
sortable
width="80"
/>
<el-table-column
sortable
prop="ssbm"
label="所属部门"
show-overflow-tooltip
align="center"
></el-table-column>
<el-table-column
sortable
prop="sbmc"
show-overflow-tooltip
align="center"
label="感知源名称"
>
</el-table-column>
<el-table-column
show-overflow-tooltip
align="center"
label="厂商名称"
prop="csmc"
/>
<el-table-column
prop="sbbh"
show-overflow-tooltip
align="center"
label="设备编号"
>
</el-table-column>
<el-table-column
sortable
prop="jd"
show-overflow-tooltip
label="经度"
align="center"
>
</el-table-column>
<el-table-column
sortable
prop="wd"
show-overflow-tooltip
label="纬度"
align="center"
>
</el-table-column>
</el-table>
</div>
<div class="fenye">
<el-pagination
class="pagination"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="listQuery.pageCurrent"
:page-sizes="[2, 5, 10, 20]"
:page-size="listQuery.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
></el-pagination>
</div>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="closed">取消</el-button>
<el-button type="primary" @click="onComfirm">确认</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup>
import * as rule from "@/utils/rules.js";
import * as MOSTY from "@/components/MyComponents/index";
import { ElMessage } from "element-plus";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import {ysSxtgetPageList} from '@/api/yszx.js'
import {
defineProps,
watch,
ref,
onMounted,
nextTick,
getCurrentInstance
} from "vue";
const { proxy } = getCurrentInstance();
const { D_BZ_JCZLX } = proxy.$dict("D_BZ_JCZLX");
const props = defineProps({
//是否显示
modelValue: {
type: Boolean,
required: true
},
//标题
titleValue: {
type: String,
default: "选择环林卡口"
},
//是否单选
Single: {
type: Boolean,
default: false
},
//已经选中得数据回显
data: {
type: Array,
default: []
}
});
const keyid = (row) => {
return row.id;
};
const ridioIndex = ref(null);
const total = ref(0);
const listQuery = ref({
pageCurrent: 1,
pageSize: 20,
jczmc: "",
ssbmdm: ""
});
const tableData = ref([]);
const loading = ref(false);
const emits = defineEmits(["update:modelValue", "choosedJcz"]);
const closed = () => {
listQuery.value.jczmc = "";
emits("update:modelValue", false);
};
const reset = () => {
listQuery.value = {
pageCurrent: 1,
pageSize: 20,
jczmc: "",
ssbmdm: ""
};
getListData();
};
// 判断传进来的选中数据和加载的选中数据不满足的数据
const checkopenList = ref([]);
// 确定选中
const onComfirm = () => {
//单选
if (props.Single) {
if (![ridioIndex.value][0]) {
proxy.$message.warning("请选择环林卡口");
return;
}
const info = tableData.value.find((item) => {
return item.id === ridioIndex.value;
});
emits("choosedJcz", JSON.parse(JSON.stringify(info)));
} else {
//多选
const jczList = JSON.parse(JSON.stringify(multipleSelectionUser.value));
if (jczList.length === 0) {
proxy.$message.warning("请选择环林卡口");
return;
}
emits("choosedJcz", [...jczList, ...checkopenList.value]);
}
closed();
};
onMounted(() => {
getListData();
});
/**
* pageSize 改变触发
*/
const handleSizeChange = (currentSize) => {
listQuery.value.pageSize = currentSize;
getListData();
};
/**
* 页码改变触发
*/
const handleCurrentChange = (currentPage) => {
listQuery.value.pageCurrent = currentPage;
getListData();
};
//检查站数据
const getListData = async () => {
loading.value = true;
ysSxtgetPageList(listQuery.value)
.then((res) => {
tableData.value = res?.records;
loading.value = false;
multipleUser(props.data, tableData.value);
total.value = Number(res.total);
})
.catch(() => {
loading.value = false;
});
};
const handleFilter = () => {
listQuery.value.pageCurrent = 1;
getListData();
};
const multipleUserRef = ref(null);
const multipleSelectionUser = ref([]);
const handleSelectionChange = (val) => {
multipleSelectionUser.value = val;
if (checkopenList.value) {
for (let i = 0; i < multipleSelectionUser.value.length; i++) {
const l = multipleSelectionUser.value[i];
for (let j = 0; j < checkopenList.value.length; j++) {
const z = checkopenList.value[j];
if (l.id == z.id) {
checkopenList.value.splice(j, 1);
}
}
}
}
};
//回显--用于多选表格
function multipleUser(row, list) {
if (row) {
if (props.Single) {
row.forEach((item) => {
list.forEach((select) => {
if (typeof item == "object") {
if (item.id == select.id) {
ridioIndex.value = item.id;
}
} else {
if (item == select.id) {
ridioIndex.value = item;
}
}
});
});
} else {
row.forEach((item) => {
list.forEach((select) => {
if (item.id == select.id) {
if (multipleUserRef.value) {
multipleUserRef.value.toggleRowSelection(select, true);
}
}
});
});
}
}
}
watch(
() => props.modelValue,
(val) => {
if (val === true) {
ridioIndex.value = "";
handleFilter();
}
}
);
watch(
() => props.data,
(val) => {
if (multipleUserRef.value) multipleUser(val, tableData.value);
checkopenList.value = JSON.parse(JSON.stringify(val));
}
);
</script>
<style lang="scss" scoped>
@import "@/assets/css/layout.scss";
@import "@/assets/css/element-plus.scss";
::v-deep .el-form--inline {
padding-left: 0 !important;
}
::v-deep .el-radio__label {
display: none;
}
::v-deep .el-table__body tr.current-row > td.el-table__cell {
// background: #106fdc;
}
</style>

View File

@ -0,0 +1,48 @@
<template>
<div style="width: 100%; height: 100%; overflow: hidden;">
<iframe v-if="urls" :src="'http://80.2.22.233:56233?sbbh=' + urls" style="border: none; width: 100%; height: 100%; "
allowfullscreen allowtransparency scrolling="no"></iframe>
<iframe v-else src="https://stream7.iqilu.com/10339/upload_transcode/202002/09/20200209105011F0zPoYzHry.mp4" style="border: none; width: 100%; height: 100%; "
allowfullscreen allowtransparency scrolling="no"></iframe>
</div>
</template>
<script setup>
import { http } from "@/api/service";
import { ref, onMounted, onUnmounted, watch, getCurrentInstance } from "vue";
const props = defineProps({
sbbh: String
})
const { proxy } = getCurrentInstance();
const urls = ref(null)
watch(() => props.sbbh, (val) => {
if (!val) {
proxy.$message({
message: "获取不到视频流,播放失败!!!",
grouping: true,
type: "info"
});
} else {
getUrl(val)
}
}, { immediate: true })
function getUrl(sbbh) {
http.previewURLs({ sbbh: sbbh, protocol: 'sbbh' }).then((res) => {
console.log(res);
let data = JSON.parse(res);
if (data && data.url) {
urls.value = data.data.url
} else {
proxy.$message({
message: "获取不到视频流,播放失败!!!",
grouping: true,
type: "info"
});
}
})
}
</script>
<style lang="scss" scoped></style>

View File

@ -353,7 +353,7 @@ export const publicRoutes = [
"@/views/backOfficeSystem/peopleManag/InspectedVehicle/index"
),
meta: {
title: "过检车辆管理",
title: "过检车辆管理",
icon: "article"
}
}

View File

@ -38,7 +38,6 @@ service.interceptors.response.use(
// 请求成功的处理
(response) => {
const { success, code, msg, message, data } = response.data;
console.log("data", code, response.data);
// 需要判断当前请求是否成功
if (success && code === 10000) {
return data; // 成功后返回解析后的数据

View File

@ -87,12 +87,16 @@
</template>
<script setup>
import { ref } from "vue";
import { onMounted, ref } from "vue";
import Empty from "@/components/MyComponents/Empty/index.vue";
import { jczqueryById } from "@/api/mosty-jcz";
import emitter from "@/utils/eventBus.js";
const warningList = ref({ qxList: [], ryList: [], clList: [] ,sbList:[]});
let warningList = ref({ qxList: [], ryList: [], clList: [] ,sbList:[]});
onMounted(() => {
emitter.on("getjczqueryById", (res) => {
warningListValue(res)
})
});
const show = ref(1);
const props = defineProps({
jczId: {
@ -107,19 +111,23 @@ const showchenge = (val) => {
const getjczqueryById = () => {
jczqueryById({ jczid: props.jczId }).then((res) => {
if (res) {
emitter.emit("chengZ", res);
warningList.value.qxList = res.qxList
warningListValue(res)
});
};
const warningListValue = (res) => {
if (res) {
warningList.value={}
warningList.value.qxList =res.qxList&&res.qxList.length>0
? res.qxList.filter((item) => item.qxsl > 0)
: [];
warningList.value.ryList = res.ryList ? res.ryList : [];
warningList.value.clList = res.clList ? res.clList : [];
warningList.value.sbList = [...res.tcList,...res.zdList]
warningList.value.ryList = res.ryList.length>0 ? res.ryList : [];
warningList.value.clList = res.clList.length>0 ? res.clList : [];
warningList.value.sbList = [...res.tcList, ...res.zdList]
emitter.emit("chengZ", res);
} else {
warningList.value = res;
}
});
};
}
getjczqueryById();
</script>
@ -240,4 +248,5 @@ getjczqueryById();
font-size: 12px;
margin-left: 10px;
}
</style>

View File

@ -1,49 +1,64 @@
<template>
<div class="image-carousel">
<div class="control-button prev" @click="prevImage">
<img src="@/assets/images/icon_08.png" alt="">
</div>
<div class="carousel-container">
<div class="hh100" :style="{transform: `translateX(-${currentIndex * 100}%)`}">
<ul class="image-wrapper" style="margin-bottom:1%;">
<li v-for="(image, index) in images" :key="index" class="image-item">
<img :src="image" alt="carousel image">
</li>
</ul>
<ul class="image-wrapper">
<li v-for="(image, index) in images" :key="index" class="image-item">
<img :src="image" alt="carousel image">
</li>
</ul>
</div>
<div class="control-button next" @click="nextImage">
<img src="@/assets/images/icon_07.png" alt="">
</div>
</div>
<el-carousel style="height: 100%;" motion-blur indicator-position="none" @change="handleCarouselChange"
:autoplay="false">
<el-carousel-item v-for="(item, index) in listSxt" :key="index">
<div class="video-grid" v-if="activeIndex == index">
<div v-for="(items,indexs) in item" :key="indexs" class="video-cell">
<div class="iconFont" @click.stop="showchenge(items)">
<el-icon :size="20"><UploadFilled /></el-icon>
</div>
<WsIframe :sbbh="items.sbbh" />
</div>
</div>
</el-carousel-item>
</el-carousel>
</div>
</template>
<script>
export default {
data() {
return {
currentIndex: 0,
images: [
require('@/assets/images/person.png'),
require('@/assets/images/person.png'),
require('@/assets/images/person.png'),
require('@/assets/images/person.png')
]
}
},
methods: {
prevImage() {
this.currentIndex = this.currentIndex > 0 ? this.currentIndex - 1 : this.images.length - 1
},
nextImage() {
this.currentIndex = this.currentIndex < this.images.length - 1 ? this.currentIndex + 1 : 0
}
<script setup>
import { ref, watch, computed, onMounted, onUnmounted, reactive,nextTick } from 'vue'
import WsIframe from '@/components/wsIframe/index.vue'
import { useRoute } from "vue-router"
import { sxtGetList } from '@/api/mosty-jcz.js'
import emitter from "@/utils/eventBus.js";
const activeIndex = ref(0)
const cdList=ref([])
const listSxt=ref([1])
const handleCarouselChange = (index) => {
activeIndex.value = index
}
const getSxtGetList = (id) => {
const jczid = {
jczid: id
}
sxtGetList(jczid).then(res => {
listSxt.value= Array.from({ length:Math.ceil(res.length / 12)==0?1:Math.ceil(res.length / 12) }, (_, row) => {
return res.slice(row * 12, row * 12 + 12)
}
);
cdList.value = listSxt.value[0].length < 4 ? listSxt.value[0]: listSxt.value[0].slice(0,4)
emitter.emit("getSxtGetList", cdList.value )
}).finally(()=>{
})
}
const route = useRoute()
onMounted(() => {
const id = route.query.id
getSxtGetList(id)
})
const showchenge = (item) => {
const index = cdList.value.indexOf(item);
if (index !== -1) {
// 如果数字已存在,先移除它
cdList.value.splice(index, 1);
}
// 添加到最前面
cdList.value.unshift(item);
emitter.emit("getSxtGetList", cdList.value )
}
</script>
@ -54,6 +69,7 @@ export default {
position: relative;
padding: 30px 20px;
box-sizing: border-box;
.carousel-container {
width: 100%;
height: 100%;
@ -71,6 +87,7 @@ export default {
width: 24%;
margin: 0 1%;
height: 100%;
img {
width: 100%;
height: 100%;
@ -86,12 +103,58 @@ export default {
transition: all 0.3s;
color: #fff;
z-index: 1;
&.prev {
left: 0;
}
&.next {
right: 0;
}
}
}
</style>
.video-grid {
display: grid;
grid-template-columns: repeat(6, 1fr);
/* 6列 */
grid-template-rows: repeat(2, auto);
/* 2行 */
gap: 10px;
height: 100%;
overflow: auto;
}
::v-deep .el-carousel__container {
height: 100% !important;
}
::v-deep .image-carousel {
// padding: 0 !important;;
}
/* 自定义滚动条样式 */
::-webkit-scrollbar {
width: 0.5em;
height: 0.5em;
}
::-webkit-scrollbar-track {
background: #000000;
}
::-webkit-scrollbar-thumb {
background: #021b31;
border-radius: 0.25em;
}
::-webkit-scrollbar-thumb:hover {
background: #011733cd;
}
.video-cell{
position: relative;
}
.iconFont{
position: absolute; top: 10px; text-align: right; width: 100%;
}
</style>

View File

@ -1,53 +1,35 @@
<template>
<div class="video-more-container">
<div class="switch-btn prev" @click="handlePrev">
<img src="@/assets/images/icon_08.png" alt="">
</div>
<div class="video-grid">
<div v-for="index in 4" :key="index" class="video-cell">
<div class="video-wrapper">
<video class="video-player" controls>
<source src="" type="video/mp4">
</video>
<div class="video-controls">
<div class="time-display">01:32</div>
<div class="control-buttons">
<i class="el-icon-video-play"></i>
<i class="el-icon-refresh-right"></i>
<i class="el-icon-full-screen"></i>
</div>
<el-carousel style="height: 100%;" motion-blur indicator-position="none" :autoplay="false"
@change="handleCarouselChange">
<el-carousel-item v-for="(item,index) in sbList" :key="index" >
<div class="video-grid" v-if="activeIndex==index">
<div v-for="(items,indexs) in item" :key="indexs" class="video-cell">
<WsIframe :sbbh="items.sbbh" />
</div>
</div>
</div>
</div>
<div class="switch-btn next" @click="handleNext">
<img src="@/assets/images/icon_07.png" alt="">
</div>
</el-carousel-item>
</el-carousel>
</div>
</template>
<script>
export default {
name: 'VideoMore',
data() {
return {
currentPage: 1,
totalPages: 3
}
},
methods: {
handlePrev() {
if (this.currentPage > 1) {
this.currentPage--
}
},
handleNext() {
if (this.currentPage < this.totalPages) {
this.currentPage++
}
}
}
<script setup>
import { ref ,onMounted} from 'vue'
import WsIframe from '@/components/wsIframe/index.vue'
import emitter from "@/utils/eventBus.js";
const activeIndex = ref(0)
const handleCarouselChange = (index) => {
activeIndex.value=index
}
const sbList = ref([1])
onMounted(()=>{
emitter.on("getSxtGetList", (res) => {
sbList.value= Array.from({ length:Math.ceil(res.length / 4)==0?1:Math.ceil(res.length / 4) }, (_, row) => {
return res.slice(row * 4, row * 4 + 4)
}
);
})
})
</script>
<style lang="scss" scoped>
@ -79,14 +61,16 @@ export default {
}
.video-grid {
padding: 10px;
display: grid;
grid-template-columns: repeat(2, 1fr);
grid-template-rows: repeat(2, 1fr);
gap: 20px;
gap: 10px;
height: 100%;
}
.video-cell {
position: relative;
background: url('~@/assets/images/bg13.png') no-repeat;
background-size: 100% 100%;
@ -128,14 +112,19 @@ export default {
.control-buttons {
display: flex;
gap: 15px;
i {
cursor: pointer;
font-size: 20px;
&:hover {
color: #409EFF;
}
}
}
}
</style>
::v-deep .el-carousel__container {
height: 100% !important;
}
</style>

View File

@ -302,16 +302,22 @@ const _onSave = () => {
break;
case "02":
listQuery.value.bcKts = 2;
break;
case "03":
listQuery.value.bcKts = 4;
break;
case "04":
listQuery.value.bcKts = 5;
break;
case "05":
listQuery.value.bcKts = 6;
break;
case "06":
listQuery.value.bcKts = 7;
break;
case "07":
listQuery.value.bcKts = 8;
break;
}
if (listQuery.value.jczList) {
listQuery.value.jczid = listQuery.value.jczList.id;
@ -361,6 +367,8 @@ const fz = (val) => {
//
const close = () => {
dialogForm.value = false;
mjData.value = [];
fjData.value = [];
listQuery.value = {};
};

View File

@ -25,6 +25,7 @@
<el-link type="primary" @click="addEdit('edit', row)">编辑</el-link>
<el-link type="primary" @click="delDictItem(row.id)">删除</el-link>
<el-link type="primary" @click="addEdit('detail', row)">详情</el-link>
<el-link type="primary" @click="endreporting( row.id)" v-if="row.bbZt !== '03'">结束报备</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
@ -44,7 +45,7 @@ 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 { XfbbselectPage, JczXfbb } from "@/api/mosty-jcz.js";
import { XfbbselectPage, JczXfbb,finishEntity } from "@/api/mosty-jcz.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance();
const {
@ -152,6 +153,21 @@ const delDictItem = (ids) => {
})
.catch(() => { });
};
const endreporting = (id) => {
proxy
.$confirm("确定要结束报备", "警告", { type: "warning" })
.then(() => {
finishEntity(id).then(res => {
proxy.$message({ type: "success", message: "报备结束" });
getjczgetXfllList();
})
})
.catch(() => { });
}
getjczgetXfllList();
// 新增
const addEdit = (type, row) => {

View File

@ -81,7 +81,7 @@ const searchConfiger = ref([
},
{
label: "车前部物品特征代码",
prop: "zqlx",
prop: "cqbwptzdm",
placeholder: "车前部物品特征代码",
showType: "input"
},
@ -89,7 +89,7 @@ const searchConfiger = ref([
{
label: "车辆异常痕迹代码",
prop: "clychjdm",
placeholder: "请选择环林卡口类型",
placeholder: "请输入车辆异常痕迹代码",
showType: "input"
}
]);

View File

@ -117,7 +117,7 @@ const searchConfiger = ref([
},
{
label: "过检人员身份证号",
prop: "zqlx",
prop: "gjrysfzh",
placeholder: "请输入过检人员身份证号",
showType: "input"
}

View File

@ -87,7 +87,7 @@
<el-form-item label="关联GPSID" prop="glgpsid">
<el-input :disabled="forbidden"
v-model="listQuery.glgpsid"
placeholder="请输入装备型号"
placeholder="请输入关联GPSID"
clearable
style="width: 100%"
/>
@ -95,7 +95,7 @@
<el-form-item label="设备sim卡号" prop="sbsim">
<el-input :disabled="forbidden"
v-model="listQuery.sbsim"
placeholder="请输入装备型号"
placeholder="请输入设备sim卡号"
clearable
style="width: 100%"
/>

View File

@ -71,7 +71,7 @@ const searchConfiger = ref([
{
label: "身份证号",
prop: "sfzh",
placeholder: "请输入预警对象",
placeholder: "请输入身份证号",
showType: "input"
},
{

View File

@ -83,7 +83,7 @@
clearable
/>
</el-form-item>
<el-form-item style="width: 100%" prop="sklList" label="标签">
<!-- <el-form-item style="width: 40%" prop="sklList" label="标签">
<el-select :disabled="forbidden"
v-model="listQuery.sklList"
placeholder="请选择标签"
@ -96,8 +96,13 @@
:label="dict.label"
></el-option>
</el-select>
</el-form-item> -->
<el-form-item style="width: 40%" label="环林卡口名称">
<div class="diviput" @click="!forbidden?showJcz = true:''">
<span v-if="listQuery.jczmc">{{ listQuery.jczmc }}</span>
<span class="placeholder" v-else> 请选择布控卡口</span>
</div>
</el-form-item>
<el-form-item style="width: 85%" prop="jd" label="坐标位置">
<div class="latlng flex">
<el-input :disabled="true"
@ -122,6 +127,7 @@
</el-form>
</div>
</div>
<Jczloder v-model="showJcz" :Single="true" @choosedJcz="JczMsg" :data="[]" />
</template>
<script setup>
@ -129,6 +135,7 @@ import { ref, reactive, onMounted } from "vue";
import { TtbJczSxtAdd, Ttbgetupdate } from "@/api/mosty-jcz.js";
import * as MOSTY from "@/components/MyComponents/index";
import emitter from "@/utils/eventBus.js";
import Jczloder from "@/components/loder/Jczloder.vue";
import GdMap from "@/components/GdMap/index.vue";
import { ElMessage } from "element-plus";
const props = defineProps({
@ -216,6 +223,8 @@ const init = (type, row) => {
//保存
const _onSave = () => {
if (!formRef) return;
console.log(listQuery.value);
formRef.value.validate((valid, fields) => {
if (valid) {
if (pageType.value == "add") {
@ -226,6 +235,7 @@ const _onSave = () => {
});
} else {
Ttbgetupdate(listQuery.value).then((res) => {
ElMessage({ message: "修改成功", type: "success" });
emit("getjczgetXfllList");
close();
@ -235,7 +245,6 @@ const _onSave = () => {
console.log("error submit!", fields);
}
});
console.log();
};
//选择定位地图
const selectLocation = () => {
@ -269,7 +278,12 @@ const tableHeight1 = ref();
const tabHeightFn = () => {
tableHeight1.value = window.innerHeight - 450;
};
const showJcz = ref(false);
const JczMsg = (val) => {
listQuery.value.jczmc = val.jczmc;
listQuery.value.jczid = val.id;
};
defineExpose({ init });
</script>
@ -357,4 +371,20 @@ defineExpose({ init });
box-sizing: border-box;
background: #000;
}
.diviput {
width: 100%;
background-color: #ffffff;
border: 1px solid #c0c4cc;
color: #000;
height: 32px;
line-height: 32px;
padding: 0 10px;
border-radius: 5px;
.placeholder {
color: #b5b5b5;
}
}
.divData {
background-color:#f5f7fa ;
}
</style>

View File

@ -2,6 +2,12 @@
<div>
<div class="titleBox">
<PageTitle title="感知源管理">
<el-button :disabled="ids.length<=0" type="primary" @click="delDictItem(ids)" v-if="Auth">
<el-icon style="vertical-align: middle">
<CirclePlus />
</el-icon>
<span style="vertical-align: middle" >批量删除</span>
</el-button>
<el-button type="primary" @click="addEdit('add', '')" v-if="Auth">
<el-icon style="vertical-align: middle">
<CirclePlus />
@ -87,7 +93,7 @@ const searchConfiger = ref([
prop: "sblx",
placeholder: "感知源类型",
showType: "select",
options: D_BZ_GZSBLX
options: D_BZ_SBLX
}
]);
@ -97,7 +103,7 @@ const pageData = reactive({
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
showSelectType: "checkBox",
loading: false
},
total: 0,
@ -107,10 +113,8 @@ const pageData = reactive({
}, //分页
controlsWidth: 250, //操作栏宽度
tableColumn: [
{ label: "感知源名称", prop: "sbmc", showOverflowTooltip: true },
{ label: "编号", prop: "sbbh", showOverflowTooltip: true },
{ label: "地址", prop: "dzmc", showOverflowTooltip: true },
{
{ label: "所属部门", prop: "ssbm", showOverflowTooltip: true },
{
label: "感知源类型",
prop: "sblx",
showSolt: true,
@ -122,7 +126,10 @@ const pageData = reactive({
showSolt: true,
showOverflowTooltip: true
},
{ label: "所属部门", prop: "ssbm", showOverflowTooltip: true }
{ label: "感知源名称", prop: "sbmc", showOverflowTooltip: true },
{ label: "编号", prop: "sbbh", showOverflowTooltip: true },
{ label: "地址", prop: "dzmc", showOverflowTooltip: true },
]
});
const Auth = ref(true)
@ -159,15 +166,21 @@ const changeNo = (val) => {
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
};
const ids=ref([])
// 获取列表
// 删除
const delDictItem = (ids) => {
proxy
.$confirm("确定删除该数据?", "警告", { type: "warning" })
.then(() => {
gzydeleteList(ids).then((res) => {
// ElMessage({ message: "删除成功", type: "success" });
let idsList
if (Array.isArray(ids)) {
idsList=ids
}else{
idsList=[ids]
}
gzydeleteList(idsList).then((res) => {
ElMessage({ message: "删除成功", type: "success" });
pageData.pageConfiger.pageCurrent = 1;
getjczgetXfllList();
});
@ -191,6 +204,9 @@ const tabHeightFn = () => {
tabHeightFn();
};
};
const chooseData = (val) => {
ids.value=val.map(item=>item.id)
}
</script>
<style>

View File

@ -43,7 +43,7 @@
format="YYYY-MM-DD hh:mm:ss" value-format="YYYY-MM-DD hh:mm:ss" />
</el-form-item>
<el-form-item style="width: 40%" prop="czcs" label="处置措施">
<el-select :disabled="forbidden" v-model="listQuery.czcs" placeholder="请选择布控颜色">
<el-select :disabled="forbidden" v-model="listQuery.czcs" placeholder="请选择处置措施">
<el-option v-for="dict in dict.D_BZ_CZCS" :key="dict.value" :value="dict.value"
:label="dict.label"></el-option>
</el-select>

View File

@ -24,8 +24,8 @@
<template #bkfs="{ row }">
{{ row.bkfs=='01'?"全省布控":"精准布控" }}
</template>
<template #bkcs="{ row }">
<dict-tag :value="row.yjys" :options="D_BZ_CZCS" :tag="false" />
<template #czcs="{ row }">
<dict-tag :value="row.czcs" :options="D_BZ_CZCS" :tag="false" />
</template>
<!-- <template #bkzt="{ row }">
<dict-tag :value="row.bkzt" :options="D_BZ_RCBKZT" :tag="false" />
@ -72,14 +72,14 @@ const { D_BZ_BKYS,D_BZ_CZCS } = proxy.$dict(
);
const searchConfiger = ref([
{
label: "布控名称",
prop: "bkmc",
placeholder: "请输入布控名称",
label: "姓名",
prop: "xm",
placeholder: "请输入姓名",
showType: "input"
},
{
label: "证件号码",
prop: "bksfzh",
prop: "zjhm",
placeholder: "请输入证件号码",
showType: "input"
},
@ -139,7 +139,7 @@ const pageData = reactive({
},
{
label: "布控措施",
prop: "bkcs",
prop: "czcs",
showSolt: true,
}
]

View File

@ -42,7 +42,7 @@
format="YYYY-MM-DD hh:mm:ss" value-format="YYYY-MM-DD hh:mm:ss" />
</el-form-item>
<el-form-item style="width: 40%" prop="czcs" label="处置措施">
<el-select :disabled="forbidden" v-model="listQuery.czcs" placeholder="请选择布控颜色">
<el-select :disabled="forbidden" v-model="listQuery.czcs" placeholder="请选择处置措施">
<el-option v-for="dict in dict.D_BZ_CZCS" :key="dict.value" :value="dict.value"
:label="dict.label"></el-option>
</el-select>

View File

@ -28,7 +28,7 @@
{{ row.bkfs == '01' ? "全省布控" : "精准布控" }}
</template>
<template #bkcs="{ row }">
<dict-tag :value="row.yjys" :options="D_BZ_CZCS" :tag="false" />
<dict-tag :value="row.czcs" :options="D_BZ_CZCS" :tag="false" />
</template>
<!-- <template #bkzt="{ row }">
<dict-tag :value="row.bkzt" :options="D_BZ_RCBKZT" :tag="false" />
@ -74,16 +74,11 @@ const { D_BZ_BKYS, D_BZ_CZCS, D_BZ_CPHYS } = proxy.$dict(
"D_BZ_BKYS", "D_BZ_CZCS", "D_BZ_CPHYS"
);
const searchConfiger = ref([
{
label: "布控名称",
prop: "bkmc",
placeholder: "请输入布控名称",
showType: "input"
},
{
label: "证件号码",
prop: "bksfzh",
placeholder: "请输入证件号码",
label: "车牌号码",
prop: "cph",
placeholder: "请输入车牌号码",
showType: "input"
},

View File

@ -65,7 +65,12 @@ const { D_BZ_SF, D_BZ_MZ, D_BZ_XB, D_BZ_ZZMM,D_BZ_HYZK,D_BZ_WHCD } = proxy.$dict
"D_BZ_HYZK",
"D_BZ_WHCD"
);
const searchConfiger = ref([
const searchConfiger = ref([ {
showType: "department",
prop: "ssbmdm",
placeholder: "请选择所属部门",
label: "所属部门"
},
{
label: "姓名",
prop: "xm",
@ -85,12 +90,7 @@ const searchConfiger = ref([
showType: "select",
options: D_BZ_SF
},
{
showType: "department",
prop: "ssbmdm",
placeholder: "请选择所属部门",
label: "所属部门"
}
]);
const detailDiloag = ref();

View File

@ -0,0 +1,246 @@
<template>
<div class="dialog" v-if="dialogGzy">
<div class="head_box">
<span class="title">新增感知源</span>
<div>
<el-button size="small" type="primary" @click="_onSave">保存</el-button>
<el-button size="small" @click="close">关闭</el-button>
</div>
</div>
<div class="cntinfo">
<el-form ref="formRef" :model="listQuery" :rules="rules" :inline="true" label-position="top">
<el-form-item style="width: 40%" label="感知源">
<el-input v-model="JczMc" disabled />
</el-form-item>
<el-form-item style="width: 40%" label="感知源">
<div class="diviput" @click="showJcz = true">
<span v-if="listQuery.sxtList&&listQuery.sxtList.length>0">
<el-tag closable @close="handleClose(index)" v-for="(item, index) in listQuery.sxtList" :key="index"> {{
item.sbmc }} </el-tag>
</span>
<span class="placeholder" v-else> 请选择感知源</span>
</div>
</el-form-item>
</el-form>
</div>
</div>
<Gzyloder v-model="showJcz" :Single="false" @choosedJcz="GzyMsg" :data="data" />
</template>
<script setup>
import { ref, reactive, onMounted } from "vue";
import Gzyloder from '@/components/loder/Gzyloder.vue'
import { sxtBatch,JczselectById } from '@/api/mosty-jcz'
import { ElMessage } from "element-plus";
const emit=defineEmits(['getjczgetXfllList'])
const search = ref(null)
const listQuery = ref({})
onMounted(() => {
tabHeightFn()
console.log("xxxx");
});
const data = ref([])
const dialogGzy = ref(false)
const JczMc = ref()
// 初始化数据
const init = (row) => {
dialogGzy.value = true;
listQuery.value.jczid = row.id
JczMc.value = row.jczmc
JczselectById({id:row.id}).then(res => {
if(res){
listQuery.value.sxtList = res.sxtList?res.sxtList:[];
}
})
};
//保存
const _onSave = () => {
sxtBatch(listQuery.value).then((res) => {
console.log(res);
ElMessage({ message: "新增成功", type: "success" });
emit("getjczgetXfllList");
close()
});
};
const pageDatas = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 250, //操作栏宽度
tableColumn: [
{ label: "所属部门", prop: "ssbm", showOverflowTooltip: true },
{ label: "环林卡口名称", prop: "jczmc", showOverflowTooltip: true },
{
label: "环林卡口类型",
prop: "jczlx",
showOverflowTooltip: true,
showSolt: true
},
{
label: "执勤类型",
prop: "zqlx",
showSolt: true,
showOverflowTooltip: true
},
{
label: "环林卡口地址",
prop: "xxdz",
showOverflowTooltip: true
}
]
});
//页面关闭
const close = () => {
dialogGzy.value = false;
listQuery.value={}
};
// 表格高度计算
const tabHeightFn = () => {
console.log(search.value);
pageDatas.tableHeight = window.innerHeight - 370
// - search.value.offsetHeight - 280;
window.onresize = function () {
tabHeightFn();
};
};
defineExpose({ init });
const showJcz = ref(false)
const GzyMsg = (val) => {
listQuery.value.sxtList=val
}
const handleClose = (val) => {
listQuery.value.sxtList.splice(listQuery.value.sxtList.indexOf(val), 1)
}
</script>
<style lang="scss" scoped>
.dialog {
padding: 20px;
.head_box {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
}
.cntinfo {
// height: calc(100% - 70px);
overflow: hidden;
overflow-y: auto;
}
}
.my_transfer {
height: calc(100% - 50px);
display: flex;
.btn {
width: 50px;
display: flex;
align-items: center;
justify-content: center;
margin: 0 10px;
}
.left {
margin: 12px;
flex: 1;
position: relative;
.tableBox {
position: absolute;
width: 100%;
}
.serch {
position: relative;
width: 100%;
// height: 96px;
>.el-form--inline {
display: block;
width: 100%;
padding: 0;
>.el-form-item--default {
width: 31%;
}
}
}
.tableBox {
width: 100%;
}
}
.right {
width: 380px;
margin: 12px;
}
}
.phone {
width: 95px;
height: 120px;
.el-image {
width: 95px;
max-height: 120px;
}
}
::v-deep .el-upload {
width: 90px;
height: 100px;
border: 1px dashed #000000;
margin-bottom: 14px;
.el-icon {
margin-top: 34px;
font-size: 26px;
}
.el-image {
width: 100%;
height: 100%;
}
}
.mapbox {
width: 1000px;
padding: 0 10px;
height: 400px;
box-sizing: border-box;
background: #000;
}
.diviput {
width: 100%;
background-color: #ffffff;
border: 1px solid #c0c4cc;
color: #000;
min-height: 32px;
// line-height: 32px;
padding: 0 10px;
border-radius: 5px;
.placeholder {
color: #b5b5b5;
}
}
</style>

View File

@ -32,6 +32,7 @@
<template v-if="Auth">
<el-link type="primary" @click="addEdit('edit', row)">修改</el-link>
<el-link type="primary" @click="delDictItem(row.id)">删除</el-link>
<el-link type="primary" @click="perceptionAdd(row)">新增感知源</el-link>
</template>
<el-link type="primary" @click="addEdit('detail', row)">详情</el-link>
@ -45,12 +46,14 @@
<!-- 编辑详情 -->
<EditAddForm ref="detailDiloag" :dict="{ D_BZ_JCZLX, D_BZ_ZQLX, D_BZ_DLLX, D_BZ_JCZJB }"
@getjczgetXfllList="getjczgetXfllList" />
<PerceptionSource ref="perceptionSource" @getjczgetXfllList="getjczgetXfllList"/>
</div>
</template>
<script setup>
import { ElMessage } from "element-plus";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import PerceptionSource from './components/perceptionSource.vue'
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
@ -200,6 +203,10 @@ const tabHeightFn = () => {
tabHeightFn();
};
};
const perceptionSource = ref()
const perceptionAdd = (row) => {
perceptionSource.value.init(row)
};
</script>
<style>

View File

@ -127,7 +127,14 @@ const getjczgetXfllList = () => {
getjczgetXfllList();
// 搜索
const onSearch = (val) => {
queryCondition.value = { ...queryCondition.value, ...val };
console.log(val);
const startTime = {
startTime : val.startTime[0],
endTime : val.startTime[1]
}
queryCondition.value = { ...queryCondition.value,...startTime};
getjczgetXfllList();
};

View File

@ -21,18 +21,18 @@
v-model:modelValue="listQuery.ssbmdm"
/>
</el-form-item>
<el-form-item label="设备编号" prop="qxbh">
<el-form-item label="器械编号" prop="qxbh">
<el-input
:disabled="forbidden"
v-model="listQuery.qxbh"
placeholder="请输入设备编号"
placeholder="请输入器械编号"
clearable
style="width: 100%"
/>
</el-form-item>
<el-form-item label="装备类型" prop="qxlx">
<el-select v-model="listQuery.qxlx" placeholder="请选择装备类型" :disabled="forbidden">
<el-form-item label="器械类型" prop="qxlx">
<el-select v-model="listQuery.qxlx" placeholder="请选择器械类型" :disabled="forbidden">
<el-option
v-for="item in dict.D_JCGL_JYQX_QXLX"
:key="item"
@ -41,8 +41,8 @@
></el-option>
</el-select>
</el-form-item>
<el-form-item label="设备分类" prop="scode">
<el-select v-model="listQuery.scode" placeholder="请选择设备分类" :disabled="forbidden">
<el-form-item label="器械分类" prop="scode">
<el-select v-model="listQuery.scode" placeholder="请选择器械分类" :disabled="forbidden">
<el-option
v-for="item in dict.D_BZ_JYQXFL"
:key="item"
@ -51,18 +51,18 @@
></el-option>
</el-select>
</el-form-item>
<el-form-item prop="qxMc" label="装备名称">
<el-form-item prop="qxMc" label="器械名称">
<el-input :disabled="forbidden"
v-model="listQuery.qxMc"
placeholder="请输入装备名称"
placeholder="请输入器械名称"
clearable
style="width: 100%"
/>
</el-form-item>
<el-form-item label="装备型号">
<el-form-item label="器械型号">
<el-input :disabled="forbidden"
v-model="listQuery.xh"
placeholder="请输入装备型号"
placeholder="请输入器械型号"
clearable
style="width: 100%"
/>
@ -78,7 +78,7 @@
style="width: 100%"
/>
</el-form-item>
<el-form-item label="装备状态">
<el-form-item label="器械状态">
<el-select :disabled="forbidden"
clearable
v-model="listQuery.zbzt"
@ -93,10 +93,10 @@
></el-option>
</el-select>
</el-form-item>
<el-form-item label="装备厂商">
<el-form-item label="器械厂商">
<el-input
v-model="listQuery.sccs" :disabled="forbidden"
placeholder="请输入装备厂商"
placeholder="请输入器械厂商"
clearable
style="width: 100%"
/>
@ -163,7 +163,7 @@ const rules = reactive({
], qxbh: [
{
required: true,
message: "请输入设备编号",
message: "请输入器械编号",
trigger: "change"
}
],
@ -194,7 +194,7 @@ const rules = reactive({
], scode: [
{
required: true,
message: "请选择设备分类",
message: "请选择器械分类",
trigger: "change"
}
],

View File

@ -83,9 +83,9 @@ const searchConfiger = ref([
label: "所属部门"
},
{
label: "设备名称",
prop: "sbmc",
placeholder: "请输入设备名称",
label: "器械名称",
prop: "qxMc",
placeholder: "请输入器械名称",
showType: "input"
}
// {

View File

@ -159,7 +159,12 @@ const urlImg = ref("/mosty-api/mosty-base/minio/image/download/");
const imgUrl = ref("");
const dialogFormVisible = ref(false);
const searchConfiger = ref([
{
{
showType: "department",
prop: "ssbmdm",
placeholder: "请选择所属部门",
label: "所属部门"
},{
label: "姓名",
prop: "xm",
placeholder: "请输入姓名",
@ -171,19 +176,14 @@ const searchConfiger = ref([
placeholder: "请输入证件号码",
showType: "input"
},
{
label: "是否离职",
prop: "xtSjzt",
placeholder: "是否离职",
showType: "select",
options: D_BZ_SF
},
{
showType: "department",
prop: "ssbmdm",
placeholder: "请选择所属部门",
label: "所属部门"
}
// {
// label: "是否离职",
// prop: "xtSjzt",
// placeholder: "是否离职",
// showType: "select",
// options: D_BZ_SF
// },
]);
const elform = ref(null)
const detailDiloag = ref();

View File

@ -86,7 +86,8 @@ const searchConfiger = ref([
label: "车辆品牌",
prop: "clpp",
placeholder: "请输入车辆品牌",
showType: "input"
showType: "select",
options: D_BZ_CLPP
}
]);

View File

@ -49,13 +49,13 @@
import GdMap from "@/components/GdMap/index.vue";
import Head from "./layout/head.vue";
import Collection from "./components/collection.vue";
// import Warning from "./components/warning.vue";
import CarWarning from "./components/CarWarning.vue";
import PeoWarning from "./components/PeoWarning.vue";
import BeOnDuty from "./components/beonDuty.vue";
import Entrance from "./components/entrance.vue";
import WanringAnyse from "./components/wanringAnyse.vue";
import { jczgetJczList } from "@/api/mosty-jcz";
import {ysSxtGetList} from '@/api/yszx.js'
import emitter from "@/utils/eventBus.js";
import { ref, onMounted } from "vue";
@ -80,6 +80,17 @@ onMounted(() => {
}
});
});
const sxtGetList = () => {
ysSxtGetList().then(res => {
emitter.emit("addPointArea", {
coords: res,
icon: require("@/assets/point/sp.png"),
flag: "jczMap_Gzy"
});
})
}
sxtGetList()
</script>
<style lang="scss" scoped>
@ -146,4 +157,5 @@ onMounted(() => {
box-sizing: border-box;
}
}
</style>

View File

@ -12,7 +12,7 @@
<div class="zbbb" v-if="query" @click="show = true">值班报备</div>
</div>
<el-dialog v-model="show" title="Shipping address">
<div style="height: 50vh; overflow: auto">
<div style="height: 50vh; overflow: auto" v-if="show">
<zbbb
:row="row"
@close="close"

View File

@ -1,6 +1,4 @@
<template>
<div></div>
<div class="cntinfo">
<div class="flex align-center just-between box">
<div class="flex align-center">
@ -12,7 +10,7 @@
/>
</div>
<!-- v-if="['add', 'edit'].includes(pageType)" -->
<el-button size="small" type="primary" @click="_onSave">保存</el-button>
<el-button size="small" type="primary" @click="_onSave" :disabled="loding">保存</el-button>
</div>
<el-form
ref="formRef"
@ -51,7 +49,7 @@
<div class="bblxItem">
<div class="btItem">班次设置</div>
<div class="info">
<el-form-item prop="kssj">
<el-form-item prop="bcKssj" label=" ">
<el-time-picker
v-model="listQuery.bcKssj"
:disabled="isDetail"
@ -60,7 +58,7 @@
value-format="HH:mm:ss"
/>
</el-form-item>
<el-form-item prop="bcKts">
<el-form-item prop="bcKtsDict" label=" ">
<el-select
clearable
v-model="listQuery.bcKtsDict"
@ -75,7 +73,7 @@
></el-option>
</el-select>
</el-form-item>
<el-form-item prop="jssj">
<el-form-item prop="bcJssj" label=" ">
<el-time-picker
v-model="listQuery.bcJssj"
:disabled="isDetail"
@ -103,7 +101,7 @@
:dic="props.dic"
/>
</el-form-item>
<el-form-item prop="fzrXm">
<el-form-item prop="fzrXm" label=" ">
<el-input
readonly
v-model="listQuery.fzrXm"
@ -111,7 +109,7 @@
clearable
/>
</el-form-item>
<el-form-item prop="fzrSfzh">
<el-form-item prop="fzrSfzh" label=" ">
<el-input
readonly
v-model="listQuery.fzrSfzh"
@ -119,7 +117,7 @@
clearable
/>
</el-form-item>
<el-form-item prop="fzrLxdh">
<el-form-item prop="fzrLxdh" label=" ">
<el-input
readonly
v-model="listQuery.fzrLxdh"
@ -307,11 +305,13 @@
<script setup>
import { ref, reactive, getCurrentInstance, onMounted, watch } from "vue";
import * as MOSTY from "@/components/MyComponents/index";
import { jczqueryById } from "@/api/mosty-jcz";
import { jczsavel, Xfbbupdate } from "@/api/mosty-jcz.js";
import { ElMessage } from "element-plus";
import ChooseTable from "@/components/chooseList/chooseTable.vue";
import { timeValidate } from "@/utils/tools.js";
import { useRoute } from "vue-router";
import emitter from "@/utils/eventBus.js";
const { proxy } = getCurrentInstance();
// const { D_BZ_JYQXFL } = proxy.$dict("D_BZ_JYQXFL");
const props = defineProps({
@ -394,7 +394,6 @@ const init = (type) => {
}
} else {
pageType.value = "add";
listQuery.value.qxList = props.dic.D_BZ_JYQXFL.map((item) => {
return { qxmc: item.label, qxsl: 0 };
});
@ -416,17 +415,43 @@ onMounted(() => {
});
// 验证规则
const rules = ref({
spbt: [
bcKtsDict: [
{
required: true,
message: "请输入标题",
message: "请选择班次",
trigger: "blur"
}
]
],
bcKssj: [
{
required: true,
message: "请选择开始时间",
trigger: "blur"
}
], bcJssj: [
{
required: true,
message: "请选择结束时间",
trigger: "blur"
}
], fzrXm: [
{
required: true,
message: "请输入负责人",
trigger: "blur"
}
], fzrSfzh: [
{
required: true,
message: "请输入身份证",
trigger: "blur"
}
],
});
//保存
const loding = ref(false);
const _onSave = () => {
formRef.value.validate().then( async() => {
const data = [...mjData.value, ...fjData.value];
listQuery.value.ryList = ChegeMj(data);
@ -438,33 +463,61 @@ const _onSave = () => {
break;
case "02":
listQuery.value.bcKts = 2;
break;
case "03":
listQuery.value.bcKts = 4;
break;
case "04":
listQuery.value.bcKts = 5;
break;
case "05":
listQuery.value.bcKts = 6;
break;
case "06":
listQuery.value.bcKts = 7;
break;
case "07":
listQuery.value.bcKts = 8;
break;
}
listQuery.value.jczid = routerList.value.id?routerList.value.id:"";
listQuery.value.jczmc = routerList.value.name?routerList.value.name:"";
if (pageType.value == "add") {
jczsavel(listQuery.value).then((res) => {
ElMessage({ message: "新增成功", type: "success" });
getjczqueryById()
emit("close");
}).finally(()=>{
loding.value=false
});
} else {
Xfbbupdate(listQuery.value).then((res) => {
ElMessage({ message: "修改成功", type: "success" });
getjczqueryById()
emit("close");
}).finally(()=>{
loding.value=false
});
}
};
}
}).catch(() => { });
};
const getjczqueryById = () => {
jczqueryById({ jczid: props.jczId }).then((res) => {
if (res) {
emitter.emit("getjczqueryById",res);
// warningList.value.qxList =res.qxList&&res.qxList.length>0
// ? res.qxList.filter((item) => item.qxsl > 0)
// : [];
// warningList.value.ryList = res.ryList.length>0 ? res.ryList : [];
// warningList.value.clList = res.clList.length>0 ? res.clList : [];
// warningList.value.sbList = [...res.tcList, ...res.zdList]
// emitter.emit("chengZ", res);
} else {
// warningList.value = res;
}
});
};
//
const close = () => {
dialogForm.value = false;
@ -621,4 +674,7 @@ const changeJCZ = (val) => {
.box {
margin-bottom: 10px;
}
::v-deep .el-form-item__label{
padding: 0;
}
</style>