瀏覽代碼

Merge remote-tracking branch 'origin/master'

Joburgess 4 年之前
父節點
當前提交
b612df7c60
共有 23 個文件被更改,包括 1063 次插入13 次删除
  1. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java
  2. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  3. 27 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentVisitDao.java
  4. 51 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentVisitDto.java
  5. 210 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentVisit.java
  6. 118 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentVisitQueryInfo.java
  7. 1 5
      mec-biz/src/main/java/com/ym/mec/biz/service/NotifyCallback.java
  8. 53 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentVisitService.java
  9. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  10. 90 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentVisitServiceImpl.java
  11. 5 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  12. 6 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  13. 14 1
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  14. 149 0
      mec-biz/src/main/resources/config/mybatis/StudentVisitMapper.xml
  15. 6 0
      mec-common/common-core/src/main/java/com/ym/mec/common/controller/BaseController.java
  16. 1 0
      mec-student/src/main/java/com/ym/mec/student/config/ResourceServerConfig.java
  17. 24 0
      mec-student/src/main/java/com/ym/mec/student/controller/CourseController.java
  18. 27 0
      mec-student/src/main/java/com/ym/mec/student/controller/SystemDateController.java
  19. 77 0
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/VisitController.java
  20. 17 0
      mec-util/src/main/java/com/ym/mec/util/date/DateUtil.java
  21. 5 4
      mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleController.java
  22. 81 0
      mec-web/src/main/java/com/ym/mec/web/controller/VisitController.java
  23. 71 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduVisitController.java

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java

@@ -252,4 +252,12 @@ public interface MusicGroupDao extends BaseDAO<String, MusicGroup> {
     List<MusicGroupRegisterDto> getMusicGroupRegisterOrder(@Param("musicGroupIds") List<String> musicGroupIds);
 
     List<MusicGroupRegisterDto> getMusicGroupRegisterTotalMoney(@Param("musicGroupIds") List<String> musicGroupIds);
+
+    /**
+     * 获取老师的乐团列表
+     *
+     * @param teacherId
+     * @return
+     */
+    List<MusicGroup> getTeacherMusicGroup(@Param("teacherId") Integer teacherId);
 }

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java

@@ -304,6 +304,7 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
 
     /**
      * 获取乐团报名信息和学校信息
+     *
      * @param musicGroupId
      * @param userId
      * @return
@@ -312,6 +313,7 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
 
     /**
      * 获取学员所在乐团
+     *
      * @param studentId
      * @return
      */
@@ -321,6 +323,7 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
 
     /**
      * 获取乐团下所有学员身上的声部列表
+     *
      * @param musicGroupId
      * @return
      */
@@ -328,8 +331,25 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
 
     /**
      * 获取学员详情页,包含所在乐团信息
+     *
      * @param studentId
      * @return
      */
     StudentMusicDetailDto getStudentDetail(Integer studentId);
+
+    /**
+     * 获取乐团的学生
+     *
+     * @param musicGroupId
+     * @return
+     */
+    List<StudentRegistration> getMusicGroupStu(@Param("musicGroupId") String musicGroupId);
+
+    /**
+     * 获取老师对应乐团的学生
+     * @param musicGroupId
+     * @param teacherId
+     * @return
+     */
+    List<StudentRegistration> getMusicGroupStu4Teacher(@Param("musicGroupId") String musicGroupId, @Param("teacherId") Integer teacherId);
 }

+ 27 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentVisitDao.java

@@ -0,0 +1,27 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.biz.dal.dto.StudentVisitDto;
+import com.ym.mec.biz.dal.entity.StudentVisit;
+import com.ym.mec.common.dal.BaseDAO;
+
+import java.util.List;
+import java.util.Map;
+
+
+public interface StudentVisitDao extends BaseDAO<Integer, StudentVisit> {
+
+    /**
+     * 获取访问详情
+     *
+     * @param id
+     * @return
+     */
+    StudentVisitDto getInfo(Integer id);
+
+    /**
+     * 获取访问列表
+     * @param params
+     * @return
+     */
+    List<StudentVisitDto> getPageList(Map<String, Object> params);
+}

+ 51 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentVisitDto.java

