liujunchi 2 лет назад
Родитель
Сommit
d8205768a1
22 измененных файлов с 559 добавлено и 69 удалено
  1. 3 3
      audio-analysis/src/main/java/com/yonge/netty/dto/HardLevelEnum.java
  2. 12 1
      audio-analysis/src/main/java/com/yonge/netty/entity/MusicXmlBasicInfo.java
  3. 1 1
      audio-analysis/src/main/java/com/yonge/netty/server/service/AudioCompareHandler.java
  4. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupStudentMapperDao.java
  5. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  6. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TempLittleArtistTrainingCampDao.java
  7. 17 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/UserMusicCompareCampDayDataDao.java
  8. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TempLittleArtistTrainingCampDto.java
  9. 25 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/VipGroupClassGroupMapper.java
  10. 90 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/UserMusicCompareCampDayData.java
  11. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysMusicCompareRecordService.java
  12. 14 0
      mec-biz/src/main/java/com/ym/mec/biz/service/UserMusicCompareCampDayDataService.java
  13. 32 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicCompareRecordServiceImpl.java
  14. 21 21
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TempLittleArtistTrainingCampServiceImpl.java
  15. 19 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/UserMusicCompareCampDayDataServiceImpl.java
  16. 191 35
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  17. 10 0
      mec-biz/src/main/resources/config/mybatis/ClassGroupStudentMapperMapper.xml
  18. 11 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  19. 70 0
      mec-biz/src/main/resources/config/mybatis/TempLittleArtistTrainingCampMapper.xml
  20. 13 0
      mec-biz/src/main/resources/config/mybatis/UserMusicCompareCampDayDataMapper.xml
  21. 2 2
      mec-student/src/main/java/com/ym/mec/student/controller/SysMusicCompareRecordController.java
  22. 5 4
      mec-web/pom.xml

+ 3 - 3
audio-analysis/src/main/java/com/yonge/netty/dto/HardLevelEnum.java

