Explorar el Código

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

yuanliang hace 2 años
padre
commit
4ada6f5c3a
Se han modificado 74 ficheros con 2318 adiciones y 1897 borrados
  1. 239 354
      .idea/httpRequests/http-requests-log.http
  2. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentOperatingVisitDao.java
  3. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentVisitDao.java
  4. 52 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseHomeworkWrapper.java
  5. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleDto.java
  6. 4 175
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleEndDto.java
  7. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicScoreSubjectDto.java
  8. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonExaminationSaveDto.java
  9. 23 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonTrainingDetailWrapper.java
  10. 2 176
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseScheduleStudentPayment.java
  11. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentLessonExaminationDetail.java
  12. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentLessonTrainingDetail.java
  13. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentPaymentOrderDetail.java
  14. 4 144
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentVisit.java
  15. 12 7
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/CouponDetailTypeEnum.java
  16. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/TemplateTypeEnum.java
  17. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/mapper/LiveGroupPlusMapper.java
  18. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/CourseDetailQueryInfo.java
  19. 4 263
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/EndCourseScheduleQueryInfo.java
  20. 7 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/LiveGroupWrapper.java
  21. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java
  22. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ImLiveBroadcastRoomService.java
  23. 21 3
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentLessonTrainingDetailService.java
  24. 18 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentVisitService.java
  25. 16 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseHomeworkServiceImpl.java
  26. 431 54
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  27. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseShareServiceImpl.java
  28. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  29. 30 14
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesReplyServiceImpl.java
  30. 239 220
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesServiceImpl.java
  31. 15 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java
  32. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexErrDataRecordServiceImpl.java
  33. 32 124
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  34. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/OrderPayOpsServiceImpl.java
  35. 7 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java
  36. 4 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java
  37. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentLessonExaminationDetailServiceImpl.java
  38. 29 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentLessonExaminationServiceImpl.java
  39. 191 31
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentLessonTrainingDetailServiceImpl.java
  40. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  41. 6 10
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  42. 157 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentVisitServiceImpl.java
  43. 22 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java
  44. 150 84
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  45. 2 2
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  46. 2 1
      mec-biz/src/main/resources/config/mybatis/ClassGroupStudentMapperMapper.xml
  47. 71 38
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  48. 4 3
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  49. 1 1
      mec-biz/src/main/resources/config/mybatis/CourseShareMapper.xml
  50. 25 2
      mec-biz/src/main/resources/config/mybatis/LiveGroupPlusMapper.xml
  51. 1 0
      mec-biz/src/main/resources/config/mybatis/StudentAttendanceMapper.xml
  52. 7 3
      mec-biz/src/main/resources/config/mybatis/StudentCourseHomeworkMapper.xml
  53. 1 1
      mec-biz/src/main/resources/config/mybatis/StudentManageDao.xml
  54. 12 6
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  55. 7 0
      mec-biz/src/main/resources/config/mybatis/StudentOperatingVisitMapper.xml
  56. 1 1
      mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml
  57. 20 1
      mec-biz/src/main/resources/config/mybatis/StudentVisitMapper.xml
  58. 2 2
      mec-biz/src/main/resources/config/mybatis/SubjectMapper.xml
  59. 8 11
      mec-biz/src/main/resources/config/mybatis/VipGroupMapper.xml
  60. 2 2
      mec-common/common-core/src/main/java/com/ym/mec/common/controller/BaseController.java
  61. 150 110
      mec-common/common-core/src/main/java/com/ym/mec/common/service/impl/BaseServiceImpl.java
  62. 25 5
      mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java
  63. 5 0
      mec-student/src/main/java/com/ym/mec/student/controller/StudentCourseScheduleController.java
  64. 51 0
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/CourseHomeworkController.java
  65. 37 8
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherController.java
  66. 1 0
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/adapay/Payment.java
  67. 1 1
      mec-web/src/main/java/com/ym/mec/web/controller/ClassGroupController.java
  68. 22 0
      mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleController.java
  69. 3 3
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  70. 16 0
      mec-web/src/main/java/com/ym/mec/web/controller/ImportController.java
  71. 14 5
      mec-web/src/main/java/com/ym/mec/web/controller/TeacherController.java
  72. 0 1
      mec-web/src/main/java/com/ym/mec/web/controller/VipGroupManageController.java
  73. 1 1
      mec-web/src/main/java/com/ym/mec/web/controller/VisitController.java
  74. 9 1
      mec-web/src/main/resources/columnMapper.ini

+ 239 - 354
.idea/httpRequests/http-requests-log.http

@@ -1,183 +1,170 @@
-GET http://127.0.0.1:9001/studentVipGroup/joinLiveRoomByShare?courseScheduleId=2179
-Authorization: bearer 093517b0-c9a4-407b-b558-0d71bf157b16
-Connection: Keep-Alive
+GET http://127.0.0.1:9002/teacherCourseSchedule/liveCourseScheduleTime?courseScheduleId=2548
+Authorization: bearer e70c68c9-05e3-4502-aed4-f7001a0e2766
+Proxy-Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-<> 2023-06-12T163044.200.json
+<> 2023-06-15T221721.200.json
 
 ###
 
-GET http://127.0.0.1:9001/studentVipGroup/joinLiveRoomByShare?courseScheduleId=2179
-Authorization: bearer 093517b0-c9a4-407b-b558-0d71bf157b16
-Connection: Keep-Alive
+GET http://127.0.0.1:9002/teacherCourseSchedule/liveCourseScheduleTime?courseScheduleId=2548
+Authorization: bearer e70c68c9-05e3-4502-aed4-f7001a0e2766
+Proxy-Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-<> 2023-06-12T095605.200.json
+<> 2023-06-15T221523.200.json
 
 ###
 
-GET http://127.0.0.1:9001/studentVipGroup/joinLiveRoomByShare?courseScheduleId=2179
-Authorization: bearer 093517b0-c9a4-407b-b558-0d71bf157b16
-Connection: Keep-Alive
+GET http://127.0.0.1:9002/teacherCourseSchedule/liveCourseScheduleTime?courseScheduleId=2548
+Authorization: bearer e70c68c9-05e3-4502-aed4-f7001a0e2766
+Proxy-Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-<> 2023-06-12T095427.200.json
+<> 2023-06-15T221236.200.json
 
 ###
 
-GET http://127.0.0.1:9001/studentVipGroup/joinLiveRoomByShare?courseScheduleId=2179
-Authorization: bearer 093517b0-c9a4-407b-b558-0d71bf157b16
-Connection: Keep-Alive
+GET http://127.0.0.1:9002/teacherCourseSchedule/liveCourseScheduleTime?courseScheduleId=2548
+Authorization: bearer e70c68c9-05e3-4502-aed4-f7001a0e2766
+Proxy-Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-<> 2023-06-12T095323.200.json
+<> 2023-06-15T220649.200.json
 
 ###
 
-GET http://127.0.0.1:9001/studentVipGroup/joinLiveRoomByShare?courseScheduleId=2179
-Authorization: bearer 093517b0-c9a4-407b-b558-0d71bf157b16
-Connection: Keep-Alive
+GET http://127.0.0.1:9002/teacherCourseSchedule/getCourseSchedulesWithDate?date=2023-06-05 00:00:00
+Content-Type: application/json
+Authorization: bearer 4d8e23a1-3acd-42e4-a1ca-b4d595506d98
+Proxy-Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-<> 2023-06-12T095238.200.json
+<> 2023-06-15T220555.200.json
 
 ###
 
-GET http://127.0.0.1:9001/studentVipGroup/joinLiveRoomByShare?courseScheduleId=2179
-Authorization: bearer 093517b0-c9a4-407b-b558-0d71bf157b16
-Connection: Keep-Alive
+GET http://127.0.0.1:9002/teacherCourseSchedule/liveCourseScheduleTime?courseScheduleId=2548
+Authorization: bearer e70c68c9-05e3-4502-aed4-f7001a0e2766
+Proxy-Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-<> 2023-06-12T095217.200.json
+<> 2023-06-15T220546.200.json
 
 ###
 
-GET http://127.0.0.1:9001/studentVipGroup/joinLiveRoomByShare?courseScheduleId=2179
-Authorization: bearer 093517b0-c9a4-407b-b558-0d71bf157b16
-Connection: Keep-Alive
+GET http://127.0.0.1:9002/teacherCourseSchedule/liveCourseScheduleTime?courseScheduleId=2548
+Authorization: bearer e70c68c9-05e3-4502-aed4-f7001a0e2766
+Proxy-Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-<> 2023-06-12T095045.200.json
+<> 2023-06-15T220439.200.json
 
 ###
 
-GET http://127.0.0.1:9001/studentVipGroup/joinLiveRoomByShare?courseScheduleId=2179
-Authorization: bearer 093517b0-c9a4-407b-b558-0d71bf157b16
-Connection: Keep-Alive
+GET http://127.0.0.1:9002/teacherCourseSchedule/liveCourseScheduleTime?courseScheduleId=2548
+Authorization: bearer e70c68c9-05e3-4502-aed4-f7001a0e2766
+Proxy-Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-<> 2023-06-12T094907.200.json
+<> 2023-06-15T220236.200.json
 
 ###
 
-GET http://127.0.0.1:9001/studentVipGroup/joinLiveRoomByShare?courseScheduleId=2179
-Authorization: bearer 81d0c352-fcc8-4812-87f5-0f7a68d10451
-Connection: Keep-Alive
+GET http://127.0.0.1:9002/teacherCourseSchedule/liveCourseScheduleTime?courseScheduleId=2548
+Authorization: bearer e70c68c9-05e3-4502-aed4-f7001a0e2766
+Proxy-Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-<> 2023-06-12T094734.200.json
+<> 2023-06-15T215903.200.json
 
 ###
 
-POST http://localhost:8005/imSendGroupMessage/send
-Content-Type: application/json
-tenantId: 1
-Authorization: bearer 9b756b90-f27a-4ca9-99b1-da854c72eb3f
-Content-Length: 99
-Connection: Keep-Alive
+GET http://127.0.0.1:9002/teacherCourseSchedule/liveCourseScheduleTime?courseScheduleId=2548
+Authorization: bearer e70c68c9-05e3-4502-aed4-f7001a0e2766
+Proxy-Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-{"postType":"0","messageContent":"3の3","messageType":"TXT","targetIds":"232","isIncludeSender":0}
-
-<> 2023-06-09T174838.200.json
+<> 2023-06-15T215426.200.json
 
 ###
 
-GET http://127.0.0.1:8005/task/closeLiveCourseRoom
-Connection: Keep-Alive
+GET http://127.0.0.1:9002/teacherCourseSchedule/liveCourseScheduleTime?courseScheduleId=2548
+Authorization: bearer e70c68c9-05e3-4502-aed4-f7001a0e2766
+Proxy-Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-<> 2023-06-08T214126.200.json
+<> 2023-06-15T215131.200.json
 
 ###
 
-GET http://127.0.0.1:8005/task/closeLiveCourseRoom
+POST https://online.lexiaoya.cn/api-backend/open/schoolTeacherStudent/importPlan?fileUrl=https://polestar-oss.oss-cn-shenzhen.aliyuncs.com/assets/excel/0614/0614单簧管导入表.xlsx
+Content-Length: 0
 Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-<> 2023-06-08T210807.200.json
+<> 2023-06-15T100514.200.json
 
 ###
 
-GET http://127.0.0.1:9002/teacherCourseSchedule/findCourseAttendanceDetailHeadInfo?courseScheduleId=1701
-authorization: bearer b33a3aed-ca44-4537-b3ae-1fba38c2560a
+POST http://127.0.0.1:9002/teacherCourseSchedule/liveCoursePage
+authorization: bearer 0071d90f-5623-4ee9-a88e-c7adb09efb1c
 Content-Type: application/json
+Content-Length: 149
 Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-<> 2023-06-08T194906.200.json
-
-###
-
-GET http://127.0.0.1:9002/teacherCourseSchedule/findCourseAttendanceDetailHeadInfo?courseScheduleId=1701
-authorization: bearer 97fd8e85-bb3c-4967-8a07-47c44957f94a
-Content-Type: application/json
-Connection: Keep-Alive
-User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
-Accept-Encoding: br,deflate,gzip,x-gzip
+{
+  "page": 1,
+  "rows": 10,
+//  "startTime": "2023-06-06 10:14:57",
+//  "endTime": "2023-06-08 10:14:57",
+//  "search": "",
+  "status": "UNDERWAY"
+}
 
-<> 2023-06-08T194556.200.json
+<> 2023-06-14T173156.200.json
 
 ###
 
-GET http://127.0.0.1:9002/teacherCourseSchedule/findCourseAttendanceDetailHeadInfo?courseScheduleId=1701
-authorization: bearer 97fd8e85-bb3c-4967-8a07-47c44957f94a
+POST http://127.0.0.1:9002/teacherCourseSchedule/liveCoursePage
+authorization: bearer 0071d90f-5623-4ee9-a88e-c7adb09efb1c
 Content-Type: application/json
+Content-Length: 150
 Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-<> 2023-06-08T171149.200.json
-
-###
-
-GET http://127.0.0.1:8005/task/closeLiveCourseRoom
-Connection: Keep-Alive
-User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
-Accept-Encoding: br,deflate,gzip,x-gzip
-
-<> 2023-06-08T163756.200.json
-
-###
-
-GET http://127.0.0.1:9002/teacherCourseSchedule/findCourseAttendanceDetailHeadInfo?courseScheduleId=2002
-authorization: bearer 97fd8e85-bb3c-4967-8a07-47c44957f94a
-Content-Type: application/json
-Connection: Keep-Alive
-User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
-Accept-Encoding: br,deflate,gzip,x-gzip
+{
+  "page": 1,
+  "rows": 10,
+//  "startTime": "2023-06-06 10:14:57",
+//  "endTime": "2023-06-08 10:14:57",
+//  "search": "",
+  "status": "NOT_START"
+}
 
-<> 2023-06-08T162615.200.json
+<> 2023-06-14T173111.200.json
 
 ###
 
 POST http://127.0.0.1:9002/teacherCourseSchedule/liveCoursePage
-authorization: bearer fe63240c-4f7d-4b67-90f8-7d51eaafdfb7
+authorization: bearer a9b023c1-f525-4b95-8723-0ca14b038624
 Content-Type: application/json
-Content-Length: 152
+Content-Length: 150
 Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
@@ -188,174 +175,173 @@ Accept-Encoding: br,deflate,gzip,x-gzip
 //  "startTime": "2023-06-06 10:14:57",
 //  "endTime": "2023-06-08 10:14:57",
 //  "search": "",
-//  "status": "NOT_START"
+  "status": "NOT_START"
 }
 
-<> 2023-06-08T162147.200.json
+<> 2023-06-14T173045.200.json
 
 ###
 
-POST http://127.0.0.1:9002/teacherAttendance/getLiveCurrentCourseStudents
-authorization: bearer 97fd8e85-bb3c-4967-8a07-47c44957f94a
-Content-Type: application/json
-Content-Length: 70
+GET http://127.0.0.1:9001/studentCourseSchedule/queryCourseId?courseId=2162
+Authorization: bearer b2d082f2-2e51-4880-8119-5471c5287bf9
 Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-{
-  "courseScheduleId": 2001,
-  "status": "PURCHASE",
-  "search": ""
-}
-
-<> 2023-06-08T162015.200.json
+<> 2023-06-14T154028.200.json
 
 ###
 
-POST http://127.0.0.1:9002/teacherAttendance/getLiveCurrentCourseStudents
-authorization: bearer 97fd8e85-bb3c-4967-8a07-47c44957f94a
-Content-Type: application/json
-Content-Length: 67
+GET http://127.0.0.1:9001/studentCourseSchedule/queryCourseId?courseId=2162
+Authorization: bearer b2d082f2-2e51-4880-8119-5471c5287bf9
 Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-{
-  "courseScheduleId": 2001,
-  "status": "SHARE",
-  "search": ""
-}
+<> 2023-06-14T145629.200.json
 
-<> 2023-06-08T161954.200.json
+###
+
+GET http://127.0.0.1:9001/studentCourseSchedule/queryCourseId?courseId=1374
+Authorization: bearer b2d082f2-2e51-4880-8119-5471c5287bf9
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-06-14T145450.200.json
 
 ###
 
-GET http://127.0.0.1:8005/task/closeLiveCourseRoom
+GET http://127.0.0.1:8005/courseSchedule/getCurrentCourseDetail/1374
+Authorization: bearer b2d082f2-2e51-4880-8119-5471c5287bf9
 Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-<> 2023-06-08T161900.200.json
+<> 2023-06-14T143343.200.json
 
 ###
 
-GET http://127.0.0.1:8005/task/closeLiveCourseRoom
+GET http://127.0.0.1:8005/courseSchedule/query?courseScheduleId=1374
+Authorization: bearer b2d082f2-2e51-4880-8119-5471c5287bf9
 Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-<> 2023-06-08T161723.200.json
+<> 2023-06-14T143049.200.json
 
 ###
 
-GET http://127.0.0.1:8005/task/closeLiveCourseRoom
+POST http://127.0.0.1:9002/teacherAttendance/getLiveCurrentCourseStudents
+authorization: bearer b2d082f2-2e51-4880-8119-5471c5287bf9
+Content-Type: application/json
+Content-Length: 69
 Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-<> 2023-06-08T161420.200.json
+{
+  "courseScheduleId": "2328",
+  "status": "SHARE",
+  "search": ""
+}
+
+<> 2023-06-14T124937.200.json
 
 ###
 
-POST http://127.0.0.1:9002/teacherCourseSchedule/liveCoursePage
-authorization: bearer 1238347b-3b06-444e-9d35-d122639121ad
+POST http://127.0.0.1:9002/teacherAttendance/getLiveCurrentCourseStudents
+authorization: bearer b2d082f2-2e51-4880-8119-5471c5287bf9
 Content-Type: application/json
-Content-Length: 152
+Content-Length: 69
 Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
 {
-  "page": 1,
-  "rows": 10,
-//  "startTime": "2023-06-06 10:14:57",
-//  "endTime": "2023-06-08 10:14:57",
-//  "search": "",
-//  "status": "NOT_START"
+  "courseScheduleId": "2328",
+  "status": "SHARE",
+  "search": ""
 }
 
-<> 2023-06-08T155851.200.json
+<> 2023-06-14T124615.200.json
 
 ###
 
-POST http://127.0.0.1:9002/teacherCourseSchedule/liveCoursePage
-authorization: bearer 1238347b-3b06-444e-9d35-d122639121ad
+POST http://127.0.0.1:9002/teacherAttendance/getLiveCurrentCourseStudents
+authorization: bearer b2d082f2-2e51-4880-8119-5471c5287bf9
 Content-Type: application/json
-Content-Length: 152
+Content-Length: 69
 Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
 {
-  "page": 1,
-  "rows": 10,
-//  "startTime": "2023-06-06 10:14:57",
-//  "endTime": "2023-06-08 10:14:57",
-//  "search": "",
-//  "status": "NOT_START"
+  "courseScheduleId": "2328",
+  "status": "SHARE",
+  "search": ""
 }
 
-<> 2023-06-08T155845.200.json
+<> 2023-06-14T124548.200.json
 
 ###
 
 POST http://127.0.0.1:9002/teacherAttendance/getLiveCurrentCourseStudents
-authorization: bearer 97fd8e85-bb3c-4967-8a07-47c44957f94a
+authorization: bearer b2d082f2-2e51-4880-8119-5471c5287bf9
 Content-Type: application/json
-Content-Length: 70
+Content-Length: 69
 Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
 {
-  "courseScheduleId": 2001,
-//  "status": "NORMAL",
+  "courseScheduleId": "2328",
+  "status": "SHARE",
   "search": ""
 }
 
-<> 2023-06-08T155815.200.json
+<> 2023-06-14T124526.200.json
 
 ###
 
 POST http://127.0.0.1:9002/teacherAttendance/getLiveCurrentCourseStudents
-authorization: bearer 97fd8e85-bb3c-4967-8a07-47c44957f94a
+authorization: bearer b2d082f2-2e51-4880-8119-5471c5287bf9
 Content-Type: application/json
-Content-Length: 70
+Content-Length: 69
 Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
 {
-  "courseScheduleId": 2001,
-//  "status": "NORMAL",
+  "courseScheduleId": "2328",
+  "status": "SHARE",
   "search": ""
 }
 
-<> 2023-06-08T155623.200.json
+<> 2023-06-14T124513.200.json
 
 ###
 
 POST http://127.0.0.1:9002/teacherAttendance/getLiveCurrentCourseStudents
-authorization: bearer 97fd8e85-bb3c-4967-8a07-47c44957f94a
+authorization: bearer b2d082f2-2e51-4880-8119-5471c5287bf9
 Content-Type: application/json
-Content-Length: 70
+Content-Length: 69
 Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
 {
-  "courseScheduleId": 2001,
-//  "status": "NORMAL",
+  "courseScheduleId": "2328",
+  "status": "SHARE",
   "search": ""
 }
 
-<> 2023-06-08T155544.200.json
+<> 2023-06-14T124441.200.json
 
 ###
 
 POST http://127.0.0.1:9002/teacherCourseSchedule/liveCoursePage
-authorization: bearer 1238347b-3b06-444e-9d35-d122639121ad
+authorization: bearer a9b023c1-f525-4b95-8723-0ca14b038624
 Content-Type: application/json
 Content-Length: 152
 Connection: Keep-Alive
@@ -371,365 +357,264 @@ Accept-Encoding: br,deflate,gzip,x-gzip
 //  "status": "NOT_START"
 }
 
-<> 2023-06-08T155515.200.json
+<> 2023-06-14T111123.200.json
 
 ###
 
-POST http://127.0.0.1:9002/teacherAttendance/getLiveCurrentCourseStudents
-authorization: bearer 97fd8e85-bb3c-4967-8a07-47c44957f94a
+POST http://127.0.0.1:8005/vipGroupManage/liveStudentList
+Authorization: bearer b2d082f2-2e51-4880-8119-5471c5287bf9
 Content-Type: application/json
-Content-Length: 70
+Content-Length: 78
 Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
 {
-  "courseScheduleId": 2001,
-//  "status": "NORMAL",
-  "search": ""
+  "page": 1,
+  "rows": 10,
+  "liveGroupId": 102,
+  "search": "测试59611"
 }
 
-<> 2023-06-08T141058.200.json
+<> 2023-06-14T105403.200.json
 
 ###
 
-POST http://127.0.0.1:9002/teacherAttendance/getLiveCurrentCourseStudents
-authorization: bearer 97fd8e85-bb3c-4967-8a07-47c44957f94a
+POST http://127.0.0.1:8005/vipGroupManage/liveStudentList
+Authorization: bearer b2d082f2-2e51-4880-8119-5471c5287bf9
 Content-Type: application/json
-Content-Length: 68
+Content-Length: 77
 Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
 {
-  "courseScheduleId": 2001,
-  "status": "NORMAL",
-  "search": ""
+  "page": 1,
+  "rows": 10,
+  "liveGroupId": 102,
+  "search": "测试5961"
 }
 
-<> 2023-06-08T141049.200.json
+<> 2023-06-14T105355.200.json
 
 ###
 
-POST http://127.0.0.1:9002/teacherAttendance/getCurrentCourseStudents
-authorization: bearer 97fd8e85-bb3c-4967-8a07-47c44957f94a
+POST http://127.0.0.1:8005/vipGroupManage/liveStudentList
+Authorization: bearer b2d082f2-2e51-4880-8119-5471c5287bf9
 Content-Type: application/json
-Content-Length: 68
+Content-Length: 51
 Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
 {
-  "courseScheduleId": 2001,
-  "status": "NORMAL",
-  "search": ""
+  "page": 1,
+  "rows": 10,
+  "liveGroupId": 102
 }
 
-<> 2023-06-08T140909.200.json
+<> 2023-06-14T105332.200.json
 
 ###
 
-POST http://127.0.0.1:9002/teacherAttendance/getCurrentCourseStudents
-authorization: bearer 1238347b-3b06-444e-9d35-d122639121ad
-Content-Type: application/json
-Content-Length: 68
+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
 
-{
-  "courseScheduleId": 2001,
-  "status": "NORMAL",
-  "search": ""
-}
-
-<> 2023-06-08T140848.200.json
+<> 2023-06-13T183554.200.json
 
 ###
 
-POST http://127.0.0.1:9002/teacherCourseSchedule/liveCoursePage
-authorization: bearer 1238347b-3b06-444e-9d35-d122639121ad
-Content-Type: application/json
-Content-Length: 152
+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
 
-{
-  "page": 1,
-  "rows": 10,
-//  "startTime": "2023-06-06 10:14:57",
-//  "endTime": "2023-06-08 10:14:57",
-//  "search": "",
-//  "status": "NOT_START"
-}
-
-<> 2023-06-08T112258.200.json
+<> 2023-06-13T183425.200.json
 
 ###
 
-POST http://127.0.0.1:9002/teacherCourseSchedule/liveCoursePage
-authorization: bearer 1238347b-3b06-444e-9d35-d122639121ad
-Content-Type: application/json
-Content-Length: 152
+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
 
-{
-  "page": 1,
-  "rows": 10,
-//  "startTime": "2023-06-06 10:14:57",
-//  "endTime": "2023-06-08 10:14:57",
-//  "search": "",
-//  "status": "NOT_START"
-}
-
-<> 2023-06-08T111901.200.json
+<> 2023-06-13T183308.200.json
 
 ###
 
-POST http://127.0.0.1:9002/teacherCourseSchedule/liveCoursePage
-authorization: bearer 1238347b-3b06-444e-9d35-d122639121ad
-Content-Type: application/json
-Content-Length: 152
+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
 
-{
-  "page": 1,
-  "rows": 10,
-//  "startTime": "2023-06-06 10:14:57",
-//  "endTime": "2023-06-08 10:14:57",
-//  "search": "",
-//  "status": "NOT_START"
-}
-
-<> 2023-06-08T111651.200.json
+<> 2023-06-13T182452.200.json
 
 ###
 
-POST http://127.0.0.1:9002/teacherCourseSchedule/liveCoursePage
-authorization: bearer 1238347b-3b06-444e-9d35-d122639121ad
-Content-Type: application/json
-Content-Length: 152
+GET http://127.0.0.1:9001/studentVipGroup/joinLiveRoomByShare?courseScheduleId=2179
+Authorization: bearer 093517b0-c9a4-407b-b558-0d71bf157b16
 Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-{
-  "page": 1,
-  "rows": 10,
-//  "startTime": "2023-06-06 10:14:57",
-//  "endTime": "2023-06-08 10:14:57",
-//  "search": "",
-//  "status": "NOT_START"
-}
-
-<> 2023-06-08T111624.200.json
+<> 2023-06-12T163044.200.json
 
 ###
 
-POST http://127.0.0.1:9002/teacherCourseSchedule/liveCoursePage
-authorization: bearer 1238347b-3b06-444e-9d35-d122639121ad
-Content-Type: application/json
-Content-Length: 146
+GET http://127.0.0.1:9001/studentVipGroup/joinLiveRoomByShare?courseScheduleId=2179
+Authorization: bearer 093517b0-c9a4-407b-b558-0d71bf157b16
 Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-{
-  "page": 1,
-  "rows": 10,
-  "startTime": "2023-06-06 10:14:57",
-  "endTime": "2023-06-08 10:14:57",
-  "search": "",
-//  "status": "NOT_START"
-}
-
-<> 2023-06-08T111544.200.json
+<> 2023-06-12T095605.200.json
 
 ###
 
-POST http://127.0.0.1:9002/teacherCourseSchedule/liveCoursePage
-Authorization: bearer 3c1eec84-6ee9-4c70-a4a8-d857d57338f6
-Content-Type: application/json
-Content-Length: 146
+GET http://127.0.0.1:9001/studentVipGroup/joinLiveRoomByShare?courseScheduleId=2179
+Authorization: bearer 093517b0-c9a4-407b-b558-0d71bf157b16
 Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-{
-  "page": 1,
-  "rows": 10,
-  "startTime": "2023-06-06 10:14:57",
-  "endTime": "2023-06-08 10:14:57",
-  "search": "",
-//  "status": "NOT_START"
-}
-
-<> 2023-06-08T110339.200.json
+<> 2023-06-12T095427.200.json
 
 ###
 
-POST http://127.0.0.1:9002/teacherCourseSchedule/liveCoursePage
-Authorization: bearer 3c1eec84-6ee9-4c70-a4a8-d857d57338f6
-Content-Type: application/json
-Content-Length: 146
+GET http://127.0.0.1:9001/studentVipGroup/joinLiveRoomByShare?courseScheduleId=2179
+Authorization: bearer 093517b0-c9a4-407b-b558-0d71bf157b16
 Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-{
-  "page": 1,
-  "rows": 10,
-  "startTime": "2023-06-08 10:14:57",
-  "endTime": "2023-06-08 10:14:57",
-  "search": "",
-//  "status": "NOT_START"
-}
-
-<> 2023-06-08T110325.200.json
+<> 2023-06-12T095323.200.json
 
 ###
 
-POST http://127.0.0.1:9002/teacherCourseSchedule/liveCoursePage
-Authorization: bearer 3c1eec84-6ee9-4c70-a4a8-d857d57338f6
-Content-Type: application/json
-Content-Length: 144
+GET http://127.0.0.1:9001/studentVipGroup/joinLiveRoomByShare?courseScheduleId=2179
+Authorization: bearer 093517b0-c9a4-407b-b558-0d71bf157b16
 Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-{
-  "page": 1,
-  "rows": 10,
-  "startTime": "2023-06-08 10:14:57",
-  "endTime": "2023-06-08 10:14:57",
-  "search": "",
-  "status": "NOT_START"
-}
-
-<> 2023-06-08T110304.200.json
+<> 2023-06-12T095238.200.json
 
 ###
 
-POST http://127.0.0.1:9002/teacherCourseSchedule/liveCoursePage
-Authorization: bearer 3c1eec84-6ee9-4c70-a4a8-d857d57338f6
-Content-Type: application/json
-Content-Length: 144
+GET http://127.0.0.1:9001/studentVipGroup/joinLiveRoomByShare?courseScheduleId=2179
+Authorization: bearer 093517b0-c9a4-407b-b558-0d71bf157b16
 Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-{
-  "page": 1,
-  "rows": 10,
-  "startTime": "2023-06-08 10:14:57",
-  "endTime": "2023-06-08 10:14:57",
-  "search": "",
-  "status": "NOT_START"
-}
+<> 2023-06-12T095217.200.json
+
+###
+
+GET http://127.0.0.1:9001/studentVipGroup/joinLiveRoomByShare?courseScheduleId=2179
+Authorization: bearer 093517b0-c9a4-407b-b558-0d71bf157b16
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
 
-<> 2023-06-08T102617.200.json
+<> 2023-06-12T095045.200.json
 
 ###
 
-POST http://127.0.0.1:9002/teacherCourseSchedule/liveCoursePage
-Authorization: bearer 6dbea593-df93-4bf4-9f75-538c1bcc231e
-Content-Type: application/json
-Content-Length: 145
+GET http://127.0.0.1:9001/studentVipGroup/joinLiveRoomByShare?courseScheduleId=2179
+Authorization: bearer 093517b0-c9a4-407b-b558-0d71bf157b16
 Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-{
-  "page": 1,
-  "rows": 10,
-  "startTime": "2023-06-08 10:14:57",
-  "endTime": "2023-06-08 10:14:57",
-  "search": "",
-  "status": "NOT_START",
-}
+<> 2023-06-12T094907.200.json
+
+###
+
+GET http://127.0.0.1:9001/studentVipGroup/joinLiveRoomByShare?courseScheduleId=2179
+Authorization: bearer 81d0c352-fcc8-4812-87f5-0f7a68d10451
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
 
-<> 2023-06-08T101549.200.json
+<> 2023-06-12T094734.200.json
 
 ###
 
-POST http://127.0.0.1:9002/teacherCourseSchedule/liveCoursePage
-Authorization: bearer 6dbea593-df93-4bf4-9f75-538c1bcc231e
-Content-Length: 29
-Content-Type: */*; charset=UTF-8
+POST http://localhost:8005/imSendGroupMessage/send
+Content-Type: application/json
+tenantId: 1
+Authorization: bearer 9b756b90-f27a-4ca9-99b1-da854c72eb3f
+Content-Length: 99
 Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-{
-  "page": 1,
-  "rows": 10
-}
+{"postType":"0","messageContent":"3の3","messageType":"TXT","targetIds":"232","isIncludeSender":0}
 
-<> 2023-06-08T100117.200.json
+<> 2023-06-09T174838.200.json
 
 ###
 
-GET http://127.0.0.1:8005/task/liveCourseRemind
+GET http://127.0.0.1:8005/task/closeLiveCourseRoom
 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
+<> 2023-06-08T214126.200.json
 
 ###
 
-GET http://127.0.0.1:9002/teacherCourseSchedule/liveCourseScheduleTime?courseScheduleId=2030
-Authorization: bearer 2cd308e9-0b8b-4b08-b3cd-f34dc50a8dfd
-Proxy-Connection: Keep-Alive
+GET http://127.0.0.1:8005/task/closeLiveCourseRoom
+Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-<> 2023-06-07T155507.200.json
+<> 2023-06-08T210807.200.json
 
 ###
 
-GET http://127.0.0.1:9002/teacherCourseSchedule/liveCourseScheduleTime?courseScheduleId=2030
-Authorization: bearer 2cd308e9-0b8b-4b08-b3cd-f34dc50a8dfd
-Proxy-Connection: Keep-Alive
+GET http://127.0.0.1:9002/teacherCourseSchedule/findCourseAttendanceDetailHeadInfo?courseScheduleId=1701
+authorization: bearer b33a3aed-ca44-4537-b3ae-1fba38c2560a
+Content-Type: application/json
+Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-<> 2023-06-07T155111.200.json
+<> 2023-06-08T194906.200.json
 
 ###
 
-GET http://127.0.0.1:9002/teacherCourseSchedule/liveCourseScheduleTime?courseScheduleId=2030
-Authorization: bearer 2cd308e9-0b8b-4b08-b3cd-f34dc50a8dfd
-Proxy-Connection: Keep-Alive
+GET http://127.0.0.1:9002/teacherCourseSchedule/findCourseAttendanceDetailHeadInfo?courseScheduleId=1701
+authorization: bearer 97fd8e85-bb3c-4967-8a07-47c44957f94a
+Content-Type: application/json
+Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-<> 2023-06-07T155043.200.json
+<> 2023-06-08T194556.200.json
 
 ###
 
-GET http://127.0.0.1:9002/teacherCourseSchedule/liveCourseScheduleTime?courseScheduleId=2030
-Authorization: bearer 2cd308e9-0b8b-4b08-b3cd-f34dc50a8dfd
-Proxy-Connection: Keep-Alive
+GET http://127.0.0.1:9002/teacherCourseSchedule/findCourseAttendanceDetailHeadInfo?courseScheduleId=1701
+authorization: bearer 97fd8e85-bb3c-4967-8a07-47c44957f94a
+Content-Type: application/json
+Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-<> 2023-06-07T154917.200.json
+<> 2023-06-08T171149.200.json
 
 ###
 
-GET http://127.0.0.1:9002/teacherCourseSchedule/liveCourseScheduleTime?courseScheduleId=2030
-Authorization: bearer 2cd308e9-0b8b-4b08-b3cd-f34dc50a8dfd
-Proxy-Connection: Keep-Alive
+GET http://127.0.0.1:8005/task/closeLiveCourseRoom
+Connection: Keep-Alive
 User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
 Accept-Encoding: br,deflate,gzip,x-gzip
 
-<> 2023-06-07T154631.200.json
+<> 2023-06-08T163756.200.json
 
 ###
 

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

@@ -16,6 +16,8 @@ public interface StudentOperatingVisitDao extends BaseDAO<Long, StudentOperating
     */
     void updateVisit(@Param("studentId") Integer studentId, @Param("month") String month);
 
