2021与蓝度共同重构项目,服务端
zhanzhiqin
2022-09-08 1213ddfaad5fbc7a51741b4f8612855866327487
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/processor/c3ChargingProcessor.java
@@ -1,9 +1,7 @@
package com.sandu.ximon.admin.manager.iot.amqp.processor;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.sandu.common.util.SpringContextHolder;
import com.sandu.ximon.admin.config.RedisConfig;
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;
@@ -11,23 +9,17 @@
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.C3ChargingService;
import com.sandu.ximon.admin.service.C3mOrderService;
import com.sandu.ximon.admin.service.PoleBindingService;
import com.sandu.ximon.admin.service.PoleService;
import com.sandu.ximon.admin.service.*;
import com.sandu.ximon.admin.utils.LogUtils;
import com.sandu.ximon.admin.utils.RedisUtils;
import com.sandu.ximon.admin.vo.C3mOrderVO;
import com.sandu.ximon.dao.domain.C3mCharging;
import com.sandu.ximon.dao.domain.C3mOrder;
import com.sandu.ximon.dao.domain.Pole;
import com.sandu.ximon.dao.domain.PoleBinding;
import com.sandu.ximon.dao.enums.OrderStatus;
import com.sandu.ximon.dao.enums.OrderType;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.Date;
import java.math.BigDecimal;
/**
 * @author ZZQ
@@ -58,6 +50,13 @@
    @Override
    public void process(String productKey, String deviceName, CommonFrame frame) {
        //TODO
        if (!"32313243305005ffad36ffff".equals(deviceName)) {
            log.info("不要处理0000048E之外的充电桩!");
            return;
        }
        String functionCode = frame.getPayload().substring(2, 4);
        if (C3ChargingEnum.NETWORK_REQUEST.getCode().equals(functionCode)) {
            A5C3CommonReportInnerFrame netRequestFrame = new A5C3CommonReportInnerFrame().transformFrame(frame.getPayload());
@@ -66,10 +65,8 @@
            if (netRequestFrame.isValidate()) {
                //保存充电桩硬件信息
                boolean b = SpringContextHolder.getBean(C3ChargingService.class).saveReporEquipment(deviceName, netRequestFrame.getMcuUdid(), netRequestFrame.getDestinationAddress());
                if (!b) {
                    return;
                }
                SpringContextHolder.getBean(C3ChargingService.class)
                        .saveReporEquipment(deviceName, netRequestFrame.getMcuUdid(), netRequestFrame.getDestinationAddress());
            }
        } else if (C3ChargingEnum.QR_CODE_REQUEST.getCode().equals(functionCode)) {
            //  网页操作二维码请求(41)
@@ -99,7 +96,9 @@
                        , 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);
            }
@@ -111,112 +110,70 @@
            /**
             * 读取心跳包,判断剩余金额和已充电量,统计到缓存中正在进行的订单。
             */
            A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage aPackage = c3ChargingService.ReadTheHeartbeatPackage(completeRequestFrame.getDestinationAddress());
            if (aPackage == null) {
                LogUtils.error("{ 充电桩(" + completeRequestFrame.getDestinationAddress() + ")充电结束上报读取心跳包失败,请检查充电桩是否出现故障! }");
                return;
            if (completeRequestFrame != null) {
                C3mCharging one = SpringContextHolder.getBean(C3ChargingService.class).
                        getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getMcuUdid, completeRequestFrame.getMcuUdid()).last("limit 1"));
                if (one == null) {
                    return;
                }
                A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage aPackage = c3ChargingService.ReadTheHeartbeatPackage(one.getC3Id(), true);
                if (aPackage == null) {
                    LogUtils.error("{ 充电桩(" + completeRequestFrame.getDestinationAddress() + ")充电结束上报读取心跳包失败,请检查充电桩是否出现故障! }");
                    return;
                }
                orderService.stopCharingOrder(aPackage);
            }
            refund(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());
            A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage aPackage = c3ChargingService.ReadTheHeartbeatPackage(stopRequestFrame.getDestinationAddress());
            if (aPackage == null) {
                LogUtils.error("{ 充电桩(" + stopRequestFrame.getDestinationAddress() + ")充电结束上报读取心跳包失败,请检查充电桩是否出现故障! }");
                return;
            if (stopRequestFrame != null) {
                C3mCharging one = SpringContextHolder.getBean(C3ChargingService.class).
                        getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getMcuUdid, stopRequestFrame.getMcuUdid()).last("limit 1"));
                if (one == null) {
                    return;
                }
                /**
                 * 读取心跳包,判断剩余金额和已充电量,统计到缓存中正在进行的订单。
                 */
                A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage aPackage = c3ChargingService.ReadTheHeartbeatPackage(one.getC3Id(), true);
                if (aPackage == null) {
                    LogUtils.error("{ 充电桩(" + stopRequestFrame.getDestinationAddress() + ")充电结束上报读取心跳包失败,请检查充电桩是否出现故障! }");
                    return;
                }
                orderService.stopCharingOrder(aPackage);
            }
            refund(aPackage);
        } 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());
            A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage aPackage = c3ChargingService.ReadTheHeartbeatPackage(errorCodeRequestFrame.getDestinationAddress());
            if (aPackage == null) {
                LogUtils.error("{ 充电桩(" + errorCodeRequestFrame.getDestinationAddress() + ")充电结束上报读取心跳包失败,请检查充电桩是否出现故障! }");
                return;
            }
            refund(aPackage);
        } 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());
