diff --git a/ems-quartz/src/main/java/com/xzzn/quartz/task/StrategyPoller.java b/ems-quartz/src/main/java/com/xzzn/quartz/task/StrategyPoller.java index e45022d..8d9b6c1 100644 --- a/ems-quartz/src/main/java/com/xzzn/quartz/task/StrategyPoller.java +++ b/ems-quartz/src/main/java/com/xzzn/quartz/task/StrategyPoller.java @@ -1,5 +1,7 @@ package com.xzzn.quartz.task; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; import com.xzzn.common.core.modbus.ModbusProcessor; import com.xzzn.common.core.modbus.domain.DeviceConfig; import com.xzzn.common.core.modbus.domain.WriteTagConfig; @@ -12,18 +14,15 @@ import com.xzzn.common.utils.StringUtils; import com.xzzn.ems.domain.EmsAmmeterData; import com.xzzn.ems.domain.EmsBatteryStack; import com.xzzn.ems.domain.EmsDevicesSetting; -import com.xzzn.ems.domain.EmsPcsData; -import com.xzzn.ems.domain.EmsPointMatch; +import com.xzzn.ems.domain.EmsPcsSetting; import com.xzzn.ems.domain.EmsStrategyLog; import com.xzzn.ems.domain.EmsStrategyTemp; import com.xzzn.ems.domain.EmsStrategyTimeConfig; -import com.xzzn.ems.domain.vo.DeviceUpdateRequest; import com.xzzn.ems.domain.vo.StrategyRunningVo; import com.xzzn.ems.mapper.EmsAmmeterDataMapper; import com.xzzn.ems.mapper.EmsBatteryStackMapper; import com.xzzn.ems.mapper.EmsDevicesSettingMapper; -import com.xzzn.ems.mapper.EmsPcsDataMapper; -import com.xzzn.ems.mapper.EmsPointMatchMapper; +import com.xzzn.ems.mapper.EmsPcsSettingMapper; import com.xzzn.ems.mapper.EmsStrategyLogMapper; import com.xzzn.ems.mapper.EmsStrategyRunningMapper; import com.xzzn.ems.mapper.EmsStrategyTempMapper; @@ -38,6 +37,7 @@ import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.concurrent.CompletableFuture; import org.apache.commons.collections4.CollectionUtils; @@ -69,11 +69,9 @@ public class StrategyPoller { @Autowired private EmsBatteryStackMapper emsBatteryStackMapper; @Autowired - private EmsPcsDataMapper emsPcsDataMapper; - @Autowired private EmsDevicesSettingMapper emsDevicesMapper; @Autowired - private EmsPointMatchMapper emsPointMatchMapper; + private EmsPcsSettingMapper emsPcsSettingMapper; @Autowired private EmsAmmeterDataMapper emsAmmeterDataMapper; @Autowired @@ -150,32 +148,36 @@ public class StrategyPoller { continue; } // 查询PCS设备信息 - List pcsDataList = emsPcsDataMapper.getSitePcsDataInfo(siteId); - if (CollectionUtils.isEmpty(pcsDataList)) { + EmsDevicesSetting queryDevices = new EmsDevicesSetting(); + queryDevices.setSiteId(siteId); + queryDevices.setDeviceCategory(DeviceCategory.PCS.getCode()); + List pcsDeviceList = emsDevicesMapper.selectEmsDevicesSettingList(queryDevices); + if (CollectionUtils.isEmpty(pcsDeviceList)) { logger.info("当前站点: {} 未配置PCS设备", siteId); continue; } // 判断SOC上限和下限是否在范围内 if (isSocInRange(emsStrategyTemp)) { - BigDecimal avgChargeDischargePower = emsStrategyTemp.getChargeDischargePower().divide(new BigDecimal(pcsDataList.size())); - for (EmsPcsData pcsData : pcsDataList) { - if (pcsData.getClusterNum() == null || pcsData.getClusterNum() < 1) { - logger.info("当前站点: {}, PCS设备: {} 未获取电池簇数量", siteId, pcsData.getDeviceId()); + BigDecimal avgChargeDischargePower = emsStrategyTemp.getChargeDischargePower().divide(new BigDecimal(pcsDeviceList.size())); + for (EmsDevicesSetting pcsDevice : pcsDeviceList) { + EmsPcsSetting pcsSetting = emsPcsSettingMapper.selectEmsPcsSettingByDeviceId(pcsDevice.getId()); + if (pcsSetting == null || pcsSetting.getClusterNum() < 1) { + logger.info("当前站点: {}, PCS设备: {} 未获取电池簇数量", siteId, pcsDevice.getDeviceId()); continue; } // 平均功率值,根据电池簇数量进行平均分配 - avgChargeDischargePower = avgChargeDischargePower.divide(new BigDecimal(pcsData.getClusterNum())); + avgChargeDischargePower = avgChargeDischargePower.divide(new BigDecimal(pcsSetting.getClusterNum())); // 根据充电状态,处理数据 if (ChargeStatus.CHARGING.getCode().equals(emsStrategyTemp.getChargeStatus())) { // 发送Modbus命令控制设备-充电 - sendModbusCommand(Collections.singletonList(pcsData), ChargeStatus.CHARGING, avgChargeDischargePower, emsStrategyTemp, false); + sendModbusCommand(Collections.singletonList(pcsDevice), pcsSetting, ChargeStatus.CHARGING, avgChargeDischargePower, emsStrategyTemp, false); } else if (ChargeStatus.DISCHARGING.getCode().equals(emsStrategyTemp.getChargeStatus())) { // 判断是否需要防逆流,PCS降功率运行 boolean needAntiReverseFlow = isNeedAntiReverseFlow(emsStrategyTemp); if (needAntiReverseFlow) { BigDecimal powerDown = ANTI_REVERSE_POWER_DOWN_PERCENT; // 查询站点PCS功率降幅记录,如果有则累加增幅 - List strategyLogList = getStrategyLog(pcsData.getDeviceId(), emsStrategyTemp.getChargeStatus(), emsStrategyTemp, needAntiReverseFlow); + List strategyLogList = getStrategyLog(pcsDevice.getDeviceId(), emsStrategyTemp.getChargeStatus(), emsStrategyTemp, needAntiReverseFlow); if (CollectionUtils.isNotEmpty(strategyLogList)) { // 判断上次防逆流时间是否已经过了15分钟 if (DateUtils.differentMinutesByMillisecond(strategyLogList.get(0).getExecutionDate(), new Date()) < 15) { @@ -188,19 +190,19 @@ public class StrategyPoller { if (BigDecimal.ZERO.compareTo(avgChargeDischargePower) == 0) { // 如果已经降功率到0,则设备直接待机 // 发送Modbus命令控制设备-待机 - sendModbusCommand(Collections.singletonList(pcsData), ChargeStatus.STANDBY, BigDecimal.ZERO, emsStrategyTemp, needAntiReverseFlow); + sendModbusCommand(Collections.singletonList(pcsDevice), pcsSetting, ChargeStatus.STANDBY, BigDecimal.ZERO, emsStrategyTemp, needAntiReverseFlow); } else { // 发送Modbus命令控制设备-放电 - sendModbusCommand(Collections.singletonList(pcsData), ChargeStatus.DISCHARGING, avgChargeDischargePower, emsStrategyTemp, needAntiReverseFlow); + sendModbusCommand(Collections.singletonList(pcsDevice), pcsSetting, ChargeStatus.DISCHARGING, avgChargeDischargePower, emsStrategyTemp, needAntiReverseFlow); } } else { // 发送Modbus命令控制设备-待机 - sendModbusCommand(Collections.singletonList(pcsData), ChargeStatus.STANDBY, BigDecimal.ZERO, emsStrategyTemp, false); + sendModbusCommand(Collections.singletonList(pcsDevice), pcsSetting, ChargeStatus.STANDBY, BigDecimal.ZERO, emsStrategyTemp, false); } } } else { // 发送Modbus命令控制设备-待机 - sendModbusCommand(pcsDataList, ChargeStatus.STANDBY, BigDecimal.ZERO, emsStrategyTemp, false); + sendModbusCommand(pcsDeviceList, null, ChargeStatus.STANDBY, BigDecimal.ZERO, emsStrategyTemp, false); } } @@ -253,12 +255,14 @@ public class StrategyPoller { return emsAmmeterData.getTotalActivePower().compareTo(upperLimit) < 0; } - public List getWriteTags(List pointMatchList, + public List getWriteTags(EmsPcsSetting pcsSetting, ChargeStatus chargeStatus, BigDecimal chargeDischargePower) { List writeTags = new ArrayList<>(); - for (EmsPointMatch pointMatch : pointMatchList) { - WriteTagConfig writeTag = new WriteTagConfig(); - writeTag.setAddress(pointMatch.getIpAddress()); + JSONArray array = JSON.parseArray(pcsSetting.getClusterPointAddress()); + for (int i = 0; i < pcsSetting.getClusterNum(); i++) { + Object clusterPointAddress = array.get(i); + WriteTagConfig clusterWriteTag = new WriteTagConfig(); + clusterWriteTag.setAddress(String.valueOf(clusterPointAddress)); // if (ChargeStatus.CHARGING.equals(chargeStatus)) { // writeTag.setValue(chargeDischargePower); // } else if (ChargeStatus.DISCHARGING.equals(chargeStatus)) { @@ -267,8 +271,8 @@ public class StrategyPoller { // // 待机状态-电池簇PCS有功功率给定置0 // writeTag.setValue(chargeDischargePower); // } - writeTag.setValue(chargeDischargePower); - writeTags.add(writeTag); + clusterWriteTag.setValue(chargeDischargePower); + writeTags.add(clusterWriteTag); } return writeTags; } @@ -282,24 +286,18 @@ public class StrategyPoller { return matchFields; } - public DeviceConfig getDeviceConfig(EmsPcsData pcsData, ChargeStatus chargeStatus, BigDecimal chargeDischargePower) { - EmsDevicesSetting device = emsDevicesMapper.getDeviceBySiteAndDeviceId(pcsData.getDeviceId(), pcsData.getSiteId()); + public DeviceConfig getDeviceConfig(String siteId, String deviceId, EmsPcsSetting pcsSetting, ChargeStatus chargeStatus, BigDecimal chargeDischargePower) { + EmsDevicesSetting device = emsDevicesMapper.getDeviceBySiteAndDeviceId(deviceId, siteId); if (device == null) { - logger.info("当前站点: {}, PCS设备: {} 未找到对应设备配置信息", pcsData.getSiteId(), pcsData.getDeviceId()); + logger.info("当前站点: {}, PCS设备: {} 未找到对应设备配置信息", siteId, deviceId); return null; } - DeviceUpdateRequest query = new DeviceUpdateRequest(); - query.setSiteId(device.getSiteId()); - query.setDeviceId(device.getDeviceId()); - query.setMatchFields(getMatchFields(pcsData.getClusterNum())); - query.setDeviceCategory(DeviceCategory.PCS.getCode()); - List pointMatchList = emsPointMatchMapper.selectDeviceStatusPoint(query); - if (CollectionUtils.isEmpty(pointMatchList)) { - logger.info("当前站点: {}, PCS设备: {} 未找到对应设备点位字段配置", pcsData.getSiteId(), pcsData.getDeviceId()); - return null; - } - if (pointMatchList.size() != pcsData.getClusterNum()) { - logger.info("当前站点: {}, PCS设备: {} 设备点位字段配置数量与电池簇数不一致", pcsData.getSiteId(), pcsData.getDeviceId()); + if (Objects.isNull(pcsSetting)) { + pcsSetting = emsPcsSettingMapper.selectEmsPcsSettingByDeviceId(device.getId()); + if (pcsSetting == null) { + logger.info("当前站点: {}, PCS设备: {} 未找到对应PCS配置", siteId, deviceId); + return null; + } } DeviceConfig deviceConfig = new DeviceConfig(); deviceConfig.setDeviceNumber(device.getDeviceId()); @@ -307,28 +305,30 @@ public class StrategyPoller { deviceConfig.setSlaveId(device.getSlaveId().intValue()); deviceConfig.setHost(device.getIpAddress()); deviceConfig.setPort(device.getIpPort().intValue()); - deviceConfig.setWriteTags(getWriteTags(pointMatchList, chargeStatus, chargeDischargePower)); + deviceConfig.setWriteTags(getWriteTags(pcsSetting, chargeStatus, chargeDischargePower)); return deviceConfig; } - private void sendModbusCommand(List pcsDataList, ChargeStatus chargeStatus, BigDecimal chargeDischargePower, + private void sendModbusCommand(List pcsDeviceList, EmsPcsSetting pcsSetting, ChargeStatus chargeStatus, BigDecimal chargeDischargePower, EmsStrategyTemp emsStrategyTemp, boolean needAntiReverseFlow) { - for (EmsPcsData pcsData : pcsDataList) { - List strategyLogList = getStrategyLog(pcsData.getDeviceId(), chargeStatus.getCode(), emsStrategyTemp, needAntiReverseFlow); + for (EmsDevicesSetting pcsDevice : pcsDeviceList) { + String siteId = pcsDevice.getSiteId(); + String deviceId = pcsDevice.getDeviceId(); + List strategyLogList = getStrategyLog(deviceId, chargeStatus.getCode(), emsStrategyTemp, needAntiReverseFlow); if (CollectionUtils.isNotEmpty(strategyLogList) && !ChargeStatus.DISCHARGING.equals(chargeStatus) && !needAntiReverseFlow) { - logger.info("当前站点: {}, PCS设备: {} 当前时间段已存在策略执行记录,不再重复执行", pcsData.getSiteId(), pcsData.getDeviceId()); + logger.info("当前站点: {}, PCS设备: {} 当前时间段已存在策略执行记录,不再重复执行", siteId, deviceId); continue; } - DeviceConfig deviceConfig = getDeviceConfig(pcsData, chargeStatus, chargeDischargePower); + DeviceConfig deviceConfig = getDeviceConfig(siteId, deviceId, pcsSetting, chargeStatus, chargeDischargePower); if (deviceConfig == null) { continue; } boolean result = modbusProcessor.writeDataToDevice(deviceConfig); if (!result) { - logger.info("当前站点: {}, PCS设备: {} modbus控制设备{}指令发送失败", pcsData.getSiteId(), pcsData.getDeviceId(), chargeStatus.getInfo()); + logger.info("当前站点: {}, PCS设备: {} modbus控制设备{}指令发送失败", siteId, deviceId, chargeStatus.getInfo()); } // 记录策略执行日志 - saveStrategyLog(pcsData.getDeviceId(), chargeDischargePower, chargeStatus.getCode(), emsStrategyTemp, needAntiReverseFlow); + saveStrategyLog(deviceId, chargeDischargePower, chargeStatus.getCode(), emsStrategyTemp, needAntiReverseFlow); } }