deason 4 years ago
parent
commit
6268f44a6c

+ 38 - 0
src/main/java/cn/com/qmth/examcloud/api/commons/enums/ExamType.java

@@ -0,0 +1,38 @@
+package cn.com.qmth.examcloud.api.commons.enums;
+
+/**
+ * @author ting.yin
+ * @Description: 考试类型
+ * @date 2017年1月5日
+ */
+public enum ExamType {
+    /**
+     * 传统
+     */
+    TRADITION,
+
+    /**
+     * 网考
+     */
+    ONLINE,
+
+    /**
+     * 练习
+     */
+    PRACTICE,
+
+    /**
+     * 离线
+     */
+    OFFLINE,
+
+    /**
+     * 分布式印刷考试
+     */
+    PRINT_EXAM,
+
+    /**
+     * 在线作业
+     */
+    ONLINE_HOMEWORK
+}

+ 7 - 0
src/main/java/cn/com/qmth/examcloud/api/commons/exchange/JsonSerializable.java

@@ -0,0 +1,7 @@
+package cn.com.qmth.examcloud.api.commons.exchange;
+
+import java.io.Serializable;
+
+public interface JsonSerializable extends Serializable {
+
+}

+ 41 - 0
src/main/java/cn/com/qmth/examcloud/support/enums/ExamProcess.java

