Browse Source

feat: device run info

lihao16 7 months ago
parent
commit
91ef189252
19 changed files with 272 additions and 44 deletions
  1. 2 0
      smsb-modules/smsb-device/src/main/java/com/inspur/device/domain/SmsbDeviceRunInfo.java
  2. 2 5
      smsb-modules/smsb-device/src/main/java/com/inspur/device/domain/SmsbOtaRecord.java
  3. 3 1
      smsb-modules/smsb-device/src/main/java/com/inspur/device/domain/constants/ResultCodeEnum.java
  4. 8 0
      smsb-modules/smsb-device/src/main/java/com/inspur/device/service/ISmsbOtaRecordService.java
  5. 1 1
      smsb-modules/smsb-device/src/main/java/com/inspur/device/service/impl/SmsbDeviceServiceImpl.java
  6. 13 0
      smsb-modules/smsb-device/src/main/java/com/inspur/device/service/impl/SmsbOtaRecordServiceImpl.java
  7. 14 0
      smsb-modules/smsb-netty/src/main/java/com/inspur/netty/client/ClientAPIBody.java
  8. 8 0
      smsb-modules/smsb-netty/src/main/java/com/inspur/netty/client/NettyClientController.java
  9. 40 6
      smsb-modules/smsb-netty/src/main/java/com/inspur/netty/controller/DeviceController.java
  10. 64 0
      smsb-modules/smsb-netty/src/main/java/com/inspur/netty/handler/DeviceRunInfoHandler.java
  11. 46 0
      smsb-modules/smsb-netty/src/main/java/com/inspur/netty/handler/OTACheckReplayHandler.java
  12. 6 1
      smsb-modules/smsb-netty/src/main/java/com/inspur/netty/message/push/PushMessageType.java
  13. 12 6
      smsb-modules/smsb-netty/src/main/java/com/inspur/netty/message/receive/ReceiveMessageType.java
  14. 3 4
      smsb-modules/smsb-netty/src/main/java/com/inspur/netty/server/NettyServer.java
  15. 18 0
      smsb-modules/smsb-source/src/main/java/com/inspur/source/controller/SmsbFrontController.java
  16. 2 0
      smsb-modules/smsb-source/src/main/java/com/inspur/source/service/impl/SmsbItemPushServiceImpl.java
  17. 2 1
      smsb-plus-ui/src/api/smsb/device/otaRecord.ts
  18. 9 6
      smsb-plus-ui/src/views/smsb/itemReview/index.vue
  19. 19 13
      smsb-plus-ui/src/views/smsb/otaRecord/index.vue

+ 2 - 0
smsb-modules/smsb-device/src/main/java/com/inspur/device/domain/SmsbDeviceRunInfo.java

@@ -81,4 +81,6 @@ public class SmsbDeviceRunInfo {
     @TableField(fill = FieldFill.INSERT)
     private Date createTime;
 
+    private String tenantId;
+
 }

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

@@ -1,9 +1,6 @@
 package com.inspur.device.domain;
 
-import com.baomidou.mybatisplus.annotation.FieldFill;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import lombok.Data;
@@ -31,7 +28,7 @@ public class SmsbOtaRecord {
     /**
      * 主键ID
      */
-    @TableId(value = "id")
+    @TableId(value = "id", type = IdType.AUTO)
     private Long id;
 
     /**

+ 3 - 1
smsb-modules/smsb-device/src/main/java/com/inspur/device/domain/constants/ResultCodeEnum.java

@@ -36,7 +36,7 @@ public enum ResultCodeEnum {
     MEDIA_EMPTY_INVALID("1002", "data empty or not a valid json"),
     MEDIA_UNKNOWN_CP("1003", "unknown appId or appSecret"),
     MEDIA_UNKNOWN_COMMAND("1004", "unknown command"),
-    DEVICE_IDS_IS_NULL("1005","设备列表不能为空"),
+
     MEDIA_NOT_SET("2001", "data property not set"),
     MEDIA_IS_NULL("2002", "operate data is null"),
     MEDIA_ERROR("2003", "error"),
@@ -44,6 +44,8 @@ public enum ResultCodeEnum {
     REGION_CODE_DUPLICATED("2005", "地区码重复"),
     CHILD_NOT_DELETED("2006", "子结点未删除"),
     DEVICE_BOUND_EXIST("2007", "存在绑定的设备"),
+    DEVICE_IDS_IS_NULL("2008","设备列表不能为空"),
+    DEVICE_IDENTIFIER_NOT_EXIST("2009","identifier有误或者设备信息不存在"),
 
     API_SUCCESS("0", "请求成功"),
     API_NO_RESULT("1", "无响应数据"),

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

@@ -66,4 +66,12 @@ public interface ISmsbOtaRecordService {
      * @return 是否删除成功
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 设备检查升级
+     *
+     * @param identifier 设备标识
+     * @return 是否检查成功
+     */
+    R<SmsbOtaRecordVo> deviceCheckOta(String identifier);
 }

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

