Browse Source

Merge remote-tracking branch 'origin/feature/0529-live' into feature/0529-live

# Conflicts:
#	.idea/httpRequests/http-requests-log.http
#	mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java
#	mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
shangke 2 years ago
parent
commit
8e36680333
39 changed files with 532 additions and 221 deletions
  1. 147 0
      .idea/httpRequests/http-requests-log.http
  2. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupStudentMapperDao.java
  3. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  4. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleTeacherSalaryDao.java
  5. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImLiveRoomVideoDao.java
  6. 25 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleDto.java
  7. 23 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleStudentDto.java
  8. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ImLiveBroadcastRoomDto.java
  9. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentPaymentOrderExportDto.java
  10. 4 39
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/VipGroupPayInfoDto.java
  11. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentCourseScheduleRecordDto.java
  12. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/vo/ImLiveBroadcastRoomVo.java
  13. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java
  14. 1 2
      mec-biz/src/main/java/com/ym/mec/biz/service/VipGroupService.java
  15. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ActivityUserMapperServiceImpl.java
  16. 13 26
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  17. 99 18
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  18. 5 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  19. 5 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  20. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java
  21. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PayServiceImpl.java
  22. 4 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  23. 76 75
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  24. 2 2
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  25. 1 1
      mec-biz/src/main/resources/config/mybatis/ClassGroupStudentMapperMapper.xml
  26. 10 4
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  27. 3 3
      mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml
  28. 4 0
      mec-biz/src/main/resources/config/mybatis/ImLiveBroadcastRoomMapper.xml
  29. 3 0
      mec-biz/src/main/resources/config/mybatis/ImLiveRoomReservationMapper.xml
  30. 7 0
      mec-biz/src/main/resources/config/mybatis/ImLiveRoomVideoMapper.xml
  31. 4 4
      mec-biz/src/main/resources/config/mybatis/PracticeGroupMapper.xml
  32. 7 7
      mec-biz/src/main/resources/config/mybatis/VipGroupMapper.xml
  33. 2 2
      mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java
  34. 5 1
      mec-student/src/main/java/com/ym/mec/student/controller/CourseController.java
  35. 1 0
      mec-student/src/main/java/com/ym/mec/student/controller/ImLiveRoomReservationController.java
  36. 5 2
      mec-web/src/main/java/com/ym/mec/web/controller/SysEmployeePositionController.java
  37. 8 0
      mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java
  38. 0 4
      mec-web/src/main/java/com/ym/mec/web/controller/VipGroupManageController.java
  39. 8 8
      mec-web/src/main/resources/exportColumnMapper.ini

+ 147 - 0
.idea/httpRequests/http-requests-log.http

@@ -1,3 +1,12 @@
+GET http://127.0.0.1:8005/task/liveCourseRemind
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-06-07T141437.200.json
+
+###
+
 GET http://127.0.0.1:9002/teacherCourseSchedule/liveCourseScheduleTime?courseScheduleId=2030
 Authorization: bearer 2cd308e9-0b8b-4b08-b3cd-f34dc50a8dfd
 Proxy-Connection: Keep-Alive
@@ -741,3 +750,141 @@ Accept-Encoding: br,deflate,gzip,x-gzip
 
 ###
 
+POST http://127.0.0.1:8005/imGroup/schoolQueryFriendList
+Authorization: bearer 241259a3-5563-410e-bed2-cd887f294b8b
+Content-Type: application/json
+Content-Length: 154
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+{
+//  "keyword": "宁老师",
+//  "groupType": "SCHOOL",
+  "roleType": "ORCHESTRA_MANAGER",
+  "musicGroupId": "23042416211000001",
+//  "lockFlag": false
+}
+
+<> 2023-06-01T161053.200.json
+
+###
+
+POST http://127.0.0.1:8005/imGroup/schoolQueryFriendList
+Authorization: bearer 241259a3-5563-410e-bed2-cd887f294b8b
+Content-Type: application/json
+Content-Length: 156
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+{
+//  "keyword": "宁老师",
+//  "groupType": "SCHOOL",
+//  "roleType": "ORCHESTRA_MANAGER",
+  "musicGroupId": "23042416211000001",
+//  "lockFlag": false
+}
+
+<> 2023-06-01T161046.200.json
+
+###
+
+POST http://127.0.0.1:8005/imGroup/schoolQueryFriendList
+Authorization: bearer 241259a3-5563-410e-bed2-cd887f294b8b
+Content-Type: application/json
+Content-Length: 156
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+{
+//  "keyword": "宁老师",
+//  "groupType": "SCHOOL",
+//  "roleType": "ORCHESTRA_MANAGER",
+  "musicGroupId": "23042416211000001",
+//  "lockFlag": false
+}
+
+<> 2023-06-01T160758.200.json
+
+###
+
+POST http://127.0.0.1:8005/imGroup/schoolQueryFriendList
+Authorization: bearer 241259a3-5563-410e-bed2-cd887f294b8b
+Content-Type: application/json
+Content-Length: 158
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+{
+//  "keyword": "宁老师",
+//  "groupType": "SCHOOL",
+//  "roleType": "ORCHESTRA_MANAGER",
+//  "musicGroupId": "23053118101300001",
+//  "lockFlag": false
+}
+
+<> 2023-06-01T160642.200.json
+
+###
+
+POST http://127.0.0.1:8005/imGroup/schoolQueryFriendList
+Authorization: bearer 241259a3-5563-410e-bed2-cd887f294b8b
+Content-Type: application/json
+Content-Length: 154
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+{
+//  "keyword": "宁老师",
+//  "groupType": "SCHOOL",
+  "roleType": "ORCHESTRA_MANAGER",
+  "musicGroupId": "23053118101300001",
+//  "lockFlag": false
+}
+
+<> 2023-06-01T160633.200.json
+
+###
+
+POST http://127.0.0.1:8005/imGroup/schoolQueryFriendList
+Authorization: bearer 241259a3-5563-410e-bed2-cd887f294b8b
+Content-Type: application/json
+Content-Length: 152
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+{
+//  "keyword": "宁老师",
+//  "groupType": "SCHOOL",
+  "roleType": "ORCHESTRA_MANAGER",
+  "musicGroupId": "23053118101300001",
+  "lockFlag": false
+}
+
+<> 2023-06-01T160625.200.json
+
+###
+
+POST http://127.0.0.1:8005/studentManage/userDetail
+Authorization: bearer 81d0c352-fcc8-4812-87f5-0f7a68d10451
+Content-Type: application/json
+coopId: 1
+Content-Length: 63
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+{
+  "studentId": 2248340,
+  "musicGroupId": 23042419330600001
+}
+
+<> 2023-06-01T160136.200.json
+
+###
+

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

@@ -291,7 +291,7 @@ public interface ClassGroupStudentMapperDao extends BaseDAO<Long, ClassGroupStud
      * @author Joburgess
      * @date 2020.08.05
      */
-    int countGroupNormalStudentNum(@Param("groupType") GroupType groupType,
+    int countGroupNormalStudentNum(@Param("groupType") String groupType,
                                    @Param("groupId") String groupId);
 
     /**

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

@@ -2027,7 +2027,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
     /**
      * 直播课需要通知的课程
      */
-    List<CourseSchedule> liveCourseRemind();
+    List<CourseSchedule> liveCourseRemind(Integer minutes);
 
     void updateRemindStatus(@Param("ids") List<Long> ids);
 }

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

@@ -289,7 +289,7 @@ public interface CourseScheduleTeacherSalaryDao extends BaseDAO<Long, CourseSche
 	 * @param groupType:
 	 * @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary>
 	 */
-	List<CourseScheduleTeacherSalary> findByGroupWithNotStart(@Param("groupId")String groupId, @Param("groupType")String groupType);
+	List<CourseScheduleTeacherSalary> findByGroupWithNotStart(@Param("groupId")String groupId, @Param("groupType") String groupType);
 
 	List<CourseScheduleTeacherSalary> queryUserNoSettlementListByTypeAndStartClassDate(@Param("userId") Integer userId, @Param("typeList") String typeList,
 			@Param("startClassDate") Date startClassDate);

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

@@ -20,5 +20,7 @@ public interface ImLiveRoomVideoDao extends BaseMapper<ImLiveRoomVideo> {
     ImLiveRoomVideo getLastRecord(@Param("roomId") String roomId, @Param("recordId") String recordId);
 
     List<ImLiveRoomVideoVo> queryVideoList(@Param("roomUid") String roomUid);
+
+    List<ImLiveRoomVideoVo> queryByRoomIds(@Param("roomIds") List<String> roomIds);
 }
 

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

