Bläddra i källkod

Merge remote-tracking branch 'origin/master'

周箭河 5 år sedan
förälder
incheckning
6e9a627858
23 ändrade filer med 550 tillägg och 74 borttagningar
  1. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  2. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleTeacherSalaryDao.java
  3. 20 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseListDto.java
  4. 246 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExportTeacherSalaryDto.java
  5. 16 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/ExportTeacherSalaryQueryInfo.java
  6. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleTeacherSalaryService.java
  7. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java
  8. 8 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  9. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  10. 17 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  11. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  12. 48 23
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java
  13. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  14. 19 20
      mec-biz/src/main/resources/config/contracts/practice.ftl
  15. 1 1
      mec-biz/src/main/resources/config/mybatis/AppVersionInfoMapper.xml
  16. 3 1
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  17. 48 21
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  18. 50 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml
  19. 1 0
      mec-biz/src/main/resources/config/mybatis/PracticeGroupMapper.xml
  20. 1 1
      mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  21. 1 1
      mec-student/src/main/java/com/ym/mec/student/controller/PracticeGroupController.java
  22. 6 0
      mec-web/src/main/java/com/ym/mec/web/controller/AppVersionInfoController.java
  23. 29 1
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java

@@ -1160,6 +1160,16 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @param userId:
      * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
      */
+    List<CourseSchedule> findUserCourses2(@Param("userId") Integer userId,
+                                         @Param("teacherIds") List<Integer> teacherIds);
+
+    /**
+     * @describe 获取学生相关的课程
+     * @author Joburgess
+     * @date 2020/2/10
+     * @param userId:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
+     */
     List<CourseSchedule> findUserCoursesWithPay(@Param("userId") Integer userId,
                                          @Param("teacherIds") List<Integer> teacherIds);
 

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

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.dto.CourseScheduleTeachersDto;
+import com.ym.mec.biz.dal.dto.ExportTeacherSalaryDto;
 import com.ym.mec.biz.dal.dto.TeacherSalaryDto;
 import com.ym.mec.biz.dal.dto.VipGroupSalaryDto;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
@@ -308,4 +309,11 @@ public interface CourseScheduleTeacherSalaryDao extends BaseDAO<Long, CourseSche
 	 */
 	int deleteByGroup(@Param("groupId") String groupId,
 					  @Param("groupType")GroupType groupType);
+
+	/**
+	 * 教师课酬列表
+	 * @param params
+	 * @return
+	 */
+    List<ExportTeacherSalaryDto> exportTeacherSalary(Map<String, Object> params);
 }

+ 20 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseListDto.java