+    void batchUpdateVisit(@Param("studentIds") List<Integer> studentIds, @Param("month") String month);
+
     void deleteByUserId(@Param("month") String month);
 
     void batchAdd(@Param("userIds") List<Integer> userIds, @Param("month") String month);

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

@@ -62,6 +62,15 @@ public interface StudentVisitDao extends BaseDAO<Integer, StudentVisit> {
     List<Integer> getMusicGroupVisitStudent(@Param("musicGroupId") String musicGroupId, @Param("studentIds") List<Integer> studentIds);
 
     /**
+     * 获取乐团回访的学生
+     *
+     * @param musicGroupId
+     * @param studentId
+     * @return
+     */
+    Integer getMusicVisitStudent(@Param("musicGroupId") String musicGroupId, @Param("studentId") Integer studentId);
+
+    /**
      * 获取老师时间段的回访次数
      *
      * @param teacherIds
@@ -92,4 +101,6 @@ public interface StudentVisitDao extends BaseDAO<Integer, StudentVisit> {
     int countWaitVisit(Map<String, Object> params);
 
     List<StudentPreVisitDto> queryWaitVisit(Map<String, Object> params);
+
+    void batchInsert(@Param("studentVisit") List<StudentVisit> studentVisit);
 }

+ 52 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseHomeworkWrapper.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.dto;
 
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.StudentCourseHomework;
 import com.ym.mec.biz.dal.enums.EHomeWorkStatus;
 import com.ym.mec.biz.dal.enums.ELessonTrainingType;
 import com.ym.mec.biz.dal.enums.ImSendTypeEnum;
@@ -146,6 +147,38 @@ public class CourseHomeworkWrapper {
 
         private String studentIdList;
 
+
+        @ApiModelProperty("练习内容")
+        private List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> trainingDetailList;
+
+        @ApiModelProperty("练习组内容")
+        private List<StudentLessonTrainingStat> trainingGroupList;
+    }
+
+
+    @Data
+    @ApiModel(value = "StudentLessonTrainingStat-练习组统计")
+    public static class StudentLessonTrainingStat {
+
+        @ApiModelProperty("练习组")
+        private Integer group;
+
+        @ApiModelProperty("声部名 逗号隔开")
+        private String subjectName;
+
+        @ApiModelProperty("练习组人数")
+        private Integer studentNum;
+
+        @ApiModelProperty("应提交人数")
+        private Integer shouldSubmitNum;
+
+        @ApiModelProperty("提交人数")
+        private Integer submitNum;
+
+        @ApiModelProperty("达标人数")
+        private Integer passNum;
+
+
         @ApiModelProperty("练习内容")
         private List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> trainingDetailList;
     }
@@ -335,4 +368,23 @@ public class CourseHomeworkWrapper {
     }
 
 
+
+
+    @Data
+    @ApiModel(value = "StudentHomeworkRecordStat-学生作业记录统计")
+    public static class StudentHomeworkRecordStat {
+
+        @ApiModelProperty(value = "全部")
+        private Integer allNum;
+
+        @ApiModelProperty(value = "已完成")
+        private Integer finishNum;
+
+        @ApiModelProperty(value = "未完成")
+        private Integer unFinishNum;
+
+        @ApiModelProperty(value = "列表")
+        private  List<StudentCourseHomework> studentCourseHomeworkList;
+
+    }
 }

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

@@ -116,6 +116,17 @@ public class CourseScheduleDto extends CourseSchedule {
     @ApiModelProperty("视频数量")
     private Integer videoNum;
 
+    @ApiModelProperty(value = "预热模版")
+    private String preTemplate;
+
+    public String getPreTemplate() {
+        return preTemplate;
+    }
+
+    public void setPreTemplate(String preTemplate) {
+        this.preTemplate = preTemplate;
+    }
+
     public Integer getVideoNum() {
         return videoNum;
     }

+ 4 - 175
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleEndDto.java

@@ -6,6 +6,7 @@ import com.ym.mec.biz.dal.enums.SignInStatusEnum;
 import com.ym.mec.biz.dal.enums.SignOutStatusEnum;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 import java.util.Date;
 
@@ -13,6 +14,7 @@ import java.util.Date;
  * @Author Joburgess
  * @Date 2019/12/27
  */
+@Data
 public class CourseScheduleEndDto extends CourseSchedule {
 
     private String groupName;
@@ -61,179 +63,6 @@ public class CourseScheduleEndDto extends CourseSchedule {
     @ApiModelProperty(value = "被合并的课程ids,多个,分割")
     private String mergedCourseIds;
 
-    public Date getGenerateTime() {
-        return generateTime;
-    }
-
-    public void setGenerateTime(Date generateTime) {
-        this.generateTime = generateTime;
-    }
-
-    public Date getDealTime() {
-        return dealTime;
-    }
-
-    public void setDealTime(Date dealTime) {
-        this.dealTime = dealTime;
-    }
-
-    public String getEducationTeacherName() {
-        return educationTeacherName;
-    }
-
-    public void setEducationTeacherName(String educationTeacherName) {
-        this.educationTeacherName = educationTeacherName;
-    }
-
-    public boolean getBeMerged() {
-        return beMerged;
-    }
-
-    public void setBeMerged(boolean beMerged) {
-        this.beMerged = beMerged;
-    }
-
-    public PracticeGroup getPracticeGroup() {
-        return practiceGroup;
-    }
-
-    public void setPracticeGroup(PracticeGroup practiceGroup) {
-        this.practiceGroup = practiceGroup;
-    }
-
-    public String getSettlementTime() {
-        return settlementTime;
-    }
-
-    public void setSettlementTime(String settlementTime) {
-        this.settlementTime = settlementTime;
-    }
-
-    public SignInStatusEnum getSignInStatusEnum() {
-        return signInStatusEnum;
-    }
-
-    public void setSignInStatusEnum(SignInStatusEnum signInStatusEnum) {
-        this.signInStatusEnum = signInStatusEnum;
-    }
-
-    public SignOutStatusEnum getSignOutStatusEnum() {
-        return signOutStatusEnum;
-    }
-
-    public void setSignOutStatusEnum(SignOutStatusEnum signOutStatusEnum) {
-        this.signOutStatusEnum = signOutStatusEnum;
-    }
-
-    public String getStudentId() {
-        return studentId;
-    }
-
-    public void setStudentId(String studentId) {
-        this.studentId = studentId;
-    }
-
-    public String getSubjectName() {
-        return subjectName;
-    }
-
-    public void setSubjectName(String subjectName) {
-        this.subjectName = subjectName;
-    }
-
-    public String getRemark() {
-        return remark;
-    }
-
-    public void setRemark(String remark) {
-        this.remark = remark;
-    }
-
-    public Date getSignInTime() {
-        return signInTime;
-    }
-
-    public void setSignInTime(Date signInTime) {
-        this.signInTime = signInTime;
-    }
-
-    public Date getSignOutTime() {
-        return signOutTime;
-    }
-
-    public void setSignOutTime(Date signOutTime) {
-        this.signOutTime = signOutTime;
-    }
-
-    public int getIsSignIn() {
-        return isSignIn;
-    }
-
-    public void setIsSignIn(int isSignIn) {
-        this.isSignIn = isSignIn;
-    }
-
-    public int getIsSignOut() {
-        return isSignOut;
-    }
-
-    public void setIsSignOut(int isSignOut) {
-        this.isSignOut = isSignOut;
-    }
-
-    public YesOrNoEnum getIsCallNames() {
-        return isCallNames;
-    }
-
-    public void setIsCallNames(YesOrNoEnum isCallNames) {
-        this.isCallNames = isCallNames;
-    }
-
-    public String getOrganName() {
-        return organName;
-    }
-
-    public void setOrganName(String organName) {
-        this.organName = organName;
-    }
-
-    public String getTeacherName() {
-        return teacherName;
-    }
-
-    public void setTeacherName(String teacherName) {
-        this.teacherName = teacherName;
-    }
-
-    public String getGroupName() {
-        return groupName;
-    }
-
-    public void setGroupName(String groupName) {
-        this.groupName = groupName;
-    }
-
-	public String getIsComplaints() {
-		return isComplaints;
-	}
-
-	public void setIsComplaints(String isComplaints) {
-		this.isComplaints = isComplaints;
-	}
-
-    public String getCooperationOrgan() {
-        return cooperationOrgan;
-    }
-
-    public void setCooperationOrgan(String cooperationOrgan) {
-        this.cooperationOrgan = cooperationOrgan;
-    }
-
-    public String getMergedCourseIds() {
-        return mergedCourseIds;
-    }
-
-    public void setMergedCourseIds(String mergedCourseIds) {
-        this.mergedCourseIds = mergedCourseIds;
-    }
+    @ApiModelProperty(value = "助教老师姓名")
+    private String teachingUserNames;
 }

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicScoreSubjectDto.java

@@ -12,6 +12,10 @@ public class MusicScoreSubjectDto {
     @ApiModelProperty(value = "学员编号",required = false)
     private List<Integer> userIdList;
 
+
+    @ApiModelProperty(value = "分组号")
+    private Integer group;
+
     @ApiModelProperty(value = "曲目编号(兼容旧数据)",required = false)
     private List<Integer> musicScoreIdList;
 
@@ -61,4 +65,12 @@ public class MusicScoreSubjectDto {
     public void setMusicScoreIdList(List<Integer> musicScoreIdList) {
         this.musicScoreIdList = musicScoreIdList;
     }
+
+    public Integer getGroup() {
+        return group;
+    }
+
+    public void setGroup(Integer group) {
+        this.group = group;
+    }
 }

+ 5 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonExaminationSaveDto.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.dto;
 
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -20,6 +21,10 @@ public class StudentLessonExaminationSaveDto {
     @ApiModelProperty(value = "声部")
     private Integer subjectId;
 
+
+    @ApiModelProperty("作业分组")
+    private Integer group;
+
     @ApiModelProperty(value = "作业内容")
     private List<LessonExaminationDetailDto> examinationDetailDtos;
 }

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

@@ -82,6 +82,10 @@ public class StudentLessonTrainingDetailWrapper {
 
         @ApiModelProperty("声部名称")
         private String subjectName;
+
+
+        @ApiModelProperty("作业分组")
+        private Integer group;
         
         public String jsonString() {
             return JSON.toJSONString(this);
@@ -115,6 +119,25 @@ public class StudentLessonTrainingDetailWrapper {
 	}
 
 
+    @Data
+    @ApiModel(" HomeworkGroupInfoQuery-作业内容查询")
+    public static class HomeworkGroupInfoQuery {
+
+
+        @ApiModelProperty(value = "课程编号",required = true)
+        @NotNull(message = "课程编号不能为空")
+        private Integer courseScheduleId;
+
+        @ApiModelProperty(value = "作业类型 来源(HOMEWORK,EXTRACURRICULAR,EXTRA)",required = true)
+        @NotNull(message = "作业类型不能为空")
+        private ELessonTrainingType type;
+
+        @ApiModelProperty(value = "组号",required = true)
+        @NotNull(message = "组号不能为空")
+        private Integer group;
+
+    }
+
 
     @Data
     @ApiModel(" StudentLessonTraining-学生练习内容查询对象")

+ 2 - 176
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseScheduleStudentPayment.java

@@ -4,6 +4,7 @@ import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.JoinCourseType;
 import com.ym.mec.common.entity.BaseEntity;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import java.math.BigDecimal;
@@ -11,6 +12,7 @@ import java.math.BigDecimal;
 /**
  * 对应数据库表(course_schedule_student_payment):
  */
+@Data
 public class CourseScheduleStudentPayment extends BaseEntity implements Comparable<CourseScheduleStudentPayment> {
 
 	/**  */
@@ -72,46 +74,6 @@ public class CourseScheduleStudentPayment extends BaseEntity implements Comparab
 	@ApiModelProperty(value = "加入课程类型 PURCHASE:购买 SHARE:分享")
 	private JoinCourseType joinCourseType;
 
-	public BigDecimal getExpectPriceBak() {
-		return expectPriceBak;
-	}
-
-	public void setExpectPriceBak(BigDecimal expectPriceBak) {
-		this.expectPriceBak = expectPriceBak;
-	}
-
-	public BigDecimal getActualPriceBak() {
-		return actualPriceBak;
-	}
-
-	public void setActualPriceBak(BigDecimal actualPriceBak) {
-		this.actualPriceBak = actualPriceBak;
-	}
-
-	public Long getCalenderId() {
-		return calenderId;
-	}
-
-	public void setCalenderId(Long calenderId) {
-		this.calenderId = calenderId;
-	}
-
-	public Integer getActivityUserMapperId() {
-		return activityUserMapperId;
-	}
-
-	public void setActivityUserMapperId(Integer activityUserMapperId) {
-		this.activityUserMapperId = activityUserMapperId;
-	}
-
-	public Boolean getBeMerged() {
-		return beMerged;
-	}
-
-	public void setBeMerged(Boolean beMerged) {
-		this.beMerged = beMerged;
-	}
-
 	public CourseScheduleStudentPayment() {
 	}
 
@@ -127,142 +89,6 @@ public class CourseScheduleStudentPayment extends BaseEntity implements Comparab
 		this.courseScheduleId = courseScheduleId;
 	}
 
-	public String getExamSongDownloadJson() {
-		return examSongDownloadJson;
-	}
-
-	public void setExamSongDownloadJson(String examSongDownloadJson) {
-		this.examSongDownloadJson = examSongDownloadJson;
-	}
-
-	public String getOpenPlayMidi() {
-		return openPlayMidi;
-	}
-
-	public void setOpenPlayMidi(String openPlayMidi) {
-		this.openPlayMidi = openPlayMidi;
-	}
-
-	public void setId(Long id){
-		this.id = id;
-	}
-	
-	public Long getId(){
-		return this.id;
-	}
-			
-	public GroupType getGroupType() {
-		return groupType;
-	}
-
-	public void setGroupType(GroupType groupType) {
-		this.groupType = groupType;
-	}
-
-	public String getMusicGroupId() {
-		return musicGroupId;
-	}
-
-	public void setMusicGroupId(String musicGroupId) {
-		this.musicGroupId = musicGroupId;
-	}
-
-	public void setCourseScheduleId(Long courseScheduleId){
-		this.courseScheduleId = courseScheduleId;
-	}
-	
-	public Long getCourseScheduleId(){
-		return this.courseScheduleId;
-	}
-			
-	public void setUserId(Integer userId){
-		this.userId = userId;
-	}
-	
-	public Integer getUserId(){
-		return this.userId;
-	}
-
-	public BigDecimal getOriginalPrice() {
-		return originalPrice;
-	}
-
-	public void setOriginalPrice(BigDecimal originalPrice) {
-		this.originalPrice = originalPrice;
-	}
-
-	public void setExpectPrice(java.math.BigDecimal expectPrice){
-		this.expectPrice = expectPrice;
-	}
-	
-	public java.math.BigDecimal getExpectPrice(){
-		return this.expectPrice;
-	}
-			
-	public void setActualPrice(java.math.BigDecimal actualPrice){
-		this.actualPrice = actualPrice;
-	}
-	
-	public java.math.BigDecimal getActualPrice(){
-		return this.actualPrice;
-	}
-			
-	public void setCreateTime(java.util.Date createTime){
-		this.createTime = createTime;
-	}
-	
-	public java.util.Date getCreateTime(){
-		return this.createTime;
-	}
-			
-	public void setUpdateTime(java.util.Date updateTime){
-		this.updateTime = updateTime;
-	}
-	
-	public java.util.Date getUpdateTime(){
-		return this.updateTime;
-	}
-			
-	public void setSettlementTime(java.util.Date settlementTime){
-		this.settlementTime = settlementTime;
-	}
-	
-	public java.util.Date getSettlementTime(){
-		return this.settlementTime;
-	}
-			
-	public Integer getClassGroupId() {
-		return classGroupId;
-	}
-
-	public void setClassGroupId(Integer classGroupId) {
-		this.classGroupId = classGroupId;
-	}
-
-	public String getBatchNo() {
-		return batchNo;
-	}
-
-	public void setBatchNo(String batchNo) {
-		this.batchNo = batchNo;
-	}
-
-	public CourseSchedule getCourseSchedule() {
-		return courseSchedule;
-	}
-
-	public void setCourseSchedule(CourseSchedule courseSchedule) {
-		this.courseSchedule = courseSchedule;
-	}
-
-	public JoinCourseType getJoinCourseType() {
-		return joinCourseType;
-	}
-
-	public void setJoinCourseType(JoinCourseType joinCourseType) {
-		this.joinCourseType = joinCourseType;
-	}
-
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentLessonExaminationDetail.java

@@ -38,6 +38,10 @@ public class StudentLessonExaminationDetail implements Serializable {
     @ApiModelProperty(value = "曲目id")
     private Long musicScoreId;
 
+    @ApiModelProperty("作业分组")
+    @TableField(value = "group_")
+    private Integer group;
+
     @TableField("heard_level_")
     @ApiModelProperty(value = "评测难度")
     private HardLevelEnum heardLevel;

+ 6 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentLessonTrainingDetail.java

@@ -36,6 +36,12 @@ public class StudentLessonTrainingDetail implements Serializable {
     @TableField(value = "type_")
     private ELessonTrainingType type;
 
+
+    @ApiModelProperty("作业分组")
+    @TableField(value = "group_")
+    private Integer group;
+
+
     @ApiModelProperty("练习编号") 
 	@TableField(value = "course_homework_id_")
     private Long courseHomeworkId;

+ 13 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentPaymentOrderDetail.java

@@ -1,12 +1,14 @@
 package com.ym.mec.biz.dal.entity;
 
 import com.ym.mec.biz.dal.dto.CloudTeacherOrderDto;
+import com.ym.mec.biz.dal.enums.CouponDetailTypeEnum;
 import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
 import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
 import com.ym.mec.common.entity.BaseEntity;
 
 import io.swagger.annotations.ApiModelProperty;
 
+import lombok.Data;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import java.math.BigDecimal;
@@ -15,6 +17,7 @@ import java.util.List;
 /**
  * 对应数据库表(student_payment_order_detail):
  */
+@Data
 public class StudentPaymentOrderDetail extends BaseEntity {
 
 	/**  */
@@ -78,6 +81,16 @@ public class StudentPaymentOrderDetail extends BaseEntity {
 	
 	private String deliveryBatchNo;//发货批次
 
+	private CouponDetailTypeEnum couponDetailTypeEnum;
+
+	public CouponDetailTypeEnum getCouponDetailTypeEnum() {
+		return couponDetailTypeEnum;
+	}
+
+	public void setCouponDetailTypeEnum(CouponDetailTypeEnum couponDetailTypeEnum) {
+		this.couponDetailTypeEnum = couponDetailTypeEnum;
+	}
+
 	public Integer getUserId() {
 		return userId;
 	}

+ 4 - 144
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentVisit.java

@@ -4,12 +4,14 @@ import com.ym.mec.biz.dal.enums.TeachModeEnum;
 import com.ym.mec.common.entity.BaseEntity;
 import com.ym.mec.common.enums.BaseEnum;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.PastOrPresent;
 import javax.validation.constraints.Positive;
 import java.util.Date;
 
+@Data
 public class StudentVisit extends BaseEntity {
 
     public enum VisiterTypeEnum implements BaseEnum<String, TeachModeEnum> {
@@ -130,6 +132,8 @@ public class StudentVisit extends BaseEntity {
     @Positive(message = "学生id必须大于0")
     private Integer studentId;
 
+    private String phone;
+
     /**
      * 老师id
      */
@@ -201,148 +205,4 @@ public class StudentVisit extends BaseEntity {
 
     @ApiModelProperty(value = "回访图片", required = true)
     private String attachments;
-
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    public String getMusicGroupId() {
-        return musicGroupId;
-    }
-
-    public void setMusicGroupId(String musicGroupId) {
-        this.musicGroupId = musicGroupId;
-    }
-
-    public Integer getOrganId() {
-        return organId;
-    }
-
-    public void setOrganId(Integer organId) {
-        this.organId = organId;
-    }
-
-    public Integer getStudentId() {
-        return studentId;
-    }
-
-    public void setStudentId(Integer studentId) {
-        this.studentId = studentId;
-    }
-
-    public Integer getTeacherId() {
-        return teacherId;
-    }
-
-    public void setTeacherId(Integer teacherId) {
-        this.teacherId = teacherId;
-    }
-
-    public VisiterTypeEnum getVisiterType() {
-        return visiterType;
-    }
-
-    public void setVisiterType(VisiterTypeEnum visiterType) {
-        this.visiterType = visiterType;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public String getPurpose() {
-        return purpose;
-    }
-
-    public void setPurpose(String purpose) {
-        this.purpose = purpose;
-    }
-
-    public String getOverview() {
-        return overview;
-    }
-
-    public void setOverview(String overview) {
-        this.overview = overview;
-    }
-
-    public FeedbackTypeEnum getFeedbackType() {
-        return feedbackType;
-    }
-
-    public void setFeedbackType(FeedbackTypeEnum feedbackType) {
-        this.feedbackType = feedbackType;
-    }
-
-    public FeedbackTypeDescEnum getFeedbackTypeDesc() {
-        return feedbackTypeDesc;
-    }
-
-    public void setFeedbackTypeDesc(FeedbackTypeDescEnum feedbackTypeDesc) {
-        this.feedbackTypeDesc = feedbackTypeDesc;
-    }
-
-    public String getFeedback() {
-        return feedback;
-    }
-
-    public void setFeedback(String feedback) {
-        this.feedback = feedback;
-    }
-
-    public Date getVisitTime() {
-        return visitTime;
-    }
-
-    public void setVisitTime(Date visitTime) {
-        this.visitTime = visitTime;
-    }
-
-    public Date getCreateTime() {
-        return createTime;
-    }
-
-    public void setCreateTime(Date createTime) {
-        this.createTime = createTime;
-    }
-
-    public Long getObjectId() {
-        return objectId;
-    }
-
-    public void setObjectId(Long objectId) {
-        this.objectId = objectId;
-    }
-
-    public Integer getProbStatus() {
-        return probStatus;
-    }
-
-    public void setProbStatus(Integer probStatus) {
-        this.probStatus = probStatus;
-    }
-
-    public String getVisitCyCle() {
-        return visitCyCle;
-    }
-
-    public void setVisitCyCle(String visitCyCle) {
-        this.visitCyCle = visitCyCle;
-    }
-
-    public String getAttachments() {
-        return attachments;
-    }
-
-    public void setAttachments(String attachments) {
-        this.attachments = attachments;
-    }
 }

+ 12 - 7
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/CouponDetailTypeEnum.java

@@ -30,9 +30,7 @@ public enum CouponDetailTypeEnum implements BaseEnum<String, CouponDetailTypeEnu
     //网管课
     PRACTICE("PRACTICE", "网管课"),
     //声部课 = 单技课 SINGLE、集训单技课 TRAINING_SINGLE
-    SINGLE("SINGLE", "声部课"),
-    //合奏课 = 合奏课 MIX、集训合奏课 TRAINING_MIX ,
-    MIX("MIX", "合奏课"),
+    MUSIC("MUSIC", "乐团课"),
     //VIP = vip课 VIP +乐理课 THEORY_COURSE
     VIP("VIP", "VIP"),
     //会员开通,团练宝   CLOUD_TEACHER  CLOUD_TEACHER_PLUS
@@ -92,15 +90,22 @@ public enum CouponDetailTypeEnum implements BaseEnum<String, CouponDetailTypeEnu
         switch (code) {
             case "INSTRUMENT":
                 return MUSICAL.getCode();
-            case "TRAINING_SINGLE":
-                return SINGLE.getCode();
             case "THEORY_COURSE":
                 return VIP.getCode();
-            case "TRAINING_MIX":
-                return MIX.getCode();
             case "CLOUD_TEACHER":
             case "CLOUD_TEACHER_PLUS":
                 return MEMBER.getCode();
+            case "MIX":
+            case "SINGLE":
+            case "TRAINING_MIX":
+            case "TRAINING_SINGLE":
+            case "HIGH":
+            case "COMPREHENSIVE":
+            case "ENLIGHTENMENT":
+            case "CLASSROOM":
+            case "HIGH_ONLINE":
+            case "MUSIC_NETWORK":
+                return MUSIC.getCode();
             default:
                 return null;
         }

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/TemplateTypeEnum.java

@@ -14,6 +14,7 @@ public enum TemplateTypeEnum implements BaseEnum<String, TemplateTypeEnum> {
     LIVE_ROOM_PURVIEW_USER("LIVE_ROOM_PURVIEW_USER", "直播间用户观看权限表"),
     ADDITIONAL_IMPORT("ADDITIONAL_IMPORT", "经营报表额外的收支导入"),
     MUSIC_GROUP_PAYMENT_IMPORT("MUSIC_GROUP_PAYMENT_IMPORT", "缴费项目外部订单导入"),
+    PAYMENT_MUSIC_VISIT_IMPORT("PAYMENT_MUSIC_VISIT_IMPORT", "缴费中乐团批量回访"),
     ;
 
     private String code;

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/mapper/LiveGroupPlusMapper.java

@@ -21,4 +21,12 @@ public interface LiveGroupPlusMapper extends BaseMapper<Object> {
      * 直播课课表
      */
     List<CourseScheduleDto> liveCoursePage(@Param("page") IPage<CourseScheduleDto> page, @Param("param") LiveGroupWrapper.LiveCoursePageQuery queryInfo);
+
+    /**
+     * 直播课详情
+     *
+     * @param courseScheduleId 课表id
+     * @return
+     */
+    CourseScheduleDto detailLiveCourse(@Param("courseScheduleId") Long courseScheduleId);
 }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/CourseDetailQueryInfo.java

@@ -22,6 +22,16 @@ public class CourseDetailQueryInfo{
     @ApiModelProperty(value = "课程组编号")
     private String groupId;
 
+    public Integer notStartCourseTime;
+
+    public Integer getNotStartCourseTime() {
+        return notStartCourseTime;
+    }
+
+    public void setNotStartCourseTime(Integer notStartCourseTime) {
+        this.notStartCourseTime = notStartCourseTime;
+    }
+
     public String getGroupType() {
         return groupType;
     }

+ 4 - 263
mec-biz/src/main/java/com/ym/mec/biz/dal/page/EndCourseScheduleQueryInfo.java

@@ -5,6 +5,7 @@ import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.common.page.QueryInfo;
 
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 import java.util.Date;
 
@@ -12,6 +13,7 @@ import java.util.Date;
  * @Author Joburgess
  * @Date 2019/12/27
  */
+@Data
 public class EndCourseScheduleQueryInfo extends QueryInfo {
 
     @ApiModelProperty(value = "部门编号列表")
@@ -106,267 +108,6 @@ public class EndCourseScheduleQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "是否云教练课程")
     private Integer memberFlag;
 
-    public Integer getStudentId() {
-        return studentId;
-    }
-
-    public void setStudentId(Integer studentId) {
-        this.studentId = studentId;
-    }
-
-    public Integer getMemberFlag() {
-        return memberFlag;
-    }
-
-    public void setMemberFlag(Integer memberFlag) {
-        this.memberFlag = memberFlag;
-    }
-
-    public Integer getEducationUserId() {
-        return educationUserId;
-    }
-
-    public void setEducationUserId(Integer educationUserId) {
-        this.educationUserId = educationUserId;
-    }
-
-    public Boolean getHasDealTime() {
-        return hasDealTime;
-    }
-
-    public void setHasDealTime(Boolean hasDealTime) {
-        this.hasDealTime = hasDealTime;
-    }
-
-    public Long getCourseIdSearch() {
-        return courseIdSearch;
-    }
-
-    public void setCourseIdSearch(Long courseIdSearch) {
-        this.courseIdSearch = courseIdSearch;
-    }
-
-    public String getSearchType() {
-        return searchType;
-    }
-
-    public void setSearchType(String searchType) {
-        this.searchType = searchType;
-    }
-
-    public String getMergeCourseType() {
-        return mergeCourseType;
-    }
-
-    public void setMergeCourseType(String mergeCourseType) {
-        this.mergeCourseType = mergeCourseType;
-    }
-
-    public TeachModeEnum getTeachMode() {
-        return teachMode;
-    }
-
-    public void setTeachMode(TeachModeEnum teachMode) {
-        this.teachMode = teachMode;
-    }
-
-    public Integer getIsCallNames() {
-        return isCallNames;
-    }
-
-    public void setIsCallNames(Integer isCallNames) {
-        this.isCallNames = isCallNames;
-    }
-
-    public boolean getIsExport() {
-        return isExport;
-    }
-
-    public void setIsExport(boolean export) {
-        isExport = export;
-    }
-
-    public Integer getSchoolId() {
-        return schoolId;
-    }
-
-    public void setSchoolId(Integer schoolId) {
-        this.schoolId = schoolId;
-    }
-
-    public String getStudentName() {
-        return studentName;
-    }
-
-    public void setStudentName(String studentName) {
-        this.studentName = studentName;
-    }
-
-    public String getTeacherName() {
-        return teacherName;
-    }
-
-    public void setTeacherName(String teacherName) {
-        this.teacherName = teacherName;
-    }
-
-    public ClassGroupTypeEnum getClassGroupType() {
-        return classGroupType;
-    }
-
-    public void setClassGroupType(ClassGroupTypeEnum classGroupType) {
-        this.classGroupType = classGroupType;
-    }
-
-    public CourseStatusEnum getCourseStatus() {
-        return courseStatus;
-    }
-
-    public void setCourseStatus(CourseStatusEnum courseStatus) {
-        this.courseStatus = courseStatus;
-    }
-
-    public CourseSchedule.CourseScheduleType getCourseType() {
-        return courseType;
-    }
-
-    public void setCourseType(CourseSchedule.CourseScheduleType courseType) {
-        this.courseType = courseType;
-    }
-
-    public Date getStartTime() {
-        return startTime;
-    }
-
-    public void setStartTime(Date startTime) {
-        this.startTime = startTime;
-    }
-
-    public Date getEndTime() {
-        return endTime;
-    }
-
-    public void setEndTime(Date endTime) {
-        this.endTime = endTime;
-    }
-
-    public String getOrganIdList() {
-        return organIdList;
-    }
-
-    public void setOrganIdList(String organIdList) {
-        this.organIdList = organIdList;
-    }
-
-    public String getStudentIdList() {
-        return studentIdList;
-    }
-
-    public void setStudentIdList(String studentIdList) {
-        this.studentIdList = studentIdList;
-    }
-
-    public String getTeacherIdList() {
-        return teacherIdList;
-    }
-
-    public void setTeacherIdList(String teacherIdList) {
-        this.teacherIdList = teacherIdList;
-    }
-
-    public GroupType getGroupType() {
-        return groupType;
-    }
-
-    public void setGroupType(GroupType groupType) {
-        this.groupType = groupType;
-    }
-
-    public String getGroupId() {
-        return groupId;
-    }
-
-    public void setGroupId(String groupId) {
-        this.groupId = groupId;
-    }
-
-    public Integer getClassGroupId() {
-        return classGroupId;
-    }
-
-    public void setClassGroupId(Integer classGroupId) {
-        this.classGroupId = classGroupId;
-    }
-
-	public Date getCreateStartDate() {
-		return createStartDate;
-	}
-
-	public void setCreateStartDate(Date createStartDate) {
-		this.createStartDate = createStartDate;
-	}
-
-	public Date getCreateEndDate() {
-		return createEndDate;
-	}
-
-	public void setCreateEndDate(Date createEndDate) {
-		this.createEndDate = createEndDate;
-	}
-
-    public TeachTypeEnum getTeachType() {
-        return teachType;
-    }
-
-    public void setTeachType(TeachTypeEnum teachType) {
-        this.teachType = teachType;
-    }
-
-    public String getGenerateStartTime() {
-        return generateStartTime;
-    }
-
-    public void setGenerateStartTime(String generateStartTime) {
-        this.generateStartTime = generateStartTime;
-    }
-
-    public String getGenerateEndTime() {
-        return generateEndTime;
-    }
-
-    public void setGenerateEndTime(String generateEndTime) {
-        this.generateEndTime = generateEndTime;
-    }
-
-    public String getDealStartTime() {
-        return dealStartTime;
-    }
-
-    public void setDealStartTime(String dealStartTime) {
-        this.dealStartTime = dealStartTime;
-    }
-
-    public String getDealEndTime() {
-        return dealEndTime;
-    }
-
-    public void setDealEndTime(String dealEndTime) {
-        this.dealEndTime = dealEndTime;
-    }
-
-	public String getStartClassTimeStr() {
-		return startClassTimeStr;
-	}
-
-	public void setStartClassTimeStr(String startClassTimeStr) {
-		this.startClassTimeStr = startClassTimeStr;
-	}
-
-	public String getEndClassTimeStr() {
-		return endClassTimeStr;
-	}
-
-	public void setEndClassTimeStr(String endClassTimeStr) {
-		this.endClassTimeStr = endClassTimeStr;
-	}
+    @ApiModelProperty(value = "是否有助教")
+    private Boolean hasTeaching;
 }

+ 7 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/LiveGroupWrapper.java

@@ -38,6 +38,9 @@ public class LiveGroupWrapper {
 
         @ApiModelProperty("共享方式,NO_SHARE:未共享,OPEN:公开,PRIVATE:私密")
         private ShareModeEnum shareMode;
+
+        @ApiModelProperty("模糊查询")
+        private String search;
     }
 
 
@@ -106,12 +109,15 @@ public class LiveGroupWrapper {
         private String search;
 
         @ApiModelProperty("课程状态")
-        private CourseStatusEnum status;
+        private String status;
 
         private Integer teacherId;
 
         private Integer tenantId;
 
+        //未开始直播课,提前开始时间
+        private Integer notStartCourseTime;
+
     }
 
 

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

@@ -801,4 +801,12 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
     IPage<CourseScheduleDto> liveCoursePage(LiveGroupWrapper.LiveCoursePageQuery queryInfo);
 
 	void updateCourseScheduleShareMode(UpdateCourseShareModeDto updateCourseShareModeDto);
+
+
+    /**
+     * 查询课程信息
+     * @param courseScheduleId
+     * @return
+     */
+    CourseScheduleDto detailLiveCourse(Long courseScheduleId);
 }

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

@@ -133,6 +133,8 @@ public interface ImLiveBroadcastRoomService extends IService<ImLiveBroadcastRoom
 
     void createLiveRoom(ImLiveBroadcastRoom room);
 
+    void createLiveRoomNoTransactional(ImLiveBroadcastRoom room);
+
     Map<String, Object> test(String roomUid, String userFlag);
 
     /**

+ 21 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/StudentLessonTrainingDetailService.java

@@ -1,12 +1,15 @@
 package com.ym.mec.biz.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.dto.CourseHomeworkWrapper;
 import com.ym.mec.biz.dal.dto.StudentLessonTrainingDetailWrapper;
+import com.ym.mec.biz.dal.dto.StudentSubjectDto;
 import com.ym.mec.biz.dal.entity.StudentLessonTrainingDetail;
 import com.ym.mec.biz.dal.enums.ELessonTrainingType;
+import org.jetbrains.annotations.NotNull;
 
-import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 练习内容
@@ -39,9 +42,10 @@ public interface StudentLessonTrainingDetailService extends IService<StudentLess
      * 将作业标准 转换为 需要的作业详情
      *
      * @param studentLessonTrainingDetails 作业标准
-     * @param userIdList 学生ID
+     * @param userIdList                   学生ID
+     * @param group
      */
-    List<StudentLessonTrainingDetail> homeWorkDetail(List<StudentLessonTrainingDetailWrapper.AddStudentLessonTrainingDetail> studentLessonTrainingDetails, List<Integer> userIdList,Long homeworkId,ELessonTrainingType type);
+    List<StudentLessonTrainingDetail> homeWorkDetail(List<StudentLessonTrainingDetailWrapper.AddStudentLessonTrainingDetail> studentLessonTrainingDetails, List<Integer> userIdList, Long homeworkId, ELessonTrainingType type, Integer group);
 
     /**
      * 查询布置的作业详情
@@ -59,4 +63,18 @@ public interface StudentLessonTrainingDetailService extends IService<StudentLess
      * @param userId 学生ID
      */
     List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> getBaseLessonTrainingDetail(Long courseHomeworkId, ELessonTrainingType type, Long userId);
+
+    /**
+     * 查询作业详情练习组
+     *
+     * @param courseHomeworkId 作业ID
+     * @param trainingType 作业类型
+     */
+    List<CourseHomeworkWrapper.StudentLessonTrainingStat> getLessonTrainingStat(Long courseHomeworkId, ELessonTrainingType trainingType);
+
+    @NotNull
+    Map<Integer, StudentSubjectDto> getStudentMusicGroupSubject(List<Integer> userIdList, String musicGroupId);
+
+    @NotNull
+    Map<Integer, List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail>> getGroupMap(Long courseHomeworkId, ELessonTrainingType trainingType);
 }

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

@@ -10,6 +10,8 @@ import com.ym.mec.biz.dal.page.StudentPreVisitQueryInfo;
 import com.ym.mec.biz.dal.page.StudentVisitQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
+import org.springframework.web.multipart.MultipartFile;
+
 import java.util.List;
 
 public interface StudentVisitService extends BaseService<Integer, StudentVisit> {
@@ -21,6 +23,13 @@ public interface StudentVisitService extends BaseService<Integer, StudentVisit>
      * @return
      */
     StudentVisit addVisit(StudentVisit studentVisit);
+
+    /**
+     * 添加访问记录
+     * @param studentVisit
+     * @return
+     */
+    void batchAddVisit(List<StudentVisit> studentVisit);
     /**
      * 获取访问详情
      *
@@ -68,4 +77,13 @@ public interface StudentVisitService extends BaseService<Integer, StudentVisit>
     PageInfo<BasicUserDto> getStudents(StudentVisitQueryInfo queryInfo);
 
     PageInfo<StudentPreVisitDto> queryWaitVisit(StudentPreVisitQueryInfo queryInfo);
+
+    /**
+    * @description: 缴费中乐团批量导入学员回访
+     * @param file
+    * @return java.util.List<java.lang.String>
+    * @author zx
+    * @date 2023/6/13 14:34
+    */
+    List<String> importMusicVisit(MultipartFile file) throws Exception;
 }

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

@@ -269,6 +269,14 @@ public class CourseHomeworkServiceImpl extends BaseServiceImpl<Long, CourseHomew
         List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> baseLessonTrainingDetail = studentLessonTrainingDetailService.getBaseLessonTrainingDetail(
             courseHomeworkList.getCourseHomeworkId(), ELessonTrainingType.HOMEWORK);
 
+
+        // 练习组
+        List<CourseHomeworkWrapper.StudentLessonTrainingStat> trainingStatList =  studentLessonTrainingDetailService
+                .getLessonTrainingStat(courseHomeworkList.getCourseHomeworkId(), ELessonTrainingType.HOMEWORK);
+
+
+
+        courseHomeworkList.setTrainingGroupList(trainingStatList);
         courseHomeworkList.setTrainingDetailList(baseLessonTrainingDetail);
         courseHomeworkList.setType(ELessonTrainingType.HOMEWORK);
         return courseHomeworkList;
@@ -300,9 +308,15 @@ public class CourseHomeworkServiceImpl extends BaseServiceImpl<Long, CourseHomew
             return courseHomeworkList;
         }
 
-        List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> baseLessonTrainingDetail = studentLessonTrainingDetailService.getBaseLessonTrainingDetail(
-            courseHomeworkList.getCourseHomeworkId(),courseHomeworkList.getType());
+        List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> baseLessonTrainingDetail = studentLessonTrainingDetailService
+                .getBaseLessonTrainingDetail(courseHomeworkList.getCourseHomeworkId(),courseHomeworkList.getType());
+
+        // 练习组信息
+        List<CourseHomeworkWrapper.StudentLessonTrainingStat> practiceGroupList = studentLessonTrainingDetailService
+                .getLessonTrainingStat(courseHomeworkList.getCourseHomeworkId(),courseHomeworkList.getType());
+
 
+        courseHomeworkList.setTrainingGroupList(practiceGroupList);
         courseHomeworkList.setTrainingDetailList(baseLessonTrainingDetail);
         return courseHomeworkList;
     }

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

@@ -5,6 +5,9 @@ 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.microsvc.toolkit.middleware.live.LivePluginContext;
+import com.microsvc.toolkit.middleware.live.LivePluginService;
+import com.microsvc.toolkit.middleware.live.message.LiveRoomMessage;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
@@ -195,7 +198,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
     private LessonExaminationService lessonExaminationService;
 	@Autowired
 	private ImLiveBroadcastRoomService imLiveBroadcastRoomService;
-
+	@Autowired
+	private LivePluginContext livePluginContext;
     @Autowired
     private ImLiveRoomVideoService imLiveRoomVideoService;
 
@@ -1172,6 +1176,18 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				courseScheduleDto.setOs(courseScheduleDto.getLiveBroadcastRoom().getOs());
 			}
         }
+
+        // 直播课判断时间,提前30分钟将课程改为进行中
+
+        Integer studentRemindTime = Integer.parseInt(sysConfigService.findByParamName(SysConfigService.LIVE_CLASS_START_REMIND_TIME).getParanValue());
+        for (CourseScheduleDto record : studentCourseSchedulesWithDate) {
+            if (CourseScheduleType.LIVE.equals(record.getType()) && CourseStatusEnum.NOT_START.equals(record.getStatus())) {
+                Date date = DateUtil.addMinutes(new Date(), studentRemindTime);
+                if (date.after(record.getStartClassTime())) {
+                    record.setStatus(CourseStatusEnum.UNDERWAY);
+                }
+            }
+        }
     }
 
     private Map<String, List<ImLiveRoomVideoVo>> getLiveRecord(List<String> roomIds) {
@@ -1858,6 +1874,10 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		if (CollectionUtils.isEmpty(courseSchedules)) {
 			return false;
 		}
+		//直播课不校验冲突
+		if(courseSchedules.get(0).getGroupType() == LIVE){
+			return true;
+		}
 		List<String> classDates = courseSchedules.stream().map(courseSchedule -> DateUtil.dateToString(courseSchedule.getClassDate(), "yyyy-MM-dd"))
 				.collect(Collectors.toList());
 
@@ -2478,6 +2498,17 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
 //			courseScheduleTeacherSalaryDao.batchUpdateCourseSalarys(courseScheduleIds, teacherSalary);
 
+			// 直播课数据清除
+			for (CourseSchedule item : courseSchedules) {
+				if (LIVE == item.getGroupType()) {
+					// 消息提醒
+					item.setLiveRemind(0);
+					// 直播间关联
+					item.setLiveRoomId("");
+					// 连堂课标识
+					item.setContinuousCourse(false);
+				}
+			}
 		}
 
         courseScheduleDao.batchUpdate(courseSchedules);
@@ -3020,6 +3051,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
 		Map<Long, CourseSchedule> oldCourseScheduleMap = oldCourseScheduleList.stream().collect(Collectors.toMap(CourseSchedule::getId, c -> c));
 
+		List<CourseSchedule> liveCourseSchedules = Lists.newArrayList();
         for(CourseSchedule newCourseSchedule : newCourseSchedules){
 
         	//获取数据库中的记录
@@ -3075,6 +3107,17 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				}
 			}
 
+			// 直播课发送推送消息
+			if (LIVE.equals(oldCourseSchedule.getGroupType())) {
+				// 日期,时间,时长,主教老师不一致时,发送消息
+				if (newCourseSchedule.getClassDate() != oldCourseSchedule.getClassDate()
+						|| newCourseSchedule.getStartClassTime() != oldCourseSchedule.getStartClassTime()
+						|| newCourseSchedule.getEndClassTime() != oldCourseSchedule.getEndClassTime()
+						|| newCourseSchedule.getActualTeacherId() != oldCourseSchedule.getActualTeacherId().intValue()) {
+					liveCourseSchedules.add(oldCourseSchedule);
+				}
+			}
+
             if(!CollectionUtils.isEmpty(newCourseSchedule.getTeachingTeacherIdList())){
                 if (newCourseSchedule.getTeachingTeacherIdList().contains(newCourseSchedule.getActualTeacherId())){
                     throw new BizException("主教和助教不可重复");
@@ -3136,7 +3179,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
             //课程结束时间必须在21:00之前
             if(DateUtil.getHour(newCourseSchedule.getEndClassTime()) > 20 && DateUtil.getMinute(newCourseSchedule.getEndClassTime()) > 0){
-            	throw new BizException("课程结束时间不能超过21:00,请重新调整上课时间");
+				throw new BizException("课程结束时间不能超过21:00,请重新调整上课时间");
             }
 
             //判断上课时间是否跨天
@@ -3478,7 +3521,10 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		}
 
 		if(newCourseSchedules.size() > 0){
-			courseScheduleDao.batchUpdate(newCourseSchedules);
+            for (CourseSchedule course : newCourseSchedules) {
+                course.setLiveRemind(0);
+            }
+            courseScheduleDao.batchUpdate(newCourseSchedules);
             List<Integer> classGroupIds = newCourseSchedules.stream().filter(courseSchedule -> Objects.nonNull(courseSchedule.getClassGroupId())).map(CourseSchedule::getClassGroupId).collect(Collectors.toList());
             if(!CollectionUtils.isEmpty(classGroupIds)){
                 classGroupService.updateClassGroupsCourseInfo(classGroupIds);
@@ -3517,9 +3563,75 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
+
+		// 直播课消息推送
+		if (CollectionUtils.isNotEmpty(liveCourseSchedules)) {
+
+			liveCourseSchedules.parallelStream().forEach(item -> {
+
+				// 是否是连堂课
+				String continueCourseTime = sysTenantConfigService.getTenantConfigValue(SysConfigService.ONLINE_CONTINUE_COURSE_TIME, item.getTenantId());
+				if (StringUtils.isEmpty(continueCourseTime)) {
+					continueCourseTime = "5";
+				}
+
+				// 查询最新课程信息
+				CourseSchedule newCourseSchedule = courseScheduleDao.get(item.getId());
+				// 连堂课更新标识
+				boolean updateFlag = true;
+				// 新课时间
+				Date newCourseScheduleDate = getDateTime(newCourseSchedule.getClassDate(), newCourseSchedule.getStartClassTime()).toDate();
+				Date oldCourseScheduleDate = getDateTime(item.getClassDate(), item.getStartClassTime()).toDate();
+				if (newCourseScheduleDate.getTime() > oldCourseScheduleDate.getTime()) {
+					newCourseSchedule = item;
+					// 更新标识
+					updateFlag = false;
+				}
+
+				// 直播课关联直播间编号
+				String liveRoomId = getCourseScheduleLiveRoomId(newCourseSchedule, continueCourseTime, Lists.newArrayList(), Lists.newArrayList(), updateFlag);
+
+				if (StringUtils.isBlank(liveRoomId)) {
+					liveRoomId = item.getLiveRoomId();
+				}
+
+				ImLiveBroadcastRoom liveRoom = imLiveBroadcastRoomService.getByRoomUid(liveRoomId);
+				if (Objects.isNull(liveRoom)) {
+					log.warn("liveRoom sendChatRoomMessage is null, liveRoomId:{}", liveRoomId);
+					return;
+				}
+
+				try {
+					LivePluginService pluginService = livePluginContext.getPluginService(liveRoom.getServiceProvider());
+
+					LiveRoomMessage message = new LiveRoomMessage();
+					message.setIsIncludeSender(1);
+					message.setFromUserId(newCourseSchedule.getActualTeacherId().toString());
+					message.setToChatRoomId(liveRoom.getRoomUid());
+					message.setObjectName(LiveRoomMessage.LIVE_STATUS_CHANGE);
+
+					// 发送用户信息
+					LiveRoomMessage.MessageUser messageUser = LiveRoomMessage.MessageUser.builder()
+							.sendUserId("")
+							.sendUserName("")
+							.avatarUrl("")
+							.build();
+
+					message.setContent(LiveRoomMessage.MessageContent.builder()
+							.sendUserInfo(messageUser).build());
+
+					pluginService.sendChatRoomMessage(message);
+					log.info("liveRoom sendChatRoomMessage success, liveRoomId:{}", liveRoomId);
+				} catch (Exception e) {
+					log.error("liveRoom sendChatRoomMessage error", e);
+				}
+			});
+
+		}
 		return BaseController.succeed();
     }
 
+
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void courseSwap(Long courseScheduleId1, Long courseScheduleId2) {
@@ -3872,8 +3984,16 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			queryInfo.setDate(new Date());
 		}
 
+        // 直播课判断时间,提前30分钟将课程改为进行中
+        Integer studentRemindTime = Integer.parseInt(sysConfigService.findByParamName(SysConfigService.LIVE_CLASS_START_REMIND_TIME).getParanValue());
+
 		Map<String, Object> params = new HashMap<>();
 		MapUtil.populateMap(params, queryInfo);
+        params.put("notStartCourseTime", studentRemindTime);
+        if (queryInfo.getClassGroupId() != null) {
+            ClassGroup classGroup = classGroupDao.get(queryInfo.getClassGroupId().intValue());
+            params.put("groupType", classGroup.getGroupType().name());
+        }
 
 		List<TeacherClassCourseSchudeleDto> dataList = null;
 		int count = 0;
@@ -3952,6 +4072,15 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             }
         });
 
+        for (TeacherClassCourseSchudeleDto record : dataList) {
+            if (CourseScheduleType.LIVE.equals(record.getType()) && CourseStatusEnum.NOT_START.equals(record.getStatus())) {
+                Date date = DateUtil.addMinutes(new Date(), studentRemindTime);
+                if (date.after(record.getStartClassTime())) {
+                    record.setStatus(CourseStatusEnum.UNDERWAY);
+                }
+            }
+        }
+
         pageInfo.setRows(dataList);
 		return pageInfo;
 	}
@@ -3992,6 +4121,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         }
         CourseAttendanceDetailHeadInfoDto courseAttendanceDetailHeadInfoDto = courseScheduleDao.findByCourse(courseScheduleId);
         courseAttendanceDetailHeadInfoDto.setLatestAttendanceTime(studentAttendanceDao.findLatestAttendanceDate(courseScheduleId));
+        courseAttendanceDetailHeadInfoDto.setStudentNum(studentAttendanceDao.getStudentNumByStatus(courseScheduleId, StudentAttendanceStatusEnum.NORMAL));
         courseAttendanceDetailHeadInfoDto.setLeaveStudentNum(studentAttendanceDao.getStudentNumByStatus(courseScheduleId, StudentAttendanceStatusEnum.LEAVE));
         courseAttendanceDetailHeadInfoDto.setTruantStudentNum(studentAttendanceDao.getStudentNumByStatus(courseScheduleId, StudentAttendanceStatusEnum.TRUANT));
         courseAttendanceDetailHeadInfoDto.setLateStudentNum(studentAttendanceDao.getStudentNumByStatus(courseScheduleId, StudentAttendanceStatusEnum.LATE));
@@ -4237,7 +4367,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		}
 
         int count = courseScheduleDao.endCountCourseSchedules(params);
-        if(queryInfo.getIsExport() && count > 50000){
+        if(queryInfo.isExport() && count > 50000){
             throw new BizException("数据集太大,不能导出.最大数据集不能超过50000");
         }
 		pageInfo.setTotal(count);
@@ -4245,9 +4375,18 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		List<CourseScheduleEndDto> results = courseScheduleDao.endFindCourseSchedules(params);
         if (!CollectionUtils.isEmpty(results)) {
             List<Long> courseScheduleIds = results.stream().map(CourseScheduleEndDto::getId).collect(Collectors.toList());
-            List<Integer> teacherIds=results.stream().filter(t->Objects.nonNull(t.getActualTeacherId())).map(CourseSchedule::getActualTeacherId).collect(Collectors.toList());
-
-            List<Map<Integer, String>> nameIdMaps = teacherDao.queryNameByIdList(teacherIds);
+            List<Integer> teacherIds = results.stream().filter(t->Objects.nonNull(t.getActualTeacherId())).map(CourseSchedule::getActualTeacherId).collect(Collectors.toList());
+			List<Integer> teachingUserIdsList = results.stream()
+					.filter(u -> StringUtils.isNotEmpty(u.getTeachingTeacherIds()))
+					.flatMap(u -> Arrays.stream(u.getTeachingTeacherIds().split(",")))
+					.filter(StringUtils::isNotEmpty)
+					.map(Integer::parseInt)
+					.distinct()
+					.collect(Collectors.toList());
+			if(CollectionUtils.isNotEmpty(teachingUserIdsList)){
+				teacherIds.addAll(teachingUserIdsList);
+			}
+			List<Map<Integer, String>> nameIdMaps = teacherDao.queryNameByIdList(teacherIds);
             Map<Integer, String> nameIdMap = MapUtil.convertIntegerMap(nameIdMaps);
 
 			List<Map<Long, Long>> courseMergeCourseNum = courseScheduleDao.countCourseMergeCourseNum(courseScheduleIds);
@@ -4263,7 +4402,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             Map<Integer, String> classGroupSubjectNameMap = MapUtil.convertIntegerMap(classGroupSubjectNameMaps);
             Map<Long, String> eduName = null;
             Map<String, MusicGroupBasicDto> cooperationMap = new HashMap<>();
-            if (queryInfo.getIsExport()) {
+            if (queryInfo.isExport()) {
                 List<Long> musicCourseIds = results.stream().filter(e -> e.getGroupType() == MUSIC).map(CourseScheduleEndDto::getId).collect(Collectors.toList());
                 eduName = new HashMap<>(courseScheduleIds.size());
                 if (musicCourseIds != null && musicCourseIds.size() > 0) {
@@ -4285,6 +4424,20 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             }
 
             for (CourseScheduleEndDto result : results) {
+				if(StringUtils.isNotEmpty(result.getTeachingTeacherIds())){
+					List<String> ids = Arrays.stream(result.getTeachingTeacherIds().split(",")).collect(Collectors.toList());
+					StringBuffer sb = new StringBuffer();
+					for (String teachingId : ids) {
+						String teachingName = nameIdMap.get(Integer.parseInt(teachingId));
+						if(StringUtils.isNotEmpty(teachingName)){
+							if(sb.length() > 0){
+								sb.append(",");
+							}
+							sb.append(teachingName);
+						}
+					}
+					result.setTeachingUserNames(sb.toString());
+				}
                 if (eduName != null) {
                     result.setEducationTeacherName(eduName.get(result.getId()));
                 }
@@ -5946,7 +6099,54 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 	}
 
     @Override
+    public CourseScheduleDto detailLiveCourse(Long courseScheduleId) {
+        CourseScheduleDto courseSchedule = liveGroupPlusMapper.detailLiveCourse(courseScheduleId);
+
+
+
+        Integer studentRemindTime = Integer.parseInt(sysConfigService.findByParamName(SysConfigService.LIVE_CLASS_START_REMIND_TIME).getParanValue());
+
+        Date startDate = DateUtil.startDateAndEndTime(courseSchedule.getClassDate(), courseSchedule.getStartClassTime());
+        courseSchedule.setStartClassTime(startDate);
+        Date endDate = DateUtil.startDateAndEndTime(courseSchedule.getClassDate(), courseSchedule.getEndClassTime());
+        courseSchedule.setEndClassTime(endDate);
+        startDate = DateUtil.addMinutes(startDate, -studentRemindTime);
+        // 课程是否开始
+        if(CourseStatusEnum.NOT_START.equals(courseSchedule.getStatus()) && startDate.before(new Date())) {
+            courseSchedule.setStatus(CourseStatusEnum.UNDERWAY);
+        }
+        // 设置老师信息
+        Teacher teacher = teacherService.get(courseSchedule.getActualTeacherId());
+        if (teacher != null) {
+            courseSchedule.setTeacherId(teacher.getId());
+            courseSchedule.setTeacherName(teacher.getRealName());
+            courseSchedule.setHeadUrl(teacher.getAvatar());
+        }
+
+        // 查询直播课程组
+        VipGroup vipGroup = vipGroupDao.findByCourseSchedule(courseScheduleId);
+        if (vipGroup != null) {
+            ImLiveBroadcastRoomDto imLiveBroadcastRoomDto = JSON.parseObject(vipGroup.getLiveConfigJson(), ImLiveBroadcastRoomDto.class);
+            if (imLiveBroadcastRoomDto != null) {
+                courseSchedule.setPreTemplate(imLiveBroadcastRoomDto.getPreTemplate());
+            }
+        }
+
+        return courseSchedule;
+
+    }
+
+    @Override
     public List<CourseScheduleStudentDto> queryDetailList(CourseDetailQueryInfo courseDetailQueryInfo) {
+
+
+        // 直播课判断时间,提前30分钟将课程改为进行中
+        Integer studentRemindTime = Integer.parseInt(sysConfigService.findByParamName(SysConfigService.LIVE_CLASS_START_REMIND_TIME).getParanValue());
+
+        if (StringUtils.isNotBlank(courseDetailQueryInfo.getGroupType())) {
+            courseDetailQueryInfo.setGroupType(courseDetailQueryInfo.getGroupType().toUpperCase());
+        }
+        courseDetailQueryInfo.setNotStartCourseTime(studentRemindTime);
         List<CourseScheduleStudentDto> courseScheduleStudentDtos = courseScheduleDao.queryDetailList(courseDetailQueryInfo);
 
 
@@ -5962,12 +6162,29 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             }
         });
 
+
+        // 直播课判断时间,提前30分钟将课程改为进行中
+        for (CourseScheduleStudentDto record : courseScheduleStudentDtos) {
+            if (CourseStatusEnum.NOT_START.equals(record.getCourseStatus())
+                    && courseDetailQueryInfo.getGroupType().toUpperCase(Locale.ROOT).equals(GroupType.LIVE.getCode())) {
+                Date date = DateUtil.addMinutes(new Date(), studentRemindTime);
+                if (date.after(DateUtil.toDateTime(record.getStartClassTime()))) {
+                    record.setCourseStatus(CourseStatusEnum.UNDERWAY);
+                }
+            }
+        }
+
         return courseScheduleStudentDtos;
     }
 
     @Override
     public IPage<CourseScheduleDto> liveCoursePage(LiveGroupWrapper.LiveCoursePageQuery queryInfo) {
         IPage<CourseScheduleDto> page = com.microsvc.toolkit.common.response.paging.QueryInfo.getPage(queryInfo);
+
+        // 直播课判断时间,提前30分钟将课程改为进行中
+        Integer studentRemindTime = Integer.parseInt(sysConfigService.findByParamName(SysConfigService.LIVE_CLASS_START_REMIND_TIME).getParanValue());
+
+        queryInfo.setNotStartCourseTime(studentRemindTime);
         List<CourseScheduleDto> courseScheduleDtos = liveGroupPlusMapper.liveCoursePage(page, queryInfo);
         if (CollectionUtils.isEmpty(courseScheduleDtos)) {
             return page;
@@ -5977,6 +6194,15 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         List<CourseScheduleDto> teacherCourseFormat = getTeacherCourseFormat(queryInfo.getTeacherId(), new Date(),
                 queryInfo.getTenantId(), courseScheduleDtos, courseIds, courseIds);
 
+
+        for (CourseScheduleDto record : teacherCourseFormat) {
+            if (CourseScheduleType.LIVE.equals(record.getType()) && CourseStatusEnum.NOT_START.equals(record.getStatus())) {
+                Date date = DateUtil.addMinutes(new Date(), studentRemindTime);
+                if (date.after(record.getStartClassTime())) {
+                    record.setStatus(CourseStatusEnum.UNDERWAY);
+                }
+            }
+        }
         return page.setRecords(teacherCourseFormat);
     }
 
@@ -6075,16 +6301,83 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		if (courseSchedule.getTeachMode() == TeachModeEnum.OFFLINE) {
 			throw new BizException("请前往线下教室");
 		}
+
+		// 是否是连堂课
+		String continueCourseTime = sysTenantConfigService.getTenantConfigValue(SysConfigService.ONLINE_CONTINUE_COURSE_TIME, courseSchedule.getTenantId());
+		if (StringUtils.isEmpty(continueCourseTime)) {
+			continueCourseTime = "5";
+		}
+
+		// 直播课关联直播间
+		List<CourseSchedule> newCourseSchedules = Lists.newArrayList();
+		// 课程时间长计算
+		List<CourseScheduleWrapper.CourseScheduleTime> courseScheduleTimes = Lists.newArrayList();
+		// 直播课关联直播间编号
+		String liveRoomId = getCourseScheduleLiveRoomId(courseSchedule, continueCourseTime, newCourseSchedules, courseScheduleTimes, true);
+
+		// 定时任务更新课程状态为进行中,判断当前课程状态是否匹配
+		/*int studentRemindTime = Integer.parseInt(sysConfigService.findByParamName(SysConfigService.LIVE_CLASS_START_REMIND_TIME).getParanValue());
+
+		Date date = DateUtil.startDateAndEndTime(courseSchedule.getClassDate(), courseSchedule.getStartClassTime());
+		date = DateUtil.addMinutes(date, -studentRemindTime);
+		// 课程是否开始
+		if(CourseStatusEnum.NOT_START.equals(courseSchedule.getStatus()) && date.after(new Date())) {
+			throw new BizException("直播课暂未开启,请稍后重试");
+		}
+		if (CourseStatusEnum.OVER == courseSchedule.getStatus()) {
+			throw new BizException("直播课已结束");
+		}*/
+
+		// 直播间配置
+		ImLiveBroadcastRoom liveBroadcastRoom = imLiveBroadcastRoomService.lambdaQuery()
+				.eq(ImLiveBroadcastRoom::getRoomUid, liveRoomId)
+				.last("LIMIT 1")
+				.one();
+		if (Objects.isNull(liveBroadcastRoom)) {
+			throw new BizException("请先进入直播课教室");
+		}
+
+		String autoCloseNetworkRoomTime = sysTenantConfigService.getTenantConfigValue(SysConfigService.COURSE_AFTER_BUFFER_TIME, courseSchedule.getTenantId());
+		if (StringUtils.isEmpty(autoCloseNetworkRoomTime)) {
+			autoCloseNetworkRoomTime = "15";
+		}
+
+		return CourseScheduleWrapper.LiveCourseSchedule.builder()
+				.liveRoomId(liveRoomId)
+				.subjectId(liveBroadcastRoom.getSubjectId())
+				.autoCloseFlag(true)
+				//.autoCloseNetworkRoomTime(getCloseNetworkRoomTime(courseSchedule, continueCourseTime))
+				.autoCloseNetworkRoomTime(autoCloseNetworkRoomTime)
+				.surplusTime(DateUtil.secondsBetween(new Date(), courseSchedule.getEndClassTime()))
+				.timestamp(DateTime.now().getMillis())
+				.courseScheduleTimes(courseScheduleTimes)
+				.build();
+	}
+
+	/**
+	 * 同步连堂课状态,获取直播间编号
+	 * @param courseSchedule CourseSchedule
+	 * @param continueCourseTime 连堂课时长
+	 * @param newCourseSchedules List<CourseSchedule>
+	 * @param courseScheduleTimes List<CourseScheduleWrapper.CourseScheduleTime>
+	 * @return String
+	 */
+	private String getCourseScheduleLiveRoomId(CourseSchedule courseSchedule,
+											   String continueCourseTime,
+											   List<CourseSchedule> newCourseSchedules,
+											   List<CourseScheduleWrapper.CourseScheduleTime> courseScheduleTimes,
+											   Boolean updateFlag) {
+		String liveRoomId;
 		// 课程开始时间
 		courseSchedule.setStartClassTime(getDateTime(courseSchedule.getClassDate(), courseSchedule.getStartClassTime()).toDate());
 		// 课程结束时间
 		courseSchedule.setEndClassTime(getDateTime(courseSchedule.getClassDate(), courseSchedule.getEndClassTime()).toDate());
 
 		// 是否是连堂课
-		String continueCourseTime = sysTenantConfigService.getTenantConfigValue(SysConfigService.ONLINE_CONTINUE_COURSE_TIME, courseSchedule.getTenantId());
+		/*String continueCourseTime = sysTenantConfigService.getTenantConfigValue(SysConfigService.ONLINE_CONTINUE_COURSE_TIME, courseSchedule.getTenantId());
 		if (StringUtils.isEmpty(continueCourseTime)) {
 			continueCourseTime = "5";
-		}
+		}*/
 
 		// 连堂课标准:同一个老师,同一天,同一课程组,连续上课
 		List<CourseSchedule> continuousCourse = courseScheduleDao.getTeacherContinuousCourse(courseSchedule.getClassGroupId(),
@@ -6110,6 +6403,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			if (item.getId().longValue() == courseSchedule.getId()) {
 				continue;
 			}
+			// 重置连堂状态
+			item.setContinuousCourse(false);
 
 			schedule = JSON.parseObject(JSON.toJSONString(item), CourseSchedule.class);
 			if (item.getEndClassTime().getTime() <= courseSchedule.getStartClassTime().getTime()) {
@@ -6121,6 +6416,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			}
 		}
 
+		courseSchedule.setContinuousCourse(false);
 		// 当前课程之前连堂课
 		beforeCourse.add(JSON.parseObject(JSON.toJSONString(courseSchedule), CourseSchedule.class));
 		// 当前课程之后连堂课
@@ -6129,20 +6425,75 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		// 课程前连堂状态
 		updateContinuousCourseStatus(continueCourseTime, beforeCourse);
 
-		List<CourseSchedule> newCourseSchedules = Lists.newArrayList();
 		// 课程连堂状态
 		if (beforeCourse.get(beforeCourse.size() - 1).getContinuousCourse()) {
-			List<CourseSchedule> collect = beforeCourse.stream()
+
+			// 倒序排序
+			beforeCourse = beforeCourse.stream()
+					.sorted(Comparator.comparing(CourseSchedule::getStartClassTime).reversed())
+					.collect(Collectors.toList());
+
+			for (int i = 0; i < beforeCourse.size(); i++) {
+				CourseSchedule current = beforeCourse.get(i);
+				if (current.getContinuousCourse()) {
+					newCourseSchedules.add(current);
+				}
+
+				if (i + 1 < beforeCourse.size()) {
+					CourseSchedule next = beforeCourse.get(i + 1);
+
+					if (!next.getContinuousCourse()) {
+						//newCourseSchedules.add(next);
+						break;
+					}
+				}
+			}
+
+			// 正序排序
+			beforeCourse = beforeCourse.stream()
+					.sorted(Comparator.comparing(CourseSchedule::getStartClassTime))
+					.collect(Collectors.toList());
+
+			/*for (int i = beforeCourse.size() - 1; i >= 0 ; i--) {
+				CourseSchedule current = beforeCourse.get(i);
+				CourseSchedule next = null;
+				if ((i - 1) >= 0) {
+					next = beforeCourse.get(i - 1);
+				}
+				if (next != null && current.getContinuousCourse() && next.getContinuousCourse()) {
+					newCourseSchedules.addAll(Lists.newArrayList(current, next));
+				}
+			}*/
+
+			/*List<CourseSchedule> collect = beforeCourse.stream()
 					.filter(CourseSchedule::getContinuousCourse)
 					.collect(Collectors.toList());
 			if (CollectionUtils.isNotEmpty(collect)) {
 				newCourseSchedules.addAll(collect);
-			}
+			}*/
 		}
 
 		// 课程后连堂状态
 		updateContinuousCourseStatus(continueCourseTime, afterCourse);
 		if (afterCourse.get(0).getContinuousCourse()) {
+
+			for (int i = 0; i < afterCourse.size(); i++) {
+				CourseSchedule current = afterCourse.get(i);
+				if (current.getContinuousCourse()) {
+					newCourseSchedules.add(current);
+				}
+
+				if (i + 1 < afterCourse.size()) {
+					CourseSchedule next = afterCourse.get(i + 1);
+
+					if (!next.getContinuousCourse()) {
+						newCourseSchedules.add(next);
+						break;
+					}
+				}
+			}
+
+			/*
 			List<CourseSchedule> collect = afterCourse.stream()
 					.filter(CourseSchedule::getContinuousCourse)
 					.collect(Collectors.toList());
@@ -6153,15 +6504,20 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				} else {
 					newCourseSchedules.addAll(collect.subList(1, collect.size()));
 				}
-			}
+			}*/
 		}
 
-		// 直播课关联直播间编号
-		String liveRoomId = courseSchedule.getLiveRoomId();
-
-		List<CourseScheduleWrapper.CourseScheduleTime> courseScheduleTimes = Lists.newArrayList();
 		if (CollectionUtils.isNotEmpty(newCourseSchedules)) {
 
+            // newCourseSchedules集合去重
+            newCourseSchedules = newCourseSchedules.stream()
+                    .collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(CourseSchedule::getId))), ArrayList::new));
+
+			// 课程按开始时间排序
+			newCourseSchedules = newCourseSchedules.stream()
+					.sorted(Comparator.comparing(CourseSchedule::getStartClassTime))
+					.collect(Collectors.toList());
+
 			// 连党课程信息
 			for (CourseSchedule item : newCourseSchedules) {
 				courseScheduleTimes.add(CourseScheduleWrapper.CourseScheduleTime.builder()
@@ -6172,27 +6528,67 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
 			// 获取连堂课第一节信息
 			CourseSchedule finalCourseSchedule = newCourseSchedules.get(0);
-			CompletableFuture.runAsync(() -> {
 
-				List<Long> collect = newCourseSchedules.stream()
-						.map(CourseSchedule::getId)
-						.distinct().collect(Collectors.toList());
-				try {
+			List<Long> collect = newCourseSchedules.stream()
+					.map(CourseSchedule::getId)
+					.distinct().collect(Collectors.toList());
+			try {
 
+				if (Optional.ofNullable(updateFlag).orElse(true)) {
 					// 关联直播间编号
 					courseScheduleDao.batchUpdateLiveRoomId(collect, finalCourseSchedule.getLiveRoomId());
+				}
 
+				if (CollectionUtils.size(collect) > 1) {
 					collect = newCourseSchedules.subList(0, newCourseSchedules.size() - 1).stream()
 							.map(CourseSchedule::getId)
 							.distinct().collect(Collectors.toList());
+
 					// 更新连堂课状态
 					courseScheduleDao.batchUpdateContinuousCourse(collect, true);
+				}
 
-				} catch (Exception e) {
-				    log.error("getLiveCourseScheduleTime courseScheduleIds={}", collect, e);
+				if (!Optional.ofNullable(updateFlag).orElse(true)) {
+
+					// 课程连堂状态
+					if (beforeCourse.get(beforeCourse.size() - 1).getContinuousCourse()) {
+
+						int size = beforeCourse.size();
+						collect = beforeCourse.subList(size - 2, size).stream()
+                                .filter(o -> CourseStatusEnum.NOT_START.equals(o.getStatus()))
+								.map(CourseSchedule::getId)
+								.distinct().collect(Collectors.toList());
+						if (CollectionUtils.isNotEmpty(collect)) {
+							// 更新连堂课状态
+							courseScheduleDao.batchUpdateContinuousCourse(collect, false);
+						}
+					}
+
+					// 课程后连堂状态
+					if (afterCourse.get(0).getContinuousCourse()) {
+						collect = afterCourse.stream()
+                                .filter(o -> CourseStatusEnum.NOT_START.equals(o.getStatus()))
+                                .map(CourseSchedule::getId).distinct().collect(Collectors.toList());
+
+						if (CollectionUtils.isNotEmpty(collect)) {
+							// 关联直播间编号
+							courseScheduleDao.batchUpdateLiveRoomId(collect, "");
+							// 更新连堂课状态
+							courseScheduleDao.batchUpdateContinuousCourse(collect, false);
+						}
+					}
 				}
 
-			});
+				// 更新连堂课状态,最后一节课重置
+				CourseSchedule lastCourseSchedule = newCourseSchedules.get(newCourseSchedules.size() - 1);
+				if (Objects.nonNull(lastCourseSchedule)) {
+					courseScheduleDao.batchUpdateContinuousCourse(Lists.newArrayList(lastCourseSchedule.getId()), false);
+				}
+
+			} catch (Exception e) {
+				log.error("getLiveCourseScheduleTime courseScheduleIds={}", collect, e);
+			}
+
 			// 连堂课直播间编号
 			liveRoomId = finalCourseSchedule.getLiveRoomId();
 		} else {
@@ -6202,34 +6598,13 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 					.startTime(courseSchedule.getStartClassTime().getTime())
 					.endTime(courseSchedule.getEndClassTime().getTime())
 					.build());
-		}
 
-		// 定时任务更新课程状态为进行中,判断当前课程状态是否匹配
-		if (CourseStatusEnum.NOT_START == courseSchedule.getStatus()) {
-			throw new BizException("直播课暂未开启,请稍后重试");
-		}
-		if (CourseStatusEnum.OVER == courseSchedule.getStatus()) {
-			throw new BizException("直播课已结束");
-		}
+			// 更新连堂课状态
+			courseScheduleDao.batchUpdateContinuousCourse(Lists.newArrayList(courseSchedule.getId()), false);
 
-		// 直播间配置
-		ImLiveBroadcastRoom liveBroadcastRoom = imLiveBroadcastRoomService.lambdaQuery()
-				.eq(ImLiveBroadcastRoom::getRoomUid, liveRoomId)
-				.last("LIMIT 1")
-				.one();
-		if (Objects.isNull(liveBroadcastRoom)) {
-			throw new BizException("请先进入直播课教室");
+			liveRoomId = courseSchedule.getLiveRoomId();
 		}
-
-		return CourseScheduleWrapper.LiveCourseSchedule.builder()
-				.liveRoomId(liveRoomId)
-				.subjectId(liveBroadcastRoom.getSubjectId())
-				.autoCloseFlag(true)
-				.autoCloseNetworkRoomTime(getCloseNetworkRoomTime(courseSchedule, continueCourseTime))
-				.surplusTime(DateUtil.secondsBetween(new Date(), courseSchedule.getEndClassTime()))
-				.timestamp(DateTime.now().getMillis())
-				.courseScheduleTimes(courseScheduleTimes)
-				.build();
+		return liveRoomId;
 	}
 
 	/**
@@ -6252,13 +6627,15 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
 				startTime = getDateTime(current.getClassDate(), current.getEndClassTime());
 				endTime = getDateTime(next.getClassDate(), next.getStartClassTime());
-				// 如果当前课程结束时间和下一节课开始时间间隔小于5分钟,那么合并时间
-				if (startTime.isBefore(endTime)
-						&& startTime.plusMinutes(Integer.parseInt(continueCourseTime) + 1).isAfter(endTime)) {
+				// 如果当前课程结束时间和下一节课开始时间间隔小于5分钟,那么合并时间(修复代码合并)
+				if ((startTime.isBefore(endTime) || startTime.isEqual(endTime))
+						&& startTime.plusSeconds(Integer.parseInt(continueCourseTime) * 60 + 10).isAfter(endTime)) {
 					// 上节连堂状态
 					current.setContinuousCourse(true);
 					// 下节连堂状态
 					next.setContinuousCourse(true);
+				} else {
+					current.setContinuousCourse(false);
 				}
 			}
 		}

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

@@ -157,6 +157,7 @@ public class CourseShareServiceImpl extends BaseServiceImpl<Integer, CourseShare
             CourseSchedule schedule = schedules.get(0);
             CourseScheduleStudentPayment payment = new CourseScheduleStudentPayment();
             payment.setGroupType(schedule.getGroupType());
+            payment.setCourseScheduleId(courseId);
             payment.setMusicGroupId(schedule.getMusicGroupId());
             payment.setUserId(userId);
             // 分享方式下,价格为0

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

@@ -2824,9 +2824,9 @@ public class ExportServiceImpl implements ExportService {
                 row.setIsComplaints(StringUtils.equals(row.getIsComplaints(), "1") ? "有" : "无");
             }
             HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部名称", "乐团主管", "课程编号", "课程组编号", "开始时间", "结束时间","班级声部", "课程名称", "课程类型", "教学模式",
-                    "教学点", "课程状态", "指导老师", "是否点名", "是否有考勤申诉", "预计上课人数", "合作单位"}, new String[]{
+                    "教学点", "课程状态", "指导老师",  "助教", "是否点名", "是否有考勤申诉", "预计上课人数", "合作单位"}, new String[]{
                     "organName", "educationTeacherName", "id", "musicGroupId", "startClassTime", "endClassTime", "subjectName", "name",
-                    "groupType.desc", "teachMode.msg", "schoolName", "status.msg", "teacherName", "isCallNames.msg", "isComplaints", "studentNum", "cooperationOrgan"}, rows);
+                    "groupType.desc", "teachMode.msg", "schoolName", "status.msg", "teacherName",  "teachingUserNames", "isCallNames.msg", "isComplaints", "studentNum", "cooperationOrgan"}, rows);
             exportManagerDownload(workbook, managerDownload);
         } catch (Exception e) {
             e.printStackTrace();

+ 30 - 14
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesReplyServiceImpl.java

@@ -3,24 +3,13 @@ package com.ym.mec.biz.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.dto.CourseHomeworkStudentDetailDto;
-import com.ym.mec.biz.dal.dto.CourseHomeworkWrapper;
-import com.ym.mec.biz.dal.dto.EduHomeworkCardDto;
-import com.ym.mec.biz.dal.dto.ExtraExerciseStudentsDto;
-import com.ym.mec.biz.dal.dto.SimpleUserDto;
-import com.ym.mec.biz.dal.dto.StudentHomeworkRecordDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.ExtraExercilseQueryInfo;
 import com.ym.mec.biz.dal.page.ExtraExercilseReplyQueryInfo;
 import com.ym.mec.biz.dal.page.StudentCourseHomeWorkQueryInfo;
-import com.ym.mec.biz.service.CourseHomeworkService;
-import com.ym.mec.biz.service.ExtracurricularExercisesReplyService;
-import com.ym.mec.biz.service.ExtracurricularExercisesService;
-import com.ym.mec.biz.service.MusicGroupService;
-import com.ym.mec.biz.service.StudentServeService;
-import com.ym.mec.biz.service.SysConfigService;
-import com.ym.mec.biz.service.SysMessageService;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
@@ -73,6 +62,9 @@ public class ExtracurricularExercisesReplyServiceImpl extends BaseServiceImpl<Lo
     @Autowired
     private CourseHomeworkService courseHomeworkService;
 
+    @Autowired
+    private StudentLessonTrainingDetailService studentLessonTrainingDetailService;
+
 	@Override
 	public BaseDAO<Long, ExtracurricularExercisesReply> getDAO() {
 		return extracurricularExercisesReplyDao;
@@ -90,6 +82,21 @@ public class ExtracurricularExercisesReplyServiceImpl extends BaseServiceImpl<Lo
             throw new BizException("课外训练不存在");
         }
 
+
+        // 设置乐团声部
+        Map<Integer, StudentSubjectDto> subjectDtoMap= new HashMap<>();
+        if (StringUtils.isNotBlank(extracurricularExercises.getMusicGroupId())) {
+
+            // 学生ID集合
+            Set<Integer> userIdList = extraExerciseStudents.stream()
+                    .map(ExtracurricularExercisesReply::getUserId)
+                    .filter(Objects::nonNull)
+                    .collect(Collectors.toSet());
+            // 设置声部
+            subjectDtoMap = studentLessonTrainingDetailService
+                    .getStudentMusicGroupSubject(new ArrayList<>(userIdList), extracurricularExercises.getMusicGroupId());
+        }
+
         List<StudentCourseHomework> studentCourseHomeworks=new ArrayList<>();
         for (ExtraExerciseStudentsDto extraExerciseStudent : extraExerciseStudents) {
             StudentCourseHomework studentCourseHomework= JSON.parseObject(JSON.toJSONString(extraExerciseStudent),StudentCourseHomework.class);
@@ -103,8 +110,17 @@ public class ExtracurricularExercisesReplyServiceImpl extends BaseServiceImpl<Lo
 			studentCourseHomework.setIsView(extraExerciseStudent.getIsView()==0?YesOrNoEnum.NO:YesOrNoEnum.YES);
 			studentCourseHomework.setAvatar(extraExerciseStudent.getHeadUrl());
             studentCourseHomework.setType(ELessonTrainingType.valueOf(extracurricularExercises.getGroupType()));
-			studentCourseHomeworks.add(studentCourseHomework);
+
+            StudentSubjectDto studentSubjectDto = subjectDtoMap.get(extraExerciseStudent.getUserId());
+            if (studentSubjectDto != null) {
+                studentCourseHomework.setSubjectId(studentSubjectDto.getSubjectId());
+                studentCourseHomework.setSubjectName(studentSubjectDto.getSubjectName());
+            }
+
+            studentCourseHomeworks.add(studentCourseHomework);
 		}
+
+
 		return studentCourseHomeworks;
 	}
 

+ 239 - 220
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesServiceImpl.java

@@ -39,23 +39,23 @@ import java.util.stream.Collectors;
 
 @Service
 public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, ExtracurricularExercises> implements ExtracurricularExercisesService {
-	
-	@Autowired
-	private ExtracurricularExercisesDao extracurricularExercisesDao;
-	@Autowired
-	private ExtracurricularExercisesReplyDao extracurricularExercisesReplyDao;
-	@Autowired
-	private StudentExtracurricularExercisesSituationDao studentExtracurricularExercisesSituationDao;
-	@Autowired
-	private SysMessageService sysMessageService;
-	@Autowired
-	private TeacherDao teacherDao;
-	@Autowired
-	private CourseHomeworkDao courseHomeworkDao;
-	@Autowired
-	private StudentServeService studentServeService;
-	@Autowired
-	private StudentCourseHomeworkDao studentCourseHomeworkDao;
+
+    @Autowired
+    private ExtracurricularExercisesDao extracurricularExercisesDao;
+    @Autowired
+    private ExtracurricularExercisesReplyDao extracurricularExercisesReplyDao;
+    @Autowired
+    private StudentExtracurricularExercisesSituationDao studentExtracurricularExercisesSituationDao;
+    @Autowired
+    private SysMessageService sysMessageService;
+    @Autowired
+    private TeacherDao teacherDao;
+    @Autowired
+    private CourseHomeworkDao courseHomeworkDao;
+    @Autowired
+    private StudentServeService studentServeService;
+    @Autowired
+    private StudentCourseHomeworkDao studentCourseHomeworkDao;
 
     @Autowired
     private ClassGroupStudentMapperDao classGroupStudentMapperDao;
@@ -68,20 +68,20 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
     @Autowired
     private StudentLessonTrainingDetailService studentLessonTrainingDetailService;
 
-	@Override
-	public BaseDAO<Long, ExtracurricularExercises> getDAO() {
-		return extracurricularExercisesDao;
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
-	public void createExtraExercises(ExtracurricularExercises exercises) {
-		if(StringUtils.isBlank(exercises.getTitle())){
-			// throw new BizException("请填写标题");
-		}
-		if(StringUtils.isBlank(exercises.getContent())){
-			// throw new BizException("请填写内容");
-		}
+    @Override
+    public BaseDAO<Long, ExtracurricularExercises> getDAO() {
+        return extracurricularExercisesDao;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+    public void createExtraExercises(ExtracurricularExercises exercises) {
+        if(StringUtils.isBlank(exercises.getTitle())){
+            // throw new BizException("请填写标题");
+        }
+        if(StringUtils.isBlank(exercises.getContent())){
+            // throw new BizException("请填写内容");
+        }
         if (exercises.getMusicGroupId() != null) {
             exercises.setGroupType(ELessonTrainingType.EXTRACURRICULAR.getCode());
         } else {
@@ -99,25 +99,25 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
             exercises.setStudentIdList(StringUtils.join(studentIdList,","));
         }
 
-		teacherDao.getLocked(exercises.getTeacherId());
-		Teacher teacher = teacherDao.get(exercises.getTeacherId());
+        teacherDao.getLocked(exercises.getTeacherId());
+        Teacher teacher = teacherDao.get(exercises.getTeacherId());
 
-		ExtracurricularExercises repeatLastExercises = extracurricularExercisesDao.findRepeatLastExercises(exercises.getTeacherId(), exercises.getStudentIdList(), exercises.getContent());
-		if(Objects.nonNull(repeatLastExercises)&&DateUtil.secondsBetween(repeatLastExercises.getCreateTime(),new Date())<60){
-			return;
-		}
+        ExtracurricularExercises repeatLastExercises = extracurricularExercisesDao.findRepeatLastExercises(exercises.getTeacherId(), exercises.getStudentIdList(), exercises.getContent());
+        if(Objects.nonNull(repeatLastExercises)&&DateUtil.secondsBetween(repeatLastExercises.getCreateTime(),new Date())<60){
+            return;
+        }
 
-		if(Objects.isNull(exercises.getExpireDate())){
-			LocalDateTime localDateTime=LocalDateTime.now();
-			localDateTime=localDateTime.plusDays(Integer.parseInt(sysConfigService.findByParamName("homework_expire_time").getParanValue()))
+        if(Objects.isNull(exercises.getExpireDate())){
+            LocalDateTime localDateTime=LocalDateTime.now();
+            localDateTime=localDateTime.plusDays(Integer.parseInt(sysConfigService.findByParamName("homework_expire_time").getParanValue()))
                     .withHour(21).withMinute(0).withSecond(0).withNano(0);
-			exercises.setExpireDate(Date.from(localDateTime.atZone(DateUtil.zoneId).toInstant()));
-		}
-		List<Integer> studentIds = Arrays.asList(exercises.getStudentIdList().split(",")).stream().mapToInt(Integer::valueOf).boxed().collect(Collectors.toList());
-		exercises.setBatchNo(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
-		exercises.setExpectNum(studentIds.size());
-		extracurricularExercisesDao.insert(exercises);
-		String dateStr = DateUtil.dateToString(exercises.getExpireDate(), "MM月dd日HH点");
+            exercises.setExpireDate(Date.from(localDateTime.atZone(DateUtil.zoneId).toInstant()));
+        }
+        List<Integer> studentIds = Arrays.asList(exercises.getStudentIdList().split(",")).stream().mapToInt(Integer::valueOf).boxed().collect(Collectors.toList());
+        exercises.setBatchNo(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
+        exercises.setExpectNum(studentIds.size());
+        extracurricularExercisesDao.insert(exercises);
+        String dateStr = DateUtil.dateToString(exercises.getExpireDate(), "MM月dd日HH点");
 
         ExtracurricularExercisesReply studentExtraExercise=new ExtracurricularExercisesReply();
         studentExtraExercise.setExtracurricularExercisesId(exercises.getId());
@@ -148,7 +148,7 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
                 // 作业详情
                 studentLessonTrainingDetailList.addAll(studentLessonTrainingDetailService
                                    .homeWorkDetail(musicScoreSubjectDto.getStudentLessonTrainingDetails(), musicScoreSubjectDto.getUserIdList(), exercises.getId(),
-                                                   ELessonTrainingType.valueOf(exercises.getGroupType())));
+                                                   ELessonTrainingType.valueOf(exercises.getGroupType()),musicScoreSubjectDto.getGroup()));
 
             }
         } else {
@@ -160,12 +160,31 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
             // 作业详情
             studentLessonTrainingDetailList.addAll(studentLessonTrainingDetailService
                                                        .homeWorkDetail(exercises.getStudentLessonTrainingDetails(), studentIds,exercises.getId(),
-                                                       ELessonTrainingType.valueOf(exercises.getGroupType())));
+                                                       ELessonTrainingType.valueOf(exercises.getGroupType()), null));
         }
         for (ExtracurricularExercisesReply extracurricularExercisesReply : extracurricularExercisesReplies) {
             extracurricularExercisesReplyDao.insert(extracurricularExercisesReply);
         }
         if (!CollectionUtils.isEmpty(studentLessonTrainingDetailList)) {
+            // 学生ID集合
+            Set<Integer> userIdList = studentLessonTrainingDetailList.stream()
+                    .map(StudentLessonTrainingDetail::getUserId)
+                    .filter(Objects::nonNull)
+                    .map(Long::intValue)
+                    .collect(Collectors.toSet());
+            // 设置声部
+            Map<Integer, StudentSubjectDto> subjectDtoMap = studentLessonTrainingDetailService
+                    .getStudentMusicGroupSubject(new ArrayList<>(userIdList), exercises.getMusicGroupId());
+
+            studentLessonTrainingDetailList.forEach(studentLessonTrainingDetail -> {
+                if (studentLessonTrainingDetail.getUserId() == null) {
+                    return;
+                }
+                StudentSubjectDto studentSubjectDto = subjectDtoMap.get(studentLessonTrainingDetail.getUserId().intValue());
+                if (Objects.nonNull(studentSubjectDto)) {
+                    studentLessonTrainingDetail.setSubjectId(studentSubjectDto.getSubjectId().longValue());
+                }
+            });
             studentLessonTrainingDetailService.saveBatch(studentLessonTrainingDetailList);
             exercises.setVersionTag("v2");
         } else {
@@ -207,177 +226,177 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
                         userMap, null, 0, 3 + notifyUrl, "STUDENT",
                         teacher.getRealName(), exercises.getTitle(), dateStr);
             }
-		}
-		studentServeService.updateExercisesSituation(exercises.getMusicGroupId(), new Date(), studentIds, exercises.getTeacherId());
-	}
-
-	@Override
-	public List<Map<String, Object>> findExtraExercilses(ExtraExercilseQueryInfo queryInfo) {
-		Map<String, Object> params = new HashMap<>();
-		MapUtil.populateMap(params, queryInfo);
-		List<Map<String, Object>> result = new ArrayList<>();
-
-		List<ExtracurricularExercises> dataList = extracurricularExercisesDao.findExtraExercises(params);
-		if(!CollectionUtils.isEmpty(dataList)){
-			List<Long> extraExerciseIds = dataList.stream().map(ExtracurricularExercises::getId).collect(Collectors.toList());
-			List<ExtracurricularExercisesReply> extraExerciseStudentsByExtraExercises = extracurricularExercisesReplyDao.findExtraExerciseStudentsByExtraExercises(extraExerciseIds);
-			Map<Long, List<ExtracurricularExercisesReply>> idStudentsMap = extraExerciseStudentsByExtraExercises.stream().collect(Collectors.groupingBy(ExtracurricularExercisesReply::getExtracurricularExercisesId));
-			for (ExtracurricularExercises extracurricularExercises : dataList) {
-				List<ExtracurricularExercisesReply> extracurricularExercisesReplies = idStudentsMap.get(extracurricularExercises.getId());
-				if(CollectionUtils.isEmpty(extracurricularExercisesReplies)){
-					continue;
-				}
-				long noRepliedNum = extracurricularExercisesReplies.stream().filter(e -> e.getStatus()==1&&e.getIsReplied() == 0).count();
-				if(noRepliedNum<=0){
-					extracurricularExercises.setIsReplied(1);
-				}
-				long notSubmitNum = extracurricularExercisesReplies.stream().filter(e -> e.getStatus() == 0).count();
-				if(notSubmitNum<=0){
-					extracurricularExercises.setIsSubmit(1);
-				}
-				if(noRepliedNum>0){
-					extracurricularExercises.setStatus(1);
-				}else if(noRepliedNum<=0&&notSubmitNum>0){
-					extracurricularExercises.setStatus(2);
-				}else if(noRepliedNum<=0&&notSubmitNum<=0){
-					extracurricularExercises.setStatus(3);
-				}
-			}
-
-			Map<String, List<ExtracurricularExercises>> collect = dataList.stream().collect(Collectors.groupingBy(e -> DateUtil.dateToString(e.getCreateTime(), "yyyy-MM-dd")));
-			List<Date> dates=new ArrayList<>();
-			collect.keySet().forEach(ds-> dates.add(DateUtil.stringToDate(ds,"yyyy-MM-dd")));
-			dates.sort(Comparator.comparing(Date::getTime));
-			dates.sort(Comparator.reverseOrder());
-			for (Date date : dates) {
-				String key=DateUtil.dateToString(date, "yyyy-MM-dd");
-				Map<String, Object> r = new HashMap<>();
-				r.put("day", key);
-				collect.get(key).sort(Comparator.comparing(ExtracurricularExercises::getCreateTime).reversed());
-				r.put("list", collect.get(key));
-				result.add(r);
-			}
-		}
-		return result;
-	}
-
-	@Override
-	public List<BasicUserDto> getDontServeStudents(Integer teacherId,
-												   String search,
-												   String musicGroupId,
-												   Long classGroupId,
-												   Integer subjectId,
-												   Integer hasMember,
-												   String studentIds) {
-		LocalDate nowDate = LocalDateTime.now(DateUtil.zoneId).toLocalDate();
-		LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
-		return extracurricularExercisesDao.findNoExercisesStudentsInThisWeekWithTeacher(teacherId, monDayDate.toString(), musicGroupId, classGroupId, subjectId, search,hasMember,studentIds);
-	}
-
-	@Override
-	public void studentServeRemind() {
-		LocalDate nowDate = LocalDateTime.now(DateUtil.zoneId).toLocalDate();
-		LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
-		List<Map<Integer, Long>> noFinishedServiceTeacher = studentExtracurricularExercisesSituationDao.getNoFinishedServiceTeacher(monDayDate.toString());
-		Map<Integer, Long> noFinishedServiceTeacherMap= MapUtil.convertIntegerMap(noFinishedServiceTeacher);
-		for (Map.Entry<Integer, Long> integerLongEntry : noFinishedServiceTeacherMap.entrySet()) {
-			Map<Integer, String> userMap = new HashMap<>();
-			userMap.put(integerLongEntry.getKey(), integerLongEntry.getKey().toString());
-			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_PUBLIC_EXTRA_REMIND,
-					userMap, null, 0, "11" , "TEACHER", integerLongEntry.getValue());
-		}
-	}
-
-	@Override
-	public PageInfo<TeacherHomeworkListDto> findExtraExercilsesHomeworks(ExtraExercilseQueryInfo queryInfo) {
-		PageInfo<TeacherHomeworkListDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
-		Map<String, Object> params = new HashMap<>();
-		MapUtil.populateMap(params, queryInfo);
-		int count = extracurricularExercisesDao.countExtraExercilsesHomeworks(params);
-		List<TeacherHomeworkListDto> dataList = new ArrayList<>();
-		if(count > 0){
-			pageInfo.setTotal(count);
-			params.put("offset", pageInfo.getOffset());
-			List<ExtracurricularExercisesHomeworkListDto> homeworksExercises = extracurricularExercisesDao.findExtraExercilsesHomeworks(params);
-			if(homeworksExercises == null || homeworksExercises.size() == 0){
-				return pageInfo;
-			}
-			//课外训练
-			List<ExtracurricularExercisesHomeworkListDto> exercises = homeworksExercises.stream().filter(e -> e.getType().equals("EXERCISES")).collect(Collectors.toList());
-			if(exercises.size() > 0){
-				List<Integer> exercisesIdList = exercises.stream().map(e -> e.getHomeworkId()).collect(Collectors.toList());
-				List<TeacherHomeworkListDto> byIdList = extracurricularExercisesDao.findByIdList(exercisesIdList);
-				if(byIdList != null && byIdList.size() > 0){
-					List<Integer> extraExerciseIds = byIdList.stream().map(TeacherHomeworkListDto::getHomeworkId).collect(Collectors.toList());
-					List<ExtracurricularExercisesReply> extraExerciseStudentsByExtraExercises = extracurricularExercisesReplyDao.findExtraExerciseStudentsByExtraExercises(extraExerciseIds);
-					Map<Long, List<ExtracurricularExercisesReply>> idStudentsMap = extraExerciseStudentsByExtraExercises.stream().collect(Collectors.groupingBy(ExtracurricularExercisesReply::getExtracurricularExercisesId));
-					for (TeacherHomeworkListDto homeworkListDto : byIdList) {
-						List<ExtracurricularExercisesReply> extracurricularExercisesReplies = idStudentsMap.get(homeworkListDto.getHomeworkId().longValue());
-						if(CollectionUtils.isEmpty(extracurricularExercisesReplies)){
-							continue;
-						}
-						long noRepliedNum = extracurricularExercisesReplies.stream().filter(e -> e.getStatus()==1&&e.getIsReplied() == 0).count();
-						if(noRepliedNum<=0){
-							homeworkListDto.setIsReplied(1);
-						}
-						long notSubmitNum = extracurricularExercisesReplies.stream().filter(e -> e.getStatus() == 0).count();
-						if(notSubmitNum<=0){
-							homeworkListDto.setIsSubmit(1);
-						}
-						if(noRepliedNum>0){
-							homeworkListDto.setStatus(1);
-						}else if(noRepliedNum<=0&&notSubmitNum>0){
-							homeworkListDto.setStatus(2);
-						}else if(noRepliedNum<=0&&notSubmitNum<=0){
-							homeworkListDto.setStatus(3);
-						}
-					}
-					dataList.addAll(byIdList);
-				}
-			}
-			//课后作业
-			List<ExtracurricularExercisesHomeworkListDto> homeworkList = homeworksExercises.stream().filter(e -> e.getType().equals("HOMEWORK")).collect(Collectors.toList());
-			if(homeworkList.size() > 0){
-				List<Integer> homeworkIdList = homeworkList.stream().map(e -> e.getHomeworkId()).collect(Collectors.toList());
-				List<TeacherHomeworkListDto> byIdList = courseHomeworkDao.findByIdList(homeworkIdList);
-				if(byIdList != null && byIdList.size() > 0){
-					List<Long> courseIds = byIdList.stream().mapToLong(TeacherHomeworkListDto::getCourseScheduleId).boxed().collect(Collectors.toList());
-					List<StudentCourseHomework> allStudentCourseHomeworks = studentCourseHomeworkDao.findByCourses(courseIds);
-					Map<Long, List<StudentCourseHomework>> homeworkStudentMap = allStudentCourseHomeworks.stream().collect(Collectors.groupingBy(StudentCourseHomework::getCourseScheduleId));
-					for (TeacherHomeworkListDto teacherHomeworkListDto : byIdList) {
-						List<StudentCourseHomework> studentCourseHomeworks = homeworkStudentMap.get(teacherHomeworkListDto.getCourseScheduleId().longValue());
-						if(CollectionUtils.isEmpty(studentCourseHomeworks)){
-							continue;
-						}
-						long noRepliedNum=studentCourseHomeworks.stream().filter(e -> YesOrNoEnum.YES.equals(e.getStatus())&&YesOrNoEnum.NO.equals(e.getIsReplied())).count();
-						if(noRepliedNum<=0){
-							teacherHomeworkListDto.setIsReplied(YesOrNoEnum.YES.getCode());
-						}
-						long notSubmitNum = studentCourseHomeworks.stream().filter(e -> e.getStatus().equals(YesOrNoEnum.NO)).count();
-						if(notSubmitNum<=0){
-							teacherHomeworkListDto.setIsSubmit(1);
-						}
-						if(noRepliedNum>0){
-							teacherHomeworkListDto.setStatus(1);
-						}else if(noRepliedNum<=0&&notSubmitNum>0){
-							teacherHomeworkListDto.setStatus(2);
-						}else if(noRepliedNum<=0&&notSubmitNum<=0){
-							teacherHomeworkListDto.setStatus(3);
-						}
-					}
-					dataList.addAll(byIdList);
-				}
-			}
-			dataList.removeAll(Collections.singleton(null));
-			int startRow = queryInfo.getPage() * queryInfo.getRows() - queryInfo.getRows();
-			dataList = dataList.stream().sorted(Comparator.comparing(TeacherHomeworkListDto::getDay).reversed()).
-					sorted(Comparator.comparing(TeacherHomeworkListDto::getStatus))
-					.skip(startRow).limit(queryInfo.getRows()).
-					collect(Collectors.toList());
-			pageInfo.setRows(dataList);
-		}
-		return pageInfo;
-	}
+        }
+        studentServeService.updateExercisesSituation(exercises.getMusicGroupId(), new Date(), studentIds, exercises.getTeacherId());
+    }
+
+    @Override
+    public List<Map<String, Object>> findExtraExercilses(ExtraExercilseQueryInfo queryInfo) {
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+        List<Map<String, Object>> result = new ArrayList<>();
+
+        List<ExtracurricularExercises> dataList = extracurricularExercisesDao.findExtraExercises(params);
+        if(!CollectionUtils.isEmpty(dataList)){
+            List<Long> extraExerciseIds = dataList.stream().map(ExtracurricularExercises::getId).collect(Collectors.toList());
+            List<ExtracurricularExercisesReply> extraExerciseStudentsByExtraExercises = extracurricularExercisesReplyDao.findExtraExerciseStudentsByExtraExercises(extraExerciseIds);
+            Map<Long, List<ExtracurricularExercisesReply>> idStudentsMap = extraExerciseStudentsByExtraExercises.stream().collect(Collectors.groupingBy(ExtracurricularExercisesReply::getExtracurricularExercisesId));
+            for (ExtracurricularExercises extracurricularExercises : dataList) {
+                List<ExtracurricularExercisesReply> extracurricularExercisesReplies = idStudentsMap.get(extracurricularExercises.getId());
+                if(CollectionUtils.isEmpty(extracurricularExercisesReplies)){
+                    continue;
+                }
+                long noRepliedNum = extracurricularExercisesReplies.stream().filter(e -> e.getStatus()==1&&e.getIsReplied() == 0).count();
+                if(noRepliedNum<=0){
+                    extracurricularExercises.setIsReplied(1);
+                }
+                long notSubmitNum = extracurricularExercisesReplies.stream().filter(e -> e.getStatus() == 0).count();
+                if(notSubmitNum<=0){
+                    extracurricularExercises.setIsSubmit(1);
+                }
+                if(noRepliedNum>0){
+                    extracurricularExercises.setStatus(1);
+                }else if(noRepliedNum<=0&&notSubmitNum>0){
+                    extracurricularExercises.setStatus(2);
+                }else if(noRepliedNum<=0&&notSubmitNum<=0){
+                    extracurricularExercises.setStatus(3);
+                }
+            }
+
+            Map<String, List<ExtracurricularExercises>> collect = dataList.stream().collect(Collectors.groupingBy(e -> DateUtil.dateToString(e.getCreateTime(), "yyyy-MM-dd")));
+            List<Date> dates=new ArrayList<>();
+            collect.keySet().forEach(ds-> dates.add(DateUtil.stringToDate(ds,"yyyy-MM-dd")));
+            dates.sort(Comparator.comparing(Date::getTime));
+            dates.sort(Comparator.reverseOrder());
+            for (Date date : dates) {
+                String key=DateUtil.dateToString(date, "yyyy-MM-dd");
+                Map<String, Object> r = new HashMap<>();
+                r.put("day", key);
+                collect.get(key).sort(Comparator.comparing(ExtracurricularExercises::getCreateTime).reversed());
+                r.put("list", collect.get(key));
+                result.add(r);
+            }
+        }
+        return result;
+    }
+
+    @Override
+    public List<BasicUserDto> getDontServeStudents(Integer teacherId,
+                                                   String search,
+                                                   String musicGroupId,
+                                                   Long classGroupId,
+                                                   Integer subjectId,
+                                                   Integer hasMember,
+                                                   String studentIds) {
+        LocalDate nowDate = LocalDateTime.now(DateUtil.zoneId).toLocalDate();
+        LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
+        return extracurricularExercisesDao.findNoExercisesStudentsInThisWeekWithTeacher(teacherId, monDayDate.toString(), musicGroupId, classGroupId, subjectId, search,hasMember,studentIds);
+    }
+
+    @Override
+    public void studentServeRemind() {
+        LocalDate nowDate = LocalDateTime.now(DateUtil.zoneId).toLocalDate();
+        LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
+        List<Map<Integer, Long>> noFinishedServiceTeacher = studentExtracurricularExercisesSituationDao.getNoFinishedServiceTeacher(monDayDate.toString());
+        Map<Integer, Long> noFinishedServiceTeacherMap= MapUtil.convertIntegerMap(noFinishedServiceTeacher);
+        for (Map.Entry<Integer, Long> integerLongEntry : noFinishedServiceTeacherMap.entrySet()) {
+            Map<Integer, String> userMap = new HashMap<>();
+            userMap.put(integerLongEntry.getKey(), integerLongEntry.getKey().toString());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_PUBLIC_EXTRA_REMIND,
+                    userMap, null, 0, "11" , "TEACHER", integerLongEntry.getValue());
+        }
+    }
+
+    @Override
+    public PageInfo<TeacherHomeworkListDto> findExtraExercilsesHomeworks(ExtraExercilseQueryInfo queryInfo) {
+        PageInfo<TeacherHomeworkListDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+        int count = extracurricularExercisesDao.countExtraExercilsesHomeworks(params);
+        List<TeacherHomeworkListDto> dataList = new ArrayList<>();
+        if(count > 0){
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            List<ExtracurricularExercisesHomeworkListDto> homeworksExercises = extracurricularExercisesDao.findExtraExercilsesHomeworks(params);
+            if(homeworksExercises == null || homeworksExercises.size() == 0){
+                return pageInfo;
+            }
+            //课外训练
+            List<ExtracurricularExercisesHomeworkListDto> exercises = homeworksExercises.stream().filter(e -> e.getType().equals("EXERCISES")).collect(Collectors.toList());
+            if(exercises.size() > 0){
+                List<Integer> exercisesIdList = exercises.stream().map(e -> e.getHomeworkId()).collect(Collectors.toList());
+                List<TeacherHomeworkListDto> byIdList = extracurricularExercisesDao.findByIdList(exercisesIdList);
+                if(byIdList != null && byIdList.size() > 0){
+                    List<Integer> extraExerciseIds = byIdList.stream().map(TeacherHomeworkListDto::getHomeworkId).collect(Collectors.toList());
+                    List<ExtracurricularExercisesReply> extraExerciseStudentsByExtraExercises = extracurricularExercisesReplyDao.findExtraExerciseStudentsByExtraExercises(extraExerciseIds);
+                    Map<Long, List<ExtracurricularExercisesReply>> idStudentsMap = extraExerciseStudentsByExtraExercises.stream().collect(Collectors.groupingBy(ExtracurricularExercisesReply::getExtracurricularExercisesId));
+                    for (TeacherHomeworkListDto homeworkListDto : byIdList) {
+                        List<ExtracurricularExercisesReply> extracurricularExercisesReplies = idStudentsMap.get(homeworkListDto.getHomeworkId().longValue());
+                        if(CollectionUtils.isEmpty(extracurricularExercisesReplies)){
+                            continue;
+                        }
+                        long noRepliedNum = extracurricularExercisesReplies.stream().filter(e -> e.getStatus()==1&&e.getIsReplied() == 0).count();
+                        if(noRepliedNum<=0){
+                            homeworkListDto.setIsReplied(1);
+                        }
+                        long notSubmitNum = extracurricularExercisesReplies.stream().filter(e -> e.getStatus() == 0).count();
+                        if(notSubmitNum<=0){
+                            homeworkListDto.setIsSubmit(1);
+                        }
+                        if(noRepliedNum>0){
+                            homeworkListDto.setStatus(1);
+                        }else if(noRepliedNum<=0&&notSubmitNum>0){
+                            homeworkListDto.setStatus(2);
+                        }else if(noRepliedNum<=0&&notSubmitNum<=0){
+                            homeworkListDto.setStatus(3);
+                        }
+                    }
+                    dataList.addAll(byIdList);
+                }
+            }
+            //课后作业
+            List<ExtracurricularExercisesHomeworkListDto> homeworkList = homeworksExercises.stream().filter(e -> e.getType().equals("HOMEWORK")).collect(Collectors.toList());
+            if(homeworkList.size() > 0){
+                List<Integer> homeworkIdList = homeworkList.stream().map(e -> e.getHomeworkId()).collect(Collectors.toList());
+                List<TeacherHomeworkListDto> byIdList = courseHomeworkDao.findByIdList(homeworkIdList);
+                if(byIdList != null && byIdList.size() > 0){
+                    List<Long> courseIds = byIdList.stream().mapToLong(TeacherHomeworkListDto::getCourseScheduleId).boxed().collect(Collectors.toList());
+                    List<StudentCourseHomework> allStudentCourseHomeworks = studentCourseHomeworkDao.findByCourses(courseIds);
+                    Map<Long, List<StudentCourseHomework>> homeworkStudentMap = allStudentCourseHomeworks.stream().collect(Collectors.groupingBy(StudentCourseHomework::getCourseScheduleId));
+                    for (TeacherHomeworkListDto teacherHomeworkListDto : byIdList) {
+                        List<StudentCourseHomework> studentCourseHomeworks = homeworkStudentMap.get(teacherHomeworkListDto.getCourseScheduleId().longValue());
+                        if(CollectionUtils.isEmpty(studentCourseHomeworks)){
+                            continue;
+                        }
+                        long noRepliedNum=studentCourseHomeworks.stream().filter(e -> YesOrNoEnum.YES.equals(e.getStatus())&&YesOrNoEnum.NO.equals(e.getIsReplied())).count();
+                        if(noRepliedNum<=0){
+                            teacherHomeworkListDto.setIsReplied(YesOrNoEnum.YES.getCode());
+                        }
+                        long notSubmitNum = studentCourseHomeworks.stream().filter(e -> e.getStatus().equals(YesOrNoEnum.NO)).count();
+                        if(notSubmitNum<=0){
+                            teacherHomeworkListDto.setIsSubmit(1);
+                        }
+                        if(noRepliedNum>0){
+                            teacherHomeworkListDto.setStatus(1);
+                        }else if(noRepliedNum<=0&&notSubmitNum>0){
+                            teacherHomeworkListDto.setStatus(2);
+                        }else if(noRepliedNum<=0&&notSubmitNum<=0){
+                            teacherHomeworkListDto.setStatus(3);
+                        }
+                    }
+                    dataList.addAll(byIdList);
+                }
+            }
+            dataList.removeAll(Collections.singleton(null));
+            int startRow = queryInfo.getPage() * queryInfo.getRows() - queryInfo.getRows();
+            dataList = dataList.stream().sorted(Comparator.comparing(TeacherHomeworkListDto::getDay).reversed()).
+                    sorted(Comparator.comparing(TeacherHomeworkListDto::getStatus))
+                    .skip(startRow).limit(queryInfo.getRows()).
+                    collect(Collectors.toList());
+            pageInfo.setRows(dataList);
+        }
+        return pageInfo;
+    }
 
     @Override
     public PageInfo<CourseHomeworkWrapper.WebExtraCourseHomework> findExtraExercilsesV2(ExtraExercilseQueryInfo queryInfo) {

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

@@ -1891,6 +1891,16 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         roomMember.setLiveRoomStatus(1);
         roomMember.setMicrophoneFlag(microphoneFlag);
 
+        ImLiveBroadcastRoomMember liveRoomMember = liveBroadcastRoomMemberService.lambdaQuery()
+                .eq(ImLiveBroadcastRoomMember::getTenantId, userInfo.getTenantId())
+                .eq(ImLiveBroadcastRoomMember::getRoomUid, imLiveBroadcastRoomVo.getRoomUid())
+                .eq(ImLiveBroadcastRoomMember::getUserId, userInfo.getUserId())
+                .list().stream().findFirst().orElse(null);
+        if (Objects.nonNull(liveRoomMember)) {
+           return userInfo;
+        }
+
+
         // 保存直播间用户信息
         liveBroadcastRoomMemberService.save(roomMember);
 
@@ -2193,6 +2203,11 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void createLiveRoom(ImLiveBroadcastRoom room) {
+        createLiveRoomNoTransactional(room);
+    }
+
+    @Override
+    public void createLiveRoomNoTransactional(ImLiveBroadcastRoom room) {
         if (StringUtils.isBlank(room.getGroupType())) {
             room.setGroupType("NORMAL");
         }

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

@@ -408,7 +408,7 @@ public class IndexErrDataRecordServiceImpl extends BaseServiceImpl<Long, IndexEr
 			params.put("classGroupIds",classGroupIds);
 		}
 		int count = indexErrDataRecordDao.historyErrCourseDataCount(params);
-		if(queryInfo.getIsExport() && count > 50000){
+		if(queryInfo.isExport() && count > 50000){
 			throw new BizException("数据集太大,不能导出.最大数据集不能超过50000");
 		}
 		pageInfo.setTotal(count);
@@ -433,7 +433,7 @@ public class IndexErrDataRecordServiceImpl extends BaseServiceImpl<Long, IndexEr
 			List<Map<Integer, String>> classGroupSubjectNameMaps = classGroupDao.findClassGroupSubjectNameMaps(courseScheduleIds);
 			Map<Integer, String> classGroupSubjectNameMap = MapUtil.convertIntegerMap(classGroupSubjectNameMaps);
 			Map<Long, String> eduName = null;
-			if(queryInfo.getIsExport()){
+			if(queryInfo.isExport()){
 				List<Long> musicCourseIds = results.stream().filter(e -> e.getGroupType() == MUSIC).map(CourseScheduleEndDto::getId).collect(Collectors.toList());
 				eduName = new HashMap<>(courseScheduleIds.size());
 				if(musicCourseIds != null && musicCourseIds.size() > 0){

+ 32 - 124
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.beust.jcommander.internal.Lists;
 import com.microsvc.toolkit.middleware.im.message.ImGroupMemberWrapper;
-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.*;
@@ -39,7 +38,6 @@ import com.ym.mec.util.excel.POIUtil;
 import com.ym.mec.util.http.HttpUtil;
 import com.ym.mec.util.ini.IniFileUtil;
 import com.ym.mec.util.json.JsonUtil;
-import com.ym.mec.util.string.MessageFormatter;
 import com.ym.mec.util.validator.CommonValidator;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -150,7 +148,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Autowired
     private PayService payService;
     @Autowired
-    private SysUserFeignService sysUserFeignService;
+    private SysUserService sysUserService;
     @Autowired
     private SysMessageService sysMessageService;
     @Autowired
@@ -636,10 +634,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 	@Override
     @Transactional(rollbackFor = Exception.class)
     public String createGroup(SubFeeSettingDto subFeeSettingDto) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null || sysUser.getId() == null) {
-            throw new BizException("获取用户信息失败");
-        }
+        SysUser sysUser = sysUserService.getUser();
         MusicGroup musicGroup = subFeeSettingDto.getMusicGroup();
         if (StringUtils.isBlank(musicGroup.getGradeType()) && StringUtils.isNotBlank(subFeeSettingDto.getGradeType())) {
             musicGroup.setGradeType(subFeeSettingDto.getGradeType());
@@ -807,11 +802,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean finishPreApply(String musicGroupId, boolean isCheckStudentNum) {
-
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null || sysUser.getId() == null) {
-            throw new BizException("请重新登录");
-        }
+		SysUser sysUser = sysUserService.getUser();
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团信息查询失败");
@@ -1454,7 +1445,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         if ("205".equals(studentPaymentOrder.getPaymentAccountNo())) {
             Integer teacherId = musicGroup.getEducationalTeacherId();
-            SysUser endTeacher = sysUserFeignService.queryUserById(teacherId);
+            SysUser endTeacher = sysUserService.queryUserById(teacherId);
             Map<Integer, String> userPhoneMap = new HashMap<>();
             userPhoneMap.put(endTeacher.getId(), endTeacher.getPhone());
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.NO_BUY_CLOUD_TEACHER_MSG,
@@ -1509,10 +1500,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void updateSubjectInfo(SubFeeSettingDto subFeeSettingDto) throws Exception {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("身份校验失败");
-        }
+		SysUser sysUser = sysUserService.getUser();
         String musicGroupId = subFeeSettingDto.getMusicGroupId();
         //乐团状态是否正确
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
@@ -1610,10 +1598,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void musicGroupAction(String musicGroupId) throws Exception {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+		SysUser sysUser = sysUserService.getUser();
         MusicGroup musicGroup = saveLog(musicGroupId, MusicGroupStatusEnum.PREPARE);
 
         //乐器采购清单是否确认
@@ -1696,10 +1681,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void musicGroupAudit(String musicGroupId) throws Exception {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+		SysUser sysUser = sysUserService.getUser();
         Date date = new Date();
 
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
@@ -1744,10 +1726,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void musicGroupAuditFailed(String musicGroupId, String memo) throws Exception {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+		SysUser sysUser = sysUserService.getUser();
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团信息不存在");
@@ -1807,10 +1786,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void musicGroupAuditSuccess(String musicGroupId) throws Exception {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+		SysUser sysUser = sysUserService.getUser();
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团信息不存在");
@@ -1945,10 +1921,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
     @Override
     public MusicCardDto queryPersonalMusicGroups(Integer userId) {
-        SysUser sysUser = sysUserFeignService.queryUserById(userId);
-        if (sysUser == null) {
-            throw new BizException("用户不存在");
-        }
+        SysUser sysUser = sysUserService.queryUserById(userId);
         MusicCardDto musicCardDto = musicGroupDao.queryPersonalMusicGroups(userId);
         if (musicCardDto == null) {
             musicCardDto = new MusicCardDto();
@@ -1995,10 +1968,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public boolean cancelMusicGroup(String musicGroupId) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+		SysUser sysUser = sysUserService.getUser();
         MusicGroup musicGroup = musicGroupDao.getLocked(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团找不到");
@@ -2089,10 +2059,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public boolean pauseMusicGroup(String musicGroupId) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+		SysUser sysUser = sysUserService.getUser();
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团找不到");
@@ -2122,10 +2089,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public boolean resumeMusicGroup(String musicGroupId) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+        SysUser sysUser = sysUserService.getUser();
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团找不到");
@@ -2164,10 +2128,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean extensionPaymentExpireDate(String musicGroupId, Date expireDate) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+        SysUser sysUser = sysUserService.getUser();
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团找不到");
@@ -2207,10 +2168,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
     @Override
     public boolean extensionApplyExpireDate(String musicGroupId, Date expireDate) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+        SysUser sysUser = sysUserService.getUser();
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团找不到");
@@ -2238,10 +2196,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
     @Override
     public boolean extensionPreApplyExpireDate(String musicGroupId, Date expireDate) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+        SysUser sysUser = sysUserService.getUser();
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团找不到");
@@ -2381,7 +2336,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if("STUDENT".equals(client)){
 
             // 乐团信息
-            SysUser student = sysUserFeignService.queryUserById(musicGroupQuit.getUserId());
+            SysUser student = sysUserService.queryUserById(musicGroupQuit.getUserId());
 
             IPage<SchoolStaffWrapper.SchoolStaff> page = schoolStaffService.selectPage(new Page<>(1, -1),
                     SchoolStaffWrapper.SchoolStaffQuery.builder().schoolId(musicGroup.getCooperationOrganId().longValue()).build());
@@ -2406,7 +2361,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
 
         if (reqMusicGroupQuit.getStatus() == PROCESSING) {
-            SysUser sysUser = sysUserFeignService.queryUserById(userId);
+            SysUser sysUser = sysUserService.queryUserById(userId);
 
             Set<Integer> integers = employeePositionService.queryUserIdByRoleId(new SysUserRoleEnum[]{ORGAN_MANAGER}, musicGroup.getOrganId());
             if (currentOperatorRoleIds == null || currentOperatorRoleIds.size() == 0) {
@@ -2438,10 +2393,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (musicGroupQuit == null) {
             throw new BizException("操作失败,没有查询到退团记录");
         }
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+        SysUser sysUser = sysUserService.getUser();
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团不存在");
@@ -2528,7 +2480,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (courseScheduleList != null && courseScheduleList.size() > 0) {
             throw new BizException("退团失败,存在[进行中]的课程");
         }
-        if(reqMusicGroupQuit.getStatus() != APPROVED){
+        if(musicGroupQuit.getStatus() == PROCESSING && reqMusicGroupQuit.getStatus() == APPROVED){
             //是否是特定的可以一键退团的乐团主管
             if(hasRole){
                 status = APPROVED;
@@ -2770,7 +2722,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 			List<SchoolStaffWrapper.SchoolStaff> records = page.getRecords();
 			if (CollectionUtils.isNotEmpty(records)) {
 
-				SysUser sysUser = sysUserFeignService.queryUserById(userId);
+				SysUser sysUser = sysUserService.queryUserById(userId);
 
 				Map<Integer, String> userMap = new HashMap<>();
 				records.forEach(o -> userMap.put(o.getUserId().intValue(), o.getUserId().toString()));
@@ -2785,7 +2737,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 			List<SchoolStaffWrapper.SchoolStaff> records = page.getRecords();
 			if (CollectionUtils.isNotEmpty(records)) {
 
-				SysUser sysUser = sysUserFeignService.queryUserById(userId);
+				SysUser sysUser = sysUserService.queryUserById(userId);
 
 				Map<Integer, String> userMap = new HashMap<>();
 				records.forEach(o -> userMap.put(o.getUserId().intValue(), o.getUserId().toString()));
@@ -2804,10 +2756,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     public boolean directQuitMusicGroup(MusicGroupQuitDto musicGroupQuitDto) {
 		Integer userId = musicGroupQuitDto.getUserId();
 		String musicGroupId = musicGroupQuitDto.getMusicGroupId();
-		SysUser sysUser = sysUserFeignService.queryUserById(userId);
-        if (sysUser == null) {
-            throw new BizException("获取用户信息失败");
-        }
+		SysUser sysUser = sysUserService.queryUserById(userId);
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团不存在");
@@ -3400,10 +3349,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public boolean updateTeacherCoursesSalary(Long courseScheduleId, Integer teacherId, BigDecimal salary, BigDecimal subsidy, String scope) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("获取用户信息失败");
-        }
+        SysUser sysUser = sysUserService.getUser();
         CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleId);
         if (courseSchedule == null) {
             throw new BizException("课程信息不存在");
@@ -3441,10 +3387,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
     @Override
     public PageInfo<MusicGroup> queryMusicGroupPage(MusicGroupQueryInfo queryInfo) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("获取用户信息失败");
-        }
+        SysUser sysUser = sysUserService.getUser();
         //查询有剩余排课时长的乐团
         if("MUSIC_GROUP_HAS_COURSE_TIMES".equals(queryInfo.getSearchType())){
             List<String> musicGroupIds = musicGroupDao.queryHasSubCourseTimes(queryInfo.getOrganId(),queryInfo.getTenantId());
@@ -3594,10 +3537,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void updateBaseInfo(SubFeeSettingDto subFeeSettingDto) throws Exception {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+        SysUser sysUser = sysUserService.getUser();
         String musicGroupId = subFeeSettingDto.getMusicGroup().getId();
         MusicGroup group = musicGroupDao.getLocked(musicGroupId);
         if (group == null) {
@@ -3756,10 +3696,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(rollbackFor = Exception.class)
     public MusicGroup openPay(String musicGroupId, String expireDate) throws Exception {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+        SysUser sysUser = sysUserService.getUser();
         MusicGroup musicGroup = saveLog(musicGroupId, MusicGroupStatusEnum.APPLY);
         //记录操作日志
         musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, "开启缴费(报名中 -->  缴费中)", sysUser.getId(), ""));
@@ -3819,10 +3756,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void musicGroupFound(String musicGroupId) throws Exception {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+        SysUser sysUser = sysUserService.getUser();
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团信息不存在");
@@ -3865,23 +3799,6 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, event, sysUser.getId(), ""));
         musicGroup.setStatus(MusicGroupStatusEnum.PREPARE);
         musicGroupDao.update(musicGroup);
-//        if (musicGroup.getOwnershipType() != null && musicGroup.getOwnershipType() == CooperationOrgan.OwnershipType.OWN) {
-//            //给家长发送乐团基础训练课短信
-//            //获取所有乐团学员列表
-//            List<StudentRegistration> students = studentRegistrationDao.queryStudentByMusicGroupId(musicGroupId);
-//            if (students != null && students.size() > 0) {
-//                // 获取所有家长电话
-//                Set<String> parentsPhones = students.stream().map(StudentRegistration::getParentsPhone).collect(Collectors.toSet());
-//                // 获取对应家长的用户编号
-//                Map<Integer, String> userIds = MapUtil.convertMybatisMap(studentRegistrationDao.findParentId(StringUtils.join(parentsPhones, ",")));
-//                userIds = JSONObject.parseObject(JSONObject.toJSONString(userIds), HashMap.class);
-//                if (userIds != null && userIds.size() > 0) {
-//                    String studentApplyUrl = sysConfigDao.findConfigValue(SysConfigService.STUDENT_APPLY_URL) + musicGroupId;
-//                    String serverPhone = sysConfigDao.findConfigValue(SysConfigService.SERVER_PHONE);
-//                    sysMessageService.batchSendMessage(MessageSender.YIMEI, MessageTypeEnum.SMS_BASICS_SKILL_APPLY_MESSAGE, userIds, null, 0, "", "", musicGroup.getName(), studentApplyUrl, serverPhone);
-//                }
-//            }
-//        }
         sendSeoMessageSource.sendSeoMessage(musicGroup.getOrganId(), new SysUserRoleEnum[]{ORGAN_MANAGER},
                 null, musicGroup.getEducationalTeacherId(), MessageTypeEnum.BACKSTAGE_MUSIC_GROUP_MARKING, musicGroup.getName());
     }
@@ -3914,10 +3831,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult addMusicGroupRegs(String musicGroupId, List<Long> registerIds) throws Exception {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null || sysUser.getId() == null) {
-            throw new BizException("获取用户信息失败");
-        }
+        SysUser sysUser = sysUserService.getUser();
         List<StudentRegistration> studentRegistrations = studentRegistrationDao.findStudentListByIdList(registerIds);
         List<StudentRegistration> oldRegs = studentRegistrationDao.getMusicGroupStu(musicGroupId);
         Map<Integer, List<StudentRegistration>> oldRegMap = oldRegs.stream().collect(Collectors.groupingBy(StudentRegistration::getUserId));
@@ -4007,10 +3921,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean closeMusicGroup(CloseMusicGroupDto closeMusicGroupDto) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+        SysUser sysUser = sysUserService.getUser();
         String musicGroupId = closeMusicGroupDto.getMusicGroupId();
 
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
@@ -4119,10 +4030,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
     @Override
     public Object getQuitGroupDetail(String musicGroupId) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("请登录");
-        }
+        SysUser sysUser = sysUserService.getUser();
         Map<String, Object> resultMap = new HashMap<>(8);
         String username = sysUser.getUsername();
         resultMap.put("username", StringUtils.isEmpty(username) ? sysUser.getRealName() : username);
@@ -4140,7 +4048,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 			resultMap.put("quitTime", musicGroupQuit.getCreateTime());
         }
         if (musicGroup.getEducationalTeacherId() != null) {
-            SysUser user = sysUserFeignService.queryUserById(musicGroup.getEducationalTeacherId());
+            SysUser user = sysUserService.queryUserById(musicGroup.getEducationalTeacherId());
             resultMap.put("teacherMobile", user.getPhone());
         } else {
             resultMap.put("teacherMobile", "027-87718176");

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

@@ -17,6 +17,7 @@ import java.util.function.BiPredicate;
 import java.util.function.Consumer;
 import java.util.function.Function;
 
+import com.huifu.adapay.core.util.StringUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.redisson.api.RBucket;
 import org.redisson.api.RedissonClient;
@@ -104,6 +105,7 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
         return payment;
     }
 
+
     private void checkSing(PaymentParam param) {
         
         //查询商户支付账户

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

@@ -114,7 +114,6 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
         }
         Integer tenantId = TenantContextHolder.getTenantId();
         Date date = new Date();
-        SysConfig attendanceTimeRange;
         if (courseSchedule.getGroupType().equals(GroupType.MUSIC)) {
             TeacherAttendance teacherAttendanceInfo = teacherAttendanceDao.findByTeacherAttendanceInfo(sysUser.getId().longValue(), courseSchedule.getId());
             if(Objects.isNull(teacherAttendanceInfo)||Objects.isNull(teacherAttendanceInfo.getSignInStatus())){
@@ -185,6 +184,10 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
                     studentAttendanceInfo.setSignInTime(courseSchedule.getStartClassTime());
                     studentAttendanceInfo.setSignOutTime(courseSchedule.getEndClassTime());
                 }
+                if (studentAttendanceInfo.getStatus() == StudentAttendanceStatusEnum.LATE) {
+                    studentAttendanceInfo.setSignInTime(date);
+                    studentAttendanceInfo.setSignOutTime(courseSchedule.getEndClassTime());
+                }
                 studentAttendanceInfo.setNormalRemind(remindNum>0?1:0);
                 studentAttendanceDao.insert(studentAttendanceInfo);
             } else {
@@ -313,6 +316,9 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
         }
         studentAttendanceDao.addStudentAttendances(studentAttendances);
         List<StudentAttendance> allStudentAttendances = studentAttendanceDao.findByCourseId(studentAttendanceInfo.getCourseScheduleId());
+        if(!CollectionUtils.isEmpty(allStudentAttendances)){
+            allStudentAttendances = allStudentAttendances.stream().filter(e->e.getStatus() != null).collect(Collectors.toList());
+        }
         Map<StudentAttendanceStatusEnum, List<StudentAttendance>> studentAttendanceGroupByStatus = allStudentAttendances.stream().collect(Collectors.groupingBy(StudentAttendance::getStatus));
         Integer studentNum = studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.NORMAL) == null ? 0 : studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.NORMAL).size();
         Integer leaveStudentNum = studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.LEAVE) == null ? 0 : studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.LEAVE).size();

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

@@ -807,7 +807,9 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
                 } else {
                     studentCourseHomework.setVipFlag(true);
                 }
-                studentCourseHomework.setSubjectId(Integer.parseInt(student.getSubjectIdList()));
+                if (studentCourseHomework.getSubjectId() == null) {
+                    studentCourseHomework.setSubjectId(Integer.parseInt(student.getSubjectIdList()));
+                }
             }
         }
 
@@ -815,7 +817,7 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
         // 设置声部
 
         // 获取声部id集合
-        List<Integer> voicePartIds = students.stream().map(Student::getSubjectIdList).map(Integer::parseInt).collect(Collectors.toList());
+        List<Integer> voicePartIds = studentCourseHomeworkByCourse.stream().map(o -> o.getSubjectId()).collect(Collectors.toList());
 
         if (CollectionUtils.isEmpty(voicePartIds)) {
             return studentCourseHomeworkByCourse;

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

@@ -57,6 +57,7 @@ public class StudentLessonExaminationDetailServiceImpl extends ServiceImpl<Stude
                     studentLessonExaminationDetail.setMusicScoreId(vo.getMusicScoreId());
                     studentLessonExaminationDetail.setHeardLevel(vo.getHeardLevel());
                     studentLessonExaminationDetail.setStandardScore(vo.getScore());
+                    studentLessonExaminationDetail.setGroup(dto.getGroup());
                     if(i == 0){
                         studentLessonExaminationDetail.setAvgScore(score + subScore);
                     }else {

+ 29 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentLessonExaminationServiceImpl.java

@@ -5,18 +5,13 @@ import com.ym.mec.biz.dal.dao.LessonExaminationDao;
 import com.ym.mec.biz.dal.dao.StudentExtracurricularExercisesSituationDao;
 import com.ym.mec.biz.dal.dao.StudentLessonExaminationDao;
 import com.ym.mec.biz.dal.dao.StudentLessonExaminationDetailDao;
-import com.ym.mec.biz.dal.dto.LessonExaminationSubmitDto;
-import com.ym.mec.biz.dal.dto.StudentLessonExaminationDto;
-import com.ym.mec.biz.dal.dto.StudentLessonExaminationDto1;
-import com.ym.mec.biz.dal.dto.StudentLessonExaminationSaveDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.LessonExamination;
 import com.ym.mec.biz.dal.entity.StudentLessonExamination;
 import com.ym.mec.biz.dal.entity.StudentLessonExaminationDetail;
+import com.ym.mec.biz.dal.entity.StudentLessonTrainingDetail;
 import com.ym.mec.biz.dal.page.StudentLessonExaminationQueryInfo;
-import com.ym.mec.biz.service.LessonExaminationService;
-import com.ym.mec.biz.service.StudentExtracurricularExercisesSituationService;
-import com.ym.mec.biz.service.StudentLessonExaminationDetailService;
-import com.ym.mec.biz.service.StudentLessonExaminationService;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.util.collection.MapUtil;
@@ -28,6 +23,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 学生进度评测表(StudentLessonExamination)表服务实现类
@@ -45,8 +41,13 @@ public class StudentLessonExaminationServiceImpl extends ServiceImpl<StudentLess
     @Autowired
     private LessonExaminationDao lessonExaminationDao;
     @Autowired
+    private LessonExaminationService lessonExaminationService;
+    @Autowired
     private StudentExtracurricularExercisesSituationService studentExtracurricularExercisesSituationService;
 
+    @Autowired
+    private StudentLessonTrainingDetailService studentLessonTrainingDetailService;
+
     @Override
     public StudentLessonExaminationDao getDao() {
         return this.baseMapper;
@@ -69,6 +70,26 @@ public class StudentLessonExaminationServiceImpl extends ServiceImpl<StudentLess
                 studentLessonExaminations.add(studentLessonExamination);
             }
         }
+        LessonExamination examination = lessonExaminationService.getById(lessonExaminationId);
+
+        // 学生ID集合
+        Set<Integer> userIdList = studentLessonExaminations.stream()
+                .map(StudentLessonExamination::getUserId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+        // 设置声部
+        Map<Integer, StudentSubjectDto> subjectDtoMap = studentLessonTrainingDetailService
+                .getStudentMusicGroupSubject(new ArrayList<>(userIdList), examination.getMusicGroupId());
+
+        studentLessonExaminations.forEach(studentLessonTrainingDetail -> {
+            if (studentLessonTrainingDetail.getUserId() == null) {
+                return;
+            }
+            StudentSubjectDto studentSubjectDto = subjectDtoMap.get(studentLessonTrainingDetail.getUserId());
+            if (Objects.nonNull(studentSubjectDto)) {
+                studentLessonTrainingDetail.setSubjectId(studentSubjectDto.getSubjectId());
+            }
+        });
 
         baseMapper.insertBatch(studentLessonExaminations);
         return studentIdList;

+ 191 - 31
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentLessonTrainingDetailServiceImpl.java

@@ -2,25 +2,27 @@ package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ym.mec.biz.dal.dao.CourseHomeworkDao;
 import com.ym.mec.biz.dal.dao.StudentLessonTrainingDetailMapper;
 import com.ym.mec.biz.dal.dao.SubjectDao;
 import com.ym.mec.biz.dal.dao.SysMusicScoreDao;
+import com.ym.mec.biz.dal.dto.CourseHomeworkWrapper;
 import com.ym.mec.biz.dal.dto.StudentLessonTrainingDetailWrapper;
-import com.ym.mec.biz.dal.entity.StudentLessonTrainingDetail;
-import com.ym.mec.biz.dal.entity.Subject;
-import com.ym.mec.biz.dal.entity.SysMusicScore;
+import com.ym.mec.biz.dal.dto.StudentSubjectDto;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.ELessonTrainingType;
 import com.ym.mec.biz.dal.enums.StandardEnum;
+import com.ym.mec.biz.service.ExtracurricularExercisesService;
 import com.ym.mec.biz.service.StudentLessonTrainingDetailService;
+import com.ym.mec.biz.service.SubjectService;
 import lombok.extern.slf4j.Slf4j;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -38,25 +40,34 @@ public class StudentLessonTrainingDetailServiceImpl extends ServiceImpl<StudentL
     @Autowired
     private SubjectDao subjectDao;
 
-	/**
+    @Autowired
+    private CourseHomeworkDao courseHomeworkDao;
+
+    @Autowired
+    private SubjectService subjectService;
+
+    @Autowired
+    private ExtracurricularExercisesService extracurricularExercisesService;
+
+    /**
      * 查询详情
      * @param id 详情ID
      * @return StudentLessonTrainingDetail
      */
-	@Override
+    @Override
     public StudentLessonTrainingDetail detail(Long id) {
-        
+
         return baseMapper.selectById(id);
     }
-	
+
     /**
      * 添加
      * @param studentLessonTrainingDetail StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail
      * @return Boolean
      */
     @Override
-    public Boolean add(StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail studentLessonTrainingDetail) {    	
-        
+    public Boolean add(StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail studentLessonTrainingDetail) {
+
         return this.save(JSON.parseObject(studentLessonTrainingDetail.jsonString(), StudentLessonTrainingDetail.class));
     }
 
@@ -68,39 +79,42 @@ public class StudentLessonTrainingDetailServiceImpl extends ServiceImpl<StudentL
     @Override
     public Boolean update(StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail studentLessonTrainingDetail){
 
-        return this.updateById(JSON.parseObject(studentLessonTrainingDetail.jsonString(), StudentLessonTrainingDetail.class));       
+        return this.updateById(JSON.parseObject(studentLessonTrainingDetail.jsonString(), StudentLessonTrainingDetail.class));
     }
 
     /**
      * 将作业标准 转换为 需要的作业详情
      *
      * @param detailList 作业标准
-     * @param userIdList                   学生ID
+     * @param userIdList 学生ID
+     * @param group
      */
     @Override
-    public List<StudentLessonTrainingDetail> homeWorkDetail(List<StudentLessonTrainingDetailWrapper.AddStudentLessonTrainingDetail> detailList, List<Integer> userIdList,Long homeworkId,ELessonTrainingType type) {
+    public List<StudentLessonTrainingDetail> homeWorkDetail(List<StudentLessonTrainingDetailWrapper.AddStudentLessonTrainingDetail> detailList,
+                                                            List<Integer> userIdList, Long homeworkId, ELessonTrainingType type, Integer group) {
         log.info("将作业标准 转换为 需要的作业详情 {},{}", detailList, userIdList);
         // 保存作业标准
         if (CollectionUtils.isEmpty(detailList) || CollectionUtils.isEmpty(userIdList)) {
             return new ArrayList<>();
         }
+        if (group == null) {
+            group = 1;
+        }
 
         List<StudentLessonTrainingDetail> result = new ArrayList<>();
 
-        if (!CollectionUtils.isEmpty(detailList)) {
-            List<StudentLessonTrainingDetail> details = JSON.parseArray(
+        List<StudentLessonTrainingDetail> details = JSON.parseArray(
+            JSON.toJSONString(detailList), StudentLessonTrainingDetail.class);
+        result.addAll(details);
+        // 根据声部添加学生作业详情
+        userIdList.forEach(userId -> {
+            List<StudentLessonTrainingDetail> detailsUser = JSON.parseArray(
                 JSON.toJSONString(detailList), StudentLessonTrainingDetail.class);
-            result.addAll(details);
-            // 根据声部添加学生作业详情
-            userIdList.forEach(userId -> {
-                List<StudentLessonTrainingDetail> detailsUser = JSON.parseArray(
-                    JSON.toJSONString(detailList), StudentLessonTrainingDetail.class);
-                for (StudentLessonTrainingDetail studentLessonTrainingDetail : detailsUser) {
-                    studentLessonTrainingDetail.setUserId(userId.longValue());
-                }
-                result.addAll(detailsUser);
-            });
-        }
+            for (StudentLessonTrainingDetail studentLessonTrainingDetail : detailsUser) {
+                studentLessonTrainingDetail.setUserId(userId.longValue());
+            }
+            result.addAll(detailsUser);
+        });
         for (StudentLessonTrainingDetail studentLessonTrainingDetail : result) {
 
             studentLessonTrainingDetail.setCourseHomeworkId(homeworkId);
@@ -108,6 +122,7 @@ public class StudentLessonTrainingDetailServiceImpl extends ServiceImpl<StudentL
             studentLessonTrainingDetail.setTrainingStatus(StandardEnum.NOT_START);
             studentLessonTrainingDetail.setCreateTime(new Date());
             studentLessonTrainingDetail.setUpdateTime(new Date());
+            studentLessonTrainingDetail.setGroup(group);
             studentLessonTrainingDetail.setType(type);
 
         }
@@ -135,8 +150,7 @@ public class StudentLessonTrainingDetailServiceImpl extends ServiceImpl<StudentL
     @Override
     public List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> getBaseLessonTrainingDetail(Long courseHomeworkId, ELessonTrainingType type, Long userId) {
         List<StudentLessonTrainingDetail> list = this.lambdaQuery()
-                                                     .eq(StudentLessonTrainingDetail::getCourseHomeworkId,
-                                                         courseHomeworkId)
+                                                     .eq(StudentLessonTrainingDetail::getCourseHomeworkId,courseHomeworkId)
                                                      .isNull(userId == null,StudentLessonTrainingDetail::getUserId)
                                                      .eq(StudentLessonTrainingDetail::getType, type)
                                                      .eq(userId != null, StudentLessonTrainingDetail::getUserId, userId)
@@ -196,4 +210,150 @@ public class StudentLessonTrainingDetailServiceImpl extends ServiceImpl<StudentL
 
         return studentLessonTrainingDetails;
     }
+
+
+    /**
+     * 查询作业详情练习组
+     *
+     * @param courseHomeworkId 作业ID
+     * @param trainingType 作业类型
+     */
+    @Override
+    public List<CourseHomeworkWrapper.StudentLessonTrainingStat> getLessonTrainingStat(Long courseHomeworkId, ELessonTrainingType trainingType) {
+        List<StudentLessonTrainingDetail> list = this.lambdaQuery()
+                                                     .eq(StudentLessonTrainingDetail::getCourseHomeworkId,courseHomeworkId)
+                                                     .eq(StudentLessonTrainingDetail::getType, trainingType)
+                                                    .isNotNull(StudentLessonTrainingDetail::getUserId)
+                                                     .list();
+        if (CollectionUtils.isEmpty(list)) {
+            return new ArrayList<>();
+        }
+
+        // 用户ID集合
+        List<Integer> userIdList = list.stream()
+                                    .map(StudentLessonTrainingDetail::getUserId)
+                                    .filter(Objects::nonNull)
+                                    .distinct()
+                                    .map(Long::intValue)
+                                    .collect(Collectors.toList());
+        String musicGroupId = null;
+        if (trainingType.equals(ELessonTrainingType.HOMEWORK)) {
+            CourseHomework courseHomework = courseHomeworkDao.get(courseHomeworkId);
+            if (courseHomework == null) {
+                return new ArrayList<>();
+            }
+            musicGroupId = courseHomework.getMusicGroupId();
+        } else {
+            ExtracurricularExercises exercises = extracurricularExercisesService.get(courseHomeworkId);
+            if (exercises == null) {
+                return new ArrayList<>();
+            }
+            musicGroupId = exercises.getMusicGroupId();
+        }
+
+        Map<Integer, StudentSubjectDto> studentSubjectDtoMap = getStudentMusicGroupSubject(userIdList, musicGroupId);
+
+        // 根据group 分组
+        Map<Integer, List<StudentLessonTrainingDetail>> groupMap = list.stream()
+                                                                           .collect(Collectors.groupingBy(StudentLessonTrainingDetail::getGroup));
+
+
+        Map<Integer, List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail>> groupDetailMap = getGroupMap(courseHomeworkId, trainingType);
+
+
+        List<CourseHomeworkWrapper.StudentLessonTrainingStat> studentLessonTrainingStats = new ArrayList<>();
+
+        // 根据分组数据统计声部, 完成人数
+        groupMap.forEach((k,v) -> {
+            CourseHomeworkWrapper.StudentLessonTrainingStat studentLessonTrainingStat = new CourseHomeworkWrapper.StudentLessonTrainingStat();
+            studentLessonTrainingStat.setGroup(k);
+            Set<Integer> userIds = v.stream().map(o -> o.getUserId().intValue()).collect(Collectors.toSet());
+            // 课后作业和课外作业查询学生在当前乐团声部
+            Set<String> subjectNameList = new HashSet<>();
+            if(!CollectionUtils.isEmpty(userIds)) {
+                for (Integer userId : userIds) {
+                    StudentSubjectDto studentSubjectDto = studentSubjectDtoMap.get(userId);
+                    if (studentSubjectDto != null) {
+                        subjectNameList.add(studentSubjectDto.getSubjectName());
+                    }
+                }
+            }
+            // 按人分组
+            Map<Long, List<StudentLessonTrainingDetail>> userMap = v.stream()
+                                                                    .collect(Collectors.groupingBy(StudentLessonTrainingDetail::getUserId));
+            int submitNum = 0;
+            int passNum = 0;
+            for (Map.Entry<Long, List<StudentLessonTrainingDetail>> entry : userMap.entrySet()) {
+                List<StudentLessonTrainingDetail> v1 = entry.getValue();
+                Set<StandardEnum> standardEnumSet = v1.stream().map(o -> o.getTrainingStatus()).filter(Objects::nonNull).collect(Collectors.toSet());
+                if (standardEnumSet.size() > 1 || standardEnumSet.contains(StandardEnum.NOT_STANDARD)) {
+                    submitNum++;
+                }  else {
+                    if (standardEnumSet.contains(StandardEnum.STANDARD)) {
+                        submitNum++;
+                        passNum++;
+                    }
+                }
+
+            }
+
+            studentLessonTrainingStat.setSubjectName(subjectNameList.stream().collect(Collectors.joining(",")));
+            studentLessonTrainingStat.setStudentNum(userIds.size());
+            studentLessonTrainingStat.setShouldSubmitNum(userIds.size());
+            studentLessonTrainingStat.setSubmitNum(submitNum);
+            studentLessonTrainingStat.setPassNum(passNum);
+
+            //设置基本作业内容
+            List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> studentLessonTrainingDetails = groupDetailMap.get(k);
+            if (!CollectionUtils.isEmpty(studentLessonTrainingDetails)) {
+                studentLessonTrainingStat.setTrainingDetailList(studentLessonTrainingDetails);
+            }
+            studentLessonTrainingStats.add(studentLessonTrainingStat);
+
+        });
+
+
+        return studentLessonTrainingStats;
+    }
+
+    @NotNull
+    @Override
+    public Map<Integer, StudentSubjectDto> getStudentMusicGroupSubject(List<Integer> userIdList, String musicGroupId) {
+        // 课后作业和课外作业查询学生在当前乐团声部
+        Map<Integer, StudentSubjectDto> studentSubjectDtoMap = new HashMap<>();
+        if (!StringUtils.isEmpty(musicGroupId)) {
+            List<StudentRegistration> registerSubject = subjectDao.getRegisterSubject(musicGroupId, userIdList);
+            if (!CollectionUtils.isEmpty(registerSubject)) {
+                registerSubject.forEach(o -> {
+                    StudentSubjectDto studentSubjectDto = new StudentSubjectDto();
+                    studentSubjectDto.setSubjectId(o.getActualSubjectId());
+                    studentSubjectDto.setSubjectName(o.getSubjectName());
+                    studentSubjectDto.setStudentId(o.getUserId());
+                    studentSubjectDtoMap.put(o.getUserId(), studentSubjectDto);
+                });
+            }
+        }
+
+        // 额外作业查询学生声部
+        Map<Integer, StudentSubjectDto> subjectDtoMap = subjectService.getSubjectByStudentId(new HashSet(userIdList));
+        subjectDtoMap.forEach((k,v) -> {
+            if (!studentSubjectDtoMap.containsKey(k)) {
+                studentSubjectDtoMap.put(k, v);
+            }
+        });
+        return studentSubjectDtoMap;
+    }
+
+    @NotNull
+    @Override
+    public Map<Integer, List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail>> getGroupMap(Long courseHomeworkId, ELessonTrainingType trainingType) {
+        // 作业内容
+        List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> baseLessonTrainingDetail = getBaseLessonTrainingDetail(
+                courseHomeworkId, trainingType);
+
+        // 按组分组
+        Map<Integer, List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail>> groupDetailMap = baseLessonTrainingDetail.stream()
+                                .collect(Collectors.groupingBy(StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail::getGroup,LinkedHashMap::new,Collectors.toList()));
+        return groupDetailMap;
+    }
 }

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

@@ -898,7 +898,7 @@ public class StudentManageServiceImpl implements StudentManageService {
         Map<String, Integer> sum = new HashMap<>(7);
         Integer studentNum = scheduleStudentPaymentDao.countStudentNum(courseScheduleId);
         sum.put("studentNum", studentNum);
-        Integer signInNum = studentManageDao.countStudentSignInNum(courseScheduleId, "NORMAL");
+        Integer signInNum = studentManageDao.countStudentSignInNum(courseScheduleId, "NORMAL,LATE");
         sum.put("signInNum", signInNum);
         Integer leaveNum = studentManageDao.countStudentSignInNum(courseScheduleId, "LEAVE");
         sum.put("leaveNum", leaveNum);

+ 6 - 10
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java

@@ -818,8 +818,6 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         if (Objects.nonNull(couponPayParam) && Objects.nonNull(couponPayParam.getCouponTypeInfo())) {
             //如果买乐器送课,那么就是0元买课,那么就先剔除送的课程再算优惠券,但是写入数据流水要加上
             List<StudentPaymentOrderDetail> collect = new ArrayList<>();
-            //按OrderDetailTypeEnum类型 进行聚合分组
-            Map<OrderDetailTypeEnum, List<StudentPaymentOrderDetail>> orderDetailGroupList;
             BigDecimal freeNewCourse = BigDecimal.ZERO;
             //如果送课 并且 课程不为空,那么就是0元买课
             if (goodsDto.isRemitCourseRFeeFlag() && CollectionUtils.isNotEmpty(newCourses)) {
@@ -833,17 +831,14 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                         .filter(a -> newCourseType.contains(a.getType().getCode()))
                         .map(StudentPaymentOrderDetail::getRemitFee)
                         .reduce(BigDecimal.ZERO, BigDecimal::add);
-                orderDetailGroupList =
-                        WrapperUtil.groupList(collect, StudentPaymentOrderDetail::getType);
             } else {
-                orderDetailGroupList =
-                        WrapperUtil.groupList(studentPaymentOrderDetailList, StudentPaymentOrderDetail::getType);
+                collect = studentPaymentOrderDetailList;
             }
 
             //获取本次交易中各优惠券的使用信息
             Map<String, CouponPayTypeInfo> couponParam = couponPayParam.getCouponTypeInfo();
             //计算使用优惠券后的对应的商品应该均摊的金额
-            calculateCoupon(couponParam, orderDetailGroupList);
+            calculateCoupon(couponParam, collect);
             //获取使用了优惠券之后的总金额
             BigDecimal useCouponAmount = WrapperUtil.sumList(studentPaymentOrderDetailList, StudentPaymentOrderDetail::getRemitFee);
             //赋值
@@ -991,14 +986,15 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
      * @param couponParam          优惠券的信息
      * @param orderDetailGroupList 订单信息
      */
-    private void calculateCoupon(Map<String, CouponPayTypeInfo> couponParam,
-                                 Map<OrderDetailTypeEnum, List<StudentPaymentOrderDetail>> orderDetailGroupList) {
+    private void calculateCoupon(Map<String, CouponPayTypeInfo> couponParam,List<StudentPaymentOrderDetail> paymentOrderDetails) {
         List<StudentPaymentOrderDetail> singleTypeList = new ArrayList<>();
         List<StudentPaymentOrderDetail> allTypeList = new ArrayList<>();
+        paymentOrderDetails.forEach(e->e.setCouponDetailTypeEnum(CouponDetailTypeEnum.valueOf(CouponDetailTypeEnum.of(e.getType().getCode()))));
+        Map<CouponDetailTypeEnum, List<StudentPaymentOrderDetail>> orderDetailGroupList = paymentOrderDetails.stream().collect(Collectors.groupingBy(e -> e.getCouponDetailTypeEnum()));
         //先处理”非全类型券“的数据
         orderDetailGroupList.forEach((e, list) -> {
             //根据OrderDetailTypeEnum类型找到对应的券类型,默认全类型
-            String couponDetailCode = CouponDetailTypeEnum.of(e.getCode());
+            String couponDetailCode = e.getCode();
             //获取本次支付中该类型优惠券的详情,如果该商品没有找到本次支付时选择的优惠券则当作全类型
             CouponPayTypeInfo couponPayTypeInfo = couponParam.get(couponDetailCode);
             //全类型券数据后面处理

+ 157 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentVisitServiceImpl.java

@@ -1,15 +1,15 @@
 package com.ym.mec.biz.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.dto.BasicUserDto;
-import com.ym.mec.biz.dal.dto.StudentPreVisitDto;
-import com.ym.mec.biz.dal.dto.StudentVisitDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.dal.enums.YesOrNoEnum;
+import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.StudentPreVisitQueryInfo;
 import com.ym.mec.biz.dal.page.StudentVisitQueryInfo;
 import com.ym.mec.biz.service.StudentVisitService;
+import com.ym.mec.biz.service.SysUserService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
@@ -17,10 +17,17 @@ import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
+import com.ym.mec.util.excel.POIUtil;
+import com.ym.mec.util.ini.IniFileUtil;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.ClassPathResource;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -45,6 +52,8 @@ public class StudentVisitServiceImpl extends BaseServiceImpl<Integer, StudentVis
     private StudentAttendanceDao studentAttendanceDao;
     @Autowired
     private StudentOperatingVisitDao studentOperatingVisitDao;
+    @Autowired
+    private SysUserService sysUserService;
 
 
     @Override
@@ -96,6 +105,52 @@ public class StudentVisitServiceImpl extends BaseServiceImpl<Integer, StudentVis
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void batchAddVisit(List<StudentVisit> studentVisit) {
+        Integer userId = sysUserService.getUserId();
+        StudentVisit.VisiterTypeEnum visitType = StudentVisit.VisiterTypeEnum.EDU_TEACHER;
+        Map<String, List<StudentVisit>> musicMap = studentVisit.stream().collect(Collectors.groupingBy(e -> e.getMusicGroupId()));
+        for (String musicGroupId : musicMap.keySet()) {
+            MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+            if(musicGroup.getStatus() != MusicGroupStatusEnum.PAY){
+                throw new BizException("当前乐团状态无需批量回访");
+            }
+            List<StudentVisit> studentVisits = musicMap.get(musicGroupId);
+            List<Integer> studentIds = studentVisits.stream().map(e -> e.getStudentId()).collect(Collectors.toList());
+            List<SimpleUserDto> userDtos = teacherDao.getUsersSimpleInfo(studentIds);
+            Date now = new Date();
+            Map<Integer, SimpleUserDto> userDtoMap = userDtos.stream().collect(Collectors.groupingBy(e -> e.getUserId(), Collectors.collectingAndThen(Collectors.toList(), v -> v.get(0))));
+            Map<String,List<Integer>> visitMap = new HashMap<>();
+            for (StudentVisit visit : studentVisits) {
+                visit.setType("其它");
+                visit.setPurpose("其它");
+                visit.setTeacherId(userId);
+                visit.setVisiterType(visitType);
+                SimpleUserDto userDto = userDtoMap.get(visit.getStudentId());
+                if (Objects.isNull(userDto)){
+                    throw new BizException("学员编号{}用户信息不存在",visit.getStudentId());
+                }
+                visit.setOrganId(Integer.parseInt(userDto.getOrganIds()));
+                visit.setCreateTime(now);
+                String month = DateUtil.format(visit.getVisitTime(), DateUtil.ISO_YEAR_MONTH_FORMAT);
+                List<Integer> userIds;
+                if(visitMap.containsKey(month)){
+                    userIds = visitMap.get(month);
+                }else {
+                    userIds = new ArrayList<>();
+                }
+                userIds.add(visit.getStudentId());
+                visitMap.put(month,userIds);
+            }
+            studentVisitDao.batchInsert(studentVisits);
+            //更新学员回访统计数据
+            for (String month : visitMap.keySet()) {
+                studentOperatingVisitDao.batchUpdateVisit(visitMap.get(month),month);
+            }
+        }
+    }
+
+    @Override
     public StudentVisitDto getInfo(Integer id) {
         return studentVisitDao.getInfo(id);
     }
@@ -185,4 +240,102 @@ public class StudentVisitServiceImpl extends BaseServiceImpl<Integer, StudentVis
         pageInfo.setRows(dataList);
         return pageInfo;
     }
+
+    @Override
+    public List<String> importMusicVisit(MultipartFile file) throws Exception{
+        Map<String, List<Map<String, Object>>> sheetsListMap = POIUtil.importExcel(new ByteArrayInputStream(file.getBytes()), 2, file.getOriginalFilename());
+        InputStream inputStream = new ClassPathResource("columnMapper.ini").getInputStream();
+        Map<String, String> columns = IniFileUtil.readIniFile(inputStream, TemplateTypeEnum.PAYMENT_MUSIC_VISIT_IMPORT.getMsg());
+        List<StudentVisit> importDtos = new ArrayList<>();
+        List<String> errMsg = new ArrayList();
+        StringBuffer sb = new StringBuffer();
+        for (String sheetName : sheetsListMap.keySet()) {
+            List<Map<String, Object>> sheet = sheetsListMap.get(sheetName);
+            for (int i = 0; i < sheet.size(); i++) {
+                int rowNum = i + 2;
+                Map<String, Object> row = sheet.get(i);
+                if (row.size() == 0) {
+                    continue;
+                }
+                JSONObject objectMap = new JSONObject();
+                valueIsNull: for (String s : row.keySet()) {
+                    String columnValue = columns.get(s);
+                    if (columnValue.equals("musicGroupId")) {
+                        if (StringUtils.isEmpty(row.get(s).toString())) {
+                            sb.append("第" + rowNum).append("行数据导入失败:乐团编号不可为空;");
+                            continue valueIsNull;
+                        } else {
+                            objectMap.put(columnValue, row.get(s));
+                        }
+                    } else if (columnValue.equals("phone")) {
+                        if (StringUtils.isEmpty(row.get(s).toString())) {
+                            sb.append("第" + rowNum).append("行数据导入失败:学员手机号不可为空;");
+                            continue valueIsNull;
+                        } else {
+                            objectMap.put(columnValue, row.get(s));
+                        }
+                    } else if (columnValue.equals("visitTime")) {
+                        if (StringUtils.isEmpty(row.get(s).toString())) {
+                            sb.append("第" + rowNum).append("行数据导入失败:回访日期不可为空;");
+                            continue valueIsNull;
+                        } else {
+                            objectMap.put(columnValue, row.get(s));
+                        }
+                    } else if (columnValue.equals("overview")) {
+                        if (StringUtils.isEmpty(row.get(s).toString())) {
+                            sb.append("第" + rowNum).append("行数据导入失败:学员情况不可为空;");
+                            continue valueIsNull;
+                        } else {
+                            objectMap.put(columnValue, row.get(s));
+                        }
+                    } else if (columnValue.equals("feedback")) {
+                        if (StringUtils.isEmpty(row.get(s).toString())) {
+                            sb.append("第" + rowNum).append("行数据导入失败:家长反馈不可为空;");
+                            continue valueIsNull;
+                        } else {
+                            objectMap.put(columnValue, row.get(s));
+                        }
+                    } else if (columnValue.equals("probStatus")) {
+                        if (StringUtils.isEmpty(row.get(s).toString())) {
+                            sb.append("第" + rowNum).append("行数据导入失败:问题状态不可为空;");
+                            continue valueIsNull;
+                        } else {
+                            if ("已解决".equals(row.get(s).toString())) {
+                                objectMap.put(columnValue, 1);
+                            }
+                        }
+                    }
+                }
+                try {
+                    StudentVisit cost = JSONObject.parseObject(objectMap.toJSONString(), StudentVisit.class);
+                    SysUser user = teacherDao.getUserWithPhone(cost.getPhone());
+                    if(Objects.isNull(user) || !user.getUserType().contains("STUDENT")){
+                        throw new BizException("手机号{}不存在",cost.getPhone());
+                    }
+                    cost.setStudentId(user.getId());
+                    StudentRegistration studentRegistration = studentRegistrationDao.getStudentRegister(cost.getMusicGroupId(),cost.getStudentId());
+                    if(Objects.isNull(studentRegistration)){
+                        throw new BizException("学员{}不在乐团{}中,无需回访",cost.getStudentId(),cost.getMusicGroupId());
+                    }
+                    if(studentRegistration.getMusicGroupStatus() != StudentMusicGroupStatusEnum.APPLY){
+                        throw new BizException("学员{}已缴费无需回访",studentRegistration.getUserId());
+                    }
+                    Integer visitStudent = studentVisitDao.getMusicVisitStudent(studentRegistration.getMusicGroupId(), studentRegistration.getUserId());
+                    if(Objects.nonNull(visitStudent)){
+                        throw new BizException("学员{}已回访",visitStudent);
+                    }
+                    importDtos.add(cost);
+                } catch (Exception ex) {
+                    throw new BizException("导入数据出错", ex);
+                }
+            }
+        }
+        if (!org.springframework.util.CollectionUtils.isEmpty(errMsg)) {
+            return errMsg;
+        }
+        if(!org.springframework.util.CollectionUtils.isEmpty(importDtos)){
+            this.batchAddVisit(importDtos);
+        }
+        return null;
+    }
 }

+ 22 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java

@@ -1,6 +1,5 @@
 package com.ym.mec.biz.service.impl;
 
-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;
@@ -37,10 +36,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.math.BigDecimal;
-import java.time.LocalDate;
 import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -429,7 +425,8 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
                                 studentLessonTrainingDetail.setSubjectId(scoreSubjectDto.getSubjectId());
                             }
                             studentLessonTrainingDetails.addAll(studentLessonTrainingDetailService
-                                                                    .homeWorkDetail(scoreSubjectDto.getStudentLessonTrainingDetails(), userIdList,courseHomework.getId(),ELessonTrainingType.HOMEWORK));
+                                                                    .homeWorkDetail(scoreSubjectDto.getStudentLessonTrainingDetails(), userIdList,
+                                                                            courseHomework.getId(),ELessonTrainingType.HOMEWORK, scoreSubjectDto.getGroup()));
 
 						}
 					}else {
@@ -443,7 +440,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
                                                                       .map(StudentCourseHomework::getUserId)
                                                                       .collect(Collectors.toList());
                         studentLessonTrainingDetails.addAll(studentLessonTrainingDetailService
-                                                                .homeWorkDetail(courseHomeworkInfo.getStudentLessonTrainingDetails(), userIdList,courseHomework.getId(),ELessonTrainingType.HOMEWORK));
+                                                                .homeWorkDetail(courseHomeworkInfo.getStudentLessonTrainingDetails(), userIdList,courseHomework.getId(),ELessonTrainingType.HOMEWORK,null));
 
 					}
 					if(CollectionUtils.isEmpty(studentCourseHomeworks)){
@@ -509,6 +506,25 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 						}
 					}
                     if (!CollectionUtils.isEmpty(studentLessonTrainingDetails)) {
+                        // 学生ID集合
+                        Set<Integer> userIdList = studentLessonTrainingDetails.stream()
+                                                                              .map(StudentLessonTrainingDetail::getUserId)
+                                                                                .filter(Objects::nonNull)
+                                                                                .map(Long::intValue)
+                                                                              .collect(Collectors.toSet());
+                        // 设置声部
+                        Map<Integer, StudentSubjectDto> subjectDtoMap = studentLessonTrainingDetailService
+                                .getStudentMusicGroupSubject(new ArrayList<>(userIdList), classGroup.getMusicGroupId());
+
+                        studentLessonTrainingDetails.forEach(studentLessonTrainingDetail -> {
+                            if (studentLessonTrainingDetail.getUserId() == null) {
+                                return;
+                            }
+                            StudentSubjectDto studentSubjectDto = subjectDtoMap.get(studentLessonTrainingDetail.getUserId().intValue());
+                            if (Objects.nonNull(studentSubjectDto)) {
+                                studentLessonTrainingDetail.setSubjectId(studentSubjectDto.getSubjectId().longValue());
+                            }
+                        });
                         studentLessonTrainingDetailService.saveBatch(studentLessonTrainingDetails);
                     }
 				}else{

+ 150 - 84
mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java

@@ -6,6 +6,9 @@ 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.microsvc.toolkit.middleware.live.LivePluginContext;
+import com.microsvc.toolkit.middleware.live.LivePluginService;
+import com.microsvc.toolkit.middleware.live.message.LiveRoomMessage;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.VipGroupClassGroupMapper;
@@ -187,6 +190,8 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
     @Autowired
     private ImLiveBroadcastRoomService imLiveBroadcastRoomService;
+    @Autowired
+    private LivePluginContext livePluginContext;
 
     @Autowired
     private StudentService studentService;
@@ -368,8 +373,8 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         vipGroupApplyBaseInfoDto.setName(vipGroup.getLiveBroadcastRoom().getRoomTitle());
         vipGroupApplyBaseInfoDto.setSubjectId(Integer.parseInt(vipGroup.getLiveBroadcastRoom().getSubjectId()));
         if (CourseSchedule.CourseScheduleType.LIVE.getCode().equals(groupType)) {
-            vipGroupApplyBaseInfoDto.setTotalPrice(vipGroupApplyBaseInfoDto.getOnlineClassesUnitPrice().multiply(new BigDecimal(vipGroupApplyBaseInfoDto.getOnlineClassesNum())));
-            vipGroupApplyBaseInfoDto.setOriginalTotalPrice(vipGroupApplyBaseInfoDto.getOfflineClassesUnitPrice().multiply(new BigDecimal(vipGroupApplyBaseInfoDto.getOnlineClassesNum())));
+            vipGroupApplyBaseInfoDto.setTotalPrice(vipGroupApplyBaseInfoDto.getOnlineClassesUnitPrice().multiply(new BigDecimal(vipGroupApplyBaseInfoDto.getOnlineClassesNum())).setScale(0, BigDecimal.ROUND_CEILING));
+            vipGroupApplyBaseInfoDto.setOriginalTotalPrice(vipGroupApplyBaseInfoDto.getOfflineClassesUnitPrice().multiply(new BigDecimal(vipGroupApplyBaseInfoDto.getOnlineClassesNum())).setScale(0, BigDecimal.ROUND_CEILING));
         }
         vipGroupApplyBaseInfoDto.setPaymentExpireDate(DateUtil.getLastSecondWithDay(vipGroupApplyBaseInfoDto.getPaymentExpireDate()));
 
@@ -627,8 +632,8 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
             // 计算老师课薪
             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())));
