feat: 新增智能柜详情接口及MQTT连接复用逻辑

- 新增智能柜详情接口,支持通过ID获取智能柜详细信息
- 添加MQTT连接复用逻辑,避免重复创建相同连接的客户端实例
- 新增CabinetTemplateEnum枚举类,定义智能柜模板类型
This commit is contained in:
dzq 2025-05-15 10:03:00 +08:00
parent 3fe5778ea0
commit e4235e197b
4 changed files with 80 additions and 0 deletions

View File

@ -5,6 +5,7 @@ import com.agileboot.common.core.base.BaseController;
import com.agileboot.common.core.dto.ResponseDTO;
import com.agileboot.common.core.page.PageDTO;
import com.agileboot.common.enums.common.BusinessTypeEnum;
import com.agileboot.domain.ab98.user.dto.Ab98UserDetailDTO;
import com.agileboot.domain.cabinet.cell.CabinetCellApplicationService;
import com.agileboot.domain.cabinet.cell.dto.CabinetCellDTO;
import com.agileboot.domain.cabinet.smartCabinet.dto.AllCabinetDataDTO;
@ -46,6 +47,13 @@ public class SmartCabinetController extends BaseController {
return ResponseDTO.ok(page);
}
@Operation(summary = "智能柜详情")
@GetMapping("/detail/{cabinetId}")
public ResponseDTO<SmartCabinetDTO> detail(@PathVariable Long cabinetId) {
SmartCabinetDTO smartCabinetDTO = smartCabinetApplicationService.getSmartCabinetById(cabinetId);
return ResponseDTO.ok(smartCabinetDTO);
}
@Operation(summary = "新增智能柜")
@AccessLog(title = "智能柜管理", businessType = BusinessTypeEnum.ADD)
@PostMapping

View File

@ -0,0 +1,34 @@
package com.agileboot.domain.cabinet.smartCabinet;
public enum CabinetTemplateEnum {
CABINET_16(1, "cabinet_16.jpg", "16口机柜"),
CABINET_20(2, "cabinet_20.jpg", "20口机柜"),
CABINET_22(3, "cabinet_22.jpg", "22口机柜"),
CABINET_24(4, "cabinet_24.jpg", "24口机柜"),
CABINET_40(5, "cabinet_40.jpg", "40口机柜"),
CABINET_48(6, "cabinet_48.jpg", "48口机柜"),
CABINET_60(7, "cabinet_60.jpg", "60口机柜"),
CABINET_120(8, "cabinet_120.jpg", "120口机柜");
private final int code;
private final String img;
private final String name;
CabinetTemplateEnum(int code, String img, String name) {
this.code = code;
this.img = img;
this.name = name;
}
public int getCode() {
return code;
}
public String getImg() {
return img;
}
public String getName() {
return name;
}
}

View File

@ -53,6 +53,26 @@ public class SmartCabinetApplicationService {
return new PageDTO<>(dtoList, page.getTotal());
}
public SmartCabinetDTO getSmartCabinetById(Long cabinetId) {
SmartCabinetEntity cabinet = smartCabinetService.getById(cabinetId);
SmartCabinetDTO dto = new SmartCabinetDTO(cabinet);
List<ShopEntity> shopEntities = shopService.selectAll();
dto.setShopName(
shopEntities.stream()
.filter(shop -> shop.getShopId().equals(dto.getShopId()))
.findFirst()
.map(ShopEntity::getShopName)
.orElse("")
);
SmartCabinetEntity mainCabinet = smartCabinetService.getByCabinetId(cabinet.getMainCabinet());
if (mainCabinet!= null) {
dto.setMainCabinetName(mainCabinet.getCabinetName());
}
return dto;
}
public void addSmartCabinet(AddSmartCabinetCommand command) {
SmartCabinetModel model = smartCabinetModelFactory.create();
model.loadAddCommand(command);

View File

@ -25,6 +25,12 @@ public class MqttService implements MqttCallback {
private static class ClientConfig {
private final MqttClient client;
private final MqttServerEntity config;
public boolean isSameConnection(MqttServerEntity other) {
return config.getServerUrl().equals(other.getServerUrl())
&& config.getUsername().equals(other.getUsername())
&& config.getPassword().equals(other.getPassword());
}
}
@ -51,6 +57,18 @@ public class MqttService implements MqttCallback {
public void connect() throws MqttException {
for (MqttServerEntity config : mqttServerService.selectAll()) {
// 检查是否已有相同连接的client实例
ClientConfig existingConfig = clientConfigs.stream()
.filter(cc -> cc.isSameConnection(config))
.findFirst()
.orElse(null);
if (existingConfig != null) {
log.info("复用已有MQTT连接{} 账号:{}", config.getServerUrl(), config.getUsername());
clientConfigs.add(new ClientConfig(existingConfig.client, config));
continue;
}
MqttClient client = new MqttClient(config.getServerUrl(), MqttClient.generateClientId(), new MemoryPersistence());
MqttConnectOptions options = new MqttConnectOptions();
options.setUserName(config.getUsername());