特性点顺序问题
This commit is contained in:
@@ -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, '特性点')
|
||||||
|
|||||||
Reference in New Issue
Block a user