基本完成转链。富贵指日可待!

This commit is contained in:
Leo
2025-04-05 02:18:06 +08:00
parent c81d0224c8
commit fca0a1d871
4 changed files with 52 additions and 53 deletions

View File

@@ -13,7 +13,7 @@ import static cn.van.business.util.JDUtil.UserInteractionState.GiftMoneyStep.STE
class AmountStepHandler implements FlowStepHandler {
public void handle(JDUtil util, String wxid, String input, JDUtil.UserInteractionState state) {
if (!util.isValidAmount(input)) {
util.wxUtil.sendTextMessage(wxid, "金额格式错误", 1, wxid);
util.wxUtil.sendTextMessage(wxid, "金额格式错误", 1, wxid,false);
return;
}
state.getCollectedFields().put("amount", input);

View File

@@ -364,7 +364,7 @@ public class JDUtil {
}
if (!contents.isEmpty()) {
for (StringBuilder stringBuilder : contents) {
wxUtil.sendTextMessage(fromWxid, stringBuilder.toString(), 1, fromWxid);
wxUtil.sendTextMessage(fromWxid, stringBuilder.toString(), 1, fromWxid, false);
}
}
@@ -480,13 +480,13 @@ public class JDUtil {
for (String s : split) {
content.append("https://item.jd.com/").append(s.trim()).append(".html").append("\r\n");
}
wxUtil.sendTextMessage(fromWxid, content.toString(), 1, fromWxid);
wxUtil.sendTextMessage(fromWxid, content.toString(), 1, fromWxid, false);
content = new StringBuilder();
content.append("手机端").append("\r\n");
for (String s : split) {
content.append("https://item.m.jd.com/product/").append(s.trim()).append(".html").append("\r\n");
}
wxUtil.sendTextMessage(fromWxid, content.toString(), 1, fromWxid);
wxUtil.sendTextMessage(fromWxid, content.toString(), 1, fromWxid, false);
content = new StringBuilder();
contents.add(content);
@@ -517,7 +517,7 @@ public class JDUtil {
}
if (!contents.isEmpty()) {
for (StringBuilder stringBuilder : contents) {
wxUtil.sendTextMessage(fromWxid, stringBuilder.toString(), 1, fromWxid);
wxUtil.sendTextMessage(fromWxid, stringBuilder.toString(), 1, fromWxid, false);
}
}
}
@@ -672,12 +672,12 @@ public class JDUtil {
default:
resetState(fromWxid, state);
wxUtil.sendTextMessage(fromWxid, "流程异常,请重新开始", 1, fromWxid);
wxUtil.sendTextMessage(fromWxid, "流程异常,请重新开始", 1, fromWxid, false);
}
} catch (Exception e) {
logger.error("流程处理异常 - 用户: {}, 状态: {}", fromWxid, state, e);
resetState(fromWxid, state);
wxUtil.sendTextMessage(fromWxid, "处理异常,请重新开始", 1, fromWxid);
wxUtil.sendTextMessage(fromWxid, "处理异常,请重新开始", 1, fromWxid, false);
} finally {
saveState(key, state);
}
@@ -709,7 +709,7 @@ public class JDUtil {
if ("".equals(message)) {
state.setCurrentState(UserInteractionState.ProcessState.PRODUCT_PROMOTION);
state.setCurrentField("content");
wxUtil.sendTextMessage(wxid, "请输入推广方案(包含商品链接):", 1, wxid);
wxUtil.sendTextMessage(wxid, "请输入推广方案(包含商品链接):", 1, wxid, false);
logger.info("进入转链流程 - 用户: {}", wxid);
}
}
@@ -724,7 +724,7 @@ public class JDUtil {
private void handleGiftMoneyFlow(String wxid, String message, UserInteractionState state) {
if (!state.validateStep(state.getCurrentStep())) {
wxUtil.sendTextMessage(wxid, "流程顺序异常,请重新开始", 1, wxid);
wxUtil.sendTextMessage(wxid, "流程顺序异常,请重新开始", 1, wxid, false);
return;
}
@@ -739,30 +739,30 @@ public class JDUtil {
default:
state.setCurrentStep(STEP_AMOUNT);
wxUtil.sendTextMessage(wxid, "请输入金额1-50元", 1, wxid);
wxUtil.sendTextMessage(wxid, "请输入金额1-50元", 1, wxid, false);
}
}
private void processAmountInput(String wxid, String message, UserInteractionState state) {
if (!isValidAmount(message)) {
wxUtil.sendTextMessage(wxid, "金额格式错误请输入1-50元", 1, wxid);
wxUtil.sendTextMessage(wxid, "金额格式错误请输入1-50元", 1, wxid, false);
return;
}
state.getCollectedFields().put("amount", message);
state.setCurrentStep(STEP_QUANTITY);
wxUtil.sendTextMessage(wxid, "请输入数量1-100", 1, wxid);
wxUtil.sendTextMessage(wxid, "请输入数量1-100", 1, wxid, false);
}
private void processQuantityInput(String wxid, String message, UserInteractionState state) {
if (!isValidQuantity(message)) {
wxUtil.sendTextMessage(wxid, "数量格式错误请输入1-100的整数", 1, wxid);
wxUtil.sendTextMessage(wxid, "数量格式错误请输入1-100的整数", 1, wxid, false);
return;
}
String cachedData = cacheMap.get("productData" + wxid);
String finalWenAn = cacheMap.get("finalWenAn" + wxid);
if (cachedData == null) {
wxUtil.sendTextMessage(wxid, "数据丢失,请重新开始流程", 1, wxid);
wxUtil.sendTextMessage(wxid, "数据丢失,请重新开始流程", 1, wxid, false);
resetState(wxid, state);
return;
}
@@ -777,7 +777,7 @@ public class JDUtil {
String giftKey = createGiftCoupon(skuId, amount, quantity, owner, skuName);
if (giftKey == null) {
wxUtil.sendTextMessage(wxid, "礼金创建失败,请重试", 1, wxid);
wxUtil.sendTextMessage(wxid, "礼金创建失败,请重试", 1, wxid, false);
return;
}
// 记录成功日志
@@ -785,15 +785,15 @@ public class JDUtil {
wxid, skuId, amount, quantity);
// 生成转链
String transferUrl = transfer(skuId, giftKey);
wxUtil.sendTextMessage(wxid, "附带礼金的链接:\n" + transferUrl, 1, wxid);
wxUtil.sendTextMessage(wxid, "附带礼金的方案:\n", 1, wxid);
wxUtil.sendTextMessage(wxid, "附带礼金的链接:\n" + transferUrl, 1, wxid, false);
wxUtil.sendTextMessage(wxid, "附带礼金的方案:\n", 1, wxid, false);
wxUtil.sendTextMessage(wxid, finalWenAn.replaceAll(jsonObject.getString("url"), transferUrl), 1, wxid);
wxUtil.sendTextMessage(wxid, finalWenAn.replaceAll(jsonObject.getString("url"), transferUrl), 1, wxid, false);
} catch (Exception e) {
logger.error("礼金处理异常 - 用户: {}", wxid, e);
wxUtil.sendTextMessage(wxid, "处理异常,请重试", 1, wxid);
wxUtil.sendTextMessage(wxid, "处理异常,请重试", 1, wxid, false);
} finally {
resetState(wxid, state);
cacheMap.remove("text" + wxid);
@@ -820,7 +820,7 @@ public class JDUtil {
// 3. 发送文本内容
for (String text : contentResult.get("text")) {
wxUtil.sendTextMessage(wxid, text, 1, wxid);
wxUtil.sendTextMessage(wxid, text, 1, wxid, true);
}
// 4. 发送图片(如果有)
@@ -853,14 +853,14 @@ public class JDUtil {
}
wxUtil.sendTextMessage(wxid,
"是否需要开通礼金?\n回复 1 - 是\n回复 2 - 否",
1, wxid);
1, wxid, false);
} else {
wxUtil.sendTextMessage(wxid, "未获取到商品数据,请检查链接格式", 1, wxid);
wxUtil.sendTextMessage(wxid, "未获取到商品数据,请检查链接格式", 1, wxid, false);
state.reset();
}
} catch (Exception e) {
logger.error("处理推广内容异常 - 用户: {}", wxid, e);
wxUtil.sendTextMessage(wxid, "处理内容时发生异常,请重试", 1, wxid);
wxUtil.sendTextMessage(wxid, "处理内容时发生异常,请重试", 1, wxid, false);
state.reset();
}
}
@@ -883,7 +883,7 @@ public class JDUtil {
wxUtil.sendTextMessage(wxid,
"请输入开通金额1-50元支持小数点后两位\n" +
"示例20.50",
1, wxid);
1, wxid, false);
} else if ("2".equals(message)) {
// 用户选择不开通礼金
@@ -897,12 +897,12 @@ public class JDUtil {
finalWenAn = (finalWenAn.replace(productInfo.getString("url"), transferUrl));
wxUtil.sendTextMessage(wxid,
"不开礼金,只转链的方案:\n",
1, wxid);
1, wxid, false);
wxUtil.sendTextMessage(wxid,
finalWenAn,
1, wxid);
1, wxid, false);
} else {
wxUtil.sendTextMessage(wxid, "未找到商品信息,请重新开始流程", 1, wxid);
wxUtil.sendTextMessage(wxid, "未找到商品信息,请重新开始流程", 1, wxid, false);
}
state.reset();
cacheMap.remove("productData" + wxid);
@@ -915,11 +915,11 @@ public class JDUtil {
"请输入有效选项:\n" +
"回复 1 - 开通礼金\n" +
"回复 2 - 直接转链",
1, wxid);
1, wxid, false);
}
} catch (Exception e) {
logger.error("处理礼金确认异常 - 用户: {}", wxid, e);
wxUtil.sendTextMessage(wxid, "处理请求时发生异常,请重试", 1, wxid);
wxUtil.sendTextMessage(wxid, "处理请求时发生异常,请重试", 1, wxid, false);
state.reset();
}
}
@@ -934,7 +934,7 @@ public class JDUtil {
private void sendStepPrompt(String wxid, int step, int totalSteps) {
String progress = String.format("[%d/%d] ", step, totalSteps);
String message = progress + "请输入礼金金额示例20.50";
wxUtil.sendTextMessage(wxid, message, 1, wxid);
wxUtil.sendTextMessage(wxid, message, 1, wxid, false);
}
private void createPromotionWithGift(String fromWxid, String message) {
@@ -943,13 +943,13 @@ public class JDUtil {
// 修改createPromotionWithGift方法中的校验逻辑
if (!state.validateStep(STEP_CONFIRM_GIFT)) {
logger.warn("状态校验失败,预期步骤:{} 实际步骤:{}", STEP_CONFIRM_GIFT, state.getCurrentStep());
wxUtil.sendTextMessage(fromWxid, "流程顺序异常,请重新开始", 1, fromWxid);
wxUtil.sendTextMessage(fromWxid, "流程顺序异常,请重新开始", 1, fromWxid, false);
return;
}
// 修改点3在createPromotionWithGift方法开始处增加状态校验
if (state == null || state.getCurrentStep() == null) {
logger.warn("非法状态访问: {}", fromWxid);
wxUtil.sendTextMessage(fromWxid, "⚠️ 会话超时,请重新开始流程", 1, fromWxid);
wxUtil.sendTextMessage(fromWxid, "⚠️ 会话超时,请重新开始流程", 1, fromWxid, false);
return;
} else {
LocalDateTime now = LocalDateTime.now();
@@ -969,7 +969,7 @@ public class JDUtil {
case STEP_CONFIRM_GIFT:
if ("1".equals(message)) {
state.setCurrentStep(STEP_AMOUNT);
wxUtil.sendTextMessage(fromWxid, "请输入开通金额(元):", 1, fromWxid);
wxUtil.sendTextMessage(fromWxid, "请输入开通金额(元):", 1, fromWxid, false);
} else if ("2".equals(message)) {
// 不开通礼金,直接生成转链
String cachedData = cacheMap.get("productData" + fromWxid);
@@ -977,25 +977,25 @@ public class JDUtil {
JSONObject jsonObject = JSONObject.parseObject(cachedData);
String skuId = jsonObject.getString("materialUrl");
String transferUrl = transfer(skuId, null);
wxUtil.sendTextMessage(fromWxid, "转链后的链接:\n" + transferUrl, 1, fromWxid);
wxUtil.sendTextMessage(fromWxid, "转链后的链接:\n" + transferUrl, 1, fromWxid, false);
} else {
wxUtil.sendTextMessage(fromWxid, "未找到缓存的商品链接,请重新开始流程", 1, fromWxid);
wxUtil.sendTextMessage(fromWxid, "未找到缓存的商品链接,请重新开始流程", 1, fromWxid, false);
}
state.reset();
userInteractionStates.put(key, state); // 在外部保存
} else {
wxUtil.sendTextMessage(fromWxid, "无效的选择,请重新输入:\n回复 1 - 是\n回复 2 - 否", 1, fromWxid);
wxUtil.sendTextMessage(fromWxid, "无效的选择,请重新输入:\n回复 1 - 是\n回复 2 - 否", 1, fromWxid, false);
}
break;
case STEP_AMOUNT:
logger.debug("用户 {} 输入金额:{}", fromWxid, message);
if (message == null || message.trim().isEmpty()) {
wxUtil.sendTextMessage(fromWxid, "金额不能为空请输入数字100.00", 1, fromWxid);
wxUtil.sendTextMessage(fromWxid, "金额不能为空请输入数字100.00", 1, fromWxid, false);
return;
}
if (!isValidAmount(message)) {
wxUtil.sendTextMessage(fromWxid, "金额格式错误请输入数字100.00", 1, fromWxid);
wxUtil.sendTextMessage(fromWxid, "金额格式错误请输入数字100.00", 1, fromWxid, false);
return;
}
double amount = Double.parseDouble(message);
@@ -1003,27 +1003,27 @@ public class JDUtil {
state.getCollectedFields().put("amount", formattedAmount);
state.setCurrentStep(STEP_QUANTITY);
userInteractionStates.put(key, state); // ▼▼▼ 保存点2 ▼▼▼
wxUtil.sendTextMessage(fromWxid, "请输入数量1-100", 1, fromWxid);
wxUtil.sendTextMessage(fromWxid, "请输入数量1-100", 1, fromWxid, false);
sendStepPrompt(fromWxid, 1, 3);
break;
case STEP_QUANTITY:
logger.debug("用户 {} 输入数量:{}", fromWxid, message); // 新增
if (!isValidQuantity(message)) {
wxUtil.sendTextMessage(fromWxid, "数量格式错误,请输入整数", 1, fromWxid);
wxUtil.sendTextMessage(fromWxid, "数量格式错误,请输入整数", 1, fromWxid, false);
return;
}
int quantity = Integer.parseInt(message);
if (quantity < 1 || quantity > 100) {
wxUtil.sendTextMessage(fromWxid, "数量需在1-100之间", 1, fromWxid);
wxUtil.sendTextMessage(fromWxid, "数量需在1-100之间", 1, fromWxid, false);
return;
}
// 从缓存中获取 amount
String amountStr = state.getCollectedFields().get("amount");
if (amountStr == null || amountStr.trim().isEmpty()) {
wxUtil.sendTextMessage(fromWxid, "未找到金额,请重新开始流程", 1, fromWxid);
wxUtil.sendTextMessage(fromWxid, "未找到金额,请重新开始流程", 1, fromWxid, false);
state.reset();
userInteractionStates.put(key, state); // 在外部保存
return;
@@ -1043,7 +1043,7 @@ public class JDUtil {
String giftKey = createGiftCoupon(skuId, amount, quantity, owner, skuName);
if (giftKey == null) {
logger.error("用户 {} 礼金创建失败SKU={}, 金额={}元,数量={}", fromWxid, skuId, amount, quantity); // 新增
wxUtil.sendTextMessage(fromWxid, "❌ 礼金创建失败,请检查商品是否符合要求", 1, fromWxid);
wxUtil.sendTextMessage(fromWxid, "❌ 礼金创建失败,请检查商品是否符合要求", 1, fromWxid, false);
state.reset();
userInteractionStates.put(key, state); // 在外部保存
@@ -1055,13 +1055,13 @@ public class JDUtil {
// 生成转链
String transferUrl = transfer(skuId, giftKey);
wxUtil.sendTextMessage(fromWxid, "附带礼金的链接:\n" + transferUrl, 1, fromWxid);
wxUtil.sendTextMessage(fromWxid, "附带礼金的链接:\n" + transferUrl, 1, fromWxid, false);
wxUtil.sendTextMessage(fromWxid, "附带礼金的方案:\n" + finalWenAn.replaceAll(jsonObject.getString("url"), transferUrl), 1, fromWxid);
wxUtil.sendTextMessage(fromWxid, "附带礼金的方案:\n" + finalWenAn.replaceAll(jsonObject.getString("url"), transferUrl), 1, fromWxid, false);
state.reset();
userInteractionStates.put(key, state); // 在外部保存
} else {
wxUtil.sendTextMessage(fromWxid, "未找到缓存的商品链接,请重新开始流程", 1, fromWxid);
wxUtil.sendTextMessage(fromWxid, "未找到缓存的商品链接,请重新开始流程", 1, fromWxid, false);
state.reset();
userInteractionStates.put(key, state); // 在外部保存
}
@@ -1069,12 +1069,12 @@ public class JDUtil {
default:
state.setCurrentStep(STEP_CONFIRM_GIFT);
wxUtil.sendTextMessage(fromWxid, "是否需要开通礼金?\n回复 1 - 是\n回复 2 - 否", 1, fromWxid);
wxUtil.sendTextMessage(fromWxid, "是否需要开通礼金?\n回复 1 - 是\n回复 2 - 否", 1, fromWxid, false);
break;
}
} catch (Exception e) {
logger.error("转链和礼金流程异常,用户 {} 当前步骤:{}", fromWxid, state.getCurrentStep(), e);
wxUtil.sendTextMessage(fromWxid, "❌ 系统异常,请稍后重试", 1, fromWxid);
wxUtil.sendTextMessage(fromWxid, "❌ 系统异常,请稍后重试", 1, fromWxid, false);
state.reset();
userInteractionStates.put(key, state); // 在外部保存
}

View File

@@ -53,7 +53,7 @@ public class OrderUtil {
String content = getFormattedOrderInfo(orderRow, lastValidCode);
String wxId = getWxidFromJdid(orderRow.getUnionId().toString());
if (Util.isNotEmpty(wxId)) {
wxUtil.sendTextMessage(wxId, content, 1, wxId);
wxUtil.sendTextMessage(wxId, content, 1, wxId, false);
}
}
@@ -83,7 +83,7 @@ public class OrderUtil {
}
if (Util.isNotEmpty(wxId)) {
wxUtil.sendTextMessage(wxId, content.toString(), 1, wxId);
wxUtil.sendTextMessage(wxId, content.toString(), 1, wxId, false);
}
}

View File

@@ -107,7 +107,7 @@ public class WXUtil {
jdidToWxidMap.put(admin2.getUnionId(), admin2.getWxid());
//wxTsUtil.sendNotify("initSuperAdmins 初始化完成");
//发送通知到微信
sendTextMessage(default_super_admin_wxid, "Jarvis 重启完成 [亲亲][亲亲][亲亲] ", 1, default_super_admin_wxid);
sendTextMessage(default_super_admin_wxid, "Jarvis 重启完成 [亲亲][亲亲][亲亲] ", 1, default_super_admin_wxid, false);
}
@@ -123,8 +123,7 @@ public class WXUtil {
}
// 发送文本消息 msgType 1:私聊 2:群发
public void sendTextMessage(String wxid, String content, Integer msgType, String fromwxid) {
public void sendTextMessage(String wxid, String content, Integer msgType, String fromwxid, Boolean hiddenTime) {
// 全部打印
//logger.info("发送文本消息 msgType: {} wxid: {} fromwxid: {} content: {}", msgType, wxid, fromwxid, content);
// 先在content顶部插入时间戳