+            costInfo.put("totalPrice",vipGroupApplyBaseInfoDto.getOnlineClassesUnitPrice().multiply(new BigDecimal(vipGroupApplyBaseInfoDto.getOnlineClassesNum())).setScale(0, BigDecimal.ROUND_CEILING));
+            costInfo.put("originalTotalPrice",vipGroupApplyBaseInfoDto.getOfflineClassesUnitPrice().multiply(new BigDecimal(vipGroupApplyBaseInfoDto.getOnlineClassesNum())).setScale(0, BigDecimal.ROUND_CEILING));
         }
 
         vipGroupApplyBaseInfoDto.setAuditStatus(AuditStatusEnum.PASS);
@@ -3196,31 +3201,76 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
             classStudentMapperByUserIdAndClassGroupId.setStatus(ClassGroupStudentStatusEnum.QUIT);
             classGroupStudentMapperDao.update(classStudentMapperByUserIdAndClassGroupId);
             studentPauseInfoDao.deleteUserPauseInfoWithGroup(groupType, vipGroupId.toString(), studentId);
-
-            classGroup.setStudentNum(classGroup.getStudentNum() - 1);
-            classGroupDao.update(classGroup);
+            classGroupDao.modifyStudentNum(classGroup.getId(),-1);
             return;
         }
 
