Bladeren bron

监考端接口

wangliang 4 jaren geleden
bovenliggende
commit
c30f668a91

+ 12 - 0
themis-business/src/main/java/com/qmth/themis/business/cache/MobileAuthCacheUtil.java

@@ -23,6 +23,10 @@ public class MobileAuthCacheUtil {
         redisUtil.set(RedisKeyHelper.mobileAuthCacheKey(mode, code), "userType", userType);
     }
 
+    public static void setSource(MobileModeEnum mode, String code, Source source) {
+        redisUtil.set(RedisKeyHelper.mobileAuthCacheKey(mode, code), "source", source);
+    }
+
     public static void setMode(MobileModeEnum mode, String code) {
         redisUtil.set(RedisKeyHelper.mobileAuthCacheKey(mode, code), "mode", mode);
     }
@@ -94,4 +98,12 @@ public class MobileAuthCacheUtil {
     public static Boolean getMonitorAudioEnable(MobileModeEnum mode, String code) {
         return (Boolean) redisUtil.get(RedisKeyHelper.mobileAuthCacheKey(mode, code), "monitorAudioEnable");
     }
+
+    public static Source getSource(MobileModeEnum mode, String code) {
+        return (Source) redisUtil.get(RedisKeyHelper.mobileAuthCacheKey(mode, code), "source");
+    }
+
+    public static String getSessionId(MobileModeEnum mode, String code) {
+        return (String) redisUtil.get(RedisKeyHelper.mobileAuthCacheKey(mode, code), "sessionId");
+    }
 }

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