//            if (operationReportInnerFrame.isValidate()) {
//                SpringContextHolder.getBean(C3ChargingService.class).saveReportData(deviceName, operationReportInnerFrame.getHeartBeatDataPackage());
//            }
        }
    }
            /**
             * 保存C3充电桩故障数据
             */
            if (errorCodeRequestFrame.isValidate() && errorCodeRequestFrame.getErrorMessage() != null) {
                //保存故障信息
                SpringContextHolder.getBean(C3mReportErrorService.class).saveReportError(errorCodeRequestFrame);
//                //充电桩故障结束订单
//                A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage aPackage = c3ChargingService.ReadTheHeartbeatPackage(errorCodeRequestFrame.getDestinationAddress(), true);
//                if (aPackage == null) {
//                    LogUtils.error("{ 充电桩(" + errorCodeRequestFrame.getDestinationAddress() + ")故障上报读取心跳包失败,请检查充电桩是否出现故障! }");
//                    return;
//                }
//                orderService.stopCharingOrder(aPackage);
    private void refund(A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage aPackage) {
//    private void refund(A5C3CommonReportInnerFrame completeRequestFrame,String code){
        /**
         * 读取心跳包,判断剩余金额和已充电量,统计到缓存中正在进行的订单。
         */
        String c3Mac = aPackage.getC3Mac();
        //  获取心跳包中的剩余金额和已充电量,与缓存中正在进行的订单进行对比
        String chargingOrderJson = RedisUtils.getBean().get(C3mRedisConstant.C3_CHARGING_ORDER.getCode() + c3Mac);
        if (chargingOrderJson.isEmpty() || null == chargingOrderJson) {
            C3mCharging c3m = c3ChargingService.getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getC3Mac, c3Mac));
            PoleBinding binding = bindingService.getOne(Wrappers.lambdaQuery(PoleBinding.class)
                    .eq(PoleBinding::getDeviceCode, aPackage.getC3Mac())
                    .eq(PoleBinding::getDeviceType, 2));
            //  生成订单,并加载到redis缓存,设置超时时间为5分钟
            C3mOrder order = new C3mOrderVO().generateOrder(binding.getPoleId() == null ? 0L : binding.getPoleId()
                    , c3m.getPoleDevicesCode(), c3m.getC3Mac(), OrderType.ERROR, Double.valueOf(aPackage.getRemainingAmount()),
                    Integer.parseInt(new java.text.DecimalFormat("0").format(aPackage.getReservedCapacity()))
            );
            order.setActualChargingCapacity(Double.valueOf(aPackage.getChargedCapacity()));
            order.setOrderStatus(OrderStatus.REFUNDING.getStatus());
            order.setRefundAmount(Double.valueOf(aPackage.getRemainingAmount()));
            orderService.save(order);
            String s = c3ChargingService.finishCharging(c3Mac);
//            if(C3ChargingEnum.CHARGE_COMPLETE.getCode().equals(code)){
//
//            }
            //是否需要区分log类型 待定
            LogUtils.error("{ 充电桩(" + c3Mac + ")不存在正在进行的订单,请检查充电桩是否出现故障!结束订单,结果为" + s + "}");
        } else {
            C3mOrder c3mOrderEntity = JSON.parseObject(chargingOrderJson, C3mOrder.class);
            //  设置已充电量,订单状态,退款金额,订单退款时间戳,订单退款说明,结束充电时间戳,
            c3mOrderEntity.setActualChargingCapacity(Double.valueOf(aPackage.getChargedCapacity()));
            c3mOrderEntity.setOrderStatus(OrderStatus.REFUNDING.getStatus());
            c3mOrderEntity.setRefundAmount(Double.valueOf(aPackage.getRemainingAmount()));
            //  获取剩余金额进行退款,并写入当前正在进行的订单
            boolean b = orderService.orderRefund(c3mOrderEntity.getOutTradeNo(), c3mOrderEntity.getRefundAmount());
            c3mOrderEntity.setRefundTimestamp(new Date().getTime());
            if (b) {
                c3mOrderEntity.setOrderStatus(OrderStatus.REFUND.getStatus());
                c3mOrderEntity.setRefundMsg("充电结束,订单退款成功");
            } else {
                c3mOrderEntity.setOrderStatus(OrderStatus.REFUND_FAILED.getStatus());
                c3mOrderEntity.setRefundMsg(
                        "充电结束,订单退款失败,请进行手动退款(订单号(" +
                                c3mOrderEntity.getOutTradeNo() + "),总金额(" +
                                c3mOrderEntity.getTotalAmount() + ",退款金额(" +
                                aPackage.getRemainingAmount() + "))"
                );
                System.out.println("数据校验异常!");
            }
            c3mOrderEntity.setStopChargingTimestamp(new Date().getTime());
            orderService.updateById(c3mOrderEntity);
            //  清除缓存中正在进行中的订单
            b = RedisUtils.getBean().delete(C3mRedisConstant.C3_CHARGING_ORDER.getCode() + c3mOrderEntity.getC3Mac());
            if (!b) {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                RedisUtils.getBean().delete(C3mRedisConstant.C3_CHARGING_ORDER.getCode() + c3mOrderEntity.getC3Mac());
            }
            //  发送结束订单
            String s = c3ChargingService.finishCharging(c3Mac);
            LogUtils.error("{ 充电桩(" + c3Mac + ")不存在正在进行的订单,请检查充电桩是否出现故障!结束订单,结果为" + s + "}");
        }
    }
}