ソースを参照

获取二维码接口

xiatian 4 年 前
コミット
ae89693994

+ 36 - 0
themis-business/src/main/java/com/qmth/themis/business/bean/exam/QrMobileMonitorParamBean.java

@@ -0,0 +1,36 @@
+package com.qmth.themis.business.bean.exam;
+
+import com.qmth.themis.common.enums.Source;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel("获取移动端监考二维码参数信息")
+public class QrMobileMonitorParamBean {
+
+	
+	@ApiModelProperty("监考源")
+	private Source source;
+	
+	@ApiModelProperty("考试记录ID")
+	private Long recordId;
+
+	public Source getSource() {
+		return source;
+	}
+
+	public void setSource(Source source) {
+		this.source = source;
+	}
+
+	public Long getRecordId() {
+		return recordId;
+	}
+
+	public void setRecordId(Long recordId) {
+		this.recordId = recordId;
+	}
+
+	
+
+}

+ 34 - 0
themis-business/src/main/java/com/qmth/themis/business/bean/exam/QrResponseBean.java

@@ -0,0 +1,34 @@
+package com.qmth.themis.business.bean.exam;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel("获取二维码返回信息")
+public class QrResponseBean {
+
+	
+	@ApiModelProperty("二维码内容")
+	private String content;
+	
+	@ApiModelProperty("expireTime")
+	private Long expireTime;
+
+	public String getContent() {
+		return content;
+	}
+
+	public void setContent(String content) {
+		this.content = content;
+	}
+
+	public Long getExpireTime() {
+		return expireTime;
+	}
+
+	public void setExpireTime(Long expireTime) {
+		this.expireTime = expireTime;
+	}
+
+	
+
+}

+ 55 - 0
themis-business/src/main/java/com/qmth/themis/business/bean/exam/QrUploadParamBean.java

@@ -0,0 +1,55 @@
+package com.qmth.themis.business.bean.exam;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel("二维码上传作答参数")
+public class QrUploadParamBean {
+	
+	@ApiModelProperty("考试记录id")
+	private Long recordId;
+	
+	@ApiModelProperty("大题号")
+	private Integer mainNumber;
+
+	@ApiModelProperty("小题号")
+	private Integer subNumber;
+	
+	@ApiModelProperty("套题子题序号")
+	private Integer subIndex;
+
+	public Long getRecordId() {
+		return recordId;
+	}
+
+	public void setRecordId(Long recordId) {
+		this.recordId = recordId;
+	}
+
+	public Integer getMainNumber() {
+		return mainNumber;
+	}
+
+	public void setMainNumber(Integer mainNumber) {
+		this.mainNumber = mainNumber;
+	}
+
+	public Integer getSubNumber() {
+		return subNumber;
+	}
+
+	public void setSubNumber(Integer subNumber) {
+		this.subNumber = subNumber;
+	}
+
+	public Integer getSubIndex() {
+		return subIndex;
+	}
+
+	public void setSubIndex(Integer subIndex) {
+		this.subIndex = subIndex;
+	}
+	
+
+	
+}

+ 10 - 0
themis-business/src/main/java/com/qmth/themis/business/cache/ExamRecordCacheUtil.java

@@ -157,5 +157,15 @@ public class ExamRecordCacheUtil {
 		return (Integer) redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), "inProcessLivenessVerifyCount");
 	}
 	
+	public static void setMonitorKey(Long recordId, String monitorKey) {
+		redisUtil.set(RedisKeyHelper.examRecordCacheKey(recordId), "monitorKey", monitorKey);
+		examRecordService.dataUpdateMq(recordId, "monitorKey", monitorKey);
+	}
+	
+	public static String getMonitorKey(Long recordId) {
+		return (String) redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), "monitorKey");
+	}
+	
+	
 	
 }

+ 0 - 5
themis-business/src/main/java/com/qmth/themis/business/service/TEMobileService.java

