diff --git a/src/main/java/cn/van/business/model/jd/ProductOrder.java b/src/main/java/cn/van/business/model/jd/ProductOrder.java index d42027d..0557a3d 100644 --- a/src/main/java/cn/van/business/model/jd/ProductOrder.java +++ b/src/main/java/cn/van/business/model/jd/ProductOrder.java @@ -74,8 +74,54 @@ public class ProductOrder { @Temporal(TemporalType.TIMESTAMP) @Column(name = "cashback_time") private Date cashbackTime; + //收货信息 + @Column(name = "recipient_name") + private String recipientName; + @Column(name = "recipient_phone") + private String recipientPhone; + @Column(name = "recipient_address") + private String recipientAddress; - // Getters and Setters + public Boolean getReviewed() { + return isReviewed; + } + + public void setReviewed(Boolean reviewed) { + isReviewed = reviewed; + } + + public Boolean getCashbackReceived() { + return isCashbackReceived; + } + + public void setCashbackReceived(Boolean cashbackReceived) { + isCashbackReceived = cashbackReceived; + } + + public String getRecipientName() { + return recipientName; + } + + public void setRecipientName(String recipientName) { + this.recipientName = recipientName; + } + + public String getRecipientPhone() { + return recipientPhone; + } + + public void setRecipientPhone(String recipientPhone) { + this.recipientPhone = recipientPhone; + } + + public String getRecipientAddress() { + return recipientAddress; + } + + public void setRecipientAddress(String recipientAddress) { + this.recipientAddress = recipientAddress; + } +// Getters and Setters /** * 获取主键ID。 diff --git a/src/main/java/cn/van/business/repository/ProductOrderRepository.java b/src/main/java/cn/van/business/repository/ProductOrderRepository.java new file mode 100644 index 0000000..9ee8c9c --- /dev/null +++ b/src/main/java/cn/van/business/repository/ProductOrderRepository.java @@ -0,0 +1,7 @@ +package cn.van.business.repository; + +import cn.van.business.model.jd.ProductOrder; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ProductOrderRepository extends JpaRepository { +} diff --git a/src/main/java/cn/van/business/util/JDUtil.java b/src/main/java/cn/van/business/util/JDUtil.java index d8e8b1b..3de4ae2 100644 --- a/src/main/java/cn/van/business/util/JDUtil.java +++ b/src/main/java/cn/van/business/util/JDUtil.java @@ -2,7 +2,9 @@ package cn.van.business.util; import cn.van.business.model.jd.OrderRow; +import cn.van.business.model.jd.ProductOrder; import cn.van.business.repository.OrderRowRepository; +import cn.van.business.repository.ProductOrderRepository; import com.alibaba.fastjson2.util.DateUtils; import com.fasterxml.jackson.databind.ObjectMapper; import com.jd.open.api.sdk.DefaultJdClient; @@ -74,6 +76,7 @@ public class JDUtil { private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); private final StringRedisTemplate redisTemplate; private final OrderRowRepository orderRowRepository; + private final ProductOrderRepository productOrderRepository; private final WXUtil wxUtil; private final OrderUtil orderUtil; private static final String INTERACTION_STATE_PREFIX = "interaction_state:"; @@ -81,30 +84,37 @@ public class JDUtil { // 构造函数中注入StringRedisTemplate @Autowired - public JDUtil(StringRedisTemplate redisTemplate, OrderRowRepository orderRowRepository, WXUtil wxUtil, OrderUtil orderUtil) { + public JDUtil(StringRedisTemplate redisTemplate, + ProductOrderRepository productOrderRepository,OrderRowRepository orderRowRepository, WXUtil wxUtil, OrderUtil orderUtil) { this.redisTemplate = redisTemplate; this.orderRowRepository = orderRowRepository; + this.productOrderRepository = productOrderRepository; this.wxUtil = wxUtil; this.orderUtil = orderUtil; } // 定义一个内部类来存储用户交互状态 - @Getter - @Setter - private static class UserInteractionState { - private String lastInteractionTime; - private String currentState; +@Getter +@Setter +private static class UserInteractionState { + private String lastInteractionTime; + private String currentState; + private Map collectedFields; // 用于存储收集到的字段值 + private String currentField; // 当前正在询问的字段 - public UserInteractionState() { - this.lastInteractionTime = LocalDateTime.now().format(DATE_TIME_FORMATTER); - this.currentState = "INIT"; - } - - public void updateLastInteractionTime() { - this.lastInteractionTime = LocalDateTime.now().format(DATE_TIME_FORMATTER); - } + public UserInteractionState() { + this.lastInteractionTime = LocalDateTime.now().format(DATE_TIME_FORMATTER); + this.currentState = "INIT"; + this.collectedFields = new HashMap<>(); + this.currentField = null; } + public void updateLastInteractionTime() { + this.lastInteractionTime = LocalDateTime.now().format(DATE_TIME_FORMATTER); + } +} + + // 添加ObjectMapper来序列化和反序列化UserInteractionState private final ObjectMapper objectMapper = new ObjectMapper(); @@ -1172,107 +1182,108 @@ public void sendOrderToWxByOrderDefault(String order, String fromWxid) { * * * */ - @Scheduled(fixedRate = 60000) // 每分钟执行一次 - 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()); - } - }); - } - - public void handleUserInteraction(String fromWxid, String message) { - String key = INTERACTION_STATE_PREFIX + fromWxid; +@Scheduled(fixedRate = 60000) // 每分钟执行一次 +public void cleanUpTimeoutStates() { + LocalDateTime now = LocalDateTime.now(); + redisTemplate.keys(INTERACTION_STATE_PREFIX + "*").forEach(key -> { 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()); + 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()); + } + }); +} + + +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(); } - } - state.updateLastInteractionTime(); - - switch (state.getCurrentState()) { - case "INIT": - if ("订单".equals(message)) { - //1,查询消毒柜订单;2,输入新的订单;3,修改订单 - String sb = """ - 请选择您要执行的操作: - 1,查询订单 - 2,输入新的订单 - 3,修改订单"""; - wxUtil.sendTextMessage(fromWxid, sb, 1, fromWxid); - state.setCurrentState("DISINFECTANT_CABINET"); - logger.debug("User {} entered DISINFECTANT_CABINET state", fromWxid); - } - break; - case "DISINFECTANT_CABINET": - switch (message) { - case "1": - // 查询消毒柜订单的逻辑 - String sb = ""; - - - - wxUtil.sendTextMessage(fromWxid, sb, 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 saving interaction state: {}", e.getMessage()); + logger.error("Error parsing interaction state: {}", e.getMessage()); + state = new UserInteractionState(); } } + state.updateLastInteractionTime(); + + switch (state.getCurrentState()) { + case "INIT": + if ("登记".equals(message)) { + // 开始登记新的订单 + state.setCurrentState("DISINFECTANT_CABINET"); + state.setCurrentField("orderId"); + wxUtil.sendTextMessage(fromWxid, "请输入订单号:", 1, fromWxid); + logger.debug("User {} entered DISINFECTANT_CABINET state", fromWxid); + } + break; + case "DISINFECTANT_CABINET": + if ("退出".equals(message)) { + state.setCurrentState("INIT"); + wxUtil.sendTextMessage(fromWxid, "退出登记", 1, fromWxid); + logger.debug("User {} exited DISINFECTANT_CABINET state", fromWxid); + } else { + state.getCollectedFields().put(state.getCurrentField(), message); + if (state.getCurrentField().equals("orderId")) { + state.setCurrentField("recipientName"); + wxUtil.sendTextMessage(fromWxid, "请输入收件人姓名:", 1, fromWxid); + } else if (state.getCurrentField().equals("recipientName")) { + state.setCurrentField("recipientPhone"); + wxUtil.sendTextMessage(fromWxid, "请输入收件人电话:", 1, fromWxid); + } else if (state.getCurrentField().equals("recipientPhone")) { + // 所有字段收集完毕,保存订单 + saveProductOrder(state.getCollectedFields()); + state.setCurrentState("INIT"); + wxUtil.sendTextMessage(fromWxid, "订单已登记", 1, fromWxid); + logger.debug("User {} completed order registration", fromWxid); + } + } + 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 saving interaction state: {}", e.getMessage()); + } +} +private void saveProductOrder(Map fields) { + // 创建 ProductOrder 对象并保存到数据库 + ProductOrder productOrder = new ProductOrder(); + productOrder.setOrderId(fields.get("orderId")); + productOrder.setOrderTime(new Date()); + productOrder.setRecipientName(fields.get("recipientName")); + // 设置其他字段... + + // 保存到数据库 + productOrderRepository.save(productOrder); + logger.debug("Saved product order: {}", productOrder); +}