Просмотр исходного кода

Merge branch 'master' of http://git.dayaedu.com/yonge/mec

# Conflicts:
#	mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
#	mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
zouxuan 5 лет назад
Родитель
Сommit
95b4f54d58
31 измененных файлов с 730 добавлено и 278 удалено
  1. 48 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  2. 6 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupSubjectGoodsGroupDao.java
  3. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/VipGroupDefaultClassesUnitPriceDao.java
  4. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleDto.java
  5. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/CourseScheduleQueryInfo.java
  6. 4 2
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupSubjectGoodsGroupService.java
  7. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java
  8. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/service/VipGroupService.java
  9. 10 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java
  10. 96 38
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  11. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  12. 113 77
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  13. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupSubjectGoodsGroupServiceImpl.java
  14. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupSubjectPlanServiceImpl.java
  15. 2 10
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java
  16. 11 13
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  17. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupDefaultClassesUnitPriceServiceImpl.java
  18. 208 68
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  19. 77 21
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  20. 4 7
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  21. 4 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupSubjectGoodsGroupMapper.xml
  22. 2 2
      mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml
  23. 3 1
      mec-biz/src/main/resources/config/mybatis/VipGroupMapper.xml
  24. 21 0
      mec-student/src/main/resources/logback-spring.xml
  25. 1 2
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherLeaveRecordController.java
  26. 21 0
      mec-teacher/src/main/resources/logback-spring.xml
  27. 6 6
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/message/MessageSenderPluginContext.java
  28. 5 11
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/message/provider/JiguangPushPlugin.java
  29. 16 0
      mec-util/src/main/java/com/ym/mec/util/date/DateUtil.java
  30. 5 7
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  31. 21 0
      mec-web/src/main/resources/logback-spring.xml

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

@@ -827,6 +827,21 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
                                                          @Param("userId") Integer userId);
 
     /**
+     * @describe 获取学生的课程信息
+     * @author Joburgess
+     * @date 2020/1/15
+     * @param groupType: 团体类型
+     * @param groupId: 团体编号
+     * @param userId: 用户编号
+     * @param type: 查询类型:不传查全部,'history'已消耗的,'surplus'剩余的
+     * @return java.util.List<com.ym.mec.biz.dal.dto.StudentCourseInfoDto>
+     */
+    List<StudentCourseInfoDto> findUserCourseInfos(@Param("groupType") GroupType groupType,
+                                                   @Param("groupId") String groupId,
+                                                   @Param("userId") Integer userId,
+                                                   @Param("type") String type);
+
+    /**
      * @describe 获取指定乐团下课程开始时间
      * @author Joburgess
      * @date 2019/12/19
@@ -964,4 +979,37 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @return java.util.List<java.lang.Integer>
      */
     List<Integer> findCourseIdsByTeacher(String search);
+
+    /**
+     * @describe 统计团体下的总课次
+     * @author Joburgess
+     * @date 2020/1/16
+     * @param groupType:
+     * @param groupId:
+     * @return int
+     */
+    int countGroupAllCourses(@Param("groupType") GroupType groupType,
+                             @Param("groupId") String groupId);
+
+    /**
+     * @describe 获取乐团开课时间
+     * @author Joburgess
+     * @date 2020/1/16
+     * @param groupType:
+     * @param groupId:
+     * @return java.util.Date
+     */
+    Date findGroupCourseStartTime(@Param("groupType") GroupType groupType,
+                                  @Param("groupId") String groupId);
+
+    /**
+     * @describe 获取乐团课程结束时间
+     * @author Joburgess
+     * @date 2020/1/16
+     * @param groupType:
+     * @param groupId:
+     * @return java.util.Date
+     */
+    Date findGroupCourseEndTime(@Param("groupType") GroupType groupType,
+                                  @Param("groupId") String groupId);
 }

+ 6 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupSubjectGoodsGroupDao.java

@@ -1,10 +1,11 @@
 package com.ym.mec.biz.dal.dao;
 
-import com.ym.mec.biz.dal.entity.MusicGroupSubjectGoodsGroup;
-import com.ym.mec.common.dal.BaseDAO;
+import java.util.List;
+
 import org.apache.ibatis.annotations.Param;
 
-import java.util.List;
+import com.ym.mec.biz.dal.entity.MusicGroupSubjectGoodsGroup;
+import com.ym.mec.common.dal.BaseDAO;
 
 public interface MusicGroupSubjectGoodsGroupDao extends BaseDAO<Long, MusicGroupSubjectGoodsGroup> {
 
@@ -37,4 +38,6 @@ public interface MusicGroupSubjectGoodsGroupDao extends BaseDAO<Long, MusicGroup
      * @return
      */
     int delByMusicGroupId(String musicGroupId);
+    
+    MusicGroupSubjectGoodsGroup query(@Param("musicGroupId")String musicGroupId,@Param("subjectId")Integer subjectId,@Param("goodsIdList") String goodsIdList);
 }

+ 2 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/VipGroupDefaultClassesUnitPriceDao.java

@@ -23,11 +23,11 @@ public interface VipGroupDefaultClassesUnitPriceDao extends BaseDAO<Integer, Vip
      * @describe 根据vip课类型获取课时收费设置
      */
     VipGroupDefaultClassesUnitPrice getByVipGroupCategory(@Param("vipGroupCategoryId") Long vipGroupCategoryId,
-                                                          @Param("organId") Long organId);
+                                                          @Param("organId") Integer organId);
 
 
     int updateByVipGroupCategory(VipGroupDefaultClassesUnitPrice vipGroupDefaultClassesUnitPrice);
 
     List<VipGroupDefaultClassesUnitPrice> findAllByOrgan(Long organId);
 
-}
+}

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleDto.java

@@ -47,12 +47,22 @@ public class CourseScheduleDto extends CourseSchedule {
 
     private String subjectName;
 
+    private String groupName;
+
     @ApiModelProperty(value = "是否是第一次进行学生点名")
     private int studentAttendanceIsFirstTime;
 
     @ApiModelProperty(value = "能否进行调整")
     private int enableAdjustInToday;
 
+    public String getGroupName() {
+        return groupName;
+    }
+
+    public void setGroupName(String groupName) {
+        this.groupName = groupName;
+    }
+
     public Integer getExpectStudentNum() {
         return expectStudentNum;
     }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/CourseScheduleQueryInfo.java

@@ -17,6 +17,9 @@ public class CourseScheduleQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "上课日期")
     private Date date;
 
+    @ApiModelProperty(value = "乐团编号")
+    private String musicGroupId;
+
     @ApiModelProperty(value = "班级编号")
     private Long classGroupId;
 
@@ -29,6 +32,14 @@ public class CourseScheduleQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "课程类型")
     private String type;
 
+    public String getMusicGroupId() {
+        return musicGroupId;
+    }
+
+    public void setMusicGroupId(String musicGroupId) {
+        this.musicGroupId = musicGroupId;
+    }
+
     public String getType() {
         return type;
     }

+ 4 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupSubjectGoodsGroupService.java

@@ -1,10 +1,10 @@
 package com.ym.mec.biz.service;
 
+import java.util.List;
+
 import com.ym.mec.biz.dal.entity.MusicGroupSubjectGoodsGroup;
 import com.ym.mec.common.service.BaseService;
 
-import java.util.List;
-
 public interface MusicGroupSubjectGoodsGroupService extends BaseService<Long, MusicGroupSubjectGoodsGroup> {
 
     /**
@@ -23,4 +23,6 @@ public interface MusicGroupSubjectGoodsGroupService extends BaseService<Long, Mu
      */
     List<MusicGroupSubjectGoodsGroup> findGoodsGroupByIds(String ids);
 
+    
+    MusicGroupSubjectGoodsGroup query(String musicGroupId,Integer subjectId, String goodsIdList);
 }

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

@@ -64,6 +64,8 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
 
     String MUSIC_GROUP_SETTLEMENT_CLASS_MINUTES = "music_group_settlement_class_minutes";
 
+    String MUSIC_GROUP_SETTLEMENT_DAY = "music_group_settlement_day";
+
     String MUSIC_GROUP_SETTLEMENT_SINGLE_CLASS_MINUTES = "music_group_settlement_single_class_minutes";
 
     String REFUND_PERIOD = "refund_period";

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

@@ -24,6 +24,15 @@ public interface VipGroupService extends BaseService<Long, VipGroup> {
     void createVipGroup(VipGroupApplyDto vipGroup);
 
     /**
+     * @describe 检测vip课程是否超过范围
+     * @author Joburgess
+     * @date 2020/1/16
+     * @param vipGroupId: 小课编号
+     * @return void
+     */
+    void checkVipCourseIsInScore(Long vipGroupId);
+
+    /**
      * @describe 更新vip课程信息
      * @author Joburgess
      * @date 2019/10/30

+ 10 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java

@@ -29,6 +29,7 @@ import com.ym.mec.biz.dal.entity.Goods;
 import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
+import com.ym.mec.biz.dal.entity.MusicGroupSubjectGoodsGroup;
 import com.ym.mec.biz.dal.entity.MusicGroupSubjectPlan;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail;
@@ -44,6 +45,7 @@ import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
 import com.ym.mec.biz.service.ContractService;
 import com.ym.mec.biz.service.GoodsService;
 import com.ym.mec.biz.service.MusicGroupService;
+import com.ym.mec.biz.service.MusicGroupSubjectGoodsGroupService;
 import com.ym.mec.biz.service.MusicGroupSubjectPlanService;
 import com.ym.mec.biz.service.StudentPaymentOrderService;
 import com.ym.mec.biz.service.StudentRegistrationService;
@@ -79,6 +81,9 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 
 	@Autowired
 	private MusicGroupSubjectPlanService musicGroupSubjectPlanService;
+	
+	@Autowired
+	private MusicGroupSubjectGoodsGroupService musicGroupSubjectGoodsGroupService;
 
 	@Autowired
 	private MusicGroupPaymentCalenderDao musicGroupPaymentCalenderDao;
@@ -126,9 +131,9 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 			String organCode = organ.getKey();
 			String orgName = organ.getValue();
 
-//			SysUserTsign sysUserTsign = sysUserTsignService.queryByCardNo(organCode);
+			SysUserTsign sysUserTsign = sysUserTsignService.queryByCardNo(organCode);
 
-			/*if (sysUserTsign == null) {
+			if (sysUserTsign == null) {
 
 				String accountId = eSealPlugin.createOrganAccount(orgName, organCode);
 
@@ -146,7 +151,7 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 
 				sysUserTsignService.insert(sysUserTsign);
 
-			}*/
+			}
 		}
 	}
 
@@ -638,7 +643,7 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 			StudentPaymentOrder studentPaymentOrder = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, musicGroupId, DealStatusEnum.SUCCESS);
 
 			if (studentPaymentOrder == null) {
-				MusicGroupSubjectPlan musicGroupSubjectPlan = musicGroupSubjectPlanService.findSubjectPlan(musicGroupId, subjectId);
+				MusicGroupSubjectGoodsGroup musicGroupSubjectPlan = musicGroupSubjectGoodsGroupService.query(musicGroupId, subjectId, goodsIds);
 				if (musicGroupSubjectPlan != null) {
 					depositFee = musicGroupSubjectPlan.getDepositFee().doubleValue();
 				}
@@ -743,7 +748,7 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 					.findMusicGroupApplyOrderByStatus(userId, musicGroupId, DealStatusEnum.WAIT_PAY);
 
 			if (studentPaymentOrder == null) {
-				MusicGroupSubjectPlan musicGroupSubjectPlan = musicGroupSubjectPlanService.findSubjectPlan(musicGroupId, subjectId);
+				MusicGroupSubjectGoodsGroup musicGroupSubjectPlan = musicGroupSubjectGoodsGroupService.query(musicGroupId, subjectId, goodsIds);
 				if (musicGroupSubjectPlan != null) {
 					depositFee = musicGroupSubjectPlan.getDepositFee().doubleValue();
 				}

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

@@ -22,7 +22,9 @@ import com.ym.mec.jiari.JiaRiFeignService;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext.MessageSender;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
+
 import feign.codec.DecodeException;
+
 import org.apache.commons.collections.ListUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -361,6 +363,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             return pageInfo;
         }
 
+
         List<CourseScheduleDto> dataList = null;
         int count = courseScheduleDao.countCourseSchedulesWithDate(params);
         if (count > 0) {
@@ -371,9 +374,24 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             List<Map<Integer, Integer>> courseStudentNumMaps = courseScheduleStudentPaymentDao.countCourseStudentNum(allCourseScheduleIds);
             Map<Long, Long> courseStudentNumMap = MapUtil.convertIntegerMap(courseStudentNumMaps);
 
+            List<Group> groupsT=new ArrayList<>();
+            groupsT.add(null);
+            List<Integer> teacherIds=new ArrayList<>();
+            for (CourseScheduleDto courseScheduleEndDto : dataList) {
+                Group group=new Group(courseScheduleEndDto.getMusicGroupId(),courseScheduleEndDto.getGroupType());
+                groupsT.add(group);
+                teacherIds.add(courseScheduleEndDto.getActualTeacherId());
+            }
+            groupsT = groupDao.findByGroupIds(groupsT);
+            Map<String, Group> idGroupMap = groupsT.stream().collect(Collectors.toMap(Group::getId, group -> group));
+
             for (int i=0;i<dataList.size();i++) {
                 Long studentNum=courseStudentNumMap.get(dataList.get(i).getId());
                 dataList.get(i).setTotalStudentNum(Objects.isNull(studentNum)?0:studentNum.intValue());
+                Group group = idGroupMap.get(dataList.get(i).getMusicGroupId());
+                if(Objects.nonNull(group)){
+                    dataList.get(i).setGroupName(group.getGroupName());
+                }
             }
         }
         if (count == 0) {
@@ -714,7 +732,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
                 .stream()
                 .collect(Collectors.groupingBy(ClassGroupStudentMapper::getClassGroupId));
 
-        Map<Long, List<CourseScheduleStudentPayment>> exitStudentPaymentMap = exitStudentPaymentList.stream().collect(Collectors.groupingBy(CourseScheduleStudentPayment::getId));
+        Map<Long, List<CourseScheduleStudentPayment>> exitStudentPaymentMap = exitStudentPaymentList.stream().collect(Collectors.groupingBy(CourseScheduleStudentPayment::getCourseScheduleId));
 
         //根据课程获取教师id关联集合
         List<IntegerAndIntegerListDto> courseScheduleTeachingTeacherIdList = new ArrayList<>();
@@ -1133,6 +1151,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         checkNewCourseSchedules(courseSchedules, false);
         courseScheduleDao.batchUpdate(courseSchedules);
         classGroupService.updateClassGroupInfo(classGroup.getId());
+        vipGroupService.checkVipCourseIsInScore(vipGroupCourseAdjustInfo.getVipGroupId().longValue());
 //        courseScheduleStudentPaymentService.updateVipGiveCourse(vipGroup.getId());
     }
 
@@ -1306,6 +1325,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         vipGroupApplyDto.setSingleClassPrice(vipGroupCourseAdjustInfo.getSingleClassPrice());
         vipGroupService.appendVipGroupCourseSchedules(vipGroupApplyDto);
         classGroupService.updateClassGroupInfo(classGroup.getId());
+        vipGroupService.checkVipCourseIsInScore(vipGroupCourseAdjustInfo.getVipGroupId().longValue());
     }
 
     @Override
