fix(iot): 定时任务设置租户上下文,确保RocketMQ消息正确携带租户信息
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user