隐患信息

- 添加物体编号信息
- 隐患等级为重大隐患时标红
- 置信度为疑似时标黄
时间线
- 鼠标悬停隐患按钮时显示隐患名称
This commit is contained in:
yueliuli 2026-04-22 16:32:49 +08:00
parent 4b20be4b7a
commit b3af3f8aa9
3 changed files with 47 additions and 9 deletions

View File

@ -6,6 +6,7 @@ import { computed, nextTick, ref, watch } from 'vue'
export interface HazardData { export interface HazardData {
ranges: number[] ranges: number[]
level: number level: number
tip: string
} }
export interface TimelineProps { export interface TimelineProps {
@ -39,6 +40,7 @@ export interface HazardRow {
end: number end: number
ranges: number[] ranges: number[]
level: number level: number
tip: string
} }
export function useTimeline( export function useTimeline(
@ -174,6 +176,7 @@ export function useTimeline(
id, id,
level: frames.level || 0, level: frames.level || 0,
ranges: frames.ranges, ranges: frames.ranges,
tip: frames.tip || '',
} }
}) })
.sort((a, b) => { .sort((a, b) => {
@ -198,6 +201,7 @@ export function useTimeline(
end: hazard.ranges[1] as number, end: hazard.ranges[1] as number,
ranges: hazard.ranges.map(range => range as number), ranges: hazard.ranges.map(range => range as number),
level: hazard.level || 0, level: hazard.level || 0,
tip: hazard.tip || '',
}) })
assigned = true assigned = true
break break
@ -210,6 +214,7 @@ export function useTimeline(
end: hazard.ranges[1] as number, end: hazard.ranges[1] as number,
ranges: hazard.ranges.map(range => range as number), ranges: hazard.ranges.map(range => range as number),
level: hazard.level || 0, level: hazard.level || 0,
tip: hazard.tip || '',
}]) }])
} }
}) })

View File

