package com.sandu.ximon.admin.manager.iot.amqp.processor; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.sandu.common.util.SpringContextHolder; import com.sandu.ximon.admin.manager.iot.frame.inner.report.A5C3CommonReportInnerFrame; import com.sandu.ximon.admin.manager.iot.frame.inner.report.A5C3ErrorCodeReportInnerFrame; import com.sandu.ximon.admin.manager.iot.frame.inner.report.A5C3HeartbeatReportInnerFrame; import com.sandu.ximon.admin.manager.iot.frame.inner.report.A5C3OperationReportInnerFrame; import com.sandu.ximon.admin.manager.iot.rrpc.dto.CommonFrame; import com.sandu.ximon.admin.manager.iot.rrpc.enums.C3ChargingEnum; import com.sandu.ximon.admin.manager.iot.rrpc.enums.C3mRedisConstant; import com.sandu.ximon.admin.service.*; import com.sandu.ximon.admin.utils.LogUtils; import com.sandu.ximon.admin.utils.RedisUtils; import com.sandu.ximon.dao.domain.C3mOrder; import com.sandu.ximon.dao.domain.Pole; import com.sandu.ximon.dao.enums.OrderStatus; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import java.math.BigDecimal; /** * @author ZZQ * @date 2022/3/11 16:24 */ @Slf4j public class c3ChargingProcessor implements IMessageProcessor { @Autowired private C3ChargingService c3ChargingService; @Autowired private PoleBindingService bindingService; @Autowired private PoleService poleService; @Autowired private C3mOrderService orderService; public c3ChargingProcessor() { } public static c3ChargingProcessor c3ChargingProcessorgetInstance() { return c3ChargingProcessor.C3ChargingProcessorHolder.INSTANCE; } private static class C3ChargingProcessorHolder { private static final c3ChargingProcessor INSTANCE = new c3ChargingProcessor(); } @Override public void process(String productKey, String deviceName, CommonFrame frame) { String functionCode = frame.getPayload().substring(2, 4); if (C3ChargingEnum.NETWORK_REQUEST.getCode().equals(functionCode)) { A5C3CommonReportInnerFrame netRequestFrame = new A5C3CommonReportInnerFrame().transformFrame(frame.getPayload()); log.info("C3充电桩上报处理_netRequestFrame"); log.info(netRequestFrame.toString()); if (netRequestFrame.isValidate()) { //保存充电桩硬件信息 boolean b = SpringContextHolder.getBean(C3ChargingService.class).saveReporEquipment(deviceName, netRequestFrame.getMcuUdid(), netRequestFrame.getDestinationAddress()); //检查是否有正在进行的订单,有的话继续充电 SpringContextHolder.getBean(C3mOrderService.class).recoverContinueCharing(netRequestFrame.getDestinationAddress(), netRequestFrame.getMcuUdid()); if (!b) { return; } } } else if (C3ChargingEnum.QR_CODE_REQUEST.getCode().equals(functionCode)) { // 网页操作二维码请求(41) A5C3CommonReportInnerFrame codeRequestFrame = new A5C3CommonReportInnerFrame().transformFrame(frame.getPayload()); log.info("C3充电桩上报处理_codeRequestFrame"); log.info(codeRequestFrame.toString()); if (codeRequestFrame.isValidate()) { if (deviceName != null) { // C3mCharging c3mCharging = SpringContextHolder.getBean(C3ChargingService.class). // getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getC3Mac, codeRequestFrame.getDestinationAddress()).last("limit 1")); // if (c3mCharging == null) { // SpringContextHolder.getBean(C3ChargingService.class).saveReporEquipment(deviceName, codeRequestFrame.getMcuUdid(), codeRequestFrame.getDestinationAddress()); // } //设置二维码 Pole pole = SpringContextHolder.getBean(PoleService.class).getOne(Wrappers.lambdaQuery(Pole.class).eq(Pole::getDeviceCode, deviceName)); if (pole != null) { String testUrl = "http://www.ximonsmart.com/charge/#/charge/" + pole.getId() + "/" + System.currentTimeMillis(); SpringContextHolder.getBean(C3ChargingService.class).QrCode(codeRequestFrame.getDestinationAddress(), testUrl); } } } } else if (C3ChargingEnum.HEART_BEAT.getCode().equals(functionCode)) { log.info("心跳相应——C3充电桩数据" + productKey + " ------- " + deviceName); A5C3HeartbeatReportInnerFrame heartbeatReportInnerFrame = new A5C3HeartbeatReportInnerFrame().transformFrame(frame.getPayload()); log.info("C3充电桩上报处理_heartbeatReportInnerFrame"); log.info(heartbeatReportInnerFrame.toString()); if (heartbeatReportInnerFrame.isValidate()) { SpringContextHolder.getBean(C3ChargingService.class).updateReportState(deviceName , heartbeatReportInnerFrame.getHeartBeatDataPackage().getC3Mac() , heartbeatReportInnerFrame.getHeartBeatDataPackage().getStatusBit() , heartbeatReportInnerFrame.getHeartBeatDataPackage().getDeviceTemperature()); //更新订单数据 SpringContextHolder.getBean(C3mOrderService.class).updateOrderStatusByHeartbeat(heartbeatReportInnerFrame.getHeartBeatDataPackage()); //存缓存 RedisUtils.getBean().set(C3mRedisConstant.C3_STATUS.getCode() + heartbeatReportInnerFrame.getHeartBeatDataPackage().getC3Mac() , heartbeatReportInnerFrame.getHeartBeatDataPackage(), 300L); } } else if (C3ChargingEnum.CHARGE_COMPLETE.getCode().equals(functionCode)) { A5C3CommonReportInnerFrame completeRequestFrame = new A5C3CommonReportInnerFrame().transformFrame(frame.getPayload()); log.info("C3充电桩上报处理_completeRequestFrame"); log.info(completeRequestFrame.toString()); // 充电结束上报(43) /** * 读取心跳包,判断剩余金额和已充电量,统计到缓存中正在进行的订单。 */ A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage aPackage = c3ChargingService.ReadTheHeartbeatPackage(completeRequestFrame.getDestinationAddress()); if (aPackage == null) { LogUtils.error("{ 充电桩(" + completeRequestFrame.getDestinationAddress() + ")充电结束上报读取心跳包失败,请检查充电桩是否出现故障! }"); return; } orderProcess(aPackage); } else if (C3ChargingEnum.CHARGE_STOP.getCode().equals(functionCode)) { log.info("心跳响应——充电中断"); A5C3CommonReportInnerFrame stopRequestFrame = new A5C3CommonReportInnerFrame().transformFrame(frame.getPayload()); log.info("C3充电桩上报处理_stopRequestFrame"); log.info(stopRequestFrame.toString()); } else if (C3ChargingEnum.ERROR_CODE.getCode().equals(functionCode)) { log.info("心跳响应——故障"); A5C3ErrorCodeReportInnerFrame errorCodeRequestFrame = new A5C3ErrorCodeReportInnerFrame().transformFrame(frame.getPayload()); log.info("C3充电桩上报处理_errorCodeRequestFrame"); log.info(errorCodeRequestFrame.toString()); /** * 保存C3充电桩故障数据 */ if (errorCodeRequestFrame.isValidate() && errorCodeRequestFrame.getErrorMessage() != null) { SpringContextHolder.getBean(C3mReportErrorService.class).saveReportError(errorCodeRequestFrame); } else { System.out.println("数据校验异常!"); } } else if (C3ChargingEnum.StartCharging.getCode().equals(functionCode)) { log.info("心跳响应——C3充电桩开始充电"); A5C3OperationReportInnerFrame operationReportInnerFrame = new A5C3OperationReportInnerFrame().transformFrame(frame.getPayload()); log.info("C3充电桩上报处理_heartbeatReportInnerFrame"); log.info(operationReportInnerFrame.toString()); } } /** * 订单处理 * * @param aPackage */ private void orderProcess(A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage aPackage) { String c3Mac = aPackage.getC3Mac(); //结束充电 更改订单状态 C3mOrder lastOrderByC3Mac = SpringContextHolder.getBean(C3mOrderService.class).getLastOrderByC3Mac(c3Mac); if (lastOrderByC3Mac != null) { //设置订单状态为已完成 lastOrderByC3Mac.setOrderStatus(OrderStatus.COMPLETE.getStatus()); BigDecimal actualChargingCapacity = BigDecimal.valueOf(lastOrderByC3Mac.getActualChargingCapacity()); BigDecimal actualChargingCapacityHide = BigDecimal.valueOf(lastOrderByC3Mac.getActualChargingCapacityHide()); //设置实际充电电量 lastOrderByC3Mac.setActualChargingCapacity(actualChargingCapacity.add(actualChargingCapacityHide).doubleValue()); //设置订单结束时间 lastOrderByC3Mac.setStopChargingTimestamp(System.currentTimeMillis()); lastOrderByC3Mac.setActualChargingCapacity(0.00); //设置订单状态为充电结束 lastOrderByC3Mac.setChargingStates(1); //设置剩余金额 lastOrderByC3Mac.setSurplusAmount(Double.parseDouble(aPackage.getRemainingAmount())); //设置退款金额 lastOrderByC3Mac.setRefundAmount(Double.parseDouble(aPackage.getRemainingAmount())); //充电时长 lastOrderByC3Mac.setAlreadyChargingTime(aPackage.getAlreadyChargingTime()); SpringContextHolder.getBean(C3mOrderService.class).updateById(lastOrderByC3Mac); } } }