@@ -1398,6 +1418,10 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         checkNewCourseSchedules(newCourseSchedules, false);
         //课程调整
         classStartDateAdjust(newCourseSchedules);
+
+        if (!CollectionUtils.isEmpty(oldCourseScheduleIds)&&oldCourseScheduleIds.get(0).getGroupType().equals(GroupType.VIP)){
+            vipGroupService.checkVipCourseIsInScore(Long.valueOf(oldCourseScheduleIds.get(0).getMusicGroupId()));
+        }
     }
 
     @Override
@@ -1448,7 +1472,6 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             if (!sysUser.getUserType().contains("SYSTEM") && sysUser.getUserType().contains("TEACHER")) {
                 Long normalStudentNum = classGroupStudentNumMap.get(oldCourseSchedule.getClassGroupId());
                 Long courseLeaveStudentNum = courseLeaveStudentNumMap.get(newCourseSchedule.getId());
-//                ClassGroup classGroup=idClassGroupMap.get(oldCourseSchedule.getClassGroupId());
                 if(oldCourseSchedule.getGroupType().equals(GroupType.VIP)
                         &&Objects.nonNull(courseLeaveStudentNum)
                         &&Objects.nonNull(normalStudentNum)
@@ -1555,24 +1578,29 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
                 }
                 //修改后的课程助教编号列表
                 List<Integer> newTeachingTeacherIdList = newCourseSchedule.getTeachingTeacherIdList();
-                List<Integer> newCreateSalaryTeachingTeacherIds = null;
-                if(!CollectionUtils.isEmpty(newTeachingTeacherIdList)){
-                    //找出重复的助教编号
-                    List<Integer> foundInCurrentCourseTeachingTeacherIds = newTeachingTeacherIdList.stream().filter(currentCourseTeachingTeacherIds::contains).collect(Collectors.toList());
-
-                    //需要重新生成课酬的助教列表
-                    newCreateSalaryTeachingTeacherIds = newTeachingTeacherIdList.stream()
-                            .filter(userId -> !foundInCurrentCourseTeachingTeacherIds.contains(userId))
-                            .collect(Collectors.toList());
-                    //被替换的助教列表
-                    List<Integer> beReplaceTeachingTeacherIds = currentCourseTeachingTeacherIds.stream()
-                            .filter(userId -> !foundInCurrentCourseTeachingTeacherIds.contains(userId))
-                            .collect(Collectors.toList());
-                    beReplaceTeacherIds.addAll(beReplaceTeachingTeacherIds);
 
-                    newCourseSchedule.setTeachingTeacherIdList(newCreateSalaryTeachingTeacherIds);
+                if(Objects.isNull(newTeachingTeacherIdList)){
+                    newTeachingTeacherIdList=new ArrayList<>();
                 }
 
+                List<Integer> newCreateSalaryTeachingTeacherIds;
+
+                //找出重复的助教编号
+                List<Integer> foundInCurrentCourseTeachingTeacherIds = newTeachingTeacherIdList.stream().filter(currentCourseTeachingTeacherIds::contains).collect(Collectors.toList());
+
+                //需要重新生成课酬的助教列表
+                newCreateSalaryTeachingTeacherIds = newTeachingTeacherIdList.stream()
+                        .filter(userId -> !foundInCurrentCourseTeachingTeacherIds.contains(userId))
+                        .collect(Collectors.toList());
+                //被替换的助教列表
+                List<Integer> beReplaceTeachingTeacherIds = currentCourseTeachingTeacherIds.stream()
+                        .filter(userId -> !foundInCurrentCourseTeachingTeacherIds.contains(userId))
+                        .collect(Collectors.toList());
+                beReplaceTeacherIds.addAll(beReplaceTeachingTeacherIds);
+
+                newCourseSchedule.setTeachingTeacherIdList(newCreateSalaryTeachingTeacherIds);
+
+
                 if (!newCourseSchedule.isBishopTeacherSalaryNotCreate() || !CollectionUtils.isEmpty(newCreateSalaryTeachingTeacherIds)) {
                     newCourseSchedule.setGroupType(oldCourseSchedule.getGroupType());
                     newCourseSchedule.setMusicGroupId(oldCourseSchedule.getMusicGroupId());
@@ -1659,8 +1687,25 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             throw new BizException("未找到对应课程");
         }
 
-        courseSchedule1.setId(courseScheduleId2);
-        courseSchedule2.setId(courseScheduleId1);
+        if(!courseSchedule1.getGroupType().equals(courseSchedule2.getGroupType())
+            ||!courseSchedule1.getMusicGroupId().equals(courseSchedule2.getMusicGroupId())){
+            throw new BizException("不能跨乐团进行课时交换");
+        }
+
+        int course1CourseMinutes = DateUtil.minutesBetween(courseSchedule1.getStartClassTime(), courseSchedule1.getEndClassTime());
+        int course2CourseMinutes = DateUtil.minutesBetween(courseSchedule2.getStartClassTime(), courseSchedule2.getEndClassTime());
+
+        CourseSchedule temp=new CourseSchedule();
+        BeanUtils.copyProperties(courseSchedule1, temp);
+
+        courseSchedule1.setClassDate(courseSchedule2.getClassDate());
+        courseSchedule1.setStartClassTime(courseSchedule2.getStartClassTime());
+        courseSchedule1.setEndClassTime(DateUtil.addMinutes(courseSchedule1.getStartClassTime(),course1CourseMinutes));
+
+        courseSchedule2.setClassDate(temp.getClassDate());
+        courseSchedule2.setStartClassTime(temp.getStartClassTime());
+        courseSchedule2.setEndClassTime(DateUtil.addMinutes(courseSchedule2.getStartClassTime(),course1CourseMinutes));
+
         List<CourseSchedule> courseSchedules = new ArrayList<>();
         courseSchedules.add(courseSchedule1);
         courseSchedules.add(courseSchedule2);
@@ -1836,23 +1881,36 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
         Date date = new Date();
         //课程已结束,更新“未签到”学生的状态未“旷课”
-        List<StudentAttendance> studentAttendanceList = courseScheduleDao.queryUnsignedStudentList();
-        Date updateTime = DateUtil.stringToDate("19700101 000000",DateUtil.DATE_TIME_FORMAT);
-        for (StudentAttendance studentAttendance : studentAttendanceList) {
-            studentAttendance.setStatus(StudentAttendanceStatusEnum.TRUANT);
-            studentAttendance.setRemark("课程已结束,自动补旷课");
-            if (Objects.isNull(studentAttendance.getCurrentClassTimes())) {
-                studentAttendance.setCurrentClassTimes(1);
-            } else {
-                studentAttendance.setCurrentClassTimes(studentAttendance.getCurrentClassTimes() + 1);
-            }
-            studentAttendance.setCreateTime(date);
-            studentAttendance.setUpdateTime(updateTime);
-        }
-
-        if (studentAttendanceList != null && studentAttendanceList.size() > 0) {
-            studentAttendanceDao.addStudentAttendances(studentAttendanceList);
-        }
+		List<StudentAttendance> studentAttendanceList = courseScheduleDao.queryUnsignedStudentList();
+		if (studentAttendanceList != null && studentAttendanceList.size() > 0) {
+			// 获取老师的考勤记录
+			Map<Long, TeacherAttendance> teacherAttendanceMap = teacherAttendanceDao
+					.findTeacherIdByCourseSchedule(studentAttendanceList.stream().map(sa -> sa.getCourseScheduleId()).collect(Collectors.toList())).stream()
+					.collect(Collectors.toMap(TeacherAttendance::getCourseScheduleId, ta -> ta));
+			
+			Date updateTime = DateUtil.stringToDate("19700101 000000", DateUtil.DATE_TIME_FORMAT);
+			for (Iterator<StudentAttendance> list = studentAttendanceList.iterator(); list.hasNext();) {
+				StudentAttendance studentAttendance = list.next();
+				TeacherAttendance teacherAttendance = teacherAttendanceMap.get(studentAttendance.getCourseScheduleId());
+				if (teacherAttendance != null && teacherAttendance.getSignOutTime() == null) {
+					list.remove();
+				} else {
+					studentAttendance.setStatus(StudentAttendanceStatusEnum.TRUANT);
+					studentAttendance.setRemark("课程已结束,自动补旷课");
+					if (Objects.isNull(studentAttendance.getCurrentClassTimes())) {
+						studentAttendance.setCurrentClassTimes(1);
+					} else {
+						studentAttendance.setCurrentClassTimes(studentAttendance.getCurrentClassTimes() + 1);
+					}
+					studentAttendance.setCreateTime(date);
+					studentAttendance.setUpdateTime(updateTime);
+				}
+			}
+
+			if (studentAttendanceList != null && studentAttendanceList.size() > 0) {
+				studentAttendanceDao.addStudentAttendances(studentAttendanceList);
+			}
+		}
 
         //自动更新课程状态至“已结束”
         List<CourseSchedule> list = courseScheduleDao.queryFinishedWithNoUpdateStatus();
@@ -1907,10 +1965,10 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 //            }
         }
 
-        if (courseScheduleIdList.size() > 0) {
+        /*if (courseScheduleIdList.size() > 0) {
             // vip课自动签退
             teacherAttendanceDao.updateViPSignOutStatus(courseScheduleIdList.stream().map(a -> a.toString()).collect(Collectors.joining(",")));
-        }
+        }*/
 
         return true;
     }

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

@@ -352,12 +352,12 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
     @Transactional(rollbackFor = Exception.class)
     public void musicGroupTeacherSalarySettlement() {
         Date now = new Date();
-        Date yesterday = DateUtil.addDays1(now, -1);
+        Date settleTime = DateUtil.addDays1(now, -sysConfigDao.findByParamName(SysConfigService.MUSIC_GROUP_SETTLEMENT_DAY).getParanValue(Integer.class));
         Integer settlementClassMinutes = Integer.parseInt(sysConfigDao.findByParamName(SysConfigService.MUSIC_GROUP_SETTLEMENT_CLASS_MINUTES).getParanValue());
         Integer singleClassTime = Integer.parseInt(sysConfigDao.findByParamName(SysConfigService.MUSIC_GROUP_SETTLEMENT_SINGLE_CLASS_MINUTES).getParanValue());
         Date entryDate = DateUtil.stringToDate(sysConfigDao.findByParamName(SysConfigService.TEACHER_ENTRY_DATE).getParanValue(),"yyyy-MM-dd");
         //获取昨天的课程计划
-        List<CourseSchedule> yesterdayCourseSchedules = courseScheduleDao.findCourseScheduleWithDate(yesterday);
+        List<CourseSchedule> yesterdayCourseSchedules = courseScheduleDao.findCourseScheduleWithDate(settleTime);
         //课程编号列表
         List<Long> courseScheduleIds = yesterdayCourseSchedules.stream().map(CourseSchedule::getId).collect(Collectors.toList());
         if (CollectionUtils.isEmpty(courseScheduleIds)) {

+ 113 - 77
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.TypeReference;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.entity.SysUserRole;
@@ -181,7 +182,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             Set<Integer> roleIds = new HashSet<>(1);
             roleIds.add(SysUserRole.SECTION_MANAGER);
 
-            sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds,musicGroup.getOrganId()),MessageTypeEnum.BACKSTAGE_CREATE_MUSIC_GROUP_APPLY,"",sysUser.getUsername());
+            sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds, musicGroup.getOrganId()), MessageTypeEnum.BACKSTAGE_CREATE_MUSIC_GROUP_APPLY, "", sysUser.getUsername());
         }
         // 保存乐团付费主体列表
         //批量新增
@@ -251,6 +252,13 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         }
         // 保存乐团声部商品规划
         if (musicGroupSubjectGoodsGroups != null && musicGroupSubjectGoodsGroups.size() > 0) {
+            for (MusicGroupSubjectGoodsGroup musicGroupSubjectGoodsGroup : musicGroupSubjectGoodsGroups) {
+                if(musicGroupSubjectGoodsGroup.getType().equals(GoodsType.INSTRUMENT) && (musicGroupSubjectGoodsGroup.getKitGroupPurchaseTypeJson() == null
+                        || musicGroupSubjectGoodsGroup.getKitGroupPurchaseTypeJson().isEmpty()
+                        || musicGroupSubjectGoodsGroup.getKitGroupPurchaseTypeJson().equals("{}"))){
+                    throw new BizException(musicGroupSubjectGoodsGroup.getName()+" 请选择提供方式");
+                }
+            }
             musicGroupSubjectGoodsGroupDao.batchInsert(musicGroupSubjectGoodsGroups, musicGroupId);
         }
         return musicGroupId;
@@ -265,7 +273,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             throw new BizException("支付项不存在");
         }
         BigDecimal amount = chargeInfo.getAmount();
