| | |
| | | import com.ruoyi.other.emind.dto.EmindIncomeHistoryDto; |
| | | import com.ruoyi.other.emind.mapper.EmindStationMapper; |
| | | import com.ruoyi.other.emind.mapper.EmindStorageDashboardMapper; |
| | | import com.ruoyi.other.udan.model.EmsState; |
| | | import com.ruoyi.other.udan.model.PowerMeterState; |
| | | import com.ruoyi.other.udan.model.UdanEmsDeviceState; |
| | | import com.ruoyi.other.emind.service.EmindEnergyChainDetailService; |
| | | import com.ruoyi.other.udan.model.*; |
| | | import com.ruoyi.other.udan.util.UdanEmsKafkaUtil; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.commons.collections4.CollectionUtils; |
| | |
| | | private final UdanEmsKafkaUtil kafkaUtil; |
| | | private final EmindStorageDashboardMapper dashboardMapper; |
| | | private final EmindStationMapper stationMapper; |
| | | private final EmindEnergyChainDetailService emindEnergyChainDetailService; |
| | | |
| | | public UdanEmsMessageProcessor(UdanEmsKafkaUtil kafkaUtil, EmindStorageDashboardMapper dashboardMapper, EmindStationMapper stationMapper) { |
| | | public UdanEmsMessageProcessor(UdanEmsKafkaUtil kafkaUtil, EmindStorageDashboardMapper dashboardMapper, EmindStationMapper stationMapper, EmindEnergyChainDetailService emindEnergyChainDetailService) { |
| | | this.kafkaUtil = kafkaUtil; |
| | | this.dashboardMapper = dashboardMapper; |
| | | this.stationMapper = stationMapper; |
| | | this.emindEnergyChainDetailService = emindEnergyChainDetailService; |
| | | } |
| | | |
| | | @PostConstruct |
| | |
| | | }else{ |
| | | log.error("UDAN EMS数据同步错误-电站信息不存在!"); |
| | | } |
| | | // 保存设备其它信息 |
| | | emindEnergyChainDetailService.saveAll(udanEmsDeviceState); |
| | | } |
| | | |
| | | } catch (IOException e) { |
| | |
| | | read(bytes, (field, type, in) -> { |
| | | if (field == 1 && type == 0) state.setTime(in.readUInt64()); |
| | | else if (type == 2 && field == 2) state.setEmsState(parseEms(in.readBytes().toByteArray())); |
| | | else if (type == 2 && field == 4 && state.getPcsState() == null) { |
| | | state.setPcsState(parsePcs(in.readBytes().toByteArray())); |
| | | } |
| | | else if (type == 2 && field == 5 && state.getBatteryStackState() == null) { |
| | | state.setBatteryStackState(parseBatteryStack(in.readBytes().toByteArray())); |
| | | } |
| | | else if (type == 2 && field == 7 && state.getElectricMeterState() == null) { |
| | | state.setElectricMeterState(parseElectricMeter(in.readBytes().toByteArray())); |
| | | } |
| | | else if (type == 2 && field == 8) state.setPowerMeterState(parsePowerMeter(in.readBytes().toByteArray())); |
| | | else if (type == 2 && field == 14 && state.getTmsState() == null) { |
| | | state.setTmsState(parseTms(in.readBytes().toByteArray())); |
| | | } |
| | | else if (type == 2 && field == 15 && state.getPeripheralDeviceState() == null) { |
| | | state.setPeripheralDeviceState(parsePeripheral(in.readBytes().toByteArray())); |
| | | } |
| | | else skip(in, type); |
| | | }); |
| | | return state; |
| | |
| | | return value; |
| | | } |
| | | |
| | | private PcsState parsePcs(byte[] bytes) throws IOException { |
| | | PcsState value = new PcsState(); |
| | | read(bytes, (field, type, input) -> { |
| | | switch (field) { |
| | | case 2: value.setDeviceId(str(input, type)); break; |
| | | case 3: value.setErrorStatus(enumName(input, type, "ErrorStatus")); break; |
| | | case 4: value.setAlarmStatus(enumName(input, type, "AlarmStatus")); break; |
| | | case 5: value.setRunStatus(enumName(input, type, "RunStatus")); break; |
| | | case 6: value.setOnGridStatus(enumName(input, type, "GridStatus")); break; |
| | | case 13: value.setAcTotalActivePower((double) f32(input, type)); break; |
| | | case 17: value.setDailyChargeEnergyKwh((double) f32(input, type)); break; |
| | | case 18: value.setDailyDischargeEnergyKwh((double) f32(input, type)); break; |
| | | case 19: value.setTotalChargeEnergyKwh(f64(input, type)); break; |
| | | case 20: value.setTotalDischargeEnergyKwh(f64(input, type)); break; |
| | | case 31: value.setAPhaseActivePower((double) f32(input, type)); break; |
| | | case 34: value.setBPhaseActivePower((double) f32(input, type)); break; |
| | | case 37: value.setCPhaseActivePower((double) f32(input, type)); break; |
| | | case 50: value.setControlMode(enumName(input, type, "PcsControlMode")); break; |
| | | case 60: value.setCommStatus(enumName(input, type, "CommStatus")); break; |
| | | |
| | | default: skip(input, type); |
| | | } |
| | | }); |
| | | return value; |
| | | } |
| | | |
| | | private BatteryStackState parseBatteryStack(byte[] bytes) throws IOException { |
| | | BatteryStackState value = new BatteryStackState(); |
| | | read(bytes, (field, type, input) -> { |
| | | switch (field) { |
| | | case 2: value.setDeviceId(str(input, type)); break; |
| | | case 4: value.setWorkStatus(enumName(input, type, "BatteryWorkStatus")); break; |
| | | case 5: value.setErrorStatus(enumName(input, type, "ErrorStatus")); break; |
| | | case 6: value.setWarningStatus(enumName(input, type, "AlarmStatus")); break; |
| | | case 7: value.setTv((double) f32(input, type)); break; |
| | | case 8: value.setTc((double) f32(input, type)); break; |
| | | case 9: value.setSoh((double) f32(input, type)); break; |
| | | case 10: value.setSoc((double) f32(input, type)); break; |
| | | case 15: value.setMinCellVoltMv((double) u32(input, type)); break; |
| | | case 23: value.setMaxCellVoltMv((double) u32(input, type)); break; |
| | | case 31: value.setRechargeableCapacityKwh((double) f32(input, type)); break; |
| | | case 32: value.setDischargeableCapacityKwh((double) f32(input, type)); break; |
| | | case 33: value.setCumulativeDischargeKwh(f64(input, type)); break; |
| | | case 34: value.setCumulativeChargeKwh(f64(input, type)); break; |
| | | case 36: value.setAvgCellTemp((double) u32(input, type) - 40D); break; |
| | | case 52: value.setCommStatus(enumName(input, type, "CommStatus")); break; |
| | | case 48: value.setBatteryStatus(enumName(input, type, "BatteryStatus")); break; |
| | | |
| | | default: skip(input, type); |
| | | } |
| | | }); |
| | | return value; |
| | | } |
| | | |
| | | private ElectricMeterState parseElectricMeter(byte[] bytes) throws IOException { |
| | | ElectricMeterState value = new ElectricMeterState(); |
| | | read(bytes, (field, type, input) -> { |
| | | switch (field) { |
| | | case 2: value.setDeviceId(str(input, type)); break; |
| | | case 48: value.setAPhaseVolt((double) f32(input, type)); break; |
| | | case 49: value.setBPhaseVolt((double) f32(input, type)); break; |
| | | case 50: value.setCPhaseVolt((double) f32(input, type)); break; |
| | | case 51: value.setAPhaseCurrent((double) f32(input, type)); break; |
| | | case 52: value.setBPhaseCurrent((double) f32(input, type)); break; |
| | | case 53: value.setCPhaseCurrent((double) f32(input, type)); break; |
| | | case 54: value.setAcTotalActivePower((double) f32(input, type)); break; |
| | | case 69: value.setFrequency((double) f32(input, type)); break; |
| | | case 74: value.setAcTotalPowerFactor((double) f32(input, type)); break; |
| | | default: skip(input, type); |
| | | } |
| | | }); |
| | | return value; |
| | | } |
| | | |
| | | private TmsState parseTms(byte[] bytes) throws IOException { |
| | | TmsState value = new TmsState(); |
| | | read(bytes, (field, type, input) -> { |
| | | switch (field) { |
| | | case 1: value.setDeviceId(str(input, type)); break; |
| | | case 2: value.setRun_status(enumName(input, type, "TmsRunStatus")); break; |
| | | case 3: value.setError_status(enumName(input, type, "ErrorStatus")); break; |
| | | case 4: value.setSupply_temp((double) f32(input, type)); break; |
| | | case 5: value.setReturn_temp((double) f32(input, type)); break; |
| | | case 8: value.setEnv_temp((double) f32(input, type)); break; |
| | | case 21: value.setCool_start_temp((double) f32(input, type)); break; |
| | | case 22: value.setCool_stop_temp((double) f32(input, type)); break; |
| | | case 23: value.setHeat_start_temp((double) f32(input, type)); break; |
| | | case 24: value.setHeat_stop_temp((double) f32(input, type)); break; |
| | | case 6: value.setTms_mode(enumName(input, type, "TmsMode")); break; |
| | | case 28: value.setControl_mode(enumName(input, type, "TmsControlMode")); break; |
| | | case 25: value.setComm_status(enumName(input, type, "CommStatus")); break; |
| | | default: skip(input, type); |
| | | } |
| | | }); |
| | | return value; |
| | | } |
| | | |
| | | private PeripheralDeviceState parsePeripheral(byte[] bytes) throws IOException { |
| | | PeripheralDeviceState value = new PeripheralDeviceState(); |
| | | read(bytes, (field, type, input) -> { |
| | | switch (field) { |
| | | case 1: value.setDeviceId(str(input, type)); break; |
| | | case 2: value.setDiState(u32(input, type)); break; |
| | | default: skip(input, type); |
| | | } |
| | | }); |
| | | value.convert(); |
| | | return value; |
| | | } |
| | | |
| | | private void read(byte[] bytes, Reader reader) throws IOException { |
| | | CodedInputStream input = CodedInputStream.newInstance(bytes == null ? new byte[0] : bytes); |
| | | while (!input.isAtEnd()) { |
| | |
| | | if ("CommStatus".equals(prefix)) { |
| | | return new String[]{"COMM_STATUS_UNKNOWN", "COMM_STATUS_DISCONNECTED", "COMM_STATUS_CONNECTED"}[number < 0 || number > 2 ? 0 : number]; |
| | | } |
| | | if ("ErrorStatus".equals(prefix)) { |
| | | return new String[]{"ERROR_STATUS_UNKNOWN", "ERROR_STATUS_OCCURRING", "ERROR_STATUS_NONE"}[number < 0 || number > 2 ? 0 : number]; |
| | | } |
| | | if ("AlarmStatus".equals(prefix)) { |
| | | return new String[]{"ALARM_STATUS_UNKNOWN", "ALARM_STATUS_OCCURRING", "ALARM_STATUS_NONE"}[number < 0 || number > 2 ? 0 : number]; |
| | | } |
| | | if ("BatteryWorkStatus".equals(prefix)) { |
| | | return new String[]{"BATTERY_WORK_STATUS_UNKNOWN", "BATTERY_WORK_STATUS_CHARGING", "BATTERY_WORK_STATUS_DISCHARGING", "BATTERY_WORK_STATUS_IDLE"}[number < 0 || number > 3 ? 0 : number]; |
| | | } |
| | | if ("TmsRunStatus".equals(prefix)) { |
| | | return new String[]{"TMS_RUN_STATUS_UNKNOWN", "TMS_RUN_STATUS_IDLE", "TMS_RUN_STATUS_READY_TO_START", "TMS_RUN_STATUS_RUNNING", "TMS_RUN_STATUS_DELAYED_SHUTDOWN", "TMS_RUN_STATUS_SELF_TEST", "TMS_RUN_STATUS_ALARMING"}[number < 0 || number > 6 ? 0 : number]; |
| | | } |
| | | if ("PcsControlMode".equals(prefix)) { |
| | | return new String[]{"PCS_CONTROL_MODE_UNKNOWN", "PCS_CONTROL_MODE_LOCAL_CONTROL", "PCS_CONTROL_MODE_REMOTE_CONTROL"}[number < 0 || number > 3 ? 0 : number]; |
| | | } |
| | | if ("BatteryStatus".equals(prefix)) { |
| | | return new String[]{"Battery_Status_BAN_CHARGE_DISCHARGE", "Battery_Status_ONLY_CHARGE", "Battery_Status_ONLY_DISCHARGE","Battery_Status_NORMAL","Battery_Status_BAN_CHARGE_DISCHARGE_NEW","Battery_Status_IDLE"}[number < 0 || number > 6 ? 0 : number]; |
| | | } |
| | | if ("TmsMode".equals(prefix)) { |
| | | return new String[]{"TMS_MODE_UNKNOWN", "TMS_MODE_REFRIGERATION", "TMS_MODE_HEATING","TMS_MODE_SELF_LOOP","TMS_MODE_AUTOMATIC","TMS_MODE_STOP"}[number < 0 || number > 6 ? 0 : number]; |
| | | } |
| | | if ("TmsControlMode".equals(prefix)) { |
| | | return new String[]{"UNKNOWN", "OUTLET_WATER_TEMP", "INLET_WATER_TEMP","CELL_WEIGHT_TEMP","CELL_AVG_TEMP"}[number < 0 || number > 5 ? 0 : number]; |
| | | } |
| | | |
| | | |
| | | return prefix + "_" + number; |
| | | } |
| | | private static <T> T enumAt(T[] values, CodedInputStream input, int type) throws IOException { |
| | |
| | | private interface Reader { |
| | | void read(int field, int type, CodedInputStream input) throws IOException; |
| | | } |
| | | |
| | | } |