Pārlūkot izejas kodu

add:添加学生直播课

liujunchi 3 gadi atpakaļ
vecāks
revīzija
a985e1a0d8

+ 41 - 8
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/CourseGroupController.java

@@ -7,6 +7,7 @@ import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.CheckCourseTimeDto;
 import com.yonge.cooleshow.biz.dal.dto.LiveCourseGroupDto;
 import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupStudentCourseSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupStudentSearch;
 import com.yonge.cooleshow.biz.dal.entity.AlbumFavorite;
 import com.yonge.cooleshow.biz.dal.entity.CourseTimeEntity;
@@ -19,6 +20,7 @@ import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.page.PageInfo;
 import io.swagger.annotations.*;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
@@ -45,11 +47,28 @@ public class CourseGroupController extends BaseController {
     @Autowired
     private SysUserFeignService sysUserFeignService;
 
-    @ApiOperation(value = "直播课列表", httpMethod="POST", consumes="application/json", produces="application/json")
+    @ApiOperation(value = "老师直播课列表", httpMethod="POST", consumes="application/json", produces="application/json")
     @PostMapping(value="/live/list", consumes="application/json", produces="application/json")
-    public HttpResponseResult<PageInfo<LiveCourseGroupVo>> list(@Valid @RequestBody LiveCourseGroupSearch query) {
+    public HttpResponseResult<PageInfo<LiveCourseGroupVo>> teacherList(@Validated(value = LiveCourseGroupSearch.TeacherGroup.class)
+                                                                           @RequestBody LiveCourseGroupSearch query) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
+        if (sysUser == null || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+        query.setCourseType(CourseScheduleEnum.LIVE);
+
+        IPage<LiveCourseGroupVo> liveCourseGroupVoIPage = courseGroupService
+                .selectAdminLivePage(PageUtil.getPage(query), query);
+        return succeed(PageUtil.pageInfo(liveCourseGroupVoIPage));
+    }
+
+
+    @ApiOperation(value = "学生直播课列表", httpMethod="POST", consumes="application/json", produces="application/json")
+    @PostMapping(value="/live/list/student", consumes="application/json", produces="application/json")
+    public HttpResponseResult<PageInfo<LiveCourseGroupVo>> studentList(@Validated(value = LiveCourseGroupSearch.StudentGroup.class)
+                                                                           @RequestBody LiveCourseGroupSearch query) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null || sysUser.getId() == null) {
             return failed("用户信息获取失败");
         }
         query.setCourseType(CourseScheduleEnum.LIVE);
@@ -79,11 +98,11 @@ public class CourseGroupController extends BaseController {
     }
 
 
-    @ApiOperation(value = "直播课购买学员信息", httpMethod="POST", consumes="application/json", produces="application/json")
+    @ApiOperation(value = "老师详情-直播课购买学员信息", httpMethod="POST", consumes="application/json", produces="application/json")
     @PostMapping(value="/live/student", consumes="application/json", produces="application/json")
     public HttpResponseResult<PageInfo<LiveCourseGroupStudentVo>> student(@Valid @RequestBody LiveCourseGroupStudentSearch query) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
+        if (sysUser == null || sysUser.getId() == null) {
             return failed("用户信息获取失败");
         }
 
@@ -93,7 +112,7 @@ public class CourseGroupController extends BaseController {
     }
 
 
-    @ApiOperation(value = "教学计划")
+    @ApiOperation(value = "老师详情-教学计划")
     @PostMapping(value="/live/{courseGroupId}")
     public HttpResponseResult<List<LiveCourseGroupPlanVo>> student(@ApiParam(value = "课程组编号ID", required = true)
                                                                               @PathVariable("courseGroupId") Long courseGroupId) {
@@ -105,8 +124,22 @@ public class CourseGroupController extends BaseController {
             return failed("课程组id不能为空");
         }
 
-        List<LiveCourseGroupPlanVo> LiveCourseGroupPlanVoList = courseGroupService.selectAdminLivePlan(courseGroupId);
-        return succeed(LiveCourseGroupPlanVoList);
+        return succeed(courseGroupService.selectAdminLivePlan(courseGroupId));
     }
+
+
+    @ApiOperation(value = "学生详情-直播课详情-学生上课状态", httpMethod="POST", consumes="application/json", produces="application/json")
+    @PostMapping(value="/live/student/course", consumes="application/json", produces="application/json")
+    public HttpResponseResult<PageInfo<LiveCourseGroupStudentCourseVo>> studentCourse(@Valid @RequestBody LiveCourseGroupStudentCourseSearch query) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+
+        IPage<LiveCourseGroupStudentCourseVo> liveCourseGroupStudentCourseVoIPage = courseGroupService
+                .selectAdminLiveStudentCoursePage(PageUtil.getPage(query), query);
+        return succeed(PageUtil.pageInfo(liveCourseGroupStudentCourseVoIPage));
+    }
+
 }
 

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseGroupDao.java

