2021与蓝度共同重构项目,服务端
zhanzhiqin
2022-08-26 d08aab9abf24fd6319a2d54d9c252745f111f275
ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3ChargingService.java
@@ -1,6 +1,5 @@
package com.sandu.ximon.admin.service;
import cn.hutool.core.collection.ListUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.sandu.common.domain.CommonPage;
@@ -30,6 +29,7 @@
import com.sandu.ximon.dao.enums.OrderStatus;
import com.sandu.ximon.dao.mapper.C3mChargingMapper;
import lombok.AllArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -47,7 +47,7 @@
@Slf4j
@AllArgsConstructor
public class C3ChargingService extends BaseServiceImpl<C3mChargingMapper, C3mCharging> {
    private C3mChargingMapper c3mChargingMapper;
    private final C3mChargingMapper c3mChargingMapper;
    private final C3mChargingChargeService c3mChargingChargeService;
    private final PoleBindingService bindingService;
    private final PoleService poleService;
@@ -74,6 +74,7 @@
     *
     * @return 是否成功
     */
    @SneakyThrows
    public boolean saveReporEquipment(String deviceName, String mcuUdid, String c3Mac) {
        C3mCharging one = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getMcuUdid, mcuUdid));
        boolean flag;
@@ -96,23 +97,28 @@
        String date = new SimpleDateFormat("yyMMddHHmmss").format(new Date());
        String s = SetCalendar(c3Mac, Integer.parseInt(date.substring(0, 2)), Integer.parseInt(date.substring(2, 4)),
                Integer.parseInt(date.substring(4, 6)), Integer.parseInt(date.substring(6, 8)),
                Integer.parseInt(date.substring(8, 10)), Integer.parseInt(date.substring(10, 12)));
                Integer.parseInt(date.substring(8, 10)), Integer.parseInt(date.substring(10, 12)), true);
        if (!"操作成功".equals(s)) {
            LogUtils.error("发送设置C3时间同步失败!");
            return false;
        }
        System.out.println("同步时间戳结束");
        Thread.sleep(1000);
        //设置费率
        System.out.println("设置费率开始");
        C3mCharging c3mCharging1 = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getMcuUdid, mcuUdid));
        List<C3mChargingCharge> list = c3mChargingChargeService.list(Wrappers.lambdaQuery(C3mChargingCharge.class).eq(C3mChargingCharge::getC3Id, c3mCharging1.getC3Id()));
        if (list.size() == 0) {//费率表中没有此充电桩数据时  添加默认费率
        if (list == null && list.size() == 0) {//费率表中没有此充电桩数据时  添加默认费率
            c3mChargingChargeService.initCharge((c3mCharging1.getC3Id()).intValue());
        }
        String rateState = setRate(c3Mac, list);
        String rateState = setRate(c3Mac, list, true);
        System.out.println("设置费率结果:" + rateState);
        System.out.println("设置费率结束");
        Thread.sleep(1000);
        /**  跳包时间同步
         * 设置时间规则:充电时为1倍,非充电状态为1.5倍时间
@@ -121,18 +127,19 @@
        Set<String> keys = RedisUtils.getBean().keys(C3mRedisConstant.C3_STATUS.getCode() + "*");
        C3mRedisConfig.reFlushTime(keys.size());
        String time1 = SetHeartbeatPacketTimeCharging(c3Mac, C3mRedisConfig.parseInt(C3mRedisConfig.HEART_BEAT_TIME) * 2, false);
        String time1 = SetHeartbeatPacketTimeCharging(c3Mac, C3mRedisConfig.parseInt(C3mRedisConfig.HEART_BEAT_TIME) * 2, false, true);
        LogUtils.error("C3空闲心跳包时间同步响应结果:" + time1);
        String time2 = SetHeartbeatPacketTimeCharging(c3Mac, C3mRedisConfig.parseInt(C3mRedisConfig.HEART_BEAT_TIME), true);
        String time2 = SetHeartbeatPacketTimeCharging(c3Mac, C3mRedisConfig.parseInt(C3mRedisConfig.HEART_BEAT_TIME), true, true);
        LogUtils.error("C3充电时心跳包时间同步响应结果:" + time2);
        System.out.println("设置心跳包间隔时间结束");
        Thread.sleep(1000);
        /**
         * 获取心跳包,判断在线
         */
        System.out.println("获取心跳包开始");
        A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage aPackage = ReadTheHeartbeatPackage(c3Mac);
        A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage aPackage = ReadTheHeartbeatPackage(c3Mac, true);
        if (aPackage == null) {
            LogUtils.error("读取心跳包为空");
            return false;
@@ -144,12 +151,19 @@
                C3mRedisConfig.OUTLINE_TIME
        );
        System.out.println("获取心跳包结束");
        Thread.sleep(1000);
        /**
         * 是否有进行中的个订单
         */
        SpringContextHolder.getBean(C3mOrderService.class).stopCharingOrder( aPackage);
        /**
         * finally、同步结束
         */
        System.out.println("同步结束  开始");
        String end = EndOfTheSynchronization(c3Mac);
        String end = EndOfTheSynchronization(c3Mac, true);
        if (!"操作成功".equals(end)) {
            LogUtils.error("C3同步结束响应结果" + end);
            return false;
@@ -214,6 +228,8 @@
        int faultNumber = 0;
        //等待接入数量
        int waitConnectNumber = 0;
        //充电中数量
        int chargingNumber = 0;
        for (C3ChargingBo one : c3ChargingBoList) {
            String s = RedisUtils.getBean().get(C3mRedisConstant.C3_STATUS.getCode() + one.getC3Mac());
@@ -228,6 +244,7 @@
                            break;
                        //2.充电中
                        case 2:
                            chargingNumber++;
                            onlineNumber = onlineNumber + 1;
                            break;
                        //3.充电中断,等待服务器确认
@@ -269,6 +286,7 @@
        map.put("offlineNumber", offlineNumber);
        map.put("faultNumber", faultNumber);
        map.put("waitConnectNumber", waitConnectNumber);
        map.put("chargingNumber", chargingNumber);
        return map;
    }
@@ -311,13 +329,13 @@
        if (one == null) {
            throw new BusinessException("充电桩信息不存在!");
        }
        A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage beatDataPackage = ReadTheHeartbeatPackage(one.getC3Mac());
        A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage beatDataPackage = ReadTheHeartbeatPackage(one.getC3Mac(), false);
        if (beatDataPackage != null) {
            //充电桩ID
            chargingDto.setC3Id(one.getC3Id());
            //C3Mac
            chargingDto.setC3Mac(one.getC3Mac());
            //在线状态
            //在线状态 1.空闲 2.充电中 3.充电中断,等待服务器确认 4.充电结束,等待服务器确认 5.有故障 6.与充电桩对接中
            chargingDto.setStatusBit(Integer.valueOf(beatDataPackage.getStatusBit()));
            //电压
            chargingDto.setGridVoltage(beatDataPackage.getGridVoltage());
@@ -329,6 +347,10 @@
            chargingDto.setPoleId(pole.getId());
            //费率
            BigDecimal bigDecimal = SpringContextHolder.getBean(C3mChargingChargeService.class).getchargeDecimalByC3id(one.getC3Id());
            //已充电量
            chargingDto.setChargedCapacity(beatDataPackage.getChargedCapacity());
            //充电时长
            chargingDto.setAlreadyChargingTime(beatDataPackage.getAlreadyChargingTime());
            chargingDto.setRate(bigDecimal);
        }
@@ -442,7 +464,7 @@
        if (order == null) {
            throw new BusinessException("充电桩没有进行中的订单");
        }
        if (!openId.equals(order.getOrderId())) {
        if (!openId.equals(order.getUserCode())) {
            throw new BusinessException("不能操作不属于您的订单");
        }
@@ -491,8 +513,9 @@
     * 同步结束
     *
     * @param c3Mac
     * @param resendFlag 重发标志
     */
    public String EndOfTheSynchronization(String c3Mac) {
    public String EndOfTheSynchronization(String c3Mac, boolean resendFlag) {
        C3EndOfTheSynchronizationReqInnerFrame c3EndOfTheSynchronizationReqInnerFrame =
                new C3EndOfTheSynchronizationReqInnerFrame(c3Mac);
@@ -503,7 +526,12 @@
        if (c3mCharging == null) {
            throw new BusinessException("C3充电桩硬件mcu_udid不存在");
        }
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame);
        CommonFrame commonFrame;
        if (resendFlag) {
            commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame, true);
        } else {
            commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame);
        }
        StoreOperationRecordsUtils.storeInnerFrameData(c3Mac, "C3帧-同步结束", a5Frame, commonFrame);
@@ -706,8 +734,9 @@
     * 读心跳包
     *
     * @param c3Mac
     * @param resendFlag 重发标志
     */
    public A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage ReadTheHeartbeatPackage(String c3Mac) {
    public A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage ReadTheHeartbeatPackage(String c3Mac, boolean resendFlag) {
        C3ReadTheHeartbeatPackageReqInnerFrame readTheHeartbeatPackageReqInnerFrame =
                new C3ReadTheHeartbeatPackageReqInnerFrame(c3Mac);
@@ -718,7 +747,12 @@
        if (c3mCharging == null) {
            throw new BusinessException("C3充电桩硬件mcu_udid不存在");
        }
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame);
        CommonFrame commonFrame;
        if (resendFlag) {
            commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame, true);
        } else {
            commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame);
        }
        StoreOperationRecordsUtils.storeInnerFrameData(c3Mac, "C3帧-读取心跳包", a5Frame, commonFrame);
@@ -737,9 +771,10 @@
     *
     * @param c3Mac
     * @param setTime
     * @param resndFlag 重发标志
     * @return
     */
    public String SetHeartbeatPacketTimeCharging(String c3Mac, int setTime, boolean flag) {
    public String SetHeartbeatPacketTimeCharging(String c3Mac, int setTime, boolean flag, boolean resndFlag) {
        if (setTime <= 0) {
            throw new BusinessException("设置的心跳包间隔时间错误!");
        }
@@ -753,7 +788,12 @@
        if (c3mCharging == null) {
            throw new BusinessException("C3充电桩硬件mcu_udid不存在");
        }
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame);
        CommonFrame commonFrame;
        if (resndFlag) {
            commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame, true);
        } else {
            commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame);
        }
        StoreOperationRecordsUtils.storeInnerFrameData(c3Mac, "C3帧-设置心跳包间隔时间", a5Frame, commonFrame);
