// 辅助函数 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.equipmentName + " 发生时刻:" + boxoList.startTime + " 残余电压:" + boxoList.evtParamVVaDepth + " 持续时间:" + boxoList.evtParamTm + "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, }); } };