@@ -4,9 +4,11 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupStudentCourseSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupStudentSearch;
 import com.yonge.cooleshow.biz.dal.entity.CourseGroup;
 import com.yonge.cooleshow.biz.dal.vo.LiveCourseGroupPlanVo;
+import com.yonge.cooleshow.biz.dal.vo.LiveCourseGroupStudentCourseVo;
 import com.yonge.cooleshow.biz.dal.vo.LiveCourseGroupStudentVo;
 import com.yonge.cooleshow.biz.dal.vo.LiveCourseGroupVo;
 import org.apache.ibatis.annotations.Param;
@@ -71,5 +73,15 @@ public interface CourseGroupDao extends BaseMapper<CourseGroup> {
      * @return
      */
     LiveCourseGroupVo selectAdminLiveCourseGroup(@Param("courseGroupId") Long courseGroupId);
+
+    /**
+     * 查询直播详情 直播课学生到课状态
+     *
+     * @param page  分页
+     * @param query 查询条件
+     * @return
+     */
+    IPage<LiveCourseGroupStudentCourseVo> selectAdminLiveStudentCoursePage(@Param("page") IPage<LiveCourseGroupStudentCourseVo> page,
+                                                                           @Param("param") LiveCourseGroupStudentCourseSearch query);
 }
 

+ 21 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/LiveCourseGroupSearch.java

@@ -7,7 +7,7 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
 import javax.validation.constraints.NotNull;
-import java.math.BigDecimal;
+import javax.validation.groups.Default;
 import java.util.Date;
 
 /**
@@ -19,10 +19,20 @@ import java.util.Date;
 @ApiModel("平台方-老师详情-直播课列表查询条件")
 public class LiveCourseGroupSearch extends QueryInfo {
 
-    @ApiModelProperty(value = "老师编号id",required = true)
-    @NotNull(message = "老师编号不能为空")
+
+    public interface StudentGroup extends Default {}
+    public interface TeacherGroup extends Default{}
+
+
+    @ApiModelProperty(value = "老师编号id")
+    @NotNull(message = "老师编号不能为空",groups = {TeacherGroup.class})
     private Long teacherId;
 
+
+    @ApiModelProperty(value = "学生编号id")
+    @NotNull(message = "学生编号不能为空",groups = {StudentGroup.class})
+    private Long studentId;
+
     @ApiModelProperty("课程编号/学员编号/学员姓名/学员手机号")
     private String search;
 
@@ -109,4 +119,12 @@ public class LiveCourseGroupSearch extends QueryInfo {
     public void setEndTime(Date endTime) {
         this.endTime = endTime;
     }
+
+    public Long getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Long studentId) {
+        this.studentId = studentId;
+    }
 }

+ 64 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/LiveCourseGroupStudentCourseSearch.java

@@ -0,0 +1,64 @@
+package com.yonge.cooleshow.biz.dal.dto.search;
+
+import com.yonge.cooleshow.biz.dal.enums.StudentCourseEnum;
+import com.yonge.cooleshow.common.page.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * Description 直播课学生详情 直播课详情 上课信息查询字段
+ *
+ * @author liujunchi
+ * @date 2022-04-20
+ */
+@ApiModel("直播课学生详情 直播课详情 上课信息查询字段")
+public class LiveCourseGroupStudentCourseSearch extends QueryInfo {
+
+    @ApiModelProperty(value = "课程组编号",required = true)
+    @NotNull(message = "课程组编号不能为空")
+    private Long courseGroupId;
+
+    @ApiModelProperty(value = "学生id",required = true)
+    @NotNull(message = "学生编号不能为空")
+    private Long studentId;
+
+    @ApiModelProperty("课程编号")
+    private String courseId;
+
+    @ApiModelProperty("到课状态 TRUANT:旷课 ATTENDCLASS:到课 NOTSTART:未开始")
+    private StudentCourseEnum status;
+
+    public Long getCourseGroupId() {
+        return courseGroupId;
+    }
+
+    public void setCourseGroupId(Long courseGroupId) {
+        this.courseGroupId = courseGroupId;
+    }
+
+    public String getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(String courseId) {
+        this.courseId = courseId;
+    }
+
+    public StudentCourseEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(StudentCourseEnum status) {
+        this.status = status;
+    }
+
+    public Long getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Long studentId) {
+        this.studentId = studentId;
+    }
+}

+ 48 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/StudentCourseEnum.java