@@ -1,7 +1,6 @@
 package com.ym.mec.biz.dal.dto;
 
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
-import com.ym.mec.biz.dal.entity.VipGroup;
 import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -72,6 +71,26 @@ public class CourseListDto {
 
     private Integer isApply;
 
+    private Integer practiceType;
+
+    private String practiceRenewUrl;
+
+    public String getPracticeRenewUrl() {
+        return practiceRenewUrl;
+    }
+
+    public void setPracticeRenewUrl(String practiceRenewUrl) {
+        this.practiceRenewUrl = practiceRenewUrl;
+    }
+
+    public Integer getPracticeType() {
+        return practiceType;
+    }
+
+    public void setPracticeType(Integer practiceType) {
+        this.practiceType = practiceType;
+    }
+
     public String getPracticeId() {
         return practiceId;
     }

+ 246 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExportTeacherSalaryDto.java

@@ -0,0 +1,246 @@
+package com.ym.mec.biz.dal.dto;
+
+public class ExportTeacherSalaryDto{
+
+    //课时编号
+    private Integer courseScheduleId;
+
+    //老师编号
+    private  Integer teacherId;
+
+    //老师姓名
+    private Integer teacherName;
+
+    //老师分部
+    private Integer teacherOrganName;
+
+    //工作类别
+    private String jobType;
+
+    //课程分部
+    private String courseScheduleOrganName;
+
+    //课程班名称(乐团名或者小课名)
+    private String groupName;
+
+    //乐团模式
+    private String changeType;
+
+    //活动名称
+    private String activeName;
+
+    //线上课/线下课	线上课单价	线下课单价	课程类别	课时时长	上课日期	上课时间	签到状态	签退状态	签到时间	签退时间
+    private String teachMode;
+
+    //课程单价
+    private String price;
+
+    private String courseScheduleType;
+
+    private int signCourseScheduleTime;
+
+    private String classDate;
+
+    private String courseScheduleStartTime;
+
+    private String courseScheduleEndTime;
+
+    private String signOutStatus;
+
+    private String signInStatus;
+
+    private String signInTime;
+
+    private String signOutTime;
+
+    //课时课酬	主辅	上课地点	应到学员
+    private String teacherRole;
+
+    private String address;
+
+    private int studentNum;
+
+    public String getCourseScheduleEndTime() {
+        return courseScheduleEndTime;
+    }
+
+    public void setCourseScheduleEndTime(String courseScheduleEndTime) {
+        this.courseScheduleEndTime = courseScheduleEndTime;
+    }
+
+    public Integer getCourseScheduleId() {
+        return courseScheduleId;
+    }
+
+    public void setCourseScheduleId(Integer courseScheduleId) {
+        this.courseScheduleId = courseScheduleId;
+    }
+
+    public Integer getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Integer teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public Integer getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(Integer teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public Integer getTeacherOrganName() {
+        return teacherOrganName;
+    }
+
+    public void setTeacherOrganName(Integer teacherOrganName) {
+        this.teacherOrganName = teacherOrganName;
+    }
+
+    public String getJobType() {
+        return jobType;
+    }
+
+    public void setJobType(String jobType) {
+        this.jobType = jobType;
+    }
+
+    public String getCourseScheduleOrganName() {
+        return courseScheduleOrganName;
+    }
+
+    public void setCourseScheduleOrganName(String courseScheduleOrganName) {
+        this.courseScheduleOrganName = courseScheduleOrganName;
+    }
+
+    public String getGroupName() {
+        return groupName;
+    }
+
+    public void setGroupName(String groupName) {
+        this.groupName = groupName;
+    }
+
+    public String getChangeType() {
+        return changeType;
+    }
+
+    public void setChangeType(String changeType) {
+        this.changeType = changeType;
+    }
+
+    public String getActiveName() {
+        return activeName;
+    }
+
+    public void setActiveName(String activeName) {
+        this.activeName = activeName;
+    }
+
+    public String getTeachMode() {
+        return teachMode;
+    }
+
+    public void setTeachMode(String teachMode) {
+        this.teachMode = teachMode;
+    }
+
+    public String getPrice() {
+        return price;
+    }
+
+    public void setPrice(String price) {
+        this.price = price;
+    }
+
+    public String getCourseScheduleType() {
+        return courseScheduleType;
+    }
+
+    public void setCourseScheduleType(String courseScheduleType) {
+        this.courseScheduleType = courseScheduleType;
+    }
+
+    public int getSignCourseScheduleTime() {
+        return signCourseScheduleTime;
+    }
+
+    public void setSignCourseScheduleTime(int signCourseScheduleTime) {
+        this.signCourseScheduleTime = signCourseScheduleTime;
+    }
+
+    public String getClassDate() {
+        return classDate;
+    }
+
+    public void setClassDate(String classDate) {
+        this.classDate = classDate;
+    }
+
+    public String getCourseScheduleStartTime() {
+        return courseScheduleStartTime;
+    }
+
+    public void setCourseScheduleStartTime(String courseScheduleStartTime) {
+        this.courseScheduleStartTime = courseScheduleStartTime;
+    }
+
+    public String getSignOutStatus() {
+        return signOutStatus;
+    }
+
+    public void setSignOutStatus(String signOutStatus) {
+        this.signOutStatus = signOutStatus;
+    }
+
+    public String getSignInStatus() {
+        return signInStatus;
+    }
+
+    public void setSignInStatus(String signInStatus) {
+        this.signInStatus = signInStatus;
+    }
+
+    public String getSignInTime() {
+        return signInTime;
+    }
+
+    public void setSignInTime(String signInTime) {
+        this.signInTime = signInTime;
+    }
+
+    public String getSignOutTime() {
+        return signOutTime;
+    }
+
+    public void setSignOutTime(String signOutTime) {
+        this.signOutTime = signOutTime;
+    }
+
+    public String getTeacherRole() {
+        return teacherRole;
+    }
+
+    public void setTeacherRole(String teacherRole) {
+        this.teacherRole = teacherRole;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public int getStudentNum() {
+        return studentNum;
+    }
+
+    public void setStudentNum(int studentNum) {
+        this.studentNum = studentNum;
+    }
+}

+ 16 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/ExportTeacherSalaryQueryInfo.java

@@ -0,0 +1,16 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+
+public class ExportTeacherSalaryQueryInfo extends QueryInfo {
+
+    private Boolean isExport = false;
+
+    public Boolean getIsExport() {
+        return isExport;
+    }
+
+    public void setIsExport(Boolean export) {
+        isExport = export;
+    }
+}

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleTeacherSalaryService.java

@@ -1,11 +1,13 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dto.ExportTeacherSalaryDto;
 import com.ym.mec.biz.dal.dto.TeacherSalaryDto;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
 import com.ym.mec.biz.dal.entity.VipGroup;
 import com.ym.mec.biz.dal.enums.VipGroupStatusEnum;
 import com.ym.mec.biz.dal.page.CourseScheduleTeacherSalaryQueryInfo;
+import com.ym.mec.biz.dal.page.ExportTeacherSalaryQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 
@@ -71,4 +73,11 @@ public interface CourseScheduleTeacherSalaryService extends BaseService<Long, Co
      * @return void
      */
     void updateVipGroupCourseTeacherSalary(Integer vipGroupId, Integer studentChangeNum, VipGroupStatusEnum vipGroupStatusEnum);
+
+    /**
+     * 老师课程课酬列表
+     * @param queryInfo
+     * @return
+     */
+    PageInfo<ExportTeacherSalaryDto> exportTeacherSalary(ExportTeacherSalaryQueryInfo queryInfo);
 }

+ 5 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java

@@ -163,6 +163,11 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
     String STUDENT_STUDY_REPORT_URL = "student_study_report_url";
 
     /**
+     * @describe 陪练课续费地址
+     */
+    String PRACTICE_RENEW_URL = "practice_renew_url";
+
+    /**
      * @return com.ym.mec.biz.dal.entity.SysConfig
      * @params paramName
      * @describe 根据配置名称获取配置信息

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

@@ -110,6 +110,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     private GroupDao groupDao;
     @Autowired
     private CourseScheduleEvaluateDao courseScheduleEvaluateDao;
+    @Autowired
+    private SysConfigService sysConfigService;
 
     @Override
     public BaseDAO<Integer, ClassGroup> getDAO() {
@@ -643,6 +645,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         Set<Integer> schoolIds = courseListDtos.stream().map(CourseListDto::getTeacherSchoolId).collect(Collectors.toSet());
         Map<Integer, String> schoolNames = MapUtil.convertMybatisMap(schoolDao.queryNameByIds(StringUtils.join(schoolIds, ",")));
 
+        SysConfig practiceRenewUrlConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_RENEW_URL);
+
         Long classTimes = null;
         for (CourseListDto e:courseListDtos) {
             if(StringUtils.isNotEmpty(e.getMusicId())){
@@ -658,6 +662,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             e.setIsApply(isApplyMap.get(e.getMusicId()));
             if(ClassGroupTypeEnum.PRACTICE == e.getType()){
                 e.setStudentNames(practiceStuNames.get(e.getPracticeId()));
+                e.setPracticeRenewUrl(practiceRenewUrlConfig.getParanValue());
             }
             if (ClassGroupTypeEnum.VIP == e.getType()) {
                 e.setStudentNames(vipStuNames.get(e.getVipId()));
@@ -709,7 +714,9 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         }
         //获取相关老师
         teacherIds.addAll(classGroupDao.findGroupTeacher(groupId));
-        students.addAll(teacherDao.queryTeacherImModel(teacherIds));
+        if(teacherIds.size() > 0){
+            students.addAll(teacherDao.queryTeacherImModel(teacherIds));
+        }
         return students;
     }
 

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -2884,7 +2884,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         params.put("courseScheduleIds", courseScheduleIdSet);
         List<CourseScheduleEndDto> results = new ArrayList<>();
         int count = courseScheduleDao.endCountCourseSchedules(params);
-        if(queryInfo.getIsExport() && count > 2000){
+        if(queryInfo.getIsExport() && count > 50000){
             throw new BizException("数据集太大,不能导出.最大数据集不能超过50000");
         }
         if (count > 0) {

+ 17 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -1,10 +1,12 @@
 package com.ym.mec.biz.service.impl;
 
 import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.ExportTeacherSalaryDto;
 import com.ym.mec.biz.dal.dto.TeacherSalaryDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.CourseScheduleTeacherSalaryQueryInfo;
+import com.ym.mec.biz.dal.page.ExportTeacherSalaryQueryInfo;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.constant.CommonConstants;
 import com.ym.mec.common.dal.BaseDAO;
@@ -678,4 +680,19 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         }
         classGroupTeacherSalaryDao.update(classGroupTeacherSalary);
     }
+
+    @Override
+    public PageInfo<ExportTeacherSalaryDto> exportTeacherSalary(ExportTeacherSalaryQueryInfo queryInfo) {
+        //课时编号	老师编号	老师姓名	老师分部	工作类别	课程分部
+        //课程班名称(乐团名或者小课名)	乐团模式	活动名称	线上课/线下课	线上课单价
+        //线下课单价	上课形式	课程类别	课时时长	上课日期	上课时间	签到状态
+        //签退状态	签到时间	签退时间	课时课酬	主辅	上课地点	应到学员
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+        List<ExportTeacherSalaryDto> exportTeacherSalaryDtos = courseScheduleTeacherSalaryDao.exportTeacherSalary(params);
+        //乐团课
+        //vip课
+        //陪练课
+        return null;
+    }
 }

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -1973,6 +1973,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             });
             musicGroupStudentFeeDao.batchUpdate(fees);
         }
+        musicGroup.setUpdateTime(date);
         musicGroupDao.update(musicGroup);
         //修改课程里面的教学点
         if (!musicGroup.getSchoolId().equals(musicGroup.getSchoolId())) {

+ 48 - 23
mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java

@@ -26,6 +26,8 @@ import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
@@ -109,6 +111,8 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
     private PracticeGroupSellPriceDao practiceGroupSellPriceDao;
     @Autowired
     private TeacherDefaultPracticeGroupSalaryDao teacherDefaultPracticeGroupSalaryDao;
+    @Autowired
+    private ContractService contractService;
 
     private static Map<Integer, Map<Integer, List<Integer>>> schoolSubjectTeachersMap;
 
@@ -122,6 +126,9 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
 
     private static Date activityStartDate, activityEndDate, applyStartDay, courseExpireDate;
 
+    private static final Logger LOGGER = LoggerFactory
+            .getLogger(PracticeGroupService.class);
+
     private static List<String> applyDayTimes = new ArrayList<>();
 
     static {
@@ -2093,7 +2100,15 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         if(Objects.isNull(groupId)){
             throw new BizException("请选择续费的课程");
         }
-        return practiceGroupDao.findUserPracticeGroup2(userId, groupId);
+        Date now=new Date();
+        PracticeGroupDto userPracticeGroup = practiceGroupDao.findUserPracticeGroup2(userId, groupId);
+        if(Objects.isNull(userPracticeGroup)){
+            throw new BizException("需要续费的课程组不存在");
+        }
+        if(userPracticeGroup.getCoursesExpireDate().before(now)){
+            throw new BizException("此课程组已超过可续费期限");
+        }
+        return userPracticeGroup;
     }
 
     @Override
@@ -2156,7 +2171,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
 
         List<Integer> allTeacherIds = organAndSubjectTeachers.stream().map(TeacherBasicDto::getId).collect(Collectors.toList());
 
-        List<CourseSchedule> userCourses = courseScheduleDao.findUserCourses(userId, allTeacherIds);
+        List<CourseSchedule> userCourses = courseScheduleDao.findUserCourses2(userId, allTeacherIds);
 
         if (!CollectionUtils.isEmpty(userCourses)) {
             Map<CourseSchedule.CourseScheduleType, List<CourseSchedule>> courseTypeCourseMap = userCourses.stream().collect(Collectors.groupingBy(CourseSchedule::getType));
@@ -2222,16 +2237,17 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
     @Override
     public Map<Integer, List<String>> getEnableApplyDatesWithWeek() {
         Map<Integer, List<String>> result = new HashMap<>();
-        SysConfig practiceApplyStartTimeConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_APPLY_START_TIME);
-        SysConfig practiceApplyEndTimeConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_APPLY_END_TIME);
         SysConfig practiceApplyIntervalTimeConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_APPLY_INTERVAL_TIME);
         Integer practiceApplyIntervalMinutes = practiceApplyIntervalTimeConfig.getParanValue(Integer.class);
-        LocalTime dayStartTime=LocalTime.parse(practiceApplyStartTimeConfig.getParanValue(),DateUtil.timeFormatter);
-        LocalTime dayEndTime=LocalTime.parse(practiceApplyEndTimeConfig.getParanValue(),DateUtil.timeFormatter);
+        LocalTime dayStartTime=LocalTime.parse("00:00:00",DateUtil.timeFormatter);
+        LocalTime dayEndTime=LocalTime.parse("00:00:00",DateUtil.timeFormatter);
         List<String> dayApplyTimes=new ArrayList<>();
-        while (dayEndTime.isAfter(dayStartTime)){
+        while (true){
             dayApplyTimes.add(dayStartTime.format(DateUtil.timeFormatter));
             dayStartTime=dayStartTime.plusMinutes(practiceApplyIntervalMinutes);
+            if(dayStartTime.compareTo(dayEndTime)==0){
+                break;
+            }
         }
         for (int i = 1; i <= 7; i++) {
             List<String> tempTimes = new ArrayList<>();
@@ -2329,31 +2345,23 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         WeekFields weekFields = WeekFields.of(DayOfWeek.MONDAY, 1);
         ZoneId zoneId = ZoneId.systemDefault();
 
-        Date today=new Date();
-
         LocalDate now = LocalDate.now();
         if(renew){
             PracticeGroup userLatestPracticeGroup = practiceGroupDao.findUserPracticeGroup(userId,groupId);
             if(Objects.nonNull(userLatestPracticeGroup)){
-                if(userLatestPracticeGroup.getCoursesExpireDate().after(today)){
-                    throw new BizException("此课程组已超过可续费期限");
-                }
-                LocalDate lastExpiredDay=LocalDateTime.ofInstant(userLatestPracticeGroup.getCoursesExpireDate().toInstant(),DateUtil.zoneId).toLocalDate();
+                LocalDate lastExpiredDay=LocalDateTime.ofInstant(userLatestPracticeGroup.getCoursesExpireDate().toInstant(),DateUtil.zoneId).plusSeconds(1).toLocalDate();
                 if(Objects.nonNull(lastExpiredDay)&&lastExpiredDay.compareTo(now)>=0){
                     now=lastExpiredDay;
                 }
-            }else{
-                throw new BizException("需要续费的课程组不存在");
             }
         }
-        now.plusDays(1);
-        Date applyStartDate = Date.from(now.atStartOfDay(zoneId).toInstant());
+        Date applyStartDate = Date.from(now.plusDays(1).atStartOfDay(zoneId).toInstant());
         Date applyEndDate = Date.from(now.plusMonths(buyMonths).atStartOfDay(zoneId).toInstant());
         Date firstMonday = DateUtil.getWeekDayWithDate(applyStartDate, Calendar.MONDAY);
         Date secondSunday = DateUtil.getWeekDayWithDate(applyEndDate, Calendar.SUNDAY);
 
         Map<Integer, List<String>> weekNumApplyTimesMap = getEnableApplyDatesWithWeek();
-        List<CourseSchedule> allTeacherCourses = courseScheduleDao.findTeacherCoursesWithDateRange(teacherId, firstMonday, secondSunday);
+        List<CourseSchedule> allTeacherCourses = courseScheduleDao.findTeacherCoursesWithDateRange(teacherId, applyStartDate, secondSunday);
         allTeacherCourses.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
 
         JSONObject teacherLeaveData = null;
@@ -2444,9 +2452,6 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         }
 
         if (CollectionUtils.isEmpty(allTeacherCourses)) {
-            if(weekNumApplyTimesMap.size()<=1){
-                weekNumApplyTimesMap=new HashMap<>();
-            }
             result.put("teacherFreeDays", weekNumApplyTimesMap);
             return result;
         }
@@ -2498,7 +2503,11 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
                     continue;
                 }
             }
-            weekNumApplyTimesMap.put(courseStartTime.getDayOfWeek().getValue(), applyTimeStrs);
+            if(CollectionUtils.isEmpty(applyTimeStrs)){
+                weekNumApplyTimesMap.remove(courseStartTime.getDayOfWeek().getValue());
+            }else{
+                weekNumApplyTimesMap.put(courseStartTime.getDayOfWeek().getValue(), applyTimeStrs);
+            }
         }
         if(weekNumApplyTimesMap.size()<=1){
             weekNumApplyTimesMap=new HashMap<>();
@@ -2555,10 +2564,15 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             }
             PracticeGroup userLatestPracticeGroup = practiceGroupDao.findUserPracticeGroup(practiceGroupBuyParams.getStudentId(),practiceGroupBuyParams.getGroupId());
             if(Objects.nonNull(userLatestPracticeGroup)){
+                if(userLatestPracticeGroup.getCoursesExpireDate().before(now)){
+                    throw new BizException("此课程组已超过可续费期限");
+                }
                 LocalDate lastExpiredDay=LocalDateTime.ofInstant(userLatestPracticeGroup.getCoursesExpireDate().toInstant(),DateUtil.zoneId).toLocalDate();
                 if(Objects.nonNull(lastExpiredDay)&&lastExpiredDay.compareTo(courseStartDay)>=0){
                     courseStartDay=lastExpiredDay;
                 }
+            }else{
+                return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "需要续费的课程组不存在");
             }
         }
 
@@ -2824,7 +2838,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
                     orderNo,
                     baseApiUrl+"/api-student/studentOrder/notify",
                     baseApiUrl+"/api-student/studentOrder/paymentResult?orderNo=" + orderNo,
-                    "vip课购买",
+                    "陪练课购买",
                     practiceGroupBuyParams.getName(),
                     practiceGroupBuyParams.getStudentId(),
                     classFee,
@@ -2895,6 +2909,9 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         if(order.getStatus().equals(DealStatusEnum.SUCCESS)){
             courseScheduleDao.updateGroupCourseLock(order.getMusicGroupId(),GroupType.PRACTICE,0);
         }else{
+            if(Objects.nonNull(order.getBalancePaymentAmount())){
+                sysUserCashAccountService.updateBalance(order.getUserId(), order.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, "陪练课购买失败");
+            }
             studentPaymentOrderDao.update(order);
             groupService.deleteGroupInfo(order.getMusicGroupId(),GroupType.PRACTICE);
             return;
@@ -2940,6 +2957,12 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         practiceGroup.setGroupStatus(GroupStatusEnum.NORMAL);
         practiceGroupDao.update(practiceGroup);
 
+        try {
+            contractService.transferPracticeCoursesContract(order.getUserId(),classGroup.getTotalClassTimes(),practiceGroup.getCoursesStartDate(),practiceGroup.getCoursesExpireDate(),order.getExpectAmount());
+        } catch (Exception e) {
+            LOGGER.error("小课[{}]购买协议错误:{}",order.getMusicGroupId(),e.getMessage(),e.getMessage());
+        }
+
 //        List<ImGroupMember> imGroupMemberList = new ArrayList<>();
 //        imGroupMemberList.add(new ImGroupMember(practiceGroup.getUserId().toString()));
 //        imGroupMemberList.add(new ImGroupMember(practiceGroup.getStudentId().toString()));
@@ -3062,12 +3085,14 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             );
 
             Map<String,BigDecimal> routingFee = (Map<String,BigDecimal>)payMap.get("routingFee");
+            newOrder.setOrderNo(orderNo);
             newOrder.setOrganId(practiceGroup.getOrganId());
             newOrder.setComAmount(routingFee.get("COM"));
             newOrder.setPerAmount(routingFee.get("PER"));
             newOrder.setMerNos((String) payMap.get("routingMerNos"));
             newOrder.setPaymentChannel((String) payMap.get("type"));
             newOrder.setUpdateTime(new Date());
+            newOrder.setCreateTime(new Date());
             studentPaymentOrderService.insert(newOrder);
 
             return BaseController.succeed(payMap);

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

@@ -122,10 +122,10 @@ public class StudentManageServiceImpl implements StudentManageService {
             Map<Integer,String> subjectNames = MapUtil.convertMybatisMap(studentManageDao.querySubjectNames(userIds));
             dataList.forEach(e -> {
                 e.setOrganName(organNames.get(e.getOrganId()));
-                e.setMusicGroupName(musicGroupNames.get(e.getUserId())==null?musicGroupNames.get(e.getUserId().longValue()):null);
+                e.setMusicGroupName(musicGroupNames.get(e.getUserId().longValue()));
                 e.setVipGroupName(vipGroupNames.get(e.getUserId()));
                 e.setSubjectName(subjectNames.get(e.getUserId()));
-                e.setMusicGroupStatus(musicGroupStatus.get(e.getUserId())==null?musicGroupStatus.get(e.getUserId().longValue()):null);
+                e.setMusicGroupStatus(musicGroupStatus.get(e.getUserId().longValue()));
                 e.setVipGroupStatus(vipGroupStatus.get(e.getUserId()));
                 if(hasCourse == null){
                     Integer course = studentManageDao.getHasCourse(e.getUserId());

+ 19 - 20
mec-biz/src/main/resources/config/contracts/practice.ftl

@@ -74,9 +74,9 @@
 </head>
 <body style="font-family:'SimSun'">
     <div class="container">
-        <h1>网络管乐基础课购买协议</h1>
+        <h1>网络管乐基础课购买协议</h1>
         <h2>重要提示</h2>
-        欢迎使用大雅乐盟(下称“本公司”)在线网络管乐基础课程服务,本协议为用户购买本公司在线网络管乐基础课程(下称“课程”)之事宜订立的协议。请用户在购买和使用在线乐基础服务前仔细阅读本协议。如用户不同意本协议任何条款,请勿购买或使用在线乐基础服务(下称“本服务”)。用户点击“购买”选项并支付网乐基础费用,即视为用户已阅读并同意接受本协议的约束,本协议即构成本公司与用户之间具有约束力的法律文件。<br />
+        欢迎使用大雅乐盟(下称“本公司”)网络管乐基础课(下称“网管课”)服务,本协议为用户购买本公司网管课之事宜订立的协议。请用户在购买和使用网管课服务前仔细阅读本协议。如用户不同意本协议任何条款,请勿购买或使用网管课服务(下称“本服务”)。用户点击“购买”选项并支付网管课费用,即视为用户已阅读并同意接受本协议的约束,本协议即构成本公司与用户之间具有约束力的法律文件。<br />
         未满18周岁的用户应在法定监护人的陪同下阅读后,并且应在法定监护人的同意和指导下购买和使用本服务。
 
 
@@ -85,13 +85,13 @@
         1.2 本公司可以随时更新本协议的各项条款,包括但不限于增加新的服务类型或功能,更新后的协议条款一经本公司公布或更新即生效并代替原来的协议条款,无需另行通知,用户可以及时关注并阅读本协议最新版本;用户继续使用本服务的,视为用户接受本协议的最新更新版本;用户不接受本协议最新版本的,应立即停止使用本服务。
         
         <h2>第二条 课程的购买、授课及退费</h2>
-        2.1 用户购买的课程为在线网络管乐基础课程。每节课的时长为25分钟,每周授课次数为1~2次。具体收费标准、课时、有效期等如下表:
+        2.1 用户购买的课程为网管课。每节课时长为25分钟,用户可自行选择每周授课次数1次或2次。具体收费标准、课时、有效期等如下表:
         <table border="1" style="width: 100%; border-collapse: collapse;">
             <tr>
-                <th>课程类型</th>
-                <th>课时数</th>
-                <th>有效期</th>
-                <th>费用</th>
+                <th style="text-align: center;">课程类型</th>
+                <th style="text-align: center;">课时数</th>
+                <th style="text-align: center;">有效期</th>
+                <th style="text-align: center;">费用</th>
             </tr>
             <tr>
                 <td style="text-align: center;">网管课</td>
@@ -101,12 +101,11 @@
             </tr>
         </table>
         2.2 用户购课后,需在有效期内完成所购全部课程(以课程后台有效期为准)。除本协议另有约定外,若用户未能在课程有效期内上完课程,则课程自动结束,本公司不再提供课程。<br />
-        2.3 课程内容以及授课时间以课程表为准。<br />
-        2.4 为保证良好的学习效果,用户及本公司安排的授课老师均不能随意调整课程表。用户申请调课应当通过管乐迷APP申请,用户和授课老师不得私自约定调课。用户或授课老师要求调整上课时间的,经双方协商一致后,须至少提前1天调整课程,如遇到不可抗力事件、意外等紧急情况须至少提前4小时取消课程。如用户未按照规定申请调课,则按照原课程安排执行课程计划。<br />
-        2.5 用户未能按时上课的,课程将按时开始和结束,用户不得要求延。<br />
+        2.3 网管课课程内容以及授课时间以课程表为准。<br />
+        2.4 为保证良好的学习效果,用户及本公司安排的授课老师均不能随意调整课程表。用户调课均需通过管乐迷APP提出申请,用户和授课老师不得私自约定调课。用户或授课老师要求调整上课时间的,经双方协商一致后,须至少提前1天调整课程,如遇到不可抗力事件、意外等紧急情况须至少提前4小时取消课程。如用户未按照规定申请调课,则按照原课程安排执行课程计划。<br />
+        2.5 用户未能按时上课的,课程将按时开始和结束,用户不得要求延期补课。<br />
         2.6 由于本公司的原因(包括但不限于指导老师未能按时上线、临时无法授课、中途因故终止授课、授课过程中软件系统出现故障持续10分钟等)导致用户无法正常上课的,该次课程不扣除课时。<br />
-        2.7 用户在购买课程前,应当仔细阅读本协议。用户购课后,非因本公司原因,用户所购课程不予退款。<br />
-        2.8 因本公司原因造成退款的,双方按照用户时间上课时长计算费用。用户使用支付宝、微信支付方式缴费,退费收取银行手续费,金额为退费金额的0.6%。退费时,用户须退回本公司已开的发票和收据。
+        2.7 用户在购买课程前,应当仔细阅读本协议。用户购买课程后,非因本公司原因,用户所购课程不予退款。
 
         <h2>第三条 本公司权利和义务</h2>
         3.1 本公司有权根据本协议相关条款获得用户支付的课程费用。<br />
@@ -115,15 +114,15 @@
         3.4 本公司将尽全力保证所提供的各项服务均能够正常使用;但是因不可抗力以及用户一方的原因造成不能正常使用本公司所提供的各项服务,包括但不限于互联网运营商提供的网络中断、用户不具备上网条件(包括不具备软硬件条件或者软硬件故障)等,则本公司不承担相应责任。
 
         <h2>第四条 用户的权利和义务</h2>
-        4.1 用户应具备完全民事权利能力和完全民事行为能力,有能力对用户使用在线课程服务过程中的一切行为独立承担法律责任。如果用户不具备前述条件的,本公司有权要求用户的法定监护人承担相应的法律责任。<br />
-        4.2 用户购买在线乐基础并付费成功后,本公司为用户开通在线乐基础,非本公司原因致使用户购买的课程产生损耗的,由用户自行承担相应责任。<br />
-        4.3 用户应妥善保管账户和密码,用户账号下发生的所有行为均视为用户行为。用户如果用户的账户、密码丢失,应在服务结束前及时联系本公司,并按照本公司要求提供身份认证信息、付款凭证等资料,经本公司确认无误后将恢复用户权益,否则,用户自行承担相应损失及责任。<br />
-        4.4 用户在购买课程后,有权利享受本公司所提供的网乐基础服务。<br />
+        4.1 用户应具备完全民事权利能力和完全民事行为能力,有能力对用户使用课程服务过程中的一切行为独立承担法律责任。如果用户不具备前述条件的,本公司有权要求用户的法定监护人承担相应的法律责任。<br />
+        4.2 用户购买网管课并付费成功后,本公司为用户开通网管课,非本公司原因致使用户购买的课程产生损耗的,由用户自行承担相应责任。<br />
+        4.3 用户应妥善保管账户和密码,用户账号下发生的所有行为均视为用户行为。如果用户的账户、密码丢失,应在服务结束前及时联系本公司,并按照本公司要求提供身份认证信息、付款凭证等资料,经本公司确认无误后将恢复用户权益,否则,用户自行承担相应损失及责任。<br />
+        4.4 用户在购买课程后,有权利享受本公司所提供的网管课服务。<br />
         4.5 用户向本公司提供信息应当合法、真实和有效。<br />
-        4.6 用户应遵守课程安排,按照本协议的约定按时完成全部网乐基础。用户因故需要调整既定上课时间的,须按照本协议约定进行申请;如未按约定申请调课,所产生后果均由用户自行承担。<br />
-        4.7 用户购买的在线网络管乐基础课程,用户只可以自行使用,不得与其他第三方(用户的法定监护人除外)共同参加网乐基础,也不得将自己的账号转让或提供给任何第三方。<br />
+        4.6 用户应遵守课程安排,按照本协议的约定按时完成全部网管课。用户因故需要调整既定上课时间的,须按照本协议约定进行申请;如未按约定申请调课,所产生后果均由用户自行承担。<br />
+        4.7 用户购买的网管课,用户仅允许自用,不得与其他第三方(用户的法定监护人除外)共同参加网管课,也不得将自己的账号转让或提供给任何第三方。<br />
         4.8 用户不得对授课内容录音、录像、直播或者组织多人同时观看,不得将获得的课程资料进行复制、销售、出租或授权给任何第三方。如本公司发现用户存在上述行为的,本公司有权停止对用户提供课程,并有权追究相关法律责任。<br />
-        4.9 用户不得通过非本公司认可的方式或者非法途径获取在线课程服务,给本公司造成损失的,本公司有权追偿。<br />
+        4.9 用户不得通过非本公司认可的方式或者非法途径获取课程服务,给本公司造成损失的,本公司有权追偿。<br />
         4.10 用户在参加课程时,应遵守课堂纪律,尊重他人合法权益。如果用户上课过程中侵犯他人权益、扰乱正常的上课秩序或者发布不当言论的,本公司有权暂停向用户提供课程服务。如用户多次出现前述情形的,本公司有权终止向用户提供课程服务。<br />
         4.11 用户应始终维护本公司的知识产权以及品牌形象,本协议期间以及本协议因任何原因失效、被撤销、解除或终止后,均不得直接或间接通过任何公众媒体(包括但不限于传统大众媒体,以及微信、微博、博客、直播平台等社交平台)发表损害本公司(包括但不限于其产品、服务及本公司授课老师)声誉的言论或实施任何类似行为,否则本公司有权追究用户的法律责任。
         
@@ -139,7 +138,7 @@
         6.2 本保密义务期限不受本协议期限的限制。本协议失效、被撤销、解除或终止等任何情况下,双方仍应遵守本保密义务。
 
         <h2>第七条 违约责任</h2>
-        一方不履行合同义务或者履行合同义务不符合约定的,均构成违约,守约方有权以书面通知的方式要求违约方纠正其违约行为并采取及时、有效的补救措施消除违约后果,并赔偿守约方因违约方之违约行为而遭致的损失。若违约方在收到守约方的上述通知后5日内未纠正其违约行为的,守约方有权在做出书面通知的情况下,单方解除本协议,违约方应赔偿守约方因此遭致的全部损失。
+        一方不履行合同义务或者履行合同义务不符合约定的,均构成违约,守约方有权以书面通知的方式要求违约方纠正其违约行为并采取及时、有效的补救措施消除违约后果,并赔偿守约方因违约方之违约行为而遭致的损失。若违约方在收到守约方的上述通知后5日内未纠正其违约行为的,守约方有权在做出书面通知的情况下,单方解除本协议,违约方应赔偿守约方因此遭致的全部损失。
 
         <h2>第八条 不可抗力</h2>
         8.1 一方遇到不可抗力事件(指甲乙双方无法控制、无法预见或即使预见也无法避免的事件,该事件妨碍、影响或延误任何一方履行本协议的全部或部分义务,该事件包括但不限于自然灾害(如水灾、地震等)、火灾、政府行为、法律或政策变化、战争或其他任何类似事件)时,受影响方应当立即书面通知对方,并告知该不可抗力事件对本协议可能产生的影响,并在该不可抗力事件发生后5日内向对方提供该事件的详细信息及由有关机构出具的解释受影响方因此无法履行本协议项下全部或部分义务的相关证明。<br />

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

@@ -88,7 +88,7 @@
 
 	<!-- 分页查询 -->
 	<select id="queryPage" resultMap="AppVersionInfo" parameterType="map">
-		SELECT * FROM app_version_info ORDER BY id_
+		SELECT * FROM app_version_info ORDER BY id_ DESC
 		<include refid="global.limit" />
 	</select>
 

+ 3 - 1
mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml

@@ -736,6 +736,7 @@
         <result column="offline_classes_num_" property="offLineClassesNum"/>
         <result column="teacher_school_id_" property="teacherSchoolId"/>
         <result column="class_mode_" property="classMode"/>
+        <result column="practice_type_" property="practiceType"/>
         <result column="payment_status_" property="paymentStatus"
                 typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
     </resultMap>
@@ -766,7 +767,8 @@
     <select id="queryStudentPracticeCourses" resultMap="CourseListDto">
         SELECT cg.id_ class_group_id_,pg.name_ music_group_name_,su.real_name_,
         cg.current_class_times_,cg.total_class_times_,pg.single_class_minutes_,
-        pg.id_ practice_id_,cg.type_,1 class_mode_
+        pg.id_ practice_id_,cg.type_,1 class_mode_,
+        IF(pg.buy_months_ IS NULL,0,1) practice_type_
         FROM practice_group pg
         LEFT JOIN class_group cg ON cg.music_group_id_ = pg.id_
         LEFT JOIN sys_user su ON pg.user_id_ = su.id_

+ 48 - 21
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -529,7 +529,7 @@
             LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cs.id_  AND sa.user_id_=#{studentId}
         WHERE
         (cs.del_flag_ != 1 OR cs.del_flag_ IS NULL)
-        AND cs.is_lock_=0
+        AND (cs.is_lock_=0 OR cs.is_lock_ IS NULL)
         AND cs.class_date_ = DATE_FORMAT(#{classDate},'%Y%m%d')
         AND cssp.user_id_ = #{studentId}
         <if test="quitClassGroupIds != null and quitClassGroupIds.size()>0">
@@ -570,7 +570,7 @@
             LEFT JOIN teacher_attendance ta ON cs.id_=ta.course_schedule_id_ AND ta.teacher_id_=#{teacherId}
         WHERE
         (cs.del_flag_ != 1 OR cs.del_flag_ IS NULL)
-        AND cs.is_lock_=0
+        AND (cs.is_lock_=0 OR cs.is_lock_ IS NULL)
         AND cs.class_date_ = DATE_FORMAT(#{classDate},'%Y%m%d')
         <if test="type!=null and type!=''">
             AND cs.type_=#{type}
@@ -738,6 +738,7 @@
         LEFT JOIN course_schedule cs ON cssp.course_schedule_id_=cs.id_
         WHERE
         (cs.del_flag_ != 1 OR cs.del_flag_ IS NULL)
+        AND (cs.is_lock_=0 OR cs.is_lock_ IS NULL)
         AND cssp.user_id_ = #{studentId}
         <if test="month==null">
             AND DATE_FORMAT( NOW(), '%Y%m' ) = DATE_FORMAT( cs.class_date_, '%Y%m' )
@@ -761,6 +762,7 @@
             LEFT JOIN class_group cg ON cs.class_group_id_ = cg.id_
         WHERE
           (cs.del_flag_ != 1 OR cs.del_flag_ IS NULL)
+          AND (cs.is_lock_=0 OR cs.is_lock_ IS NULL)
           AND csts.user_id_ = #{teacherId}
           AND cg.del_flag_ = 0
         <if test="month==null">
@@ -2229,9 +2231,11 @@
           course_schedule_student_payment cssp
           LEFT JOIN course_schedule cs ON cs.id_=cssp.course_schedule_id_
           LEFT JOIN sys_user su ON cs.actual_teacher_id_=su.id_
+          LEFT JOIN practice_group pg ON pg.id_=cssp.music_group_id_
         WHERE cs.group_type_='PRACTICE'
           AND cssp.user_id_=#{userId}
           AND cssp.expect_price_=0
+          AND pg.buy_months_ IS NULL
     </select>
     <select id="findTeacherCoursesWithIncludeDateRange" resultMap="CourseSchedule" useCache="false" flushCache="true">
         SELECT
@@ -2326,26 +2330,49 @@
     </select>
     <select id="findUserCourses" resultMap="CourseSchedule">
         SELECT
-            cs.id_,
-            cs.`type_`,
-            cgtm.`user_id_` teacher_id_
-        FROM
-          `class_group_student_mapper` cgsm
-            LEFT JOIN `class_group` cg ON cgsm.`class_group_id_` = cg.`id_`
-            LEFT JOIN `class_group_teacher_mapper` cgtm ON cgtm.`class_group_id_` = cg.`id_`
-            AND cgtm.`teacher_role_` = 'BISHOP'
-            LEFT JOIN `course_schedule` cs ON cs.`class_group_id_` = cg.`id_`
+        cs.id_,
+        cs.`type_`,
+        cgtm.`user_id_` teacher_id_
+        FROM
+        `class_group_student_mapper` cgsm
+        LEFT JOIN `class_group` cg ON cgsm.`class_group_id_` = cg.`id_`
+        LEFT JOIN `class_group_teacher_mapper` cgtm ON cgtm.`class_group_id_` = cg.`id_`
+        AND cgtm.`teacher_role_` = 'BISHOP'
+        LEFT JOIN `course_schedule` cs ON cs.`class_group_id_` = cg.`id_`
         WHERE
-            cgsm.user_id_=#{userId}
-            AND cgtm.teacher_role_='BISHOP'
-            AND cgsm.status_ = 'NORMAL'
-            AND cg.`type_` IN ( 'NORMAL', 'HIGH', 'VIP' )
-            AND cs.`id_` IS NOT NULL
-            AND cgtm.user_id_ IN
-            <foreach collection="teacherIds" item="teacherId" open="(" close=")" separator=",">
-                #{teacherId}
-            </foreach>
-            AND ( cs.del_flag_ != 1 OR cs.del_flag_ IS NULL )
+        cgsm.user_id_=#{userId}
+        AND cgtm.teacher_role_='BISHOP'
+        AND cgsm.status_ = 'NORMAL'
+        AND cg.`type_` IN ( 'NORMAL', 'HIGH', 'VIP' )
+        AND cs.`id_` IS NOT NULL
+        AND cgtm.user_id_ IN
+        <foreach collection="teacherIds" item="teacherId" open="(" close=")" separator=",">
+            #{teacherId}
+        </foreach>
+        AND ( cs.del_flag_ != 1 OR cs.del_flag_ IS NULL )
+    </select>
+    <select id="findUserCourses2" resultMap="CourseSchedule">
+        SELECT
+        cs.id_,
+        cs.`type_`,
+        cgtm.`user_id_` teacher_id_
+        FROM
+        `class_group_student_mapper` cgsm
+        LEFT JOIN `class_group` cg ON cgsm.`class_group_id_` = cg.`id_`
+        LEFT JOIN `class_group_teacher_mapper` cgtm ON cgtm.`class_group_id_` = cg.`id_`
+        AND cgtm.`teacher_role_` = 'BISHOP'
+        LEFT JOIN `course_schedule` cs ON cs.`class_group_id_` = cg.`id_`
+        WHERE
+        cgsm.user_id_=#{userId}
+        AND cgtm.teacher_role_='BISHOP'
+        AND cgsm.status_ = 'NORMAL'
+        AND cg.`type_` IN ( 'PRACTICE', 'NORMAL', 'HIGH', 'VIP' )
+        AND cs.`id_` IS NOT NULL
+        AND cgtm.user_id_ IN
+        <foreach collection="teacherIds" item="teacherId" open="(" close=")" separator=",">
+            #{teacherId}
+        </foreach>
+        AND ( cs.del_flag_ != 1 OR cs.del_flag_ IS NULL )
     </select>
     <select id="findUserCoursesWithPay" resultMap="CourseSchedule">
         SELECT

+ 50 - 0
mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml

@@ -482,4 +482,54 @@
 		GROUP BY
 			user_id_
 	</select>
+	<resultMap id="ExportTeacherSalaryDtoMap" type="com.ym.mec.biz.dal.dto.ExportTeacherSalaryDto">
+		<result property="signOutTime" column="signOutTime"/>
+		<result property="signInTime" column="signInTime"/>
+		<result property="teacherName" column="teacherName"/>
+		<result property="groupName" column="groupName"/>
+		<result property="studentNum" column="studentNum"/>
+		<result property="teacherId" column="teacherId"/>
+		<result property="activeName" column="activeName"/>
+		<result property="courseScheduleType" column="courseScheduleType"/>
+		<result property="signOutStatus" column="signOutStatus"/>
+		<result property="signInStatus" column="signInStatus"/>
+		<result property="teacherRole" column="teacherRole"/>
+		<result property="classDate" column="classDate"/>
+		<result property="teachMode" column="teachMode"/>
+		<result property="courseScheduleId" column="courseScheduleId"/>
+		<result property="jobType" column="jobType"/>
+		<result property="address" column="address"/>
+		<result property="price" column="price"/>
+		<result property="changeType" column="changeType"/>
+		<result property="courseScheduleOrganName" column="courseScheduleOrganName"/>
+		<result property="courseScheduleStartTime" column="courseScheduleStartTime"/>
+		<result property="courseScheduleEndTime" column="courseScheduleEndTime"/>
+		<result property="signCourseScheduleTime" column="signCourseScheduleTime"/>
+		<result property="teacherOrganName" column="teacherOrganName"/>
+ 	</resultMap>
+    <select id="exportTeacherSalary" resultType="com.ym.mec.biz.dal.dto.ExportTeacherSalaryDto">
+		SELECT cs.`id_` courseScheduleId ,mg.name_ groupName,ct.name_ changeType,u.real_name_ teacherName,o.name_ teacherOrganName,
+		CASE WHEN t.job_nature_ = 'PART_TIME' THEN '兼职' WHEN t.job_nature_ = 'FULL_TIME' THEN '全职' ELSE '零时工' END jobType,
+		CASE WHEN cs.type_ = 'SINGLE' THEN '单技课' WHEN cs.type_ = 'MIX' THEN '合奏课' WHEN cs.type_ = 'HIGH' THEN '小班课'  WHEN cs.type_ = 'VIP' THEN 'vip课'
+		WHEN cs.type_ = 'DEMO' THEN '试听课'  WHEN cs.type_ = 'COMPREHENSIVE' THEN '综合课'  WHEN cs.type_ = 'PRACTICE' THEN '练习课'  WHEN cs.type_ = 'ENLIGHTENMENT' THEN '启蒙课'
+		WHEN cs.type_ = 'TRAINING_SINGLE' THEN '集训单技课'  WHEN cs.type_ = 'TRAINING_MIX' THEN '集训合奏课'  ELSE '课堂课' END courseScheduleType,
+		cs.class_date_ classDate,cs.start_class_time_ courseScheduleStartTime,cs.end_class_time_ courseScheduleEndTime,ts.expect_salary_ price,s.name_ address,
+		CASE WHEN ts.teacher_role_ = 'TEACHING' THEN '助教' ELSE '主教' END teacherRole,
+		CASE WHEN ta.sign_in_status_ = 0 THEN '异常' WHEN ta.sign_in_status_ = 1 THEN '正常' END signInStatus,
+		CASE WHEN ta.sign_out_status_=0 THEN '异常' WHEN ta.sign_out_status_ = 1 THEN '正常' END signOutStatus,
+		ta.sign_in_time_ signInTime,ta.sign_out_time_ signOutTime,COUNT(sp.id_) studentNum
+		FROM course_schedule_teacher_salary ts
+		LEFT JOIN course_schedule cs ON ts.course_schedule_id_ = cs.id_
+		LEFT JOIN `teacher_attendance` ta ON ta.`teacher_id_` = ts.`user_id_` AND ta.`course_schedule_id_` = ts.`course_schedule_id_`
+		LEFT JOIN class_group cg ON cs.class_group_id_ = cg.id_
+		LEFT JOIN sys_user u ON ts.user_id_= u.id_
+		LEFT JOIN teacher t ON t.id_ = ts.user_id_
+		LEFT JOIN organization o ON o.id_ = t.organ_id_
+		LEFT JOIN school s ON s.id_ = cs.schoole_id_
+		LEFT JOIN course_schedule_student_payment sp ON sp.course_schedule_id_ = ts.course_schedule_id_
+		LEFT JOIN music_group mg ON (mg.id_ = ts.music_group_id_ AND ts.group_type_ = 'MUSIC')
+		LEFT JOIN charge_type ct ON ct.id_ = mg.charge_type_id_
+		WHERE cs.class_date_ BETWEEN '2020-01-01' AND '2020-01-31' AND (cs.`del_flag_` != 1 OR cs.`del_flag_` IS NULL ) AND cs.group_type_ = 'MUSIC'
+		GROUP BY ts.course_schedule_id_,ts.`user_id_`
+	</select>
 </mapper>

+ 1 - 0
mec-biz/src/main/resources/config/mybatis/PracticeGroupMapper.xml

@@ -136,6 +136,7 @@
 		WHERE
 			student_id_=#{userId}
 			AND pg.group_status_!='FINISH'
+			AND pg.buy_months_ IS NOT NULL
 	</select>
 	<select id="findUserPracticeGroup" resultMap="PracticeGroup">
 		SELECT * FROM practice_group WHERE student_id_=#{userId} AND id_=#{groupId};

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

@@ -799,7 +799,7 @@
     </select>
     <select id="queryTeacherImModel" resultMap="com.ym.mec.biz.dal.dao.MusicGroupDao.ImUserModel">
         SELECT su.id_,su.avatar_,
-        CASE WHEN su.username_ IS NULL THEN su.real_name_ ELSE su.username_ END username_
+        CASE WHEN su.username_ IS NULL THEN su.real_name_ END username_
         FROM sys_user su
         WHERE su.id_ IN
         <foreach collection="teacherIds" item="userId" open="(" close=")" separator=",">

+ 1 - 1
mec-student/src/main/java/com/ym/mec/student/controller/PracticeGroupController.java

@@ -172,7 +172,7 @@ public class PracticeGroupController extends BaseController {
         if (sysUser == null) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
-        return succeed(practiceGroupService.repay(sysUser.getId(),groupId));
+        return practiceGroupService.repay(sysUser.getId(),groupId);
     }
 
 }

+ 6 - 0
mec-web/src/main/java/com/ym/mec/web/controller/AppVersionInfoController.java

@@ -10,6 +10,7 @@ import java.util.List;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.MediaType;
+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;
@@ -30,11 +31,13 @@ public class AppVersionInfoController extends BaseController {
 
 	@ApiOperation("分页查询")
 	@GetMapping(value = "/list")
+	@PreAuthorize("@pcs.hasPermissions('appVersionInfo/list')")
 	public Object getList(QueryInfo queryInfo) {
 		return succeed(appVersionInfoService.queryPage(queryInfo));
 	}
 
 	@ApiOperation("根据app客户端查询对象")
+	@PreAuthorize("@pcs.hasPermissions('appVersionInfo/queryByPlatform')")
 	@ApiImplicitParam(name = "platform", value = "平台名称", required = true, dataType = "String", paramType = "path")
 	@GetMapping(value = "/queryByPlatform")
 	public Object queryByPlatform(String platform) {
@@ -48,6 +51,7 @@ public class AppVersionInfoController extends BaseController {
 	@ApiOperation("单查询")
 	@ApiImplicitParam(name = "id", value = "ID编号", required = true, dataType = "Integer", paramType = "path")
 	@GetMapping(value = "/query")
+	@PreAuthorize("@pcs.hasPermissions('appVersionInfo/query')")
 	public Object query(Integer id) {
 
 		return succeed(appVersionInfoService.get(id));
@@ -55,6 +59,7 @@ public class AppVersionInfoController extends BaseController {
 
 	@ApiOperation("新增")
 	@PostMapping(value = "/add", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+	@PreAuthorize("@pcs.hasPermissions('appVersionInfo/add')")
 	public Object add(AppVersionInfo appVersionInfo) {
 		Date date = new Date();
 		appVersionInfo.setCreateTime(date);
@@ -69,6 +74,7 @@ public class AppVersionInfoController extends BaseController {
 
 	@ApiOperation("更新")
 	@PostMapping(value = "/update", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+	@PreAuthorize("@pcs.hasPermissions('appVersionInfo/update')")
 	public Object update(AppVersionInfo appVersionInfo) {
 		Date date = new Date();
 		appVersionInfo.setUpdateTime(date);

+ 29 - 1
mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

@@ -67,8 +67,36 @@ public class ExportController extends BaseController {
     @Autowired
     private SporadicChargeInfoService sporadicChargeInfoService;
 
+    @ApiOperation(value = "导出老师课酬")
+    @PostMapping("export/teacherSalary")
+    @PreAuthorize("@pcs.hasPermissions('export/teacherSalary')")
+    public void teacherSalary(HttpServletResponse response, ExportTeacherSalaryQueryInfo queryInfo) {
+        queryInfo.setRows(99999);
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("用户信息获取失败");
+        }
+        queryInfo.setIsExport(true);
+        List<ExportTeacherSalaryDto> rows = courseScheduleTeacherSalaryService.exportTeacherSalary(queryInfo).getRows();
+        try {
+            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部", "学员编号", "学员姓名", "性别", "家长姓名",
+                    "家长联系电话", "是否激活", "是否有课", "是否预约陪练课","是否有陪练课", "课程余额(元)",
+                    "所在乐团", "乐团所属声部", "所在乐团状态", "所在vip课", "所在VIP状态"}, new String[]{
+                    "organName", "userId", "username", "gender.description", "parentsName", "parentsPhone",
+                    "isActive.msg","hasCourse.msg","isMake.msg","hasPracticeCourse.msg","courseBalance","musicGroupName",
+                    "subjectName","musicGroupStatus","vipGroupName","vipGroupStatus"}, rows);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=lender-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            workbook.write(response.getOutputStream());
+            workbook.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
 
-    @ApiOperation(value = "导出学员是否有课")
+
+    @ApiOperation(value = "导出学员列表")
     @PostMapping("export/studentHasCourse")
     @PreAuthorize("@pcs.hasPermissions('export/studentHasCourse')")
     public void studentHasCourse(HttpServletResponse response, StudentManageQueryInfo queryInfo) {