Pārlūkot izejas kodu

Merge remote-tracking branch 'origin/test' into test

yuanliang 1 gadu atpakaļ
vecāks
revīzija
6570eb1508
55 mainītis faili ar 1045 papildinājumiem un 768 dzēšanām
  1. 0 618
      .idea/httpRequests/http-requests-log.http
  2. 2 0
      mec-application/src/main/java/com/ym/mec/AppServerApplication.java
  3. 1 1
      mec-application/src/main/java/com/ym/mec/config/ResourceServerConfig.java
  4. 9 2
      mec-application/src/main/java/com/ym/mec/student/controller/ImGroupController.java
  5. 43 0
      mec-application/src/main/java/com/ym/mec/student/controller/ImHistoryMessageController.java
  6. 8 2
      mec-application/src/main/java/com/ym/mec/teacher/controller/ImGroupController.java
  7. 47 0
      mec-application/src/main/java/com/ym/mec/teacher/controller/ImHistoryMessageController.java
  8. 7 2
      mec-application/src/main/java/com/ym/mec/web/controller/ImGroupController.java
  9. 42 6
      mec-application/src/main/java/com/ym/mec/web/controller/ImHistoryMessageController.java
  10. 9 2
      mec-application/src/main/java/com/ym/mec/web/controller/education/ImController.java
  11. 6 3
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/provider/AbstractAuthenticationProvider.java
  12. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/EmployeeDao.java
  13. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  14. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherDao.java
  15. 14 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ImGroupMemberDto.java
  16. 15 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ImGroupNoticeDto.java
  17. 21 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroupMember.java
  18. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/mapper/SchoolStaffMapper.java
  19. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/ImGroupMemberWrapper.java
  20. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/ImGroupWrapper.java
  21. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/EmployeeService.java
  22. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupService.java
  23. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SchoolStaffService.java
  24. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java
  25. 4 3
      mec-biz/src/main/java/com/ym/mec/biz/service/SysMessageService.java
  26. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysUserService.java
  27. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TeacherService.java
  28. 8 2
      mec-biz/src/main/java/com/ym/mec/biz/service/im/impl/ImGroupCoreServiceImpl.java
  29. 14 12
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java
  30. 28 9
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeServiceImpl.java
  31. 8 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupMemberPlusServiceImpl.java
  32. 187 62
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupServiceImpl.java
  33. 7 9
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImUserFriendServiceImpl.java
  34. 9 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SchoolStaffServiceImpl.java
  35. 5 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  36. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRepairServiceImpl.java
  37. 36 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
  38. 6 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMessageServiceImpl.java
  39. 39 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserServiceImpl.java
  40. 21 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherServiceImpl.java
  41. 0 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  42. 9 0
      mec-biz/src/main/resources/config/mybatis/EmployeeMapper.xml
  43. 1 1
      mec-biz/src/main/resources/config/mybatis/ImGroupMapper.xml
  44. 3 1
      mec-biz/src/main/resources/config/mybatis/ImGroupNoticeMapper.xml
  45. 17 0
      mec-biz/src/main/resources/config/mybatis/SchoolStaffMapper.xml
  46. 43 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  47. 14 0
      mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  48. 8 0
      mec-common/audit-log/src/main/java/com/yonge/log/dal/model/HistoryMessageTencent.java
  49. 13 0
      mec-common/audit-log/src/main/java/com/yonge/log/service/HistoryMessageTenantService.java
  50. 128 5
      mec-common/audit-log/src/main/java/com/yonge/log/service/impl/HistoryMessageTenantServiceImpl.java
  51. 132 0
      mec-common/audit-log/src/main/java/com/yonge/log/wrapper/HistoryMessageTencentWrapper.java
  52. 7 3
      mec-im/src/main/java/com/ym/controller/GroupController.java
  53. 16 4
      mec-im/src/main/java/com/ym/controller/PrivateController.java
  54. 7 6
      mec-im/src/main/java/com/ym/controller/UserController.java
  55. 2 2
      mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java

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

@@ -1,618 +0,0 @@
-POST http://127.0.0.1:8805/api-web/imHistoryMessage/imToTencent
-Authorization: bearer 01af4346-c7e5-4e43-9950-9617ff0743bf
-Content-Length: 0
-Connection: Keep-Alive
-User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
-Accept-Encoding: br,deflate,gzip,x-gzip
-
-###
-
-POST http://127.0.0.1:8805/api-web/imHistoryMessage/imToTencent
-Authorization: bearer 01af4346-c7e5-4e43-9950-9617ff0743bf
-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-10-20T201808.200.json
-
-###
-
-POST http://127.0.0.1:8805/api-web/imHistoryMessage/imToTencent
-Authorization: bearer 01af4346-c7e5-4e43-9950-9617ff0743bf
-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-10-20T200147.200.json
-
-###
-
-POST http://127.0.0.1:8805/api-web/imHistoryMessage/ImportIM
-Authorization: bearer 01af4346-c7e5-4e43-9950-9617ff0743bf
-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-10-20T195243.200.json
-
-###
-
-POST http://127.0.0.1:8805/api-web/imHistoryMessage/imToTencent
-Authorization: bearer 01af4346-c7e5-4e43-9950-9617ff0743bf
-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-10-20T195232.200.json
-
-###
-
-GET http://127.0.0.1:8805/api-web/imGroup/groupTransfer
-Authorization: bearer 01af4346-c7e5-4e43-9950-9617ff0743bf
-Connection: Keep-Alive
-User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
-Accept-Encoding: br,deflate,gzip,x-gzip
-
-<> 2023-10-20T195151.200.json
-
-###
-
-POST http://127.0.0.1:8805/api-web/imHistoryMessage/imToTencent
-Authorization: bearer 01af4346-c7e5-4e43-9950-9617ff0743bf
-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-10-20T195028.200.json
-
-###
-
-POST http://127.0.0.1:8805/api-web/imHistoryMessage/imToTencent
-Authorization: bearer 31a32cfa-3c2e-4b27-bea4-bff679f1eee2
-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-10-20T194928.200.json
-
-###
-
-GET http://127.0.0.1:8005/open/queryAllOrg
-Connection: Keep-Alive
-User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
-Accept-Encoding: br,deflate,gzip,x-gzip
-
-<> 2023-09-18T100913.200.json
-
-###
-
-POST http://127.0.0.1:8005/open/oaOrgIds?userId=2248313
-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-09-15T234119.200.json
-
-###
-
-POST http://127.0.0.1:8005/open/oaOrgIds?userId=2248313
-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-09-15T233859.200.json
-
-###
-
-GET http://127.0.0.1:8005/open/queryAllOrg
-Connection: Keep-Alive
-User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
-Accept-Encoding: br,deflate,gzip,x-gzip
-
-<> 2023-09-15T233807.200.json
-
-###
-
-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-15T221721.200.json
-
-###
-
-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-15T221523.200.json
-
-###
-
-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-15T221236.200.json
-
-###
-
-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-15T220649.200.json
-
-###
-
-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-15T220555.200.json
-
-###
-
-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-15T220546.200.json
-
-###
-
-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-15T220439.200.json
-
-###
-
-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-15T220236.200.json
-
-###
-
-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-15T215903.200.json
-
-###
-
-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-15T215426.200.json
-
-###
-
-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-15T215131.200.json
-
-###
-
-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-15T100514.200.json
-
-###
-
-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
-
-{
-  "page": 1,
-  "rows": 10,
-//  "startTime": "2023-06-06 10:14:57",
-//  "endTime": "2023-06-08 10:14:57",
-//  "search": "",
-  "status": "UNDERWAY"
-}
-
-<> 2023-06-14T173156.200.json
-
-###
-
-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
-
-{
-  "page": 1,
-  "rows": 10,
-//  "startTime": "2023-06-06 10:14:57",
-//  "endTime": "2023-06-08 10:14:57",
-//  "search": "",
-  "status": "NOT_START"
-}
-
-<> 2023-06-14T173111.200.json
-
-###
-
-POST http://127.0.0.1:9002/teacherCourseSchedule/liveCoursePage
-authorization: bearer a9b023c1-f525-4b95-8723-0ca14b038624
-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
-
-{
-  "page": 1,
-  "rows": 10,
-//  "startTime": "2023-06-06 10:14:57",
-//  "endTime": "2023-06-08 10:14:57",
-//  "search": "",
-  "status": "NOT_START"
-}
-
-<> 2023-06-14T173045.200.json
-
-###
-
-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
-
-<> 2023-06-14T154028.200.json
-
-###
-
-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
-
-<> 2023-06-14T145629.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/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-14T143343.200.json
-
-###
-
-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-14T143049.200.json
-
-###
-
-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
-
-{
-  "courseScheduleId": "2328",
-  "status": "SHARE",
-  "search": ""
-}
-
-<> 2023-06-14T124937.200.json
-
-###
-
-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
-
-{
-  "courseScheduleId": "2328",
-  "status": "SHARE",
-  "search": ""
-}
-
-<> 2023-06-14T124615.200.json
-
-###
-
-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
-
-{
-  "courseScheduleId": "2328",
-  "status": "SHARE",
-  "search": ""
-}
-
-<> 2023-06-14T124548.200.json
-
-###
-
-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
-
-{
-  "courseScheduleId": "2328",
-  "status": "SHARE",
-  "search": ""
-}
-
-<> 2023-06-14T124526.200.json
-
-###
-
-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
-
-{
-  "courseScheduleId": "2328",
-  "status": "SHARE",
-  "search": ""
-}
-
-<> 2023-06-14T124513.200.json
-
-###
-
-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
-
-{
-  "courseScheduleId": "2328",
-  "status": "SHARE",
-  "search": ""
-}
-
-<> 2023-06-14T124441.200.json
-
-###
-
-POST http://127.0.0.1:9002/teacherCourseSchedule/liveCoursePage
-authorization: bearer a9b023c1-f525-4b95-8723-0ca14b038624
-Content-Type: application/json
-Content-Length: 152
-Connection: Keep-Alive
-User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
-Accept-Encoding: br,deflate,gzip,x-gzip
-
-{
-  "page": 1,
-  "rows": 10,
-//  "startTime": "2023-06-06 10:14:57",
-//  "endTime": "2023-06-08 10:14:57",
-//  "search": "",
-//  "status": "NOT_START"
-}
-
-<> 2023-06-14T111123.200.json
-
-###
-
-POST http://127.0.0.1:8005/vipGroupManage/liveStudentList
-Authorization: bearer b2d082f2-2e51-4880-8119-5471c5287bf9
-Content-Type: application/json
-Content-Length: 78
-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,
-  "liveGroupId": 102,
-  "search": "测试59611"
-}
-
-<> 2023-06-14T105403.200.json
-
-###
-
-POST http://127.0.0.1:8005/vipGroupManage/liveStudentList
-Authorization: bearer b2d082f2-2e51-4880-8119-5471c5287bf9
-Content-Type: application/json
-Content-Length: 77
-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,
-  "liveGroupId": 102,
-  "search": "测试5961"
-}
-
-<> 2023-06-14T105355.200.json
-
-###
-
-POST http://127.0.0.1:8005/vipGroupManage/liveStudentList
-Authorization: bearer b2d082f2-2e51-4880-8119-5471c5287bf9
-Content-Type: application/json
-Content-Length: 51
-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,
-  "liveGroupId": 102
-}
-
-<> 2023-06-14T105332.200.json
-
-###
-
-GET http://127.0.0.1:8005/task/liveCourseRemind
-Connection: Keep-Alive
-User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
-Accept-Encoding: br,deflate,gzip,x-gzip
-
-<> 2023-06-13T183554.200.json
-
-###
-
-GET http://127.0.0.1:8005/task/liveCourseRemind
-Connection: Keep-Alive
-User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
-Accept-Encoding: br,deflate,gzip,x-gzip
-
-<> 2023-06-13T183425.200.json
-
-###
-
-GET http://127.0.0.1:8005/task/liveCourseRemind
-Connection: Keep-Alive
-User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
-Accept-Encoding: br,deflate,gzip,x-gzip
-
-<> 2023-06-13T183308.200.json
-
-###
-
-GET http://127.0.0.1:8005/task/liveCourseRemind
-Connection: Keep-Alive
-User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
-Accept-Encoding: br,deflate,gzip,x-gzip
-
-<> 2023-06-13T182452.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-12T163044.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-12T095605.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-12T095427.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-12T095323.200.json
-
-###
-

+ 2 - 0
mec-application/src/main/java/com/ym/mec/AppServerApplication.java

@@ -1,5 +1,6 @@
 package com.ym.mec;
 
+import com.spring4all.swagger.EnableSwagger2Doc;
 import com.ym.mec.config.AppBeanNameGenerator;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -15,6 +16,7 @@ import org.springframework.context.annotation.Configuration;
 @ComponentScan(basePackages = {"com.ym.mec", "org.snaker.engine", "com.yonge.log", "com.mec.redisson"})
 @MapperScan(basePackages = {"com.ym.mec.biz.**.dao", "com.yonge.datasource.dao", "com.ym.mec.biz.dal.mapper"})
 @Configuration
