<?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="cn.iocoder.yudao.module.base.mapper.DlDriveSchoolStudentMapper">

    <!--
        一般情况下，尽可能使用 Mapper 进行 CRUD 增删改查即可。
        无法满足的场景，例如说多表关联查询，才使用 XML 编写 SQL。
        代码生成器暂时只生成 Mapper XML 文件本身，更多推荐 MybatisX 快速开发插件来生成查询。
        文档可见：https://www.iocoder.cn/MyBatis/x-plugins/
     -->

    <select id="queryListPage" resultType="cn.iocoder.yudao.module.base.vo.DlDriveSchoolStudentVO">
        SELECT
        main.*,
        dsco.coach_user_name AS coachName
        FROM
        drive_school_student main
        LEFT JOIN drive_school_course_order dsco ON main.user_id = dsco.user_id
        <where>
            main.deleted = 0
            <if test="entity.name != null  and entity.name != ''">and main.name like concat('%', #{entity.name}, '%')</if>
            <if test="entity.phone != null  and entity.phone != ''">and main.phone = #{entity.phone}</if>
            <if test="entity.idCard != null  and entity.idCard != ''">and main.id_card like concat('%', #{entity.idCard}, '%')</if>
        </where>
        GROUP BY main.user_id
        order by main.create_time desc
    </select>
    <select id="selectCanExamStudentList"
            resultType="cn.iocoder.yudao.module.base.entity.DlDriveSchoolStudent">
        SELECT
            dss.*
        FROM
            drive_school_process dsp
                LEFT JOIN drive_school_student dss ON dsp.user_id = dss.user_id
                AND dss.deleted = 0
        WHERE
            dsp.deleted = 0
            AND dsp.coach_id = #{coachId}
          AND dsp.course_id = #{courseId}
          AND dsp.`subject` = #{subject}
          <if test="userName!=null and userName!=''">
              AND dsp.user_name LIKE CONCAT('%',#{userName},'%')
          </if>
          AND dsp.`status` = '1'
          AND dsp.exam_status IS NULL
        GROUP BY
            dss.id
        ORDER BY
            dss.create_time DESC
    </select>
    <select id="pageStaffStudent" resultType="cn.iocoder.yudao.module.base.vo.DlDriveSchoolStaffVO">
        SELECT
            main.id AS id,
            main.NAME AS NAME,
            main.type AS type,
            main.avatar AS avatar,
            main.phone AS phone,
            main.user_id AS userId,
            dsco.course_type,
            dsp.`subject`
        FROM
            drive_school_student main
                LEFT JOIN drive_school_course_order dsco ON main.user_id = dsco.user_id
                AND dsco.deleted = 0
                AND dsco.payment_status IN ( '2', '3', '4', '5' )
                AND dsco.if_end = 0

                LEFT JOIN drive_school_process dsp ON main.user_id = dsp.user_id
                AND dsco.course_id = dsp.course_id
                AND dsp.`status` = '1'
        WHERE
            main.deleted = 0 AND dsco.is_sign = 1
        <if test="entity.coachId != null and entity.coachId != ''">
            AND dsp.coach_id = #{entity.coachId}
        </if>
        <if test="entity.sourceCoachId != null and entity.sourceCoachId != ''">
            AND main.source_user_id = #{entity.sourceCoachId}
        </if>
        <if test="entity.name!=null and entity.name!=''">
            AND main.name LIKE CONCAT('%',#{entity.name},'%')
        </if>
        <if test="entity.courseType != null and entity.courseType != ''">
            AND dsco.course_type = #{entity.courseType}
        </if>
        <if test="entity.subject != null and entity.subject != ''">
            AND dsp.subject = #{entity.subject}
        </if>
        <if test="entity.startTime!=null and entity.startTime!=''">
            AND dsco.create_time &gt;= #{entity.startTime}
        </if>
        <if test="entity.endTime!=null and entity.endTime!=''">
            AND dsco.create_time &lt;= #{entity.endTime}
        </if>
        <if test="entity.source!=null and entity.source!=''">
            AND main.source = #{entity.source}
        </if>
        <if test="entity.examStatus!=null and entity.examStatus!=''">
            AND dsp.exam_status = #{entity.examStatus}
        </if>
        GROUP BY
            main.id
        <choose>
            <when test="entity.sort=='asc'">
                ORDER BY
                dsco.create_time ASC
            </when>
            <otherwise>
                ORDER BY
                dsco.create_time DESC
            </otherwise>
        </choose>
    </select>
    <select id="selectByCoachId" resultType="cn.iocoder.yudao.module.base.vo.DlDriveSchoolStudentVO">
        SELECT
        temp.*
        FROM
        (
        SELECT
        dss.*,dsco.id AS orderId,dsco.course_name,dsp.coach_id,dsp.course_id
        FROM
        drive_school_process dsp
        LEFT JOIN drive_school_student dss ON dsp.user_id = dss.user_id
        LEFT JOIN drive_school_course_order dsco ON dsp.user_id = dsco.user_id AND dsp.course_id = dsco.course_id
        WHERE
        dsp.deleted = 0
        AND dsco.if_end = 0
        AND dsco.deleted = 0
        AND dsp.coach_id = #{entity.coachId}
        <if test="entity.name != null and entity.name!=''">
            AND dss.`name` LIKE CONCAT('%',#{entity.name},'%')
        </if>
        <if test="entity.startTime!=null and entity.startTime!=''">
            AND dss.create_time &gt;= #{entity.startTime}
        </if>
        <if test="entity.endTime!=null and entity.endTime!=''">
            AND dss.create_time &lt;= #{entity.endTime}
        </if>
        AND dss.id IS NOT NULL
        ORDER BY
        dss.create_time DESC
        ) temp
        GROUP BY
        temp.orderId
    </select>

    <select id="selectByBusinessId" resultType="cn.iocoder.yudao.module.base.vo.DlDriveSchoolStudentVO">
        SELECT
        dss.*,dsco.course_type AS courseType
        FROM
        drive_school_student dss
        LEFT JOIN drive_school_course_order dsco ON dss.user_id = dsco.user_id
        WHERE
        dss.deleted = 0
        AND dsco.if_end = 0
        AND dsco.deleted = 0
        AND dsco.payment_status in ( '2', '3', '4', '5' )
        AND dsco.is_sign = 1
        AND dss.id IS NOT NULL
        AND dss.source = '04'
        AND dss.source_user_id = #{entity.coachId}
        <if test="entity.name != null and entity.name!=''">
            AND dss.`name` LIKE CONCAT('%',#{entity.name},'%')
        </if>
        <if test="entity.startTime!=null and entity.startTime!=''">
            AND dss.create_time &gt;= #{entity.startTime}
        </if>
        <if test="entity.endTime!=null and entity.endTime!=''">
            AND dss.create_time &lt;= #{entity.endTime}
        </if>
        <if test="entity.courseType!=null and entity.courseType!=''">
            AND dsco.course_type = #{entity.courseType}
        </if>
        GROUP BY
        dss.user_id
        <choose>
            <when test="entity.sort=='asc'">
                ORDER BY
                dss.create_time ASC
            </when>
            <otherwise>
                ORDER BY
                dss.create_time DESC
            </otherwise>
        </choose>
    </select>
    <select id="selectStudentList" resultType="cn.iocoder.yudao.module.base.vo.DlDriveSchoolStudentVO">
        SELECT
            dss.* ,SUM(dsco.reserve_money+dsco.rest_money)AS priceAmount
        FROM
            drive_school_student dss
                LEFT JOIN drive_school_course_order dsco ON dss.user_id=dsco.user_id AND dsco.deleted=0 AND dsco.if_end=0 AND dsco.is_sign = 1
        WHERE
            dss.deleted=0
          AND dsco.id IS NOT NULL
        <if test="startTime!=null and startTime!=''">
          AND dss.create_time &gt;= #{startTime}
        </if>
        <if test="endTime!=null and endTime!=''">
          AND dss.create_time &lt;= #{endTime}
        </if>
        <if test="coachId!=null and coachId!=''">
            AND dss.source_user_id=#{coachId}
        </if>
        GROUP BY dss.id
    </select>
    <select id="selectStudentListByOrder" resultType="cn.iocoder.yudao.module.base.vo.DlDriveSchoolStudentVO">
        SELECT dss.*,SUM(dsco.reserve_money+dsco.rest_money)AS priceAmount
            FROM drive_school_course_order dsco
        LEFT JOIN drive_school_student dss ON dsco.user_id=dss.user_id AND dss.deleted=0
        WHERE dsco.deleted=0
        <if test="startTime!=null and startTime!=''">
            AND dsco.create_time &gt;= #{startTime}
        </if>
        <if test="endTime!=null and endTime!=''">
            AND dsco.create_time &lt;= #{endTime}
        </if>
        <if test="coachId!=null and coachId!=''">
            AND dsco.coach_id=#{coachId}
        </if>
        GROUP BY dss.id
    </select>
    <select id="selectStudentListCoach" resultType="cn.iocoder.yudao.module.base.vo.DlDriveSchoolStudentVO">
        SELECT
        dss.*,dsco.grad_time AS orderGradTime,dsco.id AS orderId,dsco.course_type AS courseType
        FROM
        drive_school_process dsp
        LEFT JOIN drive_school_student dss ON dsp.user_id = dss.user_id
        LEFT JOIN drive_school_course_order dsco ON dsp.user_id = dsco.user_id AND dsp.course_id = dsco.course_id
        WHERE
        dsp.deleted = 0
        AND dsco.if_end = 0
        AND dsco.deleted = 0
        AND dss.id IS NOT NULL
        <if test="coachId != null and coachId != ''">
            AND dsp.coach_id = #{coachId}
        </if>
        <if test="startTime!=null and startTime!=''">
            AND dss.create_time &gt;= #{startTime}
        </if>
        <if test="endTime!=null and endTime!=''">
            AND dss.create_time &lt;= #{endTime}
        </if>
        GROUP BY
        dsco.id
        <!--        旧的sql-->
        <!--        SELECT-->
        <!--            dss.*-->
        <!--        FROM-->
        <!--            drive_school_process dsp-->
        <!--                LEFT JOIN drive_school_student dss ON dsp.user_id = dss.user_id-->
        <!--        WHERE-->
        <!--            dsp.deleted = 0-->
        <!--          AND dss.id IS NOT NULL-->
        <!--        <if test="coachId != null and coachId != ''">-->
        <!--            AND dsp.coach_id = #{coachId}-->
        <!--        </if>-->
        <!--        <if test="startTime!=null and startTime!=''">-->
        <!--            AND dss.create_time &gt;= #{startTime}-->
        <!--        </if>-->
        <!--        <if test="endTime!=null and endTime!=''">-->
        <!--            AND dss.create_time &lt;= #{endTime}-->
        <!--        </if>-->
        <!--        GROUP BY-->
        <!--        dsp.id-->
    </select>
    <select id="selectStudentListBusiness" resultType="cn.iocoder.yudao.module.base.vo.DlDriveSchoolStudentVO">
        SELECT
        dss.*,dsco.course_type AS courseType
        FROM
        drive_school_student dss
        LEFT JOIN drive_school_course_order dsco ON dss.user_id = dsco.user_id
        WHERE
        dss.deleted = 0
        AND dsco.if_end = 0
        AND dsco.deleted = 0
        AND dsco.payment_status in ( '2', '3', '4', '5' )
        AND dsco.is_sign = 1
        AND dss.id IS NOT NULL
          AND dss.source = '04'
        <if test="coachId != null and coachId != ''">
            AND dss.source_user_id = #{coachId}
        </if>
        <if test="startTime!=null and startTime!=''">
            AND dss.create_time &gt;= #{startTime}
        </if>
        <if test="endTime!=null and endTime!=''">
            AND dss.create_time &lt;= #{endTime}
        </if>
        GROUP BY
        dsco.id
    </select>
    <select id="selectTrainStudent" resultType="cn.iocoder.yudao.module.base.vo.DlDriveSchoolStudentVO">
        SELECT
            dss.*,dsc.type AS courseType,dst.subject
        FROM
            drive_school_student dss
                LEFT JOIN drive_school_train dst ON dss.user_id = dst.user_id AND dst.deleted = 0
                LEFT JOIN drive_school_course dsc ON dst.course_id = dsc.id
        WHERE
            dst.id IS NOT NULL
          AND dss.deleted = 0
        <if test="coachId != null and coachId != ''">
            AND dst.coach_id = #{coachId}
        </if>
        <if test="courseType != null and courseType != ''">
            AND dsc.type = #{courseType}
        </if>
        <if test="subject != null and subject != ''">
            AND dst.subject = #{subject}
        </if>
        <if test="searchValue != null and searchValue != ''">
            AND dss.name LIKE CONCAT('%',#{searchValue},'%')
        </if>
        <if test="startTime!=null and startTime!=''">
            AND dst.create_time &gt;= #{startTime}
        </if>
        <if test="endTime!=null and endTime!=''">
            AND dst.create_time &lt;= #{endTime}
        </if>
        GROUP BY
            dss.id
        <choose>
            <when test="sort=='asc'">
                ORDER BY
                dst.create_time ASC
            </when>
            <otherwise>
                ORDER BY
                dst.create_time DESC
            </otherwise>
        </choose>
    </select>
    <select id="indexGetTrainList" resultType="cn.iocoder.yudao.module.base.vo.StudentCountVO">
        SELECT
        c.id,
        c.image AS image,
        c.NAME AS coachName,
        c.car_id AS carId,
        c.user_id AS userId,
        COUNT(DISTINCT s.user_id) AS totalNum,
        COUNT(DISTINCT CASE WHEN o.course_type = 'C1' THEN o.user_id END) AS c1Num,
        COUNT(DISTINCT CASE WHEN o.course_type = 'C2' THEN o.user_id END) AS c2Num,
        COUNT(DISTINCT o.user_id) AS timeTotal
        FROM
        drive_school_coach c
        LEFT JOIN drive_school_student s ON c.user_id = s.source_user_id AND s.deleted=0
        <if test="type != null and type != ''">
            AND s.source = #{type}
        </if>
        LEFT JOIN drive_school_course_order o ON s.user_id = o.user_id AND o.payment_status > 1 AND o.deleted=0 AND o.is_sign = 1 AND o.if_end = 0
        <if test="startTime != null and startTime != ''">
            AND o.create_time &gt;= #{startTime}
        </if>
        <if test="endTime != null and endTime != ''">
            AND o.create_time &lt;= #{endTime}
        </if>
        WHERE
        c.deleted = 0
        <if test="coachId != null and coachId != ''">
            AND c.user_id = #{coachId}
        </if>
        <if test="type != null and type != ''">
            <choose>
                <when test="type=='01'">
                    AND c.type='yg'
                </when>
                <when test="type=='02'">
                    AND c.type='jl'
                </when>
            </choose>
        </if>
        GROUP BY
        c.id
        ORDER BY
        totalNum DESC
    </select>

    <select id="indexGetFormList" resultType="cn.iocoder.yudao.module.base.vo.DlDriveSchoolStaffVO">
        SELECT
            main.id AS id,
            main.avatar AS avatar,
            main.name AS name,
            main.phone AS phone,
            main.user_id AS userId,
            dsco.course_type AS courseType
        FROM
            drive_school_student main
                LEFT JOIN drive_school_course_order dsco ON main.user_id = dsco.user_id
        WHERE main.deleted = 0
          AND dsco.payment_status > 1
        AND main.source='03'
        <if test="startTime != null and startTime != ''">
            AND dsco.create_time &gt;= #{startTime}
        </if>
        <if test="endTime != null and endTime != ''">
            AND dsco.create_time &lt;= #{endTime}
        </if>
    </select>
    <select id="selectStudentListCount" resultType="cn.iocoder.yudao.module.base.vo.DlDriveSchoolStaffVO">
        SELECT
        main.id AS id,
        dsco.course_type
        FROM
        drive_school_student main
        LEFT JOIN drive_school_course_order dsco ON main.user_id = dsco.user_id
        AND dsco.deleted = 0
        AND dsco.payment_status IN ( '2', '3', '4', '5' )
        AND dsco.if_end = 0

        LEFT JOIN drive_school_process dsp ON main.user_id = dsp.user_id
        AND dsco.course_id = dsp.course_id
        AND dsp.`status` = '1'
        WHERE
        main.deleted = 0
          AND dsco.is_sign = 1
        GROUP BY
        main.id
    </select>
    <select id="indexCusStudentList" resultType="cn.iocoder.yudao.module.base.vo.StudentCountVO">

    </select>

    <select id="getAll" resultType="cn.iocoder.yudao.module.base.vo.DriveSchoolStudentExportVo">
        SELECT
        name,
        age,
        CASE sex WHEN '0' THEN '男' WHEN '1' THEN '女' ELSE '未知' END AS sex,
        phone,
        CASE source
        WHEN '01' THEN '驾校统招'
        WHEN '02' THEN '教练自招'
        WHEN '03' THEN '自来客户'
        ELSE source
        END AS source,
        id_card AS idCard,
        work_name AS workName,
        regist_address AS registAddress,
        address,
        remark,
        driving_student_code AS drivingStudentCode,
        DATE_FORMAT(create_time, '%Y-%m-%d') AS createTimeStr
        FROM drive_school_student
        <where>
            deleted = 0
            <if test="entity.name != null and entity.name != ''">
                AND name LIKE CONCAT('%', #{entity.name}, '%')
            </if>
            <if test="entity.phone != null and entity.phone != ''">
                AND phone = #{entity.phone}
            </if>
            <if test="entity.idCard != null and entity.idCard != ''">
                AND id_card LIKE CONCAT('%', #{entity.idCard}, '%')
            </if>
        </where>
    </select>
</mapper>
