Browse Source

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

yonge 3 years ago
parent
commit
59cea1754c
100 changed files with 3004 additions and 672 deletions
  1. 3 0
      .gitignore
  2. 8 0
      cms/src/main/resources/logback-spring.xml
  3. 1 1
      codegen/src/main/resources/generateConfigration.xml
  4. 6 11
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/web/controller/UserController.java
  5. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CloudTeacherOrderDao.java
  6. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/EmployeeDao.java
  7. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImGroupDao.java
  8. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImGroupMemberDao.java
  9. 24 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImLiveBroadcastRoomDao.java
  10. 1 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImLiveRoomBlackDao.java
  11. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImLiveRoomReservationDao.java
  12. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImLiveRoomVideoDao.java
  13. 33 31
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java
  14. 7 9
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  15. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherDao.java
  16. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TempBuyFreeLiveTheoryCourseDao.java
  17. 25 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TempLiveTeacherCardDao.java
  18. 11 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleEndDto.java
  19. 54 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ImGroupDto.java
  20. 44 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ImLiveBroadcastRoomDto.java
  21. 62 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/RoomReservationUserSearch.java
  22. 62 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SysUserDto.java
  23. 48 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroup.java
  24. 53 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImLiveBroadcastRoom.java
  25. 21 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImSendGroupMessage.java
  26. 0 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysCoupon.java
  27. 59 12
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TempBuyFreeLiveTheoryCourse.java
  28. 192 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TempLiveTeacherCard.java
  29. 40 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/LevelEnum.java
  30. 7 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/SysUserRoleEnum.java
  31. 6 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/TemplateTypeEnum.java
  32. 29 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/GroupMemberQueryInfo.java
  33. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/ImGroupNoticeQueryInfo.java
  34. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/ImGroupQueryInfo.java
  35. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/ImSendGroupMessageQueryInfo.java
  36. 37 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/LiveRoomGoodsOrderQueryInfo.java
  37. 51 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/UserBasicQueryInfo.java
  38. 55 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/vo/ImLiveBroadcastRoomVo.java
  39. 76 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/vo/LiveRoomGoodsOrderVo.java
  40. 80 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/vo/RoomReservationUserVo.java
  41. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/EmployeeService.java
  42. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/ExportService.java
  43. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupMemberService.java
  44. 17 4
      mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupService.java
  45. 24 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ImLiveBroadcastRoomService.java
  46. 13 3
      mec-biz/src/main/java/com/ym/mec/biz/service/ImLiveRoomBlackService.java
  47. 13 4
      mec-biz/src/main/java/com/ym/mec/biz/service/ImLiveRoomReservationService.java
  48. 4 8
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java
  49. 4 9
      mec-biz/src/main/java/com/ym/mec/biz/service/SysMessageService.java
  50. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysUserService.java
  51. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TeacherService.java
  52. 14 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TempBuyFreeLiveTheoryCourseService.java
  53. 5 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  54. 2 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java
  55. 56 78
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  56. 4 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CoursesGroupServiceImpl.java
  57. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeServiceImpl.java
  58. 18 22
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  59. 38 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupMemberServiceImpl.java
  60. 48 15
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupServiceImpl.java
  61. 267 79
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java
  62. 10 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveRoomBlackServiceImpl.java
  63. 26 10
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveRoomReservationServiceImpl.java
  64. 14 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImSendGroupMessageServiceImpl.java
  65. 6 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/LiveGoodsMapperServiceImpl.java
  66. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/LiveGoodsServiceImpl.java
  67. 80 51
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberRankSettingServiceImpl.java
  68. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  69. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/OnlineMusicGroupServiceImpl.java
  70. 0 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  71. 4 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  72. 22 16
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
  73. 0 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysCouponCodeServiceImpl.java
  74. 49 32
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMessageServiceImpl.java
  75. 28 12
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserServiceImpl.java
  76. 22 18
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherServiceImpl.java
  77. 219 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TempBuyFreeLiveTheoryCourseServiceImpl.java
  78. 13 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TempLittleArtistTrainingCampServiceImpl.java
  79. 12 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  80. 0 1
      mec-biz/src/main/resources/config/mybatis/CloudTeacherOrderMapper.xml
  81. 27 0
      mec-biz/src/main/resources/config/mybatis/EmployeeMapper.xml
  82. 46 26
      mec-biz/src/main/resources/config/mybatis/ImGroupMapper.xml
  83. 34 0
      mec-biz/src/main/resources/config/mybatis/ImGroupMemberMapper.xml
  84. 3 15
      mec-biz/src/main/resources/config/mybatis/ImGroupNoticeMapper.xml
  85. 137 16
      mec-biz/src/main/resources/config/mybatis/ImLiveBroadcastRoomMapper.xml
  86. 17 15
      mec-biz/src/main/resources/config/mybatis/ImLiveRoomBlackMapper.xml
  87. 58 2
      mec-biz/src/main/resources/config/mybatis/ImLiveRoomReservationMapper.xml
  88. 3 0
      mec-biz/src/main/resources/config/mybatis/ImLiveRoomVideoMapper.xml
  89. 13 7
      mec-biz/src/main/resources/config/mybatis/ImSendGroupMessageMapper.xml
  90. 2 1
      mec-biz/src/main/resources/config/mybatis/LiveGoodsMapperMapper.xml
  91. 17 4
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  92. 47 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  93. 3 2
      mec-biz/src/main/resources/config/mybatis/SysCouponIssueRecordMapper.xml
  94. 1 1
      mec-biz/src/main/resources/config/mybatis/SysCouponMapper.xml
  95. 28 17
      mec-biz/src/main/resources/config/mybatis/SysUserCashAccountMapper.xml
  96. 35 2
      mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  97. 99 52
      mec-biz/src/main/resources/config/mybatis/TempBuyFreeLiveTheoryCourseMapper.xml
  98. 172 0
      mec-biz/src/main/resources/config/mybatis/TempLiveTeacherCardMapper.xml
  99. 7 14
      mec-biz/src/main/resources/config/mybatis/TenantContractTemplateMapper.xml
  100. 19 0
      mec-client-api/src/main/java/com/ym/mec/im/ImFeignService.java

+ 3 - 0
.gitignore

@@ -33,5 +33,8 @@ mvnw.cmd
 /codegen/src/main/resources/generateConfigration.xml
 **/bootstrap-dev.yml
 **/bootstrap-dev.properties
+**/bootstrap-local.yml
+**/bootstrap-local.properties
+
 /bin/
 **/logback-spring.xml

+ 8 - 0
cms/src/main/resources/logback-spring.xml

@@ -29,6 +29,14 @@
 
 	<logger name="com.ym.mec" level="INFO" />
 
+	<!--本地环境:打印控制台 -->
+	<springProfile name="local">
+		<root level="INFO">
+			<appender-ref ref="stdout" />
+			<appender-ref ref="file" />
+		</root>
+	</springProfile>
+
 	<!--开发环境:打印控制台 -->
 	<springProfile name="dev">
 		<root level="INFO">

+ 1 - 1
codegen/src/main/resources/generateConfigration.xml

@@ -8,7 +8,7 @@
 		<catalog>mec_test</catalog>
 		<schema>mec_test</schema>
 	</dbConfiguration>
-	<srcBase>/Users/chenxiaoyu/Documents/javabean</srcBase>
+	<srcBase>D:/usr/javabean</srcBase>
 	<pojoPackageName>com.ym.mec.biz.dal.entity</pojoPackageName>
 	<daoPackageName>com.ym.mec.biz.dal.dao</daoPackageName>
 	<servicePackageName>com.ym.mec.biz.service</servicePackageName>

+ 6 - 11
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/web/controller/UserController.java