@@ -105,6 +105,31 @@ public class CourseScheduleDto extends CourseSchedule {
     @ApiModelProperty("直播客户端")
     private String os;
 
+
+    @ApiModelProperty(value = "房间号")
+    private String  liveRoomId;
+
+    @ApiModelProperty(value = "是否有视频回放")
+    private Boolean  hasVideoRecord;
+
+    @Override
+    public String getLiveRoomId() {
+        return liveRoomId;
+    }
+
+    @Override
+    public void setLiveRoomId(String liveRoomId) {
+        this.liveRoomId = liveRoomId;
+    }
+
+    public Boolean getHasVideoRecord() {
+        return hasVideoRecord;
+    }
+
+    public void setHasVideoRecord(Boolean hasVideoRecord) {
+        this.hasVideoRecord = hasVideoRecord;
+    }
+
     public int getEnableAssignHomework() {
         return enableAssignHomework;
     }

+ 23 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleStudentDto.java

@@ -47,6 +47,29 @@ public class CourseScheduleStudentDto{
     @ApiModelProperty(value = "是否达标")
     private Integer qualifiedFlag;
 
+
+    @ApiModelProperty(value = "房间号")
+    private String  liveRoomId;
+
+    @ApiModelProperty(value = "是否有视频回放")
+    private Boolean  hasVideoRecord;
+
+    public String getLiveRoomId() {
+        return liveRoomId;
+    }
+
+    public void setLiveRoomId(String liveRoomId) {
+        this.liveRoomId = liveRoomId;
+    }
+
+    public Boolean getHasVideoRecord() {
+        return hasVideoRecord;
+    }
+
+    public void setHasVideoRecord(Boolean hasVideoRecord) {
+        this.hasVideoRecord = hasVideoRecord;
+    }
+
     public Integer getQualifiedFlag() {
         return qualifiedFlag;
     }

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ImLiveBroadcastRoomDto.java

@@ -23,6 +23,12 @@ public class ImLiveBroadcastRoomDto implements Serializable {
     @ApiModelProperty(value = "主键")
     private Integer id;
 
+    @ApiModelProperty(value = "房间号")
+    private String  liveRoomId;
+
+    @ApiModelProperty(value = "是否有视频回放")
+    private Boolean  hasVideoRecord;
+
     @ApiModelProperty(value = "机构id")
     private Integer tenantId;
 
@@ -160,6 +166,22 @@ public class ImLiveBroadcastRoomDto implements Serializable {
         }
     }
 
+    public String getLiveRoomId() {
+        return liveRoomId;
+    }
+
+    public void setLiveRoomId(String liveRoomId) {
+        this.liveRoomId = liveRoomId;
+    }
+
+    public Boolean getHasVideoRecord() {
+        return hasVideoRecord;
+    }
+
+    public void setHasVideoRecord(Boolean hasVideoRecord) {
+        this.hasVideoRecord = hasVideoRecord;
+    }
+
     public EUseScene getUseScene() {
         return useScene;
     }

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentPaymentOrderExportDto.java

@@ -56,6 +56,10 @@ public class StudentPaymentOrderExportDto extends StudentPaymentOrderRouteDto {
     @ApiModelProperty(value = "VIP课程费用",required = true)
     private BigDecimal vipCourseFee = BigDecimal.ZERO;
 
+    //VIP课程费用
+    @ApiModelProperty(value = "VIP课程费用",required = true)
+    private BigDecimal liveCourseFee = BigDecimal.ZERO;
+
     //网管课程费用
     @ApiModelProperty(value = "网管课程费用",required = true)
     private BigDecimal practiceCourseFee = BigDecimal.ZERO;

+ 4 - 39
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/VipGroupPayInfoDto.java

@@ -1,11 +1,14 @@
 package com.ym.mec.biz.dal.dto;
 
+import lombok.Data;
+
 import java.math.BigDecimal;
 
 /**
  * @Author Joburgess
  * @Date 2019/11/29
  */
+@Data
 public class VipGroupPayInfoDto {
 
     private Integer vipGroupId;
@@ -18,43 +21,5 @@ public class VipGroupPayInfoDto {
 
     private Integer tenantId;
 
-    public Integer getTenantId() {
-        return tenantId;
-    }
-
-    public void setTenantId(Integer tenantId) {
-        this.tenantId = tenantId;
-    }
-
-    public Integer getVipGroupId() {
-        return vipGroupId;
-    }
-
-    public void setVipGroupId(Integer vipGroupId) {
-        this.vipGroupId = vipGroupId;
-    }
-
-    public String getViipGroupName() {
-        return viipGroupName;
-    }
-
-    public void setViipGroupName(String viipGroupName) {
-        this.viipGroupName = viipGroupName;
-    }
-
-    public BigDecimal getPrice() {
-        return price;
-    }
-
-    public void setPrice(BigDecimal price) {
-        this.price = price;
-    }
-
-    public BigDecimal getBalance() {
-        return balance;
-    }
-
-    public void setBalance(BigDecimal balance) {
-        this.balance = balance;
-    }
+    private Boolean alertSubjectFlag = false;
 }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentCourseScheduleRecordDto.java

@@ -70,9 +70,20 @@ public class StudentCourseScheduleRecordDto {
     @ApiModelProperty("教学要点")
     private String teachingPoint;
 
+    @ApiModelProperty("直播房间号")
+    private String  liveRoomId;
+
     @ApiModelProperty("直播课回放记录")
     private Boolean hasVideoRecord;
 
+    public String getLiveRoomId() {
+        return liveRoomId;
+    }
+
+    public void setLiveRoomId(String liveRoomId) {
+        this.liveRoomId = liveRoomId;
+    }
+
     public Integer getQualifiedFlag() {
         return qualifiedFlag;
     }

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/ImLiveBroadcastRoomVo.java

@@ -146,6 +146,18 @@ public class ImLiveBroadcastRoomVo implements Serializable {
     @ApiModelProperty("声部ID")
     private Integer subjectId;
 
+
+    @ApiModelProperty("直播类型 NORMAL:普通直播  LIVE:直播课直播")
+    private String  groupType;
+
+    public String getGroupType() {
+        return groupType;
+    }
+
+    public void setGroupType(String groupType) {
+        this.groupType = groupType;
+    }
+
     public Integer getSubjectId() {
         return subjectId;
     }

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

@@ -776,4 +776,6 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
 	 * @return CourseScheduleWrapper.CourseSchedule
 	 */
 	CourseScheduleWrapper.LiveCourseSchedule getLiveCourseScheduleTime(Long courseScheduleId);
+
+    List<CourseScheduleStudentDto> queryDetailList(CourseDetailQueryInfo courseDetailQueryInfo);
 }

+ 1 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/VipGroupService.java

@@ -181,8 +181,7 @@ public interface VipGroupService extends BaseService<Long, VipGroup> {
      * @return java.util.Map
      */
     <K extends VipGroup> Map<String, BigDecimal> countVipGroupPredictFee1(K vipGroup,
-                                                                         Integer teacherId,
-                                                                         Long courseId);
+                                                                         Integer teacherId);
     /**
      * @describe 计算vip课程购买总价,及老师课酬
      * @author Joburgess

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

@@ -566,7 +566,7 @@ public class ActivityUserMapperServiceImpl extends BaseServiceImpl<Integer, Acti
 		classGroupStudentMapperDao.classGroupStudentsInsert(classGroupStudentMapperList);
 
 		//计算课程相关费用信息
-		Map<String, BigDecimal> costInfo = vipGroupService.countVipGroupPredictFee1(applyBaseInfo, applyBaseInfo.getUserId(), null);
+		Map<String, BigDecimal> costInfo = vipGroupService.countVipGroupPredictFee1(applyBaseInfo, applyBaseInfo.getUserId());
 		applyBaseInfo.setOfflineTeacherSalary(costInfo.get("offlineTeacherSalary"));
 		applyBaseInfo.setTotalPrice(costInfo.get("totalPrice"));
 

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

@@ -95,7 +95,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     @Autowired
     private MusicGroupStudentFeeDao musicGroupStudentFeeDao;
     @Autowired
-    private SysUserFeignService sysUserFeignService;
+    private SysUserService sysUserService;
     @Autowired
     private SubjectService subjectService;
     @Autowired
@@ -1575,10 +1575,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void addMusicGroupTeam(Integer teacherId, String musicGroupId, Integer improventClassesNum) throws Exception {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团信息不存在");
@@ -1601,31 +1597,29 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         musicGroup.setImproventClassesNum(improventClassesNum);
         musicGroup.setUpdateTime(new Date());
         musicGroupDao.update(musicGroup);
-        musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, "成团确认(学员、班级、教学主管已设置)", sysUser.getId(), ""));
+        musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, "成团确认(学员、班级、教学主管已设置)", sysUserService.getUserId(), ""));
     }
 
     @Override
     public List<TeacherClassGroupDto> findTeacherClassGroups(String type, String status, String groupName) {
-        SysUser user = sysUserFeignService.queryUserInfo();
-        if (Objects.isNull(user)) {
-            throw new BizException("请登录");
-        }
-
         if (StringUtils.isBlank(type)) {
             throw new BizException("请指定课程类型");
         }
 
+        Integer userId = sysUserService.getUserId();
         List<TeacherClassGroupDto> teacherMusicClassGroup;
         switch (type) {
             case "VIP": // VIP课
+                teacherMusicClassGroup = classGroupDao.findTeacherVipClassGroup(userId.longValue(), status, groupName, type);
+                break;
             case "LIVE": // 直播课
-                teacherMusicClassGroup = classGroupDao.findTeacherVipClassGroup(user.getId().longValue(), status, groupName, type);
+                teacherMusicClassGroup = classGroupDao.findTeacherVipClassGroup(userId.longValue(), status, groupName, type);
                 break;
             case "MUSIC_GROUP":
-                teacherMusicClassGroup = classGroupDao.findTeacherMusicClassGroup(user.getId().longValue(), groupName);
+                teacherMusicClassGroup = classGroupDao.findTeacherMusicClassGroup(userId.longValue(), groupName);
                 break;
             case "PRACTICE":
-                teacherMusicClassGroup = classGroupDao.findTeacherPracticeClassGroup(user.getId().longValue(), status, groupName);
+                teacherMusicClassGroup = classGroupDao.findTeacherPracticeClassGroup(userId.longValue(), status, groupName);
                 break;
             default:
                 throw new BizException("课程类型错误");
@@ -1660,7 +1654,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         if (!type.equals(MUSIC)) {
             currentClassTimes = noStartClassTimes;
         } else {
-            currentClassTimes = MapUtil.convertIntegerMap(courseScheduleDao.countCurrentNumByClassGroupId(classGroupIds, user.getId()));
+            currentClassTimes = MapUtil.convertIntegerMap(courseScheduleDao.countCurrentNumByClassGroupId(classGroupIds, userId));
         }
 
 
@@ -1737,7 +1731,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     } else {
                         teacherClassGroupDto.setStudyReportUrl(studyReportUrl + teacherClassGroupDto.getClassGroupId());
                     }
-                } else if (teacherClassGroupDto.getBuyMonths() == null && classGroupNoStartClassTimes.intValue() == 0 && classGroupTeacherMap.get(teacherClassGroupDto.getClassGroupId().intValue()).equals(user.getId())) {
+                } else if (teacherClassGroupDto.getBuyMonths() == null && classGroupNoStartClassTimes.intValue() == 0 && classGroupTeacherMap.get(teacherClassGroupDto.getClassGroupId().intValue()).equals(userId)) {
                     String studyReportUrl = sysConfigDao.findConfigValue(SysConfigService.TEACHER_STUDY_REPORT_URL);
                     teacherClassGroupDto.setStudyReportUrl(studyReportUrl + teacherClassGroupDto.getClassGroupId());
                 }
@@ -2945,11 +2939,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
     @Override
     public List<ClassGroup> queryStudentClassGroupsAndTeacher(String musicGroupId) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("请登录");
-        }
-        List<ClassGroup> classGroups = classGroupDao.queryStudentClassGroups(musicGroupId, sysUser.getId());
+        List<ClassGroup> classGroups = classGroupDao.queryStudentClassGroups(musicGroupId, sysUserService.getUserId());
         if (classGroups.size() > 0) {
             classGroups.forEach(e -> {
                 e.setTeacherMapperList(classGroupTeacherMapperService.getDao().findClassGroupTeachers(e.getId().toString()));
@@ -4320,8 +4310,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 }
             }
         }
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-
         //生成缴费记录,同一个批次
         MusicGroupPaymentCalender.PaymentCalenderStatusEnum status = null;
         List<MusicGroupPaymentCalenderDto> paymentCalenderDtos = mergeClassSplitClassAffirmDto.getMusicGroupPaymentCalenderDtos();
@@ -4364,7 +4352,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         MusicGroupStudentClassAdjust musicGroupStudentClassAdjust = new MusicGroupStudentClassAdjust();
         musicGroupStudentClassAdjust.setBatchNo(batchNos.toString());
         musicGroupStudentClassAdjust.setMusicGroupId(musicGroup.getId());
-        musicGroupStudentClassAdjust.setOperatorId(sysUser.getId());
+        musicGroupStudentClassAdjust.setOperatorId(sysUserService.getUserId());
         musicGroupStudentClassAdjust.setNewClassGroupJson(JSON.toJSONString(classGroup4MixDtos));
         musicGroupStudentClassAdjust.setClassGroupIds(JSON.toJSONString(classGroupIds));
         musicGroupStudentClassAdjust.setStudentIds(JSON.toJSONString(studentIds));
@@ -4759,7 +4747,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     @Override
     @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult spanGroupMergeClassSplitClassAffirm(MergeClassSplitClassAffirmDto mergeClassSplitClassAffirmDto) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
         //缴费项目
         MusicGroupPaymentCalenderDto paymentCalenderDto = mergeClassSplitClassAffirmDto.getMusicGroupPaymentCalenderDtos().get(0);
         //主班
@@ -4835,7 +4822,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         musicGroupStudentClassAdjust.setMasterClassGroupId(masterClassGroupId);
         musicGroupStudentClassAdjust.setBatchNo(paymentCalenderDto.getBatchNo());
         musicGroupStudentClassAdjust.setMusicGroupId(musicGroup.getId());
-        musicGroupStudentClassAdjust.setOperatorId(sysUser.getId());
+        musicGroupStudentClassAdjust.setOperatorId(sysUserService.getUserId());
         musicGroupStudentClassAdjust.setClassGroupIds(JSON.toJSONString(classGroupIds));
         musicGroupStudentClassAdjust.setStudentIds(JSON.toJSONString(studentIds));
         musicGroupStudentClassAdjust.setMasterTotalPrice(masterTotalPrice);

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

@@ -5,7 +5,6 @@ import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-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.*;
@@ -17,6 +16,7 @@ import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.dal.school.dto.ClassesForDayDto;
 import com.ym.mec.biz.dal.school.dto.CourseStudentDto;
 import com.ym.mec.biz.dal.vo.CourseScheduleWrapper;
+import com.ym.mec.biz.dal.vo.ImLiveRoomVideoVo;
 import com.ym.mec.biz.dal.wrapper.DailySummaryOfClassesForTheCurrentSemesterWrapper;
 import com.ym.mec.biz.dal.wrapper.TeachingPointWrapper;
 import com.ym.mec.biz.event.source.CourseEventSource;
@@ -25,7 +25,6 @@ import com.ym.mec.biz.service.*;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.HttpResponseResult;
-import com.ym.mec.common.entity.ImGroupMember;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
@@ -61,13 +60,11 @@ import java.lang.reflect.InvocationTargetException;
 import java.math.BigDecimal;
 import java.text.MessageFormat;
 import java.text.ParseException;
-import java.text.SimpleDateFormat;
 import java.time.*;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.TemporalAdjusters;
 import java.util.*;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 import static com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType.MUSIC_NETWORK;
 import static com.ym.mec.biz.dal.enums.GroupType.*;
@@ -197,6 +194,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 	private ImLiveBroadcastRoomService imLiveBroadcastRoomService;
 
 
+    @Autowired
+    private ImLiveRoomVideoDao imLiveRoomVideoDao;
+
     private final Logger businessLogger = LoggerFactory
             .getLogger(this.getClass());
 
@@ -1089,10 +1089,35 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 						|| cs.getType().equals(CourseScheduleType.COMM))
                 .map(CourseScheduleDto::getId).collect(Collectors.toList());
 
-		// 直播课设置直播间信息
-		Map<String, ImLiveBroadcastRoomDto> liveRoomMap = getLiveRoomMap(studentCourseSchedulesWithDate);
+        courseDataFormat(user, now, studentCourseSchedulesWithDate, courseScheduleIds);
+        result.put("list", studentCourseSchedulesWithDate);
+        return result;
+    }
+
+    private void courseDataFormat(SysUser user, Date now, List<CourseScheduleDto> studentCourseSchedulesWithDate, List<Long> courseScheduleIds) {
+        // 直播课设置直播间信息
+        Map<String, ImLiveBroadcastRoomDto> liveRoomMap = getLiveRoomMap(studentCourseSchedulesWithDate);
 
-		Map<Integer, String> subjectNameCourseMap = new HashMap<>();
+        // 直播间记录回放记录
+
+        // 直播间房间号集合
+        List<String> roomIds = studentCourseSchedulesWithDate.stream()
+                .filter(cs -> cs.getType().equals(CourseSchedule.CourseScheduleType.LIVE))
+                .map(CourseScheduleDto::getLiveRoomId).collect(Collectors.toList());
+
+        Map<String, List<ImLiveRoomVideoVo>> imLiveRoomVideoVoMap = getLiveRecord(roomIds);
+
+        for (CourseScheduleDto courseScheduleDto : studentCourseSchedulesWithDate) {
+            if (StringUtils.isNotEmpty(courseScheduleDto.getLiveRoomId())) {
+                List<ImLiveRoomVideoVo> imLiveRoomVideoVoList = imLiveRoomVideoVoMap.get(courseScheduleDto.getLiveRoomId());
+                if (CollectionUtils.isNotEmpty(imLiveRoomVideoVoList)) {
+                    courseScheduleDto.setHasVideoRecord(true);
+                    continue;
+                }
+                courseScheduleDto.setHasVideoRecord(false);
+            }
+        }
+        Map<Integer, String> subjectNameCourseMap = new HashMap<>();
         Map<Integer, String> subjectIdCourseMap = new HashMap<>();
         Map<Integer, Integer> reviewIdMap = new HashMap<>();
         Map<Long, Long> StudentReviewIdMap = new HashMap<>();
@@ -1108,9 +1133,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			StudentReviewIdMap = studentReviews.stream().collect(Collectors.toMap(CourseScheduleComplaints::getCourseScheduleId, CourseScheduleComplaints::getId));
 		}
 
-		Set<Long> practiceGroupIds = studentCourseSchedulesWithDate.stream().filter(cs -> CourseScheduleType.PRACTICE.equals(cs.getType())&&Objects.nonNull(cs.getMusicGroupId())).map(cs->Long.valueOf(cs.getMusicGroupId())).collect(Collectors.toSet());
+        Set<Long> practiceGroupIds = studentCourseSchedulesWithDate.stream().filter(cs -> CourseScheduleType.PRACTICE.equals(cs.getType())&&Objects.nonNull(cs.getMusicGroupId())).map(cs->Long.valueOf(cs.getMusicGroupId())).collect(Collectors.toSet());
 
-		Map<Long, PracticeGroupType> practiceGroupTypeMap = new HashMap<>();
+        Map<Long, PracticeGroupType> practiceGroupTypeMap = new HashMap<>();
         if(!CollectionUtils.isEmpty(practiceGroupIds)){
 			List<PracticeCourseDto> practiceGroups = practiceGroupDao.getPracticeGroupByIds(new ArrayList<>(practiceGroupIds));
 			practiceGroupTypeMap = practiceGroups.stream().collect(Collectors.toMap(PracticeCourseDto::getId, PracticeCourseDto::getType));
@@ -1138,11 +1163,22 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				courseScheduleDto.setOs(courseScheduleDto.getLiveBroadcastRoom().getOs());
 			}
         }
-        result.put("list", studentCourseSchedulesWithDate);
-        return result;
     }
 
-	/**
+    private Map<String, List<ImLiveRoomVideoVo>> getLiveRecord(List<String> roomIds) {
+
+        if (CollectionUtils.isEmpty(roomIds)) {
+            return new HashMap<>();
+        }
+        List<ImLiveRoomVideoVo> imLiveRoomVideoVos = imLiveRoomVideoDao.queryByRoomIds(roomIds);
+        if (CollectionUtils.isEmpty(imLiveRoomVideoVos)) {
+            return new HashMap<>();
+        }
+        return imLiveRoomVideoVos.stream().collect(Collectors.groupingBy(ImLiveRoomVideoVo::getRoomUid));
+
+    }
+
+    /**
 	 * 直播课设置直播间信息
 	 * @param studentCourseSchedulesWithDate List<CourseScheduleDto>
 	 * @return Map<String, ImLiveBroadcastRoomDto>
@@ -3296,19 +3332,17 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 						// 重新生成课酬
 						if (newCourseSchedule.getGroupType() == GroupType.MUSIC) {
 							courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(null, newCourseSchedule, ts);
-						} else if (newCourseSchedule.getGroupType() == GroupType.VIP) {
-							Map<String, BigDecimal> salaryMap = vipGroupService.countVipGroupPredictFee1(vipGroup, teacherId, ts.getCourseScheduleId());
+						} else if (newCourseSchedule.getGroupType() == GroupType.VIP || newCourseSchedule.getGroupType() == LIVE) {
+							Map<String, BigDecimal> salaryMap = vipGroupService.countVipGroupPredictFee1(vipGroup, teacherId);
 							BigDecimal teacherSalary = salaryMap.get("offlineTeacherSalary");
 							//是否是赠送课程
-							ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(vipGroup.getId(),"VIP",null);
+							ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(vipGroup.getId(),vipGroup.getGroupType(),null);
 							if(activityUserMapper != null){
 								if(vipGroup.getId().equals(activityUserMapper.getGiveVipGroupId())){
 									teacherSalary = salaryMap.get("giveOfflineTeacherSalary");
 								}
 							}
-
 							ts.setExpectSalary(teacherSalary);
-
 						} else if (newCourseSchedule.getGroupType() == PRACTICE) {
 							SysConfig practiceCourseSalaryConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_SALARY);
 							BigDecimal freeTeacherSalary = new BigDecimal(practiceCourseSalaryConfig.getParanValue());
@@ -3468,6 +3502,20 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
                     e.setRestOfClass(notStartRecords.size());
                 });
             }
+
+            // 直播房间号ID
+            List<String> liveRoomIds = notStartRecords.stream().map(e -> e.getLiveRoomId()).filter(Objects::nonNull).collect(Collectors.toList());
+
+            Map<String, List<ImLiveRoomVideoVo>> imLiveRoomVideoVoMap = getLiveRecord(liveRoomIds);
+            notStartRecords.forEach(e -> {
+                if (imLiveRoomVideoVoMap != null && imLiveRoomVideoVoMap.containsKey(e.getLiveRoomId())) {
+                    e.setHasVideoRecord(true);
+                } else {
+                    e.setHasVideoRecord(false);
+                }
+            });
+
+
             pageInfo.setRows(notStartRecords);
             return pageInfo;
         }
@@ -3484,6 +3532,19 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             pageInfo.setTotal(count);
             params.put("offset", pageInfo.getOffset());
             dataList = courseScheduleDao.findStudentCourseScheduleRecords(params);
+
+            // 直播房间号ID
+            List<String> liveRoomIds = dataList.stream().map(e -> e.getLiveRoomId()).filter(Objects::nonNull).collect(Collectors.toList());
+
+            Map<String, List<ImLiveRoomVideoVo>> imLiveRoomVideoVoMap = getLiveRecord(liveRoomIds);
+            dataList.forEach(e -> {
+                if (imLiveRoomVideoVoMap != null && imLiveRoomVideoVoMap.containsKey(e.getLiveRoomId())) {
+                    e.setHasVideoRecord(true);
+                } else {
+                    e.setHasVideoRecord(false);
+                }
+            });
+
         }
         if (count == 0) {
             dataList = new ArrayList<>();
@@ -5767,7 +5828,27 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         return true;
     }
 
-	@Override
+    @Override
+    public List<CourseScheduleStudentDto> queryDetailList(CourseDetailQueryInfo courseDetailQueryInfo) {
+        List<CourseScheduleStudentDto> courseScheduleStudentDtos = courseScheduleDao.queryDetailList(courseDetailQueryInfo);
+
+
+        // 直播房间号ID
+        List<String> liveRoomIds = courseScheduleStudentDtos.stream().map(e -> e.getLiveRoomId()).filter(Objects::nonNull).collect(Collectors.toList());
+
+        Map<String, List<ImLiveRoomVideoVo>> imLiveRoomVideoVoMap = getLiveRecord(liveRoomIds);
+        courseScheduleStudentDtos.forEach(e -> {
+            if (imLiveRoomVideoVoMap != null && imLiveRoomVideoVoMap.containsKey(e.getLiveRoomId())) {
+                e.setHasVideoRecord(true);
+            } else {
+                e.setHasVideoRecord(false);
+            }
+        });
+
+        return courseScheduleStudentDtos;
+    }
+
+    @Override
 	public List<CourseStudentDto> queryCourseStudentList(Long courseId) {
 		List<CourseStudentDto> courseStudentDtos = studentAttendanceDao.queryCourseStudentList(courseId);
 		if(CollectionUtils.isNotEmpty(courseStudentDtos)){

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

@@ -895,11 +895,11 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         VipGroup vipGroup = vipGroupService.get(vipGroupId.longValue());
         BigDecimal offlineTeacherSalary=BigDecimal.ZERO;
 
-        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByGroupWithNotStart(vipGroupId.toString(), GroupType.VIP.getCode());
+        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByGroupWithNotStart(vipGroupId.toString(), vipGroup.getGroupType());
         if(!CollectionUtils.isEmpty(courseScheduleTeacherSalaries)){
             //是否是赠送课程
-            ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(vipGroup.getId(),"VIP",null);
-            Map<String, BigDecimal> salary = vipGroupService.countVipGroupPredictFee1(vipGroup, vipGroup.getUserId(), null);
+            ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(vipGroup.getId(),vipGroup.getGroupType(),null);
+            Map<String, BigDecimal> salary = vipGroupService.countVipGroupPredictFee1(vipGroup, vipGroup.getUserId());
             for(int i=0;i<courseScheduleTeacherSalaries.size();i++){
                 if(!courseScheduleTeacherSalaries.get(i).getEnableChangeSalary()){
                     continue;
@@ -1414,9 +1414,9 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
     private void createVipGroupCourseTeacherSalaries(CourseSchedule courseSchedule, List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries){
         VipGroup vipGroup = vipGroupService.get(Long.valueOf(courseSchedule.getMusicGroupId()));
         //是否是赠送课程
-        ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(vipGroup.getId(),"VIP",null);
+        ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(vipGroup.getId(),vipGroup.getGroupType(),null);
         for (CourseScheduleTeacherSalary courseScheduleTeacherSalary : courseScheduleTeacherSalaries) {
-            Map<String, BigDecimal> salaryMap = vipGroupService.countVipGroupPredictFee1(vipGroup, courseSchedule.getActualTeacherId(), courseSchedule.getId());
+            Map<String, BigDecimal> salaryMap = vipGroupService.countVipGroupPredictFee1(vipGroup, courseSchedule.getActualTeacherId());
             BigDecimal teacherSalary = salaryMap.get("offlineTeacherSalary");
 
             if(activityUserMapper != null){

+ 5 - 7
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java

@@ -1920,19 +1920,14 @@ public class ExportServiceImpl implements ExportService {
         if (musicGroupIds != null && musicGroupIds.size() > 0) {
             musicGroupNameMap = MapUtil.convertIntegerMap(musicGroupDao.queryMusicGroupNameMap(musicGroupIds));
         }
-        //获取外部订单的商品销售金额
-//        List<Long> outOrderList = studentPaymentOrderExportDtos.stream().filter(e -> e.getType() == OUTORDER).map(e -> e.getId()).collect(Collectors.toList());
-//        Map<Long, BigDecimal> outOrderAmountMap = new HashMap<>();
-//        if (org.apache.commons.collections.CollectionUtils.isNotEmpty(outOrderList)) {
-//            outOrderAmountMap = MapUtil.convertIntegerMap(sellOrderDao.sumOutOrderAmount(outOrderList));
-//        }
         List<Long> otherOrderIds = studentPaymentOrderExportDtos.stream().filter(e -> e.getGroupType() != GroupType.GOODS_SELL
                 && e.getGroupType() != GroupType.REPLACEMENT
                 && e.getGroupType() != GroupType.PRACTICE
                 && e.getGroupType() != GroupType.SPORADIC
                 && e.getGroupType() != GroupType.MEMBER
                 && e.getGroupType() != GroupType.ACTIVITY
-                && e.getGroupType() != GroupType.VIP).map(e -> e.getId()).collect(Collectors.toList());
+                && e.getGroupType() != GroupType.VIP
+                && e.getGroupType() != GroupType.LIVE).map(e -> e.getId()).collect(Collectors.toList());
         Map<Long, List<StudentPaymentOrderExportDto>> feeByTypeMap = new HashMap<>();
         Map<Long, BigDecimal> childRepairMap = new HashMap<>();
         if (!CollectionUtils.isEmpty(otherOrderIds)) {
@@ -2082,6 +2077,8 @@ public class ExportServiceImpl implements ExportService {
                 }
             } else if (row.getGroupType() == GroupType.ACTIVITY) {
                 row.setVipCourseFee(row.getActualAmount());
+            } else if (row.getGroupType() == GroupType.LIVE) {
+                row.setLiveCourseFee(row.getActualAmount());
             } else if (row.getGroupType() == GroupType.MEMBER) {
                 row.setCloudTeacherFee(row.getActualAmount());
                 if (row.getTypeDesc() == null) {
@@ -3156,6 +3153,7 @@ public class ExportServiceImpl implements ExportService {
     void initGroupTypeConsumerMap() {
         groupTypeConsumerMap.put(GroupType.ACTIVITY, (orderDto) -> orderDto.setVipCourseFee(orderDto.getVipCourseFee().add(orderDto.getActualAmount())));
         groupTypeConsumerMap.put(GroupType.VIP, (orderDto) -> orderDto.setVipCourseFee(orderDto.getVipCourseFee().add(orderDto.getActualAmount())));
+        groupTypeConsumerMap.put(GroupType.LIVE, (orderDto) -> orderDto.setLiveCourseFee(orderDto.getLiveCourseFee().add(orderDto.getActualAmount())));
         groupTypeConsumerMap.put(GroupType.MEMBER, (orderDto) -> orderDto.setCloudTeacherFee(orderDto.getCloudTeacherFee().add(orderDto.getActualAmount())));
         groupTypeConsumerMap.put(GroupType.MUSIC, (orderDto) -> orderDto.setMusicGroupCourseFee(orderDto.getMusicGroupCourseFee().add(orderDto.getActualAmount())));
         groupTypeConsumerMap.put(GroupType.PRACTICE, (orderDto) -> orderDto.setPracticeCourseFee(orderDto.getPracticeCourseFee().add(orderDto.getActualAmount())));

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

@@ -366,9 +366,11 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         if (StringUtils.isNotBlank(os) && os.toUpperCase(Locale.ROOT).equals("TEACHER")) {
             param.put("speakerId", getSysUser().getId());
             param.put("clientType", SysUserType.TEACHER.getCode());
+            param.put("groupType", "NORMAL");
         } else if (StringUtils.isNotBlank(os) && os.toUpperCase(Locale.ROOT).equals("EDUCATION")) {
             param.put("clientType", SysUserType.EDUCATION.getCode());
             param.put("speakerId", getSysUser().getId());
+            param.put("groupType", "NORMAL");
         }
         Page<ImLiveBroadcastRoomVo> pageInfo = PageUtil.concatTimePage(param, "startTime", "endTime");
         // pageInfo.setDesc("a.created_time_");

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

@@ -139,7 +139,7 @@ public class PayServiceImpl implements PayService {
         
         //如果当前是买的小课/网管课
 		if (studentPaymentOrder != null && (studentPaymentOrder.getType() == OrderTypeEnum.SMALL_CLASS_TO_BUY || studentPaymentOrder.getType() == OrderTypeEnum.PRACTICE_GROUP_BUY
-				|| studentPaymentOrder.getType() == OrderTypeEnum.PRACTICE_GROUP_RENEW)) {
+				|| studentPaymentOrder.getType() == OrderTypeEnum.PRACTICE_GROUP_RENEW || studentPaymentOrder.getType() == OrderTypeEnum.LIVE_GROUP_BUY)) {
 			
 			//忽略的分部
 			List<Integer> ignoreOrganList = Arrays.asList(4);

+ 4 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java

@@ -1703,11 +1703,6 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     public List<OperatingTotalIncomeDto> queryOperatingSummaryIncome(Map<String, Object> params) {
         List<StudentPaymentOrderExportDto> studentPaymentOrderExportDtos = studentPaymentOrderDao.ExportQueryPage1(params);
         studentPaymentOrderExportDtos.addAll(studentPaymentOrderDao.ExportQueryPage2(params));
-//        List<BaseMapDto<Long,BigDecimal>> sellOrderMap = studentPaymentOrderDao.groupSellOrder(params);
-//        Map<Long, BigDecimal> sellMap = new HashMap<>();
-//        if(CollectionUtils.isNotEmpty(sellOrderMap)){
-//            sellMap = sellOrderMap.stream().collect(Collectors.groupingBy(e -> e.getKey(), Collectors.collectingAndThen(Collectors.toList(), v -> v.get(0).getValue())));
-//        }
         long i = 1;
         //获取机构费率
         List<Long> otherOrderIds = studentPaymentOrderExportDtos.stream().filter(e -> e.getGroupType() != GroupType.GOODS_SELL
@@ -1716,7 +1711,8 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
                 && e.getGroupType() != GroupType.SPORADIC
                 && e.getGroupType() != GroupType.MEMBER
                 && e.getGroupType() != GroupType.ACTIVITY
-                && e.getGroupType() != GroupType.VIP).map(e -> e.getId()).collect(Collectors.toList());
+                && e.getGroupType() != GroupType.VIP
+                && e.getGroupType() != GroupType.LIVE).map(e -> e.getId()).collect(Collectors.toList());
         Map<Long, List<StudentPaymentOrderExportDto>> feeByTypeMap = new HashMap<>();
         Map<Long, BigDecimal> childRepairMap = new HashMap<>();
         if (!org.springframework.util.CollectionUtils.isEmpty(otherOrderIds)) {
@@ -1817,6 +1813,8 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
                     row.setVipCourseFee(row.getActualAmount());
                 } else if (row.getGroupType() == GroupType.ACTIVITY) {
                     row.setVipCourseFee(row.getActualAmount());
+                } else if (row.getGroupType() == GroupType.LIVE) {
+                    row.setLiveCourseFee(row.getActualAmount());
                 } else if (row.getGroupType() == GroupType.MEMBER) {
                     row.setCloudTeacherFee(row.getActualAmount());
                 } else if (row.getGroupType().equals(GroupType.SPORADIC)) {

+ 76 - 75
mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java

@@ -1,30 +1,38 @@
 package com.ym.mec.biz.service.impl;
 
-import static com.ym.mec.biz.dal.enums.GroupType.LIVE;
-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.*;
-
-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 com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
+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.dto.VipGroupClassGroupMapper;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.entity.StudentApplyRefunds.StudentApplyRefundsStatus;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.mapper.LiveGroupPlusMapper;
+import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomVo;
 import com.ym.mec.biz.dal.wrapper.LiveGroupWrapper;
+import com.ym.mec.biz.event.source.SendSeoMessageSource;
 import com.ym.mec.biz.service.*;
+import com.ym.mec.common.constant.CommonConstants;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.service.IdGeneratorService;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.common.tenant.TenantContextHolder;
+import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
+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.collections.MapUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -40,31 +48,17 @@ 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.entity.SysUser;
-import com.ym.mec.biz.dal.entity.StudentApplyRefunds.StudentApplyRefundsStatus;
-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.common.constant.CommonConstants;
-import com.ym.mec.common.controller.BaseController;
-import com.ym.mec.common.dal.BaseDAO;
-import com.ym.mec.common.entity.HttpResponseResult;
-import com.ym.mec.common.exception.BizException;
-import com.ym.mec.common.page.PageInfo;
-import com.ym.mec.common.service.IdGeneratorService;
-import com.ym.mec.common.service.impl.BaseServiceImpl;
-import com.ym.mec.common.tenant.TenantContextHolder;
-import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
-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 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 {
@@ -456,8 +450,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         // 学生购买价格,老师课薪设置校验
         VipGroupApplyBaseInfoDto vipGroupApplyBaseInfoDto = vipGroup.getVipGroupApplyBaseInfo();
 
-        if (Objects.isNull(vipGroupApplyBaseInfoDto.getOfflineClassesUnitPrice())
-                && Objects.isNull(vipGroupApplyBaseInfoDto.getOnlineClassesUnitPrice())) {
+        if (Objects.isNull(vipGroupApplyBaseInfoDto.getOfflineClassesUnitPrice()) && Objects.isNull(vipGroupApplyBaseInfoDto.getOnlineClassesUnitPrice())) {
             throw new BizException("请设置课程单价");
         }
 
@@ -508,25 +501,20 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
         // VIP课参数校验
         if (CourseSchedule.CourseScheduleType.VIP.getCode().equals(groupType)) {
-
             // 校验VIP课参数
             vipGroupRequestParamValid(vipGroup, vipGroupApplyBaseInfoDto, totalClassTimes, firstCourseSchedule, latestCourseSchedule);
-
         }
 
         // LIVE课参数校验
         if (CourseSchedule.CourseScheduleType.LIVE.getCode().equals(groupType)) {
-
             ImLiveBroadcastRoomDto liveRoom = vipGroup.getLiveBroadcastRoom();
             if (Objects.isNull(liveRoom) || Objects.isNull(liveRoom.getRoomConfig())) {
                 throw new BizException("直播间参数错误");
             }
-
             if (StringUtils.isAnyBlank(liveRoom.getRoomTitle(), liveRoom.getLiveRemark(), liveRoom.getOs())
                     || Objects.isNull(liveRoom.getUseScene())) {
                 throw new BizException("直播间参数错误");
             }
-
             // 直播间默认方案
             String liveClient = sysConfigDao.findConfigValue("live_client");
             liveRoom.setServiceProvider(liveClient);
@@ -567,22 +555,17 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         //计算课程相关费用信息
         if (CourseSchedule.CourseScheduleType.VIP.getCode().equals(groupType)) {
             // 计算老师课薪
-            costInfo = countVipGroupPredictFee1(vipGroupApplyBaseInfoDto, vipGroupApplyBaseInfoDto.getUserId(), null);
-        }
-        if (CourseSchedule.CourseScheduleType.LIVE.getCode().equals(groupType)) {
-            costInfo.put("totalPrice",
-                    vipGroupApplyBaseInfoDto.getOnlineClassesUnitPrice().multiply(new BigDecimal(vipGroupApplyBaseInfoDto.getOnlineClassesNum())));
+            costInfo = countVipGroupPredictFee1(vipGroupApplyBaseInfoDto, vipGroupApplyBaseInfoDto.getUserId());
+        }else if (CourseSchedule.CourseScheduleType.LIVE.getCode().equals(groupType)) {
+            costInfo.put("totalPrice",vipGroupApplyBaseInfoDto.getOnlineClassesUnitPrice().multiply(new BigDecimal(vipGroupApplyBaseInfoDto.getOnlineClassesNum())));
+            costInfo.put("originalTotalPrice",vipGroupApplyBaseInfoDto.getOfflineClassesUnitPrice().multiply(new BigDecimal(vipGroupApplyBaseInfoDto.getOnlineClassesNum())));
         }
 
         vipGroupApplyBaseInfoDto.setAuditStatus(AuditStatusEnum.PASS);
-
         vipGroupApplyBaseInfoDto.setStatus(VipGroupStatusEnum.APPLYING);
-        //如果默认课酬与实际课酬不匹配则需要审批
-//		if(costInfo.get("offlineTeacherSalary").compareTo(vipGroupApplyBaseInfoDto.getOfflineTeacherSalary()) < 0){
-//			vipGroupApplyBaseInfoDto.setAuditStatus(AuditStatusEnum.ING);
-//		}
 
          vipGroupApplyBaseInfoDto.setTotalPrice(costInfo.getOrDefault("totalPrice", ZERO));
+         vipGroupApplyBaseInfoDto.setTotalPrice(costInfo.getOrDefault("originalTotalPrice", ZERO));
         if (CollectionUtils.isEmpty(vscps)) {
             vscps = new ArrayList<>();
             for (Integer canBuyStudentId : canBuyStudentIds) {
@@ -1295,11 +1278,10 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
         if (!ActivityCourseType.FREE_VIP.equals(vipGroup.getVipGroupApplyBaseInfo().getActivityCourseType())) {
             //计算课程相关费用信息
-            Map<String, BigDecimal> costInfo = countVipGroupPredictFee1(vipGroupApplyBaseInfoDto,
-                    vipGroupApplyBaseInfoDto.getUserId(), null);
+            Map<String, BigDecimal> costInfo = countVipGroupPredictFee1(vipGroupApplyBaseInfoDto,vipGroupApplyBaseInfoDto.getUserId());
             BigDecimal teacherSalary = costInfo.get("offlineTeacherSalary");
             //是否是赠送课程
-            ActivityUserMapper activityUserMapper = activityUserMapperService.findVipUserMapper(vipGroupApplyBaseInfoDto.getId(), "VIP", null);
+            ActivityUserMapper activityUserMapper = activityUserMapperService.findVipUserMapper(vipGroupApplyBaseInfoDto.getId(), vipGroupApplyBaseInfoDto.getGroupType(), null);
             if (activityUserMapper != null) {
                 if (vipGroupApplyBaseInfoDto.getId().equals(activityUserMapper.getGiveVipGroupId())) {
                     teacherSalary = costInfo.get("giveOfflineTeacherSalary");
@@ -2200,8 +2182,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
     @Override
     public <K extends VipGroup> Map<String, BigDecimal> countVipGroupPredictFee1(K vipGroup,
-                                                                                 Integer teacherId,
-                                                                                 Long courseId) {
+                                                                                 Integer teacherId) {
         if (Objects.isNull(teacherId)) {
             throw new BizException("请指定教师");
         }
@@ -2232,6 +2213,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         VipGroupSalarySettlementTypeDto giveVipOfflineSalarySettlement = null;
         BigDecimal discount = new BigDecimal(100);
         BigDecimal totalPrice = null;
+        BigDecimal originalTotalPrice = null;
         if (vipGroup.getVipGroupActivityId() != null) {
             VipGroupActivity vipGroupActivity = vipGroupActivityDao.get(vipGroup.getVipGroupActivityId());
             discount = vipGroupActivity.getDiscount();
@@ -2243,10 +2225,12 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
             giveVipOfflineSalarySettlement = vipGroupSalarySettlementDto.getGiveVipOfflineSalarySettlement();
             if(vipGroupActivity.getFixedCourseNumFlag()){
                 totalPrice = vipGroupActivity.getMarketPrice();
+                originalTotalPrice = vipGroupActivity.getOriginalPrice();
                 vipGroup.setTotalPrice(totalPrice);
+                vipGroup.setOriginalTotalPrice(originalTotalPrice);
             }
             //是否是赠送课程
-            ActivityUserMapper activityUserMapper = activityUserMapperService.findVipUserMapper(vipGroup.getId(), "VIP", null);
+            ActivityUserMapper activityUserMapper = activityUserMapperService.findVipUserMapper(vipGroup.getId(), vipGroup.getGroupType(), null);
             if (activityUserMapper != null) {
                 if (vipGroup.getId().equals(activityUserMapper.getGiveVipGroupId())) {
                     giveVipOfflineSalarySettlement = vipGroupSalarySettlementDto.getGiveVipOfflineSalarySettlement();
@@ -2272,13 +2256,16 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
             //课程购买费用计算
             totalPrice = onlineVipGroupCharge.add(offlineVipGroupCharge);
+            originalTotalPrice = totalPrice;
             totalPrice = totalPrice.multiply(discount).divide(new BigDecimal(100), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
 
             vipGroup.setTotalPrice(totalPrice.setScale(0, BigDecimal.ROUND_CEILING));
+            vipGroup.setOriginalTotalPrice(originalTotalPrice);
         }
         results.put("totalPrice", vipGroup.getTotalPrice());
+        results.put("originalTotalPrice", vipGroup.getOriginalTotalPrice());
 
-        int normalStudentNum = classGroupStudentMapperDao.countGroupNormalStudentNum(VIP, vipGroup.getId().toString());
+        int normalStudentNum = classGroupStudentMapperDao.countGroupNormalStudentNum(vipGroup.getGroupType(), vipGroup.getId().toString());
 
         //教师线下单课酬计算
         BigDecimal teacherOfflineSalary = BigDecimal.ZERO;
@@ -2764,7 +2751,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
                     studentPaymentOrderService.activityGive(vipGroup.getVipGroupActivityId(), order,
                             vipGroup.getId().toString(), null);
                     //获取班级实际人数
-                    Integer studentNum = classGroupStudentMapperDao.countGroupNormalStudentNum(groupType, classGroup.getMusicGroupId());
+                    Integer studentNum = classGroupStudentMapperDao.countGroupNormalStudentNum(vipGroup.getGroupType(), classGroup.getMusicGroupId());
                     //课程组人数已满,变更状态
                     if (studentNum.equals(classGroup.getExpectStudentNum())) {
                         vipGroup.setStatus(VipGroupStatusEnum.PROGRESS);
@@ -2781,7 +2768,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
                         List<TeacherAttendance> teacherAttendances = new ArrayList<>();
                         //创建课酬信息
                         List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = new ArrayList<>();
-                        Map<String, BigDecimal> stringBigDecimalMap = countVipGroupPredictFee1(vipGroup, vipGroup.getUserId(), null);
+                        Map<String, BigDecimal> stringBigDecimalMap = countVipGroupPredictFee1(vipGroup, vipGroup.getUserId());
                         for (CourseSchedule courseSchedule : courseSchedules) {
                             //创建教师课程薪水记录
                             CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
@@ -2860,8 +2847,6 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
                     String organIdsString = StringUtils.join(hashSet, ",");
                     vipGroup.setOrganIdList(organIdsString);
                     vipGroupDao.update(vipGroup);
-                }else {
-                    vipGroupDao.updateStudentIdList(vipGroup.getId(),userId);
                 }
                 SysUserCashAccount sysUserCashAccount = sysUserCashAccountService.get(userId);
                 //插入缴费明细
@@ -2898,8 +2883,11 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
                 Map<Integer, String> map = new HashMap<>(1);
                 map.put(userId, userId.toString());
-                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, messageTypeEnum, map, null, 0, "2", "STUDENT",
-                        vipGroup.getName());
+                String baseApiUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
+
+                String pushUrl = baseApiUrl + "/#/myOrder";
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
+                        messageTypeEnum, map, null, 0, "8?" + pushUrl, "STUDENT",vipGroup.getName());
                 try {
                     contractService.transferVipGroupCoursesContract(userId, vipGroup.getId(), order.getType());
                 } catch (Exception e) {
@@ -3437,10 +3425,10 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
                 classGroupTeacherMapperDao.insert(classGroupTeacherMapper);
             }
 
-            Map<String, BigDecimal> salaryMap = countVipGroupPredictFee1(vipGroup, vipGroup.getUserId(), null);
+            Map<String, BigDecimal> salaryMap = countVipGroupPredictFee1(vipGroup, vipGroup.getUserId());
             BigDecimal teacherSalary = salaryMap.get("offlineTeacherSalary");
             //是否是赠送课程
-            ActivityUserMapper activityUserMapper = activityUserMapperService.findVipUserMapper(vipGroup.getId(), "VIP", null);
+            ActivityUserMapper activityUserMapper = activityUserMapperService.findVipUserMapper(vipGroup.getId(), vipGroup.getGroupType(), null);
             if (activityUserMapper != null) {
                 if (vipGroup.getId().equals(activityUserMapper.getGiveVipGroupId())) {
                     teacherSalary = salaryMap.get("giveOfflineTeacherSalary");
@@ -4054,7 +4042,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
         courseScheduleService.batchAddCourseSchedule(vipGroupApplyDto.getCourseSchedules());
 
-        Map<String, BigDecimal> map = countVipGroupPredictFee1(vipGroup, vipGroup.getUserId(), null);
+        Map<String, BigDecimal> map = countVipGroupPredictFee1(vipGroup, vipGroup.getUserId());
         BigDecimal offlineTeacherSalary = map.get("offlineTeacherSalary");
         //是否是赠送课程
         ActivityUserMapper activityUserMapper = activityUserMapperService.findVipUserMapper(vipGroup.getId(), "VIP", null);
@@ -4193,7 +4181,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
             if (courseNum == 0) {
                 courseScheduleService.batchAddCourseSchedule(courseSchedules);
 
-                Map<String, BigDecimal> salaryMap = countVipGroupPredictFee1(vipGroup, vipGroup.getUserId(), null);
+                Map<String, BigDecimal> salaryMap = countVipGroupPredictFee1(vipGroup, vipGroup.getUserId());
                 BigDecimal offlineTeacherSalary = salaryMap.get("offlineTeacherSalary");
                 //是否是赠送课程
                 ActivityUserMapper activityUserMapper = activityUserMapperService.findVipUserMapper(vipGroup.getId(), "VIP", null);
@@ -4520,7 +4508,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
                     List<TeacherAttendance> teacherAttendances = new ArrayList<>();
                     //创建课酬信息
                     List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = new ArrayList<>();
-                    Map<String, BigDecimal> stringBigDecimalMap = countVipGroupPredictFee1(vipGroup, vipGroup.getUserId(), null);
+                    Map<String, BigDecimal> stringBigDecimalMap = countVipGroupPredictFee1(vipGroup, vipGroup.getUserId());
                     for (CourseSchedule courseSchedule : courseSchedules) {
                         //创建教师课程薪水记录
                         CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
@@ -4589,6 +4577,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
                             vipGroup.getName(), null, null, vipGroup.getGroupType(), ImGroup.GroupTypeEnum.valueOf(vipGroup.getGroupType()));
                     imGroupMemberService.join(classGroup.getId().toString(), userRoleMap);
                     imUserFriendService.refreshGroupImUserFriend(classGroup.getMusicGroupId(), classGroup.getGroupType());
+                    classGroupDao.update(classGroup);
                 }
                 vipGroupDao.update(vipGroup);
             }
@@ -4694,6 +4683,18 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
             throw new BizException("未找到此课程");
         }
         VipGroupPayInfoDto vipGroupPayInfo = new VipGroupPayInfoDto();
+        if("LIVE".equals(vipGroup.getGroupType())){
+            ImLiveBroadcastRoomDto roomDto = JSON.parseObject(vipGroup.getLiveConfigJson(), ImLiveBroadcastRoomDto.class);
+            String subjectId = roomDto.getSubjectId();
+            Subject subject = subjectDao.get(Integer.parseInt(subjectId));
+            //乐理不提醒
+            if(!subject.getParentSubjectId().equals(30)){
+                Student student = studentDao.get(userId);
+                if(!student.getSubjectIdList().equals(subjectId)){
+                    vipGroupPayInfo.setAlertSubjectFlag(true);
+                }
+            }
+        }
         vipGroupPayInfo.setTenantId(vipGroup.getTenantId());
         vipGroupPayInfo.setVipGroupId(vipGroup.getId().intValue());
         vipGroupPayInfo.setViipGroupName(vipGroup.getName());
@@ -4734,7 +4735,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         queryInfo.setExpireFlag(true);
         Map<String, Object> params = new HashMap<String, Object>();
         MapUtil.populateMap(params, queryInfo);
-        // VIP小课、直播课
+        // VIP小课
         List<StudentVipGroupShowListDto> vipGroups = vipGroupDao.findVipGroups(params);
         // 直播课
         vipGroups.addAll(vipGroupDao.findLiveGroups(params));
@@ -4933,7 +4934,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
     @Override
     public void liveCourseRemind() {
         // 查询30分钟内要开始的并且没有直播通知的直播课
-        List<CourseSchedule> courseSchedules = courseScheduleDao.liveCourseRemind();
+        List<CourseSchedule> courseSchedules = courseScheduleDao.liveCourseRemind(30);
 
         if (CollectionUtils.isEmpty(courseSchedules)) {
             return;

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

@@ -761,11 +761,11 @@
             s.name_ school_name_
         FROM
             vip_group vg
-            LEFT JOIN class_group cg ON vg.id_=cg.music_group_id_ AND cg.group_type_= #{groupType}
+            LEFT JOIN class_group cg ON vg.id_ = cg.music_group_id_ AND cg.group_type_= #{groupType}
             LEFT JOIN course_schedule cs ON cg.id_=cs.class_group_id_
             LEFT JOIN school s ON vg.teacher_school_id_ = s.id_
         WHERE
-            vg.user_id_ = #{teacherId}
+            vg.user_id_ = #{teacherId} AND cg.del_flag_ = 0
             <if test="status == null or status == ''">
                 AND vg.group_status_ != 7 AND (vg.group_status_ = 2 OR vg.group_status_ = 5)
             </if>

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

@@ -384,7 +384,7 @@
         FROM
           class_group_student_mapper
         WHERE
-            group_type_ = #{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+            group_type_ = #{groupType}
 	        AND music_group_id_= #{groupId}
             AND status_='NORMAL'
     </select>

+ 10 - 4
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -119,6 +119,7 @@
         <result column="qualified_flag_" property="qualifiedFlag" />
         <result column="teaching_content_" property="teachingContent" />
         <result column="teaching_point_" property="teachingPoint" />
+        <result column="live_room_id_" property="liveRoomId" />
     </resultMap>
 
     <resultMap type="com.ym.mec.biz.dal.dto.StudentCourseInfoDto" id="StudentCourseInfoDto">
@@ -692,7 +693,8 @@
             csc.id_ IS NOT NULL complaint_status_,
             cs.teach_mode_,
             cs.new_course_id_,
-            cs.group_type_
+            cs.group_type_,
+        cs.live_room_id_
         FROM
             course_schedule_student_payment cssp
             LEFT JOIN course_schedule cs ON cssp.course_schedule_id_=cs.id_
@@ -1165,7 +1167,8 @@
         cs.teaching_content_,
         cs.teaching_point_,
         s.name_ school_name_,
-        sa.qualified_flag_
+        sa.qualified_flag_,
+        cs.live_room_id_
         FROM course_schedule_student_payment cssp
         LEFT JOIN student_attendance sa ON cssp.course_schedule_id_ = sa.course_schedule_id_ AND cssp.user_id_ =
         sa.user_id_
@@ -1200,6 +1203,7 @@
                cs.class_group_id_,
                cs.teaching_content_,
                cs.teaching_point_,
+        cs.live_room_id_,
         		s.name_ school_name_
         FROM course_schedule_student_payment cssp
         LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
@@ -4131,11 +4135,12 @@
         <result property="teacherName" column="real_name_"/>
         <result property="schoolName" column="schoolName"/>
         <result property="qualifiedFlag" column="qualified_flag_"/>
+        <result property="liveRoomId" column="live_room_id_"/>
     </resultMap>
     <select id="queryDetailList" resultMap="CourseScheduleStudentDto">
         select cssp.course_schedule_id_,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_,
                CASE WHEN sa.status_ IS NULL OR sa.status_ = '' THEN 'TRUANT' ELSE sa.status_ END attendanceStatus,cs.status_ courseStatus,
-               cs.group_type_,cs.teach_mode_,cs.name_ courseName,su.avatar_,su.real_name_,co.name_ schoolName,sa.qualified_flag_
+               cs.group_type_,cs.teach_mode_,cs.name_ courseName,su.avatar_,su.real_name_,co.name_ schoolName,sa.qualified_flag_,cs.live_room_id_
         from course_schedule_student_payment cssp
         left join course_schedule cs ON cs.id_ = cssp.course_schedule_id_
         left join sys_user su on cs.actual_teacher_id_ = su.id_
@@ -4328,7 +4333,8 @@
           and cs.live_remind_ = 0
           and cs.type_ = 'LIVE'
           and cs.class_date_ = date_format(now(),'%Y-%m-%d')
-          and cs.start_class_time_ &lt;= date_format(now(),'%H:%i:%s')
+          and CONCAT(class_date_,' ',start_class_time_)  &lt;= date_format(date_add(now(),interval #{minutes} minute),'%Y-%m-%d %H:%i:%s')
+          and CONCAT(class_date_,' ',start_class_time_)  &gt;= date_format(now(),'%Y-%m-%d %H:%i:%s')
     </select>
 
     <update id="updateRemindStatus">

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

@@ -311,7 +311,7 @@
 		<if test="startDate != null">
 			AND cs.class_date_ BETWEEN #{startDate} AND #{endDate}
 		</if>
-		AND cs.group_type_ = 'VIP' AND vg.organ_id_ != 41
+		AND cs.group_type_ IN ('VIP','LIVE') AND vg.organ_id_ != 41
 		AND csts.settlement_time_ IS NULL
 		AND (cs.del_flag_ IS NULL OR cs.del_flag_=0)
     </select>
@@ -839,10 +839,10 @@
 	<select id="queryOnlineCourseByGroupType" resultMap="teacherVipSalaryDto" parameterType="map">
 		SELECT csts.*,cs.teach_mode_,vgc.name_ vip_group_category_name_,vg.vip_group_category_id_, t.job_nature_
 		FROM `course_schedule_teacher_salary` csts LEFT JOIN `course_schedule` cs on csts.`course_schedule_id_` = cs.`id_`
-		left join vip_group vg on vg.id_ = csts.music_group_id_ and csts.group_type_ = 'VIP'
+		left join vip_group vg on vg.id_ = csts.music_group_id_ and csts.group_type_ = vg.group_type_
 		left join vip_group_category vgc on vgc.id_ = vg.vip_group_category_id_
 		left join teacher t on t.id_ = csts.user_id_ 
-		WHERE cs.`group_type_` = 'VIP'
+		WHERE cs.`group_type_` IN ('VIP','LIVE')
 		AND csts.settlement_time_ IS NULL
 		and cs.class_date_ between #{startDate} and #{endDate} and csts.tenant_id_ = #{tenantId}
 	</select>

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

@@ -68,6 +68,7 @@
         a.view_mode_ AS viewMode,
         a.shopping_title_ AS shoppingTitle,
         a.use_scene_ as useScene,
+        a.group_type_ as groupType,
         a.subject_id_ as subjectId
         from im_live_broadcast_room as a
         left join tenant_info AS t on a.tenant_id_ = t.id_
@@ -109,6 +110,9 @@
             <if test="param.clientType != null and param.clientType != ''">
                 and  a.client_type_ = #{param.clientType}
             </if>
+            <if test="param.groupType !=null">
+                and a.group_type_ = #{param.groupType}
+            </if>
         </where>
         order by
         <choose>

+ 3 - 0
mec-biz/src/main/resources/config/mybatis/ImLiveRoomReservationMapper.xml

@@ -83,6 +83,9 @@
             <if test="param.roomUid != null">
                 and a.room_uid_ = #{param.roomUid}
             </if>
+            <if test="param.groupType != null">
+                and a.group_type_ = #{param.groupType}
+            </if>
         </where>
     </select>
 

+ 7 - 0
mec-biz/src/main/resources/config/mybatis/ImLiveRoomVideoMapper.xml

@@ -40,4 +40,11 @@
           and a.type = 2
     </select>
 
+    <select id="queryByRoomIds" resultType="com.ym.mec.biz.dal.vo.ImLiveRoomVideoVo">
+        select * from im_live_room_video
+        where room_uid_ in
+        <foreach collection="roomIds" item="roomId" open="(" separator="," close=")">
+            #{roomId}
+        </foreach>
+    </select>
 </mapper>

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

@@ -820,10 +820,10 @@
         LEFT JOIN teacher t ON pg.user_id_ = t.id_
         LEFT JOIN sys_user su ON pg.user_id_ = su.id_
         WHERE pg.audit_status_ = 'PASS' AND pg.group_status_ = 'APPLYING' AND pg.courses_expire_date_ >= DATE_FORMAT(NOW(),'%Y%m%d')
-        AND pg.registration_start_time_ &lt;= NOW()
-        AND pg.courses_start_date_ > NOW()
-        AND (select count(1) as num from student_payment_order where pg.id_ = music_group_id_ AND user_id_ = #{userId}
-        AND status_='SUCCESS') = 0 AND pg.student_id_ = #{userId}
+        AND pg.registration_start_time_ &lt;= NOW() AND pg.courses_start_date_ > NOW()
+        AND (select count(1) from class_group_student_mapper where status_ != 'QUIT'
+        and music_group_id_ = pg.id_ and group_type_ = 'PRACTICE' and user_id_ = #{userId}) = 0
+        AND pg.student_id_ = #{userId}
         <if test="subjectId != null">
             AND pg.subject_id_ = #{subjectId}
         </if>

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

@@ -194,7 +194,7 @@
             <if test="teacherId!=null">
                 AND vg.user_id_=#{teacherId}
             </if>
-            <if test="status != null">
+            <if test="status != null and status != ''">
                 AND vg.group_status_ = #{status}
             </if>
             <if test="activityId!=null">
@@ -366,12 +366,12 @@
     <sql id="studentVipGroupQueryCondition">
         <where>
             vg.audit_status_='PASS'
-            AND vg.group_status_ = 1
+            AND vg.group_status_ = 1 AND vg.group_type_ = 'VIP'
             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 (select count(1) from class_group_student_mapper where status_ != 'QUIT'
+            and music_group_id_ = vg.id_ and group_type_ = vg.group_type_ and user_id_ = #{userId}) = 0
             AND IF(vg.student_id_list_ IS NULL, vg.organ_id_ = #{organId}, FIND_IN_SET(#{userId},
             vg.student_id_list_))
             <if test="expireFlag != null and expireFlag == true">
@@ -404,12 +404,12 @@
     <sql id="studentLiveGroupQueryCondition">
         <where>
             vg.audit_status_='PASS'
-            AND vg.group_status_ = 1
+            AND vg.group_status_ = 1 AND vg.group_type_ = 'LIVE'
             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 type_ = 'LIVE_GROUP_BUY'
-            AND status_='SUCCESS') = 0
+            AND (select count(1) from class_group_student_mapper where status_ != 'QUIT'
+                and music_group_id_ = vg.id_ and group_type_ = vg.group_type_ and user_id_ = #{userId}) = 0
             <if test="expireFlag != null and expireFlag == true">
                 AND vg.payment_expire_date_ >= NOW()
             </if>

+ 2 - 2
mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java

@@ -722,7 +722,7 @@ public class RoomServiceImpl implements RoomService {
         roomMemberDao.deleteUserByRidAndUid(roomId, userId);
     }
 
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public void joinRoomSuccess(String roomId, String userId, String deviceNum) throws Exception {
         log.info("joinRoomSuccess: roomId={}, userId={}, deviceNum={}", roomId, userId, deviceNum);
@@ -731,7 +731,7 @@ public class RoomServiceImpl implements RoomService {
             roomMember = saveRoomMember(roomId, userId);
         }
         String joinSuccessKey = "joinRoomSuccess" + roomId + userId;
-        Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent(joinSuccessKey, roomId, 1l, TimeUnit.SECONDS);
+        Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent(joinSuccessKey, roomId, 1L, TimeUnit.SECONDS);
         if (!aBoolean) {
             RoleEnum roleEnum = RoleEnum.getEnumByValue(roomMember.getRole());
             if (roleEnum == RoleTeacher && StringUtils.isNotEmpty(deviceNum)) {

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

@@ -6,6 +6,7 @@ import com.ym.mec.biz.dal.page.CourseDetailQueryInfo;
 import com.ym.mec.biz.dal.page.ImGroupNoticeQueryInfo;
 import com.ym.mec.biz.dal.page.StudentPayLogQueryInfo;
 import com.ym.mec.biz.service.ClassGroupService;
+import com.ym.mec.biz.service.CourseScheduleService;
 import com.ym.mec.biz.service.ImGroupNoticeService;
 import com.ym.mec.biz.service.SysUserService;
 import com.ym.mec.common.controller.BaseController;
@@ -33,6 +34,9 @@ public class CourseController extends BaseController {
     @Autowired
     private CourseScheduleDao courseScheduleDao;
 
+    @Autowired
+    private CourseScheduleService courseScheduleService;
+
     @ApiOperation("获取学生所购买课程列表")
     @GetMapping(value = "/queryUserMusicGroups")
     public HttpResponseResult<PageInfo<CourseListDto>> queryCoursePage(UserMusicGroupQueryInfo queryInfo){
@@ -87,6 +91,6 @@ public class CourseController extends BaseController {
     @PostMapping("/queryDetailList")
     public HttpResponseResult<List<CourseScheduleStudentDto>> queryDetailList(@RequestBody CourseDetailQueryInfo courseDetailQueryInfo){
         courseDetailQueryInfo.setUserId(sysUserService.getUserId());
-        return succeed(courseScheduleDao.queryDetailList(courseDetailQueryInfo));
+        return succeed(courseScheduleService.queryDetailList(courseDetailQueryInfo));
     }
 }

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

@@ -64,6 +64,7 @@ public class ImLiveRoomReservationController extends BaseController {
     @ApiOperation("学生端-分页查询直播间")
     @PostMapping("/queryPageStudent")
     public HttpResponseResult<PageInfo<ImLiveBroadcastRoomVo>> queryPageStudent(@RequestBody Map<String, Object> param) {
+        param.put("groupType","NORMAL");
         return succeed(imLiveRoomReservationService.queryPageStudent(param));
     }
 

+ 5 - 2
mec-web/src/main/java/com/ym/mec/web/controller/SysEmployeePositionController.java

@@ -26,10 +26,13 @@ public class SysEmployeePositionController extends BaseController {
     @ApiOperation(value = "获取分部下员工职位列表")
     @GetMapping("/findOrganPosition")
     @PreAuthorize("@pcs.hasPermissions('employeePosition/findOrganPosition')")
-    public Object findAll(String id) throws Exception {
-        if(StringUtils.isEmpty(id)){
+    public Object findAll(String id,Boolean all) throws Exception {
+        if(StringUtils.isEmpty(id) || all == null || Boolean.TRUE.equals(!all)){
             id = organizationService.getEmployeeOrgan(id);
         }
+        if (Boolean.TRUE.equals(all)) {
+            id = null;
+        }
         Integer tenantId = TenantContextHolder.getTenantId();
         return succeed(employeePositionService.findOrganPosition(id, tenantId));
     }

+ 8 - 0
mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

@@ -665,4 +665,12 @@ public class TaskController extends BaseController {
         vipGroupService.liveCourseRemind();
         return succeed();
     }
+
+
+    @ApiOperation("关闭直播课房间")
+    @GetMapping("/closeLiveCourseRoom")
+    public Object closeLiveCourseRoom() {
+//        vipGroupService.closeLiveCourseRoom();
+        return succeed();
+    }
 }

+ 0 - 4
mec-web/src/main/java/com/ym/mec/web/controller/VipGroupManageController.java

@@ -146,15 +146,12 @@ public class VipGroupManageController extends BaseController {
         if(Objects.isNull(teacher)){
             return failed("请指定指导老师!");
         }
-
         // 设置默认参数VIP
         if (StringUtils.isBlank(vipGroupApplyDto.getVipGroupApplyBaseInfo().getGroupType())) {
             vipGroupApplyDto.getVipGroupApplyBaseInfo().setGroupType(CourseSchedule.CourseScheduleType.VIP.getCode());
         }
-
         // VIP课参数校验
         if (CourseSchedule.CourseScheduleType.VIP.getCode().equals(vipGroupApplyDto.getVipGroupApplyBaseInfo().getGroupType())) {
-
             if(Objects.isNull(vipGroupApplyDto.getVipGroupApplyBaseInfo().getOrganId())){
                 Integer firstStudentId = vipGroupApplyDto.getVipGroupApplyBaseInfo().getFirstStudentId();
                 SysUser student = teacherDao.getUser(firstStudentId);
@@ -164,7 +161,6 @@ public class VipGroupManageController extends BaseController {
                 vipGroupApplyDto.getVipGroupApplyBaseInfo().setOrganId(student.getOrganId());
             }
         }
-
         return vipGroupService.createVipGroup(vipGroupApplyDto);
     }
 

+ 8 - 8
mec-web/src/main/resources/exportColumnMapper.ini

@@ -115,12 +115,12 @@ headColumns = ["序号", "学生编号", "学生姓名", "交易流水号", "订
 fieldColumns = ["id", "userId", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "orderAmount", "expectAmount", "actualAmount","balancePaymentAmount","couponRemitFee", "transferFee", "platformFee", "payTime", "organName","memo"]
 
 [订单列表导出1]
-headColumns = ["序号", "学生编号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "订单金额", "应付金额", "现金支付", "余额支付", "优惠金额", "课程家长采买","课程学校采买", "VIP课", "网管课", "乐理课", "考级", "维修费用", "乐保费用", "云教练", "押金", "乐器", "教辅费用", "上门费","账户充值", "零售乐器","大件乐器", "其它", "汇付手续费","平台手续费", "到账时间","关联乐团ID/VIP课ID","课程形态","类型","收费乐团编号","收费乐团","零星收款类别", "专业", "分部", "教学点", "合作单位", "乐团主管", "备注"]
-fieldColumns = ["id", "userId", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "orderAmount", "expectAmount", "actualAmount","balancePaymentAmount","couponRemitFee","musicGroupCourseFee","courseSchoolBuyAmount", "vipCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "maintenanceFee", "cloudTeacherFee","leaseFee", "musicalFee", "teachingFee", "visitFee", "rechargeFee","retailGoodsFee","largeMusicalFee", "otherFee", "transferFee", "platformFee", "payTime", "musicGroupId","groupType.desc","typeDesc","feeMusicGroupId","feeMusicGroupName", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "eduTeacher", "memo"]
+headColumns = ["序号", "学生编号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "订单金额", "应付金额", "现金支付", "余额支付", "优惠金额", "课程家长采买","课程学校采买", "VIP课",  "直播课", "网管课", "乐理课", "考级", "维修费用", "乐保费用", "云教练", "押金", "乐器", "教辅费用", "上门费","账户充值", "零售乐器","大件乐器", "其它", "汇付手续费","平台手续费", "到账时间","关联乐团ID/VIP课ID","课程形态","类型","收费乐团编号","收费乐团","零星收款类别", "专业", "分部", "教学点", "合作单位", "乐团主管", "备注"]
+fieldColumns = ["id", "userId", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "orderAmount", "expectAmount", "actualAmount","balancePaymentAmount","couponRemitFee","musicGroupCourseFee","courseSchoolBuyAmount", "vipCourseFee",  "liveCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "maintenanceFee", "cloudTeacherFee","leaseFee", "musicalFee", "teachingFee", "visitFee", "rechargeFee","retailGoodsFee","largeMusicalFee", "otherFee", "transferFee", "platformFee", "payTime", "musicGroupId","groupType.desc","typeDesc","feeMusicGroupId","feeMusicGroupName", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "eduTeacher", "memo"]
 
 [订单列表导出2]
-headColumns = ["序号", "学生编号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "订单金额", "应付金额", "现金支付", "余额支付", "优惠金额","课程家长采买","课程学校采买", "VIP课", "网管课", "乐理课", "考级", "维修费用", "乐保费用", "云教练", "押金", "乐器", "教辅费用", "上门费","账户充值", "零售乐器","大件乐器", "其它","平台手续费", "到账时间",    "关联乐团ID/VIP课ID", "课程形态","类型","收费乐团编号","收费乐团", "零星收款类别", "专业", "分部", "教学点", "合作单位", "乐团主管", "备注"]
-fieldColumns = ["id", "userId", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "orderAmount", "expectAmount", "actualAmount", "balancePaymentAmount",  "couponRemitFee",     "musicGroupCourseFee","courseSchoolBuyAmount", "vipCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "maintenanceFee", "cloudTeacherFee",     "leaseFee", "musicalFee", "teachingFee", "visitFee", "rechargeFee","retailGoodsFee","largeMusicalFee", "otherFee", "platformFee", "payTime", "musicGroupId", "groupType.desc","typeDesc","feeMusicGroupId","feeMusicGroupName", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "eduTeacher", "memo"]
+headColumns = ["序号", "学生编号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "订单金额", "应付金额", "现金支付", "余额支付", "优惠金额","课程家长采买","课程学校采买", "VIP课",  "直播课", "网管课", "乐理课", "考级", "维修费用", "乐保费用", "云教练", "押金", "乐器", "教辅费用", "上门费","账户充值", "零售乐器","大件乐器", "其它","平台手续费", "到账时间",    "关联乐团ID/VIP课ID", "课程形态","类型","收费乐团编号","收费乐团", "零星收款类别", "专业", "分部", "教学点", "合作单位", "乐团主管", "备注"]
+fieldColumns = ["id", "userId", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "orderAmount", "expectAmount", "actualAmount", "balancePaymentAmount",  "couponRemitFee",     "musicGroupCourseFee","courseSchoolBuyAmount", "vipCourseFee",  "liveCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "maintenanceFee", "cloudTeacherFee",     "leaseFee", "musicalFee", "teachingFee", "visitFee", "rechargeFee","retailGoodsFee","largeMusicalFee", "otherFee", "platformFee", "payTime", "musicGroupId", "groupType.desc","typeDesc","feeMusicGroupId","feeMusicGroupName", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "eduTeacher", "memo"]
 
 [订单列表汇总导出]
 headColumns = ["分部", "订单金额", "应付金额", "现金支付", "余额支付", "优惠金额","课程家长采买","课程学校采买", "VIP课", "网管课", "乐理课", "考级", "维修费用", "乐保费用", "云教练", "押金", "乐器", "教辅费用", "上门费","账户充值", "零售乐器","大件乐器", "其它"]
@@ -175,12 +175,12 @@ headColumns = ["序号", "业务分部",  "学生编号", "学生姓名", "交
 fieldColumns = ["id", "userOrganName", "userId", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "orderAmount", "expectAmount", "actualAmount", "balancePaymentAmount", "routeMerNo", "routeAmount", "routeBalance",  "couponRemitFee", "transferFee", "platformFee", "payTime", "organName", "memo"]
 
 [财务管理导出1]
-headColumns = ["序号", "业务分部",  "学生编号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "订单金额", "应付金额", "现金支付", "余额支付", "分润账户", "分润金额", "分配余额", "优惠金额", "乐团课", "VIP课", "网管课", "乐理课", "考级", "维修费用", "乐保费用", "云教练", "押金", "乐器", "教辅费用", "上门费", "账户充值", "其它", "汇付手续费", "平台手续费", "到账时间", "关联乐团ID/VIP课ID", "课程形态","类型","收费乐团编号","收费乐团", "零星收款类别", "专业", "分部", "教学点", "合作单位", "乐团主管", "备注"]
-fieldColumns = ["id", "userOrganName", "userId", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "orderAmount", "expectAmount", "actualAmount", "balancePaymentAmount", "routeMerNo", "routeAmount", "routeBalance",  "couponRemitFee",     "musicGroupCourseFee", "vipCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "maintenanceFee", "cloudTeacherFee", "leaseFee", "musicalFee", "teachingFee", "visitFee", "rechargeFee", "otherFee", "transferFee", "platformFee", "payTime", "musicGroupId", "groupType.desc","typeDesc","feeMusicGroupId","feeMusicGroupName", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "eduTeacher", "memo"]
+headColumns = ["序号", "业务分部",  "学生编号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "订单金额", "应付金额", "现金支付", "余额支付", "分润账户", "分润金额", "分配余额", "优惠金额", "乐团课", "VIP课",  "直播课", "网管课", "乐理课", "考级", "维修费用", "乐保费用", "云教练", "押金", "乐器", "教辅费用", "上门费", "账户充值", "其它", "汇付手续费", "平台手续费", "到账时间", "关联乐团ID/VIP课ID", "课程形态","类型","收费乐团编号","收费乐团", "零星收款类别", "专业", "分部", "教学点", "合作单位", "乐团主管", "备注"]
+fieldColumns = ["id", "userOrganName", "userId", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "orderAmount", "expectAmount", "actualAmount", "balancePaymentAmount", "routeMerNo", "routeAmount", "routeBalance",  "couponRemitFee","musicGroupCourseFee", "vipCourseFee",  "liveCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "maintenanceFee", "cloudTeacherFee", "leaseFee", "musicalFee", "teachingFee", "visitFee", "rechargeFee", "otherFee", "transferFee", "platformFee", "payTime", "musicGroupId", "groupType.desc","typeDesc","feeMusicGroupId","feeMusicGroupName", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "eduTeacher", "memo"]
 
 [财务管理导出2]
-headColumns = ["序号", "业务分部", "学生编号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "订单金额", "应付金额", "现金支付", "余额支付", "分润账户", "分润金额", "分配余额", "优惠金额", "乐团课", "VIP课", "网管课", "乐理课", "考级", "维修费用", "乐保费用", "云教练", "押金", "乐器", "教辅费用", "上门费", "账户充值", "其它", "平台手续费", "到账时间", "关联乐团ID/VIP课ID", "课程形态","类型","收费乐团编号","收费乐团", "零星收款类别", "专业", "分部", "教学点", "合作单位", "乐团主管", "备注"]
-fieldColumns = ["id", "userOrganName", "userId", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "orderAmount" , "expectAmount", "actualAmount", "balancePaymentAmount", "routeMerNo", "routeAmount", "routeBalance",  "couponRemitFee",     "musicGroupCourseFee", "vipCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "maintenanceFee", "cloudTeacherFee", "leaseFee", "musicalFee", "teachingFee", "visitFee", "rechargeFee", "otherFee", "platformFee", "payTime", "musicGroupId", "groupType.desc","typeDesc","feeMusicGroupId","feeMusicGroupName", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "eduTeacher", "memo"]
+headColumns = ["序号", "业务分部", "学生编号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "订单金额", "应付金额", "现金支付", "余额支付", "分润账户", "分润金额", "分配余额", "优惠金额", "乐团课", "VIP课",  "直播课", "网管课", "乐理课", "考级", "维修费用", "乐保费用", "云教练", "押金", "乐器", "教辅费用", "上门费", "账户充值", "其它", "平台手续费", "到账时间", "关联乐团ID/VIP课ID", "课程形态","类型","收费乐团编号","收费乐团", "零星收款类别", "专业", "分部", "教学点", "合作单位", "乐团主管", "备注"]
+fieldColumns = ["id", "userOrganName", "userId", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "orderAmount" , "expectAmount", "actualAmount", "balancePaymentAmount", "routeMerNo", "routeAmount", "routeBalance",  "couponRemitFee","musicGroupCourseFee", "vipCourseFee",  "liveCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "maintenanceFee", "cloudTeacherFee", "leaseFee", "musicalFee", "teachingFee", "visitFee", "rechargeFee", "otherFee", "platformFee", "payTime", "musicGroupId", "groupType.desc","typeDesc","feeMusicGroupId","feeMusicGroupName", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "eduTeacher", "memo"]
 
 [老师默认课酬导出]
 headColumns = ["老师编号", "姓名", "分部", "工作类型", "在职状态", "老师状态", "1v1", "1v2", "1v3", "1v4", "1v5", "1v6", "1v7","网管课", "单技课2.0(主教)", "合奏课2.0(主教)", "综合课2.0(主教)", "集训单技课2.0(主教)", "集训合奏课2.0(主教)","基础技能课2.0(主教)", "课堂课(主教)", "单技课3.0(主教)", "合奏课3.0(主教)", "综合课3.0(主教)", "集训单技课3.0(主教)", "集训合奏课3.0(主教)","基础技能课3.0(主教)", "单技课2.0(助教)", "合奏课2.0(助教)", "综合课2.0(助教)", "集训单技课2.0(助教)", "集训合奏课2.0(助教)","基础技能课2.0(助教)", "课堂课(助教)", "单技课3.0(助教)", "合奏课3.0(助教)", "综合课3.0(助教)", "集训单技课3.0(助教)", "集训合奏课3.0(助教)","基础技能课3.0(助教)", "线上基础技能课1v3", "线上基础技能课1v4", "线上基础技能课1v5", "乐团网管课1v1"]