Compare commits
51 Commits
9b8e788e61
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| c67b63b4f1 | |||
| 4518038d9e | |||
| 78c828763b | |||
| dcf680163a | |||
| b1ea8f2e5b | |||
| e561ef9e6d | |||
| b8c393f773 | |||
| f30a2d7411 | |||
| d2e4fc137d | |||
| c0ba4c7c49 | |||
| 2aef20eabf | |||
| 9d4aba2f47 | |||
| 323fcd25fe | |||
| 872fcf7332 | |||
| a2fb3dcba5 | |||
| c4dca8f769 | |||
| b306f2b03b | |||
| d3b4e76544 | |||
| 2a82feb59a | |||
| db3e3ee82f | |||
| c8c130093f | |||
| c18ce8ff0e | |||
| 7d61f83463 | |||
| da05ca015e | |||
| a129e6d3f4 | |||
| 2ea24d36f2 | |||
| dfe6036489 | |||
| a8b39af475 | |||
| fa4b36bd8c | |||
| 2cc924d091 | |||
| 06453b284c | |||
| 4ad9f4976f | |||
| 39cf4b27f5 | |||
| 62db6672f6 | |||
| 5a1fc57019 | |||
| c606d6e8fd | |||
| d003d7a20e | |||
| d75295e756 | |||
| 1390662e4d | |||
| 5545659aee | |||
| 2635c76e79 | |||
| 0e5a9c710d | |||
| 861c1168e7 | |||
| f7a83c1541 | |||
| 105d13e8cb | |||
| 9e09db7f49 | |||
| 390ef86532 | |||
| 4f70b13ab7 | |||
| 8c66561605 | |||
| 65bc52b352 | |||
| 2ceaa966cf |
@ -7,7 +7,6 @@
|
||||
</keep-alive>
|
||||
</router-view>
|
||||
<Fzq />
|
||||
|
||||
</template>
|
||||
<script setup>
|
||||
import Watermark from "@/components/Watermark.vue";
|
||||
|
||||
BIN
src/assets/images/cjyp.mp3
Normal file
BIN
src/assets/images/cjyp.mp3
Normal file
Binary file not shown.
BIN
src/assets/images/icon-blue.png
Normal file
BIN
src/assets/images/icon-blue.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.0 KiB |
BIN
src/assets/images/icon-down.png
Normal file
BIN
src/assets/images/icon-down.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 280 B |
BIN
src/assets/images/icon-orange.png
Normal file
BIN
src/assets/images/icon-orange.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.0 KiB |
BIN
src/assets/images/icon-red.png
Normal file
BIN
src/assets/images/icon-red.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.1 KiB |
BIN
src/assets/images/icon-up.png
Normal file
BIN
src/assets/images/icon-up.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 313 B |
BIN
src/assets/images/icon-yellow.png
Normal file
BIN
src/assets/images/icon-yellow.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.1 KiB |
BIN
src/assets/images/xsyp.mp3
Normal file
BIN
src/assets/images/xsyp.mp3
Normal file
Binary file not shown.
BIN
src/assets/images/ypbg.mp3
Normal file
BIN
src/assets/images/ypbg.mp3
Normal file
Binary file not shown.
BIN
src/assets/images/ypzl.mp3
Normal file
BIN
src/assets/images/ypzl.mp3
Normal file
Binary file not shown.
@ -1,5 +1,12 @@
|
||||
<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:y="element.y"
|
||||
v-model:h="element.height"
|
||||
@ -19,17 +26,17 @@
|
||||
<div class="conference-header">
|
||||
<div class="header-top">
|
||||
<div class="title-section" v-show="displaySubject">
|
||||
<h3 v-if="!editSubject" @click="editSubject = true" class="conference-title">
|
||||
{{ displaySubject }}
|
||||
</h3>
|
||||
<h3 v-if="!editSubject" @click="editSubject = true" class="conference-title">{{ displaySubject }} </h3>
|
||||
<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">
|
||||
<span class="id-label">会议号:</span>
|
||||
<span class="id-value">{{ activeMeetingConfig?.meeting?.number }}</span>
|
||||
<el-icon class="copy-icon"><CopyDocument /></el-icon>
|
||||
</div>
|
||||
</div>
|
||||
<div style="color: #999999;padding-right: 30px;">
|
||||
<el-icon size="18px" @click="handleWindowSize"><Minus /></el-icon>
|
||||
</div>
|
||||
</div>
|
||||
<div class="participants-info">
|
||||
<el-icon><User /></el-icon>
|
||||
@ -75,17 +82,22 @@
|
||||
|
||||
<div class="control-bar">
|
||||
<!-- 锁定 -->
|
||||
<el-button circle @click="lockConference" class="control-btn">
|
||||
<el-icon size="20px" v-if="activeMeetingConfig?.lockStatus == 1"><Lock/></el-icon>
|
||||
<el-icon size="20px" v-else ><Unlock/></el-icon>
|
||||
</el-button>
|
||||
<div class="flex dir-column align-center">
|
||||
<el-button circle @click="lockConference" class="control-btn">
|
||||
<el-icon size="24px" v-if="activeMeetingConfig?.lockStatus == 1"><Lock/></el-icon>
|
||||
<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-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">
|
||||
<template #reference>
|
||||
<el-icon class="control-arrow" color="#fff"><ArrowDown/></el-icon>
|
||||
@ -94,10 +106,14 @@
|
||||
</el-popover>
|
||||
|
||||
<!-- 扬声器 -->
|
||||
<el-button circle @click="setMuteEar" class="control-btn">
|
||||
<img v-if="audioOuputStatus == 1" src="@/assets/images/webPuc/svgs/earpiece.svg" alt="">
|
||||
<img v-else src="@/assets/images/webPuc/svgs/trumpet_mute.svg" alt="">
|
||||
</el-button>
|
||||
<div class="flex dir-column align-center">
|
||||
<el-button circle @click="setMuteEar" class="control-btn">
|
||||
<img v-if="audioOuputStatus == 1" src="@/assets/images/webPuc/svgs/earpiece.svg" alt="">
|
||||
<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">
|
||||
<template #reference>
|
||||
<el-icon class="control-arrow" color="#fff"><ArrowDown/></el-icon>
|
||||
@ -106,10 +122,13 @@
|
||||
</el-popover>
|
||||
|
||||
<!-- 摄像头 -->
|
||||
<el-button circle @click="setCamera" class="control-btn">
|
||||
<img v-if="userInfo?.camera_status === CAMERA_STATUS_OPEN" src="@/assets/images/webPuc/svgs/camera.svg" alt="">
|
||||
<img v-else src="@/assets/images/webPuc/svgs/camera_mute.svg" alt="">
|
||||
</el-button>
|
||||
<div class="flex dir-column align-center">
|
||||
<el-button circle @click="setCamera" class="control-btn">
|
||||
<img v-if="userInfo?.camera_status === CAMERA_STATUS_OPEN" src="@/assets/images/webPuc/svgs/camera.svg" alt="">
|
||||
<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">
|
||||
<template #reference>
|
||||
<el-icon class="control-arrow" color="#fff"><ArrowDown/></el-icon>
|
||||
@ -118,64 +137,72 @@
|
||||
</el-popover>
|
||||
|
||||
<!-- 屏幕共享 -->
|
||||
<el-button circle @click="setShareScreenStatus(1)" class="control-btn">
|
||||
<img src="@/assets/images/webPuc/svgs/share_video.svg" alt="">
|
||||
</el-button>
|
||||
<div class="flex dir-column align-center">
|
||||
<el-button circle @click="setShareScreenStatus(1)" class="control-btn">
|
||||
<img src="@/assets/images/webPuc/svgs/share_video.svg" alt="">
|
||||
</el-button>
|
||||
<div>屏幕共享</div>
|
||||
</div>
|
||||
|
||||
<!-- 结束共享 / 结束会议 (Center) -->
|
||||
<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>
|
||||
|
||||
<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 v-if="activeMeetingConfig?.sharingMember?.basedata_id === userInfo?.basedata_id" type="danger" shape="round" status="danger" class="hangup-btn" @click="setShareScreenStatus(0)">结束共享</el-button>
|
||||
<!-- 结束会议 v-if="globalStore.IS_CURRENT_MEETING_OWNER"-->
|
||||
<el-button v-else type="danger" shape="round" class="hangup-btn" @click="endConference">结束会议</el-button>
|
||||
|
||||
<!-- 成员管理 -->
|
||||
<el-button circle @click="showMembers" class="control-btn">
|
||||
<el-icon color="#fff" size="20"><Auatar/></el-icon>
|
||||
</el-button>
|
||||
<div class="flex dir-column align-center">
|
||||
<el-button circle @click="showMembers" class="control-btn">
|
||||
<el-icon color="#fff" size="24px"><Grid /></el-icon>
|
||||
</el-button>
|
||||
<div>成员管理</div>
|
||||
</div>
|
||||
|
||||
<!-- 语音激励 -->
|
||||
<el-button circle @click="setVoiceStimulation()" class="control-btn">
|
||||
<img v-if="activeMeetingConfig?.voiceStimulation" src="@/assets/images/webPuc/svgs/icon_embrave.svg" alt="">
|
||||
<img v-else src="@/assets/images/webPuc/svgs/conference_icom_cancel_voice_stimulation.svg" alt="">
|
||||
</el-button>
|
||||
<div class="flex dir-column align-center">
|
||||
<el-button circle @click="setVoiceStimulation()" class="control-btn">
|
||||
<img v-if="activeMeetingConfig?.voiceStimulation" src="@/assets/images/webPuc/svgs/icon_embrave.svg" alt="">
|
||||
<img v-else src="@/assets/images/webPuc/svgs/conference_icom_cancel_voice_stimulation.svg" alt="">
|
||||
</el-button>
|
||||
<div>语音激励</div>
|
||||
</div>
|
||||
|
||||
<!-- 布局 -->
|
||||
<!-- <LaoutType @setConfernceLayoutType="setConfernceLayoutType" /> -->
|
||||
|
||||
<!-- 画面抓取-截图 -->
|
||||
<el-button circle @click="startScreenshot" class="control-btn">
|
||||
<el-icon color="#fff" size="20"><Scissor/></el-icon>
|
||||
</el-button>
|
||||
<div class="flex dir-column align-center">
|
||||
<el-button circle @click="startScreenshot" class="control-btn">
|
||||
<el-icon color="#fff" size="24px"><Scissor/></el-icon>
|
||||
</el-button>
|
||||
<div>截图</div>
|
||||
</div>
|
||||
|
||||
<!-- 视频广播 -->
|
||||
<el-button circle @click="broadcastAction" class="control-btn">
|
||||
<img src="@/assets/images/webPuc/svgs/icon_broadcast.svg" alt="">
|
||||
</el-button>
|
||||
<div class="flex dir-column align-center">
|
||||
<el-button circle @click="broadcastAction" class="control-btn">
|
||||
<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">
|
||||
<el-icon v-if="!isRecording"><Camera/></el-icon>
|
||||
<el-icon v-else style="color: red"><Videopause/></el-icon>
|
||||
</el-button>
|
||||
<el-button circle @click="toggleFullscreen" class="control-btn">
|
||||
<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>
|
||||
<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>
|
||||
</el-button>
|
||||
<div class="flex dir-column align-center">
|
||||
<el-button circle @click="!isRecording ? mediaRecorder.start() : mediaRecorder.stop()" class="control-btn">
|
||||
<el-icon size="24px" v-if="!isRecording"><Camera/></el-icon>
|
||||
<el-icon size="24px" v-else style="color: red"><Videopause/></el-icon>
|
||||
</el-button>
|
||||
<div>{{ isRecording ? '录屏':'停止' }}</div>
|
||||
</div>
|
||||
|
||||
|
||||
<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>
|
||||
|
||||
@ -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(()=>{
|
||||
console.log(globalStore,'=====0000000000000');
|
||||
@ -795,6 +834,7 @@ onMounted(()=>{
|
||||
});
|
||||
|
||||
|
||||
|
||||
onUnmounted(() => {
|
||||
emitter.off('onMediaStream');
|
||||
emitter.off('onHangup');
|
||||
@ -804,7 +844,67 @@ onUnmounted(() => {
|
||||
|
||||
</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 {
|
||||
position: absolute;
|
||||
display: flex;
|
||||
|
||||
@ -188,8 +188,6 @@ export function MapUtil(map) {
|
||||
}
|
||||
// 弹窗自定义标签内容
|
||||
function zdyContentHtml(flag, item) {
|
||||
console.log(item);
|
||||
|
||||
let html = ''
|
||||
switch (flag) {
|
||||
case 'hm_pop':
|
||||
|
||||
@ -132,10 +132,18 @@ const props = defineProps({
|
||||
tableHeight: {
|
||||
type: Number || String,
|
||||
},
|
||||
// 在自动滚动中,想滚动到底部,是否请求下一页
|
||||
hasNext: {
|
||||
type: Number,
|
||||
default: false
|
||||
},
|
||||
|
||||
// 自动滚动
|
||||
isScroll: {
|
||||
type: Number,
|
||||
default: false
|
||||
},
|
||||
|
||||
customClass: {
|
||||
type: String
|
||||
},
|
||||
@ -333,6 +341,8 @@ const createScroll = () => {
|
||||
timer.value = setInterval(() => {
|
||||
target.scrollTop += 1;
|
||||
if (target.scrollTop >= originalBodyHeight.value) {
|
||||
// 滚动到底部没有下一页了,循环滚动 ,
|
||||
if(props.hasNext) emit("changePage");
|
||||
target.scrollTop -= originalBodyHeight.value;
|
||||
}
|
||||
}, 20);
|
||||
|
||||
@ -415,6 +415,13 @@ const reset = () => {
|
||||
emit("reset", true);
|
||||
emit("submit", searchObj);
|
||||
};
|
||||
|
||||
// 暴露searchObj给父组件
|
||||
defineExpose({
|
||||
searchObj,
|
||||
submit,
|
||||
reset
|
||||
});
|
||||
watchEffect(() => {
|
||||
loadingPage.value = true;
|
||||
let arr = JSON.parse(JSON.stringify(props.searchArr));
|
||||
|
||||
240
src/components/common/TestDiv copy.vue
Normal file
240
src/components/common/TestDiv copy.vue
Normal 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>
|
||||
284
src/components/common/TestDiv.vue
Normal file
284
src/components/common/TestDiv.vue
Normal 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>
|
||||
156
src/components/common/item.vue
Normal file
156
src/components/common/item.vue
Normal 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>
|
||||
@ -64,7 +64,6 @@ const startDrag = (e) => {
|
||||
// 处理移动
|
||||
const handleMove = (e) => {
|
||||
if (!isDragging.value) return;
|
||||
|
||||
let clientX, clientY;
|
||||
if (e.type === 'mousemove') {
|
||||
clientX = e.clientX;
|
||||
|
||||
@ -133,7 +133,6 @@ onBeforeUnmount(() => {
|
||||
});
|
||||
// 带样式的下载方法
|
||||
const downloadWithStyles = () => {
|
||||
|
||||
const wordDocument = `
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" >
|
||||
<head>
|
||||
|
||||
@ -11,6 +11,7 @@
|
||||
<AppMain />
|
||||
</div>
|
||||
</div>
|
||||
<TestDiv />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -20,6 +21,7 @@ import NavBar from "./components/NavBar";
|
||||
import SideBar from "./components/SideBar/index";
|
||||
import AppMain from "./components/AppMain";
|
||||
import TagsView from "./components/TagsView";
|
||||
import TestDiv from "@/components/common/TestDiv.vue";
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
||||
@ -1,9 +1,6 @@
|
||||
import * as ElIcons from "@element-plus/icons-vue";
|
||||
import Axios from 'axios'
|
||||
|
||||
import {
|
||||
createApp
|
||||
} from "vue";
|
||||
import { createApp } from "vue";
|
||||
import App from "./App.vue";
|
||||
import router from "./router";
|
||||
import store from "./store";
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
// 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') {
|
||||
url = "ws://47.108.232.77:9537/mosty-api/mosty-websocket/socket/"; //本地
|
||||
|
||||
@ -15,9 +15,7 @@ import store from "@/store";
|
||||
* 私有路由表
|
||||
*/
|
||||
|
||||
export const privateRoutes = [
|
||||
|
||||
];
|
||||
export const privateRoutes = [];
|
||||
|
||||
/**
|
||||
* 公开路由表
|
||||
@ -166,7 +164,7 @@ export const publicRoutes = [
|
||||
{
|
||||
path: "/YjData",
|
||||
name: "YjData",
|
||||
meta: { title: "预警", icon: "article-create" },
|
||||
meta: { title: "预警列表", icon: "article-create" },
|
||||
component: () => import("@/views/backOfficeSystem/fourColorManage/YjData/index.vue"),
|
||||
},
|
||||
// {
|
||||
@ -733,14 +731,24 @@ export const publicRoutes = [
|
||||
// },
|
||||
|
||||
{
|
||||
path: "/JobAppraisal",
|
||||
name: "JobAppraisal",
|
||||
component: () => import("@/views/backOfficeSystem/HumanIntelligence/JobAppraisal/index"),
|
||||
path: "/permissionApply",
|
||||
name: "permissionApply",
|
||||
component: () => import("@/views/backOfficeSystem/HumanIntelligence/permissionApply/index"),
|
||||
meta: {
|
||||
title: "工作考核",
|
||||
title: "权限申请",
|
||||
icon: "article-create"
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/appraisalManagement",
|
||||
name: "appraisalManagement",
|
||||
component: () => import("@/views/backOfficeSystem/HumanIntelligence/appraisalManagement/index"),
|
||||
meta: {
|
||||
title: "考核管理",
|
||||
icon: "article-create"
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
path: "/FileData",
|
||||
name: "FileData",
|
||||
@ -1181,6 +1189,15 @@ export const publicRoutes = [
|
||||
icon: "article-create"
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/JobAppraisal",
|
||||
name: "JobAppraisal",
|
||||
component: () => import("@/views/backOfficeSystem/HumanIntelligence/JobAppraisal/index"),
|
||||
meta: {
|
||||
title: "工作考核",
|
||||
icon: "article-create"
|
||||
}
|
||||
},
|
||||
// {
|
||||
// path: "/ResearchHome",
|
||||
// name: "ResearchHome",
|
||||
|
||||
@ -143,7 +143,6 @@ const connectSSEWithPost = (prompt, options = {}) => {
|
||||
reject(error);
|
||||
}
|
||||
};
|
||||
|
||||
readStream();
|
||||
}).catch(error => {
|
||||
console.error('SSE请求错误:', error);
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
// 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') {
|
||||
url = "ws://47.108.232.77:9537/mosty-api/mosty-websocket/socket/"; //本地
|
||||
@ -86,8 +86,6 @@ class WebSoketClass {
|
||||
if (fun) fun(true);
|
||||
};
|
||||
this.ws.onclose = (e) => {
|
||||
console.log(e);
|
||||
|
||||
console.log('WebSocket连接已关闭,关闭码:', e.code, '原因:', e.reason);
|
||||
// 如果是正常关闭(1000)或手动关闭(1001),不进行重连
|
||||
if (e.code !== 1000 && e.code !== 1001) {
|
||||
@ -165,7 +163,6 @@ class WebSoketClass {
|
||||
// 接收发送消息
|
||||
getMessage() {
|
||||
this.ws.onmessage = (e) => {
|
||||
console.log(e);
|
||||
|
||||
try {
|
||||
if (e.data) {
|
||||
@ -175,6 +172,9 @@ class WebSoketClass {
|
||||
// 触发音频播放
|
||||
console.log('触发音频播放');
|
||||
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') {
|
||||
// // 触发音频停止
|
||||
@ -187,7 +187,7 @@ class WebSoketClass {
|
||||
// emitter.emit('statusUpdate', newsDate.data);
|
||||
// }
|
||||
// // 通用消息事件
|
||||
// emitter.emit('webSocketMessage', newsDate);
|
||||
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('处理WebSocket消息失败:', error);
|
||||
|
||||
@ -53,10 +53,8 @@
|
||||
<DictTag :tag="false" :value="row.qtFxdj" :options="D_GS_ZDQT_FXDJ" />
|
||||
</template>
|
||||
<template #bqList="{ row }">
|
||||
<ul>
|
||||
<li class="one_text_detail marks mb4" :key="index" v-for="(item, index) in row.bqList">{{ item.bqMc }}({{
|
||||
item.bqFz || 0 }} 分) </li>
|
||||
</ul>
|
||||
<span class="one_text_detail marks mr2" :key="index" v-for="(item, index) in row.bqList">{{ item.bqMc }}({{
|
||||
item.bqFz || 0 }} 分) 、</span>
|
||||
</template>
|
||||
<template #zdryList="{ row }">
|
||||
<span style="color: #0072ff">{{ row.zdryList ? row.zdryList.length : 0 }}</span>
|
||||
@ -173,20 +171,18 @@ const pageData = reactive({
|
||||
},
|
||||
controlsWidth: 280,
|
||||
tableColumn: [
|
||||
{ label: "群体名称", prop: "qtMc", width: 150 },
|
||||
{ label: "群体类别", prop: "qtLb", showSolt: true, width: 150 },
|
||||
{ label: "风险等级", prop: "qtFxdj", showSolt: true, width: 150 },
|
||||
{ label: "背景资料", prop: "qtBjzl", width: 150 },
|
||||
{ label: "背景信息", prop: "bgxx", showSolt: true, width: 150 },
|
||||
{ label: "管辖单位", prop: "gxSsdwmc", width: 150 },
|
||||
{ label: "列控原因", prop: "zdrLkyy", width: 150 },
|
||||
{ label: "开始时间", prop: "zdrRkkssj", width: 150 },
|
||||
{ label: "截至时间", prop: "zdrRkjssj", width: 150 },
|
||||
{ label: "稳控人数", prop: "zdryList", showSolt: true, width: 150 },
|
||||
{ label: "状态", prop: "qtZt", showSolt: true, width: 150 },
|
||||
{ label: "标签", prop: "bqList", showSolt: true, showOverflowTooltip: true, width: 400 },
|
||||
{ label: "创建单位", prop: "xtCjbmmc", width: 150 },
|
||||
{ label: "创建时间", prop: "xtCjsj", width: 150 },
|
||||
{ label: "群体名称", prop: "qtMc" },
|
||||
{ label: "群体类别", prop: "qtLb", showSolt: true },
|
||||
{ label: "风险等级", prop: "qtFxdj", showSolt: true },
|
||||
// { label: "背景资料", prop: "qtBjzl" },
|
||||
{ label: "背景信息", prop: "bgxx", showSolt: true },
|
||||
{ label: "管辖单位", prop: "gxSsdwmc" },
|
||||
{ label: "列控原因", prop: "zdrLkyy" },
|
||||
{ label: "开始时间", prop: "zdrRkkssj" },
|
||||
{ label: "截至时间", prop: "zdrRkjssj" },
|
||||
{ label: "稳控人数", prop: "zdryList", showSolt: true },
|
||||
{ label: "状态", prop: "qtZt", showSolt: true },
|
||||
{ label: "标签", prop: "bqList", showSolt: true, showOverflowTooltip: true, },
|
||||
]
|
||||
});
|
||||
|
||||
@ -328,7 +324,7 @@ defineExpose({});
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.marks {
|
||||
padding: 0 4px;
|
||||
padding: 0 2px;
|
||||
white-space: nowrap;
|
||||
background: #73acf1;
|
||||
border-radius: 4px;
|
||||
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -177,54 +177,36 @@ const previewFile = (item) => {
|
||||
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);
|
||||
|
||||
if (dataList.length === 0) return proxy.$message.warning('没有文件可下载');
|
||||
const downloadCount = dataList.length;
|
||||
let successCount = 0;
|
||||
let failCount = 0;
|
||||
|
||||
proxy.$message.info(`开始下载${downloadCount}个文件...`);
|
||||
|
||||
// 并行下载所有文件
|
||||
const downloadPromises = dataList.map(async (fileData, index) => {
|
||||
|
||||
const downloadPromises = dataList.map(async (fileData, index) => {
|
||||
try {
|
||||
// fileData.url = "http://47.108.232.77:9000/image/2025-01-06/081102a5418e4146beea277d18018e07.jpeg";
|
||||
// 使用fetch获取文件内容
|
||||
const response = await fetch(fileData.url);
|
||||
if (!response.ok) {
|
||||
throw new Error('文件下载失败');
|
||||
}
|
||||
|
||||
const downloadUrl = fileData.url.replace(/^https?:\/\/[^/]+/, '/zyminio');
|
||||
const response = await fetch(downloadUrl);
|
||||
if (!response.ok) throw new Error('文件下载失败');
|
||||
// 将响应转换为Blob对象
|
||||
const blob = await response.blob();
|
||||
|
||||
// 创建下载链接
|
||||
const downloadLink = document.createElement('a');
|
||||
downloadLink.href = URL.createObjectURL(blob);
|
||||
|
||||
// 设置下载文件的名称,避免冲突
|
||||
const fileName = dataList.length > 1
|
||||
? `${item.wjmc}_${index + 1}`
|
||||
: item.wjmc;
|
||||
const fileName = dataList.length > 1 ? `${item.wjmc}_${index + 1}` : item.wjmc;
|
||||
downloadLink.download = fileName;
|
||||
|
||||
// 触发下载
|
||||
document.body.appendChild(downloadLink);
|
||||
downloadLink.click();
|
||||
|
||||
// 清理
|
||||
setTimeout(() => {
|
||||
document.body.removeChild(downloadLink);
|
||||
URL.revokeObjectURL(downloadLink.href);
|
||||
}, 100);
|
||||
|
||||
successCount++;
|
||||
} catch (error) {
|
||||
console.error(`文件${index + 1}下载失败:`, error);
|
||||
|
||||
@ -11,7 +11,7 @@
|
||||
<div class="form-content" v-loading="loading">
|
||||
<!-- <div class="form_cnt"> -->
|
||||
<FormMessage :disabled="disabled" v-model="listQuery" :formList="formData" ref="elform" :rules="rules">
|
||||
<template #jbxx>
|
||||
<!-- <template #jbxx>
|
||||
<div>
|
||||
<h3 class="tags-title">报送情况</h3>
|
||||
<div style="width: 200%;">
|
||||
@ -23,7 +23,7 @@
|
||||
</el-descriptions>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</template> -->
|
||||
<template #shzt>
|
||||
<div v-if="disabled">
|
||||
<h3 class="tags-title">审核状态</h3>
|
||||
@ -566,17 +566,26 @@ defineExpose({ init });
|
||||
.form-container {
|
||||
display: flex;
|
||||
width: 100%;
|
||||
height: calc(100% - 50px);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.form-content {
|
||||
// display: flex;
|
||||
width: 80%;
|
||||
flex: 1;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.timeline-container {
|
||||
width: 400px;
|
||||
padding-right: 10px;
|
||||
box-sizing: border-box;
|
||||
border: 1px solid #ebeef5;
|
||||
flex: 1;
|
||||
margin: 0 10px;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
/* 时间线宽度 */
|
||||
|
||||
@ -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>
|
||||
@ -12,7 +12,7 @@
|
||||
</el-icon>
|
||||
<span class="vertical-middle">新增</span>
|
||||
</el-button>
|
||||
<el-button type="primary" @click="dologCancel()" size="small">
|
||||
<el-button type="primary" @click="exportFileModel = true;" size="small">
|
||||
<el-icon class="vertical-middle">
|
||||
<CirclePlus />
|
||||
</el-icon>
|
||||
@ -30,7 +30,12 @@
|
||||
<CirclePlus />
|
||||
</el-icon>
|
||||
<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>
|
||||
<!-- 表格 -->
|
||||
<div class="tabBox" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
|
||||
@ -49,7 +54,6 @@
|
||||
<template #lczt="{ row }">
|
||||
<DictTag :tag="false" :value="row.lczt" :options="D_BZ_LCZT" />
|
||||
</template>
|
||||
|
||||
<template #cyqk="{ row }">
|
||||
<el-link v-if="isShowBtn('采纳')" size="small" type="danger" @click="cnMsg(row)"
|
||||
:disabled="butcontroll('04', row.lczt)">采纳</el-link>
|
||||
@ -61,16 +65,27 @@
|
||||
<!-- "市情指挥人员": ["采纳", "回退", "分组", "转线索", "转合成", "转会商", "打标签", "修改", "详情", "关注部门", "送审"], -->
|
||||
<!-- "县情指人员": ["上报", "回退", "修改", "详情", "送审"], -->
|
||||
<template #controls="{ row }">
|
||||
<el-link v-if="isShowBtn('送审', row) && qxkz.deptLevel == '01'"
|
||||
:disabled="row.sldshzt != '00' || row.lczt != '04'" size="small" type="primary"
|
||||
@click="postXxcjXxcjTjsh(row)">送审</el-link>
|
||||
<el-link v-if="isShowBtn('送审', row) && qxkz.deptLevel == '02'"
|
||||
:disabled="row.xldshzt != '00' || row.lczt != '04'" size="small" type="primary"
|
||||
@click="postXxcjXxcjTjsh(row)">送审</el-link>
|
||||
<el-link
|
||||
v-if="isShowBtn('送审', row) && qxkz.deptLevel == '01'"
|
||||
:disabled="!(row.lczt == '04')||row.sldshzt != '00'"
|
||||
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'" -->
|
||||
<!-- 在提交和退回得状态才能进行上报 -->
|
||||
<el-link v-if="isShowBtn('上报')" size="small" type="primary" @click="appearNewspapers(row)"
|
||||
:disabled="row.xldshzt != '02' || (row.lczt != '02' || row.lczt != '03')">上报</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)"
|
||||
:disabled="row.sldshzt != '02'">分组</el-link>
|
||||
<!-- 只有领导有肯定 -->
|
||||
@ -85,17 +100,13 @@
|
||||
<el-link v-if="isShowBtn('转线索')" size="small" type="primary" @click="FollowUpOnLeads(row)"
|
||||
:disabled="row.sldshzt != '02'">转线索</el-link>
|
||||
<!-- 所有状态都能进行转合成 -->
|
||||
<!-- <el-link v-if="isShowBtn('转合成')" size="small" type="primary" @click="openFkDialogszl(row)"
|
||||
:disabled="butcontroll('01', row.lczt)">转合成</el-link> -->
|
||||
<!-- <el-link v-if="isShowBtn('转合成')" size="small" type="primary" @click="openFkDialogszl(row)" :disabled="butcontroll('01', row.lczt)">转合成</el-link> -->
|
||||
<!-- 所有状态都能进行转会商 -->
|
||||
<!-- <el-link v-if="isShowBtn('转会商')" size="small" type="primary" @click="handleTransferMerchant(row)"
|
||||
:disabled="butcontroll('01', row.lczt)">转会商</el-link> -->
|
||||
<!-- <el-link v-if="isShowBtn('转会商')" size="small" type="primary" @click="handleTransferMerchant(row)" :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)"
|
||||
:disabled="row.sldshzt != '02'">打标签</el-link>
|
||||
<el-link v-if="isShowBtn('打标签')" size="small" type="primary" @click="openCustomTag(row)" :disabled="row.sldshzt != '02'">打标签</el-link>
|
||||
</template>
|
||||
</MyTable>
|
||||
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
|
||||
@ -106,21 +117,55 @@
|
||||
<!-- 新增 -->
|
||||
<AddForm ref="detailDiloag" @getList="getList" :titleData="titleData" :dict="{ D_BZ_LCZT, D_BZ_SSSHZT }" />
|
||||
</div>
|
||||
<ExportFile v-model="exportFileModel" :tableColumn="tableColumn" :dict="{ D_GS_XS_LY, D_GS_XS_LX, D_GS_XS_LX }"
|
||||
:dataModel="pageData.tableData" />
|
||||
<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" />
|
||||
|
||||
<ExportFile
|
||||
v-model="exportFileModel"
|
||||
:tableColumn="tableColumn"
|
||||
:dict="{ D_GS_XS_LY, D_GS_XS_LX, D_GS_XS_LX }"
|
||||
:dataModel="pageData.tableData"
|
||||
/>
|
||||
|
||||
<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="转会商"
|
||||
@close="isShowTransferMerchantTc = false" @ok="getList" />
|
||||
<transferMerchant
|
||||
v-if="isShowTransferMerchantTc"
|
||||
:row="currRow"
|
||||
title="转会商"
|
||||
@close="isShowTransferMerchantTc = false"
|
||||
@ok="getList"
|
||||
/>
|
||||
|
||||
<!-- 情报信息报告 -->
|
||||
<InforReport v-if="inforReportShow" v-model="inforReportShow" :data="tableList" />
|
||||
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import InforReport from './components/inforReport.vue'
|
||||
import PageTitle from "@/components/aboutTable/PageTitle.vue";
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
@ -138,32 +183,28 @@ import Fszl from '@/views/backOfficeSystem/HumanIntelligence/components/fszl.vue
|
||||
import CustomTag from '../components/customTag.vue'
|
||||
import Configuration from '../components/configuration.vue'
|
||||
import transferMerchant from "./components/transferMerchant.vue";
|
||||
import { isShiQingZhi } from "@/utils/auth.js"
|
||||
|
||||
import { Edit } from "@element-plus/icons";
|
||||
const { proxy } = getCurrentInstance();
|
||||
const { D_GS_XS_LY, D_BZ_SSSHZT, D_BZ_SSZT, D_BZ_SF, D_GS_XS_LX, 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,
|
||||
D_XXCJ_BQLX } =
|
||||
proxy.$dict("D_BZ_BMJB", "D_GS_XS_LY", 'D_BZ_SSSHZT',
|
||||
"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", "D_XXCJ_BQLX"); //获取字典数据
|
||||
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"); //获取字典数据
|
||||
const route = useRoute()
|
||||
const titleData = ref()
|
||||
const exportFileModel = ref(false)
|
||||
const qxkz = reactive({
|
||||
deptBizType: '',
|
||||
deptLevel: '',
|
||||
roleCode: false,
|
||||
depBool: false
|
||||
});
|
||||
const fszlShow = ref(false)// 发送指令
|
||||
const detailDiloag = ref();
|
||||
const inforReportShow = ref(false) //情报信息报告
|
||||
const customTagShow = ref(false)// 打标签
|
||||
const configurationShow = ref(false)// 配置关注部门
|
||||
const searchBox = ref(); //搜索框
|
||||
const ids = 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 transferMerchantRef = ref()
|
||||
const isShowTransferMerchantTc = ref(false)
|
||||
|
||||
const isShow = ref(false)
|
||||
const searchConfiger = ref([
|
||||
{ label: "录入人", prop: 'xssbr', placeholder: "请输入录入人", showType: "input" },
|
||||
@ -199,29 +240,38 @@ const pageData = reactive({
|
||||
{ label: "上报单位", prop: "ssbm" },
|
||||
{ label: "流程状态", prop: "lczt", 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 chooseRow = ref(false)
|
||||
const dataList = ref()
|
||||
|
||||
const chooseData = (val) => {
|
||||
ids.value = val.map(item => item.id)
|
||||
tableList.value = val
|
||||
}
|
||||
|
||||
// 采纳
|
||||
const cnMsg = (item) => {
|
||||
// if ( qxkz.depBool) {
|
||||
proxy.$confirm("确定要采纳", "警告", { type: "warning" }).then(() => {
|
||||
xxcjUpdateCzlc({ id: item.id, lczt: '04' }).then(res => {
|
||||
proxy.$message({ type: "success", message: "采纳成功" });
|
||||
getList();
|
||||
})
|
||||
}).catch(() => { });
|
||||
// }
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
const handleReport = () => {
|
||||
if(tableList.value.length == 0) return proxy.$message({ type: "warning", message: "请选择情报信息" });
|
||||
inforReportShow.value = true
|
||||
}
|
||||
// 回退
|
||||
const rollbackNewspapers = (item) => {
|
||||
@ -269,17 +319,12 @@ const rollbackNewspapers = (item) => {
|
||||
const appearNewspapers = (item) => {
|
||||
if ((item.lczt == '01' || item.lczt == '05' || item.lczt == '02') && item.qbjb == '00' && qxkz.deptLevel != '01') {
|
||||
proxy.$confirm("确定要上报", "警告", { type: "warning" }).then(() => {
|
||||
let promes = {}
|
||||
if (qxkz.deptLevel == '02') {
|
||||
promes = { id: item.id, lczt: '03' }
|
||||
} else {
|
||||
promes = { id: item.id, lczt: '02' }
|
||||
}
|
||||
let promes = { id: item.id }
|
||||
promes.lczt = qxkz.deptLevel == '02' ? '03' : '02';
|
||||
xxcjUpdateCzlc(promes).then(res => {
|
||||
proxy.$message({ type: "success", message: "上报成功" });
|
||||
getList();
|
||||
})
|
||||
|
||||
}).catch(() => { });
|
||||
} else {
|
||||
proxy.$message({ type: "warning", message: "市局无法进行上报" });
|
||||
@ -290,8 +335,7 @@ const opneMsg = (item) => {
|
||||
chooseRow.value = true
|
||||
dataList.value = [item]
|
||||
}
|
||||
// 打标签
|
||||
const customTagShow = ref(false)
|
||||
|
||||
const openCustomTag = (item) => {
|
||||
if (qxkz.depBool) {
|
||||
customTagShow.value = true
|
||||
@ -308,10 +352,9 @@ const affirm = (item) => {
|
||||
getList();
|
||||
})
|
||||
})
|
||||
|
||||
}
|
||||
// 配置关注部门
|
||||
const configurationShow = ref(false)
|
||||
|
||||
|
||||
const FollowUpOnDept = (item) => {
|
||||
if (qxkz.depBool) {
|
||||
configurationShow.value = true
|
||||
@ -319,12 +362,8 @@ const FollowUpOnDept = (item) => {
|
||||
} else {
|
||||
proxy.$message.warning('暂无权限')
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// 批量分组
|
||||
// const batchMark = () => {
|
||||
// const listDb = tableList.value.filter(item => item.lczt != '04')
|
||||
@ -339,6 +378,7 @@ const FollowUpOnDept = (item) => {
|
||||
// })
|
||||
// }
|
||||
// }
|
||||
|
||||
const handleSumbit = () => {
|
||||
const listDb = tableList.value.filter(item => item.czzt != '01' && item.czzt != '04')
|
||||
if (listDb.length == 0) {
|
||||
@ -349,11 +389,7 @@ const handleSumbit = () => {
|
||||
})
|
||||
}).catch(() => { });
|
||||
} else {
|
||||
proxy.$message({
|
||||
message: '请选择正确数据',
|
||||
type: 'warning',
|
||||
showClose: true,
|
||||
})
|
||||
proxy.$message({ message: '请选择正确数据', type: 'warning', showClose: true })
|
||||
}
|
||||
}
|
||||
|
||||
@ -376,8 +412,6 @@ const butcontroll = (val, zt) => {
|
||||
|
||||
// 搜索
|
||||
const onSearch = (val) => {
|
||||
console.log(val.bqdmList);
|
||||
|
||||
const promes = {
|
||||
...pageData.pageConfiger,
|
||||
...val,
|
||||
@ -385,7 +419,6 @@ const onSearch = (val) => {
|
||||
endTime: val.endTime ? val.endTime[1] : '',
|
||||
bqdmList: val.bqdmList ? val.bqdmList.join(',') : ""
|
||||
}
|
||||
|
||||
queryFrom.value = { ...promes }
|
||||
pageData.pageConfiger.pageCurrent = 1;
|
||||
getList()
|
||||
@ -403,8 +436,6 @@ const changeSize = (val) => {
|
||||
// 获取列表
|
||||
const getList = () => {
|
||||
pageData.tableConfiger.loading = true;
|
||||
console.log(pageData.pageConfiger);
|
||||
|
||||
let data = { ...pageData.pageConfiger, ...queryFrom.value };
|
||||
xxcjSelectXxsbPage(data).then(res => {
|
||||
pageData.tableData = res.records || [];
|
||||
@ -417,22 +448,12 @@ const delDictItem = (id) => {
|
||||
proxy.$confirm("确定要删除", "警告", { type: "warning" }).then(() => {
|
||||
xxcjDeletes({ ids: Array.isArray(id) ? id : [id] }).then((res) => {
|
||||
proxy.$message({ type: "success", message: "删除成功" });
|
||||
getList();
|
||||
}).catch(() => {
|
||||
getList();
|
||||
}).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) => {
|
||||
isShow.value = true;
|
||||
@ -448,78 +469,25 @@ const openXxqk = (row) => {
|
||||
}, 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 = () => {
|
||||
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
|
||||
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 280;
|
||||
window.onresize = function () {
|
||||
tabHeightFn();
|
||||
};
|
||||
};
|
||||
// 转线索
|
||||
const FollowUpOnLeads = (row) => {
|
||||
if (!qxkz.depBool) {
|
||||
proxy.$message({
|
||||
message: '权限不足',
|
||||
type: 'warning',
|
||||
showClose: true,
|
||||
if (!qxkz.depBool) return proxy.$message({message: '权限不足',type: 'warning',showClose: true, })
|
||||
proxy.$confirm("确定要转线索吗?", "警告", { type: "warning" }).then(() => {
|
||||
xxcjXxzsx({ ids: Array.isArray(row) ? row.join(',') : row.id }).then(res => {
|
||||
proxy.$message({ type: "success", message: "转线索成功" });
|
||||
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) => {
|
||||
if (!qxkz.depBool) {
|
||||
proxy.$message({
|
||||
@ -534,13 +502,6 @@ const openFkDialogszl = (row) => {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/** 获取当前角色 */
|
||||
function getRole() {
|
||||
const { deptBizType, deptLevel } = getItem('deptId')[0]
|
||||
@ -574,7 +535,6 @@ const isShowBtn = (btnName, row = {}) => {
|
||||
if (role === '部门') {
|
||||
if (btnName === '续报') return lczt != '01'
|
||||
if (btnName === '修改') return lczt == '01'
|
||||
// if(btnName === '上报') return lczt == '01'
|
||||
}
|
||||
return true
|
||||
}
|
||||
@ -582,8 +542,6 @@ const handleTransferMerchant = (row) => {
|
||||
currRow.value = row
|
||||
isShowTransferMerchantTc.value = true
|
||||
}
|
||||
|
||||
|
||||
// 送审
|
||||
const postXxcjXxcjTjsh = (row) => {
|
||||
proxy.$confirm("确定要送审吗", "提示", { type: "warning" }).then(() => {
|
||||
@ -593,20 +551,28 @@ const postXxcjXxcjTjsh = (row) => {
|
||||
})
|
||||
}).catch(() => { })
|
||||
}
|
||||
const getDisabled = (val, zt) => {
|
||||
console.log(val, zt);
|
||||
|
||||
// switch (val) {
|
||||
// case '01':
|
||||
// return !(['04', '06', '07', '08', '09'].includes(zt))
|
||||
// case '02':
|
||||
// return !(['03', '05'].includes(zt))
|
||||
// case '03':
|
||||
// return !(['02', '03', '04'].includes(zt))
|
||||
// case '04':
|
||||
// return ([ '04', '05' ,'06', '07', '08', '09'].includes(zt))
|
||||
// }
|
||||
}
|
||||
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
|
||||
}
|
||||
|
||||
console.log(qxkz,'=======qxkz');
|
||||
|
||||
titleData.value = route.meta.title
|
||||
tabHeightFn()
|
||||
if (route.query.id) {
|
||||
detailDiloag.value.init('edit', { id: route.query.id });
|
||||
}
|
||||
getList()
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
||||
@ -1,20 +1,18 @@
|
||||
<template>
|
||||
<div>
|
||||
|
||||
<!-- 搜索 -->
|
||||
<div ref="searchBox" class="mt10">
|
||||
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount" />
|
||||
</div>
|
||||
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
|
||||
<template #left>
|
||||
<el-button type="primary" @click="dologCancel()" size="small">
|
||||
<el-icon style="vertical-align: middle">
|
||||
<CirclePlus />
|
||||
</el-icon>
|
||||
<span style="vertical-align: middle">导出</span>
|
||||
</el-button>
|
||||
<template #left>
|
||||
<el-button type="primary" @click="dologCancel()" size="small">
|
||||
<el-icon style="vertical-align: middle">
|
||||
<CirclePlus />
|
||||
</el-icon>
|
||||
<span style="vertical-align: middle">导出</span>
|
||||
</el-button>
|
||||
</template>
|
||||
|
||||
<!-- <el-button v-if="qxkz.deptLevel == '01'" type="primary" :disabled="ids.length === 0" @click="batchMark(ids)">
|
||||
<el-icon style="vertical-align: middle">
|
||||
<CirclePlus />
|
||||
@ -24,10 +22,16 @@
|
||||
</PageTitle>
|
||||
<!-- 表格 -->
|
||||
<div class="tabBox">
|
||||
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
|
||||
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
|
||||
@chooseData="chooseData">
|
||||
<template #qblx="{ row }">
|
||||
<MyTable
|
||||
:tableData="pageData.tableData"
|
||||
:tableColumn="pageData.tableColumn"
|
||||
: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" />
|
||||
</template>
|
||||
<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="openCheckProcessXb(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>
|
||||
</MyTable>
|
||||
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
|
||||
@ -79,60 +86,58 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { qcckPost } from "@/api/qcckApi.js";
|
||||
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 AddForm from "@/views/backOfficeSystem/HumanIntelligence/infoCollection/components/addForm.vue";
|
||||
import { useRoute } from 'vue-router'
|
||||
import { qbcjSelectPage, qbcjDeletes } from "@/api/Intelligence.js";
|
||||
import { reactive, ref, onMounted, getCurrentInstance, watch } from "vue";
|
||||
import MakeTag from '@/views/backOfficeSystem/HumanIntelligence/components/maketag.vue'
|
||||
import ExportFile from '@/views/backOfficeSystem/HumanIntelligence/infoCollection/components/exportFile.vue'
|
||||
import pursueContent from "../components/pursueContent.vue";
|
||||
import Fszl from '../components/fszl.vue'
|
||||
import { getItem } from '@//utils/storage.js'
|
||||
import { qbcjZxs } from '@/api/qbcj.js'
|
||||
import {xxcjSelectPage,xxcjXxzsx} from '@/api/xxcj.js'
|
||||
import { color } from "echarts";
|
||||
const { proxy } = getCurrentInstance();
|
||||
const { D_GS_XS_LY, D_BZ_SSZT, D_BZ_SF, D_GS_XS_LX, D_BZ_BQJB,
|
||||
D_GS_XS_QTLX, D_GS_ZDQT_LB,
|
||||
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 {
|
||||
D_GS_XS_LY,
|
||||
D_BZ_SSZT,
|
||||
D_BZ_SF,
|
||||
D_GS_XS_LX,
|
||||
D_BZ_BQJB,
|
||||
D_GS_XS_QTLX,
|
||||
D_GS_ZDQT_LB,
|
||||
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 searchBox = ref(); //搜索框
|
||||
const ids = 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({
|
||||
deptBizType: "",
|
||||
deptLevel: "",
|
||||
@ -140,23 +145,40 @@ const qxkz = reactive({
|
||||
})
|
||||
const list = 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 => {
|
||||
if (qxkz.deptLevel == '01') {
|
||||
list.value = val.value.filter(item => {
|
||||
return item.dm != '00'
|
||||
})
|
||||
list.value = val.value.filter(item => item.dm != '00')
|
||||
} else if (qxkz.deptLevel == '02') {
|
||||
list.value = val.value.filter(item => {
|
||||
return item.dm == '01' || item.dm == '02'
|
||||
})
|
||||
list.value = val.value.filter(item => (item.dm == '01' || item.dm == '02'))
|
||||
} else {
|
||||
list.value = []
|
||||
}
|
||||
searchConfiger.value = [
|
||||
{ label: "情报标题", prop: 'qbmc', placeholder: "请输入情报标题", showType: "input" },
|
||||
{ label: "情报处置状态", prop: 'lczt', placeholder: "请选择处置状态", showType: "select", options: D_BZ_LCZT },
|
||||
// { label: "线索编号", prop: 'xsBh', placeholder: "请输入线索编号", showType: "input" },
|
||||
{ label: "关键字", prop: 'keyword', placeholder: "请输入关键字", showType: "input" },
|
||||
{ label: "情报标题", prop: 'qbmc', placeholder: "请输入情报标题", showType: "input" },
|
||||
{ label: "情报处置状态", prop: 'lczt', placeholder: "请选择处置状态", showType: "select", options: D_BZ_LCZT },
|
||||
// { label: "线索编号", prop: 'xsBh', placeholder: "请输入线索编号", showType: "input" },
|
||||
{ label: "关键字", prop: 'keyword', placeholder: "请输入关键字", showType: "input" },
|
||||
]
|
||||
}, { deep: true, immediate: true })
|
||||
const isShow = ref(false)
|
||||
@ -184,10 +206,8 @@ const pageData = reactive({
|
||||
]
|
||||
});
|
||||
const queryFrom = ref({});
|
||||
|
||||
const chooseRow = ref(false)
|
||||
const dataList = ref()
|
||||
|
||||
// 搜索
|
||||
const onSearch = (val) => {
|
||||
const { lrkssj, zxkssj } = val
|
||||
@ -198,9 +218,7 @@ const onSearch = (val) => {
|
||||
lrjssj: lrkssj ? lrkssj[1] : '',
|
||||
zxkssj: zxkssj ? zxkssj[0] : '',
|
||||
zxjssj: zxkssj ? zxkssj[1] : '',
|
||||
|
||||
}
|
||||
|
||||
queryFrom.value = { ...promes }
|
||||
pageData.pageConfiger.pageCurrent = 1;
|
||||
getList()
|
||||
@ -243,6 +261,16 @@ const addEdit = (type, row) => {
|
||||
detailDiloag.value.init(type, row);
|
||||
}, 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 = () => {
|
||||
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
|
||||
|
||||
@ -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>
|
||||
@ -26,8 +26,7 @@
|
||||
</div>
|
||||
<div class="mid">
|
||||
<div class="left">
|
||||
<!-- <div class="title ellipsis">参会人员:{{ item.chry }}</div> -->
|
||||
<div class="desc noScollLine">
|
||||
<div class="desc">
|
||||
<div class="info ellipsis" v-for="(el, i) in item.xsplList" :key="i">{{ i + 1 }}、{{ el.plnr }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -1,6 +1,8 @@
|
||||
<template>
|
||||
<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">
|
||||
<template #chryList>
|
||||
<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 ChooseUser from "@/components/ChooseList/ChooseUser/index.vue"
|
||||
import { wshsAdd } from "@/api/huiShangyp/tacticalApi"
|
||||
import { qcckGet, qcckPost } from "@/api/qcckApi.js"
|
||||
const { proxy } = getCurrentInstance();
|
||||
const props = defineProps({
|
||||
modelValue: {
|
||||
@ -58,9 +61,11 @@ const rules = reactive({
|
||||
]
|
||||
})
|
||||
const getData = computed(() => {
|
||||
console.log(props.dataList, "测试");
|
||||
|
||||
return {
|
||||
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({})
|
||||
@ -80,17 +85,41 @@ const close = () => {
|
||||
const submit = () => {
|
||||
elform.value.submit((val) => {
|
||||
if (val) {
|
||||
const promes = {
|
||||
...listQuery.value,
|
||||
...getData.value
|
||||
let url
|
||||
|
||||
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)
|
||||
})
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
})
|
||||
|
||||
@ -11,7 +11,6 @@
|
||||
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules">
|
||||
</FormMessage>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</template>
|
||||
@ -21,11 +20,12 @@ import FormMessage from "@/components/aboutTable/FormMessage.vue";
|
||||
import { ref, defineExpose, reactive, defineEmits, getCurrentInstance, watch, computed } from "vue";
|
||||
import { addJudgmentCommandList, editJudgmentCommand, getJudgmentCommandDetail } from "@/api/huiShangyp/judgmentCommand.js"
|
||||
// import { getItem } from '@//utils/storage.js'
|
||||
|
||||
import { useRouter } from 'vue-router'
|
||||
const emit = defineEmits(["updateDate", "getList"]);
|
||||
const props = defineProps({
|
||||
dict: Object
|
||||
});
|
||||
const router = useRouter()
|
||||
const imgMsg = ref([])
|
||||
const { proxy } = getCurrentInstance();
|
||||
const dialogForm = ref(false); //弹窗
|
||||
@ -118,6 +118,7 @@ const close = () => {
|
||||
listQuery.value = {};
|
||||
dialogForm.value = false;
|
||||
loading.value = false;
|
||||
router.replace({ path: '/judgmentCommand' })// 移除id 避免刷新一直带参数
|
||||
};
|
||||
|
||||
defineExpose({ init });
|
||||
|
||||
@ -61,18 +61,11 @@ import FeedbackDialog from "./components/FeedbackDialog.vue";
|
||||
import { getItem } from '@//utils/storage.js'
|
||||
const { proxy } = getCurrentInstance();
|
||||
const { D_BZ_YPFS, D_BZ_YPLX } = proxy.$dict("D_BZ_YPFS", "D_BZ_YPLX")
|
||||
const detailDiloag = ref();
|
||||
const searchBox = ref(); //搜索框
|
||||
const userInfo = ref()
|
||||
onMounted(() => {
|
||||
userInfo.value = getItem('deptId')[0]
|
||||
tabHeightFn()
|
||||
if (route.query.id) {
|
||||
detailDiloag.value.init('edit', {
|
||||
id: route.query.id
|
||||
});
|
||||
return
|
||||
}
|
||||
getList()
|
||||
});
|
||||
|
||||
@ -149,8 +142,13 @@ const tabHeightFn = () => {
|
||||
};
|
||||
};
|
||||
const route = useRoute()
|
||||
|
||||
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 currentFeedbackRow = ref({})
|
||||
const getDataById = (type, row) => {
|
||||
|
||||
@ -98,7 +98,7 @@
|
||||
* @property {Array} fj - 附件数组
|
||||
* @property {string} wcqk - 完成情况(01 准备中、02 已完成)
|
||||
*/
|
||||
|
||||
import { qcckGet } from "@/api/qcckApi.js";
|
||||
import FormMessage from "@/components/aboutTable/FormMessage.vue";
|
||||
import UploadFile from "@/components/MyComponents/Upload/index.vue";
|
||||
// import ChooseUser from "@/components/ChooseList/ChooseUser/index.vue"
|
||||
@ -214,12 +214,13 @@ watch(() => listQuery.value.jsdxBmDm, (val) => {
|
||||
})
|
||||
})
|
||||
// 初始化数据
|
||||
|
||||
const init = (type, row, wjlb) => {
|
||||
dialogForm.value = true;
|
||||
title.value = type == "add" ? "新增" : type == "edit" ? "编辑" : "详情";
|
||||
outRow.value = row
|
||||
if (row) {
|
||||
getDataById(row.id)
|
||||
getDataById(row.id )
|
||||
} else {
|
||||
listQuery.value = {
|
||||
bglx: props.bglx, // 报告类型 01 战术研判 02战略研判
|
||||
@ -232,7 +233,7 @@ const init = (type, row, wjlb) => {
|
||||
};
|
||||
// 根据id查询详情
|
||||
const getDataById = (id) => {
|
||||
sjzlGetInfo(id).then((res) => {
|
||||
qcckGet({},'/mosty-gsxt/gsxtYpbg/'+id).then((res) => {
|
||||
listQuery.value = res || {};
|
||||
/** @type {Array<JudgmentDept>} 参与研判部门数据数组 */
|
||||
const cyypList = Array.isArray(res.cyypList) ? res.cyypList : []
|
||||
|
||||
@ -47,6 +47,7 @@ import ExtractionText from "@/components/ExtractionText/index.vue";
|
||||
import FormMessage from "@/components/aboutTable/FormMessage.vue";
|
||||
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
|
||||
import "@wangeditor/editor/dist/css/style.css";
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
// import Consultation from './consultation.vue'
|
||||
import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
|
||||
import { ref, defineExpose, reactive, defineEmits, getCurrentInstance, shallowRef, onBeforeUnmount, watch } from "vue";
|
||||
@ -117,12 +118,33 @@ const elform = ref();
|
||||
const title = ref("");
|
||||
|
||||
// 初始化数据
|
||||
const init = (type, row) => {
|
||||
if(row) listQuery.value = JSON.parse(JSON.stringify(row));
|
||||
const init = (type, row) => {
|
||||
dialogForm.value = true;
|
||||
title.value = type == "add" ? "新增" :type == "edit"? "编辑" : "详情";
|
||||
|
||||
|
||||
if (row) {
|
||||
getDataById(row.id)
|
||||
}
|
||||
// listQuery.value = JSON.parse(JSON.stringify(row));
|
||||
|
||||
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) => {
|
||||
listQuery.value.fj = val.text;
|
||||
setEditorTextContent()
|
||||
@ -183,12 +205,13 @@ onBeforeUnmount(() => {
|
||||
if (editor) editor.destroy();
|
||||
});
|
||||
|
||||
|
||||
const router = useRouter();
|
||||
// 关闭
|
||||
const close = () => {
|
||||
loading.value = false;
|
||||
dialogForm.value = false;
|
||||
listQuery.value = {}
|
||||
router.replace({ path: '/strategicResearchs' })// 移除id 避免刷新一直带参数
|
||||
};
|
||||
|
||||
|
||||
|
||||
@ -65,28 +65,25 @@ import AddForm from "./addForm.vue";
|
||||
import addMeeting from "./addMeeting.vue";
|
||||
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 reportTc = ref();
|
||||
/** 会议弹框 */
|
||||
const meetingTc = ref();
|
||||
const searchBox = ref(); //搜索框
|
||||
const router = useRouter();
|
||||
const route = useRoute();
|
||||
|
||||
onMounted(() => {
|
||||
tabHeightFn()
|
||||
if (route.query.id) {
|
||||
nextTick(() => {
|
||||
addForm.value && addForm.value.init('edit', {
|
||||
id: route.query.id
|
||||
});
|
||||
router.replace({ path: '/tacticalResearch' })// 移除id 避免刷新一直带参数
|
||||
})
|
||||
}
|
||||
getList()
|
||||
});
|
||||
|
||||
watch(() => route.query.id, (val) => {
|
||||
if (val) {
|
||||
nextTick(() => {
|
||||
reportTc.value && reportTc.value.init('edit', {
|
||||
id: val
|
||||
});
|
||||
})
|
||||
}
|
||||
},{deep:true});
|
||||
|
||||
|
||||
// 提交审核
|
||||
|
||||
@ -19,7 +19,7 @@
|
||||
</FormMessage>
|
||||
</div>
|
||||
<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"
|
||||
:timestamp="activity.czsj" :color="activity.czlx == '01' ? '#409eff' : '#67c23a'" size="large">
|
||||
<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 FormMessage from '@/components/aboutTable/FormMessage.vue'
|
||||
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 props = defineProps({
|
||||
dic: Object
|
||||
dic: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
}
|
||||
});
|
||||
const chooseVisible = ref(false)
|
||||
const roleIds = ref([])
|
||||
const { proxy } = getCurrentInstance();
|
||||
const dialogForm = ref(false); //弹窗
|
||||
const formData = ref([
|
||||
{ label: "指令标题", prop: "zlbt", type: "input", },
|
||||
{ label: "指令类型", prop: "zllx", type: "select", options: props.dic.D_GS_XS_ZLLX },
|
||||
{ label: "指令等级", prop: "zldj", type: "select", options: props.dic.D_GS_ZDQT_FXDJ },
|
||||
{ label: "反馈结束时间", prop: "jssj", type: "datetime" },
|
||||
{ label: "联系人", prop: "zllxr", type: "input" },
|
||||
{ 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%' },
|
||||
]);
|
||||
|
||||
const formData = ref()
|
||||
|
||||
watch(() => props.dic, (newVal) => {
|
||||
if (newVal) {
|
||||
formData.value = [
|
||||
{ label: "指令标题", prop: "zlbt", type: "input", },
|
||||
{ label: "指令类型", prop: "zllx", type: "select", options: props.dic.D_GS_XS_ZLLX },
|
||||
{ label: "指令等级", prop: "zldj", type: "select", options: props.dic.D_GS_ZDQT_FXDJ },
|
||||
{ label: "反馈结束时间", prop: "jssj", type: "datetime" },
|
||||
{ label: "联系人", prop: "zllxr", type: "input" },
|
||||
{ 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 loading = ref(false);
|
||||
const elform = ref();
|
||||
@ -129,12 +141,13 @@ const submit = () => {
|
||||
}).catch(() => { loading.value = false; });
|
||||
});
|
||||
};
|
||||
|
||||
const router = useRouter()
|
||||
// 关闭
|
||||
const close = () => {
|
||||
listQuery.value = {};
|
||||
dialogForm.value = false;
|
||||
loading.value = false;
|
||||
router.replace({ path: '/InstructionInformation' })// 移除id 避免刷新一直带参数
|
||||
};
|
||||
defineExpose({ init });
|
||||
</script>
|
||||
|
||||
@ -58,8 +58,8 @@
|
||||
></Pages>
|
||||
</div>
|
||||
<!-- 详情 -->
|
||||
<DetailForm ref="detailDiloag" v-if="isShow" @updateDate="getList" :dic="{D_GS_XS_ZLLX,D_GS_ZDQT_FXDJ}" />
|
||||
</div>
|
||||
<DetailForm ref="detailDiloag" @updateDate="getList" :dic="{D_GS_XS_ZLLX,D_GS_ZDQT_FXDJ}" />
|
||||
<Fk v-model="isShowFk" :dataList="dataList" @getList="getList"/>
|
||||
</template>
|
||||
|
||||
@ -71,7 +71,8 @@ import Search from "@/components/aboutTable/Search.vue";
|
||||
import DetailForm from "./components/detailForm.vue";
|
||||
import Fk from "./components/fk.vue";
|
||||
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'
|
||||
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')
|
||||
@ -110,14 +111,20 @@ const pageData = reactive({
|
||||
{ label: '是否反馈', prop: 'sffk', showSolt: true },
|
||||
{ label: '是否签收', prop: 'sfqs', showSolt: true },
|
||||
]
|
||||
});
|
||||
});
|
||||
const route=useRoute()
|
||||
const userInfo=ref();
|
||||
onMounted(() => {
|
||||
if (route.query.id) {
|
||||
addEdit('detail', {id:route.query.id});
|
||||
}
|
||||
userInfo.value=getItem('deptId')[0]
|
||||
getList()
|
||||
tabHeightFn();
|
||||
});
|
||||
|
||||
|
||||
|
||||
// 搜索
|
||||
const onSearch = (val) =>{
|
||||
queryFrom.value = {...val}
|
||||
@ -166,6 +173,12 @@ const addEdit = (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) =>{
|
||||
proxy.$confirm("确定要签收", "警告", {type: "warning"}).then(() => {
|
||||
@ -189,8 +202,6 @@ const fkRow = (row) => {
|
||||
}
|
||||
const showBtn = (row) => {
|
||||
let item = row.xfbmList.find(v => v.ssbmdm == userInfo.value.deptCode)
|
||||
console.log(item);
|
||||
|
||||
return item?true:false
|
||||
// // if (item) {
|
||||
// // return item.zlzt == '01' ? 'sign' : item.zlzt == '02' ? 'feedback' : ''
|
||||
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -1,282 +1,32 @@
|
||||
<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>
|
||||
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
|
||||
<template #left>
|
||||
<el-button v-for="(item,index) in butList" :key="index" :type="qh == item ? 'primary' : 'default'" @click="qh = item" size="small">{{item}}</el-button>
|
||||
</template>
|
||||
</PageTitle>
|
||||
<div class="countBox">
|
||||
<QbtjCount v-if="qh=='情报统计分析'" />
|
||||
<YjCount v-if="qh=='预警统计'" />
|
||||
<QygktjCount v-if="qh=='全域管控统计'" />
|
||||
<XxhjCount v-if="qh=='信息汇聚统计'" />
|
||||
</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);
|
||||
};
|
||||
|
||||
import PageTitle from "@/components/aboutTable/PageTitle.vue";
|
||||
import QbtjCount from './qbtjCount.vue'
|
||||
import YjCount from './yjCount.vue'
|
||||
import QygktjCount from './qygktjCount.vue'
|
||||
import XxhjCount from './xxhjCount.vue'
|
||||
import { ref } from "vue";
|
||||
const butList=ref(["情报统计分析","预警统计",'全域管控统计','信息汇聚统计'])
|
||||
const qh = ref('情报统计分析')
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.statistical-analysis {
|
||||
display: flex;
|
||||
height: 100%;
|
||||
|
||||
.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%);
|
||||
}
|
||||
.countBox {
|
||||
height: calc(100vh - 180px);
|
||||
border-radius: 4px;
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -2,21 +2,23 @@
|
||||
<div>
|
||||
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
|
||||
<template #left>
|
||||
<el-button v-for="(item,index) in butList" :key="index" :type="qh == 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>
|
||||
</PageTitle>
|
||||
<FouColorWarning v-if="qh==1" />
|
||||
<SevenWarning v-if="qh==2" />
|
||||
<IdentityWarning v-if="qh==3" />
|
||||
<BehaviorWarning v-if="qh==4" />
|
||||
<CombinedWarning v-if="qh==5" />
|
||||
<PortraitWarning v-if="qh==6" />
|
||||
<VehicleWarning v-if="qh==7" />
|
||||
<ControlWarning v-if="qh==8" />
|
||||
<RegionalControl v-if="qh==9" />
|
||||
<FouColorWarning v-if="qh=='预警整合'" />
|
||||
<SevenWarning v-if="qh=='七类重点'" />
|
||||
<PortraitWarning v-if="qh=='人像预警'" />
|
||||
<VehicleWarning v-if="qh=='车辆预警'" />
|
||||
<ControlWarning v-if="qh=='布控预警'" />
|
||||
<RegionalControl v-if="qh=='区域预警'" />
|
||||
<WrjWarning v-if="qh=='无人机预警'" />
|
||||
<IdentityWarning v-if="qh=='身份预警'" />
|
||||
<BehaviorWarning v-if="qh=='行为预警'" />
|
||||
<CombinedWarning v-if="qh=='组合预警'" />
|
||||
</div>
|
||||
</template>
|
||||
<script setup>
|
||||
import { getItem } from '@//utils/storage.js'
|
||||
import PageTitle from "@/components/aboutTable/PageTitle.vue";
|
||||
import FouColorWarning from "@/views/backOfficeSystem/fourColorManage/warningControl/fouColorWarning/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 ControlWarning from "@/views/backOfficeSystem/fourColorManage/warningControl/controlWarning/index.vue"
|
||||
import RegionalControl from "@/views/backOfficeSystem/fourColorManage/warningControl/regionalControl/index.vue"
|
||||
import { ref } from "vue";
|
||||
const butList=ref(["预警整合","七类重点","身份预警","行为预警","组合预警","人像预警","车辆预警","布控预警","区域预警"])
|
||||
const qh = ref(1)
|
||||
const add = (flag) => {
|
||||
qh.value = flag
|
||||
}
|
||||
import WrjWarning from "@/views/backOfficeSystem/fourColorManage/warningControl/wrjWarning/index.vue"
|
||||
import { onMounted, ref } from "vue";
|
||||
const butList=ref(["预警整合","七类重点","人像预警","车辆预警","布控预警","区域预警","无人机预警",])
|
||||
const qh = ref('预警整合')
|
||||
const hasPermissin = ref(false)
|
||||
onMounted(() => {
|
||||
// rolCode : 市情指领导(JS_666666)、市情指权限(JS_777777)、县情指权限(JS_888888)、县情指领导权限(JS_999999);
|
||||
// depCode : 市情指领导(513030199509084123 )、市情指(340827200404141028)、县情指领导(540421196805217650)、朗县公安局指挥中心(县情指)(540422200010197030)、朗县公安局县城派出所(部门)(513425199305205211)
|
||||
let rolCode = ['JS_666666','JS_777777','JS_888888','JS_999999']
|
||||
let depCode = ['513030199509084123','340827200404141028','540421196805217650','540422200010197030','513425199305205211']
|
||||
let 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>
|
||||
|
||||
@ -13,9 +13,10 @@
|
||||
</Searchs>
|
||||
</div>
|
||||
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
|
||||
<template #left>
|
||||
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
|
||||
</template>
|
||||
<template #left>
|
||||
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
|
||||
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
|
||||
</template>
|
||||
</PageTitle>
|
||||
<!-- 表格 -->
|
||||
<div class="tabBox tabBox_zdy" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
|
||||
@ -64,7 +65,11 @@
|
||||
<HolographicArchive v-model="assessShow" :dataList="dataList" />
|
||||
<FkDialog @change="getList" lx="02" />
|
||||
<Information v-model="showDialog" title="发送指令" @submit='submit' @close='closeFszl'>
|
||||
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj"
|
||||
<SemdFqzl
|
||||
ref="semdFqzlRef"
|
||||
:itemData="itemData"
|
||||
@handleClose="handleClose"
|
||||
identification="yj"
|
||||
:tacitly="tacitly" />
|
||||
</Information>
|
||||
<!-- 详情 -->
|
||||
@ -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>
|
||||
|
||||
<style lang="scss">
|
||||
|
||||
@ -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>
|
||||
@ -1,6 +1,10 @@
|
||||
<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">
|
||||
@ -75,6 +79,11 @@ onMounted(() => {
|
||||
line-height: 36px;
|
||||
padding-bottom: 10px;
|
||||
margin-bottom: 10px;
|
||||
padding-left: 2rem;
|
||||
box-sizing: border-box;
|
||||
&:nth-last-child(1){
|
||||
border-bottom: none;
|
||||
}
|
||||
}
|
||||
.info-item{
|
||||
line-height: 36px;
|
||||
|
||||
@ -63,7 +63,7 @@ const createChartOption = (data, colors) => {
|
||||
orient: 'vertical',
|
||||
left: '53%',
|
||||
top: 'center',
|
||||
itemGap: 40,
|
||||
itemGap: 20,
|
||||
textStyle: {
|
||||
color: '#fff',
|
||||
rich: {
|
||||
@ -101,9 +101,7 @@ const createChartOption = (data, colors) => {
|
||||
const value = Number(item.value) || 0;
|
||||
const totalValue = Number(total) || 0;
|
||||
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}%)}`
|
||||
|
||||
}
|
||||
},
|
||||
series: [
|
||||
|
||||
@ -16,6 +16,7 @@
|
||||
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
|
||||
<template #left>
|
||||
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
|
||||
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
|
||||
</template>
|
||||
</PageTitle>
|
||||
<!-- 表格 -->
|
||||
@ -352,7 +353,23 @@ const exportExl = () => {
|
||||
}
|
||||
})
|
||||
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>
|
||||
|
||||
@ -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>
|
||||
@ -1,5 +1,9 @@
|
||||
<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">
|
||||
@ -77,6 +81,11 @@ onMounted(() => {
|
||||
line-height: 36px;
|
||||
padding-bottom: 10px;
|
||||
margin-bottom: 10px;
|
||||
padding-left: 2rem;
|
||||
box-sizing: border-box;
|
||||
&:nth-last-child(1){
|
||||
border-bottom: none;
|
||||
}
|
||||
}
|
||||
.info-item{
|
||||
line-height: 36px;
|
||||
|
||||
@ -1,7 +1,5 @@
|
||||
<template>
|
||||
<div>
|
||||
|
||||
|
||||
<!-- 搜索 -->
|
||||
<div ref="searchBox" class="mt10">
|
||||
<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">
|
||||
<template #left>
|
||||
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
|
||||
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
|
||||
</template>
|
||||
</PageTitle>
|
||||
<!-- 表格 -->
|
||||
<div class="tabBox tabBox_zdy" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
|
||||
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
|
||||
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth" expand
|
||||
@chooseData="handleChooseData">
|
||||
<MyTable
|
||||
:tableData="pageData.tableData"
|
||||
:tableColumn="pageData.tableColumn"
|
||||
:tableHeight="pageData.tableHeight"
|
||||
:key="pageData.keyCount"
|
||||
:tableConfiger="pageData.tableConfiger"
|
||||
:controlsWidth="pageData.controlsWidth"
|
||||
expand
|
||||
@chooseData="handleChooseData"
|
||||
>
|
||||
<template #expand="{ props }">
|
||||
<div class="expand-content" style="max-width: 100%">
|
||||
<Items :row="props || {}" :dict="dict" />
|
||||
</div>
|
||||
<Items :row="props || {}" :dict="dict" />
|
||||
</template>
|
||||
<template #yjTp="{ row }">
|
||||
<template v-if="!row.yjTp || row.yjTp.includes('baidu')">
|
||||
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
|
||||
<img src="@/assets/images/default_male.png" width="30" height="30" v-else />
|
||||
</template>
|
||||
<el-image v-else style="width: 30px; height:30px" :src="row.yjTp" :preview-src-list="[row.yjTp]"
|
||||
show-progress>
|
||||
<template #error>
|
||||
<div class="image-slot error">
|
||||
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
|
||||
<img src="@/assets/images/default_male.png" width="30" height="30" v-else />
|
||||
</div>
|
||||
</template>
|
||||
</el-image>
|
||||
</template>
|
||||
<template #yjJb="{ row }">
|
||||
<DictTag :value="row.yjJb" :tag="false" :color="bqYs(row.yjJb)" :options="D_GS_SSYJ" />
|
||||
@ -49,7 +68,9 @@
|
||||
<template #bqdl="{ row }">
|
||||
<DictTag :value="row.bqdl" :tag="false" :options="D_GS_QLZDRLX" />
|
||||
</template>
|
||||
|
||||
<template #xsd="{ row }">
|
||||
{{ row.xsd }}%
|
||||
</template>
|
||||
|
||||
<template #controls="{ row }">
|
||||
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
|
||||
@ -106,7 +127,8 @@ const searchConfiger = ref([
|
||||
{ label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" },
|
||||
{ label: "布控时间", prop: 'startTime', placeholder: "请选择布控时间", showType: "datetimerange" },
|
||||
]);
|
||||
|
||||
const ORDIMG = 'https://89.40.7.122:38496/image'
|
||||
const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
|
||||
const permission_sfqs = ref(false)
|
||||
const roleCode = ref(false)
|
||||
|
||||
@ -129,19 +151,17 @@ const pageData = reactive({
|
||||
},
|
||||
controlsWidth: 180, //操作栏宽度
|
||||
tableColumn: [
|
||||
{ label: "状态", prop: "czzt", showSolt: true },
|
||||
{ label: "预警时间", prop: "yjFssj" ,width: 160},
|
||||
{ label: "人员姓名", prop: "yjRyxm" },
|
||||
{ label: "身份证号码", prop: "yjRysfzh" ,width: 180},
|
||||
{ label: "性别", prop: "sex" ,showSolt: true,width: 60 },
|
||||
// { label: "年龄", prop: "age", showSolt: true,width: 60 },
|
||||
{ label: "预警级别", prop: "yjJb", showSolt: true,width: 84 },
|
||||
// { label: "人员类别", prop: "bqdl", showSolt: true ,width: 84},
|
||||
{ label: "细类", prop: "yjbqmc",width: 84 },
|
||||
{ label: "轨迹类别", prop: "yjLylx", showSolt: true ,width: 84},
|
||||
{ label: "活动发生地", prop: "yjDz" },
|
||||
{ label: "接收单位", prop: "ssbm" },
|
||||
{ label: "预警次数", prop: "yjCs" ,width: 84 },
|
||||
{ label: "预警图片", prop: "yjTp", showSolt: true, width: 100 },
|
||||
{ label: "处置状态", prop: "czzt", showSolt: true },
|
||||
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true, width: 200 },
|
||||
{ label: "姓名", prop: "yjRyxm" },
|
||||
{ label: "性别", prop: "sex", showSolt: true, width: 80 },
|
||||
{ label: "年龄", prop: "age", showSolt: true, width: 80 },
|
||||
{ label: "数据来源", prop: "yjLylx", showOverflowTooltip: true, showSolt: true },
|
||||
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true, width: 200 },
|
||||
{ label: "预警级别", prop: "yjJb", showSolt: true },
|
||||
{ label: "相似度", prop: "xsd", showSolt: true },
|
||||
{ label: "所属部门", prop: "ssbm", showOverflowTooltip: true },
|
||||
]
|
||||
});
|
||||
|
||||
@ -273,29 +293,53 @@ const handleChooseData = (val) => {
|
||||
}
|
||||
const exportExl = () => {
|
||||
const titleObj = {
|
||||
yjRyxm: "预警人员姓名",
|
||||
yjRysfzh: "预警人员身份证号码",
|
||||
yjbqmc: "预警标签",
|
||||
yjJrcs: "今日预警次数",
|
||||
yjJb_name: "标签颜色",
|
||||
yjNr: "预警内容",
|
||||
yjFssj: "预警时间",
|
||||
czzt_name: "处置状态",
|
||||
ssxgaj: "所属县局",
|
||||
ssbm: "处置单位",
|
||||
czzt_cname: "处置状态",
|
||||
yjSj: "预警时间",
|
||||
yjRyxm: "姓名",
|
||||
nl_cname: "年龄", // IdCard(row.yjRysfzh, 3)
|
||||
yjLylx: "数据来源",
|
||||
xb_cname: "性别",
|
||||
yjJb_cname: "预警级别",
|
||||
xsd_cname: "相似度",
|
||||
yjDz: "预警地点",
|
||||
yjCs: "预警次数",
|
||||
yjRysjh: "布控手机号",
|
||||
yjClcph: "布控车牌号",
|
||||
yjRysfzh: "身份证",
|
||||
}
|
||||
/** 导出【选中】的数据 (没有就全部)*/
|
||||
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
|
||||
const data = needArr.map(item => {
|
||||
return {
|
||||
...item,
|
||||
nl_cname: IdCard(item.yjRysfzh, 3),
|
||||
xb_cname: IdCard(item.yjRysfzh, 2),
|
||||
xsd_cname: (item.xsd > 0 ? item.xsd : 0) + '%',
|
||||
yjJb_name: getMultiDictVal(item.yjJb, D_GS_SSYJ),
|
||||
czzt_name: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
|
||||
yjJb_cname: getMultiDictVal(item.yjJb, D_BZ_YJJB),
|
||||
}
|
||||
})
|
||||
exportExlByObj(titleObj, data, '预警布控')
|
||||
}
|
||||
|
||||
const handleQs = () => {
|
||||
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
|
||||
let wqs = selectRows.value.filter(item => item.czzt == '01');
|
||||
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
|
||||
let yqs = selectRows.value.filter(item => item.czzt == '02');
|
||||
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
|
||||
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
|
||||
let ids = wqs.map(item => item.id)
|
||||
qcckPost({ids}, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
|
||||
proxy.$message({ type: "success", message: "成功" });
|
||||
getList();
|
||||
}).catch(() => {
|
||||
proxy.$message({ type: "error", message: "失败" });
|
||||
});
|
||||
}).catch(() => { });
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
|
||||
@ -1,6 +1,10 @@
|
||||
<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">
|
||||
@ -76,6 +80,11 @@ onMounted(() => {
|
||||
line-height: 36px;
|
||||
padding-bottom: 10px;
|
||||
margin-bottom: 10px;
|
||||
padding-left: 2rem;
|
||||
box-sizing: border-box;
|
||||
&:nth-last-child(1){
|
||||
border-bottom: none;
|
||||
}
|
||||
}
|
||||
.info-item{
|
||||
line-height: 36px;
|
||||
|
||||
@ -8,7 +8,12 @@
|
||||
<!-- 表格 -->
|
||||
<div class="tabBox heightBox">
|
||||
<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 }">
|
||||
<div v-if="!row.yjtp || row.yjtp.includes('baidu')">
|
||||
<img src="@/assets/images/car.png" width="30" height="40" v-if="row.yjlb == 2" />
|
||||
@ -55,12 +60,11 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import * as XLSX from "xlsx";
|
||||
import PageTitle from "@/components/aboutTable/PageTitle.vue";
|
||||
import Items from "./item/items.vue"
|
||||
import Search from "@/components/aboutTable/Search.vue";
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
|
||||
import { qcckPost } from "@/api/qcckApi.js";
|
||||
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
|
||||
import { reactive, ref, onMounted, getCurrentInstance, computed, watch } from "vue";
|
||||
const { proxy } = getCurrentInstance();
|
||||
|
||||
@ -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>
|
||||
@ -14,7 +14,8 @@
|
||||
</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="exportExl">导出</el-button>
|
||||
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
|
||||
</template>
|
||||
</PageTitle>
|
||||
<!-- 表格 -->
|
||||
@ -366,7 +367,23 @@ const exportExl = () => {
|
||||
}
|
||||
})
|
||||
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>
|
||||
|
||||
@ -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>
|
||||
@ -1,6 +1,10 @@
|
||||
<template>
|
||||
<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="info-item">
|
||||
<span class="text">预警人姓名:{{ it.jryXm }}</span>
|
||||
@ -27,22 +31,13 @@
|
||||
</div>
|
||||
</template>
|
||||
<script setup>
|
||||
import { ref, onMounted } from 'vue'
|
||||
import { ref, onMounted ,defineProps} from 'vue'
|
||||
import { qcckPost,qcckGet } from "@/api/qcckApi.js";
|
||||
|
||||
const props = defineProps({
|
||||
/** 表格行数据 */
|
||||
row: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
},
|
||||
dict: {
|
||||
type: Object,
|
||||
default: () => ({
|
||||
D_GS_SSYJ: [],
|
||||
D_GSXT_YJXX_CZZT: []
|
||||
})
|
||||
},
|
||||
})
|
||||
const list = ref([])
|
||||
const Fklist = ref([])
|
||||
@ -68,7 +63,15 @@ onMounted(() => {
|
||||
.item-row{
|
||||
border-bottom: 1px dashed #e8e8e8;
|
||||
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{
|
||||
line-height: 36px;
|
||||
width: 100%;
|
||||
|
||||
@ -15,6 +15,7 @@
|
||||
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
|
||||
<template #left>
|
||||
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
|
||||
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
|
||||
</template>
|
||||
</PageTitle>
|
||||
<!-- 表格 -->
|
||||
@ -25,6 +26,9 @@
|
||||
<template #xsd="{ row }">
|
||||
{{ `${row.xsd}%` }}
|
||||
</template>
|
||||
<template #czzt="{ row }">
|
||||
<DictTag :value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
|
||||
</template>
|
||||
<template #yjJb="{ row }">
|
||||
<DictTag :value="row.yjJb" :tag="false" :color="bqYs(row.yjJb)" :options="D_BZ_YJJB" />
|
||||
</template>
|
||||
@ -39,8 +43,7 @@
|
||||
<template #controls="{ row }">
|
||||
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
|
||||
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
|
||||
<el-link type="success" @click="handleQsFk(row, '反馈')"
|
||||
v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
|
||||
<el-link type="success" @click="handleQsFk(row, '反馈')" v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
|
||||
<el-link type="primary" @click="openAddModel(row)">详情</el-link>
|
||||
</template>
|
||||
</MyTable>
|
||||
@ -133,6 +136,7 @@ const pageData = reactive({
|
||||
tableColumn: [
|
||||
{ label: "预警人姓名", prop: "yjRyxm" },
|
||||
{ label: "相似度", prop: "xsd", showSolt: true },
|
||||
{ label: "处置状态", prop: "czzt", showSolt: true },
|
||||
{ label: "预警时间", prop: "yjSj", width: 200 },
|
||||
{ label: "预警标签", prop: "yjbqmc" },
|
||||
{ label: "身份证号", prop: "yjRysfzh", width: 200 },
|
||||
@ -318,7 +322,6 @@ const handleChooseData = (val) => {
|
||||
selectRows.value = val
|
||||
}
|
||||
const exportExl = () => {
|
||||
|
||||
const titleObj = {
|
||||
yjRyxm: "姓名",
|
||||
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>
|
||||
|
||||
<style>
|
||||
|
||||
@ -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>
|
||||
@ -1,5 +1,8 @@
|
||||
<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">
|
||||
@ -7,7 +10,6 @@
|
||||
<span class="text">预警人姓名:{{ list.yjRyxm }}</span>
|
||||
<span class="text"> 预警人员手机号:{{ list.yjRysjh }}</span>
|
||||
<span class="text"> 身份证号码:{{ list.yjRysfzh }}</span>
|
||||
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="text">相似度:{{ list.xsd }}%</span>
|
||||
@ -16,7 +18,6 @@
|
||||
<span class="text">预警次数:{{ list.yjJrcs }}</span>
|
||||
<span class="text">预警标签:{{ list.yjbqmc }}</span>
|
||||
<span class="text">所属部门:{{ list.ssbm }}</span>
|
||||
|
||||
</div>
|
||||
<div class="info-item flex">
|
||||
<span class="text flex">预警类型:
|
||||
@ -49,9 +50,8 @@
|
||||
</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>
|
||||
</template>
|
||||
<script setup>
|
||||
@ -89,7 +89,6 @@ onMounted(() => {
|
||||
Fklist.value = res.fkList || []
|
||||
})
|
||||
})
|
||||
// console.log('row😃: ', props.row);
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.warning-item {
|
||||
@ -104,21 +103,25 @@ onMounted(() => {
|
||||
line-height: 36px;
|
||||
padding-bottom: 10px;
|
||||
margin-bottom: 10px;
|
||||
padding-left: 2rem;
|
||||
box-sizing: border-box;
|
||||
&:nth-last-child(1){
|
||||
border-bottom: none;
|
||||
}
|
||||
}
|
||||
|
||||
.info-item {
|
||||
line-height: 36px;
|
||||
width: 100%;
|
||||
|
||||
.text {
|
||||
display: inline-block;
|
||||
width: 25%;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.flex {
|
||||
display: flex;
|
||||
|
||||
}
|
||||
}
|
||||
::v-deep .el-empty{
|
||||
--el-empty-padding: 0px;
|
||||
margin-bottom: 18px;
|
||||
--el-empty-description-margin-top: 10px;
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
<template>
|
||||
<div>
|
||||
|
||||
<!-- 搜索 -->
|
||||
<div ref="searchBox" class="mt10 mb10">
|
||||
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount">
|
||||
@ -13,10 +12,28 @@
|
||||
</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">签收</el-button>
|
||||
</template>
|
||||
</PageTitle>
|
||||
<!-- 表格 -->
|
||||
<div class="tabBox heightBox">
|
||||
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
|
||||
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
|
||||
<MyTable expand
|
||||
:tableData="pageData.tableData"
|
||||
:tableColumn="pageData.tableColumn"
|
||||
:tableHeight="pageData.tableHeight"
|
||||
:key="pageData.keyCount"
|
||||
:tableConfiger="pageData.tableConfiger"
|
||||
:controlsWidth="pageData.controlsWidth"
|
||||
@chooseData="handleChooseData"
|
||||
>
|
||||
<template #expand="{ props }">
|
||||
<div style="max-width: 100%">
|
||||
<Items :row="props || {}" />
|
||||
</div>
|
||||
</template>
|
||||
<template #czzt="{ row }">
|
||||
<DictTag :value="row.czzt" :tag="false" :options="D_GSXT_YJXX_CZZT" />
|
||||
</template>
|
||||
@ -53,11 +70,13 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { getMultiDictVal } from "@/utils/dict.js"
|
||||
import { exportExlByObj } from "@/utils/exportExcel.js"
|
||||
import Items from '@/views/backOfficeSystem/fourColorManage/warningList/portraitWarning/item/items.vue'
|
||||
import ZpForm from "./zpForm.vue";
|
||||
|
||||
import { IdCard } from '@/utils/validate.js'
|
||||
import PageTitle from "@/components/aboutTable/PageTitle.vue";
|
||||
import Search from "@/components/aboutTable/Search.vue";
|
||||
import PageTitle from "@/components/aboutTable/PageTitle.vue";
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
|
||||
@ -87,7 +106,7 @@ const pageData = reactive({
|
||||
keyCount: 0,
|
||||
tableConfiger: {
|
||||
rowHieght: 61,
|
||||
showSelectType: "null",
|
||||
showSelectType: "checkBox",
|
||||
loading: false,
|
||||
haveControls: true
|
||||
},
|
||||
@ -157,6 +176,8 @@ const pushWarning = (val) => {
|
||||
dataList.value = val;
|
||||
}
|
||||
|
||||
|
||||
|
||||
const failWarning = (val) => {
|
||||
let ids = [val.id]
|
||||
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 = () => {
|
||||
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 240;
|
||||
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
|
||||
window.onresize = function () { tabHeightFn(); };
|
||||
};
|
||||
</script>
|
||||
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -1,14 +1,37 @@
|
||||
<template>
|
||||
<div>
|
||||
<!-- 搜索 -->
|
||||
<div ref="searchBox">
|
||||
<Search :searchArr="searchConfiger" @submit="onSearch" @reset="onReset" :key="pageData.keyCount">
|
||||
<template #yjRyxms>
|
||||
<el-select clearable v-model="listQuery.yjRyxm" filterable remote allow-create default-first-optionreserve-keyword placeholder="请输入布控人员" :remote-method="remoteMethod" :loading="loading" style="width: 240px">
|
||||
<el-option v-for="item in opentions" :key="item.rySfzh" :label="item.ryXm" :value="item.rySfzh" />
|
||||
</el-select>
|
||||
</template>
|
||||
</Search>
|
||||
</div>
|
||||
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
|
||||
<template #left>
|
||||
<el-button type="primary" size="small" @click="exportExl">导出</el-button>
|
||||
<el-button type="primary" size="small" @click="handleQs" v-if="permission_sfqs">签收</el-button>
|
||||
</template>
|
||||
</PageTitle>
|
||||
|
||||
<!-- 表格 -->
|
||||
<div class="tabBox tabBox_zdy" :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">
|
||||
<div class="tabBox tabBox_zdy">
|
||||
<MyTable
|
||||
:tableData="pageData.tableData"
|
||||
:tableColumn="pageData.tableColumn"
|
||||
:tableHeight="pageData.tableHeight"
|
||||
:key="pageData.keyCount"
|
||||
:tableConfiger="pageData.tableConfiger"
|
||||
:controlsWidth="pageData.controlsWidth"
|
||||
expand
|
||||
@chooseData="handleChooseData"
|
||||
:rowClassName="getRowClassName"
|
||||
>
|
||||
<template #expand="{ props }">
|
||||
<div>
|
||||
<Items :row="props" :dict="dict" />
|
||||
</div>
|
||||
<Items :row="props"/>
|
||||
</template>
|
||||
<template #yjTp="{ row }">
|
||||
<template v-if="!row.yjTp || row.yjTp.includes('baidu')">
|
||||
@ -34,93 +57,100 @@
|
||||
<template #xsd="{ row }">
|
||||
{{ row.xsd }}%
|
||||
</template>
|
||||
<template #yjLylx="{ row }">
|
||||
<DictTag v-model:value="row.yjLylx" :options="props.dict.D_BZ_YJLY" />
|
||||
</template>
|
||||
<template #yjLylx="{ row }">
|
||||
<DictTag v-model:value="row.yjLylx" :options="D_BZ_YJLY" />
|
||||
</template>
|
||||
<template #czzt="{ row }">
|
||||
<DictTag v-model:value="row.czzt" :options="props.dict.D_GSXT_YJXX_CZZT" />
|
||||
<DictTag v-model:value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
|
||||
</template>
|
||||
<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 #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>
|
||||
<Pages
|
||||
@changeNo="changeNo"
|
||||
@changeSize="changeSize"
|
||||
:tableHeight="pageData.tableHeight"
|
||||
: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 v-model="showDialog" title="发送指令" @submit='submitSendZl' @close='closeFszl'>
|
||||
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj" :tacitly="tacitly" />
|
||||
</Information>
|
||||
<!-- <AddFrom ref="addFrom" /> -->
|
||||
<!-- 处置建议 -->
|
||||
|
||||
<!-- 详情 -->
|
||||
<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"/>
|
||||
<!-- 指派 -->
|
||||
<ZpForm v-model="warningShow" :dataList="dataList"/>
|
||||
<!-- 反馈 -->
|
||||
<FkDialog @change="getList" />
|
||||
</template>
|
||||
|
||||
<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 { 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 { 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 props = defineProps({
|
||||
dict: {
|
||||
type: Object,
|
||||
default: {}
|
||||
},
|
||||
maxHeight: {
|
||||
type: [Number, String],
|
||||
default: 666
|
||||
},
|
||||
|
||||
excelTitle: {
|
||||
type: String,
|
||||
default: '预警信息'
|
||||
}
|
||||
});
|
||||
|
||||
const permission_sfqs = ref(false)
|
||||
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 roleCode = ref(false)
|
||||
const czjyRef = ref()
|
||||
|
||||
const itemData = ref()
|
||||
const semdFqzlRef = ref()
|
||||
const warningShow = ref(false)
|
||||
const dataList = ref([])
|
||||
const showDialog = ref(false)// 发送指令
|
||||
const assessShow = ref(false)// 全息档案
|
||||
const searchConfiger = ref(
|
||||
[
|
||||
{ label: "布控人员", prop: 'yjRyxms', showType: "Slot" },
|
||||
{ label: "性别", prop: 'xbdm', placeholder: "请选择性别", showType: "select", options: D_BZ_XB },
|
||||
{ label: "身份证", prop: 'yjRysfzh', placeholder: "请输入身份证号码", showType: "input" },
|
||||
{ label: "预警时间", prop: 'times', showType: "datetimerange" },
|
||||
{ label: "状态", prop: 'czzt', placeholder: "请选择状态", showType: "select", options: D_GSXT_YJXX_CZZT },
|
||||
// { label: "人员类别", prop: 'bqdl', placeholder: "请选择人员类别", showType: "select", options: D_GS_QLZDRLX },
|
||||
{ label: "细类", prop: 'yjbqmc', placeholder: "请输入细类", showType: "input" },
|
||||
{ label: "活动发生地址", prop: 'yjDz', placeholder: "请输入活动发生地址", showType: "input" },
|
||||
{ label: "接收单位", prop: 'ssbmdm',showType: "department" },
|
||||
]);
|
||||
const pageData = reactive({
|
||||
tableData: [], //表格数据
|
||||
keyCount: 0,
|
||||
@ -148,14 +178,15 @@ const pageData = reactive({
|
||||
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true, width: 200 },
|
||||
{ label: "预警级别", prop: "yjJb", 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 permission_sfqs = ref(false)
|
||||
|
||||
onMounted(() => {
|
||||
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
|
||||
@ -166,9 +197,20 @@ onMounted(() => {
|
||||
return ['JS_666666','JS_777777','JS_888888'].includes(item.roleCode)
|
||||
})
|
||||
roleCode.value = obj ? true : false;
|
||||
// tabHeightFn();
|
||||
|
||||
tabHeightFn();
|
||||
getList()
|
||||
});
|
||||
// 搜索
|
||||
const onReset = () => {
|
||||
listQuery.value.yjRyxm = ''
|
||||
}
|
||||
const onSearch = (val) => {
|
||||
listQuery.value = { ...listQuery.value,...val };
|
||||
listQuery.value.startTime = val.times ? val.times[0] : ''
|
||||
listQuery.value.endTime = val.times ? val.times[1] : ''
|
||||
getList()
|
||||
}
|
||||
|
||||
const changeNo = (val) => {
|
||||
pageData.pageConfiger.pageCurrent = val;
|
||||
@ -178,13 +220,12 @@ 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) => {
|
||||
|
||||
const getList = () => {
|
||||
pageData.tableConfiger.loading = true;
|
||||
const promes = {
|
||||
...val,
|
||||
yjLx: '1', // 人员预警
|
||||
...listQuery.value,
|
||||
yjLx: '14', // 无人机预警
|
||||
pageCurrent: pageData.pageConfiger.pageCurrent,
|
||||
pageSize: pageData.pageConfiger.pageSize
|
||||
}
|
||||
@ -202,14 +243,30 @@ const getList = (val) => {
|
||||
pageData.tableConfiger.loading = false;
|
||||
})
|
||||
}
|
||||
// 全息档案
|
||||
const assessShow = ref(false)
|
||||
const dataList = ref()
|
||||
const pushAssess = (val) => {
|
||||
return holographicProfileJump(val.yjLx,val) // 全息档案跳转
|
||||
// assessShow.value = true;
|
||||
// dataList.value = val;
|
||||
|
||||
|
||||
|
||||
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) {
|
||||
@ -227,69 +284,14 @@ const handleQsFk = (val, type) => {
|
||||
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 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) => {
|
||||
selectRows.value = val
|
||||
}
|
||||
const exportExl = () => {
|
||||
|
||||
// 导出
|
||||
const exportExl = () => {
|
||||
const titleObj = {
|
||||
czzt_cname: "处置状态",
|
||||
yjSj: "预警时间",
|
||||
@ -304,7 +306,6 @@ const exportExl = () => {
|
||||
yjRysjh: "布控手机号",
|
||||
yjClcph: "布控车牌号",
|
||||
yjRysfzh: "身份证",
|
||||
|
||||
}
|
||||
/** 导出【选中】的数据 (没有就全部)*/
|
||||
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
|
||||
@ -314,20 +315,73 @@ const exportExl = () => {
|
||||
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),
|
||||
|
||||
czzt_cname: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
|
||||
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,
|
||||
getList
|
||||
})
|
||||
// 指派
|
||||
const pushWarning = (val) => {
|
||||
warningShow.value = true
|
||||
dataList.value = val;
|
||||
}
|
||||
// 表格高度计算
|
||||
const tabHeightFn = () => {
|
||||
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
|
||||
window.onresize = function () {
|
||||
tabHeightFn();
|
||||
};
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
@ -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>
|
||||
@ -11,14 +11,14 @@
|
||||
<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/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/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>
|
||||
|
||||
@ -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>
|
||||
@ -1,90 +1,144 @@
|
||||
<template>
|
||||
<div>
|
||||
|
||||
<!-- 搜索 -->
|
||||
<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 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" :style="{ height: (pageData.tableHeight + 40) + 'px', paddingTop: '10px' }">
|
||||
<!-- <div style="padding:0 10px;"> <el-button type="primary" @click="exportExcel">导出</el-button></div> -->
|
||||
<LocalWarning :maxHeight="pageData.tableHeight - 160" ref="localWarningRef"
|
||||
:dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLYXT, D_BZ_YJLY }" excelTitle="人像预警" />
|
||||
</div>
|
||||
</div>
|
||||
<el-dialog v-model="showDc" title="导出预警" width="80%">
|
||||
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="500"
|
||||
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
|
||||
<template #yjTp="{ row }">
|
||||
<template v-if="!row.yjTp || row.yjTp.includes('baidu')">
|
||||
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
|
||||
<img src="@/assets/images/default_male.png" width="30" height="30" v-else />
|
||||
<div class="tabBox tabBox_zdy">
|
||||
<MyTable
|
||||
:tableData="pageData.tableData"
|
||||
:tableColumn="pageData.tableColumn"
|
||||
:tableHeight="pageData.tableHeight"
|
||||
:key="pageData.keyCount"
|
||||
:tableConfiger="pageData.tableConfiger"
|
||||
:controlsWidth="pageData.controlsWidth"
|
||||
expand
|
||||
@chooseData="handleChooseData"
|
||||
:rowClassName="getRowClassName"
|
||||
>
|
||||
<template #expand="{ props }">
|
||||
<Items :row="props"/>
|
||||
</template>
|
||||
<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 #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>
|
||||
</template>
|
||||
<template #nl="{ row }">
|
||||
{{ IdCard(row.yjRysfzh, 3) }}
|
||||
</template>
|
||||
<template #sxd="{ row }"> {{ row.sxd }}% </template>
|
||||
<template #yjLylx="{ row }">
|
||||
<DictTag v-model:value="row.yjLylx" :options="D_BZ_YJLY" />
|
||||
</template>
|
||||
<template #xb="{ row }">
|
||||
{{ IdCard(row.yjRysfzh, 2) }}
|
||||
</template>
|
||||
<template #czzt="{ row }">
|
||||
<DictTag v-model:value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
|
||||
</template>
|
||||
<template #yjJb="{ row }">
|
||||
<DictTag v-model:value="row.yjJb" :options="D_BZ_YJJB" />
|
||||
</template>
|
||||
<!-- 操作 -->
|
||||
</MyTable>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="showDc = false">关闭</el-button>
|
||||
<el-button type="primary" @click="handleExport">
|
||||
导出
|
||||
</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<el-image v-else style="width: 30px; height:30px" :src="row.yjTp" :preview-src-list="[row.yjTp]"
|
||||
show-progress>
|
||||
<template #error>
|
||||
<div class="image-slot error">
|
||||
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
|
||||
<img src="@/assets/images/default_male.png" width="30" height="30" v-else />
|
||||
</div>
|
||||
</template>
|
||||
</el-image>
|
||||
</template>
|
||||
<template #nl="{ row }">
|
||||
{{ IdCard(row.yjRysfzh, 3) }}
|
||||
</template>
|
||||
<template #xb="{ row }">
|
||||
{{ IdCard(row.yjRysfzh, 2) }}
|
||||
</template>
|
||||
<template #xsd="{ row }">
|
||||
{{ row.xsd }}%
|
||||
</template>
|
||||
<template #yjLylx="{ row }">
|
||||
<DictTag v-model:value="row.yjLylx" :options="D_BZ_YJLY" />
|
||||
</template>
|
||||
<template #czzt="{ row }">
|
||||
<DictTag v-model:value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
|
||||
</template>
|
||||
<template #yjJb="{ row }">
|
||||
<DictTag v-model:value="row.yjJb" :options="D_BZ_YJJB" />
|
||||
</template>
|
||||
<!-- 操作 -->
|
||||
<template #controls="{ row }">
|
||||
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
|
||||
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
|
||||
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link> -->
|
||||
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
|
||||
<el-link type="success" @click="handleQsFk(row, '反馈')" v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
|
||||
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
|
||||
<el-link type="primary" @click="openAddFrom(row)">详情</el-link>
|
||||
<el-link type="primary" @click="pushWarning(row)">指派</el-link>
|
||||
</template>
|
||||
</MyTable>
|
||||
<Pages
|
||||
@changeNo="changeNo"
|
||||
@changeSize="changeSize"
|
||||
:tableHeight="pageData.tableHeight"
|
||||
:pageConfiger="{ ...pageData.pageConfiger, total: pageData.total }">
|
||||
</Pages>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<HolographicArchive v-model="assessShow" :dataList="dataList" />
|
||||
|
||||
<Information v-model="showDialog" title="发送指令" @submit='submitSendZl' @close='closeFszl'>
|
||||
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj" :tacitly="tacitly" />
|
||||
</Information>
|
||||
|
||||
<!-- 详情 -->
|
||||
<AddFromz ref="addFromRefs" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLYXT }" />
|
||||
<!-- 处置建议 -->
|
||||
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
|
||||
<!-- 指派 -->
|
||||
<ZpForm v-model="warningShow" :dataList="dataList"/>
|
||||
<!-- 反馈 -->
|
||||
<FkDialog @change="getList" />
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import * as MOSTY from "@/components/MyComponents/index";
|
||||
import PageTitle from "@/components/aboutTable/PageTitle.vue";
|
||||
import Search from "@/components/aboutTable/Search.vue";
|
||||
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
|
||||
import emitter from "@/utils/eventBus.js";
|
||||
import { getItem, setItem } from '@/utils/storage'
|
||||
import { exportExlByObj } from "@/utils/exportExcel.js"
|
||||
import { getMultiDictVal } from "@/utils/dict.js"
|
||||
import { tbYjxxGetPageList } from '@/api/yj.js'
|
||||
import { IdCard } from '@/utils/validate.js'
|
||||
import { tbGsxtZdrySelectList } from "@/api/zdr.js"
|
||||
import { tbYjxxQueryYjxx } from "@/api/yj.js";
|
||||
import LocalWarning from "./components/localWarning.vue";
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
|
||||
import { 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 FileSaver from "file-saver";
|
||||
import emitter from "@/utils/eventBus.js";
|
||||
import * as XLSX from "xlsx";
|
||||
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 { 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 roleCode = ref(false)
|
||||
const czjyRef = ref()
|
||||
const itemData = ref()
|
||||
const semdFqzlRef = ref()
|
||||
const warningShow = ref(false)
|
||||
const dataList = ref([])
|
||||
const showDialog = ref(false)// 发送指令
|
||||
const assessShow = ref(false)// 全息档案
|
||||
const searchConfiger = ref(
|
||||
[
|
||||
{ label: "布控人员", prop: 'yjRyxms', showType: "Slot" },
|
||||
@ -97,17 +151,14 @@ const searchConfiger = ref(
|
||||
{ label: "活动发生地址", prop: 'yjDz', placeholder: "请输入活动发生地址", showType: "input" },
|
||||
{ label: "接收单位", prop: 'ssbmdm',showType: "department" },
|
||||
]);
|
||||
|
||||
const pageData = reactive({
|
||||
/** 表格高度 */
|
||||
tableHeight: 600,
|
||||
tableData: [], //表格数据
|
||||
keyCount: 0,
|
||||
tableConfiger: {
|
||||
rowHieght: 61,
|
||||
showSelectType: "null",
|
||||
showSelectType: "checkBox",
|
||||
loading: false,
|
||||
haveControls: false
|
||||
haveControls: true
|
||||
},
|
||||
|
||||
total: 0,
|
||||
@ -115,40 +166,41 @@ const pageData = reactive({
|
||||
pageSize: 20,
|
||||
pageCurrent: 1
|
||||
}, //分页
|
||||
controlsWidth: 160, //操作栏宽度
|
||||
controlsWidth: 250, //操作栏宽度
|
||||
tableColumn: [
|
||||
{ label: "相似度", prop: "sxd", showSolt: true },
|
||||
{ label: "预警图片", prop: "yjTp", showSolt: true },
|
||||
{ label: "预警图片", prop: "yjTp", showSolt: true, width: 100 },
|
||||
{ label: "处置状态", prop: "czzt", showSolt: true },
|
||||
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true },
|
||||
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true, width: 200 },
|
||||
{ label: "姓名", prop: "yjRyxm" },
|
||||
{ label: "年龄", prop: "nl", showSolt: true ,width: 60},
|
||||
{ label: "数据来源", prop: "yjLylx", showOverflowTooltip: true, showSolt: D_BZ_YJLY },
|
||||
{ label: "性别", prop: "xb", showSolt: true,width: 60 },
|
||||
{ label: "预警级别", prop: "yjJb", showSolt: true,width: 84 },
|
||||
{ label: "预警地点", prop: "yjDz", showOverflowTooltip: true },
|
||||
{ label: "预警次数", prop: "yjCs", showOverflowTooltip: true,width: 84 },
|
||||
{ label: "布控手机号", prop: "yjRysjh", showOverflowTooltip: true },
|
||||
// { label: "布控车牌号", prop: "yjClcph", showOverflowTooltip: true },
|
||||
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true },
|
||||
{ label: "性别", prop: "xb", showSolt: true, width: 80 },
|
||||
{ label: "年龄", prop: "nl", showSolt: true, width: 80 },
|
||||
{ label: "数据来源", prop: "yjLylx", showOverflowTooltip: true, showSolt: true },
|
||||
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true, width: 200 },
|
||||
{ label: "预警级别", prop: "yjJb", showSolt: true },
|
||||
{ label: "相似度", prop: "xsd", showSolt: true },
|
||||
{ label: "所属部门", prop: "ssbm", showOverflowTooltip: true },
|
||||
]
|
||||
});
|
||||
const showDc = ref(false)
|
||||
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 addFromRefs = ref()
|
||||
const listQuery = 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 = () => {
|
||||
listQuery.value.yjRyxm = ''
|
||||
@ -157,11 +209,43 @@ const onSearch = (val) => {
|
||||
listQuery.value = { ...listQuery.value,...val };
|
||||
listQuery.value.startTime = val.times ? val.times[0] : ''
|
||||
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) => {
|
||||
if (!query) return opentions.value = [];
|
||||
loading.value = true
|
||||
@ -172,168 +256,183 @@ const remoteMethod = (query) => {
|
||||
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 = () => {
|
||||
pageData.tableHeight = window.innerHeight - (searchBox.value?.offsetHeight || 0) - 220;
|
||||
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
|
||||
window.onresize = function () {
|
||||
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>
|
||||
<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 {
|
||||
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>
|
||||
<style lang="scss">
|
||||
.el-loading-mask {
|
||||
background: rgba(0, 0, 0, 0.5) !important;
|
||||
}
|
||||
|
||||
.searchBox {
|
||||
background-color: #fff;
|
||||
margin-bottom: 10px;
|
||||
/* 预警级别行样式 */
|
||||
.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>
|
||||
|
||||
@ -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>
|
||||
@ -1,5 +1,9 @@
|
||||
<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">
|
||||
@ -41,13 +45,6 @@ const props = defineProps({
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
},
|
||||
dict: {
|
||||
type: Object,
|
||||
default: () => ({
|
||||
D_GS_SSYJ: [],
|
||||
D_GSXT_YJXX_CZZT: []
|
||||
})
|
||||
},
|
||||
})
|
||||
const list = ref([])
|
||||
const Fklist = ref([])
|
||||
@ -72,8 +69,11 @@ onMounted(() => {
|
||||
.item-row{
|
||||
border-bottom: 1px dashed #e8e8e8;
|
||||
line-height: 36px;
|
||||
padding-bottom: 10px;
|
||||
margin-bottom: 10px;
|
||||
padding-left: 2rem;
|
||||
box-sizing: border-box;
|
||||
&:last-nth-child(1){
|
||||
border-bottom: none;
|
||||
}
|
||||
}
|
||||
.info-item{
|
||||
line-height: 36px;
|
||||
|
||||
@ -11,14 +11,13 @@
|
||||
<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/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>
|
||||
<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/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>
|
||||
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -1,87 +1,146 @@
|
||||
<template>
|
||||
<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">
|
||||
<template #left>
|
||||
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
|
||||
</template>
|
||||
<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" :style="{ height: (pageData.tableHeight + 40) + 'px', paddingTop: '10px' }">
|
||||
<!-- <div style="padding:0 10px;"> <el-button type="primary" @click="exportExcel">导出</el-button></div> -->
|
||||
<LocalWarning :maxHeight="pageData.tableHeight - 160" ref="localWarningRef"
|
||||
:dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLYXT, D_BZ_YJLY }" excelTitle="车辆预警" />
|
||||
</div>
|
||||
</div>
|
||||
<el-dialog v-model="showDc" title="导出预警" width="80%">
|
||||
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="500"
|
||||
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
|
||||
<template #yjTp="{ row }">
|
||||
<template v-if="!row.yjTp || row.yjTp.includes('baidu')">
|
||||
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
|
||||
<img src="@/assets/images/default_male.png" width="30" height="30" v-else />
|
||||
<div class="tabBox tabBox_zdy">
|
||||
<MyTable
|
||||
:tableData="pageData.tableData"
|
||||
:tableColumn="pageData.tableColumn"
|
||||
:tableHeight="pageData.tableHeight"
|
||||
:key="pageData.keyCount"
|
||||
:tableConfiger="pageData.tableConfiger"
|
||||
:controlsWidth="pageData.controlsWidth"
|
||||
expand
|
||||
@chooseData="handleChooseData"
|
||||
:rowClassName="getRowClassName"
|
||||
>
|
||||
<template #expand="{ props }">
|
||||
<Items :row="props" />
|
||||
</template>
|
||||
<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 #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>
|
||||
<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 #nl="{ row }">
|
||||
{{ IdCard(row.yjRysfzh, 3) }}
|
||||
</template>
|
||||
<template #yjLylx="{ row }">
|
||||
<DictTag v-model:value="row.yjLylx" :options="D_BZ_YJLY" />
|
||||
</template>
|
||||
<template #xb="{ row }">
|
||||
{{ IdCard(row.yjRysfzh, 2) }}
|
||||
</template>
|
||||
<template #czzt="{ row }">
|
||||
<DictTag v-model:value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
|
||||
</template>
|
||||
<template #yjJb="{ row }">
|
||||
<DictTag v-model:value="row.yjJb" :options="D_BZ_YJJB" />
|
||||
</template>
|
||||
<template #xsd="{ row }">
|
||||
{{ row.xsd }}%
|
||||
</template>
|
||||
<!-- 操作 -->
|
||||
</MyTable>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="showDc = false">关闭</el-button>
|
||||
<el-button type="primary" @click="handleExport">
|
||||
导出
|
||||
</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<template #czzt="{ row }">
|
||||
<DictTag v-model:value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
|
||||
</template>
|
||||
<template #yjJb="{ row }">
|
||||
<DictTag v-model:value="row.yjJb" :options="D_BZ_YJJB" />
|
||||
</template>
|
||||
<!-- 操作 -->
|
||||
<template #controls="{ row }">
|
||||
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
|
||||
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
|
||||
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link> -->
|
||||
<!-- <el-link type="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>
|
||||
</MyTable>
|
||||
<Pages
|
||||
@changeNo="changeNo"
|
||||
@changeSize="changeSize"
|
||||
:tableHeight="pageData.tableHeight"
|
||||
:pageConfiger="{ ...pageData.pageConfiger, total: pageData.total }">
|
||||
</Pages>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<HolographicArchive v-model="assessShow" :dataList="dataList" />
|
||||
|
||||
<Information v-model="showDialog" title="发送指令" @submit='submitSendZl' @close='closeFszl'>
|
||||
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj" :tacitly="tacitly" />
|
||||
</Information>
|
||||
|
||||
<!-- 详情 -->
|
||||
<AddFromz ref="addFromRefs" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLYXT }" />
|
||||
<!-- 处置建议 -->
|
||||
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
|
||||
<!-- 指派 -->
|
||||
<ZpForm v-model="warningShow" :dataList="dataList"/>
|
||||
<!-- 反馈 -->
|
||||
<FkDialog @change="getList" />
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import * as MOSTY from "@/components/MyComponents/index";
|
||||
import PageTitle from "@/components/aboutTable/PageTitle.vue";
|
||||
import Search from "@/components/aboutTable/Search.vue";
|
||||
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
|
||||
import emitter from "@/utils/eventBus.js";
|
||||
import { getItem, setItem } from '@/utils/storage'
|
||||
import { exportExlByObj } from "@/utils/exportExcel.js"
|
||||
import { getMultiDictVal } from "@/utils/dict.js"
|
||||
import { tbYjxxGetPageList } from '@/api/yj.js'
|
||||
import { IdCard } from '@/utils/validate.js'
|
||||
import { tbGsxtZdrySelectList } from "@/api/zdr.js"
|
||||
import { tbYjxxQueryYjxx } from "@/api/yj.js";
|
||||
import LocalWarning from "./components/localWarning.vue";
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
|
||||
import { 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 FileSaver from "file-saver";
|
||||
import emitter from "@/utils/eventBus.js";
|
||||
import * as XLSX from "xlsx";
|
||||
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 { 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 roleCode = ref(false)
|
||||
const czjyRef = ref()
|
||||
const itemData = ref()
|
||||
const semdFqzlRef = ref()
|
||||
const warningShow = ref(false)
|
||||
const dataList = ref([])
|
||||
const showDialog = ref(false)// 发送指令
|
||||
const assessShow = ref(false)// 全息档案
|
||||
const searchConfiger = ref(
|
||||
[
|
||||
{ label: "车牌号", prop: 'yjClcph', showType: "input", placeholder: "请输入车牌号", },
|
||||
@ -92,46 +151,14 @@ const searchConfiger = ref(
|
||||
{ label: "活动发生地址", prop: 'yjDz', placeholder: "请输入活动发生地址", showType: "input" },
|
||||
{ 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({
|
||||
/** 表格高度 */
|
||||
tableHeight: 600,
|
||||
tableData: [], //表格数据
|
||||
keyCount: 0,
|
||||
tableConfiger: {
|
||||
rowHieght: 61,
|
||||
showSelectType: "null",
|
||||
loading: false,
|
||||
haveControls: false
|
||||
haveControls: true
|
||||
},
|
||||
|
||||
total: 0,
|
||||
@ -139,209 +166,273 @@ const pageData = reactive({
|
||||
pageSize: 20,
|
||||
pageCurrent: 1
|
||||
}, //分页
|
||||
controlsWidth: 160, //操作栏宽度
|
||||
controlsWidth: 250, //操作栏宽度
|
||||
tableColumn: [
|
||||
{ label: "预警图片", prop: "yjTp", showSolt: true },
|
||||
{ label: "状态", prop: "czzt", showSolt: true },
|
||||
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true },
|
||||
{ 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: "yjTp", showSolt: true, width: 100 },
|
||||
{ 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(null)
|
||||
const addFromRefs = ref()
|
||||
const listQuery = ref({})
|
||||
const opentions = ref([])
|
||||
const loading = ref(false)
|
||||
const selectRows = ref([])
|
||||
const permission_sfqs = ref(false)
|
||||
|
||||
onMounted(() => {
|
||||
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
|
||||
permission_sfqs.value = str.startsWith('2'||'3') ? false : true;
|
||||
|
||||
let rols = getItem('roleList') ? getItem('roleList'):[]
|
||||
let obj = rols.find(item => {
|
||||
return ['JS_666666','JS_777777','JS_888888'].includes(item.roleCode)
|
||||
})
|
||||
roleCode.value = obj ? true : false;
|
||||
|
||||
tabHeightFn();
|
||||
emitter.on('openAddFrom', (val) => {
|
||||
if (addFromRefs.value) {
|
||||
addFromRefs.value.init('add', val)
|
||||
getList()
|
||||
});
|
||||
// 搜索
|
||||
const onReset = () => {
|
||||
listQuery.value.yjRyxm = ''
|
||||
}
|
||||
const onSearch = (val) => {
|
||||
listQuery.value = { ...listQuery.value,...val };
|
||||
listQuery.value.startTime = val.times ? val.times[0] : ''
|
||||
listQuery.value.endTime = val.times ? val.times[1] : ''
|
||||
getList()
|
||||
}
|
||||
|
||||
const changeNo = (val) => {
|
||||
pageData.pageConfiger.pageCurrent = val;
|
||||
getList()
|
||||
}
|
||||
const changeSize = (val) => {
|
||||
pageData.pageConfiger.pageSize = val;
|
||||
getList()
|
||||
}
|
||||
|
||||
const getList = () => {
|
||||
pageData.tableConfiger.loading = true;
|
||||
const promes = {
|
||||
...listQuery.value,
|
||||
yjLx: '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),
|
||||
}
|
||||
})
|
||||
});
|
||||
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)
|
||||
exportExlByObj(titleObj, data, '人像预警.xlsx')
|
||||
}
|
||||
const loading = ref(false)
|
||||
|
||||
const searchArr = ref()
|
||||
const resetForm = (formEl) => {
|
||||
listQuery.value = {}
|
||||
localWarningRef.value.getList()
|
||||
const handleQs = () => {
|
||||
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
|
||||
let wqs = selectRows.value.filter(item => item.czzt == '01');
|
||||
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
|
||||
let yqs = selectRows.value.filter(item => item.czzt == '02');
|
||||
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
|
||||
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
|
||||
let ids = wqs.map(item => item.id)
|
||||
qcckPost({ids}, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
|
||||
proxy.$message({ type: "success", message: "成功" });
|
||||
getList();
|
||||
}).catch(() => {
|
||||
proxy.$message({ type: "error", message: "失败" });
|
||||
});
|
||||
}).catch(() => { });
|
||||
}
|
||||
|
||||
// 全息档案跳转
|
||||
const pushAssess = (val) => {
|
||||
return holographicProfileJump(val.yjLx,val)
|
||||
}
|
||||
|
||||
const showDetail = (item) => {
|
||||
showDialog.value = true;
|
||||
itemData.value = item
|
||||
}
|
||||
const handleClose = () => {
|
||||
showDialog.value = false;
|
||||
}
|
||||
|
||||
const submitSendZl = () => {
|
||||
semdFqzlRef.value.getsendFqzl()
|
||||
}
|
||||
const closeFszl = () => {
|
||||
semdFqzlRef.value.close()
|
||||
}
|
||||
|
||||
// 处置建议
|
||||
const handleCzjy = (row) => {
|
||||
czjyRef.value.init(row)
|
||||
}
|
||||
|
||||
// 详情
|
||||
const openAddFrom = (val) => {
|
||||
addFromRefs.value.init('add', val)
|
||||
}
|
||||
|
||||
|
||||
// 指派
|
||||
const pushWarning = (val) => {
|
||||
warningShow.value = true
|
||||
dataList.value = val;
|
||||
}
|
||||
// 表格高度计算
|
||||
const tabHeightFn = () => {
|
||||
pageData.tableHeight = window.innerHeight - (searchBox.value?.offsetHeight || 0) - 270;
|
||||
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
|
||||
window.onresize = function () {
|
||||
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>
|
||||
<style lang="scss" scoped>
|
||||
::v-deep .el-table--fit {
|
||||
height: calc(100% - 50px) !important;
|
||||
}
|
||||
|
||||
.filter-title {
|
||||
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>
|
||||
<style lang="scss">
|
||||
.el-loading-mask {
|
||||
background: rgba(0, 0, 0, 0.5) !important;
|
||||
}
|
||||
|
||||
.searchBox {
|
||||
background-color: #fff;
|
||||
margin-bottom: 10px;
|
||||
/* 预警级别行样式 */
|
||||
.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>
|
||||
|
||||
@ -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>
|
||||
@ -1,6 +1,10 @@
|
||||
<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">
|
||||
@ -75,6 +79,11 @@ onMounted(() => {
|
||||
line-height: 36px;
|
||||
padding-bottom: 10px;
|
||||
margin-bottom: 10px;
|
||||
padding-left: 2rem;
|
||||
box-sizing: border-box;
|
||||
&:nth-last-child(1){
|
||||
border-bottom: none;
|
||||
}
|
||||
}
|
||||
.info-item{
|
||||
line-height: 36px;
|
||||
|
||||
@ -1,21 +1,22 @@
|
||||
<template>
|
||||
<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">
|
||||
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
|
||||
<Search :searchArr="searchConfiger" ref="ces" @submit="onSearch" :key="pageData.keyCount"></Search>
|
||||
</div>
|
||||
|
||||
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
|
||||
<template #left>
|
||||
<el-button type="primary" size="small" @click="exportExl">导出</el-button>
|
||||
<el-button type="primary" size="small" @click="getSlect">我的关注</el-button>
|
||||
</template>
|
||||
</PageTitle>
|
||||
|
||||
<!-- 表格 -->
|
||||
<div class="tabBox heightBox">
|
||||
<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 }">
|
||||
<DictTag :tag="false" :value="row.jjlx" :options="D_BZ_JQBQ" />
|
||||
</template> -->
|
||||
@ -25,38 +26,40 @@
|
||||
<template #jqlbdm="{ row }">
|
||||
<DictTag :tag="false" :value="row.jqlbdm" :options="JQLB" />
|
||||
</template>
|
||||
<template #ypzt="{ row }">
|
||||
{{ row.ypzt === '01' ? '已研判' : '未研判' }}
|
||||
</template>
|
||||
<!-- <template #jqdjdm="{ row }">
|
||||
<DictTag :tag="false" :value="row.jqdjdm" :options="D_BZ_JQDJ" />
|
||||
<!-- <template #ypzt="{ row }">
|
||||
{{ row.ypzt === '01' ? '已研判' : '未研判' }}
|
||||
</template> -->
|
||||
<template #hszt="{ row }">
|
||||
{{ row.hszt === '01' ? '未会商' : '已会商' }}
|
||||
</template>
|
||||
<!-- 操作 -->
|
||||
<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="warning" @click="handleYP('研判', row)">研判</el-link>
|
||||
<el-link type="danger" @click="handleYP('深度研判', row)">深度研判</el-link>
|
||||
<!-- <el-link type="warning" @click="handleYP('研判', row)">研判</el-link>
|
||||
<el-link type="danger" @click="handleYP('深度研判', row)">深度研判</el-link> -->
|
||||
</template>
|
||||
</MyTable>
|
||||
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
|
||||
...pageData.pageConfiger,
|
||||
total: pageData.total
|
||||
}"></Pages>
|
||||
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight"
|
||||
:pageConfiger="{ ...pageData.pageConfiger, total: pageData.total }">
|
||||
</Pages>
|
||||
</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 }"
|
||||
@updateDate="getList" />
|
||||
|
||||
<!-- 研判弹窗 -->
|
||||
<YpDialog ref="ypDialog" @change="getList" />
|
||||
<DeepYpDialog ref="deepYpDialog" @change="getList" />
|
||||
<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 }" @updateDate="getList" />
|
||||
<!-- 研判弹窗 -->
|
||||
<YpDialog ref="ypDialog" @change="getList" />
|
||||
<DeepYpDialog ref="deepYpDialog" @change="getList" />
|
||||
<DiscussionDialog v-model="showDialog" :dataList="dataList" :lx="lx" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { getMultiDictVal } from "@/utils/dict.js"
|
||||
import { exportExlByObj } from "@/utils/exportExcel.js"
|
||||
import YpDialog from "./components/ypDialog.vue";
|
||||
import DeepYpDialog from "./components/deepypDialog.vue";
|
||||
|
||||
import PageTitle from "@/components/aboutTable/PageTitle.vue";
|
||||
import MyTable from "@/components/aboutTable/MyTable.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 { lzJcjPjdbSelectPage } from '@/api/semanticAnalysis.js'
|
||||
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 { 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 deepYpDialog = ref();
|
||||
const detailDiloag = ref();
|
||||
@ -103,7 +109,7 @@ const pageData = reactive({
|
||||
keyCount: 0,
|
||||
tableConfiger: {
|
||||
rowHieght: 61,
|
||||
showSelectType: "null",
|
||||
showSelectType: "checkbox",
|
||||
loading: false,
|
||||
},
|
||||
total: 0,
|
||||
@ -118,12 +124,12 @@ const pageData = reactive({
|
||||
{ label: "报警时间", prop: "bjsj" },
|
||||
{ label: "报警内容", prop: "bjnr", showOverflowTooltip: true },
|
||||
{ label: "接警员姓名", prop: "jjyxm" },
|
||||
{ label: "警情级别", prop: "jqdjdm",showSolt:true },
|
||||
{ label: "警情级别", prop: "jqdjdm", showSolt: true },
|
||||
// { label: "警情标签", prop: "jjlx", showSolt: true },
|
||||
{ label: "警情类型", prop: "jqlbdm",showSolt:true },
|
||||
{ label: "警情类型", prop: "jqlbdm", showSolt: true },
|
||||
{ label: "警情地址", prop: "jqdz" },
|
||||
{ label: "补充接警内容", prop: "bcjjnr", showOverflowTooltip: true },
|
||||
{ label: "研判状态", prop: "ypzt",showSolt:true },
|
||||
{ label: "会商状态", prop: "hszt", showSolt: true },
|
||||
|
||||
]
|
||||
});
|
||||
@ -138,6 +144,13 @@ const onSearch = (val) => {
|
||||
pageData.pageConfiger.pageCurrent = 1;
|
||||
getList()
|
||||
}
|
||||
const ces=ref()
|
||||
// 点击关注
|
||||
const getSlect = () => {
|
||||
listQuery.value = { ...ces.value.searchObj , sfgz: 1 };
|
||||
pageData.pageConfiger.pageCurrent = 1;
|
||||
getList()
|
||||
}
|
||||
|
||||
const changeNo = (val) => {
|
||||
pageData.pageConfiger.pageCurrent = val;
|
||||
@ -155,19 +168,14 @@ const getList = () => {
|
||||
pageSize: pageData.pageConfiger.pageSize,
|
||||
...listQuery.value
|
||||
}
|
||||
|
||||
lzJcjPjdbSelectPage(params).then(res => {
|
||||
console.log(res);
|
||||
pageData.tableData = res.records || [];
|
||||
pageData.total = res.total;
|
||||
|
||||
}).finally(() => {
|
||||
pageData.tableConfiger.loading = false;
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 新增
|
||||
const addEdit = (type, row) => {
|
||||
show.value = true;
|
||||
@ -177,18 +185,79 @@ const addEdit = (type, row) => {
|
||||
};
|
||||
|
||||
const handleYP = (type, row) => {
|
||||
console.log(type, row);
|
||||
if(type === '研判'){
|
||||
if (type === '研判') {
|
||||
ypDialog.value.init(row);
|
||||
}else{
|
||||
} else {
|
||||
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 = () => {
|
||||
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 200;
|
||||
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
|
||||
window.onresize = function () {
|
||||
tabHeightFn();
|
||||
};
|
||||
|
||||
@ -48,9 +48,9 @@
|
||||
<div class="mt4 two_text_detail" v-if="buttonBox">
|
||||
<el-button type="primary" @click="pushAssess(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="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 == '02'">反馈</el-button>
|
||||
<el-button type="success" @click="showFeedback(item, '查看反馈')" v-if="item.czzt == '03'">查看反馈</el-button>
|
||||
|
||||
@ -1,6 +1,13 @@
|
||||
<template>
|
||||
<el-dialog :model-value="modelValue" :title="title" width="70%" @close="closeDialog" destroy-on-close append-to-body>
|
||||
<div style="height: 60vh; overflow: auto;">
|
||||
<el-dialog :model-value="modelValue" width="70%" @close="closeDialog" destroy-on-close append-to-body>
|
||||
<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>
|
||||
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
|
||||
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
|
||||
@ -33,6 +40,8 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { getMultiDictVal } from "@/utils/dict.js"
|
||||
import { exportExlByObj } from "@/utils/exportExcel.js"
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import Search from "@/components/aboutTable/Search.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
@ -141,6 +150,24 @@ const changeSize = (val) => {
|
||||
pageData.pageConfiger.pageSize = val;
|
||||
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>
|
||||
|
||||
<style scoped></style>
|
||||
|
||||
@ -1,7 +1,13 @@
|
||||
<template>
|
||||
<el-dialog :model-value="modelValue" title="重点群体" width="70%" @close="closeDialog" destroy-on-close append-to-body>
|
||||
<div style="height: 60vh; overflow: auto;">
|
||||
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
|
||||
<el-dialog :model-value="modelValue" width="70%" @close="closeDialog" destroy-on-close append-to-body :close-on-click-modal="false">
|
||||
<template #title>
|
||||
<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"
|
||||
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
|
||||
fixed="right" :expand="true">
|
||||
@ -45,6 +51,8 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { getMultiDictVal } from "@/utils/dict.js"
|
||||
import { exportExlByObj } from "@/utils/exportExcel.js"
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import Search from "@/components/aboutTable/Search.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
@ -149,7 +157,6 @@ const changePage = () => {
|
||||
|
||||
}
|
||||
|
||||
|
||||
const changeNo = (val) => {
|
||||
pageData.pageConfiger.pageCurrent = val;
|
||||
changePage()
|
||||
@ -158,6 +165,25 @@ const changeSize = (val) => {
|
||||
pageData.pageConfiger.pageSize = val;
|
||||
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>
|
||||
|
||||
<style scoped></style>
|
||||
|
||||
@ -1,9 +1,13 @@
|
||||
<template>
|
||||
<el-dialog :model-value="modelValue" title="重点人总数" width="70%" @close="closeDialog" destroy-on-close append-to-body>
|
||||
<div style="height: 60vh; overflow: auto;">
|
||||
|
||||
|
||||
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
|
||||
<el-dialog :model-value="modelValue" width="70%" @close="closeDialog" destroy-on-close append-to-body :close-on-click-modal="false">
|
||||
<template #title>
|
||||
<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"
|
||||
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
|
||||
:expand="true">
|
||||
@ -63,6 +67,8 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { getMultiDictVal } from "@/utils/dict.js"
|
||||
import { exportExlByObj } from "@/utils/exportExcel.js"
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import Search from "@/components/aboutTable/Search.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
@ -140,7 +146,7 @@ const pageData = reactive({
|
||||
pageCurrent: 1
|
||||
}, //分页
|
||||
tableColumn: [
|
||||
{ label: "姓名", prop: "ryXm" },
|
||||
{ label: "姓名", prop: "ryXm" },
|
||||
{ label: "性别", prop: "ryXb", showSolt: true },
|
||||
{ label: "籍贯", prop: "ryJg", showSolt: true},
|
||||
{ label: "身份证", prop: "rySfzh" },
|
||||
@ -175,16 +181,6 @@ const changePage = () => {
|
||||
|
||||
}
|
||||
|
||||
// 查看详情
|
||||
const showDetail = (item) => {
|
||||
router.push({
|
||||
path: '/CollectCrculate',
|
||||
query: {
|
||||
id: item.id
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const changeNo = (val) => {
|
||||
pageData.pageConfiger.pageCurrent = val;
|
||||
changePage()
|
||||
@ -193,6 +189,28 @@ const changeSize = (val) => {
|
||||
pageData.pageConfiger.pageSize = val;
|
||||
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>
|
||||
|
||||
<style scoped>
|
||||
|
||||
@ -1,6 +1,13 @@
|
||||
<template>
|
||||
<el-dialog :model-value="modelValue" :title="title" width="70%" @close="closeDialog" destroy-on-close append-to-body>
|
||||
<div style="height: 60vh; overflow: auto;">
|
||||
<el-dialog :model-value="modelValue" width="70%" @close="closeDialog" destroy-on-close append-to-body>
|
||||
|
||||
<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>
|
||||
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
|
||||
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
|
||||
@ -54,6 +61,8 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { exportExlByObj } from "@/utils/exportExcel.js"
|
||||
import { getMultiDictVal } from "@/utils/dict.js"
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import Search from "@/components/aboutTable/Search.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
@ -196,6 +205,30 @@ const changeSize = (val) => {
|
||||
pageData.pageConfiger.pageSize = val;
|
||||
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>
|
||||
|
||||
<style scoped></style>
|
||||
|
||||
@ -1,8 +1,12 @@
|
||||
<template>
|
||||
<el-dialog :model-value="modelValue" title="警情总数" width="70%" @close="closeDialog" destroy-on-close append-to-body>
|
||||
<div style="height: 60vh; overflow: auto;">
|
||||
|
||||
|
||||
<el-dialog :model-value="modelValue" width="70%" @close="closeDialog" :close-on-click-modal="false" destroy-on-close append-to-body>
|
||||
<template #title>
|
||||
<div class="flex just-between align-center">
|
||||
<span class="f18">警情总数</span>
|
||||
<span @click="exportFile" class="f14 pointer" style="color: #0072ff;">下载</span>
|
||||
</div>
|
||||
</template>
|
||||
<div>
|
||||
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
|
||||
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
|
||||
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
|
||||
@ -43,6 +47,8 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { getMultiDictVal } from "@/utils/dict.js"
|
||||
import { exportExlByObj } from "@/utils/exportExcel.js"
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import Search from "@/components/aboutTable/Search.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
@ -127,7 +133,7 @@ const pageData = reactive({
|
||||
{ label: "补充接警内容", prop: "bcjjnr", showOverflowTooltip: true },
|
||||
{ label: "研判状态", prop: "ypzt",showSolt:true },
|
||||
],
|
||||
tableHeight: "43vh",
|
||||
tableHeight: "40vh",
|
||||
});
|
||||
const parameter = ref()
|
||||
const onSearch = (val) => {
|
||||
@ -153,7 +159,6 @@ pageData.tableConfiger.loading = true;
|
||||
...parameter.value
|
||||
}
|
||||
lzJcjPjdbSelectPage(params).then(res => {
|
||||
console.log(res);
|
||||
pageData.tableData = res.records || [];
|
||||
pageData.total = res.total;
|
||||
|
||||
@ -162,16 +167,6 @@ pageData.tableConfiger.loading = true;
|
||||
})
|
||||
}
|
||||
|
||||
// 查看详情
|
||||
const showDetail = (item) => {
|
||||
router.push({
|
||||
path: '/CollectCrculate',
|
||||
query: {
|
||||
id: item.id
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const changeNo = (val) => {
|
||||
pageData.pageConfiger.pageCurrent = val;
|
||||
changePage()
|
||||
@ -180,6 +175,29 @@ const changeSize = (val) => {
|
||||
pageData.pageConfiger.pageSize = val;
|
||||
changePage()
|
||||
}
|
||||
|
||||
// 导出
|
||||
const exportFile = () =>{
|
||||
const titleObj = {
|
||||
jjdbh: "接警单编号",
|
||||
bjdh: "报警电话",
|
||||
bjsj: "报警时间",
|
||||
bjnr: "报警内容",
|
||||
jjyxm: "接警员姓名",
|
||||
jqdjdm_name: "警情级别",
|
||||
jqlbdm_name: "警情类型",
|
||||
jqdz: "警情地址",
|
||||
bcjjnr: "补充接警内容",
|
||||
ypzt_name: "研判状态",
|
||||
}
|
||||
let list = pageData.tableData.map(item => ({
|
||||
...item,
|
||||
jqdjdm_name: getMultiDictVal(item.jqdjdm, D_GS_BQ_DJ),
|
||||
jqlbdm_name: getMultiDictVal(item.jqlbdm, JQLB),
|
||||
ypzt_name: item.ypzt == '01' ? '已研判' : '未研判'
|
||||
}))
|
||||
exportExlByObj(titleObj, list, '警情总数')
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped></style>
|
||||
|
||||
86
src/views/home/components/qxsqDialog.vue
Normal file
86
src/views/home/components/qxsqDialog.vue
Normal file
@ -0,0 +1,86 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-dialog title="权限申请" v-model="showDialog" width="500px" :close-on-click-modal="false" :close-on-press-escape="false" :show-close="true" >
|
||||
<el-form :model="listQuery" label-width="120px" :rules="rules" ref="formRef">
|
||||
<el-form-item label="申请人姓名" prop="xm">
|
||||
<el-input placeholder="请输入申请人姓名" v-model="listQuery.xm" clearable></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="申请人身份证" prop="sfzh">
|
||||
<el-input placeholder="请输入申请人身份证" v-model="listQuery.sfzh" clearable></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="申请人联系电话" prop="lxdh">
|
||||
<el-input placeholder="请输入申请人联系电话" v-model="listQuery.lxdh" clearable></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="权限说明" prop="qxsm">
|
||||
<el-input placeholder="请输入权限说明" v-model="listQuery.qxsm" clearable type="textarea" :rows="3"></el-input>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="提交人姓名">
|
||||
<el-input placeholder="请输入提交人姓名" v-model="listQuery.tjrxm" clearable readonly></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="提交人身份证">
|
||||
<el-input placeholder="请输入申请人身份证" v-model="listQuery.tjrsfzh" clearable readonly></el-input>
|
||||
</el-form-item>
|
||||
<div class="tc">
|
||||
<el-button type="primary" :loading="loading" @click="okSubit">确定</el-button>
|
||||
<el-button @click="reset()"> 重置 </el-button>
|
||||
</div>
|
||||
</el-form>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
<script setup>
|
||||
import { getItem } from "@/utils/storage";
|
||||
import { ElMessage } from "element-plus";
|
||||
import { qcckGet ,qcckPost} from "@/api/qcckApi.js";
|
||||
import emitter from "@/utils/eventBus.js";
|
||||
import { onMounted, ref,onUnmounted } from 'vue'
|
||||
const showDialog = ref(false)
|
||||
const listQuery = ref({
|
||||
tjrxm: getItem("USERNAME") || '',
|
||||
tjrsfzh: getItem("idEntityCard") || '',
|
||||
xm: '',
|
||||
sfzh: '',
|
||||
lxdh: '',
|
||||
qxsm: '',
|
||||
})
|
||||
const formRef = ref()
|
||||
const rules = ref({
|
||||
xm: [{ required: true, message: '请输入申请人姓名', trigger: 'blur' }],
|
||||
sfzh: [{ required: true, message: '请输入申请人身份证', trigger: 'blur' }],
|
||||
lxdh: [{ required: true, message: '请输入申请人联系电话', trigger: 'blur' }],
|
||||
qxsm: [{ required: true, message: '请输入权限说明', trigger: 'blur' }],
|
||||
})
|
||||
const loading = ref(false)
|
||||
|
||||
onMounted(()=>{
|
||||
emitter.on("openPermminsion", () => {
|
||||
showDialog.value = true
|
||||
})
|
||||
})
|
||||
|
||||
// 提交
|
||||
const okSubit = async () => {
|
||||
formRef.value.validate((valid) => {
|
||||
if (!valid) return false;
|
||||
loading.value = true
|
||||
qcckPost(listQuery.value, "/mosty-gsxt/gsxt/qxsq/addEntity").then(() => {
|
||||
ElMessage.success("提交成功");
|
||||
showDialog.value = false;
|
||||
loading.value = false
|
||||
}).catch(() => {
|
||||
ElMessage.error("提交失败");
|
||||
loading.value = false
|
||||
});
|
||||
})
|
||||
// 提交表单
|
||||
console.log(listQuery.value)
|
||||
}
|
||||
|
||||
// 重置
|
||||
const reset = () => {
|
||||
listQuery.value = {}
|
||||
formRef.value.resetFields()
|
||||
}
|
||||
|
||||
</script>
|
||||
@ -1,6 +1,12 @@
|
||||
<template>
|
||||
<el-dialog :model-value="modelValue" :title="title" width="70%" @close="closeDialog" destroy-on-close append-to-body>
|
||||
<div style="height: 60vh; overflow: auto;">
|
||||
<el-dialog :model-value="modelValue" width="70%" @close="closeDialog" destroy-on-close append-to-body :close-on-click-modal="false" >
|
||||
<template #title>
|
||||
<div class="flex just-between align-center">
|
||||
<span class="f18">{{ props.title }}</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"
|
||||
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
|
||||
@ -36,13 +42,15 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { getMultiDictVal } from "@/utils/dict.js"
|
||||
import { exportExlByObj } from "@/utils/exportExcel.js"
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import Search from "@/components/aboutTable/Search.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
import { xxcjXfxsSelectPage } from "@/api/xxcj.js"
|
||||
import { ref, reactive, getCurrentInstance, watch } from "vue";
|
||||
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_BZ_SF,D_GS_XS_SJLY, D_GS_XS_ZLLX, D_GS_ZDQT_FXDJ, D_GS_XS_CZZT } = proxy.$dict('D_BZ_SF','D_GS_XS_SJLY', 'D_GS_XS_ZLLX', 'D_GS_ZDQT_FXDJ', 'D_GS_XS_CZZT')
|
||||
const props = defineProps({
|
||||
modelValue: {
|
||||
type: Boolean,
|
||||
@ -51,7 +59,8 @@ const props = defineProps({
|
||||
dict: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
}, title: {
|
||||
},
|
||||
title: {
|
||||
default: "下发总数",
|
||||
type: String
|
||||
},
|
||||
@ -140,6 +149,29 @@ const changeSize = (val) => {
|
||||
pageData.pageConfiger.pageSize = val;
|
||||
changePage()
|
||||
}
|
||||
|
||||
// 导出
|
||||
const exportFile = () =>{
|
||||
const titleObj = {
|
||||
zlbt: "指令标题",
|
||||
zllx_name: "指令类型",
|
||||
zldj_name: "指令等级",
|
||||
jssj: "反馈截止时间",
|
||||
czzt_name: "处置状态",
|
||||
jsffk_name: "是否反馈",
|
||||
sfqs_name: "是否签收",
|
||||
}
|
||||
let list = pageData.tableData.map(item => ({
|
||||
...item,
|
||||
zllx_name: getMultiDictVal(item.zllx, D_GS_XS_ZLLX),
|
||||
zldj_name: getMultiDictVal(item.zldj, D_GS_ZDQT_FXDJ),
|
||||
czzt_name: getMultiDictVal(item.czzt, D_GS_XS_CZZT),
|
||||
sffk_name: getMultiDictVal(item.sffk, D_BZ_SF),
|
||||
sfqs_name: getMultiDictVal(item.sfqs, D_BZ_SF),
|
||||
}))
|
||||
exportExlByObj(titleObj, list, props.title)
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<style scoped></style>
|
||||
|
||||
@ -1,6 +1,12 @@
|
||||
<template>
|
||||
<el-dialog :model-value="modelValue" title="线索总数" width="70%" @close="closeDialog" destroy-on-close append-to-body>
|
||||
<div style="height: 60vh; overflow: auto;">
|
||||
<el-dialog :model-value="modelValue" width="70%" @close="closeDialog" destroy-on-close append-to-body>
|
||||
<template #title>
|
||||
<div class="flex just-between align-center">
|
||||
<span class="f18">线索总数</span>
|
||||
<span @click="exportFile" class="f14 pointer" style="color: #0072ff;">下载</span>
|
||||
</div>
|
||||
</template>
|
||||
<div>
|
||||
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
|
||||
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
|
||||
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
|
||||
@ -33,6 +39,8 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { getMultiDictVal } from "@/utils/dict.js"
|
||||
import { exportExlByObj } from "@/utils/exportExcel.js"
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import Search from "@/components/aboutTable/Search.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
@ -83,7 +91,6 @@ const pageData = reactive({
|
||||
{ label: "线索来源", prop: "cjLx",showSolt:true },
|
||||
{ label: "上报时间", prop: "sxsbsj",showOverflowTooltip:true },
|
||||
{ label: "线索内容", prop: "qbnr"},
|
||||
|
||||
{ label: "审核状态", prop: "shzt", showSolt: true },
|
||||
],
|
||||
tableHeight: "43vh",
|
||||
@ -124,6 +131,27 @@ const changeSize = (val) => {
|
||||
pageData.pageConfiger.pageSize = val;
|
||||
changePage()
|
||||
}
|
||||
|
||||
// 导出
|
||||
const exportFile = () =>{
|
||||
const titleObj = {
|
||||
xsBh: "线索编号",
|
||||
qbmc: "线索名称",
|
||||
qblx_name: "线索类型",
|
||||
cjLx_name: "线索来源",
|
||||
sxsbsj: "上报时间",
|
||||
qbnr: "线索内容",
|
||||
shzt_name: "审核状态",
|
||||
}
|
||||
let list = pageData.tableData.map(item => ({
|
||||
...item,
|
||||
qblx_name: getMultiDictVal(item.qblx, D_GS_XS_LX),
|
||||
cjLx_name: getMultiDictVal(item.cjLx, D_GS_XS_LY),
|
||||
shzt_name: getMultiDictVal(item.shzt, D_BZ_XSSHZT),
|
||||
}))
|
||||
exportExlByObj(titleObj, list, '线索总数')
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<style scoped></style>
|
||||
|
||||
@ -1,5 +1,7 @@
|
||||
<template>
|
||||
<div class="noScollLine">
|
||||
<!-- 情报上报列表 -->
|
||||
<Intelligence v-model="isShow.showQbsb" v-if="isShow.showQbsb" />
|
||||
<!-- 预警信息弹框 -->
|
||||
<Home_YJ v-if="isShow.showYj" :show="isShow.showYj" :data="list.Info_YJ" />
|
||||
<PopupWarning v-if="isShow.showWarning" :show="isShow.showWarning" :data="list.Info_Warning" />
|
||||
@ -10,11 +12,13 @@
|
||||
import emitter from "@/utils/eventBus.js";
|
||||
import Home_YJ from "./components/home_yj.vue";
|
||||
import PopupWarning from './components/popupWarning'
|
||||
import Intelligence from "@/views/home/model/mesgSwitch/intelligence.vue";
|
||||
import { ref, onMounted, onUnmounted, reactive, getCurrentInstance } from "vue";
|
||||
const { proxy } = getCurrentInstance();
|
||||
const isShow = ref({
|
||||
showYj: false, //预警弹窗
|
||||
showWarning: false
|
||||
showWarning: false, //预警弹窗
|
||||
showQbsb: false, //情报上报列表弹窗
|
||||
});
|
||||
const list = reactive({
|
||||
Info_YJ: [], //预警数据
|
||||
@ -32,6 +36,10 @@ onMounted(() => {
|
||||
isShow.value.showWarning = res ? true : false;
|
||||
if (res) list.Info_Warning = res;
|
||||
});
|
||||
// 展示情报上报列表
|
||||
emitter.on("lookQbsbList", (res) => {
|
||||
isShow.value.showQbsb = res ? true : false;
|
||||
});
|
||||
});
|
||||
onUnmounted(() => {
|
||||
emitter.off("showHomeYJ");
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
</template>
|
||||
<script setup>
|
||||
import * as echarts from "echarts";
|
||||
import { onMounted, ref, reactive, defineProps, onUnmounted, watch, nextTick } from "vue";
|
||||
import { onMounted, ref, defineEmits, defineProps, onUnmounted, watch, nextTick } from "vue";
|
||||
const props = defineProps({
|
||||
echartsId: {
|
||||
type: String,
|
||||
@ -12,8 +12,13 @@ const props = defineProps({
|
||||
data: {
|
||||
type: Object,
|
||||
default: () => { }
|
||||
},
|
||||
rotate: {
|
||||
type: Number,
|
||||
default: 0
|
||||
}
|
||||
});
|
||||
const emit = defineEmits(['click']);
|
||||
|
||||
// 保存echarts实例
|
||||
const myChart = ref(null);
|
||||
@ -101,14 +106,13 @@ function chartFn() {
|
||||
|
||||
// 安全获取标签数据
|
||||
const labels = props.data.list && Array.isArray(props.data.list) ? props.data.list.map(v => v.label) : [];
|
||||
console.log(labels);
|
||||
|
||||
const option = {
|
||||
grid: {
|
||||
top: '15%',
|
||||
left: '2%',
|
||||
right: '2%',
|
||||
bottom: '15%',
|
||||
bottom: '0%',
|
||||
containLabel: true
|
||||
},
|
||||
tooltip: {
|
||||
@ -137,12 +141,15 @@ function chartFn() {
|
||||
},
|
||||
axisTick: {
|
||||
show: true
|
||||
}, axisLabel: {
|
||||
interval: 0 // 控制标签的显示间隔,0 表示全部显示,可以根据需要调整为其他值,例如 1 表示每隔一个显示一个标签。
|
||||
}
|
||||
},
|
||||
axisLabel: {
|
||||
interval: 0, // 控制标签的显示间隔,0 表示全部显示,可以根据需要调整为其他值,例如 1 表示每隔一个显示一个标签。
|
||||
color: '#666666',
|
||||
rotate: props.rotate || 0,
|
||||
}
|
||||
},
|
||||
yAxis: {
|
||||
type: "value",
|
||||
type: "value",
|
||||
splitLine: {
|
||||
show:true ,
|
||||
lineStyle: {
|
||||
@ -153,7 +160,6 @@ function chartFn() {
|
||||
axisTick: { show: false },
|
||||
axisLine: { show: false },
|
||||
axisLabel: { color: props.color },
|
||||
|
||||
},
|
||||
series: [
|
||||
{
|
||||
@ -198,7 +204,7 @@ function chartFn() {
|
||||
symbolSize: [barWidth - 4, 10],
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: colorArr[2]
|
||||
color: props.data.topColor || colorArr[2]
|
||||
},
|
||||
},
|
||||
tooltip: {
|
||||
@ -209,6 +215,9 @@ function chartFn() {
|
||||
};
|
||||
|
||||
option && myChart.value.setOption(option);
|
||||
myChart.value.on('click', function (param) {
|
||||
emit('click', param.name);
|
||||
});
|
||||
}
|
||||
|
||||
// 监听数据变化
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user