@@ -0,0 +1,48 @@
+package com.yonge.cooleshow.biz.dal.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.cooleshow.common.enums.BaseEnum;
+
+/**
+ * Description 学生上课状态
+ *
+ * @author liujunchi
+ * @date 2022-04-20
+ */
+public enum StudentCourseEnum implements BaseEnum<String,StudentCourseEnum> {
+
+    /**
+     * 旷课
+     */
+    TRUANT("TRUANT","TRUANT"),
+    /**
+     * 上课
+     */
+    ATTENDCLASS("ATTENDCLASS","ATTENDCLASS"),
+    /**
+     * 未开始
+     */
+    NOTSTART("NOTSTART","NOTSTART");
+
+    @EnumValue
+    private String code;
+    private String msg;
+
+    StudentCourseEnum(String code,String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+}

+ 12 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseGroupService.java

@@ -6,6 +6,7 @@ import com.yonge.cooleshow.biz.dal.dao.CourseGroupDao;
 import com.yonge.cooleshow.biz.dal.dto.CheckCourseTimeDto;
 import com.yonge.cooleshow.biz.dal.dto.LiveCourseGroupDto;
 import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupStudentCourseSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupStudentSearch;
 import com.yonge.cooleshow.biz.dal.entity.CourseGroup;
 import com.yonge.cooleshow.biz.dal.entity.CourseTimeEntity;
@@ -92,11 +93,21 @@ public interface CourseGroupService extends IService<CourseGroup> {
     List<LiveCourseGroupPlanVo> selectAdminLivePlan(Long courseGroupId);
 
     /**
-     * 直播课详情
+     * 直播课详情 直播课信息
      *
      * @param courseGroupId 直播课id
      * @return
      */
     LiveCourseGroupVo detail(Long courseGroupId);
+
+    /**
+     * 直播详情 直播课学生到课状态
+     *
+     * @param page 分页信息
+     * @param query 查询条件
+     * @return
+     */
+    IPage<LiveCourseGroupStudentCourseVo> selectAdminLiveStudentCoursePage(IPage<LiveCourseGroupStudentCourseVo> page,
+                                                                           LiveCourseGroupStudentCourseSearch query);
 }
 

+ 22 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java

@@ -15,10 +15,12 @@ import com.yonge.cooleshow.biz.dal.dto.CheckCourseTimeDto;
 import com.yonge.cooleshow.biz.dal.dto.LiveCourseGroupDto;
 import com.yonge.cooleshow.biz.dal.dto.LiveCourseGroupDto.CoursePlanDto;
 import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupStudentCourseSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupStudentSearch;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.CourseGroupEnum;
 import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
+import com.yonge.cooleshow.biz.dal.enums.StudentCourseEnum;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.*;
@@ -483,6 +485,26 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
 
     }
 
