#ota 接口调整
This commit is contained in:
@@ -86,7 +86,7 @@ public class Device extends BaseDO {
|
||||
*/
|
||||
@ApiModelProperty("固件版本")
|
||||
@Excel(name = "固件版本")
|
||||
private BigDecimal firmwareVersion;
|
||||
private String firmwareVersion;
|
||||
|
||||
/**
|
||||
* WIFI固件版本
|
||||
|
||||
@@ -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<String> 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;
|
||||
|
||||
}
|
||||
|
||||
@@ -220,7 +220,7 @@ public class DeviceConnectHandler extends SimpleChannelInboundHandler<String> {
|
||||
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());
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -11,5 +11,5 @@ public class DeviceOtaOperateDTO {
|
||||
|
||||
private OtaOperate operateType;
|
||||
private Long firmwareId;
|
||||
private List<String> deviceIds;
|
||||
private List<String> deviceModels;
|
||||
}
|
||||
|
||||
@@ -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<DeviceOtaOperateRecord> 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<String> batch = dto.getDeviceIds().subList(i, Math.min(i + BATCH_SIZE, totalDevices));
|
||||
List<String> 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<DeviceOtaOperateRecord> selectListByDeviceId(String deviceId) {
|
||||
LambdaQueryWrapper<DeviceOtaOperateRecord> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.apply(
|
||||
"JSON_CONTAINS(device_models, {0})",
|
||||
"\"" + deviceId + "\"");
|
||||
wrapper.eq(DeviceOtaOperateRecord::getDeviceId, deviceId);
|
||||
return deviceOtaOperateRecordMapper.selectList(wrapper);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user