-
         classStudentMapperByUserIdAndClassGroupId.setStatus(ClassGroupStudentStatusEnum.QUIT);
         classGroupStudentMapperDao.update(classStudentMapperByUserIdAndClassGroupId);
-
-        courseScheduleService.batchDeleteMusicGroupCourseWithStudent(vipGroupId.toString(), studentId, groupType);
-
-        List<Integer> studentPaymentIds = courseScheduleStudentPaymentDao.findNotStartCourseStudentPaymentIdsWithClassGroupAndStudent(classGroup.getId(), studentId);
-        if (!CollectionUtils.isEmpty(studentPaymentIds)) {
-            courseScheduleStudentPaymentDao.batchDeleteWithID(studentPaymentIds);
+        List<CourseSchedule> musicGroupCourseSchedules = courseScheduleDao.findMusicGroupCourseSchedulesWithStudent(vipGroupId.toString(), groupType.getCode(), CourseStatusEnum.NOT_START.getCode(), studentId);
+        if (!org.apache.commons.collections.CollectionUtils.isEmpty(musicGroupCourseSchedules)) {
+            List<Long> courseScheduleIds = musicGroupCourseSchedules.stream()
+                    .map(courseSchedule -> courseSchedule.getId())
+                    .collect(Collectors.toList());
+            courseScheduleDao.deleteMusicGroupCourseSchedulesWithStudent(courseScheduleIds, studentId);
+            studentAttendanceDao.deleteByCourseAndUser(courseScheduleIds,studentId);
+            /*if(groupType == LIVE){
+                List<CourseScheduleStudentPayment> studentPayments = courseScheduleStudentPaymentDao.findByCourseScheduleIds(courseScheduleIds);
+                Map<Long, Integer> courseStudentNumMap = studentPayments.stream().filter(e -> e.getJoinCourseType() == JoinCourseType.PURCHASE)
+                        .collect(Collectors.groupingBy(e -> e.getCourseScheduleId(), Collectors.collectingAndThen(Collectors.toList(), v -> v.size())));
+                for (CourseSchedule schedule : musicGroupCourseSchedules) {
+                    if(StringUtils.isEmpty(schedule.getLiveRoomId())){
+                        continue;
+                    }
+                    ImLiveBroadcastRoom liveRoom = imLiveBroadcastRoomService.getByRoomUid(schedule.getLiveRoomId());
+                    if (Objects.isNull(liveRoom)) {
+                        continue;
+                    }
+                    Integer studentNum = courseStudentNumMap.get(schedule.getId());
+                    //如果还有学生,那么之发送给退学学员
+                    try {
+                        LivePluginService pluginService = livePluginContext.getPluginService(liveRoom.getServiceProvider());
+                        // 发送用户信息
+                        LiveRoomMessage.MessageUser messageUser = LiveRoomMessage.MessageUser.builder()
+                                .sendUserId("")
+                                .sendUserName("")
+                                .avatarUrl("")
+                                .build();
+
+                        LiveRoomMessage message = new LiveRoomMessage();
+                        message.setIsIncludeSender(1);
+                        message.setFromUserId(studentId.toString());
+                        message.setToChatRoomId(schedule.getLiveRoomId());
+                        message.setObjectName(LiveRoomMessage.LIVE_STATUS_CHANGE);
+                        message.setContent(LiveRoomMessage.MessageContent.builder()
+                                .reason("您的退学申请已处理,点击退出直播间")
+                                .targetIds(Lists.newArrayList())
+                                .sendUserInfo(messageUser).build());
+                        if(studentNum == null || studentNum == 0){
+                            LiveRoomMessage message1 = new LiveRoomMessage();
+                            message1.setIsIncludeSender(1);
+                            message1.setFromUserId(schedule.getActualTeacherId().toString());
+                            message1.setToChatRoomId(schedule.getLiveRoomId());
+                            message1.setObjectName(LiveRoomMessage.LIVE_STATUS_CHANGE);
+                            message1.setContent(LiveRoomMessage.MessageContent.builder()
+                                    .reason("课程信息已变更")
+                                    .targetIds(Lists.newArrayList())
+                                    .sendUserInfo(messageUser).build());
+                            pluginService.sendChatRoomMessage(message1);
+                        }
+                        pluginService.sendChatRoomMessage(message);
+                    } catch (Exception e) {
+                        log.error("liveRoom error", e);
+                    }
+                }
+            }*/
         }
 
         if (!vipGroup.getStatus().equals(VipGroupStatusEnum.APPLYING) || (Objects.nonNull(vipGroupCategory) && vipGroupCategory.getMusicTheory())) {
             courseScheduleTeacherSalaryService.updateVipGroupCourseTeacherSalary(vipGroupId.intValue(), vipGroup.getUserId());
         }
 
-        classGroup.setStudentNum(classGroup.getStudentNum() - 1);
-
-        classGroupDao.update(classGroup);
-
+        classGroupDao.modifyStudentNum(classGroup.getId(),-1);
         //学员退出班级群
         imGroupMemberService.quit(classGroup.getId().toString(), studentId);
     }