+    @Override
+    public IPage<LiveCourseGroupStudentCourseVo> selectAdminLiveStudentCoursePage(IPage<LiveCourseGroupStudentCourseVo> page, LiveCourseGroupStudentCourseSearch query) {
+        IPage<LiveCourseGroupStudentCourseVo> studentCourseVoIPage = baseMapper.selectAdminLiveStudentCoursePage(
+                page, query);
+        List<LiveCourseGroupStudentCourseVo> records = studentCourseVoIPage.getRecords();
+        // 设置学生上课状态
+        for (LiveCourseGroupStudentCourseVo record : records) {
+            if (CourseScheduleEnum.NOT_START.getCode().equals(record.getCourseStatue().getCode())) {
+                record.setStatus(StudentCourseEnum.NOTSTART);
+            } else {
+                if (record.getStudentAttendanceId() != null) {
+                    record.setStatus(StudentCourseEnum.ATTENDCLASS);
+                } else {
+                    record.setStatus(StudentCourseEnum.TRUANT);
+                }
+            }
+        }
+        return studentCourseVoIPage;
+    }
+
     /**
      * 学生购买直播课程组
      *

+ 6 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java

@@ -253,11 +253,13 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
 
     @Override
     public boolean del(Long id) {
-        return this.lambdaUpdate()
-                .eq(MusicSheet::getId,id)
-                .set(MusicSheet::getDelFlag,true)
-                .update();
 
+        MusicSheet musicSheet = super.getById(id);
+        if (YesOrNoEnum.YES.getCode().equals(musicSheet.getState().getCode())) {
+            throw new BizException("启用状态下,不可删除");
+        }
+        musicSheet.setDelFlag(true);
+        return this.updateById(musicSheet);
     }
 
     @Override

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicTagServiceImpl.java

@@ -163,6 +163,10 @@ public class MusicTagServiceImpl extends ServiceImpl<MusicTagDao, MusicTag> impl
         if (checkNameRepeat(musicTagSaveDto.getName(), musicTagSaveDto.getId())) {
             throw new BizException("标签名称重复");
         }
+        MusicTag oldTag = super.getById(musicTagSaveDto.getId());
+        if (YesOrNoEnum.YES.getCode().equals(oldTag.getState().getCode())) {
+            throw new BizException("启用状态下不能修改");
+        }
 
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         MusicTag musicTag = new MusicTag();

+ 106 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/LiveCourseGroupStudentCourseVo.java

@@ -0,0 +1,106 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
+import com.yonge.cooleshow.biz.dal.enums.StudentCourseEnum;
+import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * Description 学生详情 直播课详情 学生上课状态
+ *
+ * @author liujunchi
+ * @date 2022-04-20
+ */
+@ApiModel("学生详情 直播课详情 学生上课状态")
+public class LiveCourseGroupStudentCourseVo {
+
+    @ApiModelProperty("课程编号")
+    private Long courseId;
+
+    @ApiModelProperty("上课日期")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
+    private Date classDate;
+
+    @ApiModelProperty("上课时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date startTime;
+
+    @ApiModelProperty("下课时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date endTime;
+
+    @ApiModelProperty("到课状态 TRUANT:旷课 ATTENDCLASS:到课 NOTSTART:未开始")
+    private StudentCourseEnum status;
+
+    @ApiModelProperty("课程状态")
+    private CourseScheduleEnum courseStatue;
+
+    @ApiModelProperty("学生考勤id")
+    private Long studentAttendanceId;
+
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
+    public Date getClassDate() {
+        return classDate;
+    }
+
+    public void setClassDate(Date classDate) {
+        this.classDate = classDate;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+
+    public StudentCourseEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(StudentCourseEnum status) {
+        this.status = status;
+    }
+
+    public CourseScheduleEnum getCourseStatue() {
+        return courseStatue;
+    }
+
+    public void setCourseStatue(CourseScheduleEnum courseStatue) {
+        this.courseStatue = courseStatue;
+    }
+
+    public Long getStudentAttendanceId() {
+        return studentAttendanceId;
+    }
+
+    public void setStudentAttendanceId(Long studentAttendanceId) {
+        this.studentAttendanceId = studentAttendanceId;
+    }
+}

+ 45 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseGroupMapper.xml

@@ -110,6 +110,9 @@
             <if test="param.teacherId != null">
                 and #{param.teacherId} = cg.teacher_id_
             </if>
+            <if test="param.studentId != null">
+                and #{param.studentId} = cssp.user_id_
+            </if>
             <if test="param.search != null and param.search !=''">
                 and  (
                     cg.id_ like concat('%',#{param.search},'%')
@@ -239,4 +242,46 @@
             </if>
         </where>
     </select>
+
+    <select id="selectAdminLiveStudentCoursePage"
+            resultType="com.yonge.cooleshow.biz.dal.vo.LiveCourseGroupStudentCourseVo">
+        select distinct
+        cs.id_ as courseId,
+        cs.class_date_ as classDate,
+        cs.start_time_ as startTime,
+        cs.end_time_ as endTime,
+        cs.status_ as courseStatue,
+        sa.id_ as studentAttendanceId
+        from course_schedule cs
+        left join course_schedule_student_payment cssp on cs.id_ = cssp.course_id_
+        left join student_attendance sa on cssp.course_id_ = sa.course_schedule_id_
+        <where>
+            cs.status_ !=  '${@ com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum@CANCEL}'
+            <if test="param.studentId != null">
+                and cssp.user_id_ = #{param.studentId}
+            </if>
+            <if test="param.status != null">
+                <choose>
+                    <when test="param.status == @com.yonge.cooleshow.biz.dal.enums.StudentCourseEnum@TRUANT">
+                        and sa.id_ is null
+                    </when>
+                    <when test="param.status == @com.yonge.cooleshow.biz.dal.enums.StudentCourseEnum@ATTENDCLASS">
+                        and sa.id_ is not null
+                        and #{param.studentId} = sa.student_id_
+                    </when>
+                    <when test="param.status == @com.yonge.cooleshow.biz.dal.enums.StudentCourseEnum@NOTSTART">
+                        and cs.status_ = '${@ com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum@NOT_START}'
+                    </when>
+                </choose>
+            </if>
+            <if test="param.courseGroupId != null">
+                and #{param.courseGroupId} = cs.course_group_id_
+            </if>
+            <if test="param.courseId != null">
+                and cs.id_ like concat('%',#{param.courseId},'%')
+            </if>
+
+        </where>
+        order by  cs.id_ desc
+    </select>
 </mapper>