diff --git a/maibu-common/src/main/java/com/maibu/core/ota/DeviceOtaFirmware.java b/maibu-common/src/main/java/com/maibu/core/ota/DeviceOtaFirmware.java index 3728bdf..67759f0 100644 --- a/maibu-common/src/main/java/com/maibu/core/ota/DeviceOtaFirmware.java +++ b/maibu-common/src/main/java/com/maibu/core/ota/DeviceOtaFirmware.java @@ -23,6 +23,8 @@ public class DeviceOtaFirmware extends BaseDO { private String fileName; //文件名 + private String minioObjectName; //服务器文件名 + private String fileUrl; //存放地址 private String deviceType; 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 95422cd..b3ac4b2 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 @@ -31,7 +31,7 @@ public class DeviceOtaOperateRecord extends BaseDO { private String fileName; //名称 - private String firmwareId; //id + private Long firmwareId; //id private String deviceType; diff --git a/maibu-common/src/main/java/com/maibu/utils/MinioUtil.java b/maibu-common/src/main/java/com/maibu/utils/MinioUtil.java index 9cbaf68..a90aaed 100644 --- a/maibu-common/src/main/java/com/maibu/utils/MinioUtil.java +++ b/maibu-common/src/main/java/com/maibu/utils/MinioUtil.java @@ -1,9 +1,6 @@ package com.maibu.utils; -import io.minio.BucketExistsArgs; -import io.minio.MakeBucketArgs; -import io.minio.MinioClient; -import io.minio.PutObjectArgs; +import io.minio.*; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -44,6 +41,15 @@ public class MinioUtil { // 拼接 public URL return endpoint + "/" + defaultBucket + "/" + objectName; } + + public void deleteFile(String objectName) throws Exception { + minioClient.removeObject( + RemoveObjectArgs.builder() + .bucket(defaultBucket) + .object(objectName) + .build() + ); + } } diff --git a/maibu-service/maibu-iot-service/src/main/java/com/maibu/controller/DeviceOtaController.java b/maibu-service/maibu-iot-service/src/main/java/com/maibu/controller/DeviceOtaController.java index 3968888..30c28fa 100644 --- a/maibu-service/maibu-iot-service/src/main/java/com/maibu/controller/DeviceOtaController.java +++ b/maibu-service/maibu-iot-service/src/main/java/com/maibu/controller/DeviceOtaController.java @@ -1,23 +1,26 @@ package com.maibu.controller; +import java.io.InputStream; +import java.time.LocalDateTime; import java.util.List; +import com.maibu.core.business.WorkRecord; import com.maibu.core.controller.BaseController; import com.maibu.core.domain.AjaxResult; +import com.maibu.core.domain.R; +import com.maibu.core.enums.OtaOperate; import com.maibu.core.page.TableDataInfo; import com.maibu.dto.BaseQueryDTO; import com.maibu.core.ota.DeviceOtaFirmware; import com.maibu.core.ota.DeviceOtaOperateRecord; +import com.maibu.dto.DeviceOtaOperateDTO; import com.maibu.service.impl.DeviceOtaService; +import com.maibu.utils.MinioUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; @Api(tags = "OTA固件管理") @RestController @@ -27,12 +30,44 @@ public class DeviceOtaController extends BaseController { @Autowired private DeviceOtaService service; + @Autowired + private MinioUtil minioUtil; + // ==================== 固件管理 ==================== @ApiOperation("新增或修改固件") @PostMapping("/firmware/save") - public AjaxResult saveFirmware(@RequestBody DeviceOtaFirmware firmware) { - return AjaxResult.success(service.saveFirmware(firmware)); + public R saveFirmware( + @RequestPart("file") MultipartFile file, // 接收上传的图片 + @RequestPart("firmware") DeviceOtaFirmware firmware // 接收表单里的 JSON 对象 + ) { + + try (InputStream inputStream = file.getInputStream()) { + + String fileName = "ota/firmware" + firmware.getVersion(); + + // 上传到 MinIO + minioUtil.uploadFile(fileName, inputStream, "image/png"); + + // 获取访问 URL + String url = minioUtil.getPublicUrl(fileName); + System.out.println("✅ 图片上传成功,访问地址: " + url); + + // 这里可以把 URL 存到 workRecord 里 + firmware.setMinioObjectName(fileName); + firmware.setFileUrl(url); + boolean b = service.saveFirmware(firmware); + DeviceOtaOperateRecord record = new DeviceOtaOperateRecord(); + record.setFileName(firmware.getVersion()); + record.setFirmwareId(firmware.getId()); + record.setOperateType(OtaOperate.upload); + record.setCreateBy(getUsername()); + record.setCreateTime(LocalDateTime.now()); + service.saveOperateRecord(record); + return !b ? R.fail("新增失败") : R.ok("新增成功"); + } catch (Exception e) { + return R.fail("新增失败: " + e.getMessage()); + } } @ApiOperation("固件分页列表") @@ -48,6 +83,12 @@ public class DeviceOtaController extends BaseController { return AjaxResult.success(service.selectFirmwareById(id)); } + @ApiOperation("更新固件") + @PostMapping("/firmware/upgrade") + public AjaxResult upgrade(@RequestBody DeviceOtaOperateDTO dto) { + return AjaxResult.success(service.upgrade(dto)); + } + @ApiOperation("批量删除固件") @PostMapping("/firmware/delete") public AjaxResult deleteFirmware(@RequestBody List ids) { 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 new file mode 100644 index 0000000..e2d4ee9 --- /dev/null +++ b/maibu-service/maibu-iot-service/src/main/java/com/maibu/dto/DeviceOtaOperateDTO.java @@ -0,0 +1,15 @@ +package com.maibu.dto; + + +import com.maibu.core.enums.OtaOperate; +import lombok.Data; + +import java.util.List; + +@Data +public class DeviceOtaOperateDTO { + + private OtaOperate operateType; + private Long firmwareId; + private List deviceIds; +} 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 271e931..0852b1c 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 @@ -2,10 +2,12 @@ package com.maibu.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.maibu.dto.BaseQueryDTO; +import com.maibu.dto.DeviceOtaOperateDTO; import com.maibu.mapper.DeviceOtaFirmwareMapper; import com.maibu.mapper.DeviceOtaOperateRecordMapper; import com.maibu.core.ota.DeviceOtaFirmware; import com.maibu.core.ota.DeviceOtaOperateRecord; +import com.maibu.utils.MinioUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -24,6 +26,9 @@ public class DeviceOtaService { @Autowired private DeviceOtaOperateRecordMapper deviceOtaOperateRecordMapper; + @Autowired + private MinioUtil minioUtil; + public boolean saveFirmware(DeviceOtaFirmware firmware) { return deviceOtaFirmwareMapper.saveOrUpdate(firmware); } @@ -38,10 +43,26 @@ public class DeviceOtaService { return deviceOtaFirmwareMapper.selectById(id); } + + public void upgrade(DeviceOtaOperateDTO dto) { + + } + + public int deleteFirmware(List ids) { if (CollectionUtils.isEmpty(ids)) { return 0; } + List list = deviceOtaFirmwareMapper.selectBatchIds(ids); + if (!CollectionUtils.isEmpty(list)) { + list.forEach(l -> { + try { + minioUtil.deleteFile(l.getMinioObjectName()); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + } return deviceOtaFirmwareMapper.deleteBatchIds(ids); }