@@ -9,20 +9,20 @@ public enum HardLevelEnum implements BaseEnum<String, HardLevelEnum> {
 	 * 完成度范围, 未演奏的范围
 	 */
 	//BEGINNER("入门级", 3, 5, 5, 5, 10, 10, 13, 15, 60, 10), 
-	BEGINNER("入门级", 3, 5, 10, 10, 15, 18, 22, 25, 70, 25), 
+	BEGINNER("入门级", 3, 5, 10, 10, 15, 15, 22, 22, 75, 25), 
 	/**
 	 * 进阶级, 振幅阈值, 频率阈值 <br>
 	 * 节奏有效范围(1分音符), 节奏有效范围(2分音符), 节奏有效范围(4分音符), 节奏有效范围(8分音符), 节奏有效范围(16分音符), 节奏有效范围(32分音符)<br>
 	 * 完成度范围, 未演奏的范围
 	 */
-	ADVANCED("进阶级", 3, 5, 8, 8, 12, 15, 20, 22, 80, 15),
+	ADVANCED("进阶级", 3, 5, 8, 8, 12, 12, 20, 20, 85, 15),
 	//ADVANCED("进阶级", 3, 5, 50, 50, 50, 50, 50, 5, 80, 10),
 	/**
 	 * 大师级, 振幅阈值, 频率阈值 <br>
 	 * 节奏有效范围(1分音符), 节奏有效范围(2分音符), 节奏有效范围(4分音符), 节奏有效范围(8分音符), 节奏有效范围(16分音符), 节奏有效范围(32分音符)<br>
 	 * 完成度范围, 未演奏的范围
 	 */
-	PERFORMER("大师级", 3, 3, 5, 5, 10, 12, 15, 18, 90, 10);
+	PERFORMER("大师级", 3, 3, 5, 5, 10, 10, 13, 15, 95, 10);
 
 	private String msg;
 

+ 12 - 1
audio-analysis/src/main/java/com/yonge/netty/entity/MusicXmlBasicInfo.java

@@ -14,6 +14,8 @@ public class MusicXmlBasicInfo {
 	private Integer tenantId;
 
 	private Integer subjectId;
+
+    private Integer campId;
 	
 	private String clientId;
 
@@ -41,7 +43,16 @@ public class MusicXmlBasicInfo {
 
 	private Map<Integer, MusicXmlSection> musicXmlSectionMap = new HashMap<Integer, MusicXmlSection>();
 
-	public Integer getId() {
+
+    public Integer getCampId() {
+        return campId;
+    }
+
+    public void setCampId(Integer campId) {
+        this.campId = campId;
+    }
+
+    public Integer getId() {
 		return id;
 	}
 

+ 1 - 1
audio-analysis/src/main/java/com/yonge/netty/server/service/AudioCompareHandler.java

@@ -159,7 +159,7 @@ public class AudioCompareHandler implements MessageHandler {
 				
 				MusicXmlNote musicXmlNote = musicXmlBasicInfo.getMusicXmlInfos().stream().max(Comparator.comparing(MusicXmlNote::getTimeStamp)).get();
 				sysMusicCompareRecord.setSourceTime((float) ((musicXmlNote.getTimeStamp()+musicXmlNote.getDuration())/1000));
-				sysMusicCompareRecordService.insert(sysMusicCompareRecord);
+				sysMusicCompareRecordService.insert(sysMusicCompareRecord,musicXmlBasicInfo.getCampId());
 				channelContext.setRecordId(sysMusicCompareRecord.getId());
 			}
 			break;

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupStudentMapperDao.java

@@ -14,6 +14,7 @@ import com.ym.mec.biz.dal.dto.StudentAttendanceViewDto;
 import com.ym.mec.biz.dal.dto.StudentEduTeacherDto;
 import com.ym.mec.biz.dal.dto.StudentNameAndPhoneDto;
 import com.ym.mec.biz.dal.dto.TeacherClassStudentDto;
+import com.ym.mec.biz.dal.dto.VipGroupClassGroupMapper;
 import com.ym.mec.biz.dal.entity.ClassGroup;
 import com.ym.mec.biz.dal.entity.ClassGroupStudentMapper;
 import com.ym.mec.biz.dal.entity.StudentRegistration;
@@ -475,4 +476,6 @@ public interface ClassGroupStudentMapperDao extends BaseDAO<Long, ClassGroupStud
     List<ClassGroupStudentMapperDto> queryByClassGroupType(@Param("musicGroupId") String musicGroupId,@Param("classGroupType") ClassGroupTypeEnum classGroupType,@Param("teacherRole") TeachTypeEnum teacherRole, @Param("studentIdList") List<Integer> studentIdList);
 
     Integer countByUserIdsAndClassIds(@Param("studentIds") String studentIds, @Param("oldClassId") Integer oldClassId);
+    
+    List<VipGroupClassGroupMapper> queryWaitCancelVipGroup();
 }

+ 5 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java

@@ -362,4 +362,9 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
     List<TempCampUserTrainingSequenceVo> getStudentCloudStudySequenceDays(@Param("studentIds") List<Integer> studentIds,
                                                                           @Param("startTime") String startTime,
                                                                           @Param("endTime") String endTime);
+
+
+    List<TempCampUserTrainingSequenceVo> getStudentCloudStudySequenceDaysV2(@Param("studentIds") List<Integer> studentIds,
+                                                                          @Param("startTime") String startTime,
+                                                                          @Param("endTime") String endTime);
 }

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TempLittleArtistTrainingCampDao.java

@@ -25,6 +25,8 @@ public interface TempLittleArtistTrainingCampDao extends BaseMapper<TempLittleAr
 
     <T> List<T> queryUserTrainingTime(@Param("param") Map<String, Object> param);
 
+    <T> List<T> queryUserTrainingTimeV2(@Param("param") Map<String, Object> param);
+
     List<Integer> queryAllUserId();
 
     <T> IPage<T> queryCampUser(Page<T> page, @Param("param") Map<String, Object> param);
@@ -35,6 +37,8 @@ public interface TempLittleArtistTrainingCampDao extends BaseMapper<TempLittleAr
      */
     <T> IPage<T> queryUserTrainingDetail(Page<T> page, @Param("param") Map<String, Object> param);
 
+    <T> IPage<T> queryUserTrainingDetailV2(Page<T> page, @Param("param") Map<String, Object> param);
+
     List<ImGroup> queryCampImGroup(String imGroupIds);
 
     Integer queryUserTrainingPlayTime(@Param("param") Map<String, Object> param);

+ 17 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/UserMusicCompareCampDayDataDao.java

@@ -0,0 +1,17 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ym.mec.biz.dal.entity.UserMusicCompareCampDayData;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2023-03-23
+ */
+@Repository
+public interface UserMusicCompareCampDayDataDao extends BaseMapper<UserMusicCompareCampDayData> {
+    int updateCampDayData(@Param("userId") Integer userId, @Param("campId") Integer campId, @Param("playTime") float playTime);
+}

+ 2 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TempLittleArtistTrainingCampDto.java

@@ -44,10 +44,10 @@ public class TempLittleArtistTrainingCampDto implements Serializable {
     private Date trainEndDate;
 
     @ApiModelProperty(value = "适用分部")
-    private String organIds = "";
+    private String organIds;
 
     @ApiModelProperty(value = "适用学校")
-    private String musicGroupIds = "";
+    private String musicGroupIds;
 
     @NotNull(message = "打卡标准不能为空")
     @ApiModelProperty(value = "打卡标准")

+ 25 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/VipGroupClassGroupMapper.java

@@ -0,0 +1,25 @@
+package com.ym.mec.biz.dal.dto;
+
+public class VipGroupClassGroupMapper {
+
+	private Long id;
+	
+	private Integer classGroupId;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Integer getClassGroupId() {
+		return classGroupId;
+	}
+
+	public void setClassGroupId(Integer classGroupId) {
+		this.classGroupId = classGroupId;
+	}
+	
+}

+ 90 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/UserMusicCompareCampDayData.java

@@ -0,0 +1,90 @@
+package com.ym.mec.biz.dal.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2023-03-23
+ */
+@TableName("user_music_compare_camp_day_data")
+@ApiModel(value = "UserMusicCompareCampDayData对象", description = "")
+public class UserMusicCompareCampDayData implements Serializable {
+    private static final long serialVersionUID = 1L;
+    @TableId(value = "id_", type = IdType.AUTO)
+    private Long id;
+    @ApiModelProperty("用户编号 ")
+    @TableField(value = "user_id_")
+    private Integer userId;
+    @ApiModelProperty("训练营id ")
+    @TableField(value = "camp_id_")
+    private Integer campId;
+    @ApiModelProperty("日期 ")
+    @TableField(value = "day_")
+    private Date day;
+    @ApiModelProperty("训练次数 ")
+    @TableField(value = "train_num_")
+    private Integer trainNum;
+    @ApiModelProperty("训练时长 ")
+    @TableField(value = "train_time_")
+    private Float trainTime;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getCampId() {
+        return campId;
+    }
+
+    public void setCampId(Integer campId) {
+        this.campId = campId;
+    }
+
+    public Date getDay() {
+        return day;
+    }
+
+    public void setDay(Date day) {
+        this.day = day;
+    }
+
+    public Integer getTrainNum() {
+        return trainNum;
+    }
+
+    public void setTrainNum(Integer trainNum) {
+        this.trainNum = trainNum;
+    }
+
+    public Float getTrainTime() {
+        return trainTime;
+    }
+
+    public void setTrainTime(Float trainTime) {
+        this.trainTime = trainTime;
+    }
+
+
+}

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

@@ -101,4 +101,13 @@ public interface SysMusicCompareRecordService extends BaseService<Long, SysMusic
     void initSysMusicCompareDayData();
     
     PageInfo<TeacherCloudTrainingDto> queryTeacherTraining(TeacherCloudTrainingQueryInfo queryInfo);
+
+
+    /**
+     * 小小训练营 保存用户评测记录
+     *
+     * @param record 评测记录
+     * @param campId 训练营id
+     */
+    boolean insert(SysMusicCompareRecord record,Integer campId);
 }

+ 14 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/UserMusicCompareCampDayDataService.java

@@ -0,0 +1,14 @@
+package com.ym.mec.biz.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.entity.UserMusicCompareCampDayData;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2023-03-23
+ */
+public interface UserMusicCompareCampDayDataService extends IService<UserMusicCompareCampDayData> {
+}

+ 32 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicCompareRecordServiceImpl.java

@@ -9,6 +9,7 @@ import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.IndexBaseMonthData;
 import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
 import com.ym.mec.biz.dal.entity.SysMusicScore;
+import com.ym.mec.biz.dal.entity.UserMusicCompareCampDayData;
 import com.ym.mec.biz.dal.enums.FeatureType;
 import com.ym.mec.biz.dal.enums.HeardLevelEnum;
 import com.ym.mec.biz.dal.enums.IndexDataType;
@@ -68,6 +69,9 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 	@Autowired
 	private StudentTeacherMapperDao studentTeacherMapperDao;
 
+    @Autowired
+    private UserMusicCompareCampDayDataDao userMusicCompareCampDayDataDao;
+
 	@Override
 	public BaseDAO<Long, SysMusicCompareRecord> getDAO() {
 		return sysMusicCompareRecordDao;
@@ -499,4 +503,32 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 		pageInfo.setRows(dataList);
 		return pageInfo;
 	}
+
+    /**
+     * 小小训练营 保存用户评测记录
+     *
+     * @param record 评测记录
+     * @param campId 训练营id
+     */
+    @Override
+    public boolean insert(SysMusicCompareRecord record, Integer campId) {
+        this.insert(record);
+
+        if (campId == null) {
+            return true;
+        }
+        // 保存训练营评测记录
+        int i = userMusicCompareCampDayDataDao.updateCampDayData(record.getUserId(), campId, record.getPlayTime());
+        if (i == 0) {
+            UserMusicCompareCampDayData campDayData = new UserMusicCompareCampDayData();
+            campDayData.setCampId(campId);
+            campDayData.setUserId(record.getUserId());
+            campDayData.setDay(new Date());
+            campDayData.setTrainNum(1);
+            campDayData.setTrainTime(record.getPlayTime());
+            userMusicCompareCampDayDataDao.insert(campDayData);
+        }
+
+        return true;
+    }
 }

+ 21 - 21
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TempLittleArtistTrainingCampServiceImpl.java

@@ -109,28 +109,27 @@ public class TempLittleArtistTrainingCampServiceImpl extends ServiceImpl<TempLit
         SysUser user = getUser();
         Date now = DateUtil.toDate(LocalDate.now().toString());
         checkDateTime(dto, now);
-        TempLittleArtistTrainingCamp entity = Optional.ofNullable(dto.getId())
-                .map(this::getById)
-                .orElseThrow(() -> new BizException("训练营不存在"));
+        Optional.ofNullable(dto.getId()).map(this::getById).orElseThrow(() -> new BizException("训练营不存在"));
         /*int count = tempLittleArtistTrainingCampUserRelationService.count(Wrappers.<TempLittleArtistTrainingCampUserRelation>lambdaQuery()
                 .eq(TempLittleArtistTrainingCampUserRelation::getActivityId, entity.getId()));
         if (count > 0) {
             throw new BizException("训练营已有学生报名,无法修改");
         }*/
-        entity.setName(dto.getName());
-        entity.setApplyStartDate(dto.getApplyStartDate());
-        entity.setApplyEndDate(dto.getApplyEndDate());
-        entity.setTrainStartDate(dto.getTrainStartDate());
-        entity.setTrainEndDate(dto.getTrainEndDate());
-        entity.setPicUrl(dto.getPicUrl());
-        entity.setEnableFlag(dto.getEnableFlag());
-        entity.setMusicGroupIds(dto.getMusicGroupIds());
-        entity.setOrganIds(dto.getOrganIds());
-        entity.setSignStandard(dto.getSignStandard());
-        entity.setStandardDays(dto.getStandardDays());
-        entity.setUpdateBy(user.getId());
-        entity.setUpdateTime(new Date());
-        this.updateById(entity);
+        this.lambdaUpdate()
+                .set(TempLittleArtistTrainingCamp::getName,dto.getName())
+                .set(TempLittleArtistTrainingCamp::getApplyStartDate,dto.getApplyStartDate())
+                .set(TempLittleArtistTrainingCamp::getApplyEndDate,dto.getApplyEndDate())
+                .set(TempLittleArtistTrainingCamp::getTrainStartDate,dto.getTrainStartDate())
+                .set(TempLittleArtistTrainingCamp::getTrainEndDate,dto.getTrainEndDate())
+                .set(TempLittleArtistTrainingCamp::getPicUrl,dto.getPicUrl())
+                .set(TempLittleArtistTrainingCamp::getEnableFlag,dto.getEnableFlag())
+                .set(TempLittleArtistTrainingCamp::getMusicGroupIds,dto.getMusicGroupIds())
+                .set(TempLittleArtistTrainingCamp::getOrganIds,dto.getOrganIds())
+                .set(TempLittleArtistTrainingCamp::getSignStandard,dto.getSignStandard())
+                .set(TempLittleArtistTrainingCamp::getStandardDays,dto.getStandardDays())
+                .set(TempLittleArtistTrainingCamp::getUpdateBy,user.getId())
+                .set(TempLittleArtistTrainingCamp::getUpdateTime,new Date())
+                        .eq(TempLittleArtistTrainingCamp::getId,dto.getId()).update();
     }
 
     /**
@@ -250,7 +249,8 @@ public class TempLittleArtistTrainingCampServiceImpl extends ServiceImpl<TempLit
         //查询每日训练时长
         param.put("startTime", startDateStr + " 00:00:00");
         param.put("endTime", endDateStr + " 23:59:59");
-        List<TempUserTrainingTimeDetailVo> userTrainingTimeList = baseMapper.queryUserTrainingTime(param);
+        param.put("campId", camp.getId());
+        List<TempUserTrainingTimeDetailVo> userTrainingTimeList = baseMapper.queryUserTrainingTimeV2(param);
         //拼接数据
         if (CollectionUtils.isNotEmpty(userTrainingTimeList)) {
             Map<String, BigDecimal> nowTrainingTime = userTrainingTimeList.stream()
@@ -284,14 +284,14 @@ public class TempLittleArtistTrainingCampServiceImpl extends ServiceImpl<TempLit
         //训练营详情-查询条件时间设置
         queryUserTrainingDetailOpsParam(param);
         Page<TempCampUserTrainingDetailVo> page = PageUtil.getPageInfo(param);
-        page.setDesc("b.playDay");
-        IPage<TempCampUserTrainingDetailVo> vos = baseMapper.queryUserTrainingDetail(page, param);
+        page.setDesc("t.playDay");
+        IPage<TempCampUserTrainingDetailVo> vos = baseMapper.queryUserTrainingDetailV2(page, param);
         List<TempCampUserTrainingDetailVo> records = vos.getRecords();
         if(CollectionUtils.isNotEmpty(records)){
             List<Integer> studentIds = records.stream().map(e -> e.getId()).collect(Collectors.toList());
             Map<Integer,String> subjectMap = MapUtil.convertIntegerMap(studentDao.getStudentSubjectMapList(studentIds));
             Map<Integer,String> groupNameMap = MapUtil.convertMybatisMap(musicGroupDao.queryNormalGroupName(studentIds));
-            List<TempCampUserTrainingSequenceVo> sequenceDays = studentDao.getStudentCloudStudySequenceDays(studentIds,
+            List<TempCampUserTrainingSequenceVo> sequenceDays = studentDao.getStudentCloudStudySequenceDaysV2(studentIds,
                     param.get("startTime").toString(),param.get("endTime").toString());
             Map<Integer, List<Long>> listMap = sequenceDays.stream().collect(Collectors.groupingBy(e -> e.getUserId(),
                     Collectors.collectingAndThen(Collectors.toList(),v->v.stream().map(e->e.getDayNum()).collect(Collectors.toList()))));

+ 19 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/UserMusicCompareCampDayDataServiceImpl.java

@@ -0,0 +1,19 @@
+package com.ym.mec.biz.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ym.mec.biz.dal.dao.UserMusicCompareCampDayDataDao;
+import com.ym.mec.biz.dal.entity.UserMusicCompareCampDayData;
+import com.ym.mec.biz.service.UserMusicCompareCampDayDataService;
+import org.springframework.stereotype.Service;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2023-03-23
+ */
+@Service
+public class UserMusicCompareCampDayDataServiceImpl extends ServiceImpl<UserMusicCompareCampDayDataDao, UserMusicCompareCampDayData>
+     implements UserMusicCompareCampDayDataService {
+
+}

