This commit is contained in:
lcw
2025-11-27 14:27:59 +08:00
parent 93c49dff27
commit 85f1f3a6f7
75 changed files with 1321 additions and 360 deletions

View File

@ -1,5 +1,5 @@
import request from "@/utils/request";
const api = "/api";
const api = "/qxda/api";
export const ryxxJbxxSave = (params) => {
return request({
headers: {

View File

@ -62,3 +62,27 @@ export const tbYjxxGetBmtj = (params) => {
params
})
}
// 组合预警
export const tbYjxxGetZbtj = (params) => {
return request({
url: api + `/yjzxZhyj/getPageList`,
method: "get",
params
})
}
// 组合标签
export const tbGsxtBqzhSelectList = (params) => {
return request({
url: api + `/tbGsxtBqzh/selectList`,
method: "get",
params
})
}
// 身份标签
export const yjzxSfyjSelectList = (params) => {
return request({
url: api + `/yjzxSfyj/getPageList`,
method: "get",
params
})
}

BIN
src/assets/images/yjsy.mp3 Normal file

Binary file not shown.

View File

@ -33,7 +33,7 @@ const initChart = () => {
legend: {
orient: 'vertical',
right: '0%',
top: 'center',
top: '1%',
textStyle: {
color: '#fff'
},

View File

@ -134,6 +134,9 @@
/>
<div v-else-if="item.showType === 'defaultSlot'">
<slot name="defaultSlot"></slot>
</div>
<div v-else-if="item.showType === 'nameSlot'">
<slot name="nameSlot"></slot>
</div>
</div>

View File

@ -1,5 +1,6 @@
<template>
<el-dialog class="dialog-container"
:draggable="true"
:model-value="modelValue"
:title="title"
:before-close="close" :destroy-on-close="true"

180
src/utils/audioPlayer.js Normal file
View File

@ -0,0 +1,180 @@
// 音频播放器工具类
/**
* 音频播放器类
*/
class AudioPlayerClass {
constructor() {
this.audioPlayer = null;
this.isLoaded = false;
this.isPlaying = false;
}
/**
* 初始化音频播放器
* @param {string} audioPath - 音频文件路径
* @param {boolean} loop - 是否循环播放
* @returns {Promise} - 初始化结果
*/
init(audioPath, loop = true) {
return new Promise((resolve, reject) => {
try {
// 创建Audio对象并加载音频文件
this.audioPlayer = new Audio(audioPath);
this.audioPlayer.loop = loop; // 设置循环播放
// 监听音频加载完成事件
this.audioPlayer.addEventListener('canplaythrough', () => {
console.log('音频加载完成,可以播放');
this.isLoaded = true;
resolve(true);
});
// 监听错误事件
this.audioPlayer.addEventListener('error', (error) => {
console.error('音频加载错误:', error);
console.error('错误代码:', error.code);
console.error('音频网络状态:', this.audioPlayer.networkState);
console.error('音频就绪状态:', this.audioPlayer.readyState);
reject(error);
});
// 预加载音频
console.log('开始预加载音频...');
this.audioPlayer.load();
console.log('音频预加载请求已发送');
} catch (error) {
console.error('初始化音频播放器失败:', error);
console.error('错误详情:', error.stack);
reject(error);
}
});
}
/**
* 播放音频
* @param {boolean} autoUnmute - 是否自动取消静音
* @returns {Promise} - 播放结果
*/
play(autoUnmute = true) {
return new Promise((resolve, reject) => {
if (!this.audioPlayer) {
reject(new Error('音频播放器未初始化'));
return;
}
if (!this.isLoaded) {
reject(new Error('音频未加载完成'));
return;
}
try {
// 严格模式下的播放策略:先设置静音,再取消静音,最后播放
if (autoUnmute) {
this.audioPlayer.muted = true;
// 使用setTimeout确保时序正确
setTimeout(() => {
this.audioPlayer.muted = false;
this.audioPlayer.play()
.then(() => {
this.isPlaying = true;
console.log('音频播放成功');
resolve(true);
})
.catch(error => {
if (error.name === 'NotAllowedError') {
console.error('播放被浏览器自动播放策略阻止,需要用户交互后才能播放');
}
reject(error);
});
}, 0);
} else {
this.audioPlayer.play()
.then(() => {
this.isPlaying = true;
console.log('音频播放成功');
resolve(true);
})
.catch(error => {
if (error.name === 'NotAllowedError') {
console.error('播放被浏览器自动播放策略阻止,需要用户交互后才能播放');
}
reject(error);
});
}
} catch (error) {
console.error('音频播放失败:', error);
reject(error);
}
});
}
/**
* 暂停音频
*/
pause() {
if (this.audioPlayer) {
this.audioPlayer.pause();
this.isPlaying = false;
console.log('音频已暂停');
}
}
/**
* 设置音量
* @param {number} volume - 音量值0-1
*/
setVolume(volume) {
if (this.audioPlayer) {
this.audioPlayer.volume = Math.max(0, Math.min(1, volume));
}
}
/**
* 设置是否静音
* @param {boolean} muted - 是否静音
*/
setMuted(muted) {
if (this.audioPlayer) {
this.audioPlayer.muted = muted;
}
}
/**
* 获取音频播放状态
* @returns {boolean} - 是否正在播放
*/
getIsPlaying() {
return this.isPlaying;
}
/**
* 获取音频加载状态
* @returns {boolean} - 是否已加载完成
*/
getIsLoaded() {
return this.isLoaded;
}
/**
* 销毁音频播放器
*/
destroy() {
if (this.audioPlayer) {
this.audioPlayer.pause();
this.audioPlayer.remove();
this.audioPlayer = null;
this.isLoaded = false;
this.isPlaying = false;
console.log('音频播放器已销毁');
}
}
}
// 导出单例实例
const audioPlayerInstance = new AudioPlayerClass();
export default audioPlayerInstance;
// 导出类(可选,用于创建多个实例)
export { AudioPlayerClass };

View File

@ -1,41 +1,131 @@
const url = "ws://80.155.0.82:8006/mosty-api/mosty-websocket/socket/"; //线上
const url = "ws://89.40.9.89:2109/mosty-api/mosty-websocket/socket/"; //线上
import {
getItem
} from "@/utils/storage";
import {
getUserInfoToId
} from "@/api/user-manage";
import emitter from "@/utils/eventBus.js"; // 导入事件总线
class WebSoketClass {
constructor(props) {}
ws = null;
static getInstance() {
if (!this.ws) this.ws = new WebSoketClass();
return this.ws;
constructor(props) {
this.ws = null;
this.state = null;
this.reconnectCount = 0;
this.maxReconnectCount = 10;
this.reconnectInterval = 6000;
this.uuid = null; // 保存UUID用于重连时复用
this.sfzh = null; // 保存身份证号,用于重连时复用
this.fullUrl = null; // 保存完整连接URL用于重连时复用
}
static getInstance() {
if (!this.instance) this.instance = new WebSoketClass();
return this.instance;
}
//关闭连接
static close() {
this.ws.ws.close();
if (this.instance) {
this.instance.closeConnection();
}
}
// 关闭连接的实例方法
closeConnection() {
if (this.ws) {
this.ws.close();
this.ws = null;
}
if (this.state) {
clearInterval(this.state);
this.state = null;
}
this.reconnectCount = 0;
// 重置UUID下次连接时生成新的
this.uuid = null;
this.fullUrl = null;
}
// 创建连接
connect(fun) {
let uuid = this.getUUid()
let id = getItem("USERID");
getUserInfoToId(id).then((res) => {
let sfzh = res.idEntityCard
this.ws = new WebSocket(url + sfzh + '/' + uuid);
this.ws.onopen = (e) => { fun(true);};
});
// 首次连接时获取并保存连接参数
if (!this.sfzh) {
this.sfzh = getItem("idEntityCard");
}
// 首次连接时生成并保存UUID
if (!this.uuid) {
this.uuid = this.getUUid();
}
if (this.sfzh) {
try {
// 如果还没有完整URL或需要更新重新构建
if (!this.fullUrl || this.maxReconnectCount == 10) {
this.fullUrl = url + this.sfzh + '/' + this.uuid;
this.reconnectCount = 0;
}
console.log('尝试连接WebSocket:', this.fullUrl);
this.ws = new WebSocket(this.fullUrl);
console.log(this.ws);
this.ws.onopen = (e) => {
console.log('WebSocket连接已打开');
// 只有在非重连状态下才重置重连计数
// 避免短暂连接成功后又关闭导致计数重置
if (this.reconnectCount === 0) {
console.log('首次连接成功');
} else {
console.log('重连成功');
// 重连成功后重置计数
// this.reconnectCount = 0;
}
this.heartCheck();
this.getMessage();
if (fun) fun(true);
};
this.ws.onclose = (e) => {
console.log(e);
console.log('WebSocket连接已关闭关闭码:', e.code, '原因:', e.reason);
// 如果是正常关闭(1000)或手动关闭(1001),不进行重连
if (e.code !== 1000 && e.code !== 1001) {
this.handleReconnect(fun);
} else {
console.log('WebSocket正常关闭不进行重连');
}
};
this.ws.onerror = (e) => {
console.error('WebSocket连接错误:', e);
this.handleReconnect(fun);
};
} catch (error) {
console.error('创建WebSocket连接失败:', error);
this.handleReconnect(fun);
}
} else {
console.error('获取用户身份证号失败无法建立WebSocket连接');
if (fun) fun(false);
}
}
// 心跳机制
heartCheck() {
const _that = this;
if (this.state) {
clearInterval(this.state);
}
this.state = setInterval(() => {
if (this.ws.readyState === 1) {
this.ws.send("/heart");
} else {
this.closeHandle(); //重新连接
try {
if (this.ws && this.ws.readyState === WebSocket.OPEN) {
this.ws.send("/heart");
} else {
console.log('WebSocket未连接停止心跳');
clearInterval(this.state);
this.state = null;
}
} catch (error) {
console.error('心跳发送失败:', error);
clearInterval(this.state);
this.state = null;
}
}, 6e3);
}, 6000);
}
// 获取uuid
@ -52,21 +142,54 @@ class WebSoketClass {
return uuid
}
closeHandle() {
if (this.state) {
clearInterval(this.state);
this.connect();
} else {
// 处理重连
handleReconnect(fun) {
if (this.reconnectCount >= this.maxReconnectCount) {
console.log('达到最大重连次数,停止重连');
if (fun) fun(false);
return;
}
this.reconnectCount++;
console.log(`尝试第${this.reconnectCount}次重连...`);
setTimeout(() => {
this.connect(fun);
}, this.reconnectInterval);
}
// 接收发送消息
getMessage() {
this.ws.onmessage = (e) => {
if (e.data) {
let newsDate = JSON.parse(e.data);
this.newVal = newsDate;
//接收的数据
console.log(e);
try {
if (e.data) {
let newsDate = JSON.parse(e.data);
// 根据消息类型发射相应的事件
if (newsDate.type === '01') {
// 触发音频播放
console.log('触发音频播放');
emitter.emit('openYp', newsDate.data); // 传递消息数据
}
// else if (newsDate.type === 'ALARM_STOP' || newsDate.type === 'warning_stop') {
// // 触发音频停止
// emitter.emit('closeYp');
// } else if (newsDate.type === 'POSITION_UPDATE') {
// // 位置更新事件
// emitter.emit('positionUpdate', newsDate.data);
// } else if (newsDate.type === 'STATUS_UPDATE') {
// // 状态更新事件
// emitter.emit('statusUpdate', newsDate.data);
// }
// // 通用消息事件
// emitter.emit('webSocketMessage', newsDate);
}
} catch (error) {
console.error('处理WebSocket消息失败:', error);
// 如果是心跳响应,不报错
if (e.data !== '/heart') {
console.error('消息内容:', e.data);
}
}
};
}

View File

@ -111,6 +111,7 @@ import ExportFile from './components/exportFile.vue'
import CheckProcess from '../components/checkProcess.vue'
import { ElMessageBox } from 'element-plus'
import { getItem } from '@//utils/storage.js'
import {tbYjxxGetZbtj} from '@/api/yj.js'
const { proxy } = getCurrentInstance();
const { D_GS_XS_LY, D_BZ_SSZT, D_BZ_SF, D_GS_XS_LX, D_BZ_BQJB,
D_GS_XS_QTLX, D_GS_ZDQT_LB,

View File

@ -46,7 +46,7 @@ import Footer from './footer.vue'
// import useCallModule from '../sdk/call.js'
const { proxy } = getCurrentInstance();
// const Call = useCallModule()
lemon.login.login({
window.lemon.login.login({
username: "linzhigongan1",
password: "linzhigongan1",
realm: "puc.com",

View File

@ -14,20 +14,24 @@
<!-- 表格 -->
<div class="tabBox">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger">
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<template #xwcs="{ row }">
<span style="color: #0072ff;" @click="handleClick(row)">{{ row.xwcs }}</span>
</template>
<template #bqYs="{ row }">
<!-- <div :style="{
backgroundColor: bqYs(row.bqys)
}"></div> -->
<DictTag :value="row.bqys" :tag="false" :color="bqYs(row.bqys)" :options="D_GS_SSYJ" />
<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 #controls="{ row }">
<el-link type="primary">下发指令</el-link>
<el-link type="success">查看反馈</el-link>
<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="delDictItem(row.id)">详情</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
@ -38,6 +42,12 @@
</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>
</template>
<script setup>
@ -47,11 +57,16 @@ import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Search from "@/components/aboutTable/Search.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import { qcckGet } from "@/api/qcckApi.js";
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 } from "vue";
const { proxy } = getCurrentInstance();
const { D_GS_SSYJ } = proxy.$dict("D_GS_SSYJ"); //获取字典数据
const { D_GS_SSYJ ,D_GSXT_YJXX_CZZT} = proxy.$dict("D_GS_SSYJ","D_GSXT_YJXX_CZZT"); //获取字典数据
const searchBox = ref(); //搜索框
const bqLbData = ref({
bqXl: []
@ -77,23 +92,26 @@ const pageData = reactive({
rowHieght: 61,
showSelectType: "null",
loading: false,
haveControls: false,
haveControls: true
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 300, //操作栏宽度
tableColumn: [
{ label: "姓名", prop: "xm" },
{ label: "身份证号", prop: "sfzh" },
{ label: "电话", prop: "dh" },
{ label: "身份证号", prop: "sfzh", width: 200 },
{ label: "电话", prop: "dh", width: 150 },
{ label: "行为大类", prop: "xldlmc" },
{ label: "行为子类", prop: "xwzlmc", showOverflowTooltip: true },
{ label: "行为描述", prop: "xwms", showOverflowTooltip: true },
{ label: "行为次数", prop: "xwcs", showSolt: true },
{ label: "行为颜色", prop: "bqYs", showSolt: true },
{ label: "行为分值", prop: "xwfz", },
{ label: "处置状态", prop: "czzt", showSolt: true },
{ label: "所属县局", prop: "ssbm" },
]
});
@ -146,7 +164,7 @@ const getList = () => {
pageData.total = res.total || 0;
pageData.tableConfiger.loading = false;
pageData.tableData = res.records.map(item => {
return {...item,bqys: '01'}
return { ...item, bqys: '01' }
}) || [];
}).catch(() => {
pageData.tableConfiger.loading = false;
@ -179,6 +197,60 @@ const bqYs = (val) => {
return '#0000ff'
}
}
// 全息档案
const assessShow = ref(false)
const dataList = ref()
const pushAssess = (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 tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;

View File

@ -1,21 +1,26 @@
<template>
<el-dialog v-model="showDialog" :append-to-body="true" :destroy-on-close="true" :title="title" :close-on-click-modal="false">
<FormMessage v-model="listQuery" :disabled="title == '反馈' ? false : true" :formList="formData" labelWidth="160px" ref="elform" :rules="rules">
<template #mbzrmjxm>
<MOSTY.Other width="100%" @click="handleChoose('mbzrmjxm')" clearable v-model="listQuery.mbzrmjxm" placeholder="请选择民警" :readonly="true" />
</template>
<template #czzrmj>
<MOSTY.Other width="100%" @click="handleChoose('czzrmj')" clearable v-model="listQuery.czzrmj" placeholder="请选择民警" :readonly="true" />
</template>
</FormMessage>
<template #footer>
<div class="flex just-center">
<el-button @click="close">取消</el-button>
<el-button type="primary" @click="submitForm" :loading="loading" v-if="title == '反馈'">确认</el-button>
</div>
</template>
<el-dialog :draggable="true" v-model="showDialog" :append-to-body="true" :destroy-on-close="true" :title="title"
:close-on-click-modal="false">
<FormMessage v-model="listQuery" :disabled="title == '反馈' ? false : true" :formList="formData" labelWidth="160px"
ref="elform" :rules="rules">
<template #mbzrmjxm>
<MOSTY.Other width="100%" @click="handleChoose('mbzrmjxm')" clearable v-model="listQuery.mbzrmjxm"
placeholder="请选择民警" :readonly="true" />
</template>
<template #czzrmj>
<MOSTY.Other width="100%" @click="handleChoose('czzrmj')" clearable v-model="listQuery.czzrmj"
placeholder="请选择民警" :readonly="true" />
</template>
</FormMessage>
<template #footer>
<div class="flex just-center">
<el-button @click="close">取消</el-button>
<el-button type="primary" @click="submitForm" :loading="loading" v-if="title == '反馈'">确认</el-button>
</div>
</template>
</el-dialog>
<ChooseUser v-model="chooseUserVisible" v-if="chooseUserVisible" @choosedUsers="handleUserSelected" :roleIds="roleIds" :Single="true" />
<ChooseUser v-model="chooseUserVisible" v-if="chooseUserVisible" @choosedUsers="handleUserSelected" :roleIds="roleIds"
:Single="true" />
</template>
<script setup>
@ -24,10 +29,16 @@ import * as MOSTY from "@/components/MyComponents/index";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { onMounted, reactive, ref ,getCurrentInstance} from 'vue';
import { onMounted, reactive, ref, getCurrentInstance,onUnmounted } from 'vue';
const props = defineProps({
lx: {
type: String,
default: '01'
}
})
const emit = defineEmits(['change'])
const { proxy } = getCurrentInstance();
const { D_BZ_SF ,D_YJXX_CZCSLX,D_YJXX_CZSSXZ,D_YJXX_CKCZJG,D_YJXX_CKZYLX } = proxy.$dict('D_YJXX_CKZYLX','D_BZ_SF','D_YJXX_CZCSLX','D_YJXX_CZSSXZ','D_YJXX_CKCZJG')
const { D_BZ_SF, D_YJXX_CZCSLX, D_YJXX_CZSSXZ, D_YJXX_CKCZJG, D_YJXX_CKZYLX } = proxy.$dict('D_YJXX_CKZYLX', 'D_BZ_SF', 'D_YJXX_CZCSLX', 'D_YJXX_CZSSXZ', 'D_YJXX_CKCZJG')
const chooseUserVisible = ref(false)
const roleIds = ref([])
const elform = ref()
@ -36,43 +47,43 @@ const loading = ref(false)
const choosetype = ref('')
const listQuery = ref({})
const formData = ref([
{ label: "发现目标状态", prop: "mbzt", type: "select",options: D_BZ_SF },
{ label: "发现目标责任单位", prop: "mbzrdwdm", type: "department" ,depMc:'mbzrdw'},
{ label: "发现目标责任民警", prop: "mbzrmjxm", type: "slot"},
{ label: "是否本人", prop: "sfbr", type: "select",options: D_BZ_SF },
{ label: "发现目标状态", prop: "mbzt", type: "select", options: D_BZ_SF },
{ label: "发现目标责任单位", prop: "mbzrdwdm", type: "department", depMc: 'mbzrdw' },
{ label: "发现目标责任民警", prop: "mbzrmjxm", type: "slot" },
{ label: "是否本人", prop: "sfbr", type: "select", options: D_BZ_SF },
{ label: "处置时间", prop: "czsj", type: "datetime" },
{ label: "处置地址", prop: "czdz", type: "textarea",width:'100%'},
{ label: "详细地址", prop: "xxdz", type: "textarea",width:'100%' },
{ label: "处置责任单位", prop: "czzrdwdm", type: "department",depMc:'czzrdw' },
{ label: "处置地址", prop: "czdz", type: "textarea", width: '100%' },
{ label: "详细地址", prop: "xxdz", type: "textarea", width: '100%' },
{ label: "处置责任单位", prop: "czzrdwdm", type: "department", depMc: 'czzrdw' },
{ label: "处置责任民警", prop: "czzrmj", type: "slot" },
{ label: "常控处置措施类型", prop: "ckczcslx", type: "select" ,options: D_YJXX_CZCSLX},
{ label: "常控处置措施细类", prop: "ckczcsxl", type: "select",options: D_YJXX_CZSSXZ},
{ label: "常控处置结果", prop: "ckczjg", type: "select",options: D_YJXX_CKCZJG },
{ label: "常控处置措施类型", prop: "ckczcslx", type: "select", options: D_YJXX_CZCSLX },
{ label: "常控处置措施细类", prop: "ckczcsxl", type: "select", options: D_YJXX_CZSSXZ },
{ label: "常控处置结果", prop: "ckczjg", type: "select", options: D_YJXX_CKCZJG },
{ label: "常控立线侦察评估", prop: "cklxzcpg", type: "input" },
{ label: "常控立线侦察依据", prop: "cklxzcpgyj", type: "input" },
{ label: "常控从事职业类型", prop: "ckzylx", type: "select",options: D_YJXX_CKZYLX },
{ label: "是否尿检", prop: "sfnj", type: "radio",options: D_BZ_SF },
{ label: "常控不尿检理由", prop: "ckbnjly", type: "textarea",width:'100%' },
{ label: "常控处置反馈补充信息", prop: "ckczbcxx", type: "textarea",width:'100%' },
{ label: "常控从事职业类型", prop: "ckzylx", type: "select", options: D_YJXX_CKZYLX },
{ label: "是否尿检", prop: "sfnj", type: "radio", options: D_BZ_SF },
{ label: "常控不尿检理由", prop: "ckbnjly", type: "textarea", width: '100%' },
{ label: "常控处置反馈补充信息", prop: "ckczbcxx", type: "textarea", width: '100%' },
])
const rules = reactive({
mbzt: [{ required: true, message: "请选择发现目标状态", trigger: "change" }],
fxmbzedw: [{ required: true, message: "请选择发现目标责任单位", trigger: "change" }],
mbzrmjxm: [{ required: true, message: "请选择发现目标责任民警", trigger: "change" }],
sfbr:[{ required: true, message: "请选择是否本人", trigger: "change" }],
czsj:[{ required: true, message: "请选择处置时间", trigger: "change" }],
czdz:[{ required: true, message: "请选择处置地址", trigger: "blur" }],
xxdz:[{ required: true, message: "请选择详细地址", trigger: "blur" }],
czzrdwdm:[{ required: true, message: "请选择处置责任单位", trigger: "change" }],
czzrmj:[{ required: true, message: "请选择处置责任民警", trigger: "change" }],
ckczcslx:[{ required: true, message: "请选择常控处置措施类型", trigger: "change" }],
ckczcsxl:[{ required: true, message: "请选择常控处置措施细类", trigger: "change" }],
ckczjg:[{ required: true, message: "请输入常控处置结果", trigger: "blur" }],
cklxzcpg:[{ required: true, message: "请输入常控立线侦察评估", trigger: "blur" }],
cklxzcpgyj:[{ required: true, message: "请输入常控立线侦察依据", trigger: "blur" }],
ckzylx:[{ required: true, message: "请选择常控从事职业类型", trigger: "change" }],
sfnj:[{ required: true, message: "请选择是否尿检", trigger: "change" }],
sfbr: [{ required: true, message: "请选择是否本人", trigger: "change" }],
czsj: [{ required: true, message: "请选择处置时间", trigger: "change" }],
czdz: [{ required: true, message: "请选择处置地址", trigger: "blur" }],
xxdz: [{ required: true, message: "请选择详细地址", trigger: "blur" }],
czzrdwdm: [{ required: true, message: "请选择处置责任单位", trigger: "change" }],
czzrmj: [{ required: true, message: "请选择处置责任民警", trigger: "change" }],
ckczcslx: [{ required: true, message: "请选择常控处置措施类型", trigger: "change" }],
ckczcsxl: [{ required: true, message: "请选择常控处置措施细类", trigger: "change" }],
ckczjg: [{ required: true, message: "请输入常控处置结果", trigger: "blur" }],
cklxzcpg: [{ required: true, message: "请输入常控立线侦察评估", trigger: "blur" }],
cklxzcpgyj: [{ required: true, message: "请输入常控立线侦察依据", trigger: "blur" }],
ckzylx: [{ required: true, message: "请选择常控从事职业类型", trigger: "change" }],
sfnj: [{ required: true, message: "请选择是否尿检", trigger: "change" }],
})
const title = ref('')
@ -80,31 +91,46 @@ onMounted(() => {
emitter.on("openFkDialog", (val) => {
showDialog.value = true;
listQuery.value = { yjid: val.id }
let url = ''
console.log(url);
switch (props.lx) {
case '01':
url = '/mosty-gsxt/tbYjxx/getInfo/'
break;
case '02':
url = '/mosty-gsxt/yjzxXwyj/'
break;
case '03':
url = '/mosty-gsxt/yjzxSfyj/'
break;
case '04':
url = '/mosty-gsxt/yjzxZhyj/'
break;
}
title.value = val.type;
if(val.type == '查看反馈'){
qcckGet({}, "/mosty-gsxt/tbYjxx/getInfo/"+val.id).then((res) => {
if (val.type == '查看反馈') {
qcckGet({}, url + val.id).then((res) => {
let list = res.fkList || []
listQuery.value = list.length > 0 ? list[0] : {};
listQuery.value = list.length > 0 ? list[0] : {};
});
}
})
})
const handleChoose = (type)=>{
const handleChoose = (type) => {
chooseUserVisible.value = true,
choosetype.value = type;
choosetype.value = type;
}
// 选取角色
const handleUserSelected = (val) => {
switch(choosetype.value){
switch (choosetype.value) {
case 'mbzrmjxm':
listQuery.value.mbzrmjxm = val[0].userName
listQuery.value.mbzrmjsfzh = val[0].inDustRialId
break;
case 'czzrmj':
case 'czzrmj':
listQuery.value.czzrmj = val[0].userName
listQuery.value.czzrmjsfzh = val[0].inDustRialId
break;
@ -112,13 +138,28 @@ const handleUserSelected = (val) => {
}
const submitForm = () =>{
elform.value.submit((val)=>{
loading.value = true;
const prome = {
...listQuery.value,
const submitForm = () => {
elform.value.submit((val) => {
loading.value = true;
const prome = {
...listQuery.value,
}
qcckPost(prome, "/mosty-gsxt/tbYjxx/yjfk").then(() => {
let url = ''
switch (props.lx) {
case '01':
url = '/mosty-gsxt/tbYjxx/yjfk'
break;
case '02':
url = '/mosty-gsxt/yjzxXwyj/yjfk'
break;
case '03':
url = '/mosty-gsxt/yjzxSfyj/yjfk'
break;
case '04':
url = '/mosty-gsxt/yjzxZhyj/yjfk'
break;
}
qcckPost(prome, url).then(() => {
loading.value = false;
proxy.$message({ type: "success", message: "反馈成功" });
emit('change')
@ -134,12 +175,16 @@ const close = () => {
listQuery.value = {}
showDialog.value = false;
}
onUnmounted(() => {
emitter.off("openFkDialog")
})
</script>
<style lang="scss" scoped>
.el-form{
max-height: 60vh;
overflow: hidden;
overflow-y: auto;
.el-form {
max-height: 60vh;
overflow: hidden;
overflow-y: auto;
}
</style>

View File

@ -0,0 +1,57 @@
<template>
<el-dialog :title="`组合预警次数详情(${pageData.tableData.length}`" v-model="dialogVisible" width="60%">
<MyTable
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
>
</MyTable>
</el-dialog>
</template>
<script setup>
import { qcckGet } from "@/api/qcckApi.js";
import MyTable from "@/components/aboutTable/MyTable.vue";
import { ref , reactive , defineExpose} from 'vue'
const dialogVisible = ref(false)
const pageData = reactive({
tableData: [{jqbh:'JQBH-43',bjr:'张三',bjrdh:'15665255545',bjrsfzh:'510156565656525565',yjnr:'xxxxxxxxx',jsj:'2023-08-24 15:00:00'}], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
loading: false,
haveControls: false,
},
tableHeight:600,
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
tableColumn: [
{ label: "警情编号", prop: "jjdbh"},
{ label: "报警人", prop: "bjrmc" },
{ label: "报警人电话", prop: "bjdh" },
{ label: "报警人身份证", prop: "bjrzjhm"},
{ label: "预警内容", prop: "bjnr", showOverflowTooltip: true },
{ label: "报警时间", prop: "bjsj", showOverflowTooltip: true },
]
});
const init = (row) => {
dialogVisible.value = true;
pageData.tableConfiger.loading = true;
pageData.tableData = []
qcckGet({yjid:row.id},'/mosty-gsxt/yjzxZhyjxq/getPageList').then((res)=>{
pageData.tableData = res || [];
pageData.tableConfiger.loading = false;
}).catch(()=>{
pageData.tableConfiger.loading = false;
})
}
defineExpose({
init
})
</script>

View File

@ -13,26 +13,40 @@
</div>
<!-- 表格 -->
<div class="tabBox">
<MyTable
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<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 #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="delDictItem(row.id)">详情</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>
</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>
</template>
<script setup>
@ -40,61 +54,65 @@ import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Search from "@/components/aboutTable/Search.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import { qcckGet } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance();
import { tbYjxxGetZbtj, tbGsxtBqzhSelectList } 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 { reactive, ref, onMounted, getCurrentInstance, watch } from "vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import Detail from './components/detail.vue'
import emitter from "@/utils/eventBus.js";
const searchBox = ref();
const { proxy } = getCurrentInstance();
const {D_GSXT_YJXX_CZZT} = proxy.$dict("D_GSXT_YJXX_CZZT")
// 搜索配置
const searchConfiger = ref([
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input"},
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input"},
{ label: "预警等级", prop: 'yjdj', placeholder: "请选择预警等级", showType: "select", options: [
{ label: "一级预警", value: "1" },
{ label: "二级预警", value: "2" },
{ label: "三级预警", value: "3" },
{ label: "四级预警", value: "4" }
]},
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
]);
const queryFrom = ref({});
// 页面数据
const pageData = reactive({
tableData: [],
tableData: [{ sfcs: 1 }],
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkBox",
loading: false,
haveControls: false,
haveControls: true,
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
},
controlsWidth: 160,
controlsWidth: 300,
tableColumn: [
{ label: "姓名", prop: "xm" },
{ label: "身份证号", prop: "sfzh" },
{ label: "身份证号", prop: "sfzh" },
{ label: "电话", prop: "dh" },
{ label: "组合类", prop: "zhlx" },
{ label: "预警等级", prop: "yjdj" },
{ label: "预警原因", prop: "yjyy", showOverflowTooltip: true },
{ label: "预警时间", prop: "yjsj" },
{ label: "处理状态", prop: "clzt" },
{ label: "组合类", prop: "sfdlmc" },
{ label: "组合小类", prop: "sfzlmc" },
{ label: "组合次数", prop: "sfcs", showSolt: true },
{ label: "标签颜色", prop: "bqys", showSolt: true },
{ label: "预警时间", prop: "yjsj" },
{ label: "预警分值", prop: "sffz" },
{ label: "处置状态", prop: "czzt", showSolt: true },
{ label: "所属县局", prop: "ssbm" },
]
});
onMounted(() => {
tabHeightFn();
getList();
gettbGsxtBqglSelectList()
});
const onSearch = (val) => {
queryFrom.value = {...val};
queryFrom.value = { ...val };
pageData.pageConfiger.pageCurrent = 1;
getList();
};
@ -110,16 +128,102 @@ const changeSize = (val) => {
};
const getList = () => {
// pageData.tableConfiger.loading = true;
pageData.tableConfiger.loading = true;
// TODO: 替换为实际的组合预警API接口
// qcckGet(queryFrom.value, '/mosty-gsxt/combinedWarning/selectPage').then((res) => {
// pageData.tableData = res.records || [];
// pageData.total = res.total || 0;
// pageData.tableConfiger.loading = false;
// }).catch(() => {
// pageData.tableConfiger.loading = false;
// });
tbYjxxGetZbtj(queryFrom.value).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 '#ffff00'
} 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
}
}) || []
})
}
watch(() => bqLbData.value.bqXl, (res) => {
searchConfiger.value.push({
label: "组合标签", prop: 'bqmc', placeholder: "请选择组合标签",
showType: "select", options: res
},)
}, { deep: true, immediate: true })
// 查看详情
const detailRef = ref()
const handleClick = (row) => {
detailRef.value.init(row)
}
const assessShow = ref(false)
const dataList = ref()
const pushAssess = (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 tabHeightFn = () => {

View File

@ -0,0 +1,57 @@
<template>
<el-dialog :title="`组合预警次数详情(${pageData.tableData.length}`" v-model="dialogVisible" width="60%">
<MyTable
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
>
</MyTable>
</el-dialog>
</template>
<script setup>
import { qcckGet } from "@/api/qcckApi.js";
import MyTable from "@/components/aboutTable/MyTable.vue";
import { ref , reactive , defineExpose} from 'vue'
const dialogVisible = ref(false)
const pageData = reactive({
tableData: [{jqbh:'JQBH-43',bjr:'张三',bjrdh:'15665255545',bjrsfzh:'510156565656525565',yjnr:'xxxxxxxxx',jsj:'2023-08-24 15:00:00'}], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
loading: false,
haveControls: false,
},
tableHeight:600,
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
tableColumn: [
{ label: "警情编号", prop: "jjdbh"},
{ label: "报警人", prop: "bjrmc" },
{ label: "报警人电话", prop: "bjdh" },
{ label: "报警人身份证", prop: "bjrzjhm"},
{ label: "预警内容", prop: "bjnr", showOverflowTooltip: true },
{ label: "报警时间", prop: "bjsj", showOverflowTooltip: true },
]
});
const init = (row) => {
dialogVisible.value = true;
pageData.tableConfiger.loading = true;
pageData.tableData = []
qcckGet({yjid:row.id},'/mosty-gsxt/yjzxSfyjxq/selectList').then((res)=>{
pageData.tableData = res || [];
pageData.tableConfiger.loading = false;
}).catch(()=>{
pageData.tableConfiger.loading = false;
})
}
defineExpose({
init
})
</script>

View File

@ -9,34 +9,56 @@
</div>
<!-- 搜索 -->
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount">
<template #defaultSlot>
<el-select @change="gettbGsxtBqglSelectList" v-model="queryFrom.sfdl" placeholder="请选择身份类型"
style="width: 100%">
<el-option :label="item.label" :value="item.value" v-for="(item, index) in bqLbData.bqDl" :key="index" />
</el-select>
</template>
<template #nameSlot>
<el-select v-model="queryFrom.sfxl" placeholder="请选择身份类型" style="width: 100%">
<el-option :label="item.label" :value="item.value" v-for="(item, index) in bqLbData.bqXl" :key="index" />
</el-select>
</template>
</Search>
</div>
<!-- 表格 -->
<div class="tabBox">
<MyTable
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
>
<template #controls="{ row }">
<el-link type="primary">下发指令</el-link>
<el-link type="success">查看反馈</el-link>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<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 #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="handleQsFk(row)">转会商</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="delDictItem(row.id)">详情</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>
</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>
</template>
<script setup>
@ -44,22 +66,26 @@ import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Search from "@/components/aboutTable/Search.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import { qcckGet } from "@/api/qcckApi.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 { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { yjzxSfyjSelectList } 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";
const { proxy } = getCurrentInstance();
const searchBox = ref();
const {D_GSXT_YJXX_CZZT} = proxy.$dict("D_GSXT_YJXX_CZZT")
// 搜索配置
const searchConfiger = ref([
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input"},
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input"},
{ label: "身份类型", prop: 'sflx', placeholder: "请选择身份类型", showType: "select", options: [
{ label: "重点人员", value: "1" },
{ label: "在逃人员", value: "2" },
{ label: "涉毒人员", value: "3" },
{ label: "涉恐人员", value: "4" }
]},
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "标签大类", prop: 'sflx', placeholder: "请选择标签大类", showType: "defaultSlot" },
{ label: "标签小类", prop: 'bqxl', placeholder: "请选择标签小类", showType: "nameSlot" },
]);
const queryFrom = ref({});
@ -72,33 +98,37 @@ const pageData = reactive({
rowHieght: 61,
showSelectType: "checkBox",
loading: false,
// haveControls: false,
haveControls: true,
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
},
controlsWidth: 160,
controlsWidth: 300, //操作栏宽度
tableColumn: [
{ label: "姓名", prop: "xm",},
{ label: "身份证号", prop: "sfzh", },
{ label: "电话", prop: "dh", },
{ label: "身份类型", prop: "sflx",},
{ label: "身份等级", prop: "sfdj",},
{ label: "预警原因", prop: "yjyy", showOverflowTooltip: true },
{ label: "预警时间", prop: "yjsj",},
{ label: "处理状态", prop: "clzt",},
{ label: "姓名", prop: "xm" },
{ label: "身份证号", prop: "sfzh" },
{ label: "电话", prop: "dh" },
{ label: "组合大类", prop: "sfdlmc" },
{ label: "组合小类", prop: "sfzlmc" },
{ label: "组合次数", prop: "sfcs", showSolt: true },
{ label: "标签颜色", prop: "bqys", showSolt: true },
{ label: "预警时间", prop: "yjsj" },
{ label: "预警分值", prop: "sffz" },
{ label: "处置状态", prop: "czzt", showSolt: true },
{ label: "所属县局", prop: "ssbm" },
]
});
onMounted(() => {
gettbGsxtBqglSelectList()
tabHeightFn();
getList();
});
const onSearch = (val) => {
queryFrom.value = {...val};
queryFrom.value = { ...val, ...queryFrom.value };
pageData.pageConfiger.pageCurrent = 1;
getList();
};
@ -114,17 +144,118 @@ const changeSize = (val) => {
};
const getList = () => {
// pageData.tableConfiger.loading = true;
pageData.tableConfiger.loading = true;
// TODO: 替换为实际的身份预警API接口
// qcckGet(queryFrom.value, '/mosty-gsxt/identityWarning/selectPage').then((res) => {
// pageData.tableData = res.records || [];
// pageData.total = res.total || 0;
// pageData.tableConfiger.loading = false;
// }).catch(() => {
// pageData.tableConfiger.loading = false;
// });
yjzxSfyjSelectList(queryFrom.value).then((res) => {
pageData.tableData = res.records || [];
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) => {
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 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 tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;

View File

@ -110,15 +110,15 @@ const changeSize = (val) => {
};
const getList = () => {
// pageData.tableConfiger.loading = true;
pageData.tableConfiger.loading = true;
// TODO: 替换为实际的身份预警API接口
// qcckGet(queryFrom.value, '/mosty-gsxt/identityWarning/selectPage').then((res) => {
// pageData.tableData = res.records || [];
// pageData.total = res.total || 0;
// pageData.tableConfiger.loading = false;
// }).catch(() => {
// pageData.tableConfiger.loading = false;
// });
qcckGet(queryFrom.value, '/mosty-gsxt/identityWarning/selectPage').then((res) => {
pageData.tableData = res.records || [];
pageData.total = res.total || 0;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
});
};
// 表格高度计算
@ -134,4 +134,4 @@ const tabHeightFn = () => {
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
</style>
</style>

View File

@ -20,8 +20,6 @@
</div>
</template>
</el-image>
<!-- <el-image :preview-teleported="true" style="width: 80px; height: 110px" :src="row.yjTp"
:preview-src-list="[row.yjTp]" /> -->
</template>
<template #nl="{ row }">
{{ IdCard(row.yjRysfzh, 3) }}
@ -30,12 +28,27 @@
{{ IdCard(row.yjRysfzh, 2) }}
</template>
<template #xsd="{ row }">
90%
{{ row.xsd }}%
</template>
<template #czzt="{ row }">
<DictTag v-model:value="row.czzt" :options="props.dict.D_GSXT_YJXX_CZZT" />
</template>
<template #yjJb="{ row }">
<DictTag v-model:value="row.yjJb" :options="props.dict.D_BZ_YJJB" />
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="danger" @click="delDictItem(row.id)">删除</el-link>
<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="delDictItem(row.id)">详情</el-link>
</template>
<!-- <el-button type="success" @click="showFeedback(item, '签收')" v-if="item.czzt == '01'">签收</el-button>
<el-button type="success" @click="showFeedback(item, '反馈')" v-if="item.czzt == '02'">反馈</el-button>
<el-button type="success" @click="showFeedback(item, '查看反馈')" v-if="item.czzt == '03'">查看反馈</el-button> -->
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
@ -44,19 +57,33 @@
</div>
</div>
<HolographicArchive v-model="assessShow" :dataList="dataList" />
<FkDialog @change="getList" />
<Information v-model="showDialog" title="发送指令" @submit='submit' @close='closeFszl'>
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj"
:tacitly="tacitly" />
</Information>
</template>
<script setup>
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { IdCard } from '@/utils/validate.js'
import { tbYjxxGetPageList } from '@/api/yj.js'
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
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 emitter from "@/utils/eventBus.js";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance();
const detailDiloag = ref();
const queryFrom = ref({});
const props = defineProps({
dict: {
type: Object,
default: {}
}
});
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
@ -64,7 +91,7 @@ const pageData = reactive({
rowHieght: 61,
showSelectType: "null",
loading: false,
haveControls: false
haveControls: true
},
total: 0,
@ -72,20 +99,26 @@ const pageData = reactive({
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 160, //操作栏宽度
controlsWidth: 300, //操作栏宽度
tableColumn: [
{ label: "预警图片", prop: "yjTp", showSolt: true },
{ label: "姓名", prop: "yjRyxm" },
{ label: "姓名", prop: "yjRyxm", width: 150, showOverflowTooltip: true },
{ label: "年龄", prop: "nl", showSolt: true },
{ label: "性别", prop: "xb", showSolt: true },
{ label: "预警级别", prop: "yjJb" },
{ label: "性别", prop: "xb", showSolt: true, width: 100 },
{ label: "预警级别", prop: "yjJb", showSolt: true },
{ label: "相似度", prop: "xsd", showSolt: true },
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true },
{ label: "预警地点", prop: "yjDz", showOverflowTooltip: true },
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true, width: 200 },
{ label: "预警地点", prop: "yjDz", showOverflowTooltip: true, width: 200 },
{ label: "预警次数", prop: "yjCs", showOverflowTooltip: true },
{ label: "布控手机号", prop: "yjRysjh", showOverflowTooltip: true },
{ label: "布控车牌号", prop: "yjClcph", showOverflowTooltip: true },
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true },
{ label: "处置状态", prop: "czzt", showSolt: true, width: 100 },
{ label: "布控手机号", prop: "yjRysjh", showOverflowTooltip: true, width: 100 },
{ label: "布控车牌号", prop: "yjClcph", showOverflowTooltip: true, width: 100 },
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true, width: 200 },
{ label: "预警标签", prop: "yjbqmc", width: 250 },
{ label: "所属部门", prop: "ssbm", width: 100 },
{ label: "所属县局", prop: "ssxgaj", width: 100 },
{ label: "所属市局", prop: "sssgaj", width: 100 },
]
});
@ -96,12 +129,6 @@ const pageData = reactive({
onMounted(() => {
tabHeightFn();
getList()
@ -131,10 +158,55 @@ const getList = (val) => {
pageData.tableConfiger.loading = false;
})
}
// 全息档案
const assessShow = ref(false)
const dataList = ref()
const pushAssess = (val) => {
assessShow.value = true;
dataList.value = val;
}
// 处理签收
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 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()
}
function close() {
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - 430;

View File

@ -6,7 +6,7 @@
<!-- 搜索 -->
<div ref="searchBox" class="searchBox">
<el-form :model="listQuery" label-width="auto" :inline="true" ref="searchArr">
<el-form-item label="布控类型" prop="yjlx" >
<el-form-item label="布控类型" prop="yjlx">
<el-select v-model="listQuery.yjlx" placeholder="请选择预警类型">
<el-option v-for="item in D_BZ_YJLX" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
@ -31,10 +31,11 @@
</div>
<!-- 表格 -->
<div class="tabBox" :style="{ height: pageData.tableHeight + 'px' }">
<el-tabs v-model="activeName" type="card" class="demo-tabs" @tab-click="handleClick" style="position: relative;z-index: 1;">
<el-tabs v-model="activeName" type="card" class="demo-tabs" @tab-click="handleClick"
style="position: relative;z-index: 1;">
<el-tab-pane label="本地预警" name="local">
<div style="padding:0 10px;"> <el-button type="primary" @click="exportExcel">导出</el-button></div>
<LocalWarning ref="localWarningRef" />
<LocalWarning ref="localWarningRef" :dict="{D_GSXT_YJXX_CZZT, D_BZ_YJJB}"/>
</el-tab-pane>
<el-tab-pane label="区厅预警" name="district">区厅预警</el-tab-pane>
</el-tabs>
@ -45,27 +46,33 @@
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<template #yjTp="{ row }">
<template v-if="!row.yjTp || row.yjTp.includes('baidu')">
<img src="@/assets/images/car.png" width="65" height="70" v-if="row.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="65" height="70" v-else />
<img src="@/assets/images/car.png" width="65" height="70" v-if="row.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="65" height="70" v-else />
</template>
<el-image v-else style="width: 80px; height:120px" :src="row.yjTp" :preview-src-list="[row.yjTp]" show-progress>
<template #error>
<div class="image-slot error">
<img src="@/assets/images/car.png" width="65" height="70" v-if="row.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="65" height="70" v-else />
</div>
</template>
<el-image v-else style="width: 80px; height:120px" :src="row.yjTp" :preview-src-list="[row.yjTp]"
show-progress>
<template #error>
<div class="image-slot error">
<img src="@/assets/images/car.png" width="65" height="70" v-if="row.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="65" height="70" v-else />
</div>
</template>
</el-image>
</el-image>
</template>
<template #nl="{ row }">
{{ IdCard(row.yjRysfzh, 3) }}
</template>
<template #xb="{ row }">
{{ IdCard(row.yjRysfzh, 2) }}
</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 #xsd="{ row }">
90%
{{ row.xsd }}%
</template>
<!-- 操作 -->
</MyTable>
@ -94,7 +101,7 @@ import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import FileSaver from "file-saver";
import * as XLSX from "xlsx";
const { proxy } = getCurrentInstance();
const { D_BZ_YJLX } = proxy.$dict("D_BZ_YJLX")
const { D_BZ_YJLX, D_GSXT_YJXX_CZZT, D_BZ_YJJB } = proxy.$dict("D_BZ_YJLX", "D_GSXT_YJXX_CZZT","D_BZ_YJJB")
const searchBox = ref(); //搜索框
const form = ref({});
const shortcuts = [
@ -148,7 +155,7 @@ const pageData = reactive({
{ label: "姓名", prop: "yjRyxm" },
{ label: "年龄", prop: "nl", showSolt: true },
{ label: "性别", prop: "xb", showSolt: true },
{ label: "预警级别", prop: "yjJb" },
{ label: "预警级别", prop: "yjJb", showSolt: true },
{ label: "相似度", prop: "xsd", showSolt: true },
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true },
{ label: "预警地点", prop: "yjDz", showOverflowTooltip: true },
@ -156,6 +163,7 @@ const pageData = reactive({
{ label: "布控手机号", prop: "yjRysjh", showOverflowTooltip: true },
{ label: "布控车牌号", prop: "yjClcph", showOverflowTooltip: true },
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true },
{ label: "处置状态", prop: "czzt", showSolt: true },
]
});
const showDc = ref(false)
@ -249,16 +257,13 @@ const handleExport = () => {
// 处理表格数据
pageData.tableData.forEach((row, index) => {
const tr = document.createElement('tr');
// 添加序号
const indexTd = document.createElement('td');
indexTd.textContent = index + 1;
tr.appendChild(indexTd);
// 添加其他单元格数据
pageData.tableColumn.forEach(column => {
const td = document.createElement('td');
// 处理自定义插槽的情况
if (column.showSolt) {
if (column.prop === 'yjTp') {

View File

@ -16,7 +16,7 @@
<DictTag :tag="false" :value="item.qtlb" color="#fff" :options="dict.D_GS_ZDQT_LB" />
</div>
<div class="mt4 two_text_detail flex align-center">风险等级
<DictTag :tag="false" :value="item.yjJb" color="#fff" :options="dict.D_BZ_TYJB" />
<DictTag :tag="false" :value="item.yjJb" color="#fff" :options="dict.D_BZ_YJJB" />
</div>
</div>
<!-- 经验分享 -->

View File

@ -49,7 +49,7 @@
<div class="mt4 two_text_detail" v-if="buttonBox">
<el-button type="primary" @click="pushAssess(item)">全息档案</el-button>
<el-button color="#ef7762" @click="showDetail(item)" style="color: #fff;">转合成</el-button>
<el-button type="warning">转基管</el-button>
<!-- <el-button type="warning">转基管</el-button> -->
<el-button type="danger">转会商</el-button>
<el-button type="success" @click="showFeedback(item, '签收')" v-if="item.czzt == '01'">签收</el-button>
<el-button type="success" @click="showFeedback(item, '反馈')" v-if="item.czzt == '02'">反馈</el-button>

View File

@ -1,6 +1,6 @@
<!--全息档案展示组件 -->
<template>
<el-dialog v-model="modelValue" :title="title" :width="width" @close="close" append-to-body>
<el-dialog :draggable="true" v-model="modelValue" :title="title" :width="width" @close="close" append-to-body>
<div class="archive-container">
<!-- 基本信息卡片 -->
<div class="basic-info-card">
@ -235,22 +235,11 @@ watch(() => props.modelValue, (newVal, oldVal) => {
const personData = ref({ });
// 预览图片列表
const srcList = ref([
'https://fuss10.elemecdn.com/a/3f/3302e58f9a181d2509f3dc0fa68b0jpeg.jpeg',
'https://fuss10.elemecdn.com/1/34/19aa98b1fcb2781c4fba33d850549jpeg.jpeg',
'https://fuss10.elemecdn.com/0/6f/e35ff375812e6b0020b6b4e8f9583jpeg.jpeg',
'https://fuss10.elemecdn.com/9/bb/e27858e973f5d7d3904835f46abbdjpeg.jpeg',
'https://fuss10.elemecdn.com/d/e6/c4d93a3805b3ce3f323f7974e6f78jpeg.jpeg',
'https://fuss10.elemecdn.com/3/28/bbf893f792f03a54408b3b7a7ebf0jpeg.jpeg',
'https://fuss10.elemecdn.com/2/11/6535bcfb26e4c79b48ddde44f4b6fjpeg.jpeg',
]);
// 定义事件
const emit = defineEmits(['update:modelValue']);
const getryxxJbxxSave = () => {
ryxxJbxxSave({ sfzhm:'540402195805123219' // props.dataList.rysfzh
}).then((res) => {
const params = { sfzhm: props.dataList.rysfzh || props.dataList.yjRysfzh||props.dataList.sfzh };
ryxxJbxxSave(params).then((res) => {
personData.value = res[0]
});
}

View File

@ -25,9 +25,8 @@ import DialogDragger from "@/views/home/layout/dialogDragger.vue";
import deployControlItem from "@/views/home/components/deployControlItem.vue";
import Information from "@/views/home/model/information.vue";
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import { tbYjxxGsgj } from '@/api/yj'
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import { tbYjxxGsgj } from '@/api/yj'
import { ref, defineProps, onMounted, watch, getCurrentInstance } from "vue";
import emitter from "@/utils/eventBus.js";
const gjyjList = ref(null); //预警列表数据
@ -49,6 +48,7 @@ const props = defineProps({
function close() {
emitter.emit('deletePointArea', 'home_yj_map');
emitter.emit("showHomeYJ", false);
emitter.emit("closeYp")
}
const showMap = ref(false)
onMounted(() => {
@ -202,8 +202,6 @@ const plotThetrajectory = (val) => {
}
// 查看反馈
const showFeedback = (val) => {
console.log(val,"查查零xxxxxx零");
emitter.emit("openFkDialog",val )
}
// 发送指令
@ -229,7 +227,6 @@ const closeFszl = () => {
}
</script>
<style lang="scss" scoped>

View File

@ -51,17 +51,23 @@
<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;">
<el-icon :size="20" v-if="ispLayBack" @click="closeLayBack">
<Bell />
</el-icon>
<!-- -->
<el-icon :size="20" v-else @click="openLayBack">
<MuteNotification />
</el-icon>
</div>
<div style="width: 100%;border: 1px sienna;position: relative">
<GdMap></GdMap>
</div>
<div class="flex-1" style="width: 340px;position: absolute;z-index: 100;right: 0;">
<DeployControl />
</div>
<!-- <div class="flex-1" style="width: 340px;position: absolute;z-index: 100;left: 0;">
<div style="background-color: #07274d; height: 100px;">
生份证"xxxxxxxx"
</div>
</div> -->
<div class="flex-1" style="width: 340px;position: absolute;z-index: 100;left: 0;top: 30%;">
<GeneralWindow />
</div>
@ -79,6 +85,7 @@
<Bkcz></Bkcz>
</div>
</div>
</div>
<!-- 左边弹窗 -->
<LeftDialog></LeftDialog>
@ -86,7 +93,7 @@
</template>
<script setup>
import { ref, getCurrentInstance, reactive, onMounted, onUnmounted } from 'vue'
import { ref, onMounted, onUnmounted } from 'vue'
import LeftDialog from './dialog/leftDialog'
import GdMap from "@/components/GdMap/index.vue";
import Head from './layout/head.vue'
@ -98,7 +105,6 @@ import Bkcz from './model/bkcz.vue'
import WarningLevels from './model/warningLevels.vue'
import Yszs from './model/yszs.vue'
import DeployControl from './model/deployControl.vue';
import SituationAssessment from './model/situationAssessment.vue'
import Experience from './model/experience.vue'
import Calendar from './model/calendar.vue'
import KeyPpersonneltypes from './model/keyPpersonneltypes.vue'
@ -109,6 +115,11 @@ import { bm, centralPoint } from '@/views/backOfficeSystem/IntelligentControl/De
import Judgment from './model/judgment.vue'
import { tbYjxxGetList } from '@/api/zdr.js'
import GeneralWindow from './model/generalWindow.vue'
import WebSoketClass from '@/utils/webSocket.js'
import {timeValidate} from '@/utils/tools.js'
// 导入音频播放器工具类
import audioPlayer from '@/utils/audioPlayer'
const webSoket = new WebSoketClass()
const changeXzqh = (val, trg) => {
setTimeout(() => {
// 先移除已有的边界
@ -204,12 +215,89 @@ const makerCenter = () => {
})
emitter.emit("addPointArea", { coords, icon: dw, flag: "hm", size: '14px', showTitle: true, offset: [0, -25] });
}
//播放音频
const ispLayBack = ref(true)
// 打开播放
const openLayBack = () => {
ispLayBack.value = true
}
// 关闭播放
const closeLayBack = () => {
ispLayBack.value = false
audioPlayer.pause()
}
// 初始化音频播放器
const initAudioPlayer = () => {
// 使用工具类初始化音频播放器
audioPlayer.init(require('@/assets/images/yjsy.mp3'))
.then(() => {
console.log('音频播放器初始化成功');
// 只有当ispLayBack为true时才播放
if (ispLayBack.value) {
audioPlayer.muted = false
}
})
.catch(error => {
console.error('初始化音频播放器失败:', error);
})
}
// 组件挂载时初始化音频播放器
onMounted(() => {
getDepId()
makerCenter()
mouseLeave()
getTbYjxxGetList()
// 初始化音频播放器
initAudioPlayer()
webSoket.connect()
// 监听音频播放事件获取WebSocket消息数据
emitter.on("openYp", (newsDate) => {
// 使用工具类播放音频,自动处理静音切换
if (ispLayBack.value) {
audioPlayer.play()
.then(() => {
console.log('WebSocket触发音频播放成功');
})
.catch(error => {
console.error('WebSocket触发音频播放失败:', error);
})
const coords = {
id: newsDate.id,
jd: newsDate.jd,
wd: newsDate.wd,
yjtp: newsDate.yjTp,
yjnr: newsDate.yjNr,
yjLx: newsDate.yjlx,
yjlx: '01',
yjsj: newsDate.yjSj,
rysfzh: newsDate.yjRysfzh,
ryxm: newsDate.yjRyxm,
}
const icons = require("@/assets/point/jq.png")
emitter.emit('addPointArea', { coords: [{ jd: coords.jd, wd: coords.wd }], icon: icons, flag: 'yjs' })
emitter.emit('yjDetail', coords)
}
})
emitter.on("closeYp", () => {
audioPlayer.pause()
})
})
const timeRef = ref('')
let bj=ref(0)
// 布控预警上图
const getTbYjxxGetList = () => {
tbYjxxGetList().then(res => {
// 设置为当天时间范围00:00:00 到 23:59:59
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),
}
tbYjxxGetList(promes).then(res => {
const coords = res.map(item => {
return {
id: item.id,
@ -224,33 +312,12 @@ const getTbYjxxGetList = () => {
ryxm: item.yjRyxm,
}
})
if (timeRef.value != coords[0].yjsj&&bj.value==1) {
const icons = require("@/assets/point/jq.png")
emitter.emit('addPointArea', { coords: [{ jd: coords[0].jd, wd: coords[0].wd }], icon: icons, flag: 'yjs' })
emitter.emit('yjDetail', coords[0])
timeRef.value = coords[0].yjsj
}
bj.value=1
const icon = require("@/assets/point/yj.png")
emitter.emit('addPoint', { coords: coords, icon: icon, flag: 'yj', fontColor: '#FF0000' })
})
}
let timing = ref(true)
onMounted(() => {
getDepId()
makerCenter()
mouseLeave()
getTbYjxxGetList()
})
const timer = setInterval(() => {
getTbYjxxGetList()
}, 60000)
const reversalPushShow = ref(true)
const reversalPush = () => {
@ -272,7 +339,14 @@ const mouseLeave = () => {
}
onUnmounted(() => {
clearInterval(timing.value)
clearInterval(timer)
// 组件卸载时停止音频播放并释放资源
if (audioPlayer) {
audioPlayer.destroy()
}
// 组件卸载时关闭WebSocket连接
if (webSoket) {
webSoket.closeConnection()
}
})

View File

@ -46,7 +46,7 @@ const checkDatas = reactive({
hasChoose: ["布控"]
});
const total = ref(0);
const yjJb = ref([10, 20, 30, 40]);
const yjJb = ref(['01', '02', '03', '04']);
const yjLx = ref(['01']);
const pageNum = ref(1);
const loading = ref(false); // 加载中
@ -73,10 +73,10 @@ function changeData(val) {
checkData.hasChoose = val;
let ids = [];
val.forEach(it => {
if (it == '一级') ids.push(10);
if (it == '二级') ids.push(20);
if (it == '三级') ids.push(30);
if (it == '四级') ids.push(40);
if (it == '一级') ids.push('01');
if (it == '二级') ids.push('02');
if (it == '三级') ids.push('03');
if (it == '四级') ids.push('04');
});
yjJb.value = ids
if (val.length == 0) personList.value = [];
@ -90,7 +90,7 @@ function changeDatas(val) {
let ids = [];
if (val.includes('布控')) {
typeS.value = true
yjJb.value = [10, 20, 30, 40]
yjJb.value = ['01', '02', '03', '04']
} else {
yjJb.value = []
typeS.value = false
@ -108,7 +108,7 @@ function changeDatas(val) {
if (val.length == 0) personList.value = [];
else getList();
}
const isExpanded = ref(true); // 控制展开/收缩状态
const isExpanded = ref(false); // 控制展开/收缩状态
const changeTab = () => {
// 切换展开/收缩状态
@ -244,9 +244,35 @@ const chooseItem = (item) => {
emitter.emit('showHomeYJ', [content.value]);
})
break;
case '':
case '03':
content.value = {
id: item.id,
ryxm: res.xm || '',
rysfzh: res.sfzh,
yjsj: res.yjsj || '',
yjdz: "",
yjtp: "",
yjbq: res.xwms || '',
yjlb: item.yjlb || '',
czzt: res.czzt || '',
yjbt: res.yjBt || '',
}
emitter.emit('showHomeYJ', [content.value]);
break;
case '04':
content.value = {
id: item.id,
ryxm: res.xm || '',
rysfzh: res.sfzh,
yjsj: res.yjsj || '',
yjdz: "",
yjtp: "",
yjbq: res.xwms || '',
yjlb: item.yjlb || '',
czzt: res.czzt || '',
yjbt: res.yjBt || '',
}
emitter.emit('showHomeYJ', [content.value]);
break;
}

View File

@ -5,7 +5,7 @@
<div class="comom-cnt zdryBox">
<!-- <ul class="ryBox" v-loading="loading" v-infinite-scroll="loadList" style="overflow: auto">
<li v-for="item in personList" :key="item.id" >
<Assessment :item="item" :dict="{D_GS_ZDQT_LB,D_BZ_TYJB}" :lx="3"/>
<Assessment :item="item" :dict="{D_GS_ZDQT_LB,D_BZ_YJJB}" :lx="3"/>
</li>
<MOSTY.Empty :show="!loading && personList.length <= 0" :imgSize="100"></MOSTY.Empty>
</ul> -->
@ -20,7 +20,7 @@ import * as MOSTY from "@/components/MyComponents/index";
import CheckBox from "@/components/checkBox/index.vue";
import { ref ,reactive, onMounted,getCurrentInstance} from 'vue';
const { proxy } = getCurrentInstance();
const {D_GS_ZDQT_LB,D_BZ_TYJB} =proxy.$dict('D_GS_ZDQT_LB','D_BZ_TYJB')
const {D_GS_ZDQT_LB,D_BZ_YJJB} =proxy.$dict('D_GS_ZDQT_LB','D_BZ_YJJB')
const checkData = reactive({
list: ["人员", "车辆"],
hasChoose: ["人员", "车辆"],

View File

@ -5,7 +5,7 @@
<div class="comom-cnt zdryBox">
<ul class="ryBox" v-loading="loading" v-infinite-scroll="loadList" style="overflow: auto">
<li v-for="item in personList" :key="item.id" >
<Assessment :item="item" :dict="{D_GS_ZDQT_LB,D_BZ_TYJB}" :lx="2"/>
<Assessment :item="item" :dict="{D_GS_ZDQT_LB,D_BZ_YJJB}" :lx="2"/>
</li>
<MOSTY.Empty :show="!loading && personList.length <= 0" :imgSize="100"></MOSTY.Empty>
</ul>
@ -20,7 +20,7 @@ import * as MOSTY from "@/components/MyComponents/index";
import CheckBox from "@/components/checkBox/index.vue";
import { ref ,reactive, onMounted,getCurrentInstance} from 'vue';
const { proxy } = getCurrentInstance();
const {D_GS_ZDQT_LB,D_BZ_TYJB} =proxy.$dict('D_GS_ZDQT_LB','D_BZ_TYJB')
const {D_GS_ZDQT_LB,D_BZ_YJJB} =proxy.$dict('D_GS_ZDQT_LB','D_BZ_YJJB')
const checkData = reactive({
list: ["人员", "车辆"],
hasChoose: ["人员", "车辆"],