From 333551f4a0a03c90020dafcf80b4eba8bf7bf09b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E6=AC=A7=EF=BC=88=E6=9E=97=E5=B9=B3=E5=87=A1?= =?UTF-8?q?=EF=BC=89?= Date: Wed, 26 Feb 2025 15:37:15 +0800 Subject: [PATCH] 1 --- .../java/cn/van/business/util/JDUtil.java | 156 ++++++++++-------- 1 file changed, 84 insertions(+), 72 deletions(-) diff --git a/src/main/java/cn/van/business/util/JDUtil.java b/src/main/java/cn/van/business/util/JDUtil.java index 1bec9bf..39c329a 100644 --- a/src/main/java/cn/van/business/util/JDUtil.java +++ b/src/main/java/cn/van/business/util/JDUtil.java @@ -1152,85 +1152,97 @@ public class JDUtil { * * */ @Scheduled(fixedRate = 60000) // 每分钟执行一次 -public void cleanUpTimeoutStates() { - LocalDateTime now = LocalDateTime.now(); - Objects.requireNonNull(redisTemplate.keys(INTERACTION_STATE_PREFIX + "*")).forEach(key -> { - String stateJson = redisTemplate.opsForValue().get(key); - try { - UserInteractionState state = objectMapper.readValue(stateJson, UserInteractionState.class); - LocalDateTime lastInteractionTime = LocalDateTime.parse(state.getLastInteractionTime(), DATE_TIME_FORMATTER); - if (ChronoUnit.MINUTES.between(lastInteractionTime, now) > TIMEOUT_MINUTES) { - redisTemplate.delete(key); + public void cleanUpTimeoutStates() { + LocalDateTime now = LocalDateTime.now(); + redisTemplate.keys(INTERACTION_STATE_PREFIX + "*").forEach(key -> { + String stateJson = redisTemplate.opsForValue().get(key); + try { + UserInteractionState state = objectMapper.readValue(stateJson, UserInteractionState.class); + LocalDateTime lastInteractionTime = LocalDateTime.parse(state.getLastInteractionTime(), DATE_TIME_FORMATTER); + if (ChronoUnit.MINUTES.between(lastInteractionTime, now) > TIMEOUT_MINUTES) { + redisTemplate.delete(key); + logger.debug("Deleted timeout state for key: {}", key); + } + } catch (Exception e) { + logger.error("Error parsing interaction state: " + e.getMessage()); } - } catch (Exception e) { - logger.error("Error parsing interaction state: " + e.getMessage()); - } - }); -} -public void handleUserInteraction(String fromWxid, String message) { - String key = INTERACTION_STATE_PREFIX + fromWxid; - String stateJson = redisTemplate.opsForValue().get(key); - UserInteractionState state; - if (stateJson == null) { - state = new UserInteractionState(); - } else { - try { - state = objectMapper.readValue(stateJson, UserInteractionState.class); - // 检查是否超时 - LocalDateTime now = LocalDateTime.now(); - LocalDateTime lastInteractionTime = LocalDateTime.parse(state.getLastInteractionTime(), DATE_TIME_FORMATTER); - if (ChronoUnit.MINUTES.between(lastInteractionTime, now) > TIMEOUT_MINUTES) { - redisTemplate.delete(key); + }); + } + + public void handleUserInteraction(String fromWxid, String message) { + String key = INTERACTION_STATE_PREFIX + fromWxid; + String stateJson = redisTemplate.opsForValue().get(key); + UserInteractionState state; + if (stateJson == null) { + state = new UserInteractionState(); + logger.debug("New interaction state created for user: {}", fromWxid); + } else { + try { + state = objectMapper.readValue(stateJson, UserInteractionState.class); + // 检查是否超时 + LocalDateTime now = LocalDateTime.now(); + LocalDateTime lastInteractionTime = LocalDateTime.parse(state.getLastInteractionTime(), DATE_TIME_FORMATTER); + if (ChronoUnit.MINUTES.between(lastInteractionTime, now) > TIMEOUT_MINUTES) { + redisTemplate.delete(key); + logger.debug("Deleted timeout state for user: {}", fromWxid); + state = new UserInteractionState(); + } + } catch (Exception e) { + logger.error("Error parsing interaction state: " + e.getMessage()); state = new UserInteractionState(); } + } + state.updateLastInteractionTime(); + + switch (state.getCurrentState()) { + case "INIT": + if ("消毒柜".equals(message)) { + wxUtil.sendTextMessage(fromWxid, "1,查询消毒柜订单;2,输入新的订单;3,修改订单", 1, fromWxid); + state.setCurrentState("DISINFECTANT_CABINET"); + logger.debug("User {} entered DISINFECTANT_CABINET state", fromWxid); + } + break; + case "DISINFECTANT_CABINET": + switch (message) { + case "1": + // 查询消毒柜订单的逻辑 + wxUtil.sendTextMessage(fromWxid, "查询消毒柜订单的逻辑", 1, fromWxid); + state.setCurrentState("INIT"); + logger.debug("User {} queried disinfectant cabinet orders", fromWxid); + break; + case "2": + // 输入新的订单的逻辑 + wxUtil.sendTextMessage(fromWxid, "输入新的订单的逻辑", 1, fromWxid); + state.setCurrentState("INIT"); + logger.debug("User {} input new disinfectant cabinet order", fromWxid); + break; + case "3": + // 修改订单的逻辑 + wxUtil.sendTextMessage(fromWxid, "修改订单的逻辑", 1, fromWxid); + state.setCurrentState("INIT"); + logger.debug("User {} modified disinfectant cabinet order", fromWxid); + break; + default: + wxUtil.sendTextMessage(fromWxid, "无效的选择,请重新选择", 1, fromWxid); + logger.debug("User {} made invalid choice: {}", fromWxid, message); + break; + } + break; + default: + wxUtil.sendTextMessage(fromWxid, "无效的状态,请重新开始对话", 1, fromWxid); + state.setCurrentState("INIT"); + logger.debug("User {} reset to INIT state due to invalid state", fromWxid); + break; + } + + try { + redisTemplate.opsForValue().set(key, objectMapper.writeValueAsString(state), TIMEOUT_MINUTES, TimeUnit.MINUTES); + logger.debug("Saved interaction state for user {}: {}", fromWxid, state); } catch (Exception e) { - logger.error("Error parsing interaction state: " + e.getMessage()); - state = new UserInteractionState(); + logger.error("Error saving interaction state: " + e.getMessage()); } } - state.updateLastInteractionTime(); - switch (state.getCurrentState()) { - case "INIT": - if ("消毒柜".equals(message)) { - wxUtil.sendTextMessage(fromWxid, "1,查询消毒柜订单;2,输入新的订单;3,修改订单", 1, fromWxid); - state.setCurrentState("DISINFECTANT_CABINET"); - } - break; - case "DISINFECTANT_CABINET": - switch (message) { - case "1": - // 查询消毒柜订单的逻辑 - wxUtil.sendTextMessage(fromWxid, "查询消毒柜订单的逻辑", 1, fromWxid); - state.setCurrentState("INIT"); - break; - case "2": - // 输入新的订单的逻辑 - wxUtil.sendTextMessage(fromWxid, "输入新的订单的逻辑", 1, fromWxid); - state.setCurrentState("INIT"); - break; - case "3": - // 修改订单的逻辑 - wxUtil.sendTextMessage(fromWxid, "修改订单的逻辑", 1, fromWxid); - state.setCurrentState("INIT"); - break; - default: - wxUtil.sendTextMessage(fromWxid, "无效的选择,请重新选择", 1, fromWxid); - break; - } - break; - default: - wxUtil.sendTextMessage(fromWxid, "无效的状态,请重新开始对话", 1, fromWxid); - state.setCurrentState("INIT"); - break; - } - - try { - redisTemplate.opsForValue().set(key, objectMapper.writeValueAsString(state), TIMEOUT_MINUTES, TimeUnit.MINUTES); - } catch (Exception e) { - logger.error("Error saving interaction state: " + e.getMessage()); - } -} }