+ 191 - 35
mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java

@@ -1,17 +1,179 @@
 package com.ym.mec.biz.service.impl;
 
+import static com.ym.mec.biz.dal.enums.GroupType.VIP;
+import static com.ym.mec.biz.dal.enums.SysUserRoleEnum.ORGAN_MANAGER;
+import static java.math.BigDecimal.ROUND_DOWN;
+import static java.math.BigDecimal.ZERO;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+import org.springframework.util.CollectionUtils;
+
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.dto.*;
-import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.dao.ClassGroupDao;
+import com.ym.mec.biz.dal.dao.ClassGroupStudentMapperDao;
+import com.ym.mec.biz.dal.dao.ClassGroupTeacherMapperDao;
+import com.ym.mec.biz.dal.dao.ClassGroupTeacherSalaryDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleTeacherSalaryDao;
+import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.dao.GroupDao;
+import com.ym.mec.biz.dal.dao.OrganizationDao;
+import com.ym.mec.biz.dal.dao.StudentApplyRefundsDao;
+import com.ym.mec.biz.dal.dao.StudentAttendanceDao;
+import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dao.StudentPauseInfoDao;
+import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
+import com.ym.mec.biz.dal.dao.SubjectDao;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
+import com.ym.mec.biz.dal.dao.SysUserCashAccountDetailDao;
+import com.ym.mec.biz.dal.dao.SysUserCashAccountLogDao;
+import com.ym.mec.biz.dal.dao.TeacherAttendanceDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dao.TeacherDefaultVipGroupSalaryDao;
+import com.ym.mec.biz.dal.dao.VipGroupActivityDao;
+import com.ym.mec.biz.dal.dao.VipGroupDao;
+import com.ym.mec.biz.dal.dao.VipGroupDefaultClassesCycleDao;
+import com.ym.mec.biz.dal.dao.VipGroupDefaultClassesUnitPriceDao;
+import com.ym.mec.biz.dal.dao.VipGroupStudentCoursePriceDao;
+import com.ym.mec.biz.dal.dto.ActivityUserDto;
+import com.ym.mec.biz.dal.dto.BaseMapDto;
+import com.ym.mec.biz.dal.dto.GroupUserDto;
+import com.ym.mec.biz.dal.dto.ReturnFeeDto;
+import com.ym.mec.biz.dal.dto.SimpleUserDto;
+import com.ym.mec.biz.dal.dto.StudentCourseInfoDto;
+import com.ym.mec.biz.dal.dto.StudentRecoverInfoDto;
+import com.ym.mec.biz.dal.dto.StudentVipGroupDetailDto;
+import com.ym.mec.biz.dal.dto.StudentVipGroupShowListDto;
+import com.ym.mec.biz.dal.dto.TeacherBasicDto;
+import com.ym.mec.biz.dal.dto.TeachingRecordBaseInfo;
+import com.ym.mec.biz.dal.dto.VipBuyResultDto;
+import com.ym.mec.biz.dal.dto.VipGroupApplyBaseInfoDto;
+import com.ym.mec.biz.dal.dto.VipGroupApplyDto;
+import com.ym.mec.biz.dal.dto.VipGroupBuyParamsDto;
+import com.ym.mec.biz.dal.dto.VipGroupClassGroupMapper;
+import com.ym.mec.biz.dal.dto.VipGroupCourseSchduleRecordDto;
+import com.ym.mec.biz.dal.dto.VipGroupManageDetailDto;
+import com.ym.mec.biz.dal.dto.VipGroupPayInfoDto;
+import com.ym.mec.biz.dal.dto.VipGroupSalaryBaseInfo;
+import com.ym.mec.biz.dal.dto.VipGroupSalaryDto;
+import com.ym.mec.biz.dal.dto.VipGroupSalarySettlementDto;
+import com.ym.mec.biz.dal.dto.VipGroupSalarySettlementTypeDto;
+import com.ym.mec.biz.dal.dto.VipGroupStudentDto;
+import com.ym.mec.biz.dal.entity.ActivityUserMapper;
+import com.ym.mec.biz.dal.entity.ClassGroup;
+import com.ym.mec.biz.dal.entity.ClassGroupStudentMapper;
+import com.ym.mec.biz.dal.entity.ClassGroupTeacherMapper;
+import com.ym.mec.biz.dal.entity.ClassGroupTeacherSalary;
+import com.ym.mec.biz.dal.entity.CourseSchedule;
+import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
+import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
+import com.ym.mec.biz.dal.entity.Employee;
+import com.ym.mec.biz.dal.entity.ImGroup;
+import com.ym.mec.biz.dal.entity.Organization;
+import com.ym.mec.biz.dal.entity.PracticeGroup;
+import com.ym.mec.biz.dal.entity.School;
+import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.dal.entity.StudentApplyRefunds;
 import com.ym.mec.biz.dal.entity.StudentApplyRefunds.StudentApplyRefundsStatus;