-        if(chargeInfo.getDiscountAmount() != null && chargeInfo.getDiscountAmount().compareTo(BigDecimal.ZERO)>0){
+        if (chargeInfo.getDiscountAmount() != null && chargeInfo.getDiscountAmount().compareTo(BigDecimal.ZERO) > 0) {
             amount = amount.subtract(chargeInfo.getDiscountAmount());
         }
         if (!(amount.compareTo(sporadicPayDto.getAmount()) == 0)) {
@@ -274,9 +282,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         OrderTypeEnum type = OrderTypeEnum.SPORADIC;
         String receiver = null;
-        if(chargeInfo.getChargeType().equals("6")){
+        if (chargeInfo.getChargeType().equals("6")) {
             type = OrderTypeEnum.LUCK;
-            receiver =  "PER";
+            receiver = "PER";
         }
 
         Integer userId = sporadicPayDto.getUserId();
@@ -394,16 +402,12 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 if (orderDetail == null || orderDetail.getPrice() == null || orderDetail.getGoodsIdList() == null) {
                     continue;
                 }
-                if (orderDetail.getType().equals(OrderDetailTypeEnum.MUSICAL) && musicOneSubjectClassPlan.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.FREE)) {
-                    orderDetail.setPrice(BigDecimal.ZERO);
-                }
                 MusicGroupSubjectGoodsGroup musicGroupSubjectGoodsGroup = new MusicGroupSubjectGoodsGroup();
                 GoodsType goodsType = orderDetail.getType().equals(OrderDetailTypeEnum.MUSICAL) ? GoodsType.INSTRUMENT : GoodsType.ACCESSORIES;
                 musicGroupSubjectGoodsGroup.setType(goodsType);
                 musicGroupSubjectGoodsGroup.setGoodsIdList(orderDetail.getGoodsIdList());
                 musicGroupSubjectGoodsGroup.setPrice(orderDetail.getPrice());
                 musicGroupSubjectGoodsGroup.setKitGroupPurchaseType(orderDetail.getKitGroupPurchaseType());
-
                 goodsGroups.add(musicGroupSubjectGoodsGroup);
                 if (musicGroupSubjectGoodsGroup.getType().equals(GoodsType.INSTRUMENT)) {
                     instrumentFee = instrumentFee.add(orderDetail.getPrice());
@@ -443,34 +447,36 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             String goodsGroupIds = registerPayDto.getGoodsGroups().keySet().stream().map(Object::toString).collect(Collectors.joining(","));
             goodsGroups = musicGroupSubjectGoodsGroupService.findGoodsGroupByIds(goodsGroupIds);
             for (MusicGroupSubjectGoodsGroup goodsGroup : goodsGroups) {
-                Map groupType = JSONObject.parseObject(goodsGroup.getKitGroupPurchaseTypeJson(), HashMap.class);
-                if (registerPayDto.getGoodsGroups().get(goodsGroup.getId()).equals("GROUP")) {
-                    if(!groupType.containsKey("GROUP")){
+                Map<String, BigDecimal> groupType = JSONObject.parseObject(goodsGroup.getKitGroupPurchaseTypeJson(), new TypeReference<Map<String, BigDecimal>>() {
+                });
+                if (goodsGroup.getType().equals(GoodsType.INSTRUMENT) && registerPayDto.getGoodsGroups().get(goodsGroup.getId()).equals("GROUP")) {
+                    if (!groupType.containsKey("GROUP")) {
                         throw new BizException("乐器提供方式不存在");
                     }
                     goodsGroup.setKitGroupPurchaseType(KitGroupPurchaseTypeEnum.GROUP);
-                    remitFee = new BigDecimal((String) groupType.get("GROUP"));
+                    remitFee = groupType.get("GROUP");
                 }
-                if (registerPayDto.getGoodsGroups().get(goodsGroup.getId()).equals("LEASE")) {
-                    if(!groupType.containsKey("LEASE")){
-                       throw new BizException("乐器提供方式不存在");
+                if (goodsGroup.getType().equals(GoodsType.INSTRUMENT) && registerPayDto.getGoodsGroups().get(goodsGroup.getId()).equals("LEASE")) {
+                    if (!groupType.containsKey("LEASE")) {
+                        throw new BizException("乐器提供方式不存在");
                     }
                     goodsGroup.setPrice(goodsGroup.getDepositFee());
                     goodsGroup.setKitGroupPurchaseType(KitGroupPurchaseTypeEnum.LEASE);
-                    remitFee = new BigDecimal((String) groupType.get("LEASE"));
+                    remitFee = groupType.get("LEASE");
                 }
-                if (registerPayDto.getGoodsGroups().get(goodsGroup.getId()).equals("FREE")) {
-                    if(!groupType.containsKey("FREE")){
+                if (goodsGroup.getType().equals(GoodsType.INSTRUMENT) && registerPayDto.getGoodsGroups().get(goodsGroup.getId()).equals("FREE")) {
+                    if (!groupType.containsKey("FREE")) {
                         throw new BizException("乐器提供方式不存在");
                     }
                     goodsGroup.setPrice(new BigDecimal(0));
-                    remitFee = new BigDecimal((String) groupType.get("FREE"));
+                    goodsGroup.setKitGroupPurchaseType(KitGroupPurchaseTypeEnum.FREE);
+                    remitFee = groupType.get("FREE");
                 }
-                if(goodsGroup.getType().equals(GoodsType.INSTRUMENT)){
+                if (goodsGroup.getType().equals(GoodsType.INSTRUMENT)) {
                     instrumentFee = instrumentFee.add(goodsGroup.getPrice());
-                }else if(goodsGroup.getType().equals(GoodsType.ACCESSORIES)) {
+                } else if (goodsGroup.getType().equals(GoodsType.ACCESSORIES)) {
                     accessoriesFee = accessoriesFee.add(goodsGroup.getPrice());
-                }else {
+                } else {
                     otherFee = otherFee.add(goodsGroup.getPrice());
                 }
                 orderAmount = orderAmount.add(goodsGroup.getPrice());
@@ -566,7 +572,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         }
 
         String orderSubject = "乐团报名";
-        if(musicGroup.getOwnershipType() != null && musicGroup.getOwnershipType().equals(CooperationOrgan.OwnershipType.COOPERATION)){
+        if (musicGroup.getOwnershipType() != null && musicGroup.getOwnershipType().equals(CooperationOrgan.OwnershipType.COOPERATION)) {
             orderSubject = "乐团相关费用";
         }
         String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
@@ -624,7 +630,6 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         BigDecimal otherFee = BigDecimal.ZERO;
         BigDecimal remitFee = BigDecimal.ZERO;
 
-
         //乐器及打包辅件
         List<MusicGroupSubjectGoodsGroup> goodsGroups = new ArrayList<>();
         if (studentRegistration.getTemporaryCourseFee() != null) {
@@ -633,14 +638,12 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 if (orderDetail == null || orderDetail.getPrice() == null || orderDetail.getGoodsIdList() == null) {
                     continue;
                 }
-                if (orderDetail.getType().equals(OrderDetailTypeEnum.MUSICAL) && musicOneSubjectClassPlan.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.FREE)) {
-                    orderDetail.setPrice(BigDecimal.ZERO);
-                }
                 MusicGroupSubjectGoodsGroup musicGroupSubjectGoodsGroup = new MusicGroupSubjectGoodsGroup();
                 GoodsType goodsType = orderDetail.getType().equals(OrderDetailTypeEnum.MUSICAL) ? GoodsType.INSTRUMENT : GoodsType.ACCESSORIES;
                 musicGroupSubjectGoodsGroup.setType(goodsType);
                 musicGroupSubjectGoodsGroup.setGoodsIdList(orderDetail.getGoodsIdList());
                 musicGroupSubjectGoodsGroup.setPrice(orderDetail.getPrice());
+                musicGroupSubjectGoodsGroup.setKitGroupPurchaseType(orderDetail.getKitGroupPurchaseType());
                 goodsGroups.add(musicGroupSubjectGoodsGroup);
 
                 if (musicGroupSubjectGoodsGroup.getType().equals(GoodsType.INSTRUMENT)) {
@@ -652,7 +655,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 }
                 orderAmount = orderAmount.add(orderDetail.getPrice());
             }
-        } else if (studentRegistration.getTemporaryCourseFee() == null && !registerPayDto.getGoodsGroupIds().equals("")) {
+        } else if (StringUtils.isNoneBlank(registerPayDto.getGoodsGroupIds())) {
             goodsGroups = musicGroupSubjectGoodsGroupService.findGoodsGroupByIds(registerPayDto.getGoodsGroupIds());
             for (MusicGroupSubjectGoodsGroup goodsGroup : goodsGroups) {
                 if (goodsGroup.getType().equals(GoodsType.INSTRUMENT) && musicOneSubjectClassPlan.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.LEASE)) {
@@ -680,34 +683,36 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             String goodsGroupIds = registerPayDto.getGoodsGroups().keySet().stream().map(Object::toString).collect(Collectors.joining(","));
             goodsGroups = musicGroupSubjectGoodsGroupService.findGoodsGroupByIds(goodsGroupIds);
             for (MusicGroupSubjectGoodsGroup goodsGroup : goodsGroups) {
-                Map groupType = JSONObject.parseObject(goodsGroup.getKitGroupPurchaseTypeJson(), HashMap.class);
-                if (registerPayDto.getGoodsGroups().get(goodsGroup.getId()).equals("GROUP")) {
-                    if(!groupType.containsKey("GROUP")){
+                Map<String, BigDecimal> groupType = JSONObject.parseObject(goodsGroup.getKitGroupPurchaseTypeJson(), new TypeReference<Map<String, BigDecimal>>() {
+                });
+                if (goodsGroup.getType().equals(GoodsType.INSTRUMENT) && registerPayDto.getGoodsGroups().get(goodsGroup.getId()).equals("GROUP")) {
+                    if (!groupType.containsKey("GROUP")) {
                         throw new BizException("乐器提供方式不存在");
                     }
                     goodsGroup.setKitGroupPurchaseType(KitGroupPurchaseTypeEnum.GROUP);
-                    remitFee = new BigDecimal((String) groupType.get("GROUP"));
+                    remitFee = groupType.get("GROUP");
                 }
-                if (registerPayDto.getGoodsGroups().get(goodsGroup.getId()).equals("LEASE")) {
-                    if(!groupType.containsKey("LEASE")){
+                if (goodsGroup.getType().equals(GoodsType.INSTRUMENT) && registerPayDto.getGoodsGroups().get(goodsGroup.getId()).equals("LEASE")) {
+                    if (!groupType.containsKey("LEASE")) {
                         throw new BizException("乐器提供方式不存在");
                     }
                     goodsGroup.setPrice(goodsGroup.getDepositFee());
                     goodsGroup.setKitGroupPurchaseType(KitGroupPurchaseTypeEnum.LEASE);
-                    remitFee = new BigDecimal((String) groupType.get("LEASE"));
+                    remitFee = groupType.get("LEASE");
                 }
-                if (registerPayDto.getGoodsGroups().get(goodsGroup.getId()).equals("FREE")) {
-                    if(!groupType.containsKey("FREE")){
+                if (goodsGroup.getType().equals(GoodsType.INSTRUMENT) && registerPayDto.getGoodsGroups().get(goodsGroup.getId()).equals("FREE")) {
+                    if (!groupType.containsKey("FREE")) {
                         throw new BizException("乐器提供方式不存在");
                     }
                     goodsGroup.setPrice(new BigDecimal(0));
-                    remitFee = new BigDecimal((String) groupType.get("FREE"));
+                    goodsGroup.setKitGroupPurchaseType(KitGroupPurchaseTypeEnum.FREE);
+                    remitFee = groupType.get("FREE");
                 }
-                if(goodsGroup.getType().equals(GoodsType.INSTRUMENT)){
+                if (goodsGroup.getType().equals(GoodsType.INSTRUMENT)) {
                     instrumentFee = instrumentFee.add(goodsGroup.getPrice());
-                }else if(goodsGroup.getType().equals(GoodsType.ACCESSORIES)) {
+                } else if (goodsGroup.getType().equals(GoodsType.ACCESSORIES)) {
                     accessoriesFee = accessoriesFee.add(goodsGroup.getPrice());
-                }else {
+                } else {
                     otherFee = otherFee.add(goodsGroup.getPrice());
                 }
                 orderAmount = orderAmount.add(goodsGroup.getPrice());
@@ -803,7 +808,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             }
         }
         String orderSubject = "乐团报名";
-        if(musicGroup.getOwnershipType() != null && musicGroup.getOwnershipType().equals(CooperationOrgan.OwnershipType.COOPERATION)){
+        if (musicGroup.getOwnershipType() != null && musicGroup.getOwnershipType().equals(CooperationOrgan.OwnershipType.COOPERATION)) {
             orderSubject = "乐团相关费用";
         }
         String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
@@ -872,6 +877,14 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 musicGroupSubjectPlanDao.batchAdd(musicGroupSubjectPlans, musicGroupId);
             }
             if (subFeeSettingDto.getMusicGroupSubjectGoodsGroups() != null && subFeeSettingDto.getMusicGroupSubjectGoodsGroups().size() > 0) {
+                for (MusicGroupSubjectGoodsGroup musicGroupSubjectGoodsGroup : subFeeSettingDto.getMusicGroupSubjectGoodsGroups()) {
+                    if(musicGroupSubjectGoodsGroup.getType().equals(GoodsType.INSTRUMENT) && (musicGroupSubjectGoodsGroup.getKitGroupPurchaseTypeJson() == null
+                            || musicGroupSubjectGoodsGroup.getKitGroupPurchaseTypeJson().isEmpty()
+                            || musicGroupSubjectGoodsGroup.getKitGroupPurchaseTypeJson().equals("{}"))){
+                        throw new BizException(musicGroupSubjectGoodsGroup.getName()+" 请选择提供方式");
+                    }
+                }
+
                 musicGroupSubjectGoodsGroupDao.batchInsert(subFeeSettingDto.getMusicGroupSubjectGoodsGroups(), musicGroupId);
             }
         } else {
@@ -911,7 +924,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 throw new BizException("课酬未确认");
             }
         }
-        updateTeamTeacher(musicGroup,musicGroup);
+        updateTeamTeacher(musicGroup, musicGroup);
         //生成学员费用表
         List<MusicGroupStudentFee> musicGroupStudentFees = musicGroupStudentFeeDao.initMusicGroupStudentFee(musicGroupId);
         if (musicGroupStudentFees != null && musicGroupStudentFees.size() > 0) {
@@ -930,7 +943,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         Map<Integer, String> map = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertMybatisMap(musicGroupDao.queryTeacherIdMap(musicGroupId))), HashMap.class);
         if (map != null && map.size() > 0) {
             sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_MUSIC_GROUP_COURSE_ADD_PLAN,
-                    map, null, 0, "1","TEACHER", musicGroup.getName());
+                    map, null, 0, "1", "TEACHER", musicGroup.getName());
         }
         Set<Integer> roleIds = new HashSet<>(5);
         roleIds.add(SysUserRole.SECTION_MANAGER);
@@ -939,7 +952,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         roleIds.add(SysUserRole.ADMISSIONS_DIRECTOR);
         roleIds.add(SysUserRole.DEAN_OF_STUDIES);
 
-        sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds,musicGroup.getOrganId()),MessageTypeEnum.BACKSTAGE_ACTION_GROUP,"1",musicGroup.getName());
+        sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds, musicGroup.getOrganId()), MessageTypeEnum.BACKSTAGE_ACTION_GROUP, "1", musicGroup.getName());
     }
 
     private MusicGroup saveLog(String musicGroupId, MusicGroupStatusEnum statusEnum) throws Exception {
@@ -970,7 +983,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         Set<Integer> roleIds = new HashSet<>(1);
         roleIds.add(SysUserRole.SECTION_MANAGER);
 
-        sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds,musicGroup.getOrganId()),MessageTypeEnum.BACKSTAGE_CREATE_MUSIC_GROUP_APPLY,"",sysUser.getUsername());
+        sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds, musicGroup.getOrganId()), MessageTypeEnum.BACKSTAGE_CREATE_MUSIC_GROUP_APPLY, "", sysUser.getUsername());
     }
 
     @Override
@@ -1005,13 +1018,13 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         roleIds.add(SysUserRole.OPERATION_EXECUTIVE);
         roleIds.add(SysUserRole.ADMISSIONS_DIRECTOR);
 
-        sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds,musicGroup.getOrganId()),MessageTypeEnum.BACKSTAGE_ACTION_APPLY,"",musicGroup.getName());
+        sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds, musicGroup.getOrganId()), MessageTypeEnum.BACKSTAGE_ACTION_APPLY, "", musicGroup.getName());
     }
 
     @Override
     public void pushMessage(String musicGroupId) throws IOException {
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
-        if(musicGroup.getOwnershipType() != null && musicGroup.getOwnershipType() == CooperationOrgan.OwnershipType.OWN){
+        if (musicGroup.getOwnershipType() != null && musicGroup.getOwnershipType() == CooperationOrgan.OwnershipType.OWN) {
             //是否有基础训练班
             Integer num = classGroupDao.countClassNumByType(musicGroupId);
             if(num != null && num > 0){
@@ -1021,7 +1034,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                     String url = baseURL + "/#/smallRegister?musicGroupId=" + musicGroupId;
                     String serverPhone = sysConfigDao.findConfigValue(SysConfigService.SERVER_PHONE);
                     sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.SMS_BASICS_SKILL_APPLY_MESSAGE,
-                            studentMap, null, 0, "5?" + url,"STUDENT", musicGroup.getName(), HttpUtil.getSortUrl(url), serverPhone);
+                            studentMap, null, 0, "5?" + url, "STUDENT", musicGroup.getName(), HttpUtil.getSortUrl(url), serverPhone);
                 }
             }
         }
