fix(iot): 定时任务设置租户上下文,确保RocketMQ消息正确携带租户信息
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled

This commit is contained in:
lzh
2026-01-30 09:09:08 +08:00
parent 1bdcfa1cc0
commit 895fcc2712

View File

@@ -13,6 +13,7 @@ import com.xxl.job.core.handler.annotation.XxlJob;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import com.viewsh.framework.tenant.core.util.TenantUtils;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Component;
@@ -67,6 +68,15 @@ public class SignalLossRuleProcessor {
*/
@XxlJob("signalLossCheckJob")
public String checkLossTimeout() {
// TODO: 设置租户上下文单租户场景使用固定租户ID=1
// 确保后续发送的 RocketMQ 消息正确携带租户信息
return TenantUtils.execute(1L, () -> doCheckLossTimeout());
}
/**
* 执行离岗超时检查
*/
private String doCheckLossTimeout() {
try {
log.debug("[SignalLoss] 开始检查离岗超时");
@@ -122,8 +132,8 @@ public class SignalLossRuleProcessor {
}
// 1. 获取该区域的信标配置(从 BEACON 类型的设备获取)
CleanOrderIntegrationConfigService.AreaDeviceConfigWrapper beaconConfigWrapper =
configService.getConfigByAreaIdAndRelationType(areaId, "BEACON");
CleanOrderIntegrationConfigService.AreaDeviceConfigWrapper beaconConfigWrapper = configService
.getConfigByAreaIdAndRelationType(areaId, "BEACON");
if (beaconConfigWrapper == null || beaconConfigWrapper.getConfig() == null ||
beaconConfigWrapper.getConfig().getBeaconPresence() == null) {
@@ -134,8 +144,8 @@ public class SignalLossRuleProcessor {
BeaconPresenceConfig.ExitConfig exitConfig = beaconConfigWrapper.getConfig().getBeaconPresence().getExit();
// 2. 获取工牌设备信息(用于获取 deviceKey
CleanOrderIntegrationConfigService.AreaDeviceConfigWrapper badgeConfigWrapper =
configService.getConfigWrapperByDeviceId(deviceId);
CleanOrderIntegrationConfigService.AreaDeviceConfigWrapper badgeConfigWrapper = configService
.getConfigWrapperByDeviceId(deviceId);
String badgeDeviceKey = (badgeConfigWrapper != null) ? badgeConfigWrapper.getDeviceKey() : null;
@@ -194,8 +204,8 @@ public class SignalLossRuleProcessor {
* 处理无效作业(时长不足)
*/
private void handleInvalidWork(Long deviceId, String deviceKey, Long areaId,
Long durationMs, Long minValidWorkMillis,
BeaconPresenceConfig.ExitConfig exitConfig) {
Long durationMs, Long minValidWorkMillis,
BeaconPresenceConfig.ExitConfig exitConfig) {
log.warn("[SignalLoss] 作业时长不足抑制自动完成deviceId={}, duration={}ms, minRequired={}ms",
deviceId, durationMs, minValidWorkMillis);
@@ -222,13 +232,12 @@ public class SignalLossRuleProcessor {
* 处理超时自动完成
*/
private void handleTimeoutComplete(Long deviceId, String deviceKey, Long areaId,
Long durationMs, Long lastLossTime) {
Long durationMs, Long lastLossTime) {
log.info("[SignalLoss] 触发自动完成deviceId={}, areaId={}, duration={}ms",
deviceId, areaId, durationMs);
// 1. 获取当前工单
BadgeDeviceStatusRedisDAO.OrderInfo currentOrder =
badgeDeviceStatusRedisDAO.getCurrentOrder(deviceId);
BadgeDeviceStatusRedisDAO.OrderInfo currentOrder = badgeDeviceStatusRedisDAO.getCurrentOrder(deviceId);
if (currentOrder == null) {
log.warn("[SignalLoss] 设备无当前工单deviceId={}", deviceId);
@@ -291,7 +300,7 @@ public class SignalLossRuleProcessor {
* 发布审计事件
*/
private void publishAuditEvent(String auditType, Long deviceId, String deviceKey,
Long areaId, String message, Map<String, Object> data) {
Long areaId, String message, Map<String, Object> data) {
try {
CleanOrderAuditEvent event = CleanOrderAuditEvent.builder()
.eventId(java.util.UUID.randomUUID().toString())
@@ -332,8 +341,7 @@ public class SignalLossRuleProcessor {
* @return true-工单切换场景false-正常离岗场景
*/
private boolean isSwitchingOrder(Long deviceId, Long areaId) {
BadgeDeviceStatusRedisDAO.OrderInfo currentOrder =
badgeDeviceStatusRedisDAO.getCurrentOrder(deviceId);
BadgeDeviceStatusRedisDAO.OrderInfo currentOrder = badgeDeviceStatusRedisDAO.getCurrentOrder(deviceId);
return currentOrder != null && !currentOrder.getAreaId().equals(areaId);
}
}