2021与蓝度共同重构项目,服务端
zhanzhiqin
2022-10-20 4e76b9737e036c18e8a9e840dc443615ffcec348
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/RemoteUpdateController.java
@@ -16,8 +16,13 @@
import com.sandu.ximon.admin.vo.RemoteUpgradeProgress;
import com.sandu.ximon.dao.enums.MenuEnum;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
/**
 * 固件升级Controller
@@ -86,40 +91,17 @@
        if (!permissionConfig.check(MenuEnum.REMOTE_UPDATE_START.getCode())) {
            return ResponseUtil.fail("缺少对应用户权限");
        }
        String orderType;
        boolean UpdateFlag = false;
        if (RemoteUpdateTypeEnum.MQTT_MAIN.equals(remotePrarm.getDeviceType())) {
            //MQTT主板
            orderType = A5OrderEnum.REQUEST_LIGHT_DATA.getCode();
        } else if (RemoteUpdateTypeEnum.MQTT_CORE.equals(remotePrarm.getDeviceType())) {
            //MQTT核心板
            orderType = A5OrderEnum.REQUEST_LIGHT_DATA.getCode();
        } else if (RemoteUpdateTypeEnum.LIGHT.equals(remotePrarm.getDeviceType())) {
            //单灯模块
            orderType = A5OrderEnum.REQUEST_LIGHT_DATA.getCode();
        } else if (RemoteUpdateTypeEnum.C3_CHARGING.equals(remotePrarm.getDeviceType())) {
            //C3充电桩模块
            orderType = A5OrderEnum.REQUEST_C3_DATA.getCode();
        } else if (RemoteUpdateTypeEnum.CAT1_MAIN.equals(remotePrarm.getDeviceType())) {
            //Cat.1主板
            orderType = A5OrderEnum.REQUEST_LIGHT_DATA.getCode();
        } else if (RemoteUpdateTypeEnum.LIGHT_POLE_HELING.equals(remotePrarm.getDeviceType())) {
            //灯杆倾斜模块
            orderType = A5OrderEnum.REQUEST_POLE_MONITOR_DATA.getCode();
        } else if (RemoteUpdateTypeEnum.AIR_EQUIPMENT.equals(remotePrarm.getDeviceType())) {
            //大气设备模块
            orderType = A5OrderEnum.REQUEST_ATMOSPHERE_DATA.getCode();
        } else {
            throw new BusinessException("升级硬件设备类型指令有误,请确认!");
        }
        String deviceType = remotePrarm.getDeviceType();
        String orderType = deviceType2OrderType(deviceType);
        boolean UpdateFlag = false;
        //启动远程升级命令
        boolean startRemoteUpdateFlag = remoteUpdateService.StartRemoteUpdate(orderType, remotePrarm.getMac(), remotePrarm.getHardwareVersion()
                , remotePrarm.getSoftwareVersion(), remotePrarm.getUpdateFlag());
        //存入升级进度
        RemoteUpgradeProgress progress = new RemoteUpgradeProgress();
        RedisUtils.getBean().set(remotePrarm.getDeviceType() + ":" + SecurityUtils.getUserId() + remotePrarm.getMac(), JSON.toJSON(progress));
        RedisUtils.getBean().set(deviceType + ":" + SecurityUtils.getUserId() + remotePrarm.getMac(), JSON.toJSON(progress));
        if (startRemoteUpdateFlag) {
            //服务器下发升级文件信息
@@ -134,7 +116,7 @@
                    remoteUpdateService.UpdateData(orderType, remotePrarm.getMac(), i, remoteFileDto.getList().get(i));
                    progress.setCurrentProgress(i + 1);
                    if (i != remoteFileDto.getList().size()) {
                        RedisUtils.getBean().set(remotePrarm.getDeviceType() + ":" + SecurityUtils.getUserId() + remotePrarm.getMac(), JSON.toJSON(progress));
                        RedisUtils.getBean().set(deviceType + ":" + SecurityUtils.getUserId() + remotePrarm.getMac(), JSON.toJSON(progress));
                    }
                }
@@ -142,7 +124,7 @@
                boolean searchLoseDataFlag = remoteUpdateService.SearchLoseData(orderType, remotePrarm.getMac(), remoteFileDto, 0);
                if (searchLoseDataFlag) {
                    //无漏包情况  更新最后进度为100%  否则最高卡在99%
                    RedisUtils.getBean().set(remotePrarm.getDeviceType() + ":" + SecurityUtils.getUserId() + remotePrarm.getMac(), JSON.toJSON(progress));
                    RedisUtils.getBean().set(deviceType + ":" + SecurityUtils.getUserId() + remotePrarm.getMac(), JSON.toJSON(progress));
                    //服务器下发结束升级帧
                    boolean finishUpdateFlag = remoteUpdateService.FinishUpdate(orderType, remotePrarm.getMac());
                    UpdateFlag = finishUpdateFlag;
@@ -150,7 +132,7 @@
            }
        }
        RedisUtils.getBean().delete(remotePrarm.getDeviceType() + ":" + SecurityUtils.getUserId() + remotePrarm.getMac());
        RedisUtils.getBean().delete(deviceType + ":" + SecurityUtils.getUserId() + remotePrarm.getMac());
        if (UpdateFlag) {
            return ResponseUtil.success("升级成功!");
        } else {
@@ -158,6 +140,33 @@
        }
    }
    @PostMapping("/getRemoteUpgradeProgress")
    public ResponseVO<Object> getRemoteUpgradeProgress(@RequestBody RemotePrarm remotePrarm) {
//        if (!permissionConfig.check(MenuEnum.REMOTE_UPDATE_START.getCode())) {
//            return ResponseUtil.fail("缺少对应用户权限");
//        }
        String deviceType = remotePrarm.getDeviceType();
        isDeviceType(deviceType);
        RemoteUpgradeProgress progress = new RemoteUpgradeProgress();
        String s = RedisUtils.getBean().get(deviceType + ":" + SecurityUtils.getUserId() + remotePrarm.getMac());
        if (s != null) {
            RemoteUpgradeProgress temp = JSON.parseObject(s, RemoteUpgradeProgress.class);
            BeanUtils.copyProperties(temp, progress);
        }
        Map map = new HashMap<>();
        if (progress.getTotalProgress() != 0) {
            //说明开始升级成功  存在非0进度
            BigDecimal divide = BigDecimal.valueOf(progress.getCurrentProgress()).divide(BigDecimal.valueOf(progress.getTotalProgress()), 2, BigDecimal.ROUND_HALF_UP);
            map.put("progress", divide);
            return ResponseUtil.success(map);
        } else {
            map.put("progress", BigDecimal.valueOf(0.0));
            return ResponseUtil.success(map);
        }
    }
    /**
     * 查询固件版本号
@@ -173,24 +182,7 @@
        if (remotePrarm.getMac() == null || remotePrarm.getDeviceType() == null) {
            throw new BusinessException("缺少相关参数!");
        }
        String orderType;
        switch (remotePrarm.getDeviceType()) {
            case "MQTT串口":
            case "CAT1":
                orderType = A5OrderEnum.REQUEST_LIGHT_DATA.getCode();
                break;
            case "大气":
                orderType = A5OrderEnum.REQUEST_ATMOSPHERE_DATA.getCode();
                break;
            case "C3充电桩":
                orderType = A5OrderEnum.REQUEST_C3_DATA.getCode();
                break;
            case "杆体倾斜":
                orderType = A5OrderEnum.REQUEST_POLE_MONITOR_DATA.getCode();
                break;
            default:
                throw new BusinessException("升级硬件设备类型指令有误,请确认!");
        }
        String orderType = deviceType2OrderType(remotePrarm.getDeviceType());
        //服务器下发升级结果查询
        String result = remoteUpdateService.SearchUpdateResult(orderType, remotePrarm.getMac());
@@ -211,24 +203,7 @@
        if (remotePrarm.getMac() == null || remotePrarm.getDeviceType() == null) {
            throw new BusinessException("缺少相关参数!");
        }
        String orderType;
        switch (remotePrarm.getDeviceType()) {
            case "MQTT串口":
            case "CAT1":
                orderType = A5OrderEnum.REQUEST_LIGHT_DATA.getCode();
                break;
            case "大气":
                orderType = A5OrderEnum.REQUEST_ATMOSPHERE_DATA.getCode();
                break;
            case "C3充电桩":
                orderType = A5OrderEnum.REQUEST_C3_DATA.getCode();
                break;
            case "杆体倾斜":
                orderType = A5OrderEnum.REQUEST_POLE_MONITOR_DATA.getCode();
                break;
            default:
                throw new BusinessException("升级硬件设备类型指令有误,请确认!");
        }
        String orderType = deviceType2OrderType(remotePrarm.getDeviceType());
        //服务器下发升级结果查询
        boolean flag = remoteUpdateService.stopUpdate(orderType, remotePrarm.getMac());
@@ -238,4 +213,66 @@
            return ResponseUtil.success("紧急结束升级失败");
        }
    }
    /**
     * 设备类型转指令类型
     *
     * @param deviceType
     * @return
     */
    private String deviceType2OrderType(String deviceType) {
        String orderType;
        if (RemoteUpdateTypeEnum.MQTT_MAIN.equals(deviceType)) {
            //MQTT主板
            orderType = A5OrderEnum.REQUEST_LIGHT_DATA.getCode();
        } else if (RemoteUpdateTypeEnum.MQTT_CORE.equals(deviceType)) {
            //MQTT核心板
            orderType = A5OrderEnum.REQUEST_LIGHT_DATA.getCode();
        } else if (RemoteUpdateTypeEnum.LIGHT.equals(deviceType)) {
            //单灯模块
            orderType = A5OrderEnum.REQUEST_LIGHT_DATA.getCode();
        } else if (RemoteUpdateTypeEnum.C3_CHARGING.equals(deviceType)) {
            //C3充电桩模块
            orderType = A5OrderEnum.REQUEST_C3_DATA.getCode();
        } else if (RemoteUpdateTypeEnum.CAT1_MAIN.equals(deviceType)) {
            //Cat.1主板
            orderType = A5OrderEnum.REQUEST_LIGHT_DATA.getCode();
        } else if (RemoteUpdateTypeEnum.LIGHT_POLE_HELING.equals(deviceType)) {
            //灯杆倾斜模块
            orderType = A5OrderEnum.REQUEST_POLE_MONITOR_DATA.getCode();
        } else if (RemoteUpdateTypeEnum.AIR_EQUIPMENT.equals(deviceType)) {
            //大气设备模块
            orderType = A5OrderEnum.REQUEST_ATMOSPHERE_DATA.getCode();
        } else {
            throw new BusinessException("升级硬件设备类型指令有误,请确认!");
        }
        return orderType;
    }
    /**
     * 是否为系统内的设备类型
     *
     * @param deviceType
     * @return
     */
    private boolean isDeviceType(String deviceType) {
        if (RemoteUpdateTypeEnum.MQTT_MAIN.equals(deviceType)) {
            //MQTT主板
        } else if (RemoteUpdateTypeEnum.MQTT_CORE.equals(deviceType)) {
            //MQTT核心板
        } else if (RemoteUpdateTypeEnum.LIGHT.equals(deviceType)) {
            //单灯模块
        } else if (RemoteUpdateTypeEnum.C3_CHARGING.equals(deviceType)) {
            //C3充电桩模块
        } else if (RemoteUpdateTypeEnum.CAT1_MAIN.equals(deviceType)) {
            //Cat.1主板
        } else if (RemoteUpdateTypeEnum.LIGHT_POLE_HELING.equals(deviceType)) {
            //灯杆倾斜模块
        } else if (RemoteUpdateTypeEnum.AIR_EQUIPMENT.equals(deviceType)) {
            //大气设备模块
        } else {
            throw new BusinessException("升级硬件设备类型指令有误,请确认!");
        }
        return true;
    }
}