feat: introduce ReportLogViewer page for displaying analysis reports and execution logs with detailed views and comparison functionality.

This commit is contained in:
sladro 2026-03-03 19:12:17 +08:00
parent a60f841462
commit 4762e2f39a

View File

@ -125,9 +125,12 @@
<div class="comparison-view">
<div class="comparison-mode-switch">
<el-radio-group v-model="comparisonMode" size="small">
<el-radio-button label="live">实时穿透 (当前模型流程)</el-radio-button>
<el-radio-button label="live" :disabled="cadStore.currentCAD?.id === 'creo'" :title="cadStore.currentCAD?.id === 'creo' ? 'Creo模式下不支持实时穿透对比' : ''">实时穿透 (当前模型流程)</el-radio-button>
<el-radio-button label="manual">离线文件 (当前模型 vs 离线文件)</el-radio-button>
</el-radio-group>
<div v-if="cadStore.currentCAD?.id === 'creo'" style="margin-top: 10px; font-size: 13px; color: #e6a23c;">
<i class="fas fa-info-circle"></i> 此对比为离线模式对比Creo 支持将当前模型参数提取并与导出的轻量化离线文件.prt进行参数验证与记录
</div>
</div>
<!-- 实时模式内容 -->
@ -218,10 +221,16 @@
<div v-else class="captured-data card-panel">
<h4><i class="fas fa-cube text-info"></i> 基准原始模型</h4>
<ul class="data-list">
<li><span class="lbl">模型文件:</span> <span class="val">{{ cadStore.manualComparisonState.baselineData?.name }}</span></li>
<li><span class="lbl">内存占用:</span> <span class="val">{{ cadStore.manualComparisonState.baselineData?.mem }}</span></li>
<li><span class="lbl">面片数量:</span> <span class="val">{{ cadStore.manualComparisonState.baselineData?.poly }}</span></li>
<li><span class="lbl">特征数量:</span> <span class="val">{{ cadStore.manualComparisonState.baselineData?.features }}</span></li>
<li><span class="lbl">模型文件:</span> <span class="val" :title="cadStore.manualComparisonState.baselineData?.name">{{ cadStore.manualComparisonState.baselineData?.name }}</span></li>
<li><span class="lbl">文件大小/内存:</span> <span class="val">{{ cadStore.manualComparisonState.baselineData?.mem }}</span></li>
<li><span class="lbl">总体复杂度(特征数):</span> <span class="val text-primary" style="font-weight: bold;">{{ cadStore.manualComparisonState.baselineData?.features }}</span></li>
<!-- 具体组成结构拆解 -->
<template v-if="cadStore.manualComparisonState.baselineData?.details">
<li v-for="(val, key) in cadStore.manualComparisonState.baselineData.details" :key="key" style="padding-left: 20px;">
<span class="lbl" style="font-size: 12px; color: #888;"> {{ key }}:</span>
<span class="val" style="font-size: 12px; color: #888;">{{ val }} </span>
</li>
</template>
</ul>
</div>
</div>
@ -250,19 +259,29 @@
<div class="comp-col source-col">
<h4><i class="fas fa-cube"></i> 基准状态</h4>
<ul class="prop-list">
<li><span class="prop-label">内存占用</span> <span class="prop-value">{{ cadStore.manualComparisonState.baselineData?.mem }}</span></li>
<li><span class="prop-label">面片数量</span> <span class="prop-value">{{ cadStore.manualComparisonState.baselineData?.poly }}</span></li>
<li><span class="prop-label">特征总数</span> <span class="prop-value">{{ cadStore.manualComparisonState.baselineData?.features }}</span></li>
<li><span class="prop-label">文件大小/内存</span> <span class="prop-value">{{ cadStore.manualComparisonState.baselineData?.mem }}</span></li>
<li><span class="prop-label">特征及组件总数</span> <span class="prop-value">{{ cadStore.manualComparisonState.baselineData?.features }}</span></li>
<template v-if="cadStore.manualComparisonState.baselineData?.details">
<li v-for="(val, key) in cadStore.manualComparisonState.baselineData.details" :key="key">
<span class="prop-label text-muted" style="padding-left: 10px; font-size: 12px;"> {{ key }}</span>
<span class="prop-value text-muted" style="font-size: 12px;">{{ val }}</span>
</li>
</template>
</ul>
</div>
<div class="vs-divider">VS</div>
<div class="comp-col target-col">
<h4><i class="fas fa-leaf text-success"></i> 离线文件读取状态</h4>
<ul class="prop-list">
<li><span class="prop-label">文件名称</span> <span class="prop-value text-success">{{ cadStore.manualComparisonState.resultData?.name }}</span></li>
<li><span class="prop-label">内存占用</span> <span class="prop-value text-success">{{ cadStore.manualComparisonState.resultData?.mem }}</span></li>
<li><span class="prop-label">面片数量</span> <span class="prop-value text-success">{{ cadStore.manualComparisonState.resultData?.poly }}</span></li>
<li><span class="prop-label">特征总数</span> <span class="prop-value text-success">{{ cadStore.manualComparisonState.resultData?.features }}</span></li>
<li><span class="prop-label">文件名称</span> <span class="prop-value text-success" :title="cadStore.manualComparisonState.resultData?.name">{{ cadStore.manualComparisonState.resultData?.name }}</span></li>
<li><span class="prop-label">文件大小/内存</span> <span class="prop-value text-success">{{ cadStore.manualComparisonState.resultData?.mem }}</span></li>
<li><span class="prop-label">特征及组件总数</span> <span class="prop-value text-success" style="font-weight: bold;">{{ cadStore.manualComparisonState.resultData?.features }}</span></li>
<template v-if="cadStore.manualComparisonState.resultData?.details">
<li v-for="(val, key) in cadStore.manualComparisonState.resultData.details" :key="key">
<span class="prop-label text-muted" style="padding-left: 10px; font-size: 12px;"> {{ key }}</span>
<span class="prop-value text-muted" style="font-size: 12px;">{{ val }}</span>
</li>
</template>
</ul>
</div>
</div>
@ -291,7 +310,7 @@
</template>
<script setup>
import { ref, computed, onMounted, onUnmounted } from 'vue'
import { ref, computed, onMounted, onUnmounted, watch } from 'vue'
import { ElMessage } from 'element-plus'
import { useCADStore } from '@/stores/cad'
import creoApi from '@/services/creoApi'
@ -310,6 +329,12 @@ const isCapturingManualResult = ref(false)
const cadStore = useCADStore()
watch(() => cadStore.currentCAD, (newCAD) => {
if (newCAD && newCAD.id === 'creo') {
comparisonMode.value = 'manual'
}
}, { immediate: true })
const captureBaseline = async () => {
const connectedCAD = cadStore.currentCAD
if (!connectedCAD) {
@ -480,8 +505,12 @@ const captureManualBaseline = async () => {
const statResult = await creoApi.getHierarchyStatistics()
if (statResult.success && statResult.data?.data?.statistics) {
let totalFeatures = 0
Object.values(statResult.data.data.statistics).forEach(v => totalFeatures += v)
if(totalFeatures > 0) stats.features = `${totalFeatures} +`
const detailsObj = statResult.data.data.statistics
Object.values(detailsObj).forEach(v => totalFeatures += v)
if(totalFeatures > 0) {
stats.features = `${totalFeatures}`
stats.details = detailsObj
}
}
} catch(e) { }
} else if (connectedCAD.id === 'revit') {
@ -514,7 +543,8 @@ const captureManualBaseline = async () => {
name: fileName,
mem: stats.mem,
poly: stats.poly,
features: stats.features
features: stats.features,
details: stats.details || null
}
cadStore.manualComparisonState.step = 2
ElMessage.success('基准状态参数读取成功')
@ -567,8 +597,12 @@ const captureManualResult = async () => {
const statResult = await creoApi.getHierarchyStatistics()
if (statResult.success && statResult.data?.data?.statistics) {
let totalFeatures = 0
Object.values(statResult.data.data.statistics).forEach(v => totalFeatures += v)
if(totalFeatures > 0) stats.features = `${totalFeatures} +`
const detailsObj = statResult.data.data.statistics
Object.values(detailsObj).forEach(v => totalFeatures += v)
if(totalFeatures > 0) {
stats.features = `${totalFeatures}`
stats.details = detailsObj
}
}
} catch(e) { }
}
@ -595,7 +629,8 @@ const captureManualResult = async () => {
name: fileName,
mem: stats.mem,
poly: stats.poly,
features: stats.features
features: stats.features,
details: stats.details || null
}
cadStore.manualComparisonState.step = 3
ElMessage.success('离线模型已成功打开并读取参数')