@@ -255,7 +255,7 @@ public class SmsbDeviceServiceImpl implements ISmsbDeviceService {
         SmsbDeviceRunInfoVo result = new SmsbDeviceRunInfoVo();
         // 设备运行详情
         SmsbDeviceRunInfoVo runInfoVo = smsbDeviceRunInfoMapper.selectVoOne(new LambdaQueryWrapper<SmsbDeviceRunInfo>()
-            .eq(SmsbDeviceRunInfo::getDeviceId, deviceId).orderByDesc(SmsbDeviceRunInfo::getCreateTime));
+            .eq(SmsbDeviceRunInfo::getDeviceId, deviceId).orderByDesc(SmsbDeviceRunInfo::getCreateTime).last(DeviceConstants.LIMIT_ONE));
         BeanUtil.copyProperties(runInfoVo, result);
         // 设备基础详情
         SmsbDeviceVo deviceVo = getDeviceCacheById(deviceId);

+ 13 - 0
smsb-modules/smsb-device/src/main/java/com/inspur/device/service/impl/SmsbOtaRecordServiceImpl.java

@@ -128,6 +128,7 @@ public class SmsbOtaRecordServiceImpl implements ISmsbOtaRecordService {
             SmsbDeviceVo smsbDeviceVo = smsbDeviceService.getDeviceCacheById(deviceId);
             add.setDeviceId(deviceId);
             add.setDeviceName(smsbDeviceVo.getName());
+            add.setId(null);
             addList.add(add);
         }
         baseMapper.insertBatch(addList);
@@ -168,4 +169,16 @@ public class SmsbOtaRecordServiceImpl implements ISmsbOtaRecordService {
         }
         return baseMapper.deleteByIds(ids) > 0;
     }
+
+    @Override
+    public R<SmsbOtaRecordVo> deviceCheckOta(String identifier) {
+        SmsbDeviceVo smsbDeviceVo = smsbDeviceService.getDeviceByIdentifier(identifier);
+        if (null == smsbDeviceVo) {
+            return R.fail(Integer.parseInt(ResultCodeEnum.DEVICE_IDENTIFIER_NOT_EXIST.getValue()), ResultCodeEnum.DEVICE_IDENTIFIER_NOT_EXIST.getMessage());
+        }
+        // 根据设备ID 查询最新的一个OTA记录
+        SmsbOtaRecordVo smsbOtaRecord = baseMapper.selectVoOne(new LambdaQueryWrapper<SmsbOtaRecord>()
+            .eq(SmsbOtaRecord::getDeviceId, smsbDeviceVo.getId()).orderByDesc(SmsbOtaRecord::getCreateTime));
+        return R.ok(smsbOtaRecord);
+    }
 }

+ 14 - 0
smsb-modules/smsb-netty/src/main/java/com/inspur/netty/client/ClientAPIBody.java

@@ -0,0 +1,14 @@
+package com.inspur.netty.client;
+
+import lombok.Data;
+
+/**
+ * 模拟client message API body
+ * @author lihao16
+ */
+@Data
+public class ClientAPIBody {
+
+    private String message;
+
+}

+ 8 - 0
smsb-modules/smsb-netty/src/main/java/com/inspur/netty/client/NettyClientController.java

@@ -46,6 +46,14 @@ public class NettyClientController {
         return R.ok();
     }
 
