From 24681c81c09022f584a57006f2534b5f74723414 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 30 六月 2026 09:27:31 +0800
Subject: [PATCH] 初始化项目

---
 yudao-module-mall/yudao-module-trade/src/test/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordServiceImplTest.java |  200 ++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 170 insertions(+), 30 deletions(-)

diff --git a/yudao-module-mall/yudao-module-trade/src/test/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordServiceImplTest.java b/yudao-module-mall/yudao-module-trade/src/test/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordServiceImplTest.java
index 141e865..abdd4e8 100644
--- a/yudao-module-mall/yudao-module-trade/src/test/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordServiceImplTest.java
+++ b/yudao-module-mall/yudao-module-trade/src/test/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordServiceImplTest.java
@@ -1,36 +1,42 @@
 package cn.iocoder.yudao.module.trade.service.brokerage;
 
+import cn.hutool.core.collection.ListUtil;
 import cn.hutool.core.util.NumberUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
+import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi;
+import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO;
+import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi;
+import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;
 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.record.BrokerageRecordPageReqVO;
+import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.record.AppBrokerageProductPriceRespVO;
 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageRecordDO;
+import cn.iocoder.yudao.module.trade.dal.dataobject.config.TradeConfigDO;
 import cn.iocoder.yudao.module.trade.dal.mysql.brokerage.BrokerageRecordMapper;
+import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum;
+import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordStatusEnum;
 import cn.iocoder.yudao.module.trade.service.config.TradeConfigService;
 import jakarta.annotation.Resource;
-import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.springframework.context.annotation.Import;
 import org.springframework.test.context.bean.override.mockito.MockitoBean;
 
 import java.math.RoundingMode;
 
-import static cn.hutool.core.util.RandomUtil.randomEle;
-import static cn.hutool.core.util.RandomUtil.randomInt;
 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
+import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildTime;
 import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
-import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomInteger;
 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.when;
 
-// TODO @鑺嬭壙锛氬崟娴嬪悗缁湅鐪�
 /**
  * {@link BrokerageRecordServiceImpl} 鐨勫崟鍏冩祴璇曠被
  *
  * @author owen
  */
