|
@@ -1,36 +1,12 @@
|
|
|
package com.qmth.themis.business.service.impl;
|
|
|
|
|
|
-import java.io.File;
|
|
|
-import java.math.BigDecimal;
|
|
|
-import java.text.SimpleDateFormat;
|
|
|
-import java.util.Date;
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.Map;
|
|
|
-import java.util.Objects;
|
|
|
-import java.util.UUID;
|
|
|
-
|
|
|
-import javax.annotation.Resource;
|
|
|
-
|
|
|
-import org.slf4j.Logger;
|
|
|
-import org.slf4j.LoggerFactory;
|
|
|
-import org.springframework.beans.BeanUtils;
|
|
|
-import org.springframework.stereotype.Service;
|
|
|
-import org.springframework.transaction.annotation.Transactional;
|
|
|
-
|
|
|
import com.alibaba.fastjson.JSONArray;
|
|
|
-import com.baomidou.mybatisplus.core.metadata.OrderItem;
|
|
|
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
+import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
-import com.qmth.themis.business.base.BasePage;
|
|
|
import com.qmth.themis.business.bean.backend.InvigilateListBean;
|
|
|
-import com.qmth.themis.business.bean.backend.InvigilateListQueryBean;
|
|
|
import com.qmth.themis.business.cache.ExamRecordCacheUtil;
|
|
|
import com.qmth.themis.business.cache.RedisKeyHelper;
|
|
|
-import com.qmth.themis.business.cache.bean.ExamCacheBean;
|
|
|
-import com.qmth.themis.business.cache.bean.ExamStudentAnswerCacheBean;
|
|
|
-import com.qmth.themis.business.cache.bean.ExamStudentCacheBean;
|
|
|
-import com.qmth.themis.business.cache.bean.ExamStudentPaperStructCacheBean;
|
|
|
-import com.qmth.themis.business.cache.bean.ObjectiveAnswerCacheBean;
|
|
|
+import com.qmth.themis.business.cache.bean.*;
|
|
|
import com.qmth.themis.business.config.SystemConfig;
|
|
|
import com.qmth.themis.business.constant.SpringContextHolder;
|
|
|
import com.qmth.themis.business.constant.SystemConstant;
|
|
@@ -40,24 +16,24 @@ import com.qmth.themis.business.dto.response.TEExamUnFinishDto;
|
|
|
import com.qmth.themis.business.entity.TEExamStudent;
|
|
|
import com.qmth.themis.business.entity.TOeExamAnswer;
|
|
|
import com.qmth.themis.business.entity.TOeExamRecord;
|
|
|
-import com.qmth.themis.business.enums.ExamRecordStatusEnum;
|
|
|
-import com.qmth.themis.business.enums.ExamTypeEnum;
|
|
|
-import com.qmth.themis.business.enums.LivenessTypeEnum;
|
|
|
-import com.qmth.themis.business.enums.MqTagEnum;
|
|
|
-import com.qmth.themis.business.enums.MqTopicEnum;
|
|
|
-import com.qmth.themis.business.enums.ObjectiveScorePolicyEnum;
|
|
|
-import com.qmth.themis.business.enums.VerifyExceptionEnum;
|
|
|
-import com.qmth.themis.business.service.MqDtoService;
|
|
|
-import com.qmth.themis.business.service.TEExamPaperService;
|
|
|
-import com.qmth.themis.business.service.TEExamService;
|
|
|
-import com.qmth.themis.business.service.TEExamStudentService;
|
|
|
-import com.qmth.themis.business.service.TOeExamAnswerService;
|
|
|
-import com.qmth.themis.business.service.TOeExamRecordService;
|
|
|
+import com.qmth.themis.business.enums.*;
|
|
|
+import com.qmth.themis.business.service.*;
|
|
|
import com.qmth.themis.business.util.OssUtil;
|
|
|
import com.qmth.themis.business.util.RedisUtil;
|
|
|
import com.qmth.themis.common.contanst.Constants;
|
|
|
import com.qmth.themis.common.util.FileUtil;
|
|
|
import com.qmth.themis.common.util.SimpleBeanUtil;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.io.File;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.*;
|
|
|
|
|
|
/**
|
|
|
* @Description: 考试记录 服务实现类
|
|
@@ -68,13 +44,13 @@ import com.qmth.themis.common.util.SimpleBeanUtil;
|
|
|
*/
|
|
|
@Service
|
|
|
public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, TOeExamRecord> implements TOeExamRecordService {
|
|
|
- private final static Logger log = LoggerFactory.getLogger(TOeExamRecordServiceImpl.class);
|
|
|
-
|
|
|
- private SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
|
|
|
-
|
|
|
+ private final static Logger log = LoggerFactory.getLogger(TOeExamRecordServiceImpl.class);
|
|
|
+
|
|
|
+ private SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
|
|
|
+
|
|
|
@Resource
|
|
|
MqDtoService mqDtoService;
|
|
|
-
|
|
|
+
|
|
|
@Resource
|
|
|
TOeExamRecordMapper tOeExamRecordMapper;
|
|
|
|
|
@@ -89,13 +65,13 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
|
|
|
|
|
|
@Resource
|
|
|
TEExamService teExamService;
|
|
|
-
|
|
|
+
|
|
|
@Resource
|
|
|
SystemConfig systemConfig;
|
|
|
-
|
|
|
+
|
|
|
@Resource
|
|
|
TOeExamAnswerService examAnswerService;
|
|
|
-
|
|
|
+
|
|
|
@Resource
|
|
|
TEExamStudentService examStudentService;
|
|
|
|
|
@@ -162,7 +138,7 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
|
|
|
er.setFirstPrepareTime(new Date());
|
|
|
er.setStatus(ExamRecordStatusEnum.FIRST_PREPARE);
|
|
|
er.setObjectiveScore(0.0);
|
|
|
- Map<String, Object> map=SimpleBeanUtil.objectToMap(er);
|
|
|
+ Map<String, Object> map = SimpleBeanUtil.objectToMap(er);
|
|
|
redisUtil.setForHash(RedisKeyHelper.examRecordCacheKey(er.getId()), map);
|
|
|
dataInitMq(map);
|
|
|
return er.getId();
|
|
@@ -271,10 +247,11 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
|
|
|
}
|
|
|
|
|
|
private boolean checkSingleChoice(String answerArray, JSONArray ar) {
|
|
|
- JSONArray an=JSONArray.parseArray(answerArray);
|
|
|
+ JSONArray an = JSONArray.parseArray(answerArray);
|
|
|
int a = an.getIntValue(0);
|
|
|
return checkSingleChoice(a, ar);
|
|
|
}
|
|
|
+
|
|
|
private boolean checkSingleChoice(int answer, JSONArray ar) {
|
|
|
for (int i = 0; i < ar.size(); i++) {
|
|
|
if (answer == ar.getIntValue(i)) {
|
|
@@ -292,8 +269,8 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
|
|
|
private int checkMultipleChoice(String answer, JSONArray ar) {
|
|
|
int yes = 0;
|
|
|
int no = 0;
|
|
|
- JSONArray an=JSONArray.parseArray(answer);
|
|
|
- for(int i=0;i<an.size();i++) {
|
|
|
+ JSONArray an = JSONArray.parseArray(answer);
|
|
|
+ for (int i = 0; i < an.size(); i++) {
|
|
|
if (checkSingleChoice(an.getIntValue(i), ar)) {
|
|
|
yes++;
|
|
|
continue;
|
|
@@ -310,135 +287,160 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- *考试记录数据持久化
|
|
|
- */
|
|
|
+ /**
|
|
|
+ * 考试记录数据持久化
|
|
|
+ */
|
|
|
@SuppressWarnings("unchecked")
|
|
|
@Transactional
|
|
|
- @Override
|
|
|
- public void saveDataByCache(Long recordId) {
|
|
|
+ @Override
|
|
|
+ public void saveDataByCache(Long recordId) {
|
|
|
String tempDir = SystemConstant.TEMP_FILES_DIR;
|
|
|
String dir = tempDir + "/" + uuid() + "/";
|
|
|
File dfile = new File(dir);
|
|
|
try {
|
|
|
dfile.mkdirs();
|
|
|
String structFilePath = sdf.format(new Date()) + "/" + uuid() + ".json";
|
|
|
-
|
|
|
- //保存考试记录
|
|
|
- Map<String,Object> record=redisUtil.getHashEntries(RedisKeyHelper.examRecordCacheKey(recordId));
|
|
|
- TOeExamRecord er=SimpleBeanUtil.mapToObject(record, TOeExamRecord.class);
|
|
|
- er.setStatus(ExamRecordStatusEnum.PERSISTED);
|
|
|
- er.setPaperStructPath(structFilePath);
|
|
|
- er.setPaperStructUpload(1);
|
|
|
- saveOrUpdate(er);
|
|
|
- //保存作答
|
|
|
- Map<String,ExamStudentAnswerCacheBean> answerMap=redisUtil.getHashEntries(RedisKeyHelper.examAnswerKey(recordId));
|
|
|
- for(ExamStudentAnswerCacheBean answerCache:answerMap.values()) {
|
|
|
- TOeExamAnswer answer=new TOeExamAnswer();
|
|
|
- BeanUtils.copyProperties(answerCache, answer);
|
|
|
- answer.setId(Constants.idGen.next());
|
|
|
- answer.setExamRecordId(recordId);
|
|
|
- examAnswerService.saveOrUpdate(answer);
|
|
|
- }
|
|
|
- //更新考生信息
|
|
|
- ExamStudentCacheBean examStudentCache = examStudentService.getExamStudentCacheBean(er.getExamStudentId());
|
|
|
- TEExamStudent examStudent=new TEExamStudent();
|
|
|
- BeanUtils.copyProperties(examStudentCache, examStudent);
|
|
|
- examStudentService.saveOrUpdate(examStudent);
|
|
|
- //上传个人试卷结构
|
|
|
- ExamStudentPaperStructCacheBean struct=(ExamStudentPaperStructCacheBean)redisUtil.get(RedisKeyHelper.studentPaperStructKey(recordId));
|
|
|
- File structFile = new File(dir+"struct.json");
|
|
|
+
|
|
|
+ //保存考试记录
|
|
|
+ Map<String, Object> record = redisUtil.getHashEntries(RedisKeyHelper.examRecordCacheKey(recordId));
|
|
|
+ TOeExamRecord er = SimpleBeanUtil.mapToObject(record, TOeExamRecord.class);
|
|
|
+ er.setStatus(ExamRecordStatusEnum.PERSISTED);
|
|
|
+ er.setPaperStructPath(structFilePath);
|
|
|
+ er.setPaperStructUpload(1);
|
|
|
+ saveOrUpdate(er);
|
|
|
+ //保存作答
|
|
|
+ Map<String, ExamStudentAnswerCacheBean> answerMap = redisUtil.getHashEntries(RedisKeyHelper.examAnswerKey(recordId));
|
|
|
+ for (ExamStudentAnswerCacheBean answerCache : answerMap.values()) {
|
|
|
+ TOeExamAnswer answer = new TOeExamAnswer();
|
|
|
+ BeanUtils.copyProperties(answerCache, answer);
|
|
|
+ answer.setId(Constants.idGen.next());
|
|
|
+ answer.setExamRecordId(recordId);
|
|
|
+ examAnswerService.saveOrUpdate(answer);
|
|
|
+ }
|
|
|
+ //更新考生信息
|
|
|
+ ExamStudentCacheBean examStudentCache = examStudentService.getExamStudentCacheBean(er.getExamStudentId());
|
|
|
+ TEExamStudent examStudent = new TEExamStudent();
|
|
|
+ BeanUtils.copyProperties(examStudentCache, examStudent);
|
|
|
+ examStudentService.saveOrUpdate(examStudent);
|
|
|
+ //上传个人试卷结构
|
|
|
+ ExamStudentPaperStructCacheBean struct = (ExamStudentPaperStructCacheBean) redisUtil.get(RedisKeyHelper.studentPaperStructKey(recordId));
|
|
|
+ File structFile = new File(dir + "struct.json");
|
|
|
FileUtil.saveAsFile(structFile.getAbsolutePath(), struct.getContent());
|
|
|
SystemConfig systemConfig = SpringContextHolder.getBean(SystemConfig.class);
|
|
|
OssUtil.ossUpload(systemConfig.getOssEnv(3), structFilePath, structFile);
|
|
|
} finally {
|
|
|
FileUtil.deleteFolder(dir);
|
|
|
}
|
|
|
- }
|
|
|
- private String uuid() {
|
|
|
+ }
|
|
|
+
|
|
|
+ private String uuid() {
|
|
|
return UUID.randomUUID().toString().replaceAll("-", "");
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
- @Override
|
|
|
- public void saveFaceVerify(ExamTypeEnum type,Long recordId, Long entryAuthenticationId, VerifyExceptionEnum entryAuthenticationResult) {
|
|
|
- if(ExamTypeEnum.FIRST_START.equals(type)) {
|
|
|
- ExamRecordCacheUtil.setEntryAuthenticationId(recordId, entryAuthenticationId);
|
|
|
- ExamRecordCacheUtil.setEntryAuthenticationResult(recordId, entryAuthenticationResult);
|
|
|
- }else if(ExamTypeEnum.IN_PROCESS.equals(type)) {
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void saveLivenessVerify(LivenessTypeEnum type,Long recordId, Long entryAuthenticationId, VerifyExceptionEnum entryAuthenticationResult) {
|
|
|
- if(LivenessTypeEnum.FIRST_START.equals(type)) {
|
|
|
- ExamRecordCacheUtil.setEntryAuthenticationId(recordId, entryAuthenticationId);
|
|
|
- ExamRecordCacheUtil.setEntryAuthenticationResult(recordId, entryAuthenticationResult);
|
|
|
- }else if(LivenessTypeEnum.IN_PROCESS.equals(type)) {
|
|
|
- Integer count=ExamRecordCacheUtil.getInProcessLivenessVerifyCount(recordId);
|
|
|
- ExamRecordCacheUtil.setInProcessLivenessVerifyCount(recordId, (count==null?0:count+1));
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void dataUpdateMq(Long recordId,String colName,Object colValue) {
|
|
|
- dataUpdateMq(recordId, colName, colValue, 0);
|
|
|
- }
|
|
|
- @Override
|
|
|
- public void dataUpdateMq(Long recordId,String colName,Object colValue,Integer isDate) {
|
|
|
- Map<String, Object> transMap = new HashMap<String, Object>();
|
|
|
- transMap.put("recordId", recordId);
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void saveFaceVerify(ExamTypeEnum type, Long recordId, Long entryAuthenticationId, VerifyExceptionEnum entryAuthenticationResult) {
|
|
|
+ if (ExamTypeEnum.FIRST_START.equals(type)) {
|
|
|
+ ExamRecordCacheUtil.setEntryAuthenticationId(recordId, entryAuthenticationId);
|
|
|
+ ExamRecordCacheUtil.setEntryAuthenticationResult(recordId, entryAuthenticationResult);
|
|
|
+ } else if (ExamTypeEnum.IN_PROCESS.equals(type)) {
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void saveLivenessVerify(LivenessTypeEnum type, Long recordId, Long entryAuthenticationId, VerifyExceptionEnum entryAuthenticationResult) {
|
|
|
+ if (LivenessTypeEnum.FIRST_START.equals(type)) {
|
|
|
+ ExamRecordCacheUtil.setEntryAuthenticationId(recordId, entryAuthenticationId);
|
|
|
+ ExamRecordCacheUtil.setEntryAuthenticationResult(recordId, entryAuthenticationResult);
|
|
|
+ } else if (LivenessTypeEnum.IN_PROCESS.equals(type)) {
|
|
|
+ Integer count = ExamRecordCacheUtil.getInProcessLivenessVerifyCount(recordId);
|
|
|
+ ExamRecordCacheUtil.setInProcessLivenessVerifyCount(recordId, (count == null ? 0 : count + 1));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void dataUpdateMq(Long recordId, String colName, Object colValue) {
|
|
|
+ dataUpdateMq(recordId, colName, colValue, 0);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void dataUpdateMq(Long recordId, String colName, Object colValue, Integer isDate) {
|
|
|
+ Map<String, Object> transMap = new HashMap<String, Object>();
|
|
|
+ transMap.put("recordId", recordId);
|
|
|
transMap.put("colName", colName);
|
|
|
transMap.put("colValue", colValue);
|
|
|
transMap.put("isDate", isDate);
|
|
|
//mq发送消息start
|
|
|
MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_RECORD_UPDATE.name(), transMap, MqTagEnum.EXAM_RECORD_UPDATE, recordId.toString(), colName);
|
|
|
mqDtoService.assembleSendOneWayMsg(mqDto);
|
|
|
- }
|
|
|
-
|
|
|
- @Transactional
|
|
|
- @Override
|
|
|
- public void dataUpdate(Long recordId, String colName, Object colValue,Integer isDate) {
|
|
|
- if(isDate!=null&&isDate.intValue()==1) {
|
|
|
- Long l=(Long)colValue;
|
|
|
- Date d=new Date(l);
|
|
|
- tOeExamRecordMapper.dataUpdate(recordId, colName, d);
|
|
|
- }else {
|
|
|
- tOeExamRecordMapper.dataUpdate(recordId, colName, colValue);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void dataInitMq(Map<String, Object> param) {
|
|
|
- Long id=(Long)param.get("id");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Transactional
|
|
|
+ @Override
|
|
|
+ public void dataUpdate(Long recordId, String colName, Object colValue, Integer isDate) {
|
|
|
+ if (isDate != null && isDate.intValue() == 1) {
|
|
|
+ Long l = (Long) colValue;
|
|
|
+ Date d = new Date(l);
|
|
|
+ tOeExamRecordMapper.dataUpdate(recordId, colName, d);
|
|
|
+ } else {
|
|
|
+ tOeExamRecordMapper.dataUpdate(recordId, colName, colValue);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void dataInitMq(Map<String, Object> param) {
|
|
|
+ Long id = (Long) param.get("id");
|
|
|
//mq发送消息start
|
|
|
MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_RECORD_INIT.name(), param, MqTagEnum.EXAM_RECORD_INIT, id.toString(), id.toString());
|
|
|
mqDtoService.assembleSendOneWayMsg(mqDto);
|
|
|
- }
|
|
|
-
|
|
|
- @Transactional
|
|
|
- @Override
|
|
|
- public void dataInit(Map<String, Object> param) {
|
|
|
- TOeExamRecord tr=new TOeExamRecord();
|
|
|
- tr.setId((Long)param.get("id"));
|
|
|
- tr.setExamId((Long)param.get("examId"));
|
|
|
- tr.setExamActivityId((Long)param.get("examActivityId"));
|
|
|
- tr.setExamStudentId((Long)param.get("examStudentId"));
|
|
|
- tr.setPaperId((Long)param.get("paperId"));
|
|
|
- tr.setSerialNumber((Integer)param.get("serialNumber"));
|
|
|
- tr.setFirstPrepareTime(new Date((Long)param.get("firstPrepareTime")));
|
|
|
- tr.setStatus(ExamRecordStatusEnum.valueOf((String)param.get("status")));
|
|
|
- tr.setObjectiveScore(0.0);
|
|
|
- saveOrUpdate(tr);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public BasePage invigilatePageList(InvigilateListQueryBean param) {
|
|
|
- Page<InvigilateListBean> ipage=new Page<>(param.getPageNumber(), param.getPageSize());
|
|
|
- ipage.addOrder(OrderItem.asc("t.id"));
|
|
|
- tOeExamRecordMapper.invigilatePageQuery(ipage, param);
|
|
|
- BasePage page = new BasePage(ipage.getRecords(), ipage.getCurrent(), ipage.getSize(), ipage.getTotal());
|
|
|
- return page;
|
|
|
- }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Transactional
|
|
|
+ @Override
|
|
|
+ public void dataInit(Map<String, Object> param) {
|
|
|
+ TOeExamRecord tr = new TOeExamRecord();
|
|
|
+ tr.setId((Long) param.get("id"));
|
|
|
+ tr.setExamId((Long) param.get("examId"));
|
|
|
+ tr.setExamActivityId((Long) param.get("examActivityId"));
|
|
|
+ tr.setExamStudentId((Long) param.get("examStudentId"));
|
|
|
+ tr.setPaperId((Long) param.get("paperId"));
|
|
|
+ tr.setSerialNumber((Integer) param.get("serialNumber"));
|
|
|
+ tr.setFirstPrepareTime(new Date((Long) param.get("firstPrepareTime")));
|
|
|
+ tr.setStatus(ExamRecordStatusEnum.valueOf((String) param.get("status")));
|
|
|
+ tr.setObjectiveScore(0.0);
|
|
|
+ saveOrUpdate(tr);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询实时监控台列表
|
|
|
+ *
|
|
|
+ * @param iPage
|
|
|
+ * @param examId
|
|
|
+ * @param examActivityId
|
|
|
+ * @param roomCode
|
|
|
+ * @param paperDownload
|
|
|
+ * @param status
|
|
|
+ * @param name
|
|
|
+ * @param identity
|
|
|
+ * @param minWarningCount
|
|
|
+ * @param maxWarningCount
|
|
|
+ * @param clientWebsocketStatus
|
|
|
+ * @param monitorStatusSource
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public IPage<InvigilateListBean> invigilatePageList(IPage<Map> iPage, Long examId,
|
|
|
+ Long examActivityId,
|
|
|
+ String roomCode,
|
|
|
+ Integer paperDownload,
|
|
|
+ String status,
|
|
|
+ String name,
|
|
|
+ String identity,
|
|
|
+ Integer minWarningCount,
|
|
|
+ Integer maxWarningCount,
|
|
|
+ String clientWebsocketStatus,
|
|
|
+ String monitorStatusSource) {
|
|
|
+ return tOeExamRecordMapper.invigilatePageQuery(iPage, examId, examActivityId, roomCode, paperDownload, status, name, identity, minWarningCount, maxWarningCount, clientWebsocketStatus, monitorStatusSource);
|
|
|
+ }
|
|
|
}
|