+    @SaIgnore
+    @PostMapping("/sendMessage")
+    public R<Void> sendMessage(@RequestBody ClientAPIBody bodyMessage)  {
+        String msg = bodyMessage.getMessage() + "####";
+        nettyClient.sendMessage(msg);
+        return R.ok();
+    }
+
     private void pushHeartMessage(String mac) {
         Runnable task = () -> {
             // 任务逻辑

+ 40 - 6
smsb-modules/smsb-netty/src/main/java/com/inspur/netty/controller/DeviceController.java

@@ -1,18 +1,24 @@
 package com.inspur.netty.controller;
 
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.inspur.device.domain.bo.SmsbOtaRecordBo;
 import com.inspur.device.domain.vo.SmsbDeviceVo;
-import com.inspur.device.mapper.SmsbDeviceMapper;
 import com.inspur.device.service.ISmsbDeviceService;
-import com.inspur.netty.message.push.PushMessage;
+import com.inspur.device.service.ISmsbOtaRecordService;
 import com.inspur.netty.message.push.PushMessageType;
 import com.inspur.netty.util.NettyConstants;
 import com.inspur.netty.util.PushMsgUtil;
+import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
 
 /**
  * netty device controller
@@ -21,11 +27,15 @@ import org.springframework.web.bind.annotation.RestController;
  */
 @RestController()
 @RequestMapping("/netty/device")
+@Slf4j
 public class DeviceController {
 
     @Autowired
     private ISmsbDeviceService smsbDeviceService;
 
+    @Autowired
+    private ISmsbOtaRecordService smsbOtaRecordService;
+
     /**
      * 重启设备
      *
@@ -102,4 +112,28 @@ public class DeviceController {
         return isSend ? R.ok() : R.fail("发送失败,设备长连接已断开");
     }
 
+    /**
+     * 新增发布升级
+     */
+    @SaCheckPermission("device:otaRecord:add")
+    @Log(title = "发布升级", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody SmsbOtaRecordBo bo) {
+        R<Void> addResult = smsbOtaRecordService.insertByBo(bo);
+        if (addResult.getCode() == 200) {
+            // 发送升级指令
+            List<Long> deviceIds = bo.getDeviceIds();
+            for (Long deviceId : deviceIds) {
+                SmsbDeviceVo deviceVo = smsbDeviceService.getDeviceCacheById(deviceId);
+                if (deviceVo != null) {
+                    String upgradeCmd = deviceVo.getIdentifier() + PushMessageType.DEVICE_CHECK_OTA.getValue() + NettyConstants.DATA_PACK_SEPARATOR;
+                    boolean isSend = PushMsgUtil.sendV2(deviceVo.getIdentifier(), upgradeCmd);
+                    log.info("发送设备 :{} 升级指令 : {}", deviceId, isSend);
+                }
+            }
+        }
+        return addResult;
+    }
+
 }

+ 64 - 0
smsb-modules/smsb-netty/src/main/java/com/inspur/netty/handler/DeviceRunInfoHandler.java

@@ -0,0 +1,64 @@
+package com.inspur.netty.handler;
+
+import com.inspur.device.domain.SmsbDeviceRunInfo;
+import com.inspur.device.domain.vo.SmsbDeviceVo;
+import com.inspur.device.mapper.SmsbDeviceRunInfoMapper;
+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 DeviceRunInfoHandler extends ChannelInboundHandlerAdapter {
+
+    private static final SmsbDeviceRunInfoMapper smsbDeviceRunInfoMapper = SpringUtils.getBean(SmsbDeviceRunInfoMapper.class);
+
+    private static final ISmsbDeviceService smsbDeviceService = SpringUtils.getBean(SmsbDeviceServiceImpl.class);
+
+    @Override
+    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
+        String message = (String) msg;
+
+        if (message.contains(ReceiveMessageType.DEVICE_RUN_INFO.getValue())) {
+            log.info("DeviceRunInfoHandler : receive device run info message :{}", message);
+            String[] messageArray = message.split("/");
+            String identifier = messageArray[0];
+            SmsbDeviceVo smsbDeviceVo = smsbDeviceService.getDeviceByIdentifier(identifier);
+            if (null == smsbDeviceVo) {
+                return;
+            }
+            SmsbDeviceRunInfo smsbDeviceRunInfo = new SmsbDeviceRunInfo();
+            buildSmsbDeviceRunInfo(smsbDeviceRunInfo, messageArray, smsbDeviceVo);
+            smsbDeviceRunInfoMapper.insert(smsbDeviceRunInfo);
+        } else {
+            ctx.fireChannelRead(message);
+        }
+    }
+
+    private void buildSmsbDeviceRunInfo(SmsbDeviceRunInfo smsbDeviceRunInfo, String[] messageArray, SmsbDeviceVo smsbDeviceVo) {
+        // {identifier}/device/run/info/{cpu}/{memory}/{disk}/{os}/{rom}/{apk}
+        String cpuInfo = messageArray[4];
+        String memoryInfo = messageArray[5];
+        String diskInfo = messageArray[6];
+        String osInfo = messageArray[7];
+        String romInfo = messageArray[8];
+        String apkInfo = messageArray[9];
+        smsbDeviceRunInfo.setCpuInfo(cpuInfo);
+        smsbDeviceRunInfo.setMemoryInfo(memoryInfo);
+        smsbDeviceRunInfo.setDiskInfo(diskInfo);
+        smsbDeviceRunInfo.setOsInfo(osInfo);
+        smsbDeviceRunInfo.setRom(romInfo);
+        smsbDeviceRunInfo.setApkVersion(apkInfo);
+        smsbDeviceRunInfo.setDeviceId(smsbDeviceVo.getId());
+        smsbDeviceRunInfo.setTenantId(smsbDeviceVo.getTenantId());
+    }
+
+}

+ 46 - 0
smsb-modules/smsb-netty/src/main/java/com/inspur/netty/handler/OTACheckReplayHandler.java

@@ -0,0 +1,46 @@
+package com.inspur.netty.handler;
+
+import com.inspur.device.domain.SmsbOtaRecord;
+import com.inspur.device.mapper.SmsbOtaRecordMapper;
+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;
+
+/**
+ * 设备OTA check replay handler
+ *
+ * @author lihao16
+ */
+@Slf4j
+public class OTACheckReplayHandler extends ChannelInboundHandlerAdapter {
+
+    private static final SmsbOtaRecordMapper smsbOtaRecordMapper = SpringUtils.getBean(SmsbOtaRecordMapper.class);
+
+
+    @Override
+    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
+        String message = (String) msg;
+        // 处理/ota/check/replay消息
+        if (message.contains(ReceiveMessageType.DEVICE_CHECK_OTA_REPLAY.getValue())) {
+            log.info("OTACheckReplayHandler : receive OTA check replay message :{}", message);
+            Long recordId = Long.valueOf(message.split("/")[4]);
+            Integer status = Integer.parseInt(message.split("/")[5]);
+            updateOTARecordStatus(recordId, status);
+            /*String heartbeatReplay = identifier + PushMessageType.CONTENT_DOWNLOAD_STATUS_REPLAY.getValue();
+            ByteBuf byteBuf = Unpooled.copiedBuffer(heartbeatReplay + NettyConstants.DATA_PACK_SEPARATOR, Charset.forName("utf-8"));
+            ctx.channel().writeAndFlush(byteBuf);*/
+
+        } else {
+            ctx.fireChannelRead(message);
+        }
+    }
+
+    private void updateOTARecordStatus(Long recordId, Integer status) {
+        SmsbOtaRecord smsbOtaRecord = new SmsbOtaRecord();
+        smsbOtaRecord.setId(recordId);
+        smsbOtaRecord.setOtaStatus(status);
+        smsbOtaRecordMapper.updateById(smsbOtaRecord);
+    }
+}