+@EnableSwagger2Doc
 public class AppServerApplication {
     public static void main(String[] args) {
         new SpringApplicationBuilder(AppServerApplication.class)

+ 1 - 1
mec-application/src/main/java/com/ym/mec/config/ResourceServerConfig.java

@@ -32,7 +32,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
                 .authorizeRequests()
                 .antMatchers("/api-web/task/**")
                 .hasIpAddress("0.0.0.0/0")
-                .antMatchers(
+                .antMatchers("/v2/api-docs",
                 //common
                         "/*/v2/api-docs", "/*/code/*",
 

+ 9 - 2
mec-application/src/main/java/com/ym/mec/student/controller/ImGroupController.java

@@ -15,6 +15,7 @@ import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.collections.CollectionUtils;
+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.PathVariable;
@@ -23,6 +24,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 import java.util.Optional;
 
 @RequestMapping("${app-config.url.student:}/imGroup")
@@ -57,7 +59,12 @@ public class ImGroupController extends BaseController {
 		if (imGroupId.contains("S") || imGroupId.contains("I")){
 			imGroupId = imGroupId.substring(1);
 		}
-		return succeed(imGroupService.get(imGroupId));
+		ImGroup imGroup = imGroupService.get(imGroupId);
+		// 设置默认头像
+		if (Objects.nonNull(imGroup.getGroupType()) && StringUtils.isBlank(imGroup.getImg())) {
+			imGroup.setImg(imGroup.getGroupType().getAvatar());
+		}
+		return succeed(imGroup);
 	}
 
 	@ApiOperation("查询群详情(重构版)")
@@ -98,7 +105,7 @@ public class ImGroupController extends BaseController {
 			List<String> userTypes = Lists.newArrayList(user.getUserType().split(","));
 			if (userTypes.size() > 1 || userTypes.contains(ClientEnum.TEACHER.getCode())) {
 				// 增加用户身份数量 > 1 或者包含老师身份,统一使用实名
-				dto.setFriendNickname(Optional.ofNullable(user.getRealName()).orElse(user.getUsername()));
+				dto.setFriendNickname(Optional.ofNullable(user.getRealName()).filter(StringUtils::isNotBlank).orElse(user.getUsername()));
 			} else if (user.getUserType().contains("STUDENT") || user.getUserType().contains("SCHOOL")) {
 				dto.setFriendNickname(user.getUsername());
 			} else {

+ 43 - 0
mec-application/src/main/java/com/ym/mec/student/controller/ImHistoryMessageController.java

@@ -0,0 +1,43 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.biz.service.ImGroupService;
+import com.ym.mec.biz.service.UploadFileService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.yonge.log.service.HistoryMessageService;
+import com.yonge.log.service.HistoryMessageTenantService;
+import com.yonge.log.wrapper.HistoryMessageTencentWrapper;
+import com.yonge.mongodb.PageInfo;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RequestMapping("${app-config.url.student:}/imHistoryMessage")
+@Slf4j
+@RestController
+public class ImHistoryMessageController extends BaseController {
+
+	@Autowired
+	private HistoryMessageService historyMessageService;
+	@Autowired
+	private UploadFileService uploadFileService;
+
+	@Autowired
+	private ImGroupService imGroupService;
+
+    @Autowired
+    private HistoryMessageTenantService historyMessageTenantService;
+
+    @ApiOperation("历史聊天记录查询")
+    @PostMapping(value = "/historyMessage")
+    public HttpResponseResult<PageInfo<HistoryMessageTencentWrapper.HistoryMessageTencent>> historyMessage(@RequestBody  HistoryMessageTencentWrapper.HistoryMessageTencentQuery query) throws Exception {
+
+        return succeedData(historyMessageTenantService.historyMessage(query));
+    }
+
+
+}

+ 8 - 2
mec-application/src/main/java/com/ym/mec/teacher/controller/ImGroupController.java

@@ -26,6 +26,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
+import java.util.Objects;
 import java.util.Optional;
 import java.util.stream.Collectors;
 
@@ -68,7 +69,12 @@ public class ImGroupController extends BaseController {
 		if (imGroupId.contains("S") || imGroupId.contains("I")){
 			imGroupId = imGroupId.substring(1);
 		}
-		return succeed(imGroupService.get(imGroupId));
+		ImGroup imGroup = imGroupService.get(imGroupId);
+		// 设置默认头像
+		if (Objects.nonNull(imGroup.getGroupType()) && StringUtils.isBlank(imGroup.getImg())) {
+			imGroup.setImg(imGroup.getGroupType().getAvatar());
+		}
+		return succeed(imGroup);
 	}
 
 	@ApiOperation("查询群详情(重构版)")
@@ -120,7 +126,7 @@ public class ImGroupController extends BaseController {
 			List<String> userTypes = Lists.newArrayList(user.getUserType().split(","));
 			if (userTypes.size() > 1 || userTypes.contains(ClientEnum.TEACHER.getCode())) {
 				// 增加用户身份数量 > 1 或者包含老师身份,统一使用实名
-				dto.setFriendNickname(Optional.ofNullable(user.getRealName()).orElse(user.getUsername()));
+				dto.setFriendNickname(Optional.ofNullable(user.getRealName()).filter(StringUtils::isNotBlank).orElse(user.getUsername()));
 			} else if (user.getUserType().contains("STUDENT") || user.getUserType().contains("SCHOOL")) {
 				dto.setFriendNickname(user.getUsername());
 			} else {

+ 47 - 0
mec-application/src/main/java/com/ym/mec/teacher/controller/ImHistoryMessageController.java

@@ -0,0 +1,47 @@
+package com.ym.mec.teacher.controller;
+
+import com.ym.mec.biz.service.ImGroupService;
+import com.ym.mec.biz.service.UploadFileService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.entity.UploadReturnBean;
+import com.yonge.log.dal.model.HistoryMessage;
+import com.yonge.log.service.HistoryMessageService;
+import com.yonge.log.service.HistoryMessageTenantService;
+import com.yonge.log.wrapper.HistoryMessageTencentWrapper;
+import com.yonge.mongodb.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.File;
+import java.util.List;
+
+@RequestMapping("${app-config.url.teacher:}/imHistoryMessage")
+@Slf4j
+@RestController
+public class ImHistoryMessageController extends BaseController {
+
+	@Autowired
+	private HistoryMessageService historyMessageService;
+	@Autowired
+	private UploadFileService uploadFileService;
+
+	@Autowired
+	private ImGroupService imGroupService;
+
+    @Autowired
+    private HistoryMessageTenantService historyMessageTenantService;
+
+    @ApiOperation("历史聊天记录查询")
+    @PostMapping(value = "/historyMessage")
+    public HttpResponseResult<PageInfo<HistoryMessageTencentWrapper.HistoryMessageTencent>> historyMessage(@RequestBody  HistoryMessageTencentWrapper.HistoryMessageTencentQuery query) throws Exception {
+
+        return succeedData(historyMessageTenantService.historyMessage(query));
+    }
+
+
+}

+ 7 - 2
mec-application/src/main/java/com/ym/mec/web/controller/ImGroupController.java

@@ -73,7 +73,12 @@ public class ImGroupController extends BaseController {
 		if (imGroupId.contains("S") || imGroupId.contains("I")){
 			imGroupId = imGroupId.substring(1);
 		}
-		return succeed(imGroupService.get(imGroupId));
+		ImGroup imGroup = imGroupService.get(imGroupId);
+		// 设置默认头像
+		if (Objects.nonNull(imGroup.getGroupType()) && StringUtils.isBlank(imGroup.getImg())) {
+			imGroup.setImg(imGroup.getGroupType().getAvatar());
+		}
+		return succeed(imGroup);
 	}
 
 	@ApiOperation("查询群详情(重构版)")
@@ -135,7 +140,7 @@ public class ImGroupController extends BaseController {
 			List<String> userTypes = Lists.newArrayList(user.getUserType().split(","));
 			if (userTypes.size() > 1 || userTypes.contains(ClientEnum.TEACHER.getCode())) {
 				// 增加用户身份数量 > 1 或者包含老师身份,统一使用实名
-				dto.setFriendNickname(Optional.ofNullable(user.getRealName()).orElse(user.getUsername()));
+				dto.setFriendNickname(Optional.ofNullable(user.getRealName()).filter(StringUtils::isNotBlank).orElse(user.getUsername()));
 			} else if (user.getUserType().contains("STUDENT") || user.getUserType().contains("SCHOOL")) {
 				dto.setFriendNickname(user.getUsername());
 			} else {

+ 42 - 6
mec-application/src/main/java/com/ym/mec/web/controller/ImHistoryMessageController.java

@@ -1,27 +1,29 @@
 package com.ym.mec.web.controller;
 
-import com.ym.mec.biz.dal.entity.ImGroup;
-import com.ym.mec.biz.dal.entity.ImHistoryMessage;
+import com.yonge.log.wrapper.HistoryMessageTencentWrapper;
 import com.ym.mec.biz.service.ImGroupService;
 import com.ym.mec.biz.service.UploadFileService;
 import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.UploadReturnBean;
 import com.yonge.log.dal.model.HistoryMessage;
+import com.yonge.log.dal.model.HistoryMessageTencent;
 import com.yonge.log.service.HistoryMessageService;
+import com.yonge.log.service.HistoryMessageTenantService;
+import com.yonge.mongodb.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 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 org.springframework.web.bind.annotation.*;
 
 import java.io.File;
 import java.util.List;
 
 @RequestMapping("${app-config.url.web:}/imHistoryMessage")
 @Api(tags = "系统操作日志")
+@Slf4j
 @RestController
 public class ImHistoryMessageController extends BaseController {
 
@@ -33,6 +35,9 @@ public class ImHistoryMessageController extends BaseController {
 	@Autowired
 	private ImGroupService imGroupService;
 
+    @Autowired
+    private HistoryMessageTenantService historyMessageTenantService;
+
 	@GetMapping("/save")
 	public Object saveImHistoryMessage(String fileDir) throws Exception {
 		File file = new File(fileDir);
@@ -68,10 +73,15 @@ public class ImHistoryMessageController extends BaseController {
     @ApiOperation("融云im To 腾讯")
     @PostMapping(value = "/imToTencent")
     public void imToTencent() throws Exception {
+
+        // 删除旧数据
+        historyMessageTenantService.deleteOld();
+
         com.yonge.mongodb.PageInfo<HistoryMessage> info;
 //        historyMessageService.updateAllStatus(0);
         //计算总数据量
         long count = historyMessageService.querySyncCount();
+        log.info("总数据量:"+count);
         //计算调用次数
         long num = (int) Math.ceil(count / 100);
         for (long i = 0; i <=num ; i++) {
@@ -85,7 +95,33 @@ public class ImHistoryMessageController extends BaseController {
             }
             //IM转换
             imGroupService.imToTencent(footer);
+            log.info("已转换:"+(i+1)*size);
         }
     }
 
+    @ApiOperation("初始化消息体")
+    @PostMapping(value = "/initMsgBodyJson")
+    public void initMsgBodyJson() throws Exception {
+        //计算总数据量
+        int count = historyMessageTenantService.initMsgBodyJsonCount();
+        log.info("总数据量:"+count);
+        //计算调用次数
+        int num = (int) Math.ceil(count / 100);
+        for (int i = 0; i <=num ; i++) {
+            int size =100;
+            //获取融云消息
+            //List<ImGroup> list = imGroupService.lambdaQuery().last("limit "+(page-1)*size+","+size).list();
+            historyMessageTenantService.initMsgBodyJson(1,size);
+            log.info("已转换:"+(i+1)*size);
+        }
+    }
+
+    @ApiOperation("历史聊天记录查询")
+    @PostMapping(value = "/historyMessage")
+    public HttpResponseResult<PageInfo<HistoryMessageTencentWrapper.HistoryMessageTencent>> historyMessage(@RequestBody  HistoryMessageTencentWrapper.HistoryMessageTencentQuery query) throws Exception {
+
+        return succeedData(imGroupService.historyMessage(query));
+    }
+
+
 }

+ 9 - 2
mec-application/src/main/java/com/ym/mec/web/controller/education/ImController.java

@@ -7,6 +7,8 @@ import com.ym.mec.biz.service.SysMessageService;
 import com.ym.mec.biz.service.TeacherService;
 import com.ym.mec.common.controller.BaseController;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -91,12 +93,17 @@ public class ImController extends BaseController {
     }
 
     @ApiOperation(value = "发送私聊消息")
+    @ApiImplicitParams({
+        @ApiImplicitParam(name = "targetId", value = "接收人id", required = true, dataType = "String"),
+        @ApiImplicitParam(name = "content", value = "消息内容", required = true, dataType = "String"),
+        @ApiImplicitParam(name = "extra", value = "扩展字段", dataType = "String")
+    })
     @GetMapping("/sendPrivateMessage")
-    public Object sendPrivateMessage(String targetId,String content) {
+    public Object sendPrivateMessage(String targetId,String content, String extra) {
         if (StringUtils.isEmpty(targetId) || StringUtils.isEmpty(content)) {
             return failed("参数校验错误");
         }
-        sysMessageService.sendPrivateMessage(targetId,content);
+        sysMessageService.sendPrivateMessage(targetId,content, extra);
         return succeed();
     }
 }

+ 6 - 3
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/provider/AbstractAuthenticationProvider.java

@@ -156,11 +156,14 @@ public abstract class AbstractAuthenticationProvider implements AuthenticationPr
 
 		public void check(UserDetails user) {
 			if (!user.isAccountNonLocked()) {
-				throw new LockedException("User account is locked");
+				// User account is locked
+				throw new LockedException("当前账号已锁定");
 			} else if (!user.isEnabled()) {
-				throw new DisabledException("User account is disabled");
+				// User account is disabled
+				throw new DisabledException("当前账号已禁用");
 			} else if (!user.isAccountNonExpired()) {
-				throw new AccountExpiredException("User account is expired");
+				// User account is expired
+				throw new AccountExpiredException("当前账号已失效");
 			}
 		}
 	}

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

@@ -233,4 +233,8 @@ public interface EmployeeDao extends BaseDAO<Integer, Employee> {
     int countEmployeeBasicInfo(Map<String, Object> params);
 
     List<SysUserDto> queryEmployeeBasicInfo(Map<String, Object> params);
+
+    List<Employee> queryBaseInfoByPage(Map<String, Object> params);
+
+    int queryBaseInfoByCount(Map<String, Object> params);
 }

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

@@ -380,4 +380,9 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
     int countMusicGroupStudents(Map<String, Object> paramMap);
 
     List<Student> listByIds(@Param("studentIds") List<Long> studentIds);
+    List<Student> queryBaseInfoByPage(Map<String, Object> params);
+
+    int queryBaseInfoCount(Map<String, Object> params);
+
+    List<SysUser> listUserByIds(@Param("userIds") List<Integer> userIds);
 }

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

@@ -547,4 +547,8 @@ public interface TeacherDao extends BaseDAO<Integer, Teacher> {
     * @date 2023/5/8 11:59
     */
     List<BasicUserDto> queryUserByPhones(@Param("phones") List<String> phones);
+
+    List<Teacher> queryBaseInfoByPage(Map<String, Object> params);
+
+    int queryBaseInfoByCount(Map<String, Object> params);
 }

+ 14 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ImGroupMemberDto.java

@@ -15,6 +15,9 @@ public class ImGroupMemberDto extends ImGroupMember {
     @ApiModelProperty(value = "群编号;")
     private String groupId;
 
+    @ApiModelProperty("群成员头象")
+    private String avatar;
+
     public String getType() {
         return type;
     }
@@ -43,4 +46,15 @@ public class ImGroupMemberDto extends ImGroupMember {
         return getImGroupId();
     }
 
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public void setGroupId(String groupId) {
+        this.groupId = groupId;
+    }
 }

+ 15 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ImGroupNoticeDto.java

@@ -4,6 +4,8 @@ import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.entity.ImGroupNotice;
 import io.swagger.annotations.ApiModelProperty;
 
+import java.util.Objects;
+
 public class ImGroupNoticeDto extends ImGroupNotice {
 
 	private SysUser user = new SysUser();
@@ -18,6 +20,9 @@ public class ImGroupNoticeDto extends ImGroupNotice {
 	@ApiModelProperty(value = "是否发送给新人")
 	private Boolean sentToNewMemberFlag;
 
+	@ApiModelProperty("用户名称")
+	private String username;
+
 	public SysUser getUser() {
 		return user;
 	}
@@ -38,4 +43,14 @@ public class ImGroupNoticeDto extends ImGroupNotice {
 		return isIsSentToNewMember();
 	}
 
+	public String getUsername() {
+		if (Objects.nonNull(getUser())) {
+			return getUser().getRealName();
+		}
+		return username;
+	}
+
+	public void setUsername(String username) {
+		this.username = username;
+	}
 }

+ 21 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroupMember.java

@@ -38,6 +38,8 @@ public class ImGroupMember extends BaseEntity {
 	private String subjectName;
 
 	private String subjectId;
+
+	private String avatar;
 	
 	/**  */
 	private java.util.Date createTime;
@@ -45,6 +47,7 @@ public class ImGroupMember extends BaseEntity {
 	/**  */
 	private java.util.Date updateTime;
 
+	private Integer tenantId;
 
 
     public String getType() {
@@ -151,6 +154,24 @@ public class ImGroupMember extends BaseEntity {
 		this.groupNickname = groupNickname;
 	}
 
+	public String getAvatar() {
+		return avatar;
+	}
+
+	public void setAvatar(String avatar) {
+		this.avatar = avatar;
+	}
+
+	@Override
+	public Integer getTenantId() {
+		return tenantId;
+	}
+
+	@Override
+	public void setTenantId(Integer tenantId) {
+		this.tenantId = tenantId;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/mapper/SchoolStaffMapper.java

@@ -44,4 +44,7 @@ public interface SchoolStaffMapper extends BaseMapper<SchoolStaff> {
     void delUser(@Param("userId") Long userId);
 
     List<SchoolStaff> getByCoopIdAndType(@Param("cooperationOrganId") Integer cooperationOrganId, @Param("staffType") ESchoolStaffType staffType);
+
+	List<SchoolStaffWrapper.SchoolStaff> selectBaseInfoByPage(@Param("page") IPage<SchoolStaffWrapper.SchoolStaff> page,
+															  @Param("param") SchoolStaffWrapper.SchoolStaffQuery query);
 }

+ 2 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/ImGroupMemberWrapper.java

@@ -2,6 +2,7 @@ package com.ym.mec.biz.dal.wrapper;
 
 import com.alibaba.fastjson.JSON;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.ym.mec.common.tenant.TenantContextHolder;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -101,7 +102,7 @@ public class ImGroupMemberWrapper {
         private Boolean groupJoin;
 
         @ApiModelProperty("机构ID")
-        private Integer tenantId;
+        private Integer tenantId = TenantContextHolder.getTenantId();
 
         public static ImGroupMember from(String json) {
             return JSON.parseObject(json, ImGroupMember.class);

+ 2 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/ImGroupWrapper.java

@@ -68,7 +68,7 @@ public class ImGroupWrapper {
 
 
         @ApiModelProperty("主键ID")
-        private Long id;
+        private String id;
 
         @ApiModelProperty("群组ID")
         private String groupId;
@@ -127,7 +127,7 @@ public class ImGroupWrapper {
             return JSON.toJSONString(this);
         }
 
-        public ImGroup id(Long id) {
+        public ImGroup id(String id) {
             this.id = id;
             return this;
         }

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/EmployeeService.java

@@ -9,6 +9,7 @@ import com.ym.mec.biz.dal.enums.EmployeeOperateEnum;
 import com.ym.mec.biz.dal.page.EmployeeQueryInfo;
 import com.ym.mec.biz.dal.page.UserBasicQueryInfo;
 import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.BaseService;
 import java.util.HashMap;
 import java.util.List;
@@ -87,4 +88,6 @@ public interface EmployeeService extends BaseService<Integer, Employee> {
     PageInfo<SysUserDto> queryEmployeeBasicInfo(UserBasicQueryInfo queryInfo);
 
     void resetPassword(Integer userId);
+
+    PageInfo<Employee> queryBaseInfoByPage(QueryInfo queryInfo);
 }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupService.java

@@ -14,10 +14,12 @@ import com.ym.mec.biz.dal.enums.school.ESchoolStaffType;
 import com.ym.mec.biz.dal.wrapper.ImGroupWrapper;
 import com.ym.mec.common.service.BaseService;
 import com.yonge.log.dal.model.HistoryMessage;
+import com.yonge.log.wrapper.HistoryMessageTencentWrapper;
 import org.jetbrains.annotations.NotNull;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
+import java.util.Map;
 
 public interface ImGroupService extends BaseService<String, ImGroup> {
 
@@ -214,4 +216,13 @@ public interface ImGroupService extends BaseService<String, ImGroup> {
 
     @NotNull
     List<TencentRequest.MessageBody> getPrivateMessge(HistoryMessage i, JSONObject jsonObject);
+
+    /**
+     * 查询聊天记录
+     *
+     * @param query 查询条件
+     */
+    com.yonge.mongodb.PageInfo<HistoryMessageTencentWrapper.HistoryMessageTencent> historyMessage(HistoryMessageTencentWrapper.HistoryMessageTencentQuery query);
+
+    Map<String,ImGroup> getMapByIds(List<String> groupIdList);
 }

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SchoolStaffService.java

@@ -98,4 +98,7 @@ public interface SchoolStaffService extends IService<SchoolStaff>  {
      * @param schoolStaffUpdate SchoolStaffWrapper.SchoolStaffUpdate
      */
     void updateAccount(SchoolStaffWrapper.SchoolStaffUpdate schoolStaffUpdate);
+
+    IPage<SchoolStaffWrapper.SchoolStaff> selectBaseInfoByPage(IPage<SchoolStaffWrapper.SchoolStaff> page,
+                                                               SchoolStaffWrapper.SchoolStaffQuery query);
 }

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

@@ -16,6 +16,7 @@ import com.ym.mec.biz.dal.enums.StudentMusicGroupStatusEnum;
 import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.dal.wrapper.StudentWrapper;
 import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.BaseService;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -248,4 +249,8 @@ public interface StudentService extends BaseService<Integer, Student> {
     * @date 2023/5/17 11:25
     */
     void updateStudentMember(Integer userId, Date endTime,String memo,Integer operatorId);
+
+    PageInfo<Student> queryBaseInfoByPage(QueryInfo queryInfo);
+
+    Map<Integer,SysUser> getUserMapByIds(List<Integer> userIds);
 }

+ 4 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/SysMessageService.java

@@ -199,10 +199,11 @@ public interface SysMessageService extends BaseService<Long, SysMessage> {
 
 	/**
 	 * 发送私聊消息
-	 * @param studentId
-	 * @param content
+	 * @param studentId 接收人id
+	 * @param content 消息内容
+	 * @param extra 扩展字段
 	 */
-    void sendPrivateMessage(String studentId, String content);
+    void sendPrivateMessage(String studentId, String content, String extra);
 
 	/**
 	 * 发送私聊消息

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

@@ -12,4 +12,8 @@ public interface SysUserService {
     SysUser queryUserById(Integer userId);
 
     Boolean updateSysUser(SysUser user);
+
+    String getImName(SysUser sysUser);
+
+    String getImAvatar(SysUser sysUser);
 }

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

@@ -256,4 +256,6 @@ public interface TeacherService extends BaseService<Integer, Teacher> {
     PageInfo<TeacherMusicStudentOverViewDto> queryTeacherMusicStudentOverViewV2(TeacherServeQueryInfo queryInfo);
 
     Map<Integer,Teacher> getMapByIds(List<Integer> teacherIds);
+
+    PageInfo<Teacher> queryBaseInfoByPage(QueryInfo queryInfo);
 }

+ 8 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/im/impl/ImGroupCoreServiceImpl.java

@@ -136,20 +136,25 @@ public class ImGroupCoreServiceImpl implements ImGroupCoreService {
     @Transactional
     public String groupCreate(ImGroupMemberWrapper.ImGroupMember userInfo, ImGroupWrapper.ImGroup imGroup) throws Exception {
 
-        long id = Optional.ofNullable(imGroup.getId()).orElse(IdWorker.getId());
+        String id = Optional.ofNullable(imGroup.getId()).orElse(String.valueOf(IdWorker.getId()));
         // 生成群组ID
         imGroup.id(id)
                 .type(Optional.ofNullable(imGroup.getType()).orElse("CLASS"))
-                .groupId(String.valueOf(id));
+                .groupId(id);
 
         ImGroupPlus group = JSON.parseObject(imGroup.jsonString(), ImGroupPlus.class);
         group.setId(imGroup.getGroupId());
+        // 群默认头象
+        if (StringUtils.isBlank(group.getImg()) && Objects.nonNull(group.getGroupType())) {
+            group.setImg(group.getGroupType().getAvatar());
+        }
         // 保存群组信息
         imGroupService.saveOrUpdate(group);
 
         List<ImGroupMemberWrapper.ImGroupMember> groupMembers = null;
         String imUserId = null;
         if (userInfo != null) {
+            userInfo.setGroupId(group.getId());
             imUserId = getImUserId(userInfo.getUserId().toString(), userInfo.getClientType());
             groupMembers = Lists.newArrayList(userInfo);
 
@@ -531,6 +536,7 @@ public class ImGroupCoreServiceImpl implements ImGroupCoreService {
                 .imUserId(getImUserId(userId.toString(),clientType))
                 .isAdmin(false)
                 .roleType(clientType)
+                .tenantId(imGroup.getTenantId())
                 .build();
         imGroupMembers.add(groupMember);
 

+ 14 - 12
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java

@@ -506,6 +506,20 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
 
         classGroupService.updateClassStudentNum(classGroupId.intValue(), allStudentIds.size());
 
+        if(musicGroup.getStatus() == MusicGroupStatusEnum.PROGRESS){
+            if (!CollectionUtils.isEmpty(removeStudentIds)){
+                //5、学生退出班级群组
+                imGroupMemberService.quit(classGroup.getId().toString(), new ArrayList<Integer>(removeStudentIds));
+            }
+            if (!CollectionUtils.isEmpty(addStudentIds)) {
+                Map<Integer,String> userRoleMap = new HashMap<>();
+                for (Integer addStudentId : addStudentIds) {
+                    userRoleMap.put(addStudentId, "");
+                }
+                //5、添加进IM群组
+                imGroupMemberService.join(classGroup.getId().toString(), userRoleMap);
+            }
+        }
         if (CollectionUtils.isEmpty(classGroupNotStartCourse)) {
             if (!CollectionUtils.isEmpty(addStudentIds)) {
                 if(musicGroup.getStatus() == MusicGroupStatusEnum.PROGRESS){
@@ -534,23 +548,11 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
 
         if (!CollectionUtils.isEmpty(removeStudentIds)) {
             courseScheduleDao.deleteMusicGroupCourseSchedulesWithStudents(courseIds, new ArrayList<>(removeStudentIds));
-            if(musicGroup.getStatus() == MusicGroupStatusEnum.PROGRESS){
-                //5、学生退出班级群组
-                imGroupMemberService.quit(classGroup.getId().toString(), new ArrayList<Integer>(addStudentIds));
-            }
         }
 
         if (!CollectionUtils.isEmpty(addStudentIds)) {
             courseScheduleStudentPaymentService.createForMusicGroup(classGroup.getMusicGroupId(), classGroupNotStartCourse, new ArrayList<>(addStudentIds));
             studentDao.updateStudentServiceTag(null, new ArrayList<>(addStudentIds), YesOrNoEnum.YES.getCode());
-            if(musicGroup.getStatus() == MusicGroupStatusEnum.PROGRESS){
-                Map<Integer,String> userRoleMap = new HashMap<>();
-                for (Integer addStudentId : addStudentIds) {
-                    userRoleMap.put(addStudentId, "");
-                }
-                //5、添加进IM群组
-                imGroupMemberService.join(classGroup.getId().toString(), userRoleMap);
-            }
         }
 
         //4、调整未上课课酬

+ 28 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeServiceImpl.java

@@ -24,7 +24,9 @@ import com.microsvc.toolkit.middleware.im.message.GroupMemberWrapper;
 import com.ym.mec.biz.dal.dto.SimpleUserDto;
 import com.ym.mec.biz.dal.enums.im.ClientEnum;
 import com.ym.mec.biz.dal.wrapper.ImGroupMemberWrapper;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.biz.service.im.ImGroupCoreService;
+import com.ym.mec.common.page.QueryInfo;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.joda.time.DateTime;
@@ -63,13 +65,6 @@ import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.ParamEnum;
 import com.ym.mec.biz.dal.page.EmployeeQueryInfo;
 import com.ym.mec.biz.dal.page.UserBasicQueryInfo;
-import com.ym.mec.biz.service.EmployeeService;
-import com.ym.mec.biz.service.ImGroupMemberService;
-import com.ym.mec.biz.service.ImUserFriendService;
-import com.ym.mec.biz.service.OaUserService;
-import com.ym.mec.biz.service.SysEmployeePositionService;
-import com.ym.mec.biz.service.SysUserTenantService;
-import com.ym.mec.biz.service.TenantInfoService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.ImGroupModel;
 import com.ym.mec.common.entity.ImResult;
@@ -127,6 +122,9 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
     @Autowired
     private ImPluginContext imPluginContext;
 
+    @Autowired
+    private SysUserService sysUserService;
+
     @Override
     public BaseDAO<Integer, Employee> getDAO() {
         return employeeDao;
@@ -733,10 +731,10 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
                 String username = userInfo.getUsername();
                 List<String> userTypes = Lists.newArrayList(userInfo.getUserType().split(","));
                 if (userTypes.size() > 1 || userTypes.contains(ClientEnum.TEACHER.getCode())) {
-                    username = Optional.ofNullable(userInfo.getRealName()).orElse(username);
+                    username = Optional.ofNullable(userInfo.getRealName()).filter(StringUtils::isNotBlank).orElse(username);
                 }
 
-                imGroupCoreService.register(String.valueOf(userInfo.getId()), "", username, userInfo.getAvatar());
+                imGroupCoreService.register(String.valueOf(userInfo.getId()), "", username, sysUserService.getImAvatar(userInfo));
             } catch (Exception e) {
                 log.error("用户更新信息同步到三方失败,userId:{}", userInfo.getId(), e);
             }
@@ -772,4 +770,25 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
         StringBuffer gym = new StringBuffer("gym").append(user.getPhone().substring(7));
         employeeDao.updatePassword(userId, new BCryptPasswordEncoder().encode(gym.toString()));
     }
+
+    @Override
+    public PageInfo<Employee> queryBaseInfoByPage(QueryInfo queryInfo) {
+        PageInfo<Employee> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<Employee> dataList = new ArrayList<>();
+        int count = queryBaseInfoByCount(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = employeeDao.queryBaseInfoByPage(params);
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    private int queryBaseInfoByCount(Map<String, Object> params) {
+        return employeeDao.queryBaseInfoByCount(params);
+    }
 }

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

@@ -3,13 +3,14 @@ package com.ym.mec.biz.service.impl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ym.mec.biz.dal.entity.ImGroupMemberPlus;
 import com.ym.mec.biz.service.ImGroupMemberPlusService;
+import com.ym.mec.common.tenant.TenantContextHolder;
 import org.springframework.stereotype.Service;
 import lombok.extern.slf4j.Slf4j;
-import com.ym.mec.biz.dal.entity.ImGroupMember;
 import com.ym.mec.biz.dal.mapper.ImGroupMemberPlusMapper;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
+import java.util.Objects;
 
 /**
  * 群成员表
@@ -33,6 +34,12 @@ public class ImGroupMemberPlusServiceImpl extends ServiceImpl<ImGroupMemberPlusM
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void insertBatch(List<ImGroupMemberPlus> imGroupMemberEntity) {
+        // 添加机构ID
+        for (ImGroupMemberPlus item : imGroupMemberEntity) {
+            if (Objects.isNull(item.getTenantId())) {
+                item.setTenantId(TenantContextHolder.getTenantId());
+            }
+        }
         baseMapper.insertBatch(imGroupMemberEntity);
     }
 

+ 187 - 62
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupServiceImpl.java

@@ -1,10 +1,10 @@
 package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.google.common.collect.Lists;
 import com.microsvc.toolkit.middleware.common.http.ImageUtil;
 import com.microsvc.toolkit.middleware.im.ImPluginContext;
@@ -22,21 +22,14 @@ import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.dto.ImGroupDto;
 import com.ym.mec.biz.dal.dto.ImGroupMemberDto;
 import com.ym.mec.biz.dal.dto.NameDto;
-import com.ym.mec.biz.dal.entity.ClassGroupTeacherMapper;
-import com.ym.mec.biz.dal.entity.CooperationOrgan;
-import com.ym.mec.biz.dal.entity.Employee;
-import com.ym.mec.biz.dal.entity.ImGroup;
-import com.ym.mec.biz.dal.entity.ImGroupMember;
-import com.ym.mec.biz.dal.entity.MusicGroup;
-import com.ym.mec.biz.dal.entity.SchoolStaff;
-import com.ym.mec.biz.dal.entity.Student;
-import com.ym.mec.biz.dal.entity.Teacher;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.EFriendRoleType;
 import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
 import com.ym.mec.biz.dal.enums.im.ClientEnum;
 import com.ym.mec.biz.dal.enums.school.ESchoolStaffType;
 import com.ym.mec.biz.dal.mapper.SchoolStaffMapper;
 import com.ym.mec.biz.dal.page.GroupMemberQueryInfo;
+import com.ym.mec.biz.dal.wrapper.ImGroupMemberWrapper;
 import com.ym.mec.biz.dal.wrapper.ImGroupWrapper;
 import com.ym.mec.biz.dal.wrapper.ImHistoryMessageWrapper;
 import com.ym.mec.biz.dal.wrapper.SchoolStaffWrapper;
@@ -63,6 +56,7 @@ import com.yonge.log.dal.model.HistoryMessage;
 import com.yonge.log.dal.model.HistoryMessageTencent;
 import com.yonge.log.service.HistoryMessageService;
 import com.yonge.log.service.HistoryMessageTenantService;
+import com.yonge.log.wrapper.HistoryMessageTencentWrapper;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -83,16 +77,7 @@ import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.Base64;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Random;
-import java.util.UUID;
+import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -221,6 +206,7 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
                     .avatar(sysUser.getAvatar())
                     .nickname(sysUserType == SysUserType.STUDENT?sysUser.getUsername():sysUser.getRealName())
                     .roleType(roleType)
+                    .tenantId(imGroup.getTenantId())
                     .isAdmin(true)
                     .build();
         }
@@ -281,6 +267,7 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
 //                    .avatar(groupMember.getAvatar())
                     .nickname(groupMember.getNickname())
                     .isAdmin(groupMember.getIsAdmin())
+                    .tenantId(groupMember.getTenantId())
                     .imUserId(getImUserId(groupMember.getUserId().toString(), sysUserType.name()))
                     .roleType(groupMember.getRoleType())
                     .build());
@@ -317,7 +304,14 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
 
     @Override
     public List<ImGroup> queryByUserId(Integer userId, String search,String groupType) {
-        return imGroupDao.queryByUserId(userId, search,groupType);
+        List<ImGroup> imGroups = imGroupDao.queryByUserId(userId, search, groupType).stream()
+            .filter(Objects::nonNull).collect(Collectors.toList());
+        for (ImGroup item : imGroups) {
+            if (Objects.nonNull(item.getGroupType()) && StringUtils.isBlank(item.getImg())) {
+                item.setImg(item.getGroupType().getAvatar());
+            }
+        }
+        return imGroups;
     }
 
     @Override
@@ -348,11 +342,14 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
                 List<String> userTypes = Lists.newArrayList(imGroupMemberDto.getUser().getUserType().split(","));
                 if (userTypes.size() > 1 || userTypes.contains(ClientEnum.TEACHER.getCode())) {
                     // 增加用户身份数量 > 1 或者包含老师身份,统一使用实名
-                    imGroupMemberDto.setGroupNickname(imGroupMemberDto.getUser().getRealName());
+                    imGroupMemberDto.setGroupNickname(Optional.ofNullable(imGroupMemberDto.getUser().getRealName()).filter(StringUtils::isNotBlank).orElse(imGroupMemberDto.getUser().getUsername()));
                 }
-
             }
 
+            // 群成员头像
+            if (Objects.nonNull(imGroupMemberDto.getUser())) {
+                imGroupMemberDto.setAvatar(imGroupMemberDto.getUser().getAvatar());
+            }
         }
         return imGroupMemberDtos;
     }
@@ -395,7 +392,7 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
 
         // IM用户信息更新
         try {
-            imGroupCoreService.register(userId.toString(),"",nickName,sysUser.getAvatar());
+            imGroupCoreService.register(userId.toString(),"",nickName,sysUserService.getImAvatar(sysUser));
         } catch (Exception e) {
             log.error("更新用户信息失败",e);
             throw new BizException("更新用户信息失败");
@@ -496,7 +493,8 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
         }
         List<String> imGroupIds = imGroupMembers.stream().map(ImGroupMember::getImGroupId).collect(Collectors.toList());
         // 群组没人,删除群组
-        List<ImGroup> imGroups = imGroupDao.queryByUserId(userId.intValue(),null, ImGroup.GroupTypeEnum.SCHOOL.getCode());
+        List<ImGroup> imGroups = imGroupDao.queryByUserId(userId.intValue(),null, ImGroup.GroupTypeEnum.SCHOOL.getCode()).stream()
+            .filter(Objects::nonNull).collect(Collectors.toList());
 
 
         imGroupMemberDao.deleteByUserId(userId);
@@ -537,8 +535,10 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
         // 注册主播用户信息到三方平台
         imGroupCoreService.register(userId.toString(),"", name, avatar);
 
+        boolean createFlag = false;
         // 群组不存在,先创建群组
         if (Objects.isNull(imGroup)) {
+            createFlag = true;
             CooperationOrgan cooperationOrgan = cooperationOrganService.get(schoolId.intValue());
             imGroup = new ImGroup();
             imGroup.setSchoolId(schoolId);
@@ -554,25 +554,33 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
             imGroup.setUpdateTime(new Date());
             imGroup.setTenantId(cooperationOrgan.getTenantId());
 
-            createImGroup(imGroup,userId,"");
+            createImGroup(imGroup,userId,schoolStaffType.getDescribe());
 
             initSchoolGroup(imGroup.getSchoolId());
-        }
+        } else {
+            ImGroupMemberWrapper.ImGroupMember groupMember = ImGroupMemberWrapper.ImGroupMember.builder()
+                    .userId(userId.longValue())
+                    .nickname(name)
+                    .build();
+            imGroupCoreService.groupMemberJoin(imGroup.getId(), Lists.newArrayList(groupMember));
+            // 更新群主流程
+            if (schoolStaffType.equals(ESchoolStaffType.ORCHESTRA_LEADER)) {
+                groupChangeOwner(userId, imGroup.getId());
+            }
 
+            ImGroupMember imGroupMember = new ImGroupMember();
+            imGroupMember.setImGroupId(imGroup.getId());
+            imGroupMember.setUserId(userId);
+            imGroupMember.setIsAdmin(schoolStaffType.equals(ESchoolStaffType.ORCHESTRA_LEADER));
+            imGroupMember.setRoleType(schoolStaffType.getDescribe());
+            imGroupMember.setNickname(name);
+            imGroupMember.setType(EFriendRoleType.getByName(schoolStaffType.getDescribe()).name());
+            imGroupMember.setTenantId(imGroup.getTenantId());
+            imGroupMemberDao.insert(imGroupMember);
 
-        if (schoolStaffType.equals(ESchoolStaffType.ORCHESTRA_LEADER)) {
-            groupChangeOwner(userId, imGroup.getId());
         }
-        ImGroupMember imGroupMember = new ImGroupMember();
-        imGroupMember.setImGroupId(imGroup.getId());
-        imGroupMember.setUserId(userId);
-        imGroupMember.setIsAdmin(schoolStaffType.equals(ESchoolStaffType.ORCHESTRA_LEADER));
-        imGroupMember.setRoleType(schoolStaffType.getDescribe());
-        imGroupMember.setType(EFriendRoleType.getByName(schoolStaffType.getDescribe()).name());
-        imGroupMember.setTenantId(imGroup.getTenantId());
-        imGroupMemberDao.insert(imGroupMember);
-
         updateImGroupUserNumber(imGroup.getId());
+
     }
 
     private void initSchoolGroup(Long schoolId) {
@@ -761,7 +769,16 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
      */
     @Override
     public List<ImGroup> queryByUserId(ImGroupWrapper.ImQuery query) {
-        return imGroupDao.getByUserId(query);
+        List<ImGroup> imGroups = imGroupDao.getByUserId(query).stream()
+            .filter(Objects::nonNull).collect(Collectors.toList());
+
+        // 群默认头像
+        for (ImGroup item : imGroups) {
+            if (Objects.nonNull(item.getGroupType()) && StringUtils.isBlank(item.getImg())) {
+                item.setImg(item.getGroupType().getAvatar());
+            }
+        }
+        return imGroups;
     }
 
     /**
@@ -935,12 +952,12 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
                 importGroup.setNotification(imGroup.getMemo());
                 importGroup.setFaceUrl(imGroup.getImg());
                 if (StringUtils.isEmpty(imGroup.getImg())) {
-                    importGroup.setFaceUrl("https://gyt.ks3-cn-beijing.ksyuncs.com/icon_group_avatar1.png");
+                    importGroup.setFaceUrl(imGroup.getGroupType().getAvatar());
                 }
                 importGroup.setApplyJoinOption("FreeAccess");
                 importGroup.setCreateTime(imGroup.getCreateTime().getTime() / 1000);
                 if (admin != null) {
-                    register(admin.getUserId().toString(), getClientType(admin.getRoleType()));
+                    register(admin.getUserId().toString(), getClientType(admin.getRoleType()),"");
                 }
                 imPluginContext.getPluginService().importGroup(importGroup);
 
@@ -951,7 +968,7 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
                     continue;
                 }
                 for (ImGroupMember member : groupMembers) {
-                    register(member.getUserId().toString(), getClientType(member.getRoleType()));
+                    register(member.getUserId().toString(), getClientType(member.getRoleType()),"");
                 }
                 MessageWrapper.ImportGroupMember importGroupMember = new MessageWrapper.ImportGroupMember();
                 importGroupMember.setGroupId(imGroup.getId());
@@ -980,11 +997,13 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
         }
     }
 
-    private void register(String userId, String clientType) {
+    private void register(String userId, String clientType,String avatar) {
         SysUser user = sysUserService.queryUserById(Integer.valueOf(userId));
-        String avatar = user.getAvatar();
+        if (user == null) {
+            return;
+        }
         if (StringUtils.isEmpty(avatar)) {
-            avatar = "https://daya.ks3-cn-beijing.ksyun.com/202203/T1WgJaE.png";
+            avatar = user.getAvatar();
         }
         try {
             String username = user.getUsername();
@@ -992,10 +1011,10 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
             // 老师默认使用真实姓名
             List<String> userTypes = Lists.newArrayList(user.getUserType().split(","));
             if (userTypes.size() > 1 || userTypes.contains(ClientEnum.TEACHER.getCode())) {
-                username = Optional.ofNullable(user.getRealName()).orElse(username);
+                username = Optional.ofNullable(user.getRealName()).filter(StringUtils::isNotBlank).orElse(username);
             }
             // 自动激活学生IM帐号
-            imGroupCoreService.register(userId,clientType, username, avatar);
+            imGroupCoreService.register(userId,clientType, username, sysUserService.getImAvatar(user));
         } catch (Exception e) {
             log.error("register user error", e);
         }
@@ -1028,9 +1047,10 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
 
         log.info("------------------------------- import user student ---------------------------");
         List<String[]> student = getStudent(page, rows);
+        SysConfig studentAvatar = sysConfigService.findByParamName(SysConfigService.STUDENT_DEFAULT_AVATAR);
         while (!student.isEmpty()) {
             for (String[] next : student) {
-                register(next[0], next[1]);
+                register(next[0], next[1],studentAvatar.getParanValue());
             }
             count += student.size();
             log.info("import im student success count:{}", count);
@@ -1039,12 +1059,14 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
         }
 
         log.info("------------------------------- import user staff ---------------------------");
+        // USER_DEFAULT_AVATAR
         count = 0;
         page = 1;
+        SysConfig staffAvatar = sysConfigService.findByParamName(SysConfigService.USER_DEFAULT_AVATAR);
         List<String[]> staff = getStaff(page, rows);
         while (!staff.isEmpty()) {
             for (String[] next : staff) {
-                register(next[0], next[1]);
+                register(next[0], next[1],staffAvatar.getParanValue());
             }
             count += staff.size();
             log.info("import im staff success count:{}", count);
@@ -1053,12 +1075,14 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
         }
 
         log.info("------------------------------- import user emps ---------------------------");
+        // TEACHER_DEFAULT_AVATAR
         count = 0;
         page = 1;
+        SysConfig empAvatar = sysConfigService.findByParamName(SysConfigService.TEACHER_DEFAULT_AVATAR);
         List<String[]> emps = getEmp(page, rows);
         while (!emps.isEmpty()) {
             for (String[] next : emps) {
-                register(next[0], next[1]);
+                register(next[0], next[1],empAvatar.getParanValue());
             }
             count += emps.size();
             log.info("import im emps success count:{}", count);
@@ -1069,10 +1093,11 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
         log.info("------------------------------- import user teacher ---------------------------");
         count = 0;
         page = 1;
+        SysConfig teacherAvatar = sysConfigService.findByParamName(SysConfigService.TEACHER_DEFAULT_AVATAR);
         List<String[]> teachers = getTeachers(page, rows);
         while (!teachers.isEmpty()) {
             for (String[] next : teachers) {
-                register(next[0], next[1]);
+                register(next[0], next[1], teacherAvatar.getParanValue());
             }
             count += teachers.size();
             log.info("import im teacher success count:{}", count);
@@ -1093,22 +1118,22 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
         QueryInfo queryInfo = new QueryInfo();
         queryInfo.setPage(page);
         queryInfo.setRows(rows);
-        PageInfo<Employee> employeePageInfo = employeeService.queryPage(queryInfo);
+        PageInfo<Employee> employeePageInfo = employeeService.queryBaseInfoByPage(queryInfo);
         return employeePageInfo.getRows().stream().map(next -> {
             String[] strList = new String[2];
-            strList[0] = next.getId().toString();
-            strList[1] = "EMPLOYEE";
+            strList[0] = next.getUserId().toString();
+            strList[1] = "SYSTEM";
             return strList;
         }).collect(Collectors.toList());
     }
 
     private List<String[]> getStaff(int page, int rows) {
-        Page<SchoolStaffWrapper.SchoolStaff> staffPage = PageUtil.getPage(page, rows);
-        IPage<SchoolStaffWrapper.SchoolStaff> iPage = schoolStaffService.selectPage(staffPage,
+        IPage<SchoolStaffWrapper.SchoolStaff> staffPage = PageUtil.getPage(page, rows);
+        IPage<SchoolStaffWrapper.SchoolStaff> iPage = schoolStaffService.selectBaseInfoByPage(staffPage,
                 new SchoolStaffWrapper.SchoolStaffQuery());
         return iPage.getRecords().stream().map(next -> {
             String[] strList = new String[2];
-            strList[0] = next.getId().toString();
+            strList[0] = next.getUserId().toString();
             strList[1] = "SCHOOL";
             return strList;
         }).collect(Collectors.toList());
@@ -1118,10 +1143,10 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
         QueryInfo queryInfo = new QueryInfo();
         queryInfo.setPage(page);
         queryInfo.setRows(rows);
-        PageInfo<Student> studentPageInfo = studentService.queryPage(queryInfo);
+        PageInfo<Student> studentPageInfo = studentService.queryBaseInfoByPage(queryInfo);
         return studentPageInfo.getRows().stream().map(next -> {
             String[] strList = new String[2];
-            strList[0] = next.getId().toString();
+            strList[0] = next.getUserId().toString();
             strList[1] = "STUDENT";
             return strList;
         }).collect(Collectors.toList());
@@ -1131,7 +1156,7 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
         QueryInfo queryInfo = new QueryInfo();
         queryInfo.setPage(page);
         queryInfo.setRows(rows);
-        PageInfo<Teacher> teacherPageInfo = teacherService.queryPage(queryInfo);
+        PageInfo<Teacher> teacherPageInfo = teacherService.queryBaseInfoByPage(queryInfo);
         return teacherPageInfo.getRows().stream().map(next -> {
             String[] strList = new String[2];
             strList[0] = next.getId().toString();
@@ -1366,6 +1391,11 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
             } else {
                 continue;
             }
+
+            if (CollectionUtils.isEmpty(bodyList)) {
+                continue;
+            }
+            bodyList = bodyList.stream().filter(Objects::nonNull).collect(Collectors.toList());
             if (CollectionUtils.isEmpty(bodyList)) {
                 continue;
             }
@@ -1379,6 +1409,7 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
             // 消息转换
             tencent.setCloudCustomData(jsonObject.getString("extra"));
             tencent.setMsgBody(JSON.toJSONString(bodyList));
+            tencent.setMsgBodyJson(JSON.parseObject(tencent.getMsgBody(), JSONArray.class));
 
             historyMessageTencentService.insert(tencent);
 
@@ -1394,7 +1425,17 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
         List<TencentRequest.MessageBody> bodyList = new ArrayList<>();
         if (i.getClassname().equals("RC:TxtMsg")) {
             //文本
-            TencentRequest.MessageBody body1 = getTimTextElem(jsonObject.getString("content"));
+            //文本
+            String content = jsonObject.getString("content");
+
+            // http开头的链接 扩展字段没有值 放在扩展字段里
+            if (content.startsWith("http")) {
+                String extra = jsonObject.getString("extra");
+                if (StringUtils.isEmpty(extra)) {
+                    jsonObject.put("extra", content);
+                }
+            }
+            TencentRequest.MessageBody body1 = getTimTextElem(content);
             bodyList.add(body1);
         } else if (i.getClassname().equals("RC:ImgMsg")) {
             //图片
@@ -1463,7 +1504,17 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
         List<TencentRequest.MessageBody> list = new ArrayList<>();
         if (i.getClassname().equals("RC:TxtMsg")) {
             //文本
-            TencentRequest.MessageBody body1 = getTimTextElem(jsonObject.getString("content"));
+            String content = jsonObject.getString("content");
+
+            // http开头的链接 扩展字段没有值 放在扩展字段里
+            if (content.startsWith("http")) {
+                String extra = jsonObject.getString("extra");
+                if (StringUtils.isEmpty(extra)) {
+                    jsonObject.put("extra", content);
+                }
+            }
+
+            TencentRequest.MessageBody body1 = getTimTextElem(content);
             list.add(body1);
         } else if (i.getClassname().equals("RC:ImgMsg")) {
             //图片
@@ -1521,6 +1572,80 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
         return list;
     }
 
+    @Override
+    public com.yonge.mongodb.PageInfo<HistoryMessageTencentWrapper.HistoryMessageTencent> historyMessage(HistoryMessageTencentWrapper.HistoryMessageTencentQuery query) {
+        com.yonge.mongodb.PageInfo<HistoryMessageTencentWrapper.HistoryMessageTencent> pageInfo = historyMessageTencentService.historyMessage(query);
+
+        List<HistoryMessageTencentWrapper.HistoryMessageTencent> rows = pageInfo.getRows();
+        if (CollectionUtils.isEmpty(rows)) {
+            return pageInfo;
+        }
+        // 发送人信息
+        List<Integer> fromAccountList = rows.stream()
+            .map(HistoryMessageTencentWrapper.HistoryMessageTencent::getFromAccount)
+            .filter(StringUtils::isNotEmpty)
+            .map(Integer::parseInt)
+            .collect(Collectors.toList());
+        Map<Integer, SysUser> userMap = studentService.getUserMapByIds(fromAccountList);
+        rows.forEach(item -> {
+            if (StringUtils.isEmpty(item.getFromAccount())) {
+                return;
+            }
+            SysUser sysUser = userMap.get(Integer.parseInt(item.getFromAccount()));
+            if (sysUser != null) {
+                item.setFromAccountName(sysUserService.getImName(sysUser));
+                item.setFromAccountAvatar(sysUserService.getImName(sysUser));
+            }
+        });
+        // 接收人
+        List<Integer> toAccountList = rows.stream()
+            .map(HistoryMessageTencentWrapper.HistoryMessageTencent::getToAccount)
+            .filter(StringUtils::isNotEmpty)
+            .map(Integer::parseInt)
+            .collect(Collectors.toList());
+        Map<Integer, SysUser> toUserMap = studentService.getUserMapByIds(toAccountList);
+        rows.forEach(item -> {
+            if (StringUtils.isEmpty(item.getToAccount())) {
+                return;
+            }
+            SysUser sysUser = toUserMap.get(Integer.parseInt(item.getToAccount()));
+            if (sysUser != null) {
+                item.setToAccountName(sysUserService.getImName(sysUser));
+                item.setToAccountAvatar(sysUserService.getImName(sysUser));
+            }
+        });
+        // 群
+        List<String> groupIdList = rows.stream()
+            .map(HistoryMessageTencentWrapper.HistoryMessageTencent::getGroupId)
+            .filter(StringUtils::isNotEmpty)
+            .collect(Collectors.toList());
+        Map<String, ImGroup> groupMap = this.getMapByIds(groupIdList);
+        rows.forEach(item -> {
+            if (StringUtils.isEmpty(item.getGroupId())) {
+                return;
+            }
+            ImGroup imGroup = groupMap.get(item.getGroupId());
+            if (imGroup != null) {
+                item.setGroupName(imGroup.getName());
+                item.setGroupAvatar(imGroup.getImg());
+            }
+        });
+
+        return pageInfo;
+    }
+
+    @Override
+    public Map<String, ImGroup> getMapByIds(List<String> groupIdList) {
+        if (CollectionUtils.isEmpty(groupIdList)) {
+            return new HashMap<>();
+        }
+        List<ImGroup> imGroups = imGroupDao.getByIds(groupIdList);
+        if (CollectionUtils.isEmpty(imGroups)) {
+            return new HashMap<>();
+        }
+        return imGroups.stream().collect(Collectors.toMap(ImGroup::getId, item -> item));
+    }
+
     private TencentRequest.MessageBody getTimGifElem(String remoteUr,int size,int width,int height) {
         if (StringUtils.isEmpty(remoteUr) && size == 0 && width == 0 && height == 0) {
             return null;

+ 7 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImUserFriendServiceImpl.java

@@ -147,14 +147,17 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
             item.setImUserId(imGroupCoreService.getImUserId(String.valueOf(item.getUserId()),""));
 
             // 设置用户好友昵称
-            if (Objects.nonNull(item.getFriend())) {
+            if (Objects.nonNull(item.getFriend()) && StringUtils.isNotBlank(item.getFriend().getUserType())) {
                 String username = item.getFriend().getUsername();
 
                 List<String> userTypes = Lists.newArrayList(item.getFriend().getUserType().split(","));
                 if (userTypes.size() > 1 || userTypes.contains(ClientEnum.TEACHER.getCode())) {
-                    username = Optional.ofNullable(item.getFriend().getRealName()).orElse(username);
+                    username = Optional.ofNullable(item.getFriend().getRealName()).filter(StringUtils::isNotBlank).orElse(username);
+                }
+                // 用户好友默认用户名
+                if (StringUtils.isNotBlank(username)) {
+                    item.setFriendNickname(username);
                 }
-                item.setFriendNickname(username);
             }
         }
         return imUserFriendDtoList;
@@ -170,7 +173,7 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
             if (userTypes.size() > 1 || userTypes.contains(ClientEnum.TEACHER.getCode())) {
                 // 增加用户身份数量 > 1 或者包含老师身份,统一使用实名
                 imUserFriendDto.setFriendNickname(Optional.ofNullable(imUserFriendDto.getFriend().getRealName())
-                    .orElse(imUserFriendDto.getFriend().getUsername()));
+                    .filter(StringUtils::isNotBlank).orElse(imUserFriendDto.getFriend().getUsername()));
             }
 
             imUserFriendDto.setImUserId(imGroupCoreService.getImUserId(String.valueOf(imUserFriendDto.getUserId()),""));
@@ -231,8 +234,6 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void refreshGroupImUserFriend(String musicGroupId,GroupType groupType) {
-//		ExecutorService executor = Executors.newCachedThreadPool();
-//		CompletableFuture.runAsync(()->{
         List<ClassGroup> classGroups = classGroupDao.queryClassGroups(musicGroupId, groupType==null?null:groupType.getCode());
         List<ImUserFriend> imUserFriends = new ArrayList<>();
         classGroups.forEach(e->{
@@ -245,14 +246,11 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
 
         setSchoolStaffImFriend(musicGroupId, imUserFriends);
 
-
         if(imUserFriends.size() > 0){
             batchInsert(imUserFriends);
         }
         //更新用户朋友昵称是空的历史数据(线上没有发现这种问题)
         imUserFriendDao.updateNullNickName();
-//		},executor);
-//		executor.shutdown();
     }
 
     private void setSchoolStaffImFriend(String musicGroupId, List<ImUserFriend> imUserFriends) {

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

@@ -260,7 +260,7 @@ public class SchoolStaffServiceImpl extends ServiceImpl<SchoolStaffMapper, Schoo
             TenantContextHolder.setTenantId(cooperation.getTenantId());
 
             // 创建学校im群
-            imGroupService.addSchoolStaffGroup(schoolStaff.getSchoolId(), user.getId(),user.getUsername(),user.getAvatar(),schoolStaff.getUserType());
+            imGroupService.addSchoolStaffGroup(schoolStaff.getSchoolId(), user.getId(),user.getUsername(),sysUserService.getImAvatar(user),schoolStaff.getUserType());
         } catch (Exception e) {
             log.error("加入群组失败 ",e);
             throw new BizException("加入群组失败");
@@ -797,4 +797,12 @@ public class SchoolStaffServiceImpl extends ServiceImpl<SchoolStaffMapper, Schoo
         sysUserFeignService.exitByPhone("education", sysUser.getPhone());
         return super.updateById(entity);
     }
+
+
+    @Override
+    public IPage<SchoolStaffWrapper.SchoolStaff> selectBaseInfoByPage(IPage<SchoolStaffWrapper.SchoolStaff> page,
+                                                                      SchoolStaffWrapper.SchoolStaffQuery query) {
+        List<SchoolStaffWrapper.SchoolStaff> schoolStaffs = baseMapper.selectBaseInfoByPage(page, query);
+        return page.setRecords(schoolStaffs);
+    }
 }

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

@@ -119,6 +119,9 @@ public class StudentManageServiceImpl implements StudentManageService {
     @Autowired
     private ImGroupCoreService imGroupCoreService;
 
+    @Autowired
+    private SysUserService sysUserService;
+
     @Override
     public PageInfo<StudentManageListDto> findStudentsByOrganId(StudentManageQueryInfo queryInfo) {
         PageInfo<StudentManageListDto> pageInfo = new PageInfo<StudentManageListDto>(queryInfo.getPage(), queryInfo.getRows());
@@ -760,10 +763,10 @@ public class StudentManageServiceImpl implements StudentManageService {
                 String username = userInfo.getUsername();
                 List<String> userTypes = Lists.newArrayList(userInfo.getUserType().split(","));
                 if (userTypes.size() > 1 || userTypes.contains(ClientEnum.TEACHER.getCode())) {
-                    username = Optional.ofNullable(userInfo.getRealName()).orElse(username);
+                    username = Optional.ofNullable(userInfo.getRealName()).filter(StringUtils::isNotBlank).orElse(username);
                 }
 
-                imGroupCoreService.register(String.valueOf(userInfo.getId()), "", username, userInfo.getAvatar());
+                imGroupCoreService.register(String.valueOf(userInfo.getId()), "", username, sysUserService.getImAvatar(userInfo));
             } catch (Exception e) {
                 log.error("用户更新信息同步到三方失败,userId:{}", userInfo.getId(), e);
             }

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

@@ -852,7 +852,7 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
                 imContent = student.getUsername() + "学员您好,您的乐器已保养维修完毕,快递已寄出,请注意查收。";
             }
 
-            sysMessageService.sendPrivateMessage(student.getId().toString(), imContent);
+            sysMessageService.sendPrivateMessage(student.getId().toString(), imContent, "");
         }
         log.info("操作人 :" + sysUser.getId());
     }

+ 36 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java

@@ -23,6 +23,7 @@ import com.ym.mec.common.entity.ImResult;
 import com.ym.mec.common.entity.ImUserModel;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.im.ImFeignService;
@@ -30,6 +31,7 @@ import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -1671,4 +1673,38 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
         student.setIsNewUser(true);
         studentDao.insert(student);
     }
+
+
+    @Override
+    public PageInfo<Student> queryBaseInfoByPage(QueryInfo queryInfo) {
+        PageInfo<Student> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<Student> dataList = new ArrayList<>();
+        int count = queryBaseInfoCount(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = studentDao.queryBaseInfoByPage(params);
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
+    public Map<Integer,SysUser> getUserMapByIds(List<Integer> userIds) {
+        if (CollectionUtils.isEmpty(userIds)) {
+            return new HashMap<>();
+        }
+        List<SysUser> sysUsers = studentDao.listUserByIds(userIds);
+        if (CollectionUtils.isEmpty(sysUsers)) {
+            return new HashMap<>();
+        }
+        return sysUsers.stream().collect(Collectors.toMap(SysUser::getId, Function.identity()));
+    }
+
+    private int queryBaseInfoCount(Map<String, Object> params) {
+        return studentDao.queryBaseInfoCount(params);
+    }
 }

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

@@ -291,6 +291,7 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 
 	@Override
 	public void batchSendImGroupImgMessage(ImSendGroupMessage messageDto) throws Exception {
+		LOGGER.info("batchSendImGroupImgMessage messageDto={}", messageDto);
 		URL url = new URL(messageDto.getFileUrl());
 		BufferedImage bufferedImage = Thumbnails.of(url).scale(0.1f).outputQuality(0.25f).asBufferedImage();
 		ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
@@ -322,6 +323,7 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 	}
 
 	public void sendGroupMessage(ImMessageDto imMessageDto){
+		LOGGER.info("sendGroupMessage groupSend ret={}", imMessageDto);
 		//ExecutorService executor = Executors.newCachedThreadPool();
 		CompletableFuture.runAsync(()->{
 			imFeignService.groupSend(imMessageDto);
@@ -330,6 +332,7 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 
 
     public void sendImMessage(ImMessageDto imMessageDto){
+		LOGGER.info("sendImMessage privateSend ret={}", imMessageDto);
         CompletableFuture.runAsync(()-> imFeignService.privateSend(imMessageDto));
     }
 
@@ -406,14 +409,15 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 	}
 
 	@Override
-	public void sendPrivateMessage(String studentId, String content) {
+	public void sendPrivateMessage(String studentId, String content, String extra) {
 		SysUser sysUser = sysUserFeignService.queryUserInfo();
 		if(sysUser == null){
 			throw new BizException("用户信息获取失败");
 		}
 		//ExecutorService executor = Executors.newCachedThreadPool();
 		CompletableFuture.runAsync(()->{
-			imFeignService.privateSend(getImGroupMessage("RC:TxtMsg",sysUser.getId().toString(),studentId.split(","),content,null));
+			imFeignService.privateSend(getImGroupMessage("RC:TxtMsg", sysUser.getId().toString(),
+				studentId.split(","), content, extra));
 		});
 		//executor.shutdown();
 	}

+ 39 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserServiceImpl.java

@@ -1,12 +1,18 @@
 package com.ym.mec.biz.service.impl;
 
+import com.google.common.collect.Lists;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.SysConfig;
+import com.ym.mec.biz.dal.enums.ClientEnum;
+import com.ym.mec.biz.service.SysConfigService;
 import com.ym.mec.biz.service.SysUserService;
 import com.ym.mec.common.exception.BizException;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
 import java.util.Optional;
 
 @Service
@@ -15,6 +21,9 @@ public class SysUserServiceImpl implements SysUserService {
     @Autowired
     private SysUserFeignService sysUserFeignService;
 
+    @Autowired
+    private SysConfigService sysConfigService;
+
     @Override
     public Integer getUserId(){
         return Optional.ofNullable(sysUserFeignService.queryUserInfo())
@@ -52,4 +61,34 @@ public class SysUserServiceImpl implements SysUserService {
     public Boolean updateSysUser(SysUser user) {
         return sysUserFeignService.updateSysUser(user);
     }
+
+    @Override
+    public String getImName(SysUser sysUser) {
+        if (sysUser == null) {
+            return "";
+        }
+        String username = sysUser.getUsername();
+        List<String> userTypes = Lists.newArrayList(sysUser.getUserType().split(","));
+        if (userTypes.size() > 1 || userTypes.contains(ClientEnum.TEACHER.getCode())) {
+            username = Optional.ofNullable(sysUser.getRealName()).filter(StringUtils::isNotBlank).orElse(username);
+        }
+        return username;
+    }
+
+    @Override
+    public String getImAvatar(SysUser sysUser) {
+        if (sysUser == null) {
+            return "";
+        }
+        String avatar = sysUser.getAvatar();
+        if (StringUtils.isNotBlank(avatar)) {
+            return avatar;
+        }
+        List<String> userTypes = Lists.newArrayList(sysUser.getUserType().split(","));
+        if (userTypes.size() == 1 && userTypes.contains(ClientEnum.STUDENT.getCode())) {
+            return Optional.ofNullable(sysConfigService.findByParamName(SysConfigService.STUDENT_DEFAULT_AVATAR)).orElse(new SysConfig()).getParanValue();
+        } else {
+            return Optional.ofNullable(sysConfigService.findByParamName(SysConfigService.TEACHER_DEFAULT_AVATAR)).orElse(new SysConfig()).getParanValue();
+        }
+    }
 }

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

@@ -817,4 +817,25 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher> implem
         return teacherDao.queryOrganList(userId);
     }
 
+    @Override
+    public PageInfo<Teacher> queryBaseInfoByPage(QueryInfo queryInfo) {
+        PageInfo<Teacher> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<Teacher> dataList = new ArrayList<>();
+        int count = queryBaseInfoByCount(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = teacherDao.queryBaseInfoByPage(params);
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    private int queryBaseInfoByCount(Map<String, Object> params) {
+        return teacherDao.queryBaseInfoByCount(params);
+    }
+
 }

+ 0 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java

@@ -4029,13 +4029,10 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         if (Objects.nonNull(vipGroupApplyBaseInfo.getEducationalTeacherId()) && !vipGroupApplyBaseInfo.getEducationalTeacherId().equals(oldVipGroupInfo.getEducationalTeacherId())) {
             ClassGroup classGroup = classGroupDao.findByMusicGroupAndType(oldVipGroupInfo.getId().toString(), oldVipGroupInfo.getGroupType());
             if (Objects.nonNull(oldVipGroupInfo.getEducationalTeacherId())) {
-
                 imGroupMemberService.quit(classGroup.getId().toString(), oldVipGroupInfo.getEducationalTeacherId());
             }
-
             oldVipGroupInfo.setEducationalTeacherId(vipGroupApplyBaseInfo.getEducationalTeacherId());
             isChange = true;
-
             imGroupMemberService.join(classGroup.getId().toString(), oldVipGroupInfo.getEducationalTeacherId(), "乐团主管", false);
         }
         if (Objects.nonNull(vipGroupApplyBaseInfo.getOrganId()) && !vipGroupApplyBaseInfo.getOrganId().equals(oldVipGroupInfo.getOrganId())) {

+ 9 - 0
mec-biz/src/main/resources/config/mybatis/EmployeeMapper.xml

@@ -453,4 +453,13 @@
             </if>
         </where>
     </sql>
+
+    <select id="queryBaseInfoByPage" resultMap="Employee" parameterType="map">
+        SELECT * FROM employee
+        <include refid="global.limit"/>
+    </select>
+
+    <select id="queryBaseInfoByCount" resultType="int">
+        SELECT COUNT(*) FROM employee
+    </select>
 </mapper>

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

@@ -292,7 +292,7 @@
             and cg.music_group_id_ = #{param.musicGroupId}
         </if>
         <if test="param.groupType != null">
-            and ig.group_type_ = #{param.groupType.code}
+            and ig.group_type_ = #{param.groupType}
         </if>
     </select>
     <select id="queryInfoCount" resultType="java.lang.Integer">

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

@@ -22,6 +22,7 @@
 	
 	<resultMap type="com.ym.mec.biz.dal.dto.ImGroupNoticeDto" id="ImGroupNoticeDto" extends="ImGroupNotice">
 		<result column="real_name_" property="user.realName"/>
+		<result column="username_" property="user.username"/>
         <result column="avatar_" property="user.avatar"/>
 	</resultMap>
 	
@@ -76,7 +77,8 @@
 	
 	<!-- 分页查询 -->
 	<select id="queryForPage" resultMap="ImGroupNoticeDto" parameterType="map">
-		SELECT ign.*,if(u.real_name_ is null or u.real_name_ = '',u.username_,u.real_name_) as real_name_,u.avatar_ FROM im_group_notice ign left join sys_user u on ign.operator_id_ = u.id_
+		SELECT ign.*,if(u.real_name_ is null or u.real_name_ = '',u.username_,u.real_name_) as real_name_, u.username_, u.avatar_
+		FROM im_group_notice ign left join sys_user u on ign.operator_id_ = u.id_
 		<where>
             ign.del_flag_ = 0 and ign.tenant_id_ = #{tenantId}
             <if test="groupId != null">

+ 17 - 0
mec-biz/src/main/resources/config/mybatis/SchoolStaffMapper.xml

@@ -87,6 +87,23 @@
         </where>
 
     </select>
+
+    <select id="selectBaseInfoByPage" resultType="com.ym.mec.biz.dal.wrapper.SchoolStaffWrapper$SchoolStaff">
+        SELECT t1.id_
+        , t1.organ_id_list_                   as organId
+        , t1.school_id_
+        , t1.user_id_
+        , t1.user_type_
+        , t1.tenant_id_
+        , t1.organ_id_list_
+        , t2.username_ AS username
+        , t2.avatar_
+        , t2.phone_                           AS mobile
+        , t1.status_
+        , t1.create_time_
+        FROM school_staff t1
+        JOIN sys_user t2 ON (t1.user_id_ = t2.id_)
+    </select>
     <!--学校员工身份数统计-->
 
 </mapper>

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

@@ -59,6 +59,30 @@
         <result column="current_grade_num_" property="currentGrade"/>
         <result column="certificate_type_" property="certificateType"/>
     </resultMap>
+    <resultMap id="SysUser" type="com.ym.mec.auth.api.entity.SysUser">
+
+        <result column="id_" property="id"/>
+        <result column="real_name_" property="realName"/>
+        <result column="password_" property="password"/>
+        <result column="salt_" property="salt"/>
+        <result column="avatar_" property="avatar"/>
+        <result column="organ_id_" property="organId"/>
+        <result column="lock_flag_" property="lockFlag"/>
+        <result column="del_flag_" property="delFlag" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result column="wx_openid_" property="wxOpenid"/>
+        <result column="qq_openid_" property="qqOpenid"/>
+        <result column="user_type_" property="userType"/>
+        <result column="gender_" property="gender"/>
+        <result column="nation_" property="nation"/>
+        <result column="birthdate_" property="birthdate"/>
+        <result column="email_" property="email"/>
+        <result column="im_token_" property="imToken"/>
+        <result column="id_card_no_" property="idCardNo"/>
+        <result column="wechat_id_" property="wechatId"/>
+        <result column="is_super_admin_" property="isSuperAdmin"/>
+        <result column="current_grade_num_" property="currentGrade"/>
+        <result column="certificate_type_" property="certificateType"/>
+    </resultMap>
 
     <!-- 根据主键查询一条记录 -->
     <select id="get" resultMap="Student">
@@ -1421,4 +1445,23 @@
         </foreach>
 
     </select>
+
+    <select id="queryBaseInfoByPage" resultMap="Student" parameterType="map">
+        SELECT s.*,su.username_,su.phone_ FROM student s
+        LEFT JOIN sys_user su ON  su.id_ = s.user_id_
+        <include refid="global.limit"/>
+    </select>
+
+    <!-- 查询当前表的总记录数 -->
+    <select id="queryBaseInfoCount" resultType="int">
+        SELECT COUNT(s.user_id_) FROM student s
+        LEFT JOIN sys_user su ON  su.id_ = s.user_id_
+    </select>
+
+    <select id="listUserByIds" resultMap="SysUser">
+        select * from sys_user where id_ in
+        <foreach collection="userIds" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+    </select>
 </mapper>

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

@@ -1575,4 +1575,18 @@
         WHERE id_ = #{userId} LIMIT 1
     </select>
 
+    <select id="queryBaseInfoByPage" resultMap="Teacher" parameterType="map">
+        SELECT t.id_,su.real_name_,su.lock_flag_,t.subject_id_,su.phone_,t.organ_id_
+        teacher_organ_id_,t.organ_id_,t.is_support_extra_practice_lesson_,t.dept_id_,t.dept_ids_,t.post_dept_ids_,
+        t.job_nature_,t.demission_date_,t.formal_staff_date_,t.is_probation_period_,t.memo_,su.del_flag_,t.is_settlement_salary_
+        FROM teacher t
+        LEFT JOIN sys_user su ON t.id_ = su.id_
+        ORDER BY t.id_ DESC
+        <include refid="global.limit"/>
+    </select>
+
+    <select id="queryBaseInfoByCount" resultType="int">
+        SELECT COUNT(DISTINCT t.id_)
+        FROM teacher t LEFT JOIN sys_user su ON t.id_ = su.id_
+    </select>
 </mapper>

+ 8 - 0
mec-common/audit-log/src/main/java/com/yonge/log/dal/model/HistoryMessageTencent.java

@@ -1,5 +1,7 @@
 package com.yonge.log.dal.model;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -63,4 +65,10 @@ public class HistoryMessageTencent implements Serializable {
     @Field("msg_body")
     private String msgBody;
 
+    @Field("msg_body_json")
+    private JSONArray msgBodyJson;
+
+
+    @Field("json_flag")
+    private Integer jsonFlag;
 }

+ 13 - 0
mec-common/audit-log/src/main/java/com/yonge/log/service/HistoryMessageTenantService.java

@@ -2,6 +2,7 @@ package com.yonge.log.service;
 
 import com.yonge.log.dal.model.HistoryMessage;
 import com.yonge.log.dal.model.HistoryMessageTencent;
+import com.yonge.log.wrapper.HistoryMessageTencentWrapper;
 import com.yonge.mongodb.PageInfo;
 import com.yonge.mongodb.service.BaseServiceWithMongo;
 
@@ -10,4 +11,16 @@ import java.util.Date;
 
 public interface HistoryMessageTenantService extends BaseServiceWithMongo<String, HistoryMessageTencent> {
 
+    /**
+     * 查询历史记录
+     *
+     * @param query 查询条件
+     */
+    PageInfo<HistoryMessageTencentWrapper.HistoryMessageTencent> historyMessage(HistoryMessageTencentWrapper.HistoryMessageTencentQuery query);
+
+    void deleteOld();
+
+    int initMsgBodyJsonCount();
+
+    void initMsgBodyJson(int page, int size);
 }

+ 128 - 5
mec-common/audit-log/src/main/java/com/yonge/log/service/impl/HistoryMessageTenantServiceImpl.java

@@ -1,5 +1,7 @@
 package com.yonge.log.service.impl;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.yonge.log.dal.dao.HistoryMessageTenantDao;
 import com.yonge.log.dal.dao.OperationLogDao;
 import com.yonge.log.dal.model.HistoryMessage;
@@ -7,21 +9,142 @@ import com.yonge.log.dal.model.HistoryMessageTencent;
 import com.yonge.log.dal.model.OperationLog;
 import com.yonge.log.service.HistoryMessageTenantService;
 import com.yonge.log.service.OperationLogService;
+import com.yonge.log.wrapper.HistoryMessageTencentWrapper;
+import com.yonge.mongodb.PageInfo;
 import com.yonge.mongodb.dao.BaseDaoWithMongo;
 import com.yonge.mongodb.service.BaseServiceWithMongo;
 import com.yonge.mongodb.service.impl.BaseServiceImplWithMongo;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Pattern;
+
 @Service
 public class HistoryMessageTenantServiceImpl extends BaseServiceImplWithMongo<String, HistoryMessageTencent> implements HistoryMessageTenantService {
 
-        @Autowired
-        private HistoryMessageTenantDao historyMessageTenantDao;
+    @Autowired
+    private HistoryMessageTenantDao historyMessageTenantDao;
+
+    @Autowired
+    private MongoTemplate mongoTemplate;
+    @Override
+    public BaseDaoWithMongo<String, HistoryMessageTencent> getDAO() {
+        return historyMessageTenantDao;
+    }
+
+    @Override
+    public PageInfo<HistoryMessageTencentWrapper.HistoryMessageTencent> historyMessage(HistoryMessageTencentWrapper.HistoryMessageTencentQuery param) {
+        PageInfo<HistoryMessageTencentWrapper.HistoryMessageTencent> pageInfo = new PageInfo<>(param.getPage(), param.getRows());
+
+
+        Query query = getQuery(param);
+
+        List<HistoryMessageTencentWrapper.HistoryMessageTencent> dataList = new ArrayList<>();
+
+        long total = mongoTemplate.count(query,HistoryMessageTencent.class);
+        if (total > 0) {
+            pageInfo.setTotal(total);
+
+            query.skip(pageInfo.getOffset()).limit(pageInfo.getLimit());
+            List<HistoryMessageTencent> historyMessageTencents = mongoTemplate.find(query, HistoryMessageTencent.class);
+            dataList = JSON.parseArray(JSON.toJSONString(historyMessageTencents), HistoryMessageTencentWrapper.HistoryMessageTencent.class);
+        }
+        if (total == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
+    public void deleteOld() {
+        Query query = new Query();
+        Criteria criteria = Criteria.where("app_service").is("MEC");
+        query.addCriteria(criteria);
+        mongoTemplate.remove(query,HistoryMessageTencent.class);
+    }
+
+    @Override
+    public int initMsgBodyJsonCount() {
+        Query query = new Query();
+        Criteria criteria = Criteria.where("msg_body_json").is(null).orOperator(Criteria.where("json_flag").is(0),Criteria.where("syncFlag").is(null));
+        query.addCriteria(criteria);
+        return Long.valueOf(mongoTemplate.count(query,HistoryMessageTencent.class)).intValue();
+    }
 
-        @Override
-        public BaseDaoWithMongo<String, HistoryMessageTencent> getDAO() {
-            return historyMessageTenantDao;
+    @Override
+    public void initMsgBodyJson(int page, int size) {
+        Query query = new Query();
+        Criteria criteria = Criteria.where("msg_body_json").is(null).orOperator(Criteria.where("json_flag").is(0),Criteria.where("syncFlag").is(null));
+        query.addCriteria(criteria);
+        query.skip(page).limit(size);
+        List<HistoryMessageTencent> historyMessageTencents = mongoTemplate.find(query, HistoryMessageTencent.class);
+        for (HistoryMessageTencent historyMessageTencent : historyMessageTencents) {
+            historyMessageTencent.setJsonFlag(1);
+            try {
+                historyMessageTencent.setMsgBodyJson(JSON.parseArray(historyMessageTencent.getMsgBody()));
+            } catch (Exception e) {
+                historyMessageTencent.setMsgBodyJson(new JSONArray());
+            }
+            mongoTemplate.save(historyMessageTencent);
         }
+    }
+
+    private static Query getQuery(HistoryMessageTencentWrapper.HistoryMessageTencentQuery param) {
+        Query query = new Query();
+        Criteria criteria = new Criteria();
+
+        if (param.getStartTime() != null) {
+            if (param.getEndTime() != null) {
+                criteria.and("msg_timestamp").gte(param.getStartTime().getTime() / 1000).lte(param.getEndTime().getTime() / 1000);
+            } else {
+                criteria.and("msg_timestamp").gte(param.getStartTime().getTime() / 1000);
+            }
+        }
+        if (param.getEndTime() != null) {
+            if (param.getStartTime() == null) {
+                criteria.and("msg_timestamp").lte(param.getEndTime().getTime()/1000);
+            }
+        }
+        if (StringUtils.isNotBlank(param.getChatType())) {
+            criteria.and("chat_type").is(param.getChatType());
+        }
+        if (StringUtils.isNotBlank(param.getFromAccount())) {
+            criteria.and("from_account").is(param.getFromAccount());
+        }
+        if (StringUtils.isNotBlank(param.getToAccount())) {
+            criteria.and("to_account").is(param.getToAccount());
+        }
+        if (StringUtils.isNotBlank(param.getGroupId())) {
+            criteria.and("group_id").is(param.getGroupId());
+        }
+        if (StringUtils.isNotBlank(param.getAppService())) {
+            criteria.and("app_service").is(param.getAppService());
+        }
+        Pattern pattern = Pattern.compile(".*", Pattern.CASE_INSENSITIVE);
+        if (StringUtils.isNotBlank(param.getKeyword())) {
+            pattern = Pattern.compile(".*" + param.getKeyword() + ".*", Pattern.CASE_INSENSITIVE);
+        }
+
+        criteria.and("msg_body_json").elemMatch(
+            Criteria.where("MsgContent.Text").regex(pattern)
+                .and("MsgType").is("TIMTextElem")
+        );
+
+        query.addCriteria(criteria);
+        query.with(Sort.by(Sort.Order.asc("msg_timestamp"))); // 以升序方式按字段排序
 
+        return query;
+    }
 }

+ 132 - 0
mec-common/audit-log/src/main/java/com/yonge/log/wrapper/HistoryMessageTencentWrapper.java

@@ -0,0 +1,132 @@
+package com.yonge.log.wrapper;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
+
+import java.io.Serializable;
+import java.util.Date;
+
+public class HistoryMessageTencentWrapper {
+
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" DegreeQuery-考级信息")
+    public static class HistoryMessageTencentQuery {
+
+        @ApiModelProperty("当前页")
+        private Integer page =1;
+
+        @ApiModelProperty("分页行数")
+        private Integer rows =20;
+
+        @ApiModelProperty("文本内容")
+        private String keyword;
+
+
+        @ApiModelProperty("开始时间")
+        private Date startTime;
+
+        @ApiModelProperty("结束时间")
+        private Date endTime;
+
+        @ApiModelProperty("类型C2C:单聊,GROUP:群聊")
+        private String chatType;
+
+        @ApiModelProperty("发送人")
+        private String fromAccount;
+
+        @ApiModelProperty("接收人")
+        private String toAccount;
+
+        @ApiModelProperty("群ID")
+        private String groupId;
+
+        @ApiModelProperty(value = "系统",hidden = true)
+        private String appService = "MEC";
+    }
+
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class HistoryMessageTencent implements Serializable {
+
+
+        @ApiModelProperty(value = "发送日期")
+        private Long msgTime;
+
+        @ApiModelProperty("类型C2C:单聊,GROUP:群聊")
+        private String chatType;
+
+        @ApiModelProperty("客户端IP")
+        private String clientIp;
+
+        @ApiModelProperty("自定义数据")
+        private String cloudCustomData;
+
+        @ApiModelProperty("发送人id")
+        private String fromAccount;
+
+
+        @ApiModelProperty("发送人名称")
+        private String fromAccountName;
+
+
+        @ApiModelProperty("发送人头像")
+        private String fromAccountAvatar;
+
+        @ApiModelProperty("系统")
+        private String appService;
+
+        @ApiModelProperty("消息来源平台")
+        private String msgFromPlatform;
+
+        @ApiModelProperty("消息随机数")
+        private Long msgRandom;
+
+        @ApiModelProperty("消息序列号")
+        private Long msgSeq;
+
+        @ApiModelProperty("消息时间戳")
+        private Long msgTimestamp;
+
+        @ApiModelProperty("接收人")
+        private String toAccount;
+
+
+        @ApiModelProperty("接收人名称")
+        private String toAccountName;
+
+
+        @ApiModelProperty("接收人头像")
+        private String toAccountAvatar;
+
+        @ApiModelProperty("群ID")
+        private String groupId;
+
+
+        @ApiModelProperty("群名称")
+        private String groupName;
+
+        @ApiModelProperty("群头像")
+        private String groupAvatar;
+
+
+        @ApiModelProperty("消息内容")
+        private String msgBody;
+
+    }
+
+}

+ 7 - 3
mec-im/src/main/java/com/ym/controller/GroupController.java

@@ -9,7 +9,6 @@ import com.microsvc.toolkit.middleware.im.impl.TencentCloudImPlugin;
 import com.microsvc.toolkit.middleware.im.message.ETencentMessage;
 import com.microsvc.toolkit.middleware.im.message.MessageWrapper;
 import com.microsvc.toolkit.middleware.im.message.TencentRequest;
-import com.ym.mec.biz.service.im.ImGroupCoreService;
 import com.ym.mec.common.entity.ImMessageDto;
 import com.ym.pojo.NoticeMessage;
 import com.ym.service.GroupService;
@@ -25,6 +24,7 @@ import io.rong.models.message.GroupMessage;
 import io.rong.models.message.MentionMessage;
 import io.rong.models.message.RecallMessage;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -50,8 +50,6 @@ public class GroupController{
     GroupService groupService;
     @Autowired
     private ImPluginContext imPluginContext;
-    @Autowired
-    private ImGroupCoreService imGroupCoreService;
 
     @RequestMapping(value = "/send", method = RequestMethod.POST)
     public Object send(@RequestBody ImMessageDto imMessageDto) throws Exception {
@@ -121,6 +119,12 @@ public class GroupController{
                     .msgType(ETencentMessage.TIMTextElem.name())
                     .msgContent(TencentRequest.TextMessageBody.builder().text(imMessageDto.getMessageContent()).build())
                     .build());
+
+                // 普通文本消息,若是超链接地址,则需要转换成腾讯云的消息格式
+                if (imMessageDto.getMessageContent().startsWith("http") && StringUtils.isBlank(imMessageDto.getExtra())) {
+                    // 自动填充为拓展消息内容
+                    build.setCloudCustomData(imMessageDto.getMessageContent());
+                }
             }
         }
 

+ 16 - 4
mec-im/src/main/java/com/ym/controller/PrivateController.java

@@ -1,5 +1,6 @@
 package com.ym.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.google.common.collect.Lists;
 import com.microsvc.toolkit.middleware.common.http.ImageUtil;
 import com.microsvc.toolkit.middleware.im.ImPluginContext;
@@ -17,6 +18,7 @@ import io.rong.models.message.PrivateMessage;
 import io.rong.models.message.RecallMessage;
 import io.rong.models.message.TemplateMessage;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -49,6 +51,7 @@ public class PrivateController {
             .pushExt("")
             .includeSender(1)
             .cloudCustomData(imMessageDto.getExtra())
+            .syncOtherMachine(1) // 1:消息同步到 From_Account 在线终端和漫游上;2:消息不同步至 From_Account
             .build();
 
         String objectName = imMessageDto.getObjectName();
@@ -92,21 +95,30 @@ public class PrivateController {
                 ImageUtil.imageToBase64(imageReq);
 
                 // 图片消息
-                build.tencentMessage(TencentRequest.getTIMImageElem(imageReq));
+                build.objectName(ETencentMessage.TIMImageElem.name())
+                    .tencentMessage(TencentRequest.getTIMImageElem(imageReq));
 
             } else if ("RC:FileMsg".equals(objectName)) {
                 // 文件消息
-                build.tencentMessage(TencentRequest.getTIMFileElem(imMessageDto.getFileUrl(), imMessageDto.getFileSize().intValue(), imMessageDto.getFileName()));
+                build.objectName(ETencentMessage.TIMFileElem.name())
+                    .tencentMessage(TencentRequest.getTIMFileElem(imMessageDto.getFileUrl(), imMessageDto.getFileSize().intValue(), imMessageDto.getFileName()));
             } else {
                 // 文本消息
-                build.tencentMessage(TencentRequest.MessageBody.builder()
+                build.objectName(ETencentMessage.TIMTextElem.name())
+                    .tencentMessage(TencentRequest.MessageBody.builder()
                     .msgType(ETencentMessage.TIMTextElem.name())
                     .msgContent(TencentRequest.TextMessageBody.builder().text(imMessageDto.getMessageContent()).build())
                     .build());
+
+                // 普通文本消息,若是超链接地址,则需要转换成腾讯云的消息格式
+                if (imMessageDto.getMessageContent().startsWith("http") && StringUtils.isBlank(imMessageDto.getExtra())) {
+                    // 自动填充为拓展消息内容
+                    build.setCloudCustomData(imMessageDto.getMessageContent());
+                }
             }
         }
         Boolean ret = imPluginContext.getPluginService().sendPrivateMessage(build);
-        log.info("privateMessage send ret:{}", ret);
+        log.info("privateMessage send ret:{}, service={}, content={}", ret, imPluginContext.defaultService(), JSON.toJSONString(build));
 
         return true;
     }

+ 7 - 6
mec-im/src/main/java/com/ym/controller/UserController.java

@@ -93,10 +93,11 @@ public class UserController {
                 String username = userInfo.getUsername();
                 List<String> userTypes = Lists.newArrayList(userInfo.getUserType().split(","));
                 if (userTypes.size() > 1 || userTypes.contains(ClientEnum.TEACHER.getCode())) {
-                    username = Optional.ofNullable(userInfo.getRealName()).orElse(username);
+                    username = Optional.ofNullable(userInfo.getRealName()).filter(StringUtils::isNotBlank).orElse(username);
                 }
 
-                ImGroupWrapper.ImUserInfo register = imGroupCoreService.register(userModel.getId(), clientType, username, userInfo.getAvatar());
+                ImGroupWrapper.ImUserInfo register = imGroupCoreService.register(userModel.getId(), clientType, username,
+                    sysUserService.getImAvatar(teacherDao.getUser(userInfo.getUserId().intValue())));
 
                 // 用户注册接入Token
                 tokenResult.setToken(register.getImToken());
@@ -130,13 +131,13 @@ public class UserController {
             String username = userInfo.getUsername();
             List<String> userTypes = Lists.newArrayList(userInfo.getUserType().split(","));
             if (userTypes.size() > 1 || userTypes.contains(ClientEnum.TEACHER.getCode())) {
-                username = Optional.ofNullable(userInfo.getRealName()).orElse(username);
+                username = Optional.ofNullable(userInfo.getRealName()).filter(StringUtils::isNotBlank).orElse(username);
             }
 
             try {
 
                 ImGroupWrapper.ImUserInfo register = imGroupCoreService.register(userModel.getId(), userModel.getClientType(),
-                    username, Optional.ofNullable(userInfo.getAvatar()).orElse(""));
+                    username,  sysUserService.getImAvatar(teacherDao.getUser(userInfo.getUserId().intValue())));
 
                 // 用户注册接入Token
                 tokenResult.setImToken(register.getImToken());
@@ -164,13 +165,13 @@ public class UserController {
                 String username = userInfo.getUsername();
                 List<String> userTypes = Lists.newArrayList(userInfo.getUserType().split(","));
                 if (userTypes.size() > 1 || userTypes.contains(ClientEnum.TEACHER.getCode())) {
-                    username = Optional.ofNullable(userInfo.getRealName()).orElse(username);
+                    username = Optional.ofNullable(userInfo.getRealName()).filter(StringUtils::isNotBlank).orElse(username);
                 }
 
                 try {
 
                     ImGroupWrapper.ImUserInfo register = imGroupCoreService.register(userModel.getId(), "",
-                        username, Optional.ofNullable(userModel.getPortrait()).orElse(userInfo.getAvatar()));
+                        username,  sysUserService.getImAvatar(teacherDao.getUser(userInfo.getUserId().intValue())));
 
                     log.info("update IM_USER register: {}", JSONObject.toJSONString(register));
                 } catch (Exception e) {

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

@@ -640,14 +640,14 @@ public class RoomServiceImpl implements RoomService {
             roomResult.setMembers(roomMemberList, midiMap, examSongMap, scheduleStudentMusicScores);
 
             // 全员静音状态开启
-            if (muteAll && TencentCloudRTCPlugin.PLUGIN_NAME.equals(courseSchedule.getServiceProvider())) {
+            /*if (muteAll && TencentCloudRTCPlugin.PLUGIN_NAME.equals(courseSchedule.getServiceProvider())) {
                 for (RoomResult.MemberResult item : roomResult.getMembers()) {
                     // 重置学生用户当前静音状态
                     if (RoleStudent.getValue() == item.getRole()) {
                         item.setMicrophone(false);
                     }
                 }
-            }
+            }*/
         }
         roomResult.setWhiteboards(whiteboardDao.findByRid(roomId));
         if (room != null) {