wangliang hace 4 años
padre
commit
dd548cfaed

+ 4 - 1
themis-backend/src/main/java/com/qmth/themis/backend/api/TBUserController.java

@@ -115,7 +115,10 @@ public class TBUserController {
             throw new BusinessException(ExceptionResultEnum.ORG_ENABLE);
         }
         QueryWrapper<TBUser> wrapper = new QueryWrapper<>();
-        wrapper.lambda().eq(TBUser::getLoginName, loginName).eq(TBUser::getOrgId, tbOrg.getId());
+        wrapper.lambda().eq(TBUser::getLoginName, loginName);
+        if (!loginName.contains(SystemConstant.SYSTEM_ACCOUNT)) {
+            wrapper.lambda().eq(TBUser::getOrgId, tbOrg.getId());
+        }
         TBUser user = tbUserService.getOne(wrapper);
         //用户不存在
         if (Objects.isNull(user)) {

+ 61 - 9
themis-backend/src/main/java/com/qmth/themis/backend/api/TIeInvigilateCallMobileController.java

@@ -8,22 +8,25 @@ import com.qmth.themis.business.annotation.ApiJsonObject;
 import com.qmth.themis.business.annotation.ApiJsonProperty;
 import com.qmth.themis.business.bean.mobile.MobileAuthorizationMonitorBean;
 import com.qmth.themis.business.cache.ExamRecordCacheUtil;
+import com.qmth.themis.business.cache.bean.ExamCacheBean;
 import com.qmth.themis.business.config.SystemConfig;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dto.AuthDto;
 import com.qmth.themis.business.dto.MqDto;
 import com.qmth.themis.business.dto.response.TIeExamInvigilateCallDto;
-import com.qmth.themis.business.entity.TBSession;
-import com.qmth.themis.business.entity.TBUser;
-import com.qmth.themis.business.entity.TIeExamInvigilateCall;
-import com.qmth.themis.business.entity.TIeExamInvigilateCallLog;
+import com.qmth.themis.business.entity.*;
 import com.qmth.themis.business.enums.*;
 import com.qmth.themis.business.service.MqDtoService;
+import com.qmth.themis.business.service.TEExamService;
 import com.qmth.themis.business.service.TIeExamInvigilateCallService;
+import com.qmth.themis.business.service.TOeExamRecordService;
 import com.qmth.themis.business.util.RedisUtil;
 import com.qmth.themis.business.util.ServletUtil;
+import com.qmth.themis.business.util.SessionUtil;
 import com.qmth.themis.business.util.TencentYunUtil;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
+import com.qmth.themis.common.enums.Platform;
+import com.qmth.themis.common.enums.Source;
 import com.qmth.themis.common.exception.BusinessException;
 import com.qmth.themis.common.util.Result;
 import com.qmth.themis.common.util.ResultUtil;
@@ -35,10 +38,8 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import java.io.File;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
+import java.security.NoSuchAlgorithmException;
+import java.util.*;
 
 /**
  * @Description: mobile监考监控通话信息 前端控制器
@@ -71,6 +72,12 @@ public class TIeInvigilateCallMobileController {
     @Resource
     DictionaryConfig dictionaryConfig;
 
+    @Resource
+    TEExamService teExamService;
+
+    @Resource
+    TOeExamRecordService tOeExamRecordService;
+
     @ApiOperation(value = "监考监控通话查询接口")
     @RequestMapping(value = "/call/list", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "监考监控信息", response = TIeExamInvigilateCallDto.class)})
@@ -195,12 +202,56 @@ public class TIeInvigilateCallMobileController {
     @ApiOperation(value = "监考获取monitorKey接口")
     @RequestMapping(value = "/getMonitorKey", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "获取监考monitorKey", response = MobileAuthorizationMonitorBean.class)})
-    public Result getMonitorKey(@ApiParam(value = "考试记录id", required = true) @RequestParam Long recordId) {
+    public Result getMonitorKey(@ApiParam(value = "考试记录id", required = true) @RequestParam Long recordId) throws NoSuchAlgorithmException {
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         TBSession tbSession = (TBSession) ServletUtil.getRequestSession();
         String monitorKey = ExamRecordCacheUtil.getMonitorKey(recordId);
         AuthDto authDto = (AuthDto) redisUtil.get(SystemConstant.userOauth + "::" + tbUser.getId());
         String monitorUserId = null;
+        String sourceUserId = null;
+        Long examId = ExamRecordCacheUtil.getExamId(recordId);
+        if (Objects.isNull(examId)) {
+            TOeExamRecord tOeExamRecord = tOeExamRecordService.getById(recordId);
+            examId = tOeExamRecord.getExamId();
+        }
+        ExamCacheBean ec = teExamService.getExamCacheBean(examId);//考试缓存
+        ec.getMonitorVideoSource();
+        List<String> monitorVideoSourceList = null;
+        if (Objects.nonNull(ec.getMonitorVideoSource()) && !Objects.equals(ec.getMonitorVideoSource().toString().trim().replaceAll(" ", ""), "")) {
+            monitorVideoSourceList = Arrays.asList(ec.getMonitorVideoSource().trim().toUpperCase().replaceAll(" ", "").split(","));
+        }
+        //加入monitorAudioEnable逻辑
+        if (Objects.nonNull(monitorVideoSourceList)) {
+            if (monitorVideoSourceList.size() == 4 || (ec.getMonitorVideoSource().toUpperCase().contains(MonitorVideoSourceEnum.CLIENT_SCREEN.name()) || ec.getMonitorVideoSource().toUpperCase().contains(MonitorVideoSourceEnum.CLIENT_CAMERA.name()))) {
+                for (Source s : Source.values()) {
+                    String sessionId = SessionUtil.digest(tbUser.getId(), Math.abs(authDto.getRoleCodes().toString().hashCode()), s.name());
+                    TBSession tbSessionClient = (TBSession) redisUtil.getUserSession(sessionId);
+                    if (Objects.nonNull(tbSessionClient) && tbSessionClient.getExpireTime() > System.currentTimeMillis() && (Objects.equals(tbSessionClient.getSource(), Source.OE_CLIENT.name()) || Objects.equals(tbSessionClient.getSource(), Source.ADMIN_CLIENT.name())) && (Objects.equals(tbSessionClient.getPlatform(), Platform.WIN.name()) || Objects.equals(tbSessionClient.getPlatform(), Platform.MAC.name()))) {
+                        if (Objects.nonNull(ExamRecordCacheUtil.getMonitorStatus(recordId, MonitorVideoSourceEnum.CLIENT_CAMERA.name()))) {
+                            sourceUserId = "s_" + tbSessionClient.getId();
+                            break;
+                        } else if (Objects.nonNull(ExamRecordCacheUtil.getMonitorStatus(recordId, MonitorVideoSourceEnum.CLIENT_SCREEN.name()))) {
+                            sourceUserId = "s_" + tbSessionClient.getId();
+                            break;
+                        }
+                    }
+                }
+            } else {
+                for (Source s : Source.values()) {
+                    String sessionId = SessionUtil.digest(tbUser.getId(), Math.abs(authDto.getRoleCodes().toString().hashCode()), s.name());
+                    TBSession tbSessionPhone = (TBSession) redisUtil.getUserSession(sessionId);
+                    if (Objects.nonNull(tbSessionPhone) && tbSessionPhone.getExpireTime() > System.currentTimeMillis() && (Objects.equals(tbSessionPhone.getSource(), Source.MOBILE_FIRST.name()) || Objects.equals(tbSessionPhone.getSource(), Source.MOBILE_SECOND.name())) && (Objects.equals(tbSessionPhone.getPlatform(), Platform.ANDROID.name()) || Objects.equals(tbSessionPhone.getPlatform(), Platform.IOS.name()))) {
+                        if (Objects.nonNull(ExamRecordCacheUtil.getMonitorStatus(recordId, MonitorVideoSourceEnum.MOBILE_FIRST.name()))) {
+                            sourceUserId = "s_" + tbSessionPhone.getId();
+                            break;
+                        } else if (Objects.nonNull(ExamRecordCacheUtil.getMonitorStatus(recordId, MonitorVideoSourceEnum.MOBILE_SECOND.name()))) {
+                            sourceUserId = "s_" + tbSessionPhone.getId();
+                            break;
+                        }
+                    }
+                }
+            }
+        }
         if (Objects.nonNull(authDto) && authDto.toString().contains(RoleEnum.STUDENT.name())) {
             monitorUserId = "s_" + tbSession.getId();
         } else {
@@ -210,6 +261,7 @@ public class TIeInvigilateCallMobileController {
         Map<String, Object> map = new HashMap<>();
         map.put("monitorKey", monitorKey);
         map.put("monitorUserId", monitorUserId);
+        map.put("sourceUserId", sourceUserId);
         map.put("monitorUserSig", monitorUserSig);
         map.put("appId", dictionaryConfig.tencentYunDomain().getAppId());
         map.put("key", dictionaryConfig.tencentYunDomain().getKey());

+ 1 - 0
themis-business/src/main/java/com/qmth/themis/business/constant/SystemConstant.java

@@ -52,6 +52,7 @@ public class SystemConstant {
     public static final String THIRD_ALL_PATH = "/api/open/**";
     public static final String ACCOUNT = "account";
     public static final String STUDENT_ACCOUNT = "student";
+    public static final String SYSTEM_ACCOUNT = "sysadmin";
     public static final String COUNT = "count";
     public static final String ERROR = "/error";
     public static final String MQ_TOPIC_BUFFER_LIST = "mq:topic:buffer:list";