薪资分析

This commit is contained in:
2025-06-24 17:20:19 +08:00
parent 9995425f28
commit 3ed61a8a00
17 changed files with 495 additions and 0 deletions

View File

@@ -0,0 +1,143 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.oa.mapper.SalaryDashboardMapper">
<!-- 查询卡片指标数据 -->
<select id="queryCardMetrics" resultType="com.ruoyi.oa.domain.vo.CardMetricsVo">
SELECT
-- 薪资支出总额只计算salary类型的实际支出
SUM(CASE WHEN d.template_type = 'salary' THEN d.paid_amount ELSE 0 END) AS totalSalaryExpenditure,
-- 公司总支出:包括薪资和社保的所有实际支出
SUM(d.paid_amount) AS totalCompanyExpenditure,
COUNT(DISTINCT b.employee_id) AS employeeCount,
COUNT(DISTINCT e.dept_id) AS departmentCount
FROM
oa_employee_template_binding b
JOIN oa_binding_item_detail d ON b.binding_id = d.binding_id
JOIN oa_employee e ON b.employee_id = e.employee_id
WHERE
b.pay_year = #{year}
AND b.pay_month = #{month}
AND b.del_flag = 0
AND e.del_flag = 0
AND d.del_flag = 0
</select>
<!-- 查询年度每月总支出 -->
<select id="queryMonthlyExpenditures" resultType="com.ruoyi.oa.domain.vo.MonthlyExpenditureVo">
SELECT
b.pay_month AS month,
SUM(d.paid_amount) AS totalExpenditure
FROM
oa_employee_template_binding b
JOIN oa_binding_item_detail d ON b.binding_id = d.binding_id
WHERE
b.pay_year = #{year}
AND b.del_flag = 0
AND d.del_flag = 0
GROUP BY
b.pay_month
ORDER BY
b.pay_month
</select>
<!-- 查询薪资构成 -->
<select id="querySalaryComponents" resultType="com.ruoyi.oa.domain.vo.SalaryComponentVo">
SELECT
sdt.salary_item AS itemName,
SUM(bid.paid_amount) AS totalAmount
FROM
oa_binding_item_detail bid
JOIN oa_employee_template_binding betb ON bid.binding_id = betb.binding_id
JOIN oa_salary_template_detail sdt ON bid.item_detail_id = sdt.salary_detail_id
WHERE
betb.pay_year = #{year}
AND betb.pay_month = #{month}
AND bid.template_type = 'salary'
AND betb.del_flag = 0
AND bid.del_flag = 0
GROUP BY
sdt.salary_item
</select>
<!-- 查询折线图数据 -->
<select id="queryLineChartData" resultType="com.ruoyi.oa.domain.vo.LineChartPointVo">
SELECT
b.pay_month AS month,
-- 总支出:所有实际支出(包括薪资和社保)
SUM(d.paid_amount) AS totalExpenditure,
-- 平均工资只计算salary类型的实际支出的平均值
AVG(CASE WHEN d.template_type = 'salary' THEN d.paid_amount ELSE 0 END) AS avgSalary
FROM
oa_employee_template_binding b
JOIN oa_binding_item_detail d ON b.binding_id = d.binding_id
WHERE
b.pay_year = #{year}
AND b.del_flag = 0
AND d.del_flag = 0
GROUP BY
b.pay_month
ORDER BY
b.pay_month
</select>
<!-- 查询部门统计数据 -->
<select id="queryDepartmentStats" resultType="com.ruoyi.oa.domain.vo.DepartmentStatVo">
WITH CurrentYearStats AS (
SELECT
e.dept_id,
-- 部门总支出:该部门所有员工的所有实际支出
SUM(d.paid_amount) AS totalExpenditure,
-- 部门平均工资该部门所有员工的salary类型实际支出的平均值
AVG(CASE WHEN d.template_type = 'salary' THEN d.paid_amount ELSE 0 END) AS avgSalary,
COUNT(DISTINCT e.employee_id) AS employeeCount
FROM
oa_employee_template_binding b
JOIN oa_employee e ON b.employee_id = e.employee_id
JOIN oa_binding_item_detail d ON b.binding_id = d.binding_id
WHERE
b.pay_year = #{year}
AND b.pay_month = #{month}
AND b.del_flag = 0
AND d.del_flag = 0
GROUP BY
e.dept_id
),
LastYearStats AS (
SELECT
e.dept_id,
-- 去年同期部门平均工资只计算salary类型的实际支出
AVG(CASE WHEN d.template_type = 'salary' THEN d.paid_amount ELSE 0 END) AS lastYearAvgSalary
FROM
oa_employee_template_binding b
JOIN oa_employee e ON b.employee_id = e.employee_id
JOIN oa_binding_item_detail d ON b.binding_id = d.binding_id
WHERE
b.pay_year = #{year} - 1
AND b.pay_month = #{month}
AND b.del_flag = 0
AND d.del_flag = 0
GROUP BY
e.dept_id
)
SELECT
d.dept_id,
d.dept_name,
COALESCE(cys.totalExpenditure, 0) AS totalExpenditure,
COALESCE(cys.avgSalary, 0) AS avgSalary,
COALESCE(cys.employeeCount, 0) AS employeeCount,
CASE
WHEN lys.lastYearAvgSalary IS NULL OR lys.lastYearAvgSalary = 0 THEN 0
ELSE ((COALESCE(cys.avgSalary, 0) - lys.lastYearAvgSalary) / lys.lastYearAvgSalary) * 100
END AS yearOnYearGrowthRate
FROM
sys_dept d
LEFT JOIN CurrentYearStats cys ON d.dept_id = cys.dept_id
LEFT JOIN LastYearStats lys ON d.dept_id = lys.dept_id
WHERE
d.del_flag = '0'
AND cys.employeeCount > 0
ORDER BY
totalExpenditure DESC
</select>
</mapper>