@@ -89,6 +89,9 @@ public class SystemConstant {
     public static final int WXAPP_SESSION_EXPIRE = 30;//过期时间30天
     public static final int IOS_SESSION_EXPIRE = 30;//过期时间30天
     public static final int ANDROID_SESSION_EXPIRE = 30;//过期时间30天
+    //二维码过期时间(秒)
+//    private final static int qrExpireTime = 120;
+    public final static Long QR_EXPIRE_TIME = 86400L;
     /**
      * redis分布式锁
      */

+ 3 - 1
themis-business/src/main/java/com/qmth/themis/business/service/TEQrcodeService.java

@@ -5,9 +5,11 @@ import com.qmth.themis.business.bean.exam.QrResponseBean;
 import com.qmth.themis.business.bean.exam.QrUploadParamBean;
 import com.qmth.themis.business.enums.MobileModeEnum;
 
+import java.security.NoSuchAlgorithmException;
+
 public interface TEQrcodeService {
 
-	QrResponseBean mobileMonitor(QrMobileMonitorParamBean param);
+	QrResponseBean mobileMonitor(QrMobileMonitorParamBean param) throws NoSuchAlgorithmException;
 
 	QrResponseBean upload(QrUploadParamBean param,MobileModeEnum mode);
 

+ 29 - 21
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEMobileServiceImpl.java

@@ -12,11 +12,9 @@ import com.qmth.themis.business.cache.bean.ExamStudentAnswerCacheBean;
 import com.qmth.themis.business.cache.bean.ExamStudentCacheBean;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dto.AuthDto;
-import com.qmth.themis.business.dto.cache.TEStudentCacheDto;
 import com.qmth.themis.business.entity.TBSession;
-import com.qmth.themis.business.enums.ExamRecordStatusEnum;
-import com.qmth.themis.business.enums.MobileModeEnum;
-import com.qmth.themis.business.enums.RoleEnum;
+import com.qmth.themis.business.enums.*;
+import com.qmth.themis.business.service.MqDtoService;
 import com.qmth.themis.business.service.TEExamStudentService;
 import com.qmth.themis.business.service.TEMobileService;
 import com.qmth.themis.business.util.RedisUtil;
@@ -49,6 +47,9 @@ public class TEMobileServiceImpl implements TEMobileService {
     @Resource
     TencentYunUtil tencentYunUtil;
 
+    @Resource
+    MqDtoService mqDtoService;
+
     @Override
     public MobileAuthorizationBean authorization(MobileAuthorizationParamBean param) throws NoSuchAlgorithmException {
         MobileModeEnum mode = MobileModeEnum.valueOf(param.getMode().toUpperCase());
@@ -68,9 +69,6 @@ public class TEMobileServiceImpl implements TEMobileService {
             throw new BusinessException("未找到考生");
         }
         ExamRecordStatusEnum sta = ExamRecordCacheUtil.getStatus(ret.getRecordId());
-//        if (ExamRecordStatusEnum.FIRST_PREPARE.equals(sta)) {
-//            throw new BusinessException("该考试未开始答题");
-//        }
         if (ExamRecordStatusEnum.FINISHED.equals(sta) || ExamRecordStatusEnum.PERSISTED.equals(sta)) {
             throw new BusinessException("该考试已结束");
         }
@@ -79,20 +77,14 @@ public class TEMobileServiceImpl implements TEMobileService {
         AuthDto authDto = (AuthDto) redisUtil.get(SystemConstant.studentOauth + "::" + es.getStudentId());
         // 生成token
         String token = RandomStringUtils.randomAlphanumeric(32);
-        TEStudentCacheDto teStudentCacheDto = (TEStudentCacheDto) redisUtil.getStudent(es.getStudentId());
         String source = null;
-        if (Objects.equals(platform.name(), Platform.WIN.name())
-                || Objects.equals(platform.name(), Platform.MAC.name())) {
-            source = platform.getSource().split(",")[1];
-        } else if (Objects.equals(platform.name(), Platform.WXAPP.name())
-                || Objects.equals(platform.name(), Platform.WEB.name())) {
-            source = platform.getSource();
-        } else if (Objects.equals(platform.name(), Platform.IOS.name())
-                || Objects.equals(platform.name(), Platform.ANDROID.name())) {
-            source = platform.getSource().split(",")[2];
+        if (mode.equals(MobileModeEnum.MOBILE_MONITOR)) {
+            Source sourceEnum = MobileAuthCacheUtil.getSource(mode, code);
+            source = sourceEnum.name();
+        } else if (mode.equals(MobileModeEnum.PHOTO_UPLOAD) || mode.equals(MobileModeEnum.AUDIO_UPLOAD)) {
+            source = Source.OE_ANSWER.name();
         }
-        String sessionId = SessionUtil.digest(teStudentCacheDto.getIdentity(),
-                Math.abs(authDto.getRoleCodes().toString().hashCode()), source);
+        String sessionId = MobileAuthCacheUtil.getSessionId(mode, code);
         Map<String, Object> expireMap = SystemConstant.getExpireTime(platform);
         Date expire = (Date) expireMap.get("date");
         Long redisExpire = Long.parseLong(String.valueOf(expireMap.get("redisExpire")));
@@ -103,13 +95,17 @@ public class TEMobileServiceImpl implements TEMobileService {
         ret.setSessionId(sessionId);
         ret.setTime(System.currentTimeMillis());
         ret.setMode(mode);
+        //mq发送消息start
+        mqDtoService.assembleSendOneWayMsg(MqTopicEnum.themisTopic.getCode(), platform.name(), tbSession, platform.name(), tbSession.getId(), es.getIdentity());
+        mqDtoService.assembleSendOneWayMsg(MqTopicEnum.themisTopic.getCode(), MqTagEnum.STUDENT.name(), SystemOperationEnum.LOGIN, MqTagEnum.STUDENT.name(), es.getStudentId(), es.getIdentity());
+        //mq发送消息end
         //测试
         String test = SignatureInfo.build(SignatureType.TOKEN, sessionId, token);
         ret.setAccessToken(test);
         return ret;
     }
 
-    private MobileAuthorizationBean monitorAuthorization(MobileModeEnum mode, String code) {
+    private MobileAuthorizationBean monitorAuthorization(MobileModeEnum mode, String code) throws NoSuchAlgorithmException {
         Long recordId = MobileAuthCacheUtil.getRecordId(mode, code);
         String monitorKey = MobileAuthCacheUtil.getMonitorKey(mode, code);
         Source monitorVideoSource = MobileAuthCacheUtil.getMonitorVideoSource(mode, code);
@@ -123,8 +119,20 @@ public class TEMobileServiceImpl implements TEMobileService {
         ret.setMonitorVideoSource(monitorVideoSource);
         ret.setMonitorAudioEnable(monitorAudioEnable);
         Map<String, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.mobileAuthCacheKey(mode, code));
+        ExamStudentCacheBean es = examStudentService
+                .getExamStudentCacheBean(ExamRecordCacheUtil.getExamStudentId(ret.getRecordId()));
+        String source = null;
+        if (mode.equals(MobileModeEnum.MOBILE_MONITOR)) {
+            Source sourceEnum = MobileAuthCacheUtil.getSource(mode, code);
+            source = sourceEnum.name();
+        } else if (mode.equals(MobileModeEnum.PHOTO_UPLOAD) || mode.equals(MobileModeEnum.AUDIO_UPLOAD)) {
+            source = Source.OE_ANSWER.name();
+        }
         String userType = String.valueOf(objectMap.get("userType"));
-        String sessionId = String.valueOf(objectMap.get("sessionId"));
+        AuthDto authDto = (AuthDto) redisUtil.get(SystemConstant.studentOauth + "::" + es.getStudentId());
+        String sessionId = SessionUtil.digest(es.getIdentity(), Math.abs(authDto.getRoleCodes().toString().hashCode()), source);
+        objectMap.put("sessionId", sessionId);
+        redisUtil.setForHash(RedisKeyHelper.mobileAuthCacheKey(mode, code), objectMap);
         if (Objects.nonNull(userType) && userType.contains(RoleEnum.STUDENT.name())) {
             ret.setMonitorUserId("s_" + sessionId);
         } else {

+ 14 - 14
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEQrcodeServiceImpl.java

@@ -8,28 +8,27 @@ import com.qmth.themis.business.cache.MobileAuthCacheUtil;
 import com.qmth.themis.business.cache.RedisKeyHelper;
 import com.qmth.themis.business.cache.bean.ExamCacheBean;
 import com.qmth.themis.business.config.SystemConfig;
-import com.qmth.themis.business.entity.TBSession;
+import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.enums.MobileModeEnum;
 import com.qmth.themis.business.enums.MonitorVideoSourceEnum;
+import com.qmth.themis.business.enums.RoleEnum;
 import com.qmth.themis.business.service.TEExamService;
 import com.qmth.themis.business.service.TEQrcodeService;
 import com.qmth.themis.business.util.RedisUtil;
-import com.qmth.themis.business.util.ServletUtil;
 import com.qmth.themis.common.enums.Source;
 import org.apache.commons.lang3.time.DateUtils;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.security.NoSuchAlgorithmException;
 import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
 import java.util.UUID;
 
 @Service
 public class TEQrcodeServiceImpl implements TEQrcodeService {
 
-    //二维码过期时间(秒)
-//    private final static int qrExpireTime = 120;
-    private final static int qrExpireTime = 60 * 60 * 24;
-
     @Resource
     TEExamService examService;
     @Resource
@@ -38,21 +37,22 @@ public class TEQrcodeServiceImpl implements TEQrcodeService {
     SystemConfig systemConfig;
 
     @Override
-    public QrResponseBean mobileMonitor(QrMobileMonitorParamBean param) {
-        TBSession tbSession = (TBSession) ServletUtil.getRequestSession();
+    public QrResponseBean mobileMonitor(QrMobileMonitorParamBean param) throws NoSuchAlgorithmException {
         String domain = systemConfig.getProperty("wxapp.upload.url");
         String code = uuid();
         MobileModeEnum mode = MobileModeEnum.MOBILE_MONITOR;
-        MobileAuthCacheUtil.setSessionId(mode, code, tbSession.getId());
-        MobileAuthCacheUtil.setUserType(mode, code, tbSession.getType());
+        Set<String> roleCodes = new HashSet<>();
+        roleCodes.add(RoleEnum.STUDENT.name());
+        MobileAuthCacheUtil.setUserType(mode, code, roleCodes.toString());
+        MobileAuthCacheUtil.setSource(mode, code, param.getSource());
         MobileAuthCacheUtil.setMode(mode, code);
         MobileAuthCacheUtil.setCode(mode, code);
         MobileAuthCacheUtil.setRecordId(mode, code, param.getRecordId());
         MobileAuthCacheUtil.setMonitorKey(mode, code, ExamRecordCacheUtil.getMonitorKey(param.getRecordId()));
         MobileAuthCacheUtil.setMonitorVideoSource(mode, code, param.getSource());
         MobileAuthCacheUtil.setMonitorAudioEnable(mode, code, getMonitorAudioEnable(param));
-        Long expireTime = DateUtils.addSeconds(new Date(), qrExpireTime).getTime();
-        redisUtil.expire(RedisKeyHelper.mobileAuthCacheKey(mode, code), qrExpireTime);
+        Long expireTime = DateUtils.addSeconds(new Date(), SystemConstant.QR_EXPIRE_TIME.intValue()).getTime();
+        redisUtil.expire(RedisKeyHelper.mobileAuthCacheKey(mode, code), SystemConstant.QR_EXPIRE_TIME.intValue());
         QrResponseBean ret = new QrResponseBean();
         ret.setExpireTime(expireTime);
         ret.setContent(domain + "/" + mode.name().toLowerCase() + "/" + code);
@@ -88,8 +88,8 @@ public class TEQrcodeServiceImpl implements TEQrcodeService {
         if (param.getSubIndex() != null) {
             MobileAuthCacheUtil.setSubIndex(mode, code, param.getSubIndex());
         }
-        Long expireTime = DateUtils.addSeconds(new Date(), qrExpireTime).getTime();
-        redisUtil.expire(RedisKeyHelper.mobileAuthCacheKey(mode, code), qrExpireTime);
+        Long expireTime = DateUtils.addSeconds(new Date(), SystemConstant.QR_EXPIRE_TIME.intValue()).getTime();
+        redisUtil.expire(RedisKeyHelper.mobileAuthCacheKey(mode, code), SystemConstant.QR_EXPIRE_TIME.intValue());
         QrResponseBean ret = new QrResponseBean();
         ret.setExpireTime(expireTime);
         ret.setContent(domain + "/" + mode.name().toLowerCase() + "/" + code);

+ 3 - 1
themis-exam/src/main/java/com/qmth/themis/exam/api/TEQrcodeController.java

@@ -21,6 +21,8 @@ import com.qmth.themis.common.util.ResultUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 
+import java.security.NoSuchAlgorithmException;
+
 @Api(tags = "二维码接口")
 @RestController
 @RequestMapping("/${prefix.url.exam}/qrcode")
@@ -35,7 +37,7 @@ public class TEQrcodeController {
 
 	@ApiOperation(value = "获取移动端监考二维码")
 	@RequestMapping(value = "/mobile_monitor", method = RequestMethod.POST)
-	public Result mobileMonitor(@RequestBody QrMobileMonitorParamBean param) {
+	public Result mobileMonitor(@RequestBody QrMobileMonitorParamBean param) throws NoSuchAlgorithmException {
 		if (param.getRecordId() == null) {
 			throw new BusinessException("recordId不能为空");
 		}