Files
fad_oa/ruoyi-oa/src/main/resources/mapper/oa/SalaryDashboardMapper.xml
2025-06-24 17:20:19 +08:00

143 lines
5.8 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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>