refactor(oa): 优化日趋势数据处理

- 增加空数据处理:当源数据为空或无记录时,自动生成近7天的默认数据
- 完善数据转换:对value值进行空值处理,若无值则默认为0
This commit is contained in:
2025-09-17 16:59:40 +08:00
parent 73b8652251
commit 0fe77fa3c5

View File

@@ -23,90 +23,90 @@ import java.util.Map;
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
public class GearDashboardServiceImpl implements IGearDashboardService { public class GearDashboardServiceImpl implements IGearDashboardService {
private final GearDashboardMapper dashboardMapper; private final GearDashboardMapper dashboardMapper;
@Override @Override
public DashboardOverviewVO getDashboardOverview() { public DashboardOverviewVO getDashboardOverview() {
DashboardOverviewVO overview = new DashboardOverviewVO(); DashboardOverviewVO overview = new DashboardOverviewVO();
// 获取订单统计数据 // 获取订单统计数据
overview.setOrderStatistics(getOrderStatistics()); overview.setOrderStatistics(getOrderStatistics());
// 获取薪资统计数据 // 获取薪资统计数据
overview.setSalaryStatistics(getSalaryStatistics()); overview.setSalaryStatistics(getSalaryStatistics());
// 获取库存排行数据 // 获取库存排行数据
overview.setStockRanking(getStockRanking()); overview.setStockRanking(getStockRanking());
// 获取其他统计数据 // 获取其他统计数据
overview.setOtherStatistics(getOtherStatistics()); overview.setOtherStatistics(getOtherStatistics());
return overview; return overview;
} }
/** /**
* 获取订单统计数据 * 获取订单统计数据
*/ */
private OrderStatisticsVO getOrderStatistics() { private OrderStatisticsVO getOrderStatistics() {
OrderStatisticsVO statistics = new OrderStatisticsVO(); OrderStatisticsVO statistics = new OrderStatisticsVO();
// 获取今日、本周、本月订单数 // 获取今日、本周、本月订单数
statistics.setTodayOrderCount(dashboardMapper.getTodayOrderCount()); statistics.setTodayOrderCount(dashboardMapper.getTodayOrderCount());
statistics.setWeekOrderCount(dashboardMapper.getWeekOrderCount()); statistics.setWeekOrderCount(dashboardMapper.getWeekOrderCount());
statistics.setMonthOrderCount(dashboardMapper.getMonthOrderCount()); statistics.setMonthOrderCount(dashboardMapper.getMonthOrderCount());
// 获取本周订单总金额 // 获取本周订单总金额
statistics.setWeekTotalAmount(dashboardMapper.getWeekOrderAmount()); statistics.setWeekTotalAmount(dashboardMapper.getWeekOrderAmount());
// 获取近一周订单趋势 // 获取近一周订单趋势
List<Map<String, Object>> weeklyData = dashboardMapper.getWeeklyOrderTrend(); List<Map<String, Object>> weeklyData = dashboardMapper.getWeeklyOrderTrend();
statistics.setWeeklyTrend(convertToTrendList(weeklyData)); statistics.setWeeklyTrend(convertToTrendList(weeklyData));
// 计算增长率 // 计算增长率
Integer lastWeekCount = dashboardMapper.getLastWeekOrderCount(); Integer lastWeekCount = dashboardMapper.getLastWeekOrderCount();
statistics.setGrowthRate(calculateGrowthRate(statistics.getWeekOrderCount(), lastWeekCount)); statistics.setGrowthRate(calculateGrowthRate(statistics.getWeekOrderCount(), lastWeekCount));
return statistics; return statistics;
} }
/** /**
* 获取薪资统计数据 * 获取薪资统计数据
*/ */
private SalaryStatisticsVO getSalaryStatistics() { private SalaryStatisticsVO getSalaryStatistics() {
SalaryStatisticsVO statistics = new SalaryStatisticsVO(); SalaryStatisticsVO statistics = new SalaryStatisticsVO();
// 获取今日、本周、本月薪资支出 // 获取今日、本周、本月薪资支出
statistics.setTodaySalary(dashboardMapper.getTodaySalary()); statistics.setTodaySalary(dashboardMapper.getTodaySalary());
statistics.setWeekSalary(dashboardMapper.getWeekSalary()); statistics.setWeekSalary(dashboardMapper.getWeekSalary());
statistics.setMonthSalary(dashboardMapper.getMonthSalary()); statistics.setMonthSalary(dashboardMapper.getMonthSalary());
// 获取近一周薪资趋势 // 获取近一周薪资趋势
List<Map<String, Object>> weeklyData = dashboardMapper.getWeeklySalaryTrend(); List<Map<String, Object>> weeklyData = dashboardMapper.getWeeklySalaryTrend();
statistics.setWeeklyTrend(convertToTrendList(weeklyData)); statistics.setWeeklyTrend(convertToTrendList(weeklyData));
// 计算增长率 // 计算增长率
BigDecimal lastWeekSalary = dashboardMapper.getLastWeekSalary(); BigDecimal lastWeekSalary = dashboardMapper.getLastWeekSalary();
statistics.setGrowthRate(calculateGrowthRate(statistics.getWeekSalary(), lastWeekSalary)); statistics.setGrowthRate(calculateGrowthRate(statistics.getWeekSalary(), lastWeekSalary));
// 计算平均日薪资 // 计算平均日薪资
if (statistics.getWeekSalary() != null) { if (statistics.getWeekSalary() != null) {
statistics.setAvgDailySalary(statistics.getWeekSalary().divide(new BigDecimal(7), 2, RoundingMode.HALF_UP)); statistics.setAvgDailySalary(statistics.getWeekSalary().divide(new BigDecimal(7), 2, RoundingMode.HALF_UP));
} }
return statistics; return statistics;
} }
/** /**
* 获取库存排行数据 * 获取库存排行数据
*/ */
private List<StockRankingVO> getStockRanking() { private List<StockRankingVO> getStockRanking() {
List<StockRankingVO> rankings = dashboardMapper.getStockRanking(); List<StockRankingVO> rankings = dashboardMapper.getStockRanking();
// 设置排名 // 设置排名
for (int i = 0; i < rankings.size(); i++) { for (int i = 0; i < rankings.size(); i++) {
rankings.get(i).setRank(i + 1); rankings.get(i).setRank(i + 1);
// 设置物品类型名称 // 设置物品类型名称
String itemType = rankings.get(i).getItemType(); String itemType = rankings.get(i).getItemType();
if ("product".equals(itemType)) { if ("product".equals(itemType)) {
@@ -115,16 +115,16 @@ public class GearDashboardServiceImpl implements IGearDashboardService {
rankings.get(i).setItemTypeName("原材料"); rankings.get(i).setItemTypeName("原材料");
} }
} }
return rankings; return rankings;
} }
/** /**
* 获取其他统计数据 * 获取其他统计数据
*/ */
private OtherStatisticsVO getOtherStatistics() { private OtherStatisticsVO getOtherStatistics() {
OtherStatisticsVO statistics = new OtherStatisticsVO(); OtherStatisticsVO statistics = new OtherStatisticsVO();
statistics.setActiveCustomerCount(dashboardMapper.getActiveCustomerCount()); statistics.setActiveCustomerCount(dashboardMapper.getActiveCustomerCount());
statistics.setPendingOrderCount(dashboardMapper.getPendingOrderCount()); statistics.setPendingOrderCount(dashboardMapper.getPendingOrderCount());
statistics.setLowStockCount(dashboardMapper.getLowStockCount()); statistics.setLowStockCount(dashboardMapper.getLowStockCount());
@@ -133,20 +133,34 @@ public class GearDashboardServiceImpl implements IGearDashboardService {
statistics.setTodayAttendanceRate(dashboardMapper.getTodayAttendanceRate()); statistics.setTodayAttendanceRate(dashboardMapper.getTodayAttendanceRate());
statistics.setTotalProductCount(dashboardMapper.getTotalProductCount()); statistics.setTotalProductCount(dashboardMapper.getTotalProductCount());
statistics.setTotalSupplierCount(dashboardMapper.getTotalSupplierCount()); statistics.setTotalSupplierCount(dashboardMapper.getTotalSupplierCount());
return statistics; return statistics;
} }
/** /**
* 转换趋势数据 * 转换趋势数据
*/ */
private List<DailyTrendVO> convertToTrendList(List<Map<String, Object>> data) { private List<DailyTrendVO> convertToTrendList(List<Map<String, Object>> data) {
List<DailyTrendVO> trends = new ArrayList<>(); List<DailyTrendVO> trends = new ArrayList<>();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd"); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd");
// 如果数据为空或没有元素则返回包含7天默认数据的列表
if (data == null || data.isEmpty()) {
// 创建近7天的默认数据
for (int i = 6; i >= 0; i--) {
DailyTrendVO trend = new DailyTrendVO();
LocalDate date = LocalDate.now().minusDays(i);
trend.setDate(date.format(formatter));
trend.setLabel(trend.getDate());
trend.setValue(BigDecimal.ZERO);
trends.add(trend);
}
return trends;
}
for (Map<String, Object> item : data) { for (Map<String, Object> item : data) {
DailyTrendVO trend = new DailyTrendVO(); DailyTrendVO trend = new DailyTrendVO();
// 处理日期 // 处理日期
Object dateObj = item.get("date"); Object dateObj = item.get("date");
if (dateObj instanceof LocalDate) { if (dateObj instanceof LocalDate) {
@@ -154,7 +168,7 @@ public class GearDashboardServiceImpl implements IGearDashboardService {
} else if (dateObj instanceof String) { } else if (dateObj instanceof String) {
trend.setDate((String) dateObj); trend.setDate((String) dateObj);
} }
// 处理数值 // 处理数值
Object valueObj = item.get("value"); Object valueObj = item.get("value");
if (valueObj instanceof BigDecimal) { if (valueObj instanceof BigDecimal) {
@@ -163,15 +177,19 @@ public class GearDashboardServiceImpl implements IGearDashboardService {
trend.setValue(new BigDecimal((Integer) valueObj)); trend.setValue(new BigDecimal((Integer) valueObj));
} else if (valueObj instanceof Long) { } else if (valueObj instanceof Long) {
trend.setValue(new BigDecimal((Long) valueObj)); trend.setValue(new BigDecimal((Long) valueObj));
} else {
// 如果没有值则设置为0
trend.setValue(BigDecimal.ZERO);
} }
trend.setLabel(trend.getDate()); trend.setLabel(trend.getDate());
trends.add(trend); trends.add(trend);
} }
return trends; return trends;
} }
/** /**
* 计算增长率 * 计算增长率
*/ */
@@ -179,20 +197,20 @@ public class GearDashboardServiceImpl implements IGearDashboardService {
if (current == null || previous == null) { if (current == null || previous == null) {
return BigDecimal.ZERO; return BigDecimal.ZERO;
} }
BigDecimal currentValue = convertToBigDecimal(current); BigDecimal currentValue = convertToBigDecimal(current);
BigDecimal previousValue = convertToBigDecimal(previous); BigDecimal previousValue = convertToBigDecimal(previous);
if (previousValue.compareTo(BigDecimal.ZERO) == 0) { if (previousValue.compareTo(BigDecimal.ZERO) == 0) {
return currentValue.compareTo(BigDecimal.ZERO) > 0 ? new BigDecimal(100) : BigDecimal.ZERO; return currentValue.compareTo(BigDecimal.ZERO) > 0 ? new BigDecimal(100) : BigDecimal.ZERO;
} }
return currentValue.subtract(previousValue) return currentValue.subtract(previousValue)
.divide(previousValue, 4, RoundingMode.HALF_UP) .divide(previousValue, 4, RoundingMode.HALF_UP)
.multiply(new BigDecimal(100)) .multiply(new BigDecimal(100))
.setScale(2, RoundingMode.HALF_UP); .setScale(2, RoundingMode.HALF_UP);
} }
/** /**
* 转换为BigDecimal * 转换为BigDecimal
*/ */
@@ -208,4 +226,4 @@ public class GearDashboardServiceImpl implements IGearDashboardService {
} }
return BigDecimal.ZERO; return BigDecimal.ZERO;
} }
} }