<?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="ink.wgink.service.department.dao.IDepartmentUserDao">

    <cache flushInterval="3600000"/>

    <resultMap id="departmentUserDTO" type="ink.wgink.pojo.dtos.department.DepartmentUserDTO">
        <result column="department_id" property="departmentId"/>
        <result column="user_id" property="userId"/>
        <result column="user_sort" property="userSort"/>
    </resultMap>

    <!-- 建表 -->
    <update id="createTable">
        CREATE TABLE IF NOT EXISTS `sys_department_user` (
            `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
            `department_id` char(36) NOT NULL,
            `user_id` char(36) NOT NULL,
            `user_sort` varchar(255) DEFAULT 'ZZZ-000',
            PRIMARY KEY (`id`),
            KEY `user_id_idx` (`user_id`) USING BTREE,
            KEY `department_id_idx` (`department_id`) USING BTREE
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    </update>

    <!-- 新增组织用户 -->
    <insert id="save" parameterType="map" flushCache="true">
        INSERT INTO sys_department_user(
            department_id,
            user_id
        ) VALUES(
            #{departmentId},
            #{userId}
        )
    </insert>

    <!-- 删除组织用户 -->
    <delete id="delete" parameterType="map" flushCache="true">
        DELETE FROM
            sys_department_user
        <where>
            <if test="departmentId != null and departmentId != ''">
        AND
            department_id = #{departmentId}
            </if>
            <if test="departmentIds != null and departmentIds.size > 0">
        AND
            department_id IN
                <foreach collection="departmentIds" index="index" open="(" separator="," close=")">
                #{departmentIds[${index}]}
                </foreach>
            </if>
            <if test="userId != null and userId != ''">
        AND
            user_id = #{userId}
            </if>
            <if test="userIds != null and userIds.size > 0">
        AND
            user_id IN
                <foreach collection="userIds" index="index" open="(" separator="," close=")">
                #{userIds[${index}]}
                </foreach>
            </if>
        </where>
    </delete>

    <!-- 更新组织用户排序 -->
    <update id="updateSort" parameterType="map" flushCache="true">
        UPDATE
            sys_department_user
        SET
            user_sort = #{userSort}
        WHERE
            department_id = #{departmentId}
        AND
            user_id = #{userId}
    </update>

    <!-- 机构用户列表 -->
    <select id="list" parameterType="map" resultMap="departmentUserDTO" useCache="true">
        SELECT
            department_id,
            user_id,
            user_sort
        FROM
            sys_department_user
        <where>
            <if test="departmentId != null and departmentId != ''">
                department_id = #{departmentId}
            </if>
            <if test="departmentIds != null and departmentIds.size > 0">
            AND
                department_id IN
                <foreach collection="departmentIds" index="index" open="(" separator="," close=")">
                    #{departmentIds[${index}]}
                </foreach>
            </if>
            <if test="userIds != null and userIds.size > 0">
            AND
                user_id IN
                <foreach collection="userIds" index="index" open="(" separator="," close=")">
                    #{userIds[${index}]}
                </foreach>
            </if>
        </where>
        <if test="order != null and order != ''">
        ORDER BY
            <trim suffixOverrides=",">
                <if test="order == 'userSort'">
                    user_sort <if test="sort != null and sort != ''"><if test="sort == 'asc'">ASC</if><if test="sort == 'desc'">DESC</if></if>,
                </if>
            </trim>
            <trim suffixOverrides=",">
                <if test="order == 'userSort'">
                    user_sort <if test="sort != null and sort != ''"><if test="sort == 'asc'">ASC</if><if test="sort == 'desc'">DESC</if></if>,
                </if>
            </trim>
        </if>
    </select>

    <!-- 用户ID列表 -->
    <select id="listUserId" parameterType="map" resultType="java.lang.String">
        SELECT
            user_id
        FROM
            sys_department_user
        <where>
            <if test="departmentId != null and departmentId != ''">
            department_id = #{departmentId}
            </if>
            <if test="departmentIds != null and departmentIds.size > 0">
            AND
                department_id IN
                <foreach collection="departmentIds" index="index" open="(" separator="," close=")">
                    #{departmentIds[${index}]}
                </foreach>
            </if>
            <if test="userIds != null and userIds.size > 0">
            AND
                user_id IN
                <foreach collection="userIds" index="index" open="(" separator="," close=")">
                    #{userIds[${index}]}
                </foreach>
            </if>
        </where>
        ORDER BY
            user_sort
    </select>

    <!-- 用户ID列表 -->
    <select id="listGroupUserId" parameterType="map" resultType="java.lang.String">
        SELECT
            user_id
        FROM
            sys_department_user
        WHERE
            1 = 1
        GROUP BY
            user_id
    </select>

    <!-- 部门ID列表 -->
    <select id="listDepartmentId" parameterType="map" resultType="java.lang.String">
        SELECT
            department_id
        FROM
            sys_department_user
        WHERE
        <if test="userId != null and userId != ''">
            user_id = #{userId}
        </if>
        <if test="userIds != null and userIds.size > 0">
            user_id IN (
            <foreach collection="userIds" index="index" open="(" separator="," close=")">
                #{userIds[${index}]}
            </foreach>
            )
        </if>
    </select>

</mapper>