package com.zhitan.util; import com.zhitan.model.entity.DeviceData; import com.zhitan.model.entity.PowerEntity; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; public class PowerDataMapper { public static List mapToEntities(DeviceData deviceData) { List meters = IntStream.rangeClosed(1, 8) .mapToObj(i -> createBaseEntity(deviceData, i)) .collect(Collectors.toList()); for (DeviceData.RDataItem item : deviceData.getParams().getRData()) { // 示例:将 "Ia1" 拆分为 "Ia" 和 "1" String[] parts = item.getName().split("(?<=\\D)(?=\\d)"); if (parts.length != 2) continue; String fieldCode = parts[0]; // 如 "Ia" int meterIndex = Integer.parseInt(parts[1]) - 1; // 转数组下标 if (meterIndex >= 0 && meterIndex < 8) { setMeterField(meters.get(meterIndex), fieldCode, item.getValue()); } // Uab1 Ubc1 Uca1是8个电表共用的字段,如果item.getName是Uab1 Ubc1 Uca1则遍历所有电表并赋值 if ("Uab Ubc Uca Ua Ub Uc".contains(fieldCode)) { for (int i = 0; i < 8; i++) { setMeterField(meters.get(i), fieldCode, item.getValue()); } } } return meters; } private static PowerEntity createBaseEntity(DeviceData data, int meterNumber) { PowerEntity entity = new PowerEntity(); entity.setSn(data.getParams().getSysSn() + "_" + meterNumber); entity.setImei(data.getParams().getSysImei()); entity.setTime(data.getParams().getSysTime()); return entity; } private static void setMeterField(PowerEntity entity, String fieldCode, String value) { try { switch (fieldCode.toUpperCase()) { case "UAB": entity.setUab(parseDouble(value)); break; case "UBC": entity.setUbc(parseDouble(value)); break; case "UCA": entity.setUca(parseDouble(value)); break; case "UA": entity.setUa(parseDouble(value)); break; case "UB": entity.setUb(parseDouble(value)); break; case "UC": entity.setUc(parseDouble(value)); break; case "IA": entity.setIa(parseDouble(value)); break; case "IB": entity.setIb(parseDouble(value)); break; case "IC": entity.setIc(parseDouble(value)); break; case "IO": entity.setIo(parseDouble(value)); break; case "PF": entity.setPf(parseDouble(value)); break; case "PSUM": entity.setPsum(parseDouble(value)); break; case "EPS": entity.setEps(parseDouble(value)); break; case "EQS": entity.setEqs(parseDouble(value)); break; case "EPSP": entity.setEpsp(parseDouble(value)); break; case "EPSN": entity.setEpsn(parseDouble(value)); break; case "EQSP": entity.setEqsp(parseDouble(value)); break; case "EQSN": entity.setEqsn(parseDouble(value)); break; } } catch (NumberFormatException e) { // 处理数值转换异常 } } private static Double parseDouble(String s) { return s != null ? Double.parseDouble(s) : null; } }