@@ -4741,10 +4791,12 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         MapUtil.populateMap(params, queryInfo);
         // VIP小课
         List<StudentVipGroupShowListDto> vipGroups = vipGroupDao.findVipGroups(params);
-        // 直播课
-        vipGroups.addAll(vipGroupDao.findLiveGroups(params));
         // 网课
         vipGroups.addAll(practiceGroupService.findPracticeGroups(params));
+        Student student = studentDao.get(queryInfo.getUserId());
+        // 直播课
+        params.put("subjectId",student.getSubjectIdList());
+        vipGroups.addAll(vipGroupDao.findLiveGroups(params));
         // 删除返回null值数据
         vipGroups.removeAll(Collections.singleton(null));
         // 按照创建时间倒序
@@ -4886,7 +4938,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         Map<Integer, List<StudentApplyRefunds>> studentApplyRefundsMap = applyRefunds.stream()
                 .collect(Collectors.groupingBy(StudentApplyRefunds::getUserId));
         records.forEach(data -> {
-            ClassGroupStudentMapper classGroupStudentMapper = studentMapperMap.get(data.getStudentId().intValue());
+            ClassGroupStudentMapper classGroupStudentMapper = studentMapperMap.get(data.getStudentId());
             if (Objects.isNull(classGroupStudentMapper)) {
                 data.setStudentStatus(0);
                 return;
@@ -4899,7 +4951,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
                 return;
             }
 
-            List<StudentApplyRefunds> studentApplyRefunds = studentApplyRefundsMap.get(data.getStudentId().intValue());
+            List<StudentApplyRefunds> studentApplyRefunds = studentApplyRefundsMap.get(data.getStudentId());
             if (!CollectionUtils.isEmpty(studentApplyRefunds)) {
                 StudentApplyRefunds studentApplyRefund = studentApplyRefunds.get(0);
                 if (data.getStudentStatus() == 0 && studentApplyRefund.getStatus().equals(StudentApplyRefundsStatus.ING)) {
@@ -4932,11 +4984,6 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
             courseSchedules.forEach(next->next.setShareMode(ShareModeEnum.NO_SHARE));
         } else {
             courseSchedules =  courseScheduleDao.findGroupCourseSchedules(vipGroup.getId().toString(), GroupType.LIVE.getCode());
-            if (CollectionUtils.isEmpty(courseSchedules)) {
-                courseSchedules =  JSON.parseArray(vipGroup.getCourseSchedulesJson(), CourseSchedule.class);
-                // 报名中的课程默认未分享,不能修改
-                courseSchedules.forEach(next->next.setShareMode(ShareModeEnum.NO_SHARE));
-            }
         }
         // 添加共享方式过滤
         ShareModeEnum shareMode = query.getShareMode();
@@ -4976,7 +5023,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
     @Override
     public void liveCourseRemind() {
 
-        Integer studentRemindTime = Integer.parseInt(sysConfigService.findByParamName(SysConfigService.LIVE_CLASS_STUDENT_REMIND_TIME).getParanValue());
+        Integer studentRemindTime = Integer.parseInt(sysConfigService.findByParamName(SysConfigService.LIVE_CLASS_START_REMIND_TIME).getParanValue());
         // 查询30分钟内要开始的并且没有直播通知的直播课
         List<CourseSchedule> courseSchedules = courseScheduleDao.liveCourseRemind(studentRemindTime);
 
@@ -5002,41 +5049,45 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
                 continue;
             }
 
-            // 通知老师
-            Integer actualTeacherId = courseSchedule.getActualTeacherId();
-            if (actualTeacherId != null) {
-                Map<Integer, String> userMap = new HashMap<>();
-                userMap.put(actualTeacherId, actualTeacherId.toString());
-
-                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.JIGUANG_LIVE_COURSE_START,
-                        userMap, null, 0,teacherUrl , "TEACHER", classGroup.getName());
+            ImLiveBroadcastRoomVo imLiveBroadcastRoomVo = imLiveBroadcastRoomService.queryRoomInfo(courseSchedule.getLiveRoomId());
+            if (Objects.isNull(imLiveBroadcastRoomVo)) {
+                continue;
             }
 
-            // 通知学生
-            List<SimpleUserDto> courseStudents = courseScheduleStudentPaymentService.getCourseStudents(Lists.newArrayList(courseSchedule.getId()));
-            if (!CollectionUtils.isEmpty(courseStudents)) {
-                Map<Integer, String> userMap = new HashMap<>();
-                courseStudents.forEach(data -> {
-                    userMap.put(data.getUserId(), data.getUserId().toString());
-                });
+            try {
+                // 通知老师
+                Integer actualTeacherId = courseSchedule.getActualTeacherId();
+                if (actualTeacherId != null) {
+                    Map<Integer, String> userMap = new HashMap<>();
+                    userMap.put(actualTeacherId, actualTeacherId.toString());
+
+                    sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.JIGUANG_LIVE_COURSE_START,
+                            userMap, null, 0,teacherUrl , "TEACHER", classGroup.getName());
+                }
 
-                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.JIGUANG_LIVE_COURSE_START_STUDENT,
-                        userMap, null, 0, studentUrl, "STUDENT", classGroup.getName());
-            }
-            ImLiveBroadcastRoomVo imLiveBroadcastRoomVo = imLiveBroadcastRoomService.queryRoomInfo(courseSchedule.getLiveRoomId());
+                // 通知学生
+                List<SimpleUserDto> courseStudents = courseScheduleStudentPaymentService.getCourseStudents(Lists.newArrayList(courseSchedule.getId()));
+                if (!CollectionUtils.isEmpty(courseStudents)) {
+                    Map<Integer, String> userMap = new HashMap<>();
+                    courseStudents.forEach(data -> {
+                        userMap.put(data.getUserId(), data.getUserId().toString());
+                    });
 
-            // im消息
-            imUrl = MessageFormatter.arrayFormat(imUrl,courseSchedule.getId(), imLiveBroadcastRoomVo.getSubjectId());
-            sysMessageService.batchSendImGroupMessage(MessageTypeEnum.IM_LIVE_COURSE_START_GROUP, courseSchedule.getActualTeacherId().toString(), imUrl,
-                    new String[]{classGroup.getId().toString()},null, classGroup.getName());
+                    sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.JIGUANG_LIVE_COURSE_START_STUDENT,
+                            userMap, null, 0, studentUrl, "STUDENT", classGroup.getName());
+                }
+                // im消息
+                imUrl = MessageFormatter.arrayFormat(imUrl,courseSchedule.getId(), imLiveBroadcastRoomVo.getSubjectId());
+                sysMessageService.batchSendImGroupMessage(MessageTypeEnum.IM_LIVE_COURSE_START_GROUP, courseSchedule.getActualTeacherId().toString(), imUrl,
+                        new String[]{classGroup.getId().toString()},null, classGroup.getName());
+            } catch (Exception e) {
+                log.error("直播课程提醒失败", e);
+            }
 
