diff --git a/maibu-common/src/main/java/com/maibu/core/business/Device.java b/maibu-common/src/main/java/com/maibu/core/business/Device.java index 9411e78..22553d4 100644 --- a/maibu-common/src/main/java/com/maibu/core/business/Device.java +++ b/maibu-common/src/main/java/com/maibu/core/business/Device.java @@ -86,7 +86,7 @@ public class Device extends BaseDO { */ @ApiModelProperty("固件版本") @Excel(name = "固件版本") - private BigDecimal firmwareVersion; + private String firmwareVersion; /** * WIFI固件版本 diff --git a/maibu-common/src/main/java/com/maibu/core/ota/DeviceOtaOperateRecord.java b/maibu-common/src/main/java/com/maibu/core/ota/DeviceOtaOperateRecord.java index 703f74f..e60ee7e 100644 --- a/maibu-common/src/main/java/com/maibu/core/ota/DeviceOtaOperateRecord.java +++ b/maibu-common/src/main/java/com/maibu/core/ota/DeviceOtaOperateRecord.java @@ -1,19 +1,15 @@ package com.maibu.core.ota; import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; import com.fasterxml.jackson.annotation.JsonInclude; import com.maibu.core.domain.BaseDO; import com.maibu.core.enums.OtaOperate; + import lombok.Data; import lombok.EqualsAndHashCode; -import java.util.List; - - @EqualsAndHashCode(callSuper = true) @JsonInclude(JsonInclude.Include.NON_NULL) @Data @@ -24,15 +20,18 @@ public class DeviceOtaOperateRecord extends BaseDO { @TableId(type = IdType.AUTO) private Long id; - private OtaOperate operateType; //操作类型 + private OtaOperate operateType; // 操作类型 - @TableField(typeHandler = JacksonTypeHandler.class) - private List deviceModels; //文件名 + private String fileName; // 名称 - private String fileName; //名称 + private Long firmwareId; // id - private Long firmwareId; //id + private String deviceId; // 名称 private String deviceType; + private String preVersion; + + private String nowVersion; + } diff --git a/maibu-netty-server/src/main/java/com/maibu/netty/handler/DeviceConnectHandler.java b/maibu-netty-server/src/main/java/com/maibu/netty/handler/DeviceConnectHandler.java index 1cf8e92..6fbef16 100644 --- a/maibu-netty-server/src/main/java/com/maibu/netty/handler/DeviceConnectHandler.java +++ b/maibu-netty-server/src/main/java/com/maibu/netty/handler/DeviceConnectHandler.java @@ -220,7 +220,7 @@ public class DeviceConnectHandler extends SimpleChannelInboundHandler { device.setDeviceName(data); device.setProductId(-1L); device.setTenantId(-1L); - device.setFirmwareVersion(BigDecimal.valueOf(1.0)); + device.setFirmwareVersion("1.0"); device.setProductName("割草机产品MC700"); device.setCreateTime(LocalDateTime.now()); device.setUpdateTime(LocalDateTime.now()); diff --git a/maibu-netty-server/src/main/java/com/maibu/service/DeviceThreadService.java b/maibu-netty-server/src/main/java/com/maibu/service/DeviceThreadService.java index 1b41cf1..85f7e73 100644 --- a/maibu-netty-server/src/main/java/com/maibu/service/DeviceThreadService.java +++ b/maibu-netty-server/src/main/java/com/maibu/service/DeviceThreadService.java @@ -361,7 +361,7 @@ public class DeviceThreadService { device.setDeviceName(deviceId); device.setProductId(-1L); device.setTenantId(-1L); - device.setFirmwareVersion(BigDecimal.valueOf(1.0)); + device.setFirmwareVersion("1.0"); device.setProductName("割草机产品MC700"); device.setCreateTime(LocalDateTime.now()); device.setUpdateTime(LocalDateTime.now()); diff --git a/maibu-service/maibu-iot-service/src/main/java/com/maibu/dto/DeviceOtaOperateDTO.java b/maibu-service/maibu-iot-service/src/main/java/com/maibu/dto/DeviceOtaOperateDTO.java index e2d4ee9..f49f87a 100644 --- a/maibu-service/maibu-iot-service/src/main/java/com/maibu/dto/DeviceOtaOperateDTO.java +++ b/maibu-service/maibu-iot-service/src/main/java/com/maibu/dto/DeviceOtaOperateDTO.java @@ -11,5 +11,5 @@ public class DeviceOtaOperateDTO { private OtaOperate operateType; private Long firmwareId; - private List deviceIds; + private List deviceModels; } diff --git a/maibu-service/maibu-iot-service/src/main/java/com/maibu/service/impl/DeviceOtaService.java b/maibu-service/maibu-iot-service/src/main/java/com/maibu/service/impl/DeviceOtaService.java index 03c0fb4..5d15b94 100644 --- a/maibu-service/maibu-iot-service/src/main/java/com/maibu/service/impl/DeviceOtaService.java +++ b/maibu-service/maibu-iot-service/src/main/java/com/maibu/service/impl/DeviceOtaService.java @@ -1,9 +1,18 @@ package com.maibu.service.impl; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.maibu.core.business.Device; import com.maibu.core.business.device.NettyDevice; import com.maibu.core.domain.AjaxResult; -import com.maibu.core.enums.OtaOperate; import com.maibu.core.ota.DeviceOtaFirmware; import com.maibu.core.ota.DeviceOtaOperateRecord; import com.maibu.dto.BaseQueryDTO; @@ -11,17 +20,11 @@ import com.maibu.dto.DeviceOtaOperateDTO; import com.maibu.mapper.DeviceOtaFirmwareMapper; import com.maibu.mapper.DeviceOtaOperateRecordMapper; import com.maibu.memory.DeviceSessionManager; +import com.maibu.service.IDeviceService; import com.maibu.utils.MinioUtil; import com.maibu.utils.SecurityUtils; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; +import lombok.extern.slf4j.Slf4j; @Service @Slf4j @@ -39,6 +42,9 @@ public class DeviceOtaService { @Autowired private DeviceSessionManager deviceSessionManager; + @Autowired + private IDeviceService deviceService; + private static final int BATCH_SIZE = 5; public boolean saveFirmware(DeviceOtaFirmware firmware, Long fileSize) { @@ -83,7 +89,7 @@ public class DeviceOtaService { if (dto.getFirmwareId() == null) { return AjaxResult.error("固件ID不能为空"); } - if (CollectionUtils.isEmpty(dto.getDeviceIds())) { + if (CollectionUtils.isEmpty(dto.getDeviceModels())) { return AjaxResult.error("请选择要升级的设备"); } @@ -92,21 +98,14 @@ public class DeviceOtaService { return AjaxResult.error("固件不存在"); } - DeviceOtaOperateRecord record = new DeviceOtaOperateRecord(); - record.setOperateType(OtaOperate.upgrade); - record.setFirmwareId(firmware.getId()); - record.setFileName(firmware.getFileName()); - record.setDeviceType(firmware.getDeviceType()); - record.setDeviceModels(new ArrayList<>()); - record.setCreateTime(LocalDateTime.now()); - record.setCreateBy(SecurityUtils.getUsername()); + List records = new ArrayList<>(); - int totalDevices = dto.getDeviceIds().size(); + int totalDevices = dto.getDeviceModels().size(); int successCount = 0; int offlineCount = 0; for (int i = 0; i < totalDevices; i += BATCH_SIZE) { - List batch = dto.getDeviceIds().subList(i, Math.min(i + BATCH_SIZE, totalDevices)); + List batch = dto.getDeviceModels().subList(i, Math.min(i + BATCH_SIZE, totalDevices)); log.info("OTA 灰度升级 第 {} 批, 本批设备数: {}", (i / BATCH_SIZE) + 1, batch.size()); for (String deviceId : batch) { @@ -119,7 +118,24 @@ public class DeviceOtaService { try { device.upgrade(deviceId, firmware); - record.getDeviceModels().add(deviceId); + + Device updatedDevice = device.getDevice(); + + DeviceOtaOperateRecord record = new DeviceOtaOperateRecord(); + record.setOperateType(dto.getOperateType()); + record.setFirmwareId(firmware.getId()); + record.setFileName(firmware.getFileName()); + record.setDeviceType(firmware.getDeviceType()); + record.setCreateTime(LocalDateTime.now()); + record.setCreateBy(SecurityUtils.getUsername()); + record.setDeviceId(deviceId); + record.setPreVersion(updatedDevice.getFirmwareVersion()); + record.setNowVersion(firmware.getVersion()); + records.add(record); + + updatedDevice.setFirmwareVersion(firmware.getVersion()); + deviceService.updateDeviceBySelf(updatedDevice); + successCount++; log.info("OTA 升级指令已下发: deviceId={}, version={}", deviceId, firmware.getVersion()); } catch (Exception e) { @@ -128,9 +144,7 @@ public class DeviceOtaService { } } - if (!record.getDeviceModels().isEmpty()) { - deviceOtaOperateRecordMapper.insert(record); - } + deviceOtaOperateRecordMapper.saveOrUpdateBatch(records); String msg = String.format("升级指令下发完成: 成功=%d, 离线=%d, 总计=%d", successCount, offlineCount, totalDevices); @@ -176,9 +190,7 @@ public class DeviceOtaService { public List selectListByDeviceId(String deviceId) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.apply( - "JSON_CONTAINS(device_models, {0})", - "\"" + deviceId + "\""); + wrapper.eq(DeviceOtaOperateRecord::getDeviceId, deviceId); return deviceOtaOperateRecordMapper.selectList(wrapper); }