-import com.ym.mec.biz.dal.enums.*;
-import com.ym.mec.biz.dal.page.*;
+import com.ym.mec.biz.dal.entity.StudentPauseInfo;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+import com.ym.mec.biz.dal.entity.StudentRecoverDto;
+import com.ym.mec.biz.dal.entity.SysConfig;
+import com.ym.mec.biz.dal.entity.SysUserCashAccount;
+import com.ym.mec.biz.dal.entity.SysUserCashAccountDetail;
+import com.ym.mec.biz.dal.entity.SysUserCashAccountLog;
+import com.ym.mec.biz.dal.entity.Teacher;
+import com.ym.mec.biz.dal.entity.TeacherAttendance;
+import com.ym.mec.biz.dal.entity.TeacherDefaultVipGroupSalary;
+import com.ym.mec.biz.dal.entity.VipGroup;
+import com.ym.mec.biz.dal.entity.VipGroupActivity;
+import com.ym.mec.biz.dal.entity.VipGroupCategory;
+import com.ym.mec.biz.dal.entity.VipGroupDefaultClassesCycle;
+import com.ym.mec.biz.dal.entity.VipGroupDefaultClassesUnitPrice;
+import com.ym.mec.biz.dal.entity.VipGroupStudentCoursePrice;
+import com.ym.mec.biz.dal.enums.ActivityCourseType;
+import com.ym.mec.biz.dal.enums.AuditStatusEnum;
+import com.ym.mec.biz.dal.enums.ClassGroupStudentStatusEnum;
+import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
+import com.ym.mec.biz.dal.enums.CouponDetailTypeEnum;
+import com.ym.mec.biz.dal.enums.CourseStatusEnum;
+import com.ym.mec.biz.dal.enums.DealStatusEnum;
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.enums.MessageTypeEnum;
+import com.ym.mec.biz.dal.enums.OrderTypeEnum;
+import com.ym.mec.biz.dal.enums.PlatformCashAccountDetailTypeEnum;
+import com.ym.mec.biz.dal.enums.ReturnFeeEnum;
+import com.ym.mec.biz.dal.enums.SalarySettlementTypeEnum;
+import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
+import com.ym.mec.biz.dal.enums.SysUserRoleEnum;
+import com.ym.mec.biz.dal.enums.TeachModeEnum;
+import com.ym.mec.biz.dal.enums.TeachTypeEnum;
+import com.ym.mec.biz.dal.enums.VipGroupStatusEnum;
+import com.ym.mec.biz.dal.enums.YesOrNoEnum;
+import com.ym.mec.biz.dal.page.ActivityUserQueryInfo;
+import com.ym.mec.biz.dal.page.StudentVipGroupQueryInfo;
+import com.ym.mec.biz.dal.page.VipGroupAttendanceQueryInfo;
+import com.ym.mec.biz.dal.page.VipGroupQueryInfo;
+import com.ym.mec.biz.dal.page.VipGroupSalaryQueryInfo;
+import com.ym.mec.biz.dal.page.VipGroupTeachingRecordQueryInfo;
 import com.ym.mec.biz.event.source.SendSeoMessageSource;