+            // 更新通知状态
+            courseScheduleDao.updateRemindStatus(Lists.newArrayList(courseSchedule.getId()));
         }
 
-        // id 集合
-        List<Long> ids = courseSchedules.stream().map(CourseSchedule::getId).collect(Collectors.toList());
-
-        // 更新通知状态
-        courseScheduleDao.updateRemindStatus(ids);
         CompletableFuture.runAsync(() -> {
             for (CourseSchedule courseSchedule : courseSchedules) {
                 vipGroupService.createVipGroupLiveRoom(courseSchedule.getId().toString(), courseSchedule);
@@ -5082,10 +5133,10 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
         DateTime time = DateTime.parse(liveStartTime, DateTimeFormat.forPattern(DateUtil.DEFAULT_PATTERN + " " + DateUtil.EXPANDED_TIME_FORMAT));
 
-        String roomUid = "LIVE-" + roomId + "-" + time.toDate().getTime();
+        String roomUid = "LIVE-" + roomId + "-" + courseSchedule.getActualTeacherId().toString()+"-" + time.toDate().getTime();
         ImLiveBroadcastRoom room = imLiveBroadcastRoomService.getByRoomUid(roomUid);
         if (Objects.nonNull(room)) {
-            return;
+            liveRoom.setId(room.getId());
         }
         liveRoom.setTenantId(TenantContextHolder.getTenantId());
         liveRoom.setRoomUid(roomUid);
@@ -5100,17 +5151,17 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         liveRoom.setTenantId(courseSchedule.getTenantId());
 
         // 创建直播间
-        imLiveBroadcastRoomService.save(liveRoom);
+        imLiveBroadcastRoomService.saveOrUpdate(liveRoom);
 
         // 开启直播间
         try {
-            imLiveBroadcastRoomService.createLiveRoom(liveRoom);
+            imLiveBroadcastRoomService.createLiveRoomNoTransactional(liveRoom);
 
         } catch (Exception e) {
             log.error("创建直播间失败", e);
             imLiveBroadcastRoomService.removeById(liveRoom.getId());
             roomUid = null;
-//            throw new BizException("创建直播间失败");
+            throw new BizException("直播间创建失败,请联系客服");
         }
 
         // 更新课程关联直播间
@@ -5118,8 +5169,13 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         schedule.setId(courseSchedule.getId());
         schedule.setTenantId(courseSchedule.getTenantId());
         schedule.setLiveRoomId(roomUid);
-        courseSchedule.setLiveRoomId(roomUid);
-        courseScheduleDao.update(schedule);
+        CourseSchedule courseSchedule1 = courseScheduleDao.get(courseSchedule.getId());
+        if (StringUtils.isBlank(courseSchedule1.getLiveRoomId())) {
+            courseSchedule.setLiveRoomId(roomUid);
+            courseScheduleDao.update(schedule);
+        } else {
+            courseSchedule.setLiveRoomId(courseSchedule1.getLiveRoomId());
+        }
 
     }
 
@@ -5135,7 +5191,10 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         if (!vipGroup.getStatus().equals(VipGroupStatusEnum.CANCEL)) {
             throw new BizException("课程组不是取消状态");
         }
-
+        List<CourseSchedule> schedules = courseScheduleDao.findGroupCourseSchedules(id.toString(), vipGroup.getGroupType());
+        if(!CollectionUtils.isEmpty(schedules)){
+            throw new BizException("当前课程组已排课");
+        }
         vipGroupDao.del(id);
         return true;
     }
@@ -5171,13 +5230,13 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
                         try {
                             imLiveBroadcastRoomService.sendForcedOffline(imLiveBroadcastRoomVo);
 
-                            courseScheduleDao.updateLiveRemind(data.getId(), 1);
+                            courseScheduleDao.updateLiveRemind(data.getId(), 2);
                         } catch (Exception e) {
                             log.error("发送直播间退出消息失败", e);
                         }
                     } else if (imLiveBroadcastRoomVo.getLiveState() == 2) {
                         // 直播未开始 设置通知状态
-                        courseScheduleDao.updateLiveRemind(data.getId(), 2);
+                        courseScheduleDao.updateLiveRemind(data.getId(), 3);
                     }
                 }
             });