@@ -136,9 +136,8 @@ public class UserController extends BaseController {
 
 	@ApiOperation(value = "设置密码")
 	@PostMapping(value = "/setPassword", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
-	@ApiImplicitParams({@ApiImplicitParam(name = "password", value = "密码", required = true, dataType = "String"),
-			@ApiImplicitParam(name = "username", value = "用户名", required = true, dataType = "String") })
-	public Object setPassword(String password, String username) {
+	@ApiImplicitParam(name = "password", value = "密码", required = true, dataType = "String")
+	public Object setPassword(String password) {
 		if (StringUtils.isEmpty(password)) {
 			return failed("参数校验失败");
 		}
@@ -150,18 +149,14 @@ public class UserController extends BaseController {
 		if (sysUser == null) {
 			return failed("用户不存在");
 		}
-		if(sysUser.getUserType().contains("TEACHER") || sysUser.getUserType().contains("SYSTEM")){
-			sysUser.setRealName(username);
-		}else {
-			sysUser.setUsername(username);
-		}
 		if(StringUtils.isEmpty(sysUser.getImToken())){
+			String username = sysUser.getUsername();
+			if(sysUser.getUserType().contains("TEACHER") || sysUser.getUserType().contains("SYSTEM")){
+				username = sysUser.getRealName();
+			}
 			ImResult register = imFeignService.register(new ImUserModel(sysUser.getId().toString(), username, sysUser.getAvatar()));
 			sysUser.setImToken(register.getToken());
-		}else {
-			imFeignService.update(new ImUserModel(sysUser.getId().toString(),username,sysUser.getAvatar()));
 		}
-		webFeignService.updateNickName(sysUser.getId(),username);
 		password = new BCryptPasswordEncoder().encode(password);
 		sysUser.setPassword(password);
 		sysUser.setUpdateTime(new Date());

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

@@ -3,6 +3,7 @@ package com.ym.mec.biz.dal.dao;
 import com.ym.mec.biz.dal.dto.CloudTeacherActiveTargetDetailDto;
 import com.ym.mec.biz.dal.dto.CloudTeacherOrderDto;
 import com.ym.mec.biz.dal.dto.Mapper;
+import com.ym.mec.biz.dal.dto.SysUserDto;
 import com.ym.mec.biz.dal.entity.CloudTeacherOrder;
 import com.ym.mec.biz.dal.entity.CloudTeacherStudent;
 import com.ym.mec.common.dal.BaseDAO;

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

@@ -5,6 +5,7 @@ import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dto.EmployeeDto;
 import com.ym.mec.biz.dal.dto.EmployeeLevelDto;
 import com.ym.mec.biz.dal.dto.SimpleUserDto;
+import com.ym.mec.biz.dal.dto.SysUserDto;
 import com.ym.mec.biz.dal.entity.Employee;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
@@ -229,4 +230,7 @@ public interface EmployeeDao extends BaseDAO<Integer, Employee> {
      */
     int insertSysRole(SysRole sysRole);
 
+    int countEmployeeBasicInfo(Map<String, Object> params);
+
+    List<SysUserDto> queryEmployeeBasicInfo(Map<String, Object> params);
 }

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

@@ -18,7 +18,8 @@ public interface ImGroupDao extends BaseDAO<String, ImGroup> {
 	 * @return
 	 */
 	List<ImGroup> queryByUserId(@Param("userId") Integer userId,
-								@Param("search") String search);
+								@Param("search") String search,
+								@Param("groupType") String groupType);
 
 	/**
 	 * 查询群成员列表

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

@@ -4,6 +4,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import com.ym.mec.biz.dal.dto.ImGroupMemberDto;
 import org.apache.ibatis.annotations.Param;
 
 import com.ym.mec.biz.dal.entity.ImGroupMember;
@@ -30,4 +31,8 @@ public interface ImGroupMemberDao extends BaseDAO<Long, ImGroupMember> {
     List<ImGroupMember> queryMembers(@Param("groupId") String groupId,
 									 @Param("userIdList") List<String> userIdList,
 									 @Param("tenantId") Integer tenantId);
+
+    int countGroupMember(Map<String, Object> params);
+
+	List<ImGroupMemberDto> queryGroupMemberPage(Map<String, Object> params);
 }

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

@@ -3,9 +3,13 @@ package com.ym.mec.biz.dal.dao;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ym.mec.biz.dal.dto.RoomReservationUserSearch;
 import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoom;
 import com.ym.mec.biz.dal.vo.BaseRoomUserVo;
 import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomVo;
+import com.ym.mec.biz.dal.vo.RoomReservationUserVo;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.biz.dal.vo.LiveRoomGoodsOrderVo;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -25,9 +29,28 @@ public interface ImLiveBroadcastRoomDao extends BaseMapper<ImLiveBroadcastRoom>
 
     int insertBatch(@Param("entities") List<ImLiveBroadcastRoom> entities);
 
-    IPage<Map<Integer,Object>> queryUserPageByTenantId(Page<Map<Integer,Object>> page);
+    IPage<Map<Integer, Object>> queryUserPageByTenantId(Page<Map<Integer, Object>> page);
 
     List<BaseRoomUserVo> queryBaseUserInfo(@Param("list") List<Integer> list);
 
+    /**
+     * 查询直播间预约用户信息
+     *
+     * @return
+     */
+    IPage<RoomReservationUserVo> queryRoomUser(@Param("page") IPage<RoomReservationUserVo> page,
+                                                  @Param("query") RoomReservationUserSearch query);
+
+    List<RoomReservationUserVo> queryRoomUser(@Param("query") RoomReservationUserSearch query);
+
+    String querySchoolIds(@Param("organIds") String organIds);
+
+    String queryTeamIds(@Param("organIds") String organIds);
+
+    List<LiveRoomGoodsOrderVo> queryLiveRoomGoodsOrderList(Map<String, Object> params);
+
+    int countLiveRoomGoodsOrderList(Map<String, Object> params);
+
+    Map sumLiveRoomGoodsOrderList(Map<String, Object> params);
 }
 

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

@@ -3,7 +3,6 @@ package com.ym.mec.biz.dal.dao;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.entity.ImLiveRoomBlack;
 import org.apache.ibatis.annotations.Param;
 
@@ -20,7 +19,7 @@ public interface ImLiveRoomBlackDao extends BaseMapper<ImLiveRoomBlack> {
 
     int insertBatch(@Param("entities") List<ImLiveRoomBlack> entities);
 
-    List<SysUser> queryStudent(@Param("tenantId") Integer tenantId, @Param("search") String search, @Param("roomUid") String roomUid);
+    <T> IPage<T> queryStudent(Page<T> page, @Param("param") Map<String, Object> param);
 
     <T> IPage<T> queryBlackList(Page<T> page, @Param("param") Map<String, Object> param);
 

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImLiveRoomReservationDao.java

@@ -22,5 +22,14 @@ public interface ImLiveRoomReservationDao extends BaseMapper<ImLiveRoomReservati
 
     IPage<ImLiveBroadcastRoomVo> queryPageStudent(Page<ImLiveBroadcastRoomVo> page, @Param("param") Map<String, Object> param);
 
+    /**
+     * 查询房间预约人数
+     *
+     * @param roomIdList 房间id集合
+     * @return
+     */
+    List<ImLiveBroadcastRoomVo> selectCountRoomReservation(@Param("roomIdList") List<String> roomIdList);
+
+    String queryMusicGroupIds(@Param("userId") Integer userId);
 }
 

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

@@ -16,5 +16,6 @@ public interface ImLiveRoomVideoDao extends BaseMapper<ImLiveRoomVideo> {
 
     int insertBatch(@Param("entities") List<ImLiveRoomVideo> entities);
 
+    ImLiveRoomVideo getLastRecord(@Param("roomId") String roomId, @Param("recordId") String recordId);
 }
 

+ 33 - 31
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java

@@ -23,7 +23,7 @@ import java.util.Set;
 public interface MusicGroupDao extends BaseDAO<String, MusicGroup> {
 
     MusicGroup getLocked(String id);
-    
+
     /**
      * 查询乐团基本信息
      * @param id
@@ -451,16 +451,16 @@ public interface MusicGroupDao extends BaseDAO<String, MusicGroup> {
      * @return
      */
     List<MusicMemberDto> queryMusicMemberList(Map<String, Object> params);
-    
-	int updateIsShowRecordOfStudent(@Param("musicGroupId") String musicGroupId, @Param("isShowRecordOfStudent") Boolean isShowRecordOfStudent);
-
-	/**
-	 * @describe 查询乐团相关学员数量
-	 * @author Joburgess
-	 * @date 2021/8/12 0012
-	 * @param params:
-	 * @return java.util.List<java.lang.String>
-	 */
+
+    int updateIsShowRecordOfStudent(@Param("musicGroupId") String musicGroupId, @Param("isShowRecordOfStudent") Boolean isShowRecordOfStudent);
+
+    /**
+     * @describe 查询乐团相关学员数量
+     * @author Joburgess
+     * @date 2021/8/12 0012
+     * @param params:
+     * @return java.util.List<java.lang.String>
+     */
     List<TeacherMusicStudentOverViewDto> queryTeacherMusicStudentOverView(@Param("musicGroupIds") List<String> musicGroupIds);
 
     /**
@@ -471,40 +471,40 @@ public interface MusicGroupDao extends BaseDAO<String, MusicGroup> {
     List<Map<Integer, String>> queryNormalGroupName(@Param("studentIds") List<Integer> studentIds);
 
     /**
-    * @description: 乐团剩余时长未排课
+     * @description: 乐团剩余时长未排课
      * @param organIds
      * @param tenantId
-    * @return java.util.List<java.lang.String>
-    * @author zx
-    * @date 2022/3/3 15:15 
-    */
+     * @return java.util.List<java.lang.String>
+     * @author zx
+     * @date 2022/3/3 15:15
+     */
     List<String> queryHasSubCourseTimes(@Param("organIds") String organIds, @Param("tenantId") Integer tenantId);
 
     /**
-    * @description: 获取课程时间消耗异常的学员数
+     * @description: 获取课程时间消耗异常的学员数
      * @param params
-    * @return int
-    * @author zx
-    * @date 2022/3/4 11:22
-    */
+     * @return int
+     * @author zx
+     * @date 2022/3/4 11:22
+     */
     Integer countHasFreeCourseTimes(Map<String, Object> params);
 
     /**
-    * @description: 获取课程时间消耗异常的学员
+     * @description: 获取课程时间消耗异常的学员
      * @param params
-    * @return java.util.List<com.ym.mec.biz.dal.dto.HasFreeCourseTimesDto>
-    * @author zx
-    * @date 2022/3/4 11:40
-    */
+     * @return java.util.List<com.ym.mec.biz.dal.dto.HasFreeCourseTimesDto>
+     * @author zx
+     * @date 2022/3/4 11:40
+     */
     List<HasFreeCourseTimesDto> queryHasFreeCourseTimes(Map<String, Object> params);
 
     /**
-    * @description: 获取首页退学学员数量
+     * @description: 获取首页退学学员数量
      * @param queryInfo
-    * @return java.lang.Integer
-    * @author zx
-    * @date 2022/3/17 16:20
-    */
+     * @return java.lang.Integer
+     * @author zx
+     * @date 2022/3/17 16:20
+     */
     Integer countQuitNum(@Param("queryInfo") IndexDataQueryInfo queryInfo);
 
     //乐团统计数据导出
@@ -512,4 +512,6 @@ public interface MusicGroupDao extends BaseDAO<String, MusicGroup> {
 
     //乐团统计数据导出
     List<MusicGroupExportDto> exportMusicGroupCourseList(@Param("queryInfo") ExportUserAccountQueryInfo queryInfo);
+    //查询
+    List<MusicGroupBasicDto> findMusicByCourseIds(@Param("courseIds") List<Long> courseIds);
 }

+ 7 - 9
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java

@@ -5,24 +5,18 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import com.ym.mec.biz.dal.dto.*;
 import org.apache.ibatis.annotations.Param;
 
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dto.EduOrganStudentListDto;
-import com.ym.mec.biz.dal.dto.IndexCloudStudyListDto;
-import com.ym.mec.biz.dal.dto.Mapper;
-import com.ym.mec.biz.dal.dto.SimpleUserDto;
-import com.ym.mec.biz.dal.dto.Student4operating;
-import com.ym.mec.biz.dal.dto.StudentServeCourseDto;
-import com.ym.mec.biz.dal.dto.StudentServeDto;
 import com.ym.mec.biz.dal.entity.IndexBaseMonthData;
 import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.entity.Subject;
 import com.ym.mec.biz.dal.enums.GroupType;
 
 public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Student> {
-	
-	Student getLocked(Integer userId);
+
+    Student getLocked(Integer userId);
 	
     int lockUser(@Param("userId") Integer userId);
 
@@ -424,4 +418,8 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
     List<Student> queryStudent(Map<String, Object> params);
 
     SysUser getUserByPhone(String phone);
+
+    int countStudentBasicInfo(Map<String, Object> params);
+
+    List<SysUserDto> queryStudentBasicInfo(Map<String, Object> params);
 }

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

@@ -515,4 +515,8 @@ public interface TeacherDao extends BaseDAO<Integer, Teacher> {
      */
     List<TeacherStudentDataDto> queryMemberStudentData(Map<String, Object> params);
     int countMemberStudentData(Map<String, Object> params);
+
+    int countTeacherBasicInfo(Map<String, Object> params);
+
+    List<SysUserDto> queryTeacherBasicInfo(Map<String, Object> params);
 }

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TempBuyFreeLiveTheoryCourseDao.java

@@ -4,8 +4,15 @@ import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.biz.dal.entity.TempBuyFreeLiveTheoryCourse;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 public interface TempBuyFreeLiveTheoryCourseDao extends BaseDAO<Integer, TempBuyFreeLiveTheoryCourse> {
 
 
     int countByUserId(@Param("userId") Integer userId);
+
+    List<TempBuyFreeLiveTheoryCourse> list(@Param("param") TempBuyFreeLiveTheoryCourse tempBuyFreeLiveTheoryCourse);
+
+
+    TempBuyFreeLiveTheoryCourse findByGoodsIdAndUserId(@Param("liveGoodsId") Integer liveGoodsId, @Param("userId") Integer userId);
 }

+ 25 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TempLiveTeacherCardDao.java

@@ -0,0 +1,25 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.biz.dal.entity.Subject;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.biz.dal.entity.TempLiveTeacherCard;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface TempLiveTeacherCardDao extends BaseDAO<Integer, TempLiveTeacherCard> {
+
+
+    List<TempLiveTeacherCard> list(TempLiveTeacherCard teacherCard);
+
+    TempLiveTeacherCard getBySubjectIdAndLevel(@Param("subjectId") String subjectId, @Param("level") String level);
+
+    List<Subject> querySubjectOption();
+
+    //0 没有购买商品 1 购买商品后没有加入群聊 2 已经加入群聊
+    Integer getJoinStstus(@Param("userId") Integer userId, @Param("goodsId") Integer goodsId);
+
+    //查询学生加入的群聊所在的声部
+    String getJoinSubject(@Param("userId") Integer userId, @Param("goodsId") Integer goodsId);
+}

+ 11 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleEndDto.java

@@ -45,7 +45,7 @@ public class CourseScheduleEndDto extends CourseSchedule {
     private String settlementTime;
 
     private PracticeGroup practiceGroup;
-    
+
     private String isComplaints;
 
     private boolean beMerged;
@@ -54,6 +54,8 @@ public class CourseScheduleEndDto extends CourseSchedule {
 
     /** 处理时间 */
     private java.util.Date dealTime;
+    /** 合作单位 */
+    private String cooperationOrgan;
 
     public Date getGenerateTime() {
         return generateTime;
@@ -214,4 +216,12 @@ public class CourseScheduleEndDto extends CourseSchedule {
 	public void setIsComplaints(String isComplaints) {
 		this.isComplaints = isComplaints;
 	}
+
+    public String getCooperationOrgan() {
+        return cooperationOrgan;
+    }
+
+    public void setCooperationOrgan(String cooperationOrgan) {
+        this.cooperationOrgan = cooperationOrgan;
+    }
 }

+ 54 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ImGroupDto.java

@@ -0,0 +1,54 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.ImGroup;
+import com.ym.mec.common.entity.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ImGroupDto extends BaseEntity {
+    @ApiModelProperty(value = "用户列表")
+    private List<String> userIdList = new ArrayList<>();
+
+    @ApiModelProperty(value = "群名称")
+    private String groupName;
+
+    @ApiModelProperty(value = "群类型 乐团群 MUSIC,班级群 CLASS,训练营 TRAINING,曲目演奏课 REPERTOIRE_PLAY")
+    private String type;
+
+    @ApiModelProperty(value = "群细分类型")
+    private ImGroup.GroupTypeEnum groupType;
+
+    public List<String> getUserIdList() {
+        return userIdList;
+    }
+
+    public void setUserIdList(List<String> userIdList) {
+        this.userIdList = userIdList;
+    }
+
+    public String getGroupName() {
+        return groupName;
+    }
+
+    public void setGroupName(String groupName) {
+        this.groupName = groupName;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public ImGroup.GroupTypeEnum getGroupType() {
+        return groupType;
+    }
+
+    public void setGroupType(ImGroup.GroupTypeEnum groupType) {
+        this.groupType = groupType;
+    }
+}

+ 44 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ImLiveBroadcastRoomDto.java

@@ -1,6 +1,5 @@
 package com.ym.mec.biz.dal.dto;
 
-
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -49,6 +48,19 @@ public class ImLiveBroadcastRoomDto implements Serializable {
     @ApiModelProperty(value = "房间配置")
     private RoomConfig roomConfig;
 
+    @NotBlank(message = "直播间类型不能为空")
+    @ApiModelProperty(value = "推广的直播间可见类型-全部可见、部分分部可见、部分合作单位可见")
+    private String popularizeType;
+
+    @ApiModelProperty(value = "分部id-多个id逗号分割")
+    private String popularizeOrgIds;
+
+    @ApiModelProperty(value = "学校id-合作单位id,多个id逗号分割")
+    private String popularizeSchoolIds;
+
+    @ApiModelProperty(value = "乐团id,多个id逗号分割")
+    private String popularizeTeamIds;
+
     @ApiModel(value = "房间配置")
     public static class RoomConfig implements Serializable {
 
@@ -172,5 +184,36 @@ public class ImLiveBroadcastRoomDto implements Serializable {
         this.roomConfig = roomConfig;
     }
 
+    public String getPopularizeType() {
+        return popularizeType;
+    }
+
+    public void setPopularizeType(String popularizeType) {
+        this.popularizeType = popularizeType;
+    }
+
+    public String getPopularizeOrgIds() {
+        return popularizeOrgIds;
+    }
+
+    public void setPopularizeOrgIds(String popularizeOrgIds) {
+        this.popularizeOrgIds = popularizeOrgIds;
+    }
+
+    public String getPopularizeSchoolIds() {
+        return popularizeSchoolIds;
+    }
+
+    public void setPopularizeSchoolIds(String popularizeSchoolIds) {
+        this.popularizeSchoolIds = popularizeSchoolIds;
+    }
+
+    public String getPopularizeTeamIds() {
+        return popularizeTeamIds;
+    }
+
+    public void setPopularizeTeamIds(String popularizeTeamIds) {
+        this.popularizeTeamIds = popularizeTeamIds;
+    }
 }
 

+ 62 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/RoomReservationUserSearch.java

@@ -0,0 +1,62 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-05-31
+ */
+public class RoomReservationUserSearch extends QueryInfo {
+
+    @NotBlank(message = "房间号不能为空")
+    @ApiModelProperty("直播房间号")
+    private String roomUid;
+
+    @ApiModelProperty("用户编号/用户名/用户手机号")
+    private String search;
+
+    @ApiModelProperty("声部id")
+    private Integer subjectId;
+
+    @ApiModelProperty("分部id")
+    private Integer organId;
+
+    public String getRoomUid() {
+        return roomUid;
+    }
+
+    public void setRoomUid(String roomUid) {
+        this.roomUid = roomUid;
+    }
+
+    @Override
+    public String getSearch() {
+        return search;
+    }
+
+    @Override
+    public void setSearch(String search) {
+        this.search = search;
+    }
+
+    public Integer getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Integer subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public Integer getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(Integer organId) {
+        this.organId = organId;
+    }
+}

+ 62 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SysUserDto.java

@@ -0,0 +1,62 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+
+public class SysUserDto {
+    @ApiModelProperty(value = "用户ID")
+    private Long userId;
+
+    @ApiModelProperty(value = "用户名")
+    private String username;
+
+    @ApiModelProperty(value = "手机号")
+    private String phone;
+
+    @ApiModelProperty(value = "分部")
+    private String organName;
+
+    @ApiModelProperty(value = "声部")
+    private String subjectName;
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+}

+ 48 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroup.java

@@ -1,8 +1,8 @@
 package com.ym.mec.biz.dal.entity;
 
-import org.apache.commons.lang3.builder.ToStringBuilder;
-
 import com.ym.mec.common.entity.BaseEntity;
+import com.ym.mec.common.enums.BaseEnum;
+import org.apache.commons.lang3.builder.ToStringBuilder;
 
 /**
  * 对应数据库表(im_group):
@@ -31,7 +31,52 @@ public class ImGroup extends BaseEntity {
 
 	/** 乐团群 MUSIC,班级群 CLASS,训练营 TRAINING */
 	private String type;
-	
+
+	public enum GroupTypeEnum implements BaseEnum<String,GroupTypeEnum> {
+		NORMAL("NORMAL", "普通班级"), MIX("MIX", "合奏班级"), HIGH("HIGH", "提高班"),
+		VIP("VIP", "vip课"), DEMO("DEMO", "试听课"), PRACTICE("PRACTICE", "网管课"),
+		SNAP("SNAP","临时班级"), COMM("COMM", "对外课程"), HIGH_ONLINE("HIGH_ONLINE", "网络基础训练课"),
+		MUSIC_NETWORK("MUSIC_NETWORK","乐团网管课"),PARENT_MEETING("PARENT_MEETING","家长会"),
+		TRAINING("TRAINING","训练营"),REPERTOIRE_PLAY("REPERTOIRE_PLAY","曲目演奏课");
+
+		private String code;
+
+		private String msg;
+
+		GroupTypeEnum(String code, String msg) {
+			this.code = code;
+			this.msg = msg;
+		}
+
+		public void setCode(String code) {
+			this.code = code;
+		}
+
+		public String getMsg() {
+			return msg;
+		}
+
+		public void setMsg(String msg) {
+			this.msg = msg;
+		}
+
+		@Override
+		public String getCode() {
+			return this.code;
+		}
+	}
+
+	//群类型
+	private GroupTypeEnum groupType;
+
+	public GroupTypeEnum getGroupType() {
+		return groupType;
+	}
+
+	public void setGroupType(GroupTypeEnum groupType) {
+		this.groupType = groupType;
+	}
+
 	/**  */
 	private java.util.Date createTime;
 	

+ 53 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImLiveBroadcastRoom.java

@@ -19,6 +19,12 @@ import java.io.Serializable;
  */
 @ApiModel(value = "im_live_broadcast_room-直播房间管理表")
 public class ImLiveBroadcastRoom implements Serializable {
+
+    public static final String ALL = "ALL";
+    public static final String ORGAN = "ORGAN";
+    public static final String SCHOOL = "SCHOOL";
+    public static final String TEAM = "TEAM";
+
     @TableId(value = "id_", type = IdType.AUTO)
     @ApiModelProperty(value = "主键")
     private Integer id;
@@ -71,6 +77,22 @@ public class ImLiveBroadcastRoom implements Serializable {
     @ApiModelProperty(value = "是否在首页推广 0否 1是 - 每个机构只能有一个直播间在首页推广")
     private Integer popularize;
 
+    @TableField("popularize_type_")
+    @ApiModelProperty(value = "推广的直播间可见类型-全部可见ALL、部分分部可见ORGAN、部分合作单位可见SCHOOL")
+    private String popularizeType;
+
+    @TableField("popularize_org_ids_")
+    @ApiModelProperty(value = "分部id-多个id逗号分割")
+    private String popularizeOrgIds;
+
+    @ApiModelProperty(value = "学校id-合作单位id,多个id逗号分割")
+    @TableField("popularize_school_ids_")
+    private String popularizeSchoolIds;
+
+    @ApiModelProperty(value = "乐团id,多个id逗号分割")
+    @TableField("popularize_team_ids_")
+    private String popularizeTeamIds;
+
     @TableField("created_by_")
     @ApiModelProperty(value = "创建人")
     private Integer createdBy;
@@ -243,5 +265,36 @@ public class ImLiveBroadcastRoom implements Serializable {
         this.updatedTime = updatedTime;
     }
 
+    public String getPopularizeType() {
+        return popularizeType;
+    }
+
+    public void setPopularizeType(String popularizeType) {
+        this.popularizeType = popularizeType;
+    }
+
+    public String getPopularizeOrgIds() {
+        return popularizeOrgIds;
+    }
+
+    public void setPopularizeOrgIds(String popularizeOrgIds) {
+        this.popularizeOrgIds = popularizeOrgIds;
+    }
+
+    public String getPopularizeSchoolIds() {
+        return popularizeSchoolIds;
+    }
+
+    public void setPopularizeSchoolIds(String popularizeSchoolIds) {
+        this.popularizeSchoolIds = popularizeSchoolIds;
+    }
+
+    public String getPopularizeTeamIds() {
+        return popularizeTeamIds;
+    }
+
+    public void setPopularizeTeamIds(String popularizeTeamIds) {
+        this.popularizeTeamIds = popularizeTeamIds;
+    }
 }
 

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

@@ -49,10 +49,31 @@ public class ImSendGroupMessage {
     @ApiModelProperty(value = "创建人")
     private String operator;
 
+    @ApiModelProperty(value = "0带表系统消息,1代表普通群消息。默认1")
+    private Integer isIncludeSender = 1;
+
+    private String objectName;
+
     private Date createTime;
 
     private Date updateTime;
 
+    public Integer getIsIncludeSender() {
+        return isIncludeSender;
+    }
+
+    public void setIsIncludeSender(Integer isIncludeSender) {
+        this.isIncludeSender = isIncludeSender;
+    }
+
+    public String getObjectName() {
+        return objectName;
+    }
+
+    public void setObjectName(String objectName) {
+        this.objectName = objectName;
+    }
+
     public String getSendType() {
         return sendType;
     }

+ 0 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysCoupon.java

@@ -3,9 +3,7 @@ package com.ym.mec.biz.dal.entity;
 import com.ym.mec.biz.dal.enums.CouponTypeEnum;
 import com.ym.mec.biz.dal.enums.EffectiveTypeEnum;
 import com.ym.mec.common.entity.BaseEntity;
-
 import io.swagger.annotations.ApiModelProperty;
-
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import javax.validation.constraints.Max;
@@ -101,7 +99,6 @@ public class SysCoupon extends BaseEntity implements Serializable{
 		this.useCondition = useCondition;
 	}
 
-
 	public Integer getId() {
 		return id;
 	}

+ 59 - 12
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TempBuyFreeLiveTheoryCourse.java

@@ -9,52 +9,99 @@ public class TempBuyFreeLiveTheoryCourse {
 
 	/**  */
 	private Integer id;
-	
+
 	/**  */
 	private Integer userId;
-	
+
+	private String liveId;
+
+	private Integer liveGoodsId;
+
+	/** 老师推荐级别 low 初级 medium 中级 high 高级 */
+	private String recommendLevel;
+
 	/**  */
 	private java.util.Date createTime;
-	
+
 	/**  */
 	private java.util.Date updateTime;
 
-	public TempBuyFreeLiveTheoryCourse(Integer userId) {
+	/** 购买学生姓名 */
+	private String studentName;
+
+	public TempBuyFreeLiveTheoryCourse() {
+	}
+
+	public TempBuyFreeLiveTheoryCourse(Integer userId,String liveId,Integer liveGoodsId) {
 		this.userId = userId;
+		this.liveId = liveId;
+		this.liveGoodsId = liveGoodsId;
+	}
+
+	public String getLiveId() {
+		return liveId;
+	}
+
+	public void setLiveId(String liveId) {
+		this.liveId = liveId;
+	}
+
+	public Integer getLiveGoodsId() {
+		return liveGoodsId;
+	}
+
+	public void setLiveGoodsId(Integer liveGoodsId) {
+		this.liveGoodsId = liveGoodsId;
 	}
 
 	public void setId(Integer id){
 		this.id = id;
 	}
-	
+
 	public Integer getId(){
 		return this.id;
 	}
-			
+
 	public void setUserId(Integer userId){
 		this.userId = userId;
 	}
-	
+
 	public Integer getUserId(){
 		return this.userId;
 	}
-			
+
 	public void setCreateTime(java.util.Date createTime){
 		this.createTime = createTime;
 	}
-	
+
 	public java.util.Date getCreateTime(){
 		return this.createTime;
 	}
-			
+
 	public void setUpdateTime(java.util.Date updateTime){
 		this.updateTime = updateTime;
 	}
-	
+
 	public java.util.Date getUpdateTime(){
 		return this.updateTime;
 	}
-			
+
+	public String getRecommendLevel() {
+		return recommendLevel;
+	}
+
+	public void setRecommendLevel(String recommendLevel) {
+		this.recommendLevel = recommendLevel;
+	}
+
+	public String getStudentName() {
+		return studentName;
+	}
+
+	public void setStudentName(String studentName) {
+		this.studentName = studentName;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 192 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TempLiveTeacherCard.java

@@ -0,0 +1,192 @@
+package com.ym.mec.biz.dal.entity;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(temp_live_teacher_card):
+ */
+@ApiModel(value = "TempLiveTeacherCard对象", description = "老师名片信息对象")
+public class TempLiveTeacherCard {
+
+	@ApiModelProperty("id ")
+	private Integer id;
+
+	@ApiModelProperty("老师id ")
+	private Integer userId;
+
+	@ApiModelProperty("老师名称 ")
+	private String username;
+
+	@ApiModelProperty("头像地址 ")
+	private String avatar;
+
+	@ApiModelProperty("个人介绍")
+	private String introduction;
+
+	@ApiModelProperty("曲目名称")
+	private String musicContent;
+
+	@ApiModelProperty("声部id(单个声部)")
+	private String subjectId;
+
+	@ApiModelProperty("级别 one 一级 two 二级 three 三级")
+	private String level;
+
+	@ApiModelProperty("群聊id")
+	private String imGroupId;
+
+	@ApiModelProperty("直播商品id")
+	private Integer liveGoodsId;
+
+	private java.util.Date createTime;
+
+	private java.util.Date updateTime;
+
+	@ApiModelProperty("是否推荐级别")
+	private Boolean recommendLevelFlag;
+
+	@ApiModelProperty("是否已经加入")
+	private Boolean joinFlag;
+
+	@ApiModelProperty(value = "学生id")
+	private Integer studentId;
+
+	@ApiModelProperty("声部名称")
+	private String subjectName;
+
+	public void setId(Integer id){
+		this.id = id;
+	}
+
+	public Integer getId(){
+		return this.id;
+	}
+
+	public void setUserId(Integer userId){
+		this.userId = userId;
+	}
+
+	public Integer getUserId(){
+		return this.userId;
+	}
+
+	public void setAvatar(String avatar){
+		this.avatar = avatar;
+	}
+
+	public String getAvatar(){
+		return this.avatar;
+	}
+
+	public void setIntroduction(String introduction){
+		this.introduction = introduction;
+	}
+
+	public String getIntroduction(){
+		return this.introduction;
+	}
+
+	public String getMusicContent() {
+		return musicContent;
+	}
+
+	public void setMusicContent(String musicContent) {
+		this.musicContent = musicContent;
+	}
+
+	public void setSubjectId(String subjectId){
+		this.subjectId = subjectId;
+	}
+
+	public String getSubjectId(){
+		return this.subjectId;
+	}
+
+	public void setLevel(String level){
+		this.level = level;
+	}
+
+	public String getLevel(){
+		return this.level;
+	}
+
+	public void setImGroupId(String imGroupId){
+		this.imGroupId = imGroupId;
+	}
+
+	public String getImGroupId(){
+		return this.imGroupId;
+	}
+
+	public void setCreateTime(java.util.Date createTime){
+		this.createTime = createTime;
+	}
+
+	public java.util.Date getCreateTime(){
+		return this.createTime;
+	}
+
+	public void setUpdateTime(java.util.Date updateTime){
+		this.updateTime = updateTime;
+	}
+
+	public java.util.Date getUpdateTime(){
+		return this.updateTime;
+	}
+
+	public Boolean getRecommendLevelFlag() {
+		return recommendLevelFlag;
+	}
+
+	public void setRecommendLevelFlag(Boolean recommendLevelFlag) {
+		this.recommendLevelFlag = recommendLevelFlag;
+	}
+
+	public Integer getStudentId() {
+		return studentId;
+	}
+
+	public void setStudentId(Integer studentId) {
+		this.studentId = studentId;
+	}
+
+	public Integer getLiveGoodsId() {
+		return liveGoodsId;
+	}
+
+	public void setLiveGoodsId(Integer liveGoodsId) {
+		this.liveGoodsId = liveGoodsId;
+	}
+
+	public Boolean getJoinFlag() {
+		return joinFlag;
+	}
+
+	public void setJoinFlag(Boolean joinFlag) {
+		this.joinFlag = joinFlag;
+	}
+
+	public String getUsername() {
+		return username;
+	}
+
+	public void setUsername(String username) {
+		this.username = username;
+	}
+
+	public String getSubjectName() {
+		return subjectName;
+	}
+
+	public void setSubjectName(String subjectName) {
+		this.subjectName = subjectName;
+	}
+
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 40 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/LevelEnum.java

@@ -0,0 +1,40 @@
+package com.ym.mec.biz.dal.enums;
+
+import com.ym.mec.common.enums.BaseEnum;
+
+/**
+ * 学员级别
+ */
+public enum LevelEnum implements BaseEnum<String, LevelEnum> {
+    one("一级"),
+    two("二级"),
+    three("三级");
+
+    private String code;
+    private String msg;
+
+    LevelEnum(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+
+
+    public static LevelEnum getByName(String name) {
+        for (LevelEnum level : LevelEnum.values()) {
+            if (level.getMsg().equals(name)) {
+                return level;
+            }
+        }
+        return null;
+    }
+
+}

+ 7 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/SysUserRoleEnum.java

@@ -4,7 +4,13 @@ import com.ym.mec.common.enums.BaseEnum;
 
 //分部经理,乐团主管,维修技师
 public enum SysUserRoleEnum implements BaseEnum<String,SysUserRoleEnum> {
-    ORGAN_MANAGER,EDUCATION,REPAIR,JOIN_TEACHER,HRBP;
+    ORGAN_MANAGER,EDUCATION,REPAIR,JOIN_TEACHER,HRBP,INSTRUCTOR,
+    SUPERVISE,LECTURER,FINANCE_MANAGER,TEST_ENGINEER,BAND_GUIDE,PRODUCT_MANAGER,
+    FRONT_DEVELOPMENT,DESIGNER,ENGINEER,ORGAN_FINANCE,SOFTWARE_TEST,NET_PROMOTION,
+    HR_DIRECTOR,ACCOUNT_SUPERVISOR, CHAIRMAN_ASSISTANT,
+    MALL_OPERATION,TEACH_SUPERVISOR,OFFICE_ADMIN,DEPUTY_DIRECTOR,
+    PIANO_TEACHER,CHRISTIAN, VICE_PRESIDENT,TEACH_RESEARCHERS, TEACH_DIRECTOR,WAREHOUS_SUPERVIOSR,
+    AFTER_SALES,DEVELOP_DIRECTOR, EXECUTIVE,OPERATE_COMMISSIONER, FUND_SUPERVISOR,MANAGER, CEO,CHAIRMAN,ORDER_GOOD;
 
     @Override
     public String getCode() {

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

@@ -8,7 +8,12 @@ public enum TemplateTypeEnum implements BaseEnum<String, TemplateTypeEnum> {
     FINANCIAL_EXPENDITURE("FINANCIAL_EXPENDITURE","财务支出导入模板"),
     REDEMPTIONCODE("REDEMPTION_CODE", "兑换码分配模板表"),
     OA_QUIT_MUSIC_GROUP("OA_QUIT_MUSIC_GROUP", "乐团退费模板"),
-    EXTERNAL_STUDENT_IMPORT_MUSIC_GROUP("EXTERNAL_STUDENT_IMPORT_MUSIC_GROUP", "外部学生入团导入模板");
+    EXTERNAL_STUDENT_IMPORT_MUSIC_GROUP("EXTERNAL_STUDENT_IMPORT_MUSIC_GROUP", "外部学生入团导入模板"),
+
+    BUY_FREE_LIVE_THEORY_COURSE("BUY_FREE_LIVE_THEORY_COURSE", "直播临时活动学员购买导入模板"),
+    LIVE_TEACHER_CARD("LIVE_TEACHER_CARD","直播临时活动上课老师名片导入模板"),
+    ;
+
 
     private String code;
 

+ 29 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/GroupMemberQueryInfo.java

@@ -0,0 +1,29 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+
+public class GroupMemberQueryInfo extends QueryInfo {
+
+    @ApiModelProperty(value = "群编号")
+    private String imGroupId;
+
+    @ApiModelProperty(value = "角色")
+    private String roleType;
+
+    public String getRoleType() {
+        return roleType;
+    }
+
+    public void setRoleType(String roleType) {
+        this.roleType = roleType;
+    }
+
+    public String getImGroupId() {
+        return imGroupId;
+    }
+
+    public void setImGroupId(String imGroupId) {
+        this.imGroupId = imGroupId;
+    }
+}

+ 3 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/page/ImGroupNoticeQueryInfo.java

@@ -3,13 +3,13 @@ package com.ym.mec.biz.dal.page;
 import com.ym.mec.common.page.QueryInfo;
 
 public class ImGroupNoticeQueryInfo extends QueryInfo {
-    private Long groupId;
+    private String groupId;
 
-    public Long getGroupId() {
+    public String getGroupId() {
         return groupId;
     }
 
-    public void setGroupId(Long groupId) {
+    public void setGroupId(String groupId) {
         this.groupId = groupId;
     }
 

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

@@ -16,6 +16,16 @@ public class ImGroupQueryInfo extends QueryInfo {
 
     private String targetIds;
 
+    private String groupType;
+
+    public String getGroupType() {
+        return groupType;
+    }
+
+    public void setGroupType(String groupType) {
+        this.groupType = groupType;
+    }
+
     public String getTargetIds() {
         return targetIds;
     }

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

@@ -18,6 +18,17 @@ public class ImSendGroupMessageQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "消息发送类型即时 NOW、定时发送 TIMING")
     private String sendType;
 
+    @ApiModelProperty(value = "0是系统消息、1普通消息(默认1)")
+    private Integer isIncludeSender = 1;
+
+    public Integer getIsIncludeSender() {
+        return isIncludeSender;
+    }
+
+    public void setIsIncludeSender(Integer isIncludeSender) {
+        this.isIncludeSender = isIncludeSender;
+    }
+
     public String getSendType() {
         return sendType;
     }

+ 37 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/LiveRoomGoodsOrderQueryInfo.java

@@ -0,0 +1,37 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+
+import java.util.Date;
+
+public class LiveRoomGoodsOrderQueryInfo extends QueryInfo {
+    private String roomUid;
+
+    private Date startTime;
+
+    private Date endTime;
+
+    public String getRoomUid() {
+        return roomUid;
+    }
+
+    public void setRoomUid(String roomUid) {
+        this.roomUid = roomUid;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+}

+ 51 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/UserBasicQueryInfo.java

@@ -0,0 +1,51 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+
+public class UserBasicQueryInfo extends QueryInfo {
+
+    @ApiModelProperty(value = "分部", required = false)
+    private String organId;
+
+    @ApiModelProperty(value = "声部编号", required = false)
+    private Integer subjectId;
+
+    @ApiModelProperty(value = "乐团编号", required = false)
+    private String musicGroupId;
+
+    @ApiModelProperty(value = "群编号(用于排除掉在群里面的用户)", required = false)
+    private String imGroupId;
+
+    public String getImGroupId() {
+        return imGroupId;
+    }
+
+    public void setImGroupId(String imGroupId) {
+        this.imGroupId = imGroupId;
+    }
+
+    public String getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(String organId) {
+        this.organId = organId;
+    }
+
+    public Integer getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Integer subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public String getMusicGroupId() {
+        return musicGroupId;
+    }
+
+    public void setMusicGroupId(String musicGroupId) {
+        this.musicGroupId = musicGroupId;
+    }
+}

+ 55 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/ImLiveBroadcastRoomVo.java

@@ -1,6 +1,5 @@
 package com.ym.mec.biz.dal.vo;
 
-
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -80,6 +79,18 @@ public class ImLiveBroadcastRoomVo implements Serializable {
     @ApiModelProperty(value = "当前登录人是否是黑名单用户 0否 1是")
     private Integer blacklistFlag = 0;
 
+    @ApiModelProperty(value = "推广的直播间可见类型-全部可见ALL、部分分部可见ORGAN、部分合作单位可见SCHOOL")
+    private String popularizeType;
+
+    @ApiModelProperty(value = "分部id-多个id逗号分割")
+    private String popularizeOrgIds;
+
+    @ApiModelProperty(value = "学校id-合作单位id,多个id逗号分割")
+    private String popularizeSchoolIds;
+
+    @ApiModelProperty(value = "乐团id,多个id逗号分割")
+    private String popularizeTeamIds;
+
     @ApiModelProperty(value = "点赞数")
     private Integer likeNum;
     @ApiModelProperty(value = "当前观看人数")
@@ -87,6 +98,9 @@ public class ImLiveBroadcastRoomVo implements Serializable {
     @ApiModelProperty(value = "累计观看人数")
     private Integer totalLookNum;
 
+    @ApiModelProperty("预约人数")
+    private Integer roomReservationNum;
+
     public Integer getId() {
         return id;
     }
@@ -284,5 +298,45 @@ public class ImLiveBroadcastRoomVo implements Serializable {
     public void setBlacklistFlag(Integer blacklistFlag) {
         this.blacklistFlag = blacklistFlag;
     }
+
+    public Integer getRoomReservationNum() {
+        return roomReservationNum;
+    }
+
+    public void setRoomReservationNum(Integer roomReservationNum) {
+        this.roomReservationNum = roomReservationNum;
+    }
+
+    public String getPopularizeType() {
+        return popularizeType;
+    }
+
+    public void setPopularizeType(String popularizeType) {
+        this.popularizeType = popularizeType;
+    }
+
+    public String getPopularizeOrgIds() {
+        return popularizeOrgIds;
+    }
+
+    public void setPopularizeOrgIds(String popularizeOrgIds) {
+        this.popularizeOrgIds = popularizeOrgIds;
+    }
+
+    public String getPopularizeSchoolIds() {
+        return popularizeSchoolIds;
+    }
+
+    public void setPopularizeSchoolIds(String popularizeSchoolIds) {
+        this.popularizeSchoolIds = popularizeSchoolIds;
+    }
+
+    public String getPopularizeTeamIds() {
+        return popularizeTeamIds;
+    }
+
+    public void setPopularizeTeamIds(String popularizeTeamIds) {
+        this.popularizeTeamIds = popularizeTeamIds;
+    }
 }
 

+ 76 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/LiveRoomGoodsOrderVo.java

@@ -0,0 +1,76 @@
+package com.ym.mec.biz.dal.vo;
+
+import java.math.BigDecimal;
+
+public class LiveRoomGoodsOrderVo extends BaseRoomUserVo{
+
+    private String phone;
+
+    private String goodsName;
+
+    private BigDecimal actualPrice;
+
+    private BigDecimal expectPrice;
+
+    private BigDecimal balance;
+
+    private BigDecimal couponRemitFee;
+
+    private String payTime;
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getGoodsName() {
+        return goodsName;
+    }
+
+    public void setGoodsName(String goodsName) {
+        this.goodsName = goodsName;
+    }
+
+    public BigDecimal getActualPrice() {
+        return actualPrice;
+    }
+
+    public void setActualPrice(BigDecimal actualPrice) {
+        this.actualPrice = actualPrice;
+    }
+
+    public BigDecimal getExpectPrice() {
+        return expectPrice;
+    }
+
+    public void setExpectPrice(BigDecimal expectPrice) {
+        this.expectPrice = expectPrice;
+    }
+
+    public BigDecimal getBalance() {
+        return balance;
+    }
+
+    public void setBalance(BigDecimal balance) {
+        this.balance = balance;
+    }
+
+    public BigDecimal getCouponRemitFee() {
+        return couponRemitFee;
+    }
+
+    public void setCouponRemitFee(BigDecimal couponRemitFee) {
+        this.couponRemitFee = couponRemitFee;
+    }
+
+    public String getPayTime() {
+        return payTime;
+    }
+
+    public void setPayTime(String payTime) {
+        this.payTime = payTime;
+    }
+}

+ 80 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/RoomReservationUserVo.java

@@ -0,0 +1,80 @@
+package com.ym.mec.biz.dal.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-05-31
+ */
+@ApiModel("预约直播课人员信息")
+public class RoomReservationUserVo {
+
+    @ApiModelProperty("用户id")
+    private Long userId;
+
+    @ApiModelProperty("用户名")
+    private String username;
+
+    @ApiModelProperty("手机号")
+    private String phone;
+
+    @ApiModelProperty("分部id")
+    private Long organId;
+
+    @ApiModelProperty("分部名")
+    private  String organName;
+
+    @ApiModelProperty("声部名")
+    private String subjectName;
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public Long getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(Long organId) {
+        this.organId = organId;
+    }
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+}

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

@@ -3,9 +3,11 @@ package com.ym.mec.biz.service;
 import com.ym.mec.auth.api.entity.SysRole;
 import com.ym.mec.biz.dal.dto.EmployeeLevelDto;
 import com.ym.mec.biz.dal.dto.SimpleUserDto;
+import com.ym.mec.biz.dal.dto.SysUserDto;
 import com.ym.mec.biz.dal.entity.Employee;
 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.service.BaseService;
 import java.util.HashMap;
@@ -75,4 +77,6 @@ public interface EmployeeService extends BaseService<Integer, Employee> {
     int insertSysRole(SysRole sysRole);
 
     void simpleUpdate(Employee employee);
+
+    PageInfo<SysUserDto> queryEmployeeBasicInfo(UserBasicQueryInfo queryInfo);
 }

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

@@ -264,7 +264,7 @@ public interface ExportService {
     HttpResponseResult exportStudentVipCourseInfo(Map<String, Object> info, List<String> headColumns);
 
     //vip学员课程管理
-    HttpResponseResult exportVipStudentCourseManage(Map<String, Object> info, List<String> headColumns);
+    HttpResponseResult exportVipStudentCourseManage(Map<String, Object> info, List<String> headColumns) throws Exception;
 
     //学员小课记录导出
     HttpResponseResult exportStudentMusicTheoryCourseInfo(Map<String, Object> info, List<String> headColumns);

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupMemberService.java

@@ -1,8 +1,11 @@
 package com.ym.mec.biz.service;
 
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dto.ImGroupMemberDto;
 import com.ym.mec.biz.dal.entity.ImGroup;
 import com.ym.mec.biz.dal.entity.ImGroupMember;
+import com.ym.mec.biz.dal.page.GroupMemberQueryInfo;
+import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 
 import java.util.List;
@@ -95,4 +98,8 @@ public interface ImGroupMemberService extends BaseService<Long, ImGroupMember> {
 	void delRepeat();
 
 	List<ImGroupMember> queryMembers(String groupId, List<String> userIdList, Integer tenantId);
+
+	PageInfo<ImGroupMemberDto> queryGroupMemberPage(GroupMemberQueryInfo queryInfo);
+
+	void batchJoin(String imGroupId, String userId, String roleType);
 }

+ 17 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupService.java

@@ -1,7 +1,10 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dto.ImGroupDto;
 import com.ym.mec.biz.dal.dto.ImGroupMemberDto;
 import com.ym.mec.biz.dal.entity.ImGroup;
+import com.ym.mec.biz.dal.page.GroupMemberQueryInfo;
+import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 
 import java.util.List;
@@ -20,10 +23,15 @@ public interface ImGroupService extends BaseService<String, ImGroup> {
 	 * @param type 群类型
 	 * @return
 	 */
-	ImGroup create(String id, Integer userId, String name, String introduce, String memo, String tags, String img, String type);
+	ImGroup create(String id, Integer userId, String name, String introduce, String memo, String tags, String img, String type, ImGroup.GroupTypeEnum groupType);
 
-	//创建非课程类型的业务群组
-	String createGroup(List<String> userIdList,String groupName,String groupType);
+	/**
+	* @description: 创建非课程类型的业务群组
+	* @return java.lang.String
+	* @author zx
+	* @date 2022/6/7 15:20
+	*/
+	String createGroup(ImGroupDto imGroupDto);
 
 	/**
 	 * 解散群组
@@ -38,7 +46,7 @@ public interface ImGroupService extends BaseService<String, ImGroup> {
 	 * @param search
 	 * @return
 	 */
-	List<ImGroup> queryByUserId(Integer userId, String search);
+	List<ImGroup> queryByUserId(Integer userId, String search,String groupType);
 
 	/**
 	 * 查询群成员列表
@@ -70,4 +78,9 @@ public interface ImGroupService extends BaseService<String, ImGroup> {
 	 * @return
 	 */
 	void updateNickName1(Integer userId, String nickName);
+
+	void updateImGroup(ImGroup imGroup);
+
+	//解散群组
+	void dismissGroup(String imGroupId);
 }

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

@@ -2,12 +2,18 @@ package com.ym.mec.biz.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ym.mec.biz.dal.dto.ImLiveBroadcastRoomDto;
+import com.ym.mec.biz.dal.dto.RoomReservationUserSearch;
 import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoom;
+import com.ym.mec.biz.dal.page.LiveRoomGoodsOrderQueryInfo;
 import com.ym.mec.biz.dal.vo.BaseRoomUserVo;
 import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomVo;
+import com.ym.mec.biz.dal.vo.RoomReservationUserVo;
+import com.ym.mec.biz.dal.vo.LiveRoomGoodsOrderVo;
 import com.ym.mec.common.entity.ImUserState;
 import com.ym.mec.common.page.PageInfo;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 
@@ -85,5 +91,23 @@ public interface ImLiveBroadcastRoomService extends IService<ImLiveBroadcastRoom
      */
     List<BaseRoomUserVo> queryBaseUserInfo(List<Integer> userIdList);
 
+    /**
+     * 获取直播间预约用户信息
+     *
+     * @param query
+     * @return
+     */
+    PageInfo<RoomReservationUserVo> queryRoomUser(RoomReservationUserSearch query);
+
+    /**
+     * 导出直播间预约用户信息
+     *
+     * @param query
+     * @param response
+     */
+    void exportReservationRoomUser(RoomReservationUserSearch query, HttpServletResponse response) throws IOException;
+
+    //查询直播间商品订单列表
+    PageInfo<LiveRoomGoodsOrderVo> queryLiveRoomGoodsOrderList(LiveRoomGoodsOrderQueryInfo queryInfo);
 }
 

+ 13 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/ImLiveRoomBlackService.java

@@ -6,7 +6,6 @@ import com.ym.mec.biz.dal.entity.ImLiveRoomBlack;
 import com.ym.mec.biz.dal.vo.ImLiveRoomBlackVo;
 import com.ym.mec.common.page.PageInfo;
 
-import java.util.List;
 import java.util.Map;
 
 /**
@@ -20,9 +19,11 @@ public interface ImLiveRoomBlackService extends IService<ImLiveRoomBlack> {
     /**
      * 查询当前机构学生 -下拉框
      *
-     * @param search 搜索关键字不能为空
+     * @param param 参数
+     *              <p> search - 搜索关键字
+     *              <p> roomUid - 房间uid
      */
-    List<SysUser> queryStudentList(String roomUid, String search);
+    PageInfo<SysUser> queryStudentList(Map<String, Object> param);
 
     /**
      * 添加用户到房间黑名单中
@@ -48,5 +49,14 @@ public interface ImLiveRoomBlackService extends IService<ImLiveRoomBlack> {
      * <P> search  搜索关键字
      */
     PageInfo<ImLiveRoomBlackVo> queryBlackList(Map<String, Object> param);
+
+    /**
+     * 发送黑名单消息到直播房间
+     *
+     * @param roomUid    房间uid
+     * @param fromUserId 发送人id
+     * @param userId     用户id
+     */
+    void sendBlackMsg(String roomUid, Integer fromUserId, Integer userId, String type);
 }
 

+ 13 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/ImLiveRoomReservationService.java

@@ -5,8 +5,8 @@ import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoom;
 import com.ym.mec.biz.dal.entity.ImLiveRoomReservation;
 import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomVo;
 import com.ym.mec.common.page.PageInfo;
-import org.springframework.transaction.annotation.Transactional;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -28,9 +28,10 @@ public interface ImLiveRoomReservationService extends IService<ImLiveRoomReserva
     void cancel(ImLiveRoomReservation entity);
 
     /**
-     * 分页查询直播间
-     * @param param
-     * <p> liveState 直播状态 0未开始 1开始 2结束
+     * 学生端-分页查询直播间
+     *
+     * @param param 参数
+     *              <p> liveState 直播状态 0未开始 1开始 2结束
      */
     PageInfo<ImLiveBroadcastRoomVo> queryPageStudent(Map<String, Object> param);
 
@@ -38,5 +39,13 @@ public interface ImLiveRoomReservationService extends IService<ImLiveRoomReserva
      * 预约直播间推送极光
      */
     void push(ImLiveBroadcastRoom room);
+
+    /**
+     * 查询直播间预约人数
+     *
+     * @param roomIdList 房间号
+     * @return
+     */
+    List<ImLiveBroadcastRoomVo> countRoomReservation(List<String> roomIdList);
 }
 

+ 4 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java

@@ -6,11 +6,7 @@ import java.util.List;
 import java.util.Map;
 
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dto.CloudStudyStudentDataDto;
-import com.ym.mec.biz.dal.dto.CloudTeacherActiveTargetDetailDto;
-import com.ym.mec.biz.dal.dto.EduOrganStudentDataDto;
-import com.ym.mec.biz.dal.dto.IndexCloudStudyListDto;
-import com.ym.mec.biz.dal.dto.StatDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.BaseStudentDto;
 import com.ym.mec.biz.dal.entity.CloudTeacherOrder;
 import com.ym.mec.biz.dal.entity.CooperationOrgan;
@@ -18,9 +14,7 @@ import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.entity.StudentPreRegistration;
 import com.ym.mec.biz.dal.enums.GradeTypeEnum;
 import com.ym.mec.biz.dal.enums.PeriodEnum;
-import com.ym.mec.biz.dal.page.CloudTeacherActiveQueryInfo;
-import com.ym.mec.biz.dal.page.OrganCloudStudyStudentDataQueryInfo;
-import com.ym.mec.biz.dal.page.StudentQueryInfo;
+import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 
@@ -171,4 +165,6 @@ public interface StudentService extends BaseService<Integer, Student> {
     * @date 2022/1/7 11:02
     */
     <T extends BaseStudentDto> SysUser upSetStudent(T student);
+
+    PageInfo<SysUserDto> queryStudentBasicInfo(UserBasicQueryInfo queryInfo);
 }

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

@@ -7,6 +7,7 @@ import java.util.Map;
 import java.util.Set;
 
 import com.ym.mec.biz.dal.dto.SysMessageDto;
+import com.ym.mec.biz.dal.entity.ImSendGroupMessage;
 import com.ym.mec.biz.dal.entity.SysMessage;
 import com.ym.mec.biz.dal.enums.MessageSendMode;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
@@ -52,11 +53,9 @@ public interface SysMessageService extends BaseService<Long, SysMessage> {
 
 	/**
 	 * 发送文本消息
-	 * @param senderId
-	 * @param messageContent
 	 * @return
 	 */
-	void batchSendImGroupMessage(String messageContent,String senderId,String extra, String[] targetIds) throws MalformedURLException;
+	void batchSendImGroupTxtMessage(ImSendGroupMessage messageDto) throws MalformedURLException;
 
 	/**
 	 * 发送自定义文本消息
@@ -69,15 +68,11 @@ public interface SysMessageService extends BaseService<Long, SysMessage> {
 
 	/**
 	* @description: 发送图片消息
-	 * @param senderId
-	 * @param extra
-	 * @param imgUrl
-	 * @param targetIds
 	* @return void
 	* @author zx
 	* @date 2022/5/17 10:05
 	*/
-	void batchSendImGroupMessage(String[] targetIds,String senderId,String extra,String imgUrl) throws Exception;
+	void batchSendImGroupImgMessage(ImSendGroupMessage messageDto) throws Exception;
 
 	/**
 	* @description: 发送文件消息
@@ -91,7 +86,7 @@ public interface SysMessageService extends BaseService<Long, SysMessage> {
 	* @author zx
 	* @date 2022/5/17 10:05
 	*/
-	void batchSendImGroupMessage(String senderId,String extra,String name, String[] targetIds, String fileUrl,Long size);
+	void batchSendImGroupFileMessage(ImSendGroupMessage messageDto);
 
 	/**
 	 * 发送消息

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

@@ -0,0 +1,11 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.auth.api.entity.SysUser;
+
+public interface SysUserService {
+    Integer getUserId();
+
+    SysUser getUser();
+
+    SysUser queryUserById(Integer userId);
+}

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

@@ -218,4 +218,6 @@ public interface TeacherService extends BaseService<Integer, Teacher> {
      * @return
      */
     PageInfo<TeacherStudentDataDto> queryMemberStudentData(TeacherServeQueryInfo queryInfo);
+
+    PageInfo<SysUserDto> queryTeacherBasicInfo(UserBasicQueryInfo queryInfo);
 }

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

@@ -0,0 +1,14 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.entity.TempBuyFreeLiveTheoryCourse;
+import com.ym.mec.common.service.BaseService;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+public interface TempBuyFreeLiveTheoryCourseService extends BaseService<Integer, TempBuyFreeLiveTheoryCourse> {
+
+    List<String> importBuyFreeLiveTheoryCourse(MultipartFile file, Integer id) throws Exception;
+
+    List<String> importLiveTeacherCard(MultipartFile file, Integer id) throws Exception;
+}

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

@@ -299,7 +299,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     userRoleMap.put(teacherId, "指导老师");
                 }
             }
-            imGroupService.create(classGroup.getId().toString(), null, classGroup.getName(), musicGroup.getName(), musicGroup.getName(), musicGroup.getName(), null, "MUSIC");
+            imGroupService.create(classGroup.getId().toString(), null, classGroup.getName(), musicGroup.getName(),
+                    musicGroup.getName(), musicGroup.getName(), null, "MUSIC", ImGroup.GroupTypeEnum.valueOf(classGroup.getType().getCode()));
             imGroupMemberService.join(classGroup.getId().toString(), userRoleMap);
         }
         return true;
@@ -3745,7 +3746,9 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             }
         }
 
-        imGroupService.create(classGroup.getId().toString(), null, classGroup.getName(), musicGroup.getName(), musicGroup.getName(), musicGroup.getName(), null, "MUSIC");
+        imGroupService.create(classGroup.getId().toString(), null, classGroup.getName(),
+                musicGroup.getName(), musicGroup.getName(), musicGroup.getName(), null, "MUSIC",
+                ImGroup.GroupTypeEnum.valueOf(classGroup.getType().getCode()));
         imGroupMemberService.join(classGroup.getId().toString(), userRoleMap);
         imUserFriendService.refreshClassImUserFriend(classGroup.getId());
         return true;

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

@@ -982,14 +982,9 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
         
         //如果分部有企业信息,就用分部上的企业信息,否则用机构上的企业信息
         String companyName = null;
-        TenantInfo tenantInfo = null;
+        TenantInfo tenantInfo = tenantInfoService.get(studentInfo.getTenantId());;
         Organization organizationDto = organizationService.get(user.getOrganId());
 		if (organizationDto == null || StringUtils.isBlank(organizationDto.getCorporateName()) || StringUtils.isBlank(organizationDto.getCorporateCode())) {
-
-			tenantInfo = tenantInfoService.get(studentInfo.getTenantId());
-			if (tenantInfo == null) {
-				throw new BizException("机构信息不存在");
-			}
 			companyName = tenantInfo.getTsignName();
 		} else {
 			companyName = organizationDto.getCorporateName();
@@ -1159,7 +1154,7 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
             FileUtils.deleteQuietly(srcFile);
         }
 
-        List<SysUserContracts> userContractWithType = sysUserContractsService.getUserContractWithType(userId, ContractType.PRODUCT, ownershipType.getContractVersion());
+        List<SysUserContracts> userContractWithType = sysUserContractsService.getUserContractWithType(userId, ContractType.PRODUCT,tenantContractTemplate.getVersion());
 
         result.put("exists", !CollectionUtils.isEmpty(userContractWithType));
         result.put("productContract", html);

+ 56 - 78
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -33,6 +33,7 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.page.*;
 import org.apache.commons.collections.ListUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -82,43 +83,7 @@ import com.ym.mec.biz.dal.dao.TeacherDefaultVipGroupSalaryDao;
 import com.ym.mec.biz.dal.dao.VipGroupActivityDao;
 import com.ym.mec.biz.dal.dao.VipGroupCategoryDao;
 import com.ym.mec.biz.dal.dao.VipGroupDao;
-import com.ym.mec.biz.dal.entity.ActivityUserMapper;
-import com.ym.mec.biz.dal.entity.ClassGroup;
-import com.ym.mec.biz.dal.entity.ClassGroupStudentMapper;
-import com.ym.mec.biz.dal.entity.ClassGroupTeacherMapper;
-import com.ym.mec.biz.dal.entity.CourseGenerateDto;
-import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType;
-import com.ym.mec.biz.dal.entity.CourseScheduleAuditDetailDto;
-import com.ym.mec.biz.dal.entity.CourseScheduleComplaints;
-import com.ym.mec.biz.dal.entity.CourseScheduleEvaluate;
-import com.ym.mec.biz.dal.entity.CourseScheduleModifyLog;
-import com.ym.mec.biz.dal.entity.CourseScheduleReview;
-import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
-import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
-import com.ym.mec.biz.dal.entity.CoursesGroup;
-import com.ym.mec.biz.dal.entity.CoursesGroupModifyLog;
-import com.ym.mec.biz.dal.entity.Group;
-import com.ym.mec.biz.dal.entity.MusicGroup;
-import com.ym.mec.biz.dal.entity.MusicGroupTrainPlan;
-import com.ym.mec.biz.dal.entity.MusicGroupTrainPlanSaveDto;
-import com.ym.mec.biz.dal.entity.PracticeGroup;
-import com.ym.mec.biz.dal.entity.PracticeGroupSellPrice;
-import com.ym.mec.biz.dal.entity.School;
-import com.ym.mec.biz.dal.entity.StudentAttendance;
-import com.ym.mec.biz.dal.entity.StudentCourseScheduleRecordDto;
-import com.ym.mec.biz.dal.entity.Subject;
-import com.ym.mec.biz.dal.entity.SysConfig;
-import com.ym.mec.biz.dal.entity.Teacher;
-import com.ym.mec.biz.dal.entity.TeacherAttendance;
-import com.ym.mec.biz.dal.entity.TeacherDefaultMusicGroupSalary;
-import com.ym.mec.biz.dal.entity.TeacherDefaultPracticeGroupSalary;
-import com.ym.mec.biz.dal.entity.TeacherDefaultVipGroupSalary;
-import com.ym.mec.biz.dal.entity.TenantConfig;
-import com.ym.mec.biz.dal.entity.TenantConfigDetail;
-import com.ym.mec.biz.dal.entity.VipGroup;
-import com.ym.mec.biz.dal.entity.VipGroupActivity;
-import com.ym.mec.biz.dal.entity.VipGroupCategory;
 import com.ym.mec.biz.dal.enums.AuditStatusEnum;
 import com.ym.mec.biz.dal.enums.ClassGroupStudentStatusEnum;
 import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
@@ -1668,7 +1633,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			existCours.setUpdateTime(now);
 			existCours.setStartClassTime(ac.getStartClassTime());
 			existCours.setEndClassTime(DateUtil.addMinutes(existCours.getStartClassTime(), singleClassMinutes));
-            
+
             //课程结束时间必须在21:00之前
             if(DateUtil.getHour(existCours.getEndClassTime()) > 20 && DateUtil.getMinute(existCours.getEndClassTime()) > 0){
             	throw new BizException("课程结束时间不能超过21:00,请重新调整上课时间");
@@ -3168,7 +3133,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 					if (!DateUtil.isSameDay(courseSchedule.getStartClassTime(), courseSchedule.getEndClassTime())) {
 						throw new BizException("上课时间不允许跨天,请重新调整上课时间");
 					}
-					
+
                     if(vipGroupCourseAdjustInfo.getTeachMode().equals(TeachModeEnum.OFFLINE)){
 						courseSchedule.setSchoolId(vipGroup.getTeacherSchoolId());
 					}
@@ -3299,7 +3264,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             if(newCourseSchedule.getStatus() == oldCourseSchedule.getStatus() && newCourseSchedule.getStatus() == CourseStatusEnum.OVER){
             	throw new BizException("已结束的课程需要调整课程状态");
             }
-            
+
             /*if (oldCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.VIP)) {
                 VipGroup vipGroup = vipGroupDao.get(Long.valueOf(oldCourseSchedule.getMusicGroupId()));
                 if(Objects.isNull(vipGroup)){
@@ -3343,12 +3308,12 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             	int minutes = DateUtil.minutesBetween(oldCourseSchedule.getStartClassTime(), oldCourseSchedule.getEndClassTime());
             	newCourseSchedule.setEndClassTime(DateUtil.addMinutes(newCourseSchedule.getStartClassTime(), minutes));
             }
-            
+
             //课程结束时间必须在21:00之前
             if(DateUtil.getHour(newCourseSchedule.getEndClassTime()) > 20 && DateUtil.getMinute(newCourseSchedule.getEndClassTime()) > 0){
             	throw new BizException("课程结束时间不能超过21:00,请重新调整上课时间");
             }
-            
+
             //判断上课时间是否跨天
 			if (!DateUtil.isSameDay(newCourseSchedule.getStartClassTime(), newCourseSchedule.getEndClassTime())) {
 				throw new BizException("上课时间不允许跨天,请重新调整上课时间");
@@ -3523,13 +3488,13 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			}
 
 			if ((newCourseSchedule.getStatus() != oldCourseSchedule.getStatus() && newCourseSchedule.getStatus() == CourseStatusEnum.NOT_START)) {
-                
+
 				// 清理课程作业
 				courseHomeworkService.delHomwworkByCourseScheduleId(courseScheduleId);
 
 				//删除申述
 				courseScheduleComplaintsDao.delByCourseScheduleId(courseScheduleId);
-				
+
 				//删除评论
 				courseScheduleReviewDao.delByCourseScheduleId(courseScheduleId);
 
@@ -4679,35 +4644,48 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			//获取班级声部名称
             List<Map<Integer, String>> classGroupSubjectNameMaps = classGroupDao.findClassGroupSubjectNameMaps(courseScheduleIds);
             Map<Integer, String> classGroupSubjectNameMap = MapUtil.convertIntegerMap(classGroupSubjectNameMaps);
-			Map<Long, String> eduName = null;
-			if(queryInfo.getIsExport()){
-				List<Long> musicCourseIds = results.stream().filter(e -> e.getGroupType() == MUSIC).map(CourseScheduleEndDto::getId).collect(Collectors.toList());
-				eduName = new HashMap<>(courseScheduleIds.size());
-				if(musicCourseIds != null && musicCourseIds.size() > 0){
-					eduName.putAll(MapUtil.convertMybatisMap(musicGroupDao.queryEduNameMapByCourseId(musicCourseIds)));
-				}
-				List<Long> vipCourseIds = results.stream().filter(e -> e.getGroupType() == VIP).map(CourseScheduleEndDto::getId).collect(Collectors.toList());
-				if(vipCourseIds != null && vipCourseIds.size() > 0){
-					eduName.putAll(MapUtil.convertMybatisMap(vipGroupDao.queryEduNameMapByCourseId(vipCourseIds)));
-				}
-				List<Long> practiceCourseIds = results.stream().filter(e -> e.getGroupType() == PRACTICE).map(CourseScheduleEndDto::getId).collect(Collectors.toList());
-				if(practiceCourseIds != null && practiceCourseIds.size() > 0){
-					eduName.putAll(MapUtil.convertMybatisMap(practiceGroupDao.queryEduNameMapByCourseId(practiceCourseIds)));
-				}
-			}
-			for (CourseScheduleEndDto result : results) {
-				if(eduName != null){
-					result.setEducationTeacherName(eduName.get(result.getId()));
-				}
-				result.setTeacher(null);
-				result.setTeacherName(nameIdMap.get(result.getActualTeacherId()));
-				result.setSubjectName(classGroupSubjectNameMap.get(result.getId()));
-				result.setIsSettlement(Objects.isNull(result.getSettlementTime())?0:1);
-				if(courseMergeCourseNumMap.containsKey(result.getId())){
-					result.setBeMerged(courseMergeCourseNumMap.get(result.getId())>0?true:false);
-				}
-				result.setStudentNum(courseScheduleStudentNumMap.getOrDefault(result.getId(), 0));
-			}
+            Map<Long, String> eduName = null;
+            Map<String, MusicGroupBasicDto> cooperationMap = new HashMap<>();
+            if (queryInfo.getIsExport()) {
+                List<Long> musicCourseIds = results.stream().filter(e -> e.getGroupType() == MUSIC).map(CourseScheduleEndDto::getId).collect(Collectors.toList());
+                eduName = new HashMap<>(courseScheduleIds.size());
+                if (musicCourseIds != null && musicCourseIds.size() > 0) {
+                    eduName.putAll(MapUtil.convertMybatisMap(musicGroupDao.queryEduNameMapByCourseId(musicCourseIds)));
+                }
+                List<Long> vipCourseIds = results.stream().filter(e -> e.getGroupType() == VIP).map(CourseScheduleEndDto::getId).collect(Collectors.toList());
+                if (vipCourseIds != null && vipCourseIds.size() > 0) {
+                    eduName.putAll(MapUtil.convertMybatisMap(vipGroupDao.queryEduNameMapByCourseId(vipCourseIds)));
+                }
+                List<Long> practiceCourseIds = results.stream().filter(e -> e.getGroupType() == PRACTICE).map(CourseScheduleEndDto::getId).collect(Collectors.toList());
+                if (practiceCourseIds != null && practiceCourseIds.size() > 0) {
+                    eduName.putAll(MapUtil.convertMybatisMap(practiceGroupDao.queryEduNameMapByCourseId(practiceCourseIds)));
+                }
+
+                //获取合作单位,只有groupType是 MUSIC 的才有合作单位
+                List<MusicGroupBasicDto> maps = musicGroupDao.findMusicByCourseIds(musicCourseIds);
+                for (MusicGroupBasicDto map : maps) {
+                    cooperationMap.put(map.getId(), map);
+                }
+            }
+
+            for (CourseScheduleEndDto result : results) {
+                if (eduName != null) {
+                    result.setEducationTeacherName(eduName.get(result.getId()));
+                }
+                result.setTeacher(null);
+                result.setTeacherName(nameIdMap.get(result.getActualTeacherId()));
+                result.setSubjectName(classGroupSubjectNameMap.get(result.getId()));
+                result.setIsSettlement(Objects.isNull(result.getSettlementTime()) ? 0 : 1);
+                if (courseMergeCourseNumMap.containsKey(result.getId())) {
+                    result.setBeMerged(courseMergeCourseNumMap.get(result.getId()) > 0 ? true : false);
+                }
+                result.setStudentNum(courseScheduleStudentNumMap.getOrDefault(result.getId(), 0));
+
+                MusicGroupBasicDto musicGroupBasicDto = cooperationMap.get(result.getId().toString());
+                if(null != musicGroupBasicDto){
+                    result.setCooperationOrgan(musicGroupBasicDto.getCooperationOrganName());
+                }
+            }
         }
         pageInfo.setRows(results);
         return pageInfo;
@@ -5846,15 +5824,15 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
 	@Override
 	public Object queryMusicCoursePlan(Integer userId, Date startDate, Date endDate) {
-		
+
 		List<CourseSchedule> courseScheduleList = courseScheduleDao.findStudentCoursesWithIncludeDateRange(userId, GroupType.MUSIC, startDate, endDate);
-		
+
 		List<CourseSchedulePlanDto> result = new ArrayList<CourseSchedulePlanDto>();
-		
+
 		for(CourseSchedule courseSchedule : courseScheduleList){
 			CourseSchedulePlanDto dto = new CourseSchedulePlanDto();
 			dto.setCourseSchedule(courseSchedule);
-			
+
 			//获取课程规划
 			MusicGroupTrainPlanSaveDto schoolTerm = musicGroupTrainPlanService.getSchoolTerm(courseSchedule);
 			int courseNumNo = courseScheduleDao.getCourseNumNo(schoolTerm);
@@ -5862,10 +5840,10 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			if(planList.size() >= courseNumNo){
 				dto.setMusicGroupTrainPlan(planList.get(courseNumNo - 1));
 			}
-			
+
 			result.add(dto);
 		}
-		
+
 		return result;
 	}
 

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

@@ -257,7 +257,8 @@ public class CoursesGroupServiceImpl extends BaseServiceImpl<Long, CoursesGroup>
         courseScheduleTeacherSalaryDao.batchInsert(courseScheduleTeacherSalaries);
         teacherAttendanceDao.batchInsert(teacherAttendances);
         //创建群聊
-        imGroupService.create(classGroup.getId().toString(), null, classGroup.getName(), courseGroup.getName(), courseGroup.getName(), courseGroup.getName(), null, "COMM");
+        imGroupService.create(classGroup.getId().toString(), null, classGroup.getName(),
+                courseGroup.getName(), courseGroup.getName(), courseGroup.getName(), null, "COMM", ImGroup.GroupTypeEnum.COMM);
         Map<Integer,String> userRoleMap = new HashMap(1);
         userRoleMap.put(courseGroup.getTeacherId(),"指导老师");
         imGroupMemberService.join(classGroup.getId().toString(), userRoleMap);
@@ -754,7 +755,8 @@ public class CoursesGroupServiceImpl extends BaseServiceImpl<Long, CoursesGroup>
         userRoleMap.put(coursesGroup.getTeacherId(), "");
         userRoleMap.put(order.getUserId(), "");
         
-        imGroupService.create(classGroup.getId().toString(), coursesGroup.getTeacherId(), classGroup.getName(), classGroup.getName(), classGroup.getName(), classGroup.getName(), null, "COMM");
+        imGroupService.create(classGroup.getId().toString(), coursesGroup.getTeacherId(), classGroup.getName(),
+                classGroup.getName(), classGroup.getName(), classGroup.getName(), null, "COMM", ImGroup.GroupTypeEnum.COMM);
         imGroupMemberService.join(classGroup.getId().toString(), userRoleMap);
         imUserFriendService.refreshClassImUserFriend(classGroup.getId());
         return BaseController.succeed();

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeServiceImpl.java

@@ -7,11 +7,13 @@ import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.EmployeeDto;
 import com.ym.mec.biz.dal.dto.EmployeeLevelDto;
+import com.ym.mec.biz.dal.dto.SysUserDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.EmployeeOperateEnum;
 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.*;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.ImGroupModel;
@@ -549,4 +551,24 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
         }
         employeeDao.update(employee);
     }
+
+    @Override
+    public PageInfo<SysUserDto> queryEmployeeBasicInfo(UserBasicQueryInfo queryInfo) {
+        PageInfo<SysUserDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<SysUserDto> dataList = null;
+        int count = employeeDao.countEmployeeBasicInfo(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = employeeDao.queryEmployeeBasicInfo(params);
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
 }

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

@@ -26,10 +26,8 @@ import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.excel.POIUtil;
 import com.ym.mec.util.ini.IniFileUtil;
 import com.ym.mec.util.upload.UploadUtil;
-
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.system.ApplicationHome;
@@ -40,7 +38,6 @@ import org.springframework.util.CollectionUtils;
 
 import javax.annotation.PostConstruct;
 import javax.servlet.http.HttpServletResponse;
-
 import java.io.*;
 import java.lang.reflect.InvocationTargetException;
 import java.math.BigDecimal;
@@ -51,7 +48,6 @@ import java.util.concurrent.Executors;
 import java.util.function.BiFunction;
 import java.util.function.Function;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 import static com.ym.mec.biz.dal.enums.OrderTypeEnum.OUTORDER;
 
@@ -84,8 +80,8 @@ public class ExportServiceImpl implements ExportService {
     private CourseScheduleService courseScheduleService;
     @Autowired
     private StudentService studentService;
-	@Autowired
-	private TenantConfigService tenantConfigService;
+    @Autowired
+    private TenantConfigService tenantConfigService;
     @Autowired
     private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
     @Autowired
@@ -178,8 +174,6 @@ public class ExportServiceImpl implements ExportService {
     private SysUserCashAccountLogService sysUserCashAccountLogService;
     @Autowired
     private StudentStatisticsService studentStatisticsService;
-    @Autowired
-    private SysTenantConfigService sysTenantConfigService;
 
     @Value("${spring.profiles.active:dev}")
     private String profiles;
@@ -1403,7 +1397,9 @@ public class ExportServiceImpl implements ExportService {
                 e.printStackTrace();
             }
         }, executor);
-        return BaseController.succeed(managerDownload.getName() + "导出申请已提交,请到【报表中心-下载列表查看】");
+        HttpResponseResult<Object> succeed = BaseController.succeed();
+        succeed.setMsg(managerDownload.getName() + "导出申请已提交,请到【报表中心-下载列表查看】");
+        return succeed;
     }
 
     //学员小课记录导出
@@ -1615,7 +1611,7 @@ public class ExportServiceImpl implements ExportService {
             List<CooperationOrgan> cooperationOrgans = cooperationOrganDao.getCooperationOrganByIds(cooperationOrganIds);
             cooperationOrganMap = cooperationOrgans.stream().collect(Collectors.toMap(CooperationOrgan::getId, CooperationOrgan::getName));
         }
-        
+
         //获取机构费率
         Integer tenantId = (Integer) params.get("tenantId");
         TenantConfig tenantConfig = tenantConfigService.queryByTenantId(tenantId);
@@ -2168,8 +2164,8 @@ public class ExportServiceImpl implements ExportService {
             } else if (row.getGroupType().equals(GroupType.SPORADIC)) {
                 //考级报名
                 if (row.getType().equals(OrderTypeEnum.DEGREE_REGISTRATION)) {
-                	
-                	if(StringUtils.isNotBlank(row.getMemo())){
+
+                    if(StringUtils.isNotBlank(row.getMemo())){
                         String[] feeTypes = row.getMemo().split(";");
                         List<String> feeTypeList = Arrays.asList(feeTypes);
                         for (String feeTypeStr : feeTypeList) {
@@ -2189,7 +2185,7 @@ public class ExportServiceImpl implements ExportService {
                                 row.setTheoryCourseFee(typeFee);
                             }
                         }
-                	}
+                    }
                     row.setDegreeFee(row.getActualAmount().subtract(row.getVipCourseFee()).subtract(row.getPracticeCourseFee()).subtract(row.getTheoryCourseFee()));
                 } else {
                     if (row.getChargeType() != null && SporadicChargeTypeEnum.LEVEL.getCode().equals(row.getChargeType())) {
@@ -2322,7 +2318,7 @@ public class ExportServiceImpl implements ExportService {
             List<CooperationOrgan> cooperationOrgans = cooperationOrganDao.getCooperationOrganByIds(cooperationOrganIds);
             cooperationOrganMap = cooperationOrgans.stream().collect(Collectors.toMap(CooperationOrgan::getId, CooperationOrgan::getName));
         }
-        
+
         //获取机构费率
         Integer tenantId = (Integer) params.get("tenantId");
         TenantConfig tenantConfig = tenantConfigService.queryByTenantId(tenantId);
@@ -2347,10 +2343,10 @@ public class ExportServiceImpl implements ExportService {
         if(musicGroupIds != null && musicGroupIds.size() > 0){
             musicGroupNameMap = MapUtil.convertIntegerMap(musicGroupDao.queryMusicGroupNameMap(musicGroupIds));
         }
-        
+
         Map<String,BigDecimal> serviceChargeMap = new HashMap<String, BigDecimal>();
         Map<String,Integer> orderCountMap = new HashMap<String, Integer>();
-        
+
         for (StudentPaymentOrderExportDto row : studentPaymentOrderExportDtos) {
             if (row.getActualAmount() == null) {
                 row.setActualAmount(BigDecimal.ZERO);
@@ -2369,7 +2365,7 @@ public class ExportServiceImpl implements ExportService {
             BigDecimal totalFee = BigDecimal.ZERO;
             if (row.getPaymentChannel() != null && row.getPaymentChannel().equals("ADAPAY")) {
                 FeeFlagNumDto countFeeFlagNum = studentPaymentRouteOrderDao.getCountFeeFlagNum(row.getOrderNo());
-                
+
                 Integer times = orderCountMap.get(row.getOrderNo());
 				if (times == null) {
 					times = 1;
@@ -2377,9 +2373,9 @@ public class ExportServiceImpl implements ExportService {
 					++times;
 				}
             	orderCountMap.put(row.getOrderNo(), times);
-            	
+
             	currentFee = row.getServiceFee();
-                
+
             	//兼容2022年之前的数据
 				if (currentFee == null || (currentFee.floatValue() == 0 && row.getCreateTime().before(DateUtil.stringToDate("2022-01-01 00:00:00")))) {
 					transferFee = serviceChargeMap.get(row.getOrderNo());
@@ -2729,7 +2725,7 @@ public class ExportServiceImpl implements ExportService {
                     order.setMaintenanceFee(order.getMaintenanceFee());
                     order.setMusicalFee(BigDecimal.ZERO);
                     order.setTeachingFee(BigDecimal.ZERO);
-                    order.setOtherFee(BigDecimal.ZERO);
+//                    order.setOtherFee(BigDecimal.ZERO);
                     order.setLeaseFee(BigDecimal.ZERO);
                     continue;
                 }
@@ -2859,9 +2855,9 @@ public class ExportServiceImpl implements ExportService {
         }
         HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部名称", "乐团主管", "课程编号", "开始时间", "结束时间",
                 "班级名称", "班级声部", "课程名称", "课程类型", "教学模式",
-                "教学点", "课程状态", "指导老师", "学员编号", "是否点名", "是否有考勤申诉", "预计上课人数"}, new String[]{
+                "教学点", "课程状态", "指导老师", "学员编号", "是否点名", "是否有考勤申诉", "预计上课人数","合作单位"}, new String[]{
                 "organName", "educationTeacherName", "id", "startClassTime", "endClassTime", "classGroupName", "subjectName", "name",
-                "groupType.desc", "teachMode.msg", "schoolName", "status.msg", "teacherName", "studentId", "isCallNames.msg", "isComplaints", "studentNum"}, rows);
+                "groupType.desc", "teachMode.msg", "schoolName", "status.msg", "teacherName", "studentId", "isCallNames.msg", "isComplaints", "studentNum","cooperationOrgan"}, rows);
         exportManagerDownload(workbook,managerDownload);
     }
 

+ 38 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupMemberServiceImpl.java

@@ -2,12 +2,15 @@ package com.ym.mec.biz.service.impl;
 
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.ImGroupMemberDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.page.GroupMemberQueryInfo;
 import com.ym.mec.biz.service.ImGroupMemberService;
 import com.ym.mec.biz.service.ImGroupService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.im.ImFeignService;
 import com.ym.mec.im.entity.GroupMember;
@@ -100,7 +103,8 @@ public class ImGroupMemberServiceImpl extends BaseServiceImpl<Long, ImGroupMembe
 			}
 			tags = vipGroup.getName();
 		}
-		ImGroup imGroup = imGroupService.create(imGroupId, null, classGroup.getName(), tags, tags, tags, null, classGroup.getGroupType().getCode());
+		ImGroup imGroup = imGroupService.create(imGroupId, null, classGroup.getName(), tags,
+				tags, tags, null, classGroup.getGroupType().getCode(), ImGroup.GroupTypeEnum.valueOf(classGroup.getType().getCode()));
 		if(userId != null){
 			join(imGroupId,userId,roleType,isAdmin);
 		}
@@ -140,11 +144,11 @@ public class ImGroupMemberServiceImpl extends BaseServiceImpl<Long, ImGroupMembe
 
 		imGroupMemberDao.insert(imGroupMember);
 
-		imGroup.setMemberNum(imGroup.getMemberNum() + 1);
+		imGroup.setMemberNum(1);
 		imGroup.setUpdateTime(date);
 		imGroupDao.update(imGroup);
 
-		String groupId = imGroup.getId().toString();
+		String groupId = imGroup.getId();
 
 		GroupMember groupMember = new GroupMember(userId.toString(), groupId);
 		imFeignService.groupJoin(new GroupModel(groupId, new GroupMember[] { groupMember }, imGroup.getName()));
@@ -184,7 +188,7 @@ public class ImGroupMemberServiceImpl extends BaseServiceImpl<Long, ImGroupMembe
 
 		imGroupMemberDao.insert(imGroupMember);
 
-		imGroup.setMemberNum(imGroup.getMemberNum() + 1);
+		imGroup.setMemberNum(1);
 		imGroup.setUpdateTime(date);
 		imGroupDao.update(imGroup);
 
@@ -256,7 +260,7 @@ public class ImGroupMemberServiceImpl extends BaseServiceImpl<Long, ImGroupMembe
 				}
 			}
 			imGroupMemberDao.batchInsert(imGroupMemberList);
-			imGroup.setMemberNum(imGroup.getMemberNum() + imGroupMemberList.size());
+			imGroup.setMemberNum(imGroupMemberList.size());
 			imGroup.setUpdateTime(date);
 			imGroupDao.update(imGroup);
 
@@ -302,7 +306,7 @@ public class ImGroupMemberServiceImpl extends BaseServiceImpl<Long, ImGroupMembe
 
 		imGroupMemberDao.batchDelete(imGroupMemberList);
 
-		imGroup.setMemberNum(imGroup.getMemberNum() - userIdList.size());
+		imGroup.setMemberNum(-userIdList.size());
 		imGroup.setUpdateTime(new Date());
 		imGroupDao.update(imGroup);
 
@@ -367,4 +371,32 @@ public class ImGroupMemberServiceImpl extends BaseServiceImpl<Long, ImGroupMembe
 	public List<ImGroupMember> queryMembers(String groupId, List<String> userIdList, Integer tenantId) {
 		return imGroupMemberDao.queryMembers(groupId, userIdList, tenantId);
 	}
+
+    @Override
+    public PageInfo<ImGroupMemberDto> queryGroupMemberPage(GroupMemberQueryInfo queryInfo) {
+		PageInfo<ImGroupMemberDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+
+		List<ImGroupMemberDto> dataList = null;
+		int count = imGroupMemberDao.countGroupMember(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = imGroupMemberDao.queryGroupMemberPage(params);
+		}
+		if (count == 0) {
+			dataList = new ArrayList<>();
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+    }
+
+	@Override
+	public void batchJoin(String imGroupId, String userId, String roleType) {
+		List<Integer> userIds = Arrays.stream(userId.split(",")).mapToInt(Integer::parseInt).boxed().collect(Collectors.toList());
+		Map<Integer, String> userRoleMap = new HashMap<>(userIds.size());
+		userIds.stream().forEach(e->userRoleMap.put(e,roleType));
+		this.join(imGroupId,userRoleMap);
+	}
 }

+ 48 - 15
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupServiceImpl.java

@@ -5,6 +5,7 @@ import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.ImGroupDao;
 import com.ym.mec.biz.dal.dao.ImGroupMemberDao;
 import com.ym.mec.biz.dal.dao.ImGroupNoticeDao;
+import com.ym.mec.biz.dal.dto.ImGroupDto;
 import com.ym.mec.biz.dal.dto.ImGroupMemberDto;
 import com.ym.mec.biz.dal.entity.ImGroup;
 import com.ym.mec.biz.dal.entity.ImGroupMember;
@@ -24,10 +25,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Date;
-import java.util.List;
-import java.util.Optional;
-import java.util.UUID;
+import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -59,7 +57,7 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public ImGroup create(String id, Integer userId, String name, String introduce, String memo, String tags, String img, String type) {
+	public ImGroup create(String id, Integer userId, String name, String introduce, String memo, String tags, String img, String type, ImGroup.GroupTypeEnum groupType) {
 		ImGroup imGroup = imGroupDao.get(id);
 		if (imGroup != null) {
 			return imGroup;
@@ -83,6 +81,7 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
 		imGroup.setTags(tags);
 		imGroup.setImg(img);
 		imGroup.setType(type);
+		imGroup.setGroupType(groupType);
 		imGroup.setUpdateTime(date);
 		imGroupDao.insert(imGroup);
 
@@ -103,22 +102,34 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public String createGroup(List<String> userIdList,String groupName,String groupType){
-		Optional.ofNullable(userIdList).filter(CollectionUtils::isNotEmpty).orElseThrow(() -> new BizException("群成员不能为空"));
+	public String createGroup(ImGroupDto imGroupDto){
+		List<String> userIdList = imGroupDto.getUserIdList();
+		Integer currentUserId = null;
+		if (CollectionUtils.isEmpty(userIdList)){
+			currentUserId = sysUserFeignService.queryUserInfo().getId();
+			userIdList.add(currentUserId.toString());
+		}
+		String groupName = imGroupDto.getGroupName();
+		String type = imGroupDto.getType();
 		Optional.ofNullable(groupName).filter(StringUtils::isNotBlank).orElseThrow(() -> new BizException("群名称不能为空"));
-		Optional.ofNullable(groupType).filter(StringUtils::isNotBlank).orElseThrow(() -> new BizException("群类型不能为空"));
+		Optional.ofNullable(type).filter(StringUtils::isNotBlank).orElseThrow(() -> new BizException("群类型不能为空"));
 		Date date = new Date();
 		ImGroup imGroup = new ImGroup();
 		String groupId = UUID.randomUUID().toString();
 		imGroup.setId(groupId);
 		imGroup.setCreateTime(date);
 		imGroup.setIntroduce(groupName);
+		imGroup.setMemo(groupName);
 		imGroup.setMemberNum(userIdList.size());
 		imGroup.setName(groupName);
-		imGroup.setType(groupType);
+		imGroup.setType(type);
+		imGroup.setGroupType(imGroupDto.getGroupType());
 		imGroup.setUpdateTime(date);
 		imGroupDao.insert(imGroup);
 		List<ImGroupMember> groupMemberList = imGroupMemberDao.queryMembers(groupId, userIdList, TenantContextHolder.getTenantId());
+		if(currentUserId != null){
+			groupMemberList.get(0).setRoleType("乐团主管");
+		}
 		imGroupMemberDao.batchInsert(groupMemberList);
         Function<String,GroupMember> newGroup = userId ->new GroupMember(userId, groupId);
 		List<GroupMember> groupMembers =  userIdList.stream().map(newGroup).collect(Collectors.toList());
@@ -131,7 +142,6 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public boolean cancel(String imGroupId) {
-
 		// 删除群成员
 		imGroupMemberDao.deleteByImGroupId(imGroupId);
 		// 删除群公告
@@ -139,15 +149,14 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
 		// 删除群信息
 		imGroupDao.delete(imGroupId);
 
-		String groupId = imGroupId.toString();
-		imFeignService.groupDismiss(new GroupModel(groupId, null));
+		imFeignService.groupDismiss(new GroupModel(imGroupId, null));
 
 		return true;
 	}
 
     @Override
-    public List<ImGroup> queryByUserId(Integer userId, String search) {
-		return imGroupDao.queryByUserId(userId, search);
+    public List<ImGroup> queryByUserId(Integer userId, String search,String groupType) {
+		return imGroupDao.queryByUserId(userId, search,groupType);
     }
 
     @Override
@@ -157,7 +166,14 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
 
 	@Override
 	public ImGroupMemberDto queryMember(String imGroupId, Integer userId) {
-		return imGroupDao.queryMember(imGroupId, userId);
+		ImGroupMemberDto imGroupMemberDto = imGroupDao.queryMember(imGroupId, userId);
+		if(Objects.isNull(imGroupMemberDto)){
+			imGroupMemberDto = imGroupDao.queryMember(null, userId);
+			if (Objects.nonNull(imGroupMemberDto)){
+				imGroupMemberDto.setRoleType(null);
+			}
+		}
+		return imGroupMemberDto;
 	}
 
 	@Override
@@ -186,4 +202,21 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
 		//同步融云基本信息
 		imFeignService.update(new ImUserModel(sysUser.getId().toString(),nickName,sysUser.getAvatar()));
 	}
+
+    @Override
+	@Transactional(rollbackFor = Exception.class)
+    public void updateImGroup(ImGroup imGroup) {
+		imGroup.setMemberNum(null);
+		imGroupDao.update(imGroup);
+		imFeignService.groupUpdate(new GroupModel(imGroup.getId(),null,imGroup.getName()));
+    }
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void dismissGroup(String imGroupId) {
+		imFeignService.groupDismiss(new GroupModel(imGroupId, null));
+		imGroupDao.delete(imGroupId);
+		imGroupMemberDao.deleteByImGroupId(imGroupId);
+		imGroupNoticeDao.deleteByImGroupId(imGroupId);
+	}
 }

+ 267 - 79
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java

@@ -15,14 +15,11 @@ import com.ym.mec.biz.dal.dao.ImLiveBroadcastRoomDao;
 import com.ym.mec.biz.dal.dao.LiveGoodsMapperDao;
 import com.ym.mec.biz.dal.dao.SysConfigDao;
 import com.ym.mec.biz.dal.dto.ImLiveBroadcastRoomDto;
-import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoom;
-import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoomData;
-import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoomMember;
-import com.ym.mec.biz.dal.entity.ImLiveRoomBlack;
+import com.ym.mec.biz.dal.dto.RoomReservationUserSearch;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
-import com.ym.mec.biz.dal.vo.BaseRoomUserVo;
-import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomVo;
-import com.ym.mec.biz.dal.vo.RoomUserInfoVo;
+import com.ym.mec.biz.dal.page.LiveRoomGoodsOrderQueryInfo;
+import com.ym.mec.biz.dal.vo.*;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.entity.ImRoomMessage;
 import com.ym.mec.common.entity.ImUserState;
@@ -32,10 +29,13 @@ import com.ym.mec.common.page.PageUtil;
 import com.ym.mec.common.page.WrapperUtil;
 import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.im.ImFeignService;
+import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
+import com.ym.mec.util.excel.POIUtil;
 import com.ym.mec.util.http.HttpUtil;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.redisson.api.RBucket;
 import org.redisson.api.RLock;
 import org.redisson.api.RMap;
@@ -47,11 +47,13 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.OutputStream;
 import java.io.Serializable;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
-import java.util.function.BiConsumer;
 import java.util.function.BiFunction;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -87,30 +89,36 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     private ImLiveRoomReservationService imLiveRoomReservationService;
     @Autowired
     private ImLiveRoomBlackService imLiveRoomBlackService;
+    @Autowired
+    private EmployeeService employeeService;
 
     //待替换的变量
     public static final String USER_ID = "${userId}";
     public static final String ROOM_UID = "${roomUid}";
 
     //直播间累计用户信息-指只要进入到该房间的用户都要记录
-    public static final String LIVE_ROOM_TOTAL_USER_LIST = "IM:LIVE_ROOM_TOTAL_USER_LIST:" + ROOM_UID;
+    public static final String LIVE_ROOM_TOTAL_USER_LIST = String.join(":", "IM:LIVE_ROOM_TOTAL_USER_LIST", ROOM_UID);
     //直播间在线用户信息
-    public static final String LIVE_ROOM_ONLINE_USER_LIST = "IM:LIVE_ROOM_ONLINE_USER_LIST:" + ROOM_UID;
-    //主讲人信息
-    public static final String LIVE_SPEAKER_INFO = "IM:LIVE_SPEAKER_INFO:" + USER_ID;
-    //用户对应的直播间Uid
-    public static final String LIVE_USER_ROOM = "IM:LIVE_ROOM_USER:" + USER_ID;
-    //记录人员最后变更的状态消息时间
-    public static final String LIVE_USER_STATE_TIME = "IM:LIVE_USER_STATE_TIME:" + USER_ID;
+    public static final String LIVE_ROOM_ONLINE_USER_LIST = String.join(":", "IM:LIVE_ROOM_ONLINE_USER_LIST", ROOM_UID);
+    //当前房间主讲人心跳
+    public static final String LIVE_ROOM_SPEAKER_HEART_BEAT = String.join(":", "IM:LIVE_ROOM_SPEAKER_HEART_BEAT", ROOM_UID);
     //房间点赞数
-    public static final String LIVE_ROOM_LIKE = "IM:LIVE_ROOM_LIKE:" + ROOM_UID;
+    public static final String LIVE_ROOM_LIKE = String.join(":", "IM:LIVE_ROOM_LIKE", ROOM_UID);
     //计算人员观看时长锁
-    public static final String LIVE_LOOK_LOCK = "IM:LIVE_LOOK_LOCK:" + ROOM_UID;
+    public static final String LIVE_LOOK_LOCK = String.join(":", "IM:LIVE_LOOK_LOCK", ROOM_UID);
+    //用户对应的直播间Uid
+    public static final String LIVE_USER_ROOM = String.join(":", "IM:LIVE_ROOM_USER", USER_ID);
+    //记录人员最后变更的状态消息时间
+    public static final String LIVE_USER_STATE_TIME = String.join(":", "IM:LIVE_USER_STATE_TIME", USER_ID);
+    //主讲人信息
+    public static final String LIVE_SPEAKER_INFO = String.join(":", "IM:LIVE_SPEAKER_INFO", ROOM_UID, USER_ID);
+    //主讲人最近一次加入房间的clientIp
+    public static final String LIVE_SPEAKER_LAST_CLIENT_IP = String.join(":", "IM:LIVE_SPEAKER_LAST_CLIENT_IP", ROOM_UID, USER_ID);
     //直播提前开始时间
     public static final int PRE_LIVE_TIME_MINUTE = 30;
 
     /**
-     * 进入直播间检查数据
+     * 进入直播间检查数据-现在只有学生端用
      *
      * @param roomUid 房间uid
      * @param userId  用户id
@@ -124,14 +132,23 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         } else {
             sysUser = getSysUser(userId);
         }
+        osType = Optional.ofNullable(osType).orElse(1);
         return queryRoomAndCheck(roomUid, sysUser, osType);
     }
 
     public ImLiveBroadcastRoomVo queryRoomAndCheck(String roomUid, SysUser sysUser, Integer osType) {
+        Optional<ImLiveBroadcastRoomVo> optional;
+        //如果是学生端,则需要检查是否有权限进入
+        if (osType == 1) {
+            Map<String, Object> param = new HashMap<>();
+            param.put("roomUid", roomUid);
+            optional = Optional.of(param).map(this::getImLiveBroadcastRoomVo);
+            optional.orElseThrow(() -> new BizException("您无法观看该直播"));
+        } else {
+            optional = Optional.ofNullable(roomUid).map(this::queryRoomInfo);
+            optional.orElseThrow(() -> new BizException("直播间不存在"));
+        }
         //直播间信息校验
-        Optional<ImLiveBroadcastRoomVo> optional = Optional.ofNullable(roomUid)
-                .map(this::queryRoomInfo);
-        optional.orElseThrow(() -> new BizException("直播间不存在"));
         optional.filter(r -> r.getTenantId().equals(sysUser.getTenantId()))
                 .orElseThrow(() -> new BizException("您不是该直播机构人员,不可观看!"));
         optional.filter(r -> r.getRoomState() != 1).orElseThrow(() -> new BizException("直播间不存在"));
@@ -181,6 +198,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     private ImLiveBroadcastRoomVo getImLiveBroadcastRoomVo(String roomUid) {
         List<ImLiveBroadcastRoomVo> list = baseMapper.queryPage(new HashMap<String, Object>() {{
             put("roomUid", roomUid);
+            put("allRoom", 1);
         }});
         if (CollectionUtils.isEmpty(list)) {
             return null;
@@ -189,18 +207,52 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     }
 
     /**
-     * 分页查询直播间列表
+     * 后台-分页查询直播间列表
      */
     @Override
     public PageInfo<ImLiveBroadcastRoomVo> queryPage(Map<String, Object> param) {
-        Page<ImLiveBroadcastRoomVo> pageInfo = PageUtil.getPageInfo(param);
+        Page<ImLiveBroadcastRoomVo> pageInfo = PageUtil.concatTimePage(param, "startTime", "endTime");
         pageInfo.setDesc("a.created_time_");
         param.put("tenantId", TenantContextHolder.getTenantId());
-        BiConsumer<String, String> addTimeCons = (key, time) -> Optional.ofNullable(param.get(key)).map(String::valueOf)
-                .ifPresent(date -> param.put(key, date + " " + time));
-        addTimeCons.accept("startTime", "00:00:00");
-        addTimeCons.accept("endTime", "23:59:59");
+        //查询该人员分部  及 分部下包含的学校(合作单位)
+        SysUser sysUser = getSysUser();
+        //分部
+        String organIds;
+        //如果是超管就查询当前机构所有的直播间
+        if (sysUser.getTenantId() == -1 || sysUser.getIsSuperAdmin()) {
+            param.put("allRoom", 1);
+        } else {
+            Employee employee = employeeService.get(sysUser.getId());
+            if (Objects.nonNull(employee) && Objects.nonNull(employee.getOrganIdList())) {
+                organIds = employee.getOrganIdList();
+                param.put("organIds", organIds);
+                String schoolIds = baseMapper.querySchoolIds(organIds);
+                if (StringUtils.isNotBlank(schoolIds)) {
+                    param.put("schoolIds", schoolIds);
+                }
+            }
+        }
         IPage<ImLiveBroadcastRoomVo> page = baseMapper.queryPage(pageInfo, param);
+
+        // 查询预约人数
+        List<ImLiveBroadcastRoomVo> records = page.getRecords();
+        if (CollectionUtils.isEmpty(records)) {
+            return PageUtil.pageInfo(page);
+        }
+
+        List<String> roomIdList = records.stream().map(ImLiveBroadcastRoomVo::getRoomUid).collect(Collectors.toList());
+
+        List<ImLiveBroadcastRoomVo> countRoomReservationList = imLiveRoomReservationService.countRoomReservation(roomIdList);
+        Map<String, List<ImLiveBroadcastRoomVo>> collect = countRoomReservationList.stream()
+                .collect(Collectors.groupingBy(ImLiveBroadcastRoomVo::getRoomUid));
+        for (ImLiveBroadcastRoomVo record : records) {
+            List<ImLiveBroadcastRoomVo> imLiveBroadcastRoomVos = collect.get(record.getRoomUid());
+            if (CollectionUtils.isEmpty(imLiveBroadcastRoomVos)) {
+                continue;
+            }
+            record.setRoomReservationNum(imLiveBroadcastRoomVos.get(0).getRoomReservationNum());
+        }
+
         return PageUtil.pageInfo(page);
     }
 
@@ -239,14 +291,38 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     @Transactional(rollbackFor = Exception.class)
     public void update(ImLiveBroadcastRoomDto dto) {
         Date now = new Date();
+        Integer userId = getSysUser().getId();
+        ImLiveBroadcastRoom obj = this.getById(dto.getId());
+        obj.setUpdatedBy(userId);
+        obj.setUpdatedTime(now);
+        //如果直播已经则只能修改是否全员禁麦 和聊天功能
+        if (obj.getLiveState() == 1) {
+            obj.setRoomConfig(JSONObject.toJSONString(dto.getRoomConfig()));
+            this.updateById(obj);
+            return;
+        }
         if (now.getTime() > dto.getLiveStartTime().getTime()) {
             throw new BizException("设置的直播开始时间不能小于当前时间");
         }
-        ImLiveBroadcastRoom obj = this.getById(dto.getId());
+
+        String popularizeType = dto.getPopularizeType();
+        switch (popularizeType) {
+            case ImLiveBroadcastRoom.ALL:
+                dto.setPopularizeOrgIds(null);
+                dto.setPopularizeSchoolIds(null);
+                dto.setPopularizeTeamIds(null);
+                break;
+            case ImLiveBroadcastRoom.ORGAN:
+                dto.setPopularizeSchoolIds(null);
+                dto.setPopularizeTeamIds(null);
+                break;
+            case ImLiveBroadcastRoom.SCHOOL:
+                dto.setPopularizeTeamIds(null);
+                break;
+        }
+
         BeanUtils.copyProperties(dto, obj);
         obj.setRoomConfig(JSONObject.toJSONString(dto.getRoomConfig()));
-        obj.setUpdatedBy(getSysUser().getId());
-        obj.setUpdatedTime(now);
         log.info("update room  >>>  :{}", JSONObject.toJSONString(obj));
         this.updateById(obj);
     }
@@ -330,21 +406,16 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      */
     @Override
     public ImLiveBroadcastRoomVo queryPopularizeRoom() {
-        //查询该学生信息-获取分部
-        SysUser user = getSysUser();
-        //查询哪些分部无法推广直播间
-        String popularizeOrgan = sysConfigDao.findConfigValue("live_popularize_organ");
-        if (StringUtils.isNotBlank(popularizeOrgan)) {
-            List<String> organList = WrapperUtil.toList(popularizeOrgan);
-            if (Objects.nonNull(user.getOrganId()) && !organList.contains(user.getOrganId().toString())) {
-                return null;
-            }
-        }
         Map<String, Object> param = new HashMap<>();
         param.put("tenantId", TenantContextHolder.getTenantId());
         param.put("popularize", 1);
         param.put("liveState", 1);
-        List<ImLiveBroadcastRoomVo> list = baseMapper.queryPage(param);
+        return getImLiveBroadcastRoomVo(param);
+    }
+
+    private ImLiveBroadcastRoomVo getImLiveBroadcastRoomVo(Map<String, Object> param) {
+        PageInfo<ImLiveBroadcastRoomVo> pageInfo = imLiveRoomReservationService.queryPageStudent(param);
+        List<ImLiveBroadcastRoomVo> list = pageInfo.getRows();
         if (CollectionUtils.isNotEmpty(list)) {
             return list.get(0);
         }
@@ -389,9 +460,27 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             return;
         }
         //获取直播间主讲人信息
-        RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, room.getSpeakerId().toString()));
+        RBucket<RoomSpeakerInfo> speakerCache = getRoomSpeakerInfoCache(room.getRoomUid(), room.getSpeakerId().toString());
         if (speakerCache.isExists()) {
             RoomSpeakerInfo speakerInfo = speakerCache.get();
+            //查询用户是否在线
+            if (imFeignService.checkOnline(speakerInfo.getSpeakerId().toString())) {
+                log.info("roomDestroy destroyExpiredLiveRoom  is online >>>> roomId:{} speakerId:{}", room.getId(), speakerInfo.getSpeakerId());
+                return;
+            }
+            //校验房间心跳是否过期没续租
+            RBucket<Date> lastRoomHeartbeatCache = redissonClient.getBucket(LIVE_ROOM_SPEAKER_HEART_BEAT.replace(ROOM_UID, room.getRoomUid()));
+            if (lastRoomHeartbeatCache.isExists()) {
+                //获取最后一次房间心跳时间
+                Date lastDate = lastRoomHeartbeatCache.get();
+                //房间心跳过期时间 = 将房间心跳时间+过期分钟
+                Date lastRoomDateExpired = DateUtil.addMinutes(lastDate, expiredMinute);
+                //当前时间 小于 房间心跳过期时间 则不销毁
+                if (now.getTime() <= lastRoomDateExpired.getTime()) {
+                    log.info("roomDestroy destroyExpiredLiveRoom  last room heartbeat  >>>> roomId:{} speakerId:{}", room.getId(), speakerInfo.getSpeakerId());
+                    return;
+                }
+            }
             //1.主播没有进入房间,则直接销毁房间
             if (Objects.isNull(speakerInfo.getJoinRoomTime())) {
                 log.info("roomDestroy not joinRoom >>>> cache : {}", JSONObject.toJSONString(test(room.getRoomUid())));
@@ -479,7 +568,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             imFeignService.publishRoomMsg(message);
             log.info("roomDestroy>>>> FORCED_OFFLINE {}", JSONObject.toJSONString(message));
             //销毁直播间
-            imFeignService.destroyLiveRoom(roomUid);
+//            imFeignService.destroyLiveRoom(roomUid);
             log.info("roomDestroy>>>> destroyLiveRoom {}", JSONObject.toJSONString(message));
         } catch (Exception e) {
             log.error("roomDestroy>>>> errorMsg{}", e.getMessage(), e.getCause());
@@ -519,7 +608,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         }
         int speakerLiveTime = 0;
         //获取直播间主讲人信息 写入im_live_broadcast_room_data
-        RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, speakerId.toString()));
+        RBucket<RoomSpeakerInfo> speakerCache = getRoomSpeakerInfoCache(roomUid, speakerId.toString());
         if (speakerCache.isExists()) {
             ImLiveBroadcastRoomData liveData = new ImLiveBroadcastRoomData();
             RoomSpeakerInfo speakerInfo = speakerCache.get();
@@ -567,6 +656,8 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     @Override
     public void syncLike(String roomUid, Integer likeNum) {
         redissonClient.getBucket(LIVE_ROOM_LIKE.replace(ROOM_UID, roomUid)).set(likeNum);
+        //增加房间心跳
+        redissonClient.getBucket(LIVE_ROOM_SPEAKER_HEART_BEAT.replace(ROOM_UID, roomUid)).set(new Date());
     }
 
     /**
@@ -599,20 +690,20 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             }
             //将最新的时间写入缓存
             userStateTimeCache.set(userStateTime, 5L, TimeUnit.MINUTES);
+            //获取当前用户所在房间的uid
+            RBucket<String> userRoom = redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, userid));
+            if (!userRoom.isExists()) {
+                return;
+            }
+            String roomUid = userRoom.get();
             //查询userId是不是主讲人 ,如果是主讲人则返回
-            if (isSpeaker(user, now, userid)) {
+            if (isSpeaker(user, now, userid, roomUid)) {
                 return;
             }
             //这里开始只处理观看者的数据,观看者只接受退出消息 status=0 是进入房间
             if (user.getStatus().equals("0")) {
                 return;
             }
-            //获取当前用户所在房间的uid
-            RBucket<String> userRoom = redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, userid));
-            if (!userRoom.isExists()) {
-                return;
-            }
-            String roomUid = userRoom.get();
             Integer userId = Integer.valueOf(userid);
 
             //从房间累计用户信息中查询该用户的信息
@@ -692,19 +783,34 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      *
      * @return true 是主讲人 false 不是主讲人
      */
-    private boolean isSpeaker(ImUserState user, Date now, String userid) {
-        RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userid));
+    private boolean isSpeaker(ImUserState user, Date now, String userid, String roomUid) {
+        RBucket<RoomSpeakerInfo> speakerCache = getRoomSpeakerInfoCache(roomUid, userid);
         if (!speakerCache.isExists()) {
             return false;
         }
         RoomSpeakerInfo speakerInfo = speakerCache.get();
+        //最后一次进入房间的clientIp
+        RBucket<String> lastClientIp = redissonClient.getBucket(LIVE_SPEAKER_LAST_CLIENT_IP.replace(ROOM_UID, roomUid).replace(USER_ID, userid));
         //主讲人进入房间
         if (user.getStatus().equals("0")) {
             speakerInfo.setJoinRoomTime(now);
             log.info("opsRoom>>>> join speakerCache {}", JSONObject.toJSONString(speakerInfo));
             speakerCache.set(speakerInfo);
+            //将本次进入房间的clientIp添加到主讲人最后一次clientIp缓存中
+            if (StringUtils.isNotBlank(user.getClientIp())) {
+                lastClientIp.set(user.getClientIp());
+            }
             return true;
         }
+        //校验本次退出直播间的clientIp 是不是上次进入房间的clientIp
+        if (StringUtils.isNotBlank(user.getClientIp())) {
+            if (lastClientIp.isExists()) {
+                //如果是上次进入房间的clientIp和本次退出房间的clientIp不相同,则直接忽略
+                if (!user.getClientIp().equals(lastClientIp.get())) {
+                    return true;
+                }
+            }
+        }
         //主讲人退出房间关闭录像
         closeLive(speakerInfo);
         speakerInfo.setExitRoomTime(now);
@@ -727,15 +833,17 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         }
         Date now = new Date();
         //获取直播间信息
-        RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userId.toString()));
+        RBucket<RoomSpeakerInfo> speakerCache = getRoomSpeakerInfoCache(roomUid, userId.toString());
         if (!speakerCache.isExists()) {
             //没有主讲人信息则生成一个
             createSpeakerInfo(this.getById(roomVo.getId()), sysUser);
-            speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userId.toString()));
+            speakerCache = getRoomSpeakerInfoCache(roomUid, userId.toString());
         }
         RoomSpeakerInfo speakerInfo = speakerCache.get();
         speakerInfo.setJoinRoomTime(now);
         speakerCache.set(speakerInfo);
+        //记录用户当前房间uid
+        redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, userId.toString())).set(roomUid, 12L, TimeUnit.HOURS);
         return roomVo;
     }
 
@@ -769,7 +877,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             userInfo.setTotalViewTime(0);
         }
         //查询主讲人信息
-        RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, imLiveBroadcastRoomVo.getSpeakerId().toString()));
+        RBucket<RoomSpeakerInfo> speakerCache = getRoomSpeakerInfoCache(roomUid, imLiveBroadcastRoomVo.getSpeakerId().toString());
         if (speakerCache.isExists()) {
             //如果用户进来时主讲人已经开启直播则修改学生观看时间
             Integer state = speakerCache.get().getState();
@@ -795,7 +903,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      */
     public void startLive(String roomUid, Integer userId) {
         //查询房间信息
-        RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userId.toString()));
+        RBucket<RoomSpeakerInfo> speakerCache = getRoomSpeakerInfoCache(roomUid, userId.toString());
         if (!speakerCache.isExists()) {
             return;
         }
@@ -831,7 +939,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      */
     public void closeLive(String roomUid, Integer userId) {
         //查询房间主播信息
-        RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userId.toString()));
+        RBucket<RoomSpeakerInfo> speakerCache = getRoomSpeakerInfoCache(roomUid, userId.toString());
         if (!speakerCache.isExists()) {
             return;
         }
@@ -902,7 +1010,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
                 if (onlineUserInfoExists && onlineUserInfo.containsKey(id)) {
                     if (type.equals(1)) {
                         //开启直播后对当前在房间的用户写入观看时间
-                        userInfo.setDynamicLookTime(new Date());
+                        userInfo.setDynamicLookTime(now);
                     } else if (type.equals(2)) {
                         userInfo.setTotalViewTime(getLookMinutes(userInfo.getDynamicLookTime(), now, userInfo.getTotalViewTime()));
                         userInfo.setDynamicLookTime(null);
@@ -990,7 +1098,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             speakerInfo.setWhetherVideo(1);
         }
         //写入主讲人信息
-        redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, room.getSpeakerId().toString())).set(speakerInfo);
+        getRoomSpeakerInfoCache(room.getRoomUid(), room.getSpeakerId().toString()).set(speakerInfo);
 
         //生成0点赞
         redissonClient.getBucket(LIVE_ROOM_LIKE.replace(ROOM_UID, room.getRoomUid())).set(0);
@@ -1036,13 +1144,13 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     private SysUser getSysUser(Integer userId) {
         return Optional.ofNullable(userId)
                 .map(sysUserFeignService::queryUserById)
-                .orElseThrow(() -> new BizException("用户不存在"));
+                .orElseThrow(() -> new BizException("用户不存在."));
     }
 
     private SysUser getSysUser() {
         //修改机构基础信息
         return Optional.ofNullable(sysUserFeignService.queryUserInfo())
-                .orElseThrow(() -> new BizException("用户不存在"));
+                .orElseThrow(() -> new BizException("用户不存在."));
     }
 
     /**
@@ -1051,6 +1159,26 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     public Map<String, Object> test(String roomUid) {
         //test
         Map<String, Object> result = new HashMap<>();
+        //校验房间心跳是否过期没续租
+        RBucket<Date> lastRoomHeartbeatCache = redissonClient.getBucket(LIVE_ROOM_SPEAKER_HEART_BEAT.replace(ROOM_UID, roomUid));
+        if (lastRoomHeartbeatCache.isExists()) {
+            result.put("房间心跳", DateUtil.dateToString(lastRoomHeartbeatCache.get(), DateUtil.EXPANDED_DATE_TIME_FORMAT));
+        } else {
+            result.put("房间心跳", "房间心跳不存在");
+        }
+        String userId = "";
+        try {
+            String[] split = roomUid.split("-");
+            userId = split[1];
+        } catch (Exception ignored) {
+        }
+        //获取主讲人信息
+        RBucket<RoomSpeakerInfo> speakerCache = getRoomSpeakerInfoCache(roomUid, userId);
+        if (speakerCache.isExists()) {
+            result.put("主讲人信息", speakerCache.get());
+        } else {
+            result.put("主讲人信息", "主讲人信息不存在");
+        }
         //点赞数
         Object like = redissonClient.getBucket(LIVE_ROOM_LIKE.replace(ROOM_UID, roomUid)).get();
         if (Objects.isNull(like)) {
@@ -1067,29 +1195,15 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         if (CollectionUtils.isNotEmpty(totalUserInfo)) {
             if (CollectionUtils.isNotEmpty(inRoomUserInfo)) {
                 look = inRoomUserInfo.size();
-                result.put("正在观看的人员信息", inRoomUserInfo);
+//                result.put("正在观看的人员信息", inRoomUserInfo);
             } else {
                 result.put("正在观看的人员信息", "没有正在观看的人员数据");
             }
             totalLook = totalUserInfo.size();
-            result.put("总人员数据", totalUserInfo);
+//            result.put("总人员数据", totalUserInfo);
         } else {
             result.put("总人员数据", "没有人员数据");
         }
-        String userId = "";
-        try {
-            String[] split = roomUid.split("-");
-            userId = split[1];
-        } catch (Exception ignored) {
-        }
-
-        //获取主讲人信息
-        RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userId));
-        if (speakerCache.isExists()) {
-            result.put("主讲人信息", speakerCache.get());
-        } else {
-            result.put("主讲人信息", "主讲人信息不存在");
-        }
         result.put("总观看人数", totalLook);
         result.put("实时观看数", look);
         return result;
@@ -1148,6 +1262,70 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
                 .orElseThrow(() -> new BizException("用户id集合不能为空"));
     }
 
+    @Override
+    public PageInfo<RoomReservationUserVo> queryRoomUser(RoomReservationUserSearch query) {
+        IPage<RoomReservationUserVo> page = PageUtil.getPage(query.getPage(), query.getRows());
+        page = baseMapper.queryRoomUser(page, query);
+        return PageUtil.pageInfo(page);
+    }
+
+    /**
+     * 导出直播间预约用户信息
+     *
+     * @param query
+     * @param response
+     */
+    public void exportReservationRoomUser(RoomReservationUserSearch query, HttpServletResponse response) throws IOException {
+        //训练营详情-查询条件时间设置
+        List<RoomReservationUserVo> list = baseMapper.queryRoomUser(query);
+        OutputStream outputStream = response.getOutputStream();
+        HSSFWorkbook workbook = null;
+        try {
+            String[] header = {"编号", "姓名", "手机号", "分部", "声部"};
+            String[] body = {"userId", "username", "phone", "organName", "subjectName"};
+            workbook = POIUtil.exportExcel(header, body, list);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=replacement-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+            workbook.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    workbook.close();
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    @Override
+    public PageInfo<LiveRoomGoodsOrderVo> queryLiveRoomGoodsOrderList(LiveRoomGoodsOrderQueryInfo queryInfo) {
+        PageInfo<LiveRoomGoodsOrderVo> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<LiveRoomGoodsOrderVo> dataList = null;
+        int count = baseMapper.countLiveRoomGoodsOrderList(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = baseMapper.queryLiveRoomGoodsOrderList(params);
+            pageInfo.setStatInfo(baseMapper.sumLiveRoomGoodsOrderList(params));
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
     /**
      * 查询直播间所有用户信息
      *
@@ -1180,6 +1358,16 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         return redissonClient.getMap(LIVE_ROOM_TOTAL_USER_LIST.replace(ROOM_UID, roomUid));
     }
 
+    /**
+     * 获取房间主讲人消息
+     *
+     * @param roomUid 房间uid
+     * @param userId  用户id
+     */
+    private RBucket<RoomSpeakerInfo> getRoomSpeakerInfoCache(String roomUid, String userId) {
+        return redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userId).replace(ROOM_UID, roomUid));
+    }
+
     private RoomUserInfoVo getUserInfo(Integer userId) {
         RoomUserInfoVo userInfo = new RoomUserInfoVo();
         userInfo.setUserId(userId);

+ 10 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveRoomBlackServiceImpl.java

@@ -45,17 +45,20 @@ public class ImLiveRoomBlackServiceImpl extends ServiceImpl<ImLiveRoomBlackDao,
     /**
      * 查询当前机构学生 -下拉框
      *
-     * @param search 搜索关键字不能为空
+     * @param param 参数
+     *              <p> search - 搜索关键字
+     *              <p> roomUid - 房间uid
      */
     @Override
-    public List<SysUser> queryStudentList(String roomUid, String search) {
-        Optional.ofNullable(search).orElseThrow(() -> new BizException("search is null"));
+    public PageInfo<SysUser> queryStudentList(Map<String, Object> param) {
+        Page<SysUser> pageInfo = PageUtil.getPageInfo(param);
+        pageInfo.setDesc("id_");
         Integer tenantId = TenantContextHolder.getTenantId();
         //管理员机构id 是-1
-        if (Objects.nonNull(tenantId) && tenantId == -1) {
-            tenantId = null;
+        if (Objects.nonNull(tenantId) && tenantId != -1) {
+            param.put("tenantId", tenantId);
         }
-        return baseMapper.queryStudent(tenantId, search, roomUid);
+        return PageUtil.pageInfo(baseMapper.queryStudent(pageInfo, param));
     }
 
     /**
@@ -122,7 +125,6 @@ public class ImLiveRoomBlackServiceImpl extends ServiceImpl<ImLiveRoomBlackDao,
         WrapperUtil.toStr(param, "roomUid", "房间编号不能为空");
         Page<ImLiveRoomBlackVo> pageInfo = PageUtil.getPageInfo(param);
         pageInfo.setDesc("a.create_time_");
-        param.put("tenantId", TenantContextHolder.getTenantId());
         IPage<ImLiveRoomBlackVo> imLiveRoomBlackVoIPage = baseMapper.queryBlackList(pageInfo, param);
         return PageUtil.pageInfo(imLiveRoomBlackVoIPage);
     }
@@ -134,7 +136,7 @@ public class ImLiveRoomBlackServiceImpl extends ServiceImpl<ImLiveRoomBlackDao,
      * @param fromUserId 发送人id
      * @param userId     用户id
      */
-    private void sendBlackMsg(String roomUid, Integer fromUserId, Integer userId, String type) {
+    public void sendBlackMsg(String roomUid, Integer fromUserId, Integer userId, String type) {
         //校验传入参数,房间uid和发送人id不能为空
         if (!WrapperUtil.checkObj(roomUid, fromUserId, userId, type)) {
             log.info(" sendBlackMsg>>>> param is null   roomUid: {}  fromUserId:{}  type:{}", roomUid, fromUserId, type);

+ 26 - 10
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveRoomReservationServiceImpl.java

@@ -8,13 +8,13 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.ImLiveRoomReservationDao;
-import com.ym.mec.biz.dal.dao.SysConfigDao;
 import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoom;
 import com.ym.mec.biz.dal.entity.ImLiveRoomReservation;
+import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomVo;
 import com.ym.mec.biz.service.ImLiveRoomReservationService;
-import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.biz.service.StudentService;
 import com.ym.mec.biz.service.SysMessageService;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
@@ -31,7 +31,6 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
-import java.util.function.BiConsumer;
 
 /**
  * 直播预约记录(ImLiveRoomReservation)表服务实现类
@@ -47,7 +46,7 @@ public class ImLiveRoomReservationServiceImpl extends ServiceImpl<ImLiveRoomRese
     @Autowired
     private SysUserFeignService sysUserFeignService;
     @Autowired
-    private SysConfigDao sysConfigDao;
+    private StudentService studentService;
     @Autowired
     private SysMessageService sysMessageService;
 
@@ -84,14 +83,26 @@ public class ImLiveRoomReservationServiceImpl extends ServiceImpl<ImLiveRoomRese
      */
     @Override
     public PageInfo<ImLiveBroadcastRoomVo> queryPageStudent(Map<String, Object> param) {
-        param.put("userId", getUser().getId());
-        Page<ImLiveBroadcastRoomVo> pageInfo = PageUtil.getPageInfo(param);
+        SysUser user = getUser();
+        Page<ImLiveBroadcastRoomVo> pageInfo = PageUtil.concatTimePage(param, "startTime", "endTime");
         pageInfo.setDesc("a.created_time_");
+        param.put("userId", user.getId());
         param.put("tenantId", TenantContextHolder.getTenantId());
-        BiConsumer<String, String> addTimeCons = (key, time) -> Optional.ofNullable(param.get(key)).map(String::valueOf)
-                .ifPresent(date -> param.put(key, date + " " + time));
-        addTimeCons.accept("startTime", "00:00:00");
-        addTimeCons.accept("endTime", "23:59:59");
+        //查询该学员 所属分部
+        Integer organId = user.getOrganId();
+        if (Objects.nonNull(organId)) {
+            param.put("organId", organId);
+        }
+        //合作单位
+        Student student = studentService.get(user.getId());
+        if (Objects.nonNull(student) && Objects.nonNull(student.getCooperationOrganId())) {
+            param.put("schoolId", student.getCooperationOrganId());
+        }
+        //乐团
+        String teamIds = baseMapper.queryMusicGroupIds(user.getId());
+        if (StringUtils.isNotBlank(teamIds)) {
+            param.put("teamIds", teamIds);
+        }
         IPage<ImLiveBroadcastRoomVo> page = baseMapper.queryPageStudent(pageInfo, param);
         return PageUtil.pageInfo(page);
     }
@@ -130,6 +141,11 @@ public class ImLiveRoomReservationServiceImpl extends ServiceImpl<ImLiveRoomRese
                 .eq(ImLiveRoomReservation::getRoomUid, room.getRoomUid()));
     }
 
+    @Override
+    public List<ImLiveBroadcastRoomVo> countRoomReservation(List<String> roomIdList) {
+        return baseMapper.selectCountRoomReservation(roomIdList);
+    }
+
     private SysUser getUser() {
         return Optional.ofNullable(sysUserFeignService.queryUserInfo())
                 .orElseThrow(() -> new BizException("用户信息获取失败,请刷新页面或者重新登录!"));

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

@@ -3,6 +3,7 @@ package com.ym.mec.biz.service.impl;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.ImSendGroupMessageDao;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
 import com.ym.mec.biz.dal.entity.ImSendGroupMessage;
 import com.ym.mec.biz.dal.enums.ImSendTypeEnum;
 import com.ym.mec.biz.service.ImSendGroupMessageService;
@@ -27,6 +28,8 @@ public class ImSendGroupMessageServiceImpl extends BaseServiceImpl<Long, ImSendG
 	private SysMessageService sysMessageService;
 	@Autowired
 	private SysUserFeignService sysUserFeignService;
+	@Autowired
+	private SysConfigDao sysConfigDao;
 
 	@Override
 	public BaseDAO<Long, ImSendGroupMessage> getDAO() {
@@ -50,6 +53,10 @@ public class ImSendGroupMessageServiceImpl extends BaseServiceImpl<Long, ImSendG
 	@Transactional(rollbackFor = Exception.class)
 	public void sendGroupMessage(ImSendGroupMessage messageDto) throws Exception {
 		SysUser user = Optional.ofNullable(sysUserFeignService.queryUserInfo()).orElseThrow(() -> new BizException("用户不存在"));
+		String[] split = messageDto.getTargetIds().split(",");
+		if(split.length > 10){
+			throw new BizException("单次目标用户(群组)不可超过10");
+		}
 		messageDto.setSenderId(user.getId().toString());
 		messageDto.setOperator(user.getRealName());
 		if(Objects.isNull(messageDto.getSendTime())){
@@ -71,6 +78,10 @@ public class ImSendGroupMessageServiceImpl extends BaseServiceImpl<Long, ImSendG
 		if(message.getSendFlag()){
 			throw new BizException("消息已发送");
 		}
+		//如果是图片类型,图片地址不能为空
+		if((imSendGroupMessage.getMessageType() == ImSendTypeEnum.IMG || imSendGroupMessage.getMessageType() == ImSendTypeEnum.FILE) && StringUtils.isBlank(imSendGroupMessage.getFileUrl())){
+			throw new BizException("文件地址不能为空");
+		}
 		imSendGroupMessageDao.update(imSendGroupMessage);
 	}
 
@@ -124,14 +135,12 @@ public class ImSendGroupMessageServiceImpl extends BaseServiceImpl<Long, ImSendG
 
 	private void send(ImSendGroupMessage messageDto) throws Exception {
 		if (Objects.equals(messageDto.getMessageType(), ImSendTypeEnum.IMG)) {
-			sysMessageService.batchSendImGroupMessage(messageDto.getTargetIds().split(","),messageDto.getSenderId(),
-					messageDto.getExtra(),messageDto.getFileUrl());
+			sysMessageService.batchSendImGroupImgMessage(messageDto);
 		} else if (Objects.equals(messageDto.getMessageType(),ImSendTypeEnum.FILE)) {
-			sysMessageService.batchSendImGroupMessage(messageDto.getSenderId(),
-					messageDto.getExtra(),messageDto.getFileName(),messageDto.getTargetIds().split(","),messageDto.getFileUrl(),messageDto.getFileSize());
+			sysMessageService.batchSendImGroupFileMessage(messageDto);
 		}
 		if(StringUtils.isNotEmpty(messageDto.getMessageContent())){
-			sysMessageService.batchSendImGroupMessage(messageDto.getMessageContent(),messageDto.getSenderId(),messageDto.getExtra(),messageDto.getTargetIds().split(","));
+			sysMessageService.batchSendImGroupTxtMessage(messageDto);
 		}
 	}
 }

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

@@ -152,10 +152,12 @@ public class LiveGoodsMapperServiceImpl extends BaseServiceImpl<Integer, LiveGoo
 		//商品下架后,将缓存的库存设置为0
 		redissonClient.getBucket(RedisKeyConstant.LIVE_GOODS_STOCK_CACHE_KEY + liveId + liveGoodsId).set(0);
 		//如果下架的是免费的直播课商品,清空购买的学员的缓存记录
-		if(liveGoodsId.equals(2)){
-			//删除当前直播间免费直播课的购买记录缓存
-			redissonClient.getBucket(RedisKeyConstant.LIVE_GOODS_ZERO_CACHE_KEY + liveId).delete();
-		}
+//		if(liveGoodsId.equals(2) || liveGoodsId.equals(3) || liveGoodsId.equals(4)){
+//			//删除当前直播间免费直播课的购买记录缓存
+//			StringBuffer sb = new StringBuffer(RedisKeyConstant.LIVE_GOODS_ZERO_CACHE_KEY).append(liveId).
+//					append("_").append(liveGoodsId);
+//			redissonClient.getBucket(sb.toString()).delete();
+//		}
 	}
 
 	@Override

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

@@ -41,7 +41,7 @@ public class LiveGoodsServiceImpl extends BaseServiceImpl<Integer, LiveGoods>  i
     @Override
 	@Transactional(rollbackFor = Exception.class)
     public void updateLiveGoods(LiveGoods liveGoods) {
-		Optional.ofNullable(liveGoodsDao.get(liveGoods.getId())).orElseThrow(() -> new RuntimeException("商品信息不存在"));
+		Optional.ofNullable(liveGoodsDao.get(liveGoods.getId())).orElseThrow(() -> new BizException("商品信息不存在"));
 		//如果商品已在直播间上架,那么不允许变更商品信息
 		if (liveGoodsMapperService.findByLiveGoodsIdAndStatus(liveGoods.getId(),true).size() > 0) {
 			throw new BizException("商品已在直播间上架,不能修改");

+ 80 - 51
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberRankSettingServiceImpl.java

@@ -243,15 +243,17 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
         String activeConfig = sysConfigDao.findConfigValue("cloud_teacher_active_config");
         List<Cloud2022ActivityDto> cloud2022ActivityDtos = JSONArray.parseArray(activeConfig, Cloud2022ActivityDto.class);
         List<Cloud2022ActivityDto> activityDtos = cloud2022ActivityDtos.stream().
-                filter(e -> Arrays.stream(e.getOrganId().split(",")).collect(Collectors.toList()).contains(sysUser.getOrganId().toString())).collect(Collectors.toList());
+                filter(e -> Arrays.stream(e.getOrganId().split(",")).collect(Collectors.toList()).
+                        contains(sysUser.getOrganId().toString())).collect(Collectors.toList());
         if(CollectionUtils.isEmpty(activityDtos)){
             throw new BizException("当前分部暂未开通活动");
         }
+        logger.error("activeBuy params goodsId: {},liveId: {}",memberPayParamDto.getLiveGoodsId(),memberPayParamDto.getLiveId());
         BigDecimal amount = BigDecimal.ZERO;
         Integer activityId = null;
         //判断当前商品是否可以购买(库存、上架状态、是否购买过)
         //如果是云教练商品,那么只能购买一次、如果是免费直播课,那么每次上架只能买一次,总共只能买2次
-        if(memberPayParamDto.getLiveGoodsId() == 1){
+        if(memberPayParamDto.getLiveGoodsId() == 1 || memberPayParamDto.getLiveGoodsId() == 5){
             //判断用户是否已存在订单
             List<StudentPaymentOrder> memberIngOrders = studentPaymentOrderService.queryByCondition(GroupType.LIVE_BUY,null,student.getUserId(), DealStatusEnum.ING,OrderTypeEnum.LIVE_BUY);
             if (CollectionUtils.isNotEmpty(memberIngOrders)) {
@@ -262,8 +264,12 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
                 //还原库存
                 liveGoodsService.addGoodsStock(memberPayParamDto.getLiveGoodsId(),memberPayParamDto.getLiveId());
             }
+            if(memberPayParamDto.getLiveGoodsId() == 1){
+                activityId = Integer.parseInt(activityDtos.get(0).getActivityId());
+            }else {
+                activityId = Integer.parseInt(activityDtos.get(1).getActivityId());
+            }
             //是否还有购买资格
-            activityId = Integer.parseInt(activityDtos.get(0).getActivityId());
             VipGroupActivity vipGroupActivity = Optional.ofNullable(vipGroupActivityDao.get(activityId)).orElseThrow(()-> new BizException("活动不存在"));
             if(vipGroupActivity.getStudentMaxUsedTimes() != -1){
                 //获取活动购买次数
@@ -275,27 +281,33 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
             amount = vipGroupActivity.getMarketPrice();
             //扣减库存
             liveGoodsService.reduceGoodsStock(memberPayParamDto.getLiveGoodsId(),memberPayParamDto.getLiveId());
-        } else if (memberPayParamDto.getLiveGoodsId() == 2){
-            RBucket<List<Integer>> bucket = redissonClient.getBucket(RedisKeyConstant.LIVE_GOODS_ZERO_CACHE_KEY + memberPayParamDto.getLiveId());
-            List<Integer> list = bucket.get();
-            if(CollectionUtils.isEmpty(list)){
-                list = new ArrayList<>();
-            }
-            //当前用户是否购买过免费直播课
-            if(list.contains(sysUser.getId())){
+        } else if (memberPayParamDto.getLiveGoodsId() == 2 || memberPayParamDto.getLiveGoodsId() == 3 || memberPayParamDto.getLiveGoodsId() == 4){
+            TempBuyFreeLiveTheoryCourse temp = tempBuyFreeLiveTheoryCourseDao.findByGoodsIdAndUserId(memberPayParamDto.getLiveGoodsId(),student.getUserId());
+            if(Objects.nonNull(temp)){
                 throw new BizException("您已领取过本轮免费直播课");
             }
+//            StringBuffer sb = new StringBuffer(RedisKeyConstant.LIVE_GOODS_ZERO_CACHE_KEY).append(memberPayParamDto.getLiveGoodsId());
+//            RBucket<List<Integer>> bucket = redissonClient.getBucket(sb.toString());
+//            List<Integer> list = bucket.get();
+//            if(CollectionUtils.isEmpty(list)){
+//                list = new ArrayList<>();
+//            }
+//            //当前用户是否购买过免费直播课
+//            if(list.contains(sysUser.getId())){
+//                throw new BizException("您已领取过本轮免费直播课");
+//            }
             //购买次数是否超过2次
-            int count = tempBuyFreeLiveTheoryCourseDao.countByUserId(sysUser.getId());
-            if(count >= 2){
-                throw new BizException("免费直播课已达到领取次数上限");
-            }
+//            int count = tempBuyFreeLiveTheoryCourseDao.countByUserId(sysUser.getId());
+//            if(count >= 2){
+//                throw new BizException("免费直播课已达到领取次数上限");
+//            }
             //保存购买记录
-            tempBuyFreeLiveTheoryCourseDao.insert(new TempBuyFreeLiveTheoryCourse(sysUser.getId()));
+            tempBuyFreeLiveTheoryCourseDao.insert(
+                    new TempBuyFreeLiveTheoryCourse(sysUser.getId(),memberPayParamDto.getLiveId(),memberPayParamDto.getLiveGoodsId()));
             //扣减库存
             liveGoodsService.reduceGoodsStock(memberPayParamDto.getLiveGoodsId(),memberPayParamDto.getLiveId());
-            list.add(sysUser.getId());
-            bucket.set(list);
+//            list.add(sysUser.getId());
+//            bucket.set(list);
             return BaseController.succeed();
         }else {
             throw new BizException("当前商品不可购买");
@@ -312,6 +324,8 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
         studentPaymentOrder.setActivityId(activityId.toString());
         studentPaymentOrder.setActivityBuyNum(1);
         studentPaymentOrder.setMusicGroupId(memberPayParamDto.getLiveId());
+        //保存商品编号
+        studentPaymentOrder.setClassGroupId(memberPayParamDto.getLiveGoodsId());
         Map<String, Object> result = getMap(memberPayParamDto.getAmount(), memberPayParamDto.getUseBalancePayment(),studentPaymentOrder);
         return BaseController.succeed(result);
     }
@@ -330,9 +344,12 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
             succeed.setMsg("当前分部暂未开通活动");
             return succeed;
         }
-        if(memberPayParamDto.getLiveGoodsId() == 1){
+        if(memberPayParamDto.getLiveGoodsId() == 1 || memberPayParamDto.getLiveGoodsId() == 5){
             //是否还有购买资格
             Integer activityId = Integer.parseInt(activityDtos.get(0).getActivityId());
+            if(memberPayParamDto.getLiveGoodsId() == 5){
+                activityId = Integer.parseInt(activityDtos.get(1).getActivityId());
+            }
             VipGroupActivity vipGroupActivity = Optional.ofNullable(vipGroupActivityDao.get(activityId)).orElseThrow(()-> new BizException("活动不存在"));
             if(vipGroupActivity.getStudentMaxUsedTimes() != -1){
                 //获取活动购买次数
@@ -342,23 +359,29 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
                     return succeed;
                 }
             }
-        } else if (memberPayParamDto.getLiveGoodsId() == 2){
-            RBucket<List<Integer>> bucket = redissonClient.getBucket(RedisKeyConstant.LIVE_GOODS_ZERO_CACHE_KEY + memberPayParamDto.getLiveId());
-            List<Integer> list = bucket.get();
-            if(CollectionUtils.isEmpty(list)){
-                list = new ArrayList<>();
-            }
-            //当前用户是否购买过免费直播课
-            if(list.contains(sysUser.getId())){
+        } else if (memberPayParamDto.getLiveGoodsId() == 2 || memberPayParamDto.getLiveGoodsId() == 3 || memberPayParamDto.getLiveGoodsId() == 4){
+            TempBuyFreeLiveTheoryCourse temp = tempBuyFreeLiveTheoryCourseDao.findByGoodsIdAndUserId(memberPayParamDto.getLiveGoodsId(),sysUser.getId());
+            if(Objects.nonNull(temp)){
                 succeed.setMsg("您已领取过本轮免费直播课");
                 return succeed;
             }
+//            StringBuffer sb = new StringBuffer(RedisKeyConstant.LIVE_GOODS_ZERO_CACHE_KEY).append(memberPayParamDto.getLiveGoodsId());
+//            RBucket<List<Integer>> bucket = redissonClient.getBucket(sb.toString());
+//            List<Integer> list = bucket.get();
+//            if(CollectionUtils.isEmpty(list)){
+//                list = new ArrayList<>();
+//            }
+//            //当前用户是否购买过免费直播课
+//            if(list.contains(sysUser.getId())){
+//                succeed.setMsg("您已领取过本轮免费直播课");
+//                return succeed;
+//            }
             //购买次数是否超过2次
-            int count = tempBuyFreeLiveTheoryCourseDao.countByUserId(sysUser.getId());
-            if(count >= 2){
-                succeed.setMsg("免费直播课已达到领取次数上限");
-                return succeed;
-            }
+//            int count = tempBuyFreeLiveTheoryCourseDao.countByUserId(sysUser.getId());
+//            if(count >= 2){
+//                succeed.setMsg("免费直播课已达到领取次数上限");
+//                return succeed;
+//            }
         }else {
             succeed.setMsg("当前商品不可购买");
             return succeed;
@@ -635,20 +658,24 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
             activityUserMapper.setUserId(studentPaymentOrder.getUserId());
             activityUserMapper.setActivityId(activity.getId());
             activityUserMapper.setActualPrice(BigDecimal.ZERO);
-            activityUserMapper.setGivePracticeFlag(1);
             activityUserMapper.setReturnFee(false);
+            //如果是买的商品1那么赠送陪练课和训练营
+            if(Objects.equals(studentPaymentOrder.getClassGroupId(),1)){
+                //赠送陪练课
+                activityUserMapper.setGivePracticeFlag(1);
+                //赠送训练营
+                TempLittleArtistTrainingCampUserRelation tempLittleArtistTrainingCamp = new TempLittleArtistTrainingCampUserRelation();
+                tempLittleArtistTrainingCamp.setUserId(studentPaymentOrder.getUserId());
+                tempLittleArtistTrainingCamp.setState("NOT_APPLY");
+                tempLittleArtistTrainingCamp.setCreateTime(nowDate);
+                tempLittleArtistTrainingCampUserRelationDao.insert(tempLittleArtistTrainingCamp);
+            }
             activityUserMapperDao.insert(activityUserMapper);
-            //赠送训练营
-            TempLittleArtistTrainingCampUserRelation tempLittleArtistTrainingCamp = new TempLittleArtistTrainingCampUserRelation();
-            tempLittleArtistTrainingCamp.setUserId(studentPaymentOrder.getUserId());
-            tempLittleArtistTrainingCamp.setState("NOT_APPLY");
-            tempLittleArtistTrainingCamp.setCreateTime(nowDate);
-            tempLittleArtistTrainingCampUserRelationDao.insert(tempLittleArtistTrainingCamp);
             //生成订单详情
             StudentPaymentOrderDetail studentPaymentOrderDetail = new StudentPaymentOrderDetail();
             studentPaymentOrderDetail.setPaymentOrderId(studentPaymentOrder.getId());
             studentPaymentOrderDetail.setType(OrderDetailTypeEnum.CLOUD_TEACHER);
-            studentPaymentOrderDetail.setGoodsIdList("1");
+            studentPaymentOrderDetail.setGoodsIdList(studentPaymentOrder.getClassGroupId().toString());
             studentPaymentOrderDetail.setPrice(studentPaymentOrder.getExpectAmount());
             studentPaymentOrderDetail.setRemitFee(studentPaymentOrder.getCouponRemitFee());
             studentPaymentOrderDetail.setTenantId(studentPaymentOrder.getTenantId());
@@ -656,22 +683,24 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
             studentPaymentOrderDetail.setUpdateTime(nowDate);
             studentPaymentOrderDetailDao.insert(studentPaymentOrderDetail);
 
-            Map<Integer, String> phoneMaps = MapUtil.convertMybatisMap(teacherDao.queryPhoneByIds(userId.toString()));
-            String baseApiUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
-            StringBuffer pushUrl = new StringBuffer(baseApiUrl).append("/#/artistRegistration");
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.GOOD_HABITS_TRAINING_CAMP_EXPERIENCE_QUALIFICATION_SMS,phoneMaps,
-                    null,0,"",null, HttpUtil.getSortUrl(pushUrl.toString()));
+            if(Objects.equals(studentPaymentOrder.getClassGroupId(),1)) {
+                Map<Integer, String> phoneMaps = MapUtil.convertMybatisMap(teacherDao.queryPhoneByIds(userId.toString()));
+                String baseApiUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
+                StringBuffer pushUrl = new StringBuffer(baseApiUrl).append("/#/artistRegistration");
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.GOOD_HABITS_TRAINING_CAMP_EXPERIENCE_QUALIFICATION_SMS, phoneMaps,
+                        null, 0, "", null, HttpUtil.getSortUrl(pushUrl.toString()));
 
-            StringBuffer notifyUrl = new StringBuffer("8?").append(baseApiUrl).append("/#/artistRegistration");
-            Map<Integer, String> userIdMaps = new HashMap<>(1);
-            userIdMaps.put(userId, userId.toString());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.GOOD_HABITS_TRAINING_CAMP_EXPERIENCE_QUALIFICATION_PUSH,userIdMaps,
-                    null,0,notifyUrl.toString(),"STUDENT");
+                StringBuffer notifyUrl = new StringBuffer("8?").append(baseApiUrl).append("/#/artistRegistration");
+                Map<Integer, String> userIdMaps = new HashMap<>(1);
+                userIdMaps.put(userId, userId.toString());
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.GOOD_HABITS_TRAINING_CAMP_EXPERIENCE_QUALIFICATION_PUSH, userIdMaps,
+                        null, 0, notifyUrl.toString(), "STUDENT");
+            }
         }
         // 插入交易明细
         sysUserCashAccountDetailService.saveSysUserCashAccountDetail(studentPaymentOrder, "直播购买云教练");
         try {
-            contractService.transferProduceContract(userId, null, CourseViewTypeEnum.MEMBER_FEE);
+            contractService.transferProduceContract(userId, null,null);
         } catch (Exception e) {
             logger.error("产品协议生成失败", e);
         }

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

@@ -1879,7 +1879,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         musicGroupDao.update(musicGroup);
 
         // 创建群
-        imGroupService.create(musicGroupId, null, "乐团预报名", null, musicGroup.getName(), musicGroup.getName(), null, GroupType.MUSIC.getCode());
+        imGroupService.create(musicGroupId, null, "乐团预报名", null,
+                musicGroup.getName(), musicGroup.getName(), null, GroupType.MUSIC.getCode(), ImGroup.GroupTypeEnum.PARENT_MEETING);
 
         Map<Integer, String> userRoleMap = new HashMap<Integer, String>();
 

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

@@ -291,7 +291,8 @@ public class OnlineMusicGroupServiceImpl implements OnlineMusicGroupService {
         userRoleMap.put(onlineMusicGroupCourseInfo.getTeacherId(), "指导老师");
         
         // 创建群组
-        imGroupService.create(classGroup.getId().toString(), musicGroup.getEducationalTeacherId(), classGroup.getName(), classGroup.getName(), classGroup.getName(), classGroup.getName(), null, "MUSIC");
+        imGroupService.create(classGroup.getId().toString(), musicGroup.getEducationalTeacherId(), classGroup.getName(),
+                classGroup.getName(), classGroup.getName(), classGroup.getName(), null, "MUSIC", ImGroup.GroupTypeEnum.valueOf(classGroup.getType().getCode()));
         imGroupMemberService.join(classGroup.getId().toString(), userRoleMap);
 
         List<String> courseTimes = courses.stream().map(c -> DateUtil.dateToString(c.getStartClassTime(), "yyyy-MM-dd HH:mm")).collect(Collectors.toList());

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

@@ -349,8 +349,6 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             sysUserCashAccountService.updateBalance(order.getUserId(), order.getActualAmount(),
                     PlatformCashAccountDetailTypeEnum.REFUNDS, order.getMemo() + ",订单号:" + order.getOrderNo());
 
-            //退还优惠券
-            sysCouponCodeService.quit(order.getCouponCodeId());
             if (StringUtils.isNotBlank(order.getPaymentChannel())
                     && order.getPaymentChannel().equals("ADAPAY")
                     && !rpMap.containsKey("simulation")) {

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

@@ -214,10 +214,10 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Integer batchUpdateSubject(Integer userId, Integer subId, String musicGroupId) throws Exception {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("获取用户信息失败");
-        }
+//        SysUser sysUser = sysUserFeignService.queryUserInfo();
+//        if (sysUser == null) {
+//            throw new BizException("获取用户信息失败");
+//        }
         //获取当前学员的当前声部
         StudentRegistration studentRegistration = studentRegistrationDao.queryByUserIdAndMusicGroupId(userId, musicGroupId);
         if (studentRegistration == null) {

+ 22 - 16
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java

@@ -22,6 +22,8 @@ import java.util.stream.Collectors;
 
 import javax.annotation.PostConstruct;
 
+import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.page.*;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -47,19 +49,6 @@ import com.ym.mec.biz.dal.dao.SysConfigDao;
 import com.ym.mec.biz.dal.dao.SysMusicCompareRecordDao;
 import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
-import com.ym.mec.biz.dal.dto.CloudStudyStudentDataDto;
-import com.ym.mec.biz.dal.dto.CloudTeacherActiveTargetDetailDto;
-import com.ym.mec.biz.dal.dto.CloudTeacherActiveTargetDto;
-import com.ym.mec.biz.dal.dto.EduOrganStudentDataDto;
-import com.ym.mec.biz.dal.dto.EduOrganStudentListDto;
-import com.ym.mec.biz.dal.dto.EduOrganStudentListExportDto;
-import com.ym.mec.biz.dal.dto.IndexCloudStudyListDto;
-import com.ym.mec.biz.dal.dto.Mapper;
-import com.ym.mec.biz.dal.dto.StatDto;
-import com.ym.mec.biz.dal.dto.StudentClassInfoDto;
-import com.ym.mec.biz.dal.dto.StudentCourseTimesDto;
-import com.ym.mec.biz.dal.dto.StudentOrganDto;
-import com.ym.mec.biz.dal.dto.StudentTeacherCourseDto;
 import com.ym.mec.biz.dal.entity.BaseStudentDto;
 import com.ym.mec.biz.dal.entity.CloudTeacherOrder;
 import com.ym.mec.biz.dal.entity.CooperationOrgan;
@@ -75,9 +64,6 @@ import com.ym.mec.biz.dal.enums.GradeTypeEnum;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.PeriodEnum;
 import com.ym.mec.biz.dal.enums.SixPlusGradeEnum;
-import com.ym.mec.biz.dal.page.CloudTeacherActiveQueryInfo;
-import com.ym.mec.biz.dal.page.OrganCloudStudyStudentDataQueryInfo;
-import com.ym.mec.biz.dal.page.StudentQueryInfo;
 import com.ym.mec.biz.service.OrganizationService;
 import com.ym.mec.biz.service.StudentService;
 import com.ym.mec.biz.service.SysConfigService;
@@ -1352,6 +1338,26 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
         return user;
     }
 
+    @Override
+    public PageInfo<SysUserDto> queryStudentBasicInfo(UserBasicQueryInfo queryInfo) {
+        PageInfo<SysUserDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<SysUserDto> dataList = null;
+        int count = studentDao.countStudentBasicInfo(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = studentDao.queryStudentBasicInfo(params);
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
     @Transactional(rollbackFor = Exception.class)
     public  <T extends BaseStudentDto> void insertStudent(T baseStudent){
         Student student = new Student();

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

@@ -142,7 +142,6 @@ public class SysCouponCodeServiceImpl extends BaseServiceImpl<Long, SysCouponCod
         return sysCoupon;
     }
 
-
     private void checkUser(Integer userId, SysCoupon sysCoupon) {
         SysUser sysUser = sysUserFeignService.queryUserById(userId);
         if (StringUtils.isBlank(sysCoupon.getUseCondition())) {
@@ -159,7 +158,6 @@ public class SysCouponCodeServiceImpl extends BaseServiceImpl<Long, SysCouponCod
         }
     }
 
-
     private void opsCoupon(Integer userId, SysCouponCode sysCouponCode, Integer couponId, Integer exchangeNum, SysCoupon sysCoupon) {
         Integer tenantId = TenantContextHolder.getTenantId();
         Date now = new Date();

+ 49 - 32
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMessageServiceImpl.java

@@ -10,10 +10,7 @@ import com.ym.mec.biz.dal.dao.WaitSendMessageDao;
 import com.ym.mec.biz.dal.dto.Mapper;
 import com.ym.mec.biz.dal.dto.SimpleUserDto;
 import com.ym.mec.biz.dal.dto.SysMessageDto;
-import com.ym.mec.biz.dal.entity.SysEmail;
-import com.ym.mec.biz.dal.entity.SysMessage;
-import com.ym.mec.biz.dal.entity.SysMessageConfig;
-import com.ym.mec.biz.dal.entity.WaitSendMessage;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.MessageSendMode;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.SendStatusEnum;
@@ -22,6 +19,7 @@ import com.ym.mec.biz.service.SysMessageService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.ImMessageDto;
 import com.ym.mec.common.entity.ImPrivateMessage;
+import com.ym.mec.common.entity.ImSendMessageUserInfo;
 import com.ym.mec.common.entity.ImTxtMessage;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
@@ -236,18 +234,15 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 	public void batchSendImGroupMessage(MessageTypeEnum type, String senderId,String extra, String[] targetIds, String url, Object... args) {
 		String messageContent = checkMessageConfig(type);
 		String content = getContent(messageContent,url, args);
-		ExecutorService executor = Executors.newCachedThreadPool();
-		CompletableFuture.runAsync(()->{
-			imFeignService.groupSend(getImGroupMessage("RC:TxtMsg",senderId,targetIds,content,extra));
-		},executor);
+		ImMessageDto imGroupMessage = getImGroupMessage("RC:TxtMsg", senderId, targetIds, content, extra);
+		this.sendGroupMessage(imGroupMessage);
 	}
 
 	@Override
-	public void batchSendImGroupMessage(String messageContent, String senderId,String extra, String[] targetIds) {
-		ExecutorService executor = Executors.newCachedThreadPool();
-		CompletableFuture.runAsync(()->{
-			imFeignService.groupSend(getImGroupMessage("RC:TxtMsg",senderId,targetIds,messageContent,extra));
-		},executor);
+	public void batchSendImGroupTxtMessage(ImSendGroupMessage messageDto) {
+		messageDto.setObjectName("RC:TxtMsg");
+		ImMessageDto imGroupMessage = this.getImGroupMessage(messageDto);
+		this.sendGroupMessage(imGroupMessage);
 	}
 
 	@Override
@@ -270,14 +265,11 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 	}
 
 	@Override
-	public void batchSendImGroupMessage(String[] targetIds,String senderId,String extra,String imgUrl ) throws Exception {
-		URL url = new URL(imgUrl);
-		//获取文件名
-		String path = url.getPath();
-		String suffix = path.substring(path.lastIndexOf(".") + 1);
+	public void batchSendImGroupImgMessage(ImSendGroupMessage messageDto) throws Exception {
+		URL url = new URL(messageDto.getFileUrl());
 		BufferedImage bufferedImage = Thumbnails.of(url).scale(0.1f).outputQuality(0.25f).asBufferedImage();
 		ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-		ImageIO.write(bufferedImage, suffix, outputStream);
+		ImageIO.write(bufferedImage, "png", outputStream);
 		byte[] bytes = outputStream.toByteArray();
 		outputStream.close();
 		int length = bytes.length;
@@ -285,9 +277,14 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 		if (length > 393216) {
 			throw new BizException("文件过大请调整 像素 或 文件大小");
 		}
-		ImMessageDto imMessageDto =
-				getImGroupMessage("RC:ImgMsg",senderId,targetIds,imageToBase64(bufferedImage, suffix),extra);
-		imMessageDto.setFileUrl(imgUrl);
+		messageDto.setObjectName("RC:ImgMsg");
+		ImMessageDto imMessageDto = this.getImGroupMessage(messageDto);
+		imMessageDto.setMessageContent(imageToBase64(bufferedImage, "png"));
+		imMessageDto.setFileUrl(messageDto.getFileUrl());
+		this.sendGroupMessage(imMessageDto);
+	}
+
+	public void sendGroupMessage(ImMessageDto imMessageDto){
 		ExecutorService executor = Executors.newCachedThreadPool();
 		CompletableFuture.runAsync(()->{
 			imFeignService.groupSend(imMessageDto);
@@ -295,16 +292,14 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 	}
 
 	@Override
-	public void batchSendImGroupMessage(String senderId,String extra,String name, String[] targetIds, String fileUrl,Long size) {
-		ImMessageDto imMessageDto =
-				getImGroupMessage("RC:FileMsg",senderId,targetIds,"",extra);
-		imMessageDto.setFileUrl(fileUrl);
-		imMessageDto.setFileSize(size);
-		imMessageDto.setFileName(name);
-		ExecutorService executor = Executors.newCachedThreadPool();
-		CompletableFuture.runAsync(()->{
-			imFeignService.groupSend(imMessageDto);
-		},executor);
+	public void batchSendImGroupFileMessage(ImSendGroupMessage messageDto) {
+		messageDto.setObjectName("RC:FileMsg");
+		ImMessageDto imMessageDto = this.getImGroupMessage(messageDto);
+		imMessageDto.setMessageContent("");
+		imMessageDto.setFileUrl(messageDto.getFileUrl());
+		imMessageDto.setFileSize(messageDto.getFileSize());
+		imMessageDto.setFileName(messageDto.getFileName());
+		this.sendGroupMessage(imMessageDto);
 	}
 
 	private String checkMessageConfig(MessageTypeEnum type){
@@ -325,6 +320,28 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 		return content;
 	}
 
+	private ImMessageDto getImGroupMessage(ImSendGroupMessage messageDto) {
+		ImMessageDto imMessageDto = new ImMessageDto();
+		if(messageDto.getIsIncludeSender() == 0){
+			//发送系统消息用指定的用户
+			String userId = sysConfigDao.findConfigValue("system_message_user");
+			imMessageDto.setSenderId(userId);
+			SimpleUserDto simpleUser = teacherDao.getSimpleUser(Integer.parseInt(userId));
+			ImSendMessageUserInfo userInfo = new ImSendMessageUserInfo();
+			userInfo.setIcon(simpleUser.getAvatar());
+			userInfo.setId(userId);
+			userInfo.setName(simpleUser.getUserName());
+			imMessageDto.setUserInfo(userInfo);
+		}else {
+			imMessageDto.setSenderId(messageDto.getSenderId());
+		}
+		imMessageDto.setObjectName(messageDto.getObjectName());
+		imMessageDto.setTargetIds(messageDto.getTargetIds().split(","));
+		imMessageDto.setExtra(messageDto.getExtra());
+		imMessageDto.setMessageContent(messageDto.getMessageContent());
+		imMessageDto.setIsIncludeSender(messageDto.getIsIncludeSender());
+		return imMessageDto;
+	}
 	private ImMessageDto getImGroupMessage(String objectName, String senderId, String[] targetIds, String content, String extra) {
 		ImMessageDto imMessageDto = new ImMessageDto();
 		imMessageDto.setObjectName(objectName);

+ 28 - 12
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserServiceImpl.java

@@ -2,25 +2,41 @@ package com.ym.mec.biz.service.impl;
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.handler.SysUserContextHolder;
+import com.ym.mec.biz.service.SysUserService;
+import com.ym.mec.common.exception.BizException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Optional;
+
 @Service
-public class SysUserServiceImpl {
+public class SysUserServiceImpl implements SysUserService {
 
     @Autowired
     private SysUserFeignService sysUserFeignService;
 
-    public SysUser getSysUser() {
-        SysUser sysUser = SysUserContextHolder.getSysUser();
-        if(sysUser == null){
-            sysUser = sysUserFeignService.queryUserInfo();
-            if(sysUser == null || sysUser.getId() == null){
-                return null;
-            }
-        }
-        SysUserContextHolder.setSysUser(sysUser);
+    @Override
+    public Integer getUserId(){
+        return Optional.ofNullable(sysUserFeignService.queryUserInfo())
+                .map(SysUser::getId)
+                .orElseThrow(() -> new BizException("请登录"));
+    }
+
+    @Override
+    public SysUser getUser(){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        Optional.ofNullable(sysUser)
+                .map(SysUser::getId)
+                .orElseThrow(() -> new BizException("请登录"));
         return sysUser;
     }
-}
+
+    @Override
+    public SysUser queryUserById(Integer userId) {
+        SysUser user = sysUserFeignService.queryUserById(userId);
+        Optional.ofNullable(user)
+                .map(SysUser::getId)
+                .orElseThrow(() -> new BizException("用户信息获取失败"));
+        return user;
+    }
+}

+ 22 - 18
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherServiceImpl.java

@@ -16,6 +16,8 @@ import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.page.*;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
@@ -41,17 +43,6 @@ import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
 import com.ym.mec.biz.dal.dao.SubjectDao;
 import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
-import com.ym.mec.biz.dal.dto.BasicUserDto;
-import com.ym.mec.biz.dal.dto.ImUserFriendDto;
-import com.ym.mec.biz.dal.dto.MusicGroupStudentApplyDto;
-import com.ym.mec.biz.dal.dto.MusicGroupTeacherAttendanceDto;
-import com.ym.mec.biz.dal.dto.MusicGroupTeachersDto;
-import com.ym.mec.biz.dal.dto.TeacherBasicDto;
-import com.ym.mec.biz.dal.dto.TeacherCloseDto;
-import com.ym.mec.biz.dal.dto.TeacherDefaultSalaryDto;
-import com.ym.mec.biz.dal.dto.TeacherExercisesServiceDto;
-import com.ym.mec.biz.dal.dto.TeacherMusicStudentOverViewDto;
-import com.ym.mec.biz.dal.dto.TeacherStudentDataDto;
 import com.ym.mec.biz.dal.entity.CourseHomework;
 import com.ym.mec.biz.dal.entity.ImUserFriend;
 import com.ym.mec.biz.dal.entity.MusicGroup;
@@ -62,13 +53,6 @@ import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.entity.SysUserCashAccount;
 import com.ym.mec.biz.dal.entity.Teacher;
 import com.ym.mec.biz.dal.enums.GroupType;
-import com.ym.mec.biz.dal.page.MusicGroupTeacherAttendanceQueryInfo;
-import com.ym.mec.biz.dal.page.MusicGroupTeachersQueryInfo;
-import com.ym.mec.biz.dal.page.TeacherCloseQueryInfo;
-import com.ym.mec.biz.dal.page.TeacherNameQueryInfo;
-import com.ym.mec.biz.dal.page.TeacherQueryInfo;
-import com.ym.mec.biz.dal.page.TeacherServeQueryInfo;
-import com.ym.mec.biz.dal.page.queryMusicGroupStudentQueryInfo;
 import com.ym.mec.biz.service.ClassGroupService;
 import com.ym.mec.biz.service.TeacherService;
 import com.ym.mec.biz.service.TenantInfoService;
@@ -850,4 +834,24 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher>  imple
 		pageInfo.setRows(dataList);
 		return pageInfo;
 	}
+
+    @Override
+    public PageInfo<SysUserDto> queryTeacherBasicInfo(UserBasicQueryInfo queryInfo) {
+		PageInfo<SysUserDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<>();
+		MapUtil.populateMap(params, queryInfo);
+
+		List<SysUserDto> dataList = null;
+		int count = teacherDao.countTeacherBasicInfo(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = teacherDao.queryTeacherBasicInfo(params);
+		}
+		if (count == 0) {
+			dataList = new ArrayList<>();
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+    }
 }

+ 219 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TempBuyFreeLiveTheoryCourseServiceImpl.java

@@ -0,0 +1,219 @@
+package com.ym.mec.biz.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.ym.mec.biz.dal.dao.TempLiveTeacherCardDao;
+import com.ym.mec.biz.dal.entity.Goods;
+import com.ym.mec.biz.dal.entity.TempLiveTeacherCard;
+import com.ym.mec.biz.dal.enums.*;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.entity.UploadReturnBean;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.tenant.TenantContextHolder;
+import com.ym.mec.util.excel.POIUtil;
+import com.ym.mec.util.ini.IniFileUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.usermodel.PictureData;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.biz.dal.entity.TempBuyFreeLiveTheoryCourse;
+import com.ym.mec.biz.service.TempBuyFreeLiveTheoryCourseService;
+import com.ym.mec.biz.dal.dao.TempBuyFreeLiveTheoryCourseDao;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.*;
+
+@Service
+public class TempBuyFreeLiveTheoryCourseServiceImpl extends BaseServiceImpl<Integer, TempBuyFreeLiveTheoryCourse> implements TempBuyFreeLiveTheoryCourseService {
+    private final static Logger log = LoggerFactory.getLogger(TempBuyFreeLiveTheoryCourseServiceImpl.class);
+
+    @Autowired
+    private TempBuyFreeLiveTheoryCourseDao tempBuyFreeLiveTheoryCourseDao;
+
+    @Resource
+    private TempLiveTeacherCardDao tempLiveTeacherCardDao;
+
+    @Override
+    public BaseDAO<Integer, TempBuyFreeLiveTheoryCourse> getDAO() {
+        return tempBuyFreeLiveTheoryCourseDao;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+    public List<String> importBuyFreeLiveTheoryCourse(MultipartFile file, Integer id) throws Exception {
+        Map<String, List<Map<String, Object>>> sheetsListMap = POIUtil.importExcel(new ByteArrayInputStream(file.getBytes()), 2, file.getOriginalFilename());
+        InputStream inputStream = new ClassPathResource("columnMapper.ini").getInputStream();
+        Map<String, String> columns = IniFileUtil.readIniFile(inputStream, TemplateTypeEnum.BUY_FREE_LIVE_THEORY_COURSE.getMsg());
+        List<TempBuyFreeLiveTheoryCourse> tempList = new ArrayList<>();
+
+        List<String> errMsg = new ArrayList();
+        List<Map<String, Object>> sheet = sheetsListMap.get("Sheet0");
+
+        for (int i = 0; i < sheet.size(); i++) {
+            Map<String, Object> row = sheet.get(i);
+            if (row.size() == 0) {
+                continue;
+            }
+            JSONObject objectMap = new JSONObject();
+            for (String s : row.keySet()) {
+                String columnValue = columns.get(s);
+                if (StringUtils.isEmpty(columnValue)) {
+                    continue;
+                }
+                if (null == row.get(s)) {
+                    continue;
+                }
+                objectMap.put(columnValue, row.get(s));
+            }
+            String err = "";
+            //校验
+            Integer tempId = objectMap.getInteger("id");
+            if (null == tempId) {
+                err += "ID不能为空/";
+            }
+            String recommendLevel = objectMap.getString("recommendLevel");
+            if (StringUtils.isNotEmpty(recommendLevel) && null == LevelEnum.getByName(recommendLevel.trim())) {
+                err += "老师推荐级别列,数据异常(可选值:一级 二级 三级)/";
+            }
+            if (StringUtils.isNotEmpty(err)) {
+                err = "第" + (i + 1) + "行数据异常:" + err.substring(0, err.length() - 1);
+                errMsg.add(err);
+            }
+
+            try {
+                TempBuyFreeLiveTheoryCourse course = JSONObject.parseObject(objectMap.toJSONString(), TempBuyFreeLiveTheoryCourse.class);
+                tempList.add(course);
+            } catch (Exception ex) {
+                throw new BizException("导入数据出错", ex);
+            }
+        }
+        if (!CollectionUtils.isEmpty(errMsg)) {
+            return errMsg;
+        }
+        //导入数据库
+        for (TempBuyFreeLiveTheoryCourse temp : tempList) {
+            if (null == temp.getId()) {
+                continue;
+            }
+            TempBuyFreeLiveTheoryCourse course = tempBuyFreeLiveTheoryCourseDao.get(temp.getId());
+            LevelEnum byName = LevelEnum.getByName(temp.getRecommendLevel());
+            if(null != byName){
+                course.setRecommendLevel(byName.getCode());
+            }
+            tempBuyFreeLiveTheoryCourseDao.update(course);
+        }
+        return null;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+    public List<String> importLiveTeacherCard(MultipartFile file, Integer id) throws Exception {
+        Map<String, List<Map<String, Object>>> sheetsListMap = POIUtil.importExcel(new ByteArrayInputStream(file.getBytes()), 2, file.getOriginalFilename());
+        InputStream inputStream = new ClassPathResource("columnMapper.ini").getInputStream();
+        Map<String, String> columns = IniFileUtil.readIniFile(inputStream, TemplateTypeEnum.LIVE_TEACHER_CARD.getMsg());
+        List<TempLiveTeacherCard> tempList = new ArrayList<>();
+
+        List<String> errMsg = new ArrayList();
+        List<Map<String, Object>> sheet = sheetsListMap.get("录入数据");
+        for (int i = 0; i < sheet.size(); i++) {
+            Map<String, Object> row = sheet.get(i);
+            if (row.size() == 0) {
+                continue;
+            }
+            JSONObject objectMap = new JSONObject();
+            for (String s : row.keySet()) {
+                String columnValue = columns.get(s);
+                if (StringUtils.isEmpty(columnValue)) {
+                    continue;
+                }
+                if (null == row.get(s)) {
+                    continue;
+                }
+                objectMap.put(columnValue, row.get(s));
+            }
+            String err = "";
+            //校验
+            Integer subjectId = objectMap.getInteger("subjectId");
+            if (null == subjectId) {
+                err += "声部id不能为空/";
+            }
+            String level = objectMap.getString("level");
+            if (StringUtils.isNotEmpty(level) && null == LevelEnum.getByName(level.trim())) {
+                err += "老师推荐级别列,数据异常(可选值:一级 二级 三级)/";
+            }
+            if (StringUtils.isNotEmpty(err)) {
+                err = "第" + (i + 1) + "行数据异常:" + err.substring(0, err.length() - 1);
+                errMsg.add(err);
+            }
+
+            try {
+                TempLiveTeacherCard course = JSONObject.parseObject(objectMap.toJSONString(), TempLiveTeacherCard.class);
+                tempList.add(course);
+            } catch (Exception ex) {
+                throw new BizException("导入数据出错", ex);
+            }
+        }
+        if (!CollectionUtils.isEmpty(errMsg)) {
+            return errMsg;
+        }
+        //导入数据库
+        for (TempLiveTeacherCard temp : tempList) {
+            LevelEnum byName = LevelEnum.getByName(temp.getLevel());
+            if (null == byName) {
+                continue;
+            }
+            TempLiveTeacherCard card = tempLiveTeacherCardDao.getBySubjectIdAndLevel(temp.getSubjectId(), byName.getCode());
+            if (null == card) {
+                continue;
+            }
+            card.setUsername(temp.getUsername());
+            card.setAvatar(temp.getAvatar());
+            card.setIntroduction(temp.getIntroduction());
+
+            //处理曲目内容json
+            String json = getMusicContent(temp.getMusicContent());
+            card.setMusicContent(json);
+            tempLiveTeacherCardDao.update(card);
+        }
+        return null;
+    }
+
+    private String getMusicContent(String musicContent) {
+        if (StringUtils.isEmpty(musicContent)) {
+            return null;
+        }
+        musicContent = musicContent.trim();
+        List<String> musicList = Arrays.asList(musicContent.split("\\|"));
+        List<Map<String, String>> mapList = new ArrayList<>();
+        for (String musicStr : musicList) {
+            Map<String, String> musicMap = new HashMap<>();
+            try {
+                String[] split = musicStr.split(",");
+                String coourseDay = split[0];
+                coourseDay = coourseDay.replace("月",".").replace("日","")
+                        .replace("(","(").replace(")",")");
+                musicMap.put("coourseDay", coourseDay);
+                musicMap.put("coourseTime", split[1]);
+                musicMap.put("musicName", split[2]);
+
+
+
+
+                mapList.add(musicMap);
+            } catch (Exception e) {
+                log.error("数据转换失败 data is {}", musicContent);
+                e.printStackTrace();
+            }
+        }
+        return JSONObject.toJSONString(mapList);
+    }
+}

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

@@ -8,6 +8,7 @@ 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.dao.TempLittleArtistTrainingCampDao;
+import com.ym.mec.biz.dal.dto.ImGroupDto;
 import com.ym.mec.biz.dal.dto.TempLittleArtistTrainingCampDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
@@ -441,7 +442,12 @@ public class TempLittleArtistTrainingCampServiceImpl extends ServiceImpl<TempLit
             //如果人数小于最大人数 则直接分组
             if (maxUserNum.intValue() >= applyNum.intValue()) {
                 //分组
-                String groupId = imGroupService.createGroup(userStrList, camp.getName() + "-1群", groupType);
+                ImGroupDto imGroupDto = new ImGroupDto();
+                imGroupDto.setGroupType(ImGroup.GroupTypeEnum.TRAINING);
+                imGroupDto.setType(groupType);
+                imGroupDto.setGroupName(camp.getName() + "-1群");
+                imGroupDto.setUserIdList(userStrList);
+                String groupId = imGroupService.createGroup(imGroupDto);
                 imGroupIds.add(groupId);
                 //修改关系表
                 updateGroup.accept(groupId, userStrList);
@@ -455,7 +461,12 @@ public class TempLittleArtistTrainingCampServiceImpl extends ServiceImpl<TempLit
                 //群号
                 AtomicInteger i = new AtomicInteger(1);
                 partition.forEach(list -> {
-                    String groupId = imGroupService.createGroup(list, camp.getName() + "-" + i.get() + "群", groupType);
+                    ImGroupDto imGroupDto = new ImGroupDto();
+                    imGroupDto.setGroupType(ImGroup.GroupTypeEnum.TRAINING);
+                    imGroupDto.setType(groupType);
+                    imGroupDto.setGroupName(camp.getName() + "-" + i.get() + "群");
+                    imGroupDto.setUserIdList(list);
+                    String groupId = imGroupService.createGroup(imGroupDto);
                     updateGroup.accept(groupId, list);
                     //修改关系表
                     imGroupIds.add(groupId);

+ 12 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java

@@ -1099,7 +1099,8 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 //		courseScheduleService.checkNewCourseSchedules(courseSchedules, false,false);
 
         try {
-            imGroupService.create(classGroup.getId().toString(), null, classGroup.getName(), classGroup.getName(), vipGroupApplyBaseInfoDto.getName(), null, null, GroupType.VIP.getCode());
+            imGroupService.create(classGroup.getId().toString(), null, classGroup.getName(), classGroup.getName(),
+                    vipGroupApplyBaseInfoDto.getName(), null, null, GroupType.VIP.getCode(), ImGroup.GroupTypeEnum.VIP);
             imGroupMemberService.join(classGroup.getId().toString(), userRoleMap);
             imUserFriendService.refreshGroupImUserFriend(classGroup.getMusicGroupId(), classGroup.getGroupType());
             //发送推送
@@ -1503,7 +1504,8 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         }
 //		courseScheduleService.checkNewCourseSchedules(courseSchedules, false,false);
         try {
-            imGroupService.create(classGroup.getId().toString(), null, classGroup.getName(), classGroup.getName(), applyBaseInfo.getName(), null, null, GroupType.VIP.getCode());
+            imGroupService.create(classGroup.getId().toString(), null, classGroup.getName(), classGroup.getName(),
+                    applyBaseInfo.getName(), null, null, GroupType.VIP.getCode(), ImGroup.GroupTypeEnum.VIP);
             imGroupMemberService.join(classGroup.getId().toString(), userRoleMap);
             imUserFriendService.refreshGroupImUserFriend(classGroup.getMusicGroupId(), classGroup.getGroupType());
 //			SysUser sysUser = teacherDao.getUser(applyBaseInfo.getUserId());
@@ -2549,7 +2551,8 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 //		courseScheduleService.checkNewCourseSchedules(courseSchedules, false,false);
 
         try {
-            imGroupService.create(classGroup.getId().toString(), null, classGroup.getName(), classGroup.getName(), vipGroup.getName(), null, null, GroupType.VIP.getCode());
+            imGroupService.create(classGroup.getId().toString(), null, classGroup.getName(), classGroup.getName(),
+                    vipGroup.getName(), null, null, GroupType.VIP.getCode(), ImGroup.GroupTypeEnum.VIP);
             imGroupMemberService.join(classGroup.getId().toString(), userRoleMap);
             imUserFriendService.refreshGroupImUserFriend(classGroup.getMusicGroupId(), classGroup.getGroupType());
             //发送推送短信
@@ -2855,7 +2858,8 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
                     courseScheduleStudentPaymentDao.batchInsert(courseScheduleStudentPayments);
 
-                    imGroupService.create(classGroup.getId().toString(), null, classGroup.getName(), classGroup.getName(), vipGroup.getName(), null, null, GroupType.VIP.getCode());
+                    imGroupService.create(classGroup.getId().toString(), null, classGroup.getName(), classGroup.getName(),
+                            vipGroup.getName(), null, null, GroupType.VIP.getCode(), ImGroup.GroupTypeEnum.VIP);
                     imGroupMemberService.join(classGroup.getId().toString(), userRoleMap);
                     imUserFriendService.refreshGroupImUserFriend(classGroup.getMusicGroupId(), classGroup.getGroupType());
                 }
@@ -4365,7 +4369,8 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
             classGroupDao.update(classGroup);
 
             try {
-                imGroupService.create(classGroup.getId().toString(), null, classGroup.getName(), classGroup.getName(), vipGroup.getName(), null, null, GroupType.VIP.getCode());
+                imGroupService.create(classGroup.getId().toString(), null, classGroup.getName(),
+                        classGroup.getName(), vipGroup.getName(), null, null, GroupType.VIP.getCode(), ImGroup.GroupTypeEnum.VIP);
                 imGroupMemberService.join(classGroup.getId().toString(), userRoleMap);
                 imUserFriendService.refreshClassImUserFriend(classGroup.getId());
             } catch (Exception e) {
@@ -4493,7 +4498,8 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         studentDao.updateStudentServiceTag(null, studentIds, YesOrNoEnum.YES.getCode());
 
         try {
-            imGroupService.create(classGroup.getId().toString(), null, classGroup.getName(), classGroup.getName(), vipGroup.getName(), null, null, GroupType.VIP.getCode());
+            imGroupService.create(classGroup.getId().toString(), null, classGroup.getName(), classGroup.getName(),
+                    vipGroup.getName(), null, null, GroupType.VIP.getCode(), ImGroup.GroupTypeEnum.VIP);
             imGroupMemberService.join(classGroup.getId().toString(), userRoleMap);
 
             imUserFriendService.refreshGroupImUserFriend(vipGroup.getId().toString(), GroupType.VIP);

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

@@ -496,5 +496,4 @@
     <select id="queryByUserIdAndStatus" resultMap="CloudTeacherOrder">
         select cto.* from cloud_teacher_order cto where cto.student_id_ = #{userId} and cto.status_ = #{status}
     </select>
-
 </mapper>

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

@@ -426,4 +426,31 @@
             #{userId}
         </foreach>
     </select>
+    <select id="countEmployeeBasicInfo" resultType="java.lang.Integer">
+        SELECT COUNT(e.user_id_)
+        FROM employee e
+        LEFT JOIN sys_user su ON su.id_ = e.user_id_
+        <include refid="queryEmployeeBasicInfoSql"/>
+    </select>
+    <select id="queryEmployeeBasicInfo" resultMap="com.ym.mec.biz.dal.dao.StudentDao.SysUserDto">
+        SELECT e.user_id_,su.real_name_ username_,su.phone_
+        FROM employee e
+        LEFT JOIN sys_user su ON su.id_ = e.user_id_
+        <include refid="queryEmployeeBasicInfoSql"/>
+        <include refid="global.limit"/>
+    </select>
+    <sql id="queryEmployeeBasicInfoSql">
+        <where>
+            e.demission_date_ IS NULL AND su.lock_flag_ = 0 AND su.del_flag_ = 0
+            <if test="search != null and search != ''">
+                AND (e.user_id_ = #{search} OR su.real_name_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
+            </if>
+            <if test="organId != null and organId != ''">
+                AND INTE_ARRAY(e.organ_id_list_,#{organId})
+            </if>
+            <if test="imGroupId != null and imGroupId != ''">
+                AND e.user_id_ NOT IN (SELECT user_id_ FROM im_group_member WHERE im_group_id_ = #{imGroupId})
+            </if>
+        </where>
+    </sql>
 </mapper>

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

@@ -15,6 +15,7 @@
 		<result column="tags_" property="tags" />
 		<result column="img_" property="img" />
 		<result column="type_" property="type" />
+		<result column="group_type_" property="groupType" />
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
         <result column="tenant_id_" property="tenantId"/>
@@ -34,6 +35,7 @@
 		<result column="subject_id_" property="subjectId" />
 		<result column="username_" property="user.username" />
 		<result column="avatar_" property="user.avatar" />
+		<result column="phone_" property="user.phone" />
 	</resultMap>
 	
 	<!-- 根据主键查询一条记录 -->
@@ -52,18 +54,18 @@
 	
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.ImGroup" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-		INSERT INTO im_group (id_,name_,introduce_,member_num_,memo_,tags_,img_,type_,create_time_,update_time_,tenant_id_)
-		VALUES(#{id},#{name},#{introduce},#{memberNum},#{memo},#{tags},#{img},#{type},#{createTime},#{updateTime},#{tenantId})
+		INSERT INTO im_group (id_,name_,introduce_,member_num_,memo_,tags_,img_,type_,create_time_,update_time_,tenant_id_,group_type_)
+		VALUES(#{id},#{name},#{introduce},#{memberNum},#{memo},#{tags},#{img},#{type},#{createTime},#{updateTime},#{tenantId},#{groupType})
 	</insert>
 	
 	<!-- 根据主键查询一条记录 -->
 	<update id="update" parameterType="com.ym.mec.biz.dal.entity.ImGroup">
 		UPDATE im_group <set>
-		<if test="memberNum != null">
-		member_num_ = #{memberNum},
+		<if test="groupType != null">
+			group_type_ = #{groupType},
 		</if>
-		<if test="id != null">
-		id_ = #{id},
+		<if test="memberNum != null">
+			member_num_ = member_num_ + #{memberNum},
 		</if>
 		<if test="tags != null">
 		tags_ = #{tags},
@@ -86,9 +88,6 @@
 		<if test="type != null">
 		type_ = #{type},
 		</if>
-		<if test="createTime != null">
-		create_time_ = #{createTime},
-		</if>
 		</set> WHERE id_ = #{id} and tenant_id_ = #{tenantId}
 	</update>
     <update id="updateNickname">
@@ -109,41 +108,55 @@
 		DELETE FROM im_group WHERE id_ = #{id} 
 	</delete>
 	<sql id="queryPageSql">
-		WHERE igm.user_id_ = #{userId}
-		<if test="search != null and search != ''">
-			AND (ig.name_ like concat('%',#{search},'%') or ig.tags_ like concat('%',#{search},'%'))
-		</if>
-		<if test="ignoreIds != null and ignoreIds != ''">
-			AND NOT FIND_IN_SET(ig.id_,#{ignoreIds})
-		</if>
-		<if test="targetIds != null and targetIds != ''">
-			AND FIND_IN_SET(ig.id_,#{targetIds})
-		</if>
+		<where>
+			<if test="userId != null">
+				AND igm.user_id_ = #{userId}
+			</if>
+			<if test="search != null and search != ''">
+				AND (ig.name_ like concat('%',#{search},'%') or ig.memo_ like concat('%',#{search},'%'))
+			</if>
+			<if test="ignoreIds != null and ignoreIds != ''">
+				AND NOT FIND_IN_SET(ig.id_,#{ignoreIds})
+			</if>
+			<if test="targetIds != null and targetIds != ''">
+				AND FIND_IN_SET(ig.id_,#{targetIds})
+			</if>
+			<if test="groupType != null">
+				AND ig.group_type_ = #{groupType}
+			</if>
+		</where>
 	</sql>
 	
 	<!-- 分页查询 -->
 	<select id="queryPage" resultMap="ImGroup" parameterType="map">
-		SELECT ig.* FROM im_group_member igm
-		LEFT JOIN im_group ig ON igm.im_group_id_ = ig.id_
+		SELECT ig.* FROM im_group ig
+		LEFT JOIN im_group_member igm ON igm.im_group_id_ = ig.id_
 		<include refid="queryPageSql" />
+		GROUP BY ig.id_
 		ORDER BY id_
 		<include refid="global.limit"/>
 	</select>
 	
 	<!-- 查询当前表的总记录数 -->
 	<select id="queryCount" resultType="int">
-		SELECT COUNT(ig.id_) FROM im_group_member igm
-		LEFT JOIN im_group ig ON igm.im_group_id_ = ig.id_
+		SELECT COUNT(DISTINCT ig.id_) FROM im_group ig
+		LEFT JOIN im_group_member igm ON igm.im_group_id_ = ig.id_
 		<include refid="queryPageSql" />
 	</select>
 	
 	<select id="queryByUserId" resultMap="ImGroup" parameterType="map">
 		SELECT ig.* FROM im_group_member igm
 		LEFT JOIN im_group ig ON igm.im_group_id_ = ig.id_
-		where igm.user_id_ = #{userId}
+		where 1 =1
+		<if test="userId != null">
+			AND igm.user_id_ = #{userId}
+		</if>
 		<if test="search != null and search != ''">
 			AND (ig.name_ like concat('%',#{search},'%') or ig.tags_ like concat('%',#{search},'%'))
 		</if>
+		<if test="groupType != null and groupType != ''">
+			AND ig.group_type_ = #{groupType}
+		</if>
 	</select>
 	
 	<select id="queryMemberById" resultMap="ImGroupMemberDto">
@@ -157,7 +170,14 @@
 	</select>
 	
 	<select id="queryMember" resultMap="ImGroupMemberDto" parameterType="map">
-		SELECT igm.*,u.avatar_,case when find_in_set('STUDENT',u.user_type_) then u.username_ else u.real_name_ end username_ FROM im_group_member igm left join sys_user u on igm.user_id_ = u.id_
-		where igm.im_group_id_ = #{imGroupId} and igm.user_id_ = #{userId}
+		SELECT igm.*,u.avatar_,CASE WHEN find_in_set('STUDENT',u.user_type_) THEN u.username_ ELSE u.real_name_ END username_
+		FROM im_group_member igm left join sys_user u on igm.user_id_ = u.id_
+		WHERE igm.user_id_ = #{userId}
+		<if test="imGroupId != null and imGroupId != ''">
+			AND igm.im_group_id_ = #{imGroupId}
+		</if>
+		<if test="imGroupId == null or imGroupId == ''">
+			LIMIT 1
+		</if>
 	</select>
 </mapper>

+ 34 - 0
mec-biz/src/main/resources/config/mybatis/ImGroupMemberMapper.xml

@@ -138,4 +138,38 @@
 			#{item}
 		</foreach>
 	</select>
+	<sql id="queryGroupMemberPageSql">
+		<where>
+			<if test="imGroupId != null and imGroupId != ''">
+				AND igm.im_group_id_ = #{imGroupId}
+			</if>
+			<if test="roleType != null and roleType != ''">
+				<if test="roleType == '学员'">
+					AND (igm.role_type_ IS NULL OR igm.role_type_ = '')
+				</if>
+				<if test="roleType != '学员'">
+					AND igm.role_type_ = #{roleType}
+				</if>
+			</if>
+			<if test="search != null and search != ''">
+				AND (igm.nickname_ LIKE CONCAT('%',#{search},'%') OR igm.user_id_ = #{search} OR u.phone_ LIKE CONCAT('%',#{search},'%'))
+			</if>
+		</where>
+	</sql>
+    <select id="queryGroupMemberPage" resultMap="com.ym.mec.biz.dal.dao.ImGroupDao.ImGroupMemberDto">
+		SELECT igm.*,u.avatar_,CASE WHEN find_in_set('STUDENT',u.user_type_) THEN u.username_ ELSE u.real_name_ END username_,
+			   st.member_rank_setting_id_,s.name_ subject_name_,st.subject_id_list_ subject_id_,u.phone_
+		FROM im_group_member igm
+		LEFT JOIN sys_user u ON igm.user_id_ = u.id_
+		LEFT JOIN student st ON st.user_id_ = u.id_
+		LEFT JOIN `subject` s ON s.id_ = st.subject_id_list_
+		<include refid="queryGroupMemberPageSql"/>
+		<include refid="global.limit"/>
+	</select>
+	<select id="countGroupMember" resultType="java.lang.Integer">
+		SELECT COUNT(igm.id_)
+		FROM im_group_member igm
+		LEFT JOIN sys_user u ON igm.user_id_ = u.id_
+		<include refid="queryGroupMemberPageSql"/>
+	</select>
 </mapper>

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

@@ -37,12 +37,8 @@
 	
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.ImGroupNotice" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-		<!--
-		<selectKey resultClass="int" keyProperty="id" > 
-		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
-		</selectKey>
-		-->
-		INSERT INTO im_group_notice (id_,im_group_id_,title_,content_,is_top_,is_sent_to_new_member_,create_time_,update_time_,del_flag_,operator_id_,tenant_id_) VALUES(#{id},#{imGroupId},#{title},#{content},#{isTop},#{isSentToNewMember},#{createTime},#{updateTime},#{delFlag},#{operatorId},#{tenantId})
+		INSERT INTO im_group_notice (im_group_id_,title_,content_,is_top_,is_sent_to_new_member_,create_time_,update_time_,del_flag_,operator_id_,tenant_id_)
+		VALUES(#{imGroupId},#{title},#{content},#{isTop},#{isSentToNewMember},NOW(),NOW(),#{delFlag},#{operatorId},#{tenantId})
 	</insert>
 	
 	<!-- 根据主键查询一条记录 -->
@@ -60,24 +56,16 @@
 		<if test="isSentToNewMember != null">
 		is_sent_to_new_member_ = #{isSentToNewMember},
 		</if>
-		<if test="id != null">
-		id_ = #{id},
-		</if>
 		<if test="imGroupId != null">
 		im_group_id_ = #{imGroupId},
 		</if>
 		<if test="title != null">
 		title_ = #{title},
 		</if>
-		<if test="updateTime != null">
-		update_time_ = #{updateTime},
-		</if>
 		<if test="content != null">
 		content_ = #{content},
 		</if>
-		<if test="createTime != null">
-		create_time_ = #{createTime},
-		</if>
+		update_time_ = NOW()
 		</set> WHERE id_ = #{id} and tenant_id_ = #{tenantId}
 	</update>
 	

+ 137 - 16
mec-biz/src/main/resources/config/mybatis/ImLiveBroadcastRoomMapper.xml

@@ -15,28 +15,29 @@
         <result column="live_state_" jdbcType="INTEGER" property="liveState"/>
         <result column="room_state_" jdbcType="INTEGER" property="roomState"/>
         <result column="popularize_" jdbcType="INTEGER" property="popularize"/>
+        <result column="popularize_type_" jdbcType="VARCHAR" property="popularizeType"/>
+        <result column="popularize_org_ids_" jdbcType="VARCHAR" property="popularizeOrgIds"/>
+        <result column="popularize_school_ids_" jdbcType="VARCHAR" property="popularizeSchoolIds"/>
+        <result column="popularize_team_ids_" jdbcType="VARCHAR" property="popularizeTeamIds"/>
         <result column="created_by_" jdbcType="INTEGER" property="createdBy"/>
         <result column="created_time_" jdbcType="TIMESTAMP" property="createdTime"/>
         <result column="updated_by_" jdbcType="INTEGER" property="updatedBy"/>
         <result column="updated_time_" jdbcType="TIMESTAMP" property="updatedTime"/>
     </resultMap>
 
-    <sql id="Base_Column_List">
-        id_
-        , tenant_id_, speaker_id_, room_uid_, room_title_, live_start_time_, live_end_time_, live_remark_, pre_template_, room_config_, live_state_, room_state_, popularize_, created_by_, created_time_, updated_by_, updated_time_
-    </sql>
-
     <insert id="insertBatch" keyColumn="id_" keyProperty="id" useGeneratedKeys="true"
             parameterType="com.ym.mec.biz.dal.entity.ImLiveBroadcastRoom">
         insert into im_live_broadcast_room(tenant_id_, speaker_id_, room_uid_, room_title_, live_start_time_,
-        live_end_time_, live_remark_, pre_template_, room_config_, live_state_, room_state_, popularize_, created_by_, created_time_,
-        updated_by_, updated_time_)
+        live_end_time_, live_remark_, pre_template_, room_config_, live_state_, room_state_,
+        popularize_, popularize_type_,popularize_org_ids_,popularize_school_ids_,popularize_team_ids_,
+        created_by_, created_time_, updated_by_, updated_time_)
         values
         <foreach collection="entities" item="entity" separator=",">
             (#{entity.tenantId}, #{entity.speakerId}, #{entity.roomUid}, #{entity.roomTitle}, #{entity.liveStartTime},
             #{entity.liveEndTime}, #{entity.liveRemark}, #{entity.preTemplate}, #{entity.roomConfig},
-            #{entity.liveState}, #{entity.roomState}, #{entity.popularize}, #{entity.createdBy}, #{entity.createdTime}, #{entity.updatedBy},
-            #{entity.updatedTime})
+            #{entity.liveState}, #{entity.roomState}, #{entity.popularize},
+            #{entity.popularizeType},#{entity.popularizeOrgIds},#{entity.popularizeSchoolIds},#{entity.popularizeTeamIds},
+            #{entity.createdBy}, #{entity.createdTime}, #{entity.updatedBy},#{entity.updatedTime})
         </foreach>
     </insert>
 
@@ -58,8 +59,32 @@
         c.real_name_ AS createdByName,
         a.pre_template_ AS preTemplate,
         a.room_config_ AS roomConfig,
-        a.popularize_ AS popularize
-        from im_live_broadcast_room as a
+        a.popularize_ AS popularize,
+        a.popularize_type_ AS popularizeType,
+        a.popularize_org_ids_ AS popularizeOrgIds,
+        a.popularize_school_ids_ AS popularizeSchoolIds,
+        a.popularize_team_ids_ AS popularizeTeamIds
+        from (
+        select *
+        from im_live_broadcast_room
+        <if test="param.allRoom == null">
+            where popularize_type_ = 'ALL'
+        </if>
+        <if test="param.organIds != null">
+            union all
+            select *
+            from im_live_broadcast_room as a
+            where popularize_type_ in ( 'ORGAN', 'TEAM')
+            and INTE_ARRAY(a.popularize_org_ids_, #{param.organIds}) = 1
+        </if>
+        <if test="param.schoolIds != null">
+            union all
+            select *
+            from im_live_broadcast_room as a
+            where popularize_type_ = 'SCHOOL'
+            and INTE_ARRAY(a.popularize_school_ids_, #{param.schoolIds}) = 1
+        </if>
+        ) as a
         left join tenant_info AS t on a.tenant_id_ = t.id_
         left join sys_user AS b on a.speaker_id_ = b.id_
         left join sys_user AS c on a.created_by_ = c.id_
@@ -94,17 +119,22 @@
     </select>
 
     <select id="queryUserPageByTenantId" resultType="map">
-        SELECT id_,username_
+        SELECT id_, username_
         FROM sys_user
-        WHERE tenant_id_ = 1 and user_type_ = 'STUDENT' and lock_flag_=0 and del_flag_= 0 and is_super_admin_=0
-        and username_ is not null and username_ != ''
+        WHERE tenant_id_ = 1
+          and user_type_ = 'STUDENT'
+          and lock_flag_ = 0
+          and del_flag_ = 0
+          and is_super_admin_ = 0
+          and username_ is not null
+          and username_ != ''
     </select>
 
     <select id="queryBaseUserInfo" resultType="com.ym.mec.biz.dal.vo.BaseRoomUserVo">
-    select
+        select
         id_ AS userId,
         username_ AS userName
-    from sys_user
+        from sys_user
         <where>
             id_ IN
             <foreach collection="list" item="id" open="(" separator="," close=")">
@@ -112,5 +142,96 @@
             </foreach>
         </where>
     </select>
+    <resultMap id="LiveRoomGoodsOrderVo" type="com.ym.mec.biz.dal.vo.LiveRoomGoodsOrderVo">
+        <result property="userId" column="user_id_"/>
+        <result property="userName" column="username_"/>
+        <result property="phone" column="phone_"/>
+        <result property="goodsName" column="goods_name_"/>
+        <result property="actualPrice" column="actual_amount_"/>
+        <result property="expectPrice" column="expect_amount_"/>
+        <result property="balance" column="balance_payment_amount_"/>
+        <result property="couponRemitFee" column="coupon_remit_fee_"/>
+        <result property="payTime" column="pay_time_"/>
+        <result property="goodsName" column="goods_name_"/>
+    </resultMap>
+    <sql id="queryLiveRoomGoodsOrderSql">
+        <where>
+            spo.group_type_ = 'LIVE_BUY' AND spo.type_ = 'LIVE_BUY'
+            AND spo.status_ = 'SUCCESS'
+            <if test="search != null and search != ''">
+                AND (su.id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
+            </if>
+            <if test="roomUid != null and roomUid != ''">
+                AND spo.music_group_id_ = #{roomUid}
+            </if>
+            <if test="startTime != null">
+                AND DATE_FORMAT(spo.pay_time_, '%Y-%m-%d') >= #{startTime}
+            </if>
+            <if test="endTime != null">
+                AND DATE_FORMAT(spo.pay_time_, '%Y-%m-%d') &lt;= #{endTime}
+            </if>
+        </where>
+    </sql>
+    <select id="queryLiveRoomGoodsOrderList" resultMap="LiveRoomGoodsOrderVo">
+        SELECT su.id_ user_id_,su.username_,su.phone_,spo.actual_amount_,spo.expect_amount_,
+        spo.balance_payment_amount_,spo.coupon_remit_fee_,spo.pay_time_,GROUP_CONCAT(lg.name_) goods_name_ FROM student_payment_order spo
+        LEFT JOIN student_payment_order_detail spod ON spo.id_ = spod.payment_order_id_
+        LEFT JOIN live_goods lg ON FIND_IN_SET(lg.id_,spod.goods_id_list_)
+        LEFT JOIN sys_user su ON su.id_ = spo.user_id_
+        <include refid="queryLiveRoomGoodsOrderSql"/>
+        GROUP BY spo.id_
+        ORDER BY spo.pay_time_ DESC
+        <include refid="global.limit"/>
+    </select>
+    <select id="countLiveRoomGoodsOrderList" resultType="java.lang.Integer">
+        SELECT COUNT(DISTINCT spo.id_) FROM student_payment_order spo
+        LEFT JOIN sys_user su ON su.id_ = spo.user_id_
+        <include refid="queryLiveRoomGoodsOrderSql"/>
+    </select>
+    <select id="sumLiveRoomGoodsOrderList" resultType="java.util.Map">
+        SELECT COUNT(DISTINCT spo.user_id_) buyNum,SUM(spo.expect_amount_) totalAmount,
+        SUM(spo.balance_payment_amount_) balance,SUM(spo.actual_amount_) actualAmount
+        FROM student_payment_order spo
+        LEFT JOIN sys_user su ON su.id_ = spo.user_id_
+        <include refid="queryLiveRoomGoodsOrderSql"/>
+    </select>
+
+    <select id="queryRoomUser" resultType="com.ym.mec.biz.dal.vo.RoomReservationUserVo">
+        select
+        su.id_ as userId
+        ,su.username_ as username
+        ,su.phone_ as phone
+        ,su.organ_id_ as organId
+        ,o.name_ as organName
+        ,(select group_concat(sub.name_) from subject sub
+        where find_in_set(sub.id_,s.subject_id_list_) and sub.del_flag_ = 0 ) as subjectName
+        from im_live_room_reservation ilrr
+        left join sys_user su on su.id_ = ilrr.user_id_
+        left join organization o on o.id_ = su.organ_id_
+        left join student s on s.user_id_ = su.id_
+        <where>
+            ilrr.room_uid_ = #{query.roomUid}
+            <if test="query.search != null and query.search != ''">
+                and (su.id_ like concat('%',#{query.search},'%')
+                or su.phone_ like concat('%',#{query.search},'%')
+                or su.username_ like concat('%',#{query.search},'%'))
+            </if>
+            <if test="query.subjectId != null">
+                and find_in_set(#{query.subjectId},s.subject_id_list_)
+            </if>
+            <if test="query.organId != null">
+                and su.organ_id_ = #{query.organId}
+            </if>
+        </where>
+    </select>
+
+    <select id="querySchoolIds" resultType="string">
+        select GROUP_CONCAT(id_)  from cooperation_organ where  find_in_set(organ_id_,#{organIds})
+    </select>
+
+    <select id="queryTeamIds" resultType="string">
+    select group_concat(id_)
+    from music_group where organ_id_ in (#{organIds}) group by organ_id_
+    </select>
 
 </mapper>

+ 17 - 15
mec-biz/src/main/resources/config/mybatis/ImLiveRoomBlackMapper.xml

@@ -25,24 +25,26 @@
     </insert>
 
     <select id="queryStudent" parameterType="object" resultType="com.ym.mec.auth.api.entity.SysUser">
-        select a.id_        as id,
-             a.username_  as username,
-             a.real_name_ as realName,
-             a.phone_     as phone
-        from sys_user as a
-        left join im_live_room_black as b on a.id_ != b.user_id_
-        where a.user_type_ like '%STUDENT%'
-        and a.lock_flag_ = 0
-        and a.del_flag_ = 0
-        and b.room_uid_ = #{roomUid}
-        <if test="tenantId != null ">
-            and tenant_id_ = #{tenantId}
+        select id_        as id,
+        username_  as username,
+        real_name_ as realName,
+        phone_     as phone
+        from sys_user
+        where find_in_set('STUDENT', user_type_)
+        and lock_flag_ = 0
+        and del_flag_ = 0
+        and tenant_id_ = 1
+        and id_ not in (select user_id_  from im_live_room_black where room_uid_ = #{param.roomUid})
+        <if test="param.tenantId != null ">
+            and tenant_id_ = #{param.tenantId}
         </if>
+        <if test="param.search != null ">
             and (
-                 `id_` LIKE CONCAT('%', #{search},'%')
-                  OR `username_` LIKE CONCAT('%', #{search},'%')
-                 OR `phone_` LIKE CONCAT('%', #{search},'%')
+                 `id_` LIKE CONCAT('%', #{param.search},'%')
+                  OR `username_` LIKE CONCAT('%', #{param.search},'%')
+                 OR `phone_` LIKE CONCAT('%', #{param.search},'%')
                )
+        </if>
     </select>
 
     <select id="queryBlackList"  parameterType="map" resultType="com.ym.mec.biz.dal.vo.ImLiveRoomBlackVo">

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

@@ -42,8 +42,32 @@
         a.pre_template_ AS preTemplate,
         a.room_config_ AS roomConfig,
         a.popularize_ AS popularize,
-        case when  d.user_id_ is null then 0 else 1 end as reserve
-        from im_live_broadcast_room as a
+        a.popularize_type_ AS popularizeType,
+        IF(d.user_id_ is null, 0, 1) as reserve
+        from (
+        select *
+        from im_live_broadcast_room
+        where popularize_type_ = 'ALL'
+        union all
+        select *
+        from im_live_broadcast_room
+        where popularize_type_ = 'ORGAN'
+        AND FIND_IN_SET(#{param.organId}, popularize_org_ids_)
+        <if test="param.schoolId != null">
+            union all
+            select *
+            from im_live_broadcast_room
+            where popularize_type_ = 'SCHOOL'
+            AND FIND_IN_SET(#{param.schoolId}, popularize_school_ids_)
+        </if>
+        <if test="param.teamIds != null">
+            union all
+            select *
+            from im_live_broadcast_room as a
+            where popularize_type_ = 'TEAM'
+            and INTE_ARRAY(a.popularize_team_ids_, #{param.teamIds}) = 1
+        </if>
+        ) as a
         left join tenant_info AS t on a.tenant_id_ = t.id_
         left join sys_user AS b on a.speaker_id_ = b.id_
         left join sys_user AS c on a.created_by_ = c.id_
@@ -62,6 +86,38 @@
             <if test="param.endTime != null">
                 <![CDATA[ AND a.live_start_time_  <= #{param.endTime} ]]>
             </if>
+            <if test="param.popularize != null">
+                and a.popularize_ = #{param.popularize}
+            </if>
+            <if test="param.roomUid != null">
+                and a.room_uid_ = #{param.roomUid}
+            </if>
         </where>
     </select>
+
+    <select id="selectCountRoomReservation" resultType="com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomVo">
+        select
+        lbr.room_uid_ as roomUid,
+        count(1) as roomReservationNum
+        from im_live_room_reservation lbr
+
+        <where>
+            <if test="roomIdList != null and roomIdList.size() != 0">
+                and lbr.room_uid_ in
+                <foreach collection="roomIdList" separator="," close=")" open="(" item="item" >
+                    #{item}
+                </foreach>
+            </if>
+        </where>
+        group by lbr.room_uid_
+    </select>
+
+    <select id="queryMusicGroupIds" resultType="string">
+        select group_concat(music_group_id_)
+        from student_registration
+        where user_id_ = #{userId}
+          and music_group_status_ != 'QUIT'
+        group by user_id_
+    </select>
+
 </mapper>

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

@@ -27,5 +27,8 @@
             #{entity.endTime}, #{entity.type}, #{entity.createdTime})
         </foreach>
     </insert>
+    <select id="getLastRecord" resultMap="BaseResultMap">
+        SELECT * FROM im_live_room_video WHERE room_uid_ = #{roomId} AND record_id_ = #{recordId} ORDER BY id_ DESC LIMIT 1
+    </select>
 
 </mapper>

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

@@ -20,6 +20,7 @@
 		<result column="send_flag_" property="sendFlag" />
 		<result column="send_time_" property="sendTime" />
 		<result column="operator_" property="operator" />
+		<result column="is_include_sender_" property="isIncludeSender" />
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
 	</resultMap>
@@ -37,14 +38,18 @@
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.ImSendGroupMessage" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
 		INSERT INTO im_send_group_message (message_content_,sender_id_,extra,target_ids_,file_url_,file_name_,
-		                                   file_size_,message_type_,send_flag_,send_time_,create_time_,update_time_,operator_,send_type_)
+		                                   file_size_,message_type_,send_flag_,send_time_,
+		                                   create_time_,update_time_,operator_,send_type_,is_include_sender_)
 		VALUES(#{messageContent},#{senderId},#{extra},#{targetIds},#{fileUrl},#{fileName},#{fileSize},
-		       #{messageType},#{sendFlag},#{sendTime},NOW(),NOW(),#{operator},#{sendType})
+		       #{messageType},#{sendFlag},#{sendTime},NOW(),NOW(),#{operator},#{sendType},#{isIncludeSender})
 	</insert>
 	
 	<!-- 根据主键查询一条记录 -->
 	<update id="update" parameterType="com.ym.mec.biz.dal.entity.ImSendGroupMessage">
 		UPDATE im_send_group_message <set>
+			<if test="isIncludeSender != null">
+				is_include_sender_ = #{isIncludeSender},
+			</if>
 			<if test="sendType != null">
 				send_type_ = #{sendType},
 			</if>
@@ -78,12 +83,10 @@
 			<if test="extra != null">
 			extra = #{extra},
 			</if>
-			<if test="updateTime != null">
-			update_time_ = #{updateTime},
-			</if>
-			<if test="fileUrl != null">
-			file_url_ = #{fileUrl},
+			<if test="fileUrl != null and fileUrl != ''">
+				file_url_ = #{fileUrl},
 			</if>
+			update_time_ = NOW()
 			</set> WHERE id_ = #{id}
 	</update>
 	<update id="batchUpdateSendFlag">
@@ -108,6 +111,9 @@
 			<if test="sendType != null">
 				AND send_type_ = #{sendType}
 			</if>
+			<if test="isIncludeSender != null">
+				AND is_include_sender_ = #{isIncludeSender}
+			</if>
 		</where>
 	</sql>
 	

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

@@ -146,6 +146,7 @@
 		FROM live_goods_mapper lgm
 		LEFT JOIN live_goods lg ON lgm.goods_id_ = lg.id_
 		<include refid="queryGoodsPageSql"/>
+		ORDER BY lgm.update_time_ DESC
 	</select>
 	<select id="countLiveGoods" resultType="java.lang.Integer">
 		SELECT COUNT(lgm.id_) FROM live_goods_mapper lgm
@@ -157,7 +158,7 @@
 		FROM live_goods_mapper lgm
 		LEFT JOIN live_goods lg ON lgm.goods_id_ = lg.id_
 		<include refid="queryPageSql" />
-		ORDER BY lgm.id_
+		ORDER BY lgm.update_time_ DESC
 		<include refid="global.limit"/>
 	</select>
 	<select id="queryGoodsIdsByLiveId" resultType="java.lang.Integer">

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

@@ -50,7 +50,7 @@
         <result column="tenant_id_" property="tenantId"/>
         <result column="is_give_accessories_" property="isGiveAccessories"/>
     </resultMap>
-    
+
     <resultMap type="com.ym.mec.biz.dal.dto.MusicGroupBasicDto" id="MusicGroupBasicDto" extends="MusicGroup">
     	<result column="organ_name_" property="organName"/>
         <result column="school_name_" property="schoolName"/>
@@ -77,7 +77,7 @@
         WHERE id_ = #{id} for
         update
     </select>
-    
+
     <select id="queryBasicInfo" resultMap="MusicGroupBasicDto">
         SELECT mg.*,o.name_ organ_name_,s.name_ school_name_ ,co.name_ cooperation_organ_name_,ct.name_ charge_type_name_,
         u1.real_name_ edu_teacher_name_,u2.real_name_ teans_teacher_name_,u2.phone_ teans_teacher_phone_,
@@ -241,7 +241,7 @@
         </set>
         WHERE id_ = #{id}
     </update>
-    
+
     <update id="batchUpdateEdu">
         UPDATE music_group
         SET educational_teacher_id_ = #{educationUserId}
@@ -968,7 +968,7 @@
             </if>
         </where>
     </sql>
-    
+
     <update id="updateIsShowRecordOfStudent" parameterType="map">
     	update music_group set is_show_record_of_student_ = #{isShowRecordOfStudent},update_time_ = now() where id_ = #{musicGroupId}
     </update>
@@ -1153,4 +1153,17 @@
             </if>
         </where>
     </select>
+
+    <select id="findMusicByCourseIds" resultMap="MusicGroupBasicDto">
+        select
+        t.id_,b.organ_id_ as cooperation_organ_id_,b.name_ as cooperation_organ_name_
+        from course_schedule t
+        left join music_group a on t.music_group_id_ = a.id_
+        left join cooperation_organ b on a.cooperation_organ_id_ = b.id_
+        where t.group_type_ = 'MUSIC'
+        and t.id_ IN
+        <foreach collection="courseIds" item="item" open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+    </select>
 </mapper>

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

@@ -1420,4 +1420,51 @@
         SELECT su.id_,su.phone_,su.username_,su.birthdate_,su.gender_,su.user_type_,su.tenant_id_
         FROM sys_user su WHERE su.phone_ = #{mobile} LIMIT 1
     </select>
+
+    <resultMap id="SysUserDto" type="com.ym.mec.biz.dal.dto.SysUserDto">
+        <result property="userId" column="user_id_"/>
+        <result property="username" column="username_"/>
+        <result property="phone" column="phone_"/>
+        <result property="organName" column="organ_name_"/>
+        <result property="subjectName" column="subject_name_"/>
+    </resultMap>
+    <select id="countStudentBasicInfo" resultType="java.lang.Integer">
+        SELECT COUNT(s.user_id_) FROM student s
+        LEFT JOIN sys_user su ON su.id_ = s.user_id_
+        <if test="musicGroupId != null and musicGroupId != ''">
+            LEFT JOIN student_registration sr ON sr.user_id_ = s.user_id_
+        </if>
+        <include refid="queryStudentBasicInfoSql"/>
+    </select>
+    <select id="queryStudentBasicInfo" resultMap="SysUserDto">
+        SELECT s.user_id_,su.username_,su.phone_,o.name_ organ_name_,sb.name_ subject_name_ FROM student s
+        LEFT JOIN sys_user su ON su.id_ = s.user_id_
+        LEFT JOIN organization o ON o.id_ = su.organ_id_
+        LEFT JOIN `subject` sb ON sb.id_ = s.subject_id_list_
+        <if test="musicGroupId != null and musicGroupId != ''">
+            LEFT JOIN student_registration sr ON sr.user_id_ = s.user_id_
+        </if>
+        <include refid="queryStudentBasicInfoSql"/>
+        <include refid="global.limit"/>
+    </select>
+    <sql id="queryStudentBasicInfoSql">
+        <where>
+            AND su.lock_flag_ = 0 AND su.del_flag_ = 0
+            <if test="search != null and search != ''">
+                AND (s.user_id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
+            </if>
+            <if test="organId != null and organId != ''">
+                AND FIND_IN_SET(su.organ_id_,#{organId})
+            </if>
+            <if test="subjectId != null">
+                AND s.subject_id_list_ = #{subjectId}
+            </if>
+            <if test="musicGroupId != null and musicGroupId != ''">
+                AND sr.music_group_id_ = #{musicGroupId}
+            </if>
+            <if test="imGroupId != null and imGroupId != ''">
+                AND s.user_id_ NOT IN (SELECT user_id_ FROM im_group_member WHERE im_group_id_ = #{imGroupId})
+            </if>
+        </where>
+    </sql>
 </mapper>

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

@@ -164,8 +164,8 @@
              WHERE usage_status_  <![CDATA[ <> ]]> 2 AND user_id_ = #{userId}
              GROUP BY coupon_id_) AS b
             ON a.id_ = b.coupon_id_
-        join
-        (select organ_id_ from sys_user where id_ = #{userId}) c
+            join
+                (select organ_id_ from sys_user where id_ = #{userId}) c
         WHERE issuance_type_ = 0
           AND status_ = 1
           AND tenant_id_ = #{tenantId}
@@ -178,6 +178,7 @@
         and (find_in_set(c.organ_id_,JSON_UNQUOTE(json_extract(a.use_condition_,'$.organId')))
         or JSON_UNQUOTE(json_extract(a.use_condition_,'$.organId')) is null
         or JSON_UNQUOTE(json_extract(a.use_condition_,'$.organId')) = "")
+
     </select>
 
 </mapper>

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

@@ -30,7 +30,7 @@
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
         <result column="tenant_id_" property="tenantId"/>
-		<result column="use_condition_" property="useCondition"/>
+        <result column="use_condition_" property="useCondition"/>
 	</resultMap>
 
 	<!-- 根据主键查询一条记录 -->

+ 28 - 17
mec-biz/src/main/resources/config/mybatis/SysUserCashAccountMapper.xml

@@ -21,24 +21,31 @@
 
     <!-- 根据主键查询一条记录 -->
     <select id="get" resultMap="SysUserCashAccount">
-		SELECT * FROM sys_user_cash_account WHERE user_id_ = #{userId} 
-	</select>
-	
+        SELECT *
+        FROM sys_user_cash_account
+        WHERE user_id_ = #{userId}
+    </select>
+
     <select id="getLocked" resultMap="SysUserCashAccount" useCache="false" flushCache="true">
-		SELECT * FROM sys_user_cash_account WHERE user_id_ = #{userId} for update
-	</select>
+        SELECT *
+        FROM sys_user_cash_account
+        WHERE user_id_ = #{userId} for update
+    </select>
 
     <!-- 全查询 -->
     <select id="findAll" resultMap="SysUserCashAccount">
-		SELECT * FROM sys_user_cash_account where tenant_id_ = #{tenantId} ORDER BY user_id_
-	</select>
+        SELECT *
+        FROM sys_user_cash_account
+        where tenant_id_ = #{tenantId}
+        ORDER BY user_id_
+    </select>
 
     <!-- 向数据库增加一条记录 -->
     <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.SysUserCashAccount" useGeneratedKeys="true"
             keyColumn="id" keyProperty="id">
         INSERT INTO sys_user_cash_account
-        (user_id_,currency_,create_time_,update_time,tenant_id_)
-        VALUES(#{userId},#{currency},now(),now(),#{tenantId})
+            (user_id_, currency_, create_time_, update_time, tenant_id_)
+        VALUES (#{userId}, #{currency}, now(), now(), #{tenantId})
     </insert>
 
     <!-- 根据主键查询一条记录 -->
@@ -75,8 +82,10 @@
 
     <!-- 根据主键删除一条记录 -->
     <delete id="delete">
-		DELETE FROM sys_user_cash_account WHERE user_id_ = #{userId} 
-	</delete>
+        DELETE
+        FROM sys_user_cash_account
+        WHERE user_id_ = #{userId}
+    </delete>
 
     <!-- 分页查询 -->
     <select id="queryPage" resultMap="SysUserCashAccount" parameterType="map">
@@ -86,8 +95,10 @@
 
     <!-- 查询当前表的总记录数 -->
     <select id="queryCount" resultType="int">
-		SELECT COUNT(*) FROM sys_user_cash_account where tenant_id_ = #{tenantId}
-	</select>
+        SELECT COUNT(*)
+        FROM sys_user_cash_account
+        where tenant_id_ = #{tenantId}
+    </select>
     <select id="findByUserIds" resultMap="SysUserCashAccount">
         SELECT * FROM sys_user_cash_account WHERE user_id_ IN
         <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
@@ -100,10 +111,10 @@
         SELECT SUM(suca.balance_) FROM sys_user_cash_account suca
         LEFT JOIN sys_user su ON su.id_ = suca.user_id_
         <where>
-        suca.tenant_id_ = #{tenantId}
-        <if test="organId != null">
-            and FIND_IN_SET(su.organ_id_,#{organId})
-        </if>
+            suca.tenant_id_ = #{tenantId}
+            <if test="organId != null">
+                and FIND_IN_SET(su.organ_id_,#{organId})
+            </if>
         </where>
     </select>
 

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

@@ -1428,7 +1428,7 @@
         from teacher tea
         LEFT JOIN sys_user su ON su.id_=tea.id_
         <include refid="queryMemberStudentDataCondition"></include>
-        <include refid="global.limit"></include>
+        <include refid="global.limit"/>
     </select>
     <select id="getSimpleUser" resultType="com.ym.mec.biz.dal.dto.SimpleUserDto">
         SELECT
@@ -1437,7 +1437,40 @@
             su.real_name_ userName,
             su.gender_ gender,
             su.phone_ phone,
-            su.tenant_id_ tenantId
+            su.tenant_id_ tenantId,
+            su.avatar_ avatar
         FROM sys_user su WHERE su.id_ = #{userId}
     </select>
+    <select id="countTeacherBasicInfo" resultType="java.lang.Integer">
+        SELECT COUNT(t.id_)
+        FROM teacher t
+        LEFT JOIN sys_user su ON su.id_ = t.id_
+        <include refid="queryTeacherBasicInfoSql"/>
+    </select>
+    <select id="queryTeacherBasicInfo" resultMap="com.ym.mec.biz.dal.dao.StudentDao.SysUserDto">
+        SELECT t.id_ user_id_,su.real_name_ username_,su.phone_,o.name_ organ_name_,sb.name_ subject_name_
+        FROM teacher t
+        LEFT JOIN sys_user su ON su.id_ = t.id_
+        LEFT JOIN organization o ON o.id_ = t.organ_id_
+        LEFT JOIN `subject` sb ON sb.id_ = t.subject_id_
+        <include refid="queryTeacherBasicInfoSql"/>
+        <include refid="global.limit"/>
+    </select>
+    <sql id="queryTeacherBasicInfoSql">
+        <where>
+            AND t.demission_date_ IS NULL AND su.lock_flag_ = 0 AND su.del_flag_ = 0
+            <if test="search != null and search != ''">
+                AND (t.id_ = #{search} OR su.real_name_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
+            </if>
+            <if test="organId != null">
+                AND FIND_IN_SET(t.organ_id_,#{organId})
+            </if>
+            <if test="subjectId != null">
+                AND FIND_IN_SET(#{subjectId},t.subject_id_)
+            </if>
+            <if test="imGroupId != null and imGroupId != ''">
+                AND t.id_ NOT IN (SELECT user_id_ FROM im_group_member WHERE im_group_id_ = #{imGroupId})
+            </if>
+        </where>
+    </sql>
 </mapper>

+ 99 - 52
mec-biz/src/main/resources/config/mybatis/TempBuyFreeLiveTheoryCourseMapper.xml

@@ -5,56 +5,103 @@
 不要修改此文件。所有改动将在下次重新自动生成时丢失。
 -->
 <mapper namespace="com.ym.mec.biz.dal.dao.TempBuyFreeLiveTheoryCourseDao">
-	
-	<resultMap type="com.ym.mec.biz.dal.entity.TempBuyFreeLiveTheoryCourse" id="TempBuyFreeLiveTheoryCourse">
-		<result column="id_" property="id" />
-		<result column="user_id_" property="userId" />
-		<result column="create_time_" property="createTime" />
-		<result column="update_time_" property="updateTime" />
-	</resultMap>
-	
-	<!-- 根据主键查询一条记录 -->
-	<select id="get" resultMap="TempBuyFreeLiveTheoryCourse" >
-		SELECT * FROM temp_buy_free_live_theory_course WHERE id_ = #{id} 
-	</select>
-	
-	<!-- 全查询 -->
-	<select id="findAll" resultMap="TempBuyFreeLiveTheoryCourse">
-		SELECT * FROM temp_buy_free_live_theory_course ORDER BY id_
-	</select>
-	
-	<!-- 向数据库增加一条记录 -->
-	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.TempBuyFreeLiveTheoryCourse" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-		INSERT INTO temp_buy_free_live_theory_course (user_id_,create_time_,update_time_) VALUES(#{userId},NOW(),NOW())
-	</insert>
-	
-	<!-- 根据主键查询一条记录 -->
-	<update id="update" parameterType="com.ym.mec.biz.dal.entity.TempBuyFreeLiveTheoryCourse">
-		UPDATE temp_buy_free_live_theory_course <set>
-		<if test="userId != null">
-		user_id_ = #{userId},
-		</if>
-		<if test="updateTime != null">
-		update_time_ = #{updateTime},
-		</if>
-		</set> WHERE id_ = #{id}
-	</update>
-	
-	<!-- 根据主键删除一条记录 -->
-	<delete id="delete" >
-		DELETE FROM temp_buy_free_live_theory_course WHERE id_ = #{id} 
-	</delete>
-	
-	<!-- 分页查询 -->
-	<select id="queryPage" resultMap="TempBuyFreeLiveTheoryCourse" parameterType="map">
-		SELECT * FROM temp_buy_free_live_theory_course ORDER BY id_ <include refid="global.limit"/>
-	</select>
-	
-	<!-- 查询当前表的总记录数 -->
-	<select id="queryCount" resultType="int">
-		SELECT COUNT(*) FROM temp_buy_free_live_theory_course
-	</select>
-	<select id="countByUserId" resultType="java.lang.Integer">
-		SELECT COUNT(user_id_) FROM temp_buy_free_live_theory_course WHERE user_id_ = #{userId}
-	</select>
+
+    <resultMap type="com.ym.mec.biz.dal.entity.TempBuyFreeLiveTheoryCourse" id="TempBuyFreeLiveTheoryCourse">
+        <result column="id_" property="id"/>
+        <result column="user_id_" property="userId"/>
+        <result column="live_id_" property="liveId"/>
+        <result column="live_goods_id_" property="liveGoodsId"/>
+        <result column="recommend_level_" property="recommendLevel"/>
+        <result column="create_time_" property="createTime"/>
+        <result column="update_time_" property="updateTime"/>
+
+        <result column="student_name_" property="studentName"/>
+    </resultMap>
+
+    <!-- 根据主键查询一条记录 -->
+    <select id="get" resultMap="TempBuyFreeLiveTheoryCourse">
+        SELECT *
+        FROM temp_buy_free_live_theory_course
+        WHERE id_ = #{id}
+    </select>
+
+    <!-- 全查询 -->
+    <select id="findAll" resultMap="TempBuyFreeLiveTheoryCourse">
+        SELECT *
+        FROM temp_buy_free_live_theory_course
+        ORDER BY id_
+    </select>
+
+    <!-- 向数据库增加一条记录 -->
+    <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.TempBuyFreeLiveTheoryCourse" useGeneratedKeys="true"
+            keyColumn="id" keyProperty="id">
+        INSERT INTO temp_buy_free_live_theory_course (user_id_, live_id_, live_goods_id_,recommend_level_, create_time_, update_time_)
+        VALUES (#{userId}, #{liveId}, #{liveGoodsId}, #{recommendLevel}, NOW(), NOW())
+    </insert>
+
+    <!-- 根据主键查询一条记录 -->
+    <update id="update" parameterType="com.ym.mec.biz.dal.entity.TempBuyFreeLiveTheoryCourse">
+        UPDATE temp_buy_free_live_theory_course
+        <set>
+            <if test="userId != null">
+                user_id_ = #{userId},
+            </if>
+            <if test="liveGoodsId != null">
+                live_goods_id_ = #{liveGoodsId},
+            </if>
+            <if test="liveId != null">
+                live_id_ = #{liveId},
+            </if>
+            <if test="recommendLevel != null and recommendLevel != ''">
+                recommend_level_ = #{recommendLevel},
+            </if>
+            <if test="updateTime != null">
+                update_time_ = #{updateTime},
+            </if>
+        </set>
+        WHERE id_ = #{id}
+    </update>
+
+    <!-- 根据主键删除一条记录 -->
+    <delete id="delete">
+        DELETE
+        FROM temp_buy_free_live_theory_course
+        WHERE id_ = #{id}
+    </delete>
+
+    <!-- 分页查询 -->
+    <select id="queryPage" resultMap="TempBuyFreeLiveTheoryCourse" parameterType="map">
+        SELECT * FROM temp_buy_free_live_theory_course ORDER BY id_
+        <include refid="global.limit"/>
+    </select>
+
+    <!-- 查询当前表的总记录数 -->
+    <select id="queryCount" resultType="int">
+        SELECT COUNT(*)
+        FROM temp_buy_free_live_theory_course
+    </select>
+    <select id="countByUserId" resultType="java.lang.Integer">
+        SELECT COUNT(user_id_)
+        FROM temp_buy_free_live_theory_course
+        WHERE user_id_ = #{userId}
+    </select>
+
+    <select id="list" resultMap="TempBuyFreeLiveTheoryCourse">
+        select
+               t.*,IFNULL(real_name_,username_) as student_name_
+        from temp_buy_free_live_theory_course t
+        left join sys_user u on t.user_id_ = u.id_
+        <where>
+            <if test="param.liveId != null and param.liveId != ''">
+                and t.live_id_ = #{param.liveId}
+            </if>
+            <if test="param.liveGoodsId != null">
+                and t.live_goods_id_ = #{param.liveGoodsId}
+            </if>
+        </where>
+    </select>
+    <select id="findByGoodsIdAndUserId" resultMap="TempBuyFreeLiveTheoryCourse">
+        SELECT * FROM temp_buy_free_live_theory_course
+        WHERE user_id_ = #{userId} AND live_goods_id_ = #{liveGoodsId} LIMIT 1
+    </select>
 </mapper>

+ 172 - 0
mec-biz/src/main/resources/config/mybatis/TempLiveTeacherCardMapper.xml

@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="com.ym.mec.biz.dal.dao.TempLiveTeacherCardDao">
+
+    <resultMap type="com.ym.mec.biz.dal.entity.TempLiveTeacherCard" id="TempLiveTeacherCard">
+        <result column="id_" property="id"/>
+        <result column="user_id_" property="userId"/>
+        <result column="username_" property="username"/>
+        <result column="avatar_" property="avatar"/>
+        <result column="introduction_" property="introduction"/>
+        <result column="music_content_" property="musicContent"/>
+        <result column="subject_id_" property="subjectId"/>
+        <result column="level_" property="level"/>
+        <result column="im_group_id_" property="imGroupId"/>
+        <result column="live_goods_id_" property="liveGoodsId"/>
+        <result column="create_time_" property="createTime"/>
+        <result column="update_time_" property="updateTime"/>
+
+        <result column="recommend_level_flag_" property="recommendLevelFlag"/>
+        <result column="join_flag_" property="joinFlag"/>
+        <result column="subject_name_" property="subjectName"/>
+        <result column="student_id_" property="studentId"/>
+    </resultMap>
+
+    <!-- 根据主键查询一条记录 -->
+    <select id="get" resultMap="TempLiveTeacherCard">
+        SELECT *
+        FROM temp_live_teacher_card
+        WHERE id_ = #{id}
+    </select>
+
+    <!-- 全查询 -->
+    <select id="findAll" resultMap="TempLiveTeacherCard">
+        SELECT *
+        FROM temp_live_teacher_card
+        ORDER BY id_
+    </select>
+
+    <!-- 向数据库增加一条记录 -->
+    <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.TempLiveTeacherCard" useGeneratedKeys="true"
+            keyColumn="id" keyProperty="id">
+        INSERT INTO temp_live_teacher_card
+        (id_,user_id_,username_,avatar_,introduction_,music_content_,subject_id_,level_,im_group_id_,live_goods_id_,create_time_,update_time_)
+        VALUES(#{id},#{username},#{userId},#{avatar},#{introduction},#{musicContent},#{subjectId},#{level},#{imGroupId},#{liveGoodsId},#{createTime},#{updateTime})
+    </insert>
+
+    <!-- 根据主键查询一条记录 -->
+    <update id="update" parameterType="com.ym.mec.biz.dal.entity.TempLiveTeacherCard">
+        UPDATE temp_live_teacher_card
+        <set>
+            <if test="subjectId != null">
+                subject_id_ = #{subjectId},
+            </if>
+            <if test="userId != null">
+                user_id_ = #{userId},
+            </if>
+            <if test="username != null">
+                username_ = #{username},
+            </if>
+            <if test="avatar != null">
+                avatar_ = #{avatar},
+            </if>
+            <if test="introduction != null">
+                introduction_ = #{introduction},
+            </if>
+            <if test="id != null">
+                id_ = #{id},
+            </if>
+            <if test="musicContent != null">
+                music_content_ = #{musicContent},
+            </if>
+            <if test="imGroupId != null">
+                im_group_id_ = #{imGroupId},
+            </if>
+            <if test="liveGoodsId != null">
+                live_goods_id_ = #{liveGoodsId},
+            </if>
+            <if test="updateTime != null">
+                update_time_ = #{updateTime},
+            </if>
+            <if test="level != null">
+                level_ = #{level},
+            </if>
+            <if test="createTime != null">
+                create_time_ = #{createTime},
+            </if>
+        </set>
+        WHERE id_ = #{id}
+    </update>
+
+    <!-- 根据主键删除一条记录 -->
+    <delete id="delete">
+        DELETE
+        FROM temp_live_teacher_card
+        WHERE id_ = #{id}
+    </delete>
+
+    <!-- 分页查询 -->
+    <select id="queryPage" resultMap="TempLiveTeacherCard" parameterType="map">
+        SELECT * FROM temp_live_teacher_card ORDER BY id_
+        <include refid="global.limit"/>
+    </select>
+
+    <!-- 查询当前表的总记录数 -->
+    <select id="queryCount" resultType="int">
+        SELECT COUNT(*)
+        FROM temp_live_teacher_card
+    </select>
+
+    <select id="list" resultMap="TempLiveTeacherCard">
+        select t.*,
+               s.name_ as subject_name_,
+               #{studentId} as student_id_,
+               IF(a.live_goods_id_ is null,0,1) as recommend_level_flag_,
+               (select count(1) from im_group_member m where m.im_group_id_ = t.im_group_id_ and m.user_id_ = #{studentId})>0 AS join_flag_
+        from temp_live_teacher_card t
+        left join `subject` s on t.subject_id_ = s.id_
+        left join (
+            select
+                live_goods_id_,recommend_level_
+            from temp_buy_free_live_theory_course
+            where user_id_ = #{studentId} and recommend_level_ is not null
+            group by live_goods_id_,recommend_level_
+        ) a on t.live_goods_id_ = a.live_goods_id_ and t.level_ = a.recommend_level_
+        where FIND_IN_SET(subject_id_,#{subjectId})
+        order by field(t.level_,'one','two','three')
+    </select>
+
+    <select id="getBySubjectIdAndLevel" resultMap="TempLiveTeacherCard">
+        SELECT *
+        FROM temp_live_teacher_card
+        WHERE subject_id_ = #{subjectId} and level_ = #{level}
+    </select>
+
+
+    <select id="querySubjectOption" resultType="com.ym.mec.biz.dal.entity.Subject">
+        SELECT
+            t.id_ as id,t.name_ as name
+        FROM subject t
+        where exists(
+            select 1 from temp_live_teacher_card cs
+            where t.id_ = cs.subject_id_
+            and cs.username_ is not null
+            and cs.music_content_ is not null
+        )
+        order by t.id_
+    </select>
+
+    <select id="getJoinStstus" resultType="java.lang.Integer">
+        select case when
+            (
+                select count(1) from temp_buy_free_live_theory_course
+                where user_id_ = #{userId} and live_goods_id_ = #{goodsId}
+            ) = 0 then 0
+            when (
+                select count(1) from temp_live_teacher_card a
+                left join im_group_member b on a.im_group_id_ = b.im_group_id_
+                where a.live_goods_id_ = #{goodsId} and b.user_id_ = #{userId}
+            ) = 0 then 1 else 2 end
+        from dual
+    </select>
+    <select id="getJoinSubject" resultType="java.lang.String">
+        select subject_id_ from temp_live_teacher_card a
+        left join im_group_member b on a.im_group_id_ = b.im_group_id_
+        where a.live_goods_id_ = #{goodsId} and b.user_id_ = #{userId}
+        limit 1;
+    </select>
+</mapper>

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

@@ -98,6 +98,11 @@
 	<select id="queryPageList" resultMap="TenantContractTemplateDto"
 		parameterType="map">
 		SELECT tct.*,u.real_name_ latest_operator_ FROM tenant_contract_template tct left join sys_user u on tct.modify_by_ = u.id_ 
+		<include refid="queryPageListSql"/>
+		ORDER BY id_
+		<include refid="global.limit" />
+	</select>
+	<sql id="queryPageListSql">
 		<where>
 			tct.tenant_id_ = #{tenantId}
 			<if test="status != null">
@@ -110,24 +115,12 @@
 				and tct.owner_ = #{owner}
 			</if>
 		</where>
-		ORDER BY id_
-		<include refid="global.limit" />
-	</select>
+	</sql>
 
 	<!-- 查询当前表的总记录数 -->
 	<select id="queryCount" resultType="int">
 		SELECT COUNT(tct.id_) FROM tenant_contract_template tct
-		<where>
-			<if test="status != null">
-				and tct.status_ = #{status}
-			</if>
-			<if test="type != null">
-				and tct.type_ = #{type}
-			</if>
-			<if test="owner != null">
-				and tct.owner_ = #{owner}
-			</if>
-		</where>
+		<include refid="queryPageListSql"/>
 	</select>
 	
 	<select id="queryLatestContractTemplate" resultMap="TenantContractTemplate" parameterType="map">

+ 19 - 0
mec-client-api/src/main/java/com/ym/mec/im/ImFeignService.java

@@ -43,6 +43,15 @@ public interface ImFeignService {
     Object groupCreate(@RequestBody GroupModel groupModel);
 
     /**
+     * 修改群组
+     *
+     * @param groupModel
+     * @return
+     */
+    @PostMapping(value = "group/update")
+    Object groupUpdate(@RequestBody GroupModel groupModel);
+
+    /**
      * 批量创建群组
      *
      * @param groupModels
@@ -179,4 +188,14 @@ public interface ImFeignService {
     @PostMapping(value = "/liveRoom/userExistInRoom")
     boolean userExistInRoom(@RequestParam("chatroomId") String chatroomId, @RequestParam("userId") String userId);
 
+    /**
+     * 查询用户是否在线
+     * 注意:断网时,用户状态返回可能不准确
+     *
+     * @param userId 要查询的用户 ID(必传)
+     * @return 在线状态,true 在线,false 不在线
+     */
+    @PostMapping(value = "/liveRoom/checkOnline")
+    boolean checkOnline(@RequestParam("userId") String userId);
+
 }

Some files were not shown because too many files changed in this diff