diff --git a/.idea/diff-generator.xml b/.idea/diff-generator.xml
index 7c8608f..a556299 100644
--- a/.idea/diff-generator.xml
+++ b/.idea/diff-generator.xml
@@ -1,8 +1,7 @@
-
-
-
-
+
+
+
\ No newline at end of file
diff --git a/.idea/jpb-settings.xml b/.idea/jpb-settings.xml
index a6e603a..6965cbc 100644
--- a/.idea/jpb-settings.xml
+++ b/.idea/jpb-settings.xml
@@ -1,4 +1,4 @@
-
+
\ No newline at end of file
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 292a95c..5c0df1a 100644
--- a/src/main/java/cn/van/business/model/jd/ProductOrder.java
+++ b/src/main/java/cn/van/business/model/jd/ProductOrder.java
@@ -1,6 +1,10 @@
package cn.van.business.model.jd;
import jakarta.persistence.*;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
import java.util.Date;
@@ -9,6 +13,10 @@ import java.util.Date;
*/
@Entity
@Table(name = "product_order")
+@Setter
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
public class ProductOrder {
/**
@@ -29,7 +37,7 @@ public class ProductOrder {
* 商品类型。
*/
@Column(name = "sku_type")
- private String skuType;
+ private Integer skuType;
/**
* 订单号。
@@ -82,225 +90,10 @@ public class ProductOrder {
private String recipientPhone;
@Column(name = "recipient_address")
private String recipientAddress;
+ // 谁的单
+ @Column(name = "who_order")
+ private String whoOrder;
+ @Column(name = "from_wxid")
+ private String fromWxid;
- 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。
- *
- * @return 主键ID
- */
- public Long getId() {
- return id;
- }
-
- /**
- * 设置主键ID。
- *
- * @param id 主键ID
- */
- public void setId(Long id) {
- this.id = id;
- }
-
- /**
- * 获取商品名称。
- *
- * @return 商品名称
- */
- public String getSkuName() {
- return skuName;
- }
-
- /**
- * 设置商品名称。
- *
- * @param skuName 商品名称
- */
- public void setSkuName(String skuName) {
- this.skuName = skuName;
- }
-
- /**
- * 获取商品类型。
- *
- * @return 商品类型
- */
- public String getSkuType() {
- return skuType;
- }
-
- /**
- * 设置商品类型。
- *
- * @param skuType 商品类型
- */
- public void setSkuType(String skuType) {
- this.skuType = skuType;
- }
-
- /**
- * 获取订单号。
- *
- * @return 订单号
- */
- public String getOrderId() {
- return orderId;
- }
-
- /**
- * 设置订单号。
- *
- * @param orderId 订单号
- */
- public void setOrderId(String orderId) {
- this.orderId = orderId;
- }
-
- /**
- * 获取下单时间。
- *
- * @return 下单时间
- */
- public Date getOrderTime() {
- return orderTime;
- }
-
- /**
- * 设置下单时间。
- *
- * @param orderTime 下单时间
- */
- public void setOrderTime(Date orderTime) {
- this.orderTime = orderTime;
- }
-
- /**
- * 获取下单账号。
- *
- * @return 下单账号
- */
- public String getOrderAccount() {
- return orderAccount;
- }
-
- /**
- * 设置下单账号。
- *
- * @param orderAccount 下单账号
- */
- public void setOrderAccount(String orderAccount) {
- this.orderAccount = orderAccount;
- }
-
- /**
- * 获取是否晒图登记。
- *
- * @return 是否晒图登记
- */
- public Boolean getIsReviewed() {
- return isReviewed;
- }
-
- /**
- * 设置是否晒图登记。
- *
- * @param isReviewed 是否晒图登记
- */
- public void setIsReviewed(Boolean isReviewed) {
- this.isReviewed = isReviewed;
- }
-
- /**
- * 获取晒图时间。
- *
- * @return 晒图时间
- */
- public Date getReviewTime() {
- return reviewTime;
- }
-
- /**
- * 设置晒图时间。
- *
- * @param reviewTime 晒图时间
- */
- public void setReviewTime(Date reviewTime) {
- this.reviewTime = reviewTime;
- }
-
- /**
- * 获取是否返现到账。
- *
- * @return 是否返现到账
- */
- public Boolean getIsCashbackReceived() {
- return isCashbackReceived;
- }
-
- /**
- * 设置是否返现到账。
- *
- * @param isCashbackReceived 是否返现到账
- */
- public void setIsCashbackReceived(Boolean isCashbackReceived) {
- this.isCashbackReceived = isCashbackReceived;
- }
-
- /**
- * 获取到账时间。
- *
- * @return 到账时间
- */
- public Date getCashbackTime() {
- return cashbackTime;
- }
-
- /**
- * 设置到账时间。
- *
- * @param cashbackTime 到账时间
- */
- public void setCashbackTime(Date cashbackTime) {
- this.cashbackTime = cashbackTime;
- }
}
diff --git a/src/main/java/cn/van/business/model/jd/update-schema.sql b/src/main/java/cn/van/business/model/jd/update-schema.sql
new file mode 100644
index 0000000..88594c6
--- /dev/null
+++ b/src/main/java/cn/van/business/model/jd/update-schema.sql
@@ -0,0 +1,19 @@
+CREATE TABLE product_order
+(
+ id BIGINT AUTO_INCREMENT NOT NULL,
+ sku_name VARCHAR(255) NULL,
+ sku_type INT NULL,
+ order_id VARCHAR(255) NULL,
+ order_time datetime NULL,
+ order_account VARCHAR(255) NULL,
+ is_reviewed BIT(1) NULL,
+ review_time datetime NULL,
+ is_cashback_received BIT(1) NULL,
+ cashback_time datetime NULL,
+ recipient_name VARCHAR(255) NULL,
+ recipient_phone VARCHAR(255) NULL,
+ recipient_address VARCHAR(255) NULL,
+ who_order VARCHAR(255) NULL,
+ from_wxid VARCHAR(255) NULL,
+ CONSTRAINT pk_product_order PRIMARY KEY (id)
+);
diff --git a/src/main/java/cn/van/business/model/update-schema.sql b/src/main/java/cn/van/business/model/update-schema.sql
new file mode 100644
index 0000000..30d8edb
--- /dev/null
+++ b/src/main/java/cn/van/business/model/update-schema.sql
@@ -0,0 +1,18 @@
+CREATE TABLE product_order
+(
+ id BIGINT AUTO_INCREMENT NOT NULL,
+ sku_name VARCHAR(255) NULL,
+ sku_type INT NULL,
+ order_id VARCHAR(255) NULL,
+ order_time datetime NULL,
+ order_account VARCHAR(255) NULL,
+ is_reviewed BIT(1) NULL,
+ review_time datetime NULL,
+ is_cashback_received BIT(1) NULL,
+ cashback_time datetime NULL,
+ recipient_name VARCHAR(255) NULL,
+ recipient_phone VARCHAR(255) NULL,
+ recipient_address VARCHAR(255) NULL,
+ who_order VARCHAR(255) NULL,
+ CONSTRAINT pk_product_order PRIMARY KEY (id)
+);
diff --git a/src/main/java/cn/van/business/util/JDUtil.java b/src/main/java/cn/van/business/util/JDUtil.java
index 4b74673..2c32e59 100644
--- a/src/main/java/cn/van/business/util/JDUtil.java
+++ b/src/main/java/cn/van/business/util/JDUtil.java
@@ -43,6 +43,7 @@ import java.util.stream.Stream;
import static cn.van.business.util.JDUtil.UserInteractionState.GiftMoneyStep.*;
import static cn.van.business.util.JDUtil.UserInteractionState.ProcessState.*;
+import static cn.van.business.util.JDUtil.UserInteractionState.ProductOrderStep.*;
import static cn.van.business.util.WXUtil.super_admins;
/**
@@ -1241,6 +1242,117 @@ public class JDUtil {
// 实现实际的开通接口调用
return true;
}
+ public void handleProductOrderRegistration(String fromWxid, String message, UserInteractionState state) {
+ switch (state.getCurrentProductOrderStep()) {
+ case STEP_ORDER_ID:
+ if (!message.matches("^\\d{10,20}$")) {
+ wxUtil.sendTextMessage(fromWxid, "⚠️ 订单号格式错误(需10-20位数字)", 1, fromWxid);
+ return;
+ }
+ state.getCollectedFields().put("orderId", message);
+ state.setCurrentProductOrderStep(STEP_PRODUCT_INFO);
+ wxUtil.sendTextMessage(fromWxid,
+ "请输入商品信息(格式:商品名称-类型编号)\n类型对照:1-家电 2-数码 3-服饰\n示例:格力空调-1", 1, fromWxid);
+ break;
+
+ case STEP_PRODUCT_INFO:
+ String[] productInfo = message.split("-");
+ if (productInfo.length != 2 || !productInfo[1].matches("[1-3]")) {
+ wxUtil.sendTextMessage(fromWxid, "❌ 格式错误或类型编号无效", 1, fromWxid);
+ return;
+ }
+ state.getCollectedFields().put("skuName", productInfo[0]);
+ state.getCollectedFields().put("skuType", productInfo[1]);
+
+ state.setCurrentProductOrderStep(UserInteractionState.ProductOrderStep.STEP_RECIPIENT_INFO);
+ wxUtil.sendTextMessage(fromWxid,
+ "请输入收件信息(格式:姓名-电话-地址)\n示例:张三-13812345678-北京市朝阳区", 1, fromWxid);
+ break;
+
+ case STEP_RECIPIENT_INFO:
+ String[] recipientInfo = message.split("-");
+ if (recipientInfo.length < 3) {
+ wxUtil.sendTextMessage(fromWxid, "❌ 格式错误,请按示例格式输入", 1, fromWxid);
+ return;
+ }
+ state.getCollectedFields().put("recipientName", recipientInfo[0]);
+ state.getCollectedFields().put("recipientPhone", recipientInfo[1]);
+ state.getCollectedFields().put("recipientAddress", String.join("-", Arrays.copyOfRange(recipientInfo, 2, recipientInfo.length)));
+
+ // 生成确认信息
+ String confirmMsg = buildConfirmMessage(state);
+ wxUtil.sendTextMessage(fromWxid, confirmMsg, 1, fromWxid);
+ state.setCurrentProductOrderStep(STEP_REVIEW_CONFIRM);
+ break;
+
+ case STEP_REVIEW_CONFIRM:
+ if ("确认".equals(message)) {
+ boolean success = saveFullProductOrder(state, fromWxid);
+ wxUtil.sendTextMessage(fromWxid,
+ success ? "✅ 订单登记成功!" : "❌ 保存失败,请联系管理员", 1, fromWxid);
+ state.reset();
+ } else {
+ state.setCurrentProductOrderStep(STEP_ORDER_ID);
+ wxUtil.sendTextMessage(fromWxid, "请重新输入订单号:", 1, fromWxid);
+ }
+ break;
+ }
+ }
+
+ // 构建确认信息模板
+ private String buildConfirmMessage(UserInteractionState state) {
+ return "📋 请确认登记信息:\n" +
+ "────────────────\n" +
+ "▪ 订单号:" + state.getCollectedFields().get("orderId") + "\n" +
+ "▪ 商品名称:" + state.getCollectedFields().get("skuName") + "\n" +
+ "▪ 商品类型:" + getTypeDesc(state.getCollectedFields().get("skuType")) + "\n" +
+ "▪ 收件人:" + state.getCollectedFields().get("recipientName") + "\n" +
+ "▪ 联系方式:" + state.getCollectedFields().get("recipientPhone") + "\n" +
+ "▪ 收货地址:" + state.getCollectedFields().get("recipientAddress") + "\n" +
+ "────────────────\n" +
+ "回复【确认】提交,其他内容重新开始";
+ }
+
+ // 保存完整订单
+ private boolean saveFullProductOrder(UserInteractionState state, String fromWxid) {
+ try {
+ ProductOrder order = new ProductOrder();
+ order.setOrderId(state.getCollectedFields().get("orderId"));
+ order.setSkuName(state.getCollectedFields().get("skuName"));
+ order.setSkuType(Integer.valueOf(state.getCollectedFields().get("skuType")));
+ order.setRecipientName(state.getCollectedFields().get("recipientName"));
+ order.setRecipientPhone(state.getCollectedFields().get("recipientPhone"));
+ order.setRecipientAddress(state.getCollectedFields().get("recipientAddress"));
+ order.setOrderTime(new Date()); // 设置下单时间为当前时间
+ order.setWhoOrder(state.getCollectedFields().get("recipientName")); // 关联管理员信息
+ order.setIsReviewed(false); // 默认是否晒图登记
+ order.setIsCashbackReceived(false); // 默认是否返现到账
+ order.setFromWxid(fromWxid); // 设置当前交互的wxid
+
+ productOrderRepository.save(order);
+ logger.info("订单登记成功:{}", order);
+ return true;
+ } catch (Exception e) {
+ logger.error("订单保存异常:{}", e.getMessage());
+ return false;
+ }
+ }
+
+ // 获取商品类型描述
+ private String getTypeDesc(String skuType) {
+ switch (skuType) {
+ case "1":
+ return "家电";
+ case "2":
+ return "数码";
+ case "3":
+ return "服饰";
+ default:
+ return "未知类型";
+ }
+ }
+
+
// 定义一个内部类来存储用户交互状态
@Getter
@@ -1248,19 +1360,27 @@ public class JDUtil {
static class UserInteractionState {
// 推荐使用枚举管理状态
public enum ProcessState {
- INIT, GIFT_MONEY_FLOW, DISINFECTANT_CABINET
+ INIT, GIFT_MONEY_FLOW, DISINFECTANT_CABINET,PRODUCT_ORDER_REGISTRATION
}
public enum GiftMoneyStep {
STEP_PRODUCT_LINK, STEP_AMOUNT, STEP_QUANTITY
}
-
+ // 在UserInteractionState类中新增步骤枚举
+ public enum ProductOrderStep {
+ STEP_ORDER_ID,
+ STEP_PRODUCT_INFO,
+ STEP_RECIPIENT_INFO,
+ STEP_REVIEW_CONFIRM,
+ STEP_CASHBACK_TRACK
+ }
private GiftMoneyStep currentStep; // 新增当前步骤字段
private String lastInteractionTime;
private ProcessState currentState;
private Map collectedFields; // 用于存储收集到的字段值
private String currentField; // 当前正在询问的字段
+ private ProductOrderStep currentProductOrderStep;
public UserInteractionState() {
this.lastInteractionTime = LocalDateTime.now().format(DATE_TIME_FORMATTER);