feat: 添加设备更新接口和优化设备注册逻辑

- 在 `AndroidDeviceServiceImpl` 中添加 `updateDevice` 方法,支持更新设备信息
- 优化 `AndroidDeviceRegistrationServiceImpl` 中的设备名称设置逻辑
- 更新 `AndroidDeviceController`,添加新的 `update` 接口以支持设备信息更新
- 调整 `DeviceInfoMapper` 中的 `updateBaseInfoByIdIgnoreTenant` 方法,移除不必要的字段更新
dev_na
chenhao 2026-06-15 17:23:17 +08:00
parent 3c299aaf3b
commit 443e067b30
6 changed files with 65 additions and 11 deletions

View File

@ -5,7 +5,7 @@ import com.imeeting.dto.android.AndroidDeviceHomeStatsVO;
import com.imeeting.dto.android.AndroidDeviceRegisterRequest;
import com.imeeting.dto.android.AndroidDeviceRegisterResponse;
import com.imeeting.service.android.AndroidAuthService;
import com.imeeting.service.android.AndroidDeviceHomeService;
import com.imeeting.service.android.AndroidDeviceService;
import com.imeeting.service.android.AndroidDeviceRegistrationService;
import com.imeeting.support.AndroidRequestLogHelper;
import com.unisbase.annotation.Anonymous;
@ -35,7 +35,7 @@ public class AndroidDeviceController {
private final AndroidAuthService androidAuthService;
private final AndroidDeviceRegistrationService androidDeviceRegistrationService;
private final AndroidDeviceHomeService androidDeviceHomeService;
private final AndroidDeviceService androidDeviceService;
@Operation(summary = "设备自注册")
@ApiResponses({
@ -65,6 +65,34 @@ public class AndroidDeviceController {
return ApiResponse.ok(response);
}
@Operation(summary = "更新设备")
@ApiResponses({
@io.swagger.v3.oas.annotations.responses.ApiResponse(
responseCode = "200",
description = "更新设备信息",
content = @Content(schema = @Schema(implementation = AndroidDeviceRegisterResponse.class))
)
})
@PostMapping("/update")
@Anonymous
public ApiResponse update(HttpServletRequest request,
@RequestBody(required = false) AndroidDeviceRegisterRequest command) {
if (command == null) {
throw new IllegalArgumentException("更新设备请求参数不能为空");
}
String tenantCode = request == null ? null : request.getHeader(TENANT_CODE_HEADER);
AndroidRequestLogHelper.logRequest(log, "Android设备", "更新设备", "request", command, "tenantCode", tenantCode);
AndroidAuthContext authContext = androidAuthService.authenticateHttp(request, false);
androidDeviceService.updateDevice(
tenantCode,
authContext.getDeviceId(),
command.getDeviceName(),
command.getTerminalType() == null ? authContext.getPlatform() : command.getTerminalType(),
command.getTerminalVersion() == null ? authContext.getAppVersion() : command.getTerminalVersion()
);
return ApiResponse.ok(null);
}
@Operation(summary = "查询设备首页统计")
@ApiResponses({
@io.swagger.v3.oas.annotations.responses.ApiResponse(
@ -78,7 +106,7 @@ public class AndroidDeviceController {
public ApiResponse<AndroidDeviceHomeStatsVO> home(HttpServletRequest request) {
AndroidRequestLogHelper.logRequest(log, "Android设备", "查询设备首页统计");
AndroidAuthContext authContext = androidAuthService.authenticateHttp(request, true, true);
return ApiResponse.ok(androidDeviceHomeService.getHomeStats(authContext));
return ApiResponse.ok(androidDeviceService.getHomeStats(authContext));
}
private String resolveTenantCode(HttpServletRequest request, AndroidDeviceRegisterRequest command) {

View File

@ -31,7 +31,6 @@ public interface DeviceInfoMapper extends BaseMapper<DeviceInfoEntity> {
UPDATE biz_device_info
SET tenant_id = #{tenantId},
user_id = #{userId},
terminal_type = #{terminalType},
terminal_version = #{terminalVersion},
last_online_at = #{lastOnlineAt},
updated_at = CURRENT_TIMESTAMP

View File

@ -3,7 +3,9 @@ package com.imeeting.service.android;
import com.imeeting.dto.android.AndroidAuthContext;
import com.imeeting.dto.android.AndroidDeviceHomeStatsVO;
public interface AndroidDeviceHomeService {
public interface AndroidDeviceService {
AndroidDeviceHomeStatsVO getHomeStats(AndroidAuthContext authContext);
void updateDevice(String tenantCode, String deviceId, String deviceName, String terminalType, String terminalVersion);
}

View File

@ -1,5 +1,6 @@
package com.imeeting.service.android.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.imeeting.dto.android.AndroidDeviceRegisterResponse;
import com.imeeting.entity.biz.DeviceInfoEntity;
@ -44,7 +45,7 @@ public class AndroidDeviceRegistrationServiceImpl implements AndroidDeviceRegist
existing.setStatus(1);
}
existing.setTenantId(tenant.getId());
existing.setDeviceName(normalize(deviceName));
existing.setDeviceName(StrUtil.isNotEmpty(existing.getDeviceName()) ? existing.getDeviceName() : normalize(deviceName));
existing.setTerminalType(normalizeTerminalType(terminalType));
existing.setTerminalVersion(normalize(terminalVersion));
existing.setLastOnlineAt(LocalDateTime.now());
@ -87,7 +88,7 @@ public class AndroidDeviceRegistrationServiceImpl implements AndroidDeviceRegist
private String normalize(String value) {
if (!StringUtils.hasText(value)) {
return null;
return "会议设备";
}
return value.trim();
}

View File

@ -1,5 +1,7 @@
package com.imeeting.service.android.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.imeeting.common.RedisKeys;
@ -16,7 +18,7 @@ import com.imeeting.mapper.DeviceInfoMapper;
import com.imeeting.mapper.DeviceLoginLogMapper;
import com.imeeting.mapper.LicenseMapper;
import com.imeeting.mapper.biz.MeetingMapper;
import com.imeeting.service.android.AndroidDeviceHomeService;
import com.imeeting.service.android.AndroidDeviceService;
import com.imeeting.service.biz.MeetingPointsService;
import com.imeeting.service.biz.TenantMeetingPointsSettingService;
import com.imeeting.support.RedisSupport;
@ -42,7 +44,7 @@ import java.util.zip.GZIPInputStream;
@Service
@RequiredArgsConstructor
@Slf4j
public class AndroidDeviceHomeServiceImpl implements AndroidDeviceHomeService {
public class AndroidDeviceServiceImpl implements AndroidDeviceService {
private static final Duration WEATHER_CACHE_TTL = Duration.ofHours(1);
private static final Duration WEATHER_CONNECT_TIMEOUT = Duration.ofSeconds(5);
@ -105,7 +107,29 @@ public class AndroidDeviceHomeServiceImpl implements AndroidDeviceHomeService {
return vo;
}
private Long calculateRemainingMinutes(Long tenantId, Long userId, boolean anonymous) {
@Override
public void updateDevice(String tenantCode, String deviceId, String deviceName, String terminalType, String terminalVersion) {
DeviceInfoEntity existingDevice = deviceInfoMapper.selectByDeviceCodeIgnoreTenant(deviceId);
boolean update = false;
if (StrUtil.isNotEmpty(deviceName)) {
existingDevice.setDeviceName(deviceName);
update = true;
}
if (StrUtil.isNotEmpty(terminalType)) {
existingDevice.setTerminalType(terminalType);
update = true;
}
if (StrUtil.isNotEmpty(terminalVersion)) {
existingDevice.setTerminalVersion(terminalVersion);
update = true;
}
if (!update) {
return;
}
deviceInfoMapper.updateBaseInfoByIdIgnoreTenant(existingDevice);
}
private Long calculateRemainingMinutes(Long tenantId, Long userId, boolean anonymous) {
if (tenantId == null) {
return 0L;
}

View File

@ -58,7 +58,7 @@ public class DeviceOnlineManagementServiceImpl implements DeviceOnlineManagement
return;
}
LocalDateTime now = LocalDateTime.now();
existing.setTerminalType(normalizeTerminalType(authContext.getPlatform()));
// existing.setTerminalType(normalizeTerminalType(authContext.getPlatform()));
existing.setTerminalVersion(normalize(authContext.getAppVersion()));
existing.setLastOnlineAt(now);
existing.setUserId(authContext.getUserId());