@@ -3,11 +3,6 @@ package com.qmth.themis.business.service;
 import com.qmth.themis.business.bean.mobile.MobileAuthorizationBean;
 import com.qmth.themis.business.bean.mobile.MobileAuthorizationParamBean;
 
-/**移动端服务类
- * @Description: 
- * @Author: xiatian
- * @Date: 2020-08-14
- */
 public interface TEMobileService {
 
 	public MobileAuthorizationBean authorization(MobileAuthorizationParamBean param);

+ 14 - 0
themis-business/src/main/java/com/qmth/themis/business/service/TEQrcodeService.java

@@ -0,0 +1,14 @@
+package com.qmth.themis.business.service;
+
+import com.qmth.themis.business.bean.exam.QrMobileMonitorParamBean;
+import com.qmth.themis.business.bean.exam.QrResponseBean;
+import com.qmth.themis.business.bean.exam.QrUploadParamBean;
+import com.qmth.themis.business.enums.MobileModeEnum;
+
+public interface TEQrcodeService {
+
+	QrResponseBean mobileMonitor(QrMobileMonitorParamBean param);
+
+	QrResponseBean upload(QrUploadParamBean param,MobileModeEnum mode);
+
+}

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

@@ -0,0 +1,95 @@
+package com.qmth.themis.business.service.impl;
+
+import java.util.Date;
+import java.util.UUID;
+
+import javax.annotation.Resource;
+
+import org.apache.commons.lang3.time.DateUtils;
+import org.springframework.stereotype.Service;
+
+import com.qmth.themis.business.bean.exam.QrMobileMonitorParamBean;
+import com.qmth.themis.business.bean.exam.QrResponseBean;
+import com.qmth.themis.business.bean.exam.QrUploadParamBean;
+import com.qmth.themis.business.cache.ExamRecordCacheUtil;
+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.enums.MobileModeEnum;
+import com.qmth.themis.business.enums.MonitorVideoSourceEnum;
+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.common.enums.Source;
+
+@Service
+public class TEQrcodeServiceImpl implements TEQrcodeService {
+	
+	//二维码过期时间(秒)
+	private final static int qrExpireTime=120;
+	
+	@Resource
+	TEExamService examService;
+	@Resource
+	RedisUtil redisUtil;
+	@Resource
+	SystemConfig systemConfig;
+
+	@Override
+	public QrResponseBean mobileMonitor(QrMobileMonitorParamBean param) {
+		String domain = systemConfig.getProperty("wxapp.upload.url");
+		String code=uuid();
+		MobileModeEnum mode=MobileModeEnum.MOBILE_MONITOR;
+		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);
+		QrResponseBean ret=new QrResponseBean();
+		ret.setExpireTime(expireTime);
+		ret.setContent(domain+"/"+mode.name().toLowerCase()+"/"+code);
+		return ret;
+	}
+
+	private Boolean getMonitorAudioEnable(QrMobileMonitorParamBean param) {
+		Long examId = ExamRecordCacheUtil.getExamId(param.getRecordId());
+		ExamCacheBean exam = examService.getExamCacheBean(examId);
+		String monitorVideoSource = exam.getMonitorVideoSource();
+		if (!monitorVideoSource.toUpperCase().contains(MonitorVideoSourceEnum.CLIENT_SCREEN.name())
+				&& !monitorVideoSource.toUpperCase().contains(MonitorVideoSourceEnum.CLIENT_CAMERA.name())
+				&& Source.mobile_monitor_first.equals(param.getSource())) {
+			return true;
+		}else {
+			return false;
+		}
+	}
+	
+    private String uuid() {
+        return UUID.randomUUID().toString().replaceAll("-", "");
+    }
+
+	@Override
+	public QrResponseBean upload(QrUploadParamBean param,MobileModeEnum mode) {
+		String domain = systemConfig.getProperty("wxapp.upload.url");
+		String code=uuid();
+		MobileAuthCacheUtil.setMode(mode, code);
+		MobileAuthCacheUtil.setCode(mode, code);
+		MobileAuthCacheUtil.setRecordId(mode, code, param.getRecordId());
+		MobileAuthCacheUtil.setMainNumber(mode, code, param.getMainNumber());
+		MobileAuthCacheUtil.setSubNumber(mode, code, param.getSubNumber());
+		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);
+		QrResponseBean ret=new QrResponseBean();
+		ret.setExpireTime(expireTime);
+		ret.setContent(domain+"/"+mode.name().toLowerCase()+"/"+code);
+		return ret;
+	}
+
+}

