Pārlūkot izejas kodu

feat:
1、OTA升级接入任务中心,支持记录OTA执行状态

lihao16 5 mēneši atpakaļ
vecāks
revīzija
ebbcc94f8a

+ 1 - 1
smsb-modules/smsb-device/src/main/java/com/inspur/device/domain/SmsbOtaRecord.java

@@ -67,7 +67,7 @@ public class SmsbOtaRecord {
     private String versionName;
 
     /**
-     * 升级状态 0-待升级 1-升级中 2-已升级
+     * 升级状态 0-待升级 1-升级中 2-已升级 3-升级失败
      */
     private Integer otaStatus;
 

+ 4 - 2
smsb-modules/smsb-device/src/main/java/com/inspur/device/domain/constants/DeviceConstants.java

@@ -25,10 +25,12 @@ public class DeviceConstants {
     public static final Integer DEVICE_ERROR_LEVEL_URGENT = 2;
 
     /** 待升级 */
-    public static final Integer DEVICE_OTA_STATUS_1 = 1;
+    public static final Integer DEVICE_OTA_STATUS_0 = 0;
     /** 升级中 */
-    public static final Integer DEVICE_OTA_STATUS_2 = 2;
+    public static final Integer DEVICE_OTA_STATUS_1 = 1;
     /** 升级成功 */
+    public static final Integer DEVICE_OTA_STATUS_2 = 2;
+    /** 升级失败 */
     public static final Integer DEVICE_OTA_STATUS_3 = 3;
     /** 设备删除 未删除 */
     public static final Integer DEVICE_DEL_FLAG_NO = 0;

+ 3 - 0
smsb-modules/smsb-device/src/main/java/com/inspur/device/domain/constants/DeviceTaskConstants.java

@@ -67,6 +67,9 @@ public class DeviceTaskConstants {
     /** 开始播放 */
     public static final Integer DEVICE_TASK_STATUS_BEGIN_PLAY = 2106;
 
+    /** 任务失败 */
+    public static final Integer DEVICE_TASK_STATUS_FAIL = 2998;
+
     /** 任务完成 */
     public static final Integer DEVICE_TASK_STATUS_END = 2999;
     /** 设备任务状态 end */

+ 8 - 0
smsb-modules/smsb-device/src/main/java/com/inspur/device/service/ISmsbOtaRecordService.java

@@ -1,5 +1,6 @@
 package com.inspur.device.service;
 
+import com.inspur.device.domain.SmsbDeviceTask;
 import com.inspur.device.domain.bo.SmsbOtaRecordBo;
 import com.inspur.device.domain.vo.SmsbOtaRecordVo;
 import org.dromara.common.core.domain.R;
@@ -74,4 +75,11 @@ public interface ISmsbOtaRecordService {
      * @return 是否检查成功
      */
     R<SmsbOtaRecordVo> deviceCheckOta(String identifier);
+
+    /**
+     * 更新设备OTA状态
+     * @param smsbDeviceTask
+     * @param taskStatus
+     */
+    void updateOtaStatus(SmsbDeviceTask smsbDeviceTask, Integer taskStatus);
 }

+ 1 - 1
smsb-modules/smsb-device/src/main/java/com/inspur/device/service/impl/SmsbDeviceTaskServiceImpl.java

@@ -89,7 +89,7 @@ public class SmsbDeviceTaskServiceImpl implements ISmsbDeviceTaskService {
         deviceTaskDetail.setTenantId(smsbDeviceTask.getTenantId());
         smsbDeviceTaskDetailMapper.insert(deviceTaskDetail);
         // 任务执行完成,更新任务主表为完成
-        if (taskStatus.equals(DeviceTaskConstants.DEVICE_TASK_STATUS_END)) {
+        if (taskStatus.equals(DeviceTaskConstants.DEVICE_TASK_STATUS_END) || taskStatus.equals(DeviceTaskConstants.DEVICE_TASK_STATUS_FAIL)) {
             smsbDeviceTask.setIsEnd(1);
             baseMapper.updateById(smsbDeviceTask);
         }

+ 24 - 1
smsb-modules/smsb-device/src/main/java/com/inspur/device/service/impl/SmsbOtaRecordServiceImpl.java

@@ -4,9 +4,11 @@ import cn.hutool.core.collection.CollectionUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.inspur.device.domain.SmsbDeviceTask;
 import com.inspur.device.domain.SmsbOtaRecord;
 import com.inspur.device.domain.bo.SmsbOtaRecordBo;
 import com.inspur.device.domain.constants.DeviceConstants;
+import com.inspur.device.domain.constants.DeviceTaskConstants;
 import com.inspur.device.domain.constants.ResultCodeEnum;
 import com.inspur.device.domain.vo.SmsbDeviceVo;
 import com.inspur.device.domain.vo.SmsbOtaPackageVo;
@@ -125,7 +127,7 @@ public class SmsbOtaRecordServiceImpl implements ISmsbOtaRecordService {
             add.setFileSize(Math.toIntExact(smsbOtaPackageVo.getFileSize()));
             add.setVersionCode(smsbOtaPackageVo.getVersionCode());
             add.setVersionName(smsbOtaPackageVo.getVersionName());
-            add.setOtaStatus(DeviceConstants.DEVICE_OTA_STATUS_1);
+            add.setOtaStatus(DeviceConstants.DEVICE_OTA_STATUS_0);
             add.setCreateUser(LoginHelper.getLoginUser().getUsername());
             add.setIsDel(DeviceConstants.DEVICE_DEL_FLAG_NO);
             add.setDeviceId(deviceId);
@@ -183,4 +185,25 @@ public class SmsbOtaRecordServiceImpl implements ISmsbOtaRecordService {
             .eq(SmsbOtaRecord::getDeviceId, smsbDeviceVo.getId()).orderByDesc(SmsbOtaRecord::getCreateTime).last("limit 1"));
         return R.ok(smsbOtaRecord);
     }
+
+    @Override
+    public void updateOtaStatus(SmsbDeviceTask smsbDeviceTask, Integer taskStatus) {
+        Long deviceId = smsbDeviceTask.getDeviceId();
+        SmsbOtaRecordVo smsbOtaRecordVo = baseMapper.selectVoOne(new LambdaQueryWrapper<SmsbOtaRecord>()
+            .eq(SmsbOtaRecord::getDeviceId, deviceId).orderByDesc(SmsbOtaRecord::getCreateTime).last("limit 1"));
+        if (null == smsbOtaRecordVo) {
+            return;
+        }
+        Long recordId = smsbOtaRecordVo.getId();
+        SmsbOtaRecord update = new SmsbOtaRecord();
+        update.setId(recordId);
+        if (taskStatus.equals(DeviceTaskConstants.DEVICE_TASK_STATUS_FAIL)) {
+            update.setOtaStatus(DeviceConstants.DEVICE_OTA_STATUS_3);
+            baseMapper.updateById(update);
+        }
+        if (taskStatus.equals(DeviceTaskConstants.DEVICE_TASK_STATUS_END)) {
+            update.setOtaStatus(DeviceConstants.DEVICE_OTA_STATUS_2);
+            baseMapper.updateById(update);
+        }
+    }
 }

+ 80 - 0
smsb-modules/smsb-netty/src/main/java/com/inspur/netty/handler/TaskOtaHandler.java

@@ -0,0 +1,80 @@
+package com.inspur.netty.handler;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.inspur.device.domain.SmsbDeviceTask;
+import com.inspur.device.domain.SmsbDeviceTaskDetail;
+import com.inspur.device.domain.SmsbOtaRecord;
+import com.inspur.device.domain.constants.DeviceConstants;
+import com.inspur.device.domain.constants.DeviceTaskConstants;
+import com.inspur.device.domain.vo.SmsbDeviceTaskVo;
+import com.inspur.device.domain.vo.SmsbDeviceVo;
+import com.inspur.device.domain.vo.SmsbOtaRecordVo;
+import com.inspur.device.mapper.SmsbDeviceTaskDetailMapper;
+import com.inspur.device.mapper.SmsbDeviceTaskMapper;
+import com.inspur.device.mapper.SmsbOtaRecordMapper;
+import com.inspur.device.service.ISmsbDeviceService;
+import com.inspur.device.service.impl.SmsbDeviceServiceImpl;
+import com.inspur.netty.message.receive.ReceiveMessageType;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelInboundHandlerAdapter;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.utils.SpringUtils;
+
+/**
+ * 音量设置回复
+ *
+ * @author lihao16
+ */
+@Slf4j
+public class TaskOtaHandler extends ChannelInboundHandlerAdapter {
+
+    private static final ISmsbDeviceService smsbDeviceService = SpringUtils.getBean(SmsbDeviceServiceImpl.class);
+
+    private static final SmsbDeviceTaskMapper smsbDeviceTaskMapper = SpringUtils.getBean(SmsbDeviceTaskMapper.class);
+
+    private static final SmsbDeviceTaskDetailMapper smsbDeviceTaskDetailMapper = SpringUtils.getBean(SmsbDeviceTaskDetailMapper.class);
+
+    private static final SmsbOtaRecordMapper smsbOtaRecordMapper = SpringUtils.getBean(SmsbOtaRecordMapper.class);
+
+    @Override
+    public void channelRead(ChannelHandlerContext ctx, Object msg) {
+        String message = (String) msg;
+        // 处理OTA reply消息
+        if (message.contains(ReceiveMessageType.DEVICE_CHECK_OTA_REPLAY.getValue())) {
+            log.info("收到设备OTA升级回复消息:{}", message);
+            String identifier = message.split("/")[0];
+            // 1、 查询当前设备最近一条OTA任务
+            SmsbDeviceVo smsbDeviceVo = smsbDeviceService.getDeviceByIdentifier(identifier);
+            if (null == smsbDeviceVo) {
+                log.error("未查询到设备信息:{}", identifier);
+                return;
+            }
+            LambdaQueryWrapper<SmsbDeviceTask> lqw = Wrappers.lambdaQuery();
+            lqw.eq(SmsbDeviceTask::getIdentifier, identifier);
+            lqw.eq(SmsbDeviceTask::getTaskType, DeviceTaskConstants.DEVICE_TASK_OTA);
+            lqw.orderByDesc(SmsbDeviceTask::getCreateTime);
+            lqw.last("limit 1");
+            SmsbDeviceTaskVo smsbDeviceTask = smsbDeviceTaskMapper.selectVoOne(lqw);
+            if (null == smsbDeviceTask) {
+                log.error("未查询到设备OTA任务:{}", identifier);
+                return;
+            }
+            // 2、收到回复 认定接收任务
+            SmsbDeviceTaskDetail taskDetail = new SmsbDeviceTaskDetail();
+            taskDetail.setTaskId(smsbDeviceTask.getId());
+            taskDetail.setTaskStatus(DeviceTaskConstants.DEVICE_TASK_STATUS_INIT);
+            taskDetail.setTenantId(smsbDeviceVo.getTenantId());
+            smsbDeviceTaskDetailMapper.insert(taskDetail);
+            // 3、修改OTA记录为正在升级
+            SmsbOtaRecordVo smsbOtaRecordVo = smsbOtaRecordMapper.selectVoOne(new LambdaQueryWrapper<SmsbOtaRecord>()
+                .eq(SmsbOtaRecord::getDeviceId, smsbDeviceVo.getId()).orderByDesc(SmsbOtaRecord::getCreateTime).last("limit 1"));
+            SmsbOtaRecord update = new SmsbOtaRecord();
+            update.setId(smsbOtaRecordVo.getId());
+            update.setOtaStatus(DeviceConstants.DEVICE_OTA_STATUS_1);
+        } else {
+            ctx.fireChannelRead(message);
+        }
+    }
+
+}

+ 1 - 1
smsb-modules/smsb-netty/src/main/java/com/inspur/netty/message/receive/ReceiveMessageType.java

@@ -55,7 +55,7 @@ public enum ReceiveMessageType {
 
     /**
      * 检查OTA 消息回复
-     * {identifier}/ota/check/replay/{OTAId}/{status}
+     * {identifier}/ota/check/replay
      */
     DEVICE_CHECK_OTA_REPLAY("/ota/check/replay"),
 

+ 1 - 0
smsb-modules/smsb-netty/src/main/java/com/inspur/netty/server/NettyServer.java

@@ -67,6 +67,7 @@ public class NettyServer {
                             channel.pipeline().addLast(new TaskStreamStartHandler());
                             channel.pipeline().addLast(new TaskStreamStopHandler());
                             channel.pipeline().addLast(new TaskPlayControlHandler());
+                            channel.pipeline().addLast(new TaskOtaHandler());
                         }
                     });
             ChannelFuture f = b.bind(8990).sync();

+ 4 - 0
smsb-modules/smsb-source/src/main/java/com/inspur/source/controller/SmsbFrontController.java

@@ -166,6 +166,10 @@ public class SmsbFrontController {
             && smsbDeviceTask.getTaskType().equals(DeviceTaskConstants.DEVICE_TASK_PLAY_LINE_UPDATE)) {
             smsbItemPushDeviceService.updateDevicePushStatus(3,smsbDeviceTask);
         }
+        // 任务类型为OTA升级
+        if (smsbDeviceTask.getTaskType().equals(DeviceTaskConstants.DEVICE_TASK_OTA)) {
+            iSmsbOtaRecordService.updateOtaStatus(smsbDeviceTask,taskStatus);
+        }
         return smsbDeviceTaskService.uploadTaskStatus(taskId,taskStatus,smsbDeviceTask);
     }