<?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.manage.mapper.FacilityRankingMapper">
    <!--
      模块：功能房-排行榜
      说明：
        - 统计窗口：from/to 包含边界；分钟数按交集区间计算。
        - 仅统计有效状态（已批准/进行中/已结束）且未删除的预约。
    -->

    <select id="rankRooms" resultType="com.ruoyi.manage.vo.RoomRankVO">
        select b.room_id as roomId,
        r.room_name as roomName,
        bd.building_name as buildingName,
        sum(case when b.end_time &lt;= #{from} or b.start_time &gt;= #{to}
        then 0
        else timestampdiff(minute, greatest(b.start_time, #{from}), least(b.end_time, #{to})) end) as totalMinutes
        from tb_facility_booking b
        join tb_facility_room r on r.id = b.room_id
        join tb_facility_building bd on bd.id = r.building_id
        where b.del_flag='0' and b.status in ('1','4','5')
        and b.end_time &gt;= #{from} and b.start_time &lt;= #{to}
        group by b.room_id, r.room_name, bd.building_name
        order by totalMinutes desc, roomId asc
        <if test="limit != null">limit #{limit}</if>
    </select>

    <select id="rankUsers" resultType="com.ruoyi.manage.vo.UserRankVO">
        select b.applicant_id as userId,
        u.user_name as userName,
        coalesce(u.nick_name, u.user_name) as nickName,
        sum(case when b.end_time &lt;= #{from} or b.start_time &gt;= #{to}
        then 0
        else timestampdiff(minute, greatest(b.start_time, #{from}), least(b.end_time, #{to})) end) as totalMinutes
        from tb_facility_booking b
        left join sys_user u on u.user_id = b.applicant_id
        where b.del_flag='0' and b.status in ('1','4','5')
        and b.end_time &gt;= #{from} and b.start_time &lt;= #{to}
        group by b.applicant_id, userName, nickName
        order by totalMinutes desc, userId asc
        <if test="limit != null">limit #{limit}</if>
    </select>

</mapper>
