liusuyi
2025-10-30 27b3ffa1dcf89f4dc5fdd13a96f7c985d0eba68d
ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceServiceImpl.java
@@ -1,5 +1,7 @@
package com.ard.sample.manage.service.impl;
import com.alibaba.fastjson2.JSONObject;
import com.ard.system.authorize.service.AuthorizeService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -89,6 +91,9 @@
    @Autowired
    private IDeviceFirmwareService deviceFirmwareService;
    @Resource
    private AuthorizeService authorizeService;
    @Autowired
    @Qualifier("gatewayOSDServiceImpl")
@@ -305,6 +310,9 @@
                .collect(Collectors.toList());
    }
    /**
     * 设备列表
     * */
    @Override
    public List<DeviceDTO> getDevicesTopoForWeb() {
        List<DeviceDTO> devicesList = this.getDevicesByParams(
@@ -533,10 +541,54 @@
            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);
        }
    }
    /**
     * Convert the received gateway device object into a database entity object.
     *
     * @param gateway