@ -132,8 +132,27 @@ onUnmounted(() => {
:style="getHazardStyle(hazard.start, hazard.end)" :style="getHazardStyle(hazard.start, hazard.end)"
@click="handleHazardClick(hazard.id)" @click="handleHazardClick(hazard.id)"
> >
<el-tooltip :content="hazard.tip" placement="top">
<div style="width: 100%; height: 100%; display: flex; align-items: center; justify-content: center;">
{{ parseInt(hazard.id) + 1 }} {{ parseInt(hazard.id) + 1 }}
</div> </div>
</el-tooltip>
</div>
<!-- <div
v-for="hazard in row"
:key="hazard.id"
>
<el-tooltip :content="hazard.tip" placement="top">
<div
class="hazard-block"
:class="{ primary: hazard.level === 0, danger: hazard.level === 1 }"
:style="getHazardStyle(hazard.start, hazard.end)"
@click="handleHazardClick(hazard.id)"
>
{{ parseInt(hazard.id) + 1 }}
</div>
</el-tooltip>
</div> -->
</div> </div>
</div> </div>
</ElScrollbar> </ElScrollbar>

View File

@ -6,6 +6,7 @@ import { useRouter } from 'vue-router'
interface HazardItem { interface HazardItem {
隐患编号: string 隐患编号: string
物体编号: string
物体类型: string 物体类型: string
隐患名称: string 隐患名称: string
隐患等级: string 隐患等级: string
@ -19,7 +20,7 @@ interface HazardItem {
interface DataFormat { interface DataFormat {
隐患列表: [number, string, string][] 隐患列表: [number, string, string][]
隐患范围字典: Record<string, { ranges: number[], level: number }> 隐患范围字典: Record<string, { ranges: number[], level: number, tip: string }>
隐患数据: HazardItem[] 隐患数据: HazardItem[]
} }
@ -141,9 +142,14 @@ function getData() {
data.value.隐患范围字典 = {} data.value.隐患范围字典 = {}
;(objects || []).forEach((obj: any) => { ;(objects || []).forEach((obj: any) => {
const 编号 = String(obj.hazard_track_id) const 编号 = String(obj.hazard_track_id)
if (!data.value.隐患范围字典[编号]) if (!data.value.隐患范围字典[编号]) {
data.value.隐患范围字典[编号] = { ranges: [], level: obj.level } data.value.隐患范围字典[编号] = {
data.value.隐患范围字典[编号].ranges = [obj.start_frame, obj.end_frame] ranges: [obj.start_frame, obj.end_frame],
level: obj.level,
tip: `${tag?.[obj.tag_id] || ''}`, //
// tip: `(${resultData.value.class_list?.[obj.class_id] || ''}) ${tag?.[obj.tag_id] || ''}`,
}
}
}) })
// data.value. = (objects || []).map((_: any, i: number) => `${i + 1}`) // data.value. = (objects || []).map((_: any, i: number) => `${i + 1}`)
@ -155,6 +161,7 @@ function getData() {
return { return {
隐患编号: obj.hazard_track_id || '', 隐患编号: obj.hazard_track_id || '',
物体编号: obj.track_id || '',
物体类型: resultData.value.class_list?.[obj.class_id] || '', 物体类型: resultData.value.class_list?.[obj.class_id] || '',
隐患名称: tag?.[obj.tag_id] || '', 隐患名称: tag?.[obj.tag_id] || '',
隐患等级: obj.level === 0 ? '一般隐患' : '重大隐患', 隐患等级: obj.level === 0 ? '一般隐患' : '重大隐患',
@ -203,11 +210,12 @@ function handleJumpToTimePoint(index: number) {
// transform: // transform:
const hazardFields = [ const hazardFields = [
{ label: '隐患编号', key: '隐患编号', group: 1, transform: (val: any) => val !== undefined ? val + 1 : '无' }, { label: '隐患编号', key: '隐患编号', group: 1, transform: (val: any) => val !== undefined ? val + 1 : '无' },
{ label: '物体编号', key: '物体编号', group: 1 },
{ label: '物体类型', key: '物体类型', group: 1 }, { label: '物体类型', key: '物体类型', group: 1 },
{ label: '隐患等级', key: '隐患等级', group: 2 }, { label: '隐患等级', key: '隐患等级', group: 2 },
{ label: '置信度', key: '置信度', group: 2 }, { label: '置信度', key: '置信度', group: 2 },
{ label: '时间点', key: '时间点', group: 2 },
{ label: '隐患名称', key: '隐患名称', group: 3 }, { label: '隐患名称', key: '隐患名称', group: 3 },
{ label: '时间点', key: '时间点', group: 3 },
{ label: '隐患描述', key: '隐患描述', group: 4 }, { label: '隐患描述', key: '隐患描述', group: 4 },
{ label: '依据', key: '依据', group: 5 }, { label: '依据', key: '依据', group: 5 },
{ label: '整改建议', key: '整改建议', group: 6 }, { label: '整改建议', key: '整改建议', group: 6 },
@ -283,7 +291,7 @@ onMounted(() => {
track_id: '18', track_id: '18',
hazard_track_id: 0, hazard_track_id: 0,
class_id: 0, class_id: 0,
conf: 1, conf: 0,
level: 0, level: 0,
start_frame: 551, start_frame: 551,
end_frame: 581, end_frame: 581,
@ -446,7 +454,7 @@ onMounted(() => {
style="height: 100%;" style="height: 100%;"
:current-frame="currentFrame" :current-frame="currentFrame"
:total-frames="totalFrames" :total-frames="totalFrames"
:hazard-ranges="data.隐患范围字典 as Record<string, { ranges: number[]; level: number; }>" :hazard-ranges="data.隐患范围字典 as Record<string, { ranges: number[]; level: number; tip: string }>"
@hazard-click="(id: number) => handleTimelineHazardClick(String(id))" @hazard-click="(id: number) => handleTimelineHazardClick(String(id))"
@frame-change="handleFrameChange" @frame-change="handleFrameChange"
/> />
@ -465,7 +473,13 @@ onMounted(() => {
</el-text> </el-text>
</el-row> </el-row>
<el-row class="result-content"> <el-row class="result-content">
<el-text> <el-text v-if="field.key === '隐患等级' && getFieldValue(field) === '重大隐患'" type="danger">
{{ getFieldValue(field) }}
</el-text>
<el-text v-else-if="field.key === '置信度' && getFieldValue(field) === '疑似'" type="warning">
{{ getFieldValue(field) }}
</el-text>
<el-text v-else>
{{ getFieldValue(field) }} {{ getFieldValue(field) }}
</el-text> </el-text>
</el-row> </el-row>