From 58008a7417e475c462171fa3ca75679ac65e6211 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=AD=E7=90=AA=E6=9E=AB?= <374696376@qq.com> Date: Tue, 18 Jul 2023 00:02:59 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E6=B7=BB=E5=8A=A0=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=E5=88=9B=E5=BB=BA=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manager/controller/OtaController.java | 4 +- .../cc/iotkit/manager/service/OtaService.java | 35 ++++++++++++------ 微信图片_20230710205406.jpg | Bin 0 -> 18778 bytes 3 files changed, 26 insertions(+), 13 deletions(-) create mode 100644 微信图片_20230710205406.jpg diff --git a/iot-module/iot-manager/src/main/java/cc/iotkit/manager/controller/OtaController.java b/iot-module/iot-manager/src/main/java/cc/iotkit/manager/controller/OtaController.java index 1b0b1e39..221186e5 100644 --- a/iot-module/iot-manager/src/main/java/cc/iotkit/manager/controller/OtaController.java +++ b/iot-module/iot-manager/src/main/java/cc/iotkit/manager/controller/OtaController.java @@ -68,8 +68,8 @@ public class OtaController extends BaseController { @ApiOperation("OTA升级") @PostMapping("/device/upgrade") - public void deviceUpgrade(@RequestBody Request request) { - otaService.startUpgrade(request.getData().getOtaId(), request.getData().getDeviceIds()); + public String deviceUpgrade(@RequestBody Request request) { + return otaService.startUpgrade(request.getData().getOtaId(), request.getData().getDeviceIds()); } @ApiOperation("设备升级结果查询") diff --git a/iot-module/iot-manager/src/main/java/cc/iotkit/manager/service/OtaService.java b/iot-module/iot-manager/src/main/java/cc/iotkit/manager/service/OtaService.java index 3241263c..d877ddc5 100644 --- a/iot-module/iot-manager/src/main/java/cc/iotkit/manager/service/OtaService.java +++ b/iot-module/iot-manager/src/main/java/cc/iotkit/manager/service/OtaService.java @@ -7,6 +7,7 @@ import cc.iotkit.common.exception.BizException; import cc.iotkit.common.oss.core.OssClient; import cc.iotkit.common.oss.factory.OssFactory; import cc.iotkit.common.utils.StringUtils; +import cc.iotkit.data.manager.IDeviceInfoData; import cc.iotkit.data.manager.IDeviceOtaDetailData; import cc.iotkit.data.manager.IDeviceOtaInfoData; import cc.iotkit.data.manager.IOtaPackageData; @@ -17,6 +18,7 @@ import cc.iotkit.manager.dto.bo.ota.OtaPackageBo; import cc.iotkit.manager.dto.vo.ota.DeviceOtaDetailVo; import cc.iotkit.manager.dto.vo.ota.DeviceOtaInfoVo; import cc.iotkit.manager.dto.vo.ota.OtaPackageUploadVo; +import cc.iotkit.model.device.DeviceInfo; import cc.iotkit.model.ota.DeviceOtaDetail; import cc.iotkit.model.ota.DeviceOtaInfo; import cc.iotkit.model.ota.OtaPackage; @@ -25,7 +27,6 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.io.FileUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import cc.iotkit.common.oss.entity.UploadResult; @@ -38,6 +39,7 @@ import java.security.MessageDigest; import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.concurrent.atomic.AtomicReference; /** * @Author: 石恒 @@ -52,6 +54,7 @@ public class OtaService { private final IOtaPackageData iOtaPackageData; private final DeviceService deviceService; private final IDeviceOtaInfoData deviceOtaInfoData; + private final IDeviceInfoData deviceInfoData; private final IDeviceOtaDetailData deviceOtaDetailData; private final ISysOssData sysOssData; @@ -135,7 +138,7 @@ public class OtaService { /** * 开始升级 */ - public void startUpgrade(Long otaId, List deviceIds) { + public String startUpgrade(Long otaId, List deviceIds) { OtaPackage otaPackage = iOtaPackageData.findById(otaId); if (Objects.isNull(otaPackage)) { throw new BizException(ErrCode.DATA_NOT_EXIST); @@ -150,18 +153,28 @@ public class OtaService { .build()); List deviceOtaDetails = new ArrayList<>(); + AtomicReference success = new AtomicReference<>(0); + AtomicReference fail = new AtomicReference<>(0); deviceIds.forEach(deviceId -> { - String taskId = deviceService.otaUpgrade(deviceId, true, otaPackage); - deviceOtaDetails.add(DeviceOtaDetail.builder() - .taskId(taskId) - .otaInfoId(deviceOtaInfo.getId()) - .module(otaPackage.getModule()) - .version(otaPackage.getVersion()) - .step(0) - .deviceId(deviceId) - .build()); + try { + DeviceInfo deviceInfo = deviceInfoData.findByDeviceId(deviceId); + String taskId = deviceService.otaUpgrade(deviceId, true, otaPackage); + deviceOtaDetails.add(DeviceOtaDetail.builder() + .taskId(taskId) + .deviceName(deviceInfo.getDeviceName()) + .otaInfoId(deviceOtaInfo.getId()) + .module(otaPackage.getModule()) + .version(otaPackage.getVersion()) + .step(0) + .deviceId(deviceId) + .build()); + success.getAndSet(success.get() + 1); + } catch (Exception ex) { + fail.getAndSet(success.get() + 1); + } }); deviceOtaDetailData.batchSave(deviceOtaDetails); + return "发起升级【" + success + "】条,失败【" + fail + "】条"; } public Paging otaDeviceDetail(PageRequest request) { diff --git a/微信图片_20230710205406.jpg b/微信图片_20230710205406.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fac75a52625ee0991eb7d1ce4dccb8d17a1be0b5 GIT binary patch literal 18778 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