Files
GEAR-OA/gear-oa/src/main/resources/mapper/oa/GearDashboardMapper.xml
Joshi c3812b6c51 feat(oa): 添加仪表板功能模块
- 新增仪表板控制器、服务接口及其实现类- 创建仪表板相关的数据传输对象(DTO)
- 设计并实现仪表板数据的获取和统计逻辑
- 添加仪表板数据的数据库访问接口和映射文件
2025-09-17 16:46:18 +08:00

230 lines
8.0 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.gear.oa.mapper.GearDashboardMapper">
<!-- 获取今日订单数 -->
<select id="getTodayOrderCount" resultType="java.lang.Integer">
SELECT COUNT(*)
FROM gear_order
WHERE DATE(create_time) = CURDATE()
AND del_flag = 0
</select>
<!-- 获取本周订单数 -->
<select id="getWeekOrderCount" resultType="java.lang.Integer">
SELECT COUNT(*)
FROM gear_order
WHERE YEARWEEK(create_time, 1) = YEARWEEK(CURDATE(), 1)
AND del_flag = 0
</select>
<!-- 获取本月订单数 -->
<select id="getMonthOrderCount" resultType="java.lang.Integer">
SELECT COUNT(*)
FROM gear_order
WHERE YEAR(create_time) = YEAR(CURDATE())
AND MONTH(create_time) = MONTH(CURDATE())
AND del_flag = 0
</select>
<!-- 获取上周订单数 -->
<select id="getLastWeekOrderCount" resultType="java.lang.Integer">
SELECT COUNT(*)
FROM gear_order
WHERE YEARWEEK(create_time, 1) = YEARWEEK(CURDATE(), 1) - 1
AND del_flag = 0
</select>
<!-- 获取本周订单总金额 -->
<select id="getWeekOrderAmount" resultType="java.math.BigDecimal">
SELECT COALESCE(SUM(tax_amount), 0)
FROM gear_order
WHERE YEARWEEK(create_time, 1) = YEARWEEK(CURDATE(), 1)
AND del_flag = 0
</select>
<!-- 获取近一周订单趋势 -->
<select id="getWeeklyOrderTrend" resultType="java.util.Map">
SELECT
DATE(create_time) as date,
COUNT(*) as value
FROM gear_order
WHERE create_time >= DATE_SUB(CURDATE(), INTERVAL 6 DAY)
AND create_time &lt; DATE_ADD(CURDATE(), INTERVAL 1 DAY)
AND del_flag = 0
GROUP BY DATE(create_time)
ORDER BY DATE(create_time)
</select>
<!-- 获取今日薪资支出 -->
<select id="getTodaySalary" resultType="java.math.BigDecimal">
SELECT COALESCE(SUM(wage), 0)
FROM gear_attendance_record
WHERE DATE(record_date) = CURDATE()
AND del_flag = 0
AND wage IS NOT NULL
</select>
<!-- 获取本周薪资支出 -->
<select id="getWeekSalary" resultType="java.math.BigDecimal">
SELECT COALESCE(SUM(wage), 0)
FROM gear_attendance_record
WHERE YEARWEEK(record_date, 1) = YEARWEEK(CURDATE(), 1)
AND del_flag = 0
AND wage IS NOT NULL
</select>
<!-- 获取本月薪资支出 -->
<select id="getMonthSalary" resultType="java.math.BigDecimal">
SELECT COALESCE(SUM(wage), 0)
FROM gear_attendance_record
WHERE YEAR(record_date) = YEAR(CURDATE())
AND MONTH(record_date) = MONTH(CURDATE())
AND del_flag = 0
AND wage IS NOT NULL
</select>
<!-- 获取上周薪资支出 -->
<select id="getLastWeekSalary" resultType="java.math.BigDecimal">
SELECT COALESCE(SUM(wage), 0)
FROM gear_attendance_record
WHERE YEARWEEK(record_date, 1) = YEARWEEK(CURDATE(), 1) - 1
AND del_flag = 0
AND wage IS NOT NULL
</select>
<!-- 获取近一周薪资趋势 -->
<select id="getWeeklySalaryTrend" resultType="java.util.Map">
SELECT
DATE(record_date) as date,
COALESCE(SUM(wage), 0) as value
FROM gear_attendance_record
WHERE record_date >= DATE_SUB(CURDATE(), INTERVAL 6 DAY)
AND record_date &lt; DATE_ADD(CURDATE(), INTERVAL 1 DAY)
AND del_flag = 0
GROUP BY DATE(record_date)
ORDER BY DATE(record_date)
</select>
<!-- 获取库存排行前10 -->
<select id="getStockRanking" resultType="com.gear.oa.domain.vo.dashboard.StockRankingVO">
SELECT
s.item_id,
s.item_type,
s.quantity,
s.unit,
w.warehouse_name,
CASE
WHEN s.item_type = 'product' THEN p.product_name
WHEN s.item_type = 'raw_material' THEN rm.material_name
ELSE '未知'
END as item_name,
CASE
WHEN s.item_type = 'product' THEN p.product_code
WHEN s.item_type = 'raw_material' THEN rm.material_code
ELSE ''
END as item_code,
CASE
WHEN s.item_type = 'product' THEN pc.category_name
ELSE NULL
END as category_name,
CASE
WHEN s.item_type = 'product' THEN p.owner
ELSE NULL
END as owner
FROM gear_stock s
LEFT JOIN gear_warehouse w ON s.warehouse_id = w.warehouse_id
LEFT JOIN gear_product p ON s.item_type = 'product' AND s.item_id = p.product_id
LEFT JOIN gear_product_category pc ON p.category_id = pc.category_id
LEFT JOIN (
SELECT product_id as material_id, product_name as material_name, product_code as material_code
FROM gear_product
WHERE type = 'raw'
) rm ON s.item_type = 'raw_material' AND s.item_id = rm.material_id
WHERE s.del_flag = 0
AND s.quantity > 0
ORDER BY s.quantity DESC
LIMIT 10
</select>
<!-- 获取活跃客户数(本月有订单的客户) -->
<select id="getActiveCustomerCount" resultType="java.lang.Integer">
SELECT COUNT(DISTINCT customer_id)
FROM gear_order
WHERE YEAR(create_time) = YEAR(CURDATE())
AND MONTH(create_time) = MONTH(CURDATE())
AND del_flag = 0
</select>
<!-- 获取待处理订单数 -->
<select id="getPendingOrderCount" resultType="java.lang.Integer">
SELECT COUNT(*)
FROM gear_order
WHERE order_status IN (0, 1)
AND del_flag = 0
</select>
<!-- 获取库存预警数量假设库存小于10为预警 -->
<select id="getLowStockCount" resultType="java.lang.Integer">
SELECT COUNT(*)
FROM gear_stock
WHERE quantity &lt; 10
AND del_flag = 0
</select>
<!-- 获取本月营收 -->
<select id="getMonthlyRevenue" resultType="java.math.BigDecimal">
SELECT COALESCE(SUM(tax_amount), 0)
FROM gear_order
WHERE YEAR(create_time) = YEAR(CURDATE())
AND MONTH(create_time) = MONTH(CURDATE())
AND order_status = 2
AND del_flag = 0
</select>
<!-- 获取员工总数(从考勤记录中统计活跃用户) -->
<select id="getTotalEmployeeCount" resultType="java.lang.Integer">
SELECT COUNT(DISTINCT user_id)
FROM gear_attendance_record
WHERE record_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)
AND del_flag = 0
</select>
<!-- 获取今日出勤率 -->
<select id="getTodayAttendanceRate" resultType="java.math.BigDecimal">
SELECT
CASE
WHEN total_employees.total = 0 THEN 0
ELSE ROUND((attended_employees.attended * 100.0 / total_employees.total), 2)
END as attendance_rate
FROM
(SELECT COUNT(DISTINCT user_id) as total
FROM gear_attendance_record
WHERE record_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)
AND del_flag = 0) total_employees
CROSS JOIN
(SELECT COUNT(DISTINCT user_id) as attended
FROM gear_attendance_record
WHERE DATE(record_date) = CURDATE()
AND record_type = 'attendance'
AND del_flag = 0) attended_employees
</select>
<!-- 获取产品总数 -->
<select id="getTotalProductCount" resultType="java.lang.Integer">
SELECT COUNT(*)
FROM gear_product
WHERE del_flag = 0
AND is_enabled = 1
</select>
<!-- 获取供应商总数 -->
<select id="getTotalSupplierCount" resultType="java.lang.Integer">
SELECT COUNT(*)
FROM gear_supplier
WHERE del_flag = 0
</select>
</mapper>