feat(oa): 新增工资数据看板功能

- 添加新工资看板相关的 VO 类
- 实现新工资看板的数据获取接口和业务逻辑
- 优化原有工资看板的代码结构
- 新增月度支出、工资构成、趋势分析等图表数据查询- 增加社保公积金统计和单位、部门统计功能
This commit is contained in:
2025-09-08 15:33:33 +08:00
parent fdd7489102
commit 655540c20b
16 changed files with 993 additions and 3 deletions

View File

@@ -140,4 +140,277 @@
ORDER BY
totalExpenditure DESC
</select>
<!-- 查询卡片指标数据 -->
<select id="queryNewCardMetrics" resultType="com.ruoyi.oa.domain.vo.dashboard.NewCardMetricsVo">
SELECT
COALESCE(SUM(d.net_salary), 0) as totalNetSalary,
COALESCE(SUM(d.gross_salary), 0) as totalGrossSalary,
COALESCE(SUM(d.unit_total_expense), 0) as totalUnitExpense,
COUNT(DISTINCT d.detail_id) as employeeCount,
COUNT(DISTINCT m.unit_name) as unitCount
FROM oa_salary_master m
LEFT JOIN oa_salary_detail d ON m.master_id = d.main_id
WHERE m.salary_period = #{salaryPeriod}
AND m.del_flag = 0
AND d.del_flag = 0
</select>
<!-- 查询月度支出数据 -->
<select id="queryMonthlyExpenses" resultType="com.ruoyi.oa.domain.vo.dashboard.MonthlyExpenseVo">
SELECT
CAST(SUBSTRING(m.salary_period, 6, 2) AS UNSIGNED) as month,
COALESCE(SUM(d.net_salary), 0) as totalNetSalary,
COALESCE(SUM(d.gross_salary), 0) as totalGrossSalary,
COALESCE(SUM(d.unit_total_expense), 0) as totalUnitExpense
FROM oa_salary_master m
LEFT JOIN oa_salary_detail d ON m.master_id = d.main_id
WHERE SUBSTRING(m.salary_period, 1, 4) = #{year}
AND m.del_flag = 0
AND d.del_flag = 0
GROUP BY CAST(SUBSTRING(m.salary_period, 6, 2) AS UNSIGNED)
ORDER BY month
</select>
<!-- 查询工资构成数据 -->
<select id="querySalaryStructures" resultType="com.ruoyi.oa.domain.vo.dashboard.SalaryStructureVo">
SELECT
'基本工资' as itemName,
COALESCE(SUM(d.basic_salary), 0) as totalAmount,
CASE
WHEN SUM(d.gross_salary) > 0 THEN ROUND((SUM(d.basic_salary) / SUM(d.gross_salary)) * 100, 2)
ELSE 0
END as percentage
FROM oa_salary_master m
LEFT JOIN oa_salary_detail d ON m.master_id = d.main_id
WHERE m.salary_period = #{salaryPeriod}
AND m.del_flag = 0 AND d.del_flag = 0
UNION ALL
SELECT
'岗位工资' as itemName,
COALESCE(SUM(d.post_salary), 0) as totalAmount,
CASE
WHEN SUM(d.gross_salary) > 0 THEN ROUND((SUM(d.post_salary) / SUM(d.gross_salary)) * 100, 2)
ELSE 0
END as percentage
FROM oa_salary_master m
LEFT JOIN oa_salary_detail d ON m.master_id = d.main_id
WHERE m.salary_period = #{salaryPeriod}
AND m.del_flag = 0 AND d.del_flag = 0
UNION ALL
SELECT
'餐补' as itemName,
COALESCE(SUM(d.meal_allowance), 0) as totalAmount,
CASE
WHEN SUM(d.gross_salary) > 0 THEN ROUND((SUM(d.meal_allowance) / SUM(d.gross_salary)) * 100, 2)
ELSE 0
END as percentage
FROM oa_salary_master m
LEFT JOIN oa_salary_detail d ON m.master_id = d.main_id
WHERE m.salary_period = #{salaryPeriod}
AND m.del_flag = 0 AND d.del_flag = 0
UNION ALL
SELECT
'住房补贴' as itemName,
COALESCE(SUM(d.housing_allowance), 0) as totalAmount,
CASE
WHEN SUM(d.gross_salary) > 0 THEN ROUND((SUM(d.housing_allowance) / SUM(d.gross_salary)) * 100, 2)
ELSE 0
END as percentage
FROM oa_salary_master m
LEFT JOIN oa_salary_detail d ON m.master_id = d.main_id
WHERE m.salary_period = #{salaryPeriod}
AND m.del_flag = 0 AND d.del_flag = 0
UNION ALL
SELECT
'公交补贴' as itemName,
COALESCE(SUM(d.bus_allowance), 0) as totalAmount,
CASE
WHEN SUM(d.gross_salary) > 0 THEN ROUND((SUM(d.bus_allowance) / SUM(d.gross_salary)) * 100, 2)
ELSE 0
END as percentage
FROM oa_salary_master m
LEFT JOIN oa_salary_detail d ON m.master_id = d.main_id
WHERE m.salary_period = #{salaryPeriod}
AND m.del_flag = 0 AND d.del_flag = 0
UNION ALL
SELECT
'出差补助' as itemName,
COALESCE(SUM(d.business_allowance), 0) as totalAmount,
CASE
WHEN SUM(d.gross_salary) > 0 THEN ROUND((SUM(d.business_allowance) / SUM(d.gross_salary)) * 100, 2)
ELSE 0
END as percentage
FROM oa_salary_master m
LEFT JOIN oa_salary_detail d ON m.master_id = d.main_id
WHERE m.salary_period = #{salaryPeriod}
AND m.del_flag = 0 AND d.del_flag = 0
UNION ALL
SELECT
'加班工资' as itemName,
COALESCE(SUM(d.overtime_total), 0) as totalAmount,
CASE
WHEN SUM(d.gross_salary) > 0 THEN ROUND((SUM(d.overtime_total) / SUM(d.gross_salary)) * 100, 2)
ELSE 0
END as percentage
FROM oa_salary_master m
LEFT JOIN oa_salary_detail d ON m.master_id = d.main_id
WHERE m.salary_period = #{salaryPeriod}
AND m.del_flag = 0 AND d.del_flag = 0
ORDER BY totalAmount DESC
</select>
<!-- 查询工资趋势数据 -->
<select id="querySalaryTrendData" resultType="com.ruoyi.oa.domain.vo.dashboard.SalaryTrendPointVo">
SELECT
CAST(SUBSTRING(m.salary_period, 6, 2) AS UNSIGNED) as month,
COALESCE(SUM(d.net_salary), 0) as totalNetSalary,
COALESCE(SUM(d.gross_salary), 0) as totalGrossSalary,
CASE
WHEN COUNT(DISTINCT d.detail_id) > 0 THEN ROUND(SUM(d.net_salary) / COUNT(DISTINCT d.detail_id), 2)
ELSE 0
END as avgNetSalary
FROM oa_salary_master m
LEFT JOIN oa_salary_detail d ON m.master_id = d.main_id
WHERE SUBSTRING(m.salary_period, 1, 4) = #{year}
AND m.del_flag = 0
AND d.del_flag = 0
GROUP BY CAST(SUBSTRING(m.salary_period, 6, 2) AS UNSIGNED)
ORDER BY month
</select>
<!-- 查询社保公积金统计数据 -->
<select id="queryInsuranceStats" resultType="com.ruoyi.oa.domain.vo.dashboard.InsuranceStatVo">
SELECT
'养老保险' as itemName,
COALESCE(SUM(d.personal_pension), 0) as personalTotal,
COALESCE(SUM(d.enterprise_pension), 0) as enterpriseTotal,
COALESCE(SUM(d.personal_pension) + SUM(d.enterprise_pension), 0) as total
FROM oa_salary_master m
LEFT JOIN oa_salary_detail d ON m.master_id = d.main_id
WHERE m.salary_period = #{salaryPeriod}
AND m.del_flag = 0 AND d.del_flag = 0
UNION ALL
SELECT
'医疗保险' as itemName,
COALESCE(SUM(d.personal_medical), 0) as personalTotal,
COALESCE(SUM(d.enterprise_medical), 0) as enterpriseTotal,
COALESCE(SUM(d.personal_medical) + SUM(d.enterprise_medical), 0) as total
FROM oa_salary_master m
LEFT JOIN oa_salary_detail d ON m.master_id = d.main_id
WHERE m.salary_period = #{salaryPeriod}
AND m.del_flag = 0 AND d.del_flag = 0
UNION ALL
SELECT
'失业保险' as itemName,
COALESCE(SUM(d.personal_unemployment), 0) as personalTotal,
COALESCE(SUM(d.enterprise_unemployment), 0) as enterpriseTotal,
COALESCE(SUM(d.personal_unemployment) + SUM(d.enterprise_unemployment), 0) as total
FROM oa_salary_master m
LEFT JOIN oa_salary_detail d ON m.master_id = d.main_id
WHERE m.salary_period = #{salaryPeriod}
AND m.del_flag = 0 AND d.del_flag = 0
UNION ALL
SELECT
'住房公积金' as itemName,
COALESCE(SUM(d.personal_housing_fund), 0) as personalTotal,
COALESCE(SUM(d.enterprise_housing_fund), 0) as enterpriseTotal,
COALESCE(SUM(d.personal_housing_fund) + SUM(d.enterprise_housing_fund), 0) as total
FROM oa_salary_master m
LEFT JOIN oa_salary_detail d ON m.master_id = d.main_id
WHERE m.salary_period = #{salaryPeriod}
AND m.del_flag = 0 AND d.del_flag = 0
UNION ALL
SELECT
'工伤保险' as itemName,
0 as personalTotal,
COALESCE(SUM(d.enterprise_injury), 0) as enterpriseTotal,
COALESCE(SUM(d.enterprise_injury), 0) as total
FROM oa_salary_master m
LEFT JOIN oa_salary_detail d ON m.master_id = d.main_id
WHERE m.salary_period = #{salaryPeriod}
AND m.del_flag = 0 AND d.del_flag = 0
UNION ALL
SELECT
'生育保险' as itemName,
0 as personalTotal,
COALESCE(SUM(d.enterprise_maternity), 0) as enterpriseTotal,
COALESCE(SUM(d.enterprise_maternity), 0) as total
FROM oa_salary_master m
LEFT JOIN oa_salary_detail d ON m.master_id = d.main_id
WHERE m.salary_period = #{salaryPeriod}
AND m.del_flag = 0 AND d.del_flag = 0
ORDER BY total DESC
</select>
<!-- 查询单位统计数据 -->
<select id="queryUnitStats" resultType="com.ruoyi.oa.domain.vo.dashboard.UnitStatVo">
SELECT
m.unit_name as unitName,
COUNT(DISTINCT d.detail_id) as employeeCount,
COALESCE(SUM(d.net_salary), 0) as totalNetSalary,
COALESCE(SUM(d.gross_salary), 0) as totalGrossSalary,
COALESCE(SUM(d.unit_total_expense), 0) as totalUnitExpense,
CASE
WHEN COUNT(DISTINCT d.detail_id) > 0 THEN ROUND(SUM(d.net_salary) / COUNT(DISTINCT d.detail_id), 2)
ELSE 0
END as avgNetSalary,
m.salary_period as salaryPeriod,
0 as yearOnYearGrowthRate
FROM oa_salary_master m
LEFT JOIN oa_salary_detail d ON m.master_id = d.main_id
WHERE m.salary_period = #{salaryPeriod}
AND m.del_flag = 0
AND d.del_flag = 0
GROUP BY m.unit_name, m.salary_period
ORDER BY totalNetSalary DESC
</select>
<!-- 查询部门统计数据 -->
<select id="queryDeptSalaryStats" resultType="com.ruoyi.oa.domain.vo.dashboard.DeptSalaryStatVo">
SELECT
COALESCE(d.dept, '未分配部门') as deptName,
COUNT(DISTINCT d.detail_id) as employeeCount,
COALESCE(SUM(d.net_salary), 0) as totalNetSalary,
COALESCE(SUM(d.gross_salary), 0) as totalGrossSalary,
CASE
WHEN COUNT(DISTINCT d.detail_id) > 0 THEN ROUND(SUM(d.net_salary) / COUNT(DISTINCT d.detail_id), 2)
ELSE 0
END as avgNetSalary,
CASE
WHEN COUNT(DISTINCT d.detail_id) > 0 THEN ROUND(SUM(d.gross_salary) / COUNT(DISTINCT d.detail_id), 2)
ELSE 0
END as avgGrossSalary,
0 as yearOnYearGrowthRate
FROM oa_salary_master m
LEFT JOIN oa_salary_detail d ON m.master_id = d.main_id
WHERE m.salary_period = #{salaryPeriod}
AND m.del_flag = 0
AND d.del_flag = 0
GROUP BY d.dept
ORDER BY totalNetSalary DESC
</select>
</mapper>