// 辅助函数 const getMax = (temp, tempA, tempB, tempC) => { temp = temp > tempA ? temp : tempA temp = temp > tempB ? temp : tempB if (tempC !== undefined) { temp = temp > tempC ? temp : tempC } return temp } const getMaxTwo = (temp, tempA, tempB) => { temp = temp > tempA ? temp : tempA temp = temp > tempB ? temp : tempB return temp } const getMin = (temp, tempA, tempB, tempC) => { temp = temp < tempA ? temp : tempA temp = temp < tempB ? temp : tempB if (tempC !== undefined) { temp = temp < tempC ? temp : tempC } return temp } const getMinOpen = (temp, tempA, tempB) => { temp = temp < tempA ? temp : tempA temp = temp < tempB ? temp : tempB return temp } // 数据处理函数 const fliteWaveData = (wp, step, iphasicValue, isOpen) => { const rmsData = wp.listRmsData const pt = Number(wp.pt) / 1000 const ct = Number(wp.ct) const titleList = wp.waveTitle let xishu = pt let aTitle = '', bTitle = '', cTitle = '', unit = '电压' let rmsvFirstX = 0, rmsvFirstY = 0, rmsvSecondX = 0, rmsvSecondY = 0, firstZhou = 'a', secondeZhou = 'a' let ifmax = 0, ifmin = 0, ismax = 0, ismin = 0, rfmax = 0, rfmin = 0, rsmax = 0, rsmin = 0 const shunshiFA = [] const shunshiFB = [] const shunshiFC = [] const shunshiSA = [] const shunshiSB = [] const shunshiSC = [] const rmsFA = [] const rmsFB = [] const rmsFC = [] const rmsSA = [] const rmsSB = [] const rmsSC = [] if (titleList[iphasicValue * step + 1]?.substring(0, 1) !== 'U') { xishu = ct unit = '电流' } for (let i = 1; i <= iphasicValue; i++) { switch (i) { case 1: aTitle = titleList[iphasicValue * step + i]?.substring(1) || '' break case 2: bTitle = titleList[iphasicValue * step + i]?.substring(1) || '' break case 3: cTitle = titleList[iphasicValue * step + i]?.substring(1) || '' break } } if (rmsData[0] && rmsData[0][iphasicValue * step + 1] !== undefined) { rfmax = rmsData[0][iphasicValue * step + 1] * xishu rfmin = rmsData[0][iphasicValue * step + 1] * xishu rmsvFirstY = rmsData[0][iphasicValue * step + 1] * xishu rmsvFirstX = rmsData[0][0] rsmax = rmsData[0][iphasicValue * step + 1] rsmin = rmsData[0][iphasicValue * step + 1] rmsvSecondY = rmsData[0][iphasicValue * step + 1] rmsvSecondX = rmsData[0][0] } for (let rms = 0; rms < rmsData.length; rms++) { if (!rmsData[rms] || rmsData[rms][iphasicValue * step + 1] === undefined) { break } switch (iphasicValue) { case 1: const rmsFirstA = rmsData[rms][iphasicValue * step + 1] * xishu rmsFA.push([rmsData[rms][0], rmsFirstA]) rfmax = rfmax > rmsFirstA ? rfmax : rmsFirstA rfmin = rfmin < rmsFirstA ? rfmin : rmsFirstA if (rfmin < rmsvFirstY) { rmsvFirstY = rfmin firstZhou = 'a' rmsvFirstX = rmsData[rms][0] } const rmsSecondA = rmsData[rms][iphasicValue * step + 1] rmsSA.push([rmsData[rms][0], rmsSecondA]) rsmax = rsmax > rmsSecondA ? rsmax : rmsSecondA rsmin = rsmin < rmsSecondA ? rsmin : rmsSecondA if (rsmin < rmsvSecondY) { rmsvSecondY = rsmin secondeZhou = 'a' rmsvSecondX = rmsData[rms][0] } break case 2: const rmsFirstA2 = rmsData[rms][iphasicValue * step + 1] * xishu const rmsFirstB2 = rmsData[rms][iphasicValue * step + 2] * xishu rmsFA.push([rmsData[rms][0], rmsFirstA2]) rmsFB.push([rmsData[rms][0], rmsFirstB2]) rfmax = getMaxTwo(rfmax, rmsFirstA2, rmsFirstB2) rfmin = getMinOpen(rfmin, rmsFirstA2, rmsFirstB2) if (rfmin < rmsvFirstY) { rmsvFirstY = rfmin if (rfmin === rmsFirstA2) { firstZhou = 'a' } else if (rfmin === rmsFirstB2) { firstZhou = 'b' } rmsvFirstX = rmsData[rms][0] } const rmsSecondA2 = rmsData[rms][iphasicValue * step + 1] const rmsSecondB2 = rmsData[rms][iphasicValue * step + 2] rmsSA.push([rmsData[rms][0], rmsSecondA2]) rmsSB.push([rmsData[rms][0], rmsSecondB2]) rsmax = getMaxTwo(rsmax, rmsSecondA2, rmsSecondB2) rsmin = getMinOpen(rsmin, rmsSecondA2, rmsSecondB2) if (rsmin < rmsvSecondY) { rmsvSecondY = rsmin if (rsmin === rmsSecondA2) { secondeZhou = 'a' } else if (rsmin === rmsSecondB2) { secondeZhou = 'b' } rmsvSecondX = rmsData[rms][0] } break case 3: const rmsFirstA3 = rmsData[rms][iphasicValue * step + 1] * xishu const rmsFirstB3 = rmsData[rms][iphasicValue * step + 2] * xishu const rmsFirstC3 = rmsData[rms][iphasicValue * step + 3] * xishu rmsFA.push([rmsData[rms][0], rmsFirstA3]) rmsFB.push([rmsData[rms][0], rmsFirstB3]) rmsFC.push([rmsData[rms][0], rmsFirstC3]) rfmax = getMax(rfmax, rmsFirstA3, rmsFirstB3, rmsFirstC3) rfmin = isOpen ? getMinOpen(rfmin, rmsFirstA3, rmsFirstC3) : getMin(rfmin, rmsFirstA3, rmsFirstB3, rmsFirstC3) if (rfmin < rmsvFirstY) { rmsvFirstY = rfmin if (rfmin === rmsFirstA3) { firstZhou = 'a' } else if (rfmin === rmsFirstB3) { firstZhou = 'b' } else { firstZhou = 'c' } rmsvFirstX = rmsData[rms][0] } const rmsSecondA3 = rmsData[rms][iphasicValue * step + 1] const rmsSecondB3 = rmsData[rms][iphasicValue * step + 2] const rmsSecondC3 = rmsData[rms][iphasicValue * step + 3] rmsSA.push([rmsData[rms][0], rmsSecondA3]) rmsSB.push([rmsData[rms][0], rmsSecondB3]) rmsSC.push([rmsData[rms][0], rmsSecondC3]) rsmax = getMax(rsmax, rmsSecondA3, rmsSecondB3, rmsSecondC3) rsmin = isOpen ? getMinOpen(rsmin, rmsSecondA3, rmsSecondC3) : getMin(rsmin, rmsSecondA3, rmsSecondB3, rmsSecondC3) if (rsmin < rmsvSecondY) { rmsvSecondY = rsmin if (rsmin === rmsSecondA3) { secondeZhou = 'a' } else if (rsmin === rmsSecondB3) { secondeZhou = 'b' } else { secondeZhou = 'c' } rmsvSecondX = rmsData[rms][0] } break } } const instantF = { max: ifmax, min: ifmin } const instantS = { max: ismax, min: ismin } const RMSF = { max: rfmax, min: rfmin } const RMSS = { max: rsmax, min: rsmin } const RMSFMinDetail = { rmsvFirstX, rmsvFirstY, firstZhou } const RMSSMinDetail = { rmsvSecondX, rmsvSecondY, secondeZhou } const shunshiF = { shunshiFA, shunshiFB, shunshiFC } const shunshiS = { shunshiSA, shunshiSB, shunshiSC } const RMSFWave = { rmsFA, rmsFB, rmsFC } const RMSSWave = { rmsSA, rmsSB, rmsSC } const title = { aTitle, bTitle, cTitle, unit } return { instantF, instantS, RMSF, RMSS, RMSFMinDetail, RMSSMinDetail, shunshiF, shunshiS, RMSFWave, RMSSWave, title, unit } } // 监听消息 self.onmessage = function (e) { const { wp, isOpen, value, boxoList } = JSON.parse(e.data) try { const iphasicValue = wp.iphasic || 1 const picCounts = (wp.waveTitle.length - 1) / iphasicValue const waveDatas = [] for (let i = 0; i < picCounts; i++) { const data = fliteWaveData(wp, i, iphasicValue, isOpen, boxoList) waveDatas.push(data) } // 处理标题 let titles = '' if (boxoList.systemType == 'pms') { titles = '变电站名称:' + boxoList.powerStationName + ' 监测点名称:' + boxoList.measurementPointName + ' 发生时刻:' + boxoList.startTime + ' 暂降(骤升)幅值:' + (boxoList.featureAmplitude * 100).toFixed(2) + '%  持续时间:' + boxoList.duration + 's' } else if (boxoList.systemType == 'ZL') { titles = (boxoList.engineeringName == undefined ? '' : ' 项目名称:' + boxoList.engineeringName) + ' 监测点名称:' + boxoList.equipmentName + ' 发生时刻:' + boxoList.startTime + ' 暂降(骤升)幅值:' + boxoList.evtParamVVaDepth + '% 持续时间:' + boxoList.evtParamTm + 's' } else if (boxoList.systemType == 'YPT') { titles = (boxoList.engineeringName == undefined ? '' : ' 项目名称:' + boxoList.engineeringName) + ' 监测点名称:' + boxoList.lineName + ' 发生时刻:' + boxoList.startTime + ' 暂降(骤升)幅值:' + (boxoList.featureAmplitude * 100).toFixed(2) + '% 持续时间:' + boxoList.persistTime + 's' } else { titles = ' 变电站名称:' + boxoList.subName + ' 监测点名称:' + boxoList.lineName + ' 发生时刻:' + boxoList.startTime + ' 暂降(骤升)幅值:' + (boxoList.featureAmplitude * 100).toFixed(2) + '% 持续时间:' + boxoList.duration + 's' } // 发送处理结果回主线程 self.postMessage({ titles: titles, success: true, waveDatas, time: wp.time, type: wp.waveType, severity: wp.yzd, iphasic: iphasicValue }) } catch (error) { self.postMessage({ success: false, error: error.message }) } }