Browse Source

refactor(model): 重构评估报告数据结构

- 将 assessRows 重命名为 assess 以提高语义清晰度
- 更新所有引用 assessRows 的地方为 assess
- 优化图表 tooltip 显示格式
- 修复评估数据处理逻辑中的潜在问题
- 确保评估报告数据一致性
- 改进评估结果展示方式
pull/78/head
chenjiale 1 month ago
parent
commit
5173309241
  1. 38
      src/views/model/AssessReport.vue
  2. 11
      src/views/model/train/index.vue

38
src/views/model/AssessReport.vue

@ -95,7 +95,7 @@ export default defineComponent({
const baseInfo = ref<Record<string, any>>({}) const baseInfo = ref<Record<string, any>>({})
const modeRows = ref<ModeRow[]>([]) const modeRows = ref<ModeRow[]>([])
const pointRows = ref<AssessPointRow[]>([]) const pointRows = ref<AssessPointRow[]>([])
const assessRows = ref<AssessRow[]>([]) const assess = ref<AssessRow[]>([])
const assessResult = ref<AssessResultRow[]>(defaultAssessResult()) const assessResult = ref<AssessResultRow[]>(defaultAssessResult())
const cleanSummary = ref<AssessCleanSummary>() const cleanSummary = ref<AssessCleanSummary>()
const cleanModalVisible = ref(false) const cleanModalVisible = ref(false)
@ -308,7 +308,7 @@ export default defineComponent({
modelName.value = detail.modelName modelName.value = detail.modelName
modeRows.value = detail.report.modeRows || [] modeRows.value = detail.report.modeRows || []
pointRows.value = (detail.report.pointRows || []).map((item, index) => normalizePointRow(item, index)) pointRows.value = (detail.report.pointRows || []).map((item, index) => normalizePointRow(item, index))
assessRows.value = (detail.report.assessRows || []).map((item, index) => hydrateAssessRow(item, index)) assess.value = (detail.report.assess || []).map((item, index) => hydrateAssessRow(item, index))
assessResult.value = detail.report.assessResult || defaultAssessResult() assessResult.value = detail.report.assessResult || defaultAssessResult()
identifier.value = detail.report.identifier || identifier.value identifier.value = detail.report.identifier || identifier.value
timestamp.value = detail.report.time || '' timestamp.value = detail.report.time || ''
@ -327,7 +327,7 @@ export default defineComponent({
{ name: '样本类型', content: '训练样本' }, { name: '样本类型', content: '训练样本' },
{ name: '样本数量', content: sampleCount ?? '--' }, { name: '样本数量', content: sampleCount ?? '--' },
] ]
assessRows.value assess.value
= pointRows.value = pointRows.value
.filter(item => item.alarm) .filter(item => item.alarm)
.map((item, index) => buildAssessRow({ ...item, index })) || [] .map((item, index) => buildAssessRow({ ...item, index })) || []
@ -354,13 +354,13 @@ export default defineComponent({
const toggleAlarm = (row: AssessPointRow, checked: boolean) => { const toggleAlarm = (row: AssessPointRow, checked: boolean) => {
row.alarm = checked row.alarm = checked
assessRows.value = assessRows.value.filter(item => item.pointId !== row.pointId) assess.value = assess.value.filter(item => item.pointId !== row.pointId)
if (checked) if (checked)
assessRows.value.push(buildAssessRow(row)) assess.value.push(buildAssessRow(row))
} }
const applyRound = () => { const applyRound = () => {
assessRows.value = assessRows.value.map(item => ({ assess.value = assess.value.map(item => ({
...item, ...item,
amplitude: Math.round(Number(item.amplitude) || 0), amplitude: Math.round(Number(item.amplitude) || 0),
})) }))
@ -369,7 +369,7 @@ export default defineComponent({
const applyAbsoluteBias = () => { const applyAbsoluteBias = () => {
if (biasForm.absolute === undefined) if (biasForm.absolute === undefined)
return return
assessRows.value = assessRows.value.map(item => ({ assess.value = assess.value.map(item => ({
...item, ...item,
amplitude: biasForm.absolute, amplitude: biasForm.absolute,
})) }))
@ -378,14 +378,14 @@ export default defineComponent({
const applyRelativeBias = () => { const applyRelativeBias = () => {
if (biasForm.relative === undefined) if (biasForm.relative === undefined)
return return
assessRows.value = assessRows.value.map(item => ({ assess.value = assess.value.map(item => ({
...item, ...item,
amplitude: Number((Number(item.amplitude || 0) + biasForm.relative!).toFixed(2)), amplitude: Number((Number(item.amplitude || 0) + biasForm.relative!).toFixed(2)),
})) }))
} }
const applyPercentBias = () => { const applyPercentBias = () => {
assessRows.value = assessRows.value.map((item) => { assess.value = assess.value.map((item) => {
const point = pointRows.value.find(p => p.pointId === item.pointId) const point = pointRows.value.find(p => p.pointId === item.pointId)
const delta = point ? Number(point.TMax || point.tMax || 0) - Number(point.TMin || point.tMin || 0) : 0 const delta = point ? Number(point.TMax || point.tMax || 0) - Number(point.TMin || point.tMin || 0) : 0
const amplitude = Number(((biasForm.percent / 100) * delta).toFixed(2)) const amplitude = Number(((biasForm.percent / 100) * delta).toFixed(2))
@ -413,7 +413,7 @@ export default defineComponent({
let backward = 0 let backward = 0
let forwardBase = 0 let forwardBase = 0
let backwardBase = 0 let backwardBase = 0
assessRows.value.forEach((item) => { assess.value.forEach((item) => {
if (!item.fdr || !item.far) if (!item.fdr || !item.far)
return return
const fdr = item.fdr.split('/') const fdr = item.fdr.split('/')
@ -430,7 +430,7 @@ export default defineComponent({
const forwardScore = forwardBase ? (forward / forwardBase) * 100 : 0 const forwardScore = forwardBase ? (forward / forwardBase) * 100 : 0
const backwardScore = backwardBase ? (backward / backwardBase) * 100 : 0 const backwardScore = backwardBase ? (backward / backwardBase) * 100 : 0
const avg = (forwardScore + backwardScore) / 2 const avg = (forwardScore + backwardScore) / 2
const beta = 1 / (1 + Math.exp(-((assessRows.value.length / 100) ** 2))) - 0.5 const beta = 1 / (1 + Math.exp(-((assess.value.length / 100) ** 2))) - 0.5
const finalScore = Number((avg + (100 - avg) * beta * 2).toFixed(2)) const finalScore = Number((avg + (100 - avg) * beta * 2).toFixed(2))
const bottom = bottomScore.value ?? 0 const bottom = bottomScore.value ?? 0
return { return {
@ -467,7 +467,7 @@ export default defineComponent({
uplow.push(`${p.Lower ?? p.lower ?? null},${p.Upper ?? p.upper ?? null}`) uplow.push(`${p.Lower ?? p.lower ?? null},${p.Upper ?? p.upper ?? null}`)
}) })
const selected = row ? [row] : assessRows.value const selected = row ? [row] : assess.value
selected.forEach((item) => { selected.forEach((item) => {
const idx = item.index ?? points.findIndex(p => p.pointId === item.pointId) const idx = item.index ?? points.findIndex(p => p.pointId === item.pointId)
if (idx >= 0) if (idx >= 0)
@ -515,7 +515,7 @@ export default defineComponent({
} }
const handleEvaluate = async (row?: AssessRow) => { const handleEvaluate = async (row?: AssessRow) => {
if (!assessRows.value.length) { if (!assess.value.length) {
createMessage.warning('请先选择参与预警的参数') createMessage.warning('请先选择参与预警的参数')
return return
} }
@ -531,7 +531,7 @@ export default defineComponent({
const payload = { const payload = {
modelId: modelId.value as string, modelId: modelId.value as string,
version: formModel.version, version: formModel.version,
assessRows: row ? [row] : assessRows.value, assess: row ? [row] : assess.value,
pointRows: pointRows.value, pointRows: pointRows.value,
timeRange: formModel.timeRange timeRange: formModel.timeRange
? formModel.timeRange.map(t => dayjs(t).format('YYYY-MM-DD HH:mm:ss')) ? formModel.timeRange.map(t => dayjs(t).format('YYYY-MM-DD HH:mm:ss'))
@ -544,7 +544,7 @@ export default defineComponent({
const res = await evaluateAssess(payload) const res = await evaluateAssess(payload)
if (res?.points) { if (res?.points) {
res.points.forEach((result) => { res.points.forEach((result) => {
assessRows.value = assessRows.value.map((item) => { assess.value = assess.value.map((item) => {
const match = item.pointId === result.pointId || item.index === result.index const match = item.pointId === result.pointId || item.index === result.index
if (!match) if (!match)
return item return item
@ -583,7 +583,7 @@ export default defineComponent({
createMessage.warning('验证人不能为空') createMessage.warning('验证人不能为空')
return return
} }
if (!assessRows.value.length) { if (!assess.value.length) {
createMessage.warning('请至少保留一个参与预警的参数') createMessage.warning('请至少保留一个参与预警的参数')
return return
} }
@ -600,7 +600,7 @@ export default defineComponent({
report: { report: {
pointRows: pointRows.value, pointRows: pointRows.value,
modeRows: modeRows.value, modeRows: modeRows.value,
assessRows: assessRows.value, assess: assess.value,
assessResult: assessResult.value, assessResult: assessResult.value,
identifier: identifier.value, identifier: identifier.value,
time: timestamp.value || dayjs().format('YYYY-MM-DD HH:mm:ss'), time: timestamp.value || dayjs().format('YYYY-MM-DD HH:mm:ss'),
@ -695,7 +695,7 @@ export default defineComponent({
return { return {
assessColumns, assessColumns,
assessResult, assessResult,
assessRows, assess,
applyAbsoluteBias, applyAbsoluteBias,
applyPercentBias, applyPercentBias,
applyRelativeBias, applyRelativeBias,
@ -780,7 +780,7 @@ export default defineComponent({
</div> </div>
</div> </div>
<a-table <a-table
:columns="assessColumns" :data-source="assessRows" row-key="pointId" size="small" bordered :columns="assessColumns" :data-source="assess" row-key="pointId" size="small" bordered
:pagination="{ pageSize: 10 }" align="center" :pagination="{ pageSize: 10 }" align="center"
/> />
</a-card> </a-card>

11
src/views/model/train/index.vue

@ -310,6 +310,17 @@ export default defineComponent({
const color = ['blue', '#ff6f00', 'red'] const color = ['blue', '#ff6f00', 'red']
const yIndex = [0, 0, 1] const yIndex = [0, 0, 1]
const option = { const option = {
tooltip: {
trigger: 'axis',
confine: true,
formatter(params: any) {
if (!Array.isArray(params) || !params.length)
return ''
const time = dayjs(params[0].value?.[0]).format('YYYY-MM-DD HH:mm:ss')
const lines = params.map((p: any) => `${p.marker}${p.seriesName || name[p.seriesIndex] || ''}${p.value?.[1] ?? '-'}`)
return [`时间:${time}`, ...lines].join('<br/>')
},
},
xAxis: { xAxis: {
type: 'time', type: 'time',
axisLabel: { axisLabel: {

Loading…
Cancel
Save