From ddf364ed076204206fbba47f2947b30cbbd21ecb Mon Sep 17 00:00:00 2001
From: zhaowenyu <35589726@qq.com>
Date: Fri, 31 Oct 2025 16:16:11 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev
---
ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceServiceImpl.java | 101 ++++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 89 insertions(+), 12 deletions(-)
diff --git a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceServiceImpl.java b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceServiceImpl.java
index 322084d..fc5dd06 100644
--- a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceServiceImpl.java
+++ b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceServiceImpl.java
@@ -1,5 +1,9 @@
package com.ard.sample.manage.service.impl;
+import com.alibaba.fastjson2.JSONObject;
+import com.ard.common.annotation.DataScopePlus;
+import com.ard.system.authorize.service.AuthorizeService;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -26,7 +30,7 @@
import com.ard.sample.manage.model.param.DeviceQueryParam;
import com.ard.sample.manage.model.receiver.*;
import com.ard.sample.manage.service.*;
-import com.ard.system.service.system.ISysDeptService;
+import com.ard.system.service.ISysDeptService;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -89,6 +93,9 @@
@Autowired
private IDeviceFirmwareService deviceFirmwareService;
+
+ @Resource
+ private AuthorizeService authorizeService;
@Autowired
@Qualifier("gatewayOSDServiceImpl")
@@ -259,7 +266,7 @@
/**
* 发布状态回复消息
*
- * @param sn 序列号
+ * @param sn 序列号
* @param response 通用主题响应对象
*/
@Override
@@ -305,6 +312,9 @@
.collect(Collectors.toList());
}
+ /**
+ * 设备列表
+ */
@Override
public List<DeviceDTO> getDevicesTopoForWeb() {
List<DeviceDTO> devicesList = this.getDevicesByParams(
@@ -533,7 +543,50 @@
mapper.updateById(entity);
return Optional.of(deviceEntity);
}
+ // 2025-10-20 zwy 添加时增加授权验证及数量限制,限制为3台机场设备,超出则抛出异常
+ try {
+ // 查询数据库中机器设备数量
+ // 根据参数获取设备列表
+ List<DeviceDTO> devicesList = this.getDevicesByParams(
+ DeviceQueryParam.builder()
+ // 过滤设备域为GATEWAY和DOCK的设备
+ .domains(List.of(DeviceDomainEnum.GATEWAY.getVal(), DeviceDomainEnum.DOCK.getVal()))
+ .build());
+ // 验证授权数量
+ validateAuthorization(devicesList.size(), 1);
+ } catch (Exception e) {
+ return Optional.empty();
+ }
+ // 调用验证方法
+
return mapper.insert(entity) > 0 ? Optional.of(entity) : Optional.empty();
+ }
+
+ /**
+ * 验证授权数量
+ */
+ private void validateAuthorization(int existingCount, int newCount) {
+ int totalCount = existingCount + newCount;
+
+ JSONObject authInfo = authorizeService.getAuthorizationInfo();
+ String authType = authInfo.getString("Type");
+
+ switch (authType) {
+ case "normal":
+ int allowedDockNum = authInfo.getIntValue("dockNum");
+ if (totalCount > allowedDockNum) {
+ throw new RuntimeException(String.format(
+ "授权数量%d,当前操作将导致总数达到%d,超过授权限制",
+ allowedDockNum, totalCount));
+ }
+ break;
+ case "expired":
+ throw new RuntimeException("授权文件已过期");
+ case "mismatch":
+ throw new RuntimeException("授权文件不匹配");
+ default:
+ throw new RuntimeException("未知的授权类型: " + authType);
+ }
}
/**
@@ -636,6 +689,7 @@
.nickname(entity.getNickname())
.firmwareVersion(entity.getFirmwareVersion())
.deptId(entity.getDeptId())
+ .workType(entity.getWorkType())
.workspaceName(entity.getDeptId() != null
? Optional.ofNullable(sysDeptService.selectDeptById(entity.getDeptId()))
.map(SysDept::getDeptName)
@@ -671,6 +725,19 @@
public Boolean updateDevice(DeviceDTO deviceDTO) {
int update = mapper.update(this.deviceDTO2Entity(deviceDTO),
new LambdaUpdateWrapper<DeviceEntity>().eq(DeviceEntity::getDeviceSn, deviceDTO.getDeviceSn()));
+ return update > 0;
+ }
+
+ @Override
+ public Boolean updateWorkType(String sn, Long workType) {
+ // 方式1:使用LambdaUpdateWrapper(推荐,类型安全,避免字段名硬编码)
+ LambdaUpdateWrapper<DeviceEntity> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+ // 设置更新条件:deviceSn = sn
+ lambdaUpdateWrapper.eq(DeviceEntity::getDeviceSn, sn)
+ // 只更新workType字段
+ .set(DeviceEntity::getWorkType, workType);
+ // 执行更新(第一个参数传null,因为更新字段已通过wrapper的set指定)
+ int update = mapper.update(null, lambdaUpdateWrapper);
return update > 0;
}
@@ -797,19 +864,21 @@
/**
* 根据域名分页获取已绑定的设备信息
*
- * @param page 当前页码
- * @param pageSize 每页显示数量
- * @param domain 域名
+ * @param page 当前页码
+ * @param pageSize 每页显示数量
+ * @param domain 域名
* @return PaginationData<DeviceDTO> 包含分页信息的设备DTO列表
*/
@Override
public PaginationData<DeviceDTO> getBoundDevicesWithDomain(Long page,
- Long pageSize, Integer domain) {
+ Long pageSize, Integer domain, Long deptId) {
Page<DeviceEntity> pagination = mapper.selectPage(new Page<>(page, pageSize),
new LambdaQueryWrapper<DeviceEntity>()
.eq(DeviceEntity::getDomain, domain)
- .eq(DeviceEntity::getBoundStatus, true));
+ .eq(deptId != null, DeviceEntity::getDeptId, deptId)
+ .isNotNull(DeviceEntity::getDeptId));
+// .eq(DeviceEntity::getBoundStatus, true));
List<DeviceDTO> devicesList = pagination.getRecords().stream().map(this::deviceEntityConvertToDTO)
.peek(device -> {
device.setStatus(RedisOpsUtils.checkExist(RedisConst.DEVICE_ONLINE_PREFIX + device.getDeviceSn()));
@@ -835,6 +904,7 @@
DeviceDTO device = DeviceDTO.builder()
.deviceSn(deviceSn)
.boundStatus(false)
+ .deptId(null)
.build();
this.updateDevice(device);
}
@@ -1009,6 +1079,7 @@
.childSn(dto.getChildDeviceSn())
.domain(dto.getDomain())
.firmwareVersion(dto.getFirmwareVersion())
+ .workType(dto.getWorkType())
.compatibleStatus(dto.getFirmwareStatus() == null ? null :
DeviceFirmwareStatusEnum.CONSISTENT_UPGRADE != DeviceFirmwareStatusEnum.find(dto.getFirmwareStatus()))
.build();
@@ -1116,7 +1187,7 @@
* 处理获取机场组织信息的请求
*
* @param receiver 接收到的消息
- * @param headers 消息头
+ * @param headers 消息头
*/
@ServiceActivator(inputChannel = ChannelName.INBOUND_REQUESTS_AIRPORT_ORGANIZATION_GET, outputChannel =
ChannelName.OUTBOUND)
@@ -1125,10 +1196,10 @@
OrganizationGetReceiver.class);
CommonTopicResponse.CommonTopicResponseBuilder<RequestsReply> builder =
CommonTopicResponse.<RequestsReply>builder()
- .tid(receiver.getTid())
- .bid(receiver.getBid())
- .method(RequestsMethodEnum.AIRPORT_ORGANIZATION_GET.getMethod())
- .timestamp(System.currentTimeMillis());
+ .tid(receiver.getTid())
+ .bid(receiver.getBid())
+ .method(RequestsMethodEnum.AIRPORT_ORGANIZATION_GET.getMethod())
+ .timestamp(System.currentTimeMillis());
String topic = headers.get(MqttHeaders.RECEIVED_TOPIC).toString() + TopicConst._REPLY_SUF;
@@ -1149,4 +1220,10 @@
messageSender.publish(topic, builder.build());
}
+
+ @DataScopePlus(deptAlias="d")
+ @Override
+ public List<DeviceEntity> selectList(Wrapper<DeviceEntity> queryWrapper) {
+ return mapper.selectList(queryWrapper);
+ }
}
\ No newline at end of file
--
Gitblit v1.9.3