Compare commits

...

60 Commits

Author SHA1 Message Date
c67b63b4f1 更新 2026-03-06 16:02:10 +08:00
4518038d9e 更新 2026-03-06 16:01:08 +08:00
78c828763b 更新 2026-03-06 15:03:42 +08:00
dcf680163a 更新 2026-03-06 15:02:51 +08:00
b1ea8f2e5b 更新 2026-03-06 14:45:30 +08:00
e561ef9e6d 解决冲突 2026-02-24 09:18:32 +08:00
b8c393f773 更新 2026-02-24 09:16:07 +08:00
lcw
f30a2d7411 lcw 2026-02-07 16:54:04 +08:00
lcw
d2e4fc137d Merge branch 'main' of http://61.139.16.27:26684/zy_oyj/sgxt_web 2026-02-07 10:24:37 +08:00
lcw
c0ba4c7c49 lcw 2026-02-07 10:24:29 +08:00
2aef20eabf Merge branch 'main' of http://61.139.16.27:26684/zy_oyj/sgxt_web 2026-02-06 15:01:01 +08:00
9d4aba2f47 更新情报采集 2026-02-06 15:00:13 +08:00
lcw
323fcd25fe lcw 2026-02-05 17:17:25 +08:00
lcw
872fcf7332 Merge branch 'main' of http://61.139.16.27:26684/zy_oyj/sgxt_web
、·# especially if it merges an updated upstream into a topic branch.
2026-02-05 10:48:52 +08:00
a2fb3dcba5 更新 2026-02-05 10:48:20 +08:00
lcw
c4dca8f769 Merge branch 'main' of http://61.139.16.27:26684/zy_oyj/sgxt_web 2026-02-05 10:47:01 +08:00
lcw
b306f2b03b lcw 2026-02-05 10:46:54 +08:00
d3b4e76544 更新 2026-02-04 12:39:31 +08:00
2a82feb59a 更新权限注册 2026-02-04 12:36:44 +08:00
db3e3ee82f 更新 2026-02-04 12:03:08 +08:00
c8c130093f 更新页面 2026-02-04 11:50:44 +08:00
c18ce8ff0e 更新页面 2026-02-04 10:32:58 +08:00
7d61f83463 更新 2026-02-03 18:00:05 +08:00
da05ca015e 更新 2026-02-02 10:42:28 +08:00
a129e6d3f4 更新 2026-02-02 10:33:58 +08:00
2ea24d36f2 更新 2026-01-31 17:26:24 +08:00
dfe6036489 更新 2026-01-31 17:12:04 +08:00
a8b39af475 更新 2026-01-31 17:10:40 +08:00
fa4b36bd8c 更新 2026-01-31 16:48:47 +08:00
2cc924d091 更新 2026-01-31 15:01:31 +08:00
06453b284c 更新 2026-01-31 14:59:39 +08:00
4ad9f4976f 更新 2026-01-30 12:10:31 +08:00
39cf4b27f5 更新 2026-01-29 17:45:42 +08:00
62db6672f6 新增页面 2026-01-29 16:47:04 +08:00
5a1fc57019 更新 2026-01-29 10:33:37 +08:00
c606d6e8fd 更新 2026-01-28 19:21:00 +08:00
d003d7a20e 更新页面 2026-01-28 18:54:37 +08:00
d75295e756 更新 2026-01-28 18:43:40 +08:00
1390662e4d 更新大屏 2026-01-28 18:40:46 +08:00
5545659aee 更新 2026-01-28 16:56:02 +08:00
2635c76e79 更新布控 2026-01-28 16:40:47 +08:00
0e5a9c710d 更新 2026-01-28 16:15:40 +08:00
861c1168e7 更新 2026-01-28 10:10:25 +08:00
f7a83c1541 更新页面 2026-01-27 18:14:10 +08:00
105d13e8cb 更新 2026-01-27 17:28:36 +08:00
9e09db7f49 更新 2026-01-27 17:22:12 +08:00
390ef86532 更新 2026-01-27 10:10:33 +08:00
4f70b13ab7 Merge branch 'main' of http://61.139.16.27:26684/zy_oyj/sgxt_web 2026-01-27 09:43:44 +08:00
8c66561605 更新 2026-01-27 09:42:38 +08:00
lcw
65bc52b352 Merge branch 'main' of http://61.139.16.27:26684/zy_oyj/sgxt_web 2026-01-26 23:34:58 +08:00
lcw
2ceaa966cf lcw 2026-01-26 23:34:51 +08:00
9b8e788e61 更新时间 2026-01-26 19:59:57 +08:00
13d206f497 更新 2026-01-26 19:54:57 +08:00
ba26f616ba 更新 2026-01-26 18:39:29 +08:00
756271abe1 更新 2026-01-26 18:18:52 +08:00
35a1a0d247 更新 2026-01-26 18:07:54 +08:00
5a651a1f90 更新 2026-01-26 18:03:42 +08:00
lcw
df187151d6 Merge branch 'main' of http://61.139.16.27:26684/zy_oyj/sgxt_web 2026-01-26 17:35:11 +08:00
lcw
c7671317c5 lcw 2026-01-26 17:35:04 +08:00
lcw
1a61e26279 lcw 2026-01-26 17:27:28 +08:00
121 changed files with 6813 additions and 3743 deletions

View File

@ -7,7 +7,6 @@
</keep-alive> </keep-alive>
</router-view> </router-view>
<Fzq /> <Fzq />
</template> </template>
<script setup> <script setup>
import Watermark from "@/components/Watermark.vue"; import Watermark from "@/components/Watermark.vue";

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

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 313 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

View File

@ -1,5 +1,12 @@
<template> <template>
<DraggableResizableVue v-if="props.modelValue" <div class="mimiBox flex" @click="handleWindowSize" v-show="isMinimized" >
<div class="item mr5 one"></div>
<div class="item mr5 two"></div>
<div class="item mr5 three"></div>
<div class="item mr5 four"></div>
<div class="item mr5 five"></div>
</div>
<DraggableResizableVue v-show="!isMinimized"
v-model:x="element.x" v-model:x="element.x"
v-model:y="element.y" v-model:y="element.y"
v-model:h="element.height" v-model:h="element.height"
@ -19,17 +26,17 @@
<div class="conference-header"> <div class="conference-header">
<div class="header-top"> <div class="header-top">
<div class="title-section" v-show="displaySubject"> <div class="title-section" v-show="displaySubject">
<h3 v-if="!editSubject" @click="editSubject = true" class="conference-title"> <h3 v-if="!editSubject" @click="editSubject = true" class="conference-title">{{ displaySubject }} </h3>
{{ displaySubject }}
</h3>
<el-input v-else v-model="subject" autofocus allow-clear @blur="updateSubject" class="title-input"/> <el-input v-else v-model="subject" autofocus allow-clear @blur="updateSubject" class="title-input"/>
<div class="meeting-id-tag" @click="copyMeetingNumber" v-if="activeMeetingConfig?.meeting?.number"> <div class="meeting-id-tag" @click="copyMeetingNumber" v-if="activeMeetingConfig?.meeting?.number">
<span class="id-label">会议号:</span> <span class="id-label">会议号:</span>
<span class="id-value">{{ activeMeetingConfig?.meeting?.number }}</span> <span class="id-value">{{ activeMeetingConfig?.meeting?.number }}</span>
<el-icon class="copy-icon"><CopyDocument /></el-icon> <el-icon class="copy-icon"><CopyDocument /></el-icon>
</div> </div>
</div> </div>
<div style="color: #999999;padding-right: 30px;">
<el-icon size="18px" @click="handleWindowSize"><Minus /></el-icon>
</div>
</div> </div>
<div class="participants-info"> <div class="participants-info">
<el-icon><User /></el-icon> <el-icon><User /></el-icon>
@ -75,17 +82,22 @@
<div class="control-bar"> <div class="control-bar">
<!-- 锁定 --> <!-- 锁定 -->
<el-button circle @click="lockConference" class="control-btn"> <div class="flex dir-column align-center">
<el-icon size="20px" v-if="activeMeetingConfig?.lockStatus == 1"><Lock/></el-icon> <el-button circle @click="lockConference" class="control-btn">
<el-icon size="20px" v-else ><Unlock/></el-icon> <el-icon size="24px" v-if="activeMeetingConfig?.lockStatus == 1"><Lock/></el-icon>
</el-button> <el-icon size="24px" v-else ><Unlock/></el-icon>
</el-button>
<div>{{ activeMeetingConfig?.lockStatus == 1 ? '已锁定' : '未锁定' }}</div>
</div>
<!-- 麦克风 --> <!-- 麦克风 -->
<el-button circle @click="setMuteMic" class="control-btn"> <div class="flex dir-column align-center">
<el-button circle @click="setMuteMic" class="control-btn">
<img v-if="isMicEnable" src="@/assets/images/webPuc/svgs/microphone.svg" alt=""> <img v-if="isMicEnable" src="@/assets/images/webPuc/svgs/microphone.svg" alt="">
<img v-else src="@/assets/images/webPuc/svgs/microphone_mute.svg" alt=""> <img v-else src="@/assets/images/webPuc/svgs/microphone_mute.svg" alt="">
</el-button> </el-button>
<div>麦克风</div>
</div>
<el-popover title="选择麦克风" trigger="click" position="bottom-end"> <el-popover title="选择麦克风" trigger="click" position="bottom-end">
<template #reference> <template #reference>
<el-icon class="control-arrow" color="#fff"><ArrowDown/></el-icon> <el-icon class="control-arrow" color="#fff"><ArrowDown/></el-icon>
@ -94,10 +106,14 @@
</el-popover> </el-popover>
<!-- 扬声器 --> <!-- 扬声器 -->
<el-button circle @click="setMuteEar" class="control-btn"> <div class="flex dir-column align-center">
<img v-if="audioOuputStatus == 1" src="@/assets/images/webPuc/svgs/earpiece.svg" alt=""> <el-button circle @click="setMuteEar" class="control-btn">
<img v-else src="@/assets/images/webPuc/svgs/trumpet_mute.svg" alt=""> <img v-if="audioOuputStatus == 1" src="@/assets/images/webPuc/svgs/earpiece.svg" alt="">
</el-button> <img v-else src="@/assets/images/webPuc/svgs/trumpet_mute.svg" alt="">
</el-button>
<div>扬声器</div>
</div>
<el-popover title="选择扬声器" trigger="click" position="bottom-end"> <el-popover title="选择扬声器" trigger="click" position="bottom-end">
<template #reference> <template #reference>
<el-icon class="control-arrow" color="#fff"><ArrowDown/></el-icon> <el-icon class="control-arrow" color="#fff"><ArrowDown/></el-icon>
@ -106,10 +122,13 @@
</el-popover> </el-popover>
<!-- 摄像头 --> <!-- 摄像头 -->
<el-button circle @click="setCamera" class="control-btn"> <div class="flex dir-column align-center">
<img v-if="userInfo?.camera_status === CAMERA_STATUS_OPEN" src="@/assets/images/webPuc/svgs/camera.svg" alt=""> <el-button circle @click="setCamera" class="control-btn">
<img v-else src="@/assets/images/webPuc/svgs/camera_mute.svg" alt=""> <img v-if="userInfo?.camera_status === CAMERA_STATUS_OPEN" src="@/assets/images/webPuc/svgs/camera.svg" alt="">
</el-button> <img v-else src="@/assets/images/webPuc/svgs/camera_mute.svg" alt="">
</el-button>
<div>摄像头</div>
</div>
<el-popover title="选择摄像头" trigger="click" position="bottom-end"> <el-popover title="选择摄像头" trigger="click" position="bottom-end">
<template #reference> <template #reference>
<el-icon class="control-arrow" color="#fff"><ArrowDown/></el-icon> <el-icon class="control-arrow" color="#fff"><ArrowDown/></el-icon>
@ -118,64 +137,72 @@
</el-popover> </el-popover>
<!-- 屏幕共享 --> <!-- 屏幕共享 -->
<el-button circle @click="setShareScreenStatus(1)" class="control-btn"> <div class="flex dir-column align-center">
<img src="@/assets/images/webPuc/svgs/share_video.svg" alt=""> <el-button circle @click="setShareScreenStatus(1)" class="control-btn">
</el-button> <img src="@/assets/images/webPuc/svgs/share_video.svg" alt="">
</el-button>
<div>屏幕共享</div>
</div>
<!-- 结束共享 / 结束会议 (Center) --> <!-- 结束共享 / 结束会议 (Center) -->
<el-button v-if="activeMeetingConfig?.sharingMember?.basedata_id === userInfo?.basedata_id" <el-button v-if="activeMeetingConfig?.sharingMember?.basedata_id === userInfo?.basedata_id" type="danger" shape="round" status="danger" class="hangup-btn" @click="setShareScreenStatus(0)">结束共享</el-button>
type="danger" <!-- 结束会议 v-if="globalStore.IS_CURRENT_MEETING_OWNER"-->
shape="round" <el-button v-else type="danger" shape="round" class="hangup-btn" @click="endConference">结束会议</el-button>
status="danger"
class="hangup-btn"
@click="setShareScreenStatus(0)">
结束共享
</el-button>
<template v-else>
<!-- 结束会议 v-if="globalStore.IS_CURRENT_MEETING_OWNER"-->
<el-button
type="danger"
shape="round"
class="hangup-btn"
@click="endConference">
结束会议
</el-button>
</template>
<!-- 成员管理 --> <!-- 成员管理 -->
<el-button circle @click="showMembers" class="control-btn"> <div class="flex dir-column align-center">
<el-icon color="#fff" size="20"><Auatar/></el-icon> <el-button circle @click="showMembers" class="control-btn">
</el-button> <el-icon color="#fff" size="24px"><Grid /></el-icon>
</el-button>
<div>成员管理</div>
</div>
<!-- 语音激励 --> <!-- 语音激励 -->
<el-button circle @click="setVoiceStimulation()" class="control-btn"> <div class="flex dir-column align-center">
<img v-if="activeMeetingConfig?.voiceStimulation" src="@/assets/images/webPuc/svgs/icon_embrave.svg" alt=""> <el-button circle @click="setVoiceStimulation()" class="control-btn">
<img v-else src="@/assets/images/webPuc/svgs/conference_icom_cancel_voice_stimulation.svg" alt=""> <img v-if="activeMeetingConfig?.voiceStimulation" src="@/assets/images/webPuc/svgs/icon_embrave.svg" alt="">
</el-button> <img v-else src="@/assets/images/webPuc/svgs/conference_icom_cancel_voice_stimulation.svg" alt="">
</el-button>
<div>语音激励</div>
</div>
<!-- 布局 --> <!-- 布局 -->
<!-- <LaoutType @setConfernceLayoutType="setConfernceLayoutType" /> --> <!-- <LaoutType @setConfernceLayoutType="setConfernceLayoutType" /> -->
<!-- 画面抓取-截图 --> <!-- 画面抓取-截图 -->
<el-button circle @click="startScreenshot" class="control-btn"> <div class="flex dir-column align-center">
<el-icon color="#fff" size="20"><Scissor/></el-icon> <el-button circle @click="startScreenshot" class="control-btn">
</el-button> <el-icon color="#fff" size="24px"><Scissor/></el-icon>
</el-button>
<div>截图</div>
</div>
<!-- 视频广播 --> <!-- 视频广播 -->
<el-button circle @click="broadcastAction" class="control-btn"> <div class="flex dir-column align-center">
<img src="@/assets/images/webPuc/svgs/icon_broadcast.svg" alt=""> <el-button circle @click="broadcastAction" class="control-btn">
</el-button> <img src="@/assets/images/webPuc/svgs/icon_broadcast.svg" alt="">
</el-button>
<div>视频广播</div>
</div>
<!-- 录屏 --> <!-- 录屏 -->
<el-button circle @click="!isRecording ? mediaRecorder.start() : mediaRecorder.stop()" class="control-btn"> <div class="flex dir-column align-center">
<el-icon v-if="!isRecording"><Camera/></el-icon> <el-button circle @click="!isRecording ? mediaRecorder.start() : mediaRecorder.stop()" class="control-btn">
<el-icon v-else style="color: red"><Videopause/></el-icon> <el-icon size="24px" v-if="!isRecording"><Camera/></el-icon>
</el-button> <el-icon size="24px" v-else style="color: red"><Videopause/></el-icon>
<el-button circle @click="toggleFullscreen" class="control-btn"> </el-button>
<el-icon v-if="!isFullscreen"><svg class="icon" width="200" height="200" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M384 192H192a64 64 0 00-64 64v192a32 32 0 1064 0V288h192a32 32 0 000-64zm384 64H576a32 32 0 100 64h192v160a32 32 0 1064 0V256a64 64 0 00-64-64zM352 768H192V608a32 32 0 10-64 0v192a64 64 0 0064 64h160a32 32 0 100-64zm544-160a32 32 0 00-32 32v128H704a32 32 0 100 64h160a64 64 0 0064-64V640a32 32 0 00-32-32z"/></svg></el-icon> <div>{{ isRecording ? '录屏':'停止' }}</div>
<el-icon v-else><svg class="icon" width="200" height="200" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M352 288a32 32 0 010-64h160a32 32 0 0132 32v160a32 32 0 11-64 0V320H352zm320 448a32 32 0 010 64H512a32 32 0 01-32-32V608a32 32 0 1164 0v128h128zM256 672a32 32 0 00-32-32H96a32 32 0 00-32 32v128a32 32 0 1064 0v-96h64a32 32 0 0032-32zm640-384a32 32 0 00-32 32v96h-64a32 32 0 100 64h128a32 32 0 0032-32V288a32 32 0 00-32-32z"/></svg></el-icon> </div>
</el-button>
<div class="flex dir-column align-center">
<el-button circle @click="toggleFullscreen" class="control-btn">
<el-icon size="24px" v-if="!isFullscreen"><svg class="icon" width="200" height="200" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M384 192H192a64 64 0 00-64 64v192a32 32 0 1064 0V288h192a32 32 0 000-64zm384 64H576a32 32 0 100 64h192v160a32 32 0 1064 0V256a64 64 0 00-64-64zM352 768H192V608a32 32 0 10-64 0v192a64 64 0 0064 64h160a32 32 0 100-64zm544-160a32 32 0 00-32 32v128H704a32 32 0 100 64h160a64 64 0 0064-64V640a32 32 0 00-32-32z"/></svg></el-icon>
<el-icon size="24px" v-else ><svg class="icon" width="200" height="200" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M352 288a32 32 0 010-64h160a32 32 0 0132 32v160a32 32 0 11-64 0V320H352zm320 448a32 32 0 010 64H512a32 32 0 01-32-32V608a32 32 0 1164 0v128h128zM256 672a32 32 0 00-32-32H96a32 32 0 00-32 32v128a32 32 0 1064 0v-96h64a32 32 0 0032-32zm640-384a32 32 0 00-32 32v96h-64a32 32 0 100 64h128a32 32 0 0032-32V288a32 32 0 00-32-32z"/></svg></el-icon>
</el-button>
<div>{{ !isFullscreen ? '全屏':'退出' }}</div>
</div>
</div> </div>
</div> </div>
@ -773,6 +800,18 @@ const setAudio = (stream) => {
} }
}; };
const isMinimized = ref(false);
const lastHeight = ref(0);
// 最小化
function handleWindowSize() {
isMinimized.value = !isMinimized.value;
if (isMinimized.value) {
lastHeight.value = element.value.height;
element.value.height = 70;
} else {
element.value.height = lastHeight.value;
}
}
onMounted(()=>{ onMounted(()=>{
console.log(globalStore,'=====0000000000000'); console.log(globalStore,'=====0000000000000');
@ -795,6 +834,7 @@ onMounted(()=>{
}); });
onUnmounted(() => { onUnmounted(() => {
emitter.off('onMediaStream'); emitter.off('onMediaStream');
emitter.off('onHangup'); emitter.off('onHangup');
@ -804,7 +844,67 @@ onUnmounted(() => {
</script> </script>
<style scoped>
<style scoped lang="scss">
.mimiBox {
position: absolute;
top: 10px;
right: 20px;
display: flex;
align-items: flex-end;
padding: 6px 8px;
border-radius: 16px;
background: rgba(0, 0, 0, 0.6);
cursor: pointer;
}
.mimiBox .item {
width: 3px;
height: 14px;
margin-right: 3px;
background: linear-gradient(180deg, #4facfe 0%, #00f2fe 100%);
border-radius: 999px;
animation: sound-wave 1s ease-in-out infinite;
transform-origin: bottom;
}
.mimiBox .item:last-child {
margin-right: 0;
}
.mimiBox .item:nth-child(1) {
animation-delay: 0s;
}
.mimiBox .item:nth-child(2) {
animation-delay: 0.15s;
}
.mimiBox .item:nth-child(3) {
animation-delay: 0.3s;
}
.mimiBox .item:nth-child(4) {
animation-delay: 0.45s;
}
.mimiBox .item:nth-child(5) {
animation-delay: 0.6s;
}
@keyframes sound-wave {
0%,
100% {
transform: scaleY(0.4);
opacity: 0.7;
}
50% {
transform: scaleY(1.4);
opacity: 1;
}
}
.container { .container {
position: absolute; position: absolute;
display: flex; display: flex;

View File

@ -188,8 +188,6 @@ export function MapUtil(map) {
} }
// 弹窗自定义标签内容 // 弹窗自定义标签内容
function zdyContentHtml(flag, item) { function zdyContentHtml(flag, item) {
console.log(item);
let html = '' let html = ''
switch (flag) { switch (flag) {
case 'hm_pop': case 'hm_pop':

View File

@ -100,7 +100,7 @@ const uploadFn = (file, insertFn) => {
insertFn(res); insertFn(res);
}); });
}; };
//编辑器创建成功 //编辑器创建成功
const handleCreated = (editor) => { const handleCreated = (editor) => {
editorRef.value = editor; editorRef.value = editor;
}; };

View File

@ -132,10 +132,18 @@ const props = defineProps({
tableHeight: { tableHeight: {
type: Number || String, type: Number || String,
}, },
// 在自动滚动中,想滚动到底部,是否请求下一页
hasNext: {
type: Number,
default: false
},
// 自动滚动
isScroll: { isScroll: {
type: Number, type: Number,
default: false default: false
}, },
customClass: { customClass: {
type: String type: String
}, },
@ -333,6 +341,8 @@ const createScroll = () => {
timer.value = setInterval(() => { timer.value = setInterval(() => {
target.scrollTop += 1; target.scrollTop += 1;
if (target.scrollTop >= originalBodyHeight.value) { if (target.scrollTop >= originalBodyHeight.value) {
// 滚动到底部没有下一页了,循环滚动 ,
if(props.hasNext) emit("changePage");
target.scrollTop -= originalBodyHeight.value; target.scrollTop -= originalBodyHeight.value;
} }
}, 20); }, 20);

View File

@ -415,6 +415,13 @@ const reset = () => {
emit("reset", true); emit("reset", true);
emit("submit", searchObj); emit("submit", searchObj);
}; };
// 暴露searchObj给父组件
defineExpose({
searchObj,
submit,
reset
});
watchEffect(() => { watchEffect(() => {
loadingPage.value = true; loadingPage.value = true;
let arr = JSON.parse(JSON.stringify(props.searchArr)); let arr = JSON.parse(JSON.stringify(props.searchArr));

View File

@ -0,0 +1,240 @@
<template>
<div class="test-div" v-if="dataList && dataList.length > 0">
<div class="test-header">
<span class="test-title">消息通知</span>
<div class="header-right">
<span class="test-countdown">{{ countdown }}s</span>
<el-icon class="close-icon" @click="handleClose">
<Close />
</el-icon>
</div>
</div>
<div class="test-content">
<Item v-for="(item, index) in dataList" :key="index" :item="item" />
</div>
</div>
</template>
<script setup>
// 测试div组件用于在后台和大屏页面都显示
import { ref, onMounted, onUnmounted } from 'vue'
import { Close } from '@element-plus/icons-vue'
import WebSoketClass from '@/utils/webSocket.js'
import emitter from "@/utils/eventBus.js"; // 导入事件总线
import Item from './item.vue'
import { AudioPlayerClass } from '@/utils/audioPlayer.js'
const webSoket = new WebSoketClass()
const dataList = ref([])
const timekeeping = ref(null)
const countdown = ref(0) // 倒计时时间(秒)
// 音频播放器实例映射
const audioPlayers = ref({
'02': null, // 信息上报
'03': null, // 研判审批
'04': null, // 研判指令
'05': null // 线索下发
})
// 音频文件路径映射
const audioPaths = {
'02': require('@/assets/images/cjyp.mp3'),
'03': require('@/assets/images/ypbg.mp3'),
'04': require('@/assets/images/ypzl.mp3'),
'05': require('@/assets/images/xsyp.mp3')
}
// 初始化音频播放器
const initAudioPlayers = () => {
Object.keys(audioPaths).forEach(type => {
try {
audioPlayers.value[type] = new AudioPlayerClass()
audioPlayers.value[type].init(audioPaths[type], false)
} catch (error) {
console.error(`初始化类型${type}的音频播放器失败:`, error)
}
})
}
// 根据类型播放音频
const playAudioByType = (type) => {
if (audioPlayers.value[type]) {
try {
audioPlayers.value[type].play()
} catch (error) {
console.error(`播放类型${type}的音频失败:`, error)
}
}
}
// 手动关闭
const handleClose = () => {
if (timekeeping.value) {
clearInterval(timekeeping.value)
timekeeping.value = null
}
dataList.value = []
}
// 重置倒计时
const resetCountdown = () => {
if (timekeeping.value) {
clearInterval(timekeeping.value)
}
countdown.value = 15
timekeeping.value = setInterval(() => {
countdown.value--
if (countdown.value <= 0) {
clearInterval(timekeeping.value)
dataList.value = []
timekeeping.value = null
}
}, 1000)
}
onMounted(() => {
// 初始化音频播放器
initAudioPlayers()
emitter.on('webSocketMessage', (newsDate) => {
if (newsDate) {
dataList.value.unshift({...newsDate.data,typeMasgeLx:newsDate.type})
// 根据消息类型播放音频
playAudioByType(newsDate.type)
resetCountdown()
}
})
// 组件挂载时执行的操作
webSoket.connect()
console.log('组件挂载时执行的操作')
})
onUnmounted(() => {
webSoket.closeConnection()
emitter.off('webSocketMessage')
if (timekeeping.value) {
clearInterval(timekeeping.value)
}
// 销毁所有音频播放器实例
Object.values(audioPlayers.value).forEach(player => {
if (player) {
player.destroy()
}
})
// 组件卸载时执行的操作
console.log('组件卸载时执行的操作')
})
</script>
<style scoped lang="scss">
.test-div {
width: 400px;
max-height: 250px;
position: fixed;
bottom: 2%;
right: 2%;
z-index: 1999;
background: linear-gradient(135deg, #0a3b6d 0%, #1a5a9e 100%);
border: 1px solid rgba(0, 255, 255, 0.3);
border-radius: 12px;
box-shadow: 0 8px 32px rgba(0, 255, 255, 0.3), 0 0 20px rgba(0, 255, 255, 0.1);
overflow: hidden;
animation: slideIn 0.3s ease-out;
@keyframes slideIn {
from {
transform: translateX(100%);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
}
.test-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 12px 16px;
background: rgba(0, 255, 255, 0.1);
border-bottom: 1px solid rgba(0, 255, 255, 0.3);
}
.test-title {
font-size: 16px;
font-weight: bold;
color: #00ffff;
display: flex;
align-items: center;
gap: 8px;
text-shadow: 0 0 10px rgba(0, 255, 255, 0.7);
&::before {
content: '';
display: inline-block;
width: 8px;
height: 8px;
background-color: #00ffff;
border-radius: 50%;
box-shadow: 0 0 10px rgba(0, 255, 255, 0.8);
animation: pulse 1.5s ease-in-out infinite;
}
@keyframes pulse {
0%, 100% {
opacity: 1;
transform: scale(1);
box-shadow: 0 0 10px rgba(0, 255, 255, 0.8);
}
50% {
opacity: 0.8;
transform: scale(1.2);
box-shadow: 0 0 20px rgba(0, 255, 255, 1);
}
}
}
.header-right {
display: flex;
align-items: center;
gap: 10px;
}
.test-countdown {
font-size: 14px;
color: #00ffff;
background: rgba(0, 255, 255, 0.1);
padding: 4px 12px;
border: 1px solid rgba(0, 255, 255, 0.3);
border-radius: 12px;
font-weight: 500;
text-shadow: 0 0 5px rgba(0, 255, 255, 0.5);
}
.close-icon {
font-size: 18px;
color: #00ffff;
cursor: pointer;
transition: all 0.3s ease;
padding: 4px;
border-radius: 4px;
text-shadow: 0 0 5px rgba(0, 255, 255, 0.5);
&:hover {
background: rgba(0, 255, 255, 0.2);
transform: rotate(90deg);
box-shadow: 0 0 10px rgba(0, 255, 255, 0.8);
}
}
.test-content {
max-height: 150px;
overflow-y: auto;
padding: 12px;
scrollbar-width: none; /* Firefox */
-ms-overflow-style: none; /* IE and Edge */
&::-webkit-scrollbar {
display: none; /* Chrome, Safari and Opera */
}
}
</style>

View File

@ -0,0 +1,284 @@
<template>
<div class="test-div" v-if="dataList && dataList.length > 0">
<div class="test-header">
<span class="test-title">消息通知</span>
<div class="header-right">
<span class="test-countdown">{{ countdown }}s</span>
<el-icon class="close-icon" @click="handleClose">
<Close />
</el-icon>
</div>
</div>
<div class="test-content">
<Item v-for="(item, index) in dataList" :key="index" :item="item" />
</div>
</div>
</template>
<script setup>
// 测试div组件用于在后台和大屏页面都显示
import { ref, onMounted, onUnmounted } from 'vue'
import { Close } from '@element-plus/icons-vue'
import emitter from "@/utils/eventBus.js"; // 导入事件总线
import { qcckGet } from '@/api/qcckApi'
import Item from './item.vue'
import { AudioPlayerClass } from '@/utils/audioPlayer.js'
import {getItem} from '@/utils/storage.js'
const dataList = ref([])
const timekeeping = ref(null)
const countdown = ref(0) // 倒计时时间(秒)
// 音频播放器实例映射
const audioPlayers = ref({
'02': null, // 信息上报
'03': null, // 研判审批
'04': null, // 研判指令
'05': null // 线索下发
})
// 音频文件路径映射
const audioPaths = {
'02': require('@/assets/images/cjyp.mp3'),
'03': require('@/assets/images/ypbg.mp3'),
'04': require('@/assets/images/ypzl.mp3'),
'05': require('@/assets/images/xsyp.mp3')
}
// 初始化音频播放器
const initAudioPlayers = () => {
Object.keys(audioPaths).forEach(type => {
try {
audioPlayers.value[type] = new AudioPlayerClass()
audioPlayers.value[type].init(audioPaths[type], false)
} catch (error) {
console.error(`初始化类型${type}的音频播放器失败:`, error)
}
})
}
// 根据类型播放音频
const playAudioByType = (type) => {
if (audioPlayers.value[type]) {
try {
audioPlayers.value[type].play()
} catch (error) {
console.error(`播放类型${type}的音频失败:`, error)
}
}
}
// 手动关闭
const handleClose = () => {
if (timekeeping.value) {
clearInterval(timekeeping.value)
timekeeping.value = null
}
dataList.value = []
}
// 重置倒计时
const resetCountdown = () => {
if (timekeeping.value) {
clearInterval(timekeeping.value)
}
countdown.value = 15
timekeeping.value = setInterval(() => {
countdown.value--
if (countdown.value <= 0) {
clearInterval(timekeeping.value)
dataList.value = []
timekeeping.value = null
}
}, 1000)
}
// 做一个定时器15s一次
const checkNews = ref(null)
const checkNewsInterval = 15000 // 15秒
checkNews.value = setInterval(() => {
dataModel()
}, checkNewsInterval)
onMounted(() => {
// 初始化音频播放器
initAudioPlayers()
emitter.on('webSocketMessage', (newsDate) => {
if (newsDate) {
dataList.value = newsDate
// dataList.value.unshift({...newsDate.data,typeMasgeLx:newsDate.type})
// 根据消息类型播放音频
playAudioByType(newsDate[0].typeMasgeLx)
resetCountdown()
}
})
})
const idEntityCard = ref(getItem('idEntityCard'))
const dataModel = () => {
qcckGet({}, '/mosty-gsxt/dsjJbxx/message').then(res => {
if (res) {
const yjmasg = res.filter(item => item.type === '01')
if (yjmasg.length > 0) {
emitter.emit('openYp', yjmasg[0].obj); // 触发音频播放
} else {
const data=res.filter(item=>item.sfzList.includes(idEntityCard.value))
const infoMasge =data.map(item => {
return {
...item.obj,
typeMasgeLx: item.type
}
})
console.log(infoMasge);
emitter.emit('webSocketMessage', infoMasge)
}
}
})
}
// if (newsDate.type === '01') {
// // 触发音频播放
// console.log('触发音频播放');
// emitter.emit('openYp', newsDate.data); // 传递消息数据
// } else {
onUnmounted(() => {
emitter.off('webSocketMessage')
if (timekeeping.value) {
clearInterval(timekeeping.value)
}
// 销毁所有音频播放器实例
Object.values(audioPlayers.value).forEach(player => {
if (player) {
player.destroy()
}
})
// 清除定时器
if (checkNews.value) {
clearInterval(checkNews.value)
checkNews.value = null
}
// 组件卸载时执行的操作
console.log('组件卸载时执行的操作')
})
</script>
<style scoped lang="scss">
.test-div {
width: 400px;
max-height: 250px;
position: fixed;
bottom: 2%;
right: 2%;
z-index: 1999;
background: linear-gradient(135deg, #0a3b6d 0%, #1a5a9e 100%);
border: 1px solid rgba(0, 255, 255, 0.3);
border-radius: 12px;
box-shadow: 0 8px 32px rgba(0, 255, 255, 0.3), 0 0 20px rgba(0, 255, 255, 0.1);
overflow: hidden;
animation: slideIn 0.3s ease-out;
@keyframes slideIn {
from {
transform: translateX(100%);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
}
.test-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 12px 16px;
background: rgba(0, 255, 255, 0.1);
border-bottom: 1px solid rgba(0, 255, 255, 0.3);
}
.test-title {
font-size: 16px;
font-weight: bold;
color: #00ffff;
display: flex;
align-items: center;
gap: 8px;
text-shadow: 0 0 10px rgba(0, 255, 255, 0.7);
&::before {
content: '';
display: inline-block;
width: 8px;
height: 8px;
background-color: #00ffff;
border-radius: 50%;
box-shadow: 0 0 10px rgba(0, 255, 255, 0.8);
animation: pulse 1.5s ease-in-out infinite;
}
@keyframes pulse {
0%,
100% {
opacity: 1;
transform: scale(1);
box-shadow: 0 0 10px rgba(0, 255, 255, 0.8);
}
50% {
opacity: 0.8;
transform: scale(1.2);
box-shadow: 0 0 20px rgba(0, 255, 255, 1);
}
}
}
.header-right {
display: flex;
align-items: center;
gap: 10px;
}
.test-countdown {
font-size: 14px;
color: #00ffff;
background: rgba(0, 255, 255, 0.1);
padding: 4px 12px;
border: 1px solid rgba(0, 255, 255, 0.3);
border-radius: 12px;
font-weight: 500;
text-shadow: 0 0 5px rgba(0, 255, 255, 0.5);
}
.close-icon {
font-size: 18px;
color: #00ffff;
cursor: pointer;
transition: all 0.3s ease;
padding: 4px;
border-radius: 4px;
text-shadow: 0 0 5px rgba(0, 255, 255, 0.5);
&:hover {
background: rgba(0, 255, 255, 0.2);
transform: rotate(90deg);
box-shadow: 0 0 10px rgba(0, 255, 255, 0.8);
}
}
.test-content {
max-height: 150px;
overflow-y: auto;
padding: 12px;
scrollbar-width: none;
/* Firefox */
-ms-overflow-style: none;
/* IE and Edge */
&::-webkit-scrollbar {
display: none;
/* Chrome, Safari and Opera */
}
}
</style>

View File

@ -0,0 +1,156 @@
<template>
<div class="test-item" v-if="item.typeMasgeLx == '02'" @click="goDetail(item.id, item.typeMasgeLx)">
<div class="item-header">
<div class="item-title">{{ item.qbmc || '' }}</div>
<div class="item-type">{{ informationMap[item.typeMasgeLx] }}</div>
</div>
<div class="item-message">{{ item.qbnr }}</div>
<div class="item-time">{{ item.xtCjsj || '' }}</div>
</div>
<div class="test-item" v-if="item.typeMasgeLx == '03'" @click="goDetail(item.id, item.typeMasgeLx)">
<div class="item-header">
<div class="item-title">{{ item.bgmc || '' }}</div>
<div class="item-type">{{ informationMap[item.typeMasgeLx] }}</div>
</div>
<div class="item-message" v-html="item.bgnr"></div>
<div class="item-time">{{ item.xtCjsj || '' }}</div>
</div>
<div class="test-item" v-if="item.typeMasgeLx == '04'" @click="goDetail(item.id, item.typeMasgeLx)">
<div class="item-header">
<div class="item-title">{{ item.zlbt || '' }}</div>
<div class="item-type">{{ informationMap[item.typeMasgeLx] }}</div>
</div>
<div class="item-message" v-html="item.zlnr"></div>
<div class="item-time">{{ item.xtCjsj || '' }}</div>
</div>
<div class="test-item" v-if="item.typeMasgeLx == '05'" @click="goDetail(item.id, item.typeMasgeLx)">
<div class="item-header">
<div class="item-title">{{ item.zlbt || '' }}</div>
<div class="item-type">{{ informationMap[item.typeMasgeLx] }}</div>
</div>
<div class="item-message" v-html="item.zlnr"></div>
<div class="item-time">{{ item.xtCjsj || '' }}</div>
</div>
</template>
<script setup>
import { useRouter } from 'vue-router'
const router = useRouter()
const props = defineProps({
item: {
type: Object,
default: () => ({})
}
})
const informationMap = {
'01': '报警信息',
'02': '信息上报',
'03': '研判审批',
'04': '研判指令',
'05': '线索下发',
}
const emit=defineEmits(['goDetail'])
const goDetail = (id, lx) => {
let path = ''
switch (lx) {
case '02':
path = '/InfoCollection'
break;
case '03':
path = '/strategicResearchs'
break;
default:
case '04':
path = '/judgmentCommand'
break;
case '05':
path = '/InstructionInformation'
break;
}
router.push({
path: path,
query: {
id: id
}
})
}
</script>
<style lang="scss" scoped>
.test-item {
background: rgba(10, 59, 109, 0.8);
border: 1px solid rgba(0, 255, 255, 0.3);
border-radius: 8px;
padding: 12px;
margin-bottom: 10px;
box-shadow: 0 2px 8px rgba(0, 255, 255, 0.2);
transition: all 0.3s ease;
display: flex;
flex-direction: column;
gap: 8px;
&:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 255, 255, 0.4);
border-color: rgba(0, 255, 255, 0.6);
}
&:last-child {
margin-bottom: 0;
}
}
.item-header {
display: flex;
align-items: center;
gap: 10px;
width: 100%;
}
.item-title {
font-size: 14px;
font-weight: 500;
color: #00ffff;
flex: 0 0 60%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
text-shadow: 0 0 5px rgba(0, 255, 255, 0.5);
}
.item-type {
font-size: 12px;
font-weight: bold;
color: #00ffff;
background: linear-gradient(135deg, #00ffff 0%, #00aaff 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
flex: 1;
text-align: right;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
text-shadow: 0 0 5px rgba(0, 255, 255, 0.7);
}
.item-message {
font-size: 14px;
color: #cceeff;
line-height: 1.5;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
word-break: break-word;
margin: 4px 0;
}
.item-time {
font-size: 12px;
color: #66ccff;
text-align: right;
margin-top: 4px;
text-shadow: 0 0 3px rgba(0, 255, 255, 0.3);
}
</style>

View File

@ -64,7 +64,6 @@ const startDrag = (e) => {
// 处理移动 // 处理移动
const handleMove = (e) => { const handleMove = (e) => {
if (!isDragging.value) return; if (!isDragging.value) return;
let clientX, clientY; let clientX, clientY;
if (e.type === 'mousemove') { if (e.type === 'mousemove') {
clientX = e.clientX; clientX = e.clientX;

View File

@ -133,7 +133,6 @@ onBeforeUnmount(() => {
}); });
// 带样式的下载方法 // 带样式的下载方法
const downloadWithStyles = () => { const downloadWithStyles = () => {
const wordDocument = ` const wordDocument = `
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" > <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" >
<head> <head>

View File

@ -11,6 +11,7 @@
<AppMain /> <AppMain />
</div> </div>
</div> </div>
<TestDiv />
</div> </div>
</template> </template>
@ -20,6 +21,7 @@ import NavBar from "./components/NavBar";
import SideBar from "./components/SideBar/index"; import SideBar from "./components/SideBar/index";
import AppMain from "./components/AppMain"; import AppMain from "./components/AppMain";
import TagsView from "./components/TagsView"; import TagsView from "./components/TagsView";
import TestDiv from "@/components/common/TestDiv.vue";
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@ -35,7 +37,7 @@ import TagsView from "./components/TagsView";
display: flex; display: flex;
overflow: hidden; overflow: hidden;
.el-scrollbar { .el-scrollbar {
.is-active { .is-active {
background: #fff; background: #fff;
} }
@ -58,4 +60,4 @@ import TagsView from "./components/TagsView";
::v-deep .el-scrollbar__view{ ::v-deep .el-scrollbar__view{
border-right: 1px solid #07376d; border-right: 1px solid #07376d;
} }
</style> </style>

View File

@ -1,9 +1,6 @@
import * as ElIcons from "@element-plus/icons-vue"; import * as ElIcons from "@element-plus/icons-vue";
import Axios from 'axios' import Axios from 'axios'
import { createApp } from "vue";
import {
createApp
} from "vue";
import App from "./App.vue"; import App from "./App.vue";
import router from "./router"; import router from "./router";
import store from "./store"; import store from "./store";

View File

@ -1,5 +1,5 @@
// let url = "ws://80.155.0.82:8006/mosty-api/mosty-websocket/socket/"; //线上 // let url = "ws://80.155.0.82:8006/mosty-api/mosty-websocket/socket/"; //线上
let url = "ws://155.240.22.30:2109/mosty-api/mosty-websocket/socket/"; //线上 let url = "wss://sg.lz.dsj.xz/websocket/mosty-websocket/socket/"; //线上
if(process.env.NODE_ENV === 'development') { if(process.env.NODE_ENV === 'development') {
url = "ws://47.108.232.77:9537/mosty-api/mosty-websocket/socket/"; //本地 url = "ws://47.108.232.77:9537/mosty-api/mosty-websocket/socket/"; //本地

View File

@ -15,9 +15,7 @@ import store from "@/store";
* 私有路由表 * 私有路由表
*/ */
export const privateRoutes = [ export const privateRoutes = [];
];
/** /**
* 公开路由表 * 公开路由表
@ -166,7 +164,7 @@ export const publicRoutes = [
{ {
path: "/YjData", path: "/YjData",
name: "YjData", name: "YjData",
meta: { title: "预警", icon: "article-create" }, meta: { title: "预警列表", icon: "article-create" },
component: () => import("@/views/backOfficeSystem/fourColorManage/YjData/index.vue"), component: () => import("@/views/backOfficeSystem/fourColorManage/YjData/index.vue"),
}, },
// { // {
@ -365,7 +363,7 @@ export const publicRoutes = [
// component: () => import("@/views/backOfficeSystem/HumanIntelligence/FollowLeads/index"), // component: () => import("@/views/backOfficeSystem/HumanIntelligence/FollowLeads/index"),
// meta: { title: "转线索列表", icon: "article-create" }, // meta: { title: "转线索列表", icon: "article-create" },
// }, // },
// { // {
// path: "/CollectPoints", // path: "/CollectPoints",
// name: "CollectPoints", // name: "CollectPoints",
@ -375,7 +373,7 @@ export const publicRoutes = [
// icon: "article-create" // icon: "article-create"
// } // }
// }, // },
{ {
path: "/supplementReportList", path: "/supplementReportList",
name: "supplementReportList", name: "supplementReportList",
@ -606,7 +604,7 @@ export const publicRoutes = [
icon: "article-create" icon: "article-create"
} }
}, },
{ {
path: "/mpvGroup", path: "/mpvGroup",
name: "mpvGroup", name: "mpvGroup",
@ -616,7 +614,7 @@ export const publicRoutes = [
icon: "article-create" icon: "article-create"
} }
}, },
{ {
path: "/mpvCar", path: "/mpvCar",
name: "mpvCar", name: "mpvCar",
@ -733,14 +731,24 @@ export const publicRoutes = [
// }, // },
{ {
path: "/JobAppraisal", path: "/permissionApply",
name: "JobAppraisal", name: "permissionApply",
component: () => import("@/views/backOfficeSystem/HumanIntelligence/JobAppraisal/index"), component: () => import("@/views/backOfficeSystem/HumanIntelligence/permissionApply/index"),
meta: { meta: {
title: "工作考核", title: "权限申请",
icon: "article-create" icon: "article-create"
} }
}, },
{
path: "/appraisalManagement",
name: "appraisalManagement",
component: () => import("@/views/backOfficeSystem/HumanIntelligence/appraisalManagement/index"),
meta: {
title: "考核管理",
icon: "article-create"
}
},
{ {
path: "/FileData", path: "/FileData",
name: "FileData", name: "FileData",
@ -1171,7 +1179,7 @@ export const publicRoutes = [
icon: "article-create" icon: "article-create"
} }
}, },
{ {
path: "/strategicResearch", path: "/strategicResearch",
name: "strategicResearch", name: "strategicResearch",
@ -1181,6 +1189,15 @@ export const publicRoutes = [
icon: "article-create" icon: "article-create"
} }
}, },
{
path: "/JobAppraisal",
name: "JobAppraisal",
component: () => import("@/views/backOfficeSystem/HumanIntelligence/JobAppraisal/index"),
meta: {
title: "工作考核",
icon: "article-create"
}
},
// { // {
// path: "/ResearchHome", // path: "/ResearchHome",
// name: "ResearchHome", // name: "ResearchHome",

View File

@ -7,11 +7,36 @@ const getChildrenRoutes = (routes) => {
const result = []; const result = [];
const { deptBizType, deptLevel } = getItem('deptId')[0] const { deptBizType, deptLevel } = getItem('deptId')[0]
const roleList = getItem('roleList') ? getItem('roleList').filter(item => item.roleCode == 'JS_666666').length > 0 : false const roleList = getItem('roleList') ? getItem('roleList').filter(item => item.roleCode == 'JS_666666').length > 0 : false
const xjLsit = getItem('roleList') ? getItem('roleList').filter(item => item.roleCode == 'JS_999999').length > 0 : false
console.log(roleList, xjLsit);
routes.forEach((route) => { routes.forEach((route) => {
if (route.children && route.children.length > 0) { if (route.children && route.children.length > 0) {
if (deptBizType == '23' && roleList) { if (deptBizType == '23') {
// 在这个条件分支中也需要过滤掉/internalAuditor路由
result.push(...route.children); if (roleList) {
result.push(...route.children);
} else if (xjLsit) {
if (route.path == '/JudgmentHome') {
route.children.splice(route.children.findIndex(item => item.path == '/internalAuditor'), 1)
result.push(...route.children);
} else {
result.push(...route.children);
}
} else {
if (route.path == '/HumanIntelligence') {
route.children.splice(route.children.findIndex(item => item.path == '/auditList'), 1)
result.push(...route.children);
} else {
result.push(...route.children);
}
if (route.path == '/JudgmentHome') {
route.children.splice(route.children.findIndex(item => item.path == '/internalAuditor'), 1)
result.push(...route.children);
} else {
result.push(...route.children);
}
}
} else { } else {
if (route.path == '/HumanIntelligence') { if (route.path == '/HumanIntelligence') {
route.children.splice(route.children.findIndex(item => item.path == '/auditList'), 1) route.children.splice(route.children.findIndex(item => item.path == '/auditList'), 1)
@ -19,7 +44,6 @@ const getChildrenRoutes = (routes) => {
} else { } else {
result.push(...route.children); result.push(...route.children);
} }
if (route.path == '/JudgmentHome') { if (route.path == '/JudgmentHome') {
route.children.splice(route.children.findIndex(item => item.path == '/internalAuditor'), 1) route.children.splice(route.children.findIndex(item => item.path == '/internalAuditor'), 1)
result.push(...route.children); result.push(...route.children);
@ -27,6 +51,23 @@ const getChildrenRoutes = (routes) => {
result.push(...route.children); result.push(...route.children);
} }
} }
// if (deptBizType == '23' && (roleList || xjLsit)) {
// // 在这个条件分支中也需要过滤掉/internalAuditor路由
// result.push(...route.children);
// } else {
// if (route.path == '/JudgmentHome' && xjLsit) {
// route.children.splice(route.children.findIndex(item => item.path == '/internalAuditor'), 1)
// result.push(...route.children);
// } else {
// result.push(...route.children);
// }
// }
} }
}); });
return result; return result;

View File

@ -143,7 +143,6 @@ const connectSSEWithPost = (prompt, options = {}) => {
reject(error); reject(error);
} }
}; };
readStream(); readStream();
}).catch(error => { }).catch(error => {
console.error('SSE请求错误:', error); console.error('SSE请求错误:', error);

View File

@ -1,5 +1,5 @@
// let url = "ws://89.40.9.89:2109/mosty-api/mosty-websocket/socket/"; //线上 // let url = "ws://89.40.9.89:2109/mosty-api/mosty-websocket/socket/"; //线上
let url = "ws://155.240.22.30:2109/mosty-api/mosty-websocket/socket/"; //线上 let url = "ws://89.40.9.93:50039/mosty-websocket/socket/"; //线上
if (process.env.NODE_ENV === 'development') { if (process.env.NODE_ENV === 'development') {
url = "ws://47.108.232.77:9537/mosty-api/mosty-websocket/socket/"; //本地 url = "ws://47.108.232.77:9537/mosty-api/mosty-websocket/socket/"; //本地
@ -86,8 +86,6 @@ class WebSoketClass {
if (fun) fun(true); if (fun) fun(true);
}; };
this.ws.onclose = (e) => { this.ws.onclose = (e) => {
console.log(e);
console.log('WebSocket连接已关闭关闭码:', e.code, '原因:', e.reason); console.log('WebSocket连接已关闭关闭码:', e.code, '原因:', e.reason);
// 如果是正常关闭(1000)或手动关闭(1001),不进行重连 // 如果是正常关闭(1000)或手动关闭(1001),不进行重连
if (e.code !== 1000 && e.code !== 1001) { if (e.code !== 1000 && e.code !== 1001) {
@ -165,7 +163,6 @@ class WebSoketClass {
// 接收发送消息 // 接收发送消息
getMessage() { getMessage() {
this.ws.onmessage = (e) => { this.ws.onmessage = (e) => {
console.log(e);
try { try {
if (e.data) { if (e.data) {
@ -175,6 +172,9 @@ class WebSoketClass {
// 触发音频播放 // 触发音频播放
console.log('触发音频播放'); console.log('触发音频播放');
emitter.emit('openYp', newsDate.data); // 传递消息数据 emitter.emit('openYp', newsDate.data); // 传递消息数据
} else {
emitter.emit('webSocketMessage', { data: newsDate.data, type: newsDate.type });
} }
// else if (newsDate.type === 'ALARM_STOP' || newsDate.type === 'warning_stop') { // else if (newsDate.type === 'ALARM_STOP' || newsDate.type === 'warning_stop') {
// // 触发音频停止 // // 触发音频停止
@ -187,7 +187,7 @@ class WebSoketClass {
// emitter.emit('statusUpdate', newsDate.data); // emitter.emit('statusUpdate', newsDate.data);
// } // }
// // 通用消息事件 // // 通用消息事件
// emitter.emit('webSocketMessage', newsDate);
} }
} catch (error) { } catch (error) {
console.error('处理WebSocket消息失败:', error); console.error('处理WebSocket消息失败:', error);

View File

@ -53,10 +53,8 @@
<DictTag :tag="false" :value="row.qtFxdj" :options="D_GS_ZDQT_FXDJ" /> <DictTag :tag="false" :value="row.qtFxdj" :options="D_GS_ZDQT_FXDJ" />
</template> </template>
<template #bqList="{ row }"> <template #bqList="{ row }">
<ul> <span class="one_text_detail marks mr2" :key="index" v-for="(item, index) in row.bqList">{{ item.bqMc }}({{
<li class="one_text_detail marks mb4" :key="index" v-for="(item, index) in row.bqList">{{ item.bqMc }}({{ item.bqFz || 0 }} ) </span>
item.bqFz || 0 }} ) </li>
</ul>
</template> </template>
<template #zdryList="{ row }"> <template #zdryList="{ row }">
<span style="color: #0072ff">{{ row.zdryList ? row.zdryList.length : 0 }}</span> <span style="color: #0072ff">{{ row.zdryList ? row.zdryList.length : 0 }}</span>
@ -173,20 +171,18 @@ const pageData = reactive({
}, },
controlsWidth: 280, controlsWidth: 280,
tableColumn: [ tableColumn: [
{ label: "群体名称", prop: "qtMc", width: 150 }, { label: "群体名称", prop: "qtMc" },
{ label: "群体类别", prop: "qtLb", showSolt: true, width: 150 }, { label: "群体类别", prop: "qtLb", showSolt: true },
{ label: "风险等级", prop: "qtFxdj", showSolt: true, width: 150 }, { label: "风险等级", prop: "qtFxdj", showSolt: true },
{ label: "背景资料", prop: "qtBjzl", width: 150 }, // { label: "背景资料", prop: "qtBjzl" },
{ label: "背景信息", prop: "bgxx", showSolt: true, width: 150 }, { label: "背景信息", prop: "bgxx", showSolt: true },
{ label: "管辖单位", prop: "gxSsdwmc", width: 150 }, { label: "管辖单位", prop: "gxSsdwmc" },
{ label: "列控原因", prop: "zdrLkyy", width: 150 }, { label: "列控原因", prop: "zdrLkyy" },
{ label: "开始时间", prop: "zdrRkkssj", width: 150 }, { label: "开始时间", prop: "zdrRkkssj" },
{ label: "截至时间", prop: "zdrRkjssj", width: 150 }, { label: "截至时间", prop: "zdrRkjssj" },
{ label: "稳控人数", prop: "zdryList", showSolt: true, width: 150 }, { label: "稳控人数", prop: "zdryList", showSolt: true },
{ label: "状态", prop: "qtZt", showSolt: true, width: 150 }, { label: "状态", prop: "qtZt", showSolt: true },
{ label: "标签", prop: "bqList", showSolt: true, showOverflowTooltip: true, width: 400 }, { label: "标签", prop: "bqList", showSolt: true, showOverflowTooltip: true, },
{ label: "创建单位", prop: "xtCjbmmc", width: 150 },
{ label: "创建时间", prop: "xtCjsj", width: 150 },
] ]
}); });
@ -328,7 +324,7 @@ defineExpose({});
<style lang="scss" scoped> <style lang="scss" scoped>
.marks { .marks {
padding: 0 4px; padding: 0 2px;
white-space: nowrap; white-space: nowrap;
background: #73acf1; background: #73acf1;
border-radius: 4px; border-radius: 4px;

View File

@ -73,8 +73,8 @@ const qxkz = reactive({
const searchConfiger = ref([ const searchConfiger = ref([
{ label: "情报标题", prop: 'qbmc', placeholder: "请输入情报标题", showType: "input" }, { label: "情报标题", prop: 'qbmc', placeholder: "请输入情报标题", showType: "input" },
// { label: "情报来源", prop: 'cjLx', placeholder: "请选择情报来源", showType: "select", options: D_BZ_CJLX }, { label: "时间", prop: 'times', placeholder: "请输入时间", showType: "datetimerange" },
// { label: "来源单位", prop: 'ssbmdm', placeholder: "请选择来源单位", showType: "department" } { label: "部门", prop: 'ssbmdm', placeholder: "请选择来源单位", showType: "department" }
]); ]);
const pageData = reactive({ const pageData = reactive({
@ -105,16 +105,9 @@ const queryFrom = ref({});
// 搜索 // 搜索
const onSearch = (val) => { const onSearch = (val) => {
const { lrkssj, zxkssj } = val queryFrom.value = { ...val }
const promes = { queryFrom.value.startTime = val.times ? val.times[0] : ''
...val, queryFrom.value.endTime = val.times ? val.times[1] : ''
...pageData.pageConfiger,
lrkssj: lrkssj ? lrkssj[0] : '',
lrjssj: lrkssj ? lrkssj[1] : '',
zxkssj: zxkssj ? zxkssj[0] : '',
zxjssj: zxkssj ? zxkssj[1] : '',
}
queryFrom.value = { ...promes }
pageData.pageConfiger.pageCurrent = 1; pageData.pageConfiger.pageCurrent = 1;
getList() getList()
} }
@ -132,6 +125,7 @@ const changeSize = (val) => {
const getList = () => { const getList = () => {
pageData.tableConfiger.loading = true; pageData.tableConfiger.loading = true;
let data = { ...pageData.pageConfiger, ...queryFrom.value }; let data = { ...pageData.pageConfiger, ...queryFrom.value };
delete data.times;
xxcjZxsSelectPage(data).then(res => { xxcjZxsSelectPage(data).then(res => {
pageData.tableData = res.records || []; pageData.tableData = res.records || [];
pageData.total = res.total; pageData.total = res.total;

View File

@ -0,0 +1,265 @@
<template>
<div class="items-container">
<el-card class="item-card">
<template #header>
<div class="card-header">
<span class="card-title">考核详情</span>
</div>
</template>
<div class="item-grid">
<!-- <div class="item-row">
<div class="item-col">
<span class="item-label">研判分数</span>
<span class="item-value">{{ row.ypfs || 0 }}</span>
</div>
<div class="item-col">
<span class="item-label">采集分数</span>
<span class="item-value">{{ row.cjfs || 0 }}</span>
</div>
</div> -->
<div class="item-section">
<h4>分数详情</h4>
<div class="item-grid">
<div class="item-col">
<span class="item-label">研判分数</span>
<span class="item-value">{{ row.ypfs || 0 }}</span>
</div>
<div class="item-col">
<span class="item-label">采集分数</span>
<span class="item-value">{{ row.cjfs || 0 }}</span>
</div>
</div>
</div>
<div class="item-section">
<h4>七类人员</h4>
<div class="item-grid">
<div class="item-col">
<span class="item-label">总数</span>
<span class="item-value">{{ row.qlryZs || 0 }}</span>
</div>
<div class="item-col">
<span class="item-label">签收数</span>
<span class="item-value">{{ row.qlryQss || 0 }}</span>
</div>
<div class="item-col">
<span class="item-label">反馈数</span>
<span class="item-value">{{ row.qlryFks || 0 }}</span>
</div>
<div class="item-col">
<span class="item-label">签收率</span>
<span class="item-value">{{ (row.qlryQsl || 0) * 100 }}%</span>
</div>
<div class="item-col">
<span class="item-label">反馈率</span>
<span class="item-value">{{ (row.qlryFkl || 0) * 100 }}%</span>
</div>
</div>
</div>
<div class="item-section">
<h4>人像预警</h4>
<div class="item-grid">
<div class="item-col">
<span class="item-label">总数</span>
<span class="item-value">{{ row.rxyjZs || 0 }}</span>
</div>
<div class="item-col">
<span class="item-label">签收数</span>
<span class="item-value">{{ row.rxyjQss || 0 }}</span>
</div>
<div class="item-col">
<span class="item-label">反馈数</span>
<span class="item-value">{{ row.rxyjFks || 0 }}</span>
</div>
<div class="item-col">
<span class="item-label">签收率</span>
<span class="item-value">{{ (row.rxyjQsl || 0) * 100 }}%</span>
</div>
<div class="item-col">
<span class="item-label">反馈率</span>
<span class="item-value">{{ (row.rxyjFkl || 0) * 100 }}%</span>
</div>
</div>
</div>
<div class="item-section">
<h4>车辆预警</h4>
<div class="item-grid">
<div class="item-col">
<span class="item-label">总数</span>
<span class="item-value">{{ row.clyjZs || 0 }}</span>
</div>
<div class="item-col">
<span class="item-label">签收数</span>
<span class="item-value">{{ row.clyjQss || 0 }}</span>
</div>
<div class="item-col">
<span class="item-label">反馈数</span>
<span class="item-value">{{ row.clyjFks || 0 }}</span>
</div>
<div class="item-col">
<span class="item-label">签收率</span>
<span class="item-value">{{ (row.clyjQsl || 0) * 100 }}%</span>
</div>
<div class="item-col">
<span class="item-label">反馈率</span>
<span class="item-value">{{ (row.clyjFkl || 0) * 100 }}%</span>
</div>
</div>
</div>
<div class="item-section">
<h4>布控预警</h4>
<div class="item-grid">
<div class="item-col">
<span class="item-label">总数</span>
<span class="item-value">{{ row.bkyjZs || 0 }}</span>
</div>
<div class="item-col">
<span class="item-label">签收数</span>
<span class="item-value">{{ row.bkyjQss || 0 }}</span>
</div>
<div class="item-col">
<span class="item-label">反馈数</span>
<span class="item-value">{{ row.bkyjFks || 0 }}</span>
</div>
<div class="item-col">
<span class="item-label">签收率</span>
<span class="item-value">{{ (row.bkyjQsl || 0) * 100 }}%</span>
</div>
<div class="item-col">
<span class="item-label">反馈率</span>
<span class="item-value">{{ (row.bkyjFkl || 0) * 100 }}%</span>
</div>
</div>
</div>
<div class="item-section">
<h4>政保预警</h4>
<div class="item-grid">
<div class="item-col">
<span class="item-label">总数</span>
<span class="item-value">{{ row.zbyjZs || 0 }}</span>
</div>
<div class="item-col">
<span class="item-label">签收数</span>
<span class="item-value">{{ row.zbyjQss || 0 }}</span>
</div>
<div class="item-col">
<span class="item-label">反馈数</span>
<span class="item-value">{{ row.zbyjFks || 0 }}</span>
</div>
<div class="item-col">
<span class="item-label">签收率</span>
<span class="item-value">{{ (row.zbyjQsl || 0) * 100 }}%</span>
</div>
<div class="item-col">
<span class="item-label">反馈率</span>
<span class="item-value">{{ (row.zbyjFkl || 0) * 100 }}%</span>
</div>
</div>
</div>
<!-- <div class="item-row">
<div class="item-col">
<span class="item-label">更新时间</span>
<span class="item-value">{{ row.gxsj || '-' }}</span>
</div>
</div> -->
</div>
</el-card>
</div>
</template>
<script setup>
import { defineProps } from 'vue';
const props = defineProps({
row: {
type: Object,
default: () => ({})
}
});
</script>
<style lang="scss" scoped>
.items-container {
width: 100%;
padding: 10px;
height: 40vh;
overflow: auto;
}
.item-card {
margin-bottom: 10px;
background-color: #f0f0f0;
}
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
.card-title {
color: #000;
}
}
.item-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 15px;
margin-bottom: 20px;
}
.item-section {
margin-bottom: 25px;
padding-bottom: 15px;
border-bottom: 1px solid #f0f0f0;
h4 {
margin-bottom: 15px;
color: #303133;
font-size: 14px;
font-weight: bold;
}
}
.item-row {
display: flex;
flex-wrap: wrap;
gap: 20px;
margin-bottom: 15px;
}
.item-col {
display: flex;
align-items: center;
gap: 8px;
}
.item-label {
color: #606266;
font-size: 13px;
white-space: nowrap;
}
.item-value {
color: #303133;
font-size: 13px;
font-weight: 500;
}
// 响应式调整
@media (max-width: 768px) {
.item-grid {
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
}
.item-row {
flex-direction: column;
align-items: flex-start;
gap: 10px;
}
}
</style>

View File

@ -0,0 +1,153 @@
<template>
<div class="dialog" v-if="dialogForm">
<div class="head_box">
<span class="title">工作考核{{ title }} </span>
<div>
<el-button type="primary" size="small" :loading="loading" @click="submit" v-if="title != '详情'">保存</el-button>
<el-button size="small" @click="close">关闭</el-button>
</div>
</div>
<div class="form_cnt">
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules" :disabled="title == '详情'">
<template #bkyj>
<el-divider content-position="left"><span style="color: blue;">布控预警</span></el-divider>
</template>
<template #clyj>
<el-divider content-position="left"><span style="color: blue;">车辆预警</span></el-divider>
</template>
<template #qlry>
<el-divider content-position="left"><span style="color: blue;">7类重点人员预警</span></el-divider>
</template>
<template #rxyj>
<el-divider content-position="left"><span style="color: blue;">人像预警</span></el-divider>
</template>
<template #zbyj>
<el-divider content-position="left"><span style="color: blue;">政保预警</span></el-divider>
</template>
<template #fs>
<el-divider content-position="left"><span style="color: blue;">考核分数</span></el-divider>
</template>
</FormMessage>
</div>
</div>
</template>
<script setup>
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { qcckGet, qcckPost,qcckPut } from "@/api/qcckApi.js";
import { ref, defineExpose, reactive, defineEmits, getCurrentInstance, } from "vue";
const emit = defineEmits(["updateDate"]);
const props = defineProps({
dic: Object
});
const listQuery = ref({
cjfs: 0,
ypfs: 0,
bkyjFkl: 0,
bkyjQsl: 0,
clyjFkl: 0,
clyjQsl: 0,
qlryFkl: 0,
qlryQsl: 0,
rxyjFkl: 0,
rxyjQsl: 0,
zbyjFkl: 0,
zbyjQsl: 0,
}); //表单
const { proxy } = getCurrentInstance();
const dialogForm = ref(false); //弹窗
const formData = ref([
{ label: "考核部门", prop: "ssbmdm", depMc: "ssbm", type: "department" },
{ label: "考核开始日期", prop: "ksrq", type: "date" },
{ label: "考核结束日期", prop: "jsrq", type: "date" },
{ label: "考核描述", prop: "khzbms", type: "textarea", width: "100%" },
{ prop: "fs", type: "slot", width: "100%" },
{ label: "采集分数", prop: "cjfs", type: "number", min: 0, max: 100, step: 1 },
{ label: "研判分数", prop: "ypfs", type: "number", min: 0, max: 100, step: 1 },
{ prop: "bkyj", type: "slot", width: "100%" },
{ label: "布控预警反馈率", prop: "bkyjFkl", type: "number", min: 0, max: 100, step: 0.01 },
{ label: "布控预警签收率", prop: "bkyjQsl", type: "number", min: 0, max: 100, step: 0.01 },
{ prop: "clyj", type: "slot", width: "100%" },
{ label: "车辆预警反馈率", prop: "clyjFkl", type: "number", min: 0, max: 100, step: 0.01 },
{ label: "车辆预警签收率", prop: "clyjQsl", type: "number", min: 0, max: 100, step: 0.01 },
{ prop: "qlry", type: "slot", width: "100%" },
{ label: "7类重点人员反馈率", prop: "qlryFkl", type: "number", min: 0, max: 100, step: 0.01 },
{ label: "7类重点人员签收率", prop: "qlryQsl", type: "number", min: 0, max: 100, step: 0.01 },
{ prop: "rxyj", type: "slot", width: "100%" },
{ label: "人像预警反馈率", prop: "rxyjFkl", type: "number", min: 0, max: 100, step: 0.01 },
{ label: "人像预警签收率", prop: "rxyjQsl", type: "number", min: 0, max: 100, step: 0.01 },
{ prop: "zbyj", type: "slot", width: "100%" },
{ label: "政保预警反馈率", prop: "zbyjFkl", type: "number", min: 0, max: 100, step: 0.01 },
{ label: "政保预警签收率", prop: "zbyjQsl", type: "number", min: 0, max: 100, step: 0.01 },
]);
const loading = ref(false);
const elform = ref();
const title = ref("");
const rules = reactive({
ssbmdm: [{ required: true, message: "请选择考核部门", trigger: "change" }],
ksrq: [{ required: true, message: "请选择考核开始日期", trigger: "change" }],
jsrq: [{ required: true, message: "请选择考核结束日期", trigger: "change" }],
khzbms: [{ required: true, message: "请输入考核描述", trigger: "blur" }],
// ryXm: [{ required: true, message: "请输入人员姓名", trigger: "blur" }],
});
// 初始化数据
const init = (type, row) => {
dialogForm.value = true;
title.value = type == "add" ? "新增" : type == "detail" ? "详情" : "编辑";
if (row) getDataById(row.id);
};
// 根据id查询详情
const getDataById = (id) => {
qcckGet({ id }, `/mosty-gsxt/khgl/${id}`).then((res) => {
listQuery.value = res;
});
};
// 提交
const submit = () => {
elform.value.submit((data) => {
let url = title.value == "新增" ? "/mosty-gsxt/khgl/addEntity" : "/mosty-gsxt/khgl/editEntity";
let params = { ...data };
console.log(params);
loading.value = true;
if (title.value == "新增") {
qcckPost(params, url).then(() => {
loading.value = false;
proxy.$message({ type: "success", message: title.value + "成功" });
emit("updateDate");
close();
}).catch(() => { loading.value = false; });
} else {
qcckPut(params, url).then(() => {
loading.value = false;
proxy.$message({ type: "success", message: title.value + "成功" });
emit("updateDate");
close();
}).catch(() => { loading.value = false; });
}
});
};
// 关闭
const close = () => {
listQuery.value = {};
dialogForm.value = false;
loading.value = false;
};
defineExpose({ init });
</script>
<style lang="scss" scoped>
@import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss";
::v-deep .el-textarea__inner {
height: 18.5em !important;
}
</style>

View File

@ -0,0 +1,171 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<Search :searchArr="searchConfiger" @submit="onSearch" />
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button size="small" type="primary" @click="addEdit('add', '')">
<el-icon style="vertical-align: middle">
<CirclePlus />
</el-icon>
<span style="vertical-align: middle">新增</span>
</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox">
<!-- <MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"> -->
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
expand :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<template #expand="{ props }">
<div style="max-width: 100%">
<Items :row="props || {}" />
</div>
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link size="small" type="success" @click="addEdit('edit', row)">编辑</el-link>
<el-link size="small" type="primary" @click="addEdit('detail', row)">详情</el-link>
<el-link size="small" type="danger" @click="deleteRow(row.id)">删除</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}" />
</div>
<!-- 详情 -->
<DetailForm v-if="show" @updateDate="getList" ref="detailDiloag"
:dic="{ D_BZ_WHCD, D_BZ_MZ, D_BZ_XB, D_BZ_ZZMM, D_GS_RLQB_JCQK }" />
</div>
</template>
<script setup>
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import DetailForm from "./components/addForm.vue";
import Items from "./components/Items.vue";
import { qcckGet, qcckPost, qcckDelete} from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
const { proxy } = getCurrentInstance();
const { D_GS_RLQB_JCQK, D_BZ_WHCD, D_BZ_MZ, D_BZ_XB, D_BZ_ZZMM } = proxy.$dict("D_GS_RLQB_JCQK", "D_BZ_WHCD", "D_BZ_MZ", "D_BZ_XB", "D_BZ_ZZMM"); //获取字典数据
const detailDiloag = ref();
const searchBox = ref(); //搜索框
const show = ref(false);
const searchConfiger = ref([
{ label: "所属部门", prop: "ssbmdm", placeholder: "请选择所属部门", showType: "department" },
{ label: "时间", prop: "startTime", placeholder: "请选择时间", showType: "datetimerange" }
]);
const pageData = reactive({
tableData: [],
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
},
controlsWidth: 200,
tableColumn: [
// { label: "布控预警反馈率", prop: "bkyjFkl" },
// { label: "布控预警签收率", prop: "bkyjQsl" },
// { label: "采集分数", prop: "cjfs" },
// { label: "车辆预警反馈率", prop: "clyjFkl" },
// { label: "车辆预警签收率", prop: "clyjQsl"},
// { label: "7类重点人员反馈率", prop: "qlryFkl" },
// { label: "7类重点人员签收率", prop: "qlryQsl" },
// { label: "人像预警反馈率", prop: "rxyjFkl" },
// { label: "人像预警签收率", prop: "rxyjQsl" },
// { label: "政保预警反馈率", prop: "zbyjFkl" },
// { label: "政保预警签收率", prop: "zbyjQsl" },
// { label: "采集分数", prop: "cjfs" },
// { label: "研判分数", prop: "ypfs" },
{ label: "考核开始日期", prop: "ksrq" },
{ label: "考核结束日期", prop: "jsrq" },
{ label: "考核年份", prop: "khnf" },
{ label: "所属部门", prop: "ssbm" },
]
});
const queryFrom = ref({});
onMounted(() => {
getList();
tabHeightFn();
});
// 搜索
const onSearch = (val) => {
queryFrom.value = {
...val,
startTime: val.startTime ? val.startTime[0] : "",
endTime: val.startTime ? val.startTime[0] : ""
};
pageData.pageConfiger.pageCurrent = 1;
getList();
};
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList();
};
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList();
};
// 获取列表
const getList = () => {
pageData.tableConfiger.loading = true;
let data = { ...pageData.pageConfiger, ...queryFrom.value };
qcckGet(data, "/mosty-gsxt/khgl/getPageList").then((res) => {
pageData.tableData = res.records || [];
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
});
};
// 删除
const deleteRow = (id) => {
proxy.$confirm("确定要删除", "警告", { type: "warning" }).then(() => {
qcckDelete({ ids:[id]}, "/mosty-gsxt/khgl/deleteEntity").then(() => {
proxy.$message({ type: "success", message: "删除成功" });
getList();
});
})
};
// 详情
const addEdit = (type, row) => {
show.value = true;
nextTick(() => {
detailDiloag.value.init(type, row);
});
};
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
window.onresize = function () {
tabHeightFn();
};
};
</script>
<style>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
</style>

View File

@ -177,54 +177,36 @@ const previewFile = (item) => {
window.open(item.wjdz); window.open(item.wjdz);
} }
const downloadFile = async (item) => { const downloadFile = async (item) => {
console.log(item);
try { try {
const dataList =JSON.parse(item.wjdz) const dataList =JSON.parse(item.wjdz)
if (dataList.length === 0) { if (dataList.length === 0) return proxy.$message.warning('没有文件可下载');
proxy.$message.warning('没有文件可下载');
return;
}
console.log(dataList);
const downloadCount = dataList.length; const downloadCount = dataList.length;
let successCount = 0; let successCount = 0;
let failCount = 0; let failCount = 0;
proxy.$message.info(`开始下载${downloadCount}个文件...`); proxy.$message.info(`开始下载${downloadCount}个文件...`);
const downloadPromises = dataList.map(async (fileData, index) => {
// 并行下载所有文件
const downloadPromises = dataList.map(async (fileData, index) => {
try { try {
// fileData.url = "http://47.108.232.77:9000/image/2025-01-06/081102a5418e4146beea277d18018e07.jpeg";
// 使用fetch获取文件内容 // 使用fetch获取文件内容
const response = await fetch(fileData.url); const downloadUrl = fileData.url.replace(/^https?:\/\/[^/]+/, '/zyminio');
if (!response.ok) { const response = await fetch(downloadUrl);
throw new Error('文件下载失败'); if (!response.ok) throw new Error('文件下载失败');
}
// 将响应转换为Blob对象 // 将响应转换为Blob对象
const blob = await response.blob(); const blob = await response.blob();
// 创建下载链接 // 创建下载链接
const downloadLink = document.createElement('a'); const downloadLink = document.createElement('a');
downloadLink.href = URL.createObjectURL(blob); downloadLink.href = URL.createObjectURL(blob);
// 设置下载文件的名称,避免冲突 // 设置下载文件的名称,避免冲突
const fileName = dataList.length > 1 const fileName = dataList.length > 1 ? `${item.wjmc}_${index + 1}` : item.wjmc;
? `${item.wjmc}_${index + 1}`
: item.wjmc;
downloadLink.download = fileName; downloadLink.download = fileName;
// 触发下载 // 触发下载
document.body.appendChild(downloadLink); document.body.appendChild(downloadLink);
downloadLink.click(); downloadLink.click();
// 清理 // 清理
setTimeout(() => { setTimeout(() => {
document.body.removeChild(downloadLink); document.body.removeChild(downloadLink);
URL.revokeObjectURL(downloadLink.href); URL.revokeObjectURL(downloadLink.href);
}, 100); }, 100);
successCount++; successCount++;
} catch (error) { } catch (error) {
console.error(`文件${index + 1}下载失败:`, error); console.error(`文件${index + 1}下载失败:`, error);

View File

@ -1,25 +1,27 @@
<template> <template>
<div> <div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10"> <div ref="searchBox" class="mt10">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount" /> <Search :searchArr="searchConfiger" @submit="onSearch" />
</div> </div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5"> <PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left> <template #left>
<el-button size="small" type="primary" @click="getDataById('add', '')"> <el-button size="small" type="primary" @click="getDataById('add', '')">
<el-icon style="vertical-align: middle"> <el-icon style="vertical-align: middle"><CirclePlus /></el-icon>
<CirclePlus />
</el-icon>
<span style="vertical-align: middle">新增</span> <span style="vertical-align: middle">新增</span>
</el-button> </el-button>
</template> </template>
</PageTitle> </PageTitle>
<!-- 表格 --> <!-- 表格 -->
<div class="tabBox"> <div class="tabBox">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight" <MyTable
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth" :tableData="pageData.tableData"
@chooseData="chooseData"> :tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
@chooseData="chooseData"
>
<template #wjdx="{ row }"> <template #wjdx="{ row }">
{{ row.wjdx }}MB {{ row.wjdx }}MB
</template> </template>
@ -30,16 +32,17 @@
<template #controls="{ row }"> <template #controls="{ row }">
<el-link size="small" type="primary" @click="getDataById('edit', row)">修改</el-link> <el-link size="small" type="primary" @click="getDataById('edit', row)">修改</el-link>
<el-link size="small" type="primary" @click="getDataById('detail', row)">详情</el-link> <el-link size="small" type="primary" @click="getDataById('detail', row)">详情</el-link>
<el-link size="small" type="primary" @click="previewFile(row)" <el-link size="small" type="primary" @click="previewFile(row)" v-if="row.wjlx == '.png' || row.wjlx == '.jpg' || row.wjlx == '.jpeg'">预览</el-link>
v-if="row.wjlx == '.png' || row.wjlx == '.jpg' || row.wjlx == '.jpeg'">预览</el-link>
<el-link size="small" type="primary" @click="downloadFile(row)">下载</el-link> <el-link size="small" type="primary" @click="downloadFile(row)">下载</el-link>
<el-link size="small" type="danger" @click="deleteFile(row)">删除</el-link> <el-link size="small" type="danger" @click="deleteFile(row)">删除</el-link>
</template> </template>
</MyTable> </MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{ <Pages
...pageData.pageConfiger, @changeNo="changeNo"
total: pageData.total @changeSize="changeSize"
}"></Pages> :tableHeight="pageData.tableHeight"
:pageConfiger="{ ...pageData.pageConfiger, total: pageData.total }"
/>
</div> </div>
</div> </div>
<AddForm ref="addForm" @getList="getList" /> <AddForm ref="addForm" @getList="getList" />
@ -51,47 +54,22 @@ import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue"; import Search from "@/components/aboutTable/Search.vue";
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
import { qbcjZxsSelectPage } from "@/api/qbcj.js"; import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { reactive, ref, onMounted, getCurrentInstance, watch } from "vue";
import { getItem } from '@//utils/storage.js' import { getItem } from '@//utils/storage.js'
import { deleteWjZzzAddEntity, getWjZzzAddEntity } from '@//api/qbcj.js' import { deleteWjZzzAddEntity, getWjZzzAddEntity } from '@//api/qbcj.js'
import AddForm from "./components/addForm.vue"; import AddForm from "./components/addForm.vue";
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
// const { D_BZ_CJLX, D_GS_XS_LX } = proxy.$dict("D_BZ_CJLX", "D_GS_XS_LX"); //获取字典数据
const detailDiloag = ref(); const detailDiloag = ref();
const searchBox = ref(); //搜索框 const searchBox = ref(); //搜索框
const ids = ref([]) const ids = ref([])
const tableList = ref([]); const tableList = ref([]);
onMounted(() => {
const { deptBizType, deptLevel } = getItem('deptId')[0]
const Jb = deptLevel[0] == '2' ? '01' : deptLevel[0] == '3' ? '02' : '03'
qxkz.deptBizType = deptBizType
qxkz.deptLevel = Jb
getRouter()
tabHeightFn()
if (route.query.id) {
detailDiloag.value.init('edit', {
id: route.query.id
});
return
}
getList()
});
const chooseData = (val) => {
ids.value = val.map(item => {
return item.id
})
tableList.value = val
}
const qxkz = reactive({ const qxkz = reactive({
deptBizType: "", deptBizType: "",
deptLevel: "" deptLevel: ""
}) })
const searchConfiger = ref([ const searchConfiger = ref([
{ label: "文件名称", prop: 'wjmc', placeholder: "请输入文件名称", showType: "input" }, { label: "文件名称", prop: 'wjmc', placeholder: "请输入文件名称", showType: "input" },
// { label: "情报来源", prop: 'cjLx', placeholder: "请选择情报来源", showType: "select", options: D_BZ_CJLX },
// { label: "来源单位", prop: 'ssbmdm', placeholder: "请选择来源单位", showType: "department" }
]); ]);
const pageData = reactive({ const pageData = reactive({
@ -117,6 +95,26 @@ const pageData = reactive({
] ]
}); });
const queryFrom = ref({}); const queryFrom = ref({});
const addForm = ref(null)
const route = useRoute()
const routerMate = ref({})
onMounted(() => {
const { deptBizType, deptLevel } = getItem('deptId')[0]
qxkz.deptBizType = deptBizType
qxkz.deptLevel = deptLevel[0] == '2' ? '01' : deptLevel[0] == '3' ? '02' : '03'
routerMate.value = route.meta;
getList()
tabHeightFn()
if (route.query.id) return detailDiloag.value.init('edit', { id: route.query.id });
});
const chooseData = (val) => {
if(Array.isArray(val)){
ids.value = val.map(item => item.id)
tableList.value = val
}
}
// 搜索 // 搜索
const onSearch = (val) => { const onSearch = (val) => {
@ -162,67 +160,48 @@ const tabHeightFn = () => {
tabHeightFn(); tabHeightFn();
}; };
}; };
const route = useRoute()
const routerMate = ref({})
const getRouter = () => {
routerMate.value = route.meta
}
const addForm = ref(null)
const getDataById = (type, row) => { const getDataById = (type, row) => {
addForm.value.init(type, row, '01'); addForm.value.init(type, row, '01');
} }
const previewFile = (item) => { const previewFile = (item) => {
window.open(item.wjdz); window.open(item.wjdz);
} }
const downloadFile = async (item) => {
console.log(item);
try {
const dataList =JSON.parse(item.wjdz)
if (dataList.length === 0) {
proxy.$message.warning('没有文件可下载');
return;
}
console.log(dataList);
const downloadFile = async (item) => {
try {
const dataList = JSON.parse(item.wjdz)
if (dataList.length === 0) return proxy.$message.warning('没有文件可下载');
const downloadCount = dataList.length; const downloadCount = dataList.length;
let successCount = 0; let successCount = 0;
let failCount = 0; let failCount = 0;
proxy.$message.info(`开始下载${downloadCount}个文件...`); proxy.$message.info(`开始下载${downloadCount}个文件...`);
// 并行下载所有文件 // 并行下载所有文件
const downloadPromises = dataList.map(async (fileData, index) => { const downloadPromises = dataList.map(async (fileData, index) => {
try { try {
// fileData.url = "http://47.108.232.77:9000/image/2025-01-06/081102a5418e4146beea277d18018e07.jpeg";
// 使用fetch获取文件内容 // 使用fetch获取文件内容
const response = await fetch(fileData.url); const downloadUrl = fileData.url.replace(/^https?:\/\/[^/]+/, '/zyminio');
if (!response.ok) { const response = await fetch(downloadUrl);
throw new Error('文件下载失败'); if (!response.ok) throw new Error('文件下载失败');
}
// 将响应转换为Blob对象 // 将响应转换为Blob对象
const blob = await response.blob(); const blob = await response.blob();
// 创建下载链接 // 创建下载链接
const downloadLink = document.createElement('a'); const downloadLink = document.createElement('a');
downloadLink.href = URL.createObjectURL(blob); downloadLink.href = URL.createObjectURL(blob);
// 设置下载文件的名称,避免冲突 // 设置下载文件的名称,避免冲突
const fileName = dataList.length > 1 const fileName = dataList.length > 1 ? `${item.wjmc}_${index + 1}` : item.wjmc;
? `${item.wjmc}_${index + 1}`
: item.wjmc;
downloadLink.download = fileName; downloadLink.download = fileName;
// 触发下载 // 触发下载
document.body.appendChild(downloadLink); document.body.appendChild(downloadLink);
downloadLink.click(); downloadLink.click();
// 清理 // 清理
setTimeout(() => { setTimeout(() => {
document.body.removeChild(downloadLink); document.body.removeChild(downloadLink);
URL.revokeObjectURL(downloadLink.href); URL.revokeObjectURL(downloadLink.href);
}, 100); }, 100);
successCount++; successCount++;
} catch (error) { } catch (error) {
console.error(`文件${index + 1}下载失败:`, error); console.error(`文件${index + 1}下载失败:`, error);
@ -242,16 +221,12 @@ console.log(dataList);
proxy.$message.warning(`成功下载${successCount}个文件,失败${failCount}个文件`); proxy.$message.warning(`成功下载${successCount}个文件,失败${failCount}个文件`);
} }
} catch (error) { } catch (error) {
console.error('文件下载失败:', error);
proxy.$message.error('文件下载失败,请稍后重试'); proxy.$message.error('文件下载失败,请稍后重试');
} }
} }
const deleteFile = (row) => { const deleteFile = (row) => {
proxy.$confirm('确定删除选中文件吗?', '提示', { proxy.$confirm('确定删除选中文件吗?', '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
deleteWjZzzAddEntity({ ids: [row.id] }).then(res => { deleteWjZzzAddEntity({ ids: [row.id] }).then(res => {
proxy.$message.success('删除成功'); proxy.$message.success('删除成功');
getList(); getList();

View File

@ -11,7 +11,7 @@
<div class="form-content" v-loading="loading"> <div class="form-content" v-loading="loading">
<!-- <div class="form_cnt"> --> <!-- <div class="form_cnt"> -->
<FormMessage :disabled="disabled" v-model="listQuery" :formList="formData" ref="elform" :rules="rules"> <FormMessage :disabled="disabled" v-model="listQuery" :formList="formData" ref="elform" :rules="rules">
<template #jbxx> <!-- <template #jbxx>
<div> <div>
<h3 class="tags-title">报送情况</h3> <h3 class="tags-title">报送情况</h3>
<div style="width: 200%;"> <div style="width: 200%;">
@ -23,7 +23,7 @@
</el-descriptions> </el-descriptions>
</div> </div>
</div> </div>
</template> </template> -->
<template #shzt> <template #shzt>
<div v-if="disabled"> <div v-if="disabled">
<h3 class="tags-title">审核状态</h3> <h3 class="tags-title">审核状态</h3>
@ -566,17 +566,26 @@ defineExpose({ init });
.form-container { .form-container {
display: flex; display: flex;
width: 100%; width: 100%;
height: calc(100% - 50px);
overflow: hidden;
} }
.form-content { .form-content {
// display: flex; flex: 1;
width: 80%; height: 100%;
overflow: hidden;
overflow-y: auto;
} }
.timeline-container { .timeline-container {
width: 400px;
padding-right: 10px;
box-sizing: border-box;
border: 1px solid #ebeef5; border: 1px solid #ebeef5;
flex: 1;
margin: 0 10px; margin: 0 10px;
height: 100%;
overflow: hidden;
overflow-y: auto;
} }
/* 时间线宽度 */ /* 时间线宽度 */

View File

@ -0,0 +1,232 @@
<template>
<div class="inforReport">
<el-dialog :close-on-click-modal="false" :show-close="false" title="信息上报" v-model="visible" width="50%" top="5vh">
<div class="cntBox">
<Toolbar
style="border-bottom: 1px solid #ccc"
:editor="editorRef"
:defaultConfig="toolbarConfig"
:mode="mode"
/>
<Editor
style="height: 67vh; overflow-y: hidden;"
v-model="valueHtml"
:defaultConfig="editorConfig"
:mode="mode"
@onCreated="handleCreated"
@onChange="handChange"
/>
</div>
<div class="tc mt10">
<el-button @click="visible = false">取消</el-button>
<el-button type="primary" @click="downloadWithStyles">下载</el-button>
</div>
</el-dialog>
</div>
</template>
<script setup>
import { connectSSEWithPost } from '@/utils/sse.js'
import { timeValidate } from '@/utils/tools'
import { getItem } from "@/utils/storage";
import "@wangeditor/editor/dist/css/style.css";
import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
import { ref, shallowRef, computed, onBeforeUnmount, onMounted, watch } from "vue";
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
data: {
type: Array,
default: () => []
}
})
const baseInfo = {
ssbm:getItem('deptId') ? getItem("deptId")[0].deptName : '',
time:timeValidate(null,'ymd')
}
const emit = defineEmits(['update:modelValue'])
const visible = computed({
get: () => props.modelValue,
set: (val) => emit('update:modelValue', val)
})
// 编辑器实例,必须用 shallowRef
const editorRef = shallowRef()
const valueHtml = ref('')// 内容 HTML
const mode = 'default'
const toolbarConfig = {}
const editorConfig = { placeholder: '请输入内容...' }
// 带样式的下载方法
const downloadWithStyles = () => {
const wordDocument = `
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>富文本导出</title>
<style>
/* 应用两端对齐样式 */
body {
text-align: justify;
text-justify: inter-character; /* 中文文本两端对齐 */
font-family: "Microsoft YaHei", Arial, sans-serif;
}
p {
text-align: justify;
text-justify: inter-character;
}
.w-e-text-container [data-slate-editor] .table-container{
border: none !important;
border-bottom: 1px solid #ccc !important;
padding: 10px 10px 0px !important;
border-radius: 0 !important;
}
.w-e-text-container [data-slate-editor] table td, .w-e-text-container [data-slate-editor] table th{
border: none !important;
}
</style>
</head>
<body>
${valueHtml.value}
</body>
</html>
`;
const blob = new Blob([wordDocument], {
type: 'application/msword'
});
saveAs(blob, '情报信息报告.doc');
};
// 处理事件
const handleEvents = async () =>{
// 模拟
// setTimeout(async ()=>{
// let prompt = '对事件的性质、事件的发展,指向性、危害性、可控性等进行分析。'
// if (valueHtml.value.includes('事件分析中。。。')) {
// valueHtml.value = valueHtml.value.replace('事件分析中。。。', prompt)
// }
// },1500)
try {
let prompt = '对事件的性质、事件的发展,指向性、危害性、可控性等进行分析。'
await connectSSEWithPost(prompt, {
onChunk: (content) => {
valueHtml.value = valueHtml.value.replace('事件分析中。。。', content)
},
onComplete: () => {
console.log('SSE连接完成');
},
onError: (error) => {
console.error('SSE连接错误:', error);
}
});
} catch (err) {
valueHtml.value = valueHtml.value.replace('事件分析中。。。', '分析失败,请稍后重试')
console.error('分析失败:', err);
}
}
// 工作指引
const handleWork = async () =>{
// 模拟
// setTimeout(async ()=>{
// let prompt = '根据分析内容,针对性提出一些对策建议。'
// if (valueHtml.value.includes('工作指引分析中。。。')) {
// valueHtml.value = valueHtml.value.replace('工作指引分析中。。。', prompt)
// }
// },1500)
try {
let prompt = '根据分析内容,针对性提出一些对策建议。'
await connectSSEWithPost(prompt, {
onChunk: (content) => {
valueHtml.value = valueHtml.value.replace('工作指引分析中。。。', content)
},
onComplete: () => {
console.log('SSE连接完成');
},
onError: (error) => {
console.error('SSE连接错误:', error);
}
});
} catch (err) {
valueHtml.value = valueHtml.value.replace('工作指引分析中。。。', '分析失败,请稍后重试')
console.error('分析失败:', err);
}
}
const handleHtml = async (val) =>{
let html = `<h1 style="text-align: center; font-size: 32px; font-weight: bold; font-family: 'Songti SC', 'SimSun', serif; margin-bottom: 20px;">
<span style="color: rgb(225, 60, 57);">林芝公安情报信息</span>
</h1>
<table style="width: 100%; border-bottom: 1px solid black; margin-bottom: 30px; font-family: 'FangSong', serif; font-size: 16px; border-collapse: collapse;">
<tr >
<td style="text-align: left; padding-bottom: 10px; border: none;">单位:${baseInfo.ssbm}</td>
<td style="text-align: right; padding-bottom: 10px; border: none;">时间:${baseInfo.time}</td>
</tr>
</table><h2 style="text-align: center;"></h2>
<h2 style="text-align: center; font-size: 24px; font-family: 'SimHei', sans-serif; margin-bottom: 20px;">关于对 XXXX 事件的综合研判</h2>
<p style="text-indent: 2em; line-height: 2; font-family: 'FangSong', serif; font-size: 18px;">近日,${baseInfo.ssbm}(单位)接报 ${val.length} 起关于 XXXXXX 事件的情报信息,合并研判如下:</p>
<h3 style="font-size: 20px; font-weight: bold; margin-top: 20px; margin-bottom: 10px; font-family: 'SimHei', sans-serif;">一、事件概况</h3>`
val.forEach((item,index)=>{
html+=`<p style="text-indent: 2em; line-height: 2; font-family: 'FangSong', serif; font-size: 18px;">事件 ${index+1}${item.qbmc}${item.xsBh}</p>`
})
html+=`<h3 style="font-size: 20px; font-weight: bold; margin-top: 20px; margin-bottom: 10px; font-family: 'SimHei', sans-serif;">二、事件分析</h3>`
html+=`<p style="text-indent: 2em; line-height: 2; font-family: 'FangSong', serif; font-size: 18px;">事件分析中。。。</p>`
html+=`<h3 style="font-size: 20px; font-weight: bold; margin-top: 20px; margin-bottom: 10px; font-family: 'SimHei', sans-serif;">三、工作指引</h3>
<p style="text-indent: 2em; line-height: 2; font-family: 'FangSong', serif; font-size: 18px;">工作指引分析中。。。</p>
`
valueHtml.value = html
await handleWork(html) //工作指引
await handleEvents(html) //处理事件
}
watch(()=>props.data,val=>{
handleHtml(val)
},{immediate:true,deep:true})
// 组件销毁时,也及时销毁编辑器
onBeforeUnmount(() => {
const editor = editorRef.value
if (editor == null) return
editor.destroy()
})
const handleCreated = (editor) => {
editorRef.value = editor // 记录 editor 实例,重要!
}
//内容发生变化
const handChange = (editor) => {
// 判断是否是一个空段落,是空就传空文本
console.log(editor.getHtml(), 'editor.getHtml()');
};
</script>
<style lang="scss" scoped>
.cntBox {
width: 100%;
border: 1px solid #ccc;
margin: 0 auto;
}
</style>
<style lang="scss">
.inforReport{
.w-e-text-container [data-slate-editor] .table-container{
border: none !important;
border-bottom: 1px solid #ccc !important;
padding: 10px 10px 0px !important;
border-radius: 0 !important;
}
.w-e-text-container [data-slate-editor] table td, .w-e-text-container [data-slate-editor] table th{
border: none !important;
}
}
</style>

View File

@ -12,7 +12,7 @@
</el-icon> </el-icon>
<span class="vertical-middle">新增</span> <span class="vertical-middle">新增</span>
</el-button> </el-button>
<el-button type="primary" @click="dologCancel()" size="small"> <el-button type="primary" @click="exportFileModel = true;" size="small">
<el-icon class="vertical-middle"> <el-icon class="vertical-middle">
<CirclePlus /> <CirclePlus />
</el-icon> </el-icon>
@ -30,7 +30,12 @@
<CirclePlus /> <CirclePlus />
</el-icon> </el-icon>
<span class="vertical-middle">删除</span> <span class="vertical-middle">删除</span>
</el-button></template> </el-button>
<el-button type="primary" size="small" @click="handleReport">
<el-icon class="vertical-middle"><Edit /></el-icon>
<span class="vertical-middle">情报信息报告</span>
</el-button>
</template>
</PageTitle> </PageTitle>
<!-- 表格 --> <!-- 表格 -->
<div class="tabBox" :style="{ height: (pageData.tableHeight + 40) + 'px' }"> <div class="tabBox" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
@ -49,7 +54,6 @@
<template #lczt="{ row }"> <template #lczt="{ row }">
<DictTag :tag="false" :value="row.lczt" :options="D_BZ_LCZT" /> <DictTag :tag="false" :value="row.lczt" :options="D_BZ_LCZT" />
</template> </template>
<template #cyqk="{ row }"> <template #cyqk="{ row }">
<el-link v-if="isShowBtn('采纳')" size="small" type="danger" @click="cnMsg(row)" <el-link v-if="isShowBtn('采纳')" size="small" type="danger" @click="cnMsg(row)"
:disabled="butcontroll('04', row.lczt)">采纳</el-link> :disabled="butcontroll('04', row.lczt)">采纳</el-link>
@ -58,39 +62,51 @@
:disabled="butcontroll('04', row.lczt)">回退</el-link> :disabled="butcontroll('04', row.lczt)">回退</el-link>
</template> </template>
<!-- 操作 --> <!-- 操作 -->
<!-- "市情指挥人员": ["采纳", "回退", "分组", "转线索", "转合成", "转会商", "打标签", "修改", "详情", "关注部门", "送审"], --> <!-- "市情指挥人员": ["采纳", "回退", "分组", "转线索", "转合成", "转会商", "打标签", "修改", "详情", "关注部门", "送审"], -->
<!-- "县情指人员": ["上报", "回退", "修改", "详情", "送审"], --> <!-- "县情指人员": ["上报", "回退", "修改", "详情", "送审"], -->
<template #controls="{ row }"> <template #controls="{ row }">
<el-link v-if="isShowBtn('送审', row) && qxkz.deptLevel == '01'" :disabled="row.sldshzt != '00'||row.lczt != '04'" size="small" <el-link
type="primary" @click="postXxcjXxcjTjsh(row)">送审</el-link> v-if="isShowBtn('送审', row) && qxkz.deptLevel == '01'"
<el-link v-if="isShowBtn('送审', row) && qxkz.deptLevel == '02'" :disabled="row.xldshzt != '00'||row.lczt != '04'" size="small" :disabled="!(row.lczt == '04')||row.sldshzt != '00'"
type="primary" @click="postXxcjXxcjTjsh(row)">送审</el-link> size="small" type="primary"
@click="postXxcjXxcjTjsh(row)">
送审
</el-link>
<!-- <el-link
v-if="isShowBtn('送审', row) && qxkz.deptLevel == '02'"
:disabled="row.xldshzt != '00' "
size="small" type="primary"
@click="postXxcjXxcjTjsh(row)">
送审
</el-link> -->
<!-- 01 提交 02 上报县局 03 上班市局 04 采纳 05 退回 06 打标签 07 转合成 08 转线索 09 转会商v-if="qxkz.deptLevel == '01'" --> <!-- 01 提交 02 上报县局 03 上班市局 04 采纳 05 退回 06 打标签 07 转合成 08 转线索 09 转会商v-if="qxkz.deptLevel == '01'" -->
<!-- 在提交和退回得状态才能进行上报 -->
<el-link v-if="isShowBtn('上报')" size="small" type="primary" @click="appearNewspapers(row)" :disabled="row.xldshzt != '02'">上报</el-link> <el-link v-if="isShowBtn('上报') && qxkz.deptLevel == '03'" size="small" type="primary" @click="appearNewspapers(row)" :disabled="row.lczt != '01'">上报</el-link>
<el-link v-else-if="isShowBtn('上报')" size="small" type="primary" @click="appearNewspapers(row)" :disabled="!(row.xldshzt == '02'&&row.lczt == '02')">上报</el-link>
<!-- && row.lczt != '02' -->
<el-link v-if="isShowBtn('分组')" size="small" type="primary" @click="opneMsg(row)" <el-link v-if="isShowBtn('分组')" size="small" type="primary" @click="opneMsg(row)"
:disabled="row.sldshzt != '02'">分组</el-link> :disabled="row.sldshzt != '02'">分组</el-link>
<!-- 只有领导有肯定 --> <!-- 只有领导有肯定 -->
<!-- <el-link v-if="isShowBtn('肯定')" size="small" type="primary" @click="affirm(row)">肯定</el-link> --> <!-- <el-link v-if="isShowBtn('肯定')" size="small" type="primary" @click="affirm(row)">肯定</el-link> -->
<el-link v-if="isShowBtn('删除')" size="small" type="primary" @clic.stopk="delDictItem(row.id)">删除</el-link> <el-link v-if="isShowBtn('删除')" size="small" type="primary" @clic.stopk="delDictItem(row.id)">删除</el-link>
<el-link v-if="isShowBtn('修改', row)" size="small" type="primary" @click="addEdit('edit', row)">修改</el-link> <el-link v-if="isShowBtn('修改', row)" size="small" type="primary" @click="addEdit('edit', row)">修改</el-link>
<el-link v-if="isShowBtn('续报', row)" size="small" type="primary" @click="addEdit('followUpReport', row)">续报</el-link> <el-link v-if="isShowBtn('续报', row)" size="small" type="primary"
@click="addEdit('followUpReport', row)">续报</el-link>
<el-link v-if="isShowBtn('详情')" size="small" type="primary" @click="addEdit('info', row)">详情</el-link> <el-link v-if="isShowBtn('详情')" size="small" type="primary" @click="addEdit('info', row)">详情</el-link>
<!-- 所有状态都能进行转线索 --> <!-- 所有状态都能进行转线索 -->
<el-link v-if="isShowBtn('转线索')" size="small" type="primary" @click="FollowUpOnLeads(row)" <el-link v-if="isShowBtn('转线索')" size="small" type="primary" @click="FollowUpOnLeads(row)"
:disabled="row.sldshzt != '02' ">转线索</el-link> :disabled="row.sldshzt != '02'">转线索</el-link>
<!-- 所有状态都能进行转合成 --> <!-- 所有状态都能进行转合成 -->
<!-- <el-link v-if="isShowBtn('转合成')" size="small" type="primary" @click="openFkDialogszl(row)" <!-- <el-link v-if="isShowBtn('转合成')" size="small" type="primary" @click="openFkDialogszl(row)" :disabled="butcontroll('01', row.lczt)">转合成</el-link> -->
:disabled="butcontroll('01', row.lczt)">转合成</el-link> -->
<!-- 所有状态都能进行转会商 --> <!-- 所有状态都能进行转会商 -->
<!-- <el-link v-if="isShowBtn('转会商')" size="small" type="primary" @click="handleTransferMerchant(row)" <!-- <el-link v-if="isShowBtn('转会商')" size="small" type="primary" @click="handleTransferMerchant(row)" :disabled="butcontroll('01', row.lczt)">转会商</el-link> -->
:disabled="butcontroll('01', row.lczt)">转会商</el-link> -->
<el-link v-if="isShowBtn('关注部门')" :disabled="row.sldshzt != '02'" size="small" type="primary" @click="FollowUpOnDept(row)">关注</el-link> <el-link v-if="isShowBtn('关注部门') && row.qbjb=='01'" :disabled="row.sldshzt != '02'" size="small" type="primary" @click="FollowUpOnDept(row)">关注</el-link>
<!-- 市局能给所有数据创建标签 --> <!-- 市局能给所有数据创建标签 -->
<el-link v-if="isShowBtn('打标签')" size="small" type="primary" @click="openCustomTag(row)" <el-link v-if="isShowBtn('打标签')" size="small" type="primary" @click="openCustomTag(row)" :disabled="row.sldshzt != '02'">打标签</el-link>
:disabled="row.sldshzt != '02' ">打标签</el-link>
</template> </template>
</MyTable> </MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{ <Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
@ -101,21 +117,55 @@
<!-- 新增 --> <!-- 新增 -->
<AddForm ref="detailDiloag" @getList="getList" :titleData="titleData" :dict="{ D_BZ_LCZT, D_BZ_SSSHZT }" /> <AddForm ref="detailDiloag" @getList="getList" :titleData="titleData" :dict="{ D_BZ_LCZT, D_BZ_SSSHZT }" />
</div> </div>
<ExportFile v-model="exportFileModel" :tableColumn="tableColumn" :dict="{ D_GS_XS_LY, D_GS_XS_LX, D_GS_XS_LX }"
:dataModel="pageData.tableData" /> <ExportFile
<MakeTag v-model="chooseRow" :dataList="dataList" :dict="{ D_BZ_CJLX, D_BZ_QBCZZT, D_GS_XS_LX, D_BZ_BQJB }" v-model="exportFileModel"
@getList="getList" /> :tableColumn="tableColumn"
<Fszl v-model="fszlShow" path="/xxcj/sendFqzl" :itemData="dataList" /> :dict="{ D_GS_XS_LY, D_GS_XS_LX, D_GS_XS_LX }"
<CustomTag v-model="customTagShow" :dataList="dataList" @getList="getList" :dict="{ D_XXCJ_BQLX }" /> :dataModel="pageData.tableData"
<Configuration v-model="configurationShow" :dataList="dataList" @getList="getList" /> />
<MakeTag
v-model="chooseRow"
:dataList="dataList"
:dict="{ D_BZ_CJLX, D_BZ_QBCZZT, D_GS_XS_LX, D_BZ_BQJB }"
@getList="getList"
/>
<Fszl
v-model="fszlShow"
path="/xxcj/sendFqzl"
:itemData="dataList"
/>
<CustomTag
v-model="customTagShow"
:dataList="dataList"
@getList="getList"
:dict="{ D_XXCJ_BQLX }"
/>
<Configuration
v-model="configurationShow"
:dataList="dataList"
@getList="getList"
/>
<!-- 转会商 --> <!-- 转会商 -->
<transferMerchant v-if="isShowTransferMerchantTc" :row="currRow" ref="transferMerchantRef" title="转会商" <transferMerchant
@close="isShowTransferMerchantTc = false" @ok="getList" /> v-if="isShowTransferMerchantTc"
:row="currRow"
title="转会商"
@close="isShowTransferMerchantTc = false"
@ok="getList"
/>
<!-- 情报信息报告 -->
<InforReport v-if="inforReportShow" v-model="inforReportShow" :data="tableList" />
</template> </template>
<script setup> <script setup>
import InforReport from './components/inforReport.vue'
import PageTitle from "@/components/aboutTable/PageTitle.vue"; import PageTitle from "@/components/aboutTable/PageTitle.vue";
import MyTable from "@/components/aboutTable/MyTable.vue"; import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
@ -133,32 +183,28 @@ import Fszl from '@/views/backOfficeSystem/HumanIntelligence/components/fszl.vue
import CustomTag from '../components/customTag.vue' import CustomTag from '../components/customTag.vue'
import Configuration from '../components/configuration.vue' import Configuration from '../components/configuration.vue'
import transferMerchant from "./components/transferMerchant.vue"; import transferMerchant from "./components/transferMerchant.vue";
import { isShiQingZhi } from "@/utils/auth.js" import { Edit } from "@element-plus/icons";
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const { D_GS_XS_LY, D_BZ_SSSHZT, D_BZ_SSZT, D_BZ_SF, D_GS_XS_LX, D_BZ_BQJB, const { D_GS_XS_LY, D_BZ_SSSHZT, D_GS_XS_LX, D_BZ_BQJB,D_BZ_QBCZZT, D_BZ_CJLX, D_BZ_LCZT,D_XXCJ_BQLX } = proxy.$dict( "D_GS_XS_LY", 'D_BZ_SSSHZT',"D_GS_XS_LX", "D_BZ_QBCZZT", "D_BZ_CJLX", "D_BZ_BQJB", "D_BZ_LCZT", "D_XXCJ_BQLX"); //获取字典数据
D_GS_XS_QTLX, D_GS_ZDQT_LB, const route = useRoute()
D_BZ_BMJB, D_BZ_CLPP, D_BZ_CLYS, D_BZ_CLLX, D_BZ_XZQHDM, D_BZ_QBCZZT, D_BZ_CJLX, D_BZ_LCZT, const titleData = ref()
D_XXCJ_BQLX } = const exportFileModel = ref(false)
proxy.$dict("D_BZ_BMJB", "D_GS_XS_LY", 'D_BZ_SSSHZT', const qxkz = reactive({
"D_BZ_SSZT", "D_BZ_SF", "D_GS_XS_LX", "D_GS_XS_QTLX", deptBizType: '',
"D_GS_ZDQT_LB", "D_BZ_CLPP", "D_BZ_CLYS", "D_BZ_CLLX", "D_BZ_XZQHDM", "D_BZ_QBCZZT", "D_BZ_CJLX", "D_BZ_BQJB", "D_BZ_LCZT", "D_XXCJ_BQLX"); //获取字典数据 deptLevel: '',
roleCode: false,
depBool: false
});
const fszlShow = ref(false)// 发送指令
const detailDiloag = ref(); const detailDiloag = ref();
const inforReportShow = ref(false) //情报信息报告
const customTagShow = ref(false)// 打标签
const configurationShow = ref(false)// 配置关注部门
const searchBox = ref(); //搜索框 const searchBox = ref(); //搜索框
const ids = ref([]) const ids = ref([])
const tableList = ref([]); const tableList = ref([]);
const chooseData = (val) => {
ids.value = val.map(item => {
return item.id
})
tableList.value = val
}
/** 市情指 */
const cityIntelligenceCommand = isShiQingZhi()
const currRow = ref({}) const currRow = ref({})
const transferMerchantRef = ref()
const isShowTransferMerchantTc = ref(false) const isShowTransferMerchantTc = ref(false)
const isShow = ref(false) const isShow = ref(false)
const searchConfiger = ref([ const searchConfiger = ref([
{ label: "录入人", prop: 'xssbr', placeholder: "请输入录入人", showType: "input" }, { label: "录入人", prop: 'xssbr', placeholder: "请输入录入人", showType: "input" },
@ -166,7 +212,7 @@ const searchConfiger = ref([
{ label: "编号", prop: 'xsBh', placeholder: "请输入编号", showType: "input" }, { label: "编号", prop: 'xsBh', placeholder: "请输入编号", showType: "input" },
{ label: "时间", prop: "startTime", placeholder: "请选择时间", showType: "daterange" }, { label: "时间", prop: "startTime", placeholder: "请选择时间", showType: "daterange" },
{ label: "情报标题", prop: 'qbmc', placeholder: "请输入情报标题", showType: "input" }, { label: "情报标题", prop: 'qbmc', placeholder: "请输入情报标题", showType: "input" },
{ label: "标签内容", prop: 'bqdmList', placeholder: "请选择标签内容", showType: "select", options: D_XXCJ_BQLX,multiple:true}, { label: "标签内容", prop: 'bqdmList', placeholder: "请选择标签内容", showType: "select", options: D_XXCJ_BQLX, multiple: true },
{ label: "标签级别", prop: 'qbjb', placeholder: "请选择标签级别", showType: "select", options: D_BZ_BQJB }, { label: "标签级别", prop: 'qbjb', placeholder: "请选择标签级别", showType: "select", options: D_BZ_BQJB },
{ label: "情报处置状态", prop: 'lczt', placeholder: "请选择处置状态", showType: "select", options: D_BZ_LCZT }, { label: "情报处置状态", prop: 'lczt', placeholder: "请选择处置状态", showType: "select", options: D_BZ_LCZT },
{ label: "关键字", prop: 'keyword', placeholder: "请输入关键字", showType: "input" }, { label: "关键字", prop: 'keyword', placeholder: "请输入关键字", showType: "input" },
@ -194,29 +240,38 @@ const pageData = reactive({
{ label: "上报单位", prop: "ssbm" }, { label: "上报单位", prop: "ssbm" },
{ label: "流程状态", prop: "lczt", showSolt: true }, { label: "流程状态", prop: "lczt", showSolt: true },
{ label: "采用情况", prop: "cyqk", showSolt: true }, { label: "采用情况", prop: "cyqk", showSolt: true },
// { label: "标签内容", prop: "lczt", showSolt: true },
// { label: "消息状态", prop: "czzt", showSolt: true },
] ]
}); });
// 导出数据
const tableColumn = reactive([
{ label: "上报人姓名", prop: "xssbr" },
{ label: "情报上报时间", prop: "sxsbsj" },
{ label: "情报编号", prop: "xsBh" },
{ label: "情报标题", prop: "qbmc" },
{ label: "情报来源", prop: "qbly", showSolt: true, zd: 'D_BZ_CJLX' },
])
const queryFrom = ref({}); const queryFrom = ref({});
const chooseRow = ref(false) const chooseRow = ref(false)
const dataList = ref() const dataList = ref()
const chooseData = (val) => {
ids.value = val.map(item => item.id)
tableList.value = val
}
// 采纳 // 采纳
const cnMsg = (item) => { const cnMsg = (item) => {
// if ( qxkz.depBool) {
proxy.$confirm("确定要采纳", "警告", { type: "warning" }).then(() => { proxy.$confirm("确定要采纳", "警告", { type: "warning" }).then(() => {
xxcjUpdateCzlc({ id: item.id, lczt: '04' }).then(res => { xxcjUpdateCzlc({ id: item.id, lczt: '04' }).then(res => {
proxy.$message({ type: "success", message: "采纳成功" }); proxy.$message({ type: "success", message: "采纳成功" });
getList(); getList();
}) })
}).catch(() => { }); }).catch(() => { });
// } }
const handleReport = () => {
if(tableList.value.length == 0) return proxy.$message({ type: "warning", message: "请选择情报信息" });
inforReportShow.value = true
} }
// 回退 // 回退
const rollbackNewspapers = (item) => { const rollbackNewspapers = (item) => {
@ -264,17 +319,12 @@ const rollbackNewspapers = (item) => {
const appearNewspapers = (item) => { const appearNewspapers = (item) => {
if ((item.lczt == '01' || item.lczt == '05' || item.lczt == '02') && item.qbjb == '00' && qxkz.deptLevel != '01') { if ((item.lczt == '01' || item.lczt == '05' || item.lczt == '02') && item.qbjb == '00' && qxkz.deptLevel != '01') {
proxy.$confirm("确定要上报", "警告", { type: "warning" }).then(() => { proxy.$confirm("确定要上报", "警告", { type: "warning" }).then(() => {
let promes = {} let promes = { id: item.id }
if (qxkz.deptLevel == '02') { promes.lczt = qxkz.deptLevel == '02' ? '03' : '02';
promes = { id: item.id, lczt: '03' }
} else {
promes = { id: item.id, lczt: '02' }
}
xxcjUpdateCzlc(promes).then(res => { xxcjUpdateCzlc(promes).then(res => {
proxy.$message({ type: "success", message: "上报成功" }); proxy.$message({ type: "success", message: "上报成功" });
getList(); getList();
}) })
}).catch(() => { }); }).catch(() => { });
} else { } else {
proxy.$message({ type: "warning", message: "市局无法进行上报" }); proxy.$message({ type: "warning", message: "市局无法进行上报" });
@ -285,8 +335,7 @@ const opneMsg = (item) => {
chooseRow.value = true chooseRow.value = true
dataList.value = [item] dataList.value = [item]
} }
// 打标签
const customTagShow = ref(false)
const openCustomTag = (item) => { const openCustomTag = (item) => {
if (qxkz.depBool) { if (qxkz.depBool) {
customTagShow.value = true customTagShow.value = true
@ -303,10 +352,9 @@ const affirm = (item) => {
getList(); getList();
}) })
}) })
} }
// 配置关注部门
const configurationShow = ref(false)
const FollowUpOnDept = (item) => { const FollowUpOnDept = (item) => {
if (qxkz.depBool) { if (qxkz.depBool) {
configurationShow.value = true configurationShow.value = true
@ -314,12 +362,8 @@ const FollowUpOnDept = (item) => {
} else { } else {
proxy.$message.warning('暂无权限') proxy.$message.warning('暂无权限')
} }
} }
// 批量分组 // 批量分组
// const batchMark = () => { // const batchMark = () => {
// const listDb = tableList.value.filter(item => item.lczt != '04') // const listDb = tableList.value.filter(item => item.lczt != '04')
@ -334,6 +378,7 @@ const FollowUpOnDept = (item) => {
// }) // })
// } // }
// } // }
const handleSumbit = () => { const handleSumbit = () => {
const listDb = tableList.value.filter(item => item.czzt != '01' && item.czzt != '04') const listDb = tableList.value.filter(item => item.czzt != '01' && item.czzt != '04')
if (listDb.length == 0) { if (listDb.length == 0) {
@ -344,18 +389,14 @@ const handleSumbit = () => {
}) })
}).catch(() => { }); }).catch(() => { });
} else { } else {
proxy.$message({ proxy.$message({ message: '请选择正确数据', type: 'warning', showClose: true })
message: '请选择正确数据',
type: 'warning',
showClose: true,
})
} }
} }
// <!-- [04、06、07、08、09] -->打标签 // <!-- [04、06、07、08、09] -->打标签
// <!-- [03、05] -->采纳 // <!-- [03、05] -->采纳
// <!-- [04] -->回退 // <!-- [04] -->回退
// <!-- 01 提交 02 上报县局 03 上班市局 04 采纳 05 退回 06 打标签 07 转合成 08 转线索 09 转会商v-if="qxkz.deptLevel == '01'" --> // <!-- 01 提交 02 上报县局 03 上班市局 04 采纳 05 退回 06 打标签 07 转合成 08 转线索 09 转会商v-if="qxkz.deptLevel == '01'" -->
const butcontroll = (val, zt) => { const butcontroll = (val, zt) => {
switch (val) { switch (val) {
case '01': case '01':
@ -365,22 +406,19 @@ const butcontroll = (val, zt) => {
case '03': case '03':
return !(['02', '03', '04'].includes(zt)) return !(['02', '03', '04'].includes(zt))
case '04': case '04':
return ([ '04', '05' ,'06', '07', '08', '09'].includes(zt)) return (['04', '05', '06', '07', '08', '09'].includes(zt))
} }
} }
// 搜索 // 搜索
const onSearch = (val) => { const onSearch = (val) => {
console.log(val.bqdmList);
const promes = { const promes = {
...pageData.pageConfiger, ...pageData.pageConfiger,
...val, ...val,
startTime: val.startTime ? val.startTime[0] : '', startTime: val.startTime ? val.startTime[0] : '',
endTime: val.endTime ? val.endTime[1] : '', endTime: val.endTime ? val.endTime[1] : '',
bqdmList:val.bqdmList?val.bqdmList.join(','):"" bqdmList: val.bqdmList ? val.bqdmList.join(',') : ""
} }
queryFrom.value = { ...promes } queryFrom.value = { ...promes }
pageData.pageConfiger.pageCurrent = 1; pageData.pageConfiger.pageCurrent = 1;
getList() getList()
@ -398,8 +436,6 @@ const changeSize = (val) => {
// 获取列表 // 获取列表
const getList = () => { const getList = () => {
pageData.tableConfiger.loading = true; pageData.tableConfiger.loading = true;
console.log(pageData.pageConfiger);
let data = { ...pageData.pageConfiger, ...queryFrom.value }; let data = { ...pageData.pageConfiger, ...queryFrom.value };
xxcjSelectXxsbPage(data).then(res => { xxcjSelectXxsbPage(data).then(res => {
pageData.tableData = res.records || []; pageData.tableData = res.records || [];
@ -412,22 +448,12 @@ const delDictItem = (id) => {
proxy.$confirm("确定要删除", "警告", { type: "warning" }).then(() => { proxy.$confirm("确定要删除", "警告", { type: "warning" }).then(() => {
xxcjDeletes({ ids: Array.isArray(id) ? id : [id] }).then((res) => { xxcjDeletes({ ids: Array.isArray(id) ? id : [id] }).then((res) => {
proxy.$message({ type: "success", message: "删除成功" }); proxy.$message({ type: "success", message: "删除成功" });
getList(); getList();
}).catch(() => { }).catch(() => {
}) })
}).catch(() => { }); }).catch(() => { });
} }
// 导出数据
const tableColumn = reactive([
{ label: "上报人姓名", prop: "xssbr" },
{ label: "情报上报时间", prop: "sxsbsj" },
{ label: "情报编号", prop: "xsBh" },
{ label: "情报标题", prop: "qbmc" },
// { label: "情报类型", prop: "qblx", showSolt: true, zd: 'D_GS_XS_LX' },
{ label: "情报来源", prop: "qbly", showSolt: true, zd: 'D_BZ_CJLX' },
// { label: "指向地点", prop: "zxdz" },
// { label: "情报内容", prop: "qbnr", showOverflowTooltip: true },
])
// 详情 // 详情
const addEdit = (type, row) => { const addEdit = (type, row) => {
isShow.value = true; isShow.value = true;
@ -443,78 +469,25 @@ const openXxqk = (row) => {
}, 500) }, 500)
} }
} }
const route = useRoute()
const titleData = ref()
const qxkz = reactive({
deptBizType: '',
deptLevel: '',
roleCode: false,
depBool: false
});
const qxzt = ref(false)
onMounted(() => {
const { deptBizType, deptLevel } = getItem('deptId')[0]
const Jb = deptLevel[0] == '2' ? '01' : deptLevel[0] == '3' ? '02' : '03'
qxkz.roleCode = getItem('roleList').find(item => item.roleCode == 'JS_666666') != undefined
qxkz.deptBizType = deptBizType
qxkz.deptLevel = Jb
if (deptBizType == '23' && Jb == '01') {
qxkz.depBool = true
} else {
qxkz.depBool = false
}
getRouter()
tabHeightFn()
if (route.query.id) {
detailDiloag.value.init('edit', {
id: route.query.id
});
return
}
getList()
});
const getRouter = () => {
titleData.value = route.meta.title
}
const exportFileModel = ref(false)
const dologCancel = () => {
exportFileModel.value = true;
}
// 搜索栏
// 表格高度计算 // 表格高度计算
const tabHeightFn = () => { const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250; pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 280;
window.onresize = function () { window.onresize = function () {
tabHeightFn(); tabHeightFn();
}; };
}; };
// 转线索 // 转线索
const FollowUpOnLeads = (row) => { const FollowUpOnLeads = (row) => {
if (!qxkz.depBool) { if (!qxkz.depBool) return proxy.$message({message: '权限不足',type: 'warning',showClose: true, })
proxy.$message({ proxy.$confirm("确定要转线索吗?", "警告", { type: "warning" }).then(() => {
message: '权限不足', xxcjXxzsx({ ids: Array.isArray(row) ? row.join(',') : row.id }).then(res => {
type: 'warning', proxy.$message({ type: "success", message: "转线索成功" });
showClose: true, getList();
}) })
return })
} else {
proxy.$confirm("确定要转线索吗?", "警告", { type: "warning" }).then(() => {
xxcjXxzsx({ ids: Array.isArray(row) ? row.join(',') : row.id }).then(res => {
proxy.$message({ type: "success", message: "转线索成功" });
getList();
})
})
}
} }
// 发送指令
const fszlShow = ref(false)
const openFkDialogszl = (row) => { const openFkDialogszl = (row) => {
if (!qxkz.depBool) { if (!qxkz.depBool) {
proxy.$message({ proxy.$message({
@ -529,13 +502,6 @@ const openFkDialogszl = (row) => {
} }
} }
/** 获取当前角色 */ /** 获取当前角色 */
function getRole() { function getRole() {
const { deptBizType, deptLevel } = getItem('deptId')[0] const { deptBizType, deptLevel } = getItem('deptId')[0]
@ -569,7 +535,6 @@ const isShowBtn = (btnName, row = {}) => {
if (role === '部门') { if (role === '部门') {
if (btnName === '续报') return lczt != '01' if (btnName === '续报') return lczt != '01'
if (btnName === '修改') return lczt == '01' if (btnName === '修改') return lczt == '01'
// if(btnName === '上报') return lczt == '01'
} }
return true return true
} }
@ -577,8 +542,6 @@ const handleTransferMerchant = (row) => {
currRow.value = row currRow.value = row
isShowTransferMerchantTc.value = true isShowTransferMerchantTc.value = true
} }
// 送审 // 送审
const postXxcjXxcjTjsh = (row) => { const postXxcjXxcjTjsh = (row) => {
proxy.$confirm("确定要送审吗", "提示", { type: "warning" }).then(() => { proxy.$confirm("确定要送审吗", "提示", { type: "warning" }).then(() => {
@ -588,20 +551,28 @@ const postXxcjXxcjTjsh = (row) => {
}) })
}).catch(() => { }) }).catch(() => { })
} }
const getDisabled = (val, zt) => {
console.log(val, zt);
// switch (val) { onMounted(() => {
// case '01': const { deptBizType, deptLevel } = getItem('deptId')[0]
// return !(['04', '06', '07', '08', '09'].includes(zt)) const Jb = deptLevel[0] == '2' ? '01' : deptLevel[0] == '3' ? '02' : '03'
// case '02': qxkz.roleCode = getItem('roleList').find(item => item.roleCode == 'JS_666666') != undefined
// return !(['03', '05'].includes(zt)) qxkz.deptBizType = deptBizType
// case '03': qxkz.deptLevel = Jb
// return !(['02', '03', '04'].includes(zt)) if (deptBizType == '23' && Jb == '01') {
// case '04': qxkz.depBool = true
// return ([ '04', '05' ,'06', '07', '08', '09'].includes(zt)) } else {
// } qxkz.depBool = false
} }
console.log(qxkz,'=======qxkz');
titleData.value = route.meta.title
tabHeightFn()
if (route.query.id) {
detailDiloag.value.init('edit', { id: route.query.id });
}
getList()
});
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -1,20 +1,18 @@
<template> <template>
<div> <div>
<!-- 搜索 --> <!-- 搜索 -->
<div ref="searchBox" class="mt10"> <div ref="searchBox" class="mt10">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount" /> <Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount" />
</div> </div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5"> <PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left> <template #left>
<el-button type="primary" @click="dologCancel()" size="small"> <el-button type="primary" @click="dologCancel()" size="small">
<el-icon style="vertical-align: middle"> <el-icon style="vertical-align: middle">
<CirclePlus /> <CirclePlus />
</el-icon> </el-icon>
<span style="vertical-align: middle">导出</span> <span style="vertical-align: middle">导出</span>
</el-button> </el-button>
</template> </template>
<!-- <el-button v-if="qxkz.deptLevel == '01'" type="primary" :disabled="ids.length === 0" @click="batchMark(ids)"> <!-- <el-button v-if="qxkz.deptLevel == '01'" type="primary" :disabled="ids.length === 0" @click="batchMark(ids)">
<el-icon style="vertical-align: middle"> <el-icon style="vertical-align: middle">
<CirclePlus /> <CirclePlus />
@ -24,10 +22,16 @@
</PageTitle> </PageTitle>
<!-- 表格 --> <!-- 表格 -->
<div class="tabBox"> <div class="tabBox">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight" <MyTable
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth" :tableData="pageData.tableData"
@chooseData="chooseData"> :tableColumn="pageData.tableColumn"
<template #qblx="{ row }"> :tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
@chooseData="chooseData"
>
<template #qblx="{ row }">
<DictTag :tag="false" :value="row.qblx" :options="D_GS_XS_LX" /> <DictTag :tag="false" :value="row.qblx" :options="D_GS_XS_LX" />
</template> </template>
<template #qbly="{ row }"> <template #qbly="{ row }">
@ -46,6 +50,9 @@
<el-link size="small" type="primary" @click="openCheckProcess(row)">补充信息</el-link> <el-link size="small" type="primary" @click="openCheckProcess(row)">补充信息</el-link>
<!-- <el-link size="small" type="primary" @click="openCheckProcessXb(row)"> 续报</el-link> --> <!-- <el-link size="small" type="primary" @click="openCheckProcessXb(row)"> 续报</el-link> -->
<el-link size="small" type="primary" @click="addEdit('info', row)">详情</el-link> <el-link size="small" type="primary" @click="addEdit('info', row)">详情</el-link>
<el-link size="small" type="primary" @click="handleCase(row)">
<span :style="{'color': row.sfgz == '0' ? 'rgb(242,7,7)' : '#dede17'}">{{ row.sfgz == '0' ? '关注' : '取消关注' }}</span>
</el-link>
</template> </template>
</MyTable> </MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{ <Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
@ -79,60 +86,58 @@
</template> </template>
<script setup> <script setup>
import { qcckPost } from "@/api/qcckApi.js";
import PageTitle from "@/components/aboutTable/PageTitle.vue"; import PageTitle from "@/components/aboutTable/PageTitle.vue";
import MyTable from "@/components/aboutTable/MyTable.vue"; import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue"; import Search from "@/components/aboutTable/Search.vue";
import AddForm from "@/views/backOfficeSystem/HumanIntelligence/infoCollection/components/addForm.vue"; import AddForm from "@/views/backOfficeSystem/HumanIntelligence/infoCollection/components/addForm.vue";
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
import { qbcjSelectPage, qbcjDeletes } from "@/api/Intelligence.js";
import { reactive, ref, onMounted, getCurrentInstance, watch } from "vue"; import { reactive, ref, onMounted, getCurrentInstance, watch } from "vue";
import MakeTag from '@/views/backOfficeSystem/HumanIntelligence/components/maketag.vue' import MakeTag from '@/views/backOfficeSystem/HumanIntelligence/components/maketag.vue'
import ExportFile from '@/views/backOfficeSystem/HumanIntelligence/infoCollection/components/exportFile.vue' import ExportFile from '@/views/backOfficeSystem/HumanIntelligence/infoCollection/components/exportFile.vue'
import pursueContent from "../components/pursueContent.vue"; import pursueContent from "../components/pursueContent.vue";
import Fszl from '../components/fszl.vue' import Fszl from '../components/fszl.vue'
import { getItem } from '@//utils/storage.js' import { getItem } from '@//utils/storage.js'
import { qbcjZxs } from '@/api/qbcj.js'
import {xxcjSelectPage,xxcjXxzsx} from '@/api/xxcj.js' import {xxcjSelectPage,xxcjXxzsx} from '@/api/xxcj.js'
import { color } from "echarts";
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const { D_GS_XS_LY, D_BZ_SSZT, D_BZ_SF, D_GS_XS_LX, D_BZ_BQJB, const {
D_GS_XS_QTLX, D_GS_ZDQT_LB, D_GS_XS_LY,
D_BZ_BMJB, D_BZ_CLPP, D_BZ_CLYS, D_BZ_CLLX, D_BZ_XZQHDM, D_BZ_QBCZZT, D_BZ_CJLX ,D_BZ_LCZT} = D_BZ_SSZT,
proxy.$dict("D_BZ_BMJB", "D_GS_XS_LY", D_BZ_SF,
"D_BZ_SSZT", "D_BZ_SF", "D_GS_XS_LX", "D_GS_XS_QTLX", D_GS_XS_LX,
"D_GS_ZDQT_LB", "D_BZ_CLPP", "D_BZ_CLYS", "D_BZ_CLLX", "D_BZ_XZQHDM", "D_BZ_QBCZZT", "D_BZ_CJLX", "D_BZ_BQJB","D_BZ_LCZT"); //获取字典数据 D_BZ_BQJB,
D_GS_XS_QTLX,
D_GS_ZDQT_LB,
D_BZ_BMJB,
D_BZ_CLPP,
D_BZ_CLYS,
D_BZ_CLLX,
D_BZ_XZQHDM,
D_BZ_QBCZZT,
D_BZ_CJLX ,D_BZ_LCZT } =
proxy.$dict(
"D_BZ_BMJB",
"D_GS_XS_LY",
"D_BZ_SSZT",
"D_BZ_SF",
"D_GS_XS_LX",
"D_GS_XS_QTLX",
"D_GS_ZDQT_LB",
"D_BZ_CLPP",
"D_BZ_CLYS",
"D_BZ_CLLX",
"D_BZ_XZQHDM",
"D_BZ_QBCZZT",
"D_BZ_CJLX",
"D_BZ_BQJB",
"D_BZ_LCZT"
); //获取字典数据
const detailDiloag = ref(); const detailDiloag = ref();
const searchBox = ref(); //搜索框 const searchBox = ref(); //搜索框
const ids = ref([]) const ids = ref([])
const tableList = ref([]); const tableList = ref([]);
onMounted(() => {
const { deptBizType, deptLevel } = getItem('deptId')[0]
qxkz.userName = getItem('USERNAME')
const Jb = deptLevel[0] == '2' ? '01' : deptLevel[0] == '3' ? '02' : '03'
qxkz.deptBizType = deptBizType
qxkz.deptLevel = Jb
if (deptBizType == '23' && Jb == '01') {
qxkz.depBool = true
} else {
qxkz.depBool = false
}
getRouter()
tabHeightFn()
if (route.query.id) {
detailDiloag.value.init('edit', {
id: route.query.id
});
return
}
getList()
});
const chooseData = (val) => {
ids.value = val.map(item => {
return item.id
})
tableList.value = val
}
const qxkz = reactive({ const qxkz = reactive({
deptBizType: "", deptBizType: "",
deptLevel: "", deptLevel: "",
@ -140,23 +145,40 @@ const qxkz = reactive({
}) })
const list = ref() const list = ref()
const searchConfiger = ref(); const searchConfiger = ref();
onMounted(() => {
const { deptBizType, deptLevel } = getItem('deptId')[0]
qxkz.userName = getItem('USERNAME')
const Jb = deptLevel[0] == '2' ? '01' : deptLevel[0] == '3' ? '02' : '03'
qxkz.deptBizType = deptBizType
qxkz.deptLevel = Jb
qxkz.depBool = deptBizType == '23' && Jb == '01' ? true : false;
getRouter()
tabHeightFn()
if (route.query.id) {
detailDiloag.value.init('edit', { id: route.query.id });
return
}
getList()
});
const chooseData = (val) => {
ids.value = val.map(item => item.id)
tableList.value = val
}
watch(() => D_BZ_BQJB, val => { watch(() => D_BZ_BQJB, val => {
if (qxkz.deptLevel == '01') { if (qxkz.deptLevel == '01') {
list.value = val.value.filter(item => { list.value = val.value.filter(item => item.dm != '00')
return item.dm != '00'
})
} else if (qxkz.deptLevel == '02') { } else if (qxkz.deptLevel == '02') {
list.value = val.value.filter(item => { list.value = val.value.filter(item => (item.dm == '01' || item.dm == '02'))
return item.dm == '01' || item.dm == '02'
})
} else { } else {
list.value = [] list.value = []
} }
searchConfiger.value = [ searchConfiger.value = [
{ label: "情报标题", prop: 'qbmc', placeholder: "请输入情报标题", showType: "input" }, { label: "情报标题", prop: 'qbmc', placeholder: "请输入情报标题", showType: "input" },
{ label: "情报处置状态", prop: 'lczt', placeholder: "请选择处置状态", showType: "select", options: D_BZ_LCZT }, { label: "情报处置状态", prop: 'lczt', placeholder: "请选择处置状态", showType: "select", options: D_BZ_LCZT },
// { label: "线索编号", prop: 'xsBh', placeholder: "请输入线索编号", showType: "input" }, // { label: "线索编号", prop: 'xsBh', placeholder: "请输入线索编号", showType: "input" },
{ label: "关键字", prop: 'keyword', placeholder: "请输入关键字", showType: "input" }, { label: "关键字", prop: 'keyword', placeholder: "请输入关键字", showType: "input" },
] ]
}, { deep: true, immediate: true }) }, { deep: true, immediate: true })
const isShow = ref(false) const isShow = ref(false)
@ -184,10 +206,8 @@ const pageData = reactive({
] ]
}); });
const queryFrom = ref({}); const queryFrom = ref({});
const chooseRow = ref(false) const chooseRow = ref(false)
const dataList = ref() const dataList = ref()
// 搜索 // 搜索
const onSearch = (val) => { const onSearch = (val) => {
const { lrkssj, zxkssj } = val const { lrkssj, zxkssj } = val
@ -198,9 +218,7 @@ const onSearch = (val) => {
lrjssj: lrkssj ? lrkssj[1] : '', lrjssj: lrkssj ? lrkssj[1] : '',
zxkssj: zxkssj ? zxkssj[0] : '', zxkssj: zxkssj ? zxkssj[0] : '',
zxjssj: zxkssj ? zxkssj[1] : '', zxjssj: zxkssj ? zxkssj[1] : '',
} }
queryFrom.value = { ...promes } queryFrom.value = { ...promes }
pageData.pageConfiger.pageCurrent = 1; pageData.pageConfiger.pageCurrent = 1;
getList() getList()
@ -243,6 +261,16 @@ const addEdit = (type, row) => {
detailDiloag.value.init(type, row); detailDiloag.value.init(type, row);
}, 500) }, 500)
}; };
const handleCase = (row) => {
let text = row.sfgz == '0' ? '关注' : '取消关注';
proxy.$confirm("确定要" + text + "吗?", "警告", { type: "warning" }).then(() => {
qcckPost({ id: row.id,sfgz: row.sfgz == '0' ? '1' : '0' },'/mosty-gsxt/xxcj/cjgz').then(res => {
proxy.$message({ type: "success", message: text + "成功" });
getList();
})
})
}
// 表格高度计算 // 表格高度计算
const tabHeightFn = () => { const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250; pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;

View File

@ -0,0 +1,119 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<Search :searchArr="searchConfiger" @submit="onSearch" />
</div>
<!-- 表格 -->
<div class="tabBox mt10" :style="{height: pageData.tableHeight +30+ 'px'}">
<MyTable
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
>
</MyTable>
<Pages
@changeNo="changeNo"
@changeSize="changeSize"
:tableHeight="pageData.tableHeight"
:pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"
/>
</div>
/>
</div>
</template>
<script setup>
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import { qcckGet } from "@/api/qcckApi.js";
import { reactive, ref, onMounted } from "vue";
const searchBox = ref(); //搜索框
const searchConfiger = ref([
{ label: "申请人姓名", prop: "xm", placeholder: "请输入申请人姓名", showType: "input" },
{ label: "申请人身份证", prop: "sfzh", placeholder: "请输入申请人身份证号", showType: "input"},
{ label: "申请人联系电话", prop: "lxdh", placeholder: "请输入申请人联系电话", showType: "input"}
]);
const pageData = reactive({
tableData: [],
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false,
haveControls: false
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
},
controlsWidth: 200,
tableColumn: [
{ label: "申请人姓名", prop: "xm" },
{ label: "申请人身份证", prop: "sfzh"},
{ label: "申请人联系电话", prop: "lxdh" },
{ label: "提交人姓名", prop: "tjrxm"},
{ label: "提交人身份证号", prop: "tjrsfzh"},
{ label: "权限说明", prop: "qxsm", showOverflowTooltip: true },
]
});
const queryFrom = ref({});
onMounted(() => {
getList();
tabHeightFn();
});
// 搜索
const onSearch = (val) => {
queryFrom.value = { ...val };
pageData.pageConfiger.pageCurrent = 1;
getList();
};
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList();
};
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList();
};
// 获取列表
const getList = () => {
pageData.tableConfiger.loading = true;
let data = { ...pageData.pageConfiger, ...queryFrom.value };
qcckGet(data, "/mosty-gsxt/gsxt/qxsq/getPageList").then((res) => {
pageData.tableData = res.records || [];
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
});
};
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 220;
window.onresize = function () {
tabHeightFn();
};
};
</script>
<style>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
</style>

View File

@ -25,9 +25,8 @@
<div class="info h20 ellipsis">会议时间{{ item.hskssj }} - {{ item.hsjssj }}</div> <div class="info h20 ellipsis">会议时间{{ item.hskssj }} - {{ item.hsjssj }}</div>
</div> </div>
<div class="mid"> <div class="mid">
<div class="left"> <div class="left">
<!-- <div class="title ellipsis">参会人员{{ item.chry }}</div> --> <div class="desc">
<div class="desc noScollLine">
<div class="info ellipsis" v-for="(el, i) in item.xsplList" :key="i">{{ i + 1 }}{{ el.plnr }}</div> <div class="info ellipsis" v-for="(el, i) in item.xsplList" :key="i">{{ i + 1 }}{{ el.plnr }}</div>
</div> </div>
</div> </div>

View File

@ -1,6 +1,8 @@
<template> <template>
<div> <div>
<el-dialog :model-value="modelValue" :destroy-on-close="true" :title="title" @close="close" :close-on-click-modal="true"> <el-dialog :model-value="modelValue" :destroy-on-close="true" :title="title" @close="close"
:close-on-click-modal="true">
{{ getData }}
<FormMessage v-model="listQuery" :formList="formData" labelWidth="120px" ref="elform" :rules="rules"> <FormMessage v-model="listQuery" :formList="formData" labelWidth="120px" ref="elform" :rules="rules">
<template #chryList> <template #chryList>
<el-input v-model="chryList" clearable placeholder="请选择参会人员" @click="isShowDialog = true" <el-input v-model="chryList" clearable placeholder="请选择参会人员" @click="isShowDialog = true"
@ -24,6 +26,7 @@ import { ref, reactive, computed, getCurrentInstance } from 'vue'
import FormMessage from "@/components/aboutTable/FormMessage.vue"; import FormMessage from "@/components/aboutTable/FormMessage.vue";
import ChooseUser from "@/components/ChooseList/ChooseUser/index.vue" import ChooseUser from "@/components/ChooseList/ChooseUser/index.vue"
import { wshsAdd } from "@/api/huiShangyp/tacticalApi" import { wshsAdd } from "@/api/huiShangyp/tacticalApi"
import { qcckGet, qcckPost } from "@/api/qcckApi.js"
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const props = defineProps({ const props = defineProps({
modelValue: { modelValue: {
@ -58,9 +61,11 @@ const rules = reactive({
] ]
}) })
const getData = computed(() => { const getData = computed(() => {
console.log(props.dataList, "测试");
return { return {
glxsid: props.dataList.glzjjdbh || props.dataList.asjbh, glxsid: props.dataList.glzjjdbh || props.dataList.asjbh,
glxsmc: props.dataList.ajmc || props.dataList.bjrmc glxsmc: props.dataList.ajmc ||props.dataList.bcjjnr|| props.dataList.bjrmc
} }
}) })
const listQuery = ref({}) const listQuery = ref({})
@ -80,17 +85,41 @@ const close = () => {
const submit = () => { const submit = () => {
elform.value.submit((val) => { elform.value.submit((val) => {
if (val) { if (val) {
const promes = { let url
...listQuery.value,
...getData.value switch (props.lx) {
case '01':
const dadta = {
...listQuery.value,
...getData.value,
lylx: props.lx
}
url = '/mosty-gsxt/lzJcjPjdb/createwWshs'
qcckPost(dadta, url).then(res => {
proxy.$message({
message: '添加成功',
type: 'success'
})
emits('update:modelValue', false)
})
break;
default:
const promes = {
...listQuery.value,
...getData.value
}
wshsAdd(promes).then(res => {
proxy.$message({
message: '添加成功',
type: 'success'
})
emits('update:modelValue', false)
})
break;
} }
wshsAdd(promes).then(res => {
proxy.$message({
message: '添加成功',
type: 'success'
})
emits('update:modelValue', false)
})
} }
}) })

View File

@ -11,7 +11,6 @@
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules"> <FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules">
</FormMessage> </FormMessage>
</div> </div>
</div> </div>
</template> </template>
@ -21,11 +20,12 @@ import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { ref, defineExpose, reactive, defineEmits, getCurrentInstance, watch, computed } from "vue"; import { ref, defineExpose, reactive, defineEmits, getCurrentInstance, watch, computed } from "vue";
import { addJudgmentCommandList, editJudgmentCommand, getJudgmentCommandDetail } from "@/api/huiShangyp/judgmentCommand.js" import { addJudgmentCommandList, editJudgmentCommand, getJudgmentCommandDetail } from "@/api/huiShangyp/judgmentCommand.js"
// import { getItem } from '@//utils/storage.js' // import { getItem } from '@//utils/storage.js'
import { useRouter } from 'vue-router'
const emit = defineEmits(["updateDate", "getList"]); const emit = defineEmits(["updateDate", "getList"]);
const props = defineProps({ const props = defineProps({
dict: Object dict: Object
}); });
const router = useRouter()
const imgMsg = ref([]) const imgMsg = ref([])
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const dialogForm = ref(false); //弹窗 const dialogForm = ref(false); //弹窗
@ -118,6 +118,7 @@ const close = () => {
listQuery.value = {}; listQuery.value = {};
dialogForm.value = false; dialogForm.value = false;
loading.value = false; loading.value = false;
router.replace({ path: '/judgmentCommand' })// 移除id 避免刷新一直带参数
}; };
defineExpose({ init }); defineExpose({ init });

View File

@ -61,18 +61,11 @@ import FeedbackDialog from "./components/FeedbackDialog.vue";
import { getItem } from '@//utils/storage.js' import { getItem } from '@//utils/storage.js'
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const { D_BZ_YPFS, D_BZ_YPLX } = proxy.$dict("D_BZ_YPFS", "D_BZ_YPLX") const { D_BZ_YPFS, D_BZ_YPLX } = proxy.$dict("D_BZ_YPFS", "D_BZ_YPLX")
const detailDiloag = ref();
const searchBox = ref(); //搜索框 const searchBox = ref(); //搜索框
const userInfo = ref() const userInfo = ref()
onMounted(() => { onMounted(() => {
userInfo.value = getItem('deptId')[0] userInfo.value = getItem('deptId')[0]
tabHeightFn() tabHeightFn()
if (route.query.id) {
detailDiloag.value.init('edit', {
id: route.query.id
});
return
}
getList() getList()
}); });
@ -149,8 +142,13 @@ const tabHeightFn = () => {
}; };
}; };
const route = useRoute() const route = useRoute()
const addForm = ref(null) const addForm = ref(null)
watch(() => route.query.id, (val) => {
console.log('val: ', val);
if (val) {
addForm.value.init('detail', {id:val}, '01');
}
},{deep:true});
const feedbackDialog = ref(false) const feedbackDialog = ref(false)
const currentFeedbackRow = ref({}) const currentFeedbackRow = ref({})
const getDataById = (type, row) => { const getDataById = (type, row) => {

View File

@ -98,7 +98,7 @@
* @property {Array} fj - 附件数组 * @property {Array} fj - 附件数组
* @property {string} wcqk - 完成情况01 准备中、02 已完成) * @property {string} wcqk - 完成情况01 准备中、02 已完成)
*/ */
import { qcckGet } from "@/api/qcckApi.js";
import FormMessage from "@/components/aboutTable/FormMessage.vue"; import FormMessage from "@/components/aboutTable/FormMessage.vue";
import UploadFile from "@/components/MyComponents/Upload/index.vue"; import UploadFile from "@/components/MyComponents/Upload/index.vue";
// import ChooseUser from "@/components/ChooseList/ChooseUser/index.vue" // import ChooseUser from "@/components/ChooseList/ChooseUser/index.vue"
@ -214,12 +214,13 @@ watch(() => listQuery.value.jsdxBmDm, (val) => {
}) })
}) })
// 初始化数据 // 初始化数据
const init = (type, row, wjlb) => { const init = (type, row, wjlb) => {
dialogForm.value = true; dialogForm.value = true;
title.value = type == "add" ? "新增" : type == "edit" ? "编辑" : "详情"; title.value = type == "add" ? "新增" : type == "edit" ? "编辑" : "详情";
outRow.value = row outRow.value = row
if (row) { if (row) {
getDataById(row.id) getDataById(row.id )
} else { } else {
listQuery.value = { listQuery.value = {
bglx: props.bglx, // 报告类型 01 战术研判 02战略研判 bglx: props.bglx, // 报告类型 01 战术研判 02战略研判
@ -232,7 +233,7 @@ const init = (type, row, wjlb) => {
}; };
// 根据id查询详情 // 根据id查询详情
const getDataById = (id) => { const getDataById = (id) => {
sjzlGetInfo(id).then((res) => { qcckGet({},'/mosty-gsxt/gsxtYpbg/'+id).then((res) => {
listQuery.value = res || {}; listQuery.value = res || {};
/** @type {Array<JudgmentDept>} 参与研判部门数据数组 */ /** @type {Array<JudgmentDept>} 参与研判部门数据数组 */
const cyypList = Array.isArray(res.cyypList) ? res.cyypList : [] const cyypList = Array.isArray(res.cyypList) ? res.cyypList : []

View File

@ -13,19 +13,19 @@
</FormMessage> </FormMessage>
<div class="cntBox"> <div class="cntBox">
<!-- 工具栏 --> <!-- 工具栏 -->
<Toolbar <Toolbar
style="border-bottom: 1px solid #ccc" style="border-bottom: 1px solid #ccc"
:editor="editorRef" :editor="editorRef"
:defaultConfig="toolbarConfig" :defaultConfig="toolbarConfig"
:mode="mode" /> :mode="mode" />
<!-- 编辑器 --> <!-- 编辑器 -->
<Editor <Editor
:style="`height: 480px; overflow-y: hidden`" :style="`height: 480px; overflow-y: hidden`"
v-model="textContent" v-model="textContent"
:defaultConfig="editorConfig" :defaultConfig="editorConfig"
:mode="mode" :mode="mode"
@onCreated="handleCreated" @onCreated="handleCreated"
@onChange="handChange" @onChange="handChange"
/> />
</div> </div>
<div v-if="listQuery.id" style="display: flex; justify-content: center;"> <div v-if="listQuery.id" style="display: flex; justify-content: center;">
@ -47,6 +47,7 @@ import ExtractionText from "@/components/ExtractionText/index.vue";
import FormMessage from "@/components/aboutTable/FormMessage.vue"; import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js"; import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
import "@wangeditor/editor/dist/css/style.css"; import "@wangeditor/editor/dist/css/style.css";
import { useRoute, useRouter } from 'vue-router'
// import Consultation from './consultation.vue' // import Consultation from './consultation.vue'
import { Editor, Toolbar } from "@wangeditor/editor-for-vue"; import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
import { ref, defineExpose, reactive, defineEmits, getCurrentInstance, shallowRef, onBeforeUnmount, watch } from "vue"; import { ref, defineExpose, reactive, defineEmits, getCurrentInstance, shallowRef, onBeforeUnmount, watch } from "vue";
@ -117,12 +118,33 @@ const elform = ref();
const title = ref(""); const title = ref("");
// 初始化数据 // 初始化数据
const init = (type, row) => { const init = (type, row) => {
if(row) listQuery.value = JSON.parse(JSON.stringify(row));
dialogForm.value = true; dialogForm.value = true;
title.value = type == "add" ? "新增" :type == "edit"? "编辑" : "详情"; title.value = type == "add" ? "新增" :type == "edit"? "编辑" : "详情";
if (row) {
getDataById(row.id)
}
// listQuery.value = JSON.parse(JSON.stringify(row));
setEditorTextContent() setEditorTextContent()
}; };
// 根据id查询详情
const getDataById = (id) => {
qcckGet({},'/mosty-gsxt/gsxtYpbg/'+id).then((res) => {
listQuery.value = res || {};
// /** @type {Array<JudgmentDept>} 参与研判部门数据数组 */
// const cyypList = Array.isArray(res.cyypList) ? res.cyypList : []
// listQuery.value.jsdxBmDm = cyypList.map(item => {
// return item.ypbmdm
// })
// listQuery.value.jsdxBmMc = cyypList.map(item => {
// return item.ypbmmc
// })
});
};
const getText = (val) => { const getText = (val) => {
listQuery.value.fj = val.text; listQuery.value.fj = val.text;
setEditorTextContent() setEditorTextContent()
@ -175,7 +197,7 @@ const handleCreated = (editor) => {
}; };
//内容发生变化 //内容发生变化
const handChange = (editor) => { const handChange = (editor) => {
// 判断是否是一个空段落,是空就传空文本 // 判断是否是一个空段落,是空就传空文本
}; };
onBeforeUnmount(() => { onBeforeUnmount(() => {
@ -183,12 +205,13 @@ onBeforeUnmount(() => {
if (editor) editor.destroy(); if (editor) editor.destroy();
}); });
const router = useRouter();
// 关闭 // 关闭
const close = () => { const close = () => {
loading.value = false; loading.value = false;
dialogForm.value = false; dialogForm.value = false;
listQuery.value = {} listQuery.value = {}
router.replace({ path: '/strategicResearchs' })// 移除id 避免刷新一直带参数
}; };

View File

@ -65,28 +65,25 @@ import AddForm from "./addForm.vue";
import addMeeting from "./addMeeting.vue"; import addMeeting from "./addMeeting.vue";
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const { D_BZ_YPFS, D_BZ_YPLX, D_GS_BQ_LX } = proxy.$dict("D_BZ_YPFS", "D_BZ_YPLX", "D_GS_BQ_LX") const { D_BZ_YPFS, D_BZ_YPLX, D_GS_BQ_LX } = proxy.$dict("D_BZ_YPFS", "D_BZ_YPLX", "D_GS_BQ_LX")
/** 报告弹框 */ /** 报告弹框 */
const reportTc = ref(); const reportTc = ref();
/** 会议弹框 */ /** 会议弹框 */
const meetingTc = ref(); const meetingTc = ref();
const searchBox = ref(); //搜索框 const searchBox = ref(); //搜索框
const router = useRouter();
const route = useRoute(); const route = useRoute();
onMounted(() => { onMounted(() => {
tabHeightFn() tabHeightFn()
if (route.query.id) {
nextTick(() => {
addForm.value && addForm.value.init('edit', {
id: route.query.id
});
router.replace({ path: '/tacticalResearch' })// 移除id 避免刷新一直带参数
})
}
getList() getList()
}); });
watch(() => route.query.id, (val) => {
if (val) {
nextTick(() => {
reportTc.value && reportTc.value.init('edit', {
id: val
});
})
}
},{deep:true});
// 提交审核 // 提交审核

View File

@ -208,8 +208,6 @@ const createProcess = (row) => {
rowData.value = row rowData.value = row
} }
// 线索下发 // 线索下发
const xsxfShow = ref(false) const xsxfShow = ref(false)
const openXsxf = (row) => { const openXsxf = (row) => {

View File

@ -19,7 +19,7 @@
</FormMessage> </FormMessage>
</div> </div>
<div v-if="title == '详情'" class="timeline-container"> <div v-if="title == '详情'" class="timeline-container">
<el-timeline class="timeline-wrapper" v-if="listQuery.czlcLis&&listQuery.czlcList.length > 0"> <el-timeline class="timeline-wrapper" v-if="listQuery.czlcLis && listQuery.czlcList.length > 0">
<el-timeline-item placement="top" v-for="(activity, index) in listQuery.czlcList" :key="index" <el-timeline-item placement="top" v-for="(activity, index) in listQuery.czlcList" :key="index"
:timestamp="activity.czsj" :color="activity.czlx == '01' ? '#409eff' : '#67c23a'" size="large"> :timestamp="activity.czsj" :color="activity.czlx == '01' ? '#409eff' : '#67c23a'" size="large">
<div class="timeline-content" :class="activity.czlx == '01' ? 'sign-type' : 'feedback-type'"> <div class="timeline-content" :class="activity.czlx == '01' ? 'sign-type' : 'feedback-type'">
@ -50,28 +50,40 @@
import Xslist from '@/components/ChooseList/ChooseXs/index.vue' import Xslist from '@/components/ChooseList/ChooseXs/index.vue'
import FormMessage from '@/components/aboutTable/FormMessage.vue' import FormMessage from '@/components/aboutTable/FormMessage.vue'
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js"; import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
import { ref, defineExpose, reactive, onMounted, defineEmits, getCurrentInstance, nextTick } from "vue"; import { useRouter } from 'vue-router'
import { ref, defineExpose, reactive, onMounted, defineEmits, getCurrentInstance, nextTick ,watch} from "vue";
const emit = defineEmits(["updateDate"]); const emit = defineEmits(["updateDate"]);
const props = defineProps({ const props = defineProps({
dic: Object dic: {
type: Object,
default: () => ({})
}
}); });
const chooseVisible = ref(false) const chooseVisible = ref(false)
const roleIds = ref([]) const roleIds = ref([])
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const dialogForm = ref(false); //弹窗 const dialogForm = ref(false); //弹窗
const formData = ref([
{ label: "指令标题", prop: "zlbt", type: "input", }, const formData = ref()
{ label: "指令类型", prop: "zllx", type: "select", options: props.dic.D_GS_XS_ZLLX },
{ label: "指令等级", prop: "zldj", type: "select", options: props.dic.D_GS_ZDQT_FXDJ }, watch(() => props.dic, (newVal) => {
{ label: "反馈结束时间", prop: "jssj", type: "datetime" }, if (newVal) {
{ label: "联系人", prop: "zllxr", type: "input" }, formData.value = [
{ label: "联系电话", prop: "zllxdh", type: "input" }, { label: "指令标题", prop: "zlbt", type: "input", },
{ label: "关联线索", prop: "glxsid", type: "slot" }, { label: "指令类型", prop: "zllx", type: "select", options: props.dic.D_GS_XS_ZLLX },
{ label: "主送单位", prop: "zsdw", type: "department" }, { label: "指令等级", prop: "zldj", type: "select", options: props.dic.D_GS_ZDQT_FXDJ },
{ label: "抄送单位", prop: "csdw", type: "department" }, { label: "反馈结束时间", prop: "jssj", type: "datetime" },
{ label: "指令内容", prop: "zlnr", type: "textarea", width: '100%' }, { label: "联系人", prop: "zllxr", type: "input" },
{ label: "附件", prop: "fjzd", type: "upload", width: '100%' }, { label: "联系电话", prop: "zllxdh", type: "input" },
]); { label: "关联线索", prop: "glxsid", type: "slot" },
{ label: "主送单位", prop: "zsdw", type: "department" },
{ label: "抄送单位", prop: "csdw", type: "department" },
{ label: "指令内容", prop: "zlnr", type: "textarea", width: '100%' },
{ label: "附件", prop: "fjzd", type: "upload", width: '100%' },
]
}
},{deep: true})
const listQuery = ref({}); //表单 const listQuery = ref({}); //表单
const loading = ref(false); const loading = ref(false);
const elform = ref(); const elform = ref();
@ -129,12 +141,13 @@ const submit = () => {
}).catch(() => { loading.value = false; }); }).catch(() => { loading.value = false; });
}); });
}; };
const router = useRouter()
// 关闭 // 关闭
const close = () => { const close = () => {
listQuery.value = {}; listQuery.value = {};
dialogForm.value = false; dialogForm.value = false;
loading.value = false; loading.value = false;
router.replace({ path: '/InstructionInformation' })// 移除id 避免刷新一直带参数
}; };
defineExpose({ init }); defineExpose({ init });
</script> </script>

View File

@ -58,8 +58,8 @@
></Pages> ></Pages>
</div> </div>
<!-- 详情 --> <!-- 详情 -->
<DetailForm ref="detailDiloag" v-if="isShow" @updateDate="getList" :dic="{D_GS_XS_ZLLX,D_GS_ZDQT_FXDJ}" />
</div> </div>
<DetailForm ref="detailDiloag" @updateDate="getList" :dic="{D_GS_XS_ZLLX,D_GS_ZDQT_FXDJ}" />
<Fk v-model="isShowFk" :dataList="dataList" @getList="getList"/> <Fk v-model="isShowFk" :dataList="dataList" @getList="getList"/>
</template> </template>
@ -71,7 +71,8 @@ import Search from "@/components/aboutTable/Search.vue";
import DetailForm from "./components/detailForm.vue"; import DetailForm from "./components/detailForm.vue";
import Fk from "./components/fk.vue"; import Fk from "./components/fk.vue";
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js"; import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue"; import { useRoute } from "vue-router";
import { reactive, ref, onMounted, getCurrentInstance, nextTick, watch } from "vue";
import { getItem } from '@/utils/storage' import { getItem } from '@/utils/storage'
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const {D_GS_XS_SJLY,D_GS_XS_ZLLX,D_GS_ZDQT_FXDJ,D_GS_XS_CZZT} = proxy.$dict('D_GS_XS_SJLY','D_GS_XS_ZLLX','D_GS_ZDQT_FXDJ','D_GS_XS_CZZT') const {D_GS_XS_SJLY,D_GS_XS_ZLLX,D_GS_ZDQT_FXDJ,D_GS_XS_CZZT} = proxy.$dict('D_GS_XS_SJLY','D_GS_XS_ZLLX','D_GS_ZDQT_FXDJ','D_GS_XS_CZZT')
@ -110,14 +111,20 @@ const pageData = reactive({
{ label: '是否反馈', prop: 'sffk', showSolt: true }, { label: '是否反馈', prop: 'sffk', showSolt: true },
{ label: '是否签收', prop: 'sfqs', showSolt: true }, { label: '是否签收', prop: 'sfqs', showSolt: true },
] ]
}); });
const route=useRoute()
const userInfo=ref(); const userInfo=ref();
onMounted(() => { onMounted(() => {
if (route.query.id) {
addEdit('detail', {id:route.query.id});
}
userInfo.value=getItem('deptId')[0] userInfo.value=getItem('deptId')[0]
getList() getList()
tabHeightFn(); tabHeightFn();
}); });
// 搜索 // 搜索
const onSearch = (val) =>{ const onSearch = (val) =>{
queryFrom.value = {...val} queryFrom.value = {...val}
@ -166,6 +173,12 @@ const addEdit = (type, row) => {
detailDiloag.value.init(type, row); detailDiloag.value.init(type, row);
}) })
}; };
watch(() => route.query.id, (val) => {
if (val) {
addEdit('detail', {id:route.query.id});
}
},{deep:true})
// 签收 // 签收
const signRow = (row) =>{ const signRow = (row) =>{
proxy.$confirm("确定要签收", "警告", {type: "warning"}).then(() => { proxy.$confirm("确定要签收", "警告", {type: "warning"}).then(() => {
@ -189,8 +202,6 @@ const fkRow = (row) => {
} }
const showBtn = (row) => { const showBtn = (row) => {
let item = row.xfbmList.find(v => v.ssbmdm == userInfo.value.deptCode) let item = row.xfbmList.find(v => v.ssbmdm == userInfo.value.deptCode)
console.log(item);
return item?true:false return item?true:false
// // if (item) { // // if (item) {
// // return item.zlzt == '01' ? 'sign' : item.zlzt == '02' ? 'feedback' : '' // // return item.zlzt == '01' ? 'sign' : item.zlzt == '02' ? 'feedback' : ''

View File

@ -0,0 +1,87 @@
<template>
<div class="progress-list">
<div class="list-item" v-for="(item, index) in listData" :key="index">
<div class="label">{{ item.label }}</div>
<div class="bar-container">
<div class="bar-bg">
<div class="bar-fill" :style="{ width: (item.value / maxValue * 100) + '%' }">
<span class="value-text">{{ item.value }}</span>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, computed,defineProps,watch } from 'vue'
const props = defineProps({
data: {
type: Array,
default: () => []
}
})
const listData = ref([])
const maxValue = computed(() => {
const max = Math.max(...listData.value.map(item => item.value))
return max > 0 ? max : 100
})
watch(() => props.data, (newVal) => {
listData.value = newVal
},{immediate:true})
</script>
<style scoped lang="scss">
.progress-list {
width: 100%;
height: 100%;
padding: 20px;
box-sizing: border-box;
overflow-y: auto;
.list-item {
width: 98%;
margin-bottom: 10px;
&:last-child {
margin-bottom: 0;
}
.label {
font-size: 14px;
color: #666;
margin-bottom: 8px;
}
.bar-container {
display: flex;
align-items: center;
.bar-bg {
flex: 1;
height: 16px;
background-color: #F5F7FA;
border-radius: 6px;
margin-right: 15px;
.bar-fill {
position: relative;
height: 100%;
border-radius: 6px;
background: linear-gradient(90deg, #FF6B22 0%, #FFC94B 100%);
transition: width 0.5s ease-out;
.value-text {
white-space: nowrap;
position: absolute;
left: 101%;
font-size: 14px;
color: #FF6B22;
font-weight: 500;
}
}
}
}
}
}
</style>

View File

@ -0,0 +1,283 @@
<template>
<div class="echratsBox">
<div class="chart-container" ref="echartsRef"></div>
<div class="legend-container">
<div class="legend-item" v-for="(item, index) in chartData" :key="index">
<div class="left-part">
<span class="dot" :style="{ backgroundColor: colors[index] }"></span>
<span class="name">{{ item.name }}</span>
<span class="value">{{ item.value }}</span>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { onMounted, ref , defineProps, nextTick , watch} from 'vue'
import * as echarts from 'echarts'
import 'echarts-gl'
const props = defineProps({
data: {
type: Array,
default: () => []
}
})
const echartsRef = ref(null)
const chartData = ref([
{ name: '未签收', value: 0 },
{ name: '已签收', value: 0 },
{ name: '已反馈', value: 0 }
])
const colors = ['#FF4D4F', '#1890FF', '#00E6B8']
let myChart = null
watch(() => props.data, (newVal) => {
nextTick(() => {
if (newVal.length > 0) {
chartData.value = newVal;
initChart()
}
})
},{immediate:true})
onMounted(() => {
initChart()
window.addEventListener('resize', resizeChart)
})
const initChart = () => {
if (!echartsRef.value) return
myChart = echarts.init(echartsRef.value)
const data = chartData.value.map((item, index) => ({
name: item.name,
value: item.value,
itemStyle: {
color: colors[index]
}
}));
const option = getPie3DOptions(data, 0.5);
option.series.push({
name: 'labelPie',
type: 'pie',
radius: ['70%', '85%'],
center: ['45%', '50%'],
label: {
show: false,
},
labelLine: {
show: false,
},
itemStyle: {
opacity: 0 // Invisible slices
},
data: data,
z: 100
});
myChart.setOption(option)
}
// 生成3D饼图的配置
const getPie3DOptions = (pieData, internalRadiusRatio) => {
const series = [];
let sumValue = 0;
let startValue = 0;
let endValue = 0;
const k = internalRadiusRatio || 1 / 3;
for (let i = 0; i < pieData.length; i++) {
sumValue += pieData[i].value;
const seriesItem = {
name: typeof pieData[i].name === 'undefined' ? `series${i}` : pieData[i].name,
type: 'surface',
parametric: true,
wireframe: {
show: false
},
pieData: pieData[i],
pieStatus: {
selected: false,
hovered: false,
k: k
},
shading: 'lambert', // Add realistic shading
itemStyle: {
opacity: 1
}
};
if (typeof pieData[i].itemStyle != 'undefined') {
const itemStyle = {};
typeof pieData[i].itemStyle.color != 'undefined' ? itemStyle.color = pieData[i].itemStyle.color : null;
typeof pieData[i].itemStyle.opacity != 'undefined' ? itemStyle.opacity = pieData[i].itemStyle.opacity : null;
seriesItem.itemStyle = { ...seriesItem.itemStyle, ...itemStyle };
}
series.push(seriesItem);
}
for (let i = 0; i < series.length; i++) {
endValue = startValue + series[i].pieData.value;
series[i].pieData.startRatio = startValue / sumValue;
series[i].pieData.endRatio = endValue / sumValue;
series[i].parametricEquation = getParametricEquation(series[i].pieData.startRatio, series[i].pieData.endRatio, false, false, k, series[i].pieData.value);
startValue = endValue;
}
return {
tooltip: {
formatter: params => {
if (params.seriesName !== 'mouseoutSeries' && params.seriesName !== 'labelPie') {
return `${params.seriesName}<br/><span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:${params.color};"></span>${series[params.seriesIndex].pieData.value}`;
}
}
},
xAxis3D: { min: -1, max: 1 },
yAxis3D: { min: -1, max: 1 },
zAxis3D: { min: -1, max: 1 },
grid3D: {
show: false,
boxHeight: 10,
top: '-10%',
light: {
main: {
intensity: 1.2,
shadow: true,
shadowQuality: 'high',
alpha: 40,
beta: -30
},
ambient: {
intensity: 0.5
}
},
viewControl: {
alpha: 30,
beta: 40,
distance: 180,
rotateSensitivity: 1,
zoomSensitivity: 0,
panSensitivity: 0,
autoRotate: false
}
},
series: series
};
}
function getParametricEquation(startRatio, endRatio, isSelected, isHovered, k, h) {
const midRatio = (startRatio + endRatio) / 2;
const startRadian = startRatio * Math.PI * 2;
const endRadian = endRatio * Math.PI * 2;
const midRadian = midRatio * Math.PI * 2;
const offsetX = isSelected ? Math.cos(midRadian) * 0.1 : 0;
const offsetY = isSelected ? Math.sin(midRadian) * 0.1 : 0;
const hoverRate = isHovered ? 1.05 : 1;
return {
u: {
min: -Math.PI,
max: Math.PI * 3,
step: Math.PI / 32
},
v: {
min: 0,
max: Math.PI * 2,
step: Math.PI / 20
},
x: function(u, v) {
if (u < startRadian) {
return offsetX + Math.cos(startRadian) * (1 + Math.cos(v) * k) * hoverRate;
}
if (u > endRadian) {
return offsetX + Math.cos(endRadian) * (1 + Math.cos(v) * k) * hoverRate;
}
return offsetX + Math.cos(u) * (1 + Math.cos(v) * k) * hoverRate;
},
y: function(u, v) {
if (u < startRadian) {
return offsetY + Math.sin(startRadian) * (1 + Math.cos(v) * k) * hoverRate;
}
if (u > endRadian) {
return offsetY + Math.sin(endRadian) * (1 + Math.cos(v) * k) * hoverRate;
}
return offsetY + Math.sin(u) * (1 + Math.cos(v) * k) * hoverRate;
},
z: function(u, v) {
if (u < -Math.PI * 0.5) {
return Math.sin(u);
}
if (u > Math.PI * 2.5) {
return Math.sin(u);
}
return Math.sin(v) * 1.5;
}
};
}
const resizeChart = () => {
myChart && myChart.resize()
}
</script>
<style scoped lang="scss">
.echratsBox {
width: 100%;
height: 100%;
display: flex;
align-items: center;
padding: 10px;
box-sizing: border-box;
.chart-container {
flex: 1.5; // Give more space to chart
height: 100%;
min-height: 200px;
}
.legend-container {
flex: 0.8;
display: flex;
flex-direction: column;
justify-content: center;
padding-left: 20px;
.legend-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 12px 0;
border-bottom: 1px dashed #E0E0E0;
&:first-child {
border-top: 1px dashed #E0E0E0;
}
.left-part {
display: flex;
align-items: center;
.dot {
width: 12px;
height: 6px;
border-radius: 2px;
margin-right: 10px;
transform: skewX(-20deg);
}
.name {
font-size: 14px;
color: #666;
}
.value {
font-size: 14px;
color: #333;
font-weight: 500;
margin-left: 5px;
}
}
}
}
}
</style>

View File

@ -0,0 +1,122 @@
<template>
<div class="top-head">
<el-form :inline="true" :model="formSearch" class="form-search">
<el-form-item label="选择部门">
<MOSTY.Department clearable v-model="formSearch.ssbmdm" />
</el-form-item>
<el-form-item label="">
<div class="filter-section">
<el-radio-group v-model="radioTime" @change="changeRadio">
<el-radio v-for="(it,idx) in timeList" :key="idx" :label="it.num" >{{ it.label }}</el-radio>
</el-radio-group>
<span class="ml5 mr5">自定义</span>
<el-date-picker
@change="handleDateChange"
v-model="formSearch.dateRange"
:unlink-panels="true"
type="daterange"
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD" />
</div>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSubmit">查询</el-button>
<el-button @click="resetForm">重置</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script setup>
import { timeValidate, timeSlotChange } from "@/utils/tools.js";
import * as MOSTY from "@/components/MyComponents/index";
import { ref,defineEmits } from "vue";
const emit = defineEmits(['change'])
const timeList = ref([
{ label: "日", num: 0 },
{ label: "月", num: 1 },
{ label: "季", num: 2 },
{ label: "年", num: 3 }
]);
const radioTime = ref(0)
const formSearch = ref({
dateRange: [timeValidate(null,'ymd'),timeValidate(null,'ymd')],
})
// 单选
const changeRadio = (val) =>{
switch(val){
case 0: //日
formSearch.value.dateRange = [timeValidate(null,'ymd'),timeValidate(null,'ymd')]
break;
case 1: //月
formSearch.value.dateRange = timeSlotChange('本月')
break;
case 2: //季度
formSearch.value.dateRange = timeSlotChange('本季度')
break;
case 3: //年
formSearch.value.dateRange = timeSlotChange('本年')
break;
}
}
// 自定义
const handleDateChange = (val) => {
radioTime.value = '';
if(val[0] == timeSlotChange('天')[0] && val[1] == timeSlotChange('天')[1]) radioTime.value = 0;
if(val[0] == timeSlotChange('本月')[0] && val[1] == timeSlotChange('本月')[1]) radioTime.value = 1;
if(val[0] == timeSlotChange('本季度')[0] && val[1] == timeSlotChange('本季度')[1]) radioTime.value = 2;
if(val[0] == timeSlotChange('本年')[0] && val[1] == timeSlotChange('本年')[1]) radioTime.value = 3;
};
// 查询
const handleSubmit = () => {
emit('change', formSearch.value)
}
// 重置
const resetForm = () => {
radioTime.value = 0;
formSearch.value = {
dateRange: [timeValidate(null,'ymd'),timeValidate(null,'ymd')],
}
emit('change', formSearch.value)
}
</script>
<style scoped lang="scss">
.top-head {
background-color: #fff;
font-size: 16px;
color: #333;
padding: 10px 10px 0;
box-sizing: border-box;
border-radius: 4px;
.filter-section {
display: flex;
align-items: center;
gap: 16px;
background: #fff;
border-radius: 4px;
::v-deep .el-radio{
--el-radio-input-border-radius: 10%;
}
::v-deep .el-radio__label{
color: #333;
}
}
}
</style>
<style lang="scss">
.top-head {
.el-date-editor .el-range-separator{
color: #333 !important;
}
}
</style>

View File

@ -0,0 +1,164 @@
<template>
<div class="echratsBox">
<div class="chart-container" :id="props.id"></div>
<div class="legend-container">
<div class="legend-item" v-for="(item, i) in legendList" :key="i">
<span class="dot" :style="{ background: item.dotColor }"></span>
<span class="name">{{ item.name }}</span>
<span class="value">{{ item.value }}</span>
<span class="label">占比</span>
<span class="percent">{{ item.percent }}%</span>
</div>
</div>
</div>
</template>
<script setup>
import { nextTick, ref ,defineProps,watch} from 'vue'
import * as echarts from 'echarts'
const props = defineProps({
data: {
type: Array,
default: () => [
{ name: '失控', value: 85 ,color: '#D66A8D'},
{ name: '在控', value: 55 ,color: '#17C0AE'},
]
},
id: {
type: String,
default: 'echartsRef'
}
})
const legendList = ref([])
watch(() => props.data, (newVal) => {
if (newVal.length) {
const total = newVal.reduce((s, v) => s + v.value, 0);
legendList.value = newVal.map((d, i) => ({
name: d.name,
value: d.value,
percent: total > 0 ? Math.round((d.value / total )* 100) : 0,
dotColor: i === 0 ? 'linear-gradient(90deg, #FF8DA7 0%, #D66A8D 100%)': d.color
}))
nextTick(() => {
initChart(newVal, total)
})
}
}, { immediate: true })
const initChart = (data, total) => {
let chart = echarts.init(document.getElementById(props.id))
if (!chart) return;
const seriesData = data.map((d) => ({
name: d.name,
value: d.value,
itemStyle: { color: d.color }
}))
const option = {
tooltip: { show: false },
legend: { show: false },
series: [
{
type: 'pie',
radius: ['50%', '78%'],
center: ['50%', '48%'],
startAngle:56,
roseType: 'radius',
label: { show: false },
labelLine: { show: false },
itemStyle: { borderColor: '#FFFFFF', borderWidth: 0 },
data: seriesData
}
],
graphic: [
{
type: 'text',
left: 'center',
top: '32%',
style: {
text: `${total}`,
fill: '#2F88FF',
fontSize: 24,
fontWeight: 700,
textAlign: 'center'
}
},
{
type: 'text',
left: 'center',
top: '52%',
style: {
text: '总数',
fill: '#666666',
fontSize: 14,
fontWeight: 400,
textAlign: 'center'
}
}
]
}
chart.setOption(option)
window.addEventListener('resize', () => chart.resize())
}
</script>
<style scoped lang="scss">
.echratsBox {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 10px 0;
box-sizing: border-box;
.chart-container {
width: 100%;
height: 180px;
}
.legend-container {
margin-top: 0;
display: flex;
gap: 20px;
align-items: center;
justify-content: center;
flex-shrink: 0;
.legend-item {
display: flex;
align-items: center;
font-size: 14px;
color: #666666;
}
.dot {
width: 10px;
height: 10px;
border-radius: 50%;
margin-right: 8px;
box-shadow: 0 1px 3px rgba(0,0,0,0.08) inset;
}
.name {
margin-right: 8px;
}
.value {
margin-right: 8px;
color: #333333;
font-weight: 500;
}
.label {
margin-right: 4px;
color: #666666;
}
.percent {
color: #2F88FF;
font-weight: 600;
}
}
}
</style>

View File

@ -1,282 +1,32 @@
<template> <template>
<div class="statistical-analysis"> <div>
<!-- 左侧树形菜单 --> <PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<div class="left-menu"> <template #left>
<!-- 这个部分用的是组件-后期替换 --> <el-button v-for="(item,index) in butList" :key="index" :type="qh == item ? 'primary' : 'default'" @click="qh = item" size="small">{{item}}</el-button>
<MOSTY.DepartmentTree width="310px" @change="init" placeholder="管理部门" clearable filterable :isBmId="false" </template>
v-model="listQuery.ssbmdm" /> </PageTitle>
</div> <div class="countBox">
<QbtjCount v-if="qh=='情报统计分析'" />
<!-- 右侧内容区 --> <YjCount v-if="qh=='预警统计'" />
<div class="right-content"> <QygktjCount v-if="qh=='全域管控统计'" />
<!-- 顶部筛选 --> <XxhjCount v-if="qh=='信息汇聚统计'" />
<div class="filter-section">
<el-radio-group v-model="radio" @change="changeRadio">
<el-radio v-for="(it, idx) in timeList" :key="idx" :label="it.num">{{ it.label }}</el-radio>
</el-radio-group>
<el-date-picker v-model="dateRange" type="daterange" range-separator="至" start-placeholder="开始日期"
end-placeholder="结束日期" format="YYYY-MM-DD" value-format="YYYY-MM-DD" @change="handleDateChange" />
<el-button type="primary" @click="init">查询</el-button>
<el-button type="primary" @click="handleRest">重置</el-button>
</div>
<!-- 统计图表区域 -->
<div class="charts-container">
<div class="chart-item">
<div class="chart-title">
<span>信息分组统计</span>
<!-- <el-button type="primary">导出统计表</el-button> -->
</div>
<div class="chart">
<PieEcharts echartsId="pieChart" color="#333" :data="obj.xsfzList" />
</div>
</div>
<div class="chart-item">
<div class="chart-title">
<span>预警等级统计</span>
<!-- <el-button type="primary">导出统计表</el-button> -->
</div>
<div class="chart">
<!-- {{ obj.yjdjList }} -->
<DbarEcharts echartsId="bar3DChart" :data="obj.yjdjList" />
</div>
</div>
<div class="chart-item">
<div class="chart-title">
<span>线索来源统计</span>
<!-- <el-button type="primary">导出统计表</el-button> -->
</div>
<ul class="chart mt8">
<li v-for="(it, idx) in obj.xslyList" :key="idx" class="mb6">
<div style="color: #333">{{ it.label }}</div>
<el-progress :text-inside="true" :stroke-width="20" :percentage="calculatePercentage(it.value)"
status="exception">
<span><span style="color: #e37233">{{ it.value }}</span> </span>
</el-progress>
</li>
</ul>
</div>
<div class="chart-item">
<div class="chart-title">
<span>研判统计</span>
<!-- <el-button type="primary">导出统计表</el-button> -->
</div>
<DbarEcharts echartsId="bar3DCharts" :data="obj.ypList" />
<!-- <lineEcharts color="#333" echartsId="areaChart" :data="obj.ypList" /> -->
</div>
</div>
</div> </div>
</div> </div>
</template> </template>
<script setup> <script setup>
import { timeValidate, timeSlotChange } from "@/utils/tools.js"; import PageTitle from "@/components/aboutTable/PageTitle.vue";
import * as MOSTY from "@/components/MyComponents/index"; import QbtjCount from './qbtjCount.vue'
import lineEcharts from "@/views/home/echarts/lineEcharts.vue"; import YjCount from './yjCount.vue'
import PieEcharts from "@/views/home/echarts/pieEcharts.vue"; import QygktjCount from './qygktjCount.vue'
import DbarEcharts from "@/views/home/echarts/3DbarEcharts.vue"; import XxhjCount from './xxhjCount.vue'
import { qcckPost, qcckGet } from "@/api/qcckApi.js"; import { ref } from "vue";
import { reactive, ref, onMounted } from "vue"; const butList=ref(["情报统计分析","预警统计",'全域管控统计','信息汇聚统计'])
const qh = ref('情报统计分析')
const dateRange = ref([timeValidate(new Date(), 'ymd'), timeValidate(new Date(), 'ymd')]);// 日期范围
const radio = ref(0); //当天
const timeList = ref([
{ label: "日", num: 0 },
{ label: "月", num: 1 },
{ label: "季", num: 2 },
{ label: "年", num: 3 }
]);
const listQuery = ref({})
const obj = reactive({
xsfzList: [],// 线索采集统计
xslyList: [],// 线索专题统计
ypList: {
list: [],//线索来源统计
topColor: '#1bd6c2',
colors: ["#28EEBF", "#0DBAC5"],
},
yjdjList: {
list: [],//线索来源统计
topColor: '#1bd6c2',
colors: ["#28EEBF", "#0DBAC5"],
}
});
onMounted(() => {
init() //初始化数据
});
const init = () => {
console.log(dateRange.value);
let data = {
ssbmdm: listQuery.value.ssbmdm,
startTime: dateRange.value[0]+' 00:00:00',
endTime: dateRange.value[1] + ' 23:59:59',
}
// 线索分组统计
qcckGet(data, '/mosty-gsxt/xxcj/xxfztj').then(res => {
let arr = res || [];
obj.xsfzList = arr.map(v => {
return { label: v.label, value: v.sl }
})
})
//研判统计
qcckGet(data, '/mosty-gsxt/ypbg/sjzl/yptj').then(res => {
let arr = res || [];
obj.ypList.list = arr.map(v => {
return { label: v.label, value: v.sl }
})
})
//线索来源统计
qcckPost(data, '/mosty-gsxt/qbcj/getXscjTjByQbly').then(res => {
let arr = res || [];
obj.xslyList = arr.map(v => {
return { label: v.zdmc, value: v.count }
})
})
//预警等级
const yjdjList = [
{ label: '红色预警', key: '01', count: 0 },
{ label: '橙色预警', key: '02', count: 0 },
{ label: '黄色预警', key: '03', count: 0 },
{ label: '蓝色预警', key: '04', count: 0 },
]
// 预警等级统计
qcckGet({ssbmdm:data.ssbmdm,kssj:data.startTime,jssj:data.endTime}, '/mosty-gsxt/tbYjxx/getYjxxTj').then(res => {
let arr = res || [];
obj.yjdjList.list = yjdjList.map(items => {
const index= arr.findIndex(item=>item.yj_jb===items.key);
return {
label: items.label,
value:index==-1?0:arr[index].count
}
})
})
}
const changeRadio = (val) => {
switch (val) {
case 0: //日
dateRange.value = timeSlotChange('日')
// [timeValidate(), timeValidate()]
break;
case 1: //月
dateRange.value = timeSlotChange('本月')
break;
case 2: //季度
dateRange.value = timeSlotChange('本季度')
break;
case 3: //年
dateRange.value = timeSlotChange('本年')
break;
}
}
const handleDateChange = (val) => {
radio.value = '';
if (val[0] == timeSlotChange('天')[0] && val[1] == timeSlotChange('天')[1]) radio.value = 0;
if (val[0] == timeSlotChange('本月')[0] && val[1] == timeSlotChange('本月')[1]) radio.value = 1;
if (val[0] == timeSlotChange('本季度')[0] && val[1] == timeSlotChange('本季度')[1]) radio.value = 2;
if (val[0] == timeSlotChange('本年')[0] && val[1] == timeSlotChange('本年')[1]) radio.value = 3;
};
// 重置
const handleRest = () => {
radio.value = 0;
dateRange.value = [timeValidate(), timeValidate()];
init();
};
// 计算百分比
const calculatePercentage = (value) => {
if (!obj.xslyList || obj.xslyList.length === 0) return 0;
const total = obj.xslyList.reduce((sum, item) => sum + (item.value || 0), 0);
if (total === 0) return 0;
return Math.round((value / total) * 100);
};
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.statistical-analysis { .countBox {
display: flex; height: calc(100vh - 180px);
height: 100%; border-radius: 4px;
.left-menu {
width: 350px;
padding: 20px;
margin-top: 20px;
border-radius: 4px;
background-color: #fff;
border-right: 1px solid #e8e8e8;
}
.right-content {
flex: 1;
padding: 20px;
.filter-section {
display: flex;
align-items: center;
gap: 16px;
margin-bottom: 20px;
background: #fff;
padding: 10px;
box-sizing: border-box;
border-radius: 4px;
}
.charts-container {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
height: calc(100% - 50px);
.chart-item {
width: 49.5%;
height: calc(50% - 5px);
background-color: #fff;
border-radius: 8px;
padding: 20px;
box-sizing: border-box;
overflow: hidden;
overflow-y: auto;
.chart-title {
font-size: 16px;
font-weight: bold;
color: #333;
display: flex;
justify-content: space-between;
align-items: center;
}
.chart {
height: calc(100% - 40px);
overflow: hidden;
overflow-y: auto;
}
}
}
}
::v-deep .el-radio {
color: #333;
}
::v-deep .el-radio__inner {
border-radius: 4px;
}
::v-deep .el-progress-bar__innerText {
color: #333;
margin: 0 -40px;
}
::v-deep .el-progress.is-exception .el-progress-bar__inner {
background: linear-gradient(90deg, #fe5d00 0%, #face35 100%);
}
} }
</style> </style>

View File

@ -0,0 +1,280 @@
<template>
<div class="statistical-analysis">
<!-- 左侧树形菜单 -->
<div class="left-menu">
<!-- 这个部分用的是组件-后期替换 -->
<MOSTY.DepartmentTree width="310px" @change="init" placeholder="管理部门" clearable filterable :isBmId="false"
v-model="listQuery.ssbmdm" />
</div>
<!-- 右侧内容区 -->
<div class="right-content">
<!-- 顶部筛选 -->
<div class="filter-section">
<el-radio-group v-model="radio" @change="changeRadio">
<el-radio v-for="(it, idx) in timeList" :key="idx" :label="it.num">{{ it.label }}</el-radio>
</el-radio-group>
<el-date-picker v-model="dateRange" type="daterange" range-separator="至" start-placeholder="开始日期"
end-placeholder="结束日期" format="YYYY-MM-DD" value-format="YYYY-MM-DD" @change="handleDateChange" />
<el-button type="primary" @click="init">查询</el-button>
<el-button type="primary" @click="handleRest">重置</el-button>
</div>
<!-- 统计图表区域 -->
<div class="charts-container">
<div class="chart-item">
<div class="chart-title">
<span>信息分组统计</span>
<!-- <el-button type="primary">导出统计表</el-button> -->
</div>
<div class="chart">
<PieEcharts echartsId="pieChart" color="#333" :data="obj.xsfzList" />
</div>
</div>
<div class="chart-item">
<div class="chart-title">
<span>预警等级统计</span>
<!-- <el-button type="primary">导出统计表</el-button> -->
</div>
<div class="chart">
<!-- {{ obj.yjdjList }} -->
<DbarEcharts echartsId="bar3DChart" :data="obj.yjdjList" />
</div>
</div>
<div class="chart-item">
<div class="chart-title">
<span>线索来源统计</span>
<!-- <el-button type="primary">导出统计表</el-button> -->
</div>
<ul class="chart mt8">
<li v-for="(it, idx) in obj.xslyList" :key="idx" class="mb6">
<div style="color: #333">{{ it.label }}</div>
<el-progress :text-inside="true" :stroke-width="20" :percentage="calculatePercentage(it.value)"
status="exception">
<span><span style="color: #e37233">{{ it.value }}</span> </span>
</el-progress>
</li>
</ul>
</div>
<div class="chart-item">
<div class="chart-title">
<span>研判统计</span>
<!-- <el-button type="primary">导出统计表</el-button> -->
</div>
<DbarEcharts echartsId="bar3DCharts" :data="obj.ypList" />
<!-- <lineEcharts color="#333" echartsId="areaChart" :data="obj.ypList" /> -->
</div>
</div>
</div>
</div>
</template>
<script setup>
import { timeValidate, timeSlotChange } from "@/utils/tools.js";
import * as MOSTY from "@/components/MyComponents/index";
import lineEcharts from "@/views/home/echarts/lineEcharts.vue";
import PieEcharts from "@/views/home/echarts/pieEcharts.vue";
import DbarEcharts from "@/views/home/echarts/3DbarEcharts.vue";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import { reactive, ref, onMounted } from "vue";
const dateRange = ref([timeValidate(new Date(), 'ymd'), timeValidate(new Date(), 'ymd')]);// 日期范围
const radio = ref(0); //当天
const timeList = ref([
{ label: "日", num: 0 },
{ label: "月", num: 1 },
{ label: "季", num: 2 },
{ label: "年", num: 3 }
]);
const listQuery = ref({})
const obj = reactive({
xsfzList: [],// 线索采集统计
xslyList: [],// 线索专题统计
ypList: {
list: [],//线索来源统计
topColor: '#1bd6c2',
colors: ["#28EEBF", "#0DBAC5"],
},
yjdjList: {
list: [],//线索来源统计
topColor: '#1bd6c2',
colors: ["#28EEBF", "#0DBAC5"],
}
});
onMounted(() => {
init() //初始化数据
});
const init = () => {
console.log(dateRange.value);
let data = {
ssbmdm: listQuery.value.ssbmdm,
startTime: dateRange.value[0]+' 00:00:00',
endTime: dateRange.value[1] + ' 23:59:59',
}
// 线索分组统计
qcckGet(data, '/mosty-gsxt/xxcj/xxfztj').then(res => {
let arr = res || [];
obj.xsfzList = arr.map(v => {
return { label: v.label, value: v.sl }
})
})
//研判统计
qcckGet(data, '/mosty-gsxt/ypbg/sjzl/yptj').then(res => {
let arr = res || [];
obj.ypList.list = arr.map(v => {
return { label: v.label, value: v.sl }
})
})
//线索来源统计
qcckPost(data, '/mosty-gsxt/qbcj/getXscjTjByQbly').then(res => {
let arr = res || [];
obj.xslyList = arr.map(v => {
return { label: v.zdmc, value: v.count }
})
})
//预警等级
const yjdjList = [
{ label: '红色预警', key: '01', count: 0 },
{ label: '橙色预警', key: '02', count: 0 },
{ label: '黄色预警', key: '03', count: 0 },
{ label: '蓝色预警', key: '04', count: 0 },
]
// 预警等级统计
qcckGet({ssbmdm:data.ssbmdm,kssj:data.startTime,jssj:data.endTime}, '/mosty-gsxt/tbYjxx/getYjxxTj').then(res => {
let arr = res || [];
obj.yjdjList.list = yjdjList.map(items => {
const index= arr.findIndex(item=>item.yj_jb===items.key);
return {
label: items.label,
value:index==-1?0:arr[index].count
}
})
})
}
const changeRadio = (val) => {
switch (val) {
case 0: //日
dateRange.value = timeSlotChange('日')
// [timeValidate(), timeValidate()]
break;
case 1: //月
dateRange.value = timeSlotChange('本月')
break;
case 2: //季度
dateRange.value = timeSlotChange('本季度')
break;
case 3: //年
dateRange.value = timeSlotChange('本年')
break;
}
}
const handleDateChange = (val) => {
radio.value = '';
if (val[0] == timeSlotChange('天')[0] && val[1] == timeSlotChange('天')[1]) radio.value = 0;
if (val[0] == timeSlotChange('本月')[0] && val[1] == timeSlotChange('本月')[1]) radio.value = 1;
if (val[0] == timeSlotChange('本季度')[0] && val[1] == timeSlotChange('本季度')[1]) radio.value = 2;
if (val[0] == timeSlotChange('本年')[0] && val[1] == timeSlotChange('本年')[1]) radio.value = 3;
};
// 重置
const handleRest = () => {
radio.value = 0;
dateRange.value = [timeValidate(), timeValidate()];
init();
};
// 计算百分比
const calculatePercentage = (value) => {
if (!obj.xslyList || obj.xslyList.length === 0) return 0;
const total = obj.xslyList.reduce((sum, item) => sum + (item.value || 0), 0);
if (total === 0) return 0;
return Math.round((value / total) * 100);
};
</script>
<style lang="scss" scoped>
.statistical-analysis {
display: flex;
height: 100%;
.left-menu {
width: 350px;
padding: 20px;
border-radius: 4px;
background-color: #fff;
border-right: 1px solid #e8e8e8;
}
.right-content {
flex: 1;
padding: 0 20px 20px;
height: 100%;
.filter-section {
display: flex;
align-items: center;
gap: 16px;
margin-bottom: 20px;
background: #fff;
padding: 10px;
box-sizing: border-box;
border-radius: 4px;
}
.charts-container {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
height: calc(100% - 50px);
.chart-item {
width: 49.5%;
height: calc(50% - 5px);
background-color: #fff;
border-radius: 8px;
padding: 20px;
box-sizing: border-box;
overflow: hidden;
overflow-y: auto;
.chart-title {
font-size: 16px;
font-weight: bold;
color: #333;
display: flex;
justify-content: space-between;
align-items: center;
}
.chart {
height: calc(100% - 40px);
overflow: hidden;
overflow-y: auto;
}
}
}
}
::v-deep .el-radio {
color: #333;
}
::v-deep .el-radio__inner {
border-radius: 4px;
}
::v-deep .el-progress-bar__innerText {
color: #333;
margin: 0 -40px;
}
::v-deep .el-progress.is-exception .el-progress-bar__inner {
background: linear-gradient(90deg, #fe5d00 0%, #face35 100%);
}
}
</style>

View File

@ -0,0 +1,260 @@
<template>
<div class="countBox">
<div ref="searchRef">
<HeadLayout @change="handleChange" />
</div>
<ul class="cntBox" :style="{ height: boxHeight + 'px'}">
<li class="cnt-item">
<div class="common-title">
<div class="title">人员来源统计</div>
</div>
<div class="echratsBox">
<DbarEcharts echartsId="bar35DChart" :key="ketcount" :data="obj.rylyList" />
</div>
</li>
<li class="cnt-item">
<div class="common-title">
<div class="title">重点人等级</div>
</div>
<div class="echratsBox">
<StatusCount :data="obj.zdrdjList" id="gkztCount" />
</div>
</li>
<li class="cnt-item">
<div class="common-title">
<div class="title">各类标签管控数量统计</div>
</div>
<div class="echratsBox"><BqyjslCount :data="obj.bqgkslList"/></div>
</li>
<li class="cnt-item">
<div class="common-title">
<div class="title">各部门管控数量统计</div>
<div class="btn-group">
<div class="btn" @click="handle_gbmgk" v-if="activeTab">返回</div>
</div>
</div>
<div class="echratsBox" v-loading="loading">
<DbarEcharts echartsId="bardepDChart" :rotate="25" :key="ketcount" :data="obj.gbmgkList" @click="handleClick" />
</div>
</li>
</ul>
</div>
</template>
<script setup>
import { getItem } from "@/utils/storage";
import { qcckGet } from '@/api/qcckApi'
import * as echarts from 'echarts'
import HeadLayout from './components/headLayout.vue'
import BqyjslCount from './components/bqyjslCount.vue'
import StatusCount from './components/statusCount.vue'
import DbarEcharts from "@/views/home/echarts/3DbarEcharts.vue";
import { onMounted, reactive, ref } from "vue";
const searchRef = ref() //筛选组件实例
const boxHeight = ref() //盒子高度
const formSearch = ref({}) //查询条件
const activeTab = ref(false)
const loading = ref(false)
const ketcount = ref(0)
const obj = reactive({
rylyList: {
list: [
{ label:'基础库',value:0 },
{ label:'重点库',value:0 },
{ label:'关注库',value:0 },
{ label:'重点群体',value:0 },
{ label:'重点车辆',value:0 },
],
topColor:'#17c8c3',
colors: ["#28EEBF","#0DBAC5"],
},//人员来源统计
zdrdjList: [
{ name: '一级', value: 0 ,color: new echarts.graphic.LinearGradient(0, 0, 1, 1, [{ offset: 0, color: '#FF8DA7' },{ offset: 1, color: '#D66A8D' }])},
{ name: '二级', value: 0 ,color: '#FFB944'},
{ name: '三级', value: 0 ,color: '#fcfc54'},
{ name: '四级', value: 0 ,color: '#0072ff'},
],//重点人等级
bqgkslList: [
{ label: '涉嫌爆炸等恐怖袭击人员', value: 0 },
{ label: '全国涉稳重点人', value: 0 },
{ label: '自治区涉稳人员', value: 0 },
{ label: '国保涉稳人员', value: 0 },
{ label: '涉政涉恐涉稳重点人员', value: 0 },
],//各类标签预警数量统计
gbmgkList: {
list: [
{ label:'巴宜区',value:0,ssbmdm: "540402000000" },
{ label:'工布江达县',value:0,ssbmdm: "540421000000" },
{ label:'米林县',value:0,ssbmdm: "540481000000" },
{ label:'墨脱县',value:0,ssbmdm: "540423000000" },
{ label:'波密县',value:0,ssbmdm: "540424000000" },
{ label:'察隅县',value:0,ssbmdm: "540425000000" },
{ label:'朗县',value:0,ssbmdm: "540426000000" },
{ label:'雅下分局',value:0,ssbmdm: "540481450000" },
],
topColor:'#17c8c3',
colors: ["#28EEBF","#0DBAC5"],
},//各部门管控数量统计
})
// 2开头是市、3开头是县、4开头派出所级
const userInfo = getItem("deptId")[0];
onMounted(()=>{
init()
tabHeightFn()
})
// 筛选
const handleChange = (val) => {
formSearch.value = {...val }
formSearch.value.startTime = val.dateRange ? val.dateRange[0] : ''
formSearch.value.endTime = val.dateRange ? val.dateRange[1] : ''
delete formSearch.value.dateRange;
init()
}
// 初始化
const init = () =>{
handle_ryly(); //人员来源统计
handle_gkjb(); //管控级别统计
handle_bq(); //各类标签预警数量统计
handle_gbmgk(); //各部门管控数量统计
}
//人员来源统计
const handle_ryly = async () => {
let params = {...formSearch.value}
let res = await qcckGet(params,'/mosty-gsxt/tbGsxtZdry/lytjCount');
let list = res || [];
obj.rylyList.list = list.map(item => ({
label: item.mc,
value: item.sl || 0,
}))
}
// 重点人等级
const handle_gkjb = async () => {
let params = {...formSearch.value}
let res = await qcckGet(params,'/mosty-gsxt/tbGsxtZdry/gkdjCount');
let color = [
new echarts.graphic.LinearGradient(0, 0, 1, 1, [{ offset: 0, color: '#FF8DA7' },{ offset: 1, color: '#D66A8D' }]),
'#FFB944',
'#fcfc54',
'#0072ff'
]
obj.zdrdjList = (res || []).map((item,idx) => ({
name: item.zdmc,
value: Number(item.sl) || 0,
color: color[idx],
}))
console.log(obj.zdrdjList,'=====00');
}
//各类标签预警数量统计
const handle_bq = async () => {
let params = {...formSearch.value}
let res = await qcckGet(params,'/mosty-gsxt/tbGsxtZdry/rybqCount');
let list = res || [];
obj.bqgkslList = list.map(item => ({
label: item.bqmc,
value: item['count(bq_mc)'] || 0,
}))
}
// 部门点击事件
const handleClick = async (val) =>{
// 当前部门是派出所 bb
if(userInfo?.deptLevel?.startsWith('4')) return;
if(val.includes('派出所')) return;
let info = obj.gbmgkList.list.find(i => i.label === val);
let params = {...formSearch.value }
params.ssbmdm = info.ssbmdm;
loading.value = true;
let res = await qcckGet(params,'/mosty-gsxt/tbGsxtZdry/bmCount');
activeTab.value = true;
loading.value = false;
obj.gbmgkList.list = (res || []).map(v=>{
return {
label: v.ssbmmc,
value: Number(v.sl),
ssbmdm:v.ssbmdm
}
})
}
//各部门管控数量统计
const handle_gbmgk = async () => {
activeTab.value = false;
let params = {...formSearch.value}
params.ssbmdm = userInfo?.deptCode;
loading.value = true;
let res = await qcckGet(params,'/mosty-gsxt/tbGsxtZdry/bmCount');
loading.value = false;
obj.gbmgkList.list = (res || []).map(v=>{
return {
label: v.ssbmmc,
value: Number(v.sl),
ssbmdm:v.ssbmdm
}
})
}
// 表格高度计算
const tabHeightFn = () => {
boxHeight.value = window.innerHeight - searchRef.value.offsetHeight - 200;
window.onresize = function () {
tabHeightFn();
};
};
</script>
<style lang="scss" scoped>
.countBox {
height: 100%;
border-radius: 4px;
.cntBox{
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-content: space-between;
margin-top: 10px;
overflow: hidden;
.cnt-item{
width: 49.8%;
height: 49.5%;
background: #fff;
border-radius: 4px;
.common-title {
display: flex;
justify-content: space-between;
align-items: center;
padding: 5px 20px;
box-sizing: border-box;
.title {
font-size: 14px;
font-weight: 600;
color: #333;
position: relative;
&::after {
content: '';
position: absolute;
left: 0;
bottom: -1px;
width: 80px;
height: 4px;
background: linear-gradient(to right, #409EFF, #ffffff);
}
}
}
.echratsBox{
height: calc(100% - 40px);
overflow: hidden;
}
}
}
}
</style>

View File

@ -0,0 +1,299 @@
<template>
<div class="countBox">
<div ref="searchRef">
<HeadLayout @change="handleChange" />
</div>
<ul class="cntBox" :style="{ height: boxHeight + 'px'}">
<li class="cnt-item">
<div class="common-title">
<div class="title">采用情况统计</div>
</div>
<div class="echratsBox">
<StatusCount :data="obj.cyqkList" id="cyqkCount" />
</div>
</li>
<li class="cnt-item">
<div class="common-title">
<div class="title">分组统计</div>
</div>
<div class="echratsBox">
<StatusCount :data="obj.fzList" id="fzCount" />
</div>
</li>
<li class="cnt-item">
<div class="common-title">
<div class="title">状态统计</div>
</div>
<div class="echratsBox">
<StatusCount :data="obj.ztList" id="ztCount" />
</div>
</li>
<li class="cnt-item cnt-item-last">
<div class="common-title">
<div class="title">标签统计</div>
</div>
<div class="echratsBox">
<BqyjslCount :data="obj.bqList"/>
</div>
</li>
<li class="cnt-item cnt-item-last">
<div class="common-title">
<div class="title">各部门管控数量统计</div>
<div class="btn-group">
<div class="btn" @click="handle_bm" v-if="activeTab">返回</div>
</div>
</div>
<div class="echratsBox" v-loading="loading">
<DbarEcharts echartsId="bardepDChart" :rotate="25" :key="ketcount" @click="handleClick" :data="obj.bmList" />
</div>
</li>
</ul>
</div>
</template>
<script setup>
import { getItem } from "@/utils/storage";
import BqyjslCount from './components/bqyjslCount.vue'
import { qcckGet } from '@/api/qcckApi'
import * as echarts from 'echarts'
import HeadLayout from './components/headLayout.vue'
import StatusCount from './components/statusCount.vue'
import DbarEcharts from "@/views/home/echarts/3DbarEcharts.vue";
import { onMounted, reactive, ref } from "vue";
const searchRef = ref() //筛选组件实例
const boxHeight = ref() //盒子高度
const formSearch = ref({}) //查询条件
const ketcount = ref(0)
const activeTab = ref(true)
const loading = ref(false)
const obj = reactive({
// 采用情况统计
cyqkList: [
{ name:'采纳',value:0,color:'#0dbac5' },
{ name:'退回',value:0,color:'#ff7700' },
],
// 分组统计
fzList: [
{ name:'内部',value:0,color:'#fdbc3a' },
{ name:'共享',value:0,color:'#ff7700' },
],
// 状态统计
ztList: [
{ name: '送审', value: 0 ,color: new echarts.graphic.LinearGradient(0, 0, 1, 1, [{ offset: 0, color: '#FF8DA7' },{ offset: 1, color: '#D66A8D' }])},
{ name: '转线索', value: 0 ,color: '#17C0AE'},
],
bqList: [],//标签
bmList: {
list: [
{ label:'巴宜区',value:0,ssbmdm: "540402000000" },
{ label:'工布江达县',value:0,ssbmdm: "540421000000" },
{ label:'米林县',value:0,ssbmdm: "540481000000" },
{ label:'墨脱县',value:0,ssbmdm: "540423000000" },
{ label:'波密县',value:0,ssbmdm: "540424000000" },
{ label:'察隅县',value:0,ssbmdm: "540425000000" },
{ label:'朗县',value:0,ssbmdm: "540426000000" },
{ label:'雅下分局',value:0,ssbmdm: "540481450000" },
],
topColor:'#17c8c3',
colors: ["#28EEBF","#0DBAC5"],
},//各部门管控数量统计
})
// 2开头是市、3开头是县、4开头派出所级
const userInfo = getItem("deptId")[0];
onMounted(()=>{
init()
tabHeightFn()
})
// 筛选
const handleChange = (val) => {
formSearch.value = {...val }
formSearch.value.startTime = val.dateRange ? val.dateRange[0] : ''
formSearch.value.endTime = val.dateRange ? val.dateRange[1] : ''
delete formSearch.value.dateRange;
init()
}
const init = async () => {
await handle_cyqk(); //采用情况统计
await handle_fz(); //分组统计
await handle_zt(); //状态统计
await handle_bq(); //标签统计
await handle_bm(); //各部门管控数量统计
}
//采用情况统计
const handle_cyqk = async () => {
let params = {...formSearch.value}
let res = await qcckGet(params,'/mosty-gsxt/xxcj/cyqkCount');
let list = res || [];
let color = ['#0dbac5','#ff7700','#409eff']
obj.cyqkList = list.map((item,idx) => ({
name: item.dmmc,
value: item.sl || 0,
color: color[idx] || '#0dbac5',
}))
}
//分组统计
const handle_fz = async () => {
let params = {...formSearch.value}
let res = await qcckGet(params,'/mosty-gsxt/xxcj/fzCount');
let list = res || [];
let color = ['#fdbc3a','#ff7700','#409eff']
obj.fzList = list.map((item,idx) => ({
name: item.dmmc,
value: item.sl || 0,
color: color[idx] || '#0dbac5',
}))
}
//状态统计
const handle_zt = async () => {
let params = {...formSearch.value}
let res = await qcckGet(params,'/mosty-gsxt/xxcj/ztCount');
let list = res || [];
let color = [new echarts.graphic.LinearGradient(0, 0, 1, 1, [{ offset: 0, color: '#FF8DA7' },{ offset: 1, color: '#D66A8D' }]),'#17C0AE','#409eff']
obj.ztList = list.map((item,idx) => ({
name: item.dmmc,
value: item.sl || 0,
color: color[idx] || '#0dbac5',
}))
}
//标签
const handle_bq = async () => {
let params = {...formSearch.value}
let res = await qcckGet(params,'/mosty-gsxt/xxcj/bqCount');
let list = res || [];
obj.bqList = list.map((item) => ({
label: item.bqmc,
value: item['count(bqmc)'] || 0,
}))
}
// 部门点击事件
const handleClick = async (val) =>{
// 当前部门是派出所 bb
if(userInfo?.deptLevel?.startsWith('4')) return;
if(val.includes('派出所')) return;
let info = obj.bmList.list.find(i => i.label === val);
let params = {...formSearch.value }
params.ssbmdm = info.ssbmdm;
loading.value = true;
let res = await qcckGet(params,'/mosty-gsxt/tbGsxtZdry/bmCount');
activeTab.value = true;
loading.value = false;
obj.bmList.list = (res || []).map(v=>{
return {
label: v.ssbmmc,
value: Number(v.sl),
ssbmdm:v.ssbmdm
}
})
}
//各部门管控数量统计
const handle_bm = async () => {
activeTab.value = false;
let params = {...formSearch.value}
params.ssbmdm = userInfo?.deptCode;
loading.value = true;
let res = await qcckGet(params,'/mosty-gsxt/xxcj/bmCount');
loading.value = false;
obj.bmList.list = (res || []).map(v=>{
return {
label: v.ssbmmc,
value: Number(v.sl),
ssbmdm:v.ssbmdm
}
})
}
// 表格高度计算
const tabHeightFn = () => {
boxHeight.value = window.innerHeight - searchRef.value.offsetHeight - 200;
window.onresize = function () {
tabHeightFn();
};
};
</script>
<style lang="scss" scoped>
.countBox {
height: 100%;
border-radius: 4px;
.cntBox{
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-content: space-between;
margin-top: 10px;
overflow: hidden;
.cnt-item{
width: 33%;
height: 49.5%;
background: #fff;
border-radius: 4px;
.common-title {
display: flex;
justify-content: space-between;
align-items: center;
padding: 5px 20px;
box-sizing: border-box;
.title {
font-size: 14px;
font-weight: 600;
color: #333;
position: relative;
&::after {
content: '';
position: absolute;
left: 0;
bottom: -1px;
width: 80px;
height: 4px;
background: linear-gradient(to right, #409EFF, #ffffff);
}
}
.btn-group {
display: flex;
gap: 10px;
.btn {
padding: 3px 16px;
border: 1px solid #dcdfe6;
border-radius: 4px;
font-size: 12px;
cursor: pointer;
color: #606266;
transition: all 0.3s;
user-select: none;
&.active {
background: #409EFF;
color: #fff;
border-color: #409EFF;
}
&:hover:not(.active) {
color: #409EFF;
border-color: #c6e2ff;
background-color: #ecf5ff;
}
}
}
}
.echratsBox{
height: calc(100% - 40px);
overflow: hidden;
}
}
.cnt-item-last{
width: 49.8%;
}
}
}
</style>

View File

@ -0,0 +1,390 @@
<template>
<div class="countBox">
<div ref="searchRef">
<HeadLayout @change="handleChange" />
</div>
<ul class="countItem">
<li v-for="(item, index) in countList" :key="index" class="item">
<div class="left">
<img :src="item.icon" alt="" class="icon-img">
</div>
<div class="center">
<div class="label">{{ item.label }}</div>
<div class="value">{{ item.dysl }}</div>
</div>
<div class="divider"></div>
<div class="right">
<div class="stat-row">
<span class="stat-label">环比</span>
<span class="stat-val" :class="item.hb < 0 ? 'down' : 'up'">
{{ item.sysl }}
<img class="ml4" src="@/assets/images/icon-up.png" alt="" v-if="item.hb > 0">
<img class="ml4" src="@/assets/images/icon-down.png" alt="" v-if="item.hb < 0">
<span v-if="item.hb == 0" style="color:red;" class="ml4 mb4">--</span>
</span>
</div>
<div class="stat-row">
<span class="stat-label">同比</span>
<span class="stat-val" :class="item.tb < 0 ? 'down' : 'up'">
{{ item.snsl }}
<img class="ml4" src="@/assets/images/icon-up.png" alt="" v-if="item.tb > 0">
<img class="ml4" src="@/assets/images/icon-down.png" alt="" v-if="item.tb < 0">
<span v-if="item.hb == 0" style="color:red;" class="ml4 mb4">--</span>
</span>
</div>
</div>
</li>
</ul>
<ul class="cntBox" :style="{ height: boxHeight + 'px'}">
<li class="cnt-item">
<div class="common-title">
<div class="title">各部门预警数量统计</div>
<div class="btn-group">
<div class="btn" @click="handle_gbm" v-if="activeTab">返回</div>
</div>
</div>
<div class="echratsBox" v-loading="loading">
<DbarEcharts echartsId="bar3DChart" :rotate="25" :key="ketcount" :data="obj.cnList" @click="handleClick" />
</div>
</li>
<li class="cnt-item">
<div class="common-title">
<div class="title">各类标签预警数量统计</div>
</div>
<div class="echratsBox"><BqyjslCount :data="obj.bqyjslList" /></div>
</li>
<li class="cnt-item">
<div class="common-title">
<div class="title">7类重点人员预警统计</div>
</div>
<div class="echratsBox">
<LineEcharts echartsId="seventTypeChart" color="#333333" :data="obj.sevenList" name="预警数量" />
</div>
</li>
<li class="cnt-item">
<div class="common-title">
<div class="title">处置状态统计</div>
</div>
<div class="echratsBox"><CzztCount :data="obj.czztList" /></div>
</li>
</ul>
</div>
</template>
<script setup>
import { getItem } from "@/utils/storage";
import { qcckGet } from '@/api/qcckApi'
import HeadLayout from './components/headLayout.vue'
import BqyjslCount from './components/bqyjslCount.vue'
import CzztCount from './components/czztCount.vue'
import DbarEcharts from "@/views/home/echarts/3DbarEcharts.vue";
import LineEcharts from "@/views/home/echarts/lineEcharts.vue";
import { onMounted, reactive, ref } from "vue";
const searchRef = ref() //筛选组件实例
const boxHeight = ref() //盒子高度
const formSearch = ref({}) //查询条件
const activeTab = ref(false)
const loading = ref(false)
const ketcount = ref(0)
const countList = ref([
{ zddm:'01',label: '红色预警', hb:0,tb:0, dysl: 0, sysl: 0, snsl: 0, icon: require('@/assets/images/icon-red.png') },
{ zddm:'02',label: '橙色预警', hb:0,tb:0, dysl: 0, sysl: 0, snsl: 0, icon: require('@/assets/images/icon-orange.png') },
{ zddm:'03',label: '黄色预警', hb:0,tb:0, dysl: 0, sysl: 0, snsl: 0, icon: require('@/assets/images/icon-yellow.png') },
{ zddm:'04',label: '蓝色预警', hb:0,tb:0, dysl: 0, sysl: 0, snsl: 0, icon: require('@/assets/images/icon-blue.png') },
])
const obj = reactive({
bqyjslList: [], //各类标签预警数量统计 { label: '涉毒人员', value: 0 },
sevenList: [], //7类重点人员预警统计 { label:'涉恐',value:0 },
// 2开头是市、3开头是县、4开头派出所级 { label:'工布江达县',value:0 },
cnList: {
list: [
{ label:'巴宜区',value:0,ssbmdm: "540402000000" },
{ label:'工布江达县',value:0,ssbmdm: "540421000000" },
{ label:'米林县',value:0,ssbmdm: "540481000000" },
{ label:'墨脱县',value:0,ssbmdm: "540423000000" },
{ label:'波密县',value:0,ssbmdm: "540424000000" },
{ label:'察隅县',value:0,ssbmdm: "540425000000" },
{ label:'朗县',value:0,ssbmdm: "540426000000" },
{ label:'雅下分局',value:0,ssbmdm: "540481450000" },
],
topColor:'#17c8c3',
colors: ["#28EEBF","#0DBAC5"],
},
//处置状态统计
czztList: [
{ name: '未签收', value: 0 },
{ name: '已签收', value: 0 },
{ name: '已反馈', value: 0 }
]
})
// 2开头是市、3开头是县、4开头派出所级
const userInfo = getItem("deptId")[0];
onMounted(()=>{
tabHeightFn();
init()
})
// 筛选
const handleChange = (val) => {
formSearch.value = {...val }
formSearch.value.startTime = val.dateRange ? val.dateRange[0] : ''
formSearch.value.endTime = val.dateRange ? val.dateRange[1] : ''
delete formSearch.value.dateRange;
init()
}
// 初始化
const init = () =>{
handle_yjfl(); //预警分类统计 同比、环比
handle_gbm(); // 各部门预警数量统计
handle_yjbq(); // 预警标签统计
handle_seven(); // 7类重点人员预警统计
handle_czzt(); // 处置状态统计
}
// 预警分类统计 同比、环比
const handle_yjfl = async () =>{
let params = {...formSearch.value}
let res = await qcckGet(params,'/mosty-gsxt/yjxx/tj/yjfltj');
let list = res || [];
countList.value = countList.value.map(item => {
let obj = list.find(i => i.zddm === item.zddm);
obj.hb = Number(obj.hb.substring(0, obj.hb.length - 1));
obj.tb = Number(obj.tb.substring(0, obj.tb.length - 1));
return obj ? { ...item, ...obj } : item;
})
}
// 部门点击事件
const handleClick = async (val) =>{
// 当前部门是派出所 bb
if(userInfo?.deptLevel?.startsWith('4')) return;
if(val.includes('派出所')) return;
let info = obj.cnList.list.find(i => i.label === val);
let params = {...formSearch.value }
params.ssbmdm = info.ssbmdm;
loading.value = true;
let res = await qcckGet(params,'/mosty-gsxt/yjxx/tj/yjbmtj');
activeTab.value = true;
loading.value = false;
obj.cnList.list = (res || []).map(v=>{
return {
label: v.ssbmmc,
value: Number(v.sl),
ssbmdm:v.ssbmdm
}
})
}
// 各部门预警数量统计
const handle_gbm = async () =>{
activeTab.value = false;
let params = {...formSearch.value}
params.ssbmdm = userInfo?.deptCode;
loading.value = true;
let res = await qcckGet(params,'/mosty-gsxt/yjxx/tj/yjbmtj');
loading.value = false;
obj.cnList.list = (res || []).map(v=>{
return {
label: v.ssbmmc,
value: Number(v.sl),
ssbmdm:v.ssbmdm
}
})
}
// 预警标签统计
const handle_yjbq = async () =>{
let params = {...formSearch.value}
let res = await qcckGet(params,'/mosty-gsxt/yjxx/tj/yjbqtj');
obj.bqyjslList = (res || []).map(item => ({
label: item.yjbq,
value: Number(item.count),
}));
}
// 7类重点人员预警统计
const handle_seven = async () =>{
let params = {...formSearch.value}
let res = await qcckGet(params,'/mosty-gsxt/yjxx/tj/qlzdrtj');
obj.sevenList = (res || []).map(item => ({
label: item.zdmc,
value: Number(item.sl),
}));
}
// 处置状态统计
const handle_czzt = async () =>{
let params = {...formSearch.value}
let res = await qcckGet(params,'/mosty-gsxt/yjxx/tj/yjczzttj');
obj.czztList = (res || []).map(item => ({
name: item.zdmc,
value: Number(item.sl),
}));
}
// 表格高度计算
const tabHeightFn = () => {
boxHeight.value = window.innerHeight - searchRef.value.offsetHeight - 300;
window.onresize = function () {
tabHeightFn();
};
};
</script>
<style lang="scss" scoped>
.countBox {
height: 100%;
border-radius: 4px;
.countItem{
height: 100px;
background: transparent;
margin: 10px 0;
display: flex;
justify-content: space-between;
.item {
width: 24.5%;
background: #fff;
border-radius: 4px;
display: flex;
align-items: center;
padding: 0 20px;
box-sizing: border-box;
box-shadow: 0 0 10px rgba(0,0,0,0.05);
.left {
margin-right: 15px;
.icon-img {
width: 48px;
height: 48px;
display: block;
}
}
.center {
flex: 1;
.label {
font-size: 14px;
color: #999;
margin-bottom: 5px;
}
.value {
font-size: 24px;
font-weight: bold;
color: #333;
}
}
.divider {
width: 1px;
height: 40px;
background: #eee;
margin: 0 20px;
}
.right {
display: flex;
flex-direction: column;
justify-content: center;
font-size: 12px;
.stat-row {
display: flex;
align-items: center;
margin-bottom: 5px;
&:last-child {
margin-bottom: 0;
}
.stat-label {
color: #999;
margin-right: 10px;
}
.stat-val {
font-weight: bold;
display: flex;
align-items: center;
&.up {
color: #F56C6C;
}
&.down {
color: #00CC99;
}
}
}
}
}
}
.cntBox{
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-content: space-between;
margin-top: 10px;
// overflow: hidden;
.cnt-item{
width: 49.8%;
height: 49.5%;
background: #fff;
border-radius: 4px;
.common-title {
display: flex;
justify-content: space-between;
align-items: center;
padding: 5px 20px;
box-sizing: border-box;
.title {
font-size: 14px;
font-weight: 600;
color: #333;
position: relative;
&::after {
content: '';
position: absolute;
left: 0;
bottom: -1px;
width: 80px;
height: 4px;
background: linear-gradient(to right, #409EFF, #ffffff);
}
}
.btn-group {
display: flex;
gap: 10px;
.btn {
padding: 3px 16px;
border: 1px solid #dcdfe6;
border-radius: 4px;
font-size: 12px;
cursor: pointer;
color: #606266;
transition: all 0.3s;
user-select: none;
&.active {
background: #409EFF;
color: #fff;
border-color: #409EFF;
}
&:hover:not(.active) {
color: #409EFF;
border-color: #c6e2ff;
background-color: #ecf5ff;
}
}
}
}
.echratsBox{
height: calc(100% - 40px);
/* overflow: hidden; */
}
}
}
}
</style>

View File

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

View File

@ -13,9 +13,10 @@
</Searchs> </Searchs>
</div> </div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5"> <PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left> <template #left>
<el-button type="primary" @click="exportExl" size="small">导出</el-button> <el-button type="primary" @click="exportExl" size="small">导出</el-button>
</template> <el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</PageTitle> </PageTitle>
<!-- 表格 --> <!-- 表格 -->
<div class="tabBox tabBox_zdy" :style="{ height: (pageData.tableHeight + 40) + 'px' }"> <div class="tabBox tabBox_zdy" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
@ -64,7 +65,11 @@
<HolographicArchive v-model="assessShow" :dataList="dataList" /> <HolographicArchive v-model="assessShow" :dataList="dataList" />
<FkDialog @change="getList" lx="02" /> <FkDialog @change="getList" lx="02" />
<Information v-model="showDialog" title="发送指令" @submit='submit' @close='closeFszl'> <Information v-model="showDialog" title="发送指令" @submit='submit' @close='closeFszl'>
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj" <SemdFqzl
ref="semdFqzlRef"
:itemData="itemData"
@handleClose="handleClose"
identification="yj"
:tacitly="tacitly" /> :tacitly="tacitly" />
</Information> </Information>
<!-- 详情 --> <!-- 详情 -->
@ -369,6 +374,23 @@ const exportExl = () => {
} }
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ids}, '/mosty-gsxt/yjzxXwyj/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
</script> </script>
<style lang="scss"> <style lang="scss">

View File

@ -1,106 +0,0 @@
<template>
<div class="warning-item">
<div class="second-row">
<div class="info-item">预警人姓名<span>{{ row.xm }}</span></div>
<div class="info-item">身份证号<span>{{ row.sfzh }}</span></div>
<div class="info-item">电话<span>{{ row.dh }}</span></div>
</div>
<div class="second-row">
<div class="info-item">行为大类<span>{{ row.xldlmc }}</span></div>
<div class="info-item">行为子类<span>{{ row.xwzlmc }}</span></div>
<div class="info-item">行为次数<span>{{ row.xwcs }}</span></div>
</div>
<div class="second-row">
<div class="info-item">
标签颜色
<DictTag :value="row.bqys" :tag="false" :color="bqYs(row.bqys)"
:options="Array.isArray(props.dict.D_GS_SSYJ) ? props.dict.D_GS_SSYJ : []" />
</div>
<div class=" info-item">预警时间<span>{{ row.yjsj }}</span>
</div>
<div class="info-item">行为分值<span>{{ row.xwfz }}</span></div>
</div>
<div class="second-row">
<div class="info-item">
处置状态
<DictTag v-model:value="row.czzt"
:options="Array.isArray(props.dict.D_GSXT_YJXX_CZZT) ? props.dict.D_GSXT_YJXX_CZZT : []" />
</div>
<div class="info-item">所属部门<span>{{ row.ssbm }}</span></div>
<div class="info-item">所属县局<span>{{ row.ssxgaj }}</span></div>
</div>
<div class="second-row">
<div class="info-item">所属市局<span>{{ row.sssgaj }}</span></div>
<div class="info-item">接警员姓名<span>{{ row.jjyxm }}</span></div>
</div>
<div class="second-row">
<div class="info-item full-width">行为描述<span>{{ row.xwms }}</span></div>
</div>
</div>
</template>
<script setup>
const props = defineProps({
/** 表格行数据 */
row: {
type: Object,
default: () => ({})
},
dict: {
type: Object,
default: () => ({
D_GS_SSYJ: [],
D_GSXT_YJXX_CZZT: []
})
},
})
const bqYs = (val) => {
if (val == '01') { // 红
return '#ff0202'
} else if (val == '02') { // 橙
return '#ff8c00'
} else if (val == '03') { // 黄
return '#c2c203' // 原亮黄色ffff00
} else if (val == '04') { // 蓝
return '#0000ff'
}
}
</script>
<style lang="scss" scoped>
.warning-item {
width: 100%;
padding: 15px;
border: 1px solid #e8e8e8;
border-radius: 8px;
background-color: #fafafa;
}
.second-row {
display: flex;
flex-wrap: wrap;
gap: 20px;
margin-bottom: 10px;
}
.info-item {
flex: 0 0 calc(33.33% - 20px);
box-sizing: border-box;
display: flex;
padding: 5px 0;
color: #333;
span {
font-weight: 500;
color: #606266;
}
}
// 全宽字段
.full-width {
flex: 0 0 100% !important;
}
</style>

View File

@ -1,6 +1,10 @@
<template> <template>
<div class="warning-item" > <div class="warning-item" >
<el-divider content-position="left">预警内容</el-divider>
<div class="item-row" style="border: none;"> {{ props.row.yjnr }} </div>
<el-empty v-if="!props.row.yjnr" :image-size="0.5" description="暂无数据" />
<el-divider content-position="left">处置建议</el-divider> <el-divider content-position="left">处置建议</el-divider>
<div class="item-row" v-for="(it,idx) in list" :key="idx"> <div class="item-row" v-for="(it,idx) in list" :key="idx">
<div class="info-item"> <div class="info-item">
@ -75,6 +79,11 @@ onMounted(() => {
line-height: 36px; line-height: 36px;
padding-bottom: 10px; padding-bottom: 10px;
margin-bottom: 10px; margin-bottom: 10px;
padding-left: 2rem;
box-sizing: border-box;
&:nth-last-child(1){
border-bottom: none;
}
} }
.info-item{ .info-item{
line-height: 36px; line-height: 36px;

View File

@ -63,7 +63,7 @@ const createChartOption = (data, colors) => {
orient: 'vertical', orient: 'vertical',
left: '53%', left: '53%',
top: 'center', top: 'center',
itemGap: 40, itemGap: 20,
textStyle: { textStyle: {
color: '#fff', color: '#fff',
rich: { rich: {
@ -101,9 +101,7 @@ const createChartOption = (data, colors) => {
const value = Number(item.value) || 0; const value = Number(item.value) || 0;
const totalValue = Number(total) || 0; const totalValue = Number(total) || 0;
let percentage = (totalValue > 0 && value > 0) ? ((value / totalValue) * 100).toFixed(2) : '0.00'; let percentage = (totalValue > 0 && value > 0) ? ((value / totalValue) * 100).toFixed(2) : '0.00';
// let percentage = ((item.value / total) * 100).toFixed(2);
return `${name} ${item.value} {${item.colorType}|(${percentage}%)}` return `${name} ${item.value} {${item.colorType}|(${percentage}%)}`
} }
}, },
series: [ series: [

View File

@ -16,6 +16,7 @@
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5"> <PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left> <template #left>
<el-button type="primary" @click="exportExl" size="small">导出</el-button> <el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template> </template>
</PageTitle> </PageTitle>
<!-- 表格 --> <!-- 表格 -->
@ -352,7 +353,23 @@ const exportExl = () => {
} }
}) })
exportExlByObj(titleObj, data, '组合预警') exportExlByObj(titleObj, data, '组合预警')
}
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ids}, '/mosty-gsxt/yjzxZhyj/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
} }
</script> </script>

View File

@ -1,74 +0,0 @@
<template>
<div class="warning-item">
<div class="second-row">
<div class="info-item">姓名<span>{{ row.xm }}</span></div>
<div class="info-item">身份证号<span>{{ row.sfzh }}</span></div>
<div class="info-item">电话<span>{{ row.dh }}</span></div>
</div>
<div class="second-row">
<div class="info-item">组合大类<span>{{ row.sfdlmc }}</span></div>
<div class="info-item">组合小类<span>{{ row.sfzlmc }}</span></div>
<div class="info-item">组合次数<span>{{ row.sfcs }}</span></div>
</div>
<div class="second-row">
<div class="info-item">
标签颜色<DictTag v-model:value="row.bqys" :options="props.dict.D_GS_SSYJ" />
</div>
<div class="info-item">预警时间<span>{{ row.yjsj }}</span></div>
<div class="info-item">预警分值<span>{{ row.sffz }}</span></div>
</div>
<div class="second-row">
<div class="info-item">
处置状态<DictTag v-model:value="row.czzt" :options="props.dict.D_GSXT_YJXX_CZZT" />
</div>
<div class="info-item">所属县局<span>{{ row.ssbm }}</span></div>
</div>
</div>
</template>
<script setup>
const props = defineProps({
/** 表格行数据 */
row: {
type: Object,
default: () => ({})
},
dict: {
type: Object,
default: () => ({
D_GS_SSYJ: [],
D_GSXT_YJXX_CZZT: []
})
},
})
</script>
<style lang="scss" scoped>
.warning-item {
width: 100%;
padding: 15px;
border: 1px solid #e8e8e8;
border-radius: 8px;
background-color: #fafafa;
}
.second-row {
display: flex;
flex-wrap: wrap;
gap: 20px;
margin-bottom: 10px;
}
.info-item {
flex: 0 0 calc(33.33% - 20px);
box-sizing: border-box;
display: flex;
padding: 5px 0;
color: #333;
span {
font-weight: 500;
color: #606266;
}
}
</style>

View File

@ -1,5 +1,9 @@
<template> <template>
<div class="warning-item" > <div class="warning-item" >
<el-divider content-position="left">预警内容</el-divider>
<div class="item-row" style="border: none;"> {{ props.row.yjnr }} </div>
<el-empty v-if="!props.row.yjnr" :image-size="0.5" description="暂无数据" />
<el-divider content-position="left">处置建议</el-divider> <el-divider content-position="left">处置建议</el-divider>
<div class="item-row" v-for="(it,idx) in list" :key="idx"> <div class="item-row" v-for="(it,idx) in list" :key="idx">
<div class="info-item"> <div class="info-item">
@ -77,6 +81,11 @@ onMounted(() => {
line-height: 36px; line-height: 36px;
padding-bottom: 10px; padding-bottom: 10px;
margin-bottom: 10px; margin-bottom: 10px;
padding-left: 2rem;
box-sizing: border-box;
&:nth-last-child(1){
border-bottom: none;
}
} }
.info-item{ .info-item{
line-height: 36px; line-height: 36px;

View File

@ -1,7 +1,5 @@
<template> <template>
<div> <div>
<!-- 搜索 --> <!-- 搜索 -->
<div ref="searchBox" class="mt10"> <div ref="searchBox" class="mt10">
<Searchs :searchArr="searchConfiger" @submit="onSearch" @reset="reset" :key="pageData.keyCount"> <Searchs :searchArr="searchConfiger" @submit="onSearch" @reset="reset" :key="pageData.keyCount">
@ -17,17 +15,38 @@
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5"> <PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left> <template #left>
<el-button type="primary" @click="exportExl" size="small">导出</el-button> <el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template> </template>
</PageTitle> </PageTitle>
<!-- 表格 --> <!-- 表格 -->
<div class="tabBox tabBox_zdy" :style="{ height: (pageData.tableHeight + 40) + 'px' }"> <div class="tabBox tabBox_zdy" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight" <MyTable
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth" expand :tableData="pageData.tableData"
@chooseData="handleChooseData"> :tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
expand
@chooseData="handleChooseData"
>
<template #expand="{ props }"> <template #expand="{ props }">
<div class="expand-content" style="max-width: 100%"> <Items :row="props || {}" :dict="dict" />
<Items :row="props || {}" :dict="dict" /> </template>
</div> <template #yjTp="{ row }">
<template v-if="!row.yjTp || row.yjTp.includes('baidu')">
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="30" height="30" v-else />
</template>
<el-image v-else style="width: 30px; height:30px" :src="row.yjTp" :preview-src-list="[row.yjTp]"
show-progress>
<template #error>
<div class="image-slot error">
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="30" height="30" v-else />
</div>
</template>
</el-image>
</template> </template>
<template #yjJb="{ row }"> <template #yjJb="{ row }">
<DictTag :value="row.yjJb" :tag="false" :color="bqYs(row.yjJb)" :options="D_GS_SSYJ" /> <DictTag :value="row.yjJb" :tag="false" :color="bqYs(row.yjJb)" :options="D_GS_SSYJ" />
@ -49,7 +68,9 @@
<template #bqdl="{ row }"> <template #bqdl="{ row }">
<DictTag :value="row.bqdl" :tag="false" :options="D_GS_QLZDRLX" /> <DictTag :value="row.bqdl" :tag="false" :options="D_GS_QLZDRLX" />
</template> </template>
<template #xsd="{ row }">
{{ row.xsd }}%
</template>
<template #controls="{ row }"> <template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link> <el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
@ -106,7 +127,8 @@ const searchConfiger = ref([
{ label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" }, { label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" },
{ label: "布控时间", prop: 'startTime', placeholder: "请选择布控时间", showType: "datetimerange" }, { label: "布控时间", prop: 'startTime', placeholder: "请选择布控时间", showType: "datetimerange" },
]); ]);
const ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
const permission_sfqs = ref(false) const permission_sfqs = ref(false)
const roleCode = ref(false) const roleCode = ref(false)
@ -129,19 +151,17 @@ const pageData = reactive({
}, },
controlsWidth: 180, //操作栏宽度 controlsWidth: 180, //操作栏宽度
tableColumn: [ tableColumn: [
{ label: "状态", prop: "czzt", showSolt: true }, { label: "预警图片", prop: "yjTp", showSolt: true, width: 100 },
{ label: "预警时间", prop: "yjFssj" ,width: 160}, { label: "处置状态", prop: "czzt", showSolt: true },
{ label: "人员姓名", prop: "yjRyxm" }, { label: "预警时间", prop: "yjSj", showOverflowTooltip: true, width: 200 },
{ label: "身份证号码", prop: "yjRysfzh" ,width: 180}, { label: "姓名", prop: "yjRyxm" },
{ label: "性别", prop: "sex" ,showSolt: true,width: 60 }, { label: "性别", prop: "sex", showSolt: true, width: 80 },
// { label: "年龄", prop: "age", showSolt: true,width: 60 }, { label: "年龄", prop: "age", showSolt: true, width: 80 },
{ label: "预警级别", prop: "yjJb", showSolt: true,width: 84 }, { label: "数据来源", prop: "yjLylx", showOverflowTooltip: true, showSolt: true },
// { label: "人员类别", prop: "bqdl", showSolt: true ,width: 84}, { label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true, width: 200 },
{ label: "细类", prop: "yjbqmc",width: 84 }, { label: "预警级别", prop: "yjJb", showSolt: true },
{ label: "轨迹类别", prop: "yjLylx", showSolt: true ,width: 84}, { label: "相似度", prop: "xsd", showSolt: true },
{ label: "活动发生地", prop: "yjDz" }, { label: "所属部门", prop: "ssbm", showOverflowTooltip: true },
{ label: "接收单位", prop: "ssbm" },
{ label: "预警次数", prop: "yjCs" ,width: 84 },
] ]
}); });
@ -273,29 +293,53 @@ const handleChooseData = (val) => {
} }
const exportExl = () => { const exportExl = () => {
const titleObj = { const titleObj = {
yjRyxm: "预警人员姓名", czzt_cname: "处置状态",
yjRysfzh: "预警人员身份证号码", yjSj: "预警时间",
yjbqmc: "预警标签", yjRyxm: "姓名",
yjJrcs: "今日预警次数", nl_cname: "年龄", // IdCard(row.yjRysfzh, 3)
yjJb_name: "标签颜色", yjLylx: "数据来源",
yjNr: "预警内容", xb_cname: "性别",
yjFssj: "预警时间", yjJb_cname: "预警级别",
czzt_name: "处置状态", xsd_cname: "相似度",
ssxgaj: "所属县局", yjDz: "预警地点",
ssbm: "处置单位", yjCs: "预警次数",
yjRysjh: "布控手机号",
yjClcph: "布控车牌号",
yjRysfzh: "身份证",
} }
/** 导出【选中】的数据 (没有就全部)*/ /** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
const data = needArr.map(item => { const data = needArr.map(item => {
return { return {
...item, ...item,
nl_cname: IdCard(item.yjRysfzh, 3),
xb_cname: IdCard(item.yjRysfzh, 2),
xsd_cname: (item.xsd > 0 ? item.xsd : 0) + '%',
yjJb_name: getMultiDictVal(item.yjJb, D_GS_SSYJ), yjJb_name: getMultiDictVal(item.yjJb, D_GS_SSYJ),
czzt_name: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT), czzt_name: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
yjJb_cname: getMultiDictVal(item.yjJb, D_BZ_YJJB),
} }
}) })
exportExlByObj(titleObj, data, '预警布控') exportExlByObj(titleObj, data, '预警布控')
} }
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ids}, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
</script> </script>
<style lang="scss"> <style lang="scss">

View File

@ -1,6 +1,10 @@
<template> <template>
<div class="warning-item" > <div class="warning-item" >
<el-divider content-position="left">预警内容</el-divider>
<div class="item-row" style="border: none;"> {{ props.row.yjNr }} </div>
<el-empty v-if="!props.row.yjNr" :image-size="0.5" description="暂无数据" />
<el-divider content-position="left">处置建议</el-divider> <el-divider content-position="left">处置建议</el-divider>
<div class="item-row" v-for="(it,idx) in list" :key="idx"> <div class="item-row" v-for="(it,idx) in list" :key="idx">
<div class="info-item"> <div class="info-item">
@ -76,6 +80,11 @@ onMounted(() => {
line-height: 36px; line-height: 36px;
padding-bottom: 10px; padding-bottom: 10px;
margin-bottom: 10px; margin-bottom: 10px;
padding-left: 2rem;
box-sizing: border-box;
&:nth-last-child(1){
border-bottom: none;
}
} }
.info-item{ .info-item{
line-height: 36px; line-height: 36px;

View File

@ -8,7 +8,12 @@
<!-- 表格 --> <!-- 表格 -->
<div class="tabBox heightBox"> <div class="tabBox heightBox">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight" <MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"> expand :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<template #expand="{ props }">
<div style="max-width: 100%">
<Items :row="props || {}" />
</div>
</template>
<template #yjtp="{ row }"> <template #yjtp="{ row }">
<div v-if="!row.yjtp || row.yjtp.includes('baidu')"> <div v-if="!row.yjtp || row.yjtp.includes('baidu')">
<img src="@/assets/images/car.png" width="30" height="40" v-if="row.yjlb == 2" /> <img src="@/assets/images/car.png" width="30" height="40" v-if="row.yjlb == 2" />
@ -55,12 +60,11 @@
</template> </template>
<script setup> <script setup>
import * as XLSX from "xlsx"; import Items from "./item/items.vue"
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Search from "@/components/aboutTable/Search.vue"; import Search from "@/components/aboutTable/Search.vue";
import MyTable from "@/components/aboutTable/MyTable.vue"; import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js"; import { qcckPost } from "@/api/qcckApi.js";
import HolographicArchive from '@/views/home/components/holographicArchive.vue' import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import { reactive, ref, onMounted, getCurrentInstance, computed, watch } from "vue"; import { reactive, ref, onMounted, getCurrentInstance, computed, watch } from "vue";
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();

View File

@ -0,0 +1,47 @@
<template>
<div class="warning-item" >
<el-divider content-position="left">预警内容</el-divider>
<div class="item-row" style="border: none;text-indent: 2rem;">
{{ props.row.yjnr }}
</div>
<el-empty v-if="!props.row.yjnr" :image-size="0.5" description="暂无数据" />
</div>
</template>
<script setup>
const props = defineProps({
/** 表格行数据 */
row: {
type: Object,
default: () => ({})
},
})
</script>
<style lang="scss" scoped>
.warning-item {
width: 100%;
padding: 15px;
box-sizing: border-box;
border-radius: 8px;
background-color: #fafafa;
}
.item-row{
line-height: 36px;
}
.info-item{
line-height: 36px;
width: 100%;
.text{
display: inline-block;
width: 25%;
margin-right: 10px;
}
}
::v-deep .el-empty{
--el-empty-padding: 0px;
margin-bottom: 18px;
--el-empty-description-margin-top: 10px;
}
</style>

View File

@ -14,7 +14,8 @@
</div> </div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5"> <PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left> <template #left>
<el-button type="primary" size="small" @click="exportExl">导出</el-button> <el-button type="primary" size="small" @click="exportExl">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template> </template>
</PageTitle> </PageTitle>
<!-- 表格 --> <!-- 表格 -->
@ -366,7 +367,23 @@ const exportExl = () => {
} }
}) })
exportExlByObj(titleObj, data, '身份预警') exportExlByObj(titleObj, data, '身份预警')
}
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ids}, '/mosty-gsxt/yjzxSfyj/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
} }
</script> </script>

View File

@ -1,83 +0,0 @@
<template>
<div class="warning-item">
<div class="second-row">
<div class="info-item">预警人姓名<span>{{ row.xm }}</span></div>
<div class="info-item">身份证号<span>{{ row.sfzh }}</span></div>
<div class="info-item">电话<span>{{ row.dh }}</span></div>
</div>
<div class="second-row">
<div class="info-item">组合大类<span>{{ row.sfdlmc }}</span></div>
<div class="info-item">组合小类<span>{{ row.sfzlmc }}</span></div>
<div class="info-item">组合预警次数<span>{{ row.sfcs }}</span></div>
</div>
<div class="second-row">
<div class="info-item">
标签颜色
<DictTag v-model:value="row.bqys" :options="props.dict.D_GS_SSYJ" />
</div>
<div class="info-item">预警时间<span>{{ row.yjsj }}</span></div>
<div class="info-item">预警分值<span>{{ row.sffz }}</span></div>
</div>
<div class="second-row">
<div class="info-item">
处置状态
<DictTag v-model:value="row.czzt" :options="props.dict.D_GSXT_YJXX_CZZT" />
</div>
<div class="info-item">所属部门<span>{{ row.ssbm }}</span></div>
<div class="info-item">所属县局<span>{{ row.ssxgaj }}</span></div>
</div>
<div class="second-row">
<div class="info-item">所属市局<span>{{ row.sssgaj }}</span></div>
<div class="info-item">接警员姓名<span>{{ row.jjyxm }}</span></div>
</div>
</div>
</template>
<script setup>
import { ref, computed } from 'vue'
// import DictTag from '@/components/dictTag.vue'
const props = defineProps({
/** 表格行数据 */
row: {
type: Object,
default: () => ({})
},
dict: {
type: Object,
default: () => ({
D_GS_SSYJ: [],
D_GSXT_YJXX_CZZT: []
})
},
})
// console.log('row😃: ', props.row);
</script>
<style lang="scss" scoped>
.warning-item {
width: 100%;
padding: 15px;
border: 1px solid #e8e8e8;
border-radius: 8px;
background-color: #fafafa;
}
.second-row {
display: flex;
flex-wrap: wrap;
gap: 20px;
margin-bottom: 10px;
}
.info-item {
flex: 0 0 calc(33.33% - 20px);
box-sizing: border-box;
display: flex;
padding: 5px 0;
color: #333;
span {
font-weight: 500;
color: #606266;
}
}
</style>

View File

@ -1,6 +1,10 @@
<template> <template>
<div class="warning-item" > <div class="warning-item" >
<el-divider content-position="left">处置建议</el-divider> <el-divider content-position="left">预警内容</el-divider>
<div class="item-row" style="border: none;"> {{ props.row.yjnr }} </div>
<el-empty v-if="!props.row.yjnr" :image-size="0.5" description="暂无数据" />
<el-divider content-position="left">处置建议</el-divider>
<div class="item-row" v-for="(it,idx) in list" :key="idx"> <div class="item-row" v-for="(it,idx) in list" :key="idx">
<div class="info-item"> <div class="info-item">
<span class="text">预警人姓名{{ it.jryXm }}</span> <span class="text">预警人姓名{{ it.jryXm }}</span>
@ -27,22 +31,13 @@
</div> </div>
</template> </template>
<script setup> <script setup>
import { ref, onMounted } from 'vue' import { ref, onMounted ,defineProps} from 'vue'
import { qcckPost,qcckGet } from "@/api/qcckApi.js"; import { qcckPost,qcckGet } from "@/api/qcckApi.js";
const props = defineProps({ const props = defineProps({
/** 表格行数据 */
row: { row: {
type: Object, type: Object,
default: () => ({}) default: () => ({})
}, },
dict: {
type: Object,
default: () => ({
D_GS_SSYJ: [],
D_GSXT_YJXX_CZZT: []
})
},
}) })
const list = ref([]) const list = ref([])
const Fklist = ref([]) const Fklist = ref([])
@ -68,7 +63,15 @@ onMounted(() => {
.item-row{ .item-row{
border-bottom: 1px dashed #e8e8e8; border-bottom: 1px dashed #e8e8e8;
line-height: 36px; line-height: 36px;
padding-left: 2rem;
box-sizing: border-box;
padding-bottom: 10px;
margin-bottom: 10px;
&:nth-last-child(1){
border-bottom: none;
}
} }
.info-item{ .info-item{
line-height: 36px; line-height: 36px;
width: 100%; width: 100%;

View File

@ -15,6 +15,7 @@
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5"> <PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left> <template #left>
<el-button type="primary" @click="exportExl" size="small">导出</el-button> <el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template> </template>
</PageTitle> </PageTitle>
<!-- 表格 --> <!-- 表格 -->
@ -25,6 +26,9 @@
<template #xsd="{ row }"> <template #xsd="{ row }">
{{ `${row.xsd}%` }} {{ `${row.xsd}%` }}
</template> </template>
<template #czzt="{ row }">
<DictTag :value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
</template>
<template #yjJb="{ row }"> <template #yjJb="{ row }">
<DictTag :value="row.yjJb" :tag="false" :color="bqYs(row.yjJb)" :options="D_BZ_YJJB" /> <DictTag :value="row.yjJb" :tag="false" :color="bqYs(row.yjJb)" :options="D_BZ_YJJB" />
</template> </template>
@ -39,8 +43,7 @@
<template #controls="{ row }"> <template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link> <el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link> <el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')" <el-link type="success" @click="handleQsFk(row, '反馈')" v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<el-link type="primary" @click="openAddModel(row)">详情</el-link> <el-link type="primary" @click="openAddModel(row)">详情</el-link>
</template> </template>
</MyTable> </MyTable>
@ -133,6 +136,7 @@ const pageData = reactive({
tableColumn: [ tableColumn: [
{ label: "预警人姓名", prop: "yjRyxm" }, { label: "预警人姓名", prop: "yjRyxm" },
{ label: "相似度", prop: "xsd", showSolt: true }, { label: "相似度", prop: "xsd", showSolt: true },
{ label: "处置状态", prop: "czzt", showSolt: true },
{ label: "预警时间", prop: "yjSj", width: 200 }, { label: "预警时间", prop: "yjSj", width: 200 },
{ label: "预警标签", prop: "yjbqmc" }, { label: "预警标签", prop: "yjbqmc" },
{ label: "身份证号", prop: "yjRysfzh", width: 200 }, { label: "身份证号", prop: "yjRysfzh", width: 200 },
@ -318,7 +322,6 @@ const handleChooseData = (val) => {
selectRows.value = val selectRows.value = val
} }
const exportExl = () => { const exportExl = () => {
const titleObj = { const titleObj = {
yjRyxm: "姓名", yjRyxm: "姓名",
yjRysfzh: "身份证号", yjRysfzh: "身份证号",
@ -348,6 +351,23 @@ const exportExl = () => {
} }
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ids}, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
</script> </script>
<style> <style>

View File

@ -1,74 +0,0 @@
<template>
<div class="warning-item">
<div class="second-row">
<div class="info-item">姓名<span>{{ row.xm }}</span></div>
<div class="info-item">身份证号<span>{{ row.sfzh }}</span></div>
<div class="info-item">电话<span>{{ row.dh }}</span></div>
</div>
<div class="second-row">
<div class="info-item">组合大类<span>{{ row.sfdlmc }}</span></div>
<div class="info-item">组合小类<span>{{ row.sfzlmc }}</span></div>
<div class="info-item">组合次数<span>{{ row.sfcs }}</span></div>
</div>
<div class="second-row">
<div class="info-item">
标签颜色<DictTag v-model:value="row.bqys" :options="props.dict.D_GS_SSYJ" />
</div>
<div class="info-item">预警时间<span>{{ row.yjsj }}</span></div>
<div class="info-item">预警分值<span>{{ row.sffz }}</span></div>
</div>
<div class="second-row">
<div class="info-item">
处置状态<DictTag v-model:value="row.czzt" :options="props.dict.D_GSXT_YJXX_CZZT" />
</div>
<div class="info-item">所属县局<span>{{ row.ssbm }}</span></div>
</div>
</div>
</template>
<script setup>
const props = defineProps({
/** 表格行数据 */
row: {
type: Object,
default: () => ({})
},
dict: {
type: Object,
default: () => ({
D_GS_SSYJ: [],
D_GSXT_YJXX_CZZT: []
})
},
})
</script>
<style lang="scss" scoped>
.warning-item {
width: 100%;
padding: 15px;
border: 1px solid #e8e8e8;
border-radius: 8px;
background-color: #fafafa;
}
.second-row {
display: flex;
flex-wrap: wrap;
gap: 20px;
margin-bottom: 10px;
}
.info-item {
flex: 0 0 calc(33.33% - 20px);
box-sizing: border-box;
display: flex;
padding: 5px 0;
color: #333;
span {
font-weight: 500;
color: #606266;
}
}
</style>

View File

@ -1,5 +1,8 @@
<template> <template>
<div class="warning-item"> <div class="warning-item">
<el-divider content-position="left">预警内容</el-divider>
<div class="item-row" style="border: none;"> {{ props.row.yjNr }} </div>
<el-empty v-if="!props.row.yjNr" :image-size="0.5" description="暂无数据" />
<el-divider content-position="left">处置建议</el-divider> <el-divider content-position="left">处置建议</el-divider>
<div class="item-row"> <div class="item-row">
@ -7,7 +10,6 @@
<span class="text">预警人姓名{{ list.yjRyxm }}</span> <span class="text">预警人姓名{{ list.yjRyxm }}</span>
<span class="text"> 预警人员手机号{{ list.yjRysjh }}</span> <span class="text"> 预警人员手机号{{ list.yjRysjh }}</span>
<span class="text"> 身份证号码{{ list.yjRysfzh }}</span> <span class="text"> 身份证号码{{ list.yjRysfzh }}</span>
</div> </div>
<div class="info-item"> <div class="info-item">
<span class="text">相似度{{ list.xsd }}%</span> <span class="text">相似度{{ list.xsd }}%</span>
@ -16,7 +18,6 @@
<span class="text">预警次数{{ list.yjJrcs }}</span> <span class="text">预警次数{{ list.yjJrcs }}</span>
<span class="text">预警标签{{ list.yjbqmc }}</span> <span class="text">预警标签{{ list.yjbqmc }}</span>
<span class="text">所属部门{{ list.ssbm }}</span> <span class="text">所属部门{{ list.ssbm }}</span>
</div> </div>
<div class="info-item flex"> <div class="info-item flex">
<span class="text flex">预警类型 <span class="text flex">预警类型
@ -49,9 +50,8 @@
</div> </div>
</div> </div>
<div> <div>
<el-empty v-if="Fklist.length === 0" description="暂无数据" /> <el-empty v-if="Fklist.length === 0" :image-size="0.5" description="暂无数据" />
</div> </div>
</div> </div>
</template> </template>
<script setup> <script setup>
@ -89,7 +89,6 @@ onMounted(() => {
Fklist.value = res.fkList || [] Fklist.value = res.fkList || []
}) })
}) })
// console.log('row😃: ', props.row);
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.warning-item { .warning-item {
@ -104,21 +103,25 @@ onMounted(() => {
line-height: 36px; line-height: 36px;
padding-bottom: 10px; padding-bottom: 10px;
margin-bottom: 10px; margin-bottom: 10px;
padding-left: 2rem;
box-sizing: border-box;
&:nth-last-child(1){
border-bottom: none;
}
} }
.info-item { .info-item {
line-height: 36px; line-height: 36px;
width: 100%; width: 100%;
.text { .text {
display: inline-block; display: inline-block;
width: 25%; width: 25%;
margin-right: 10px; margin-right: 10px;
} }
}
.flex { ::v-deep .el-empty{
display: flex; --el-empty-padding: 0px;
margin-bottom: 18px;
} --el-empty-description-margin-top: 10px;
} }
</style> </style>

View File

@ -1,6 +1,5 @@
<template> <template>
<div> <div>
<!-- 搜索 --> <!-- 搜索 -->
<div ref="searchBox" class="mt10 mb10"> <div ref="searchBox" class="mt10 mb10">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"> <Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount">
@ -13,10 +12,28 @@
</template> </template>
</Search> </Search>
</div> </div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="exportExl">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</PageTitle>
<!-- 表格 --> <!-- 表格 -->
<div class="tabBox heightBox"> <div class="tabBox heightBox">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight" <MyTable expand
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"> :tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
@chooseData="handleChooseData"
>
<template #expand="{ props }">
<div style="max-width: 100%">
<Items :row="props || {}" />
</div>
</template>
<template #czzt="{ row }"> <template #czzt="{ row }">
<DictTag :value="row.czzt" :tag="false" :options="D_GSXT_YJXX_CZZT" /> <DictTag :value="row.czzt" :tag="false" :options="D_GSXT_YJXX_CZZT" />
</template> </template>
@ -53,11 +70,13 @@
</template> </template>
<script setup> <script setup>
import { getMultiDictVal } from "@/utils/dict.js"
import { exportExlByObj } from "@/utils/exportExcel.js"
import Items from '@/views/backOfficeSystem/fourColorManage/warningList/portraitWarning/item/items.vue'
import ZpForm from "./zpForm.vue"; import ZpForm from "./zpForm.vue";
import { IdCard } from '@/utils/validate.js' import { IdCard } from '@/utils/validate.js'
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Search from "@/components/aboutTable/Search.vue"; import Search from "@/components/aboutTable/Search.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import MyTable from "@/components/aboutTable/MyTable.vue"; import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js"; import { qcckGet, qcckPost } from "@/api/qcckApi.js";
@ -87,7 +106,7 @@ const pageData = reactive({
keyCount: 0, keyCount: 0,
tableConfiger: { tableConfiger: {
rowHieght: 61, rowHieght: 61,
showSelectType: "null", showSelectType: "checkBox",
loading: false, loading: false,
haveControls: true haveControls: true
}, },
@ -157,6 +176,8 @@ const pushWarning = (val) => {
dataList.value = val; dataList.value = val;
} }
const failWarning = (val) => { const failWarning = (val) => {
let ids = [val.id] let ids = [val.id]
qcckPost({ids}, '/mosty-gsxt/tbYjxx/yjbc').then((res) => { qcckPost({ids}, '/mosty-gsxt/tbYjxx/yjbc').then((res) => {
@ -167,9 +188,59 @@ const failWarning = (val) => {
}); });
} }
/** 选中项 */
const selectRows = ref([])
const handleChooseData = (val) => {
selectRows.value = val
}
const exportExl = () => {
const titleObj = {
czzt_name: "状态",
yjSj: "预警时间",
yjRyxm: "人员姓名",
yjRysfzh: "身份证号",
yjJb_name: "预警级别",
bqdl_name: "人员类别",
yjbqmc: "细类",
yjDz: "活动发生地",
ssbm: "接收单位",
yjCs: "预警次数",
}
/** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
const data = needArr.map(item => {
return {
...item,
czzt_name: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
yjJb_name: getMultiDictVal(item.yjJb, D_BZ_YJJB),
bqdl_name: getMultiDictVal(item.bqdl, D_GS_QLZDRLX),
}
})
exportExlByObj(titleObj, data, '七类重点')
}
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ids}, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
// 表格高度计算 // 表格高度计算
const tabHeightFn = () => { const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 240; pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
window.onresize = function () { tabHeightFn(); }; window.onresize = function () { tabHeightFn(); };
}; };
</script> </script>

View File

@ -0,0 +1,117 @@
<template>
<div class="dialog" v-if="dialogForm">
<div class="head_box">
<span class="title">警情{{ title }} </span>
<div>
<!-- <el-button type="primary" size="small" :loading="loading" @click="submit">保存</el-button> -->
<el-button size="small" @click="close">关闭</el-button>
</div>
</div>
<div class="form_cnt">
<FormMessage :formList="formData" v-model="listQuery" ref="elform">
<template #yjTp>
<template v-if="!listQuery.yjTp || listQuery.yjTp.includes('baidu')">
<img src="@/assets/images/car.png" width="80" height="100" v-if="listQuery.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="80" height="100" v-else />
</template>
<el-image v-else style="width: 80px; height:120px" :src="listQuery.yjTp" :preview-src-list="[listQuery.yjTp]"
show-progress>
<template #error>
<div class="image-slot error">
<img src="@/assets/images/car.png" width="80" height="100" v-if="listQuery.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="80" height="100" v-else />
</div>
</template>
</el-image>
</template>
</FormMessage>
</div>
</div>
</template>
<script setup>
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { tbYjxxGetInfo } from "@/api/yj.js";
import { IdCard } from '@/utils/validate.js'
import { ref, defineExpose, reactive, defineEmits, getCurrentInstance, watch ,onMounted,onUnmounted} from "vue";
const emit = defineEmits(["updateDate"]);
const props = defineProps({
dict: {
type: Object,
default: () => { }
}
});
const { proxy } = getCurrentInstance();
onMounted(() => {
console.log("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx------------");
})
onUnmounted(() => {
console.log('--------------------------------------');
})
const dialogForm = ref(false); //弹窗
const formData = ref([])
watch(() => props.dict, (res) => {
if (res) {
formData.value = [
{ label: "预警图片", prop: "yjTp", type: "slot" },
{ label: "预警标题", prop: "yjBt", type: "input" },
{ label: "预警人姓名", prop: "yjRyxm", type: "input" },
{ label: "年龄", prop: "nl", type: "input" },
{ label: "性别", prop: "xb", type: "input" },
{ label: "预警级别", prop: "yjJb", type: "select", options: props.dict.D_BZ_YJJB },
{ label: "相似度", prop: "xsd", type: "input" },
{ label: "预警时间", prop: "yjSj", type: "input" },
{ label: "预警地点", prop: "yjDz", type: "input" },
{ label: "预警次数", prop: "yjCs", type: "input" },
{ label: "处置状态", prop: "czzt", type: "select", options: props.dict.D_GSXT_YJXX_CZZT },
{ label: "布控手机号", prop: "yjRysjh", type: "input" },
{ label: "布控车牌号", prop: "yjClcph", type: "input" },
{ label: "布控身份证", prop: "yjRysfzh", type: "input" },
{ label: "预警标签", prop: "yjbqmc", type: "input" },
{ label: "管辖部门", prop: "ssbm", type: "input" },
{ label: "管辖县局", prop: "ssxgaj", type: "input" },
{ label: "管辖市局", prop: "sssgaj", type: "input" },
{ label: "接警员姓名", prop: "jjyxm", type: "input" },
{ label: "预警内容", prop: "yjNr", type: "textarea", width: "100%" },
]
}
}, { deep: true, immediate: true })
const listQuery = ref({}); //表单
const loading = ref(false);
const elform = ref();
const title = ref("详情");
const init = (type, row) => {
dialogForm.value = true;
tbYjxxGetInfo(row.id).then(res => {
listQuery.value = {
...res,
nl: IdCard(res.yjRysfzh, 3) || "",
xb: IdCard(res.yjRysfzh, 2) || "",
xsd: res.xsd + '%'
}
})
};
// 关闭
const close = () => {
listQuery.value = {};
loading.value = false;
dialogForm.value = false;
listQuery.value = {}
};
defineExpose({ init });
</script>
<style lang="scss" scoped>
@import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss";
::v-deep {
.el-form-item__content {
align-items: normal;
}
}
</style>

View File

@ -0,0 +1,50 @@
<template>
<el-dialog title="处置建议" v-model="visible" width="50%" v-if="visible" @close="closeHndle">
<el-form :model="form" ref="formRef" :rules="rules" label-width="120px" >
<el-form-item label="处置建议" prop="jynr">
<el-input v-model="form.jynr" placeholder="请输入处置建议" type="textarea"></el-input>
</el-form-item>
<div class="flex just-center">
<el-button type="primary" @click="okSubmit">确定</el-button>
<el-button @click="closeHndle">返回</el-button>
</div>
</el-form>
</el-dialog>
</template>
<script setup>
import { qcckPost } from "@/api/qcckApi.js";
import { ref , defineExpose} from 'vue'
const emit = defineEmits(['okSubmit'])
const visible = ref(false)
const formRef = ref()
const form = ref({})
const rules = ref({
jynr: [
{ required: true, message: '请输入处置建议', trigger: 'blur' }
]
})
const init = (row) => {
visible.value = true;
form.value.yjid = row.id;
}
const closeHndle = () => {
visible.value = false;
form.value = {};
}
const okSubmit = async () => {
await formRef.value.validate((valid) => {
if (!valid) return;
let params = {...form.value , lylx:'01'}
qcckPost(params,'/mosty-gsxt/yjxx/czjy/insert').then((res) => {
emit('okSubmit', {...form.value})
closeHndle()
})
})
}
defineExpose({
init
})
</script>

View File

@ -1,14 +1,37 @@
<template> <template>
<div> <div>
<!-- 搜索 -->
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" @reset="onReset" :key="pageData.keyCount">
<template #yjRyxms>
<el-select clearable v-model="listQuery.yjRyxm" filterable remote allow-create default-first-optionreserve-keyword placeholder="请输入布控人员" :remote-method="remoteMethod" :loading="loading" style="width: 240px">
<el-option v-for="item in opentions" :key="item.rySfzh" :label="item.ryXm" :value="item.rySfzh" />
</el-select>
</template>
</Search>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="exportExl">导出</el-button>
<el-button type="primary" size="small" @click="handleQs" v-if="permission_sfqs">签收</el-button>
</template>
</PageTitle>
<!-- 表格 --> <!-- 表格 -->
<div class="tabBox tabBox_zdy" :style="{ height: maxHeight + 130 + 'px' }"> <div class="tabBox tabBox_zdy">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="maxHeight + 'px'" <MyTable
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth" :tableData="pageData.tableData"
:expand="true" @chooseData="handleChooseData" :rowClassName="getRowClassName"> :tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
expand
@chooseData="handleChooseData"
:rowClassName="getRowClassName"
>
<template #expand="{ props }"> <template #expand="{ props }">
<div> <Items :row="props"/>
<Items :row="props" :dict="dict" />
</div>
</template> </template>
<template #yjTp="{ row }"> <template #yjTp="{ row }">
<template v-if="!row.yjTp || row.yjTp.includes('baidu')"> <template v-if="!row.yjTp || row.yjTp.includes('baidu')">
@ -34,93 +57,100 @@
<template #xsd="{ row }"> <template #xsd="{ row }">
{{ row.xsd }}% {{ row.xsd }}%
</template> </template>
<template #yjLylx="{ row }"> <template #yjLylx="{ row }">
<DictTag v-model:value="row.yjLylx" :options="props.dict.D_BZ_YJLY" /> <DictTag v-model:value="row.yjLylx" :options="D_BZ_YJLY" />
</template> </template>
<template #czzt="{ row }"> <template #czzt="{ row }">
<DictTag v-model:value="row.czzt" :options="props.dict.D_GSXT_YJXX_CZZT" /> <DictTag v-model:value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
</template> </template>
<template #yjJb="{ row }"> <template #yjJb="{ row }">
<DictTag v-model:value="row.yjJb" :options="props.dict.D_BZ_YJJB" /> <DictTag v-model:value="row.yjJb" :options="D_BZ_YJJB" />
</template> </template>
<!-- 操作 --> <!-- 操作 -->
<template #controls="{ row }"> <template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link> <el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link> <el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link> --> <!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link> -->
<!-- <el-link type="danger" @click="delDictItem(row.id)">转会商</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link> <el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')" v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link> <el-link type="success" @click="handleQsFk(row, '反馈')" v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> --> <!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<el-link type="primary" @click="openAddFrom(row)">详情</el-link> <el-link type="primary" @click="openAddFrom(row)">详情</el-link>
<el-link type="primary" @click="pushWarning(row)">指派</el-link> <el-link type="primary" @click="pushWarning(row)">指派</el-link>
</template> </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> </MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="maxHeight + 100" :pageConfiger="{ <Pages
...pageData.pageConfiger, @changeNo="changeNo"
total: pageData.total @changeSize="changeSize"
}"></Pages> :tableHeight="pageData.tableHeight"
:pageConfiger="{ ...pageData.pageConfiger, total: pageData.total }">
</Pages>
</div> </div>
</div> </div>
<HolographicArchive v-model="assessShow" :dataList="dataList" /> <HolographicArchive v-model="assessShow" :dataList="dataList" />
<FkDialog @change="getList" />
<Information v-model="showDialog" title="发送指令" @submit='submit' @close='closeFszl'> <Information v-model="showDialog" title="发送指令" @submit='submitSendZl' @close='closeFszl'>
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj" <SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj" :tacitly="tacitly" />
:tacitly="tacitly" />
</Information> </Information>
<!-- <AddFrom ref="addFrom" /> -->
<!-- 处置建议 --> <!-- 详情 -->
<AddFromz ref="addFromRefs" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLYXT }" />
<!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy> <Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<ZpForm v-model="warningShow" :dataList="dataList"/> <!-- 指派 -->
<ZpForm v-model="warningShow" :dataList="dataList"/>
<!-- 反馈 -->
<FkDialog @change="getList" />
</template> </template>
<script setup> <script setup>
import Czjy from './czjy.vue'
import { getItem, setItem } from '@/utils/storage'
import ZpForm from "@/views/backOfficeSystem/fourColorManage/warningControl/sevenWarning/zpForm.vue";
import Items from '../item/items.vue'
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import { IdCard } from '@/utils/validate.js'
import { tbYjxxGetPageList } 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 emitter from "@/utils/eventBus.js";
import { holographicProfileJump } from "@/utils/tools.js"
import { qcckGet, qcckPost } from "@/api/qcckApi.js"; import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue"; import emitter from "@/utils/eventBus.js";
import { getItem, setItem } from '@/utils/storage'
import { exportExlByObj } from "@/utils/exportExcel.js" import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js" import { getMultiDictVal } from "@/utils/dict.js"
import { tbYjxxGetPageList } from '@/api/yj.js'
import { IdCard } from '@/utils/validate.js'
import { tbGsxtZdrySelectList } from "@/api/zdr.js"
import { holographicProfileJump } from "@/utils/tools.js"
import Items from './item/items.vue'
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import Information from "@/views/home/model/information.vue";
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import ZpForm from "@/views/backOfficeSystem/fourColorManage/warningControl/sevenWarning/zpForm.vue";
import Czjy from './components/czjy.vue';
import AddFromz from './components/addFrom.vue';
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Search from "@/components/aboutTable/Search.vue";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
const ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const props = defineProps({ const { D_GSXT_YJXX_CZZT,D_GS_QLZDRLX, D_BZ_YJJB, D_BZ_YJLYXT, D_BZ_YJLY, D_BZ_XB } = proxy.$dict("D_GSXT_YJXX_CZZT",'D_GS_QLZDRLX ', "D_BZ_YJJB", "D_BZ_YJLYXT", "D_BZ_YJLY", "D_BZ_XB")
dict: { const searchBox = ref(); //
type: Object,
default: {}
},
maxHeight: {
type: [Number, String],
default: 666
},
excelTitle: {
type: String,
default: '预警信息'
}
});
const permission_sfqs = ref(false)
const roleCode = ref(false) const roleCode = ref(false)
const czjyRef = ref() const czjyRef = ref()
const itemData = ref()
const semdFqzlRef = ref()
const warningShow = ref(false)
const dataList = ref([])
const showDialog = ref(false)//
const assessShow = ref(false)//
const searchConfiger = ref(
[
{ label: "布控人员", prop: 'yjRyxms', showType: "Slot" },
{ label: "性别", prop: 'xbdm', placeholder: "请选择性别", showType: "select", options: D_BZ_XB },
{ label: "身份证", prop: 'yjRysfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "预警时间", prop: 'times', showType: "datetimerange" },
{ label: "状态", prop: 'czzt', placeholder: "请选择状态", showType: "select", options: D_GSXT_YJXX_CZZT },
// { label: "", prop: 'bqdl', placeholder: "", showType: "select", options: D_GS_QLZDRLX },
{ label: "细类", prop: 'yjbqmc', placeholder: "请输入细类", showType: "input" },
{ label: "活动发生地址", prop: 'yjDz', placeholder: "请输入活动发生地址", showType: "input" },
{ label: "接收单位", prop: 'ssbmdm',showType: "department" },
]);
const pageData = reactive({ const pageData = reactive({
tableData: [], // tableData: [], //
keyCount: 0, keyCount: 0,
@ -148,14 +178,15 @@ const pageData = reactive({
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true, width: 200 }, { label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true, width: 200 },
{ label: "预警级别", prop: "yjJb", showSolt: true }, { label: "预警级别", prop: "yjJb", showSolt: true },
{ label: "相似度", prop: "xsd", showSolt: true }, { label: "相似度", prop: "xsd", showSolt: true },
// { label: "", prop: "yjClcph", showOverflowTooltip: true }, { label: "所属部门", prop: "ssbm", showOverflowTooltip: true },
{ label: "所属部门", prop: "ssbm", showOverflowTooltip: true },
] ]
}); });
const addFromRefs = ref()
const listQuery = ref({})
/** 选中项 */ const opentions = ref([])
const loading = ref(false)
const selectRows = ref([]) const selectRows = ref([])
const permission_sfqs = ref(false)
onMounted(() => { onMounted(() => {
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : '' let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
@ -166,9 +197,20 @@ onMounted(() => {
return ['JS_666666','JS_777777','JS_888888'].includes(item.roleCode) return ['JS_666666','JS_777777','JS_888888'].includes(item.roleCode)
}) })
roleCode.value = obj ? true : false; roleCode.value = obj ? true : false;
// tabHeightFn();
tabHeightFn();
getList() getList()
}); });
//
const onReset = () => {
listQuery.value.yjRyxm = ''
}
const onSearch = (val) => {
listQuery.value = { ...listQuery.value,...val };
listQuery.value.startTime = val.times ? val.times[0] : ''
listQuery.value.endTime = val.times ? val.times[1] : ''
getList()
}
const changeNo = (val) => { const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val; pageData.pageConfiger.pageCurrent = val;
@ -178,13 +220,12 @@ const changeSize = (val) => {
pageData.pageConfiger.pageSize = val; pageData.pageConfiger.pageSize = val;
getList() getList()
} }
const ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage' const getList = () => {
const getList = (val) => {
pageData.tableConfiger.loading = true; pageData.tableConfiger.loading = true;
const promes = { const promes = {
...val, ...listQuery.value,
yjLx: '1', // yjLx: '14', //
pageCurrent: pageData.pageConfiger.pageCurrent, pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize pageSize: pageData.pageConfiger.pageSize
} }
@ -202,14 +243,30 @@ const getList = (val) => {
pageData.tableConfiger.loading = false; pageData.tableConfiger.loading = false;
}) })
} }
//
const assessShow = ref(false)
const dataList = ref()
const pushAssess = (val) => { const remoteMethod = (query) => {
return holographicProfileJump(val.yjLx,val) // if (!query) return opentions.value = [];
// assessShow.value = true; loading.value = true
// dataList.value = val; tbGsxtZdrySelectList({ ryXm: query }).then(res => {
opentions.value = res || [];
loading.value = false;
}).catch(() => {
loading.value = false
})
} }
const getRowClassName = (row) => {
if (!row.row.yjJb) return '';
const level = String(row.row.yjJb);
if (level === '01' || level.includes('红') || level.includes('高')) return 'warning-level-01';
if (level === '02' || level.includes('橙') || level.includes('中')) return 'warning-level-02';
if (level === '03' || level.includes('黄') || level.includes('低')) return 'warning-level-03';
if (level === '04' || level.includes('蓝')) return 'warning-level-04';
return '';
};
// //
const handleQsFk = (val, type) => { const handleQsFk = (val, type) => {
switch (type) { switch (type) {
@ -227,69 +284,14 @@ const handleQsFk = (val, type) => {
emitter.emit("openFkDialog", { id: val.id, type }); emitter.emit("openFkDialog", { id: val.id, type });
break; break;
} }
} }
const handleCzjy = (row) => {
czjyRef.value.init(row)
}
//
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 addFrom = ref()
const openAddFrom = (row) => {
emitter.emit('openAddFrom', row)
}
//
const getRowClassName = (row) => {
if (!row.row.yjJb) return '';
const level = String(row.row.yjJb);
if (level === '01' || level.includes('红') || level.includes('高')) return 'warning-level-01';
if (level === '02' || level.includes('橙') || level.includes('中')) return 'warning-level-02';
if (level === '03' || level.includes('黄') || level.includes('低')) return 'warning-level-03';
if (level === '04' || level.includes('蓝')) return 'warning-level-04';
return '';
};
//
const warningShow = ref(false)
const pushWarning = (val) => {
warningShow.value = true
dataList.value = val;
}
// //
// const tabHeightFn = () => {
// pageData.tableHeight = window.innerHeight - 430;
// window.onresize = function () {
// tabHeightFn();
// };
// };
const handleChooseData = (val) => { const handleChooseData = (val) => {
selectRows.value = val selectRows.value = val
} }
const exportExl = () => {
//
const exportExl = () => {
const titleObj = { const titleObj = {
czzt_cname: "处置状态", czzt_cname: "处置状态",
yjSj: "预警时间", yjSj: "预警时间",
@ -304,7 +306,6 @@ const exportExl = () => {
yjRysjh: "布控手机号", yjRysjh: "布控手机号",
yjClcph: "布控车牌号", yjClcph: "布控车牌号",
yjRysfzh: "身份证", yjRysfzh: "身份证",
} }
/** 导出【选中】的数据 (没有就全部)*/ /** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
@ -314,20 +315,73 @@ const exportExl = () => {
nl_cname: IdCard(item.yjRysfzh, 3), nl_cname: IdCard(item.yjRysfzh, 3),
xb_cname: IdCard(item.yjRysfzh, 2), xb_cname: IdCard(item.yjRysfzh, 2),
xsd_cname: (item.xsd > 0 ? item.xsd : 0) + '%', xsd_cname: (item.xsd > 0 ? item.xsd : 0) + '%',
czzt_cname: getMultiDictVal(item.czzt, props.dict.D_GSXT_YJXX_CZZT), czzt_cname: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
yjJb_cname: getMultiDictVal(item.yjJb, props.dict.D_BZ_YJJB), yjJb_cname: getMultiDictVal(item.yjJb, D_BZ_YJJB),
} }
}) })
exportExlByObj(titleObj, data, props.excelTitle || '人像预警.xlsx') exportExlByObj(titleObj, data, '无人机预警.xlsx')
}
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ids}, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
//
const pushAssess = (val) => {
return holographicProfileJump(val.yjLx,val)
}
const showDetail = (item) => {
showDialog.value = true;
itemData.value = item
}
const handleClose = () => {
showDialog.value = false;
}
const submitSendZl = () => {
semdFqzlRef.value.getsendFqzl()
}
const closeFszl = () => {
semdFqzlRef.value.close()
}
//
const handleCzjy = (row) => {
czjyRef.value.init(row)
}
//
const openAddFrom = (val) => {
addFromRefs.value.init('add', val)
} }
defineExpose({ //
exportExl, const pushWarning = (val) => {
getList warningShow.value = true
}) dataList.value = val;
}
//
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
window.onresize = function () {
tabHeightFn();
};
};
</script> </script>
<style lang="scss"> <style lang="scss">

View File

@ -0,0 +1,92 @@
<template>
<div class="warning-item" >
<el-divider content-position="left">预警内容</el-divider>
<div class="item-row" style="border: none;"> {{ props.row.yjNr }} </div>
<el-empty v-if="!props.row.yjNr" :image-size="0.5" description="暂无数据" />
<el-divider content-position="left">处置建议</el-divider>
<div class="item-row" v-for="(it,idx) in list" :key="idx">
<div class="info-item">
<span class="text">预警人姓名{{ it.jryXm }}</span>
<span class="text">建议时间{{ it.jysj }}</span>
<span class="text">所属部门{{ it.ssbm }}</span>
</div>
<div class="info-item">建议内容<span>{{ it.jynr || '暂无' }}</span></div>
</div>
<div>
<el-empty v-if="list.length === 0" :image-size="0.5" description="暂无数据" />
</div>
<el-divider content-position="left">反馈内容</el-divider>
<div class="item-row" v-for="(it,idx) in Fklist" :key="idx">
<div class="info-item">
<span class="text">处置地址{{ it.czdz }}</span>
<span class="text">处置时间{{ it.czsj }}</span>
</div>
<div class="info-item">
<span class="text">常控不尿检理由<span>{{ it.ckbnjly || '暂无' }}</span></span>
<span class="text">常控处置反馈补充信息<span>{{ it.ckczbcxx || '暂无' }}</span></span>
<span class="text">常控立线侦察评估<span>{{ it.cklxzcpg || '暂无' }}</span></span>
<span class="text">常控立线侦察评估依据<span>{{ it.cklxzcpgyj || '暂无' }}</span></span>
</div>
</div>
<div>
<el-empty v-if="Fklist.length === 0" :image-size="0.5" description="暂无数据" />
</div>
</div>
</template>
<script setup>
import { ref, onMounted,defineProps } from 'vue'
import { qcckPost,qcckGet } from "@/api/qcckApi.js";
const props = defineProps({
/** 表格行数据 */
row: {
type: Object,
default: () => ({})
},
})
const list = ref([])
const Fklist = ref([])
onMounted(() => {
if(!props.row.id) return;
qcckPost({yjid: props.row.id},'/mosty-gsxt/yjxx/czjy/getPageList').then((res) => {
list.value = res.records || []
})
qcckGet({},'/mosty-gsxt/tbYjxx/getInfo/'+ props.row.id).then((res) => {
Fklist.value = res.fkList || []
})
})
</script>
<style lang="scss" scoped>
.warning-item {
width: 100%;
padding: 15px;
box-sizing: border-box;
border-radius: 8px;
background-color: #fafafa;
}
.item-row{
border-bottom: 1px dashed #e8e8e8;
line-height: 36px;
padding-left: 2rem;
box-sizing: border-box;
&:last-nth-child(1){
border-bottom: none;
}
}
.info-item{
line-height: 36px;
width: 100%;
.text{
display: inline-block;
width: 25%;
margin-right: 10px;
}
}
::v-deep .el-empty{
--el-empty-padding: 0px;
margin-bottom: 18px;
--el-empty-description-margin-top: 10px;
}
</style>

View File

@ -11,14 +11,14 @@
<FormMessage :formList="formData" v-model="listQuery" ref="elform"> <FormMessage :formList="formData" v-model="listQuery" ref="elform">
<template #yjTp> <template #yjTp>
<template v-if="!listQuery.yjTp || listQuery.yjTp.includes('baidu')"> <template v-if="!listQuery.yjTp || listQuery.yjTp.includes('baidu')">
<img src="@/assets/images/car.png" width="80" height="100" v-if="listQuery.yjlx == 2" /> <img src="@/assets/images/car.png" width="80" height="100" v-if="listQuery.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="80" height="100" v-else /> <img src="@/assets/images/default_male.png" width="80" height="100" v-else />
</template> </template>
<el-image v-else style="width: 80px; height:120px" :src="listQuery.yjTp" :preview-src-list="[listQuery.yjTp]" <el-image v-else style="width: 80px; height:120px" :src="listQuery.yjTp" :preview-src-list="[listQuery.yjTp]"
show-progress> show-progress>
<template #error> <template #error>
<div class="image-slot error"> <div class="image-slot error">
<img src="@/assets/images/car.png" width="80" height="100" v-if="listQuery.yjlx == 2" /> <img src="@/assets/images/car.png" width="80" height="100" v-if="listQuery.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="80" height="100" v-else /> <img src="@/assets/images/default_male.png" width="80" height="100" v-else />
</div> </div>
</template> </template>

View File

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

View File

@ -1,90 +1,144 @@
<template> <template>
<div> <div>
<!-- 搜索 --> <!-- 搜索 -->
<Search :searchArr="searchConfiger" @submit="onSearch" @reset="onReset" :key="pageData.keyCount"> <div ref="searchBox">
<template #yjRyxms> <Search :searchArr="searchConfiger" @submit="onSearch" @reset="onReset" :key="pageData.keyCount">
<el-select clearable v-model="listQuery.yjRyxm" filterable remote allow-create default-first-optionreserve-keyword placeholder="请输入布控人员" :remote-method="remoteMethod" :loading="loading" style="width: 240px"> <template #yjRyxms>
<el-option v-for="item in opentions" :key="item.rySfzh" :label="item.ryXm" :value="item.rySfzh" /> <el-select clearable v-model="listQuery.yjRyxm" filterable remote allow-create default-first-optionreserve-keyword placeholder="请输入布控人员" :remote-method="remoteMethod" :loading="loading" style="width: 240px">
</el-select> <el-option v-for="item in opentions" :key="item.rySfzh" :label="item.ryXm" :value="item.rySfzh" />
</template> </el-select>
</Search> </template>
</Search>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5"> <PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left> <template #left>
<el-button type="primary" size="small" @click="exportExl">导出</el-button> <el-button type="primary" size="small" @click="exportExl">导出</el-button>
<el-button type="primary" size="small" @click="handleQs" v-if="permission_sfqs">签收</el-button>
</template> </template>
</PageTitle> </PageTitle>
<!-- 表格 --> <!-- 表格 -->
<div class="tabBox" :style="{ height: (pageData.tableHeight + 40) + 'px', paddingTop: '10px' }"> <div class="tabBox tabBox_zdy">
<!-- <div style="padding:0 10px;"> <el-button type="primary" @click="exportExcel">导出</el-button></div> --> <MyTable
<LocalWarning :maxHeight="pageData.tableHeight - 160" ref="localWarningRef" :tableData="pageData.tableData"
:dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLYXT, D_BZ_YJLY }" excelTitle="人像预警" /> :tableColumn="pageData.tableColumn"
</div> :tableHeight="pageData.tableHeight"
</div> :key="pageData.keyCount"
<el-dialog v-model="showDc" title="导出预警" width="80%"> :tableConfiger="pageData.tableConfiger"
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="500" :controlsWidth="pageData.controlsWidth"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"> expand
<template #yjTp="{ row }"> @chooseData="handleChooseData"
<template v-if="!row.yjTp || row.yjTp.includes('baidu')"> :rowClassName="getRowClassName"
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" /> >
<img src="@/assets/images/default_male.png" width="30" height="30" v-else /> <template #expand="{ props }">
<Items :row="props"/>
</template> </template>
<el-image v-else style="width: 30px; height:30px" :src="row.yjTp" :preview-src-list="[row.yjTp]" show-progress> <template #yjTp="{ row }">
<template #error> <template v-if="!row.yjTp || row.yjTp.includes('baidu')">
<div class="image-slot error"> <img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" /> <img src="@/assets/images/default_male.png" width="30" height="30" v-else />
<img src="@/assets/images/default_male.png" width="30" height="30" v-else />
</div>
</template> </template>
</el-image> <el-image v-else style="width: 30px; height:30px" :src="row.yjTp" :preview-src-list="[row.yjTp]"
</template> show-progress>
<template #nl="{ row }"> <template #error>
{{ IdCard(row.yjRysfzh, 3) }} <div class="image-slot error">
</template> <img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
<template #sxd="{ row }"> {{ row.sxd }}% </template> <img src="@/assets/images/default_male.png" width="30" height="30" v-else />
<template #yjLylx="{ row }"> </div>
<DictTag v-model:value="row.yjLylx" :options="D_BZ_YJLY" /> </template>
</template> </el-image>
<template #xb="{ row }"> </template>
{{ IdCard(row.yjRysfzh, 2) }} <template #nl="{ row }">
</template> {{ IdCard(row.yjRysfzh, 3) }}
<template #czzt="{ row }"> </template>
<DictTag v-model:value="row.czzt" :options="D_GSXT_YJXX_CZZT" /> <template #xb="{ row }">
</template> {{ IdCard(row.yjRysfzh, 2) }}
<template #yjJb="{ row }"> </template>
<DictTag v-model:value="row.yjJb" :options="D_BZ_YJJB" /> <template #xsd="{ row }">
</template> {{ row.xsd }}%
<!-- 操作 --> </template>
</MyTable> <template #yjLylx="{ row }">
<template #footer> <DictTag v-model:value="row.yjLylx" :options="D_BZ_YJLY" />
<div class="dialog-footer"> </template>
<el-button @click="showDc = false">关闭</el-button> <template #czzt="{ row }">
<el-button type="primary" @click="handleExport"> <DictTag v-model:value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
导出 </template>
</el-button> <template #yjJb="{ row }">
</div> <DictTag v-model:value="row.yjJb" :options="D_BZ_YJJB" />
</template> </template>
</el-dialog> <!-- 操作 -->
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')" v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<el-link type="primary" @click="openAddFrom(row)">详情</el-link>
<el-link type="primary" @click="pushWarning(row)">指派</el-link>
</template>
</MyTable>
<Pages
@changeNo="changeNo"
@changeSize="changeSize"
:tableHeight="pageData.tableHeight"
:pageConfiger="{ ...pageData.pageConfiger, total: pageData.total }">
</Pages>
</div>
</div>
<HolographicArchive v-model="assessShow" :dataList="dataList" />
<Information v-model="showDialog" title="发送指令" @submit='submitSendZl' @close='closeFszl'>
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj" :tacitly="tacitly" />
</Information>
<!-- 详情 -->
<AddFromz ref="addFromRefs" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLYXT }" /> <AddFromz ref="addFromRefs" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLYXT }" />
<!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<!-- 指派 -->
<ZpForm v-model="warningShow" :dataList="dataList"/>
<!-- 反馈 -->
<FkDialog @change="getList" />
</template> </template>
<script setup> <script setup>
import * as MOSTY from "@/components/MyComponents/index"; import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import PageTitle from "@/components/aboutTable/PageTitle.vue"; import emitter from "@/utils/eventBus.js";
import Search from "@/components/aboutTable/Search.vue"; import { getItem, setItem } from '@/utils/storage'
import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js"
import { tbYjxxGetPageList } from '@/api/yj.js'
import { IdCard } from '@/utils/validate.js' import { IdCard } from '@/utils/validate.js'
import { tbGsxtZdrySelectList } from "@/api/zdr.js" import { tbGsxtZdrySelectList } from "@/api/zdr.js"
import { tbYjxxQueryYjxx } from "@/api/yj.js"; import { holographicProfileJump } from "@/utils/tools.js"
import LocalWarning from "./components/localWarning.vue"; import Items from './item/items.vue'
import MyTable from "@/components/aboutTable/MyTable.vue"; import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue"; import Information from "@/views/home/model/information.vue";
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import ZpForm from "@/views/backOfficeSystem/fourColorManage/warningControl/sevenWarning/zpForm.vue";
import Czjy from './components/czjy.vue';
import AddFromz from './components/addFrom.vue'; import AddFromz from './components/addFrom.vue';
import FileSaver from "file-saver"; import MyTable from "@/components/aboutTable/MyTable.vue";
import emitter from "@/utils/eventBus.js"; import Pages from "@/components/aboutTable/Pages.vue";
import * as XLSX from "xlsx"; import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Search from "@/components/aboutTable/Search.vue";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
const ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const { D_GSXT_YJXX_CZZT,D_GS_QLZDRLX, D_BZ_YJJB, D_BZ_YJLYXT, D_BZ_YJLY, D_BZ_XB } = proxy.$dict("D_GSXT_YJXX_CZZT",'D_GS_QLZDRLX ', "D_BZ_YJJB", "D_BZ_YJLYXT", "D_BZ_YJLY", "D_BZ_XB") const { D_GSXT_YJXX_CZZT,D_GS_QLZDRLX, D_BZ_YJJB, D_BZ_YJLYXT, D_BZ_YJLY, D_BZ_XB } = proxy.$dict("D_GSXT_YJXX_CZZT",'D_GS_QLZDRLX ', "D_BZ_YJJB", "D_BZ_YJLYXT", "D_BZ_YJLY", "D_BZ_XB")
const searchBox = ref(); //搜索框 const searchBox = ref(); //搜索框
const roleCode = ref(false)
const czjyRef = ref()
const itemData = ref()
const semdFqzlRef = ref()
const warningShow = ref(false)
const dataList = ref([])
const showDialog = ref(false)// 发送指令
const assessShow = ref(false)// 全息档案
const searchConfiger = ref( const searchConfiger = ref(
[ [
{ label: "布控人员", prop: 'yjRyxms', showType: "Slot" }, { label: "布控人员", prop: 'yjRyxms', showType: "Slot" },
@ -97,17 +151,14 @@ const searchConfiger = ref(
{ label: "活动发生地址", prop: 'yjDz', placeholder: "请输入活动发生地址", showType: "input" }, { label: "活动发生地址", prop: 'yjDz', placeholder: "请输入活动发生地址", showType: "input" },
{ label: "接收单位", prop: 'ssbmdm',showType: "department" }, { label: "接收单位", prop: 'ssbmdm',showType: "department" },
]); ]);
const pageData = reactive({ const pageData = reactive({
/** 表格高度 */
tableHeight: 600,
tableData: [], //表格数据 tableData: [], //表格数据
keyCount: 0, keyCount: 0,
tableConfiger: { tableConfiger: {
rowHieght: 61, rowHieght: 61,
showSelectType: "null", showSelectType: "checkBox",
loading: false, loading: false,
haveControls: false haveControls: true
}, },
total: 0, total: 0,
@ -115,40 +166,41 @@ const pageData = reactive({
pageSize: 20, pageSize: 20,
pageCurrent: 1 pageCurrent: 1
}, //分页 }, //分页
controlsWidth: 160, //操作栏宽度 controlsWidth: 250, //操作栏宽度
tableColumn: [ tableColumn: [
{ label: "相似度", prop: "sxd", showSolt: true }, { label: "预警图片", prop: "yjTp", showSolt: true, width: 100 },
{ label: "预警图片", prop: "yjTp", showSolt: true },
{ label: "处置状态", prop: "czzt", showSolt: true }, { label: "处置状态", prop: "czzt", showSolt: true },
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true }, { label: "预警时间", prop: "yjSj", showOverflowTooltip: true, width: 200 },
{ label: "姓名", prop: "yjRyxm" }, { label: "姓名", prop: "yjRyxm" },
{ label: "年龄", prop: "nl", showSolt: true ,width: 60}, { label: "性别", prop: "xb", showSolt: true, width: 80 },
{ label: "数据来源", prop: "yjLylx", showOverflowTooltip: true, showSolt: D_BZ_YJLY }, { label: "年龄", prop: "nl", showSolt: true, width: 80 },
{ label: "性别", prop: "xb", showSolt: true,width: 60 }, { label: "数据来源", prop: "yjLylx", showOverflowTooltip: true, showSolt: true },
{ label: "预警级别", prop: "yjJb", showSolt: true,width: 84 }, { label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true, width: 200 },
{ label: "预警地点", prop: "yjDz", showOverflowTooltip: true }, { label: "预警级别", prop: "yjJb", showSolt: true },
{ label: "预警次数", prop: "yjCs", showOverflowTooltip: true,width: 84 }, { label: "相似度", prop: "xsd", showSolt: true },
{ label: "布控手机号", prop: "yjRysjh", showOverflowTooltip: true }, { label: "所属部门", prop: "ssbm", showOverflowTooltip: true },
// { label: "布控车牌号", prop: "yjClcph", showOverflowTooltip: true },
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true },
] ]
}); });
const showDc = ref(false) const addFromRefs = ref()
const activeName = ref('local')
const addFromRefs = ref(null)
onMounted(() => {
tabHeightFn();
emitter.on('openAddFrom', (val) => {
console.log(addFromRefs.value);
if (addFromRefs.value) {
addFromRefs.value.init('add', val)
}
// addFromRefs.value.init('add', val)
})
});
const listQuery = ref({}) const listQuery = ref({})
const opentions = ref([]) const opentions = ref([])
const localWarningRef = ref(null); const loading = ref(false)
const selectRows = ref([])
const permission_sfqs = ref(false)
onMounted(() => {
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
permission_sfqs.value = str.startsWith('2'||'3') ? false : true;
let rols = getItem('roleList') ? getItem('roleList'):[]
let obj = rols.find(item => {
return ['JS_666666','JS_777777','JS_888888'].includes(item.roleCode)
})
roleCode.value = obj ? true : false;
tabHeightFn();
getList()
});
// 搜索 // 搜索
const onReset = () => { const onReset = () => {
listQuery.value.yjRyxm = '' listQuery.value.yjRyxm = ''
@ -157,11 +209,43 @@ const onSearch = (val) => {
listQuery.value = { ...listQuery.value,...val }; listQuery.value = { ...listQuery.value,...val };
listQuery.value.startTime = val.times ? val.times[0] : '' listQuery.value.startTime = val.times ? val.times[0] : ''
listQuery.value.endTime = val.times ? val.times[1] : '' listQuery.value.endTime = val.times ? val.times[1] : ''
localWarningRef.value.getList(listQuery.value) getList()
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList()
}
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList()
}
const getList = () => {
pageData.tableConfiger.loading = true;
const promes = {
...listQuery.value,
yjLx: '1', // 人员预警
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize
}
delete promes.times;
tbYjxxGetPageList(promes).then((res) => {
pageData.tableData = res.records.map(item => {
return {
...item,
yjTp: item.yjlx == '01' ? item.yjTp.replace(ORDIMG, IMGYM) : item.yjTp
}
}) || [];
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
})
} }
const loading = ref(false)
const remoteMethod = (query) => { const remoteMethod = (query) => {
if (!query) return opentions.value = []; if (!query) return opentions.value = [];
loading.value = true loading.value = true
@ -172,168 +256,183 @@ const remoteMethod = (query) => {
loading.value = false loading.value = false
}) })
} }
// // 表格高度计算
// const tabHeightFn = () => {
// pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
// window.onresize = function () {
// tabHeightFn();
// };
// };
// 搜索栏
const getRowClassName = (row) => {
if (!row.row.yjJb) return '';
const level = String(row.row.yjJb);
if (level === '01' || level.includes('红') || level.includes('高')) return 'warning-level-01';
if (level === '02' || level.includes('橙') || level.includes('中')) return 'warning-level-02';
if (level === '03' || level.includes('黄') || level.includes('低')) return 'warning-level-03';
if (level === '04' || level.includes('蓝')) return 'warning-level-04';
return '';
};
// 处理签收
const handleQsFk = (val, type) => {
switch (type) {
case '签收':
proxy.$confirm("是否确定要签收?", "警告", { type: "warning" }).then(() => {
qcckPost({ id: val.id }, "/mosty-gsxt/tbYjxx/yjqs").then(() => {
val.czzt = '02'
getList()
proxy.$message({ type: "success", message: "签收成功" });
});
})
break;
case '反馈':
case '查看反馈':
emitter.emit("openFkDialog", { id: val.id, type });
break;
}
}
const handleChooseData = (val) => {
selectRows.value = val
}
// 导出
const exportExl = () => {
const titleObj = {
czzt_cname: "处置状态",
yjSj: "预警时间",
yjRyxm: "姓名",
nl_cname: "年龄", // IdCard(row.yjRysfzh, 3)
yjLylx: "数据来源",
xb_cname: "性别",
yjJb_cname: "预警级别",
xsd_cname: "相似度",
yjDz: "预警地点",
yjCs: "预警次数",
yjRysjh: "布控手机号",
yjClcph: "布控车牌号",
yjRysfzh: "身份证",
}
/** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
const data = needArr.map(item => {
return {
...item,
nl_cname: IdCard(item.yjRysfzh, 3),
xb_cname: IdCard(item.yjRysfzh, 2),
xsd_cname: (item.xsd > 0 ? item.xsd : 0) + '%',
czzt_cname: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
yjJb_cname: getMultiDictVal(item.yjJb, D_BZ_YJJB),
}
})
exportExlByObj(titleObj, data, '人像预警.xlsx')
}
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ids}, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
// 全息档案跳转
const pushAssess = (val) => {
return holographicProfileJump(val.yjLx,val)
}
const showDetail = (item) => {
showDialog.value = true;
itemData.value = item
}
const handleClose = () => {
showDialog.value = false;
}
const submitSendZl = () => {
semdFqzlRef.value.getsendFqzl()
}
const closeFszl = () => {
semdFqzlRef.value.close()
}
// 处置建议
const handleCzjy = (row) => {
czjyRef.value.init(row)
}
// 详情
const openAddFrom = (val) => {
addFromRefs.value.init('add', val)
}
// 指派
const pushWarning = (val) => {
warningShow.value = true
dataList.value = val;
}
// 表格高度计算 // 表格高度计算
const tabHeightFn = () => { const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - (searchBox.value?.offsetHeight || 0) - 220; pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
window.onresize = function () { window.onresize = function () {
tabHeightFn(); tabHeightFn();
}; };
}; };
// 导出
const exportExcel = () => {
const promes = {
yjRyxm: listQuery.value.yjRyxm,
yjlx: listQuery.value.yjlx,
startTime: listQuery.value.time ? listQuery.value.time[0] : '',
endTime: listQuery.value.time ? listQuery.value.time[1] : '',
}
tbYjxxQueryYjxx(promes).then(res => {
pageData.tableData = res
showDc.value = true
})
}
// 处理Excel导出
const handleExport = () => {
// 创建一个临时表格用于导出
const tempTable = document.createElement('table');
// 创建表头
const thead = document.createElement('thead');
const headerRow = document.createElement('tr');
// 添加序号列
const indexTh = document.createElement('th');
indexTh.textContent = '序号';
headerRow.appendChild(indexTh);
// 添加其他列头
pageData.tableColumn.forEach(column => {
const th = document.createElement('th');
th.textContent = column.label;
headerRow.appendChild(th);
});
thead.appendChild(headerRow);
tempTable.appendChild(thead);
// 创建表体
const tbody = document.createElement('tbody');
// 处理表格数据
pageData.tableData.forEach((row, index) => {
const tr = document.createElement('tr');
// 添加序号
const indexTd = document.createElement('td');
indexTd.textContent = index + 1;
tr.appendChild(indexTd);
// 添加其他单元格数据
pageData.tableColumn.forEach(column => {
const td = document.createElement('td');
// 处理自定义插槽的情况
if (column.showSolt) {
if (column.prop === 'yjTp') {
// 照片字段只显示文字描述
td.textContent = '有照片';
} else if (column.prop === 'nl') {
// 年龄字段
td.textContent = IdCard(row.yjRysfzh, 3);
} else if (column.prop === 'xb') {
// 性别字段
td.textContent = IdCard(row.yjRysfzh, 2);
} else if (column.prop === 'xsd') {
// 相似度字段
td.textContent = '90%';
} else {
// 其他字段
td.textContent = row[column.prop] || '';
}
} else {
// 普通字段
td.textContent = row[column.prop] || '';
}
tr.appendChild(td);
});
tbody.appendChild(tr);
});
tempTable.appendChild(tbody);
// 执行Excel导出
let xlsxParam = { raw: true };
let wb = XLSX.utils.table_to_book(tempTable, xlsxParam);
let wbout = XLSX.write(wb, {
bookType: "xlsx",
bookSST: true,
type: "array"
});
// 保存文件
try {
const exportTime = new Date().toLocaleString('zh-CN').replace(/\//g, '-').replace(/:/g, '-');
FileSaver.saveAs(
new Blob([wbout], { type: "application/octet-stream" }),
`预警数据导出_${exportTime}.xlsx`
);
showDc.value = false;
} catch (e) {
console.error('导出Excel失败:', e);
}
}
const exportExl = () => {
localWarningRef.value && localWarningRef.value.exportExl()
};
</script> </script>
<style lang="scss" scoped>
.filter-title {
display: flex;
align-items: center;
margin-bottom: 10px;
width: 100%;
background: linear-gradient(to right, #9ed7ff, #e6f0f8);
padding: 5px 15px;
.filter-label { <style lang="scss">
display: flex;
align-items: center;
font-weight: bold;
color: #000;
margin-right: 10px;
white-space: nowrap;
}
.filter-line {
flex: 1;
height: 1px;
background-color: #ccc;
}
}
::v-deep .el-table--fit {
height: calc(100% - 50px) !important;
}
</style>
<style>
.el-loading-mask { .el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important; background: rgba(0, 0, 0, 0.5) !important;
} }
.searchBox { /* 预警级别行样式 */
background-color: #fff; .warning-level-01 {
margin-bottom: 10px; background-color: rgba(255, 2, 2, 0.1) !important;
}
.warning-level-01:hover {
background-color: rgba(255, 2, 2, 0.15) !important;
}
.warning-level-02 {
background-color: rgba(255, 140, 0, 0.1) !important;
}
.warning-level-02:hover {
background-color: rgba(255, 140, 0, 0.15) !important;
}
.warning-level-03 {
background-color: rgba(255, 210, 8, 0.1) !important;
}
.warning-level-03:hover {
background-color: rgba(255, 210, 8, 0.15) !important;
}
.warning-level-04 {
background-color: rgba(0, 0, 255, 0.1) !important;
}
.warning-level-04:hover {
background-color: rgba(0, 0, 255, 0.15) !important;
}
/* 确保行样式应用到所有单元格 */
.warning-level-01 td,
.warning-level-02 td,
.warning-level-03 td,
.warning-level-04 td {
background-color: transparent !important;
}
.tabBox_zdy{
.el-table--fit {
overflow: unset !important;
}
} }
</style> </style>

View File

@ -1,197 +0,0 @@
<template>
<div class="warning-item">
<!-- 第一行图片姓名年龄性别 -->
<div class="first-row">
<div class="avatar-container">
<template v-if="!data.yjTp || data.yjTp.includes('baidu')">
<img src="@/assets/images/car.png" width="60" height="70" v-if="data.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="60" height="70" v-else />
</template>
<el-image v-else style="width: 60px; height:70px" :src="data.yjTp" :preview-src-list="[data.yjTp]"
show-progress>
<template #error>
<div class="image-slot error">
<img src="@/assets/images/car.png" width="60" height="70" v-if="data.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="60" height="70" v-else />
</div>
</template>
</el-image>
</div>
<div class="basic-info">
<div class="info-items name">姓名<span>{{ data.yjRyxm }}</span></div>
<div class="info-items gender">性别<span> {{ IdCard(data.yjRysfzh, 3) }}</span></div>
<div class="info-items age">年龄<span> {{ IdCard(data.yjRysfzh, 2) }}</span></div>
</div>
</div>
<!-- 第二行其他所有字段 -->
<div class="second-row">
<div class="info-item title">预警标题<span>{{ data.yjBt }}</span></div>
<div class="info-item level">
预警级别
<DictTag :color="bqYs(data.yjJb)" :tag="false" v-model:value="data.yjJb" :options="props.dict.D_BZ_YJJB" />
<!-- <span :class="getLevelClass(data.yjJb)">{{ data.yjJb || data.yjLx }}</span> -->
</div>
<div class="info-item similarity">相似度<span>{{ data.xsd }}%</span></div>
</div>
<div class="second-row">
<div class="info-item time">预警时间<span>{{ data.yjSj }}</span></div>
<div class="info-item location">预警地点<span>{{ data.yjDz }}</span></div>
<div class="info-item count">预警次数<span>{{ data.yjCs }}</span></div>
</div>
<div class="second-row">
<div class="info-item status">
处置状态 <DictTag v-model:value="data.czzt" :options="props.dict.D_GSXT_YJXX_CZZT" />
</div>
<div class="info-item phone">布控手机<span>{{ data.yjRysjh }}</span></div>
<div class="info-item car">布控车牌号<span>{{ data.yjClcph }}</span></div>
</div>
<div class="second-row">
<div class="info-item idcard">布控身份证<span>{{ data.yjRysfzh }}</span></div>
<div class="info-item tag">预警标签<span>{{ data.yjbqmc }}</span></div>
<div class="info-item department">管辖部门<span>{{ data.ssbm }}</span></div>
</div>
<div class="second-row">
<div class="info-item county">管辖县局<span>{{ data.ssxgaj }}</span></div>
<div class="info-item city">管辖市局<span>{{ data.sssgaj }}</span></div>
<div class="info-item officer">接警员<span>{{ data.jjyxm }}</span></div>
</div>
<div class="second-row">
<div class="info-item content full-width">预警内容<span>{{ data.yjNr }}</span></div>
</div>
</div>
</template>
<script setup>
import { ref, computed } from 'vue'
import { bqYs } from '@/utils/tools'
import { IdCard } from '@/utils/validate.js'
const props = defineProps({
data: {
type: Object,
default: () => { }
},
dict: {
type: Object,
default: () => { }
},
})
</script>
<style lang="scss" scoped>
.warning-item {
width: 100%;
padding: 15px;
border: 1px solid #e8e8e8;
border-radius: 8px;
background-color: #fafafa;
}
.first-row {
display: flex;
align-items: center;
margin-bottom: 15px;
padding-bottom: 15px;
border-bottom: 1px solid #e0e0e0;
}
.avatar-container {
margin-right: 20px;
}
.basic-info {
display: flex;
gap: 30px;
align-items: center;
}
.second-row {
display: flex;
flex-wrap: wrap;
gap: 20px;
margin-bottom: 10px;
}
.info-items {
box-sizing: border-box;
display: flex;
// justify-content: space-between;
padding: 5px 0;
color: #333;
span {
font-weight: 500;
color: #606266;
}
}
.info-item {
flex: 0 0 calc(33.33% - 20px);
box-sizing: border-box;
display: flex;
// justify-content: space-between;
padding: 5px 0;
color: #333;
span {
font-weight: 500;
color: #606266;
}
}
// 特殊字段样式
.name span {
color: #1890ff;
font-weight: bold;
}
// 预警级别颜色
.level-high span {
color: #f56c6c;
font-weight: bold;
}
.level-medium span {
color: #e6a23c;
font-weight: bold;
}
.level-low span {
color: #67c23a;
font-weight: bold;
}
// 处置状态颜色
.status-completed span {
color: #67c23a;
font-weight: bold;
}
.status-processing span {
color: #409eff;
font-weight: bold;
}
.status-pending span {
color: #e6a23c;
font-weight: bold;
}
// 全宽字段
.full-width {
flex: 0 0 100% !important;
}
// 内容字段特殊样式
.content {
flex-direction: column;
align-items: flex-start;
span {
margin-top: 5px;
padding: 8px 12px;
background-color: #f0f9eb;
border-radius: 4px;
width: 100%;
box-sizing: border-box;
}
}
</style>

View File

@ -1,5 +1,9 @@
<template> <template>
<div class="warning-item" > <div class="warning-item" >
<el-divider content-position="left">预警内容</el-divider>
<div class="item-row" style="border: none;"> {{ props.row.yjNr }} </div>
<el-empty v-if="!props.row.yjNr" :image-size="0.5" description="暂无数据" />
<el-divider content-position="left">处置建议</el-divider> <el-divider content-position="left">处置建议</el-divider>
<div class="item-row" v-for="(it,idx) in list" :key="idx"> <div class="item-row" v-for="(it,idx) in list" :key="idx">
<div class="info-item"> <div class="info-item">
@ -41,13 +45,6 @@ const props = defineProps({
type: Object, type: Object,
default: () => ({}) default: () => ({})
}, },
dict: {
type: Object,
default: () => ({
D_GS_SSYJ: [],
D_GSXT_YJXX_CZZT: []
})
},
}) })
const list = ref([]) const list = ref([])
const Fklist = ref([]) const Fklist = ref([])
@ -72,8 +69,11 @@ onMounted(() => {
.item-row{ .item-row{
border-bottom: 1px dashed #e8e8e8; border-bottom: 1px dashed #e8e8e8;
line-height: 36px; line-height: 36px;
padding-bottom: 10px; padding-left: 2rem;
margin-bottom: 10px; box-sizing: border-box;
&:last-nth-child(1){
border-bottom: none;
}
} }
.info-item{ .info-item{
line-height: 36px; line-height: 36px;

View File

@ -11,14 +11,13 @@
<FormMessage :formList="formData" v-model="listQuery" ref="elform"> <FormMessage :formList="formData" v-model="listQuery" ref="elform">
<template #yjTp> <template #yjTp>
<template v-if="!listQuery.yjTp || listQuery.yjTp.includes('baidu')"> <template v-if="!listQuery.yjTp || listQuery.yjTp.includes('baidu')">
<img src="@/assets/images/car.png" width="80" height="100" v-if="listQuery.yjlx == 2" /> <img src="@/assets/images/car.png" width="80" height="100" v-if="listQuery.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="80" height="100" v-else /> <img src="@/assets/images/default_male.png" width="80" height="100" v-else />
</template> </template>
<el-image v-else style="width: 80px; height:120px" :src="listQuery.yjTp" :preview-src-list="[listQuery.yjTp]" <el-image v-else style="width: 80px; height:120px" :src="listQuery.yjTp" :preview-src-list="[listQuery.yjTp]" show-progress>
show-progress>
<template #error> <template #error>
<div class="image-slot error"> <div class="image-slot error">
<img src="@/assets/images/car.png" width="80" height="100" v-if="listQuery.yjlx == 2" /> <img src="@/assets/images/car.png" width="80" height="100" v-if="listQuery.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="80" height="100" v-else /> <img src="@/assets/images/default_male.png" width="80" height="100" v-else />
</div> </div>
</template> </template>

View File

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

View File

@ -1,376 +0,0 @@
<template>
<div>
<!-- 表格 -->
<div class="tabBox tabBox_zdy" :style="{ height: maxHeight + 130 + 'px' }">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="maxHeight + 'px'"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
:expand="true" @chooseData="handleChooseData" :rowClassName="getRowClassName">
<template #expand="{ props }">
<div class="expand-content" style="max-width: 100%">
<Items :row="props" :dict="dict" />
</div>
</template>
<template #yjTp="{ row }">
<template v-if="!row.yjTp || row.yjTp.includes('baidu')">
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="30" height="30" v-else />
</template>
<el-image v-else style="width: 30px; height:30px" :src="row.yjTp" :preview-src-list="[row.yjTp]"
show-progress>
<template #error>
<div class="image-slot error">
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="30" height="30" v-else />
</div>
</template>
</el-image>
</template>
<template #nl="{ row }">
{{ IdCard(row.yjRysfzh, 3) }}
</template>
<template #xb="{ row }">
{{ IdCard(row.yjRysfzh, 2) }}
</template>
<template #xsd="{ row }">
{{ row.xsd }}%
</template>
<template #yjLylx="{ row }">
<DictTag v-model:value="row.yjLylx" :options="props.dict.D_BZ_YJLY" />
</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="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link> -->
<!-- <el-link type="danger" @click="delDictItem(row.id)">转会商</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')" v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<el-link type="primary" @click="openAddFrom(row)">详情</el-link>
<el-link type="primary" @click="pushWarning(row)">指派</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="maxHeight + 100" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</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>
<!-- <AddFrom ref="addFrom" /> -->
<!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<ZpForm v-model="warningShow" :dataList="dataList"/>
</template>
<script setup>
import Czjy from './czjy.vue'
import { getItem, setItem } from '@/utils/storage'
import Items from '../item/items.vue'
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import { IdCard } from '@/utils/validate.js'
import { tbYjxxGetPageList } 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 ZpForm from "@/views/backOfficeSystem/fourColorManage/warningControl/sevenWarning/zpForm.vue";
import emitter from "@/utils/eventBus.js";
import { holographicProfileJump } from "@/utils/tools.js"
import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js"
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance();
const props = defineProps({
dict: {
type: Object,
default: {}
},
maxHeight: {
type: [Number, String],
default: 666
}
});
const permission_sfqs = ref(false)
const roleCode = ref(false)
const czjyRef = ref()
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false,
haveControls: true
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 250, //操作栏宽度
tableColumn: [
{ label: "状态", prop: "czzt", showSolt: true },
{ label: "预警图片", prop: "yjTp", showSolt: true, width: 100 },
{ label: "布控车牌号", prop: "yjClcph", showOverflowTooltip: true },
{ label: "处置状态", prop: "czzt", showSolt: true },
{ label: "预警级别", prop: "yjJb", showSolt: true },
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true },
{ label: "标题", prop: "yjBt" },
{ label: "预警地址", prop: "yjDz", showOverflowTooltip: true },
{ label: "接收单位", prop: "ssbm", showOverflowTooltip: true },
{ label: "内容", prop: "yjNr", showOverflowTooltip: true },
]
});
/** 选中项 */
const selectRows = ref([])
onMounted(() => {
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
permission_sfqs.value = str.startsWith('2'||'3') ? false : true;
let rols = getItem('roleList') ? getItem('roleList'):[]
let obj = rols.find(item => {
return ['JS_666666','JS_777777','JS_888888'].includes(item.roleCode)
})
roleCode.value = obj ? true : false;
// tabHeightFn();
getList()
});
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList()
}
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList()
}
const ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
const getList = (val) => {
pageData.tableConfiger.loading = true;
const promes = {
...val,
yjLx: '2', // 车辆预警
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize
}
delete promes.times;
tbYjxxGetPageList(promes).then((res) => {
pageData.tableData = res.records.map(item => {
return {
...item,
yjTp: item.yjlx == '01' ? item.yjTpreplace(ORDIMG, IMGYM) : item.yjTp
}
}) || [];
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
})
}
// 全息档案
const assessShow = ref(false)
const dataList = ref()
const pushAssess = (val) => {
return holographicProfileJump(val.yjLx,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 handleCzjy = (row) => {
czjyRef.value.init( row)
}
// 发送指令
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 addFrom = ref()
const openAddFrom = (row) => {
emitter.emit('openAddFrom', row)
}
// 根据预警级别设置行样式
const getRowClassName = (row) => {
if (!row.row.yjJb) return '';
const level = String(row.row.yjJb);
if (level === '01' || level.includes('红') || level.includes('高')) return 'warning-level-01';
if (level === '02' || level.includes('橙') || level.includes('中')) return 'warning-level-02';
if (level === '03' || level.includes('黄') || level.includes('低')) return 'warning-level-03';
if (level === '04' || level.includes('蓝')) return 'warning-level-04';
return '';
};
// // 表格高度计算
// const tabHeightFn = () => {
// pageData.tableHeight = window.innerHeight - 430;
// window.onresize = function () {
// tabHeightFn();
// };
// };
// 指派
const warningShow = ref(false)
const pushWarning = (val) => {
warningShow.value = true;
dataList.value = val;
}
const handleChooseData = (val) => {
selectRows.value = val
}
const exportExl = () => {
const titleObj = {
czzt_cname: "处置状态",
yjSj: "预警时间",
yjRyxm: "姓名",
nl_cname: "年龄", // IdCard(row.yjRysfzh, 3)
yjLylx: "数据来源",
xb_cname: "性别",
yjJb_cname: "预警级别",
xsd_cname: "相似度",
yjDz: "预警地点",
yjCs: "预警次数",
yjRysjh: "布控手机号",
yjClcph: "布控车牌号",
yjRysfzh: "身份证",
}
/** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
const data = needArr.map(item => {
return {
...item,
nl_cname: IdCard(item.yjRysfzh, 3),
xb_cname: IdCard(item.yjRysfzh, 2),
xsd_cname: (item.xsd > 0 ? item.xsd : 0) + '%',
czzt_cname: getMultiDictVal(item.czzt, props.dict.D_GSXT_YJXX_CZZT),
yjJb_cname: getMultiDictVal(item.yjJb, props.dict.D_BZ_YJJB),
}
})
exportExlByObj(titleObj, data, props.excelTitle || '预警.xlsx')
}
defineExpose({
getList,
exportExl
})
</script>
<style lang="scss">
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
/* 预警级别行样式 */
.warning-level-01 {
background-color: rgba(255, 2, 2, 0.1) !important;
}
.warning-level-01:hover {
background-color: rgba(255, 2, 2, 0.15) !important;
}
.warning-level-02 {
background-color: rgba(255, 140, 0, 0.1) !important;
}
.warning-level-02:hover {
background-color: rgba(255, 140, 0, 0.15) !important;
}
.warning-level-03 {
background-color: rgba(255, 210, 8, 0.1) !important;
}
.warning-level-03:hover {
background-color: rgba(255, 210, 8, 0.15) !important;
}
.warning-level-04 {
background-color: rgba(0, 0, 255, 0.1) !important;
}
.warning-level-04:hover {
background-color: rgba(0, 0, 255, 0.15) !important;
}
/* 确保行样式应用到所有单元格 */
.warning-level-01 td,
.warning-level-02 td,
.warning-level-03 td,
.warning-level-04 td {
background-color: transparent !important;
}
.tabBox_zdy{
.el-table--fit {
overflow: unset !important;
}
}
</style>

View File

@ -1,87 +1,146 @@
<template> <template>
<div> <div>
<Search :searchArr="searchConfiger" @submit="onSearch" @reset="onReset" :key="pageData.keyCount"> <!-- 搜索 -->
</Search> <div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" @reset="onReset" :key="pageData.keyCount">
<template #yjRyxms>
<el-select clearable v-model="listQuery.yjRyxm" filterable remote allow-create default-first-optionreserve-keyword placeholder="请输入布控人员" :remote-method="remoteMethod" :loading="loading" style="width: 240px">
<el-option v-for="item in opentions" :key="item.rySfzh" :label="item.ryXm" :value="item.rySfzh" />
</el-select>
</template>
</Search>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5"> <PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left> <template #left>
<el-button type="primary" @click="exportExl" size="small">导出</el-button> <el-button type="primary" size="small" @click="exportExl">导出</el-button>
</template> <el-button type="primary" size="small" @click="handleQs" v-if="permission_sfqs">签收</el-button>
</template>
</PageTitle> </PageTitle>
<!-- 搜索 -->
<!-- 表格 --> <!-- 表格 -->
<div class="tabBox" :style="{ height: (pageData.tableHeight + 40) + 'px', paddingTop: '10px' }"> <div class="tabBox tabBox_zdy">
<!-- <div style="padding:0 10px;"> <el-button type="primary" @click="exportExcel">导出</el-button></div> --> <MyTable
<LocalWarning :maxHeight="pageData.tableHeight - 160" ref="localWarningRef" :tableData="pageData.tableData"
:dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLYXT, D_BZ_YJLY }" excelTitle="车辆预警" /> :tableColumn="pageData.tableColumn"
</div> :tableHeight="pageData.tableHeight"
</div> :key="pageData.keyCount"
<el-dialog v-model="showDc" title="导出预警" width="80%"> :tableConfiger="pageData.tableConfiger"
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="500" :controlsWidth="pageData.controlsWidth"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"> expand
<template #yjTp="{ row }"> @chooseData="handleChooseData"
<template v-if="!row.yjTp || row.yjTp.includes('baidu')"> :rowClassName="getRowClassName"
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" /> >
<img src="@/assets/images/default_male.png" width="30" height="30" v-else /> <template #expand="{ props }">
<Items :row="props" />
</template> </template>
<el-image v-else style="width: 30px; height:30px" :src="row.yjTp" :preview-src-list="[row.yjTp]" show-progress> <template #yjTp="{ row }">
<template #error> <template v-if="!row.yjTp || row.yjTp.includes('baidu')">
<div class="image-slot error"> <img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" /> <img src="@/assets/images/default_male.png" width="30" height="30" v-else />
<img src="@/assets/images/default_male.png" width="30" height="30" v-else />
</div>
</template> </template>
</el-image> <el-image v-else style="width: 30px; height:30px" :src="row.yjTp" :preview-src-list="[row.yjTp]"
show-progress>
<template #error>
<div class="image-slot error">
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="30" height="30" v-else />
</div>
</template>
</el-image>
</template>
<template #nl="{ row }">
{{ IdCard(row.yjRysfzh, 3) }}
</template>
<template #xb="{ row }">
{{ IdCard(row.yjRysfzh, 2) }}
</template>
<template #xsd="{ row }">
{{ row.xsd }}%
</template>
<template #yjLylx="{ row }">
<DictTag v-model:value="row.yjLylx" :options="D_BZ_YJLY" />
</template> </template>
<template #nl="{ row }"> <template #czzt="{ row }">
{{ IdCard(row.yjRysfzh, 3) }} <DictTag v-model:value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
</template> </template>
<template #yjLylx="{ row }"> <template #yjJb="{ row }">
<DictTag v-model:value="row.yjLylx" :options="D_BZ_YJLY" /> <DictTag v-model:value="row.yjJb" :options="D_BZ_YJJB" />
</template> </template>
<template #xb="{ row }"> <!-- 操作 -->
{{ IdCard(row.yjRysfzh, 2) }} <template #controls="{ row }">
</template> <el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<template #czzt="{ row }"> <el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<DictTag v-model:value="row.czzt" :options="D_GSXT_YJXX_CZZT" /> <!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link> -->
</template> <!-- <el-link type="danger" @click="delDictItem(row.id)">转会商</el-link> -->
<template #yjJb="{ row }"> <el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<DictTag v-model:value="row.yjJb" :options="D_BZ_YJJB" /> <el-link type="success" @click="handleQsFk(row, '反馈')" v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
</template> <!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<template #xsd="{ row }"> <el-link type="primary" @click="openAddFrom(row)">详情</el-link>
{{ row.xsd }}% <el-link type="primary" @click="pushWarning(row)">指派</el-link>
</template> </template>
<!-- 操作 --> </MyTable>
</MyTable> <Pages
<template #footer> @changeNo="changeNo"
<div class="dialog-footer"> @changeSize="changeSize"
<el-button @click="showDc = false">关闭</el-button> :tableHeight="pageData.tableHeight"
<el-button type="primary" @click="handleExport"> :pageConfiger="{ ...pageData.pageConfiger, total: pageData.total }">
导出 </Pages>
</el-button> </div>
</div>
</template> </div>
</el-dialog>
<HolographicArchive v-model="assessShow" :dataList="dataList" />
<Information v-model="showDialog" title="发送指令" @submit='submitSendZl' @close='closeFszl'>
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj" :tacitly="tacitly" />
</Information>
<!-- 详情 -->
<AddFromz ref="addFromRefs" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLYXT }" /> <AddFromz ref="addFromRefs" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLYXT }" />
<!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<!-- 指派 -->
<ZpForm v-model="warningShow" :dataList="dataList"/>
<!-- 反馈 -->
<FkDialog @change="getList" />
</template> </template>
<script setup> <script setup>
import * as MOSTY from "@/components/MyComponents/index"; import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import PageTitle from "@/components/aboutTable/PageTitle.vue"; import emitter from "@/utils/eventBus.js";
import Search from "@/components/aboutTable/Search.vue"; import { getItem, setItem } from '@/utils/storage'
import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js"
import { tbYjxxGetPageList } from '@/api/yj.js'
import { IdCard } from '@/utils/validate.js' import { IdCard } from '@/utils/validate.js'
import { tbGsxtZdrySelectList } from "@/api/zdr.js" import { tbGsxtZdrySelectList } from "@/api/zdr.js"
import { tbYjxxQueryYjxx } from "@/api/yj.js"; import { holographicProfileJump } from "@/utils/tools.js"
import LocalWarning from "./components/localWarning.vue"; import Items from './item/items.vue'
import MyTable from "@/components/aboutTable/MyTable.vue"; import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue"; import Information from "@/views/home/model/information.vue";
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import ZpForm from "@/views/backOfficeSystem/fourColorManage/warningControl/sevenWarning/zpForm.vue";
import Czjy from './components/czjy.vue';
import AddFromz from './components/addFrom.vue'; import AddFromz from './components/addFrom.vue';
import FileSaver from "file-saver"; import MyTable from "@/components/aboutTable/MyTable.vue";
import emitter from "@/utils/eventBus.js"; import Pages from "@/components/aboutTable/Pages.vue";
import * as XLSX from "xlsx"; import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Search from "@/components/aboutTable/Search.vue";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
const ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const { D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLY } = proxy.$dict("D_GSXT_YJXX_CZZT", "D_BZ_YJJB", "D_BZ_YJLY") const { D_GSXT_YJXX_CZZT,D_GS_QLZDRLX, D_BZ_YJJB, D_BZ_YJLYXT, D_BZ_YJLY, D_BZ_XB } = proxy.$dict("D_GSXT_YJXX_CZZT",'D_GS_QLZDRLX ', "D_BZ_YJJB", "D_BZ_YJLYXT", "D_BZ_YJLY", "D_BZ_XB")
const searchBox = ref(); //搜索框 const searchBox = ref(); //搜索框
const roleCode = ref(false)
const czjyRef = ref()
const itemData = ref()
const semdFqzlRef = ref()
const warningShow = ref(false)
const dataList = ref([])
const showDialog = ref(false)// 发送指令
const assessShow = ref(false)// 全息档案
const searchConfiger = ref( const searchConfiger = ref(
[ [
{ label: "车牌号", prop: 'yjClcph', showType: "input", placeholder: "请输入车牌号", }, { label: "车牌号", prop: 'yjClcph', showType: "input", placeholder: "请输入车牌号", },
@ -92,46 +151,14 @@ const searchConfiger = ref(
{ label: "活动发生地址", prop: 'yjDz', placeholder: "请输入活动发生地址", showType: "input" }, { label: "活动发生地址", prop: 'yjDz', placeholder: "请输入活动发生地址", showType: "input" },
{ label: "接收单位", prop: 'ssbmdm',showType: "department" }, { label: "接收单位", prop: 'ssbmdm',showType: "department" },
]); ]);
const shortcuts = [
{
text: '近一周',
value: () => {
const end = new Date()
const start = new Date()
start.setDate(start.getDate() - 7)
return [start, end]
},
},
{
text: '近一月',
value: () => {
const end = new Date()
const start = new Date()
start.setMonth(start.getMonth() - 1)
return [start, end]
},
},
{
text: '近三月',
value: () => {
const end = new Date()
const start = new Date()
start.setMonth(start.getMonth() - 3)
return [start, end]
},
},
]
const pageData = reactive({ const pageData = reactive({
/** 表格高度 */
tableHeight: 600,
tableData: [], //表格数据 tableData: [], //表格数据
keyCount: 0, keyCount: 0,
tableConfiger: { tableConfiger: {
rowHieght: 61, rowHieght: 61,
showSelectType: "null", showSelectType: "null",
loading: false, loading: false,
haveControls: false haveControls: true
}, },
total: 0, total: 0,
@ -139,209 +166,273 @@ const pageData = reactive({
pageSize: 20, pageSize: 20,
pageCurrent: 1 pageCurrent: 1
}, //分页 }, //分页
controlsWidth: 160, //操作栏宽度 controlsWidth: 250, //操作栏宽度
tableColumn: [ tableColumn: [
{ label: "预警图片", prop: "yjTp", showSolt: true },
{ label: "状态", prop: "czzt", showSolt: true }, { label: "状态", prop: "czzt", showSolt: true },
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true }, { label: "预警图片", prop: "yjTp", showSolt: true, width: 100 },
{ label: "姓名", prop: "yjRyxm" },
{ label: "年龄", prop: "nl", showSolt: true },
{ label: "数据来源", prop: "yjLylx", showOverflowTooltip: true, showSolt: true },
{ label: "性别", prop: "xb", showSolt: true },
{ label: "预警级别", prop: "yjJb", showSolt: true },
{ label: "相似度", prop: "xsd", showSolt: true },
{ label: "预警地址", prop: "yjDz", showOverflowTooltip: true },
{ label: "预警次数", prop: "yjCs", showOverflowTooltip: true },
{ label: "布控手机号", prop: "yjRysjh", showOverflowTooltip: true },
{ label: "布控车牌号", prop: "yjClcph", showOverflowTooltip: true }, { label: "布控车牌号", prop: "yjClcph", showOverflowTooltip: true },
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true }, { label: "处置状态", prop: "czzt", showSolt: true },
{ label: "预警级别", prop: "yjJb", showSolt: true },
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true },
{ label: "标题", prop: "yjBt" },
{ label: "预警地址", prop: "yjDz", showOverflowTooltip: true },
{ label: "接收单位", prop: "ssbm", showOverflowTooltip: true },
{ label: "内容", prop: "yjNr", showOverflowTooltip: true },
] ]
}); });
const showDc = ref(false) const addFromRefs = ref()
const addFromRefs = ref(null) const listQuery = ref({})
const opentions = ref([])
const loading = ref(false)
const selectRows = ref([])
const permission_sfqs = ref(false)
onMounted(() => { onMounted(() => {
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
permission_sfqs.value = str.startsWith('2'||'3') ? false : true;
let rols = getItem('roleList') ? getItem('roleList'):[]
let obj = rols.find(item => {
return ['JS_666666','JS_777777','JS_888888'].includes(item.roleCode)
})
roleCode.value = obj ? true : false;
tabHeightFn(); tabHeightFn();
emitter.on('openAddFrom', (val) => { getList()
if (addFromRefs.value) { });
addFromRefs.value.init('add', val) // 搜索
const onReset = () => {
listQuery.value.yjRyxm = ''
}
const onSearch = (val) => {
listQuery.value = { ...listQuery.value,...val };
listQuery.value.startTime = val.times ? val.times[0] : ''
listQuery.value.endTime = val.times ? val.times[1] : ''
getList()
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList()
}
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList()
}
const getList = () => {
pageData.tableConfiger.loading = true;
const promes = {
...listQuery.value,
yjLx: '2', // 车辆预警
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize
}
delete promes.times;
tbYjxxGetPageList(promes).then((res) => {
pageData.tableData = res.records.map(item => {
return {
...item,
yjTp: item.yjlx == '01' ? item.yjTpreplace(ORDIMG, IMGYM) : item.yjTp
}
}) || [];
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
})
}
const remoteMethod = (query) => {
if (!query) return opentions.value = [];
loading.value = true
tbGsxtZdrySelectList({ ryXm: query }).then(res => {
opentions.value = res || [];
loading.value = false;
}).catch(() => {
loading.value = false
})
}
// 根据预警级别设置行样式
const getRowClassName = (row) => {
if (!row.row.yjJb) return '';
const level = String(row.row.yjJb);
if (level === '01' || level.includes('红') || level.includes('高')) return 'warning-level-01';
if (level === '02' || level.includes('橙') || level.includes('中')) return 'warning-level-02';
if (level === '03' || level.includes('黄') || level.includes('低')) return 'warning-level-03';
if (level === '04' || level.includes('蓝')) return 'warning-level-04';
return '';
};
// 处理签收
const handleQsFk = (val, type) => {
switch (type) {
case '签收':
proxy.$confirm("是否确定要签收?", "警告", { type: "warning" }).then(() => {
qcckPost({ id: val.id }, "/mosty-gsxt/tbYjxx/yjqs").then(() => {
val.czzt = '02'
getList()
proxy.$message({ type: "success", message: "签收成功" });
});
})
break;
case '反馈':
case '查看反馈':
emitter.emit("openFkDialog", { id: val.id, type });
break;
}
}
const handleChooseData = (val) => {
selectRows.value = val
}
// 导出
const exportExl = () => {
const titleObj = {
czzt_cname: "处置状态",
yjSj: "预警时间",
yjRyxm: "姓名",
nl_cname: "年龄", // IdCard(row.yjRysfzh, 3)
yjLylx: "数据来源",
xb_cname: "性别",
yjJb_cname: "预警级别",
xsd_cname: "相似度",
yjDz: "预警地点",
yjCs: "预警次数",
yjRysjh: "布控手机号",
yjClcph: "布控车牌号",
yjRysfzh: "身份证",
}
/** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
const data = needArr.map(item => {
return {
...item,
nl_cname: IdCard(item.yjRysfzh, 3),
xb_cname: IdCard(item.yjRysfzh, 2),
xsd_cname: (item.xsd > 0 ? item.xsd : 0) + '%',
czzt_cname: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
yjJb_cname: getMultiDictVal(item.yjJb, D_BZ_YJJB),
} }
}) })
}); exportExlByObj(titleObj, data, '人像预警.xlsx')
const listQuery = ref({
})
const localWarningRef = ref(null);
// 搜索
const onSearch = (val) => {
const promes = { ...val }
promes.startTime = val.times ? val.times[0] : ''
promes.endTime = val.times ? val.times[1] : ''
localWarningRef.value.getList(promes)
} }
const loading = ref(false)
const searchArr = ref() const handleQs = () => {
const resetForm = (formEl) => { if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
listQuery.value = {} let wqs = selectRows.value.filter(item => item.czzt == '01');
localWarningRef.value.getList() if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ids}, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
// 全息档案跳转
const pushAssess = (val) => {
return holographicProfileJump(val.yjLx,val)
}
const showDetail = (item) => {
showDialog.value = true;
itemData.value = item
}
const handleClose = () => {
showDialog.value = false;
}
const submitSendZl = () => {
semdFqzlRef.value.getsendFqzl()
}
const closeFszl = () => {
semdFqzlRef.value.close()
}
// 处置建议
const handleCzjy = (row) => {
czjyRef.value.init(row)
}
// 详情
const openAddFrom = (val) => {
addFromRefs.value.init('add', val)
} }
// 指派
const pushWarning = (val) => {
warningShow.value = true
dataList.value = val;
}
// 表格高度计算 // 表格高度计算
const tabHeightFn = () => { const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - (searchBox.value?.offsetHeight || 0) - 270; pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
window.onresize = function () { window.onresize = function () {
tabHeightFn(); tabHeightFn();
}; };
}; };
// 导出
const exportExcel = () => {
const promes = {
yjRyxm: listQuery.value.yjRyxm,
yjlx: listQuery.value.yjlx,
startTime: listQuery.value.time ? listQuery.value.time[0] : '',
endTime: listQuery.value.time ? listQuery.value.time[1] : '',
}
tbYjxxQueryYjxx(promes).then(res => {
pageData.tableData = res
showDc.value = true
})
}
// 处理Excel导出
const handleExport = () => {
// 创建一个临时表格用于导出
const tempTable = document.createElement('table');
// 创建表头
const thead = document.createElement('thead');
const headerRow = document.createElement('tr');
// 添加序号列
const indexTh = document.createElement('th');
indexTh.textContent = '序号';
headerRow.appendChild(indexTh);
// 添加其他列头
pageData.tableColumn.forEach(column => {
const th = document.createElement('th');
th.textContent = column.label;
headerRow.appendChild(th);
});
thead.appendChild(headerRow);
tempTable.appendChild(thead);
// 创建表体
const tbody = document.createElement('tbody');
// 处理表格数据
pageData.tableData.forEach((row, index) => {
const tr = document.createElement('tr');
// 添加序号
const indexTd = document.createElement('td');
indexTd.textContent = index + 1;
tr.appendChild(indexTd);
// 添加其他单元格数据
pageData.tableColumn.forEach(column => {
const td = document.createElement('td');
// 处理自定义插槽的情况
if (column.showSolt) {
if (column.prop === 'yjTp') {
// 照片字段只显示文字描述
td.textContent = '有照片';
} else if (column.prop === 'nl') {
// 年龄字段
td.textContent = IdCard(row.yjRysfzh, 3);
} else if (column.prop === 'xb') {
// 性别字段
td.textContent = IdCard(row.yjRysfzh, 2);
} else if (column.prop === 'xsd') {
// 相似度字段
td.textContent = '90%';
} else {
// 其他字段
td.textContent = row[column.prop] || '';
}
} else {
// 普通字段
td.textContent = row[column.prop] || '';
}
tr.appendChild(td);
});
tbody.appendChild(tr);
});
tempTable.appendChild(tbody);
// 执行Excel导出
let xlsxParam = { raw: true };
let wb = XLSX.utils.table_to_book(tempTable, xlsxParam);
let wbout = XLSX.write(wb, {
bookType: "xlsx",
bookSST: true,
type: "array"
});
// 保存文件
try {
const exportTime = new Date().toLocaleString('zh-CN').replace(/\//g, '-').replace(/:/g, '-');
FileSaver.saveAs(
new Blob([wbout], { type: "application/octet-stream" }),
`预警数据导出_${exportTime}.xlsx`
);
showDc.value = false;
} catch (e) {
console.error('导出Excel失败:', e);
}
}
const exportExl = () => {
localWarningRef.value && localWarningRef.value.exportExl()
};
</script> </script>
<style lang="scss" scoped>
::v-deep .el-table--fit {
height: calc(100% - 50px) !important;
}
.filter-title { <style lang="scss">
display: flex;
align-items: center;
margin-bottom: 10px;
width: 100%;
background: linear-gradient(to right, #9ed7ff, #e6f0f8);
padding: 5px 15px;
.filter-label {
display: flex;
align-items: center;
font-weight: bold;
color: #000;
margin-right: 10px;
white-space: nowrap;
}
.filter-line {
flex: 1;
height: 1px;
background-color: #ccc;
}
}
</style>
<style>
.el-loading-mask { .el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important; background: rgba(0, 0, 0, 0.5) !important;
} }
.searchBox { /* 预警级别行样式 */
background-color: #fff; .warning-level-01 {
margin-bottom: 10px; background-color: rgba(255, 2, 2, 0.1) !important;
}
.warning-level-01:hover {
background-color: rgba(255, 2, 2, 0.15) !important;
}
.warning-level-02 {
background-color: rgba(255, 140, 0, 0.1) !important;
}
.warning-level-02:hover {
background-color: rgba(255, 140, 0, 0.15) !important;
}
.warning-level-03 {
background-color: rgba(255, 210, 8, 0.1) !important;
}
.warning-level-03:hover {
background-color: rgba(255, 210, 8, 0.15) !important;
}
.warning-level-04 {
background-color: rgba(0, 0, 255, 0.1) !important;
}
.warning-level-04:hover {
background-color: rgba(0, 0, 255, 0.15) !important;
}
/* 确保行样式应用到所有单元格 */
.warning-level-01 td,
.warning-level-02 td,
.warning-level-03 td,
.warning-level-04 td {
background-color: transparent !important;
}
.tabBox_zdy{
.el-table--fit {
overflow: unset !important;
}
} }
</style> </style>

View File

@ -1,197 +0,0 @@
<template>
<div class="warning-item">
<!-- 第一行图片姓名年龄性别 -->
<div class="first-row">
<div class="avatar-container">
<template v-if="!data.yjTp || data.yjTp.includes('baidu')">
<img src="@/assets/images/car.png" width="60" height="70" v-if="data.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="60" height="70" v-else />
</template>
<el-image v-else style="width: 60px; height:70px" :src="data.yjTp" :preview-src-list="[data.yjTp]"
show-progress>
<template #error>
<div class="image-slot error">
<img src="@/assets/images/car.png" width="60" height="70" v-if="data.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="60" height="70" v-else />
</div>
</template>
</el-image>
</div>
<div class="basic-info">
<div class="info-items name">姓名<span>{{ data.yjRyxm }}</span></div>
<div class="info-items gender">性别<span> {{ IdCard(data.yjRysfzh, 3) }}</span></div>
<div class="info-items age">年龄<span> {{ IdCard(data.yjRysfzh, 2) }}</span></div>
</div>
</div>
<!-- 第二行其他所有字段 -->
<div class="second-row">
<div class="info-item title">预警标题<span>{{ data.yjBt }}</span></div>
<div class="info-item level">
预警级别
<DictTag :color="bqYs(data.yjJb)" :tag="false" v-model:value="data.yjJb" :options="props.dict.D_BZ_YJJB" />
<!-- <span :class="getLevelClass(data.yjJb)">{{ data.yjJb || data.yjLx }}</span> -->
</div>
<div class="info-item similarity">相似度<span>{{ data.xsd }}%</span></div>
</div>
<div class="second-row">
<div class="info-item time">预警时间<span>{{ data.yjSj }}</span></div>
<div class="info-item location">预警地点<span>{{ data.yjDz }}</span></div>
<div class="info-item count">预警次数<span>{{ data.yjCs }}</span></div>
</div>
<div class="second-row">
<div class="info-item status">
处置状态 <DictTag v-model:value="data.czzt" :options="props.dict.D_GSXT_YJXX_CZZT" />
</div>
<div class="info-item phone">布控手机<span>{{ data.yjRysjh }}</span></div>
<div class="info-item car">布控车牌号<span>{{ data.yjClcph }}</span></div>
</div>
<div class="second-row">
<div class="info-item idcard">布控身份证<span>{{ data.yjRysfzh }}</span></div>
<div class="info-item tag">预警标签<span>{{ data.yjbqmc }}</span></div>
<div class="info-item department">管辖部门<span>{{ data.ssbm }}</span></div>
</div>
<div class="second-row">
<div class="info-item county">管辖县局<span>{{ data.ssxgaj }}</span></div>
<div class="info-item city">管辖市局<span>{{ data.sssgaj }}</span></div>
<div class="info-item officer">接警员<span>{{ data.jjyxm }}</span></div>
</div>
<div class="second-row">
<div class="info-item content full-width">预警内容<span>{{ data.yjNr }}</span></div>
</div>
</div>
</template>
<script setup>
import { ref, computed } from 'vue'
import { bqYs } from '@/utils/tools'
import { IdCard } from '@/utils/validate.js'
const props = defineProps({
data: {
type: Object,
default: () => { }
},
dict: {
type: Object,
default: () => { }
},
})
</script>
<style lang="scss" scoped>
.warning-item {
width: 100%;
padding: 15px;
border: 1px solid #e8e8e8;
border-radius: 8px;
background-color: #fafafa;
}
.first-row {
display: flex;
align-items: center;
margin-bottom: 15px;
padding-bottom: 15px;
border-bottom: 1px solid #e0e0e0;
}
.avatar-container {
margin-right: 20px;
}
.basic-info {
display: flex;
gap: 30px;
align-items: center;
}
.second-row {
display: flex;
flex-wrap: wrap;
gap: 20px;
margin-bottom: 10px;
}
.info-items {
box-sizing: border-box;
display: flex;
// justify-content: space-between;
padding: 5px 0;
color: #333;
span {
font-weight: 500;
color: #606266;
}
}
.info-item {
flex: 0 0 calc(33.33% - 20px);
box-sizing: border-box;
display: flex;
// justify-content: space-between;
padding: 5px 0;
color: #333;
span {
font-weight: 500;
color: #606266;
}
}
// 特殊字段样式
.name span {
color: #1890ff;
font-weight: bold;
}
// 预警级别颜色
.level-high span {
color: #f56c6c;
font-weight: bold;
}
.level-medium span {
color: #e6a23c;
font-weight: bold;
}
.level-low span {
color: #67c23a;
font-weight: bold;
}
// 处置状态颜色
.status-completed span {
color: #67c23a;
font-weight: bold;
}
.status-processing span {
color: #409eff;
font-weight: bold;
}
.status-pending span {
color: #e6a23c;
font-weight: bold;
}
// 全宽字段
.full-width {
flex: 0 0 100% !important;
}
// 内容字段特殊样式
.content {
flex-direction: column;
align-items: flex-start;
span {
margin-top: 5px;
padding: 8px 12px;
background-color: #f0f9eb;
border-radius: 4px;
width: 100%;
box-sizing: border-box;
}
}
</style>

View File

@ -1,6 +1,10 @@
<template> <template>
<div class="warning-item" > <div class="warning-item" >
<el-divider content-position="left">预警内容</el-divider>
<div class="item-row" style="border: none;"> {{ props.row.yjNr }} </div>
<el-empty v-if="!props.row.yjNr" :image-size="0.5" description="暂无数据" />
<el-divider content-position="left">处置建议</el-divider> <el-divider content-position="left">处置建议</el-divider>
<div class="item-row" v-for="(it,idx) in list" :key="idx"> <div class="item-row" v-for="(it,idx) in list" :key="idx">
<div class="info-item"> <div class="info-item">
@ -75,6 +79,11 @@ onMounted(() => {
line-height: 36px; line-height: 36px;
padding-bottom: 10px; padding-bottom: 10px;
margin-bottom: 10px; margin-bottom: 10px;
padding-left: 2rem;
box-sizing: border-box;
&:nth-last-child(1){
border-bottom: none;
}
} }
.info-item{ .info-item{
line-height: 36px; line-height: 36px;

View File

@ -1,12 +1,7 @@
/** 积分类型 */ /** 积分类型 */
export const jflylxTypes = { export const jflylxTypes = {
'01': '信息采集', '01': '采纳',
'02': '肯定', '02': '转线索',
'03': '转会商', '03': '研判',
'04': '转合成',
'05': '转线索',
'06': '建模型',
'07': '战术研判',
'08': '战略研判'
}; };

View File

@ -1,21 +1,22 @@
<template> <template>
<div> <div>
<!-- <div class="titleBox">
<PageTitle title="警情管理">
<el-button type="primary" @click="addEdit('add', '')">
<el-icon style="vertical-align: middle"><CirclePlus /></el-icon>
<span style="vertical-align: middle">新增</span>
</el-button>
</PageTitle>
</div> -->
<!-- 搜索 --> <!-- 搜索 -->
<div ref="searchBox" class="mt10 mb10"> <div ref="searchBox" class="mt10 mb10">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search> <Search :searchArr="searchConfiger" ref="ces" @submit="onSearch" :key="pageData.keyCount"></Search>
</div> </div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="exportExl">导出</el-button>
<el-button type="primary" size="small" @click="getSlect">我的关注</el-button>
</template>
</PageTitle>
<!-- 表格 --> <!-- 表格 -->
<div class="tabBox heightBox"> <div class="tabBox heightBox">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight" <MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"> :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
@chooseData="handleChooseData">
<!-- <template #jjlx="{ row }"> <!-- <template #jjlx="{ row }">
<DictTag :tag="false" :value="row.jjlx" :options="D_BZ_JQBQ" /> <DictTag :tag="false" :value="row.jjlx" :options="D_BZ_JQBQ" />
</template> --> </template> -->
@ -25,38 +26,40 @@
<template #jqlbdm="{ row }"> <template #jqlbdm="{ row }">
<DictTag :tag="false" :value="row.jqlbdm" :options="JQLB" /> <DictTag :tag="false" :value="row.jqlbdm" :options="JQLB" />
</template> </template>
<template #ypzt="{ row }"> <!-- <template #ypzt="{ row }">
{{ row.ypzt === '01' ? '已研判' : '未研判' }} {{ row.ypzt === '01' ? '已研判' : '未研判' }}
</template>
<!-- <template #jqdjdm="{ row }">
<DictTag :tag="false" :value="row.jqdjdm" :options="D_BZ_JQDJ" />
</template> --> </template> -->
<template #hszt="{ row }">
{{ row.hszt === '01' ? '未会商' : '已会商' }}
</template>
<!-- 操作 --> <!-- 操作 -->
<template #controls="{ row }"> <template #controls="{ row }">
<el-link type="warning" @click="CreateConsultationMeeting(row)">创建会商</el-link>
<el-link :type=" row.sfgz=='0'?'success':'danger'" @click="Attention(row,row.sfgz=='0'?'关注':'取消关注')">{{ row.sfgz=='0'?'关注':'取消关注' }}</el-link>
<el-link type="primary" @click="addEdit('edit', row)">详情</el-link> <el-link type="primary" @click="addEdit('edit', row)">详情</el-link>
<el-link type="warning" @click="handleYP('研判', row)">研判</el-link> <!-- <el-link type="warning" @click="handleYP('研判', row)">研判</el-link>
<el-link type="danger" @click="handleYP('深度研判', row)">深度研判</el-link> <el-link type="danger" @click="handleYP('深度研判', row)">深度研判</el-link> -->
</template> </template>
</MyTable> </MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{ <Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight"
...pageData.pageConfiger, :pageConfiger="{ ...pageData.pageConfiger, total: pageData.total }">
total: pageData.total </Pages>
}"></Pages>
</div> </div>
<!-- 编辑详情 --> <!-- 编辑详情 -->
<EditAddForm v-if="show" ref="detailDiloag" :dic="{ JQLB,JQLX,JQXL,JQZL,D_BZ_JQLY,D_BZ_JQFL,JQLB_DP,D_BZ_JQBQ,D_GS_SSYJ }" <EditAddForm v-if="show" ref="detailDiloag"
@updateDate="getList" /> :dic="{ JQLB, JQLX, JQXL, JQZL, D_BZ_JQLY, D_BZ_JQFL, JQLB_DP, D_BZ_JQBQ, D_GS_SSYJ }" @updateDate="getList" />
<!-- 研判弹窗 -->
<!-- 研判弹窗 --> <YpDialog ref="ypDialog" @change="getList" />
<YpDialog ref="ypDialog" @change="getList" /> <DeepYpDialog ref="deepYpDialog" @change="getList" />
<DeepYpDialog ref="deepYpDialog" @change="getList" /> <DiscussionDialog v-model="showDialog" :dataList="dataList" :lx="lx" />
</div> </div>
</template> </template>
<script setup> <script setup>
import { getMultiDictVal } from "@/utils/dict.js"
import { exportExlByObj } from "@/utils/exportExcel.js"
import YpDialog from "./components/ypDialog.vue"; import YpDialog from "./components/ypDialog.vue";
import DeepYpDialog from "./components/deepypDialog.vue"; import DeepYpDialog from "./components/deepypDialog.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue"; import PageTitle from "@/components/aboutTable/PageTitle.vue";
import MyTable from "@/components/aboutTable/MyTable.vue"; import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
@ -64,8 +67,11 @@ import Search from "@/components/aboutTable/Search.vue";
import EditAddForm from "./components/editAddForm.vue"; import EditAddForm from "./components/editAddForm.vue";
import { lzJcjPjdbSelectPage } from '@/api/semanticAnalysis.js' import { lzJcjPjdbSelectPage } from '@/api/semanticAnalysis.js'
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue"; import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import DiscussionDialog from "@/views/backOfficeSystem/JudgmentHome/ResearchHome/components/discussionDialog.vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js"
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const { D_GS_BQ_DJ,JQLB,JQLX,JQXL,JQZL,D_BZ_JQLY,D_BZ_JQFL,JQLB_DP,D_BZ_JQBQ,D_GS_SSYJ } = proxy.$dict('D_GS_BQ_DJ',"JQLB",'JQLX','JQXL','JQZL','D_BZ_JQLY','D_BZ_JQFL','JQLB_DP','D_BZ_JQBQ','D_GS_SSYJ'); //获取字典数据 const { D_GS_BQ_DJ, JQLB, JQLX, JQXL, JQZL, D_BZ_JQLY, D_BZ_JQFL, JQLB_DP, D_BZ_JQBQ, D_GS_SSYJ } = proxy.$dict('D_GS_BQ_DJ', "JQLB", 'JQLX', 'JQXL', 'JQZL', 'D_BZ_JQLY', 'D_BZ_JQFL', 'JQLB_DP', 'D_BZ_JQBQ', 'D_GS_SSYJ'); //获取字典数据
const ypDialog = ref(); const ypDialog = ref();
const deepYpDialog = ref(); const deepYpDialog = ref();
const detailDiloag = ref(); const detailDiloag = ref();
@ -103,7 +109,7 @@ const pageData = reactive({
keyCount: 0, keyCount: 0,
tableConfiger: { tableConfiger: {
rowHieght: 61, rowHieght: 61,
showSelectType: "null", showSelectType: "checkbox",
loading: false, loading: false,
}, },
total: 0, total: 0,
@ -118,12 +124,12 @@ const pageData = reactive({
{ label: "报警时间", prop: "bjsj" }, { label: "报警时间", prop: "bjsj" },
{ label: "报警内容", prop: "bjnr", showOverflowTooltip: true }, { label: "报警内容", prop: "bjnr", showOverflowTooltip: true },
{ label: "接警员姓名", prop: "jjyxm" }, { label: "接警员姓名", prop: "jjyxm" },
{ label: "警情级别", prop: "jqdjdm",showSolt:true }, { label: "警情级别", prop: "jqdjdm", showSolt: true },
// { label: "警情标签", prop: "jjlx", showSolt: true }, // { label: "警情标签", prop: "jjlx", showSolt: true },
{ label: "警情类型", prop: "jqlbdm",showSolt:true }, { label: "警情类型", prop: "jqlbdm", showSolt: true },
{ label: "警情地址", prop: "jqdz" }, { label: "警情地址", prop: "jqdz" },
{ label: "补充接警内容", prop: "bcjjnr", showOverflowTooltip: true }, { label: "补充接警内容", prop: "bcjjnr", showOverflowTooltip: true },
{ label: "研判状态", prop: "ypzt",showSolt:true }, { label: "会商状态", prop: "hszt", showSolt: true },
] ]
}); });
@ -138,6 +144,13 @@ const onSearch = (val) => {
pageData.pageConfiger.pageCurrent = 1; pageData.pageConfiger.pageCurrent = 1;
getList() getList()
} }
const ces=ref()
// 点击关注
const getSlect = () => {
listQuery.value = { ...ces.value.searchObj , sfgz: 1 };
pageData.pageConfiger.pageCurrent = 1;
getList()
}
const changeNo = (val) => { const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val; pageData.pageConfiger.pageCurrent = val;
@ -155,19 +168,14 @@ const getList = () => {
pageSize: pageData.pageConfiger.pageSize, pageSize: pageData.pageConfiger.pageSize,
...listQuery.value ...listQuery.value
} }
lzJcjPjdbSelectPage(params).then(res => { lzJcjPjdbSelectPage(params).then(res => {
console.log(res);
pageData.tableData = res.records || []; pageData.tableData = res.records || [];
pageData.total = res.total; pageData.total = res.total;
}).finally(() => { }).finally(() => {
pageData.tableConfiger.loading = false; pageData.tableConfiger.loading = false;
}) })
} }
// 新增 // 新增
const addEdit = (type, row) => { const addEdit = (type, row) => {
show.value = true; show.value = true;
@ -177,18 +185,79 @@ const addEdit = (type, row) => {
}; };
const handleYP = (type, row) => { const handleYP = (type, row) => {
console.log(type, row); if (type === '研判') {
if(type === '研判'){
ypDialog.value.init(row); ypDialog.value.init(row);
}else{ } else {
deepYpDialog.value.init(row); deepYpDialog.value.init(row);
} }
} }
/** 选中项 */
const selectRows = ref([])
const handleChooseData = (val) => {
selectRows.value = val
}
const exportExl = () => {
const titleObj = {
jjdbh: "接警单编号",
bjdh: "报警电话",
bjsj: "报警时间",
bjnr: "报警内容",
jjyxm: "接警员姓名",
jqdjdm_name: "警情级别",
jqlbdm_name: "警情类型",
jqdz: "警情地址",
bcjjnr: "补充接警内容",
ypzt_name: "会商状态",
}
/** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
const data = needArr.map(item => {
return {
...item,
jqdjdm_name: getMultiDictVal(item.jqdjdm, D_GS_BQ_DJ),
jqlbdm_name: getMultiDictVal(item.jqlbdm, JQLB),
ypzt_name: item.hszt === '01' ? '未会商' : '已会商',
}
})
exportExlByObj(titleObj, data, '警情管理')
}
// 创建会商
const showDialog = ref(false)
const dataList = ref({})
const lx = ref('01')
const CreateConsultationMeeting = (val) => {
dataList.value = val
showDialog.value=true
}
// 是否关注
const Attention = (val,str) => {
proxy.$confirm(`是否${str}该警情?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
// 关注警情
qcckPost({
id: val.jjdbh,
sfgz: val.sfgz === '0' ? '1' : '0',
},'/mosty-gsxt/lzJcjPjdb/jqgz').then(res => {
proxy.$message({
message: `${str}成功`,
type: 'success'
})
getList()
})
}).catch(() => {
// 取消关注
});
}
// 表格高度计算 // 表格高度计算
const tabHeightFn = () => { const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 200; pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
window.onresize = function () { window.onresize = function () {
tabHeightFn(); tabHeightFn();
}; };

View File

@ -48,9 +48,9 @@
<div class="mt4 two_text_detail" v-if="buttonBox"> <div class="mt4 two_text_detail" v-if="buttonBox">
<el-button type="primary" @click="pushAssess(item)">全息档案</el-button> <el-button type="primary" @click="pushAssess(item)">全息档案</el-button>
<el-button type="primary" @click="pushWarning(item)">预警指派</el-button> <el-button type="primary" @click="pushWarning(item)">预警指派</el-button>
<el-button color="#ef7762" @click="showDetail(item)" style="color: #fff;">转合成</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" @click="showTransfer(item)">转会商</el-button> <!-- <el-button type="danger" @click="showTransfer(item)">转会商</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 == '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 == '02'">反馈</el-button>
<el-button type="success" @click="showFeedback(item, '查看反馈')" v-if="item.czzt == '03'">查看反馈</el-button> <el-button type="success" @click="showFeedback(item, '查看反馈')" v-if="item.czzt == '03'">查看反馈</el-button>

View File

@ -1,6 +1,13 @@
<template> <template>
<el-dialog :model-value="modelValue" :title="title" width="70%" @close="closeDialog" destroy-on-close append-to-body> <el-dialog :model-value="modelValue" width="70%" @close="closeDialog" destroy-on-close append-to-body>
<div style="height: 60vh; overflow: auto;"> <template #title>
<div class="flex just-between align-center">
<span class="f18">{{ title }}</span>
<span @click="exportFile" class="f14 pointer" style="color: #0072ff;">下载</span>
</div>
</template>
<div>
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search> <Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight" <MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"> :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
@ -33,6 +40,8 @@
</template> </template>
<script setup> <script setup>
import { getMultiDictVal } from "@/utils/dict.js"
import { exportExlByObj } from "@/utils/exportExcel.js"
import MyTable from "@/components/aboutTable/MyTable.vue"; import MyTable from "@/components/aboutTable/MyTable.vue";
import Search from "@/components/aboutTable/Search.vue"; import Search from "@/components/aboutTable/Search.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
@ -141,6 +150,24 @@ const changeSize = (val) => {
pageData.pageConfiger.pageSize = val; pageData.pageConfiger.pageSize = val;
changePage() changePage()
} }
// 导出
const exportFile = () =>{
const titleObj = {
sxsbsj: "情报上报时间",
xsBh: "情报编号",
qbmc: "情报标题",
qbly_name: "情报来源",
lczt_name: "流程状态",
}
let list = pageData.tableData.map(item => ({
...item,
qbly_name: getMultiDictVal(item.jqdjdm, D_BZ_CJLX),
lczt_name: getMultiDictVal(item.jqlbdm, D_BZ_QBCZZT),
}))
exportExlByObj(titleObj, list, props.title)
}
</script> </script>
<style scoped></style> <style scoped></style>

View File

@ -1,7 +1,13 @@
<template> <template>
<el-dialog :model-value="modelValue" title="重点群体" width="70%" @close="closeDialog" destroy-on-close append-to-body> <el-dialog :model-value="modelValue" width="70%" @close="closeDialog" destroy-on-close append-to-body :close-on-click-modal="false">
<div style="height: 60vh; overflow: auto;"> <template #title>
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search> <div class="flex just-between align-center">
<span class="f18">重点群体</span>
<span @click="exportFile" class="f14 pointer" style="color: #0072ff;">下载</span>
</div>
</template>
<div>
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight" <MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth" :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
fixed="right" :expand="true"> fixed="right" :expand="true">
@ -45,6 +51,8 @@
</template> </template>
<script setup> <script setup>
import { getMultiDictVal } from "@/utils/dict.js"
import { exportExlByObj } from "@/utils/exportExcel.js"
import MyTable from "@/components/aboutTable/MyTable.vue"; import MyTable from "@/components/aboutTable/MyTable.vue";
import Search from "@/components/aboutTable/Search.vue"; import Search from "@/components/aboutTable/Search.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
@ -149,7 +157,6 @@ const changePage = () => {
} }
const changeNo = (val) => { const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val; pageData.pageConfiger.pageCurrent = val;
changePage() changePage()
@ -158,6 +165,25 @@ const changeSize = (val) => {
pageData.pageConfiger.pageSize = val; pageData.pageConfiger.pageSize = val;
changePage() changePage()
} }
// 导出
const exportFile = () =>{
const titleObj = {
qtMc: "群体名称",
qtLb_name: "群体类别",
qtFxdj_name: "风险等级",
qtBjzl: "背景资料",
bgxx_name: "背景信息",
gxSsdwmc: "管辖单位",
}
let list = pageData.tableData.map(item => ({
...item,
qtLb_name: getMultiDictVal(item.qtLb, D_GS_ZDQT_LB),
qtFxdj_name: getMultiDictVal(item.qtFxdj, D_GS_ZDQT_FXDJ),
}))
exportExlByObj(titleObj, list, '重点群体')
}
</script> </script>
<style scoped></style> <style scoped></style>

View File

@ -1,9 +1,13 @@
<template> <template>
<el-dialog :model-value="modelValue" title="重点人总数" width="70%" @close="closeDialog" destroy-on-close append-to-body> <el-dialog :model-value="modelValue" width="70%" @close="closeDialog" destroy-on-close append-to-body :close-on-click-modal="false">
<div style="height: 60vh; overflow: auto;"> <template #title>
<div class="flex just-between align-center">
<span class="f18">重点人总数</span>
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search> <span @click="exportFile" class="f14 pointer" style="color: #0072ff;">下载</span>
</div>
</template>
<div>
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight" <MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth" :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
:expand="true"> :expand="true">
@ -63,6 +67,8 @@
</template> </template>
<script setup> <script setup>
import { getMultiDictVal } from "@/utils/dict.js"
import { exportExlByObj } from "@/utils/exportExcel.js"
import MyTable from "@/components/aboutTable/MyTable.vue"; import MyTable from "@/components/aboutTable/MyTable.vue";
import Search from "@/components/aboutTable/Search.vue"; import Search from "@/components/aboutTable/Search.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
@ -140,7 +146,7 @@ const pageData = reactive({
pageCurrent: 1 pageCurrent: 1
}, //分页 }, //分页
tableColumn: [ tableColumn: [
{ label: "姓名", prop: "ryXm" }, { label: "姓名", prop: "ryXm" },
{ label: "性别", prop: "ryXb", showSolt: true }, { label: "性别", prop: "ryXb", showSolt: true },
{ label: "籍贯", prop: "ryJg", showSolt: true}, { label: "籍贯", prop: "ryJg", showSolt: true},
{ label: "身份证", prop: "rySfzh" }, { label: "身份证", prop: "rySfzh" },
@ -175,16 +181,6 @@ const changePage = () => {
} }
// 查看详情
const showDetail = (item) => {
router.push({
path: '/CollectCrculate',
query: {
id: item.id
}
})
}
const changeNo = (val) => { const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val; pageData.pageConfiger.pageCurrent = val;
changePage() changePage()
@ -193,6 +189,28 @@ const changeSize = (val) => {
pageData.pageConfiger.pageSize = val; pageData.pageConfiger.pageSize = val;
changePage() changePage()
} }
// 导出
const exportFile = () =>{
const titleObj = {
ryXm: "姓名",
ryXb_name: "性别",
ryJg_name: "籍贯",
rySfzh: "身份证",
ryMz_name: "民族",
hjdQh_name: "户籍地区划",
hjdPcsmc: "户籍派出所",
}
let list = pageData.tableData.map(item => ({
...item,
ryXb_name: getMultiDictVal(item.ryXb, D_BZ_XB),
ryJg_name: getMultiDictVal(item.ryJg, D_BZ_XZQHDM),
ryMz_name: getMultiDictVal(item.ryMz, D_BZ_MZ),
hjdQh_name: getMultiDictVal(item.hjdQh, D_BZ_XZQHDM),
}))
exportExlByObj(titleObj, list, '重点人总数')
}
</script> </script>
<style scoped> <style scoped>

View File

@ -1,6 +1,13 @@
<template> <template>
<el-dialog :model-value="modelValue" title="预警总数" width="70%" @close="closeDialog" destroy-on-close append-to-body> <el-dialog :model-value="modelValue" width="70%" @close="closeDialog" destroy-on-close append-to-body>
<div style="height: 60vh; overflow: auto;">
<template #title>
<div class="flex just-between align-center">
<span class="f18">{{ title }}</span>
<span @click="exportFile" class="f14 pointer" style="color: #0072ff;">下载</span>
</div>
</template>
<div>
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search> <Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight" <MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"> :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
@ -54,6 +61,8 @@
</template> </template>
<script setup> <script setup>
import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js"
import MyTable from "@/components/aboutTable/MyTable.vue"; import MyTable from "@/components/aboutTable/MyTable.vue";
import Search from "@/components/aboutTable/Search.vue"; import Search from "@/components/aboutTable/Search.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
@ -61,13 +70,16 @@ import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { ref, reactive, getCurrentInstance, watch } from "vue"; import { ref, reactive, getCurrentInstance, watch } from "vue";
import {timeValidate} from '@/utils/tools.js' import {timeValidate} from '@/utils/tools.js'
const { proxy } = getCurrentInstance() const { proxy } = getCurrentInstance()
const { D_BZ_YJJB, D_GS_ZDQT_YJLB, D_BZ_YJLX } = proxy.$dict("D_BZ_YJJB", "D_GS_ZDQT_YJLB", "D_BZ_YJLX"); //获取字典数据 const { D_BZ_YJJB, D_GS_ZDQT_YJLB, D_BZ_YJLX } = proxy.$dict("D_BZ_YJJB", "D_GS_ZDQT_YJLB", "D_BZ_YJLX"); //获取字典数据
const props = defineProps({ const props = defineProps({
modelValue: { modelValue: {
type: Boolean, type: Boolean,
default: false default: false
}, },
type: {
type: String,
default: ''
},
dict: { dict: {
type: Object, type: Object,
default: () => ({}) default: () => ({})
@ -89,9 +101,10 @@ const searchConfiger = ref([
}, },
]); ]);
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
let today = new Date(); const title = ref('')
let startOfDay = new Date(today.getFullYear(), today.getMonth(), today.getDate()); let today = new Date();
let endOfDay = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 23, 59, 59, 999); let startOfDay = new Date(today.getFullYear(), today.getMonth(), today.getDate());
let endOfDay = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 23, 59, 59, 999);
const closeDialog = () => { const closeDialog = () => {
emit('update:modelValue', false) emit('update:modelValue', false)
} }
@ -138,6 +151,7 @@ const onSearch = (val) => {
} }
watch(() => props.modelValue, (val) => { watch(() => props.modelValue, (val) => {
if (val) { if (val) {
title.value = props.type == 'wqs' ? '未签收预警' : props.type == 'yfk' ? '已反馈预警' : '预警总数'
// 获取今天的开始时间和结束时间 // 获取今天的开始时间和结束时间
parameter.value = {startTime:timeValidate(startOfDay), endTime:timeValidate(endOfDay)} parameter.value = {startTime:timeValidate(startOfDay), endTime:timeValidate(endOfDay)}
changePage() changePage()
@ -150,10 +164,14 @@ pageData.tableConfiger.loading = true;
const promes = { const promes = {
...parameter.value, ...parameter.value,
yjjbList:parameter.value.yjjbList? [parameter.value.yjjbList] : [], yjjbList:parameter.value.yjjbList? [parameter.value.yjjbList] : [],
yjlxList: ['01'], yjlxList: ['01'],
pageCurrent: pageData.pageConfiger.pageCurrent, pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize pageSize: pageData.pageConfiger.pageSize
} }
if(props.type == 'wqs') promes.czzt = '01';
if(props.type == 'yfk') promes.czzt = '03';
qcckPost(promes, '/mosty-gsxt/tbYjxx/getPageAllList').then((res) => { qcckPost(promes, '/mosty-gsxt/tbYjxx/getPageAllList').then((res) => {
pageData.total = res.total || 0; pageData.total = res.total || 0;
pageData.tableConfiger.loading = false; pageData.tableConfiger.loading = false;
@ -187,6 +205,30 @@ const changeSize = (val) => {
pageData.pageConfiger.pageSize = val; pageData.pageConfiger.pageSize = val;
changePage() changePage()
} }
// 导出
const exportFile = () =>{
const titleObj = {
ryxm: "姓名",
rysfzh: "身份证号",
yjbq: "预警标签",
yjdz: "预警地址",
yjjb_name: "预警级别",
yjlb_name: "预警类别",
yjlx_name: "预警类型",
yjsj: "预警时间",
ssbm: "所属部门",
cph: "车牌号",
}
let list = pageData.tableData.map(item => ({
...item,
yjjb_name: getMultiDictVal(item.yjjb, D_BZ_YJJB),
yjlb_name: getMultiDictVal(item.yjlb, D_BZ_YJLX),
yjlx_name: getMultiDictVal(item.yjlx, D_GS_ZDQT_YJLB),
}))
exportExlByObj(titleObj, list, title.value)
}
</script> </script>
<style scoped></style> <style scoped></style>

Some files were not shown because too many files have changed in this diff Show More