@@ -1120,10 +1133,10 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             sysUserCashAccountService.updateBalance(order.getUserId(), order.getActualAmount());
             // 增加交易流水
             sysUserCashAccountDetailService.addCashAccountDetail(order.getUserId(), order.getActualAmount(), SysUserCashAccountDetailService.MUSIC_GROUP
-                    + musicGroupId, "", PlatformCashAccountDetailTypeEnum.REFUNDS, null, DealStatusEnum.SUCCESS, "取消乐团",null);
+                    + musicGroupId, "", PlatformCashAccountDetailTypeEnum.REFUNDS, null, DealStatusEnum.SUCCESS, "取消乐团", null);
         }
         //获取当前乐团所有已报名学员
-        if(musicGroup.getOwnershipType() != null && musicGroup.getOwnershipType() == CooperationOrgan.OwnershipType.OWN){
+        if (musicGroup.getOwnershipType() != null && musicGroup.getOwnershipType() == CooperationOrgan.OwnershipType.OWN) {
             List<StudentRegistration> registrations = studentRegistrationDao.findClassGroupStu(musicGroupId, null);
             if (registrations != null && registrations.size() > 0) {
                 Map<Integer, String> map = new HashMap<>(registrations.size());
@@ -1131,7 +1144,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                     map.put(e.getUserId(), e.getUserId().toString());
                 });
                 sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_MUSIC_GROUP_CLOSE,
-                        map, null, 0, "1","STUDENT", musicGroup.getName(), sysConfigDao.findConfigValue(SysConfigService.REFUND_PERIOD));
+                        map, null, 0, "1", "STUDENT", musicGroup.getName(), sysConfigDao.findConfigValue(SysConfigService.REFUND_PERIOD));
             }
         }
         //记录建团日志
@@ -1140,7 +1153,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         roleIds.add(SysUserRole.SECTION_MANAGER);
         roleIds.add(SysUserRole.OPERATION_EXECUTIVE);
 
-        sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds,musicGroup.getOrganId()),MessageTypeEnum.BACKSTAGE_MUSIC_GROUP_STOP,"1",musicGroup.getName());
+        sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds, musicGroup.getOrganId()), MessageTypeEnum.BACKSTAGE_MUSIC_GROUP_STOP, "1", musicGroup.getName());
         return true;
     }
 
@@ -1243,7 +1256,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         roleIds.add(SysUserRole.OPERATION_EXECUTIVE);
         roleIds.add(SysUserRole.ADMISSIONS_DIRECTOR);
 
-        sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds,musicGroup.getOrganId()),MessageTypeEnum.BACKSTAGE_LENGTHEN_PAYMENT,"",musicGroup.getName());
+        sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds, musicGroup.getOrganId()), MessageTypeEnum.BACKSTAGE_LENGTHEN_PAYMENT, "", musicGroup.getName());
         return true;
     }
 
@@ -1273,7 +1286,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         memo.put("Id", musicGroupQuit.getId());
         memo.put("type", "MUSICGROUP");
 
-        sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds,musicGroup.getOrganId()),MessageTypeEnum.BACKSTAGE_STUDENT_APPLY_QUIT_GROUP,JSONObject.toJSONString(memo),sysUser.getUsername());
+        sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds, musicGroup.getOrganId()), MessageTypeEnum.BACKSTAGE_STUDENT_APPLY_QUIT_GROUP, JSONObject.toJSONString(memo), sysUser.getUsername());
         return true;
     }
 
@@ -1351,7 +1364,16 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
             List<StudentPaymentOrderDetail> orderDetailList = studentPaymentOrderDetailDao.findApplyOrderGoods(studentPaymentOrder.getId());
 
+            BigDecimal remitFee = studentPaymentOrder.getRemitFee() == null ? BigDecimal.ZERO : studentPaymentOrder.getRemitFee();
             for (StudentPaymentOrderDetail detail : orderDetailList) {
+                if (remitFee.compareTo(detail.getPrice()) >= 0) {
+                    remitFee = remitFee.subtract(detail.getPrice());
+                    detail.setPrice(BigDecimal.ZERO);
+                } else {
+                    detail.setPrice(detail.getPrice().subtract(remitFee));
+                    remitFee = BigDecimal.ZERO;
+                }
+
                 if (isRefundCourseFee) {
                     // 退课程费用
                     if (detail.getType() == OrderDetailTypeEnum.COURSE) {
@@ -1375,7 +1397,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             if (amount.doubleValue() > 0) {
                 // 增加交易流水
                 sysUserCashAccountDetailService.addCashAccountDetail(userId, amount, SysUserCashAccountDetailService.MUSIC_GROUP + musicGroupId, "",
-                        PlatformCashAccountDetailTypeEnum.REFUNDS, null, DealStatusEnum.SUCCESS, "退出乐团",null);
+                        PlatformCashAccountDetailTypeEnum.REFUNDS, null, DealStatusEnum.SUCCESS, "退出乐团", null);
             }
         }
         return true;
@@ -1458,8 +1480,16 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         }
 
         List<StudentPaymentOrderDetail> orderDetailList = studentPaymentOrderDetailDao.findApplyOrderGoods(studentPaymentOrder.getId());