-import com.ym.mec.biz.service.*;
+import com.ym.mec.biz.service.ActivityUserMapperService;
+import com.ym.mec.biz.service.ClassGroupService;
+import com.ym.mec.biz.service.ContractService;
+import com.ym.mec.biz.service.CourseScheduleService;
+import com.ym.mec.biz.service.CourseScheduleStudentPaymentService;
+import com.ym.mec.biz.service.CourseScheduleTeacherSalaryService;
+import com.ym.mec.biz.service.GroupClassService;
+import com.ym.mec.biz.service.ImGroupMemberService;
+import com.ym.mec.biz.service.ImGroupService;
+import com.ym.mec.biz.service.ImUserFriendService;
+import com.ym.mec.biz.service.PayService;
+import com.ym.mec.biz.service.PracticeGroupService;
+import com.ym.mec.biz.service.StudentPaymentOrderService;
+import com.ym.mec.biz.service.StudentPaymentRouteOrderService;
+import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.biz.service.SysCouponCodeService;
+import com.ym.mec.biz.service.SysMessageService;
+import com.ym.mec.biz.service.SysTenantConfigService;
+import com.ym.mec.biz.service.SysUserCashAccountDetailService;
+import com.ym.mec.biz.service.SysUserCashAccountLogService;
+import com.ym.mec.biz.service.SysUserCashAccountService;
+import com.ym.mec.biz.service.TeacherCourseRewardService;
+import com.ym.mec.biz.service.TeacherService;
+import com.ym.mec.biz.service.VipGroupCategoryService;
+import com.ym.mec.biz.service.VipGroupService;
 import com.ym.mec.common.constant.CommonConstants;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.dal.BaseDAO;
