Merge remote-tracking branch 'origin/master'
11 files modified
2 files added
| | |
| | | }); |
| | | }; |
| | | |
| | | // 喊话 |
| | | export const startVoice = (data) => { |
| | | return request({ |
| | | url:`/drone-device-core/speak/api/v1/startVoice`, |
| | | method: 'post', |
| | | data, |
| | | }); |
| | | }; |
| | | |
| | | //播报列表单个音频文件播放(远离河道) |
| | | export const stayAwayRiver = (params) => { |
| | | const url = `/drone-device-core/speak/api/v1/putVoice`; |
| | | return request({ |
| | | url, |
| | | method: 'post', |
| | | params, |
| | | }); |
| | | }; |
| | | |
| | | //播报文件 |
| | | export const getVoiceFile = (params) => { |
| | | const url = `/drone-device-core/speak/api/v1/getVoiceFile`; |
| | | return request({ |
| | | url, |
| | | method: 'post', |
| | | params, |
| | | }); |
| | | }; |
| | | |
| | | // 上传音频文件 |
| | | export const uploadSpeak = (data) => { |
| | | const url = `/drone-device-core/speak/api/v1/uploadSpeak`; |
| | | return request({ |
| | | url, |
| | | method: 'post', |
| | | headers: { |
| | | 'Content-Type': 'multipart/form-data', |
| | | }, |
| | | data, |
| | | }); |
| | | }; |
| | | |
| | | // 播放音频 |
| | | export const playAudio = (params) => { |
| | | const url = `/drone-device-core/speak/api/v1/startVoices`; |
| | | return request({ |
| | | url, |
| | | method: 'post', |
| | | params, |
| | | }); |
| | | }; |
| | | |
| | | |
| | | // 无人机开启ai |
| | | export const getLiveAiLinkApi = (data) => { |
| | |
| | | <RealTimeMap :class="`${isMaxMap ? 'maxBox' : 'minBox'}`" /> |
| | | <TaskDetailsRight v-if="isAutoControl" /> |
| | | <template v-else> |
| | | <TaskDetailsHead /> |
| | | <TaskDetailsLeft /> |
| | | |
| | | </template> |
| | | <TaskDetailsHead /> |
| | | <TaskDetailsLeft /> |
| | | |
| | | <!-- 控制面板,里面有方法需要立即执行,不可用v-if --> |
| | | <!-- <ControlPanel />--> |
| | |
| | | <div @click="recordFun">{{ isRecording ? '录像中...' : '录像' }}</div> |
| | | </div> |
| | | <div class="multiCol"> |
| | | <div @click="ElMessage.warning('加急开发中...')">喊话</div> |
| | | <div @click="ElMessage.warning('加急开发中...')">广播</div> |
| | | <div @click="shoutFun">{{ isRecordShouting ? '喊话' : '停止喊话' }}</div> |
| | | <div @click="broadcastFun">广播</div> |
| | | </div> |
| | | |
| | | <div class="percent" v-if="isRecordShouting && percent > 0"> |
| | | <el-progress :text-inside="true" :stroke-width="10" :percentage="percent"></el-progress> |
| | | </div> |
| | | <div class="cameraZoom"> |
| | | <el-slider |
| | | v-model="cameraParams.zoom_factor" |
| | |
| | | /> |
| | | </div> |
| | | </div> |
| | | <!-- 广播列表 --> |
| | | <div class="broadcast" v-if="isBroadcast"> |
| | | <div class="title"> |
| | | <span>语音内容</span> |
| | | <img src="@/assets/images/taskManagement/taskIntermediateContent/broadcast-list.png" alt="" /> |
| | | <img @click="isBroadcast = !isBroadcast" class="close" src="@/assets/images/taskManagement/taskIntermediateContent/close.png" alt=""> |
| | | </div> |
| | | <div class="search-btn"> |
| | | <div class="input-set"> |
| | | <label>文件名称:</label><el-input v-model="searchParams.name" placeholder="请输入广播名称"></el-input> |
| | | </div> |
| | | <div class="btn-set"> |
| | | <div class="btn" @click="clearData">清空</div> |
| | | <div class="btn" @click="getFileList">搜索</div> |
| | | <el-upload |
| | | class="btn" |
| | | action="/upload" |
| | | :show-file-list="false" |
| | | :before-upload="handleUpload"> |
| | | 音频上传 |
| | | </el-upload> |
| | | </div> |
| | | </div> |
| | | <div class="video-table"> |
| | | <div class="table-header"> |
| | | <div class="name">音频名称</div> |
| | | <div class="operate">操作</div> |
| | | </div> |
| | | <div class="table-body" v-for="item in tableList"> |
| | | <div class="name">{{ item.name }}</div> |
| | | <div class="operate"><span class="btn" @click="playVoice(item)">播放</span></div> |
| | | </div> |
| | | </div> |
| | | <div class="pagination"> |
| | | <el-pagination |
| | | background |
| | | :page-sizes="[10, 20, 30, 50]" |
| | | v-model:current-page="searchParams.page" |
| | | v-model:page-size="searchParams.page_size" |
| | | layout=" prev, pager, next" |
| | | :total="total" |
| | | @change="pageChange" |
| | | /> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import EventBus from '@/event-bus' |
| | | import { callPhotoAndVideoCmd, cameraParamsChangeApi, ptzResetModeApi } from '@/api/payload' |
| | | import { ElMessage } from 'element-plus' |
| | | import { |
| | | callPhotoAndVideoCmd, |
| | | cameraParamsChangeApi, |
| | | ptzResetModeApi, |
| | | startVoice, |
| | | stayAwayRiver, |
| | | getVoiceFile, |
| | | playAudio, |
| | | uploadSpeak } from '@/api/payload' |
| | | import { ElMessage, ElMessageBox } from 'element-plus' |
| | | import { throttle } from 'lodash' |
| | | import Recorder from 'js-audio-recorder'; |
| | | import dayjs from 'dayjs' |
| | | |
| | | // 初始化喊话 |
| | | let globalShout = null |
| | | |
| | | const isRecording = ref(false) |
| | | |
| | |
| | | ElMessage.success('拍照成功') |
| | | }) |
| | | } |
| | | |
| | | // 记录喊话是否开始阶段 |
| | | const isRecordShouting = ref(true); |
| | | const isFlag = ref(false); |
| | | const percent = ref(0); // 滚动条滚动百分比 |
| | | // 初始化喊话 |
| | | function initShout() { |
| | | destroyShout(); |
| | | globalShout = new Recorder({ |
| | | sampleBits: 16, |
| | | sampleRate: 16000, |
| | | numChannels: 1, |
| | | }) |
| | | } |
| | | |
| | | // 销毁喊话 |
| | | function destroyShout() { |
| | | if (globalShout) { |
| | | globalShout.pause() |
| | | globalShout.destroy() // 销毁实例 |
| | | globalShout = null |
| | | } |
| | | } |
| | | |
| | | // 喊话 |
| | | function shoutFun() { |
| | | // 是否需要判断有控制权限 |
| | | if (isFlag.value) return |
| | | isFlag.value = true; |
| | | if (isRecordShouting.value) { |
| | | // 初始化喊话 |
| | | initShout(); |
| | | globalShout.start().then(() => { |
| | | ElMessage.success('开始喊话') |
| | | isRecordShouting.value = false |
| | | isFlag.value = false |
| | | }).catch((err) => { |
| | | isFlag.value = false |
| | | }) |
| | | } else { |
| | | let formData = new FormData(); |
| | | const wavBlob = globalShout.getWAVBlob() |
| | | const wavform = new File([wavBlob], new Date().getTime() + '.wav') |
| | | formData.append('file', wavform) |
| | | formData.append('sn', '8UUXN2A00A00MM') |
| | | formData.append('psdk_index', 2) |
| | | formData.append('name', '喊话' + dayjs().format('YYYY.MM.DD HH:mm:ss')) |
| | | formData.append('volumn', 100) |
| | | startVoice(formData).then(res => { |
| | | ElMessage.success('喊话成功'); |
| | | isRecordShouting.value = true |
| | | isFlag.value = false |
| | | destroyShout(); |
| | | }).catch(err => { |
| | | isRecordShouting.value = true |
| | | isFlag.value = false |
| | | ElMessage.error('喊话失败') |
| | | destroyShout(); |
| | | }); |
| | | } |
| | | } |
| | | const tableList = ref([]); |
| | | // 分页相关 |
| | | const searchParams = ref({ |
| | | sn: droneSn.value, |
| | | name: '', |
| | | page: 1, |
| | | page_size: 1 |
| | | }); |
| | | const isBroadcast = ref(false); |
| | | const total = ref(0); |
| | | // 广播 |
| | | function broadcastFun() { |
| | | // 是否需要判断有控制权限 |
| | | // 弹出框选择文件 |
| | | isBroadcast.value = true; |
| | | // 获取文件接口 |
| | | getFileList(); |
| | | } |
| | | |
| | | // 获取文件列表 |
| | | function getFileList() { |
| | | getVoiceFile(searchParams.value).then((res) => { |
| | | if (res.data.code !== 0) return ElMessage.error(res.data.msg); |
| | | tableList.value = res.data.data.records; |
| | | total.value = res.data.data.total; |
| | | }); |
| | | } |
| | | |
| | | // 清除数据 |
| | | function clearData() { |
| | | searchParams.value.name = ''; |
| | | searchParams.value.page = 1; |
| | | getFileList(); |
| | | } |
| | | |
| | | function pageChange(val) { |
| | | searchParams.value.page = val; |
| | | getFileList(); |
| | | } |
| | | // 上传 |
| | | function handleUpload(file) { |
| | | let formData = new FormData(); |
| | | formData.append('file', file) |
| | | formData.append('sn', droneSn.value) |
| | | uploadSpeak(formData).then(res => { |
| | | if (res.data.code !== 0) return ElMessage.error('上传失败'); |
| | | ElMessage.success('上传成功'); |
| | | // 获取文件接口 |
| | | getFileList(); |
| | | }).catch(err => { |
| | | ElMessage.error('上传失败') |
| | | }) |
| | | } |
| | | |
| | | // 播放操作 |
| | | function playVoice(item) { |
| | | ElMessageBox.confirm('是否确认播放该音频?', '提示', { |
| | | confirmButtonText: '确定', |
| | | cancelButtonText: '取消', |
| | | type: 'warning' |
| | | }).then(() => { |
| | | const { sn, name, url, md5,voice } = item |
| | | playAudio({sn, name, url, md5,voice}).then((res) => { |
| | | if (res.code !== 0) return ElMessage.error("播放失败"); |
| | | ElMessage.success("播放成功"); |
| | | }); |
| | | }).catch(() => { |
| | | ElMessage({ |
| | | type: 'info', |
| | | message: '已取消' |
| | | }); |
| | | }); |
| | | } |
| | | onMounted(() => { |
| | | // 初始化喊话 |
| | | initShout(); |
| | | }); |
| | | onUnmounted(() => { |
| | | // 销毁喊话 |
| | | destroyShout(); |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | |
| | | top: 50%; |
| | | transform: translateY(-60%); |
| | | width: 178px; |
| | | height: 409px; |
| | | height: 416px; |
| | | background: rgba(0, 0, 0, 0.5); |
| | | backdrop-filter: blur(5px); |
| | | border-radius: 20px 20px 20px 20px; |
| | |
| | | } |
| | | } |
| | | } |
| | | .percent { |
| | | width: 146px; |
| | | :deep(.el-progress-bar__outer) { |
| | | height: 6px; |
| | | background-color: rgba(255, 255, 255, 0.1); |
| | | } |
| | | :deep(.el-progress-bar__inner) { |
| | | height: 6px; |
| | | background: #FFFFFF; |
| | | border-radius: 10px 10px 10px 10px; |
| | | transition: all 0.3s; |
| | | } |
| | | :deep(.el-progress-bar__innerText) { |
| | | // color: red; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .broadcast { |
| | | z-index: 2; |
| | | position: absolute; |
| | | left: 204px; |
| | | top: 60%; |
| | | transform: translateY(-60%); |
| | | backdrop-filter: blur(5px); |
| | | width: 608px; |
| | | height: 256px; |
| | | // background: rgba(64,64,64,0.25); |
| | | background: rgba(0, 0, 0, 0.5); |
| | | border-radius: 20px 20px 20px 20px; |
| | | .title { |
| | | margin: 18px 8px; |
| | | span { |
| | | width: 66px; |
| | | height: 18px; |
| | | font-family: Segoe UI, Segoe UI; |
| | | font-weight: 400; |
| | | font-size: 14px; |
| | | color: #EDEDED; |
| | | line-height: 18px; |
| | | text-align: left; |
| | | font-style: normal; |
| | | text-transform: none; |
| | | margin-left: 16px; |
| | | } |
| | | img { |
| | | width: 584px; |
| | | height: 14px; |
| | | } |
| | | .close { |
| | | width: 16px; |
| | | height: 16px; |
| | | text-align: right; |
| | | position: absolute; |
| | | right: 16px; |
| | | top: 16px; |
| | | cursor: pointer; |
| | | } |
| | | } |
| | | .search-btn { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | color: #EDEDED; |
| | | margin: 0 14px; |
| | | .input-set { |
| | | display: flex; |
| | | align-items: center; |
| | | width: 214px; |
| | | height: 32px; |
| | | label {width: 90px;} |
| | | :deep(.el-input__wrapper) { |
| | | background: rgba(58,58,58,0.75); |
| | | border-radius: 8px 8px 8px 8px; |
| | | } |
| | | :deep(.el-input__inner) { |
| | | color: #EDEDED; |
| | | } |
| | | } |
| | | .btn-set { |
| | | display: flex; |
| | | gap: 12px; |
| | | .btn { |
| | | width: 66px; |
| | | height: 32px; |
| | | line-height: 32px; |
| | | text-align: center; |
| | | background: rgba(58,58,58,0.75); |
| | | box-shadow: 0px 4px 72px 0px rgba(0,0,0,0.25); |
| | | border-radius: 8px 8px 8px 8px; |
| | | color: #EDEDED; |
| | | cursor: pointer; |
| | | } |
| | | } |
| | | } |
| | | .video-table { |
| | | margin: 14px 10px; |
| | | .table-header { |
| | | height: 44px; |
| | | line-height: 44px; |
| | | background: rgba(66,66,66,0.85); |
| | | border-radius: 8px 8px 0px 0px; |
| | | display: flex; |
| | | color: #BDBDBD; |
| | | } |
| | | .table-body { |
| | | height: 44px; |
| | | line-height: 44px; |
| | | background: rgba(74,72,72,0.6); |
| | | border-radius: 0px 0px 8px 8px; |
| | | display: flex; |
| | | color: #EDEDED; |
| | | } |
| | | .name { |
| | | width: 60%; |
| | | text-align: center |
| | | } |
| | | .operate { |
| | | width:40%; |
| | | text-align: center; |
| | | .btn { |
| | | display: inline-block; |
| | | cursor: pointer; |
| | | width: 66px; |
| | | height: 32px; |
| | | line-height: 32px; |
| | | text-align: center; |
| | | background: rgba(58,58,58,0.75); |
| | | box-shadow: 0px 4px 72px 0px rgba(0,0,0,0.25); |
| | | border-radius: 8px 8px 8px 8px; |
| | | color: #EDEDED; |
| | | } |
| | | } |
| | | } |
| | | .pagination { |
| | | position: absolute; |
| | | right: 10px; |
| | | bottom: 10px; |
| | | height: 32px; |
| | | display: flex; |
| | | |
| | | :deep(.number) { |
| | | color: #EDEDED; |
| | | } |
| | | :deep(.btn-prev), |
| | | :deep(.btn-next) { |
| | | width: 26px; |
| | | height: 26px; |
| | | background: rgba(58,58,58,0.75); |
| | | box-shadow: 0px 4px 72px 0px rgba(0,0,0,0.25); |
| | | border-radius: 8px 8px 8px 8px; |
| | | cursor: pointer; |
| | | } |
| | | :deep(.el-pager li) { |
| | | cursor: pointer; |
| | | background: rgba(58,58,58,0.75); |
| | | box-shadow: 0px 4px 72px 0px rgba(0,0,0,0.25); |
| | | border-radius: 8px 8px 8px 8px; |
| | | border: 1px solid rgba(255,255,255,0.99); |
| | | margin: 0 4px; |
| | | } |
| | | } |
| | | } |
| | | </style> |
| | |
| | | .el-range-separator { |
| | | color: #ffffff; |
| | | } |
| | | |
| | | |
| | | } |
| | | // :teleported="false" |
| | | // 日期下拉框 |
| | | .custom-date-picker { |
| | | background: #012350 !important; |
| | | border: 1px solid !important; |
| | | border-radius: 0px 0px 8px 8px; |
| | | border-image: linear-gradient(180deg, rgba(255, 255, 255, 0), rgba(115, 192, 255, 1)) 1 1 !important; |
| | | /* 修改箭头样式 */ |
| | | .el-popper__arrow { |
| | | &::before { |
| | | background: #0d3556 !important; |
| | | border: 1px solid #0d3556 !important; |
| | | box-sizing: border-box; |
| | | } |
| | | } |
| | | /* 修改头部背景色 */ |
| | | .custom-date-picker .el-picker-panel__header { |
| | | background: linear-gradient(180deg, rgba(13, 53, 86, 0.85) 0%, rgba(1, 35, 80, 0.85) 100%) !important; |
| | | color: #fff !important; |
| | | } |
| | | .el-date-table { |
| | | th { |
| | | color: #fff !important; /* 星期标题颜色 */ |
| | | } |
| | | } |
| | | /* 修改日期单元格悬停/选中状态 */ |
| | | .custom-date-picker .el-date-table td:hover, |
| | | .custom-date-picker .el-date-table td.current:not(.disabled) { |
| | | background: rgba(60, 121, 202) !important; |
| | | color: white !important; |
| | | } |
| | | // 头部按钮 |
| | | .el-date-table td.start-date span, |
| | | .el-date-table td.start-date span, |
| | | .el-date-table td.end-date span { |
| | | background-color: #012350 !important; |
| | | } |
| | | |
| | | .el-date-table td.in-range div, |
| | | .el-date-table td.in-range div:hover, |
| | | .el-date-table.is-week-mode .el-date-table__row.current div, |
| | | .el-date-table.is-week-mode .el-date-table__row:hover div { |
| | | background-color: rgba(60, 121, 202) !important; |
| | | } |
| | | .el-picker-panel__icon-btn { |
| | | color: #fff !important; |
| | | |
| | | &:hover { |
| | | color: var(--el-color-primary) !important; |
| | | } |
| | | |
| | | .el-icon { |
| | | &::before { |
| | | color: inherit !important; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | //下拉 |
| | | // :teleported="false" |
| | | .ztzf-select { |
| | | .el-select__wrapper { |
| | | background: #012A50; |
| | |
| | | |
| | | // 下拉框 |
| | | .el-select-dropdown__empty { |
| | | background: #012350; |
| | | background: #012A50; |
| | | border-radius: 0px 0px 8px 8px; |
| | | border: 1px solid; |
| | | border-image: linear-gradient(180deg, rgba(255, 255, 255, 0), rgba(115, 192, 255, 1)) 1 1; |
| | |
| | | <template> |
| | | <div class="event-overviewdetail-right" :class="{ isMore }"> |
| | | <CommonTitle title="事件概况" :style="{width: isMore?pxToRem(820):pxToRem(404)}" /> |
| | | <CommonTitle title="事件概况" :style="{ width: isMore ? pxToRem(820) : pxToRem(404) }" /> |
| | | |
| | | <div class="content"> |
| | | <img class="leftArrow" :class="isMore?'rightArrow':''" :src="isMore ? rightArrowImg : leftArrowImg" @click="leftArrowFun" alt="" /> |
| | | <img |
| | | class="leftArrow" |
| | | :class="isMore ? 'rightArrow' : ''" |
| | | :src="isMore ? rightArrowImg : leftArrowImg" |
| | | @click="leftArrowFun" |
| | | alt="" |
| | | /> |
| | | |
| | | <el-date-picker |
| | | class="ztzf-date-picker" |
| | |
| | | <img class="statusItemImg" :src="item.img" alt="" /> |
| | | <div class="statusItemInfo"> |
| | | <div class="statusItemName">{{ item.name }}</div> |
| | | <div class="statusItemNum" :style="{ color:item.color }">{{ item.num || 0 }}</div> |
| | | <div class="statusItemNum" :style="{ color: item.color }">{{ item.num || 0 }}</div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | |
| | | <div class="eventList"> |
| | | <div class="eventListItem" v-for="item in list"> |
| | | <img |
| | | class="eventListItemImg" |
| | | :src="getSmallImg(item.photo_url)" |
| | | alt="" |
| | | @click="getFindImgHistory(item)" |
| | | /> |
| | | <img class="eventListItemImg" :src="getSmallImg(item.photo_url)" alt="" @click="getFindImgHistory(item)" /> |
| | | <div class="eventListItemPosition" :title="item.address" @click="positioning(item)"> |
| | | <img :src="positioningImg" alt="" title="点击定位" /> |
| | | <!-- <div class="address">{{ item.address }}</div> --> |
| | |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="image-list" v-if="isShowBigImg" :style="{ right: isMore?pxToRem(840):pxToRem(460) }"> |
| | | <div class="image-list" v-if="isShowBigImg" :style="{ right: isMore ? pxToRem(838) : pxToRem(460) }"> |
| | | <div class="title"> |
| | | <img @click="isShowBigImg=false" src="@/assets/images/home/useEventOperate/close.png" alt=""> |
| | | <img @click="isShowBigImg = false" src="@/assets/images/home/useEventOperate/close.png" alt="" /> |
| | | </div> |
| | | <div class="content"> |
| | | <img :src="clickImgSrc" alt=""> |
| | | <img :src="clickImgSrc" alt="" /> |
| | | </div> |
| | | <div class="card"> |
| | | <div v-for="(item,index) in imageList"> |
| | | <div class="time-top" :class="index===selectedImgIndex?'active':''" @click="clickWeekTime(item,index)">{{ item.create_time_str }}</div> |
| | | <div class="time-point"> |
| | | <img v-if="index===selectedImgIndex" src="@/assets/images/home/useEventOperate/point-active.png" alt=""> |
| | | <img v-else src="@/assets/images/home/useEventOperate/point.png" alt=""> |
| | | <div class="card-content"> |
| | | <div v-for="(item, index) in imageList"> |
| | | <div class="time-top" :class="index === selectedImgIndex ? 'active' : ''" @click="clickWeekTime(item, index)"> |
| | | {{ item.create_time_str }} |
| | | </div> |
| | | <div class="time-point"> |
| | | <img |
| | | class="active" |
| | | v-if="index === selectedImgIndex" |
| | | src="@/assets/images/home/useEventOperate/point-active.png" |
| | | alt="" |
| | | /> |
| | | <img v-else src="@/assets/images/home/useEventOperate/point.png" alt="" /> |
| | | </div> |
| | | <div class="time-bottom">{{ item.create_time }}</div> |
| | | </div> |
| | | <div class="time-bottom">{{ item.create_time }}</div> |
| | | <div class="time-line"></div> |
| | | </div> |
| | | <div class="time-line"></div> |
| | | </div> |
| | | </div> |
| | | </template> |
| | |
| | | size: 8, |
| | | }) |
| | | |
| | | const getSmallImg = (url) => { |
| | | const getSmallImg = url => { |
| | | return url ? url.substring(0, url.lastIndexOf('.')) + '_small' + url.substring(url.lastIndexOf('.')) : '' |
| | | } |
| | | |
| | |
| | | }) |
| | | } |
| | | const { flyTo } = cesiumOperation() |
| | | const longitudeOffset = ref(0); |
| | | const longitudeOffset = ref(0) |
| | | const positioning = row => { |
| | | const longitude = Number(row.longitude) |
| | | const latitude = Number(row.latitude) |
| | | flyTo({ longitude: longitude, latitude:latitude + 0.0002 }, 1, 1000); |
| | | flyTo({ longitude: longitude, latitude: latitude + 0.0008 }, 1, 1000) |
| | | } |
| | | |
| | | // 事件状态+数量 |
| | | const statusList = ref([ |
| | | { name: '全部状态', img: status0Img, id: undefined,few: true, color: '#FFD509' }, |
| | | { name: '全部状态', img: status0Img, id: undefined, few: true, color: '#FFD509' }, |
| | | { name: '待审核', img: status1Img, id: 2, color: '#8CFEA7' }, |
| | | { name: '待处理', img: status2Img, id: 0, few: true, color: '#FF7411' }, |
| | | { name: '处理中', img: status3Img, id: 3, few: true, color: '#FFC398' }, |
| | |
| | | params.value.start_date = start_date |
| | | params.value.end_date = end_date |
| | | // 提交数据,更新聚合 |
| | | store.commit('setEventTimeRang', timeArr.value); |
| | | store.commit('setEventTimeRang', timeArr.value) |
| | | // 重置 |
| | | getEventStatusNumFun() |
| | | getEventList() |
| | |
| | | } |
| | | getEventPage(params.value, pageParams).then(res => { |
| | | const resData = res.data.data |
| | | list.value = (resData?.records || []) |
| | | list.value = resData?.records || [] |
| | | total.value = resData.total |
| | | }) |
| | | } |
| | | const isShowBigImg = ref(false) |
| | | const imageList = ref([]); |
| | | const clickImgSrc = ref(''); |
| | | const selectedImgIndex = ref(0); |
| | | const imageList = ref([]) |
| | | const clickImgSrc = ref('') |
| | | const selectedImgIndex = ref(0) |
| | | // 点击图片放大 显示详细信息 |
| | | const getFindImgHistory = (item) => { |
| | | const getFindImgHistory = item => { |
| | | // 下半部分隐藏 右侧隐藏 |
| | | isShowBigImg.value = true |
| | | store.commit('setHideBottomIcon', false) |
| | | findImgHistory(item.id).then((res) => { |
| | | findImgHistory(item.id).then(res => { |
| | | if (res.data.code !== 0) return |
| | | imageList.value = res.data.data |
| | | clickImgSrc.value = res.data.data[0]?.url; |
| | | clickImgSrc.value = res.data.data[0]?.url |
| | | }) |
| | | positioning(item); |
| | | positioning(item) |
| | | } |
| | | // 点击周期 |
| | | const clickWeekTime = (item,index) => { |
| | | const clickWeekTime = (item, index) => { |
| | | clickImgSrc.value = item.url |
| | | selectedImgIndex.value = index |
| | | } |
| | | |
| | | const getDateRange = unit => { |
| | | if (unit === 'today') { |
| | | return [dayjs().format('YYYY-MM-DD HH:mm:ss'), dayjs().format('YYYY-MM-DD HH:mm:ss')]; |
| | | } |
| | | return [dayjs().startOf(unit).format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf(unit).format('YYYY-MM-DD HH:mm:ss')]; |
| | | }; |
| | | if (unit === 'today') { |
| | | return [dayjs().format('YYYY-MM-DD HH:mm:ss'), dayjs().format('YYYY-MM-DD HH:mm:ss')] |
| | | } |
| | | return [dayjs().startOf(unit).format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf(unit).format('YYYY-MM-DD HH:mm:ss')] |
| | | } |
| | | |
| | | // 监听事件时间范围变化 |
| | | watch(() => store.state.home.eventTimeType, (newVal) => { |
| | | timeArr.value = getDateRange(newVal); |
| | | const [start_date, end_date] = getDateRange(newVal); |
| | | params.value.start_date = start_date |
| | | params.value.end_date = end_date |
| | | getEventStatusNumFun() |
| | | getEventList() |
| | | getList() |
| | | }, { immediate: false,deep: true }) |
| | | watch( |
| | | () => store.state.home.eventTimeType, |
| | | newVal => { |
| | | timeArr.value = getDateRange(newVal) |
| | | const [start_date, end_date] = getDateRange(newVal) |
| | | params.value.start_date = start_date |
| | | params.value.end_date = end_date |
| | | getEventStatusNumFun() |
| | | getEventList() |
| | | getList() |
| | | }, |
| | | { immediate: false, deep: true } |
| | | ) |
| | | |
| | | onMounted(() => { |
| | | getDeviceList() |
| | |
| | | .content { |
| | | width: 390px; |
| | | height: 877px; |
| | | background: linear-gradient( |
| | | 270deg, |
| | | rgba(31, 62, 122, 0) 0%, |
| | | rgba(31, 62, 122, 0.35) 21%, |
| | | #1f3e7a 100%); |
| | | background: linear-gradient(270deg, rgba(31, 62, 122, 0) 0%, rgba(31, 62, 122, 0.35) 21%, #1f3e7a 100%); |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-content: start; |
| | |
| | | // margin-right: 4px; |
| | | |
| | | &.active { |
| | | background: linear-gradient( 180deg, rgba(19,80,141,0) 0%, rgba(22,56,91,0.48) 48%, #053462 98%, #259DFF 98%, #259DFF 98%); |
| | | background: linear-gradient( |
| | | 180deg, |
| | | rgba(19, 80, 141, 0) 0%, |
| | | rgba(22, 56, 91, 0.48) 48%, |
| | | #053462 98%, |
| | | #259dff 98%, |
| | | #259dff 98% |
| | | ); |
| | | } |
| | | |
| | | .statusItemImg { |
| | |
| | | display: flex; |
| | | justify-content: center; |
| | | } |
| | | |
| | | .image-list { |
| | | border: 1px solid red; |
| | | position: absolute; |
| | | z-index: 1; |
| | | top: 148px; |
| | | |
| | | right: 460px; |
| | | top: 122px; |
| | | width: 540px; |
| | | height: 420px; |
| | | background: #0F1929; |
| | | // box-shadow: inset 0px -50px 50px 0px rgba(27,148,255,0.13); |
| | | // border-radius: 0px 0px 0px 0px; |
| | | border: 2px solid; |
| | | border-image: linear-gradient(180deg, rgba(81, 168, 255, 0), rgba(48, 111, 202, 1), rgba(255, 255, 255, 1), rgba(27, 148, 255, 1)) 2 2; |
| | | |
| | | width: 632px; |
| | | height: 476px; |
| | | border: solid; |
| | | background: #0f1929; |
| | | z-index: 1; |
| | | |
| | | border: solid 2px transparent; |
| | | border-radius: 20px; |
| | | background-image: linear-gradient(#fff, #fff), linear-gradient(180deg, rgba(81, 168, 255, 1), rgba(189, 228, 255, 1)); |
| | | background-origin: border-box; |
| | | background-clip: content-box, border-box; |
| | | |
| | | overflow: hidden; |
| | | .title { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | position: absolute; |
| | | text-align: right; |
| | | right: 12px; |
| | | // top: 12px; |
| | | top: 0; |
| | | right: 0; |
| | | width: 45px; |
| | | height: 44px; |
| | | background: rgba(0, 0, 0, 0.5); |
| | | border-radius: 0px 20px 0px 8px; |
| | | |
| | | img { |
| | | width: 10px; |
| | | height: 10px; |
| | | width: 10.55px; |
| | | height: 10.55px; |
| | | cursor: pointer; |
| | | } |
| | | } |
| | | |
| | | .content { |
| | | img { |
| | | width: 100%; |
| | |
| | | border-radius: 10px 10px 10px 10px; |
| | | } |
| | | } |
| | | |
| | | .card { |
| | | background: linear-gradient( 180deg, rgba(13,30,70,0.72) 0%, #142E6B 100%); |
| | | padding: 0px 10px 0px 10px; |
| | | color: #BECBEA; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | position: absolute; |
| | | bottom: 0px; |
| | | width: 100%; |
| | | .time-top { |
| | | width: 50px; |
| | | height: 30px; |
| | | line-height: 30px; |
| | | text-align: center; |
| | | color: #ffffff; |
| | | background: linear-gradient( 180deg, rgba(13,30,70,0.72) 0%, #142E6B 100%); |
| | | border: 1px solid #0054D3; |
| | | cursor: pointer; |
| | | } |
| | | .active { |
| | | background: linear-gradient( 180deg, rgba(13,48,131,0.72) 0%, #023DC8 100%); |
| | | border: 1px solid; |
| | | border-image: linear-gradient(180deg, rgba(0, 84, 211, 1), rgba(146, 186, 245, 1)) 1 1; |
| | | } |
| | | .time-point { |
| | | text-align: center; |
| | | img { |
| | | width: 8px; |
| | | height: 12px; |
| | | } |
| | | } |
| | | .time-line { |
| | | height: 67px; |
| | | background: rgba(0, 0, 0, 0.42); |
| | | border-radius: 0px 0px 20px 20px; |
| | | padding: 0px 6px 0px 29px; |
| | | |
| | | color: #d5d5d5; |
| | | font-size: 14px; |
| | | |
| | | .card-content { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | |
| | | position: absolute; |
| | | background: linear-gradient( 82deg, rgba(23,40,79,0) 0%, #576D9F 17%, #576D9F 86%, rgba(23,40,79,0) 100%); |
| | | height: 2px; |
| | | top: 38px; |
| | | width: 100%; |
| | | left: 29px; |
| | | width: calc(100% - 29px - 6px); |
| | | height: 100%; |
| | | |
| | | & > div { |
| | | position: relative; |
| | | } |
| | | |
| | | .time-top { |
| | | margin-top: 10px; |
| | | line-height: 1; |
| | | text-align: center; |
| | | cursor: pointer; |
| | | } |
| | | |
| | | .active { |
| | | font-weight: 400; |
| | | color: #ffffff; |
| | | } |
| | | |
| | | .time-point { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | position: absolute; |
| | | top: 28px; |
| | | left: 50%; |
| | | width: 18px; |
| | | height: 18px; |
| | | z-index: 1; |
| | | transform: translate(-50%, 0); |
| | | |
| | | img { |
| | | width: 11.2px; |
| | | height: 11.2px; |
| | | } |
| | | |
| | | img.active { |
| | | width: 16.89px; |
| | | height: 16.89px; |
| | | } |
| | | } |
| | | |
| | | .time-bottom { |
| | | margin-top: 20px; |
| | | } |
| | | |
| | | .time-line { |
| | | position: absolute; |
| | | top: 35px; |
| | | width: 100%; |
| | | width: 595px; |
| | | border-radius: 0px 0px 0px 0px; |
| | | border: 1px solid rgba(237, 237, 237, 0.6); |
| | | z-index: 0; |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-date-picker |
| | | popper-class="custom-date-picker" |
| | | class="ztzf-date-picker" |
| | | v-model="dateRange" |
| | | type="daterange" |
| | |
| | | } |
| | | } |
| | | // 查看 |
| | | // 当前任务详情 1:待执行 2:执行中 |
| | | // 历史任务详情 3:已执行 5:执行失败 |
| | | const isShowCurrentTaskDetails = ref(false) |
| | | const currentTaskDetailsId = ref(null) |
| | | const deviceJobDetailsShow = ref(false) |
| | |
| | | }) |
| | | </script> |
| | | <style lang="scss"> |
| | | /* 修改日期单元格背景色 */ |
| | | .custom-date-picker .el-picker-panel__body { |
| | | background: #012350 !important; |
| | | color: #fff !important; |
| | | } |
| | | |
| | | </style> |
| | | <style scoped lang="scss"> |
| | | /* 修改整个日期面板的背景色 */ |
| | | .custom-date-picker { |
| | | background: #1e2b3c !important; |
| | | border: 1px solid #479DFF !important; |
| | | } |
| | | |
| | | /* 修改头部背景色 */ |
| | | .custom-date-picker .el-picker-panel__header { |
| | | background: #16202d !important; |
| | | } |
| | | |
| | | /* 修改日期单元格背景色 */ |
| | | .custom-date-picker .el-picker-panel__body { |
| | | background: #1e2b3c !important; |
| | | } |
| | | |
| | | /* 修改日期单元格悬停/选中状态 */ |
| | | .custom-date-picker .el-date-table td:hover, |
| | | .custom-date-picker .el-date-table td.current:not(.disabled) { |
| | | background: #479DFF !important; |
| | | color: white !important; |
| | | } |
| | | |
| | | |
| | | .search-row { |
| | | display: flex; |
| | | justify-content: space-between; |
| | |
| | | break |
| | | } |
| | | case EBizCode.DeviceOsd: { |
| | | // console.log(payload, 'DeviceOsd') |
| | | console.log(payload, '888888888') |
| | | store.commit('setDeviceInfo', payload) |
| | | store.commit('setWsMessage', payload) |
| | | break |
| | |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-date-picker |
| | | popper-class="custom-date-picker" |
| | | class="ztzf-date-picker" |
| | | v-model="dateRange" |
| | | type="daterange" |
| | |
| | | handleSearch(); |
| | | }); |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | | /* 修改日期单元格背景色 */ |
| | | .custom-date-picker .el-picker-panel__body { |
| | | background: #012350 !important; |
| | | color: #fff !important; |
| | | } |
| | | </style> |
| | | <style lang="scss" scoped> |
| | | .search-box-test { |
| | | transition: all 0.3s; |
| | |
| | | <!-- 任务算法统计 --> |
| | | <template> |
| | | <div class="task-industry"> |
| | | <div class="title">任务算法类型</div> |
| | | <div class="title">机巢事件前五数量占比</div> |
| | | <div class="chart" ref="chartRef"></div> |
| | | </div> |
| | | </template> |