puzhibing
6 小时以前 e1c8c9d51f1c6e42c9868743f16fa8e52bb419cd
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/udan/service/UdanEmsMessageProcessor.java
@@ -7,9 +7,8 @@
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;
@@ -34,11 +33,13 @@
    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
@@ -67,6 +68,8 @@
                }else{
                    log.error("UDAN EMS数据同步错误-电站信息不存在!");
                }
                // 保存设备其它信息
                emindEnergyChainDetailService.saveAll(udanEmsDeviceState);
            }
        } catch (IOException e) {
@@ -87,7 +90,22 @@
        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;
@@ -200,6 +218,116 @@
        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()) {
@@ -261,6 +389,32 @@
        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 {
@@ -291,4 +445,5 @@
    private interface Reader {
        void read(int field, int type, CodedInputStream input) throws IOException;
    }
}