+ 6 - 1
smsb-modules/smsb-netty/src/main/java/com/inspur/netty/message/push/PushMessageType.java

@@ -64,7 +64,12 @@ public enum PushMessageType {
     /**
      * 停止推流
      */
-    CONTROL_STOP_STREAM("/stream/stop");
+    CONTROL_STOP_STREAM("/stream/stop"),
+
+    /**
+     * 检查OTA升级
+     */
+    DEVICE_CHECK_OTA("/ota/check");
 
     private String value;
 

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

@@ -4,26 +4,32 @@ public enum ReceiveMessageType {
 
     /**
      * init
-     * */
+     */
     INIT("init"),
 
 
     /**
      * heartbeat
-     * */
+     */
     HEARTBEAT("heartbeat"),
 
     /**
-     * 下发状态更新
+     * 检查OTA 消息回复
+     * {identifier}/ota/check/replay/{OTAId}/{status}
+     */
+    DEVICE_CHECK_OTA_REPLAY("/ota/check/replay"),
+
+    /**
+     * 内容下发状态更新
      * {identifier}/content/download/status/{pushId}/{status}
      */
     CONTENT_DOWNLOAD_STATUS("/content/download/status"),
 
-
     /**
-     * 设备状态上报
+     * 设备运行状态上报
+     * {identifier}/device/run/info/{cpu}/{memory}/{disk}/{os}/{rom}/{apk}
      */
-    SCREEN_TOPOLOGY("1001");
+    DEVICE_RUN_INFO("/device/run/info");
 
     private String value;
 

+ 3 - 4
smsb-modules/smsb-netty/src/main/java/com/inspur/netty/server/NettyServer.java

@@ -1,9 +1,6 @@
 package com.inspur.netty.server;
 
-import com.inspur.netty.handler.AuthServerHandler;
-import com.inspur.netty.handler.ConnectServerHandler;
-import com.inspur.netty.handler.ContentDownloadStatusHandler;
-import com.inspur.netty.handler.HeartServerHandler;
+import com.inspur.netty.handler.*;
 import io.netty.bootstrap.ServerBootstrap;
 import io.netty.channel.ChannelFuture;
 import io.netty.channel.ChannelInitializer;
@@ -60,6 +57,8 @@ public class NettyServer {
                             channel.pipeline().addLast(new AuthServerHandler());
                             channel.pipeline().addLast(new ConnectServerHandler());
                             channel.pipeline().addLast(new HeartServerHandler());
+                            channel.pipeline().addLast(new OTACheckReplayHandler());
+                            channel.pipeline().addLast(new DeviceRunInfoHandler());
                             channel.pipeline().addLast(new ContentDownloadStatusHandler());
                         }
                     });

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

