RoomServiceImpl.java 60 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240
  1. package com.ym.service.Impl;
  2. import com.ym.common.ApiException;
  3. import com.ym.common.DisplayEnum;
  4. import com.ym.common.ErrorEnum;
  5. import com.ym.config.IMProperties;
  6. import com.ym.config.RoomProperties;
  7. import com.ym.dao.RoomDao;
  8. import com.ym.dao.RoomMemberDao;
  9. import com.ym.dao.UserDao;
  10. import com.ym.dao.WhiteboardDao;
  11. import com.ym.job.ScheduleManager;
  12. import com.ym.mec.auth.api.client.SysUserFeignService;
  13. import com.ym.mec.auth.api.entity.SysUser;
  14. import com.ym.mec.biz.dal.dao.TeacherDao;
  15. import com.ym.mec.biz.dal.entity.Teacher;
  16. import com.ym.mec.biz.dal.enums.SignStatusEnum;
  17. import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
  18. import com.ym.mec.biz.service.StudentAttendanceService;
  19. import com.ym.mec.biz.service.TeacherAttendanceService;
  20. import com.ym.mec.common.security.SecurityUtils;
  21. import com.ym.mec.im.IMHelper;
  22. import com.ym.mec.im.message.*;
  23. import com.ym.pojo.*;
  24. import com.ym.service.RoomService;
  25. import com.ym.utils.CheckUtils;
  26. import com.ym.utils.CodeUtil;
  27. import com.ym.utils.DateTimeUtils;
  28. import com.ym.utils.IdentifierUtils;
  29. import com.ym.whiteboard.WhiteBoardHelper;
  30. import lombok.extern.slf4j.Slf4j;
  31. import org.springframework.beans.factory.annotation.Autowired;
  32. import org.springframework.stereotype.Service;
  33. import org.springframework.transaction.annotation.Transactional;
  34. import java.util.ArrayList;
  35. import java.util.Date;
  36. import java.util.List;
  37. /**
  38. * Created by weiqinxiao on 2019/2/28.
  39. */
  40. @Slf4j
  41. @Service
  42. public class RoomServiceImpl implements RoomService {
  43. @Autowired
  44. private IMHelper imHelper;
  45. @Autowired
  46. private RoomProperties roomProperties;
  47. @Autowired
  48. private RoomDao roomDao;
  49. @Autowired
  50. private RoomMemberDao roomMemberDao;
  51. @Autowired
  52. private WhiteBoardHelper whiteBoardHelper;
  53. @Autowired
  54. private WhiteboardDao whiteboardDao;
  55. @Autowired
  56. private ScheduleManager scheduleManager;
  57. @Autowired
  58. private UserDao userDao;
  59. @Autowired
  60. private TeacherDao teacherDao;
  61. @Autowired
  62. private TeacherAttendanceService teacherAttendanceService;
  63. @Autowired
  64. private StudentAttendanceService studentAttendanceService;
  65. @Autowired
  66. private IMProperties imProperties;
  67. @Autowired
  68. private SysUserFeignService sysUserFeignService;
  69. @Transactional(rollbackFor = Exception.class)
  70. @Override
  71. public RoomResult joinRoom(String userName, String roomId, boolean isAudience, boolean isDisableCamera) throws ApiException, Exception {
  72. CheckUtils.checkArgument(userName != null, "userName must't be null");
  73. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  74. log.info("joinRoom: roomId={}, userName={}, isAudience={}, isDisableCamera={}", roomId, userName, isAudience, isDisableCamera);
  75. String userId = sysUserFeignService.queryUserInfo().getId().toString();
  76. Teacher teacher = teacherDao.get(Integer.parseInt(userId));
  77. try {
  78. if(teacher == null){
  79. studentAttendanceService.addStudentAttendanceRecord(Integer.parseInt(roomId),Integer.parseInt(userId), StudentAttendanceStatusEnum.NORMAL);
  80. }else {
  81. teacherAttendanceService.addTeacherAttendanceRecord(Integer.parseInt(roomId),Integer.parseInt(userId), SignStatusEnum.SIGN_IN,true);
  82. }
  83. }catch (Exception e){
  84. e.printStackTrace();
  85. }
  86. roomId = "DAYA" + roomId;
  87. String display = "";
  88. Date curTime = DateTimeUtils.currentUTC();
  89. List<Room> roomList = roomDao.findByRid(roomId);
  90. if (roomList.isEmpty()) {
  91. saveRoom(roomId, roomId, curTime, display);
  92. IMApiResultInfo resultInfo = imHelper.createGroup(new String[]{userId}, roomId, roomId);
  93. if (!resultInfo.isSuccess()) {
  94. log.error("joinRoom IM error: roomId={}, {}", roomId, resultInfo.getErrorMessage());
  95. throw new ApiException(ErrorEnum.ERR_CREATE_ROOM_ERROR, resultInfo.getErrorMessage());
  96. } else {
  97. scheduleManager.addExpiredTask(this, roomId);
  98. }
  99. } else {
  100. display = roomList.get(0).getDisplay();
  101. }
  102. RoleEnum roleEnum;
  103. RoomResult roomResult = new RoomResult();
  104. RoomResult.MemberResult userResult = new RoomResult.MemberResult();
  105. List<RoomMember> memberList = roomMemberDao.findByRidAndUid(roomId, userId);
  106. if (memberList.isEmpty()) {
  107. int count = roomMemberDao.countByRidAndExcludeRole(roomId, RoleEnum.RoleAudience.getValue());
  108. if (!isAudience && count == roomProperties.getMaxCount()) {
  109. log.info("join error: roomId = {}, userName = {}, isAudience = {}", roomId, userName, isAudience);
  110. throw new ApiException(ErrorEnum.ERR_OVER_MAX_COUNT);
  111. }
  112. /*if (!isAudience) {
  113. List<RoomMember> assistantList = roomMemberDao.findByRidAndRole(roomId, RoleEnum.RoleAssistant.getValue());
  114. if (!assistantList.isEmpty()) {
  115. if (count == 1) {
  116. roleEnum = RoleEnum.RoleTeacher;
  117. } else {
  118. roleEnum = RoleEnum.RoleStudent;
  119. }
  120. } else {
  121. roleEnum = RoleEnum.RoleAssistant;
  122. }
  123. } else {
  124. roleEnum = RoleEnum.RoleAudience;
  125. }*/
  126. if(teacher == null){
  127. roleEnum = RoleEnum.RoleStudent;
  128. }else {
  129. roleEnum = RoleEnum.RoleTeacher;
  130. }
  131. saveRoomMember(userId, userName, roomId, roleEnum.getValue(), !isDisableCamera, curTime);
  132. IMApiResultInfo resultInfo = imHelper.joinGroup(new String[]{userId}, roomId, roomId);
  133. if (!resultInfo.isSuccess()) {
  134. throw new ApiException(ErrorEnum.ERR_CREATE_ROOM_ERROR, resultInfo.getErrorMessage());
  135. }
  136. userResult.setMicrophone(true);
  137. userResult.setCamera(!isDisableCamera);
  138. userResult.setJoinTime(curTime);
  139. log.info("user join the room: roomId={} , userId={}, roleEnum={}, memCount: {}", roomId, userId, roleEnum, count);
  140. } else {
  141. roleEnum = RoleEnum.getEnumByValue(memberList.get(0).getRole());
  142. roomMemberDao.updateCameraByRidAndUid(roomId, userId, !isDisableCamera);
  143. userResult.setCamera(!isDisableCamera);
  144. userResult.setJoinTime(memberList.get(0).getJoinDt());
  145. log.info("user exist in the room: roomId={} , userId={}, use the last role={}", roomId, userId, roleEnum);
  146. }
  147. MemberChangedMessage msg = new MemberChangedMessage(MemberChangedMessage.Action_Join, userId, roleEnum.getValue());
  148. msg.setTimestamp(curTime);
  149. msg.setUserName(userName);
  150. msg.setCamera(!isDisableCamera);
  151. imHelper.publishMessage(userId, roomId, msg);
  152. if (roleEnum == RoleEnum.RoleTeacher) {
  153. display = "display://type=1?userId=" + userId + "?uri=";
  154. updateDisplay(roomId, userId, display, 0);
  155. log.info("joinRoom, display changed: roomId={}, {}, userId={}", roomId, display, userId);
  156. } else if (roleEnum == RoleEnum.RoleAssistant && display.isEmpty()) {
  157. display = "display://type=0?userId=" + userId + "?uri=";
  158. updateDisplay(roomId, userId, display, 0);
  159. log.info("joinRoom, display changed: roomId={}, {}, userId={}", roomId, display, userId);
  160. }
  161. List<UserInfo> userInfoList = userDao.findByUid(userId);
  162. if (userInfoList.isEmpty()) {
  163. UserInfo userInfo = new UserInfo();
  164. userInfo.setUid(userId);
  165. userInfo.setName(userName);
  166. userInfo.setCreateDt(curTime);
  167. userInfo.setUpdateDt(curTime);
  168. userDao.save(userInfo);
  169. } else {
  170. UserInfo user = userInfoList.get(0);
  171. user.setUpdateDt(curTime);
  172. userDao.save(user);
  173. }
  174. userResult.setUserName(userName);
  175. userResult.setUserId(userId);
  176. userResult.setRole(roleEnum.getValue());
  177. roomResult.setUserInfo(userResult);
  178. roomResult.setDisplay(display);
  179. roomResult.setRoomId(roomId);
  180. List<RoomMember> roomMemberList = roomMemberDao.findByRid(roomId);
  181. roomResult.setMembers(roomMemberList);
  182. List<Whiteboard> whiteboardList = whiteboardDao.findByRid(roomId);
  183. roomResult.setWhiteboards(whiteboardList);
  184. log.info("join success: roomId = {}, userId = {}, userName={}, role = {}", roomId, userId, userName, roleEnum);
  185. return roomResult;
  186. }
  187. private void saveRoom(String roomId, String roomName, Date createTime, String display) {
  188. Room room = new Room();
  189. room.setRid(roomId);
  190. room.setName(roomName);
  191. room.setCreateDt(createTime);
  192. room.setDisplay(display);
  193. room.setWhiteboardNameIndex(0);
  194. roomDao.save(room);
  195. }
  196. private void saveRoomMember(String userId, String userName, String roomId, int role, boolean cameraOn, Date joinTime) {
  197. RoomMember roomMember = new RoomMember();
  198. roomMember.setUid(userId);
  199. roomMember.setName(userName);
  200. roomMember.setRid(roomId);
  201. roomMember.setRole(role);
  202. roomMember.setCamera(cameraOn);
  203. roomMember.setJoinDt(joinTime);
  204. roomMemberDao.save(roomMember);
  205. }
  206. @Transactional
  207. @Override
  208. public Boolean leaveRoom(String roomId) throws Exception {
  209. SysUser user = sysUserFeignService.queryUserInfo();
  210. String userId = user.getId().toString();
  211. Teacher teacher = teacherDao.get(user.getId());
  212. if(teacher != null){
  213. try {
  214. teacherAttendanceService.addTeacherAttendanceRecord(Integer.parseInt(roomId.substring(4)),user.getId(), SignStatusEnum.SIGN_OUT,true);
  215. }catch (Exception e){
  216. e.printStackTrace();
  217. }
  218. }
  219. CheckUtils.checkArgument(user != null, "user must't be null");
  220. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  221. List<Room> roomList = roomDao.findByRid(roomId);
  222. if (roomList.size() == 0) {
  223. log.error("room : {} not exist ", roomId);
  224. throw new ApiException(ErrorEnum.ERR_ROOM_NOT_EXIST);
  225. }
  226. List<RoomMember> roomMemberList = roomMemberDao.findByRidAndUid(roomId, userId);
  227. if (roomMemberList.size() == 0) {
  228. log.error("{} not exist in room: {}", userId, roomId);
  229. throw new ApiException(ErrorEnum.ERR_USER_NOT_EXIST_IN_ROOM);
  230. }
  231. int userRole = roomMemberList.get(0).getRole();
  232. log.info("leaveRoom: roomId={}, role={}", roomId, RoleEnum.getEnumByValue(userRole));
  233. if (userRole == RoleEnum.RoleTeacher.getValue() || userRole == RoleEnum.RoleAssistant.getValue()) {
  234. if (isUserDisplay(roomList.get(0), userId)) {
  235. updateDisplay(roomId, userId, "", 0);
  236. log.info("clear display cause speaker leave: roomId={}", roomId);
  237. } else {
  238. log.info("don't update current display: room={}, role={}", roomList.get(0), RoleEnum.getEnumByValue(userRole));
  239. }
  240. } else {
  241. log.info("don't update current display: room={}, userRole={}", roomList.get(0), RoleEnum.getEnumByValue(userRole));
  242. }
  243. if (roomMemberDao.countByRid(roomId) == 1) {
  244. IMApiResultInfo apiResultInfo = null;
  245. try {
  246. apiResultInfo = imHelper.dismiss(userId, roomId);
  247. if (apiResultInfo.getCode() == 200) {
  248. roomMemberDao.deleteUserByRidAndUid(roomId, userId);
  249. roomDao.deleteByRid(roomId);
  250. deleteWhiteboardByUser(roomId, userId);
  251. log.info("dismiss the room: {}", roomId);
  252. } else {
  253. log.error("{} exit {} room error: {}", userId, roomId, apiResultInfo.getErrorMessage());
  254. throw new ApiException(ErrorEnum.ERR_EXIT_ROOM_ERROR, apiResultInfo.getErrorMessage());
  255. }
  256. } catch (Exception e) {
  257. log.error("{} exit {} room error: {}", userId, roomId, e.getMessage());
  258. throw new ApiException(ErrorEnum.ERR_EXIT_ROOM_ERROR, e.getMessage());
  259. }
  260. } else {
  261. IMApiResultInfo apiResultInfo = null;
  262. try {
  263. apiResultInfo = imHelper.quit(new String[]{userId}, roomId);
  264. if (apiResultInfo.isSuccess()) {
  265. roomMemberDao.deleteUserByRidAndUid(roomId, userId);
  266. MemberChangedMessage msg = new MemberChangedMessage(MemberChangedMessage.Action_Leave, userId, userRole);
  267. msg.setUserName(user.getUsername());
  268. imHelper.publishMessage(userId, roomId, msg);
  269. imHelper.quit(new String[]{userId}, roomId);
  270. log.info("quit group: roomId={}", roomId);
  271. } else {
  272. throw new ApiException(ErrorEnum.ERR_EXIT_ROOM_ERROR, apiResultInfo.getErrorMessage());
  273. }
  274. } catch (Exception e) {
  275. log.error("leave room error: roomId={}, {}", roomId, e.getMessage());
  276. throw new ApiException(ErrorEnum.ERR_EXIT_ROOM_ERROR);
  277. }
  278. }
  279. userDao.deleteByUid(userId);
  280. return true;
  281. }
  282. private void deleteWhiteboardByUser(String roomId, String userId) throws Exception {
  283. List<Whiteboard> whiteboardList = whiteboardDao.findByRidAndCreator(roomId, userId);
  284. if (!whiteboardList.isEmpty()) {
  285. whiteboardDao.deleteByRidAndCreator(roomId, userId);
  286. for (Whiteboard wb : whiteboardList) {
  287. whiteBoardHelper.destroy(wb.getWbRoom());
  288. }
  289. }
  290. }
  291. @Transactional(rollbackFor = Exception.class)
  292. @Override
  293. public void destroyRoom(String roomId) {
  294. roomDao.deleteByRid(roomId);
  295. whiteboardDao.deleteByRid(roomId);
  296. List<RoomMember> list = roomMemberDao.findByRid(roomId);
  297. if (!list.isEmpty()) {
  298. try {
  299. imHelper.dismiss(list.get(0).getUid(), roomId);
  300. } catch (Exception e) {
  301. log.error("destroyRoom: {}", e.getMessage());
  302. e.printStackTrace();
  303. }
  304. }
  305. roomMemberDao.deleteByRid(roomId);
  306. log.info("destroyRoom: {}", roomId);
  307. }
  308. @Transactional
  309. @Override
  310. public Boolean downgrade(String roomId, List<ReqChangeUserRoleData.ChangedUser> users) throws ApiException, Exception {
  311. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  312. CheckUtils.checkArgument(users.size() > 0, "the changed user list must't be null");
  313. String token = SecurityUtils.getAuthenticationValue();
  314. SysUser authUser = sysUserFeignService.queryUserInfo();
  315. String userId = authUser.getId().toString();
  316. List<Room> roomList = roomDao.findByRid(roomId);
  317. if (roomList.isEmpty()) {
  318. throw new ApiException(ErrorEnum.ERR_ROOM_NOT_EXIST);
  319. }
  320. boolean result = false;
  321. List<RoleChangedMessage.ChangedUser> changedUsers = new ArrayList<>();
  322. for (ReqChangeUserRoleData.ChangedUser user : users) {
  323. String changedUserId = user.getUserId();
  324. RoleEnum changedRole = RoleEnum.getEnumByValue(user.getRole());
  325. if (changedUserId.equals(userId)) {
  326. log.error("can not change self role: {}, {}, {}", roomId, userId, changedRole);
  327. throw new ApiException(ErrorEnum.ERR_CHANGE_SELF_ROLE);
  328. } else {
  329. List<RoomMember> oldUsers = roomMemberDao.findByRidAndUid(roomId, changedUserId);
  330. if (oldUsers.size() > 0) {
  331. if (changedRole.equals(RoleEnum.RoleAudience)) {
  332. int r = roomMemberDao.updateRoleByRidAndUid(roomId, changedUserId, changedRole.getValue());
  333. RoleChangedMessage.ChangedUser u = new RoleChangedMessage.ChangedUser(changedUserId, changedRole.getValue());
  334. List<UserInfo> userInfoList = userDao.findByUid(changedUserId);
  335. if (!userInfoList.isEmpty()) {
  336. u.setUserName(userInfoList.get(0).getName());
  337. }
  338. changedUsers.add(u);
  339. log.info("change the role: {}, {}, {}, result: {}", roomId, userId, changedRole, r);
  340. result = true;
  341. }
  342. if (oldUsers.get(0).getRole() == RoleEnum.RoleTeacher.getValue() && isUserDisplay(roomList.get(0), oldUsers.get(0).getUid())) {
  343. updateDisplay(roomId, userId, "", 1);
  344. } else {
  345. log.info("don't update display: room={}, userRole={}", roomList.get(0), RoleEnum.getEnumByValue(oldUsers.get(0).getRole()));
  346. }
  347. } else {
  348. log.info("role changed fail, not exist: {} - {} - {}", roomId, userId, changedRole);
  349. }
  350. }
  351. }
  352. if (result) {
  353. RoleChangedMessage msg = new RoleChangedMessage(userId);
  354. msg.setUsers(changedUsers);
  355. imHelper.publishMessage(userId, roomId, msg, 1);
  356. }
  357. return result;
  358. }
  359. @Override
  360. public Boolean kickMember(String roomId) throws ApiException, Exception {
  361. String token = SecurityUtils.getAuthenticationValue();
  362. SysUser authUser = sysUserFeignService.queryUserInfo();
  363. String userId = authUser.getId().toString();
  364. CheckUtils.checkArgument(userId != null, "userId must't be null");
  365. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  366. List<RoomMember> kickedUsers = roomMemberDao.findByRidAndUid(roomId, userId);
  367. int result = roomMemberDao.deleteUserByRidAndUid(roomId, userId);
  368. log.info("kickMember: roomId={}, userId={}, result = {}", roomId, userId, result);
  369. if (result == 0) {
  370. throw new ApiException(ErrorEnum.ERR_USER_NOT_EXIST_IN_ROOM);
  371. } else {
  372. MemberChangedMessage msg = new MemberChangedMessage(MemberChangedMessage.Action_Kick, userId, kickedUsers.get(0).getRole());
  373. List<UserInfo> userInfoList = userDao.findByUid(userId);
  374. if (!userInfoList.isEmpty()) {
  375. msg.setUserName(userInfoList.get(0).getName());
  376. }
  377. IMApiResultInfo apiResultInfo = imHelper.publishMessage(userId, roomId, msg, 1);
  378. if (!apiResultInfo.isSuccess()) {
  379. throw new ApiException(ErrorEnum.ERR_MESSAGE_ERROR);
  380. }
  381. Thread.sleep(50);
  382. log.info("published msg: msg={}", msg);
  383. List<Room> roomList = roomDao.findByRid(roomId);
  384. if (kickedUsers.get(0).getRole() == RoleEnum.RoleTeacher.getValue() && isUserDisplay(roomList.get(0), userId)) {
  385. updateDisplay(roomId, userId, "", 1);
  386. } else {
  387. log.info("don't update display: room={}, userRole={}", roomId, RoleEnum.getEnumByValue(kickedUsers.get(0).getRole()));
  388. }
  389. }
  390. userDao.deleteByUid(userId);
  391. IMApiResultInfo apiResultInfo = imHelper.quit(new String[]{userId}, roomId);
  392. if (!apiResultInfo.isSuccess()) {
  393. throw new ApiException(ErrorEnum.ERR_EXIT_ROOM_ERROR, apiResultInfo.getErrorMessage());
  394. }
  395. return true;
  396. }
  397. @Override
  398. public Boolean display(String roomId, int type, String uri) throws ApiException, Exception {
  399. SysUser authUser = sysUserFeignService.queryUserInfo();
  400. String userId = authUser.getId().toString();
  401. log.info("display in room: {}, type = {}, uri = {}", roomId, type, uri);
  402. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  403. CheckUtils.checkArgument(type >= 0 && type < DisplayEnum.values().length, "type not exist");
  404. DisplayEnum displayEnum = DisplayEnum.values()[type];
  405. if (displayEnum.equals(DisplayEnum.None)) {
  406. roomDao.updateDisplayByRid(roomId, "");
  407. DisplayMessage displayMessage = new DisplayMessage("");
  408. IMApiResultInfo apiResultInfo = imHelper.publishMessage(userId, roomId, displayMessage);
  409. if (apiResultInfo.isSuccess()) {
  410. return true;
  411. } else {
  412. throw new ApiException(ErrorEnum.ERR_MESSAGE_ERROR, apiResultInfo.getErrorMessage());
  413. }
  414. }
  415. String display = "display://type=" + type;
  416. if (displayEnum.equals(DisplayEnum.Teacher)) {
  417. List<RoomMember> teachers = roomMemberDao.findByRidAndRole(roomId, RoleEnum.RoleTeacher.getValue());
  418. if (teachers.isEmpty()) {
  419. throw new ApiException(ErrorEnum.ERR_TEACHER_NOT_EXIST_IN_ROOM);
  420. } else {
  421. display += "?userId=" + teachers.get(0).getUid() + "?uri=";
  422. roomDao.updateDisplayByRid(roomId, display);
  423. DisplayMessage displayMessage = new DisplayMessage(display);
  424. imHelper.publishMessage(userId, roomId, displayMessage);
  425. log.info("change display to teacher: roomId={}, display={}", roomId, display);
  426. }
  427. } else if (displayEnum.equals(DisplayEnum.Assistant)) {
  428. List<RoomMember> assistants = roomMemberDao.findByRidAndRole(roomId, RoleEnum.RoleAssistant.getValue());
  429. if (assistants.isEmpty()) {
  430. throw new ApiException(ErrorEnum.ERR_ASSISTANT_NOT_EXIST_IN_ROOM);
  431. } else {
  432. display += "?userId=" + assistants.get(0).getUid() + "?uri=";
  433. roomDao.updateDisplayByRid(roomId, display);
  434. DisplayMessage displayMessage = new DisplayMessage(display);
  435. imHelper.publishMessage(userId, roomId, displayMessage);
  436. log.info("change display to assistant: roomId={}, display={}", roomId, display);
  437. }
  438. } else if (displayEnum.equals(DisplayEnum.Screen)) {
  439. display += "?userId=" + userId + "?uri=";
  440. roomDao.updateDisplayByRid(roomId, display);
  441. DisplayMessage displayMessage = new DisplayMessage(display);
  442. imHelper.publishMessage(userId, roomId, displayMessage);
  443. log.info("change display to screen: roomId={}, display={}", roomId, display);
  444. } else {
  445. display += "?userId=" + "?uri=" + uri;
  446. // CheckUtils.checkArgument(uri != null, "uri must't be null");
  447. // CheckUtils.checkArgument(whiteboardDao.findByRidAndWbid(roomId, uri).size() > 0, "whiteboard not exist");
  448. roomDao.updateDisplayByRid(roomId, display);
  449. DisplayMessage displayMessage = new DisplayMessage(display);
  450. imHelper.publishMessage(userId, roomId, displayMessage);
  451. }
  452. log.info("result display in room: {}, type = {}, uri = {}", roomId, type, uri);
  453. return true;
  454. }
  455. @Override
  456. public String createWhiteBoard(String roomId) throws ApiException, Exception {
  457. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  458. CheckUtils.checkArgument(roomDao.existsByRid(roomId), "room not exist");
  459. String token = SecurityUtils.getAuthenticationValue();
  460. SysUser authUser = sysUserFeignService.queryUserInfo();
  461. String userId = authUser.getId().toString();
  462. CheckUtils.checkArgument(roomMemberDao.existsByRidAndUid(roomId, userId), "room member not exist");
  463. log.info("createWhiteBoard: roomId = {}", roomId);
  464. String wbRoom = IdentifierUtils.uuid();
  465. WhiteBoardApiResultInfo resultInfo = whiteBoardHelper.create(wbRoom);
  466. if (resultInfo.isSuccess()) {
  467. String wbId = resultInfo.getData();
  468. Date date = DateTimeUtils.currentUTC();
  469. List<Room> roomList = roomDao.findByRid(roomId);
  470. int whiteboardNameIndex = roomList.get(0).getWhiteboardNameIndex() + 1;
  471. String name = "白板" + whiteboardNameIndex;
  472. roomDao.updateWhiteboardNameIndexByRid(roomId, whiteboardNameIndex);
  473. Whiteboard wb = new Whiteboard();
  474. wb.setRid(roomId);
  475. wb.setWbRoom(wbRoom);
  476. wb.setWbid(wbId);
  477. wb.setName(name);
  478. wb.setCreator(userId);
  479. wb.setCreateDt(date);
  480. wb.setCurPg(0);
  481. whiteboardDao.save(wb);
  482. WhiteboardMessage wbmsg = new WhiteboardMessage(WhiteboardMessage.Create);
  483. wbmsg.setWhiteboardId(wbId);
  484. wbmsg.setWhiteboardName(name);
  485. imHelper.publishMessage(userId, roomId, wbmsg);
  486. String display = "display://type=2?userId=" + userId + "?uri=" + wbId;
  487. roomDao.updateDisplayByRid(roomId, display);
  488. DisplayMessage displayMessage = new DisplayMessage(display);
  489. imHelper.publishMessage(userId, roomId, displayMessage, 1);
  490. return wbId;
  491. } else {
  492. throw new ApiException(ErrorEnum.ERR_CREATE_WHITE_BOARD, resultInfo.getMsg());
  493. }
  494. }
  495. @Override
  496. public Boolean deleteWhiteboard(String roomId, String whiteBoardId) throws ApiException, Exception {
  497. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  498. CheckUtils.checkArgument(whiteBoardId != null, "whiteBoardId must't be null");
  499. String token = SecurityUtils.getAuthenticationValue();
  500. SysUser authUser = sysUserFeignService.queryUserInfo();
  501. String userId = authUser.getId().toString();
  502. List<Whiteboard> whiteboardList = whiteboardDao.findByRidAndWbid(roomId, whiteBoardId);
  503. CheckUtils.checkArgument(whiteboardList.size() > 0, "whiteboard not exist");
  504. List<Room> roomList = roomDao.findByRid(roomId);
  505. CheckUtils.checkArgument(!roomList.isEmpty(), "room not exist");
  506. log.info("deleteWhiteboard: room={}, whiteBoardId={}", roomList.get(0), whiteBoardId);
  507. String display = roomList.get(0).getDisplay();
  508. if (display.contains("uri=" + whiteBoardId)) {
  509. int result = roomDao.updateDisplayByRid(roomId, "");
  510. log.info("clear room display, room: {}, result: {}", roomId, result);
  511. DisplayMessage displayMessage = new DisplayMessage("");
  512. imHelper.publishMessage(userId, roomId, displayMessage, 1);
  513. } else {
  514. log.info("no display to clean: room={}", roomList.get(0));
  515. }
  516. String wbRoom = whiteboardList.get(0).getWbRoom();
  517. WhiteBoardApiResultInfo resultInfo = whiteBoardHelper.destroy(wbRoom);
  518. if (resultInfo.isSuccess()) {
  519. int result = whiteboardDao.deleteByWbid(whiteBoardId);
  520. log.info("delete whiteboard: roomId = {}, whiteBoardId = {}, result = {}", roomId, whiteBoardId, result);
  521. WhiteboardMessage wbmsg = new WhiteboardMessage(WhiteboardMessage.Delete);
  522. wbmsg.setWhiteboardId(whiteBoardId);
  523. imHelper.publishMessage(userId, roomId, wbmsg, 1);
  524. return true;
  525. } else {
  526. throw new ApiException(ErrorEnum.ERR_DELETE_WHITE_BOARD, resultInfo.getMsg());
  527. }
  528. }
  529. @Override
  530. public List<RoomResult.WhiteboardResult> getWhiteboard(String roomId) throws ApiException, Exception {
  531. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  532. CheckUtils.checkArgument(roomDao.existsByRid(roomId), "room not exist");
  533. List<Whiteboard> whiteboards = whiteboardDao.findByRid(roomId);
  534. List<RoomResult.WhiteboardResult> result = new ArrayList<>();
  535. for (Whiteboard wb : whiteboards) {
  536. RoomResult.WhiteboardResult r = new RoomResult.WhiteboardResult();
  537. r.setName(wb.getName());
  538. r.setCurPg(wb.getCurPg());
  539. r.setWhiteboardId(wb.getWbid());
  540. result.add(r);
  541. }
  542. return result;
  543. }
  544. @Override
  545. public Boolean turnWhiteBoardPage(String roomId, String whiteBoardId, int page) throws ApiException, Exception {
  546. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  547. CheckUtils.checkArgument(whiteBoardId != null, "whiteBoardId must't be null");
  548. String token = SecurityUtils.getAuthenticationValue();
  549. SysUser authUser = sysUserFeignService.queryUserInfo();
  550. String userId = authUser.getId().toString();
  551. List<Room> roomList = roomDao.findByRid(roomId);
  552. CheckUtils.checkArgument(!roomList.isEmpty(), "room not exist");
  553. int result = whiteboardDao.updatePageByRidAndWbid(roomId, whiteBoardId, page);
  554. log.info("turn page to: {}, room: {}, wb : {}; r: {}", page, roomId, whiteBoardId, result);
  555. TurnPageMessage turnPageMessage = new TurnPageMessage(whiteBoardId, userId, page);
  556. imHelper.publishMessage(userId, roomId, turnPageMessage);
  557. return true;
  558. }
  559. @Override
  560. public Boolean controlDevice(String roomId, String userId, DeviceTypeEnum typeEnum, boolean enable) throws ApiException, Exception {
  561. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  562. CheckUtils.checkArgument(userId != null, "userId must't be null");
  563. CheckUtils.checkArgument(roomDao.existsByRid(roomId), "room not exist");
  564. CheckUtils.checkArgument(roomMemberDao.existsByRidAndUid(roomId, userId), "room member not exist");
  565. String token = SecurityUtils.getAuthenticationValue();
  566. SysUser authUser = sysUserFeignService.queryUserInfo();
  567. log.info("controlDevice: userId={}, typeEnum={}, onOff={}", userId, typeEnum, enable);
  568. if (enable) {
  569. String ticket = IdentifierUtils.uuid();
  570. ControlDeviceTaskInfo taskInfo = new ControlDeviceTaskInfo();
  571. taskInfo.setRoomId(roomId);
  572. taskInfo.setTypeEnum(typeEnum);
  573. taskInfo.setOnOff(true);
  574. taskInfo.setApplyUserId(userId);
  575. taskInfo.setTargetUserId(userId);
  576. taskInfo.setTicket(ticket);
  577. scheduleManager.addTask(taskInfo);
  578. ControlDeviceNotifyMessage msg = new ControlDeviceNotifyMessage(ActionEnum.Invite.ordinal());
  579. msg.setTicket(ticket);
  580. msg.setType(taskInfo.getTypeEnum().ordinal());
  581. msg.setOpUserId(userId);
  582. msg.setOpUserName(authUser.getUsername());
  583. imHelper.publishMessage(userId, userId, roomId, msg);
  584. } else {
  585. if (typeEnum.equals(DeviceTypeEnum.Camera)) {
  586. roomMemberDao.updateCameraByRidAndUid(roomId, userId, false);
  587. } else {
  588. roomMemberDao.updateMicByRidAndUid(roomId, userId, false);
  589. }
  590. DeviceStateChangedMessage deviceResourceMessage = new DeviceStateChangedMessage(typeEnum.ordinal(), false);
  591. deviceResourceMessage.setUserId(userId);
  592. List<UserInfo> userInfoList = userDao.findByUid(userId);
  593. if (!userInfoList.isEmpty()) {
  594. deviceResourceMessage.setUserName(userInfoList.get(0).getName());
  595. }
  596. imHelper.publishMessage(userId, roomId, deviceResourceMessage, 1);
  597. }
  598. return true;
  599. }
  600. @Override
  601. public Boolean approveControlDevice(String roomId, String ticket) throws ApiException, Exception {
  602. CheckUtils.checkArgument(ticket != null, "ticket must't be null");
  603. String token = SecurityUtils.getAuthenticationValue();
  604. SysUser authUser = sysUserFeignService.queryUserInfo();
  605. String userId = authUser.getId().toString();
  606. log.info("approveControlDevice: ticket={}", ticket);
  607. ControlDeviceTaskInfo taskInfo = (ControlDeviceTaskInfo) scheduleManager.executeTask(ticket);
  608. if (taskInfo.getTypeEnum().equals(DeviceTypeEnum.Camera)) {
  609. roomMemberDao.updateCameraByRidAndUid(roomId, userId, taskInfo.isOnOff());
  610. } else {
  611. roomMemberDao.updateMicByRidAndUid(roomId, userId, taskInfo.isOnOff());
  612. }
  613. ControlDeviceNotifyMessage msg = new ControlDeviceNotifyMessage(ActionEnum.Approve.ordinal());
  614. msg.setType(taskInfo.getTypeEnum().ordinal());
  615. msg.setOpUserId(userId);
  616. msg.setOpUserName(authUser.getUsername());
  617. imHelper.publishMessage(userId, taskInfo.getApplyUserId(), roomId, msg);
  618. DeviceStateChangedMessage deviceResourceMessage = new DeviceStateChangedMessage(taskInfo.getTypeEnum().ordinal(), taskInfo.isOnOff());
  619. deviceResourceMessage.setUserId(userId);
  620. imHelper.publishMessage(userId, roomId, deviceResourceMessage, 1);
  621. return true;
  622. }
  623. @Override
  624. public Boolean rejectControlDevice(String roomId, String ticket) throws ApiException, Exception {
  625. CheckUtils.checkArgument(ticket != null, "ticket must't be null");
  626. String token = SecurityUtils.getAuthenticationValue();
  627. SysUser authUser = sysUserFeignService.queryUserInfo();
  628. String userId = authUser.getId().toString();
  629. log.info("rejectControlDevice: ticket={}", ticket);
  630. ControlDeviceTaskInfo taskInfo = (ControlDeviceTaskInfo) scheduleManager.executeTask(ticket);
  631. ControlDeviceNotifyMessage msg = new ControlDeviceNotifyMessage(ActionEnum.Reject.ordinal());
  632. msg.setType(taskInfo.getTypeEnum().ordinal());
  633. msg.setOpUserId(userId);
  634. msg.setOpUserName(authUser.getUsername());
  635. imHelper.publishMessage(userId, taskInfo.getApplyUserId(), roomId, msg);
  636. return true;
  637. }
  638. @Override
  639. public Boolean syncDeviceState(String roomId, DeviceTypeEnum type, boolean enable) throws ApiException, Exception {
  640. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  641. CheckUtils.checkArgument(roomDao.existsByRid(roomId), "room not exist");
  642. String token = SecurityUtils.getAuthenticationValue();
  643. SysUser authUser = sysUserFeignService.queryUserInfo();
  644. String userId = authUser.getId().toString();
  645. int result;
  646. DeviceStateChangedMessage deviceResourceMessage;
  647. if (type.equals(DeviceTypeEnum.Camera)) {
  648. result = roomMemberDao.updateCameraByRidAndUid(roomId, userId, enable);
  649. deviceResourceMessage = new DeviceStateChangedMessage(type.ordinal(), enable);
  650. } else {
  651. result = roomMemberDao.updateMicByRidAndUid(roomId, userId, enable);
  652. deviceResourceMessage = new DeviceStateChangedMessage(type.ordinal(), enable);
  653. }
  654. deviceResourceMessage.setUserId(userId);
  655. imHelper.publishMessage(userId, roomId, deviceResourceMessage, 1);
  656. log.info("syncDeviceState : {}, {}, result = {}", roomId, enable, result);
  657. return true;
  658. }
  659. @Override
  660. public List<RoomResult.MemberResult> getMembers(String roomId) throws ApiException, Exception {
  661. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  662. List<RoomMember> roomMemberList = roomMemberDao.findByRid(roomId);
  663. RoomResult roomResult = new RoomResult();
  664. roomResult.setMembers(roomMemberList);
  665. return roomResult.getMembers();
  666. }
  667. @Override
  668. public Boolean applySpeech(String roomId) throws ApiException, Exception {
  669. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  670. CheckUtils.checkArgument(roomDao.existsByRid(roomId), "room not exist");
  671. String token = SecurityUtils.getAuthenticationValue();
  672. SysUser authUser = sysUserFeignService.queryUserInfo();
  673. String userId = authUser.getId().toString();
  674. List<RoomMember> assistants = roomMemberDao.findByRidAndRole(roomId, RoleEnum.RoleAssistant.getValue());
  675. if (assistants.isEmpty()) {
  676. throw new ApiException(ErrorEnum.ERR_ASSISTANT_NOT_EXIST_IN_ROOM);
  677. }
  678. String ticket = IdentifierUtils.uuid();
  679. ScheduledTaskInfo scheduledTaskInfo = new ScheduledTaskInfo();
  680. scheduledTaskInfo.setTicket(ticket);
  681. scheduledTaskInfo.setRoomId(roomId);
  682. scheduledTaskInfo.setApplyUserId(userId);
  683. scheduledTaskInfo.setTargetUserId(assistants.get(0).getUid());
  684. scheduleManager.addTask(scheduledTaskInfo);
  685. log.info("applySpeech: task = {}", scheduledTaskInfo);
  686. ApplyForSpeechMessage msg = new ApplyForSpeechMessage();
  687. msg.setTicket(ticket);
  688. msg.setReqUserId(userId);
  689. IMApiResultInfo resultInfo = imHelper.publishMessage(userId, assistants.get(0).getUid(), roomId, msg);
  690. log.info("apply for speech: {}, task = {}", roomId, scheduledTaskInfo);
  691. if (resultInfo.isSuccess()) {
  692. return true;
  693. } else {
  694. throw new ApiException(ErrorEnum.ERR_MESSAGE_ERROR, resultInfo.getErrorMessage());
  695. }
  696. }
  697. @Override
  698. public Boolean approveSpeech(String roomId, String ticket) throws ApiException, Exception {
  699. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  700. CheckUtils.checkArgument(roomDao.existsByRid(roomId), "room not exist");
  701. String token = SecurityUtils.getAuthenticationValue();
  702. SysUser authUser = sysUserFeignService.queryUserInfo();
  703. String userId = authUser.getId().toString();
  704. int count = roomMemberDao.countByRidAndExcludeRole(roomId, RoleEnum.RoleAudience.getValue());
  705. if (count == roomProperties.getMaxCount()) {
  706. log.error("approveSpeech error: roomId = {}, ticket={}", roomId, ticket);
  707. throw new ApiException(ErrorEnum.ERR_OVER_MAX_COUNT);
  708. }
  709. ScheduledTaskInfo taskInfo = scheduleManager.executeTask(ticket);
  710. log.info("approveSpeech: task = {}", taskInfo);
  711. roomMemberDao.updateRoleByRidAndUid(roomId, taskInfo.getApplyUserId(), RoleEnum.RoleStudent.getValue());
  712. SpeechResultMessage msg = new SpeechResultMessage(SpeechResultMessage.Action_Approve);
  713. List<UserInfo> userInfoList = userDao.findByUid(taskInfo.getApplyUserId());
  714. msg.setOpUserId(userId);
  715. msg.setOpUserName(authUser.getUsername());
  716. msg.setReqUserId(taskInfo.getApplyUserId());
  717. if (!userInfoList.isEmpty()) {
  718. msg.setReqUserName(userInfoList.get(0).getName());
  719. }
  720. msg.setRole(RoleEnum.RoleStudent.getValue());
  721. IMApiResultInfo resultInfo = imHelper.publishMessage(userId, taskInfo.getApplyUserId(), roomId, msg);
  722. if (!resultInfo.isSuccess()) {
  723. throw new ApiException(ErrorEnum.ERR_MESSAGE_ERROR, resultInfo.getErrorMessage());
  724. }
  725. RoleChangedMessage rcMsg = new RoleChangedMessage(userId);
  726. List<RoleChangedMessage.ChangedUser> changedUserList = new ArrayList<>();
  727. RoleChangedMessage.ChangedUser user = new RoleChangedMessage.ChangedUser(taskInfo.getApplyUserId(), RoleEnum.RoleStudent.getValue());
  728. if (!userInfoList.isEmpty()) {
  729. user.setUserName(userInfoList.get(0).getName());
  730. }
  731. changedUserList.add(user);
  732. rcMsg.setUsers(changedUserList);
  733. imHelper.publishMessage(userId, roomId, rcMsg, 1);
  734. return true;
  735. }
  736. @Override
  737. public Boolean rejectSpeech(String roomId, String ticket) throws ApiException, Exception {
  738. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  739. CheckUtils.checkArgument(roomDao.existsByRid(roomId), "room not exist");
  740. String token = SecurityUtils.getAuthenticationValue();
  741. SysUser authUser = sysUserFeignService.queryUserInfo();
  742. String userId = authUser.getId().toString();
  743. ScheduledTaskInfo taskInfo = scheduleManager.executeTask(ticket);
  744. log.info("rejectSpeech: task = {}", taskInfo);
  745. SpeechResultMessage msg = new SpeechResultMessage(SpeechResultMessage.Action_Reject);
  746. msg.setOpUserId(userId);
  747. msg.setOpUserName(authUser.getUsername());
  748. msg.setRole(RoleEnum.RoleStudent.getValue());
  749. IMApiResultInfo resultInfo = imHelper.publishMessage(userId, taskInfo.getApplyUserId(), roomId, msg);
  750. if (resultInfo.isSuccess()) {
  751. return true;
  752. } else {
  753. throw new ApiException(ErrorEnum.ERR_MESSAGE_ERROR, resultInfo.getErrorMessage());
  754. }
  755. }
  756. private void checkOverMax(String roomId, RoomMember targetUser, int targetRole) {
  757. if (RoleEnum.getEnumByValue(targetUser.getRole()).equals(RoleEnum.RoleAudience)) {
  758. int count = roomMemberDao.countByRidAndExcludeRole(roomId, RoleEnum.RoleAudience.getValue());
  759. if (count == roomProperties.getMaxCount()) {
  760. log.error("assign error: roomId = {}, userId = {}, role = {}", roomId, targetUser.getRid(), targetUser.getRole());
  761. throw new ApiException(ErrorEnum.ERR_OVER_MAX_COUNT);
  762. }
  763. } else if (targetRole > targetUser.getRole()) {
  764. throw new ApiException(ErrorEnum.ERR_DOWNGRADE_ROLE);
  765. }
  766. }
  767. @Override
  768. public Boolean transfer(String roomId, String userId) throws ApiException, Exception {
  769. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  770. CheckUtils.checkArgument(userId != null, "userId must't be null");
  771. CheckUtils.checkArgument(!userId.equals(userId), "can't set self role");
  772. log.info("transfer: roomId = {}, userId = {}", roomId, userId);
  773. List<RoomMember> roomMemberList = roomMemberDao.findByRidAndUid(roomId, userId);
  774. if (roomMemberList.size() == 0) {
  775. log.error("assistant transfer error: {} toUser = {}, opUser={}", roomId, userId, userId);
  776. throw new ApiException(ErrorEnum.ERR_USER_NOT_EXIST_IN_ROOM);
  777. }
  778. List<Room> roomList = roomDao.findByRid(roomId);
  779. if (roomList.size() == 0) {
  780. log.error("assistant transfer error: {} toUser = {}, opUser={}", roomId, userId, userId);
  781. throw new ApiException(ErrorEnum.ERR_ROOM_NOT_EXIST);
  782. }
  783. if (isUserDisplay(roomList.get(0), userId) || isUserDisplay(roomList.get(0), userId)) {
  784. updateDisplay(roomId, userId, "", 1);
  785. } else {
  786. log.info("don't update display: room={}", roomList.get(0));
  787. }
  788. roomMemberDao.updateRoleByRidAndUid(roomId, userId, RoleEnum.RoleStudent.getValue());
  789. roomMemberDao.updateRoleByRidAndUid(roomId, userId, RoleEnum.RoleAssistant.getValue());
  790. AssistantTransferMessage msg = new AssistantTransferMessage();
  791. msg.setOpUserId(userId);
  792. msg.setToUserId(userId);
  793. IMApiResultInfo resultInfo = imHelper.publishMessage(userId, roomId, msg, 1);
  794. if (resultInfo.isSuccess()) {
  795. return true;
  796. } else {
  797. throw new ApiException(ErrorEnum.ERR_MESSAGE_ERROR, resultInfo.getErrorMessage());
  798. }
  799. }
  800. @Override
  801. public Boolean inviteUpgradeRole(String roomId, String targetUserId, int targetRole) throws ApiException, Exception {
  802. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  803. CheckUtils.checkArgument(targetUserId != null, "userId must't be null");
  804. CheckUtils.checkArgument(roomMemberDao.existsByRidAndUid(roomId, targetUserId), "room member not exist");
  805. String token = SecurityUtils.getAuthenticationValue();
  806. SysUser authUser = sysUserFeignService.queryUserInfo();
  807. String userId = authUser.getId().toString();
  808. log.info("inviteUpgradeRole roomId = {}, targetUserId = {}, targetRole = {}", roomId, targetUserId, targetRole);
  809. List<RoomMember> targetUser = roomMemberDao.findByRidAndUid(roomId, targetUserId);
  810. if (targetUser.isEmpty()) {
  811. throw new ApiException(ErrorEnum.ERR_USER_NOT_EXIST_IN_ROOM);
  812. }
  813. checkOverMax(roomId, targetUser.get(0), targetRole);
  814. String ticket = IdentifierUtils.uuid();
  815. UpgradeRoleTaskInfo taskInfo = new UpgradeRoleTaskInfo();
  816. taskInfo.setTicket(ticket);
  817. taskInfo.setRoomId(roomId);
  818. taskInfo.setApplyUserId(userId);
  819. taskInfo.setTargetUserId(targetUserId);
  820. taskInfo.setRole(RoleEnum.getEnumByValue(targetRole));
  821. scheduleManager.addTask(taskInfo);
  822. UpgradeRoleMessage msg = new UpgradeRoleMessage(ActionEnum.Invite.ordinal());
  823. msg.setTicket(ticket);
  824. msg.setOpUserId(userId);
  825. msg.setOpUserName(authUser.getUsername());
  826. msg.setRole(targetRole);
  827. IMApiResultInfo resultInfo = imHelper.publishMessage(userId, targetUserId, roomId, msg);
  828. if (resultInfo.isSuccess()) {
  829. return true;
  830. } else {
  831. throw new ApiException(ErrorEnum.ERR_MESSAGE_ERROR, resultInfo.getErrorMessage());
  832. }
  833. }
  834. @Override
  835. public Boolean approveUpgradeRole(String roomId, String ticket) throws ApiException, Exception {
  836. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  837. CheckUtils.checkArgument(ticket != null, "ticket must't be null");
  838. CheckUtils.checkArgument(roomDao.existsByRid(roomId), "room not exist");
  839. String token = SecurityUtils.getAuthenticationValue();
  840. SysUser authUser = sysUserFeignService.queryUserInfo();
  841. String userId = authUser.getId().toString();
  842. UpgradeRoleTaskInfo taskInfo = (UpgradeRoleTaskInfo) scheduleManager.executeTask(ticket);
  843. log.info("approveUpgradeRole roomId = {}, task={}", roomId, taskInfo);
  844. List<RoomMember> targetUser = roomMemberDao.findByRidAndUid(roomId, userId);
  845. if (targetUser.isEmpty()) {
  846. throw new ApiException(ErrorEnum.ERR_USER_NOT_EXIST_IN_ROOM);
  847. }
  848. if (!taskInfo.getTargetUserId().equals(userId)) {
  849. throw new ApiException(ErrorEnum.ERR_APPLY_TICKET_INVALID);
  850. }
  851. checkOverMax(roomId, targetUser.get(0), taskInfo.getRole().getValue());
  852. roomMemberDao.updateRoleByRidAndUid(roomId, userId, taskInfo.getRole().getValue());
  853. UpgradeRoleMessage msg = new UpgradeRoleMessage(ActionEnum.Approve.ordinal());
  854. msg.setOpUserName(authUser.getUsername());
  855. msg.setOpUserId(userId);
  856. msg.setRole(taskInfo.getRole().getValue());
  857. IMApiResultInfo resultInfo = imHelper.publishMessage(userId, taskInfo.getApplyUserId(), roomId, msg);
  858. if (!resultInfo.isSuccess()) {
  859. throw new ApiException(ErrorEnum.ERR_MESSAGE_ERROR, resultInfo.getErrorMessage());
  860. }
  861. RoleChangedMessage rcMsg = new RoleChangedMessage(userId);
  862. List<RoleChangedMessage.ChangedUser> changedUserList = new ArrayList<>();
  863. RoleChangedMessage.ChangedUser user = new RoleChangedMessage.ChangedUser(userId, taskInfo.getRole().getValue());
  864. user.setUserName(authUser.getUsername());
  865. changedUserList.add(user);
  866. rcMsg.setUsers(changedUserList);
  867. imHelper.publishMessage(userId, roomId, rcMsg, 1);
  868. return true;
  869. }
  870. @Override
  871. public Boolean rejectUpgradeRole(String roomId, String ticket) throws ApiException, Exception {
  872. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  873. CheckUtils.checkArgument(ticket != null, "ticket must't be null");
  874. CheckUtils.checkArgument(roomDao.existsByRid(roomId), "room not exist");
  875. String token = SecurityUtils.getAuthenticationValue();
  876. SysUser authUser = sysUserFeignService.queryUserInfo();
  877. String userId = authUser.getId().toString();
  878. UpgradeRoleTaskInfo taskInfo = (UpgradeRoleTaskInfo) scheduleManager.executeTask(ticket);
  879. UpgradeRoleMessage msg = new UpgradeRoleMessage(ActionEnum.Reject.ordinal());
  880. msg.setOpUserName(authUser.getUsername());
  881. msg.setOpUserId(userId);
  882. msg.setRole(taskInfo.getRole().getValue());
  883. IMApiResultInfo resultInfo = imHelper.publishMessage(userId, taskInfo.getApplyUserId(), roomId, msg);
  884. if (resultInfo.isSuccess()) {
  885. return true;
  886. } else {
  887. throw new ApiException(ErrorEnum.ERR_MESSAGE_ERROR, resultInfo.getErrorMessage());
  888. }
  889. }
  890. @Override
  891. public Boolean changeRole(String roomId, String targetUserId, int targetRole) throws ApiException, Exception {
  892. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  893. CheckUtils.checkArgument(targetUserId != null, "userId must't be null");
  894. CheckUtils.checkArgument(roomDao.existsByRid(roomId), "room not exist");
  895. CheckUtils.checkArgument(RoleEnum.getEnumByValue(targetRole).equals(RoleEnum.RoleTeacher), "only set to teacher");
  896. CheckUtils.checkArgument(roomMemberDao.existsByRidAndUid(roomId, targetUserId), "room member not exist");
  897. String token = SecurityUtils.getAuthenticationValue();
  898. SysUser authUser = sysUserFeignService.queryUserInfo();
  899. String userId = authUser.getId().toString();
  900. List<RoomMember> targetUser = roomMemberDao.findByRidAndUid(roomId, targetUserId);
  901. if (targetUser.isEmpty()) {
  902. throw new ApiException(ErrorEnum.ERR_USER_NOT_EXIST_IN_ROOM);
  903. } else {
  904. if (!RoleEnum.getEnumByValue(targetUser.get(0).getRole()).equals(RoleEnum.RoleStudent)) {
  905. log.error("change role error: targetUserId={}, targetRole = {}", targetUser, RoleEnum.getEnumByValue(targetRole));
  906. throw new ApiException(ErrorEnum.ERR_CHANGE_ROLE);
  907. }
  908. }
  909. log.info("changeRole: roomId={}, targetUserId={}", roomId, targetUserId);
  910. List<RoleChangedMessage.ChangedUser> changedUserList = new ArrayList<>();
  911. RoleChangedMessage msg = new RoleChangedMessage(userId);
  912. List<RoomMember> teachers = roomMemberDao.findByRidAndRole(roomId, RoleEnum.RoleTeacher.getValue());
  913. if (!teachers.isEmpty()) {
  914. roomMemberDao.updateRoleByRidAndUid(roomId, teachers.get(0).getUid(), RoleEnum.RoleStudent.getValue());
  915. RoleChangedMessage.ChangedUser user = new RoleChangedMessage.ChangedUser(teachers.get(0).getUid(), RoleEnum.RoleStudent.getValue());
  916. List<UserInfo> userInfoList = userDao.findByUid(teachers.get(0).getUid());
  917. if (!userInfoList.isEmpty()) {
  918. user.setUserName(userInfoList.get(0).getName());
  919. }
  920. changedUserList.add(user);
  921. } else {
  922. log.info("change directly cause no teacher exist in room, roomId={}", roomId);
  923. }
  924. roomMemberDao.updateRoleByRidAndUid(roomId, targetUserId, targetRole);
  925. RoleChangedMessage.ChangedUser user = new RoleChangedMessage.ChangedUser(targetUserId, targetRole);
  926. List<UserInfo> userInfoList = userDao.findByUid(targetUserId);
  927. if (!userInfoList.isEmpty()) {
  928. user.setUserName(userInfoList.get(0).getName());
  929. }
  930. changedUserList.add(user);
  931. msg.setUsers(changedUserList);
  932. imHelper.publishMessage(userId, roomId, msg, 1);
  933. String display = "display://type=1?userId=" + targetUserId + "?uri=";
  934. DisplayMessage displayMessage = new DisplayMessage(display);
  935. roomDao.updateDisplayByRid(roomId, display);
  936. imHelper.publishMessage(userId, roomId, displayMessage, 1);
  937. log.info("changeRole, display changed: roomId={}, {}, targetUserId={}", roomId, display, targetUserId);
  938. return true;
  939. }
  940. @Override
  941. public Boolean memberOnlineStatus(List<ReqMemberOnlineStatus> statusList, String nonce, String timestamp, String signature) throws ApiException, Exception {
  942. String sign = imProperties.getSecret() + nonce + timestamp;
  943. String signSHA1 = CodeUtil.hexSHA1(sign);
  944. if (!signSHA1.equals(signature)) {
  945. log.info("memberOnlineStatus signature error");
  946. return true;
  947. }
  948. for (ReqMemberOnlineStatus status : statusList) {
  949. int s = Integer.parseInt(status.getStatus());
  950. String userId = status.getUserId();
  951. log.info("memberOnlineStatus, userId={}, status={}", userId, status);
  952. //1:offline 离线; 0: online 在线
  953. if (s == 1) {
  954. List<RoomMember> members = roomMemberDao.findByUid(userId);
  955. if (!members.isEmpty()) {
  956. scheduleManager.userIMOffline(userId);
  957. }
  958. } else if (s == 0) {
  959. scheduleManager.userIMOnline(userId);
  960. }
  961. }
  962. return true;
  963. }
  964. @Override
  965. public void userIMOfflineKick(String userId) {
  966. List<RoomMember> members = roomMemberDao.findByUid(userId);
  967. for (RoomMember member : members) {
  968. int userRole = member.getRole();
  969. log.info("userIMOfflineKick: roomId={}, {}, role={}", member.getRid(), userId, RoleEnum.getEnumByValue(userRole));
  970. try {
  971. if (userRole == RoleEnum.RoleTeacher.getValue() || userRole == RoleEnum.RoleAssistant.getValue()) {
  972. List<Room> rooms = roomDao.findByRid(member.getRid());
  973. if (rooms.isEmpty()) {
  974. break;
  975. }
  976. if (isUserDisplay(rooms.get(0), member.getUid())) {
  977. updateDisplay(member.getRid(), member.getUid(), "", 0);
  978. log.info("memberOnlineStatus offline: roomId={}, {}", member.getRid(), member.getUid());
  979. }
  980. }
  981. if (roomMemberDao.countByRid(member.getRid()) == 1) {
  982. IMApiResultInfo apiResultInfo = null;
  983. apiResultInfo = imHelper.dismiss(member.getUid(), member.getRid());
  984. if (apiResultInfo.getCode() == 200) {
  985. roomMemberDao.deleteUserByRidAndUid(member.getRid(), member.getUid());
  986. roomDao.deleteByRid(member.getRid());
  987. deleteWhiteboardByUser(member.getRid(), member.getUid());
  988. log.info("dismiss the room: {}", member.getRid());
  989. } else {
  990. log.error("{} exit {} room error: {}", member.getUid(), member.getRid(), apiResultInfo.getErrorMessage());
  991. }
  992. } else {
  993. IMApiResultInfo apiResultInfo = null;
  994. apiResultInfo = imHelper.quit(new String[]{member.getUid()}, member.getRid());
  995. if (apiResultInfo.isSuccess()) {
  996. roomMemberDao.deleteUserByRidAndUid(member.getRid(), member.getUid());
  997. MemberChangedMessage msg = new MemberChangedMessage(MemberChangedMessage.Action_Leave, member.getUid(), userRole);
  998. msg.setUserName(member.getName());
  999. imHelper.publishMessage(member.getUid(), member.getRid(), msg);
  1000. imHelper.quit(new String[]{member.getUid()}, member.getRid());
  1001. log.info("quit group: roomId={}, {}", member.getRid(), member.getUid());
  1002. } else {
  1003. log.error("{} exit {} room error: {}", member.getUid(), member.getRid(), apiResultInfo.getErrorMessage());
  1004. }
  1005. }
  1006. userDao.deleteByUid(member.getUid());
  1007. } catch (Exception e) {
  1008. log.error("userIMOfflineKick error: userId={}", userId);
  1009. }
  1010. }
  1011. }
  1012. @Override
  1013. public boolean statusSync(String roomId,String userId) throws Exception {
  1014. List<RoomMember> byRidAndUid = roomMemberDao.findByRidAndUid(roomId, userId);
  1015. if(byRidAndUid.size() > 0){
  1016. SysUser sysUser = sysUserFeignService.queryUserById(Integer.parseInt(userId));
  1017. Teacher teacher = teacherDao.get(sysUser.getId());
  1018. if(teacher != null){
  1019. try {
  1020. teacherAttendanceService.addTeacherAttendanceRecord(Integer.parseInt(roomId.substring(4)),sysUser.getId(), SignStatusEnum.SIGN_OUT,true);
  1021. }catch (Exception e){
  1022. e.printStackTrace();
  1023. }
  1024. }
  1025. List<Room> roomList = roomDao.findByRid(roomId);
  1026. if (roomList.size() == 0) {
  1027. log.error("room : {} not exist ", roomId);
  1028. throw new ApiException(ErrorEnum.ERR_ROOM_NOT_EXIST);
  1029. }
  1030. List<RoomMember> roomMemberList = roomMemberDao.findByRidAndUid(roomId, userId);
  1031. if (roomMemberList.size() == 0) {
  1032. log.error("{} not exist in room: {}", userId, roomId);
  1033. throw new ApiException(ErrorEnum.ERR_USER_NOT_EXIST_IN_ROOM);
  1034. }
  1035. int userRole = roomMemberList.get(0).getRole();
  1036. log.info("leaveRoom: roomId={}, role={}", roomId, RoleEnum.getEnumByValue(userRole));
  1037. if (userRole == RoleEnum.RoleTeacher.getValue() || userRole == RoleEnum.RoleAssistant.getValue()) {
  1038. if (isUserDisplay(roomList.get(0), userId)) {
  1039. updateDisplay(roomId, userId, "", 0);
  1040. log.info("clear display cause speaker leave: roomId={}", roomId);
  1041. } else {
  1042. log.info("don't update current display: room={}, role={}", roomList.get(0), RoleEnum.getEnumByValue(userRole));
  1043. }
  1044. } else {
  1045. log.info("don't update current display: room={}, userRole={}", roomList.get(0), RoleEnum.getEnumByValue(userRole));
  1046. }
  1047. if (roomMemberDao.countByRid(roomId) == 1) {
  1048. IMApiResultInfo apiResultInfo = null;
  1049. try {
  1050. apiResultInfo = imHelper.dismiss(userId, roomId);
  1051. if (apiResultInfo.getCode() == 200) {
  1052. roomMemberDao.deleteUserByRidAndUid(roomId, userId);
  1053. roomDao.deleteByRid(roomId);
  1054. deleteWhiteboardByUser(roomId, userId);
  1055. log.info("dismiss the room: {}", roomId);
  1056. } else {
  1057. log.error("{} exit {} room error: {}", userId, roomId, apiResultInfo.getErrorMessage());
  1058. throw new ApiException(ErrorEnum.ERR_EXIT_ROOM_ERROR, apiResultInfo.getErrorMessage());
  1059. }
  1060. } catch (Exception e) {
  1061. log.error("{} exit {} room error: {}", userId, roomId, e.getMessage());
  1062. throw new ApiException(ErrorEnum.ERR_EXIT_ROOM_ERROR, e.getMessage());
  1063. }
  1064. } else {
  1065. IMApiResultInfo apiResultInfo = null;
  1066. try {
  1067. apiResultInfo = imHelper.quit(new String[]{userId}, roomId);
  1068. if (apiResultInfo.isSuccess()) {
  1069. roomMemberDao.deleteUserByRidAndUid(roomId, userId);
  1070. MemberChangedMessage msg = new MemberChangedMessage(MemberChangedMessage.Action_Leave, userId, userRole);
  1071. msg.setUserName(sysUser.getUsername());
  1072. imHelper.publishMessage(userId, roomId, msg);
  1073. imHelper.quit(new String[]{userId}, roomId);
  1074. log.info("quit group: roomId={}", roomId);
  1075. } else {
  1076. throw new ApiException(ErrorEnum.ERR_EXIT_ROOM_ERROR, apiResultInfo.getErrorMessage());
  1077. }
  1078. } catch (Exception e) {
  1079. log.error("leave room error: roomId={}, {}", roomId, e.getMessage());
  1080. throw new ApiException(ErrorEnum.ERR_EXIT_ROOM_ERROR);
  1081. }
  1082. }
  1083. userDao.deleteByUid(userId);
  1084. return true;
  1085. }
  1086. return true;
  1087. }
  1088. private void updateDisplay(String roomId, String senderId, String display, Integer isIncludeSender) throws ApiException, Exception {
  1089. roomDao.updateDisplayByRid(roomId, display);
  1090. DisplayMessage displayMessage = new DisplayMessage(display);
  1091. imHelper.publishMessage(senderId, roomId, displayMessage, isIncludeSender);
  1092. }
  1093. private boolean isTeacherDisplay(Room room, String userId) {
  1094. return !room.getDisplay().isEmpty() && room.getDisplay().contains("userId=" + userId);
  1095. }
  1096. private boolean isTeacherDisplayWhiteboard(Room room, String userId) {
  1097. return !room.getDisplay().isEmpty() && room.getDisplay().contains("userId=" + userId) && room.getDisplay().contains("type=2");
  1098. }
  1099. private boolean isAssistantDisplay(Room room, String userId) {
  1100. return !room.getDisplay().isEmpty() && room.getDisplay().contains("userId=" + userId);
  1101. }
  1102. private boolean isUserDisplay(Room room, String userId) {
  1103. boolean result = false;
  1104. if (!room.getDisplay().isEmpty() && room.getDisplay().contains("userId=" + userId)) {
  1105. if (room.getDisplay().contains("type=0") || room.getDisplay().contains("type=1") || room.getDisplay().contains("type=3")) {
  1106. result = true;
  1107. }
  1108. }
  1109. return result;
  1110. }
  1111. }