特性点顺序问题

This commit is contained in:
caozehui
2026-05-07 19:18:05 +08:00
parent 3f6952612d
commit 121829a4bd

View File

@@ -50,11 +50,20 @@ interface ChartPoint {
status: ChartPointStatus status: ChartPointStatus
} }
interface CharacteristicCurvePoint {
duration: number
residualVoltage: number
time: string | null
timeMs: number | null
}
interface NormalizedTolerantPoint { interface NormalizedTolerantPoint {
duration: number duration: number
residualVoltage: number residualVoltage: number
tolerant: number | null tolerant: number | null
status: ChartPointStatus status: ChartPointStatus
time: string | null
timeMs: number | null
} }
const props = defineProps<{ const props = defineProps<{
@@ -72,8 +81,8 @@ const STATUS_COLOR_MAP: Record<ChartPointStatus, string> = {
const CHARACTERISTIC_POINT_COLOR = '#ff4d4f' const CHARACTERISTIC_POINT_COLOR = '#ff4d4f'
const chartPoints = ref<ChartPoint[]>([]) const chartPoints = ref<ChartPoint[]>([])
const characteristicCurveData = ref<Array<[number, number]>>([]) const characteristicCurveData = ref<CharacteristicCurvePoint[]>([])
const drawnCharacteristicCurveData = ref<Array<[number, number]>>([]) const drawnCharacteristicCurveData = ref<CharacteristicCurvePoint[]>([])
const characteristicCurveVisible = ref(false) const characteristicCurveVisible = ref(false)
const chartRef = ref<any>(null) const chartRef = ref<any>(null)
@@ -117,21 +126,45 @@ const sortedChartPoints = computed(() => {
const sortedCharacteristicCurveData = computed(() => { const sortedCharacteristicCurveData = computed(() => {
return [...characteristicCurveData.value].sort((a, b) => { return [...characteristicCurveData.value].sort((a, b) => {
if (a[0] !== b[0]) { if (a.timeMs !== null && b.timeMs !== null && a.timeMs !== b.timeMs) {
return a[0] - b[0] return a.timeMs - b.timeMs
} }
return a[1] - b[1] if (a.timeMs !== null && b.timeMs === null) {
return -1
}
if (a.timeMs === null && b.timeMs !== null) {
return 1
}
if (a.duration !== b.duration) {
return a.duration - b.duration
}
return a.residualVoltage - b.residualVoltage
}) })
}) })
const sortedDrawnCharacteristicCurveData = computed(() => { const sortedDrawnCharacteristicCurveData = computed(() => {
return [...drawnCharacteristicCurveData.value].sort((a, b) => { return [...drawnCharacteristicCurveData.value].sort((a, b) => {
if (a[0] !== b[0]) { if (a.timeMs !== null && b.timeMs !== null && a.timeMs !== b.timeMs) {
return a[0] - b[0] return a.timeMs - b.timeMs
} }
return a[1] - b[1] if (a.timeMs !== null && b.timeMs === null) {
return -1
}
if (a.timeMs === null && b.timeMs !== null) {
return 1
}
if (a.duration !== b.duration) {
return a.duration - b.duration
}
return a.residualVoltage - b.residualVoltage
}) })
}) })
@@ -141,12 +174,12 @@ const solidCharacteristicCurveSeriesData = computed(() => {
} }
const curveSource = props.autoDrawCurve ? sortedCharacteristicCurveData.value : sortedDrawnCharacteristicCurveData.value const curveSource = props.autoDrawCurve ? sortedCharacteristicCurveData.value : sortedDrawnCharacteristicCurveData.value
return curveSource.map(item => [item[0], item[1], '特性曲线']) return curveSource.map(item => [item.duration, item.residualVoltage, '特性曲线'])
}) })
const characteristicCurvePointSeriesData = computed(() => { const characteristicCurvePointSeriesData = computed(() => {
return sortedCharacteristicCurveData.value.map(item => ({ return sortedCharacteristicCurveData.value.map(item => ({
value: [item[0], item[1], '特性点'] value: [item.duration, item.residualVoltage, '特性点']
})) }))
}) })
@@ -206,6 +239,58 @@ const toNumber = (value: unknown) => {
return Number.isFinite(result) ? result : null return Number.isFinite(result) ? result : null
} }
const parsePointTime = (value: unknown) => {
if (typeof value !== 'string') {
return {
time: null,
timeMs: null
}
}
const normalizedValue = value.trim()
const match = normalizedValue.match(
/^(\d{4})-(\d{2})-(\d{2})\s+(\d{2}):(\d{2}):(\d{2})\.(\d{3})$/
)
if (!match) {
return {
time: normalizedValue || null,
timeMs: null
}
}
const [, year, month, day, hour, minute, second, millisecond] = match
const parsedDate = new Date(
Number(year),
Number(month) - 1,
Number(day),
Number(hour),
Number(minute),
Number(second),
Number(millisecond)
)
if (
parsedDate.getFullYear() !== Number(year) ||
parsedDate.getMonth() !== Number(month) - 1 ||
parsedDate.getDate() !== Number(day) ||
parsedDate.getHours() !== Number(hour) ||
parsedDate.getMinutes() !== Number(minute) ||
parsedDate.getSeconds() !== Number(second) ||
parsedDate.getMilliseconds() !== Number(millisecond)
) {
return {
time: normalizedValue,
timeMs: null
}
}
return {
time: normalizedValue,
timeMs: parsedDate.getTime()
}
}
const normalizeTolerantValue = (value: unknown) => { const normalizeTolerantValue = (value: unknown) => {
if (value === undefined || value === null || value === '') { if (value === undefined || value === null || value === '') {
return null return null
@@ -251,6 +336,7 @@ const normalizeStatus = (value: unknown): ChartPointStatus => {
const normalizeTolerantPoint = (source: Record<string, any>): NormalizedTolerantPoint | null => { const normalizeTolerantPoint = (source: Record<string, any>): NormalizedTolerantPoint | null => {
const duration = normalizeDuration(source) const duration = normalizeDuration(source)
const residualVoltage = normalizeResidualVoltageValue(source) const residualVoltage = normalizeResidualVoltageValue(source)
const { time, timeMs } = parsePointTime(source.time)
if (duration === null || residualVoltage === null) { if (duration === null || residualVoltage === null) {
return null return null
@@ -276,6 +362,8 @@ const normalizeTolerantPoint = (source: Record<string, any>): NormalizedTolerant
duration, duration,
residualVoltage, residualVoltage,
tolerant, tolerant,
time,
timeMs,
status: status:
tolerant === 0 tolerant === 0
? 'fail' ? 'fail'
@@ -313,7 +401,7 @@ const normalizePoint = (source: Record<string, any>): ChartPoint | null => {
} }
const extractCharacteristicCurvePoints = (payload: any) => { const extractCharacteristicCurvePoints = (payload: any) => {
const result: Array<[number, number]> = [] const result: CharacteristicCurvePoint[] = []
const seen = new Set<string>() const seen = new Set<string>()
const rootPayload = payload?.data && typeof payload.data === 'object' ? payload.data : payload const rootPayload = payload?.data && typeof payload.data === 'object' ? payload.data : payload
@@ -333,10 +421,15 @@ const extractCharacteristicCurvePoints = (payload: any) => {
const point = normalizeTolerantPoint(node) const point = normalizeTolerantPoint(node)
if (point?.tolerant === 2) { if (point?.tolerant === 2) {
const key = `${point.duration}|${point.residualVoltage}` const key = point.time ? `${point.time}|${point.duration}|${point.residualVoltage}` : `${point.duration}|${point.residualVoltage}`
if (!seen.has(key)) { if (!seen.has(key)) {
seen.add(key) seen.add(key)
result.push([point.duration, point.residualVoltage]) result.push({
duration: point.duration,
residualVoltage: point.residualVoltage,
time: point.time,
timeMs: point.timeMs
})
} }
} }
@@ -351,17 +444,21 @@ const extractCharacteristicCurvePoints = (payload: any) => {
return result return result
} }
const mergeCharacteristicCurvePoints = (points: Array<[number, number]>) => { const mergeCharacteristicCurvePoints = (points: CharacteristicCurvePoint[]) => {
if (!points.length) { if (!points.length) {
return return
} }
const existingPointMap = new Map( const existingPointMap = new Map(
characteristicCurveData.value.map(item => [`${item[0]}|${item[1]}`, item] as const) characteristicCurveData.value.map(item => [
item.time ? `${item.time}|${item.duration}|${item.residualVoltage}` : `${item.duration}|${item.residualVoltage}`,
item
] as const)
) )
points.forEach(item => { points.forEach(item => {
existingPointMap.set(`${item[0]}|${item[1]}`, item) const key = item.time ? `${item.time}|${item.duration}|${item.residualVoltage}` : `${item.duration}|${item.residualVoltage}`
existingPointMap.set(key, item)
}) })
characteristicCurveData.value = Array.from(existingPointMap.values()) characteristicCurveData.value = Array.from(existingPointMap.values())
@@ -472,8 +569,9 @@ const exportChartData = () => {
const curveSheet = XLSX.utils.json_to_sheet( const curveSheet = XLSX.utils.json_to_sheet(
sortedCharacteristicCurveData.value.map((item, index) => ({ sortedCharacteristicCurveData.value.map((item, index) => ({
序号: index + 1, 序号: index + 1,
持续时间_s: item[0], 持续时间_s: item.duration,
残余电压_pct: item[1] 残余电压_pct: item.residualVoltage,
时间: item.time ?? ''
})) }))
) )
XLSX.utils.book_append_sheet(workbook, curveSheet, '特性点') XLSX.utils.book_append_sheet(workbook, curveSheet, '特性点')