From 42ac8786eefe8d51a1ca26eaf2f79bd0083c8f83 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Thu, 8 Oct 2026 14:26:58 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E6=89=93=E5=8C=85=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HardOrderServiceImplInventoryTest.java | 103 ++++++++++++------ .../shangyou/ShangyouCallbackQueueWorker.java | 4 +- ...UserFaceTerminalDeleteServiceImplTest.java | 2 + ...eTerminalQualityReportServiceImplTest.java | 2 + .../user/SysUserRelationServiceImplTest.java | 8 +- 5 files changed, 80 insertions(+), 39 deletions(-) diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/test/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImplInventoryTest.java b/pjcloud-hardware/pjcloud-hardware-biz/src/test/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImplInventoryTest.java index 7ea20ca8..4c33faa9 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/test/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImplInventoryTest.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/test/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImplInventoryTest.java @@ -37,25 +37,29 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; /** - * 食堂订单库存分流测试:机器收é“?BELOW 订单使用 {@code canteen_spu} 原子库存接口ï¼? * 每日菜谱订单按订单类型路由分池(RESERVE èµ?ONLINE,其他类型走 OFFLINE)ã€? *
- * 直接调用五参 {@code fastenerInventory} 重载:四参重载经 getSelf() 需è¦?Spring 上下文, - * 纯单测环境无法提供;异常文案由全局 i18n 处理器解析,此处只断言错误码ã€? */ + * 食堂订单库存分流测试:机器收银 BELOW 订单使用 {@code canteen_spu} 原子库存接口, + * 每日菜谱订单按订单类型路由分池(RESERVE 走 ONLINE,其他类型走 OFFLINE)。 + *
+ * 直接调用五参 {@code fastenerInventory} 重载:四参重载经 getSelf() 需要 Spring 上下文,
+ * 纯单测环境无法提供;异常文案由全局 i18n 处理器解析,此处只断言错误码。
+ */
class HardOrderServiceImplInventoryTest {
- /** 订单购物车服务,提供服务端固化的商品来源和下单商品快照ã€?*/
+ /** 订单购物车服务,提供服务端固化的商品来源和下单商品快照。 */
private final HardCarService hardCarService = mock(HardCarService.class);
- /** 食堂基础菜品远程服务,负责查询权威库存并执行幂等扣减ã€?*/
+ /** 食堂基础菜品远程服务,负责查询权威库存并执行幂等扣减。 */
private final RemoteCanteenSpuService remoteCanteenSpuService = mock(RemoteCanteenSpuService.class);
- /** 每日菜谱远程服务,负责按日期餐段查询分池剩余ã€?*/
+ /** 每日菜谱远程服务,负责按日期餐段查询分池剩余。 */
private final RemoteDailyMenuService remoteDailyMenuService = mock(RemoteDailyMenuService.class);
- /** 被测订单服务,仅执行真实库存方法,其他依赖不参与本组测试ã€?*/
+ /** 被测订单服务,仅执行真实库存方法,其他依赖不参与本组测试。 */
private final HardOrderServiceImpl service = mock(HardOrderServiceImpl.class, CALLS_REAL_METHODS);
/**
- * 注入库存分支依赖,并建立事务同步上下文供跨服务回滚补偿登记ã€? */
+ * 注入库存分支依赖,并建立事务同步上下文供跨服务回滚补偿登记。
+ */
@BeforeEach
void setUp() {
ReflectionTestUtils.setField(service, "hardCarService", hardCarService);
@@ -65,7 +69,8 @@ class HardOrderServiceImplInventoryTest {
}
/**
- * 清理线程绑定的事务同步器,避免影响同线程执行的后续测试ã€? */
+ * 清理线程绑定的事务同步器,避免影响同线程执行的后续测试。
+ */
@AfterEach
void tearDown() {
if (TransactionSynchronizationManager.isSynchronizationActive()) {
@@ -74,7 +79,8 @@ class HardOrderServiceImplInventoryTest {
}
/**
- * 验证机器收银购买数量超过权威库存时在远程扣减前明确返回商品库存不足ã€? */
+ * 验证机器收银购买数量超过权威库存时在远程扣减前明确返回商品库存不足。
+ */
@Test
void cashierOrderRejectsInsufficientCanteenSpuStock() {
prepareCart(2);
@@ -89,7 +95,8 @@ class HardOrderServiceImplInventoryTest {
}
/**
- * 验证机器收银库存充足时按订单数量生成基础 SPU çš?APPLY 负增量ã€? */
+ * 验证机器收银库存充足时按订单数量生成基础 SPU 的 APPLY 负增量。
+ */
@Test
void cashierOrderDeductsCanteenSpuStock() {
prepareCart(2);
@@ -109,7 +116,8 @@ class HardOrderServiceImplInventoryTest {
}
/**
- * 验证聚合码创建前的库存预检只读权威库存,库存充足时不提前扣减ã€? */
+ * 验证聚合码创建前的库存预检只读权威库存,库存充足时不提前扣减。
+ */
@Test
void aggregatePreflightChecksStockWithoutDeduction() {
prepareCart(2);
@@ -123,7 +131,8 @@ class HardOrderServiceImplInventoryTest {
}
/**
- * 验证聚合码创建前就拒绝已知的库存不足,避免继续展示可付款二维码ã€? */
+ * 验证聚合码创建前就拒绝已知的库存不足,避免继续展示可付款二维码。
+ */
@Test
void aggregatePreflightRejectsInsufficientStock() {
prepareCart(2);
@@ -138,7 +147,8 @@ class HardOrderServiceImplInventoryTest {
}
/**
- * 验证机器收银退款使用售后单幂等号恢复原购数量,重复回调不会反复增加库存ã€? */
+ * 验证机器收银退款使用售后单幂等号恢复原购数量,重复回调不会反复增加库存。
+ */
@Test
void cashierRefundRestoresCanteenSpuStockIdempotently() {
prepareCart(2);
@@ -158,7 +168,8 @@ class HardOrderServiceImplInventoryTest {
}
/**
- * 验证人工退款退回审核时可使用独立业务号重新扣减库存,避免命中首次退款恢复库存的幂等状态ã€? */
+ * 验证人工退款退回审核时可使用独立业务号重新扣减库存,避免命中首次退款恢复库存的幂等状态。
+ */
@Test
void refundReviewRollbackUsesIndependentInventoryBizId() {
prepareCart(2);
@@ -177,7 +188,9 @@ class HardOrderServiceImplInventoryTest {
}
/**
- * 验证设备购买链路ï¼?hard/hard-api/ad/create-order çš?BELOW+CANTEEN_SPU 购物车)对当日菜谱在册商å“? * 扣每日菜è°?OFFLINE 池:请求å¸?stockChannel=OFFLINE、日期餐段和线下剩余快照,不再扣 canteen_spu.stockã€? */
+ * 验证设备购买链路(/hard/hard-api/ad/create-order 的 BELOW+CANTEEN_SPU 购物车)对当日菜谱在册商品
+ * 扣每日菜谱 OFFLINE 池:请求带 stockChannel=OFFLINE、日期餐段和线下剩余快照,不再扣 canteen_spu.stock。
+ */
@Test
void deviceCreateOrderDeductsDailyMenuOfflinePoolWhenOnMenu() {
prepareCart(1);
@@ -205,7 +218,8 @@ class HardOrderServiceImplInventoryTest {
}
/**
- * 验证设备购买不在当日菜谱的商品时仍扣基础 canteen_spu.stock:请求不携带分池通道ã€? */
+ * 验证设备购买不在当日菜谱的商品时仍扣基础 canteen_spu.stock:请求不携带分池通道。
+ */
@Test
void deviceCreateOrderDeductsBasicSpuStockWhenNotOnMenu() {
prepareCart(1);
@@ -227,7 +241,9 @@ class HardOrderServiceImplInventoryTest {
}
/**
- * 验证混合购物车按商品分流:在册商品扣每日菜谱 OFFLINE 池,不在册商品扣基础 canteen_spu.stockï¼? * 两次幂等调用共用同一业务号(食堂端状态键按渠道隔离,不会互相命中)ã€? */
+ * 验证混合购物车按商品分流:在册商品扣每日菜谱 OFFLINE 池,不在册商品扣基础 canteen_spu.stock,
+ * 两次幂等调用共用同一业务号(食堂端状态键按渠道隔离,不会互相命中)。
+ */
@Test
void deviceCreateOrderSplitsMixedCartBetweenPools() {
prepareTwoProductCart(1, 2);
@@ -258,8 +274,9 @@ class HardOrderServiceImplInventoryTest {
}
/**
- * 验证线上预定每日菜谱订单退款恢å¤?ONLINE 池:下单扣的æ˜?online_sold,退款必须还同一池,
- * 快照取线上剩余并携带日期餐段ã€? */
+ * 验证线上预定每日菜谱订单退款恢复 ONLINE 池:下单扣的是 online_sold,退款必须还同一池,
+ * 快照取线上剩余并携带日期餐段。
+ */
@Test
void reserveRefundRestoresDailyMenuOnlineStock() {
prepareDailyMenuCart(2);
@@ -285,7 +302,8 @@ class HardOrderServiceImplInventoryTest {
}
/**
- * 验证机器收银等其他类型的每日菜谱订单退款仍恢复 OFFLINE 池,快照取线下剩余ã€? */
+ * 验证机器收银等其他类型的每日菜谱订单退款仍恢复 OFFLINE 池,快照取线下剩余。
+ */
@Test
void cashierDailyMenuRefundRestoresOfflineStock() {
prepareDailyMenuCart(2);
@@ -307,7 +325,8 @@ class HardOrderServiceImplInventoryTest {
}
/**
- * 验证线上预定重审重扣按线上剩余校验:线上不足即拒绝,即使线下剩余充足ã€? */
+ * 验证线上预定重审重扣按线上剩余校验:线上不足即拒绝,即使线下剩余充足。
+ */
@Test
void reserveReoccupyRejectsInsufficientOnlineStock() {
prepareDailyMenuCart(2);
@@ -323,7 +342,8 @@ class HardOrderServiceImplInventoryTest {
}
/**
- * 准备机器收银购物车来源和商品数量ã€? *
+ * 准备机器收银购物车来源和商品数量。
+ *
* @param productCount 本次购买份数
*/
private void prepareCart(int productCount) {
@@ -341,7 +361,8 @@ class HardOrderServiceImplInventoryTest {
}
/**
- * 准备每日菜谱购物车来源(cartScene 与商品来源标记与服务端保存逻辑一致)和商品数量ã€? *
+ * 准备每日菜谱购物车来源(cartScene 与商品来源标记与服务端保存逻辑一致)和商品数量。
+ *
* @param productCount 本次购买份数
*/
private void prepareDailyMenuCart(int productCount) {
@@ -362,8 +383,11 @@ class HardOrderServiceImplInventoryTest {
}
/**
- * 准备双商品购物车:第一个商品可出现在当日菜谱,第二个不在菜谱,用于混合分流验证ã€? *
- * @param firstCount 第一个商品份æ•? * @param secondCount 第二个商品份æ•? */
+ * 准备双商品购物车:第一个商品可出现在当日菜谱,第二个不在菜谱,用于混合分流验证。
+ *
+ * @param firstCount 第一个商品份数
+ * @param secondCount 第二个商品份数
+ */
private void prepareTwoProductCart(int firstCount, int secondCount) {
HardParentCarEntity parentCar = HardParentCarEntity.builder()
.id(200L)
@@ -384,8 +408,11 @@ class HardOrderServiceImplInventoryTest {
}
/**
- * 构造指定线ä¸?线下剩余的每日菜谱行ã€? *
- * @param onlineRemain 线上池剩ä½? * @param offlineRemain 线下池剩ä½? * @return 用于分池校验的菜谱行
+ * 构造指定线上/线下剩余的每日菜谱行。
+ *
+ * @param onlineRemain 线上池剩余
+ * @param offlineRemain 线下池剩余
+ * @return 用于分池校验的菜谱行
*/
private DailyMenuAppVO dailyMenuRow(int onlineRemain, int offlineRemain) {
DailyMenuAppVO row = new DailyMenuAppVO();
@@ -397,8 +424,10 @@ class HardOrderServiceImplInventoryTest {
}
/**
- * 构造指定权威库存的当前商户基础菜品ã€? *
- * @param stock 服务端当前可售库å? * @return 用于库存校验的基础菜品
+ * 构造指定权威库存的当前商户基础菜品。
+ *
+ * @param stock 服务端当前可售库存
+ * @return 用于库存校验的基础菜品
*/
private CanteenSpuEntity productWithStock(int stock) {
CanteenSpuEntity product = new CanteenSpuEntity();
@@ -411,7 +440,8 @@ class HardOrderServiceImplInventoryTest {
}
/**
- * 构造机器收银提交的食堂线下订单ã€? *
+ * 构造机器收银提交的食堂线下订单。
+ *
* @return 关联固定父购物车和商户的 BELOW 订单
*/
private HardOrderEntity cashierOrder() {
@@ -425,8 +455,10 @@ class HardOrderServiceImplInventoryTest {
}
/**
- * 构造带日期餐段的设备购买订单:createOrder 会写å…?apptUseDate=今天、hourType=请求餐段ï¼? * æ˜?/hard/hard-api/ad/create-order 购买每日菜谱时的真实形态ã€? *
- * @return 关联 CANTEEN_SPU 购物车、固定日期餐段和商户çš?BELOW 订单
+ * 构造带日期餐段的设备购买订单:createOrder 会写入 apptUseDate=今天、hourType=请求餐段,
+ * 是 /hard/hard-api/ad/create-order 购买每日菜谱时的真实形态。
+ *
+ * @return 关联 CANTEEN_SPU 购物车、固定日期餐段和商户的 BELOW 订单
*/
private HardOrderEntity deviceDailyMenuOrder() {
return HardOrderEntity.builder()
@@ -441,8 +473,9 @@ class HardOrderServiceImplInventoryTest {
}
/**
- * 构造线上预定提交的每日菜谱订单ã€? *
- * @return 关联每日菜谱购物车、固定日期餐段和商户çš?RESERVE 订单
+ * 构造线上预定提交的每日菜谱订单。
+ *
+ * @return 关联每日菜谱购物车、固定日期餐段和商户的 RESERVE 订单
*/
private HardOrderEntity reserveDailyMenuOrder() {
return HardOrderEntity.builder()
diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/integration/shangyou/ShangyouCallbackQueueWorker.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/integration/shangyou/ShangyouCallbackQueueWorker.java
index fb9aa3d0..160785be 100644
--- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/integration/shangyou/ShangyouCallbackQueueWorker.java
+++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/integration/shangyou/ShangyouCallbackQueueWorker.java
@@ -7,6 +7,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
+import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
@@ -66,7 +67,8 @@ public class ShangyouCallbackQueueWorker implements ApplicationRunner {
try {
// BRPOP 多 key:先高优(订单状态)再普通;阻塞期间新到的高优也会被优先弹出
// ListOperations 没有多 key 阻塞弹出,走底层连接命令 bRPop(秒, keys...),返回 [key, value]
- String taskId = redisTemplate.execute(connection -> {
+ // lambda 参数必须显式声明 RedisConnection,否则 execute 在 RedisCallback/SessionCallback 两个重载间产生歧义
+ String taskId = redisTemplate.execute((RedisConnection connection) -> {
List