薪资分析

This commit is contained in:
2025-06-24 17:26:18 +08:00
parent 3ed61a8a00
commit 6d3aa7fe06

View File

@@ -9,6 +9,7 @@ import org.springframework.stereotype.Service;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List; import java.util.List;
@Service @Service
@@ -27,8 +28,7 @@ public class SalaryDashboardServiceImpl implements ISalaryDashboardService {
// 2. 获取图表数据 // 2. 获取图表数据
dashboardVo.setChartData(getChartData(payYear, payMonth)); dashboardVo.setChartData(getChartData(payYear, payMonth));
// 3. 获取部门统计表格数据 (带分页) // 3. 获取部门统计表格数据
// PageHelper.startPage(pageNum, pageSize);
List<DepartmentStatVo> deptStats = dashboardMapper.queryDepartmentStats(payYear, payMonth); List<DepartmentStatVo> deptStats = dashboardMapper.queryDepartmentStats(payYear, payMonth);
TableDataInfo<DepartmentStatVo> tableData = new TableDataInfo<>(deptStats, deptStats.size()); TableDataInfo<DepartmentStatVo> tableData = new TableDataInfo<>(deptStats, deptStats.size());
dashboardVo.setDepartmentStats(tableData); dashboardVo.setDepartmentStats(tableData);
@@ -38,56 +38,93 @@ public class SalaryDashboardServiceImpl implements ISalaryDashboardService {
private CardDataVo getCardData(Long payYear, Long payMonth) { private CardDataVo getCardData(Long payYear, Long payMonth) {
CardDataVo cardData = new CardDataVo(); CardDataVo cardData = new CardDataVo();
// 初始化所有数值为0避免NPE
cardData.setTotalSalaryExpenditure(BigDecimal.ZERO);
cardData.setLastMonthTotalSalaryExpenditureRate(BigDecimal.ZERO);
cardData.setAvgDepartmentExpenditure(BigDecimal.ZERO);
cardData.setLastMonthAvgDepartmentExpenditureRate(BigDecimal.ZERO);
cardData.setAvgPersonSalary(BigDecimal.ZERO);
cardData.setLastMonthAvgPersonSalaryRate(BigDecimal.ZERO);
cardData.setYearOnYearGrowthRate(BigDecimal.ZERO);
// 获取当月数据 // 获取当月数据
CardMetricsVo currentMonthMetrics = dashboardMapper.queryCardMetrics(payYear, payMonth); CardMetricsVo currentMonthMetrics = dashboardMapper.queryCardMetrics(payYear, payMonth);
if (currentMonthMetrics == null) {
return cardData; // 如果当月没有数据,直接返回零值
}
// 设置当月总支出
cardData.setTotalSalaryExpenditure(
currentMonthMetrics.getTotalSalaryExpenditure() != null ?
currentMonthMetrics.getTotalSalaryExpenditure() : BigDecimal.ZERO
);
// 获取上月数据 (处理1月的情况) // 获取上月数据 (处理1月的情况)
Long lastMonth = payMonth == 1 ? 12 : payMonth - 1; Long lastMonth = payMonth == 1 ? 12 : payMonth - 1;
Long lastYear = payMonth == 1 ? payYear - 1 : payYear; Long lastYear = payMonth == 1 ? payYear - 1 : payYear;
CardMetricsVo lastMonthMetrics = dashboardMapper.queryCardMetrics(lastYear, lastMonth); CardMetricsVo lastMonthMetrics = dashboardMapper.queryCardMetrics(lastYear, lastMonth);
// 获取去年同期数据
CardMetricsVo lastYearMetrics = dashboardMapper.queryCardMetrics(payYear - 1, payMonth);
// 计算各项指标
cardData.setTotalSalaryExpenditure(currentMonthMetrics.getTotalSalaryExpenditure());
// 计算较上月增长率 // 计算较上月增长率
if (lastMonthMetrics.getTotalSalaryExpenditure().compareTo(BigDecimal.ZERO) != 0) { if (lastMonthMetrics != null &&
lastMonthMetrics.getTotalSalaryExpenditure() != null &&
lastMonthMetrics.getTotalSalaryExpenditure().compareTo(BigDecimal.ZERO) != 0) {
try {
BigDecimal monthGrowth = currentMonthMetrics.getTotalSalaryExpenditure() BigDecimal monthGrowth = currentMonthMetrics.getTotalSalaryExpenditure()
.subtract(lastMonthMetrics.getTotalSalaryExpenditure()) .subtract(lastMonthMetrics.getTotalSalaryExpenditure())
.divide(lastMonthMetrics.getTotalSalaryExpenditure(), 4, RoundingMode.HALF_UP) .divide(lastMonthMetrics.getTotalSalaryExpenditure(), 4, RoundingMode.HALF_UP)
.multiply(new BigDecimal("100")); .multiply(new BigDecimal("100"));
cardData.setLastMonthTotalSalaryExpenditureRate(monthGrowth); cardData.setLastMonthTotalSalaryExpenditureRate(monthGrowth);
} catch (Exception e) {
cardData.setLastMonthTotalSalaryExpenditureRate(BigDecimal.ZERO);
}
} }
// 计算部门平均支出 // 计算部门平均支出
if (currentMonthMetrics.getDepartmentCount() > 0) { if (currentMonthMetrics.getDepartmentCount() != null &&
cardData.setAvgDepartmentExpenditure( currentMonthMetrics.getDepartmentCount() > 0 &&
currentMonthMetrics.getTotalCompanyExpenditure() currentMonthMetrics.getTotalCompanyExpenditure() != null) {
.divide(new BigDecimal(currentMonthMetrics.getDepartmentCount()), 2, RoundingMode.HALF_UP) try {
); BigDecimal avgDeptExpenditure = currentMonthMetrics.getTotalCompanyExpenditure()
.divide(new BigDecimal(currentMonthMetrics.getDepartmentCount()), 2, RoundingMode.HALF_UP);
cardData.setAvgDepartmentExpenditure(avgDeptExpenditure);
} catch (Exception e) {
cardData.setAvgDepartmentExpenditure(BigDecimal.ZERO);
}
} }
// 计算人均实发工资 // 计算人均实发工资
if (currentMonthMetrics.getEmployeeCount() > 0) { if (currentMonthMetrics.getEmployeeCount() != null &&
cardData.setAvgPersonSalary( currentMonthMetrics.getEmployeeCount() > 0 &&
currentMonthMetrics.getTotalSalaryExpenditure() currentMonthMetrics.getTotalSalaryExpenditure() != null) {
.divide(new BigDecimal(currentMonthMetrics.getEmployeeCount()), 2, RoundingMode.HALF_UP) try {
); BigDecimal avgPersonSalary = currentMonthMetrics.getTotalSalaryExpenditure()
.divide(new BigDecimal(currentMonthMetrics.getEmployeeCount()), 2, RoundingMode.HALF_UP);
cardData.setAvgPersonSalary(avgPersonSalary);
} catch (Exception e) {
cardData.setAvgPersonSalary(BigDecimal.ZERO);
}
} }
// 计算同比增长率 // 获取去年同期数据并计算同比增长率
if (lastYearMetrics.getEmployeeCount() > 0) { CardMetricsVo lastYearMetrics = dashboardMapper.queryCardMetrics(payYear - 1, payMonth);
if (lastYearMetrics != null &&
lastYearMetrics.getEmployeeCount() != null &&
lastYearMetrics.getEmployeeCount() > 0 &&
lastYearMetrics.getTotalSalaryExpenditure() != null) {
try {
BigDecimal lastYearAvgSalary = lastYearMetrics.getTotalSalaryExpenditure() BigDecimal lastYearAvgSalary = lastYearMetrics.getTotalSalaryExpenditure()
.divide(new BigDecimal(lastYearMetrics.getEmployeeCount()), 2, RoundingMode.HALF_UP); .divide(new BigDecimal(lastYearMetrics.getEmployeeCount()), 2, RoundingMode.HALF_UP);
if (lastYearAvgSalary.compareTo(BigDecimal.ZERO) != 0) { if (lastYearAvgSalary.compareTo(BigDecimal.ZERO) != 0 &&
cardData.getAvgPersonSalary() != null) {
BigDecimal yearGrowth = cardData.getAvgPersonSalary() BigDecimal yearGrowth = cardData.getAvgPersonSalary()
.subtract(lastYearAvgSalary) .subtract(lastYearAvgSalary)
.divide(lastYearAvgSalary, 4, RoundingMode.HALF_UP) .divide(lastYearAvgSalary, 4, RoundingMode.HALF_UP)
.multiply(new BigDecimal("100")); .multiply(new BigDecimal("100"));
cardData.setYearOnYearGrowthRate(yearGrowth); cardData.setYearOnYearGrowthRate(yearGrowth);
} }
} catch (Exception e) {
cardData.setYearOnYearGrowthRate(BigDecimal.ZERO);
}
} }
return cardData; return cardData;
@@ -99,17 +136,21 @@ public class SalaryDashboardServiceImpl implements ISalaryDashboardService {
// 1. 获取柱状图数据 (年度每月总支出) // 1. 获取柱状图数据 (年度每月总支出)
List<MonthlyExpenditureVo> monthlyExpenditures = List<MonthlyExpenditureVo> monthlyExpenditures =
dashboardMapper.queryMonthlyExpenditures(payYear); dashboardMapper.queryMonthlyExpenditures(payYear);
chartData.setMonthlyExpenditures(monthlyExpenditures); chartData.setMonthlyExpenditures(monthlyExpenditures != null ?
monthlyExpenditures : new ArrayList<>());
// 2. 获取饼图数据 (薪资构成) // 2. 获取饼图数据 (薪资构成)
List<SalaryComponentVo> salaryComponents = List<SalaryComponentVo> salaryComponents =
dashboardMapper.querySalaryComponents(payYear, payMonth); dashboardMapper.querySalaryComponents(payYear, payMonth);
chartData.setSalaryComponents(salaryComponents); chartData.setSalaryComponents(salaryComponents != null ?
salaryComponents : new ArrayList<>());
// 3. 获取折线图数据 (总支出 vs 平均工资) // 3. 获取折线图数据 (总支出 vs 平均工资)
List<LineChartPointVo> lineChartData = List<LineChartPointVo> lineChartData =
dashboardMapper.queryLineChartData(payYear); dashboardMapper.queryLineChartData(payYear);
chartData.setLineChartData(new LineChartVo(lineChartData)); chartData.setLineChartData(new LineChartVo(
lineChartData != null ? lineChartData : new ArrayList<>()
));
return chartData; return chartData;
} }