+ 8 - 0
themis-business/src/main/java/com/qmth/themis/business/util/RedisUtil.java

@@ -299,4 +299,12 @@ public class RedisUtil {
     public void setForHash(String key, Map<String, Object> map) {
         redisTemplate.opsForHash().putAll(key, map);
     }
+    
+    /**设置过期时间(秒)
+     * @param key
+     * @param timeOutSecond
+     */
+    public void expire(String key,int timeOutSecond) {
+        redisTemplate.expire(key, timeOutSecond, TimeUnit.SECONDS);
+    }
 }

+ 71 - 0
themis-exam/src/main/java/com/qmth/themis/exam/api/TEQrcodeController.java

@@ -0,0 +1,71 @@
+package com.qmth.themis.exam.api;
+
+import javax.annotation.Resource;
+
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.qmth.themis.business.bean.exam.QrMobileMonitorParamBean;
+import com.qmth.themis.business.bean.exam.QrUploadParamBean;
+import com.qmth.themis.business.enums.MobileModeEnum;
+import com.qmth.themis.business.service.MqDtoService;
+import com.qmth.themis.business.service.TEQrcodeService;
+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;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+@Api(tags = "二维码接口")
+@RestController
+@RequestMapping("/${prefix.url.exam}/qrcode")
+public class TEQrcodeController {
+
+	@Resource
+	MqDtoService mqDtoService;
+
+	@Resource
+	TEQrcodeService qrcodeService;
+	
+
+	@ApiOperation(value = "获取移动端监考二维码")
+	@RequestMapping(value = "/mobile_monitor", method = RequestMethod.POST)
+	public Result mobileMonitor(@RequestBody QrMobileMonitorParamBean param) {
+		if (param.getRecordId() == null) {
+			throw new BusinessException("recordId不能为空");
+		}
+		if (param.getSource() == null) {
+			throw new BusinessException("source不能为空");
+		}
+		if (!Source.mobile_monitor_first.equals(param.getSource())
+				&& !Source.mobile_monitor_first.equals(param.getSource())) {
+			throw new BusinessException("source 错误");
+		}
+		return ResultUtil.ok(qrcodeService.mobileMonitor(param));
+	}
+
+	@ApiOperation(value = "获取移动端监考二维码")
+	@RequestMapping(value = "/{uploadType}", method = RequestMethod.POST)
+	public Result mobileMonitor(@PathVariable String uploadType,@RequestBody QrUploadParamBean param) {
+		if (param.getRecordId() == null) {
+			throw new BusinessException("recordId不能为空");
+		}
+		if (param.getMainNumber() == null) {
+			throw new BusinessException("MainNumber不能为空");
+		}
+		if (param.getSubNumber() == null) {
+			throw new BusinessException("SubNumber不能为空");
+		}
+		MobileModeEnum mode=MobileModeEnum.valueOf(uploadType.toUpperCase());
+		if (!MobileModeEnum.PHOTO_UPLOAD.equals(mode)
+				&& !MobileModeEnum.AUDIO_UPLOAD.equals(mode)) {
+			throw new BusinessException("uploadType 错误");
+		}
+		return ResultUtil.ok(qrcodeService.upload(param,mode));
+	}
+}