@@ -5196,14 +5255,14 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
                         boolean b = imLiveBroadcastRoomService.tryDestroyLiveRoom(imLiveBroadcastRoomVo);
                         if (b) {
                             // 直播已关闭 设置通知状态
-                            courseScheduleDao.updateLiveRemind(data.getId(), 2);
+                            courseScheduleDao.updateLiveRemind(data.getId(), 3);
                         }
                     } catch (Exception e) {
                         log.error("关闭直播间失败", e);
                     }
                 } else if (imLiveBroadcastRoomVo.getLiveState() == 2) {
                     // 直播已关闭 设置通知状态
-                    courseScheduleDao.updateLiveRemind(data.getId(), 2);
+                    courseScheduleDao.updateLiveRemind(data.getId(), 3);
                 }
             }
 
@@ -5220,25 +5279,32 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
             throw new BizException("课程不存在");
         }
 
+        // 购买用户可以直接进入
+        CourseScheduleStudentPayment payment = courseScheduleStudentPaymentDao.getByUserIdAndCourseId(studentId, courseScheduleId.longValue());
+        if (!Objects.isNull(payment) && JoinCourseType.PURCHASE.equals(payment.getJoinCourseType())) {
 
-        // 分享类型  是否能进入
-        if (ShareModeEnum.NO_SHARE.equals(courseSchedule.getShareMode())) {
-            throw new BizException("课程不允许分享");
-        }
-        if (ShareModeEnum.PRIVATE.equals(courseSchedule.getShareMode())) {
-            // 查询
-            CourseShare courseShare = courseShareService.getByUserIdAndCourseId(studentId, courseScheduleId);
-            if (Objects.isNull(courseShare)) {
-                throw new BizException("非分享用户,不可进入");
+        } else {
+
+
+            // 分享类型  是否能进入
+            if (ShareModeEnum.NO_SHARE.equals(courseSchedule.getShareMode())) {
+                throw new BizException("课程不允许分享");
+            }
+            if (ShareModeEnum.PRIVATE.equals(courseSchedule.getShareMode())) {
+                // 查询
+                CourseShare courseShare = courseShareService.getByUserIdAndCourseId(studentId, courseScheduleId);
+                if (Objects.isNull(courseShare)) {
+                    throw new BizException("非分享用户,不可进入");
+                }
             }
-        }
 
-        SysUser sysUser = sysUserService.queryUserById(studentId);
-        if (Objects.isNull(sysUser)) {
-            throw new BizException("用户不存在");
-        }
-        if(courseSchedule.getTenantId().equals(sysUser.getTenantId())) {
-            throw new BizException("用户不属于此机构");
+            SysUser sysUser = sysUserService.queryUserById(studentId);
+            if (Objects.isNull(sysUser)) {
+                throw new BizException("用户不存在");
+            }
+            if (!courseSchedule.getTenantId().equals(sysUser.getTenantId())) {
+                throw new BizException("用户不属于此机构");
+            }
         }
 
         Integer studentRemindTime = Integer.parseInt(sysConfigService.findByParamName(SysConfigService.LIVE_CLASS_START_REMIND_TIME).getParanValue());

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

@@ -1581,7 +1581,7 @@
     <select id="countClassGroup" resultType="int">
         SELECT COUNT(cg.id_) FROM class_group cg
         <if test="groupType == 'MUSIC'">
-            LEFT JOIN music_group mg ON mg.id_ = cg.music_group_id_
+            LEFT JOIN music_group mg ON mg.id_ = cg.music_group_id_ AND mg.status_ NOT IN ('CANCELED','PAUSE','CLOSE')
         </if>
         <if test="groupType == 'VIP' or groupType == 'LIVE'">
             LEFT JOIN vip_group mg ON mg.id_ = cg.music_group_id_
@@ -1598,7 +1598,7 @@
         LEFT JOIN sys_user su ON su.id_ = cgtm.user_id_ AND cgtm.teacher_role_ = 'BISHOP'
         LEFT JOIN sys_user su1 ON su1.id_ = cgtm.user_id_ AND cgtm.teacher_role_ = 'TEACHING'
         <if test="groupType == 'MUSIC'">
-            LEFT JOIN music_group mg ON mg.id_ = cg.music_group_id_
+            LEFT JOIN music_group mg ON mg.id_ = cg.music_group_id_ AND mg.status_ NOT IN ('CANCELED','PAUSE','CLOSE')
         </if>
         <if test="groupType == 'VIP' or groupType == 'LIVE'">
             LEFT JOIN vip_group mg ON mg.id_ = cg.music_group_id_

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

@@ -205,7 +205,8 @@
             cssp.be_merged_,
             st.current_grade_num_,
             st.current_class_,
-            IF(sa.status_ IS NULL,'TRUANT',sa.status_) status_
+            IF(sa.status_ IS NULL,'TRUANT',sa.status_) status_,
+        cssp.join_course_type_ as joinCourseType
         FROM
             course_schedule_student_payment cssp
             LEFT JOIN sys_user su ON cssp.user_id_ = su.id_

+ 71 - 38
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -71,6 +71,7 @@
         <result column="isCallNames" property="isCallNames" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="is_complaints_" property="isComplaints"/>
         <result column="merged_course_ids_" property="mergedCourseIds"/>
+        <result column="teachingTeacherIds" property="teachingTeacherIds"/>
     </resultMap>
 
     <resultMap type="com.ym.mec.biz.dal.dto.CourseScheduleDto" id="courseScheduleDto" extends="CourseSchedule">
@@ -1427,6 +1428,15 @@
                 <if test="item.shareMode != null">
                     share_mode_ = #{item.shareMode},
                 </if>
+                <if test="item.liveRoomId != null">
+                    live_room_id_ = #{item.liveRoomId},
+                </if>
+                <if test="item.continuousCourse != null">
+                    continuous_course_ = #{item.continuousCourse},
+                </if>
+                <if test="item.liveRemind != null">
+                    live_remind_ = #{item.liveRemind},
+                </if>
                 update_time_ = NOW()
             </set>
             WHERE id_ = #{item.id} and tenant_id_ = #{item.tenantId}
@@ -1533,7 +1543,22 @@
                 AND CONCAT( cs.class_date_, ' ', cs.end_class_time_ )&lt;now()
             </if>
             <if test="status!=null">
-                AND cs.status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+                <if test=" groupType == 'LIVE'">
+                    <if test="status.code == 'UNDERWAY'">
+                        AND (cs.status_  = 'UNDERWAY'
+                        or (cs.status_ = 'NOT_START' and  CONCAT(cs.class_date_,' ',cs.start_class_time_) &lt; date_add(now(), interval #{notStartCourseTime} minute))
+                        )
+                    </if>
+                    <if test="status.code == 'NOT_START'">
+                        AND cs.status_ = 'NOT_START' and CONCAT(cs.class_date_,' ',cs.start_class_time_) &gt; date_add(now(), interval #{notStartCourseTime} minute)
+                    </if>
+                    <if test="status.code == 'OVER'">
+                        AND cs.status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+                    </if>
+                </if>
+                <if test="groupType != 'LIVE'">
+                    AND cs.status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+                </if>
             </if>
             <if test="startClassDate!=null and startClassDate!=''">
                 AND cs.class_date_ &gt;= #{startClassDate}
@@ -1888,7 +1913,7 @@
         )
         and cs.tenant_id_ = #{tenantId}
         AND (cs.del_flag_ IS NULL OR cs.del_flag_=0)
-        AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_)
+        AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_) AND cs.group_type_ != 'LIVE'
     </select>
 
     <select id="queryStudentCoursesTimesOfTomorrow" resultMap="Mapper">
@@ -2481,33 +2506,17 @@
 
     <select id="endFindCourseSchedules" resultMap="CourseScheduleEndDto">
         SELECT
-            cs.id_ id_,
-            cs.new_course_id_,
-            cs.group_type_,
-            cs.music_group_id_,
-            cs.class_group_id_,
-            cs.status_,
-            cs.name_,
-            cs.class_date_,
-            CONCAT(cs.class_date_,' ',cs.start_class_time_) course_start_time_,
+            cs.id_ id_,cs.new_course_id_,cs.group_type_,cs.music_group_id_,cs.class_group_id_,
+            cs.status_,cs.name_,cs.class_date_,CONCAT(cs.class_date_,' ',cs.start_class_time_) course_start_time_,
             CONCAT(cs.class_date_,' ',cs.end_class_time_) course_end_time_,
-            cs.actual_teacher_id_,
-            cs.teach_mode_,
-            cs.type_,
-            cs.schoole_id_,
-            cs.create_time_,
-            cs.is_lock_,
-            cs.organ_id_,
-            cs.member_flag_,
-            cs.new_course_id_,
-            s.name_ schoole_name_,
-            o.name_ organ_name_,
+            cs.actual_teacher_id_,cs.teach_mode_,cs.type_,cs.schoole_id_,cs.create_time_,cs.is_lock_,
+            cs.organ_id_,cs.member_flag_,cs.new_course_id_,s.name_ schoole_name_,o.name_ organ_name_,
             CASE WHEN COUNT(CASE WHEN sa.id_ IS NULL OR (sa.status_ = 'LEAVE' AND sa.remark_ IS NOT NULL) THEN NULL ELSE 1 END) > 0 THEN 1 ELSE 0 END isCallNames,
             CASE WHEN COUNT(CASE WHEN ta.is_complaints_ = 1 THEN 1 ELSE NULL END) > 0 THEN '1' ELSE '0' END is_complaints_,
             (
                 select group_concat(csd.id_) from course_schedule csd
                 where csd.del_flag_ = 0 and csd.id_ != csd.new_course_id_  and csd.new_course_id_ = cs.new_course_id_
-            ) as merged_course_ids_
+            ) as merged_course_ids_,GROUP_CONCAT(distinct CASE WHEN csts.teacher_role_ = 'TEACHING' THEN csts.user_id_ END) teachingTeacherIds
         FROM
             course_schedule cs
             LEFT JOIN school s ON cs.schoole_id_=s.id_
@@ -2522,22 +2531,22 @@
                 AND cssp.user_id_ = sa.user_id_
             </if>
             <include refid="endFindCourseSchedulesCondition"/>
-        GROUP BY
-            cs.class_date_,
-            cs.start_class_time_,
-            cs.id_
-        ORDER BY
-            cs.class_date_,
-            cs.start_class_time_,
-            cs.id_
+        GROUP BY cs.class_date_, cs.start_class_time_, cs.id_
+        <if test="hasTeaching != null">
+            <if test="hasTeaching == true">
+                HAVING teachingTeacherIds IS NOT NULL
+            </if>
+            <if test="hasTeaching == false">
+                HAVING teachingTeacherIds IS NULL
+            </if>
+        </if>
+        ORDER BY cs.class_date_, cs.start_class_time_, cs.id_
         <include refid="global.limit"/>
     </select>
 
     <select id="endCountCourseSchedules" resultType="int">
-        SELECT
-        COUNT(DISTINCT cs.id_)
-        FROM
-        course_schedule cs
+        SELECT COUNT(c.id_) FROM (
+        SELECT cs.id_,GROUP_CONCAT(distinct CASE WHEN csts.teacher_role_ = 'TEACHING' THEN csts.user_id_ END) teachingTeacherIds FROM course_schedule cs
         <if test="studentId != null or searchType == 'TEACHER_ERR_ATTENDANCE' or searchType == 'STUDENT_ERR_ATTENDANCE'">
             LEFT JOIN course_schedule_student_payment cssp ON cssp.course_schedule_id_ = cs.id_
         </if>
@@ -2548,6 +2557,15 @@
         LEFT JOIN teacher_attendance ta on ta.course_schedule_id_ = cs.id_
         LEFT JOIN course_schedule_teacher_salary csts ON csts.course_schedule_id_ = cs.id_
         <include refid="endFindCourseSchedulesCondition"/>
+        GROUP BY cs.id_
+        <if test="hasTeaching != null">
+            <if test="hasTeaching == true">
+                HAVING teachingTeacherIds IS NOT NULL
+            </if>
+            <if test="hasTeaching == false">
+                HAVING teachingTeacherIds IS NULL
+            </if>
+        </if>) c
     </select>
     <select id="findClassGroupCourseSchedulesWithDate" resultMap="CourseSchedule">
         SELECT <include refid="resultSql"/>
@@ -2635,7 +2653,7 @@
             AND cs.teach_mode_ = #{teachMode,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
         </if>
         <if test="teacherIdList != null">
-            AND csts.user_id_=#{teacherIdList}
+            AND csts.user_id_ = #{teacherIdList}
         </if>
         <if test="teachType != null">
             AND csts.teacher_role_ = #{teachType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
@@ -4194,7 +4212,22 @@
         left join student_attendance sa ON sa.course_schedule_id_ = cs.id_ AND sa.user_id_ = cssp.user_id_
         where cssp.music_group_id_ = #{queryInfo.groupId} AND cssp.user_id_ = #{queryInfo.userId} AND cssp.group_type_ = #{queryInfo.groupType}
         <if test="queryInfo.courseStatus != null and queryInfo.courseStatus != ''">
-            AND cs.status_ = #{queryInfo.courseStatus}
+            <if test=" queryInfo.groupType == 'LIVE'">
+                <if test="queryInfo.courseStatus == 'UNDERWAY'">
+                    AND (cs.status_  = 'UNDERWAY'
+                    or (cs.status_ = 'NOT_START' and  CONCAT(cs.class_date_,' ',cs.start_class_time_) &lt; date_add(now(), interval #{queryInfo.notStartCourseTime} minute))
+                    )
+                </if>
+                <if test="queryInfo.courseStatus == 'NOT_START'">
+                    AND cs.status_ = 'NOT_START' and CONCAT(cs.class_date_,' ',cs.start_class_time_) &gt; date_add(now(), interval #{queryInfo.notStartCourseTime} minute)
+                </if>
+                <if test="queryInfo.courseStatus == 'OVER'">
+                    AND cs.status_ = 'OVER'
+                </if>
+            </if>
+            <if test="queryInfo.groupType != 'LIVE'">
+                AND cs.status_ = #{queryInfo.courseStatus}
+            </if>
         </if>
         <if test="queryInfo.teachMode != null and queryInfo.teachMode != ''">
             AND cs.teach_mode_ = #{queryInfo.teachMode}
@@ -4242,7 +4275,7 @@
                 and cs.type_ = #{param.classType}
             </if>
 
-            <if test="param.musicGroupId != null ">
+            <if test="param.musicGroupId != null and  param.musicGroupId != ''">
                 and #{param.musicGroupId} = cs.music_group_id_
             </if>
             <if test="param.homeWorkStatus != null">

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

@@ -60,10 +60,11 @@
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
 		INSERT INTO course_schedule_student_payment (id_,group_type_,music_group_id_,course_schedule_id_,user_id_,
 			original_price_,expect_price_,actual_price_,expect_price_bak_,actual_price_bak_,create_time_,update_time_,
-		settlement_time_,class_group_id_,batch_no_,be_merged_,tenant_id_,activity_user_mapper_id_)
+		settlement_time_,class_group_id_,batch_no_,be_merged_,tenant_id_,activity_user_mapper_id_,join_course_type_)
 		VALUES(#{id},#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{musicGroupId},#{courseScheduleId},#{userId},
 			#{originalPrice},#{expectPrice},#{actualPrice},#{expectPriceBak},#{actualPriceBak},NOW(),NOW()
-			,#{settlementTime},#{classGroupId},#{batchNo},#{beMerged},#{tenantId},#{activityUserMapperId})
+			,#{settlementTime},#{classGroupId},#{batchNo},#{beMerged},#{tenantId},#{activityUserMapperId}
+        ,#{joinCourseType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler})
 	</insert>
     <insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id_">
 		INSERT INTO course_schedule_student_payment (id_,group_type_,music_group_id_,course_schedule_id_,user_id_,
@@ -1121,6 +1122,6 @@
 	</select>
 
 	<select id="getByUserIdAndCourseId" resultMap="CourseScheduleStudentPayment">
-        SELECT * FROM `course_schedule_student_payment` WHERE `user_id_` = #{userId} AND `course_schedule_id_` = #{courseScheduleId}
+        SELECT * FROM `course_schedule_student_payment` WHERE `user_id_` = #{userId} AND `course_schedule_id_` = #{courseScheduleId} limit 1
     </select>
 </mapper>

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

@@ -197,6 +197,6 @@
     <select id="getByUserIdAndCourseId" resultMap="courseShare">
         SELECT *
         FROM course_share
-        WHERE user_id_ = #{studentId} AND course_id_ = #{courseScheduleId}
+        WHERE user_id_ = #{studentId} AND course_id_ = #{courseScheduleId} limit 1
     </select>
 </mapper>

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

@@ -8,12 +8,19 @@
     t.create_time_ as createTime,
     t.order_no_ as orderNo
     from student_payment_order t
+    left join sys_user su on su.id_ = t.user_id_
     <where>
         <if test="param.liveGroupId != null">
             and t.music_group_id_ = #{param.liveGroupId}
             and t.type_ = 'LIVE_GROUP_BUY'
             and t.status_ = 'SUCCESS'
         </if>
+        <if test="param.search != null and param.search != ''">
+            and (su.id_ = #{param.search}
+                or su.username_ like concat('%',#{param.search},'%')
+                or su.phone_ like concat('%',#{param.search},'%')
+            )
+        </if>
     </where>
 
     </select>
@@ -30,7 +37,7 @@
     cs.class_date_,
     CONCAT(cs.class_date_,' ',cs.start_class_time_) start_class_time_,
     CONCAT(cs.class_date_,' ',cs.end_class_time_) end_class_time_,
-    cs.status_,
+    cs.status_ as status_,
     csts.user_id_ actual_teacher_id_,
     csts.teacher_role_,
     cg.expect_student_num_,
@@ -64,11 +71,27 @@
     </if>
     AND csts.user_id_ = #{param.teacherId} AND cs.pre_course_flag_ = 0
     <if test="param.status != null">
-        AND cs.status_ = #{param.status}
+        <if test="param.status == 'UNDERWAY'">
+            AND (cs.status_  = 'UNDERWAY'
+                or (cs.status_ = 'NOT_START' and  CONCAT(cs.class_date_,' ',cs.start_class_time_) &lt; date_add(now(), interval #{param.notStartCourseTime} minute))
+            )
+        </if>
+        <if test="param.status == 'NOT_START'">
+            AND cs.status_ = 'NOT_START' and CONCAT(cs.class_date_,' ',cs.start_class_time_) &gt; date_add(now(), interval #{param.notStartCourseTime} minute)
+        </if>
+        <if test="param.status == 'OVER'">
+            AND cs.status_ = 'OVER'
+        </if>
     </if>
     <if test="param.search != null and param.search != ''">
         AND (cs.name_ LIKE CONCAT('%',#{param.search},'%'))
     </if>
     order by field(cs.status_, 'UNDERWAY', 'NOT_START', 'OVER') asc, cs.class_date_,cs.start_class_time_
     </select>
+
+<select id="detailLiveCourse" resultType="com.ym.mec.biz.dal.dto.CourseScheduleDto">
+    SELECT *
+    FROM course_schedule cs
+    where id_ = #{courseScheduleId}
+    </select>
 </mapper>

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

@@ -193,6 +193,7 @@
         <result property="avatar" column="avatar_"/>
         <result property="phone" column="phone_"/>
         <result property="beMerged" column="be_merged_"/>
+        <result property="joinCourseType" column="joinCourseType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result property="status" column="status_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
     </resultMap>
 

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

@@ -28,6 +28,7 @@
         <result column="music_score_id_" property="musicScoreId"/>
         <result column="music_score_content_" property="musicScoreContent"/>
         <result column="tenant_id_" property="tenantId"/>
+        <result column="subject_id_" property="subjectId"/>
         <result column="standard_flag_" property="standardFlag" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
     </resultMap>
 
@@ -710,15 +711,18 @@
         sch.*,
         su.username_,
         su.avatar_,
-        su.phone_
+        su.phone_,
+        sr.actual_subject_id_ as subject_id_
         FROM
         student_course_homework sch
+        left join course_homework ch on ch.id_ = sch.course_homework_id_
         LEFT JOIN sys_user su ON sch.user_id_=su.id_
-        left join student s on s.user_id_ = su.id_
+        left join student s2 on s2.user_id_ = su.id_
+        left join student_registration sr on sr.user_id_ = sch.user_id_ and sr.music_group_id_ = ch.music_group_id_
         <where>
             sch.course_schedule_id_=#{query.courseScheduleId}
             <if test="query.subjectId != null">
-                and s.subject_id_list_ = #{query.subjectId}
+                and (sr.actual_subject_id_ = #{query.subjectId} or (sr.actual_subject_id_ is null and s2.subject_id_list_ = #{query.subjectId}))
             </if>
         </where>
     </select>

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

@@ -805,7 +805,7 @@
         GROUP BY su.id_
     </select>
     <select id="countStudentSignInNum" resultType="java.lang.Integer">
-        SELECT COUNT(id_) FROM student_attendance WHERE course_schedule_id_ = #{courseScheduleId} AND status_ = #{status}
+        SELECT COUNT(id_) FROM student_attendance WHERE course_schedule_id_ = #{courseScheduleId} AND FIND_IN_SET(status_,#{status})
     </select>
     <select id="countHomeworkNum" resultType="java.lang.Integer">
         SELECT COUNT(id_) FROM student_course_homework WHERE course_schedule_id_ = #{courseScheduleId} AND status_ = 1

+ 12 - 6
mec-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -774,12 +774,6 @@
             <if test="search!=null and search!=''">
                 AND (t.user_id_=#{search} OR su.username_ LIKE CONCAT('%', #{search}, '%'))
             </if>
-            <if test="cloudTeacherTrainStartDate != null">
-                AND date(smcr.create_time_) &gt;= #{cloudTeacherTrainStartDate}
-            </if>
-            <if test="cloudTeacherTrainEndDate != null">
-                AND date(smcr.create_time_) &lt;= #{cloudTeacherTrainEndDate}
-            </if>
         </where>
     </sql>
 
@@ -820,6 +814,12 @@
             LEFT JOIN sys_user su ON stu.user_id_=su.id_
             LEFT JOIN `subject` sub ON stu.subject_id_list_ = sub.id_
             LEFT JOIN sys_music_compare_record smcr ON stu.user_id_ = smcr.user_id_
+            <if test="cloudTeacherTrainStartDate != null">
+                AND date(smcr.create_time_) &gt;= #{cloudTeacherTrainStartDate}
+            </if>
+            <if test="cloudTeacherTrainEndDate != null">
+                AND date(smcr.create_time_) &lt;= #{cloudTeacherTrainEndDate}
+            </if>
         <include refid="queryCloudStudyStudentDataCondition" />
         GROUP BY stu.user_id_
         <trim prefix="ORDER BY " suffixOverrides=",">
@@ -861,6 +861,12 @@
         )) t
         LEFT JOIN sys_user su ON t.user_id_ = su.id_
         LEFT JOIN sys_music_compare_record smcr ON t.user_id_ = smcr.user_id_
+        <if test="cloudTeacherTrainStartDate != null">
+            AND date(smcr.create_time_) &gt;= #{cloudTeacherTrainStartDate}
+        </if>
+        <if test="cloudTeacherTrainEndDate != null">
+            AND date(smcr.create_time_) &lt;= #{cloudTeacherTrainEndDate}
+        </if>
         <include refid="queryCloudStudyStudentDataCondition" />
     </select>
 

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

@@ -61,6 +61,13 @@ month_ = #{month},
 		update student_operating_visit set visit_flag_ = 1
 		where user_id_ = #{studentId} and visit_flag_ = 0 and month_ = #{month}
 	</update>
+    <update id="batchUpdateVisit">
+		update student_operating_visit set visit_flag_ = 1
+		where visit_flag_ = 0 and month_ = #{month} AND user_id_ IN
+		<foreach collection="studentIds" separator="," item="studentId" open="(" close=")">
+			#{studentId}
+		</foreach>
+	</update>
 
 	<!-- 根据主键删除一条记录 -->
 	<delete id="delete" >

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

@@ -769,7 +769,7 @@
         FROM student_payment_order spo
         LEFT JOIN student_payment_order_detail spod on spo.id_ = spod.payment_order_id_
         LEFT JOIN sporadic_charge_info sci on spo.music_group_id_ = sci.id_
-        where DATE_FORMAT(spo.pay_time_,'%Y-%m') = #{month} AND spo.order_no_ NOT IN (select distinct order_no_ from sell_order where DATE_FORMAT(delivery_time_,'%Y-%m') = #{month})
+        where DATE_FORMAT(spo.pay_time_,'%Y-%m') = #{month} AND spo.order_no_ NOT IN (select distinct order_no_ from sell_order where DATE_FORMAT(sell_time_,'%Y-%m') = #{month})
         AND spo.tenant_id_ = 1 AND spo.status_ = 'SUCCESS'
     </select>
     <select id="ExportQueryPage2" resultMap="orderAndDetail" parameterType="map">

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

@@ -53,6 +53,21 @@
         #{type,jdbcType=VARCHAR}, #{purpose,jdbcType=VARCHAR}, #{overview,jdbcType=VARCHAR},
         #{feedback,jdbcType=VARCHAR}, #{visitTime}, #{createTime},#{objectId},#{tenantId},#{attachments},#{probStatus})
     </insert>
+    <insert id="batchInsert">
+        insert into student_visit (music_group_id_, organ_id_, student_id_, teacher_id_, visiter_type_, feedback_type_,feedback_type_desc_,
+        type_, purpose_, overview_,
+        feedback_, visit_time_, create_time_,object_id_,tenant_id_,attachments_,prob_status)
+        VALUES
+        <foreach collection="studentVisit" item="item" separator=",">
+            (#{item.musicGroupId,jdbcType=VARCHAR}, #{item.organId,jdbcType=INTEGER}, #{item.studentId,jdbcType=INTEGER},
+            #{item.teacherId,jdbcType=INTEGER},#{item.visiterType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+            #{item.feedbackType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+            #{item.feedbackTypeDesc,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+            #{item.type,jdbcType=VARCHAR}, #{item.purpose,jdbcType=VARCHAR}, #{item.overview,jdbcType=VARCHAR},
+            #{item.feedback,jdbcType=VARCHAR}, #{item.visitTime}, #{item.createTime},#{item.objectId},#{item.tenantId},
+             #{item.attachments},#{item.probStatus})
+        </foreach>
+    </insert>
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.StudentVisit">
         <!--@mbg.generated-->
         update student_visit
@@ -211,6 +226,9 @@
             #{studentId}
         </foreach>
     </select>
+    <select id="getMusicVisitStudent" resultType="java.lang.Integer">
+        SELECT student_id_ FROM student_visit WHERE music_group_id_ = #{musicGroupId} AND student_id_ = #{studentId}
+    </select>
     <select id="getTeacherVisitCount" resultType="com.ym.mec.biz.dal.dto.TeacherVisitDto">
         SELECT teacher_id_ teacherId,date_format(visit_time_, '%Y-%m') month, COUNT(*) num
         FROM student_visit
@@ -232,7 +250,8 @@
         select COUNT(sov.user_id_) from student_operating_visit sov
         LEFT JOIN sys_user su ON su.id_ = sov.user_id_
         LEFT JOIN (select sv.student_id_,MAX(sv.create_time_) create_time_ from student_visit sv
-        where sv.student_id_ IS NOT NULL group by sv.student_id_,DATE_FORMAT(sv.create_time_,'%Y-%m')) sv ON sv.student_id_ = sov.user_id_ AND sov.month_ = DATE_FORMAT(sv.create_time_,'%Y-%m')
+        where sv.student_id_ IS NOT NULL group by sv.student_id_,DATE_FORMAT(sv.create_time_,'%Y-%m')) sv ON sv.student_id_ = sov.user_id_
+        AND sov.month_ = DATE_FORMAT(sv.create_time_,'%Y-%m')
         <include refid="queryWaitVisitSql"/>
     </select>
     <sql id="queryWaitVisitSql">

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

@@ -260,9 +260,9 @@
     </select>
 
     <select id="getRegisterSubject" resultMap="com.ym.mec.biz.dal.dao.StudentRegistrationDao.StudentRegistration">
-        SELECT sr.user_id_, s.name_ subject_name_ FROM student_registration sr
+        SELECT sr.user_id_, s.name_ subject_name_,sr.actual_subject_id_ FROM student_registration sr
         LEFT JOIN subject s ON sr.actual_subject_id_=s.id_
-        WHERE sr.music_group_id_=#{musicGroupId} AND s.del_flag_ = 0 AND sr.music_group_status_ != 'QUIT'
+        WHERE sr.music_group_id_=#{musicGroupId} AND s.del_flag_ = 0
         AND sr.user_id_ IN
         <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
             #{userId}

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

@@ -432,20 +432,17 @@
             <if test="organId != null">
                 AND FIND_IN_SET(#{organId},vg.organ_id_list_)
             </if>
-            <if test="subjectId!=null">
-                AND FIND_IN_SET(#{subjectId},cg.subject_id_list_)
-            </if>
-            <if test="subjectId!=null">
-                AND FIND_IN_SET(#{subjectId},cg.subject_id_list_)
+            <if test="subjectId != null and subjectId != ''">
+                AND (JSON_EXTRACT(live_config_json_, '$.subjectId') = "31" OR FIND_IN_SET(#{subjectId},cg.subject_id_list_))
             </if>
             <if test="categoryId!=null">
                 AND FIND_IN_SET(vg.vip_group_category_id_,#{categoryId})
             </if>
             <if test="classType!=null and classType.toString()=='0'.toString()">
-                AND vg.offline_classes_num_>0
+                AND vg.offline_classes_num_ > 0
             </if>
             <if test="classType!=null and classType.toString()=='1'.toString()">
-                AND vg.online_classes_num_>0
+                AND vg.online_classes_num_ > 0
             </if>
             <if test="search != null and search != ''">
                 AND vg.name_ like concat('%',#{search},'%')
@@ -478,9 +475,9 @@
         vg.group_type_
         FROM
         vip_group vg
-        LEFT JOIN class_group cg ON vg.id_=cg.music_group_id_ AND cg.group_type_ = vg.group_type_
-        LEFT JOIN teacher t ON vg.user_id_=t.id_
-        LEFT JOIN sys_user su ON vg.user_id_=su.id_
+        LEFT JOIN class_group cg ON vg.id_ = cg.music_group_id_ AND cg.group_type_ = vg.group_type_
+        LEFT JOIN teacher t ON vg.user_id_ = t.id_
+        LEFT JOIN sys_user su ON vg.user_id_ = su.id_
         LEFT JOIN vip_group_activity vga ON vg.vip_group_activity_id_=vga.id_
         LEFT JOIN vip_group_category vgc ON vg.vip_group_category_id_=vgc.id_
         <include refid="studentVipGroupQueryCondition"/>
@@ -675,7 +672,7 @@
 
     <select id="findHaveCourseBalanceStudents" resultMap="vipGroupStudentDto">
         SELECT
-            su.id_,
+            su.id_ user_id_,
             su.username_,
             su.phone_,
             suca.course_balance_,

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

@@ -146,13 +146,13 @@ public class BaseController {
 
     public String dingTalkRobotsSecurityParam() throws Exception{
         Long timestamp = System.currentTimeMillis();
-        String secret = "SEC5e3b73acccb12fc2a2a7d36d416c1967c66adb99a75dce24ecc324b50e528a29";
+        String secret = "SEC405b2e5f38aaae6472b242ee53607fb4a6549cf05a72bdf6482ec3799d5576ec";
         String stringToSign = timestamp + "\n" + secret;
         Mac mac = Mac.getInstance("HmacSHA256");
         mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
         byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
         String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)),"UTF-8");
-        StringBuffer sb = new StringBuffer("https://api.dingtalk.com/robot/send?access_token=22d7b3b54ea7f1633c640dfdf17083d0731c3757719a84bd333740a8b18eb035&timestamp=");
+        StringBuffer sb = new StringBuffer("https://oapi.dingtalk.com/robot/send?access_token=ffa98e1f0f5f4cff586a228699281a7955e305fd6f55145af8e8da5ea794d033&timestamp=");
         sb.append(timestamp).append("&sign=").append(sign);
         return sb.toString();
     }

+ 150 - 110
mec-common/common-core/src/main/java/com/ym/mec/common/service/impl/BaseServiceImpl.java

@@ -25,6 +25,7 @@ import java.math.BigDecimal;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
+import java.sql.SQLException;
 import java.util.*;
 
 /**
@@ -34,94 +35,94 @@ import java.util.*;
  */
 public abstract class BaseServiceImpl<PK extends Serializable, T> implements BaseService<PK, T> {
 
-	@Autowired
-	protected SqlSessionFactory sqlSessionFactory;
+    @Autowired
+    protected SqlSessionFactory sqlSessionFactory;
 
-	public abstract BaseDAO<PK, T> getDAO();
+    public abstract BaseDAO<PK, T> getDAO();
 
-	/**
-	 * 通过主键id加载对象
-	 * @param id
-	 * @return
-	 */
-	public T get(final PK id) {
-		return this.getDAO().get(id);
-	}
+    /**
+     * 通过主键id加载对象
+     * @param id
+     * @return
+     */
+    public T get(final PK id) {
+        return this.getDAO().get(id);
+    }
 
-	/**
-	 * 更新实体对象
-	 * @param bean
-	 * @return int
-	 */
-	public int update(T bean) {
-		return this.getDAO().update(bean);
-	}
+    /**
+     * 更新实体对象
+     * @param bean
+     * @return int
+     */
+    public int update(T bean) {
+        return this.getDAO().update(bean);
+    }
 
-	/**
-	 * 通过主键id删除对象
-	 * @param id
-	 * @return int
-	 */
-	public int delete(final PK id) {
-		return this.getDAO().delete(id);
-	}
+    /**
+     * 通过主键id删除对象
+     * @param id
+     * @return int
+     */
+    public int delete(final PK id) {
+        return this.getDAO().delete(id);
+    }
 
-	/**
-	 * 写入实体对象
-	 * @param bean
-	 * @return int
-	 */
-	public long insert(T bean) {
-		return this.getDAO().insert(bean);
-	}
+    /**
+     * 写入实体对象
+     * @param bean
+     * @return int
+     */
+    public long insert(T bean) {
+        return this.getDAO().insert(bean);
+    }
 
-	/**
-	 * 通过参数查找所有结果集
-	 * @param params
-	 * @return
-	 */
-	public List<T> findAll(Map<String, Object> params) {
-		final String TENANT_ID = "tenantId";
-		
-		if(!params.containsKey(TENANT_ID)){
-			params.put(TENANT_ID, TenantContextHolder.getTenantId());
-		}
-		return this.getDAO().findAll(params);
-	}
+    /**
+     * 通过参数查找所有结果集
+     * @param params
+     * @return
+     */
+    public List<T> findAll(Map<String, Object> params) {
+        final String TENANT_ID = "tenantId";
 
-	/**
-	 * 通过参数查找结果集,适合分页场景
-	 * @param queryInfo
-	 * @return
-	 */
-	public PageInfo<T> queryPage(QueryInfo queryInfo) {
-		PageInfo<T> pageInfo = new PageInfo<T>(queryInfo.getPage(), queryInfo.getRows());
-		Map<String, Object> params = new HashMap<String, Object>();
-		MapUtil.populateMap(params, queryInfo);
-		
-		List<T> dataList = null;
-		int count = this.findCount(params);
-		if (count > 0) {
-			pageInfo.setTotal(count);
-			params.put("offset", pageInfo.getOffset());
-			dataList = this.getDAO().queryPage(params);
-		}
-		if (count == 0) {
-			dataList = new ArrayList<T>();
-		}
-		pageInfo.setRows(dataList);
-		return pageInfo;
-	}
+        if(!params.containsKey(TENANT_ID)){
+            params.put(TENANT_ID, TenantContextHolder.getTenantId());
+        }
+        return this.getDAO().findAll(params);
+    }
 
-	/**
-	 * 通过参数查找结果集数目
-	 * @author pengdc
-	 * @param params
-	 * @return
-	 */
-	public int findCount(Map<String, Object> params) {
-		return this.getDAO().queryCount(params);
-	}
+    /**
+     * 通过参数查找结果集,适合分页场景
+     * @param queryInfo
+     * @return
+     */
+    public PageInfo<T> queryPage(QueryInfo queryInfo) {
+        PageInfo<T> pageInfo = new PageInfo<T>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<T> dataList = null;
+        int count = this.findCount(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = this.getDAO().queryPage(params);
+        }
+        if (count == 0) {
+            dataList = new ArrayList<T>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    /**
+     * 通过参数查找结果集数目
+     * @author pengdc
+     * @param params
+     * @return
+     */
+    public int findCount(Map<String, Object> params) {
+        return this.getDAO().queryCount(params);
+    }
 
 
 	@Override
@@ -131,15 +132,19 @@ public abstract class BaseServiceImpl<PK extends Serializable, T> implements Bas
 		}
 		StringBuffer sql=new StringBuffer();
 		Map<Y,Z> result=new HashMap();
+		SqlSession sqlSession = null;
+		Connection connection = null;
+		PreparedStatement ps = null;
+		ResultSet resultSet = null;
 		try {
-			SqlSession sqlSession = sqlSessionFactory.openSession();
-			Connection connection = sqlSession.getConnection();
+			sqlSession = sqlSessionFactory.openSession();
+			connection = sqlSession.getConnection();
 			sql.append("SELECT ").append(columnKey).append(",").append(columnValue).append(" FROM ").append(tableName).append(" WHERE ").append(columnKey).append(" IN (").append(StringUtils.join(ids, ",")).append(")");
 			if(tenantId != null){
 				sql.append(" AND tenant_id_ = ").append(tenantId);
 			}
-			PreparedStatement ps = connection.prepareStatement(sql.toString());
-			ResultSet resultSet = ps.executeQuery();
+			ps = connection.prepareStatement(sql.toString());
+			resultSet = ps.executeQuery();
 			while (resultSet.next()){
 				Y key;
 				Z value;
@@ -159,21 +164,30 @@ public abstract class BaseServiceImpl<PK extends Serializable, T> implements Bas
 				}
 				result.put(key, value);
 			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}finally {
 			if(resultSet!=null){
-				resultSet.close();
+				try {
+					resultSet.close();
+				} catch (SQLException e) {
+					e.printStackTrace();
+				}
 			}
 			if(ps!=null){
-				ps.close();
+				try {
+					ps.close();
+				} catch (SQLException e) {
+					e.printStackTrace();
+				}
 			}
 			if(sqlSession!=null){
 				sqlSession.close();
 			}
-		} catch (Exception e) {
-			e.printStackTrace();
 		}
 
-		return result;
-	}
+            return result;
+        }
 
 	@Override
 	public <K extends List, Y, Z> Map<Y,Z> getMap(String tableName, String columnKey, String columnValue, String ids, Class<Y> keyType, Class<Z> valueType){
@@ -182,12 +196,16 @@ public abstract class BaseServiceImpl<PK extends Serializable, T> implements Bas
 		}
 		StringBuffer sql=new StringBuffer();
 		Map<Y,Z> result=new HashMap();
+		SqlSession sqlSession = null;
+		Connection connection = null;
+		PreparedStatement ps = null;
+		ResultSet resultSet = null;
 		try {
-			SqlSession sqlSession = sqlSessionFactory.openSession();
-			Connection connection = sqlSession.getConnection();
+			sqlSession = sqlSessionFactory.openSession();
+			connection = sqlSession.getConnection();
 			sql.append("SELECT ").append(columnKey).append(",").append(columnValue).append(" FROM ").append(tableName).append(" WHERE ").append(columnKey).append(" IN (").append(ids).append(")");
-			PreparedStatement ps = connection.prepareStatement(sql.toString());
-			ResultSet resultSet = ps.executeQuery();
+			ps = connection.prepareStatement(sql.toString());
+			resultSet = ps.executeQuery();
 			while (resultSet.next()){
 				Y key;
 				Z value;
@@ -207,30 +225,43 @@ public abstract class BaseServiceImpl<PK extends Serializable, T> implements Bas
 				}
 				result.put(key, value);
 			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}finally {
 			if(resultSet!=null){
-				resultSet.close();
+				try {
+					resultSet.close();
+				} catch (SQLException e) {
+					e.printStackTrace();
+				}
 			}
 			if(ps!=null){
-				ps.close();
+				try {
+					ps.close();
+				} catch (SQLException e) {
+					e.printStackTrace();
+				}
 			}
 			if(sqlSession!=null){
 				sqlSession.close();
 			}
-		} catch (Exception e) {
-			e.printStackTrace();
 		}
 
-		return result;
-	}
+            return result;
+        }
 
 
 	@Override
 	public <K extends List, Y, Z> Map<Y,Z> getMap(String tableName, String columnKey, String columnValue,Boolean hasDelFlag,Integer tenantId, Class<Y> keyType, Class<Z> valueType){
 		StringBuffer sql=new StringBuffer();
 		Map<Y,Z> result=new HashMap();
+		SqlSession sqlSession = null;
+		Connection connection = null;
+		PreparedStatement ps = null;
+		ResultSet resultSet = null;
 		try {
-			SqlSession sqlSession = sqlSessionFactory.openSession();
-			Connection connection = sqlSession.getConnection();
+			sqlSession = sqlSessionFactory.openSession();
+			connection = sqlSession.getConnection();
 			sql.append("SELECT ").append(columnKey).append(",").append(columnValue).append(" FROM ").append(tableName).append(" WHERE 1 = 1");
 			if(hasDelFlag){
 				sql.append(" AND del_flag_ = 0");
@@ -238,8 +269,8 @@ public abstract class BaseServiceImpl<PK extends Serializable, T> implements Bas
 			if(tenantId != null){
 				sql.append(" AND tenant_id_ = ").append(tenantId);
 			}
-			PreparedStatement ps = connection.prepareStatement(sql.toString());
-			ResultSet resultSet = ps.executeQuery();
+			ps = connection.prepareStatement(sql.toString());
+			resultSet = ps.executeQuery();
 			while (resultSet.next()){
 				Y key;
 				Z value;
@@ -259,19 +290,28 @@ public abstract class BaseServiceImpl<PK extends Serializable, T> implements Bas
 				}
 				result.put(key, value);
 			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}finally {
 			if(resultSet!=null){
-				resultSet.close();
+				try {
+					resultSet.close();
+				} catch (SQLException e) {
+					e.printStackTrace();
+				}
 			}
 			if(ps!=null){
-				ps.close();
+				try {
+					ps.close();
+				} catch (SQLException e) {
+					e.printStackTrace();
+				}
 			}
 			if(sqlSession!=null){
 				sqlSession.close();
 			}
-		} catch (Exception e) {
-			e.printStackTrace();
 		}
 
-		return result;
-	}
+            return result;
+        }
 }

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

@@ -130,6 +130,8 @@ public class RoomServiceImpl implements RoomService {
     private VipGroupDao vipGroupDao;
     @Autowired
     private ImLiveBroadcastRoomService imLiveBroadcastRoomService;
+    @Autowired
+    private SysConfigService sysConfigService;
 
     @Override
     public Integer getCurrentCourseId(String roomId) {
@@ -267,8 +269,22 @@ public class RoomServiceImpl implements RoomService {
         // 网络课形式:RTC房间,直播间
         if (GroupType.LIVE == courseSchedule.getGroupType()) {
 
+            if (sysUser.getId().intValue() != courseSchedule.getActualTeacherId()) {
+                // 学生课程购买记录
+                CourseScheduleStudentPayment studentPayment = courseScheduleStudentPaymentDao.getByUserIdAndCourseId(sysUser.getId(),
+                        courseSchedule.getId());
+                if (Objects.isNull(studentPayment)) {
+                    throw new BizException(MessageFormat.format("{0}你已退学", courseSchedule.getName()));
+                }
+            }
+
             // 直播课已结束
-            if (CourseStatusEnum.NOT_START == courseSchedule.getStatus()) {
+            int studentRemindTime = Integer.parseInt(sysConfigService.findByParamName(SysConfigService.LIVE_CLASS_START_REMIND_TIME).getParanValue());
+
+            Date date = DateUtil.startDateAndEndTime(courseSchedule.getClassDate(), courseSchedule.getStartClassTime());
+            date = DateUtil.addMinutes(date, -studentRemindTime);
+            // 课程是否开始
+            if(CourseStatusEnum.NOT_START.equals(courseSchedule.getStatus()) && date.after(new Date())) {
                 throw new BizException("直播课未开始");
             }
 
@@ -384,11 +400,14 @@ public class RoomServiceImpl implements RoomService {
 
         DateTime time = DateTime.parse(liveStartTime, DateTimeFormat.forPattern(DateUtil.DEFAULT_PATTERN + " " + DateUtil.EXPANDED_TIME_FORMAT));
 
-        String roomUid = "LIVE-" + roomId + "-" + time.toDate().getTime();
+        String roomUid = "LIVE-" + roomId + "-" + courseSchedule.getActualTeacherId().toString()+"-" + time.toDate().getTime();
         ImLiveBroadcastRoom liveRoom = JSON.parseObject(vipGroup.getLiveConfigJson(), ImLiveBroadcastRoom.class);
 
         try {
-
+            ImLiveBroadcastRoom room = imLiveBroadcastRoomService.getByRoomUid(roomUid);
+            if (Objects.nonNull(room)) {
+                liveRoom.setId(room.getId());
+            }
 
             if (StringUtils.isBlank(liveRoom.getServiceProvider())) {
                 //查询房间过期时间
@@ -408,10 +427,10 @@ public class RoomServiceImpl implements RoomService {
             liveRoom.setTenantId(courseSchedule.getTenantId());
 
             // 创建直播间
-            imLiveBroadcastRoomService.save(liveRoom);
+            imLiveBroadcastRoomService.saveOrUpdate(liveRoom);
 
             // 开启直播间
-            imLiveBroadcastRoomService.createLiveRoom(liveRoom);
+            imLiveBroadcastRoomService.createLiveRoomNoTransactional(liveRoom);
 
             // 更新课程关联直播间
             CourseSchedule schedule = new CourseSchedule();
@@ -425,6 +444,7 @@ public class RoomServiceImpl implements RoomService {
                     .eq(ImLiveBroadcastRoom::getRoomUid, roomUid)
                     .last("LIMIT 1")
                     .one();
+            throw new BizException("直播间创建失败,请联系客服");
         }
 
         // 返回直播间信息

+ 5 - 0
mec-student/src/main/java/com/ym/mec/student/controller/StudentCourseScheduleController.java

@@ -102,4 +102,9 @@ public class StudentCourseScheduleController extends BaseController {
 		return succeed(scheduleService.queryMusicCoursePlan(sysUserService.getUserId(), startDate, endDate));
 	}
 
+    @ApiOperation(value = "获取课程信息")
+    @GetMapping("/queryCourseId")
+    public Object queryCourseId(Long courseId){
+        return succeed(scheduleService.detailLiveCourse(courseId));
+    }
 }

+ 51 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/controller/CourseHomeworkController.java

@@ -2,6 +2,7 @@ package com.ym.mec.teacher.controller;
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.CourseHomeworkDao;
 import com.ym.mec.biz.dal.dto.CourseHomeworkStudentDetailDto;
 import com.ym.mec.biz.dal.dto.CourseHomeworkWrapper;
 import com.ym.mec.biz.dal.dto.StudentLessonTrainingDetailWrapper;
@@ -14,6 +15,7 @@ import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
 import com.ym.mec.biz.service.CourseHomeworkService;
 import com.ym.mec.biz.service.ExtracurricularExercisesReplyService;
 import com.ym.mec.biz.service.StudentCourseHomeworkService;
+import com.ym.mec.biz.service.StudentLessonTrainingDetailService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
@@ -30,7 +32,9 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 
 /**
@@ -51,6 +55,12 @@ public class CourseHomeworkController extends BaseController {
     @Autowired
     private SysUserFeignService sysUserFeignService;
 
+    @Autowired
+    private StudentLessonTrainingDetailService studentLessonTrainingDetailService;
+
+    @Autowired
+    private CourseHomeworkDao courseHomeworkDao;
+
     @ApiOperation(value = "布置课堂作业")
     @GetMapping("/addCourseHomework")
     @AuditLogAnnotation(operateName = "布置课堂作业")
@@ -171,6 +181,47 @@ public class CourseHomeworkController extends BaseController {
 
 
 
+    @ApiOperation(value = "根据课程计划获取需要交作业的学生统计")
+    @PostMapping("/findCourseStudentsPublicSubject/v2")
+    public HttpResponseResult<CourseHomeworkWrapper.StudentHomeworkRecordStat> findCourseStudentsPublicSubjectV2(@Validated @RequestBody StudentLessonTrainingDetailWrapper.StudentLessonTrainingQuery query){
+        List<StudentCourseHomework> list;
+        if(ELessonTrainingType.HOMEWORK.equals(query.getType())){
+            if (Objects.isNull(query.getCourseScheduleId())) {
+                throw new BizException("请指定课程");
+            }
+            list =  (studentCourseHomeworkService.findStudentCourseHomeworkByCourseV2(query));
+        }else{
+            list =  (studentCourseHomeworkService.findExtraExerciseStudentsV2(query));
+        }
+
+        CourseHomeworkWrapper.StudentHomeworkRecordStat stat = new CourseHomeworkWrapper.StudentHomeworkRecordStat();
+        stat.setAllNum(list.size());
+        stat.setFinishNum((int) list.stream().filter(StudentCourseHomework::getFinishFlag).count());
+        stat.setUnFinishNum(stat.getAllNum()-stat.getFinishNum());
+        stat.setStudentCourseHomeworkList(list);
+        return succeed(stat);
+
+    }
+
+
+    @ApiOperation(value = "老师练习详情的练习组内作业信息")
+    @PostMapping("/findHomeworkGroupInfo")
+    public HttpResponseResult<List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail>> findHomeworkGroupInfo(@Validated @RequestBody StudentLessonTrainingDetailWrapper.HomeworkGroupInfoQuery query){
+
+        if (ELessonTrainingType.HOMEWORK.equals(query.getType())) {
+            CourseHomework courseHomework = courseHomeworkDao.findByCourseSchedule(query.getCourseScheduleId().longValue());
+            if(Objects.isNull(courseHomework)){
+                throw new BizException("作业不存在");
+            }
+            query.setCourseScheduleId(courseHomework.getId().intValue());
+        }
+        Map<Integer, List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail>> groupMap = studentLessonTrainingDetailService.getGroupMap(query.getCourseScheduleId().longValue(), query.getType());
+
+
+        return succeed(groupMap.get(query.getGroup()));
+
+    }
+
     @ApiOperation(value = "查询单个学生的训练")
     @GetMapping("/findCourseHomeworkStudentDetailPublic/v2")
     public HttpResponseResult<StudentLessonTrainingDetailWrapper.StudentLessonTraining> findCourseHomeworkStudentDetailPublicV2(@RequestParam Long courseScheduleId, @RequestParam Long userId, @RequestParam ELessonTrainingType type){

+ 37 - 8
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherController.java

@@ -4,7 +4,10 @@ import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
 import com.ym.mec.biz.dal.dao.SubjectDao;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.CooperationOrgan;
+import com.ym.mec.biz.dal.entity.StudentCourseHomework;
+import com.ym.mec.biz.dal.entity.Subject;
 import com.ym.mec.biz.dal.entity.Teacher;
+import com.ym.mec.biz.dal.enums.ELessonTrainingType;
 import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.controller.BaseController;
@@ -15,14 +18,11 @@ import com.ym.mec.common.page.QueryInfo;
 import io.swagger.annotations.*;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.Date;
-import java.util.List;
-import java.util.Optional;
+import org.springframework.util.CollectionUtils;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
 import java.util.stream.Collectors;
 
 @RequestMapping("teacher")
@@ -47,6 +47,9 @@ public class TeacherController extends BaseController {
 	@Autowired
     private StudentRegistrationService studentRegistrationService;
 
+    @Autowired
+    private StudentCourseHomeworkService studentCourseHomeworkService;
+
     @ApiOperation(value = "修改教师个人中心信息")
     @PostMapping("/update")
     public Object update(Teacher teacher) {
@@ -191,4 +194,30 @@ public class TeacherController extends BaseController {
         return succeed(teacherService.queryTeacherMusicStudentOverViewV2(queryInfo));
     }
 
+
+
+    @ApiOperation(value = "根据课程计划获取需要交作业的学生声部-公用")
+    @PostMapping("/findCourseStudentsSubjectPublic/v2")
+    public HttpResponseResult<List<Subject>> findCourseStudentsSubjectPublicV2(@Validated @RequestBody StudentLessonTrainingDetailWrapper.StudentLessonTrainingQuery query){
+        List<StudentCourseHomework> studentCourseHomeworkByCourseV2;
+        if(ELessonTrainingType.HOMEWORK.equals(query.getType())){
+            if (Objects.isNull(query.getCourseScheduleId())) {
+                throw new BizException("请指定课程");
+            }
+            studentCourseHomeworkByCourseV2 = studentCourseHomeworkService.findStudentCourseHomeworkByCourseV2(
+                    query);
+        }else{
+            studentCourseHomeworkByCourseV2 = studentCourseHomeworkService.findExtraExerciseStudentsV2(query);
+        }
+
+        if (CollectionUtils.isEmpty(studentCourseHomeworkByCourseV2)) {
+            return succeed(new ArrayList<>());
+        }
+        // 获取声部
+        List<Integer> collect = studentCourseHomeworkByCourseV2.stream().map(StudentCourseHomework::getSubjectId).collect(
+                Collectors.toList());
+
+        return succeed(subjectService.findBySubjectByIdList(collect));
+
+    }
 }

+ 1 - 0
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/adapay/Payment.java

@@ -6,6 +6,7 @@ import java.util.*;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.huifu.adapay.core.exception.BaseAdaPayException;
+import com.huifu.adapay.core.util.StringUtil;
 import com.huifu.adapay.model.PaymentReverse;
 import com.huifu.adapay.model.Refund;
 import com.ym.mec.thirdparty.adapay.entity.BaseResult;

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

@@ -329,7 +329,7 @@ public class ClassGroupController extends BaseController {
     @GetMapping("/queryClassGroupPage")
     @PreAuthorize("@pcs.hasPermissions('classGroup/queryClassGroupPage')")
     public HttpResponseResult queryClassGroupPage(ClassGroupQueryInfo queryInfo){
-        queryInfo = organizationService.onlyEducation(queryInfo);
+        queryInfo.setOrganIds(organizationService.getEmployeeOrgan(queryInfo.getOrganIds()));
         return succeed(classGroupService.queryClassGroupPage(queryInfo));
     }
 

+ 22 - 0
mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleController.java

@@ -3,6 +3,7 @@ package com.ym.mec.web.controller;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.ClassGroupDao;
 import com.ym.mec.biz.dal.dao.ClassGroupTeacherMapperDao;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
 import com.ym.mec.biz.dal.dao.VipGroupDao;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
@@ -15,6 +16,7 @@ import com.ym.mec.biz.service.*;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
+import com.ym.mec.util.date.DateUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -59,6 +61,8 @@ public class CourseScheduleController extends BaseController {
     private OrganizationService organizationService;
     @Autowired
     private VipGroupDao vipGroupDao;
+    @Autowired
+    private SysConfigDao sysConfigDao;
 
     @ApiOperation(value = "课表详情")
     @GetMapping("/query")
@@ -186,6 +190,24 @@ public class CourseScheduleController extends BaseController {
                     &&!VipGroupStatusEnum.FINISHED.equals(vipGroup.getStatus())){
                 throw new BizException("非进行中课程组不允许进行此操作");
             }
+
+            // 直播课
+            if (GroupType.LIVE.equals(oldCourseSchedule.getGroupType())){
+                if(org.apache.commons.lang3.StringUtils.isNotBlank(oldCourseSchedule.getLiveRoomId())){
+                    // 重置连堂课,关联直播间,消息推送状态
+                    courseSchedule.setLiveRemind(0);
+                    courseSchedule.setContinuousCourse(false);
+                    courseSchedule.setLiveRoomId("");
+                }
+                String startRemindTime = sysConfigDao.findConfigValue("live_class_start_remind_time");
+                if(StringUtils.isEmpty(startRemindTime)){
+                    startRemindTime = "30";
+                }
+                if(DateUtil.minutesBetween(new Date(),oldCourseSchedule.getStartClassTime()) < Integer.parseInt(startRemindTime)
+                 && DateUtil.minutesBetween(new Date(),oldCourseSchedule.getEndClassTime()) >= 0){
+                    throw new BizException("直播课课程开始前{}分钟不允许调整",startRemindTime);
+                }
+            }
         }
         if(Objects.isNull(courseSchedule.getClassGroupId())){
             courseSchedule.setClassGroupId(oldCourseSchedule.getClassGroupId());

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

@@ -1892,7 +1892,7 @@ public class ExportController extends BaseController {
         }
         queryInfo.setPage(1);
         queryInfo.setRows(49999);
-        queryInfo.setIsExport(true);
+        queryInfo.setExport(true);
         ManagerDownload managerDownload = exportService.saveManagerDownload(ExportTypeEnum.COURSE_SCHEDULE, sysUser.getId());
         TenantContextHolder.setTenantId(tenantId);
         HttpResponseResult succeed = exportService.asyncExport(() -> exportService.superFindCourseSchedules(queryInfo, managerDownload), managerDownload.getName());
@@ -2800,10 +2800,10 @@ public class ExportController extends BaseController {
         OutputStream outputStream = response.getOutputStream();
         try {
             HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部", "学员姓名", "学员编号", "老师姓名", "老师编号",
-                    "课程组编号", "课程编号", "课程名称", "课程组类型", "课程类型", "上课时间","签到时间", "签退时间", "考勤状态"}, new String[]{
+                    "课程组编号", "课程编号", "课程名称", "课程组类型", "课程类型", "上课时间","签到时间", "签退时间", "考勤状态","来源"}, new String[]{
                     "courseSchedule.organization.name", "username", "userId", "courseSchedule.teacherName", "teacherId", "musicGroupId", "courseScheduleId",
                     "courseSchedule.name", "groupType.desc", "courseSchedule.type.msg", "classTimeStr", "signInTime",
-                    "signOutTime", "status.msg"}, rows);
+                    "signOutTime", "status.msg","joinCourseType.msg"}, rows);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attac:wq" +
                     "hment;filename=courseAttendance-" + DateUtil.getDate(new Date()) + ".xls");

+ 16 - 0
mec-web/src/main/java/com/ym/mec/web/controller/ImportController.java

@@ -3,6 +3,7 @@ package com.ym.mec.web.controller;
 import com.ym.mec.biz.dal.entity.FinancialExpenditure;
 import com.ym.mec.biz.dal.entity.Goods;
 import com.ym.mec.biz.dal.entity.StudentPaymentRouteOrder;
+import com.ym.mec.biz.dal.entity.StudentVisit;
 import com.ym.mec.biz.dal.enums.TemplateTypeEnum;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.controller.BaseController;
@@ -22,6 +23,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.util.CollectionUtils;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -55,6 +57,8 @@ public class ImportController extends BaseController {
     private TempBuyFreeLiveTheoryCourseService liveTheoryCourseService;
     @Autowired
     private MusicGroupService musicGroupService;
+    @Autowired
+    private StudentVisitService studentVisitService;
 
 
     @ApiOperation(value = "导入商品")
@@ -204,4 +208,16 @@ public class ImportController extends BaseController {
             return failed(StringUtils.join(errMsg, ","));
         }
     }
+
+    @ApiOperation(value = "批量导入乐团回访")
+    @PostMapping(value = "/importMusicVisit")
+    @PreAuthorize("@pcs.hasPermissions('import/importMusicVisit')")
+    public HttpResponseResult<StudentVisit> importMusicVisit(@RequestParam("file") MultipartFile file) throws Exception {
+        List<String> errMsg = studentVisitService.importMusicVisit(file);
+        if (CollectionUtils.isEmpty(errMsg)) {
+            return succeed();
+        } else {
+            return failed(StringUtils.join(errMsg, ","));
+        }
+    }
 }

+ 14 - 5
mec-web/src/main/java/com/ym/mec/web/controller/TeacherController.java

@@ -3,6 +3,7 @@ package com.ym.mec.web.controller;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.ELessonTrainingType;
+import com.ym.mec.biz.dal.enums.StandardEnum;
 import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.service.ClassGroupService;
 import com.ym.mec.biz.service.CourseHomeworkService;
@@ -76,8 +77,8 @@ public class TeacherController extends BaseController {
     public HttpResponseResult<PageInfo<Teacher>> queryPage(TeacherQueryInfo queryInfo) {
         queryInfo.setOrganId(organizationService.getEmployeeOrgan(queryInfo.getOrganId()));
         if(queryInfo.getTenantId() == 28){
-        	queryInfo.setTenantId(1);
-        	queryInfo.setOrganId(null);
+            queryInfo.setTenantId(1);
+            queryInfo.setOrganId(null);
         }
         return succeed(teacherService.queryPageDetail(queryInfo));
     }
@@ -116,7 +117,7 @@ public class TeacherController extends BaseController {
         organId = organizationService.getEmployeeOrgan(organId);
         demissionFlag = false;
         if(isForzenWithQueryCondition == null){
-        	isForzenWithQueryCondition = false;
+            isForzenWithQueryCondition = false;
         }
         return succeed(teacherService.findTeachers(organId,demissionFlag,isForzenWithQueryCondition));
     }
@@ -236,14 +237,22 @@ public class TeacherController extends BaseController {
     @ApiOperation(value = "根据课程计划获取需要交作业的学生-公用")
     @PostMapping("/findCourseStudentsPublic/v2")
     public HttpResponseResult<List<StudentCourseHomework>> findCourseStudentsPublicV2(@Validated @RequestBody StudentLessonTrainingDetailWrapper.StudentLessonTrainingQuery query){
+        List<StudentCourseHomework>  result = new ArrayList<>();
         if(ELessonTrainingType.HOMEWORK.equals(query.getType())){
             if (Objects.isNull(query.getCourseScheduleId())) {
                 throw new BizException("请指定课程");
             }
-            return succeed(studentCourseHomeworkService.findStudentCourseHomeworkByCourseV2(query));
+            result = studentCourseHomeworkService.findStudentCourseHomeworkByCourseV2(query);
         }else{
-            return succeed(studentCourseHomeworkService.findExtraExerciseStudentsV2(query));
+            result = studentCourseHomeworkService.findExtraExerciseStudentsV2(query);
         }
+        // 完成才返回提交时间
+        for (StudentCourseHomework studentCourseHomework : result) {
+            if (!StandardEnum.STANDARD.equals(studentCourseHomework.getStandardFlag())) {
+                studentCourseHomework.setSubmitTime(null);
+            }
+        }
+        return succeed(result);
     }
 
 

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

@@ -449,7 +449,6 @@ public class VipGroupManageController extends BaseController {
     @ApiOperation(value = "删除直播课")
     @GetMapping(value = "/delLiveGroup/{id}")
     public HttpResponseResult<Object> delLiveGroup(@PathVariable Integer id){
-
         return succeed(vipGroupService.del(id));
     }
 }

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

@@ -54,6 +54,7 @@ public class VisitController extends BaseController {
         studentVisit.setVisiterType(StudentVisit.VisiterTypeEnum.EDU_TEACHER);
         return succeed(studentVisitService.addVisit(studentVisit));
     }
+
     @ApiOperation(value = "修改问题状态")
     @PostMapping(value = "/updateProbStatus")
     @PreAuthorize("@pcs.hasPermissions('visit/updateProbStatus')")
@@ -64,7 +65,6 @@ public class VisitController extends BaseController {
         }else{
             return failed(s);
         }
-
     }
 
 

+ 9 - 1
mec-web/src/main/resources/columnMapper.ini

@@ -121,4 +121,12 @@ ID = id
 手机号 = phone
 声部 = subjectName
 年级 = grade
-班级 = currentClass
+班级 = currentClass
+
+[缴费中乐团批量回访]
+乐团编号 = musicGroupId
+手机号 = phone
+回访日期 = visitTime
+学员情况 = overview
+家长反馈 = feedback
+问题状态 = probStatus