@@ -0,0 +1,51 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.StudentVisit;
+import io.swagger.annotations.ApiModelProperty;
+
+public class StudentVisitDto extends StudentVisit {
+
+    @ApiModelProperty(value = "乐团名称",required = false)
+    private String musicGroupName;
+
+    @ApiModelProperty(value = "老师名字",required = false)
+    private String teacherName;
+
+    @ApiModelProperty(value = "分部名称",required = false)
+    private String organName;
+
+    @ApiModelProperty(value = "学生名字",required = false)
+    private String studentName;
+
+    public String getMusicGroupName() {
+        return musicGroupName;
+    }
+
+    public void setMusicGroupName(String musicGroupName) {
+        this.musicGroupName = musicGroupName;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+}

+ 210 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentVisit.java

@@ -0,0 +1,210 @@
+package com.ym.mec.biz.dal.entity;
+
+import com.ym.mec.common.enums.BaseEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.PastOrPresent;
+import javax.validation.constraints.Positive;
+import java.util.Date;
+
+public class StudentVisit {
+
+    public enum VisiterTypeEnum implements BaseEnum<String, com.ym.mec.biz.dal.enums.TeachModeEnum> {
+        TEACHER("TEACHER", "指导老师"), EDU_TEACHER("EDU_TEACHER", "教务老师");
+
+        private String code;
+
+        private String msg;
+
+        VisiterTypeEnum(String code, String msg) {
+            this.code = code;
+            this.msg = msg;
+        }
+
+        public void setCode(String code) {
+            this.code = code;
+        }
+
+        public String getMsg() {
+            return msg;
+        }
+
+        public void setMsg(String msg) {
+            this.msg = msg;
+        }
+
+        @Override
+        public String getCode() {
+            return this.code;
+        }
+    }
+
+    private Integer id;
+
+    /**
+     * 乐团id
+     */
+    @ApiModelProperty(value = "乐团id", required = true)
+    @NotBlank(message = "乐团id不能为空")
+    private String musicGroupId;
+
+    /**
+     * 分部id
+     */
+    @ApiModelProperty(value = "分部id", required = false)
+    private Integer organId;
+
+    /**
+     * 学生id
+     */
+    @ApiModelProperty(value = "学生id", required = true)
+    @Positive(message = "学生id必须大于0")
+    private Integer studentId;
+
+    /**
+     * 老师id
+     */
+    @ApiModelProperty(value = "老师id", required = true)
+    @Positive(message = "老师id必须大于0")
+    private Integer teacherId;
+
+    /**
+     * 老师类型
+     */
+    @ApiModelProperty(value = "老师类型", required = false)
+    private VisiterTypeEnum visiterType;
+
+    /**
+     * 回访类型
+     */
+    @ApiModelProperty(value = "回访类型", required = true)
+    @NotBlank(message = "回访类型不能为空")
+    private String type;
+
+    /**
+     * 回访目的
+     */
+    @ApiModelProperty(value = "回访目的", required = true)
+    private String purpose;
+
+    /**
+     * 学生情况
+     */
+    @ApiModelProperty(value = "学生近况", required = true)
+    private String overview;
+
+    /**
+     * 家长反馈
+     */
+    @ApiModelProperty(value = "家长反馈", required = true)
+    private String feedback;
+
+    /**
+     * 回访日期
+     */
+    @ApiModelProperty(value = "回访日期", required = true)
+    @PastOrPresent(message = "回访日期不能大于当天")
+    private Date visitTime;
+
+    /**
+     * 添加时间
+     */
+    private Date createTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getMusicGroupId() {
+        return musicGroupId;
+    }
+
+    public Integer getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(Integer organId) {
+        this.organId = organId;
+    }
+
+    public void setMusicGroupId(String musicGroupId) {
+        this.musicGroupId = musicGroupId;
+    }
+
+    public Integer getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Integer studentId) {
+        this.studentId = studentId;
+    }
+
+    public Integer getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Integer teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public VisiterTypeEnum getVisiterType() {
+        return visiterType;
+    }
+
+    public void setVisiterType(VisiterTypeEnum visiterType) {
+        this.visiterType = visiterType;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getPurpose() {
+        return purpose;
+    }
+
+    public void setPurpose(String purpose) {
+        this.purpose = purpose;
+    }
+
+    public String getOverview() {
+        return overview;
+    }
+
+    public void setOverview(String overview) {
+        this.overview = overview;
+    }
+
+    public String getFeedback() {
+        return feedback;
+    }
+
+    public void setFeedback(String feedback) {
+        this.feedback = feedback;
+    }
+
+    public Date getVisitTime() {
+        return visitTime;
+    }
+
+    public void setVisitTime(Date visitTime) {
+        this.visitTime = visitTime;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+}

+ 118 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentVisitQueryInfo.java

@@ -0,0 +1,118 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.biz.dal.entity.StudentVisit;
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+public class StudentVisitQueryInfo extends QueryInfo {
+
+    @ApiModelProperty(value = "老师或老师id搜索", required = false)
+    private String teacher;
+
+    @ApiModelProperty(value = "学生姓名或id搜索", required = false)
+    private String student;
+
+    private Integer teacherId;
+
+    private Integer studentId;
+
+    @ApiModelProperty(value = "分部id", required = false)
+    private String organId;
+
+    @ApiModelProperty(value = "访问者角色(TEACHER EDU_TEACHER)", required = false)
+    private StudentVisit.VisiterTypeEnum visiterType;
+
+    @ApiModelProperty(value = "回访类型", required = false)
+    private String type;
+
+    @ApiModelProperty(value = "回访目的", required = false)
+    private String purpose;
+
+    @ApiModelProperty(value = "回访日期开始时间", required = false)
+    private Date startTime;
+
+    @ApiModelProperty(value = "回访日期结束时间", required = false)
+    private Date endTime;
+
+    public String getTeacher() {
+        return teacher;
+    }
+
+    public void setTeacher(String teacher) {
+        this.teacher = teacher;
+    }
+
+    public String getStudent() {
+        return student;
+    }
+
+    public void setStudent(String student) {
+        this.student = student;
+    }
+
+    public Integer getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Integer teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public Integer getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Integer studentId) {
+        this.studentId = studentId;
+    }
+
+    public String getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(String organId) {
+        this.organId = organId;
+    }
+
+    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 StudentVisit.VisiterTypeEnum getVisiterType() {
+        return visiterType;
+    }
+
+    public void setVisiterType(StudentVisit.VisiterTypeEnum visiterType) {
+        this.visiterType = visiterType;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getPurpose() {
+        return purpose;
+    }
+
+    public void setPurpose(String purpose) {
+        this.purpose = purpose;
+    }
+}

+ 1 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/NotifyCallback.java

@@ -44,9 +44,7 @@ public class NotifyCallback implements MQTTCallbackHandler {
         notifyCallback = this;
         if (!profiles.equals("prod") && !appName.equals("student-server")) {
             Adapay.debug = true;
-            /**
-             * prodMode 模式,默认为生产模式,false可以使用mock模式
-             */
+            // prodMode 模式,默认为生产模式,false可以使用mock模式
             Adapay.prodMode = false;
         }
         Adapay.setDeviceID(appName);
@@ -60,8 +58,6 @@ public class NotifyCallback implements MQTTCallbackHandler {
      */
     @Override
     public void paymentSuccessMessageArrived(String payment) throws Exception {
-        boolean prodMode = Adapay.prodMode;
-        System.out.println(String.format("receive paymentSuccess  msg=%s", prodMode));
         System.out.println(String.format("receive paymentSuccess  msg=%s", payment));
         JSONObject dataObj = JSON.parseObject(payment);
         if (!dataObj.getString("app_id").equals(ConfigInit.appId)) {

+ 53 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentVisitService.java

@@ -0,0 +1,53 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.dto.StudentVisitDto;
+import com.ym.mec.biz.dal.entity.MusicGroup;
+import com.ym.mec.biz.dal.entity.StudentRegistration;
+import com.ym.mec.biz.dal.entity.StudentVisit;
+import com.ym.mec.biz.dal.page.StudentVisitQueryInfo;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.service.BaseService;
+
+import java.util.List;
+
+public interface StudentVisitService extends BaseService<Integer, StudentVisit> {
+
+
+    /**
+     * 添加访问记录
+     * @param studentVisit
+     * @return
+     */
+    StudentVisit addVisit(StudentVisit studentVisit);
+    /**
+     * 获取访问详情
+     *
+     * @param id
+     * @return
+     */
+    StudentVisitDto getInfo(Integer id);
+
+    /**
+     * 获取访问列表
+     *
+     * @param queryInfo
+     * @return
+     */
+    PageInfo<StudentVisitDto> getPageList(StudentVisitQueryInfo queryInfo);
+
+    /**
+     * 获取老师对应乐团的学生
+     *
+     * @param musicGroupId
+     * @param teacherId
+     * @return
+     */
+    List<StudentRegistration> getMusicGroupStu(String musicGroupId, Integer teacherId);
+
+    /**
+     * 获取老师的乐团
+     * @param teacherId
+     * @return
+     */
+    List<MusicGroup> getMusicGroup(Integer teacherId);
+}

+ 2 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java

@@ -1776,11 +1776,11 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
         MusicGroup musicGroup = musicGroupDao.get(classGroup.getMusicGroupId());
 
-        Integer schoolId = musicGroup.getSchoolId();
+        Integer schoolId = teachMode.equals(TeachModeEnum.ONLINE)? null : musicGroup.getSchoolId();
 
         List<Subject> subjectList = subjectService.findBySubjectByIdList(classGroup.getSubjectIdList());
 
-        String subjectNames = subjectList.stream().map(subject -> subject.getName()).collect(Collectors.joining("/"));
+        String subjectNames = subjectList.stream().map(Subject::getName).collect(Collectors.joining("/"));
 
         //1、更新班级关联老师信息
         List<ClassGroupTeacherMapper> newClassGroupTeacherMapperList = classGroup4MixDto.getClassGroupTeacherMapperList();

+ 90 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentVisitServiceImpl.java

@@ -0,0 +1,90 @@
+package com.ym.mec.biz.service.impl;
+
+import com.ym.mec.biz.dal.dao.MusicGroupDao;
+import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
+import com.ym.mec.biz.dal.dao.StudentVisitDao;
+import com.ym.mec.biz.dal.dto.PageInfoDegree;
+import com.ym.mec.biz.dal.dto.StudentVisitDto;
+import com.ym.mec.biz.dal.entity.MusicGroup;
+import com.ym.mec.biz.dal.entity.StudentRegistration;
+import com.ym.mec.biz.dal.entity.StudentVisit;
+import com.ym.mec.biz.dal.page.StudentVisitQueryInfo;
+import com.ym.mec.biz.service.StudentVisitService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.util.collection.MapUtil;
+import com.ym.mec.util.date.DateUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+@Service
+public class StudentVisitServiceImpl extends BaseServiceImpl<Integer, StudentVisit> implements StudentVisitService {
+
+    @Autowired
+    private StudentVisitDao studentVisitDao;
+    @Autowired
+    private StudentRegistrationDao studentRegistrationDao;
+    @Autowired
+    private MusicGroupDao musicGroupDao;
+
+
+    @Override
+    public BaseDAO<Integer, StudentVisit> getDAO() {
+        return studentVisitDao;
+    }
+
+    @Override
+    public StudentVisit addVisit(StudentVisit studentVisit) {
+        if (studentVisit.getMusicGroupId() == null) {
+            throw new BizException("请选择乐团");
+        }
+        MusicGroup musicGroup = musicGroupDao.get(studentVisit.getMusicGroupId());
+        if (musicGroup == null) {
+            throw new BizException("选择的乐团不存在");
+        }
+        studentVisit.setOrganId(musicGroup.getOrganId());
+        studentVisit.setCreateTime(new Date());
+        studentVisitDao.insert(studentVisit);
+        return studentVisit;
+    }
+
+    @Override
+    public StudentVisitDto getInfo(Integer id) {
+        return studentVisitDao.getInfo(id);
+    }
+
+    @Override
+    public PageInfo<StudentVisitDto> getPageList(StudentVisitQueryInfo queryInfo) {
+        if (queryInfo.getEndTime() != null) {
+            queryInfo.setEndTime(DateUtil.getLastTimeWithDay(queryInfo.getEndTime()));
+        }
+        PageInfo<StudentVisitDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<StudentVisitDto> dataList = new ArrayList<>();
+        int count = this.findCount(params);
+
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = studentVisitDao.getPageList(params);
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
+    public List<StudentRegistration> getMusicGroupStu(String musicGroupId, Integer teacherId) {
+        return studentRegistrationDao.getMusicGroupStu4Teacher(musicGroupId, teacherId);
+    }
+
+    @Override
+    public List<MusicGroup> getMusicGroup(Integer teacherId) {
+        return musicGroupDao.getTeacherMusicGroup(teacherId);
+    }
+}

+ 5 - 1
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -2177,9 +2177,13 @@
         FROM course_schedule cs
                  LEFT JOIN course_schedule_student_payment cssp ON cs.id_ = cssp.course_schedule_id_
         WHERE (cs.del_flag_ != 1 OR cs.del_flag_ IS NULL)
+          <if test="groupType != null">
           AND cs.group_type_ = #{groupType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
-          AND CONCAT(cs.class_date_, ' ', cs.start_class_time_) > NOW()
+          </if>
+          <if test="groupId != null">
           AND cs.music_group_id_ = #{groupId}
+          </if>
+          AND CONCAT(cs.class_date_, ' ', cs.start_class_time_) > NOW()
           AND cssp.user_id_ = #{userId}
     </select>
 

+ 6 - 0
mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml

@@ -570,4 +570,10 @@
         AND type_ = 'APPLY'
         GROUP BY music_group_id_
     </select>
+
+    <select id="getTeacherMusicGroup" resultMap="MusicGroup">
+        SELECT mg.* FROM course_schedule cs
+        LEFT JOIN music_group mg ON mg.id_ = cs.music_group_id_
+        WHERE cs.actual_teacher_id_ = #{teacherId} AND cs.group_type_ = 'MUSIC' GROUP BY mg.id_
+    </select>
 </mapper>

+ 14 - 1
mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml

@@ -495,7 +495,7 @@
         update_time_ = now()
         WHERE music_group_id_ = #{musicGroupId} AND payment_status_ = '0'
     </update>
-    
+
     <select id="queryStudentNum" resultType="map">
         SELECT count(distinct sr.user_id_) total_num_,sum(case when sr.create_time_ >= timestamp(date_add(curdate(), interval - day(curdate()) + 1 day)) then 1 else 0 end) new_num_,sum(case when sr.music_group_status_ = 'QUIT' and sr.update_time_ >= timestamp(date_add(curdate(), interval - day(curdate()) + 1 day)) then 1 else 0 end) quit_num_
         FROM student_registration sr left join music_group mg on sr.music_group_id_ = mg.id_
@@ -633,4 +633,17 @@
         LEFT JOIN sys_user su ON su.id_ = s.user_id_
         WHERE s.user_id_ = #{studentId}
     </select>
+
+    <select id="getMusicGroupStu" resultMap="StudentRegistration">
+        SELECT sr.user_id_,s.username_ name_,sr.music_group_status_ FROM student_registration sr
+        LEFT JOIN sys_user s on sr.user_id_ = s.id_
+        WHERE music_group_id_ = #{musicGroupId}
+    </select>
+
+    <select id="getMusicGroupStu4Teacher" resultMap="StudentRegistration">
+        SELECT s.id_ user_id_,s.username_ name_ FROM course_schedule cs
+        LEFT JOIN course_schedule_student_payment cssp ON cssp.course_schedule_id_ = cs.id_
+        LEFT JOIN sys_user s ON s.id_ = cssp.user_id_
+        WHERE cs.music_group_id_ = #{musicGroupId} AND cs.actual_teacher_id_ = #{teacherId} AND cs.group_type_ = 'MUSIC' GROUP BY s.id_
+    </select>
 </mapper>

+ 149 - 0
mec-biz/src/main/resources/config/mybatis/StudentVisitMapper.xml

@@ -0,0 +1,149 @@
+<?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.ym.mec.biz.dal.dao.StudentVisitDao">
+    <resultMap id="StudentVisit" type="com.ym.mec.biz.dal.dto.StudentVisitDto">
+        <id column="id_" property="id"/>
+        <result column="music_group_id_" property="musicGroupId"/>
+        <result column="musicGroupName" property="musicGroupName"/>
+        <result column="organ_id_" property="organId"/>
+        <result column="organName" property="organName"/>
+        <result column="student_id_" property="studentId"/>
+        <result column="studentName" property="studentName"/>
+        <result column="teacher_id_" property="teacherId"/>
+        <result column="teacherName" property="teacherName"/>
+        <result column="visiter_type_" property="visiterType"/>
+        <result column="type_" property="type"/>
+        <result column="purpose_" property="purpose"/>
+        <result column="overview_" property="overview"/>
+        <result column="feedback_" property="feedback"/>
+        <result column="visit_time_" property="visitTime"/>
+        <result column="create_time_" property="createTime"/>
+    </resultMap>
+    <sql id="Base_Column_List">
+        <!--@mbg.generated-->
+        id_, music_group_id_, organ_id_, student_id_, teacher_id_, visiter_type_, type_, purpose_, overview_, feedback_,
+        visit_time_, create_time_
+    </sql>
+    <select id="get" parameterType="java.lang.Integer" resultMap="StudentVisit">
+        select
+        <include refid="Base_Column_List"/>
+        from student_visit
+        where id_ = #{id,jdbcType=INTEGER}
+    </select>
+    <delete id="delete" parameterType="java.lang.Integer">
+        <!--@mbg.generated-->
+        delete from student_visit
+        where id_ = #{id,jdbcType=INTEGER}
+    </delete>
+    <insert id="insert" keyColumn="id_" keyProperty="id" parameterType="com.ym.mec.biz.dal.entity.StudentVisit"
+            useGeneratedKeys="true">
+        <!--@mbg.generated-->
+        insert into student_visit (music_group_id_, organ_id_, student_id_, teacher_id_, visiter_type_,
+        type_, purpose_, overview_,
+        feedback_, visit_time_, create_time_
+        )
+        values (#{musicGroupId,jdbcType=VARCHAR}, #{organId,jdbcType=INTEGER}, #{studentId,jdbcType=INTEGER},
+        #{teacherId,jdbcType=INTEGER},#{visiterType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+        #{type,jdbcType=VARCHAR}, #{purpose,jdbcType=VARCHAR}, #{overview,jdbcType=VARCHAR},
+        #{feedback,jdbcType=VARCHAR}, #{visitTime}, #{createTime}
+        )
+    </insert>
+    <update id="update" parameterType="com.ym.mec.biz.dal.entity.StudentVisit">
+        <!--@mbg.generated-->
+        update student_visit
+        <set>
+            <if test="musicGroupId != null">
+                music_group_id_ = #{musicGroupId,jdbcType=VARCHAR},
+            </if>
+            <if test="studentId != null">
+                student_id_ = #{studentId,jdbcType=INTEGER},
+            </if>
+            <if test="teacherId != null">
+                teacher_id_ = #{teacherId,jdbcType=INTEGER},
+            </if>
+            <if test="type != null">
+                type_ = #{type,jdbcType=VARCHAR},
+            </if>
+            <if test="purpose != null">
+                purpose_ = #{purpose,jdbcType=VARCHAR},
+            </if>
+            <if test="overview != null">
+                overview_ = #{overview,jdbcType=VARCHAR},
+            </if>
+            <if test="feedback != null">
+                feedback_ = #{feedback,jdbcType=VARCHAR},
+            </if>
+            <if test="visitTime != null">
+                visit_time_ = #{visitTime},
+            </if>
+            <if test="createTime != null">
+                create_time_ = #{createTime},
+            </if>
+        </set>
+        where id_ = #{id,jdbcType=INTEGER}
+    </update>
+
+    <select id="queryPage" resultMap="StudentVisit">
+        SELECT * FROM student_visit sv
+        <include refid="queryPageSql"/>
+        ORDER BY sv.id_ DESC
+        <include refid="global.limit"/>
+    </select>
+
+    <select id="getPageList" resultMap="StudentVisit">
+        SELECT sv.*,t.real_name_ teacherName,o.name_ organName,t.username_ studentName,mg.name_ musicGroupName FROM
+        student_visit sv
+        LEFT JOIN sys_user t ON sv.teacher_id_ = t.id_
+        LEFT JOIN organization o ON sv.organ_id_ = o.id_
+        LEFT JOIN sys_user s ON s.id_ = sv.student_id_
+        LEFT JOIN music_group mg ON sv.music_group_id_ = mg.id_
+        <include refid="queryPageSql"/>
+        ORDER BY sv.id_ DESC
+        <include refid="global.limit"/>
+    </select>
+    <sql id="queryPageSql">
+        <where>
+            <if test="teacher != null and teacher != ''">
+                AND (t.id_ = #{teacher} OR t.real_name_ LIKE CONCAT('%',#{teacher},'%'))
+            </if>
+            <if test="student != null and student != ''">
+                AND (s.id_ = #{student} OR s.username_ LIKE CONCAT('%',#{student},'%'))
+            </if>
+            <if test="organId != null and organId != ''">
+                AND FIND_IN_SET(sv.organ_id_,#{organId})
+            </if>
+            <if test="visiterType != null">
+                AND sv.visiter_type_ = #{visiterType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+            </if>
+            <if test="type != null">
+                AND sv.type_ = #{type}
+            </if>
+            <if test="purpose != null">
+                AND sv.purpose_ = #{purpose}
+            </if>
+            <if test="startTime != null">
+                AND sv.visit_time_ >= #{startTime}
+            </if>
+            <if test="endTime != null">
+                AND sv.visit_time_ &lt;= #{endTime}
+            </if>
+        </where>
+    </sql>
+    <select id="queryCount" resultType="int">
+        SELECT COUNT(*) FROM student_visit sv
+        LEFT JOIN sys_user t ON sv.teacher_id_ = t.id_
+        LEFT JOIN sys_user s ON s.id_ = sv.student_id_
+        <include refid="queryPageSql"/>
+    </select>
+
+    <select id="getInfo" resultMap="StudentVisit">
+        SELECT sv.*, t.real_name_ teacherName, o.name_ organName, t.username_ studentName, mg.name_ musicGroupName
+        FROM student_visit sv
+                 LEFT JOIN sys_user t ON sv.teacher_id_ = t.id_
+                 LEFT JOIN organization o ON sv.organ_id_ = o.id_
+                 LEFT JOIN sys_user s ON s.id_ = sv.student_id_
+                 LEFT JOIN music_group mg ON sv.music_group_id_ = mg.id_
+        WHERE sv.id_ = #{id}
+    </select>
+
+</mapper>

+ 6 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/controller/BaseController.java

@@ -6,12 +6,15 @@ import com.ym.mec.thirdparty.exception.ThirdpartyException;
 import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.context.support.DefaultMessageSourceResolvable;
 import org.springframework.http.HttpStatus;
 import org.springframework.security.access.AccessDeniedException;
+import org.springframework.validation.BindException;
 import org.springframework.web.bind.annotation.ControllerAdvice;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.stream.Collectors;
 
 @ControllerAdvice
 public class BaseController {
@@ -74,6 +77,9 @@ public class BaseController {
 			return failed(e.getMessage());
 		} else if (e instanceof AccessDeniedException) {
 			return failed("禁止访问");
+		}else if(e instanceof BindException){
+			String errors = ((BindException) e).getFieldErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining("\n"));
+			return failed(errors);
 		}
 		return failed("系统繁忙");
 	}

+ 1 - 0
mec-student/src/main/java/com/ym/mec/student/config/ResourceServerConfig.java

@@ -36,6 +36,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
 				"/repair/payRepair",
 				"/degree/*",
 				"/practiceGroup/queryOrderInfo",
+				"/systemDate/query",
 				"/organization/getOrgans").permitAll().anyRequest().authenticated().and().httpBasic();
 	}
 

+ 24 - 0
mec-student/src/main/java/com/ym/mec/student/controller/CourseController.java

@@ -1,15 +1,22 @@
 package com.ym.mec.student.controller;
 
+import java.util.List;
+
+import com.timevale.tgtext.text.pdf.PdfStructTreeController.returnType;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.CourseScheduleDao;
+import com.ym.mec.biz.dal.dto.StudentCourseInfoDto;
 import com.ym.mec.biz.dal.dto.UserMusicGroupQueryInfo;
 import com.ym.mec.biz.dal.page.GroupNoticeQueryInfo;
 import com.ym.mec.biz.dal.page.StudentPayLogQueryInfo;
 import com.ym.mec.biz.service.ClassGroupService;
 import com.ym.mec.biz.service.ImGroupNoticeService;
 import com.ym.mec.common.controller.BaseController;
+
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -27,6 +34,9 @@ public class CourseController extends BaseController {
     private SysUserFeignService sysUserFeignService;
     @Autowired
     private ImGroupNoticeService imGroupNoticeService;
+    
+    @Autowired
+    private CourseScheduleDao courseScheduleDao;
 
     @ApiOperation("获取学生所购买课程列表")
     @GetMapping(value = "/queryUserMusicGroups")
@@ -38,6 +48,20 @@ public class CourseController extends BaseController {
         return succeed(classGroupService.queryCoursePage(queryInfo,sysUser.getId()));
     }
 
+    @ApiOperation("获取学生所购买课程列表")
+    @GetMapping(value = "/queryRemainCourseNum")
+    public Object queryRemainCourseNum(){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(sysUser == null){
+            return failed("获取用户信息失败");
+        }
+        List<StudentCourseInfoDto> list = courseScheduleDao.findUserSurplusCourseInfoByGroup(null, null, sysUser.getId());
+        if(list == null){
+        	return succeed(0);
+        }
+        return succeed(list.size());
+    }
+
     @ApiOperation("获取学员所有聊天群组")
     @GetMapping(value = "/queryUserGroups")
     public Object queryUserGroups(String search){

+ 27 - 0
mec-student/src/main/java/com/ym/mec/student/controller/SystemDateController.java

@@ -0,0 +1,27 @@
+package com.ym.mec.student.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+import java.util.Date;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.ym.mec.common.controller.BaseController;
+
+/** 
+ * 系统时间
+ */
+@RestController
+@Api(tags = "获取系统时间")
+@RequestMapping(value = "systemDate")
+public class SystemDateController extends BaseController {
+
+	@ApiOperation(value = "查询参数")
+	@GetMapping(value = "query")
+	public Object query() {
+		return succeed(new Date());
+	}
+}

+ 77 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/controller/VisitController.java

@@ -0,0 +1,77 @@
+package com.ym.mec.teacher.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dto.StudentVisitDto;
+import com.ym.mec.biz.dal.entity.MusicGroup;
+import com.ym.mec.biz.dal.entity.StudentRegistration;
+import com.ym.mec.biz.dal.entity.StudentVisit;
+import com.ym.mec.biz.dal.page.StudentVisitQueryInfo;
+import com.ym.mec.biz.service.StudentVisitService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@Api(tags = "回访服务(老师)")
+@RequestMapping("visit")
+@RestController
+public class VisitController extends BaseController {
+
+    @Autowired
+    private StudentVisitService studentVisitService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @ApiOperation(value = "回访列表")
+    @GetMapping("/queryPage")
+    public HttpResponseResult<PageInfo<StudentVisitDto>> queryPage(StudentVisitQueryInfo queryInfo) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        queryInfo.setTeacherId(sysUser.getId());
+        return succeed(studentVisitService.getPageList(queryInfo));
+    }
+
+    @ApiOperation(value = "添加回访")
+    @PostMapping(value = "/add")
+    public HttpResponseResult<StudentVisit> add(StudentVisit studentVisit) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        studentVisit.setTeacherId(sysUser.getId());
+        studentVisit.setVisiterType(StudentVisit.VisiterTypeEnum.TEACHER);
+        studentVisitService.addVisit(studentVisit);
+        return succeed(studentVisit);
+    }
+
+
+    @ApiOperation(value = "回访详情")
+    @GetMapping(value = "/getInfo")
+    public HttpResponseResult<StudentVisitDto> getInfo(Integer id) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        StudentVisitDto info = studentVisitService.getInfo(id);
+        if (!info.getTeacherId().equals(sysUser.getId())) {
+            failed("请勿非法访问");
+        }
+        return succeed(studentVisitService.getInfo(id));
+    }
+
+    @ApiOperation(value = "获取乐团列表")
+    @GetMapping(value = "/getMusicGroup")
+    public HttpResponseResult<List<MusicGroup>> getMusicGroup() {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        return succeed(studentVisitService.getMusicGroup(sysUser.getId()));
+    }
+
+    @ApiOperation(value = "获取乐团学生")
+    @GetMapping(value = "/getMusicGroupStu")
+    public HttpResponseResult<List<StudentRegistration>> getMusicGroupStu(String musicGroupId) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        return succeed(studentVisitService.getMusicGroupStu(musicGroupId, sysUser.getId()));
+    }
+}

+ 17 - 0
mec-util/src/main/java/com/ym/mec/util/date/DateUtil.java

@@ -997,6 +997,23 @@ public class DateUtil {
 	}
 
 	/**
+	 * @describe 获取指定时间在当天最后的时间
+	 * @author Joburgess
+	 * @date 2020/1/16
+	 * @param date: 时间
+	 * @return java.util.Date
+	 */
+	public static Date getLastTimeWithDay(Date date){
+		Calendar calendar=Calendar.getInstance();
+		calendar.setTime(date);
+		calendar.set(Calendar.HOUR_OF_DAY,23);
+		calendar.set(Calendar.MINUTE, 59);
+		calendar.set(Calendar.SECOND, 59);
+		calendar.set(Calendar.MILLISECOND,999);
+		return calendar.getTime();
+	}
+
+	/**
 	 * @describe 根据日期获取所在周的周一
 	 * @author Joburgess
 	 * @date 2019/10/25

+ 5 - 4
mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleController.java

@@ -90,15 +90,16 @@ public class CourseScheduleController extends BaseController {
             if(CollectionUtils.isEmpty(classGroupTeacherMappers)){
                 throw new BizException("乐团老师设置有误");
             }
+            if(Objects.isNull(courseSchedule.getTeachMode())){
+                courseSchedule.setTeachMode(TeachModeEnum.OFFLINE);
+            }
+            Integer schoolId = courseSchedule.getTeachMode().equals(TeachModeEnum.ONLINE) ? null : musicGroup.getSchoolId();
             courseSchedule.setTeacherId(classGroupTeacherMappers.get(0).getUserId());
             courseSchedule.setActualTeacherId(classGroupTeacherMappers.get(0).getUserId());
-            courseSchedule.setSchoolId(musicGroup.getSchoolId());
+            courseSchedule.setSchoolId(schoolId);
             courseSchedule.setMusicGroupId(musicGroup.getId());
             courseSchedule.setGroupType(GroupType.MUSIC);
             courseSchedule.setStatus(CourseStatusEnum.NOT_START);
-            if(Objects.isNull(courseSchedule.getTeachMode())){
-                courseSchedule.setTeachMode(TeachModeEnum.OFFLINE);
-            }
             courseSchedule.setOrganId(musicGroup.getOrganId());
         });
 

+ 81 - 0
mec-web/src/main/java/com/ym/mec/web/controller/VisitController.java

@@ -0,0 +1,81 @@
+package com.ym.mec.web.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.dto.StudentVisitDto;
+import com.ym.mec.biz.dal.entity.Employee;
+import com.ym.mec.biz.dal.entity.StudentVisit;
+import com.ym.mec.biz.dal.page.StudentVisitQueryInfo;
+import com.ym.mec.biz.service.StudentVisitService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Arrays;
+import java.util.List;
+
+@Api(tags = "回访服务")
+@RequestMapping("visit")
+@RestController
+public class VisitController extends BaseController {
+
+    @Autowired
+    private StudentVisitService studentVisitService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private EmployeeDao employeeDao;
+
+    @ApiOperation(value = "回访列表")
+    @GetMapping("/queryPage")
+    @PreAuthorize("@pcs.hasPermissions('visit/queryPage')")
+    public HttpResponseResult<PageInfo<StudentVisitDto>> queryPage(StudentVisitQueryInfo queryInfo) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        if (!sysUser.getIsSuperAdmin()) {
+            Employee employee = employeeDao.get(sysUser.getId());
+            if (StringUtils.isEmpty(queryInfo.getOrganId())) {
+                queryInfo.setOrganId(employee.getOrganIdList());
+            } else if (StringUtils.isEmpty(employee.getOrganIdList())) {
+                return failed("用户所在分部异常");
+            } else {
+                List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+                if (!list.containsAll(Arrays.asList(queryInfo.getOrganId().split(",")))) {
+                    return failed("非法请求");
+                }
+            }
+        }
+        return succeed(studentVisitService.getPageList(queryInfo));
+    }
+
+    @ApiOperation(value = "添加回访")
+    @PostMapping(value = "/add")
+    @PreAuthorize("@pcs.hasPermissions('visit/add')")
+    public HttpResponseResult<StudentVisit> add(@Validated StudentVisit studentVisit) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        studentVisit.setTeacherId(sysUser.getId());
+        studentVisit.setVisiterType(StudentVisit.VisiterTypeEnum.EDU_TEACHER);
+        return succeed(studentVisitService.addVisit(studentVisit));
+    }
+
+
+    @ApiOperation(value = "回访详情")
+    @GetMapping(value = "/getInfo")
+    @PreAuthorize("@pcs.hasPermissions('visit/getInfo')")
+    public HttpResponseResult<StudentVisitDto> getInfo(Integer id) {
+        return succeed(studentVisitService.getInfo(id));
+    }
+}

+ 71 - 0
mec-web/src/main/java/com/ym/mec/web/controller/education/EduVisitController.java

@@ -0,0 +1,71 @@
+package com.ym.mec.web.controller.education;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
+import com.ym.mec.biz.dal.dto.StudentVisitDto;
+import com.ym.mec.biz.dal.entity.StudentRegistration;
+import com.ym.mec.biz.dal.entity.StudentVisit;
+import com.ym.mec.biz.dal.page.StudentVisitQueryInfo;
+import com.ym.mec.biz.service.StudentVisitService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@Api(tags = "回访服务(教务)")
+@RequestMapping("eduVisit")
+@RestController
+public class EduVisitController extends BaseController {
+
+    @Autowired
+    private StudentVisitService studentVisitService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private StudentRegistrationDao studentRegistrationDao;
+
+    @ApiOperation(value = "回访列表")
+    @GetMapping("/queryPage")
+    public HttpResponseResult<PageInfo<StudentVisitDto>> queryPage(StudentVisitQueryInfo queryInfo) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        queryInfo.setTeacherId(sysUser.getId());
+        return succeed(studentVisitService.getPageList(queryInfo));
+    }
+
+    @ApiOperation(value = "添加回访")
+    @PostMapping(value = "/add")
+    public HttpResponseResult<StudentVisit> add(StudentVisit studentVisit) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        studentVisit.setTeacherId(sysUser.getId());
+        studentVisit.setVisiterType(StudentVisit.VisiterTypeEnum.EDU_TEACHER);
+        return succeed(studentVisitService.addVisit(studentVisit));
+    }
+
+
+    @ApiOperation(value = "回访详情")
+    @GetMapping(value = "/getInfo")
+    public HttpResponseResult<StudentVisitDto> getInfo(Integer id) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        StudentVisitDto info = studentVisitService.getInfo(id);
+        if (!info.getTeacherId().equals(sysUser.getId())) {
+            failed("请勿非法访问");
+        }
+        return succeed(studentVisitService.getInfo(id));
+    }
+
+    @ApiOperation(value = "获取乐团学生")
+    @GetMapping(value = "/getMusicGroupStu")
+    public HttpResponseResult<List<StudentRegistration>> getMusicGroupStu(String musicGroupId) {
+        return succeed(studentRegistrationDao.getMusicGroupStu(musicGroupId));
+    }
+}