定时器 ,周期性的统计分析品牌维度
This commit is contained in:
@@ -112,5 +112,6 @@ public class PasswordUtil {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -96,5 +96,6 @@ public class ServiceManager {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -74,5 +74,6 @@ public class AliyunConfig {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -195,5 +195,6 @@ public class AuthController {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -334,5 +334,6 @@ public class MenuController {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -304,5 +304,6 @@ public class RoleController {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -310,5 +310,6 @@ public class UserRoleController {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -78,3 +78,4 @@ public class DifyWorkflowResponseDto {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -22,3 +22,4 @@ public interface CustomerProfileAnalysisMapper extends BaseMapper<CustomerProfil
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -61,5 +61,6 @@ public class LoginResponse {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -80,5 +80,6 @@ public class AudioStatisticsScheduler {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ public class CpaBrandCoreScheduler {
|
|||||||
log.info("开始执行经销商品牌得分日统计任务...");
|
log.info("开始执行经销商品牌得分日统计任务...");
|
||||||
|
|
||||||
LocalDate yesterday = LocalDate.now().minusDays(1);
|
LocalDate yesterday = LocalDate.now().minusDays(1);
|
||||||
int count = cpaBrandScoreStatisticsService.generateAndSaveStatistics("daily", yesterday, yesterday, "system");
|
int count = cpaBrandScoreStatisticsService.generateAndSaveStatistics("daily", yesterday, yesterday, "systemScheduler");
|
||||||
|
|
||||||
log.info("经销商品牌得分日统计任务执行完成,统计日期:{},生成记录数:{}",
|
log.info("经销商品牌得分日统计任务执行完成,统计日期:{},生成记录数:{}",
|
||||||
yesterday.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")), count);
|
yesterday.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")), count);
|
||||||
@@ -44,21 +44,17 @@ public class CpaBrandCoreScheduler {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 每周一凌晨4点执行周统计任务
|
* 每周一凌晨4点执行周统计任务
|
||||||
* 统计上周的数据
|
* 统计上周的数据(服务层自动计算上周时间范围)
|
||||||
*/
|
*/
|
||||||
@Scheduled(cron = "0 0 4 * * MON")
|
@Scheduled(cron = "0 0 4 * * MON")
|
||||||
public void generateWeeklyStatistics() {
|
public void generateWeeklyStatistics() {
|
||||||
try {
|
try {
|
||||||
log.info("开始执行经销商品牌得分周统计任务...");
|
log.info("开始执行经销商品牌得分周统计任务...");
|
||||||
|
|
||||||
LocalDate lastWeekStart = LocalDate.now().minusWeeks(1).with(java.time.DayOfWeek.MONDAY);
|
// 周统计的时间范围由服务层自动计算,这里传递null即可
|
||||||
LocalDate lastWeekEnd = lastWeekStart.plusDays(6);
|
int count = cpaBrandScoreStatisticsService.generateAndSaveStatistics("weekly", null, null, "systemCpaBrandCoreScheduler");
|
||||||
|
|
||||||
int count = cpaBrandScoreStatisticsService.generateAndSaveStatistics("weekly", lastWeekStart, lastWeekEnd, "system");
|
log.info("经销商品牌得分周统计任务执行完成,生成记录数:{}", count);
|
||||||
|
|
||||||
log.info("经销商品牌得分周统计任务执行完成,统计周期:{} - {},生成记录数:{}",
|
|
||||||
lastWeekStart.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")),
|
|
||||||
lastWeekEnd.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")), count);
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("经销商品牌得分周统计任务执行失败", e);
|
log.error("经销商品牌得分周统计任务执行失败", e);
|
||||||
}
|
}
|
||||||
@@ -66,21 +62,17 @@ public class CpaBrandCoreScheduler {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 每月1号凌晨5点执行月统计任务
|
* 每月1号凌晨5点执行月统计任务
|
||||||
* 统计上个月的数据
|
* 统计上个月的数据(服务层自动计算上月时间范围)
|
||||||
*/
|
*/
|
||||||
@Scheduled(cron = "0 0 5 1 * ?")
|
@Scheduled(cron = "0 0 5 1 * ?")
|
||||||
public void generateMonthlyStatistics() {
|
public void generateMonthlyStatistics() {
|
||||||
try {
|
try {
|
||||||
log.info("开始执行经销商品牌得分月统计任务...");
|
log.info("开始执行经销商品牌得分月统计任务...");
|
||||||
|
|
||||||
LocalDate lastMonthStart = LocalDate.now().minusMonths(1).withDayOfMonth(1);
|
// 月统计的时间范围由服务层自动计算,这里传递null即可
|
||||||
LocalDate lastMonthEnd = lastMonthStart.withDayOfMonth(lastMonthStart.lengthOfMonth());
|
int count = cpaBrandScoreStatisticsService.generateAndSaveStatistics("monthly", null, null, "systemCpaBrandCoreScheduler");
|
||||||
|
|
||||||
int count = cpaBrandScoreStatisticsService.generateAndSaveStatistics("monthly", lastMonthStart, lastMonthEnd, "system");
|
log.info("经销商品牌得分月统计任务执行完成,生成记录数:{}", count);
|
||||||
|
|
||||||
log.info("经销商品牌得分月统计任务执行完成,统计周期:{} - {},生成记录数:{}",
|
|
||||||
lastMonthStart.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")),
|
|
||||||
lastMonthEnd.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")), count);
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("经销商品牌得分月统计任务执行失败", e);
|
log.error("经销商品牌得分月统计任务执行失败", e);
|
||||||
}
|
}
|
||||||
@@ -95,7 +87,7 @@ public class CpaBrandCoreScheduler {
|
|||||||
try {
|
try {
|
||||||
log.info("开始执行经销商品牌得分总计统计任务...");
|
log.info("开始执行经销商品牌得分总计统计任务...");
|
||||||
|
|
||||||
int count = cpaBrandScoreStatisticsService.generateAndSaveStatistics("total", null, null, "system");
|
int count = cpaBrandScoreStatisticsService.generateAndSaveStatistics("total", null, null, "systemCpaBrandCoreScheduler");
|
||||||
|
|
||||||
log.info("经销商品牌得分总计统计任务执行完成,生成记录数:{}", count);
|
log.info("经销商品牌得分总计统计任务执行完成,生成记录数:{}", count);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@@ -113,7 +105,7 @@ public class CpaBrandCoreScheduler {
|
|||||||
public int manualGenerateStatistics(LocalDate date, String statisticsType) {
|
public int manualGenerateStatistics(LocalDate date, String statisticsType) {
|
||||||
try {
|
try {
|
||||||
log.info("手动执行经销商品牌得分统计任务,统计日期:{},统计类型:{}", date, statisticsType);
|
log.info("手动执行经销商品牌得分统计任务,统计日期:{},统计类型:{}", date, statisticsType);
|
||||||
int count = cpaBrandScoreStatisticsService.generateAndSaveStatistics(statisticsType, date, date, "manual");
|
int count = cpaBrandScoreStatisticsService.generateAndSaveStatistics(statisticsType, date, date, "manualCpaBrandCoreScheduler");
|
||||||
log.info("手动经销商品牌得分统计任务执行完成,统计日期:{},统计类型:{},生成记录数:{}",
|
log.info("手动经销商品牌得分统计任务执行完成,统计日期:{},统计类型:{},生成记录数:{}",
|
||||||
date, statisticsType, count);
|
date, statisticsType, count);
|
||||||
return count;
|
return count;
|
||||||
@@ -126,17 +118,27 @@ public class CpaBrandCoreScheduler {
|
|||||||
/**
|
/**
|
||||||
* 手动触发日期范围统计任务
|
* 手动触发日期范围统计任务
|
||||||
*
|
*
|
||||||
* @param startDate 开始日期
|
* @param startDate 开始日期(对于weekly/monthly类型,此参数将被忽略,服务层自动计算)
|
||||||
* @param endDate 结束日期
|
* @param endDate 结束日期(对于weekly/monthly类型,此参数将被忽略,服务层自动计算)
|
||||||
* @param statisticsType 统计类型
|
* @param statisticsType 统计类型
|
||||||
* @return 生成的记录数
|
* @return 生成的记录数
|
||||||
*/
|
*/
|
||||||
public int manualGenerateStatisticsByRange(LocalDate startDate, LocalDate endDate, String statisticsType) {
|
public int manualGenerateStatisticsByRange(LocalDate startDate, LocalDate endDate, String statisticsType) {
|
||||||
try {
|
try {
|
||||||
log.info("手动执行经销商品牌得分统计任务,统计范围:{} - {},统计类型:{}", startDate, endDate, statisticsType);
|
if ("weekly".equals(statisticsType) || "monthly".equals(statisticsType)) {
|
||||||
|
log.info("手动执行经销商品牌得分统计任务,统计类型:{}(时间范围由服务层自动计算)", statisticsType);
|
||||||
|
} else {
|
||||||
|
log.info("手动执行经销商品牌得分统计任务,统计范围:{} - {},统计类型:{}", startDate, endDate, statisticsType);
|
||||||
|
}
|
||||||
|
|
||||||
int count = cpaBrandScoreStatisticsService.generateAndSaveStatistics(statisticsType, startDate, endDate, "manual");
|
int count = cpaBrandScoreStatisticsService.generateAndSaveStatistics(statisticsType, startDate, endDate, "manual");
|
||||||
log.info("手动经销商品牌得分统计任务执行完成,统计范围:{} - {},统计类型:{},生成记录数:{}",
|
|
||||||
startDate, endDate, statisticsType, count);
|
if ("weekly".equals(statisticsType) || "monthly".equals(statisticsType)) {
|
||||||
|
log.info("手动经销商品牌得分统计任务执行完成,统计类型:{},生成记录数:{}", statisticsType, count);
|
||||||
|
} else {
|
||||||
|
log.info("手动经销商品牌得分统计任务执行完成,统计范围:{} - {},统计类型:{},生成记录数:{}",
|
||||||
|
startDate, endDate, statisticsType, count);
|
||||||
|
}
|
||||||
return count;
|
return count;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("手动经销商品牌得分统计任务执行失败,统计范围:{} - {},统计类型:{}", startDate, endDate, statisticsType, e);
|
log.error("手动经销商品牌得分统计任务执行失败,统计范围:{} - {},统计类型:{}", startDate, endDate, statisticsType, e);
|
||||||
|
|||||||
@@ -134,18 +134,23 @@ public class CustomerProfileMockInsertDataScheduler {
|
|||||||
public void generateDailyCustomerProfileData() {
|
public void generateDailyCustomerProfileData() {
|
||||||
try {
|
try {
|
||||||
log.info("开始执行客户画像数据生成任务...");
|
log.info("开始执行客户画像数据生成任务...");
|
||||||
|
|
||||||
// 生成昨天的数据
|
|
||||||
LocalDateTime yesterday = LocalDateTime.now().minusDays(1);
|
|
||||||
int count = generateCustomerProfileDataForDate(yesterday);
|
|
||||||
|
|
||||||
log.info("客户画像数据生成任务执行完成,生成日期:{},生成记录数:{}",
|
|
||||||
yesterday.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")), count);
|
|
||||||
|
|
||||||
// 生成今天的数据
|
// 生成今天的数据
|
||||||
LocalDateTime today = LocalDateTime.now().minusDays(0);
|
LocalDateTime today = LocalDateTime.now().minusDays(0);
|
||||||
int todayCount = generateCustomerProfileDataForDate(today);
|
int todayCount = generateCustomerProfileDataForDate(today);
|
||||||
|
|
||||||
|
// 生成昨天的数据
|
||||||
|
LocalDateTime yesterday = LocalDateTime.now().minusDays(1);
|
||||||
|
int count = generateCustomerProfileDataForDate(yesterday);
|
||||||
|
|
||||||
|
// 生成前天天的数据
|
||||||
|
LocalDateTime yesterday2 = LocalDateTime.now().minusDays(2);
|
||||||
|
int count2 = generateCustomerProfileDataForDate(yesterday2);
|
||||||
|
|
||||||
|
|
||||||
|
log.info("客户画像数据生成任务执行完成,生成日期:{},生成记录数:{}",
|
||||||
|
yesterday.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")), count);
|
||||||
|
|
||||||
|
|
||||||
log.info("客户画像数据生成任务执行完成,生成日期:{},生成记录数:{}",
|
log.info("客户画像数据生成任务执行完成,生成日期:{},生成记录数:{}",
|
||||||
today.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")), todayCount);
|
today.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")), todayCount);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|||||||
@@ -43,3 +43,4 @@ public interface ICustomerProfileAnalysisService extends IService<CustomerProfil
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -78,3 +78,4 @@ public class CustomerProfileAnalysisServiceImpl extends ServiceImpl<CustomerProf
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -106,36 +106,81 @@ public class CpaBrandScoreStatisticsServiceImpl extends ServiceImpl<CpaBrandScor
|
|||||||
public int generateAndSaveStatistics(String statisticsType, LocalDate startDate, LocalDate endDate, String createdBy) {
|
public int generateAndSaveStatistics(String statisticsType, LocalDate startDate, LocalDate endDate, String createdBy) {
|
||||||
try {
|
try {
|
||||||
log.info("开始生成统计数据,统计类型:{},日期范围:{} - {}", statisticsType, startDate, endDate);
|
log.info("开始生成统计数据,统计类型:{},日期范围:{} - {}", statisticsType, startDate, endDate);
|
||||||
|
|
||||||
// 先删除已存在的统计数据
|
|
||||||
deleteByCondition(null, statisticsType, startDate, endDate);
|
|
||||||
|
|
||||||
List<Map<String, Object>> statisticsResults;
|
List<Map<String, Object>> statisticsResults;
|
||||||
|
|
||||||
// 根据统计类型执行不同的统计SQL
|
// 根据统计类型执行不同的统计SQL
|
||||||
if ("daily".equals(statisticsType)) {
|
if ("daily".equals(statisticsType)) {
|
||||||
// 日统计:按经销商和日期双重分组
|
// 日统计:使用传入的日期,按经销商和日期双重分组
|
||||||
|
if (startDate == null) {
|
||||||
|
throw new IllegalArgumentException("日统计需要提供统计日期");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 先删除已存在的统计数据
|
||||||
|
deleteByCondition(null, statisticsType, startDate, startDate);
|
||||||
|
|
||||||
String startDateTime = startDate.atStartOfDay().format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
String startDateTime = startDate.atStartOfDay().format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
||||||
String endDateTime = startDate.atTime(23, 59, 59).format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
String endDateTime = startDate.atTime(23, 59, 59).format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
||||||
statisticsResults = cpaBrandScoreStatisticsMapper.executeDailyStatistics(startDateTime, endDateTime);
|
statisticsResults = cpaBrandScoreStatisticsMapper.executeDailyStatistics(startDateTime, endDateTime);
|
||||||
} else if ("weekly".equals(statisticsType) || "monthly".equals(statisticsType)) {
|
|
||||||
// 周统计或月统计:按日期范围统计
|
} else if ("weekly".equals(statisticsType)) {
|
||||||
String startDateTime = startDate.atStartOfDay().format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
// 周统计:自动计算上周的开始和结束时间
|
||||||
String endDateTime = endDate.atTime(23, 59, 59).format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
LocalDate lastWeekStart = LocalDate.now().minusWeeks(1).with(java.time.DayOfWeek.MONDAY);
|
||||||
|
LocalDate lastWeekEnd = lastWeekStart.plusDays(6);
|
||||||
|
|
||||||
|
log.info("周统计自动计算时间范围:{} - {}", lastWeekStart, lastWeekEnd);
|
||||||
|
|
||||||
|
// 先删除已存在的统计数据
|
||||||
|
deleteByCondition(null, statisticsType, lastWeekStart, lastWeekEnd);
|
||||||
|
|
||||||
|
String startDateTime = lastWeekStart.atStartOfDay().format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
||||||
|
String endDateTime = lastWeekEnd.atTime(23, 59, 59).format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
||||||
statisticsResults = cpaBrandScoreStatisticsMapper.executeDateRangeStatistics(startDateTime, endDateTime);
|
statisticsResults = cpaBrandScoreStatisticsMapper.executeDateRangeStatistics(startDateTime, endDateTime);
|
||||||
|
|
||||||
|
} else if ("monthly".equals(statisticsType)) {
|
||||||
|
// 月统计:自动计算上个月的开始和结束时间
|
||||||
|
LocalDate lastMonthStart = LocalDate.now().minusMonths(1).withDayOfMonth(1);
|
||||||
|
LocalDate lastMonthEnd = lastMonthStart.withDayOfMonth(lastMonthStart.lengthOfMonth());
|
||||||
|
|
||||||
|
log.info("月统计自动计算时间范围:{} - {}", lastMonthStart, lastMonthEnd);
|
||||||
|
|
||||||
|
// 先删除已存在的统计数据
|
||||||
|
deleteByCondition(null, statisticsType, lastMonthStart, lastMonthEnd);
|
||||||
|
|
||||||
|
String startDateTime = lastMonthStart.atStartOfDay().format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
||||||
|
String endDateTime = lastMonthEnd.atTime(23, 59, 59).format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
||||||
|
statisticsResults = cpaBrandScoreStatisticsMapper.executeDateRangeStatistics(startDateTime, endDateTime);
|
||||||
|
|
||||||
} else if ("total".equals(statisticsType)) {
|
} else if ("total".equals(statisticsType)) {
|
||||||
// 总计统计:统计所有历史数据
|
// 总计统计:统计所有历史数据
|
||||||
|
// 先删除已存在的统计数据
|
||||||
|
deleteByCondition(null, statisticsType, null, null);
|
||||||
|
|
||||||
statisticsResults = cpaBrandScoreStatisticsMapper.executeTotalStatistics();
|
statisticsResults = cpaBrandScoreStatisticsMapper.executeTotalStatistics();
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
throw new IllegalArgumentException("不支持的统计类型:" + statisticsType);
|
throw new IllegalArgumentException("不支持的统计类型:" + statisticsType);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 转换为实体对象并保存
|
// 转换为实体对象并保存
|
||||||
List<CpaBrandScoreStatistics> statisticsList = convertToStatisticsList(statisticsResults, endDate, statisticsType, createdBy);
|
LocalDate statisticsDate;
|
||||||
|
if ("weekly".equals(statisticsType)) {
|
||||||
|
// 周统计使用上周的结束日期作为统计日期
|
||||||
|
statisticsDate = LocalDate.now().minusWeeks(1).with(java.time.DayOfWeek.MONDAY).plusDays(6);
|
||||||
|
} else if ("monthly".equals(statisticsType)) {
|
||||||
|
// 月统计使用上月的最后一天作为统计日期
|
||||||
|
statisticsDate = LocalDate.now().minusMonths(1).withDayOfMonth(1).withDayOfMonth(
|
||||||
|
LocalDate.now().minusMonths(1).withDayOfMonth(1).lengthOfMonth());
|
||||||
|
} else {
|
||||||
|
// 日统计和总计统计使用传入的日期
|
||||||
|
statisticsDate = endDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<CpaBrandScoreStatistics> statisticsList = convertToStatisticsList(statisticsResults, statisticsDate, statisticsType, createdBy);
|
||||||
boolean success = batchSave(statisticsList);
|
boolean success = batchSave(statisticsList);
|
||||||
|
|
||||||
if (success) {
|
if (success) {
|
||||||
log.info("统计数据生成完成,统计类型:{},生成记录数:{}", statisticsType, statisticsList.size());
|
log.info("统计数据生成完成,统计类型:{},统计日期:{},生成记录数:{}", statisticsType, statisticsDate, statisticsList.size());
|
||||||
return statisticsList.size();
|
return statisticsList.size();
|
||||||
} else {
|
} else {
|
||||||
log.error("统计数据保存失败,统计类型:{}", statisticsType);
|
log.error("统计数据保存失败,统计类型:{}", statisticsType);
|
||||||
|
|||||||
@@ -43,5 +43,6 @@ public interface IMenuService extends IService<Menu> {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -43,5 +43,6 @@ public interface IUserRoleService extends IService<UserRole> {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -47,5 +47,6 @@ public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements IM
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -47,5 +47,6 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IR
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -47,5 +47,6 @@ public class UserRoleServiceImpl extends ServiceImpl<UserRoleMapper, UserRole> i
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -57,5 +57,6 @@ spring:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -15,3 +15,4 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -33,5 +33,6 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ class CustomerProfileStatisticSchedulerIntegrationTest {
|
|||||||
@Test
|
@Test
|
||||||
void testRealDatabaseOperation() {
|
void testRealDatabaseOperation() {
|
||||||
// 准备测试数据
|
// 准备测试数据
|
||||||
LocalDateTime testDate = LocalDateTime.of(2025, 9, 9, 10, 0, 0);
|
LocalDateTime testDate = LocalDateTime.of(2025, 7, 8, 10, 0, 0);
|
||||||
|
|
||||||
// 执行数据生成
|
// 执行数据生成
|
||||||
int count = scheduler.generateCustomerProfileDataForDate(testDate);
|
int count = scheduler.generateCustomerProfileDataForDate(testDate);
|
||||||
@@ -59,7 +59,7 @@ class CustomerProfileStatisticSchedulerIntegrationTest {
|
|||||||
assertNotNull(latestRecord.getEntityPrice(), "价格情感不应为空");
|
assertNotNull(latestRecord.getEntityPrice(), "价格情感不应为空");
|
||||||
assertNotNull(latestRecord.getEntityPower(), "动力情感不应为空");
|
assertNotNull(latestRecord.getEntityPower(), "动力情感不应为空");
|
||||||
|
|
||||||
System.out.println("成功生成并保存了 " + count + " 条记录");
|
System.out.println("成功生成并保存了 " + count + " 条记录"+" , 累计总数记录数: "+savedRecords.size());
|
||||||
System.out.println("最新记录详情:");
|
System.out.println("最新记录详情:");
|
||||||
System.out.println("客户姓名: " + latestRecord.getClientName());
|
System.out.println("客户姓名: " + latestRecord.getClientName());
|
||||||
System.out.println("门店: " + latestRecord.getDealerName());
|
System.out.println("门店: " + latestRecord.getDealerName());
|
||||||
|
|||||||
@@ -1,162 +0,0 @@
|
|||||||
package com.rj.scheduler;
|
|
||||||
|
|
||||||
import com.rj.entity.CustomerProfileAnalysis;
|
|
||||||
import com.rj.service.biz.ICustomerProfileAnalysisService;
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
import org.junit.jupiter.api.extension.ExtendWith;
|
|
||||||
import org.mockito.InjectMocks;
|
|
||||||
import org.mockito.Mock;
|
|
||||||
import org.mockito.junit.jupiter.MockitoExtension;
|
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.*;
|
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
|
||||||
import static org.mockito.Mockito.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* CustomerProfileStatisticScheduler 测试类
|
|
||||||
*
|
|
||||||
* @author 李中华
|
|
||||||
* @date 2025/1/3
|
|
||||||
*/
|
|
||||||
@ExtendWith(MockitoExtension.class)
|
|
||||||
class CustomerProfileStatisticSchedulerTest {
|
|
||||||
|
|
||||||
@Mock
|
|
||||||
private ICustomerProfileAnalysisService customerProfileAnalysisService;
|
|
||||||
|
|
||||||
@InjectMocks
|
|
||||||
private CustomerProfileMockInsertDataScheduler scheduler;
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void testGenerateCustomerProfileDataForDate() {
|
|
||||||
// 准备测试数据
|
|
||||||
LocalDateTime testDate = LocalDateTime.of(2025, 8, 3, 10, 0, 0);
|
|
||||||
|
|
||||||
// 模拟Service返回成功
|
|
||||||
when(customerProfileAnalysisService.saveCustomerProfileAnalysis(any(CustomerProfileAnalysis.class)))
|
|
||||||
.thenReturn(true);
|
|
||||||
|
|
||||||
// 执行测试
|
|
||||||
int result = scheduler.generateCustomerProfileDataForDate(testDate);
|
|
||||||
|
|
||||||
// 验证结果
|
|
||||||
assertTrue(result > 0, "应该生成至少一条记录");
|
|
||||||
assertTrue(result <= 50, "生成记录数不应超过50条");
|
|
||||||
|
|
||||||
// 验证Service被调用
|
|
||||||
verify(customerProfileAnalysisService, atLeastOnce())
|
|
||||||
.saveCustomerProfileAnalysis(any(CustomerProfileAnalysis.class));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void testCustomerProfileAnalysisDataIntegrity() {
|
|
||||||
// 准备测试数据
|
|
||||||
LocalDateTime testDate = LocalDateTime.of(2025, 1, 3, 10, 0, 0);
|
|
||||||
|
|
||||||
// 模拟Service返回成功
|
|
||||||
when(customerProfileAnalysisService.saveCustomerProfileAnalysis(any(CustomerProfileAnalysis.class)))
|
|
||||||
.thenAnswer(invocation -> {
|
|
||||||
CustomerProfileAnalysis analysis = invocation.getArgument(0);
|
|
||||||
|
|
||||||
// 验证新字段不为空
|
|
||||||
assertNotNull(analysis.getDealerName(), "经销商门店名称不应为空");
|
|
||||||
assertNotNull(analysis.getProjectId(), "项目ID不应为空");
|
|
||||||
assertNotNull(analysis.getProjectName(), "项目名称不应为空");
|
|
||||||
assertNotNull(analysis.getSalesPersonId(), "销售顾问ID不应为空");
|
|
||||||
assertNotNull(analysis.getSalesPersonName(), "销售顾问姓名不应为空");
|
|
||||||
|
|
||||||
// 验证字段格式
|
|
||||||
assertTrue(analysis.getDealerName().length() > 0, "经销商门店名称长度应大于0");
|
|
||||||
assertTrue(analysis.getProjectName().length() > 0, "项目名称长度应大于0");
|
|
||||||
assertTrue(analysis.getSalesPersonName().length() > 0, "销售顾问姓名长度应大于0");
|
|
||||||
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
|
|
||||||
// 执行测试
|
|
||||||
int result = scheduler.generateCustomerProfileDataForDate(testDate);
|
|
||||||
|
|
||||||
// 验证结果
|
|
||||||
assertTrue(result > 0, "应该生成至少一条记录");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void testManualGenerateData() {
|
|
||||||
// 准备测试数据
|
|
||||||
LocalDateTime testDate = LocalDateTime.of(2025, 1, 3, 10, 0, 0);
|
|
||||||
|
|
||||||
// 模拟Service返回成功
|
|
||||||
when(customerProfileAnalysisService.saveCustomerProfileAnalysis(any(CustomerProfileAnalysis.class)))
|
|
||||||
.thenReturn(true);
|
|
||||||
|
|
||||||
// 执行测试
|
|
||||||
int result = scheduler.manualGenerateData(testDate);
|
|
||||||
|
|
||||||
// 验证结果
|
|
||||||
assertTrue(result > 0, "手动生成应该返回成功记录数");
|
|
||||||
|
|
||||||
// 验证Service被调用
|
|
||||||
verify(customerProfileAnalysisService, atLeastOnce())
|
|
||||||
.saveCustomerProfileAnalysis(any(CustomerProfileAnalysis.class));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void testGenerateCustomerProfileDataForDateWithException() {
|
|
||||||
// 准备测试数据
|
|
||||||
LocalDateTime testDate = LocalDateTime.of(2025, 1, 3, 10, 0, 0);
|
|
||||||
|
|
||||||
// 模拟Service抛出异常
|
|
||||||
when(customerProfileAnalysisService.saveCustomerProfileAnalysis(any(CustomerProfileAnalysis.class)))
|
|
||||||
.thenThrow(new RuntimeException("数据库连接失败"));
|
|
||||||
|
|
||||||
// 执行测试并验证异常
|
|
||||||
assertThrows(RuntimeException.class, () -> {
|
|
||||||
scheduler.generateCustomerProfileDataForDate(testDate);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void testDataGenerationWithMockService() {
|
|
||||||
// 准备测试数据
|
|
||||||
LocalDateTime testDate = LocalDateTime.of(2025, 1, 3, 10, 0, 0);
|
|
||||||
|
|
||||||
// 模拟Service返回成功,并验证数据内容
|
|
||||||
when(customerProfileAnalysisService.saveCustomerProfileAnalysis(any(CustomerProfileAnalysis.class)))
|
|
||||||
.thenAnswer(invocation -> {
|
|
||||||
CustomerProfileAnalysis analysis = invocation.getArgument(0);
|
|
||||||
|
|
||||||
// 验证所有新字段都有值
|
|
||||||
assertNotNull(analysis.getDealerName(), "经销商门店名称不应为空");
|
|
||||||
assertNotNull(analysis.getProjectId(), "项目ID不应为空");
|
|
||||||
assertNotNull(analysis.getProjectName(), "项目名称不应为空");
|
|
||||||
assertNotNull(analysis.getSalesPersonId(), "销售顾问ID不应为空");
|
|
||||||
assertNotNull(analysis.getSalesPersonName(), "销售顾问姓名不应为空");
|
|
||||||
|
|
||||||
// 验证情感分析字段
|
|
||||||
assertNotNull(analysis.getEntityBrand(), "品牌情感不应为空");
|
|
||||||
assertNotNull(analysis.getEntityPrice(), "价格情感不应为空");
|
|
||||||
assertNotNull(analysis.getEntityPower(), "动力情感不应为空");
|
|
||||||
assertNotNull(analysis.getEntitySafety(), "安全情感不应为空");
|
|
||||||
|
|
||||||
// 验证备注字段包含新信息
|
|
||||||
assertNotNull(analysis.getNotes(), "备注不应为空");
|
|
||||||
assertTrue(analysis.getNotes().contains(analysis.getDealerName()), "备注应包含门店名称");
|
|
||||||
assertTrue(analysis.getNotes().contains(analysis.getProjectName()), "备注应包含项目名称");
|
|
||||||
assertTrue(analysis.getNotes().contains(analysis.getSalesPersonName()), "备注应包含销售顾问姓名");
|
|
||||||
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
|
|
||||||
// 执行测试
|
|
||||||
int result = scheduler.generateCustomerProfileDataForDate(testDate);
|
|
||||||
|
|
||||||
// 验证结果
|
|
||||||
assertTrue(result > 0, "应该生成至少一条记录");
|
|
||||||
|
|
||||||
// 验证Service被调用
|
|
||||||
verify(customerProfileAnalysisService, atLeastOnce())
|
|
||||||
.saveCustomerProfileAnalysis(any(CustomerProfileAnalysis.class));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user