From 498a47977ee44ecbea3a0b78633aff82ed58a9a1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com>
Date: Fri, 10 Apr 2026 02:16:59 +0800
Subject: [PATCH 01/60] =?UTF-8?q?feat(notification):=20=E5=A2=9E=E5=8A=A0?=
=?UTF-8?q?=E9=80=81=E6=B0=B4=E8=AE=A2=E5=8D=95=E6=96=B0=E5=8D=95=E9=80=9A?=
=?UTF-8?q?=E7=9F=A5=E9=85=8D=E9=80=81=E5=91=98=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 在订单创建成功后异步通知所有在线配送员有新订单信息
- 查询在线且启用状态的配送员列表,并发送微信订阅消息提醒
- 新增 GltSubscribeMessageService 接口及实现,封装微信小程序订阅消息发送逻辑
- 实现新订单和订单状态变更的微信订阅消息发送方法
- 配置Redis缓存access_token,提升微信接口调用效率
- 日志记录订阅消息发送状态及异常,确保通知稳定性
- ShopDealerUser实体新增分销商等级字段
- ShopGoods实体支持活动方式和配送方式字段增加相关查询条件
- 更新相关Mapper XML文件增加对dealerLevel、activityType及deliveryMode字段的支持
- 修改application-glt2.yml更新Redis host配置
---
.../controller/GltTicketOrderController.java | 80 +++++-
.../service/GltSubscribeMessageService.java | 28 ++
.../impl/GltSubscribeMessageServiceImpl.java | 240 ++++++++++++++++++
.../gxwebsoft/shop/entity/ShopDealerUser.java | 3 +
.../com/gxwebsoft/shop/entity/ShopGoods.java | 6 +
.../shop/mapper/xml/ShopDealerUserMapper.xml | 3 +
.../shop/mapper/xml/ShopGoodsMapper.xml | 6 +
.../gxwebsoft/shop/param/ShopGoodsParam.java | 8 +
src/main/resources/application-glt2.yml | 2 +-
9 files changed, 373 insertions(+), 3 deletions(-)
create mode 100644 src/main/java/com/gxwebsoft/glt/service/GltSubscribeMessageService.java
create mode 100644 src/main/java/com/gxwebsoft/glt/service/impl/GltSubscribeMessageServiceImpl.java
diff --git a/src/main/java/com/gxwebsoft/glt/controller/GltTicketOrderController.java b/src/main/java/com/gxwebsoft/glt/controller/GltTicketOrderController.java
index 7fa519e..09ab3e8 100644
--- a/src/main/java/com/gxwebsoft/glt/controller/GltTicketOrderController.java
+++ b/src/main/java/com/gxwebsoft/glt/controller/GltTicketOrderController.java
@@ -1,15 +1,18 @@
package com.gxwebsoft.glt.controller;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.gxwebsoft.common.core.annotation.OperationLog;
+import com.gxwebsoft.common.core.exception.BusinessException;
import com.gxwebsoft.common.core.web.ApiResult;
import com.gxwebsoft.common.core.web.BaseController;
import com.gxwebsoft.common.core.web.BatchParam;
import com.gxwebsoft.common.core.web.PageResult;
-import com.gxwebsoft.common.core.exception.BusinessException;
import com.gxwebsoft.common.system.entity.User;
+import com.gxwebsoft.common.system.mapper.UserMapper;
import com.gxwebsoft.glt.entity.GltTicketOrder;
import com.gxwebsoft.glt.param.GltTicketOrderDeliveredParam;
import com.gxwebsoft.glt.param.GltTicketOrderParam;
+import com.gxwebsoft.glt.service.GltSubscribeMessageService;
import com.gxwebsoft.glt.service.GltTicketOrderService;
import com.gxwebsoft.shop.entity.ShopStoreRider;
import com.gxwebsoft.shop.entity.ShopUserAddress;
@@ -19,12 +22,13 @@ import com.gxwebsoft.shop.service.ShopUserAddressService;
import cn.hutool.core.util.StrUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
+import java.util.stream.Collectors;
/**
* 送水订单控制器
@@ -32,6 +36,7 @@ import java.util.List;
* @author 科技小王子
* @since 2026-02-05 18:50:21
*/
+@Slf4j
@Tag(name = "送水订单管理")
@RestController
@RequestMapping("/api/glt/glt-ticket-order")
@@ -44,6 +49,10 @@ public class GltTicketOrderController extends BaseController {
private ShopStoreFenceService shopStoreFenceService;
@Resource
private ShopStoreRiderService shopStoreRiderService;
+ @Resource
+ private GltSubscribeMessageService gltSubscribeMessageService;
+ @Resource
+ private UserMapper userMapper;
@Operation(summary = "分页查询送水订单")
@GetMapping("/page")
@@ -167,9 +176,76 @@ public class GltTicketOrderController extends BaseController {
}
gltTicketOrderService.createWithWriteOff(gltTicketOrder, loginUser.getUserId(), loginUser.getTenantId());
+
+ // 订单创建成功后,异步通知所有在线配送员有新订单
+ try {
+ notifyRidersOfNewOrder(gltTicketOrder, loginUser.getTenantId());
+ } catch (Exception e) {
+ log.warn("通知配送员失败(不影响下单): {}", e.getMessage());
+ }
+
return success("下单成功");
}
+ /**
+ * 通知所有在线配送员有新订单
+ */
+ private void notifyRidersOfNewOrder(GltTicketOrder order, Integer tenantId) {
+ if (order == null || tenantId == null) {
+ return;
+ }
+
+ // 查询所有启用且在线的配送员
+ List 功能:
+ *
+ *
+ *
1) 送水套餐(formId in 水票模板 goodsId):订单号关联的水票产生了第一次送水订单,且该第一次送水订单状态=已完成(40) -> 解冻。
*2) 非送水套餐(formId not in 水票模板 goodsId):订单已确认收货(orderStatus=1) -> 解冻。
* - *实现策略:以 ShopDealerCapital(flowType=10) 的“佣金明细”为解冻粒度, + *
实现策略:以 ShopDealerCapital(flowType=10) 的"佣金明细"为解冻粒度, * 每条佣金明细对应生成一条 ShopDealerCapital(flowType=50) 作为幂等标记,并执行 * ShopDealerUser.freezeMoney -> ShopDealerUser.money 的转移。
*/ @@ -76,7 +77,7 @@ public class DealerCommissionUnfreeze10584Task { if (rawRate == null || rawRate.signum() <= 0) { return null; } - // 如果录入 >= 1,按“百分比”处理(1 => 1%) + // 如果录入 >= 1,按"百分比"处理(1 => 1%) if (rawRate.compareTo(BigDecimal.ONE) >= 0) { return rawRate.movePointLeft(2); } @@ -115,7 +116,7 @@ public class DealerCommissionUnfreeze10584Task { private final AtomicBoolean running = new AtomicBoolean(false); - @Scheduled(cron = "${dealer.commission.unfreeze10584.cron:0/20 * * * * ?}") + @Scheduled(cron = "${dealer.commission.unfreeze10584.cron:0/50 * * * * ?}") @IgnoreTenant("定时任务无登录态,需忽略租户隔离;内部使用 tenantId=10584 精确过滤") public void run() { if (!running.compareAndSet(false, true)) { @@ -124,46 +125,77 @@ public class DealerCommissionUnfreeze10584Task { } try { + // ========== 步骤1: 加载水票模板 ========== Set
+ * 约定:
+ * - 围栏按 tenantId + status=0 过滤;
+ * - 支持多个围栏:命中任意一个即通过;
+ * - 无围栏配置:直接放行;
+ * - 围栏 points 异常:抛出异常(避免误送)。
+ *
+ * @param tenantId 租户ID
+ * @param lng 经度
+ * @param lat 纬度
+ */
+ Boolean validatePointInEnabled(Integer tenantId, double lng, double lat);
+
}
diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/ShopStoreFenceServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/ShopStoreFenceServiceImpl.java
index 7d597cc..3c404b7 100644
--- a/src/main/java/com/gxwebsoft/shop/service/impl/ShopStoreFenceServiceImpl.java
+++ b/src/main/java/com/gxwebsoft/shop/service/impl/ShopStoreFenceServiceImpl.java
@@ -106,4 +106,49 @@ public class ShopStoreFenceServiceImpl extends ServiceImpl