@@ -1,12 +1,15 @@
 package com.inspur.source.controller;
 
 import cn.dev33.satoken.annotation.SaIgnore;
+import com.inspur.device.domain.vo.SmsbOtaRecordVo;
+import com.inspur.device.service.ISmsbOtaRecordService;
 import com.inspur.source.domain.vo.FrontItemInfoVO;
 import com.inspur.source.domain.vo.FrontPushInfoVo;
 import com.inspur.source.service.ISmsbItemPushService;
 import jakarta.validation.constraints.NotNull;
 import lombok.RequiredArgsConstructor;
 import org.dromara.common.core.domain.R;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -26,6 +29,9 @@ public class SmsbFrontController {
 
     private final ISmsbItemPushService smsbItemPushService;
 
+    @Autowired
+    private ISmsbOtaRecordService iSmsbOtaRecordService;
+
     /**
      * 根据设备identifier 获取该设备最新内容下发记录
      *
@@ -51,4 +57,16 @@ public class SmsbFrontController {
         return smsbItemPushService.itemUpdateEnd(identifier,pushId);
     }
 
+
+    /**
+     * 根据设备identifier 获取OTA 信息
+     *
+     * @param identifier 主键
+     */
+    @SaIgnore
+    @GetMapping("/ota/check/{identifier}")
+    public R<SmsbOtaRecordVo> deviceCheckOta(@NotNull(message = "identifier不能为空") @PathVariable String identifier) {
+        return iSmsbOtaRecordService.deviceCheckOta(identifier);
+    }
+
 }

+ 2 - 0
smsb-modules/smsb-source/src/main/java/com/inspur/source/service/impl/SmsbItemPushServiceImpl.java

@@ -610,6 +610,8 @@ public class SmsbItemPushServiceImpl implements ISmsbItemPushService {
             } else {
                 terminationBo.setComment(LoginHelper.getLoginUser().getNickname() + "终止了申请:" + terminationBo.getComment());
             }
