<?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.chushang.system.mapper.SysMenuMapper">
    <resultMap type="com.chushang.system.entity.po.SysMenu" id="SysMenuResult">
        <id property="menuId" column="menu_id"/>
        <result property="menuName" column="menu_name"/>
        <result property="parentId" column="parent_id"/>
        <result property="orderNum" column="order_num"/>
        <result property="path" column="path"/>
        <result property="component" column="component"/>
        <result property="query" column="query"/>
        <result property="frame" column="frame"/>
        <result property="cache" column="cache"/>
        <result property="menuType" column="menu_type"/>
        <result property="visible" column="visible"/>
        <result property="status" column="status"/>
        <result property="perms" column="perms"/>
        <result property="icon" column="icon"/>
        <result property="createBy" column="create_by"/>
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
        <result property="updateBy" column="update_by"/>
        <result property="delState" column="del_state"/>
    </resultMap>

    <sql id="selectMenuVo">
        select menu_id,
               menu_name,
               parent_id,
               order_num,
               path,
               component,
               `query`,
               frame,
               cache,
               menu_type,
               visible,
               status,
               ifnull(perms, '') as perms,
               icon,
               create_time,
               del_state,
               create_by,
               update_time,
               update_by
        from sys_menu
        where del_state = FALSE
    </sql>
    <select id="selectMenuPermsByUserId" resultType="java.lang.String">
        select m.perms
        from sys_menu m
                 left join sys_role_menu rm on m.menu_id = rm.menu_id
                 left join sys_user_role ur on rm.role_id = ur.role_id
                 left join sys_role r on r.role_id = ur.role_id
        where m.del_state = FALSE
          and r.status = TRUE
          and ur.user_id = #{userId}
    </select>

    <select id="selectMenuList" resultMap="SysMenuResult">
        <include refid="selectMenuVo"/>
        <if test="menuName != null and menuName != ''">
            AND menu_name like concat('%', #{menuName}, '%')
        </if>
        <if test="visible != null and visible != ''">
            AND visible = #{visible}
        </if>
        <if test="status != null ">
            AND status = #{status}
        </if>
        order by parent_id, order_num
    </select>

    <select id="selectMenuListByUserId" resultMap="SysMenuResult">
        select distinct m.menu_id,
                        m.parent_id,
                        m.menu_name,
                        m.path,
                        m.component,
                        m.`query`,
                        m.visible,
                        m.status,
                        ifnull(m.perms, '') as perms,
                        m.frame,
                        m.cache,
                        m.menu_type,
                        m.icon,
                        m.order_num,
                        m.create_time,
                        m.del_state
        from sys_menu m
                 left join sys_role_menu rm on m.menu_id = rm.menu_id
                 left join sys_user_role ur on rm.role_id = ur.role_id
                 left join sys_role ro on ur.role_id = ro.role_id
        where m.del_state = FALSE
          AND ur.user_id = #{sqlParam.userId}
        <if test="menuName != null and menuName != ''">
            AND m.menu_name like concat('%', #{menuName}, '%')
        </if>
        <if test="visible != null and visible != ''">
            AND m.visible = #{visible}
        </if>
        <if test="status != null ">
            AND m.status = #{status}
        </if>
        order by m.parent_id, m.order_num
    </select>

    <select id="selectMenuListByRoleId" resultType="java.lang.Long">
        select m.menu_id
        from sys_menu m
                 left join sys_role_menu rm on m.menu_id = rm.menu_id
        where m.del_state = FALSE
          AND rm.role_id = #{roleId}
        <if test="menuCheckStrictly">
            and m.menu_id not in (select m.parent_id
                                  from sys_menu m
                                           inner join sys_role_menu rm on m.menu_id = rm.menu_id and rm.role_id = #{roleId})
        </if>
        order by m.parent_id, m.order_num
    </select>

    <select id="selectMenuTreeAll" resultMap="SysMenuResult">
        select m.menu_id,
                        m.parent_id,
                        m.menu_name,
                        m.path,
                        m.component,
                        m.`query`,
                        m.visible,
                        m.status,
                        ifnull(m.perms, '') as perms,
                        m.frame,
                        m.cache,
                        m.menu_type,
                        m.icon,
                        m.order_num,
                        m.create_time
        from sys_menu m
        where m.del_state = FALSE AND m.menu_type in ('M', 'C') and m.status = 1
        order by m.parent_id, m.order_num
    </select>
    <select id="selectMenuTreeByUserId" resultMap="SysMenuResult">
            SELECT DISTINCT
                     m.menu_id,
                     m.parent_id,
                     m.menu_name,
                     m.path,
                     m.component,
                     m.`query`,
                     m.visible,
                     m.STATUS,
                     ifnull(m.perms, '') AS perms,
                     m.frame,
                     m.CACHE,
                     m.menu_type,
                     m.icon,
                     m.order_num,
                     m.create_time
              FROM sys_menu m
                       INNER JOIN sys_role_menu rm ON m.menu_id = rm.menu_id
                  AND rm.role_id in (SELECT ur.role_id
                                     FROM sys_user_role ur
                                              LEFT JOIN sys_role ro ON ur.role_id = ro.role_id
                                              LEFT JOIN sys_user u ON ur.user_id = u.user_id
                                     WHERE u.user_id = #{userId}
                                       AND ro.STATUS = 1)
              WHERE m.del_state = FALSE
                AND m.menu_type IN ('M', 'C')
                AND m.`status` = TRUE
            ORDER BY
               m.parent_id,
               m.order_num
    </select>
    <select id="selectMenuPermsByRoleId" resultType="java.lang.String">
        SELECT
        SUBSTRING_INDEX( SUBSTRING_INDEX( m.perms, ',', b.help_topic_id + 1 ), ',',- 1 ) AS perms
        FROM sys_menu m
        LEFT JOIN sys_role_menu rm ON m.menu_id = rm.menu_id
        JOIN mysql.help_topic b ON b.help_topic_id &lt; ( LENGTH( m.perms ) - LENGTH( REPLACE ( m.perms, ',', '' ) ) + 1 )
        WHERE m.STATUS = 1 AND rm.role_id = #{roleId}
    </select>
</mapper>
