This commit is contained in:
雷欧(林平凡)
2025-02-26 15:37:15 +08:00
parent d8c3450426
commit 333551f4a0

View File

@@ -1152,27 +1152,30 @@ public class JDUtil {
* *
* */ * */
@Scheduled(fixedRate = 60000) // 每分钟执行一次 @Scheduled(fixedRate = 60000) // 每分钟执行一次
public void cleanUpTimeoutStates() { public void cleanUpTimeoutStates() {
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
Objects.requireNonNull(redisTemplate.keys(INTERACTION_STATE_PREFIX + "*")).forEach(key -> { redisTemplate.keys(INTERACTION_STATE_PREFIX + "*").forEach(key -> {
String stateJson = redisTemplate.opsForValue().get(key); String stateJson = redisTemplate.opsForValue().get(key);
try { try {
UserInteractionState state = objectMapper.readValue(stateJson, UserInteractionState.class); UserInteractionState state = objectMapper.readValue(stateJson, UserInteractionState.class);
LocalDateTime lastInteractionTime = LocalDateTime.parse(state.getLastInteractionTime(), DATE_TIME_FORMATTER); LocalDateTime lastInteractionTime = LocalDateTime.parse(state.getLastInteractionTime(), DATE_TIME_FORMATTER);
if (ChronoUnit.MINUTES.between(lastInteractionTime, now) > TIMEOUT_MINUTES) { if (ChronoUnit.MINUTES.between(lastInteractionTime, now) > TIMEOUT_MINUTES) {
redisTemplate.delete(key); redisTemplate.delete(key);
logger.debug("Deleted timeout state for key: {}", key);
} }
} catch (Exception e) { } catch (Exception e) {
logger.error("Error parsing interaction state: " + e.getMessage()); logger.error("Error parsing interaction state: " + e.getMessage());
} }
}); });
} }
public void handleUserInteraction(String fromWxid, String message) {
public void handleUserInteraction(String fromWxid, String message) {
String key = INTERACTION_STATE_PREFIX + fromWxid; String key = INTERACTION_STATE_PREFIX + fromWxid;
String stateJson = redisTemplate.opsForValue().get(key); String stateJson = redisTemplate.opsForValue().get(key);
UserInteractionState state; UserInteractionState state;
if (stateJson == null) { if (stateJson == null) {
state = new UserInteractionState(); state = new UserInteractionState();
logger.debug("New interaction state created for user: {}", fromWxid);
} else { } else {
try { try {
state = objectMapper.readValue(stateJson, UserInteractionState.class); state = objectMapper.readValue(stateJson, UserInteractionState.class);
@@ -1181,6 +1184,7 @@ public void handleUserInteraction(String fromWxid, String message) {
LocalDateTime lastInteractionTime = LocalDateTime.parse(state.getLastInteractionTime(), DATE_TIME_FORMATTER); LocalDateTime lastInteractionTime = LocalDateTime.parse(state.getLastInteractionTime(), DATE_TIME_FORMATTER);
if (ChronoUnit.MINUTES.between(lastInteractionTime, now) > TIMEOUT_MINUTES) { if (ChronoUnit.MINUTES.between(lastInteractionTime, now) > TIMEOUT_MINUTES) {
redisTemplate.delete(key); redisTemplate.delete(key);
logger.debug("Deleted timeout state for user: {}", fromWxid);
state = new UserInteractionState(); state = new UserInteractionState();
} }
} catch (Exception e) { } catch (Exception e) {
@@ -1195,6 +1199,7 @@ public void handleUserInteraction(String fromWxid, String message) {
if ("消毒柜".equals(message)) { if ("消毒柜".equals(message)) {
wxUtil.sendTextMessage(fromWxid, "1查询消毒柜订单2输入新的订单3修改订单", 1, fromWxid); wxUtil.sendTextMessage(fromWxid, "1查询消毒柜订单2输入新的订单3修改订单", 1, fromWxid);
state.setCurrentState("DISINFECTANT_CABINET"); state.setCurrentState("DISINFECTANT_CABINET");
logger.debug("User {} entered DISINFECTANT_CABINET state", fromWxid);
} }
break; break;
case "DISINFECTANT_CABINET": case "DISINFECTANT_CABINET":
@@ -1203,34 +1208,41 @@ public void handleUserInteraction(String fromWxid, String message) {
// 查询消毒柜订单的逻辑 // 查询消毒柜订单的逻辑
wxUtil.sendTextMessage(fromWxid, "查询消毒柜订单的逻辑", 1, fromWxid); wxUtil.sendTextMessage(fromWxid, "查询消毒柜订单的逻辑", 1, fromWxid);
state.setCurrentState("INIT"); state.setCurrentState("INIT");
logger.debug("User {} queried disinfectant cabinet orders", fromWxid);
break; break;
case "2": case "2":
// 输入新的订单的逻辑 // 输入新的订单的逻辑
wxUtil.sendTextMessage(fromWxid, "输入新的订单的逻辑", 1, fromWxid); wxUtil.sendTextMessage(fromWxid, "输入新的订单的逻辑", 1, fromWxid);
state.setCurrentState("INIT"); state.setCurrentState("INIT");
logger.debug("User {} input new disinfectant cabinet order", fromWxid);
break; break;
case "3": case "3":
// 修改订单的逻辑 // 修改订单的逻辑
wxUtil.sendTextMessage(fromWxid, "修改订单的逻辑", 1, fromWxid); wxUtil.sendTextMessage(fromWxid, "修改订单的逻辑", 1, fromWxid);
state.setCurrentState("INIT"); state.setCurrentState("INIT");
logger.debug("User {} modified disinfectant cabinet order", fromWxid);
break; break;
default: default:
wxUtil.sendTextMessage(fromWxid, "无效的选择,请重新选择", 1, fromWxid); wxUtil.sendTextMessage(fromWxid, "无效的选择,请重新选择", 1, fromWxid);
logger.debug("User {} made invalid choice: {}", fromWxid, message);
break; break;
} }
break; break;
default: default:
wxUtil.sendTextMessage(fromWxid, "无效的状态,请重新开始对话", 1, fromWxid); wxUtil.sendTextMessage(fromWxid, "无效的状态,请重新开始对话", 1, fromWxid);
state.setCurrentState("INIT"); state.setCurrentState("INIT");
logger.debug("User {} reset to INIT state due to invalid state", fromWxid);
break; break;
} }
try { try {
redisTemplate.opsForValue().set(key, objectMapper.writeValueAsString(state), TIMEOUT_MINUTES, TimeUnit.MINUTES); redisTemplate.opsForValue().set(key, objectMapper.writeValueAsString(state), TIMEOUT_MINUTES, TimeUnit.MINUTES);
logger.debug("Saved interaction state for user {}: {}", fromWxid, state);
} catch (Exception e) { } catch (Exception e) {
logger.error("Error saving interaction state: " + e.getMessage()); logger.error("Error saving interaction state: " + e.getMessage());
} }
} }
} }