+        BigDecimal remitFee = studentPaymentOrder.getRemitFee() == null ? BigDecimal.ZERO : studentPaymentOrder.getRemitFee();
 
         for (StudentPaymentOrderDetail detail : orderDetailList) {
+            if (remitFee.compareTo(detail.getPrice()) >= 0) {
+                remitFee = remitFee.subtract(detail.getPrice());
+                detail.setPrice(BigDecimal.ZERO);
+            } else {
+                detail.setPrice(detail.getPrice().subtract(remitFee));
+                remitFee = BigDecimal.ZERO;
+            }
             if (isRefundCourseFee) {
                 // 退课程费用
                 if (detail.getType() == OrderDetailTypeEnum.COURSE) {
@@ -1483,7 +1513,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (amount.doubleValue() > 0) {
             // 增加交易流水
             sysUserCashAccountDetailService.addCashAccountDetail(userId, amount, SysUserCashAccountDetailService.MUSIC_GROUP + musicGroupId, "",
-                    PlatformCashAccountDetailTypeEnum.REFUNDS, null, DealStatusEnum.SUCCESS, "退出乐团",null);
+                    PlatformCashAccountDetailTypeEnum.REFUNDS, null, DealStatusEnum.SUCCESS, "退出乐团", null);
         }
 
         return true;
@@ -1503,6 +1533,12 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (musicGroupStudentFee == null) {
             throw new BizException("个人续费信息错误");
         }
+        
+        StudentRegistration studentRegistration = studentRegistrationService.queryByUserIdAndMusicGroupId(userId, musicGroupId);
+        if(studentRegistration == null || studentRegistration.getPaymentStatus() != PaymentStatusEnum.YES){
+        	throw new BizException("请走报名缴费流程");
+        }
+        
         //判断是否是续费
 		/*List<StudentPaymentOrder> orderList = studentPaymentOrderDao.queryByCondition(GroupType.MUSIC, musicGroupId, userId, DealStatusEnum.SUCCESS);
 		if (orderList == null || orderList.size() == 0) {
@@ -1679,11 +1715,11 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             paymentDetail.setPerAmount(studentPaymentOrder.getPerAmount().negate());
             sysUserCashAccountDetailService.insert(paymentDetail);
             MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
-            if(musicGroup.getOwnershipType() != null && musicGroup.getOwnershipType() == CooperationOrgan.OwnershipType.OWN){
+            if (musicGroup.getOwnershipType() != null && musicGroup.getOwnershipType() == CooperationOrgan.OwnershipType.OWN) {
                 // 发送续费结果通知
-                sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SMS_MUSIC_GROUP_RENEW_SUCCESS, push, null, 0, "1","STUDENT",
+                sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SMS_MUSIC_GROUP_RENEW_SUCCESS, push, null, 0, "1", "STUDENT",
                         studentRegistration.getParentsName(), studentPaymentOrder.getActualAmount());
-                sysMessageService.batchSendMessage(MessageSender.YIMEI, MessageTypeEnum.STUDENT_SMS_MUSIC_GROUP_RENEW_SUCCESS, yimei, null, 0, "1","",
+                sysMessageService.batchSendMessage(MessageSender.YIMEI, MessageTypeEnum.STUDENT_SMS_MUSIC_GROUP_RENEW_SUCCESS, yimei, null, 0, "1", "",
                         studentRegistration.getParentsName(), studentPaymentOrder.getActualAmount());
             }
             return true;
@@ -1694,12 +1730,12 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             }
         }
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
-        if(musicGroup.getOwnershipType() != null && musicGroup.getOwnershipType() == CooperationOrgan.OwnershipType.OWN){
+        if (musicGroup.getOwnershipType() != null && musicGroup.getOwnershipType() == CooperationOrgan.OwnershipType.OWN) {
             if (studentPaymentOrder.getStatus() == DealStatusEnum.CLOSE || studentPaymentOrder.getStatus() == DealStatusEnum.FAILED) {
                 String baseUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
                 String memo = baseUrl + "/#/renew?musicGroupId=" + musicGroupId;
                 //4?http://mstudev.dayaedu.com/#/renew?musicGroupId=" +musicGroupId
-                sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_MUSIC_GROUP_RENEW_FAILED, push, null, 0, "4?" + memo,"STUDENT",
+                sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_MUSIC_GROUP_RENEW_FAILED, push, null, 0, "4?" + memo, "STUDENT",
                         HttpUtil.getSortUrl(memo));
                 return false;
             }
@@ -1744,8 +1780,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         Set<Integer> roleIds = new HashSet<>(1);
         roleIds.add(SysUserRole.SECTION_MANAGER);
 
-        sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds,musicGroup.getOrganId()),MessageTypeEnum.BACKSTAGE_TEACHER_AMOUNT_CHANGE,"",
-                teacher.getRealName(),musicGroup.getName(),scope.equals("all")?"所有":"本次");
+        sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds, musicGroup.getOrganId()), MessageTypeEnum.BACKSTAGE_TEACHER_AMOUNT_CHANGE, "",
+                teacher.getRealName(), musicGroup.getName(), scope.equals("all") ? "所有" : "本次");
         return true;
     }
 
@@ -1819,9 +1855,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         return musicGroupPageInfo;
     }
 
-    private void updateTeamTeacher(MusicGroup oldMusicGroup,MusicGroup newMusicGroup){
+    private void updateTeamTeacher(MusicGroup oldMusicGroup, MusicGroup newMusicGroup) {
         List<ClassGroup> classGroups = classGroupDao.findClassGroupByMusicGroupIdAndType(newMusicGroup.getId(), null);
-        if(classGroups == null || classGroups.size() == 0){
+        if (classGroups == null || classGroups.size() == 0) {
             return;
         }
         Integer teamTeacherId = newMusicGroup.getTeamTeacherId();
@@ -1833,7 +1869,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         ImGroupMember[] nowImGroupMembers2 = {new ImGroupMember(educationalTeacherId.toString())};
         ImGroupMember[] oldImGroupMembers3 = {new ImGroupMember(oldMusicGroup.getDirectorUserId().toString())};
         ImGroupMember[] nowImGroupMembers3 = {new ImGroupMember(directorUserId.toString())};
-        classGroups.forEach(e->{
+        classGroups.forEach(e -> {
             imFeignService.groupQuit(new ImGroupModel(e.getId().toString(), oldImGroupMembers1, e.getName()));
             imFeignService.groupJoin(new ImGroupModel(e.getId().toString(), nowImGroupMembers1, e.getName()));
             imFeignService.groupQuit(new ImGroupModel(e.getId().toString(), oldImGroupMembers2, e.getName()));
@@ -1859,7 +1895,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             //如果已生成课表,那么修改未上课时教学点
             courseScheduleDao.updateCourseScheduleSchool("MUSIC", musicGroupId, musicGroup.getSchoolId());
         }
-        updateTeamTeacher(musicGroup,group);
+        updateTeamTeacher(musicGroup, group);
         List<Integer> months = subFeeSettingDto.getMonths();
 
         Date date = new Date();
@@ -1968,21 +2004,21 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         musicGroup.setStatus(MusicGroupStatusEnum.PAY);
         musicGroupDao.update(musicGroup);
         //三方乐团不发送缴费通知
-        if(musicGroup.getOwnershipType() != null && musicGroup.getOwnershipType() == CooperationOrgan.OwnershipType.OWN){
+        if (musicGroup.getOwnershipType() != null && musicGroup.getOwnershipType() == CooperationOrgan.OwnershipType.OWN) {
             //获取所有已报名学员列表
-            HashMap<Integer,String> map = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertMybatisMap(studentRegistrationDao.findMapByMusicGroupId(musicGroupId,0))), HashMap.class);
-            if(map != null && map.size() > 0){
+            HashMap<Integer, String> map = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertMybatisMap(studentRegistrationDao.findMapByMusicGroupId(musicGroupId, 0))), HashMap.class);
+            if (map != null && map.size() > 0) {
                 String studentApplyUrl = sysConfigDao.findConfigValue(SysConfigService.STUDENT_APPLY_URL) + musicGroupId;
                 String serverPhone = sysConfigDao.findConfigValue(SysConfigService.SERVER_PHONE);
-                sysMessageService.batchSendMessage(MessageSender.YIMEI,MessageTypeEnum.SMS_PAYMENT_MESSAGE,
-                        map,null,0,"","",musicGroup.getName(),studentApplyUrl,DateUtil.format(musicGroup.getPaymentExpireDate(),DateUtil.DATE_FORMAT_MIN),serverPhone);
+                sysMessageService.batchSendMessage(MessageSender.YIMEI, MessageTypeEnum.SMS_PAYMENT_MESSAGE,
+                        map, null, 0, "", "", musicGroup.getName(), studentApplyUrl, DateUtil.format(musicGroup.getPaymentExpireDate(), DateUtil.DATE_FORMAT_MIN), serverPhone);
             }
         }
         Set<Integer> roleIds = new HashSet<>(3);
         roleIds.add(SysUserRole.SECTION_MANAGER);
         roleIds.add(SysUserRole.EDUCATIONAL_TEACHER);
         roleIds.add(SysUserRole.OPERATION_EXECUTIVE);
-        sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds,musicGroup.getOrganId()),MessageTypeEnum.BACKSTAGE_ACTION_PAYMENT,"",musicGroup.getName());
+        sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds, musicGroup.getOrganId()), MessageTypeEnum.BACKSTAGE_ACTION_PAYMENT, "", musicGroup.getName());
         //所有人开启缴费
         studentRegistrationDao.musicGroupOpenPay(musicGroupId, PaymentStatusEnum.OPEN);
         return musicGroup;
@@ -2051,7 +2087,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, event, sysUser.getId(), ""));
         musicGroup.setStatus(MusicGroupStatusEnum.PREPARE);
         musicGroupDao.update(musicGroup);
-        if(musicGroup.getOwnershipType() != null && musicGroup.getOwnershipType() == CooperationOrgan.OwnershipType.OWN){
+        if (musicGroup.getOwnershipType() != null && musicGroup.getOwnershipType() == CooperationOrgan.OwnershipType.OWN) {
             //给家长发送乐团基础训练课短信
             //获取所有乐团学员列表
             List<StudentRegistration> students = studentRegistrationDao.queryStudentByMusicGroupId(musicGroupId);
@@ -2064,12 +2100,12 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 if (userIds != null && userIds.size() > 0) {
                     String studentApplyUrl = sysConfigDao.findConfigValue(SysConfigService.STUDENT_APPLY_URL) + musicGroupId;
                     String serverPhone = sysConfigDao.findConfigValue(SysConfigService.SERVER_PHONE);
-                    sysMessageService.batchSendMessage(MessageSender.YIMEI, MessageTypeEnum.SMS_BASICS_SKILL_APPLY_MESSAGE, userIds, null, 0, "","", musicGroup.getName(), studentApplyUrl, serverPhone);
+                    sysMessageService.batchSendMessage(MessageSender.YIMEI, MessageTypeEnum.SMS_BASICS_SKILL_APPLY_MESSAGE, userIds, null, 0, "", "", musicGroup.getName(), studentApplyUrl, serverPhone);
                 }
             }
         }
         Set<Integer> roleIds = new HashSet<>(1);
         roleIds.add(SysUserRole.SECTION_MANAGER);
-        sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds,musicGroup.getOrganId()),MessageTypeEnum.BACKSTAGE_MUSIC_GROUP_MARKING,"",musicGroup.getName());
+        sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds, musicGroup.getOrganId()), MessageTypeEnum.BACKSTAGE_MUSIC_GROUP_MARKING, "", musicGroup.getName());
     }
 }

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

@@ -32,4 +32,9 @@ public class MusicGroupSubjectGoodsGroupServiceImpl extends BaseServiceImpl<Long
 
 		return musicGroupSubjectGoodsGroupDao.findGoodsGroupByIds(ids);
 	}
+
+	@Override
+	public MusicGroupSubjectGoodsGroup query(String musicGroupId, Integer subjectId, String goodsIdList) {
+		return musicGroupSubjectGoodsGroupDao.query(musicGroupId, subjectId, goodsIdList);
+	}
 }

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupSubjectPlanServiceImpl.java

@@ -5,6 +5,7 @@ import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
+import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -183,6 +184,9 @@ public class MusicGroupSubjectPlanServiceImpl extends BaseServiceImpl<Integer, M
                 musicGroupSubjectGoodsGroup.setType(GoodsType.ACCESSORIES);
             }
             if(orderDetail.getKitGroupPurchaseType() != null){
+                if(orderDetail.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.LEASE)){
+                    musicGroupSubjectGoodsGroup.setDepositFee(orderDetail.getPrice());
+                }
                 String kitGroupPurchaseTypeJson = "{\""+orderDetail.getKitGroupPurchaseType().getCode()+"\":0}";
                 musicGroupSubjectGoodsGroup.setKitGroupPurchaseTypeJson(kitGroupPurchaseTypeJson);
             }

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

@@ -336,9 +336,6 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
 			dataList = courseScheduleStudentPaymentDao.findStudentByClassGroup(params);
 			//学生编号列表
 			List<Integer> userIds = dataList.stream().map(StudentAttendanceStatisticsResponse::getUserId).collect(Collectors.toList());
-			//学生-科目名称关联集合
-			List<Map<Integer, String>> byMusicGroupAndUsers = subjectDao.findByMusicGroupAndUsers(classGroup.getMusicGroupId(), userIds);
-			Map<Integer, String> userSubjectNameMap = MapUtil.convertMybatisMap(byMusicGroupAndUsers);
 			//学生-旷课次数关联集合
 			List<Map<Integer, Integer>> continuousAbsenteeismTimesByUsersAndMusicGroup = musicGroupStudentFeeDao.findContinuousAbsenteeismTimesByUsersAndMusicGroup(classGroup.getMusicGroupId(), userIds);
 			Map<Integer,Integer> continuousAbsenteeismTimesWithUser=MapUtil.convertIntegerMap(continuousAbsenteeismTimesByUsersAndMusicGroup);
@@ -360,18 +357,13 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
 							student.setTruant(true);
 						}
 					}
-					//获取科目名
-					String userSubjectName = userSubjectNameMap.get(student.getSubjectName());
-					if(Objects.nonNull(userSubjectName)){
-						student.setSubjectName(userSubjectName);
-					}
 					//当前学生的签到状态统计
 					List<StudentAttendanceStatusCountDto> currentStudentAttendanceStatusCountDtos = studentAttendanceStatusCountDtosByUser.get(student.getUserId());
 					if(!CollectionUtils.isEmpty(currentStudentAttendanceStatusCountDtos)){
 						Map<StudentAttendanceStatusEnum, Integer> statusAndNumMap = currentStudentAttendanceStatusCountDtos.stream().collect(Collectors.toMap(StudentAttendanceStatusCountDto::getStatus, StudentAttendanceStatusCountDto::getNum));
 						student.setNormalDay(statusAndNumMap.get(StudentAttendanceStatusEnum.NORMAL));
-						student.setNormalDay(statusAndNumMap.get(StudentAttendanceStatusEnum.TRUANT));
-						student.setNormalDay(statusAndNumMap.get(StudentAttendanceStatusEnum.LEAVE));
+						student.setTruantDay(statusAndNumMap.get(StudentAttendanceStatusEnum.TRUANT));
+						student.setLeaveDay(statusAndNumMap.get(StudentAttendanceStatusEnum.LEAVE));
 					}
 
 					//当前学生签到记录

+ 11 - 13
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java

@@ -300,7 +300,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
 
             Map<Integer, String> map = new HashMap<>(1);
             map.put(studentRegistration.getUserId(), studentRegistration.getParentsPhone());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI, MessageTypeEnum.SMS_APPLY_MESSAGE, map, null, 0, "","",
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI, MessageTypeEnum.SMS_APPLY_MESSAGE, map, null, 0, "", "",
                     studentRegistration.getParentsName(), subject.getName(), serverPhone);
         } finally {
             redisCache.releaseLocked(key, threadId);
@@ -660,10 +660,10 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                 receivers.put(studentRegistration.getUserId(), studentRegistration.getParentsPhone());
                 if (reduce == BigDecimal.ZERO) {
                     sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI, MessageTypeEnum.SMS_MUSIC_GROUP_ADD_STUDENT_FREE,
-                            receivers, null, 0, null,"", studentRegistration.getParentsName(), studentRegistration.getName(), musicGroup.getName());
+                            receivers, null, 0, null, "", studentRegistration.getParentsName(), studentRegistration.getName(), musicGroup.getName());
                 } else {
                     String studentApplyUrl = sysConfigDao.findConfigValue(SysConfigService.STUDENT_APPLY_URL) + musicGroupId;
-                    sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI, MessageTypeEnum.SMS_MUSIC_GROUP_ADD_STUDENT, receivers, null, 0, null,"", studentRegistration.getParentsName(), studentRegistration.getName(), musicGroup.getName(), HttpUtil.getSortUrl(studentApplyUrl));
+                    sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI, MessageTypeEnum.SMS_MUSIC_GROUP_ADD_STUDENT, receivers, null, 0, null, "", studentRegistration.getParentsName(), studentRegistration.getName(), musicGroup.getName(), HttpUtil.getSortUrl(studentApplyUrl));
                 }
             }
             return userId;
@@ -842,25 +842,23 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                 Map<Integer, String> map = new HashMap<>(1);
                 map.put(studentPaymentOrder.getUserId(), studentRegistration.getParentsPhone());
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI,
-                        MessageTypeEnum.STUDENT_SMS_PAYMENT_SUCCESS, map, null, 0, "1","",
+                        MessageTypeEnum.STUDENT_SMS_PAYMENT_SUCCESS, map, null, 0, "1", "",
                         studentRegistration.getParentsName(), studentPaymentOrder.getActualAmount());
                 //push
                 Map<Integer, String> map1 = new HashMap<>(1);
                 map1.put(studentPaymentOrder.getUserId(), studentPaymentOrder.getUserId().toString());
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
-                        MessageTypeEnum.STUDENT_SMS_PAYMENT_SUCCESS, map1, null, 0, "1","STUDENT",
+                        MessageTypeEnum.STUDENT_SMS_PAYMENT_SUCCESS, map1, null, 0, "1", "STUDENT",
                         studentRegistration.getParentsName(), studentPaymentOrder.getActualAmount());
             }
-//            //生成课程协议
             try {
+                //生成课程协议
                 contractService.transferMusicGroupCoursesContract(studentRegistration.getUserId(), studentRegistration.getMusicGroupId());
                 // 商品协议(租赁时候有)
-                if (musicOneSubjectClassPlan.getKitGroupPurchaseType() != null && musicOneSubjectClassPlan.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.LEASE)) {
-                    StudentPaymentOrderDetail applyOrderMusical = studentPaymentOrderDetailService.findApplyOrderMusical(studentPaymentOrder.getId());
-                    if (applyOrderMusical != null && applyOrderMusical.getGoodsIdList() != null && !applyOrderMusical.getGoodsIdList().equals("")) {
+                StudentPaymentOrderDetail applyOrderMusical = studentPaymentOrderDetailService.findApplyOrderMusical(studentPaymentOrder.getId());
+                if (applyOrderMusical != null && applyOrderMusical.getKitGroupPurchaseType() != null && applyOrderMusical.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.LEASE)) {
                         contractService.transferGoodsContract(studentPaymentOrder.getUserId(), studentPaymentOrder.getMusicGroupId(),
-                                applyOrderMusical.getGoodsIdList(), musicOneSubjectClassPlan.getKitGroupPurchaseType());
-                    }
+                                applyOrderMusical.getGoodsIdList(), applyOrderMusical.getKitGroupPurchaseType());
                 }
             } catch (Exception e) {
                 LOGGER.error("协议生成失败", e);
@@ -887,7 +885,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                 Map<Integer, String> map = new HashMap<>(1);
                 map.put(studentPaymentOrder.getUserId(), studentRegistration.getParentsPhone());
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI,
-                        MessageTypeEnum.STUDENT_SMS_PAYMENT_FAILED, map, null, 0, "1","",
+                        MessageTypeEnum.STUDENT_SMS_PAYMENT_FAILED, map, null, 0, "1", "",
                         HttpUtil.getSortUrl(studentApplyUrl));
             }
 //            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
@@ -963,7 +961,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                     receivers.put(e.getUserId(), e.getParentsPhone());
                 });
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI,
-                        MessageTypeEnum.SMS_STUDENT_OPEN_PAYMENT, receivers, null, 0, null,"",
+                        MessageTypeEnum.SMS_STUDENT_OPEN_PAYMENT, receivers, null, 0, null, "",
                         musicGroup.getName(), HttpUtil.getSortUrl(configValue + musicGroup.getId()));
             }
         }

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

@@ -28,7 +28,7 @@ public class VipGroupDefaultClassesUnitPriceServiceImpl extends BaseServiceImpl<
 		if(Objects.isNull(bean.getOrganId())){
 			throw new BizException("请选择分部");
 		}
-		VipGroupDefaultClassesUnitPrice byVipGroupCategory = vipGroupDefaultClassesUnitPriceDao.getByVipGroupCategory( bean.getVipGroupCategoryId().longValue(),bean.getOrganId().longValue());
+		VipGroupDefaultClassesUnitPrice byVipGroupCategory = vipGroupDefaultClassesUnitPriceDao.getByVipGroupCategory( bean.getVipGroupCategoryId().longValue(),bean.getOrganId());
 		if(null!=byVipGroupCategory){
 			return vipGroupDefaultClassesUnitPriceDao.updateByVipGroupCategory(bean);
 		}else{

+ 208 - 68
mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java

@@ -195,6 +195,15 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			throw new BizException("开课时间不能小于当前时间");
 		}
 
+		if(vipGroupApplyBaseInfoDto.getRegistrationStartTime().after(vipGroupApplyBaseInfoDto.getPaymentExpireDate())){
+		    throw new BizException("报名开始时间必须在报名截至时间之前");
+        }
+
+		if(vipGroupApplyBaseInfoDto.getPaymentExpireDate().after(firstCourseSchedule.getStartClassTime())
+            ||DateUtil.isSameDay(vipGroupApplyBaseInfoDto.getPaymentExpireDate(),firstCourseSchedule.getEndClassTime())){
+		    throw new BizException("创建失败,报名截止时间必须在开课时间前一天");
+        }
+
 		//判断课程安排是否超出范围
 		if(Objects.nonNull(vipGroupActivity.getCoursesEndTime())||Objects.nonNull(vipGroupActivity.getCoursesStartTime())){
 			if(latestCourseSchedule.getEndClassTime().after(vipGroupActivity.getCoursesEndTime())
@@ -251,13 +260,13 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 //			throw new BizException("教师总课酬不能高于课程总价60%");
 //		}
 
+        vipGroupApplyBaseInfoDto.setAuditStatus(AuditStatusEnum.PASS);
+
 		//如果默认课酬与实际课酬不匹配则需要审批
 		if(costInfo.get("offlineTeacherSalary").compareTo(vipGroupApplyBaseInfoDto.getOfflineTeacherSalary())<0||
 			costInfo.get("onlineTeacherSalary").compareTo(vipGroupApplyBaseInfoDto.getOnlineTeacherSalary())<0
 			&&StringUtils.isBlank(studentIds)){
 			vipGroupApplyBaseInfoDto.setAuditStatus(AuditStatusEnum.ING);
-		}else{
-			vipGroupApplyBaseInfoDto.setAuditStatus(AuditStatusEnum.PASS);
 		}
 
 		vipGroupApplyBaseInfoDto.setTotalPrice(costInfo.get("totalPrice"));
@@ -266,19 +275,40 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		}else{
 			vipGroupApplyBaseInfoDto.setStatus(VipGroupStatusEnum.APPLYING);
 		}
-//        Teacher teacher = teacherService.get(sysUser.getId());
-//		if(teacher.getOrganId().indexOf(",")!=-1){
-//		    throw new BizException("教师部门异常");
-//        }
+        Teacher teacher = teacherService.get(vipGroupApplyBaseInfoDto.getUserId());
+		if(Objects.isNull(teacher)){
+		    throw new BizException("教师不存在");
+        }
+		if(Objects.isNull(teacher.getTeacherOrganId())){
+		    throw new BizException("教师部门异常");
+        }
 //        vipGroupApplyBaseInfoDto.setOrganId(Integer.parseInt(teacher.getOrganId()));
 		//开课时间为排课的第一节课的开始时间
 		vipGroupApplyBaseInfoDto.setCourseStartDate(firstCourseSchedule.getStartClassTime());
 		//课程结束时间为排课的最后一节课的结束时间
 		vipGroupApplyBaseInfoDto.setCoursesExpireDate(latestCourseSchedule.getEndClassTime());
-		vipGroupDao.insert(vipGroupApplyBaseInfoDto);
 
-		//获取vip课类型信息
-		VipGroupCategory vipGroupCategory = vipGroupCategoryDao.get(vipGroup.getVipGroupApplyBaseInfo().getVipGroupCategoryId().intValue());
+		vipGroupApplyBaseInfoDto.setPaymentExpireDate(DateUtil.getLastSecondWithDay(vipGroupApplyBaseInfoDto.getPaymentExpireDate()));
+
+        //获取vip课类型信息
+        VipGroupCategory vipGroupCategory = vipGroupCategoryDao.get(vipGroup.getVipGroupApplyBaseInfo().getVipGroupCategoryId().intValue());
+
+        VipGroupDefaultClassesUnitPrice vipGroupDefaultClassesUnitPrice = vipGroupDefaultClassesUnitPriceDao.getByVipGroupCategory(vipGroup.getVipGroupApplyBaseInfo().getVipGroupCategoryId(), teacher.getTeacherOrganId());
+
+        if(Objects.isNull(vipGroupDefaultClassesUnitPrice)){
+            vipGroupApplyBaseInfoDto.setAuditStatus(AuditStatusEnum.ING);
+        }else{
+            if(Objects.nonNull(vipGroupApplyBaseInfoDto.getOfflineClassesUnitPrice())
+                    &&vipGroupApplyBaseInfoDto.getOfflineClassesUnitPrice().compareTo(vipGroupDefaultClassesUnitPrice.getOfflineClassesUnitPrice())!=0){
+                vipGroupApplyBaseInfoDto.setAuditStatus(AuditStatusEnum.ING);
+            }
+            if(Objects.nonNull(vipGroupApplyBaseInfoDto.getOnlineClassesUnitPrice())
+                    &&vipGroupApplyBaseInfoDto.getOnlineClassesUnitPrice().compareTo(vipGroupDefaultClassesUnitPrice.getOnlineClassesUnitPrice())!=0){
+                vipGroupApplyBaseInfoDto.setAuditStatus(AuditStatusEnum.ING);
+            }
+        }
+
+		vipGroupDao.insert(vipGroupApplyBaseInfoDto);
 
 		//创建班级信息
 		ClassGroup classGroup=new ClassGroup();
@@ -347,7 +377,6 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		roleIds.add(SysUserRole.OPERATION_EXECUTIVE);
 		Map<String,Long> memo = new HashMap<>(1);
 		memo.put("vipGroupId",vipGroupApplyBaseInfoDto.getId());
-		Teacher teacher = teacherDao.get(vipGroup.getVipGroupApplyBaseInfo().getUserId());
 //		SysUser sysUser = sysUserFeignService.queryUserById(vipGroup.getVipGroupApplyBaseInfo().getUserId());
 		if(Objects.isNull(teacher)){
 			throw new BizException("该用户不存在");
@@ -360,7 +389,40 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 //		}
 	}
 
-	@Override
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void checkVipCourseIsInScore(Long vipGroupId) {
+	    if(Objects.isNull(vipGroupId)){
+	        return;
+        }
+	    VipGroup vipGroup=vipGroupDao.get(vipGroupId);
+	    if(Objects.isNull(vipGroup)){
+	        throw new BizException("课程不存在");
+        }
+        Date groupCourseStartTime=courseScheduleDao.findGroupCourseStartTime(GroupType.VIP,vipGroupId.toString());
+        Date groupCourseEndTime=courseScheduleDao.findGroupCourseEndTime(GroupType.VIP,vipGroupId.toString());
+
+        //获取活动信息
+        VipGroupActivity vipGroupActivity = vipGroupActivityDao.get(vipGroup.getVipGroupActivityId().intValue());
+        if(Objects.nonNull(vipGroupActivity.getCoursesEndTime())||Objects.nonNull(vipGroupActivity.getCoursesStartTime())){
+            if(groupCourseEndTime.after(vipGroupActivity.getCoursesEndTime())
+                    ||groupCourseStartTime.before(vipGroupActivity.getCoursesStartTime())){
+                throw new BizException("课时安排时间超出范围!");
+            }
+        }else{
+            int totalClassTimes = courseScheduleDao.countGroupAllCourses(GroupType.VIP, vipGroupId.toString());
+            VipGroupDefaultClassesCycle vipGroupDefaultClassesCycle = vipGroupDefaultClassesCycleDao.findByOrganAndClassTimes(totalClassTimes);
+
+            if (vipGroupDefaultClassesCycle != null) {
+                int month = DateUtil.monthsBetween(groupCourseStartTime, groupCourseEndTime);
+                if (month > vipGroupDefaultClassesCycle.getMonth()) {
+                    throw new BizException("课时安排时间超出范围!");
+                }
+            }
+        }
+    }
+
+    @Override
 	@Transactional(rollbackFor = Exception.class)
 	public void updateVipGroup(VipGroupApplyDto vipGroupApplyInfo) {
 		VipGroupApplyBaseInfoDto vipGroupUpdateInfo = vipGroupApplyInfo.getVipGroupApplyBaseInfo();
@@ -501,7 +563,9 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 				dataList.forEach(vipGroup -> {
 					Integer overCourses = vipGroupOverCourseMaps.get(vipGroup.getId().toString());
 					ClassGroup classGroup = vipGroupClassGroupMap.get(vipGroup.getId().toString());
-					vipGroup.setStudentNum(classGroup.getStudentNum());
+					if(Objects.nonNull(classGroup)){
+						vipGroup.setStudentNum(classGroup.getStudentNum());
+					}
 
 					Long aLong = totalClassTimeMap.get(vipGroup.getId() + "");
 					vipGroup.setTotalClassTimes(aLong==null?0:aLong.intValue());
@@ -1259,7 +1323,35 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		if(surplusCourses<=0){
 			throw new BizException("此vip课程没有剩余排课");
 		}
-		BigDecimal surplusCourseFee = studentPaymentOrderDao.sumSurplusCourseFee(vipGroup.getId().toString(), userId);
+		Date now=new Date();
+        BigDecimal surplusCourseFee;
+        List<StudentCourseInfoDto> userCourseInfos = courseScheduleDao.findUserCourseInfos(GroupType.VIP, vipGroupId.toString(), userId, null);
+        if(CollectionUtils.isEmpty(userCourseInfos)&&vipGroup.getStatus().equals(VipGroupStatusEnum.APPLYING)){
+            if(Objects.isNull(studentPaymentOrder)){
+                surplusCourseFee=new BigDecimal(0);
+            }else{
+                surplusCourseFee=studentPaymentOrder.getActualAmount();
+            }
+        }else if(!CollectionUtils.isEmpty(userCourseInfos)){
+            BigDecimal historyPrice=new BigDecimal(0);
+            BigDecimal allPrice=new BigDecimal(0);
+            for (StudentCourseInfoDto userCourseInfo : userCourseInfos) {
+                allPrice=allPrice.add(userCourseInfo.getExpectPrice());
+                if(now.after(userCourseInfo.getStartClassTime())){
+                    historyPrice=historyPrice.add(userCourseInfo.getTeachMode().equals(TeachModeEnum.ONLINE)?vipGroup.getOnlineClassesUnitPrice():vipGroup.getOfflineClassesUnitPrice());
+                }
+            }
+            surplusCourseFee=allPrice.subtract(historyPrice);
+            if(surplusCourseFee.longValue()<0){
+                surplusCourseFee=new BigDecimal(0);
+            }
+        }else{
+            surplusCourseFee=new BigDecimal(0);
+        }
+        if(Objects.isNull(surplusCourseFee)){
+            surplusCourseFee = new BigDecimal(0);
+        }
+        surplusCourseFee = surplusCourseFee.multiply(new BigDecimal(0.8)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
 		studentApplyRefunds.setExpectAmount(surplusCourseFee);
 		studentApplyRefunds.setStatus(StudentApplyRefundsStatus.ING);
 		String orderNo=StringUtils.join(new String[]{userId.toString(),String.valueOf(System.currentTimeMillis())});
@@ -1618,26 +1710,37 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		if(vipGroup.getStatus().equals(VipGroupStatusEnum.CANCEL)){
 			throw new BizException("不能对已停止的课程进行退课操作");
 		}
-		Map<String,BigDecimal> result=new HashMap<>();
-		if(vipGroup.getStatus().equals(VipGroupStatusEnum.APPLYING)){
-			StudentPaymentOrder studentPaymentOrder = studentPaymentOrderDao.findByStudentVipGroup(vipGroupId, studentId, DealStatusEnum.SUCCESS.getCode());
-			if(Objects.isNull(studentPaymentOrder)){
-				BigDecimal surplusCourseFee = studentPaymentOrderDao.sumSurplusCourseFee(vipGroupId.toString(), studentId);
-				if(Objects.isNull(surplusCourseFee)){
-					result.put("suplusCourseFee",new BigDecimal(0));
-				}else{
-					result.put("suplusCourseFee",surplusCourseFee);
-				}
-			}else{
-				result.put("suplusCourseFee",studentPaymentOrder.getActualAmount());
-			}
-			return result;
-		}
+		Date now = new Date();
+        BigDecimal bigDecimal;
+        List<StudentCourseInfoDto> userCourseInfos = courseScheduleDao.findUserCourseInfos(GroupType.VIP, vipGroupId.toString(), studentId, null);
+		if(CollectionUtils.isEmpty(userCourseInfos)&&vipGroup.getStatus().equals(VipGroupStatusEnum.APPLYING)){
+            StudentPaymentOrder studentPaymentOrder = studentPaymentOrderDao.findByStudentVipGroup(vipGroupId, studentId, DealStatusEnum.SUCCESS.getCode());
+            if(Objects.isNull(studentPaymentOrder)){
+                bigDecimal=new BigDecimal(0);
+            }else{
+                bigDecimal=studentPaymentOrder.getActualAmount();
+            }
+        }else if(!CollectionUtils.isEmpty(userCourseInfos)){
+            BigDecimal historyPrice=new BigDecimal(0);
+            BigDecimal allPrice=new BigDecimal(0);
+            for (StudentCourseInfoDto userCourseInfo : userCourseInfos) {
+                allPrice=allPrice.add(userCourseInfo.getExpectPrice());
+                if(now.after(userCourseInfo.getStartClassTime())){
+                    historyPrice=historyPrice.add(userCourseInfo.getTeachMode().equals(TeachModeEnum.ONLINE)?vipGroup.getOnlineClassesUnitPrice():vipGroup.getOfflineClassesUnitPrice());
+                }
+            }
+            bigDecimal=allPrice.subtract(historyPrice);
+            if(bigDecimal.longValue()<0){
+                bigDecimal=new BigDecimal(0);
+            }
+        }else{
+		    bigDecimal=new BigDecimal(0);
+        }
+        Map<String,BigDecimal> result=new HashMap<>();
 		ClassGroup classGroup = classGroupDao.findByVipGroup(vipGroupId, null);
 		if(Objects.isNull(classGroup)){
 			throw new BizException("未找到对应班级");
 		}
-		BigDecimal bigDecimal = courseScheduleStudentPaymentDao.countSurplusCourseFee(classGroup.getId(), studentId);
 		if(Objects.isNull(bigDecimal)){
 			bigDecimal = new BigDecimal(0);
 		}
@@ -1646,6 +1749,47 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		return result;
 	}
 
+//	@Override
+//	@Transactional(rollbackFor = Exception.class)
+//	public Map<String, BigDecimal> getStudentSurplusCourseFee(Long vipGroupId, Integer studentId) {
+//		if(Objects.isNull(vipGroupId)||Objects.isNull(studentId)){
+//			throw new BizException("请指定课程和学生");
+//		}
+//		VipGroup vipGroup = vipGroupDao.get(vipGroupId);
+//		if(Objects.isNull(vipGroup)){
+//			throw new BizException("未找到指定vip课");
+//		}
+//		if(vipGroup.getStatus().equals(VipGroupStatusEnum.CANCEL)){
+//			throw new BizException("不能对已停止的课程进行退课操作");
+//		}
+//		Map<String,BigDecimal> result=new HashMap<>();
+//		if(vipGroup.getStatus().equals(VipGroupStatusEnum.APPLYING)){
+//			StudentPaymentOrder studentPaymentOrder = studentPaymentOrderDao.findByStudentVipGroup(vipGroupId, studentId, DealStatusEnum.SUCCESS.getCode());
+//			if(Objects.isNull(studentPaymentOrder)){
+//				BigDecimal surplusCourseFee = studentPaymentOrderDao.sumSurplusCourseFee(vipGroupId.toString(), studentId);
+//				if(Objects.isNull(surplusCourseFee)){
+//					result.put("suplusCourseFee",new BigDecimal(0));
+//				}else{
+//					result.put("suplusCourseFee",surplusCourseFee);
+//				}
+//			}else{
+//				result.put("suplusCourseFee",studentPaymentOrder.getActualAmount());
+//			}
+//			return result;
+//		}
+//		ClassGroup classGroup = classGroupDao.findByVipGroup(vipGroupId, null);
+//		if(Objects.isNull(classGroup)){
+//			throw new BizException("未找到对应班级");
+//		}
+//		BigDecimal bigDecimal = courseScheduleStudentPaymentDao.countSurplusCourseFee(classGroup.getId(), studentId);
+//		if(Objects.isNull(bigDecimal)){
+//			bigDecimal = new BigDecimal(0);
+//		}
+//		bigDecimal = bigDecimal.multiply(new BigDecimal(0.8)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
+//		result.put("suplusCourseFee", bigDecimal);
+//		return result;
+//	}
+
 	@Transactional(rollbackFor = Exception.class)
 	@Override
 	public void applyRefundAudit(Long id, StudentApplyRefundsStatus status, String remark,BigDecimal amount) {
@@ -2416,8 +2560,6 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			noCreateSuccessVipGroup.setStatus(VipGroupStatusEnum.CANCEL);
 			List<StudentPaymentOrder> studentPaymentOrders = studentPaymentOrderDao.queryByDealStatus(noCreateSuccessVipGroup.getId().toString(),
 					OrderTypeEnum.SMALL_CLASS_TO_BUY, DealStatusEnum.SUCCESS);
-			//推送消息
-			stopVipPush(noCreateSuccessVipGroup.getId(),noCreateSuccessVipGroup.getName());
 
 			for (StudentPaymentOrder studentPaymentOrder:studentPaymentOrders){
 				//生成账户资金明细
@@ -2437,10 +2579,18 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		if(!CollectionUtils.isEmpty(userCashAccountDetails)){
 			sysUserCashAccountDetailDao.batchInsert(userCashAccountDetails);
 		}
-		vipGroupDao.batchUpdate(noCreateSuccessVipGroups);
+		if(noCreateSuccessVipGroups != null && noCreateSuccessVipGroups.size() > 0){
+			vipGroupDao.batchUpdate(noCreateSuccessVipGroups);
+			
+			for (VipGroup noCreateSuccessVipGroup : noCreateSuccessVipGroups) {
+				//推送消息
+				stopVipPush(noCreateSuccessVipGroup.getId(),noCreateSuccessVipGroup.getName());
+			}
+		}
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
 	public void updateVipGroupStatusToFinished() {
 		List<VipGroup> vipGroupList = vipGroupDao.queryRequiredOverList();
 		if (vipGroupList != null && vipGroupList.size() > 0) {
@@ -2455,45 +2605,35 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		if (!CollectionUtils.isEmpty(normalVipGroupList)){
             Date now = new Date();
             List<VipGroup> needUpdateVipGroups = new ArrayList<>();
-            for (VipGroup vipGroup : normalVipGroupList) {
-                try {
-                	if(Objects.isNull(vipGroup.getRegistrationStartTime())){
-                		continue;
+			for (VipGroup vipGroup : normalVipGroupList) {
+				try {
+					if (Objects.isNull(vipGroup.getRegistrationStartTime())) {
+						continue;
 					}
-                	if(vipGroup.getStatus().equals(VipGroupStatusEnum.PAUSE)){
-                		continue;
+					if (vipGroup.getStatus().equals(VipGroupStatusEnum.PAUSE) || vipGroup.getStatus().equals(VipGroupStatusEnum.CANCEL)
+							|| vipGroup.getStatus().equals(VipGroupStatusEnum.FINISHED) || vipGroup.getStatus().equals(VipGroupStatusEnum.PROGRESS)) {
+						continue;
 					}
-                	if(vipGroup.getStatus().equals(VipGroupStatusEnum.CANCEL)){
-                		continue;
+					if (now.before(vipGroup.getRegistrationStartTime())) {
+						vipGroup.setStatus(VipGroupStatusEnum.NOT_START);
+					} else if (vipGroup.getRegistrationStartTime().before(now) && vipGroup.getPaymentExpireDate().after(now)) {
+						vipGroup.setStatus(VipGroupStatusEnum.APPLYING);
 					}
-                    if(now.before(vipGroup.getRegistrationStartTime())){
-                        vipGroup.setStatus(VipGroupStatusEnum.NOT_START);
-                    }
-                    if(vipGroup.getRegistrationStartTime().before(now)&&vipGroup.getPaymentExpireDate().after(now)){
-                        if(vipGroup.getStatus().equals(VipGroupStatusEnum.NOT_START)){
-							vipGroup.setStatus(VipGroupStatusEnum.APPLYING);
-						}
-                    }
-                    if(vipGroup.getPaymentExpireDate().before(now)&&vipGroup.getCourseStartDate().after(now)){
-						if(vipGroup.getStatus().equals(VipGroupStatusEnum.APPLYING)) {
-							vipGroup.setStatus(VipGroupStatusEnum.APPLYING_END);
-						}
-                    }
-                    if(vipGroup.getCourseStartDate().before(now)&&vipGroup.getCoursesExpireDate().after(now)){
-						if(vipGroup.getStatus().equals(VipGroupStatusEnum.APPLYING_END)){
-							vipGroup.setStatus(VipGroupStatusEnum.PROGRESS);
-						}
-                    }
-                    VipGroup vipGroup1 = new VipGroup();
-                    vipGroup1.setId(vipGroup.getId());
-                    vipGroup1.setStatus(vipGroup.getStatus());
-                    vipGroup1.setUpdateTime(now);
-                    vipGroup1.setTotalPrice(vipGroup.getTotalPrice());
-                    needUpdateVipGroups.add(vipGroup1);
-                } catch (Exception e) {
-                    e.printStackTrace();
-                }
-            }
+					if (vipGroup.getPaymentExpireDate().before(now) && vipGroup.getCourseStartDate().after(now)) {
+						vipGroup.setStatus(VipGroupStatusEnum.APPLYING_END);
+					} else if (vipGroup.getCourseStartDate().before(now) && vipGroup.getCoursesExpireDate().after(now)) {
+						vipGroup.setStatus(VipGroupStatusEnum.PROGRESS);
+					}
+					VipGroup vipGroup1 = new VipGroup();
+					vipGroup1.setId(vipGroup.getId());
+					vipGroup1.setStatus(vipGroup.getStatus());
+					vipGroup1.setUpdateTime(now);
+					vipGroup1.setTotalPrice(vipGroup.getTotalPrice());
+					needUpdateVipGroups.add(vipGroup1);
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+			}
             vipGroupDao.batchUpdate(needUpdateVipGroups);
         }
 	}

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

@@ -437,7 +437,7 @@
     <select id="getCourseSchedulesWithDate" resultMap="courseScheduleDto">
         SELECT
             cs.id_ seal_class_id_,
-            cs.name_,
+            cg.name_,
             cs.type_,
             cs.id_,
             cs.class_date_,
@@ -448,6 +448,8 @@
             cs.student_num_,
             cs.leave_student_num_,
             cs.teach_mode_,
+            cs.music_group_id_,
+            cs.group_type_,
             cg.student_num_ total_student_num_,
             su.real_name_ teacher_name_,
             IF(ta.sign_in_status_ IS NULL,3,ta.sign_in_status_) sign_in_status_,
@@ -470,6 +472,9 @@
         <if test="type!=null">
             AND cg.group_type_ = #{type}
         </if>
+        <if test="musicGroupId!=null">
+            AND cs.music_group_id_=#{musicGroupId} AND cs.group_type_='MUSIC'
+        </if>
         AND cs.class_date_ = DATE_FORMAT(#{date},'%Y-%m-%d')
         ORDER BY CONCAT(cs.class_date_,' ',cs.start_class_time_)
         <include refid="global.limit"/>
@@ -493,6 +498,9 @@
                     #{group.id}
                 </foreach>
             </if>
+            <if test="musicGroupId!=null">
+                AND cs.music_group_id_=#{musicGroupId} AND cs.group_type_='MUSIC'
+            </if>
             AND cs.class_date_ = DATE_FORMAT(#{date},'%Y-%m-%d')
     </select>
 
@@ -1236,28 +1244,30 @@
     
     <select id="queryTeacherCourseScheduleListByTimeRangeAndType" resultMap="CourseSchedule" parameterType="map">
         SELECT
-            id_,
-            class_group_id_,
-            status_,
-            subsidy_,
-            class_date_,
-            CONCAT(class_date_,' ',start_class_time_) start_class_time_,
-            CONCAT(class_date_,' ',end_class_time_) end_class_time_,
-            teacher_id_,
-            actual_teacher_id_,
-            create_time_,
-            update_time_,
-            teach_mode_,
-            type_,
-            name_,
-            student_num_,
-            leave_student_num_,
-            schoole_id_
-        FROM course_schedule WHERE teacher_id_=#{teacherId} and CONCAT( class_date_, ' ', start_class_time_ ) between #{startTime} and #{endTime}
+            cs.id_,
+            cs.class_group_id_,
+            cs.status_,
+            cs.subsidy_,
+            cs.class_date_,
+            CONCAT(cs.class_date_,' ',cs.start_class_time_) start_class_time_,
+            CONCAT(cs.class_date_,' ',cs.end_class_time_) end_class_time_,
+            cs.teacher_id_,
+            cs.actual_teacher_id_,
+            cs.create_time_,
+            cs.update_time_,
+            cs.teach_mode_,
+            cs.type_,
+            cg.name_,
+            cs.student_num_,
+            cs.leave_student_num_,
+            cs.schoole_id_
+        FROM course_schedule cs
+          LEFT JOIN class_group cg ON cs.class_group_id_=cg.id_
+        WHERE cs.teacher_id_=#{teacherId} and CONCAT( cs.class_date_, ' ', cs.start_class_time_ ) between #{startTime} and #{endTime}
         <if test="type != null">
-          and type_ = #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+          and cs.type_ = #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
         </if>
-        ORDER BY CONCAT(class_date_,' ',start_class_time_)
+        ORDER BY CONCAT(cs.class_date_,' ',cs.start_class_time_)
     </select>
     <!-- 查找班级未开始的课程 -->
     <select id="findNoStartCoursesByClassGroupId" resultMap="CourseSchedule">
@@ -1846,6 +1856,35 @@
             AND cs.music_group_id_ = #{groupId}
             AND cssp.user_id_=#{userId}
     </select>
+
+    <select id="findUserCourseInfos" resultMap="StudentCourseInfoDto">
+        SELECT
+            cs.id_,
+            cs.music_group_id_,
+            cs.class_group_id_,
+            cs.status_,
+            cs.class_date_,
+            cs.start_class_time_,
+            cs.end_class_time_,
+            cs.actual_teacher_id_,
+            cs.teach_mode_,
+            cssp.expect_price_
+        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)
+            AND cs.group_type_ = #{groupType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+            AND cs.music_group_id_ = #{groupId}
+            AND cssp.user_id_=#{userId}
+            <if test="type=='history'">
+                AND CONCAT( cs.class_date_, ' ', cs.end_class_time_ ) &lt;= NOW()
+            </if>
+            <if test="type=='surplus'">
+                AND CONCAT( cs.class_date_, ' ', cs.start_class_time_ ) &gt; NOW()
+            </if>
+    </select>
+
     <select id="getMinCourseTime" resultType="java.util.Date">
         SELECT MIN(CONCAT(class_date_,' ',start_class_time_))
         FROM course_schedule
@@ -2019,4 +2058,21 @@
         AND cs.class_date_&gt;=DATE_FORMAT(#{fromDate},"%Y-%m-%d")
         AND (cs.del_flag_ IS NULL OR cs.del_flag_=0)
     </select>
+
+    <select id="findGroupCourseStartTime" resultType="java.util.Date">
+        SELECT MIN(CONCAT(class_date_,' ',start_class_time_)) FROM course_schedule
+        WHERE group_type_=#{groupType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+                AND music_group_id_=#{groupId}
+    </select>
+
+    <select id="findGroupCourseEndTime" resultType="java.util.Date">
+        SELECT MAX(CONCAT(class_date_,' ',end_class_time_)) FROM course_schedule
+        WHERE group_type_=#{groupType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+                AND music_group_id_=#{groupId}
+    </select>
+    <select id="countGroupAllCourses" resultType="int">
+        SELECT COUNT(*) FROM course_schedule
+        WHERE group_type_=#{groupType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+                AND music_group_id_=#{groupId}
+    </select>
 </mapper>

+ 4 - 7
mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml

@@ -147,19 +147,18 @@
 
 	<resultMap id="StudentAttendanceStatisticsResp" type="com.ym.mec.biz.dal.dto.StudentAttendanceStatisticsResponse">
 		<result property="userId" column="user_id_"/>
-		<result property="studentName" column="real_name_"/>
+		<result property="studentName" column="username_"/>
 	</resultMap>
 
 	<select id="findStudentByClassGroup" resultMap="StudentAttendanceStatisticsResp">
 		SELECT
 			cssp.user_id_,
-			su.real_name_
+			su.username_
 		FROM
 			course_schedule_student_payment cssp
-			LEFT JOIN course_schedule cs ON cssp.course_schedule_id_ = cs.id_
 			LEFT JOIN sys_user su ON cssp.user_id_ = su.id_
 		WHERE
-			cs.class_group_id_ = #{classGroupId}
+			cssp.class_group_id_ = #{classGroupId}
 		GROUP BY
 			cssp.user_id_
 		ORDER BY cssp.user_id_
@@ -171,10 +170,8 @@
 			COUNT(DISTINCT cssp.user_id_)
 		FROM
 			course_schedule_student_payment cssp
-			LEFT JOIN course_schedule cs ON cssp.course_schedule_id_ = cs.id_
-			LEFT JOIN sys_user su ON cssp.user_id_ = su.id_
 		WHERE
-			cs.class_group_id_ = #{classGroupId}
+			cssp.class_group_id_ = #{classGroupId}
 	</select>
     <select id="countSurplusCourseFee" resultType="java.math.BigDecimal">
 		SELECT

+ 4 - 0
mec-biz/src/main/resources/config/mybatis/MusicGroupSubjectGoodsGroupMapper.xml

@@ -130,4 +130,8 @@
     <select id="findGoodsGroupByIds" resultMap="MusicGroupSubjectGoodsGroup">
         SELECT * FROM music_group_subject_goods_group WHERE FIND_IN_SET(id_,#{ids})
     </select>
+    
+    <select id="query" resultMap="MusicGroupSubjectGoodsGroup" parameterType="map">
+        SELECT * FROM music_group_subject_goods_group WHERE music_group_id_ = #{musicGroupId} and subject_id_ = #{subjectId} and goods_id_list_ = #{goodsIdList}
+    </select>
 </mapper>

+ 2 - 2
mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml

@@ -83,12 +83,12 @@
     <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.StudentPaymentOrder" useGeneratedKeys="true"
             keyColumn="id" keyProperty="id">
         INSERT INTO student_payment_order
-        (id_, group_type_, user_id_, type_, expect_amount_, actual_amount_, com_amount_, per_amount_,
+        (id_, group_type_, user_id_,organ_id_, type_, expect_amount_, actual_amount_, com_amount_, per_amount_,
          balance_payment_amount_, trans_no_,
          status_, memo_, create_time_, update_time_, payment_channel_, payment_business_channel_,
          payment_account_no_, order_no_, music_group_id_, class_group_id_)
         VALUES (#{id}, #{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-                #{userId}, #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+                #{userId},#{organId}, #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
                 #{expectAmount}, #{actualAmount}, #{comAmount}, #{perAmount}, #{balancePaymentAmount}, #{transNo},
                 #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{memo}, now(), now(),
                 #{paymentChannel}, #{paymentBusinessChannel}, #{paymentAccountNo}, #{orderNo}, #{musicGroupId},

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

@@ -313,6 +313,7 @@
             vg.audit_status_='PASS'
             AND vg.status_=1
             AND vg.courses_expire_date_ &gt;= DATE_FORMAT(NOW(),'%Y%m%d')
+            AND vg.registration_start_time_ &lt;= NOW()
             AND vg.courses_start_date &gt; NOW()
             AND (select count(1) as num from student_payment_order where vg.id_ = music_group_id_ AND user_id_=#{userId} AND status_='SUCCESS') = 0
             AND (vg.organ_id_ = #{organId} OR FIND_IN_SET(#{userId}, vg.student_id_list_))
@@ -891,7 +892,8 @@
     </update>
     
     <select id="queryRequiredOverList" resultMap="VipGroup">
-    	select vg.* from vip_group vg left join class_group cg on vg.id_ = cg.music_group_id_ where vg.status_ = 2 and cg.total_class_times_ = cg.current_class_times_ and cg.total_class_times_ &gt; 0
+    	select vg.* from vip_group vg left join class_group cg on vg.id_ = cg.music_group_id_
+    	where vg.status_ = 2 and cg.total_class_times_ = cg.current_class_times_ and cg.total_class_times_ &gt; 0
     </select>
     <select id="queryNormalStatusList" resultMap="VipGroup">
         SELECT * FROM vip_group WHERE status_!=3 AND status_!=4

+ 21 - 0
mec-student/src/main/resources/logback-spring.xml

@@ -27,8 +27,29 @@
 		</encoder>
 	</appender>
 
+	<appender name="messagefile"
+		class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<FileNamePattern>/mdata/logs/student-message-%d{yyyy-MM-dd_HH}-%i.log</FileNamePattern>
+			<MaxHistory>90</MaxHistory>
+			<TimeBasedFileNamingAndTriggeringPolicy
+				class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+				<MaxFileSize>20MB</MaxFileSize>
+			</TimeBasedFileNamingAndTriggeringPolicy>
+		</rollingPolicy>
+
+		<encoder>
+			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
+		</encoder>
+	</appender>
+
 	<logger name="com.ym.mec" level="INFO" />
 
+	<logger name="com.ym.mec.thirdparty" level="INFO"
+		additivity="false">
+		<appender-ref ref="messagefile" />
+	</logger>
+
 	<!--开发环境:打印控制台 -->
 	<springProfile name="dev">
 		<root level="INFO">

+ 1 - 2
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherLeaveRecordController.java

@@ -17,7 +17,6 @@ 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.entity.TeacherLeaveRecord;
-import com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType;
 import com.ym.mec.biz.service.TeacherLeaveRecordService;
 import com.ym.mec.common.controller.BaseController;
 
@@ -42,7 +41,7 @@ public class TeacherLeaveRecordController extends BaseController {
 		if (Objects.isNull(sysUser)) {
 			return failed(HttpStatus.FORBIDDEN, "请登录");
 		}
-		return succeed(courseScheduleDao.queryTeacherCourseScheduleListByTimeRangeAndType(sysUser.getId(), CourseScheduleType.VIP, startTime, endTime));
+		return succeed(courseScheduleDao.queryTeacherCourseScheduleListByTimeRangeAndType(sysUser.getId(), null, startTime, endTime));
 	}
 
 	@ApiOperation(value = "请假")

+ 21 - 0
mec-teacher/src/main/resources/logback-spring.xml

@@ -27,8 +27,29 @@
 		</encoder>
 	</appender>
 
+	<appender name="messagefile"
+		class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<FileNamePattern>/mdata/logs/teacher-message-%d{yyyy-MM-dd_HH}-%i.log</FileNamePattern>
+			<MaxHistory>90</MaxHistory>
+			<TimeBasedFileNamingAndTriggeringPolicy
+				class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+				<MaxFileSize>20MB</MaxFileSize>
+			</TimeBasedFileNamingAndTriggeringPolicy>
+		</rollingPolicy>
+
+		<encoder>
+			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
+		</encoder>
+	</appender>
+
 	<logger name="com.ym.mec" level="INFO" />
 
+	<logger name="com.ym.mec.thirdparty" level="INFO"
+		additivity="false">
+		<appender-ref ref="messagefile" />
+	</logger>
+
 	<!--开发环境:打印控制台 -->
 	<springProfile name="dev">
 		<root level="INFO">

+ 6 - 6
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/message/MessageSenderPluginContext.java

@@ -21,13 +21,13 @@ public class MessageSenderPluginContext implements ApplicationContextAware {
 
 	public enum MessageSender {
 
-		JIGUANG("PUSH"), MOXINGTONG("SMS"), SHIYUAN("SMS"),YIMEI("SMS");
-		
+		JIGUANG("PUSH"), MOXINGTONG("SMS"), SHIYUAN("SMS"), YIMEI("SMS");
+
 		/**
 		 * 发送模式(SMS,PUSH,EMAIL)
 		 */
 		private String sendMode;
-		
+
 		private MessageSender(String sendMode) {
 			this.sendMode = sendMode;
 		}
@@ -70,7 +70,7 @@ public class MessageSenderPluginContext implements ApplicationContextAware {
 
 		messageSenderPlugin = getMessageSenderPlugin(messageSender);
 
-		return messageSenderPlugin.send(subject, content, receiver, url,jpushType);
+		return messageSenderPlugin.send(subject, content, receiver, url, jpushType);
 	}
 
 	/**
@@ -87,7 +87,7 @@ public class MessageSenderPluginContext implements ApplicationContextAware {
 
 		messageSenderPlugin = getMessageSenderPlugin(messageSender);
 
-		return messageSenderPlugin.batchSend(subject, content, receivers, url,jpushType);
+		return messageSenderPlugin.batchSend(subject, content, receivers, url, jpushType);
 	}
 
 	@Override
@@ -99,7 +99,7 @@ public class MessageSenderPluginContext implements ApplicationContextAware {
 		String beanId = mapper.get(StringUtils.lowerCase(messageSender.name()));
 
 		if (StringUtils.isBlank(beanId)) {
-			throw new ThirdpartyException("消息提供方不存在");
+			throw new ThirdpartyException("消息提供方:{}不存在", beanId);
 		}
 
 		return applicationContext.getBean(beanId, MessageSenderPlugin.class);

+ 5 - 11
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/message/provider/JiguangPushPlugin.java

@@ -5,12 +5,16 @@ import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.thirdparty.exception.ThirdpartyException;
 import com.ym.mec.thirdparty.message.MessageSenderPlugin;
 import com.ym.mec.util.http.HttpUtil;
+
 import org.apache.commons.codec.binary.Base64;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+
 import java.io.IOException;
+import java.util.Arrays;
 import java.util.HashMap;
+import java.util.stream.Collectors;
 
 /**
  * 极光推送
@@ -188,7 +192,7 @@ public class JiguangPushPlugin implements MessageSenderPlugin, InitializingBean
 		JSONObject json = JSONObject.parseObject(result);
 		if (json.containsKey("error")) {
 			JSONObject jsonObject = json.getJSONObject("error");
-			throw new ThirdpartyException(jsonObject.get("message").toString());
+			throw new ThirdpartyException(jsonObject.get("message").toString()+"["+Arrays.stream(receivers).collect(Collectors.joining(","))+"]");
 		}
 		return true;
 	}
@@ -229,14 +233,4 @@ public class JiguangPushPlugin implements MessageSenderPlugin, InitializingBean
 		this.reqURL = reqURL;
 	}
 
-	/*public static void main(String[] args) throws IOException {
-		
-		String str = "2094588";
-		
-		
-		JiguangPushPlugin plugin = new JiguangPushPlugin();
-		
-		plugin.batchSend("基础技能训练报名通知", "家长您好:经五路小学比赛团乐团基础技能训练已经开始缴费。请您在收到本通知后,点击http://mstuonline.dayaedu.com/#/smallRegister?musicGroupId=19121912014300001 进行缴费,若有疑问请咨询800-8208820", str.split(","), "5?http://mstudev.dayaedu.com/#/smallRegister?musicGroupId=19121912014300001");
-	}*/
-
 }

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

@@ -916,6 +916,22 @@ public class DateUtil {
 	}
 
 	/**
+	 * @describe 获取指定时间再当天最后一秒的时间
+	 * @author Joburgess
+	 * @date 2020/1/16
+	 * @param date: 时间
+	 * @return java.util.Date
+	 */
+	public static Date getLastSecondWithDay(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);
+		return calendar.getTime();
+	}
+
+	/**
 	 * @describe 根据日期获取所在周的周一
 	 * @author Joburgess
 	 * @date 2019/10/25

+ 5 - 7
mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

@@ -201,9 +201,10 @@ public class ExportController extends BaseController {
             if (row.getOrderDetailList() != null) {
                 for (StudentPaymentOrderDetail orderDetail : row.getOrderDetailList()) {
                     if (orderDetail.getType().equals(OrderDetailTypeEnum.MUSICAL)) {
-                        musicalFee = orderDetail.getPrice();
                         if(orderDetail.getKitGroupPurchaseType() != null && orderDetail.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.LEASE)){
                             leaseFee = orderDetail.getPrice();
+                        }else {
+                            musicalFee = orderDetail.getPrice();
                         }
                     } else if (orderDetail.getType().equals(OrderDetailTypeEnum.COURSE)) {
                         courseFee = courseFee.add(orderDetail.getPrice());
@@ -213,7 +214,7 @@ public class ExportController extends BaseController {
                 }
             }
             if(row.getGoodsList() != null){
-                goodsName = row.getGoodsList().stream().map(goods -> goods.getName()).collect(Collectors.joining("|"));
+                goodsName = row.getGoodsList().stream().map(Goods::getName).collect(Collectors.joining("|"));
             }
             row.setCourseFee(courseFee);
             row.setMusicalFee(musicalFee);
@@ -226,11 +227,6 @@ public class ExportController extends BaseController {
                 if (studentRegistration != null) {
                     row.setSubjectName(studentRegistration.getSubjectName());
                     row.setSchoolName(studentRegistration.getSchoolName());
-                    //更新数据后删除
-                    if (row.getType().equals(OrderTypeEnum.APPLY) && studentRegistration.getKitType() != null && studentRegistration.getKitType().equals("LEASE")) {
-                        row.setLeaseFee(musicalFee);
-                        row.setMusicalFee(BigDecimal.ZERO);
-                    }
                 }
             } else if (row.getGroupType().equals(GroupType.VIP)) {
                 row.setCourseFee(row.getActualAmount());
@@ -257,6 +253,8 @@ public class ExportController extends BaseController {
                         row.setSporadicType("维修费");
                     }else if (row.getChargeType().equals(6)) {
                         row.setSporadicType("福袋活动");
+                    }else if (row.getChargeType().equals(7)) {
+                        row.setSporadicType("上门费");
                     }
                 }
                 School userSchool = musicGroupDao.findUserSchool(row.getUserId());

+ 21 - 0
mec-web/src/main/resources/logback-spring.xml

@@ -27,8 +27,29 @@
 		</encoder>
 	</appender>
 
+	<appender name="messagefile"
+		class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<FileNamePattern>/mdata/logs/web-message-%d{yyyy-MM-dd_HH}-%i.log</FileNamePattern>
+			<MaxHistory>90</MaxHistory>
+			<TimeBasedFileNamingAndTriggeringPolicy
+				class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+				<MaxFileSize>20MB</MaxFileSize>
+			</TimeBasedFileNamingAndTriggeringPolicy>
+		</rollingPolicy>
+
+		<encoder>
+			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
+		</encoder>
+	</appender>
+
 	<logger name="com.ym.mec" level="INFO" />
 
+	<logger name="com.ym.mec.thirdparty" level="INFO"
+		additivity="false">
+		<appender-ref ref="messagefile" />
+	</logger>
+
 	<!--开发环境:打印控制台 -->
 	<springProfile name="dev">
 		<root level="INFO">