|
@@ -487,7 +487,7 @@ class OrderServiceTest {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * B端: 推荐人未付费 (vipType=null) → 不创建佣金
|
|
|
|
|
|
|
+ * B端: 推荐人未付费 (vipType=null) → 按免费/C端半额处理, L1=l1_cend (20000)
|
|
|
*/
|
|
*/
|
|
|
@Test
|
|
@Test
|
|
|
void testPaySuccess_bEnd_noVipType_skipsCommission() {
|
|
void testPaySuccess_bEnd_noVipType_skipsCommission() {
|
|
@@ -504,8 +504,11 @@ class OrderServiceTest {
|
|
|
|
|
|
|
|
User inviter = new User();
|
|
User inviter = new User();
|
|
|
inviter.setId(200L);
|
|
inviter.setId(200L);
|
|
|
- inviter.setVipType(null); // 未付费
|
|
|
|
|
|
|
+ inviter.setVipType(null); // 未付费 → 按免费用户处理
|
|
|
|
|
|
|
|
|
|
+ when(configService.getInt("commission.practitioner.l1_cend", 20000)).thenReturn(20000);
|
|
|
|
|
+ when(configService.getInt("commission.practitioner.l2", 10000)).thenReturn(10000);
|
|
|
|
|
+ when(commissionRepository.findByOrderId(1L)).thenReturn(Collections.emptyList());
|
|
|
when(orderRepository.findByOutTradeNo("trade_no_vip")).thenReturn(Optional.of(order));
|
|
when(orderRepository.findByOutTradeNo("trade_no_vip")).thenReturn(Optional.of(order));
|
|
|
when(orderRepository.save(any(Order.class))).thenReturn(order);
|
|
when(orderRepository.save(any(Order.class))).thenReturn(order);
|
|
|
when(userRepository.findById(100L)).thenReturn(Optional.of(buyer));
|
|
when(userRepository.findById(100L)).thenReturn(Optional.of(buyer));
|
|
@@ -513,7 +516,10 @@ class OrderServiceTest {
|
|
|
|
|
|
|
|
orderService.paySuccess("trade_no_vip");
|
|
orderService.paySuccess("trade_no_vip");
|
|
|
|
|
|
|
|
- verify(commissionRepository, never()).save(any(Commission.class));
|
|
|
|
|
|
|
+ // 免费用户推荐也可获得半额佣金
|
|
|
|
|
+ verify(commissionRepository).save(argThat((Commission c) ->
|
|
|
|
|
+ 1 == c.getLevel() && 20000 == c.getAmount()));
|
|
|
|
|
+ verify(userRepository).incrementConvertedCount(200L);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -557,7 +563,7 @@ class OrderServiceTest {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * B端: 推荐人身份不匹配 (如 super_annual) → 不创建佣金
|
|
|
|
|
|
|
+ * B端: 推荐人身份不匹配 (如 super_annual) → 按免费/C端半额处理, L1=l1_cend (20000)
|
|
|
*/
|
|
*/
|
|
|
@Test
|
|
@Test
|
|
|
void testPaySuccess_bEnd_unknownVipType_skips() {
|
|
void testPaySuccess_bEnd_unknownVipType_skips() {
|
|
@@ -574,8 +580,11 @@ class OrderServiceTest {
|
|
|
|
|
|
|
|
User inviter = new User();
|
|
User inviter = new User();
|
|
|
inviter.setId(200L);
|
|
inviter.setId(200L);
|
|
|
- inviter.setVipType("super_annual"); // 不匹配任何分支
|
|
|
|
|
|
|
+ inviter.setVipType("super_annual"); // 不匹配 practitioner → 走 else (免费/C端半额)
|
|
|
|
|
|
|
|
|
|
+ when(configService.getInt("commission.practitioner.l1_cend", 20000)).thenReturn(20000);
|
|
|
|
|
+ when(configService.getInt("commission.practitioner.l2", 10000)).thenReturn(10000);
|
|
|
|
|
+ when(commissionRepository.findByOrderId(1L)).thenReturn(Collections.emptyList());
|
|
|
when(orderRepository.findByOutTradeNo("trade_unknown_vip")).thenReturn(Optional.of(order));
|
|
when(orderRepository.findByOutTradeNo("trade_unknown_vip")).thenReturn(Optional.of(order));
|
|
|
when(orderRepository.save(any(Order.class))).thenReturn(order);
|
|
when(orderRepository.save(any(Order.class))).thenReturn(order);
|
|
|
when(userRepository.findById(100L)).thenReturn(Optional.of(buyer));
|
|
when(userRepository.findById(100L)).thenReturn(Optional.of(buyer));
|
|
@@ -583,11 +592,14 @@ class OrderServiceTest {
|
|
|
|
|
|
|
|
orderService.paySuccess("trade_unknown_vip");
|
|
orderService.paySuccess("trade_unknown_vip");
|
|
|
|
|
|
|
|
- verify(commissionRepository, never()).save(any(Commission.class));
|
|
|
|
|
|
|
+ // 不匹配 practitioner 的 vipType → 按免费/C端半额处理, 仍可获得佣金
|
|
|
|
|
+ verify(commissionRepository).save(argThat((Commission c) ->
|
|
|
|
|
+ 1 == c.getLevel() && 20000 == c.getAmount()));
|
|
|
|
|
+ verify(userRepository).incrementConvertedCount(200L);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * C端: 推荐人无 referralCode (未付费) → 不创建佣金
|
|
|
|
|
|
|
+ * C端: 推荐人无 referralCode (未付费) → 免费用户也可获佣金 (L1=40%)
|
|
|
*/
|
|
*/
|
|
|
@Test
|
|
@Test
|
|
|
void testPaySuccess_cEnd_noReferralCode_skips() {
|
|
void testPaySuccess_cEnd_noReferralCode_skips() {
|
|
@@ -604,8 +616,10 @@ class OrderServiceTest {
|
|
|
|
|
|
|
|
User inviter = new User();
|
|
User inviter = new User();
|
|
|
inviter.setId(200L);
|
|
inviter.setId(200L);
|
|
|
- inviter.setReferralCode(null); // 未付费
|
|
|
|
|
|
|
+ inviter.setReferralCode(null); // 未付费, 但免费用户也可获得佣金
|
|
|
|
|
|
|
|
|
|
+ when(configService.getInt("commission.annual.direct_rate", 4000)).thenReturn(4000);
|
|
|
|
|
+ when(configService.getInt("commission.annual.upstream_rate", 500)).thenReturn(500);
|
|
|
when(orderRepository.findByOutTradeNo("trade_no_rc")).thenReturn(Optional.of(order));
|
|
when(orderRepository.findByOutTradeNo("trade_no_rc")).thenReturn(Optional.of(order));
|
|
|
when(orderRepository.save(any(Order.class))).thenReturn(order);
|
|
when(orderRepository.save(any(Order.class))).thenReturn(order);
|
|
|
when(userRepository.findById(100L)).thenReturn(Optional.of(buyer));
|
|
when(userRepository.findById(100L)).thenReturn(Optional.of(buyer));
|
|
@@ -613,11 +627,14 @@ class OrderServiceTest {
|
|
|
|
|
|
|
|
orderService.paySuccess("trade_no_rc");
|
|
orderService.paySuccess("trade_no_rc");
|
|
|
|
|
|
|
|
- verify(commissionRepository, never()).save(any(Commission.class));
|
|
|
|
|
|
|
+ // 免费用户推荐也可获得 L1=40% 佣金
|
|
|
|
|
+ verify(commissionRepository).save(argThat((Commission c) ->
|
|
|
|
|
+ 1 == c.getLevel() && 5240 == c.getAmount()
|
|
|
|
|
+ && 100L == c.getFromUserId() && 200L == c.getToUserId()));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * C端 L2: 上级无 referralCode → 只创建 L1, 跳过 L2
|
|
|
|
|
|
|
+ * C端 L2: 上级无 referralCode → 免费用户也可获佣金, L1 + L2 均创建
|
|
|
*/
|
|
*/
|
|
|
@Test
|
|
@Test
|
|
|
void testPaySuccess_cEnd_upperNoReferralCode_skipsL2() {
|
|
void testPaySuccess_cEnd_upperNoReferralCode_skipsL2() {
|
|
@@ -639,7 +656,7 @@ class OrderServiceTest {
|
|
|
|
|
|
|
|
User inviter2 = new User();
|
|
User inviter2 = new User();
|
|
|
inviter2.setId(300L);
|
|
inviter2.setId(300L);
|
|
|
- inviter2.setReferralCode(null); // 上级未付费
|
|
|
|
|
|
|
+ inviter2.setReferralCode(null); // 上级未付费, 但免费用户也可获佣金
|
|
|
|
|
|
|
|
when(configService.getInt("commission.annual.direct_rate", 4000)).thenReturn(4000);
|
|
when(configService.getInt("commission.annual.direct_rate", 4000)).thenReturn(4000);
|
|
|
when(configService.getInt("commission.annual.upstream_rate", 500)).thenReturn(500);
|
|
when(configService.getInt("commission.annual.upstream_rate", 500)).thenReturn(500);
|
|
@@ -651,9 +668,11 @@ class OrderServiceTest {
|
|
|
|
|
|
|
|
orderService.paySuccess("trade_upper_no_rc");
|
|
orderService.paySuccess("trade_upper_no_rc");
|
|
|
|
|
|
|
|
- // L1 创建, L2 跳过
|
|
|
|
|
- verify(commissionRepository).save(argThat((Commission c) -> 1 == c.getLevel()));
|
|
|
|
|
- verify(commissionRepository, never()).save(argThat((Commission c) -> 2 == c.getLevel()));
|
|
|
|
|
|
|
+ // L1 + L2 均创建 (referralCode 检查已移除)
|
|
|
|
|
+ verify(commissionRepository).save(argThat((Commission c) ->
|
|
|
|
|
+ 1 == c.getLevel() && 5240 == c.getAmount()));
|
|
|
|
|
+ verify(commissionRepository).save(argThat((Commission c) ->
|
|
|
|
|
+ 2 == c.getLevel() && 655 == c.getAmount()));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -897,7 +916,7 @@ class OrderServiceTest {
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 场景: A(引荐人)未付费(referralCode=null) → B通过A的推广码注册 → B购买C端年费
|
|
* 场景: A(引荐人)未付费(referralCode=null) → B通过A的推广码注册 → B购买C端年费
|
|
|
- * 预期: A不获得佣金 (AC: referralCode=null 即未付费的引荐人无佣金)
|
|
|
|
|
|
|
+ * 预期: A获得佣金 (免费用户也可获得佣金)
|
|
|
*/
|
|
*/
|
|
|
@Test
|
|
@Test
|
|
|
void testCommissionFlow_inviterNotPaid_skipsCommission() {
|
|
void testCommissionFlow_inviterNotPaid_skipsCommission() {
|
|
@@ -917,6 +936,8 @@ class OrderServiceTest {
|
|
|
order.setProductType("annual");
|
|
order.setProductType("annual");
|
|
|
order.setStatus("pending");
|
|
order.setStatus("pending");
|
|
|
|
|
|
|
|
|
|
+ when(configService.getInt("commission.annual.direct_rate", 4000)).thenReturn(4000);
|
|
|
|
|
+ when(configService.getInt("commission.annual.upstream_rate", 500)).thenReturn(500);
|
|
|
when(orderRepository.findByOutTradeNo("flow_no_pay")).thenReturn(Optional.of(order));
|
|
when(orderRepository.findByOutTradeNo("flow_no_pay")).thenReturn(Optional.of(order));
|
|
|
when(orderRepository.save(any(Order.class))).thenReturn(order);
|
|
when(orderRepository.save(any(Order.class))).thenReturn(order);
|
|
|
when(userRepository.findById(100L)).thenReturn(Optional.of(buyer));
|
|
when(userRepository.findById(100L)).thenReturn(Optional.of(buyer));
|
|
@@ -924,8 +945,10 @@ class OrderServiceTest {
|
|
|
|
|
|
|
|
orderService.paySuccess("flow_no_pay");
|
|
orderService.paySuccess("flow_no_pay");
|
|
|
|
|
|
|
|
- // C端: inviter.referralCode=null → handleAnnualCommission 直接 return
|
|
|
|
|
- verify(commissionRepository, never()).save(any(Commission.class));
|
|
|
|
|
|
|
+ // C端: 免费用户也可获得 L1=40% 佣金
|
|
|
|
|
+ verify(commissionRepository).save(argThat((Commission c) ->
|
|
|
|
|
+ 1 == c.getLevel() && 5240 == c.getAmount()
|
|
|
|
|
+ && 100L == c.getFromUserId() && 200L == c.getToUserId()));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|