@@ -853,9 +893,10 @@
     * 设置日历(同心跳包中的6字节日期时间)
     *
     * @param c3Mac
     * @param resendFlag 是否需要重发标志
     * @return
     */
    public String SetCalendar(String c3Mac, int year, int month, int day, int hour, int min, int sec) {
    public String SetCalendar(String c3Mac, int year, int month, int day, int hour, int min, int sec, boolean resendFlag) {
        C3SetCalendarReqInnerFrame setCalendarReqInnerFrame =
@@ -868,7 +909,14 @@
        if (c3mCharging == null) {
            throw new BusinessException("C3充电桩硬件mcu_udid不存在");
        }
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame);
        CommonFrame commonFrame;
        if (resendFlag) {
            //需要重发
            commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame, true);
        } else {
            //不需要重发
            commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame);
        }
        StoreOperationRecordsUtils.storeInnerFrameData(c3Mac, "C3帧-设置日历", a5Frame, commonFrame);
        System.out.println(commonFrame + "            -----commonFrame");
@@ -888,7 +936,7 @@
     * @param list
     * @return
     */
    public String setRate(String c3Mac, List<C3mChargingCharge> list) {
    public String setRate(String c3Mac, List<C3mChargingCharge> list, boolean resendFlag) {
        if (StringUtil.strIsNullOrEmpty(c3Mac)) {
            throw new BusinessException("C3Mac地址不能为空!");
        }
@@ -903,7 +951,12 @@
        if (c3mCharging == null) {
            throw new BusinessException("C3充电桩硬件mcu_udid不存在");
        }
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame);
        CommonFrame commonFrame;
        if (resendFlag) {
            commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame, true);
        } else {
            commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame);
        }
        StoreOperationRecordsUtils.storeInnerFrameData(c3Mac, "C3帧-设置费率", a5Frame, commonFrame);
        System.out.println(commonFrame + "            -----commonFrame");