-@Disabled // TODO 鑺嬭壙锛氬悗缁� fix 琛ュ厖鐨勫崟娴�
 @Import(BrokerageRecordServiceImpl.class)
 public class BrokerageRecordServiceImplTest extends BaseDbUnitTest {
 
@@ -43,31 +49,43 @@
     private TradeConfigService tradeConfigService;
     @MockitoBean
     private BrokerageUserService brokerageUserService;
+    @MockitoBean
+    private ProductSpuApi productSpuApi;
+    @MockitoBean
+    private ProductSkuApi productSkuApi;
 
     @Test
-    @Disabled  // TODO 璇蜂慨鏀� null 涓洪渶瑕佺殑鍊硷紝鐒跺悗鍒犻櫎 @Disabled 娉ㄨВ
     public void testGetBrokerageRecordPage() {
         // mock 鏁版嵁
         BrokerageRecordDO dbBrokerageRecord = randomPojo(BrokerageRecordDO.class, o -> { // 绛変細鏌ヨ鍒�
-            o.setUserId(null);
-            o.setBizType(null);
-            o.setStatus(null);
-            o.setCreateTime(null);
+            o.setUserId(1L);
+            o.setBizType(BrokerageRecordBizTypeEnum.ORDER.getType());
+            o.setStatus(BrokerageRecordStatusEnum.SETTLEMENT.getStatus());
+            o.setSourceUserLevel(1);
+            o.setSourceUserId(100L);
+            o.setCreateTime(buildTime(2023, 2, 10));
+            o.setDeleted(false);
         });
         brokerageRecordMapper.insert(dbBrokerageRecord);
         // 娴嬭瘯 userId 涓嶅尮閰�
-        brokerageRecordMapper.insert(cloneIgnoreId(dbBrokerageRecord, o -> o.setUserId(null)));
+        brokerageRecordMapper.insert(cloneIgnoreId(dbBrokerageRecord, o -> o.setUserId(2L)));
         // 娴嬭瘯 bizType 涓嶅尮閰�
-        brokerageRecordMapper.insert(cloneIgnoreId(dbBrokerageRecord, o -> o.setBizType(null)));
+        brokerageRecordMapper.insert(cloneIgnoreId(dbBrokerageRecord,
+                o -> o.setBizType(BrokerageRecordBizTypeEnum.WITHDRAW.getType())));
         // 娴嬭瘯 status 涓嶅尮閰�
-        brokerageRecordMapper.insert(cloneIgnoreId(dbBrokerageRecord, o -> o.setStatus(null)));
+        brokerageRecordMapper.insert(cloneIgnoreId(dbBrokerageRecord,
+                o -> o.setStatus(BrokerageRecordStatusEnum.CANCEL.getStatus())));
+        // 娴嬭瘯 sourceUserLevel 涓嶅尮閰�
+        brokerageRecordMapper.insert(cloneIgnoreId(dbBrokerageRecord, o -> o.setSourceUserLevel(2)));
         // 娴嬭瘯 createTime 涓嶅尮閰�
-        brokerageRecordMapper.insert(cloneIgnoreId(dbBrokerageRecord, o -> o.setCreateTime(null)));
+        brokerageRecordMapper.insert(cloneIgnoreId(dbBrokerageRecord,
+                o -> o.setCreateTime(buildTime(2023, 3, 1))));
         // 鍑嗗鍙傛暟
         BrokerageRecordPageReqVO reqVO = new BrokerageRecordPageReqVO();
-        reqVO.setUserId(null);
-        reqVO.setBizType(null);
-        reqVO.setStatus(null);
+        reqVO.setUserId(1L);
+        reqVO.setBizType(BrokerageRecordBizTypeEnum.ORDER.getType());
+        reqVO.setStatus(BrokerageRecordStatusEnum.SETTLEMENT.getStatus());
+        reqVO.setSourceUserLevel(1);
         reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
 
         // 璋冪敤
@@ -81,37 +99,159 @@
     @Test
     public void testCalculatePrice_useFixedPrice() {
         // mock 鏁版嵁
-        Integer payPrice = randomInteger();
-        Integer percent = randomInt(1, 101);
-        Integer fixedPrice = randomInt();
+        Integer payPrice = 1000;
+        Integer percent = 10;
+        Integer fixedPrice = 88;
         // 璋冪敤
         int brokerage = brokerageRecordService.calculatePrice(payPrice, percent, fixedPrice);
         // 鏂█
-        assertEquals(brokerage, fixedPrice);
+        assertEquals(fixedPrice, brokerage);
     }
 
     @Test
     public void testCalculatePrice_usePercent() {
-        // mock 鏁版嵁
-        Integer payPrice = randomInteger();
-        Integer percent = randomInt(1, 101);
-        Integer fixedPrice = randomEle(new Integer[]{0, null});
-        System.out.println("fixedPrice=" + fixedPrice);
+        // mock 鏁版嵁锛歠ixedPrice 涓� null 鏃讹紝鎸夋瘮渚嬭绠椾剑閲�
+        Integer payPrice = 1000;
+        Integer percent = 10;
+        Integer fixedPrice = null;
         // 璋冪敤
         int brokerage = brokerageRecordService.calculatePrice(payPrice, percent, fixedPrice);
         // 鏂█
-        assertEquals(brokerage, NumberUtil.div(NumberUtil.mul(payPrice, percent), 100, 0, RoundingMode.DOWN).intValue());
+        assertEquals(NumberUtil.div(NumberUtil.mul(payPrice, percent), 100, 0,
+                RoundingMode.DOWN).intValue(), brokerage);
+    }
+
+    @Test
+    public void testCalculatePrice_fixedPriceIsZero() {
+        // mock 鏁版嵁锛歠ixedPrice 涓� 0 鏃讹紝浠嶄娇鐢ㄥ浐瀹氫剑閲戯紝涓嶅洖閫�鍒版瘮渚嬭绠�
+        Integer payPrice = 1000;
+        Integer percent = 10;
+        Integer fixedPrice = 0;
+        // 璋冪敤
+        int brokerage = brokerageRecordService.calculatePrice(payPrice, percent, fixedPrice);
+        // 鏂█
+        assertEquals(0, brokerage);
     }
 
     @Test
     public void testCalculatePrice_equalsZero() {
-        // mock 鏁版嵁
+        // mock 鏁版嵁锛氫笁涓弬鏁板潎鏃犳晥鏃讹紝杩斿洖 0
         Integer payPrice = null;
         Integer percent = null;
         Integer fixedPrice = null;
         // 璋冪敤
         int brokerage = brokerageRecordService.calculatePrice(payPrice, percent, fixedPrice);
         // 鏂█
-        assertEquals(brokerage, 0);
+        assertEquals(0, brokerage);
+    }
+
+    @Test
+    public void testCalculateProductBrokeragePrice_globalPercent() {
+        // mock锛氬垎閿�鍔熻兘宸插紑鍚紝姣斾緥 10%锛屽綋鍓嶇敤鎴锋湁鍒嗛攢璧勬牸
+        TradeConfigDO tradeConfig = new TradeConfigDO();
+        tradeConfig.setBrokerageEnabled(true);
+        tradeConfig.setBrokerageFirstPercent(10);
+        when(tradeConfigService.getTradeConfig()).thenReturn(tradeConfig);
+        when(brokerageUserService.getUserBrokerageEnabled(100L)).thenReturn(true);
+
+        // mock锛氬晢鍝佹湭寮�鍚嫭绔嬪垎閿�锛坰ubCommissionType = false锛夛紝SKU 鍞环 1000 鍒�
+        ProductSpuRespDTO spu = new ProductSpuRespDTO();
+        spu.setSubCommissionType(false);
+        when(productSpuApi.getSpu(1L)).thenReturn(spu);
+
+        ProductSkuRespDTO sku = new ProductSkuRespDTO();
+        sku.setPrice(1000);
+        when(productSkuApi.getSkuListBySpuId(ListUtil.of(1L))).thenReturn(ListUtil.of(sku));
+
+        // 璋冪敤
+        AppBrokerageProductPriceRespVO result = brokerageRecordService.calculateProductBrokeragePrice(100L, 1L);
+
+        // 鏂█锛氭寜 10% 姣斾緥璁$畻锛�1000 * 10% = 100 鍒嗭紙鍚戜笅鍙栨暣锛�
+        assertTrue(result.getEnabled());
+        assertEquals(100, result.getBrokerageMinPrice());
+        assertEquals(100, result.getBrokerageMaxPrice());
+    }
+
+    @Test
+    public void testCalculateProductBrokeragePrice_subCommissionZeroFixed() {
+        // mock锛氬垎閿�鍔熻兘宸插紑鍚紝姣斾緥 10%锛屽綋鍓嶇敤鎴锋湁鍒嗛攢璧勬牸
+        TradeConfigDO tradeConfig = new TradeConfigDO();
+        tradeConfig.setBrokerageEnabled(true);
+        tradeConfig.setBrokerageFirstPercent(10);
+        when(tradeConfigService.getTradeConfig()).thenReturn(tradeConfig);
+        when(brokerageUserService.getUserBrokerageEnabled(100L)).thenReturn(true);
+
+        // mock锛氬晢鍝佸紑鍚嫭绔嬪垎閿�锛坰ubCommissionType = true锛夛紝SKU 鍥哄畾浣i噾涓� 0锛堝晢瀹朵富鍔ㄨ缃級
+        ProductSpuRespDTO spu = new ProductSpuRespDTO();
+        spu.setSubCommissionType(true);
+        when(productSpuApi.getSpu(2L)).thenReturn(spu);
+
+        ProductSkuRespDTO sku = new ProductSkuRespDTO();
+        sku.setPrice(1000);
+        sku.setFirstBrokeragePrice(0);
+        when(productSkuApi.getSkuListBySpuId(ListUtil.of(2L))).thenReturn(ListUtil.of(sku));
+
+        // 璋冪敤
+        AppBrokerageProductPriceRespVO result = brokerageRecordService.calculateProductBrokeragePrice(100L, 2L);
+
+        // 鏂█锛氱嫭绔嬪垎閿�鍥哄畾浣i噾涓� 0锛屽簲杩斿洖 0锛屼笉寰楀洖閫�鍒板叏灞�姣斾緥
+        assertTrue(result.getEnabled());
+        assertEquals(0, result.getBrokerageMinPrice());
+        assertEquals(0, result.getBrokerageMaxPrice());
+    }
+
+    @Test
+    public void testCalculateProductBrokeragePrice_subCommissionNullFixed() {
+        // mock锛氬垎閿�鍔熻兘宸插紑鍚紝姣斾緥 10%锛屽綋鍓嶇敤鎴锋湁鍒嗛攢璧勬牸
+        TradeConfigDO tradeConfig = new TradeConfigDO();
+        tradeConfig.setBrokerageEnabled(true);
+        tradeConfig.setBrokerageFirstPercent(10);
+        when(tradeConfigService.getTradeConfig()).thenReturn(tradeConfig);
+        when(brokerageUserService.getUserBrokerageEnabled(100L)).thenReturn(true);
+
+        // mock锛氬晢鍝佸紑鍚嫭绔嬪垎閿�锛屽叾涓竴涓� SKU 鍥哄畾浣i噾鏈厤缃�
+        ProductSpuRespDTO spu = new ProductSpuRespDTO();
+        spu.setSubCommissionType(true);
+        when(productSpuApi.getSpu(3L)).thenReturn(spu);
+
+        ProductSkuRespDTO nullBrokerageSku = new ProductSkuRespDTO();
+        nullBrokerageSku.setPrice(1000);
+        nullBrokerageSku.setFirstBrokeragePrice(null);
+        ProductSkuRespDTO fixedBrokerageSku = new ProductSkuRespDTO();
+        fixedBrokerageSku.setPrice(2000);
+        fixedBrokerageSku.setFirstBrokeragePrice(200);
+        when(productSkuApi.getSkuListBySpuId(ListUtil.of(3L))).thenReturn(ListUtil.of(nullBrokerageSku, fixedBrokerageSku));
+
+        // 璋冪敤
+        AppBrokerageProductPriceRespVO result = brokerageRecordService.calculateProductBrokeragePrice(100L, 3L);
+
+        // 鏂█锛氱嫭绔嬪垎閿�鍥哄畾浣i噾涓虹┖鏃舵寜 0 澶勭悊锛岄伩鍏嶆瘮杈冩渶灏�/鏈�澶т剑閲戞椂鎶ラ敊
+        assertTrue(result.getEnabled());
+        assertEquals(0, result.getBrokerageMinPrice());
+        assertEquals(200, result.getBrokerageMaxPrice());
+    }
+
+    @Test
+    public void testCalculateProductBrokeragePrice_subCommissionEmptySkuList() {
+        // mock锛氬垎閿�鍔熻兘宸插紑鍚紝姣斾緥 10%锛屽綋鍓嶇敤鎴锋湁鍒嗛攢璧勬牸
+        TradeConfigDO tradeConfig = new TradeConfigDO();
+        tradeConfig.setBrokerageEnabled(true);
+        tradeConfig.setBrokerageFirstPercent(10);
+        when(tradeConfigService.getTradeConfig()).thenReturn(tradeConfig);
+        when(brokerageUserService.getUserBrokerageEnabled(100L)).thenReturn(true);
+
+        // mock锛氬晢鍝佸紑鍚嫭绔嬪垎閿�锛屼絾鏌ヨ涓嶅埌 SKU 鍥哄畾浣i噾
+        ProductSpuRespDTO spu = new ProductSpuRespDTO();
+        spu.setSubCommissionType(true);
+        when(productSpuApi.getSpu(4L)).thenReturn(spu);
+        when(productSkuApi.getSkuListBySpuId(ListUtil.of(4L))).thenReturn(ListUtil.of());
+
+        // 璋冪敤
+        AppBrokerageProductPriceRespVO result = brokerageRecordService.calculateProductBrokeragePrice(100L, 4L);
+
+        // 鏂█锛氱嫭绔嬪垎閿�娌℃湁鍥哄畾浣i噾鏃讹紝涓嶅洖閫�鍒板叏灞�姣斾緥
+        assertTrue(result.getEnabled());
+        assertEquals(0, result.getBrokerageMinPrice());
+        assertEquals(0, result.getBrokerageMaxPrice());
     }
 }

--
Gitblit v1.9.3