重构:优化订单通知消息标签,支持动态显示订单类型

- 新增 OrderMessageLabelResolver 用于解析订单场景标签
- 修改微信公众号下单通知,根据下单类型(随机单/指定单/打赏/礼物)显示对应标签
- 更新 WxCustomMpService 接口,传递 placeType 和 rewardType 参数
- 完善相关单元测试和 Mock 配置
This commit is contained in:
irving
2025-11-03 22:51:48 -05:00
parent 83112b406a
commit da2902c61c
11 changed files with 315 additions and 15 deletions

View File

@@ -3,6 +3,7 @@ package com.starry.admin.api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Import;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.web.servlet.MockMvc;
@@ -11,6 +12,7 @@ import org.springframework.test.web.servlet.MockMvc;
@AutoConfigureMockMvc
@ActiveProfiles("apitest")
@TestPropertySource(properties = "spring.task.scheduling.enabled=false")
@Import(MockWxMpServiceConfig.class)
public abstract class AbstractApiTest {
protected static final String TENANT_HEADER = "X-Tenant";

View File

@@ -0,0 +1,31 @@
package com.starry.admin.api;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.WxMpTemplateMsgService;
import org.mockito.Mockito;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.Profile;
/**
* Provides stubbed WeChat MP services in the apitest profile so integration tests never hit external APIs.
*/
@TestConfiguration
@Profile("apitest")
public class MockWxMpServiceConfig {
@Bean
@Primary
public WxMpService wxMpService() {
WxMpService service = mock(WxMpService.class, Mockito.RETURNS_DEEP_STUBS);
WxMpTemplateMsgService templateMsgService = mock(WxMpTemplateMsgService.class);
when(service.getTemplateMsgService()).thenReturn(templateMsgService);
when(service.switchoverTo(Mockito.anyString())).thenReturn(service);
when(service.switchover(Mockito.anyString())).thenReturn(true);
return service;
}
}

View File

@@ -397,6 +397,14 @@ class WxCustomRandomOrderApiTest extends WxCustomOrderApiTestSupport {
Assertions.assertThat(order.getFinalAmount()).isEqualByComparingTo(expectedNet);
Assertions.assertThat(order.getDiscountAmount()).isEqualByComparingTo(discount);
verify(wxCustomMpService).sendCreateOrderMessageBatch(
anyList(),
eq(order.getOrderNo()),
eq(expectedNet.toString()),
eq(order.getCommodityName()),
eq(order.getId()),
eq(order.getPlaceType()),
eq(order.getRewardType()));
String orderId = order.getId();
PlayCouponDetailsEntity detailAfterOrderPlaced = couponDetailsService.getById(couponDetailId);
@@ -667,7 +675,9 @@ class WxCustomRandomOrderApiTest extends WxCustomOrderApiTestSupport {
eq(order.getOrderNo()),
eq(order.getFinalAmount().toString()),
eq(order.getCommodityName()),
eq(order.getId()));
eq(order.getId()),
eq(order.getPlaceType()),
eq(order.getRewardType()));
verify(overdueOrderHandlerTask).enqueue(order.getId() + "_" + ApiTestDataSeeder.DEFAULT_TENANT_ID);
reset(wxCustomMpService);

View File

@@ -244,7 +244,9 @@ class WxCustomSpecifiedOrderApiTest extends WxCustomOrderApiTestSupport {
anyString(),
eq(expectedNet.toString()),
eq(order.getCommodityName()),
eq(order.getId()));
eq(order.getId()),
eq(order.getPlaceType()),
eq(order.getRewardType()));
int ratio = order.getEstimatedRevenueRatio();
BigDecimal baseRevenue = grossAmount
@@ -411,7 +413,9 @@ class WxCustomSpecifiedOrderApiTest extends WxCustomOrderApiTestSupport {
anyString(),
eq(order.getFinalAmount().toString()),
eq(order.getCommodityName()),
eq(order.getId()));
eq(order.getId()),
eq(order.getPlaceType()),
eq(order.getRewardType()));
ensureTenantContext();
long afterCount = playOrderInfoService.lambdaQuery()

View File

@@ -67,7 +67,14 @@ class WxOrderInfoControllerApiTest extends WxCustomOrderApiTestSupport {
// Relax notifications to avoid strict verification noise
doNothing().when(notificationSender).sendOrderMessageAsync(Mockito.any());
doNothing().when(notificationSender).sendOrderFinishMessageAsync(Mockito.any());
doNothing().when(wxCustomMpService).sendCreateOrderMessageBatch(anyList(), Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyString());
doNothing().when(wxCustomMpService).sendCreateOrderMessageBatch(
anyList(),
Mockito.anyString(),
Mockito.anyString(),
Mockito.anyString(),
Mockito.anyString(),
Mockito.anyString(),
Mockito.anyString());
doNothing().when(overdueOrderHandlerTask).enqueue(Mockito.anyString());
}