diff --git a/yudao-module-erp/src/main/resources/mapper/statistics/ErpPurchaseStatisticsMapper.xml b/yudao-module-erp/src/main/resources/mapper/statistics/ErpPurchaseStatisticsMapper.xml
index 699286b5d..a88fb3a88 100644
--- a/yudao-module-erp/src/main/resources/mapper/statistics/ErpPurchaseStatisticsMapper.xml
+++ b/yudao-module-erp/src/main/resources/mapper/statistics/ErpPurchaseStatisticsMapper.xml
@@ -10,7 +10,9 @@
AND in_time < #{endTime}
- AND tenant_id = ${@cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder@getRequiredTenantId()}
+
+ AND tenant_id = ${@cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder@getTenantId()}
+
AND deleted = 0) -
(SELECT IFNULL(SUM(total_price), 0)
FROM erp_purchase_return
@@ -18,7 +20,9 @@
AND return_time < #{endTime}
- AND tenant_id = ${@cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder@getRequiredTenantId()}
+
+ AND tenant_id = ${@cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder@getTenantId()}
+
AND deleted = 0)
diff --git a/yudao-module-erp/src/main/resources/mapper/statistics/ErpSaleStatisticsMapper.xml b/yudao-module-erp/src/main/resources/mapper/statistics/ErpSaleStatisticsMapper.xml
index 324cbd432..3e04ee706 100644
--- a/yudao-module-erp/src/main/resources/mapper/statistics/ErpSaleStatisticsMapper.xml
+++ b/yudao-module-erp/src/main/resources/mapper/statistics/ErpSaleStatisticsMapper.xml
@@ -10,7 +10,9 @@
AND out_time < #{endTime}
- AND tenant_id = ${@cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder@getRequiredTenantId()}
+
+ AND tenant_id = ${@cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder@getTenantId()}
+
AND deleted = 0) -
(SELECT IFNULL(SUM(total_price), 0)
FROM erp_sale_return
@@ -18,7 +20,9 @@
AND return_time < #{endTime}
- AND tenant_id = ${@cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder@getRequiredTenantId()}
+
+ AND tenant_id = ${@cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder@getTenantId()}
+
AND deleted = 0)
diff --git a/yudao-module-erp/src/test/java/cn/iocoder/yudao/module/erp/service/statistics/ErpStatisticsServiceTest.java b/yudao-module-erp/src/test/java/cn/iocoder/yudao/module/erp/service/statistics/ErpStatisticsServiceTest.java
new file mode 100644
index 000000000..c96f2d35f
--- /dev/null
+++ b/yudao-module-erp/src/test/java/cn/iocoder/yudao/module/erp/service/statistics/ErpStatisticsServiceTest.java
@@ -0,0 +1,155 @@
+package cn.iocoder.yudao.module.erp.service.statistics;
+
+import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
+import cn.iocoder.yudao.module.erp.dal.mysql.statistics.ErpPurchaseStatisticsMapper;
+import cn.iocoder.yudao.module.erp.dal.mysql.statistics.ErpSaleStatisticsMapper;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.ActiveProfiles;
+
+import jakarta.annotation.Resource;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
+/**
+ * ERP 统计服务测试类
+ * 主要测试在多租户关闭情况下,统计查询是否能正常工作
+ *
+ * @author 芋道源码
+ */
+@SpringBootTest
+@ActiveProfiles("unit-test")
+public class ErpStatisticsServiceTest {
+
+ @Resource
+ private ErpSaleStatisticsService saleStatisticsService;
+
+ @Resource
+ private ErpPurchaseStatisticsService purchaseStatisticsService;
+
+ @MockBean
+ private ErpSaleStatisticsMapper saleStatisticsMapper;
+
+ @MockBean
+ private ErpPurchaseStatisticsMapper purchaseStatisticsMapper;
+
+ @BeforeEach
+ void setUp() {
+ // 清理租户上下文
+ TenantContextHolder.clear();
+ }
+
+ @AfterEach
+ void tearDown() {
+ // 清理租户上下文
+ TenantContextHolder.clear();
+ }
+
+ @Test
+ void testSaleStatisticsWithoutTenant() {
+ // 准备参数
+ LocalDateTime beginTime = LocalDateTime.of(2024, 1, 1, 0, 0, 0);
+ LocalDateTime endTime = LocalDateTime.of(2024, 1, 31, 23, 59, 59);
+ BigDecimal expectedPrice = new BigDecimal("1000.00");
+
+ // Mock 返回值
+ when(saleStatisticsMapper.getSalePrice(any(LocalDateTime.class), any(LocalDateTime.class)))
+ .thenReturn(expectedPrice);
+
+ // 测试:在没有租户ID的情况下调用销售统计
+ assertDoesNotThrow(() -> {
+ BigDecimal result = saleStatisticsService.getSalePrice(beginTime, endTime);
+ assertEquals(expectedPrice, result);
+ }, "在多租户关闭时,销售统计查询应该能正常工作");
+ }
+
+ @Test
+ void testPurchaseStatisticsWithoutTenant() {
+ // 准备参数
+ LocalDateTime beginTime = LocalDateTime.of(2024, 1, 1, 0, 0, 0);
+ LocalDateTime endTime = LocalDateTime.of(2024, 1, 31, 23, 59, 59);
+ BigDecimal expectedPrice = new BigDecimal("800.00");
+
+ // Mock 返回值
+ when(purchaseStatisticsMapper.getPurchasePrice(any(LocalDateTime.class), any(LocalDateTime.class)))
+ .thenReturn(expectedPrice);
+
+ // 测试:在没有租户ID的情况下调用采购统计
+ assertDoesNotThrow(() -> {
+ BigDecimal result = purchaseStatisticsService.getPurchasePrice(beginTime, endTime);
+ assertEquals(expectedPrice, result);
+ }, "在多租户关闭时,采购统计查询应该能正常工作");
+ }
+
+ @Test
+ void testSaleStatisticsWithTenant() {
+ // 设置租户ID
+ Long tenantId = 1L;
+ TenantContextHolder.setTenantId(tenantId);
+
+ // 准备参数
+ LocalDateTime beginTime = LocalDateTime.of(2024, 1, 1, 0, 0, 0);
+ LocalDateTime endTime = LocalDateTime.of(2024, 1, 31, 23, 59, 59);
+ BigDecimal expectedPrice = new BigDecimal("1500.00");
+
+ // Mock 返回值
+ when(saleStatisticsMapper.getSalePrice(any(LocalDateTime.class), any(LocalDateTime.class)))
+ .thenReturn(expectedPrice);
+
+ // 测试:在有租户ID的情况下调用销售统计
+ assertDoesNotThrow(() -> {
+ BigDecimal result = saleStatisticsService.getSalePrice(beginTime, endTime);
+ assertEquals(expectedPrice, result);
+ }, "在多租户开启时,销售统计查询应该能正常工作");
+
+ // 验证租户ID是否正确设置
+ assertEquals(tenantId, TenantContextHolder.getTenantId());
+ }
+
+ @Test
+ void testPurchaseStatisticsWithTenant() {
+ // 设置租户ID
+ Long tenantId = 2L;
+ TenantContextHolder.setTenantId(tenantId);
+
+ // 准备参数
+ LocalDateTime beginTime = LocalDateTime.of(2024, 1, 1, 0, 0, 0);
+ LocalDateTime endTime = LocalDateTime.of(2024, 1, 31, 23, 59, 59);
+ BigDecimal expectedPrice = new BigDecimal("1200.00");
+
+ // Mock 返回值
+ when(purchaseStatisticsMapper.getPurchasePrice(any(LocalDateTime.class), any(LocalDateTime.class)))
+ .thenReturn(expectedPrice);
+
+ // 测试:在有租户ID的情况下调用采购统计
+ assertDoesNotThrow(() -> {
+ BigDecimal result = purchaseStatisticsService.getPurchasePrice(beginTime, endTime);
+ assertEquals(expectedPrice, result);
+ }, "在多租户开启时,采购统计查询应该能正常工作");
+
+ // 验证租户ID是否正确设置
+ assertEquals(tenantId, TenantContextHolder.getTenantId());
+ }
+
+ @Test
+ void testTenantContextHolderMethods() {
+ // 测试 getTenantId() 在没有设置租户时返回 null
+ assertNull(TenantContextHolder.getTenantId(), "未设置租户时应该返回 null");
+
+ // 设置租户ID
+ Long tenantId = 3L;
+ TenantContextHolder.setTenantId(tenantId);
+ assertEquals(tenantId, TenantContextHolder.getTenantId(), "设置租户后应该能正确获取");
+
+ // 清理租户上下文
+ TenantContextHolder.clear();
+ assertNull(TenantContextHolder.getTenantId(), "清理后应该返回 null");
+ }
+}