预约充电

This commit is contained in:
Guoqs
2024-06-20 13:54:38 +08:00
parent d632555869
commit af96ae4a1c
10 changed files with 413 additions and 288 deletions

View File

@@ -9,6 +9,7 @@ import com.jsowell.common.enums.ykc.OrderStatusEnum;
import com.jsowell.common.enums.ykc.PileConnectorStatusEnum;
import com.jsowell.common.enums.ykc.YKCPileFaultReasonEnum;
import com.jsowell.common.util.BytesUtil;
import com.jsowell.common.util.DateUtils;
import com.jsowell.common.util.StringUtils;
import com.jsowell.common.util.YKCUtils;
import com.jsowell.netty.factory.YKCOperateFactory;
@@ -37,303 +38,322 @@ import java.util.concurrent.TimeUnit;
@Slf4j
@Component
public class UploadRealTimeMonitorHandler extends AbstractHandler {
private final String type = YKCUtils.frameType2Str(YKCFrameTypeCode.UPLOAD_REAL_TIME_MONITOR_DATA_CODE.getBytes());
private final String oldVersionType = YKCUtils.frameType2Str(YKCFrameTypeCode.UPLOAD_REAL_TIME_MONITOR_DATA_OLD_VERSION_CODE.getBytes());
private final String type = YKCUtils.frameType2Str(YKCFrameTypeCode.UPLOAD_REAL_TIME_MONITOR_DATA_CODE.getBytes());
private final String oldVersionType = YKCUtils.frameType2Str(YKCFrameTypeCode.UPLOAD_REAL_TIME_MONITOR_DATA_OLD_VERSION_CODE.getBytes());
@Override
public void afterPropertiesSet() throws Exception {
YKCOperateFactory.register(type, this);
YKCOperateFactory.register(oldVersionType, this);
}
@Override
public void afterPropertiesSet() throws Exception {
YKCOperateFactory.register(type, this);
YKCOperateFactory.register(oldVersionType, this);
}
@Autowired
private PileBasicInfoService pileBasicInfoService;
@Autowired
private PileBasicInfoService pileBasicInfoService;
@Autowired
private OrderBasicInfoService orderBasicInfoService;
@Autowired
private OrderBasicInfoService orderBasicInfoService;
@Autowired
private CommonService commonService;
@Autowired
private CommonService commonService;
@Autowired
private RedisCache redisCache;
@Autowired
private RedisCache redisCache;
@Override
public byte[] supplyProcess(YKCDataProtocol ykcDataProtocol, Channel channel) {
// log.info("[===获取桩上传的实时监测数据===] param:{}, channel:{}", JSON.toJSONString(ykcDataProtocol), channel.toString());
RealTimeMonitorData realTimeMonitorData = new RealTimeMonitorData();
@Override
public byte[] supplyProcess(YKCDataProtocol ykcDataProtocol, Channel channel) {
// log.info("[===获取桩上传的实时监测数据===] param:{}, channel:{}", JSON.toJSONString(ykcDataProtocol), channel.toString());
RealTimeMonitorData realTimeMonitorData = new RealTimeMonitorData();
// 获取消息体
byte[] msgBody = ykcDataProtocol.getMsgBody();
// log.info("上传实时数据msgBody:{}", BytesUtil.bcd2Str(msgBody));
int startIndex = 0;
int length = 16;
// 获取消息体
byte[] msgBody = ykcDataProtocol.getMsgBody();
// log.info("上传实时数据msgBody:{}", BytesUtil.bcd2Str(msgBody));
int startIndex = 0;
int length = 16;
// 交易流水号
byte[] orderCodeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String transactionCode = BytesUtil.bcd2Str(orderCodeByteArr);
realTimeMonitorData.setTransactionCode(transactionCode);
// 交易流水号
byte[] orderCodeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String transactionCode = BytesUtil.bcd2Str(orderCodeByteArr);
realTimeMonitorData.setTransactionCode(transactionCode);
// 桩编码
startIndex += length;
length = 7;
byte[] pileSnByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String pileSn = BytesUtil.bcd2Str(pileSnByteArr);
realTimeMonitorData.setPileSn(pileSn);
// 桩编码
startIndex += length;
length = 7;
byte[] pileSnByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String pileSn = BytesUtil.bcd2Str(pileSnByteArr);
realTimeMonitorData.setPileSn(pileSn);
// 保存时间
saveLastTimeAndCheckChannel(pileSn, channel);
// 保存时间
saveLastTimeAndCheckChannel(pileSn, channel);
// 枪号
startIndex += length;
length = 1;
byte[] pileConnectorCodeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String connectorCode = BytesUtil.bcd2Str(pileConnectorCodeByteArr);
realTimeMonitorData.setConnectorCode(connectorCode);
// 枪号
startIndex += length;
length = 1;
byte[] connectorCodeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String connectorCode = BytesUtil.bcd2Str(connectorCodeByteArr);
realTimeMonitorData.setConnectorCode(connectorCode);
// 枪口编号
String pileConnectorCode = pileSn + connectorCode;
// 枪口状态 0x00:离线 0x01:故障 0x02:空闲 0x03:充电 0x04 预约中
startIndex += length;
length = 1;
byte[] connectorStatusByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String connectorStatus = BytesUtil.bcd2Str(connectorStatusByteArr);
realTimeMonitorData.setConnectorStatus(connectorStatus);
startIndex += length;
length = 1;
byte[] connectorStatusByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String connectorStatus = BytesUtil.bcd2Str(connectorStatusByteArr);
realTimeMonitorData.setConnectorStatus(connectorStatus);
// 是否归位 0x00:否 0x01:是 0x02:未知(无法检测到枪是否插回枪座即 未知)
startIndex += length;
length = 1;
byte[] homingFlagByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String homingFlag = BytesUtil.bcd2Str(homingFlagByteArr);
realTimeMonitorData.setHomingFlag(homingFlag);
// 是否归位 0x00:否 0x01:是 0x02:未知(无法检测到枪是否插回枪座即 未知)
startIndex += length;
length = 1;
byte[] homingFlagByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String homingFlag = BytesUtil.bcd2Str(homingFlagByteArr);
realTimeMonitorData.setHomingFlag(homingFlag);
// 是否插枪 0x00:否 0x01:是
startIndex += length;
length = 1;
byte[] putGunTypeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String putGunType = BytesUtil.bcd2Str(putGunTypeByteArr);
realTimeMonitorData.setPutGunType(putGunType);
// 是否插枪 0x00:否 0x01:是
startIndex += length;
length = 1;
byte[] isChargerPluggedInByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String isChargerPluggedIn = BytesUtil.bcd2Str(isChargerPluggedInByteArr);
realTimeMonitorData.setPutGunType(isChargerPluggedIn);
// 输出电压 精确到小数点后一位;待机置零
startIndex += length;
length = 2;
byte[] outputVoltageByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String outputVoltage = YKCUtils.convertVoltageCurrent(outputVoltageByteArr);
realTimeMonitorData.setOutputVoltage(outputVoltage);
// 输出电压 精确到小数点后一位;待机置零
startIndex += length;
length = 2;
byte[] outputVoltageByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String outputVoltage = YKCUtils.convertVoltageCurrent(outputVoltageByteArr);
realTimeMonitorData.setOutputVoltage(outputVoltage);
// 输出电流 精确到小数点后一位;待机置零
startIndex += length;
length = 2;
byte[] outputCurrentByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String outputCurrent = YKCUtils.convertVoltageCurrent(outputCurrentByteArr);
realTimeMonitorData.setOutputCurrent(outputCurrent);
// 输出电流 精确到小数点后一位;待机置零
startIndex += length;
length = 2;
byte[] outputCurrentByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String outputCurrent = YKCUtils.convertVoltageCurrent(outputCurrentByteArr);
realTimeMonitorData.setOutputCurrent(outputCurrent);
// 枪线温度 整形, 偏移量-50待机置零
startIndex += length;
length = 1;
byte[] gunLineTemperatureByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String gunLineTemperature = YKCUtils.transitionTemperature(gunLineTemperatureByteArr);
realTimeMonitorData.setGunLineTemperature(gunLineTemperature);
// 枪线温度 整形, 偏移量-50待机置零
startIndex += length;
length = 1;
byte[] gunLineTemperatureByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String gunLineTemperature = YKCUtils.transitionTemperature(gunLineTemperatureByteArr);
realTimeMonitorData.setGunLineTemperature(gunLineTemperature);
// 枪线编码 没有置零
startIndex += length;
length = 8;
byte[] gunLineCodeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String gunLineCode = BytesUtil.bcd2Str(gunLineCodeByteArr);
realTimeMonitorData.setGunLineCode(gunLineCode);
// 枪线编码 没有置零
startIndex += length;
length = 8;
byte[] gunLineCodeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String gunLineCode = BytesUtil.bcd2Str(gunLineCodeByteArr);
realTimeMonitorData.setGunLineCode(gunLineCode);
// SOC 待机置零;交流桩置零
startIndex += length;
length = 1;
byte[] SOCByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String SOC = String.valueOf(SOCByteArr[0]);
realTimeMonitorData.setSOC(SOC);
// SOC 待机置零;交流桩置零
startIndex += length;
length = 1;
byte[] SOCByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String SOC = String.valueOf(SOCByteArr[0]);
realTimeMonitorData.setSOC(SOC);
// 电池组最高温度 整形, 偏移量-50 ºC待机置零 交流桩置零
startIndex += length;
length = 1;
byte[] batteryMaxTemperatureByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String batteryMaxTemperature = YKCUtils.transitionTemperature(batteryMaxTemperatureByteArr);
realTimeMonitorData.setBatteryMaxTemperature(batteryMaxTemperature);
// 电池组最高温度 整形, 偏移量-50 ºC待机置零 交流桩置零
startIndex += length;
length = 1;
byte[] batteryMaxTemperatureByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String batteryMaxTemperature = YKCUtils.transitionTemperature(batteryMaxTemperatureByteArr);
realTimeMonitorData.setBatteryMaxTemperature(batteryMaxTemperature);
// 累计充电时间 单位: min待机置零
startIndex += length;
length = 2;
byte[] sumChargingTimeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
int sumChargingTime = BytesUtil.bytesToIntLittle(sumChargingTimeByteArr);
realTimeMonitorData.setSumChargingTime(String.valueOf(sumChargingTime));
// 累计充电时间 单位: min待机置零
startIndex += length;
length = 2;
byte[] sumChargingTimeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
int sumChargingTime = BytesUtil.bytesToIntLittle(sumChargingTimeByteArr);
realTimeMonitorData.setSumChargingTime(String.valueOf(sumChargingTime));
// 剩余时间 单位: min待机置零、交流桩置零
startIndex += length;
length = 2;
byte[] timeRemainingByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
int timeRemaining = BytesUtil.bytesToIntLittle(timeRemainingByteArr);
realTimeMonitorData.setTimeRemaining(String.valueOf(timeRemaining));
// 剩余时间 单位: min待机置零、交流桩置零
startIndex += length;
length = 2;
byte[] timeRemainingByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
int timeRemaining = BytesUtil.bytesToIntLittle(timeRemainingByteArr);
realTimeMonitorData.setTimeRemaining(String.valueOf(timeRemaining));
// 充电度数 精确到小数点后四位;待机置零
startIndex += length;
length = 4;
byte[] chargingDegreeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String chargingDegree = YKCUtils.convertDecimalPoint(chargingDegreeByteArr, 4);
realTimeMonitorData.setChargingDegree(chargingDegree);
// 充电度数 精确到小数点后四位;待机置零
startIndex += length;
length = 4;
byte[] chargingDegreeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String chargingDegree = YKCUtils.convertDecimalPoint(chargingDegreeByteArr, 4);
realTimeMonitorData.setChargingDegree(chargingDegree);
// 计损充电度数 精确到小数点后四位;待机置零 未设置计损比例时等于充电度数
startIndex += length;
length = 4;
byte[] lossDegreeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String lossDegree = YKCUtils.convertDecimalPoint(lossDegreeByteArr, 4);
realTimeMonitorData.setLossDegree(lossDegree);
// 计损充电度数 精确到小数点后四位;待机置零 未设置计损比例时等于充电度数
startIndex += length;
length = 4;
byte[] lossDegreeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String lossDegree = YKCUtils.convertDecimalPoint(lossDegreeByteArr, 4);
realTimeMonitorData.setLossDegree(lossDegree);
// 已充金额 精确到小数点后四位;待机置零 (电费+服务费) *计损充电度数
startIndex += length;
length = 4;
byte[] chargingAmountByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String chargingAmount = YKCUtils.convertDecimalPoint(chargingAmountByteArr, 4);
realTimeMonitorData.setChargingAmount(chargingAmount);
// 已充金额 精确到小数点后四位;待机置零 (电费+服务费) *计损充电度数
startIndex += length;
length = 4;
byte[] chargingAmountByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String chargingAmount = YKCUtils.convertDecimalPoint(chargingAmountByteArr, 4);
realTimeMonitorData.setChargingAmount(chargingAmount);
/**
* 硬件故障
*
* Bit 位表示0 否 1 是), 低位到高位顺序
* Bit1:急停按钮动作故障;
* Bit2:无可用整流模块;
* Bit3:出风口温度过高;
* Bit4:交流防雷故障;
* Bit5:交直流模块 DC20 通信中断;
* Bit6:绝缘检测模块 FC08 通信中断;
* Bit7:电度表通信中断;
* Bit8:读卡器通信中断;
* Bit9: RC10 通信中断;
* Bit10:风扇调速板故障;
* Bit11:直流熔断器故障;
* Bit12:高压接触器故障;
* Bit13:门打开;
*/
startIndex += length;
length = 2;
byte[] hardwareFaultTempByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String hardwareFaultTemp = BytesUtil.bcd2Str(hardwareFaultTempByteArr);
String faultReason = "";
/**
* 硬件故障
*
* Bit 位表示0 否 1 是), 低位到高位顺序
* Bit1:急停按钮动作故障;
* Bit2:无可用整流模块;
* Bit3:出风口温度过高;
* Bit4:交流防雷故障;
* Bit5:交直流模块 DC20 通信中断;
* Bit6:绝缘检测模块 FC08 通信中断;
* Bit7:电度表通信中断;
* Bit8:读卡器通信中断;
* Bit9: RC10 通信中断;
* Bit10:风扇调速板故障;
* Bit11:直流熔断器故障;
* Bit12:高压接触器故障;
* Bit13:门打开;
*/
startIndex += length;
length = 2;
byte[] hardwareFaultTempByteArr = BytesUtil.copyBytes(msgBody, startIndex, length);
String hardwareFaultTemp = BytesUtil.bcd2Str(hardwareFaultTempByteArr);
String faultReason = "";
if (!StringUtils.equals(hardwareFaultTemp, "0000")) {
// 不等于0000说明有故障
StringBuffer sb = new StringBuffer(hardwareFaultTemp);
String lowOrder = sb.substring(0, 2);
String highOrder = sb.substring(2, 4);
if (!StringUtils.equals(hardwareFaultTemp, "0000")) {
// 不等于0000说明有故障
StringBuffer sb = new StringBuffer(hardwareFaultTemp);
String lowOrder = sb.substring(0, 2);
String highOrder = sb.substring(2, 4);
// String hardwareFault = highOrder + lowOrder;
byte[] hardwareFaultByteArr = BytesUtil.str2Bcd(highOrder + lowOrder);
String binStr = BytesUtil.bytes2BinStr(hardwareFaultByteArr);
// log.info("binStr:{}", binStr); // 0000 0000 0000 0001
int faultCode = 0;
for (int i = 0; i < binStr.length(); i++) {
if (binStr.charAt(i) == '1') {
faultCode = 15 - i;
break;
}
}
faultReason = YKCPileFaultReasonEnum.getValueByCode(faultCode);
// log.info("故障码:{}, 故障原因:{}", faultCode, faultReason);
}
realTimeMonitorData.setHardwareFault(faultReason);
// String hardwareFault = highOrder + lowOrder;
byte[] hardwareFaultByteArr = BytesUtil.str2Bcd(highOrder + lowOrder);
String binStr = BytesUtil.bytes2BinStr(hardwareFaultByteArr);
// log.info("binStr:{}", binStr); // 0000 0000 0000 0001
int faultCode = 0;
for (int i = 0; i < binStr.length(); i++) {
if (binStr.charAt(i) == '1') {
faultCode = 15 - i;
break;
}
}
faultReason = YKCPileFaultReasonEnum.getValueByCode(faultCode);
}
realTimeMonitorData.setHardwareFault(faultReason);
// if (!StringUtils.equals(connectorStatus, "02")) {
if (!StringUtils.equals(connectorStatus, PileConnectorStatusEnum.FREE.getValue())) {
log.info("0x13上传实时监测数据==交易流水号:{}, 桩编号:{}, 枪口号:{}, 枪口状态:{}, 枪口状态描述:{}, 枪是否归位(00-否;01-是;02-未知):{}, 是否插枪(00-否;01-是):{}, 输出电压:{}, 输出电流:{}, 枪线温度:{}, " +
"枪线编码:{}, SOC:{}, 电池组最高温度:{}, 累计充电时间:{}, 剩余时间:{}, 充电度数:{}, 记损充电度数:{}, 已充金额:{}, " +
"硬件故障:{}, 故障码转换结果:{}", transactionCode, pileSn, connectorCode, connectorStatus, PileConnectorStatusEnum.getLabelByValue(connectorStatus), homingFlag, putGunType, outputVoltage,
outputCurrent, gunLineTemperature, gunLineCode, SOC, batteryMaxTemperature, sumChargingTime, timeRemaining,
chargingDegree, lossDegree, chargingAmount, hardwareFaultTemp, faultReason
);
}
if (!StringUtils.equals(connectorStatus, PileConnectorStatusEnum.FREE.getValue())) {
log.info("0x13上传实时监测数据==交易流水号:{}, 桩编号:{}, 枪口号:{}, 枪口状态:{}, 枪口状态描述:{}, 枪是否归位(00-否;01-是;02-未知):{}, 是否插枪(00-否;01-是):{}, 输出电压:{}, 输出电流:{}, 枪线温度:{}, " +
"枪线编码:{}, SOC:{}, 电池组最高温度:{}, 累计充电时间:{}, 剩余时间:{}, 充电度数:{}, 记损充电度数:{}, 已充金额:{}, " +
"硬件故障:{}, 故障码转换结果:{}", transactionCode, pileSn, connectorCode, connectorStatus, PileConnectorStatusEnum.getLabelByValue(connectorStatus), homingFlag, isChargerPluggedIn, outputVoltage,
outputCurrent, gunLineTemperature, gunLineCode, SOC, batteryMaxTemperature, sumChargingTime, timeRemaining,
chargingDegree, lossDegree, chargingAmount, hardwareFaultTemp, faultReason
);
}
// 公共方法修改状态
pileBasicInfoService.updateStatus(BytesUtil.bcd2Str(ykcDataProtocol.getFrameType()), pileSn, connectorCode, connectorStatus, putGunType);
// 插枪状态
String plugRedisKey = CacheConstants.CHARGER_PLUGGED_IN_STATUS + pileConnectorCode;
if (StringUtils.equals("01", isChargerPluggedIn)) {
// 插枪状态
if (redisCache.setnx(plugRedisKey, pileConnectorCode, CacheConstants.cache_expire_time_30d)) {
log.info("时间:{}, 枪口号:{}, 首次插入充电枪", DateUtils.getDateTime(), pileConnectorCode);
// 设置成功说明 第一次插枪
pileBasicInfoService.firstPlugInCharger(pileConnectorCode);
}
} else {
// 未插枪状态
if (redisCache.hasKey(plugRedisKey) && redisCache.deleteObject(plugRedisKey)) {
log.info("时间:{}, 枪口号:{}, 首次拔出充电枪", DateUtils.getDateTime(), pileConnectorCode);
// redis有值并且删除成功说明首次拔枪
pileBasicInfoService.firstUnplugCharger(pileConnectorCode);
}
}
// 01表示故障
if (StringUtils.equals(connectorStatus, PileConnectorStatusEnum.FAULT.getValue())) {
// 故障原因存入缓存
String redisKey = CacheConstants.PILE_HARDWARE_FAULT + pileSn + connectorCode;
redisCache.setCacheObject(redisKey, faultReason, 5, TimeUnit.MINUTES);
}
// 公共方法修改状态
pileBasicInfoService.updateStatus(BytesUtil.bcd2Str(ykcDataProtocol.getFrameType()), pileSn, connectorCode, connectorStatus, isChargerPluggedIn);
// 03表示充电中
if (StringUtils.equals(connectorStatus, PileConnectorStatusEnum.OCCUPIED_CHARGING.getValue())) {
// 默认保存到redis
boolean saveRedisFlag = true;
// 01表示故障
if (StringUtils.equals(connectorStatus, PileConnectorStatusEnum.FAULT.getValue())) {
// 故障原因存入缓存
String redisKey = CacheConstants.PILE_HARDWARE_FAULT + pileConnectorCode;
redisCache.setCacheObject(redisKey, faultReason, 5, TimeUnit.MINUTES);
}
// 查询数据库中该订单当前信息
OrderBasicInfo orderInfo = orderBasicInfoService.getOrderInfoByTransactionCode(transactionCode);
if (Objects.nonNull(orderInfo)) {
if (StringUtils.equals(orderInfo.getOrderStatus(), OrderStatusEnum.ORDER_COMPLETE.getValue())
|| StringUtils.equals(orderInfo.getOrderStatus(), OrderStatusEnum.STAY_SETTLEMENT.getValue())) {
// 在订单状态为 订单完成或待结算,不保存
saveRedisFlag = false;
}
// 03表示充电中
if (StringUtils.equals(connectorStatus, PileConnectorStatusEnum.OCCUPIED_CHARGING.getValue())) {
// 默认保存到redis
boolean saveRedisFlag = true;
boolean updateFlag = false;
if (StringUtils.equals(orderInfo.getOrderStatus(), OrderStatusEnum.NOT_START.getValue())
|| StringUtils.equals(orderInfo.getOrderStatus(), OrderStatusEnum.ABNORMAL.getValue())
|| StringUtils.equals(orderInfo.getOrderStatus(), OrderStatusEnum.STAY_SETTLEMENT.getValue())) {
updateFlag = true;
// 如果是未启动状态或者异常状态, 修改这个订单状态为充电中 2023年7月7日新增 如果是待结算状态,也改为充电中
orderInfo.setOrderStatus(OrderStatusEnum.IN_THE_CHARGING.getValue());
}
// 查询数据库中该订单当前信息
OrderBasicInfo orderInfo = orderBasicInfoService.getOrderInfoByTransactionCode(transactionCode);
if (Objects.nonNull(orderInfo)) {
if (StringUtils.equals(orderInfo.getOrderStatus(), OrderStatusEnum.ORDER_COMPLETE.getValue())
|| StringUtils.equals(orderInfo.getOrderStatus(), OrderStatusEnum.STAY_SETTLEMENT.getValue())) {
// 在订单状态为 订单完成或待结算,不保存
saveRedisFlag = false;
}
// 如果原来没有开始充电时间就保存当前时间为开始充电时间
if (orderInfo.getChargeStartTime() == null) {
updateFlag = true;
orderInfo.setChargeStartTime(new Date());
}
boolean updateFlag = false;
if (StringUtils.equals(orderInfo.getOrderStatus(), OrderStatusEnum.NOT_START.getValue())
|| StringUtils.equals(orderInfo.getOrderStatus(), OrderStatusEnum.ABNORMAL.getValue())
|| StringUtils.equals(orderInfo.getOrderStatus(), OrderStatusEnum.STAY_SETTLEMENT.getValue())) {
updateFlag = true;
// 如果是未启动状态或者异常状态, 修改这个订单状态为充电中 2023年7月7日新增 如果是待结算状态,也改为充电中
orderInfo.setOrderStatus(OrderStatusEnum.IN_THE_CHARGING.getValue());
}
if (updateFlag) {
orderBasicInfoService.updateOrderBasicInfo(orderInfo);
}
}
// 如果原来没有开始充电时间就保存当前时间为开始充电时间
if (orderInfo.getChargeStartTime() == null) {
updateFlag = true;
orderInfo.setChargeStartTime(new Date());
}
// 充电时保存实时数据到redis
if (saveRedisFlag) {
pileBasicInfoService.saveRealTimeMonitorData2Redis(realTimeMonitorData);
}
}
if (updateFlag) {
orderBasicInfoService.updateOrderBasicInfo(orderInfo);
}
}
// 异步推送第三方平台实时数据
CompletableFuture.runAsync(() -> {
try {
commonService.pushRealTimeInfo(pileSn, connectorCode, connectorStatus, realTimeMonitorData, transactionCode);
} catch (Exception e) {
log.error("统一推送第三方平台实时数据 error, ", e);
}
});
// 充电时保存实时数据到redis
if (saveRedisFlag) {
pileBasicInfoService.saveRealTimeMonitorData2Redis(realTimeMonitorData);
}
}
// 异步推送第三方平台实时数据V2
CompletableFuture.runAsync(() -> {
try {
commonService.pushRealTimeInfoV2(pileSn, connectorCode, connectorStatus, realTimeMonitorData, transactionCode);
} catch (Exception e) {
log.error("统一推送第三方平台实时数据V2 error, ", e);
}
});
// 异步推送第三方平台实时数据
CompletableFuture.runAsync(() -> {
try {
commonService.pushRealTimeInfo(pileSn, connectorCode, connectorStatus, realTimeMonitorData, transactionCode);
} catch (Exception e) {
log.error("统一推送第三方平台实时数据 error, ", e);
}
});
return null;
}
// 异步推送第三方平台实时数据V2
CompletableFuture.runAsync(() -> {
try {
commonService.pushRealTimeInfoV2(pileSn, connectorCode, connectorStatus, realTimeMonitorData, transactionCode);
} catch (Exception e) {
log.error("统一推送第三方平台实时数据V2 error, ", e);
}
});
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("0100");
String lowOrder = sb.substring(0, 2);
String highOrder = sb.substring(2, 4);
return null;
}
// String hardwareFault = highOrder + lowOrder;
byte[] hardwareFaultByteArr = BytesUtil.str2Bcd(highOrder + lowOrder);
String binStr = BytesUtil.bytes2BinStr(hardwareFaultByteArr);
// log.info("binStr:{}", binStr); // 0000 0000 0000 0001
int faultCode = 0;
for (int i = 0; i < binStr.length(); i++) {
if (binStr.charAt(i) == '1') {
faultCode = 16 - i;
break;
}
}
String faultReason = YKCPileFaultReasonEnum.getValueByCode(faultCode);
System.out.println(faultReason);
}
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("0100");
String lowOrder = sb.substring(0, 2);
String highOrder = sb.substring(2, 4);
// String hardwareFault = highOrder + lowOrder;
byte[] hardwareFaultByteArr = BytesUtil.str2Bcd(highOrder + lowOrder);
String binStr = BytesUtil.bytes2BinStr(hardwareFaultByteArr);
// log.info("binStr:{}", binStr); // 0000 0000 0000 0001
int faultCode = 0;
for (int i = 0; i < binStr.length(); i++) {
if (binStr.charAt(i) == '1') {
faultCode = 16 - i;
break;
}
}
String faultReason = YKCPileFaultReasonEnum.getValueByCode(faultCode);
System.out.println(faultReason);
}
}