+            String userId = String.valueOf(LoginHelper.getUserId());
+            taskService.setAssignee(task.getId(), userId);
             taskService.addComment(task.getId(), task.getProcessInstanceId(), TaskStatusEnum.TERMINATION.getStatus(), terminationBo.getComment());
             List<Task> list = QueryUtils.taskQuery(task.getProcessInstanceId()).list();
             if (CollUtil.isNotEmpty(list)) {

+ 2 - 1
smsb-plus-ui/src/api/smsb/device/otaRecord.ts

@@ -33,7 +33,8 @@ export const getOtaRecord = (id: string | number): AxiosPromise<OtaRecordVO> =>
  */
 export const addOtaRecord = (data: OtaRecordForm) => {
   return request({
-    url: '/device/otaRecord',
+    // url: '/device/otaRecord',
+    url: '/netty/device',
     method: 'post',
     data: data
   });

+ 9 - 6
smsb-plus-ui/src/views/smsb/itemReview/index.vue

@@ -56,7 +56,7 @@
           <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="150">
             <template #default="scope">
               <el-tooltip content="内容审核" placement="top">
-                <el-button link type="primary" icon="Notification" @click="handleReview(scope.row)" v-hasPermi="['source:itemPush:edit']"></el-button>
+                <el-button link type="primary" icon="Notification" @click="handleApproval(scope.row)" v-hasPermi="['source:itemPush:edit']"></el-button>
               </el-tooltip>
             </template>
           </el-table-column>
@@ -183,11 +183,14 @@ const handleReview = (row?: ItemPushVO) => {
   const taskId = row.taskId;
   const status = row.status;
   // 跳转页面 /source/push/review?id=1898991996092481537&type=approval&taskId=1898992031169445891
-  if (status === 'waiting') {
-    proxy.$router.push('/source/push/review?id=' + id + '&type=approval&taskId=' + taskId);
-  } else {
-    proxy.$router.push('/source/push/review?id=' + id + '&type=view&taskId=' + taskId);
-  }
+  proxy.$router.push('/source/push/review?id=' + id + '&type=view&taskId=' + taskId);
+};
+const handleApproval = (row?: ItemPushVO) => {
+  const id = row.id;
+  const taskId = row.taskId;
+  const status = row.status;
+  // 跳转页面 /source/push/review?id=1898991996092481537&type=approval&taskId=1898992031169445891
+  proxy.$router.push('/source/push/review?id=' + id + '&type=approval&taskId=' + taskId);
 };
 const handleClickTab = (tab: TabsPaneContext, event: Event) => {
   if (tab.props.name === 'need') {

+ 19 - 13
smsb-plus-ui/src/views/smsb/otaRecord/index.vue

@@ -29,24 +29,29 @@
     <el-card shadow="never">
       <el-table v-loading="loading" :data="otaRecordList" @selection-change="handleSelectionChange">
         <el-table-column type="selection" width="55" align="center" />
-        <el-table-column label="主键ID" align="center" prop="id" v-if="true" />
-        <el-table-column label="升级名称" align="center" prop="otaName" />
-        <el-table-column label="升级文件" align="center" prop="fileName" />
-        <el-table-column label="文件地址" align="center" prop="fileUrl" />
-        <el-table-column label="文件MD5" align="center" prop="md5" />
-        <el-table-column label="版本号" align="center" prop="versionCode" />
-        <el-table-column label="版本名称" align="center" prop="versionName" />
-        <el-table-column label="升级状态" align="center" prop="otaStatus" />
-        <el-table-column label="备注" align="center" prop="remark" />
-        <el-table-column label="创建人" align="center" prop="createUser" />
-        <el-table-column label="创建时间" align="center" prop="createTime" />
-        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <el-table-column label="ID" align="left" prop="id" v-if="true" width="175" />
+        <el-table-column label="升级名称" align="left" prop="otaName" width="150" :show-overflow-tooltip="true" />
+        <el-table-column label="升级设备" align="left" prop="deviceName" width="180" :show-overflow-tooltip="true" />
+        <el-table-column label="升级文件" align="left" prop="fileName" width="200" :show-overflow-tooltip="true" />
+        <el-table-column label="文件地址" align="left" prop="fileUrl" width="200" :show-overflow-tooltip="true" />
+        <el-table-column label="文件MD5" align="left" prop="md5" width="180" :show-overflow-tooltip="true" />
+        <el-table-column label="版本号" align="left" prop="versionCode" width="100" :show-overflow-tooltip="true" />
+        <el-table-column label="版本名称" align="left" prop="versionName" width="90" :show-overflow-tooltip="true" />
+        <el-table-column label="升级状态" align="center" prop="otaStatus" width="120" >
+          <template #default="scope">
+            <dict-tag :options="smsb_ota_status" :value="scope.row.otaStatus" />
+          </template>
+        </el-table-column>
+        <el-table-column label="备注" align="left" prop="remark" width="160" :show-overflow-tooltip="true" />
+        <el-table-column label="创建人" align="left" prop="createUser" width="120" :show-overflow-tooltip="true"/>
+        <el-table-column label="创建时间" align="left" prop="createTime" :show-overflow-tooltip="true"/>
+<!--        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
           <template #default="scope">
             <el-tooltip content="删除" placement="top">
               <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:otaRecord:remove']"></el-button>
             </el-tooltip>
           </template>
-        </el-table-column>
+        </el-table-column>-->
       </el-table>
 
       <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
@@ -110,6 +115,7 @@ import { DeviceVO } from '@/api/smsb/device/device_type';
 import { ref } from 'vue';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { smsb_ota_status } = toRefs<any>(proxy?.useDict('smsb_ota_status'));
 
 const otaRecordList = ref<OtaRecordVO[]>([]);
 const buttonLoading = ref(false);