@@ -0,0 +1,41 @@
+package cn.com.qmth.examcloud.support.enums;
+
+/**
+ * @Description 考试过程
+ * @Author lideyin
+ * @Date 2020/8/20 15:26
+ * @Version 1.0
+ */
+public enum ExamProcess {
+    START("START", "开始考试"),
+    IP_CHANGE("IP_CHANGE", "IP变动"),
+    BREAK_OFF("BREAK_OFF", "考试中断"),
+    CONTINUE("CONTINUE", "断点续考"),
+    AUTO_HAND_IN("AUTO_HAND_IN", "服务端交卷"),
+    MANUAL_HAND_IN("MANUAL_HAND_IN", "考生端交卷");
+    private String code;
+    private String desc;
+
+    ExamProcess(String code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    /**
+     * 考试过程代码
+     *
+     * @return
+     */
+    public String getCode() {
+        return this.code;
+    }
+
+    /**
+     * 考试过程描述
+     *
+     * @return
+     */
+    public String getDesc() {
+        return this.desc;
+    }
+}

+ 71 - 0
src/main/java/cn/com/qmth/examcloud/support/enums/ExamProperties.java

@@ -0,0 +1,71 @@
+package cn.com.qmth.examcloud.support.enums;
+
+/**
+ * @author chenken
+ * @date 2018年11月15日 下午5:37:35
+ * @company QMTH
+ * @description 考试属性
+ */
+public enum ExamProperties {
+
+    SCORE_PUBLISHING("发布成绩"),
+    IS_ENTRANCE_EXAM("是否入学考试"),
+    FREEZE_TIME("交卷冻结时间"),
+    EXAM_RECONNECT_TIME("断点续考时间"),
+    BEFORE_EXAM_REMARK("考前说明"),
+    AFTER_EXAM_REMARK("考后说明"),
+    SHOW_CHEATING_REMARK("是否展示作弊"),
+    CHEATING_REMARK("作弊说明"),
+    PRACTICE_TYPE("练习模式"),
+    SINGLE_EDIT("单选题补充说明是否可填"),
+    MUTIPLE_EDIT("多选题补充说明是否可填"),
+    BOOL_EDIT("判断题补充说明是否可填"),
+    FILL_BLANK_EDIT("填空题补充说明是否可填"),
+    SINGLE_ANSWER_REMARK("单选题补充说明"),
+    MUTIPLE_ANSWER_REMARK("多选题补充说明"),
+    BOOL_ANSWER_REMARK("判断题补充说明"),
+    FILL_BLANK_REMARK("填空题补充说明"),
+    TEXT_ANSWER_REMARK("问答题补充说明"),
+    nestedAnswerRemark("套题补充说明"),
+    IS_FACE_ENABLE("是否启用人脸识别"),
+    IS_FACE_CHECK("进入考试是否验证人脸识别"),
+    WARN_THRESHOLD("人脸检测预警阈值"),
+    MARKING_TYPE("阅卷方式"),
+    IS_FACE_VERIFY("是否开启人脸活体检测"),
+    FACE_VERIFY_START_MINUTE("活体检测开始分钟数"),
+    FACE_VERIFY_END_MINUTE("活体检测结束分钟数"),
+    ADD_FACE_VERIFY_OUT_FREEZE_TIME("冻结时间外新加人脸活体检测"),
+    OUT_FREEZE_TIME_FACE_VERIFY_START_MINUTE("冻结时间外活体检测开始分钟数"),
+    OUT_FREEZE_TIME_FACE_VERIFY_END_MINUTE("冻结时间外活体检测结束分钟数"),
+    IP_LIMIT("是否IP限制"),
+    IP_ADDRESSES("IP白名单"),
+    IS_OBJ_SCORE_VIEW("是否显示客观题成绩"),
+    CAN_UPLOAD_ATTACHMENT("是否允许上传附件(离线考试)"),
+    LIVING_WARN_THRESHOLD("人脸真实性阈值"),
+    MARKING_TASK_BUILDED("阅卷是否生成评卷任务"),
+    OFFLINE_UPLOAD_FILE_TYPE("离线考试上传文件类型"),
+    PUSH_SCORE("是否推送分数"),
+    MAX_INTERRUPT_NUM("最大断点续考次数"),
+    IS_STRANGER_ENABLE("是否启用陌生人检测"),
+    LIMITED_IF_NO_SPECIAL_SETTINGS("无特殊设置时禁止考试"),
+    WEIXIN_ANSWER_ENABLED("是否开放微信小程序作答"),
+    APP_EXAM_ENABLED("是否开放app考试"),
+    EXAM_CYCLE_ENABLED("是否启用考试周期设置"),
+    EXAM_CYCLE_WEEK("考试周期星期设置"),
+    EXAM_CYCLE_TIME_RANGE("考试周期时间段设置");
+
+    private ExamProperties(String desc) {
+        this.desc = desc;
+    }
+
+    private String desc;
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+
+}

+ 51 - 0
src/main/java/cn/com/qmth/examcloud/support/enums/ExamRecordStatus.java

@@ -0,0 +1,51 @@
+package cn.com.qmth.examcloud.support.enums;
+
+/**
+ * 考试记录状态
+ *
+ * @author xudengqi
+ * 2016年8月23日
+ */
+public enum ExamRecordStatus {
+    /**
+     * 考试中
+     */
+    EXAM_ING,
+    /**
+     * 手工交卷处理中
+     */
+    EXAM_HAND_IN,
+    /**
+     * 系统交卷处理中
+     */
+    EXAM_AUTO_HAND_IN,
+    /**
+     * 考试结束
+     */
+    EXAM_END,
+
+    /**
+     * 考试过期
+     */
+    EXAM_OVERDUE,
+
+    /**
+     * 考试无效/作废
+     */
+    EXAM_INVALID,
+
+    /**
+     * 考试异常数据
+     */
+    EXAM_ERROR;
+
+    public static ExamRecordStatus getByName(String name) {
+        for (ExamRecordStatus status : values()) {
+            if (status.name().equals(name)) {
+                return status;
+            }
+        }
+        return null;
+    }
+
+}

+ 43 - 0
src/main/java/cn/com/qmth/examcloud/support/enums/FaceBiopsyScheme.java

@@ -0,0 +1,43 @@
+package cn.com.qmth.examcloud.support.enums;
+
+/**
+ * @Description 活体检测方案枚举
+ * @Author lideyin
+ * @Date 2019/11/6 15:03
+ * @Version 1.0
+ */
+public enum FaceBiopsyScheme {
+    /**
+     * FaceID活体检测方案(即旧活体检测方案)
+     */
+    FACE_ID("S1", "FaceID活体检测方案"),
+    /**
+     * 新活体检测方案(暂时无法给出具体命名,以后有需要再改动)
+     */
+    NEW("S2", "新活体检测方案");
+    private String code;
+    private String desc;
+
+    FaceBiopsyScheme(String code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    /**
+     * 获取活检方案代码
+     *
+     * @return
+     */
+    public String getCode() {
+        return this.code;
+    }
+
+    /**
+     * 获取活检方案描述
+     *
+     * @return
+     */
+    public String getDesc() {
+        return this.desc;
+    }
+}

+ 22 - 0
src/main/java/cn/com/qmth/examcloud/support/enums/FileAnswerAcknowledgeStatus.java

@@ -0,0 +1,22 @@
+package cn.com.qmth.examcloud.support.enums;
+
+/**
+ * 文件作答的响应状态
+ */
+public enum FileAnswerAcknowledgeStatus {
+    UNCONFIRMED("UNCONFIRMED", "未确认"),
+    CONFIRMED("CONFIRMED", "已确认"),
+    DISCARDED("DISCARDED", "已弃用");
+
+    private String code;
+
+    private String desc;
+
+    /**
+     * 构造函数
+     */
+    FileAnswerAcknowledgeStatus(String code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+}

+ 20 - 0
src/main/java/cn/com/qmth/examcloud/support/enums/HandInExamType.java

@@ -0,0 +1,20 @@
+package cn.com.qmth.examcloud.support.enums;
+
+
+/**
+ * @Description 交卷类型
+ * @Author lideyin
+ * @Date 2019/8/1 18:07
+ * @Version 1.0
+ */
+public enum HandInExamType {
+    /**
+     * 手工交卷
+     */
+    MANUAL,
+    /**
+     * 自动交卷
+     */
+    AUTO
+
+}

+ 48 - 0
src/main/java/cn/com/qmth/examcloud/support/enums/IsSuccess.java

@@ -0,0 +1,48 @@
+package cn.com.qmth.examcloud.support.enums;
+
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * @author chenken
+ * @date 2018年2月26日 下午3:13:05
+ * @company QMTH
+ * @description 成功或失败
+ */
+public enum IsSuccess {
+    /**
+     * 成功
+     */
+    SUCCESS("成功"),
+    /**
+     * 失败
+     */
+    FAILED("失败");
+
+    private String desc;
+
+    public static IsSuccess strToEnum(String name) {
+        if (StringUtils.isBlank(name)) {
+            return null;
+        }
+        for (IsSuccess isSuccess : IsSuccess.values()) {
+            if (name.equals(isSuccess.name())) {
+                return isSuccess;
+            }
+        }
+
+        return null;
+    }
+
+    private IsSuccess(String desc) {
+        this.desc = desc;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+}
+

+ 21 - 0
src/main/java/cn/com/qmth/examcloud/support/enums/SyncStatus.java

@@ -0,0 +1,21 @@
+package cn.com.qmth.examcloud.support.enums;
+
+
+/**
+ * @Description 同步状态
+ * @Author lideyin
+ * @Date 2019/12/18 11:24
+ * @Version 1.0
+ */
+public enum SyncStatus {
+    /**
+     * 未同步
+     */
+    UNSYNC,
+
+    /**
+     * 已同步
+     */
+    SYNCED
+
+}

+ 230 - 0
src/main/java/cn/com/qmth/examcloud/support/examing/ExamRecordData.java

@@ -0,0 +1,230 @@
+package cn.com.qmth.examcloud.support.examing;
+
+import cn.com.qmth.examcloud.api.commons.enums.ExamType;
+import cn.com.qmth.examcloud.api.commons.exchange.JsonSerializable;
+import cn.com.qmth.examcloud.support.enums.ExamRecordStatus;
+import cn.com.qmth.examcloud.support.enums.HandInExamType;
+import cn.com.qmth.examcloud.support.enums.IsSuccess;
+import cn.com.qmth.examcloud.support.enums.SyncStatus;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class ExamRecordData implements JsonSerializable {
+
+    private static final long serialVersionUID = 3881189287358373638L;
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 考试ID
+     */
+    private Long examId;
+
+    /**
+     * 考试类型
+     */
+    private ExamType examType;
+
+    /**
+     * 考生ID
+     */
+    private Long examStudentId;
+
+    /**
+     * 学生ID
+     */
+    private Long studentId;
+
+    /**
+     * 课程ID
+     */
+    private Long courseId;
+
+    /**
+     * 学习中心ID
+     */
+    private Long orgId;
+
+    /**
+     * 顶级机构ID
+     */
+    private Long rootOrgId;
+
+    /**
+     * 基础试卷ID
+     */
+    private String basePaperId;
+
+    /**
+     * 试卷类型
+     */
+    private String paperType;
+
+    /**
+     * 考试开始时间(即开始作答时间)
+     */
+    private Date startTime;
+
+    /**
+     * 考试结束时间
+     */
+    private Date endTime;
+
+    /**
+     * 考试时长(毫秒)
+     */
+    private Long usedExamTime;
+
+    /**
+     * 是否断点续考
+     */
+    private Boolean isContinued;
+
+    /**
+     * 断点续考次数
+     */
+    private Integer continuedCount;
+
+    /**
+     * 是否达到最大断点限制
+     */
+    private Boolean isExceed;
+
+    /**
+     * 抓拍比对成功次数
+     */
+    private Integer faceSuccessCount;
+
+    /**
+     * 抓拍比对失败次数
+     */
+    private Integer faceFailedCount;
+
+    /**
+     * 抓拍存在陌生人的次数
+     */
+    private Integer faceStrangerCount;
+
+    /**
+     * 抓拍比对总次数
+     */
+    private Integer faceTotalCount;
+
+    // 考试记录状态
+    private ExamRecordStatus examRecordStatus;
+
+    /**
+     * 交卷类型
+     */
+    private HandInExamType handInExamType;
+
+    /**
+     * 活体检测结果
+     */
+    private IsSuccess faceVerifyResult;
+
+    /**
+     * 考试被清理时间
+     */
+    private Date cleanTime;
+
+    /**
+     * 是否异常数据
+     */
+    private Boolean isWarn;
+    /**
+     * 是否被审核过
+     */
+    private Boolean isAudit;
+    /**
+     * 是否违纪
+     */
+    private Boolean isIllegality;
+
+    /**
+     * 总分
+     */
+    private Double totalScore;
+
+    /**
+     * 客观题得分总分
+     */
+    private Double objectiveScore;
+
+    /**
+     * 客观题答对的比率
+     * (客观题答对的题数/客观题总题数)*100  取2位小数
+     */
+    private Double objectiveAccuracy;
+
+    /**
+     * 主观题得分总分
+     */
+    private Double subjectiveScore;
+
+    /**
+     * 答题正确率
+     */
+    private Double succPercent;
+
+    /**
+     * 抓拍比对通过率
+     */
+    private Double faceSuccessPercent;
+
+    /**
+     * 百度人脸活体检测通过率
+     */
+    private Double baiduFaceLivenessSuccessPercent;
+
+    /**
+     * 数据同步状态
+     */
+    private SyncStatus syncStatus;
+
+    /**
+     * 试卷题目数量(校验提交答案的order)
+     */
+    private Integer questionCount;
+
+    /**
+     * 是否是全客观题卷  1:是   0:否
+     */
+    private Boolean isAllObjectivePaper;
+
+    /**
+     * 场次id
+     */
+    private Long examStageId;
+
+    /**
+     * 场次号
+     */
+    private Integer examStageOrder;
+
+    /**
+     * 学生最后活动时间
+     */
+    private Date lastActiveTime;
+
+    /**
+     * 断点续考时间
+     */
+    private Date continuedTime;
+
+    /**
+     * 进入考试时间
+     */
+    private Date enterExamTime;
+
+    /**
+     * 切屏次数
+     */
+    private Integer switchScreenCount;
+
+}