@@ -26,31 +188,6 @@ import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateConvertor;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.string.MessageFormatter;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.http.HttpStatus;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Isolation;
-import org.springframework.transaction.annotation.Propagation;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.transaction.interceptor.TransactionAspectSupport;
-import org.springframework.util.CollectionUtils;
-
-import java.math.BigDecimal;
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
-import java.util.*;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-import static com.ym.mec.biz.dal.enums.GroupType.VIP;
-import static com.ym.mec.biz.dal.enums.SysUserRoleEnum.ORGAN_MANAGER;
-import static java.math.BigDecimal.ROUND_DOWN;
-import static java.math.BigDecimal.ZERO;
 
 @Service
 public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> implements VipGroupService {
@@ -4089,15 +4226,17 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
     @Override
     @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
     public void updateVipGroupStatusToFinished() {
+
+        Date now = new Date();
+    	//更新至已结束
         List<VipGroup> vipGroupList = vipGroupDao.queryRequiredOverList();
         if (vipGroupList != null && vipGroupList.size() > 0) {
-            Date date = new Date();
             for (VipGroup vipGroup : vipGroupList) {
-                if (Objects.nonNull(vipGroup.getCoursesExpireDate()) && (vipGroup.getCoursesExpireDate().compareTo(date) > 0 || DateUtil.isSameDay(vipGroup.getCoursesExpireDate(), date))) {
+                if (Objects.nonNull(vipGroup.getCoursesExpireDate()) && (vipGroup.getCoursesExpireDate().compareTo(now) > 0 || DateUtil.isSameDay(vipGroup.getCoursesExpireDate(), now))) {
 //					continue;
                 }
                 vipGroup.setStatus(VipGroupStatusEnum.FINISHED);
-                vipGroup.setUpdateTime(date);
+                vipGroup.setUpdateTime(now);
             }
             vipGroupDao.batchUpdate(vipGroupList);
             Set<Long> collect = vipGroupList.stream().filter(v -> VipGroupStatusEnum.FINISHED.equals(v.getStatus())).map(e -> e.getId()).collect(Collectors.toSet());
@@ -4109,9 +4248,26 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
                 }
             }
         }
+        
+        //关闭没有学生的课程组
+        List<VipGroupClassGroupMapper> vipGroupClassGroupMapperList = classGroupStudentMapperDao.queryWaitCancelVipGroup();
+        if(vipGroupClassGroupMapperList != null && vipGroupClassGroupMapperList.size() > 0){
+        	vipGroupList = vipGroupDao.queryByIds(vipGroupClassGroupMapperList.stream().map(t -> t.getId().toString()).collect(Collectors.joining(",")));
+        	for(VipGroup vipGroup : vipGroupList){
+        		vipGroup.setStatus(VipGroupStatusEnum.CANCEL);
+                vipGroup.setUpdateTime(now);
+                vipGroup.setStopReason("没有学员");
+        	}
+            vipGroupDao.batchUpdate(vipGroupList);
+            
+            for(VipGroupClassGroupMapper vgcgm : vipGroupClassGroupMapperList){
+            	imGroupService.cancel(vgcgm.getClassGroupId().toString());
+            }
+        }
+        
+        //更新到进行中或报名中
         List<VipGroup> normalVipGroupList = vipGroupDao.queryNormalStatusList();
         if (!CollectionUtils.isEmpty(normalVipGroupList)) {
-            Date now = new Date();
             List<VipGroup> needUpdateVipGroups = new ArrayList<>();
             for (VipGroup vipGroup : normalVipGroupList) {
                 try {

+ 10 - 0
mec-biz/src/main/resources/config/mybatis/ClassGroupStudentMapperMapper.xml

@@ -708,4 +708,14 @@
         select COUNT(cgsm.id_) from class_group_student_mapper cgsm
         where FIND_IN_SET(cgsm.user_id_,#{studentIds}) AND cgsm.class_group_id_ = #{oldClassId}
     </select>
+    
+    <select id="queryWaitCancelVipGroup" resultType="com.ym.mec.biz.dal.dto.VipGroupClassGroupMapper">
+        SELECT a.id_ 'id',a.class_group_id_ classGroupId from 
+		(
+		select vg.id_,cgsm.class_group_id_,count(cgsm.user_id_) total_student_num_,sum(case when cgsm.status_ = 'QUIT' then 1 else 0 end ) quit_student_num_ 
+		from class_group_student_mapper cgsm LEFT JOIN class_group cg on cgsm.class_group_id_ = cg.id_
+		LEFT JOIN vip_group vg on vg.id_ = cgsm.music_group_id_
+		WHERE cgsm.group_type_ = 'VIP' and vg.group_status_ in (2,6) and cg.del_flag_ != 1 GROUP BY cgsm.class_group_id_
+		) a WHERE a.total_student_num_ = a.quit_student_num_
+    </select>
 </mapper>

+ 11 - 0
mec-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -1273,6 +1273,17 @@
         </foreach>
         group by user_id_,DATE_FORMAT(create_time_,'%Y-%m-%d')
     </select>
+
+    <select id="getStudentCloudStudySequenceDaysV2" resultType="com.ym.mec.biz.dal.vo.TempCampUserTrainingSequenceVo">
+        select user_id_ userId,TO_DAYS(DATE_FORMAT(day_,'%Y-%m-%d')) dayNum
+        from user_music_compare_camp_day_data
+        where DATE_FORMAT(day_,'%Y-%m-%d') BETWEEN #{startTime} AND #{endTime}
+        and user_id_ IN
+        <foreach collection="studentIds" open="(" close=")" item="userId" separator=",">
+            #{userId}
+        </foreach>
+        group by user_id_,DATE_FORMAT(day_,'%Y-%m-%d')
+    </select>
     <sql id="queryStudentBasicInfoSql">
         <where>
             AND su.lock_flag_ = 0 AND su.del_flag_ = 0

+ 70 - 0
mec-biz/src/main/resources/config/mybatis/TempLittleArtistTrainingCampMapper.xml

@@ -76,6 +76,35 @@
         GROUP BY a.user_id_, a.create_time_
     </select>
 
+    <select id="queryUserTrainingTimeV2" resultType="com.ym.mec.biz.dal.vo.TempUserTrainingTimeDetailVo" parameterType="java.util.Map">
+        SELECT
+        user_id_ as userId,
+        ifnull(train_time_, 0) AS playTime,
+        date_format(day_, '%Y-%m-%d') AS trainingDate
+        FROM user_music_compare_camp_day_data
+        <where>
+            <if test="param.startTime != null">
+                AND day_ &gt;= #{param.startTime}
+            </if>
+            <if test="param.campId != null">
+                AND camp_id_ = #{param.campId}
+            </if>
+            <if test="param.endTime != null">
+                AND day_ &lt;= #{param.endTime}
+            </if>
+            <if test="param.userId != null">
+                AND user_id_ = #{param.userId}
+            </if>
+            <if test="param.userIdList !=null and param.userIdList.size()>0">
+                AND user_id_ IN
+                <foreach collection="param.userIdList" item="userId" open="(" close=")" separator=",">
+                    #{userId}
+                </foreach>
+            </if>
+        </where>
+    </select>
+
+
     <select id="queryAllUserId" resultType="java.lang.Integer">
         SELECT
         distinct user_id_
@@ -159,6 +188,47 @@
         </where>
     </select>
 
+
+    <select id="queryUserTrainingDetailV2" parameterType="java.util.Map" resultType="com.ym.mec.biz.dal.vo.TempCampUserTrainingDetailVo">
+        select * from (SELECT
+        a.user_id_ AS id,
+        d.username_ AS username,
+        d.phone_ AS phone,
+        e.name_ AS imGroupName,
+        sum( if(ifnull(c.train_time_,0) &gt;= b.sign_standard_ * 60,1,0)) AS playDay,
+        max(ifnull(c.train_time_,0)) AS playTime
+        FROM
+        `temp_little_artist_training_camp_user_relation` `a`
+        left join temp_little_artist_training_camp b on b.id_ = a.activity_id_
+        left join user_music_compare_camp_day_data c on c.camp_id_ = a.activity_id_ and a.user_id_ = c.user_id_
+
+        LEFT JOIN `sys_user` `d` ON `d`.`id_` = `a`.`user_id_`
+        LEFT JOIN `im_group` `e` ON `a`.`im_group_id_` = `e`.`id_`
+        <where>
+            a.activity_id_ = #{param.campId} and a.state_ = #{param.state}
+            <if test="param.imGroupId != null">
+                AND e.id_ = #{param.imGroupId}
+            </if>
+            <if test="param.search != null">
+                AND (
+                d.`id_` LIKE CONCAT('%', #{param.search},'%')
+                OR d.`username_` LIKE CONCAT('%', #{param.search},'%')
+                OR d.`phone_` LIKE CONCAT('%', #{param.search},'%')
+                )
+            </if>
+        </where>
+        group by a.user_id_
+        )  t
+        <where>
+            <if test="param.standardFlag != null and param.standardFlag == true">
+                AND ifnull( t.playDay, 0 ) >= #{param.standardDays}
+            </if>
+            <if test="param.standardFlag != null and param.standardFlag == false">
+                AND ifnull( t.playDay, 0 ) &lt; #{param.standardDays}
+            </if>
+        </where>
+    </select>
+
     <select id="queryCampImGroup" resultType="com.ym.mec.biz.dal.entity.ImGroup">
         select id_ as id,
                name_ as name

+ 13 - 0
mec-biz/src/main/resources/config/mybatis/UserMusicCompareCampDayDataMapper.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE  mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.ym.mec.biz.dal.dao.UserMusicCompareCampDayDataDao">
+
+<update id="updateCampDayData">
+    UPDATE user_music_compare_camp_day_data a
+        set a.train_num_ = a.train_num_ + 1,
+        a.train_time_ = a.train_time_ + #{playTime}
+        where a.user_id_ = #{userId}
+        and a.camp_id_ = #{campId}
+        and a.day_ = date_format(now(), '%Y-%m-%d')
+    </update>
+</mapper>

+ 2 - 2
mec-student/src/main/java/com/ym/mec/student/controller/SysMusicCompareRecordController.java

@@ -32,7 +32,7 @@ public class SysMusicCompareRecordController extends BaseController {
 
     @ApiOperation(value = "添加记录")
     @PostMapping("add")
-    public HttpResponseResult add(SysMusicCompareRecord record){
+    public HttpResponseResult add(SysMusicCompareRecord record,Integer campId){
         if(Objects.isNull(record.getFeature())){
             return failed("请设置功能点");
         }
@@ -40,7 +40,7 @@ public class SysMusicCompareRecordController extends BaseController {
         record.setUserId(userId);
         record.setClientId("student");
         
-        sysMusicCompareRecordService.insert(record);
+        sysMusicCompareRecordService.insert(record,campId);
         
         ModelMap model = new ModelMap();
         model.put("totalPlayTimeOfCurrentDate", sysMusicCompareRecordService.queryCurrentDatePlayTimeByUserId(userId));

+ 5 - 4
mec-web/pom.xml

@@ -70,10 +70,11 @@
 			<groupId>com.yonge.datasource</groupId>
 			<artifactId>dynamic-datasource</artifactId>
 		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-api</artifactId>
-		</dependency>
+
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
 	</dependencies>
 	<build>
 		<plugins>