解决租户问题

This commit is contained in:
2026-02-08 18:58:53 +08:00
parent 564fd35cac
commit b35cf746ac

View File

@@ -0,0 +1,294 @@
package com.rj.scheduler;
import com.rj.entity.CustomerManagementStatistics;
import com.rj.service.ICustomerManagementStatisticsService;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import java.time.LocalDate;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
/**
* CustomerStatisticsScheduler 集成测试
* 测试客户统计调度器的执行和统计数据的生成
*
* @author 李中华 ,spllzh
* @since 2025-08-07
*/
@SpringBootTest
@ActiveProfiles("test")
@DisplayName("客户统计调度器集成测试")
class CustomerStatisticsSchedulerIntegrationTest {
@Autowired
private CustomerStatisticsScheduler customerStatisticsScheduler;
@Autowired
private ICustomerManagementStatisticsService customerStatisticsService;
/**
* 测试手动触发统计任务
*/
@Test
@DisplayName("测试手动触发统计任务")
void testManualGenerateStatistics() {
// 准备测试日期(使用昨天的日期)
LocalDate testDate = LocalDate.now().minusDays(1);
System.out.println("开始测试手动触发统计任务,统计日期: " + testDate);
// 执行手动统计任务
int count = customerStatisticsScheduler.manualGenerateStatistics(testDate);
// 验证结果
assertTrue(count >= 0, "统计记录数应该大于等于0");
System.out.println("生成统计记录数: " + count);
// 验证数据是否保存到数据库
List<CustomerManagementStatistics> statistics = customerStatisticsService.getStatisticsByDateRange(testDate, testDate);
assertNotNull(statistics, "统计列表不应该为null");
assertEquals(count, statistics.size(), "生成的记录数应该与查询到的记录数一致");
// 验证统计记录的完整性
if (!statistics.isEmpty()) {
CustomerManagementStatistics firstStat = statistics.get(0);
assertNotNull(firstStat.getId(), "统计记录ID不应为空");
assertEquals(testDate, firstStat.getStatisticsDate(), "统计日期应该正确");
assertNotNull(firstStat.getTenantId(), "租户ID不应为空");
assertNotNull(firstStat.getDealershipId(), "经销商ID不应为空");
assertNotNull(firstStat.getSalesId(), "销售ID不应为空");
assertNotNull(firstStat.getCountByDealership(), "按经销商统计数量不应为空");
assertNotNull(firstStat.getCountBySales(), "按销售统计数量不应为空");
assertNotNull(firstStat.getCountByProject(), "按项目统计数量不应为空");
System.out.println("统计记录详情:");
System.out.println(" ID: " + firstStat.getId());
System.out.println(" 租户ID: " + firstStat.getTenantId());
System.out.println(" 经销商ID: " + firstStat.getDealershipId());
System.out.println(" 经销商名称: " + firstStat.getDealershipName());
System.out.println(" 销售ID: " + firstStat.getSalesId());
System.out.println(" 按经销商统计数量: " + firstStat.getCountByDealership());
System.out.println(" 按销售统计数量: " + firstStat.getCountBySales());
System.out.println(" 按项目统计数量: " + firstStat.getCountByProject());
System.out.println(" 统计日期: " + firstStat.getStatisticsDate());
}
}
/**
* 测试重复执行统计任务(应该先删除再生成)
*/
@Test
@DisplayName("测试重复执行统计任务")
void testDuplicateStatisticsGeneration() {
LocalDate testDate = LocalDate.now().minusDays(2);
System.out.println("开始测试重复执行统计任务,统计日期: " + testDate);
// 第一次执行
int firstCount = customerStatisticsScheduler.manualGenerateStatistics(testDate);
System.out.println("第一次执行生成记录数: " + firstCount);
// 验证第一次执行的结果
List<CustomerManagementStatistics> firstStatistics = customerStatisticsService.getStatisticsByDateRange(testDate, testDate);
assertEquals(firstCount, firstStatistics.size(), "第一次执行后记录数应该正确");
// 第二次执行(应该先删除再生成)
int secondCount = customerStatisticsScheduler.manualGenerateStatistics(testDate);
System.out.println("第二次执行生成记录数: " + secondCount);
// 验证第二次执行的结果(记录数应该与第一次一致或接近)
List<CustomerManagementStatistics> secondStatistics = customerStatisticsService.getStatisticsByDateRange(testDate, testDate);
assertEquals(secondCount, secondStatistics.size(), "第二次执行后记录数应该正确");
// 验证记录数应该一致(因为同一天的数据应该相同)
assertEquals(firstCount, secondCount, "重复执行应该生成相同数量的记录");
}
/**
* 测试查询指定日期范围的统计数据
*/
@Test
@DisplayName("测试查询指定日期范围的统计数据")
void testGetStatisticsByDateRange() {
LocalDate startDate = LocalDate.now().minusDays(7);
LocalDate endDate = LocalDate.now().minusDays(1);
System.out.println("开始测试查询日期范围统计,开始日期: " + startDate + ", 结束日期: " + endDate);
// 查询统计数据
List<CustomerManagementStatistics> statistics = customerStatisticsService.getStatisticsByDateRange(startDate, endDate);
// 验证结果
assertNotNull(statistics, "统计列表不应该为null");
assertTrue(statistics.size() >= 0, "统计记录数应该大于等于0");
System.out.println("查询到统计记录数: " + statistics.size());
// 验证统计记录的日期范围
for (CustomerManagementStatistics stat : statistics) {
assertTrue(stat.getStatisticsDate().isAfter(startDate.minusDays(1)) ||
stat.getStatisticsDate().isEqual(startDate),
"统计日期应该在开始日期之后或等于开始日期");
assertTrue(stat.getStatisticsDate().isBefore(endDate.plusDays(1)) ||
stat.getStatisticsDate().isEqual(endDate),
"统计日期应该在结束日期之前或等于结束日期");
}
// 打印部分统计信息
if (!statistics.isEmpty()) {
System.out.println("前5条统计记录:");
statistics.stream().limit(5).forEach(stat -> {
System.out.println(" 日期: " + stat.getStatisticsDate() +
", 经销商: " + stat.getDealershipName() +
", 经销商统计: " + stat.getCountByDealership() +
", 销售统计: " + stat.getCountBySales() +
", 项目统计: " + stat.getCountByProject());
});
}
}
/**
* 测试查询指定经销商的统计数据
*/
@Test
@DisplayName("测试查询指定经销商的统计数据")
void testGetStatisticsByDealership() {
LocalDate startDate = LocalDate.now().minusDays(7);
LocalDate endDate = LocalDate.now().minusDays(1);
// 先查询所有统计数据获取一个经销商ID
List<CustomerManagementStatistics> allStatistics = customerStatisticsService.getStatisticsByDateRange(startDate, endDate);
if (allStatistics.isEmpty()) {
System.out.println("没有统计数据,跳过经销商查询测试");
return;
}
String dealershipId = allStatistics.get(0).getDealershipId();
System.out.println("开始测试查询经销商统计经销商ID: " + dealershipId);
// 查询指定经销商的统计数据
List<CustomerManagementStatistics> statistics = customerStatisticsService.getStatisticsByDealership(dealershipId, startDate, endDate);
// 验证结果
assertNotNull(statistics, "统计列表不应该为null");
assertTrue(statistics.size() >= 0, "统计记录数应该大于等于0");
System.out.println("查询到经销商统计记录数: " + statistics.size());
// 验证所有记录都是指定经销商的
for (CustomerManagementStatistics stat : statistics) {
assertEquals(dealershipId, stat.getDealershipId(), "所有记录应该属于指定经销商");
}
}
/**
* 测试查询指定销售的统计数据
*/
@Test
@DisplayName("测试查询指定销售的统计数据")
void testGetStatisticsBySales() {
LocalDate startDate = LocalDate.now().minusDays(7);
LocalDate endDate = LocalDate.now().minusDays(1);
// 先查询所有统计数据获取一个销售ID
List<CustomerManagementStatistics> allStatistics = customerStatisticsService.getStatisticsByDateRange(startDate, endDate);
if (allStatistics.isEmpty()) {
System.out.println("没有统计数据,跳过销售查询测试");
return;
}
String salesId = allStatistics.get(0).getSalesId();
System.out.println("开始测试查询销售统计销售ID: " + salesId);
// 查询指定销售的统计数据
List<CustomerManagementStatistics> statistics = customerStatisticsService.getStatisticsBySales(salesId, startDate, endDate);
// 验证结果
assertNotNull(statistics, "统计列表不应该为null");
assertTrue(statistics.size() >= 0, "统计记录数应该大于等于0");
System.out.println("查询到销售统计记录数: " + statistics.size());
// 验证所有记录都是指定销售的
for (CustomerManagementStatistics stat : statistics) {
assertEquals(salesId, stat.getSalesId(), "所有记录应该属于指定销售");
}
}
/**
* 测试统计数据的完整性
*/
@Test
@DisplayName("测试统计数据的完整性")
void testStatisticsDataIntegrity() {
LocalDate testDate = LocalDate.now().minusDays(1);
System.out.println("开始测试统计数据完整性,统计日期: " + testDate);
// 执行统计任务
int count = customerStatisticsScheduler.manualGenerateStatistics(testDate);
if (count == 0) {
System.out.println("没有生成统计数据,跳过完整性测试");
return;
}
// 查询统计数据
List<CustomerManagementStatistics> statistics = customerStatisticsService.getStatisticsByDateRange(testDate, testDate);
// 验证每条记录的完整性
for (CustomerManagementStatistics stat : statistics) {
// 验证必填字段
assertNotNull(stat.getId(), "ID不应为空");
assertNotNull(stat.getStatisticsDate(), "统计日期不应为空");
assertNotNull(stat.getTenantId(), "租户ID不应为空");
assertNotNull(stat.getDealershipId(), "经销商ID不应为空");
assertNotNull(stat.getSalesId(), "销售ID不应为空");
// 验证统计数量字段
assertNotNull(stat.getCountByDealership(), "按经销商统计数量不应为空");
assertNotNull(stat.getCountBySales(), "按销售统计数量不应为空");
assertNotNull(stat.getCountByProject(), "按项目统计数量不应为空");
// 验证统计数量应该大于等于0
assertTrue(stat.getCountByDealership() >= 0, "按经销商统计数量应该大于等于0");
assertTrue(stat.getCountBySales() >= 0, "按销售统计数量应该大于等于0");
assertTrue(stat.getCountByProject() >= 0, "按项目统计数量应该大于等于0");
// 验证时间字段
assertNotNull(stat.getCreatedAt(), "创建时间不应为空");
assertNotNull(stat.getUpdatedAt(), "更新时间不应为空");
}
System.out.println("统计数据完整性验证通过,共验证 " + statistics.size() + " 条记录");
}
/**
* 测试生成昨天的统计数据
*/
@Test
@DisplayName("测试生成昨天的统计数据")
void testGenerateYesterdayStatistics() {
System.out.println("开始测试生成昨天的统计数据");
// 执行生成昨天的统计数据
int count = customerStatisticsService.generateYesterdayStatistics();
// 验证结果
assertTrue(count >= 0, "统计记录数应该大于等于0");
System.out.println("生成昨天统计记录数: " + count);
// 验证数据是否保存
LocalDate yesterday = LocalDate.now().minusDays(1);
List<CustomerManagementStatistics> statistics = customerStatisticsService.getStatisticsByDateRange(yesterday, yesterday);
assertEquals(count, statistics.size(), "生成的记录数应该与查询到的记录数一致");
}
}