Browse Source

修改单个视频的打开的参数,修改任务详情的红外csv文件接口,去除任务详情的导出按钮

inspection_yanyuan
douyage 1 month ago
parent
commit
6f9548ff07
7 changed files with 118 additions and 15 deletions
  1. +7
    -2
      src/api/basedata/patrolpointmnt/patrolpointpreset.js
  2. +5
    -1
      src/components/AsyncImageFrame/index.vue
  3. +5
    -1
      src/views/cards/components/ImagePreviewZoomTemperature/index.vue
  4. +4
    -0
      src/views/cards/taskSummary/newInspectionTaskDetail.vue
  5. +56
    -5
      src/views/video/LivePreview.vue
  6. +29
    -2
      src/views/video/LivePreviewEmbed.vue
  7. +12
    -4
      src/views/video/components/NvrDeviceTree.vue

+ 7
- 2
src/api/basedata/patrolpointmnt/patrolpointpreset.js View File

@ -1,4 +1,5 @@
import request from '@/utils/request'; import request from '@/utils/request';
import store from '@/store';
// 初始化list // 初始化list
export function getList(query) { export function getList(query) {
return request({ return request({
@ -135,10 +136,14 @@ export function addBoxData(data) {
} }
// 获取csv文件 // 获取csv文件
export function downloadCsv(data) {
// 汇聚态走代理接口,stationCode 放查询参数定位目标站点;单站保持原地址
export function downloadCsv(data, stationCode) {
const agg = !!(store.getters.fromPortal && !store.getters.inSite)
const code = stationCode || (data && data.stationCode) || store.getters.workspaceStationCode || ''
return request({ return request({
url: '/simulator/ir/downloadCsv',
url: agg ? '/agg/proxy/simulator/ir/downloadCsv' : '/simulator/ir/downloadCsv',
method: 'post', method: 'post',
params: agg && code ? { stationCode: code } : undefined,
data data
}) })
} }

+ 5
- 1
src/components/AsyncImageFrame/index.vue View File

@ -103,6 +103,10 @@ export default {
type: Boolean, type: Boolean,
default: false, default: false,
}, },
stationCode: {
type: String,
default: "",
},
}, },
async created() {}, async created() {},
data() { data() {
@ -280,7 +284,7 @@ export default {
filePath: this.imgName, filePath: this.imgName,
}; };
downloadCsv(data)
downloadCsv(data, this.stationCode)
.then((response) => { .then((response) => {
const blob = response instanceof Blob ? response : new Blob([response]); const blob = response instanceof Blob ? response : new Blob([response]);
const reader = new FileReader(); const reader = new FileReader();


+ 5
- 1
src/views/cards/components/ImagePreviewZoomTemperature/index.vue View File

@ -128,6 +128,10 @@ export default {
type: [String, Array], type: [String, Array],
default: "", default: "",
}, },
stationCode: {
type: String,
default: "",
},
}, },
data() { data() {
return { return {
@ -712,7 +716,7 @@ export default {
try { try {
const data = { filePath: this.selectImgUrl}; const data = { filePath: this.selectImgUrl};
const response = await downloadCsv(data);
const response = await downloadCsv(data, this.stationCode);
const blob = response instanceof Blob ? response : new Blob([response]); const blob = response instanceof Blob ? response : new Blob([response]);
const reader = new FileReader(); const reader = new FileReader();


+ 4
- 0
src/views/cards/taskSummary/newInspectionTaskDetail.vue View File

@ -87,6 +87,7 @@
class="img-wrap" class="img-wrap"
fit="contain" fit="contain"
:src="selectPointInfo.imgAnalyse" :src="selectPointInfo.imgAnalyse"
:station-code="queryParams.stationCode"
:supportPreview="false" :supportPreview="false"
></AsyncImageFrame> ></AsyncImageFrame>
</div> </div>
@ -99,6 +100,7 @@
class="img-wrap" class="img-wrap"
fit="contain" fit="contain"
:src="selectPointInfo.img" :src="selectPointInfo.img"
:station-code="queryParams.stationCode"
:supportPreview="false" :supportPreview="false"
></AsyncImageFrame> ></AsyncImageFrame>
</div> </div>
@ -233,6 +235,7 @@
>重置</el-button >重置</el-button
> >
<el-button <el-button
v-if="!$store.getters.fromPortal"
type="primary" type="primary"
icon="el-icon-download" icon="el-icon-download"
size="small" size="small"
@ -458,6 +461,7 @@
:selectImgPosition="previewImagePos" :selectImgPosition="previewImagePos"
:showTemperatureTool="true" :showTemperatureTool="true"
:imageName="currentImageName" :imageName="currentImageName"
:station-code="queryParams.stationCode"
/> />
<ImagePreviewZoom <ImagePreviewZoom
v-else-if="showPreviewImages && !isInfraredPreview" v-else-if="showPreviewImages && !isInfraredPreview"


+ 56
- 5
src/views/video/LivePreview.vue View File

@ -9,6 +9,8 @@
:selected-code="selectedCode" :selected-code="selectedCode"
:loading="loading" :loading="loading"
:use-agg-api="isAggMode" :use-agg-api="isAggMode"
:station-code="embedStationCode"
:default-expanded="embedTreeExpanded"
@channels-loaded="handleTreeChannels" @channels-loaded="handleTreeChannels"
@select="selectChannel" @select="selectChannel"
@open="openChannel" @open="openChannel"
@ -79,6 +81,28 @@
</main> </main>
<aside v-show="embed ? embedControlVisible : controlPanelExpanded" class="control-panel"> <aside v-show="embed ? embedControlVisible : controlPanelExpanded" class="control-panel">
<section v-if="embed" class="control-section embed-layout-section">
<div class="section-title"><span>画面布局</span></div>
<div class="embed-layout-switch" aria-label="画面布局">
<button
v-for="item in layouts"
:key="item.value"
type="button"
:class="{ active: layout === item.value }"
:title="item.label"
:aria-label="item.label"
@click="changeLayout(item.value)"
>
<span
class="embed-layout-icon"
:class="`embed-layout-icon-${item.columns}`"
:style="{ gridTemplateColumns: `repeat(${item.columns}, auto)` }"
>
<i v-for="cell in item.value" :key="cell" />
</span>
</button>
</div>
</section>
<section class="control-section"> <section class="control-section">
<div class="section-title"><span>云台控制</span><small>{{ selectedChannelName }}</small></div> <div class="section-title"><span>云台控制</span><small>{{ selectedChannelName }}</small></div>
<div class="ptz-grid"> <div class="ptz-grid">
@ -214,7 +238,15 @@ const PTZ_CODES = {
props: { props: {
embed: { type: Boolean, default: false }, embed: { type: Boolean, default: false },
// 嵌入页先出画面,token 就绪后再拉设备和视频 // 嵌入页先出画面,token 就绪后再拉设备和视频
sessionReady: { type: Boolean, default: true }
sessionReady: { type: Boolean, default: true },
// 地址参数:只看某一个场站,空字符串为全部场站
embedStationCode: { type: String, default: '' },
// 地址参数:导航树默认展开
embedTreeExpanded: { type: Boolean, default: false },
// 地址参数:云台控制面板默认展开
embedControlExpanded: { type: Boolean, default: false },
// 地址参数:默认宫格,1 / 4 / 9 / 16
embedLayout: { type: Number, default: 9 }
}, },
data() { data() {
return { return {
@ -239,8 +271,8 @@ const PTZ_CODES = {
layout: 9, layout: 9,
fullscreenIndex: -1, fullscreenIndex: -1,
layouts: [ layouts: [
{ value: 1, label: '单画面' }, { value: 4, label: '四画面' },
{ value: 9, label: '九画面' }, { value: 16, label: '十六画面' }
{ value: 1, columns: 1, label: '单画面' }, { value: 4, columns: 2, label: '四画面' },
{ value: 9, columns: 3, label: '九画面' }, { value: 16, columns: 4, label: '十六画面' }
], ],
slots: Array.from({ length: 16 }, () => null), slots: Array.from({ length: 16 }, () => null),
activeIndex: 0, activeIndex: 0,
@ -327,6 +359,11 @@ const PTZ_CODES = {
this.$root.$emit('video-control-panel-updated', this.controlPanelExpanded) this.$root.$emit('video-control-panel-updated', this.controlPanelExpanded)
} }
document.addEventListener('fullscreenchange', this.handleFullscreenChange) document.addEventListener('fullscreenchange', this.handleFullscreenChange)
if (this.embed) {
this.layout = this.normalizeLayout(this.embedLayout)
this.embedTreeVisible = this.embedTreeExpanded
this.embedControlVisible = this.embedControlExpanded
}
if (!this.embed || this.sessionReady) this.loadConfig() if (!this.embed || this.sessionReady) this.loadConfig()
}, },
async activated() { async activated() {
@ -592,9 +629,14 @@ const PTZ_CODES = {
this.ptzRepeatTimer = null this.ptzRepeatTimer = null
this.streamCleanupPromise = this.closeAll() this.streamCleanupPromise = this.closeAll()
}, },
normalizeLayout(layout) {
const value = Number(layout)
return [1, 4, 9, 16].includes(value) ? value : 9
},
changeLayout(layout) { changeLayout(layout) {
if (layout === this.layout) return
this.layout = layout
const nextLayout = this.normalizeLayout(layout)
if (nextLayout === this.layout) return
this.layout = nextLayout
this.$root.$emit('video-layout-updated', layout) this.$root.$emit('video-layout-updated', layout)
this.populateDefaultLayout() this.populateDefaultLayout()
}, },
@ -951,4 +993,13 @@ const PTZ_CODES = {
.embed-toggle-left { left: 0; } .embed-toggle-left { left: 0; }
.embed-toggle-right { right: 0; } .embed-toggle-right { right: 0; }
.embed-toggle-right.open { right: 242px; } .embed-toggle-right.open { right: 242px; }
.embed-layout-switch { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 6px; }
.embed-layout-switch button { height: 36px; padding: 0; display: flex; align-items: center; justify-content: center; border: 1px solid rgba(39,135,237,.55); color: #7eb6ef; background: rgba(10,43,103,.55); cursor: pointer; }
.embed-layout-switch button:hover, .embed-layout-switch button.active { color: #54ffff; border-color: #54ffff; background: rgba(23,107,194,.72); }
.embed-layout-icon { display: grid; gap: 1px; }
.embed-layout-icon i { width: 4px; height: 4px; border: 1px solid currentColor; box-sizing: border-box; }
.embed-layout-icon-1 i { width: 14px; height: 14px; }
.embed-layout-icon-2 i { width: 6px; height: 6px; }
.embed-layout-icon-4 { gap: 1px; }
.embed-layout-icon-4 i { width: 3px; height: 3px; }
</style> </style>

+ 29
- 2
src/views/video/LivePreviewEmbed.vue View File

@ -1,6 +1,13 @@
<template> <template>
<div class="live-preview-embed"> <div class="live-preview-embed">
<live-preview embed :session-ready="sessionReady" />
<live-preview
embed
:session-ready="sessionReady"
:embed-station-code="stationCode"
:embed-tree-expanded="treeExpanded"
:embed-control-expanded="controlExpanded"
:embed-layout="layout"
/>
<div v-if="bootError" class="embed-error">{{ bootError }}</div> <div v-if="bootError" class="embed-error">{{ bootError }}</div>
</div> </div>
</template> </template>
@ -25,13 +32,33 @@ function readAccessToken(result) {
return '' return ''
} }
const LAYOUTS = [1, 4, 9, 16]
function readQuery(route) {
const query = route && route.query ? route.query : {}
const layout = Number(query.layout)
const tree = String(query.tree == null ? '' : query.tree).toLowerCase()
const control = String(query.control == null ? '' : query.control).toLowerCase()
return {
stationCode: query.stationCode ? String(query.stationCode) : '',
treeExpanded: tree === '1' || tree === 'open' || tree === 'true',
controlExpanded: control === '1' || control === 'open' || control === 'true',
layout: LAYOUTS.includes(layout) ? layout : 9
}
}
export default { export default {
name: 'LivePreviewEmbed', name: 'LivePreviewEmbed',
components: { LivePreview }, components: { LivePreview },
data() { data() {
const query = readQuery(this.$route)
return { return {
sessionReady: false, sessionReady: false,
bootError: ''
bootError: '',
stationCode: query.stationCode,
treeExpanded: query.treeExpanded,
controlExpanded: query.controlExpanded,
layout: query.layout
} }
}, },
created() { created() {


+ 12
- 4
src/views/video/components/NvrDeviceTree.vue View File

@ -87,7 +87,11 @@ export default {
loading: { type: Boolean, default: false }, loading: { type: Boolean, default: false },
openHint: { type: String, default: '单击通道打开实时预览' }, openHint: { type: String, default: '单击通道打开实时预览' },
// 汇聚门户模式:设备树改走 /agg/tree/channel(节点带 stationCode,结构与单站树一致) // 汇聚门户模式:设备树改走 /agg/tree/channel(节点带 stationCode,结构与单站树一致)
useAggApi: { type: Boolean, default: false }
useAggApi: { type: Boolean, default: false },
// 嵌入页把地址里的 stationCode 传给汇聚设备树接口;空字符串表示全部场站
stationCode: { type: String, default: '' },
// 嵌入页可指定导航树默认展开或收起
defaultExpanded: { type: Boolean, default: true }
}, },
data() { data() {
return { return {
@ -117,13 +121,17 @@ export default {
this.internalLoading = true this.internalLoading = true
try { try {
const queryParams = { patroldeviceName: '', onlineStatus: '', patroldeviceTypeFlag: 'ipc' } const queryParams = { patroldeviceName: '', onlineStatus: '', patroldeviceTypeFlag: 'ipc' }
if (this.useAggApi && this.stationCode) queryParams.stationCode = this.stationCode
const response = this.useAggApi const response = this.useAggApi
? await getChannelTree(queryParams) ? await getChannelTree(queryParams)
: await getAreaEqubookTreeSelect(queryParams) : await getAreaEqubookTreeSelect(queryParams)
this.treeNodes = Array.isArray(response.data) ? response.data : []
const nodes = Array.isArray(response.data) ? response.data : []
this.treeNodes = nodes
this.expandedKeys = [] this.expandedKeys = []
const walk = nodes => (nodes || []).forEach(node => { if (node.children && node.children.length) { this.expandedKeys.push(node.id); walk(node.children) } })
walk(this.treeNodes)
if (this.defaultExpanded) {
const walk = items => (items || []).forEach(node => { if (node.children && node.children.length) { this.expandedKeys.push(node.id); walk(node.children) } })
walk(this.treeNodes)
}
this.refreshTree() this.refreshTree()
this.$emit('channels-loaded', this.channelNodes.map(this.normalizeChannel)) this.$emit('channels-loaded', this.channelNodes.map(this.normalizeChannel))
} catch (error) { } catch (error) {


Loading…
Cancel
Save