2021与蓝度共同重构项目,服务端
liuhaonan
2022-08-26 c86ed59bbb89f1a83425a380735a2c788e45d054
Merge remote-tracking branch 'origin/master'
已修改6个文件
213 ■■■■ 文件已修改
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/C3ChargingController.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/processor/c3ChargingProcessor.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/BaseInvokeSyncService.java 106 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/topic/ICustomizeTopic.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3ChargingService.java 74 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3mChargingChargeService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/C3ChargingController.java
@@ -82,7 +82,7 @@
     */
    @PostMapping("/EndOfTheSynchronization")
    public ResponseVO<Object> EndOfTheSynchronization(@RequestBody C3ChargingParam c3ChargingParam) {
        String result = c3ChargingService.EndOfTheSynchronization(c3ChargingParam.getC3Mac());
        String result = c3ChargingService.EndOfTheSynchronization(c3ChargingParam.getC3Mac(), false);
        if ("操作成功".equals(result)) {
            return ResponseUtil.success(result);
@@ -159,7 +159,7 @@
     */
    @PostMapping("/ReadTheHeartbeatPackage")
    public ResponseVO<Object> ReadTheHeartbeatPackage(@RequestBody C3ChargingParam c3ChargingParam) {
        return ResponseUtil.success(c3ChargingService.ReadTheHeartbeatPackage(c3ChargingParam.getC3Mac()));
        return ResponseUtil.success(c3ChargingService.ReadTheHeartbeatPackage(c3ChargingParam.getC3Mac(), false));
    }
    /**
@@ -168,7 +168,7 @@
    @PostMapping("/SetHeartbeatPacketTimeCharging")
    public ResponseVO<Object> SetHeartbeatPacketTimeCharging(@RequestBody @Validated C3ChargingParam c3ChargingParam) {
        return ResponseUtil.success(c3ChargingService.SetHeartbeatPacketTimeCharging(c3ChargingParam.getC3Mac(), c3ChargingParam.getTime(), true));
        return ResponseUtil.success(c3ChargingService.SetHeartbeatPacketTimeCharging(c3ChargingParam.getC3Mac(), c3ChargingParam.getTime(), true, false));
    }
    /**
@@ -177,7 +177,7 @@
    @PostMapping("/SetHeartbeatPacketTimeNotCharging")
    public ResponseVO<Object> SetHeartbeatPacketTimeNotCharging(@RequestBody @Validated C3ChargingParam c3ChargingParam) {
        return ResponseUtil.success(c3ChargingService.SetHeartbeatPacketTimeCharging(c3ChargingParam.getC3Mac(), c3ChargingParam.getTime(), false));
        return ResponseUtil.success(c3ChargingService.SetHeartbeatPacketTimeCharging(c3ChargingParam.getC3Mac(), c3ChargingParam.getTime(), false, false));
    }
    /**
@@ -205,7 +205,8 @@
    public ResponseVO<Object> SetCalendar(@RequestBody @Validated C3ChargingParam c3ChargingParam) {
        return ResponseUtil.success(c3ChargingService.SetCalendar(c3ChargingParam.getC3Mac()
                , c3ChargingParam.getYear(), c3ChargingParam.getMonth(), c3ChargingParam.getDay(), c3ChargingParam.getHour(), c3ChargingParam.getMin(), c3ChargingParam.getSec()));
                , c3ChargingParam.getYear(), c3ChargingParam.getMonth(), c3ChargingParam.getDay()
                , c3ChargingParam.getHour(), c3ChargingParam.getMin(), c3ChargingParam.getSec(), false));
    }
    /**
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/processor/c3ChargingProcessor.java
@@ -59,10 +59,10 @@
                //保存充电桩硬件信息
                boolean b = SpringContextHolder.getBean(C3ChargingService.class).saveReporEquipment(deviceName, netRequestFrame.getMcuUdid(), netRequestFrame.getDestinationAddress());
                //检查是否有正在进行的订单,有的话继续充电
                SpringContextHolder.getBean(C3mOrderService.class).recoverContinueCharing(netRequestFrame.getDestinationAddress(), netRequestFrame.getMcuUdid());
                if (!b) {
                    return;
                }
//                SpringContextHolder.getBean(C3mOrderService.class).recoverContinueCharing(netRequestFrame.getDestinationAddress(), netRequestFrame.getMcuUdid());
//                if (!b) {
//                    return;
//                }
            }
        } else if (C3ChargingEnum.QR_CODE_REQUEST.getCode().equals(functionCode)) {
            //  网页操作二维码请求(41)
@@ -112,7 +112,7 @@
            /**
             * 读取心跳包,判断剩余金额和已充电量,统计到缓存中正在进行的订单。
             */
            A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage aPackage = c3ChargingService.ReadTheHeartbeatPackage(completeRequestFrame.getDestinationAddress());
            A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage aPackage = c3ChargingService.ReadTheHeartbeatPackage(completeRequestFrame.getDestinationAddress(), true);
            if (aPackage == null) {
                LogUtils.error("{ 充电桩(" + completeRequestFrame.getDestinationAddress() + ")充电结束上报读取心跳包失败,请检查充电桩是否出现故障! }");
                return;
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/BaseInvokeSyncService.java
@@ -35,7 +35,7 @@
     * @param clz           内部帧响应实体类 如果不想自己解析 可带上
     * @return 返回的解码帧实体类 同时把内部帧解码之后也携带上
     */
    public <T extends BaseResponseInnerFrame<T>> WrapResponseCommonFrame<T> sendRRPC(String deviceName, IRequestFrame iRequestFrame, Class<T> clz){
    public <T extends BaseResponseInnerFrame<T>> WrapResponseCommonFrame<T> sendRRPC(String deviceName, IRequestFrame iRequestFrame, Class<T> clz) {
        CommonFrame commonFrame = sendRRPC(deviceName, iRequestFrame);
        if (commonFrame == null) {
            return null;
@@ -55,7 +55,23 @@
        InvokeParam param = new InvokeParam();
        param.setOperate("1001");
        param.setFrame(iRequestFrame.getEncodeFrame());
        InvokeThingServiceResponse.Data data = invokeThing(deviceName, param);
        InvokeThingServiceResponse.Data data = invokeThing(deviceName, param, false);
        if (data == null) {
            return null;
        }
        String result = data.getResult();
        result = result.replace("\\", "");
        Map map = JSON.parseObject(result, Map.class);
        result = (String) map.get("msg");
        return FrameUtils.transformMessageToFrame(result);
    }
    @Override
    public CommonFrame sendRRPC(String deviceName, IRequestFrame iRequestFrame, boolean resendFlag) {
        InvokeParam param = new InvokeParam();
        param.setOperate("1001");
        param.setFrame(iRequestFrame.getEncodeFrame());
        InvokeThingServiceResponse.Data data = invokeThing(deviceName, param, true);
        if (data == null) {
            return null;
        }
@@ -152,7 +168,7 @@
        return null;
    }
     /**
    /**
     * 调用自定义topic
     * https://help.aliyun.com/document_detail/69584.htm?spm=a2c4g.11186623.0.0.25b33982bSQSom#reference-snk-mrz-wdb
     *
@@ -160,36 +176,84 @@
     * @param param      参数
     * @return 设备返回的结果
     */
    protected InvokeThingServiceResponse.Data invokeThing(String deviceName, InvokeParam param) {
    protected InvokeThingServiceResponse.Data invokeThing(String deviceName, InvokeParam param, boolean resendFlag) {
        // 填充服务调用的参数
        InvokeThingServiceRequest request = new InvokeThingServiceRequest();
        // 设备证书之productKey
        request.setProductKey(getProductKey());
        // 设备证书之deviceName
        request.setDeviceName(deviceName);
        request.setSysReadTimeout(5000);
        // 要调用的服务标识符,取决于服务端定义 目前rrpc标识代表同步调用
        request.setIdentifier("rrpc");
        request.setArgs(JSON.toJSONString(param));
        // 获得服务调用响应
        InvokeThingServiceResponse response = null;
        try {
            response = getClient().getAcsResponse(request);
        } catch (ClientException e) {
            e.printStackTrace();
            throw new BusinessException("硬件请求失败,请检查硬件设备!");
        if (resendFlag) {
            return getAcsResponse(request, true, 1);
        } else {
            return getAcsResponse(request, false, null);
        }
        if (response == null) {
            throw new BusinessException("调用rrpc失败,响应为空!");
    }
    /**
     * 获得服务调用响应
     *
     * @param request
     * @return
     */
    private InvokeThingServiceResponse.Data getAcsResponse(InvokeThingServiceRequest request, boolean resendFlag, Integer time) {
        if (resendFlag) {
            //需要重发
            if (time <= 2) {
                InvokeThingServiceResponse response = null;
                try {
                    response = getClient().getAcsResponse(request);
                    if (response == null) {
                        log.error("调用rrpc失败,响应为空!");
                        return getAcsResponse(request, true, time + 1);
                    }
                    if (!response.getSuccess()) {
                        log.error("调用rrpc失败," + response.getErrorMessage());
                        return getAcsResponse(request, true, time + 1);
                    } else {
                        // 服务调用成功,仅代表发送服务指令的成功,不代表执行服务本身是否成功
                        return response.getData();
                    }
                } catch (Exception e) {
                    return getAcsResponse(request, true, time + 1);
//                throw new BusinessException("错误信息:" + e.getMessage());
                }
            } else {
                throw new BusinessException("硬件请求失败,请检查硬件设备!");
            }
        } else {
            //不需要重发
            InvokeThingServiceResponse response = null;
            try {
                response = getClient().getAcsResponse(request);
            } catch (ClientException e) {
                e.printStackTrace();
                throw new BusinessException("硬件请求失败,请检查硬件设备!");
            }
            if (response == null) {
                throw new BusinessException("调用rrpc失败,响应为空!");
            }
            if (!response.getSuccess()) {
                throw new BusinessException("调用rrpc失败," + response.getErrorMessage());
            }
            // 服务调用成功,仅代表发送服务指令的成功,不代表执行服务本身是否成功
            if (response.getSuccess()) {
                // 仅同步服务有result
                return response.getData();
            }
            return null;
        }
        if (!response.getSuccess()) {
            throw new BusinessException("调用rrpc失败," + response.getErrorMessage());
        }
        // 服务调用成功,仅代表发送服务指令的成功,不代表执行服务本身是否成功
        if (response.getSuccess()) {
            // 仅同步服务有result
            return response.getData();
        }
        return null;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/topic/ICustomizeTopic.java
@@ -30,4 +30,14 @@
     */
    CommonFrame sendRRPC(String deviceName, IRequestFrame iRequestFrame);
    /**
     * 发送rrpc 请求
     *
     * @param deviceName    设备名
     * @param iRequestFrame 编码帧
     * @param resendFlag    重发标志
     * @return 返回的解码帧实体类
     */
    CommonFrame sendRRPC(String deviceName, IRequestFrame iRequestFrame, boolean resendFlag);
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3ChargingService.java
@@ -29,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;
@@ -73,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;
@@ -95,12 +97,14 @@
        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("设置费率开始");
@@ -109,9 +113,12 @@
        if (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倍时间
@@ -120,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;
@@ -143,12 +151,13 @@
                C3mRedisConfig.OUTLINE_TIME
        );
        System.out.println("获取心跳包结束");
        Thread.sleep(1000);
        /**
         * finally、同步结束
         */
        System.out.println("同步结束  开始");
        String end = EndOfTheSynchronization(c3Mac);
        String end = EndOfTheSynchronization(c3Mac, true);
        if (!"操作成功".equals(end)) {
            LogUtils.error("C3同步结束响应结果" + end);
            return false;
@@ -314,7 +323,7 @@
        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());
@@ -498,8 +507,9 @@
     * 同步结束
     *
     * @param c3Mac
     * @param resendFlag 重发标志
     */
    public String EndOfTheSynchronization(String c3Mac) {
    public String EndOfTheSynchronization(String c3Mac, boolean resendFlag) {
        C3EndOfTheSynchronizationReqInnerFrame c3EndOfTheSynchronizationReqInnerFrame =
                new C3EndOfTheSynchronizationReqInnerFrame(c3Mac);
@@ -510,7 +520,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);
@@ -713,8 +728,9 @@
     * 读心跳包
     *
     * @param c3Mac
     * @param resendFlag 重发标志
     */
    public A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage ReadTheHeartbeatPackage(String c3Mac) {
    public A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage ReadTheHeartbeatPackage(String c3Mac, boolean resendFlag) {
        C3ReadTheHeartbeatPackageReqInnerFrame readTheHeartbeatPackageReqInnerFrame =
                new C3ReadTheHeartbeatPackageReqInnerFrame(c3Mac);
@@ -725,7 +741,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);
@@ -744,9 +765,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("设置的心跳包间隔时间错误!");
        }
@@ -760,7 +782,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);
@@ -860,9 +887,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 =
@@ -875,7 +903,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");
@@ -895,7 +930,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地址不能为空!");
        }
@@ -910,7 +945,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");
ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3mChargingChargeService.java
@@ -59,7 +59,7 @@
        if (byId == null) {
            throw new BusinessException("c3Id不存在");
        }
        String s = chargingService.setRate(byId.getC3Mac(), chargeEntities);
        String s = chargingService.setRate(byId.getC3Mac(), chargeEntities,false);
        if (!"操作成功".equals(s)) {
            throw new BusinessException("设置失败,失败原因: " + s);
        }