فهرست منبع

题库缓存加载

xiatian 4 سال پیش
والد
کامیت
9cb877fa51

+ 17 - 14
src/main/java/cn/com/qmth/dp/examcloud/oe/Task.java

@@ -1,5 +1,20 @@
 package cn.com.qmth.dp.examcloud.oe;
 
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.RandomUtils;
+import org.bson.Document;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Component;
+
+import com.mongodb.client.FindIterable;
+import com.mongodb.client.MongoCollection;
+import com.mongodb.client.MongoCursor;
+
+import cn.com.qmth.dp.examcloud.oe.modules.load_question_cache.LoadQuestionsCacheService;
 import cn.com.qmth.examcloud.commons.logging.ExamCloudLog;
 import cn.com.qmth.examcloud.commons.logging.ExamCloudLogFactory;
 import cn.com.qmth.examcloud.commons.util.JsonUtil;
@@ -7,18 +22,6 @@ import cn.com.qmth.examcloud.web.support.SpringContextHolder;
 import cn.com.qmth.examcloud.web.upyun.UpYunPathInfo;
 import cn.com.qmth.examcloud.web.upyun.UpyunPathEnvironmentInfo;
 import cn.com.qmth.examcloud.web.upyun.UpyunService;
-import com.mongodb.client.FindIterable;
-import com.mongodb.client.MongoCollection;
-import com.mongodb.client.MongoCursor;
-import org.apache.commons.lang3.RandomUtils;
-import org.bson.Document;
-import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.stereotype.Component;
-
-import java.io.File;
-import java.util.List;
-import java.util.Map;
 
 /**
  * 任务
@@ -52,8 +55,8 @@ public class Task {
             // UpdateQuestionScoreService  bean = SpringContextHolder.getBean(UpdateQuestionScoreService.class);
             // bean.start();
 
-            // ExportExamStudentScore bean = SpringContextHolder.getBean(ExportExamStudentScore.class);
-            // bean.start();
+        	LoadQuestionsCacheService bean = SpringContextHolder.getBean(LoadQuestionsCacheService.class);
+             bean.start();
         } catch (Exception e) {
             log.error("unexpected", e);
             throw new RuntimeException(e);

+ 87 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/entity/question/ExamPaper.java

@@ -0,0 +1,87 @@
+package cn.com.qmth.dp.examcloud.oe.entity.question;
+
+import org.springframework.data.mongodb.core.mapping.DBRef;
+
+/**
+ * @author chenken
+ * @date 2017年7月14日 上午9:34:16
+ * @company QMTH
+ * @description 调卷规则关联试卷
+ */
+public class ExamPaper extends IdBase {
+    /**
+     * 考试ID
+     */
+    private Long examId;
+    /**
+     * 课程代码
+     */
+    private String courseCode;
+    /**
+     * 试卷类型
+     */
+    private String groupCode;
+    /**
+     * 关联试卷
+     */
+    @DBRef
+    private Paper paper;
+    /**
+     * 抽取试卷次数
+     */
+    private Integer extractCount;
+    /**
+     * 抽取权重比例
+     * 整数类型 例如:70%  数据库里存70
+     */
+    private Integer weight;
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getGroupCode() {
+        return groupCode;
+    }
+
+    public void setGroupCode(String groupCode) {
+        this.groupCode = groupCode;
+    }
+
+    public Integer getExtractCount() {
+        return extractCount;
+    }
+
+    public void setExtractCount(Integer extractCount) {
+        this.extractCount = extractCount;
+    }
+
+    public Integer getWeight() {
+        return weight;
+    }
+
+    public void setWeight(Integer weight) {
+        this.weight = weight;
+    }
+
+    public Paper getPaper() {
+        return paper;
+    }
+
+    public void setPaper(Paper paper) {
+        this.paper = paper;
+    }
+
+}

+ 248 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/entity/question/ExtractConfig.java

@@ -0,0 +1,248 @@
+package cn.com.qmth.dp.examcloud.oe.entity.question;
+
+import java.util.List;
+import java.util.Map;
+
+import cn.com.qmth.dp.examcloud.oe.enums.question.ExtractPolicy;
+
+/**
+ * 调卷规则
+ *
+ * @author chenken
+ */
+public class ExtractConfig extends MongoBaseEntity {
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = -2723715817328472562L;
+	/**
+     * 考试ID
+     */
+    private Long examId;
+    /**
+     * 考试类型
+     * 网络考试
+     * 传统考试
+     */
+    private String examType;
+    /**
+     * 考试名称
+     */
+    private String examName;
+    /**
+     * 课程名称
+     */
+    private String courseName;
+    /**
+     * 课程代码
+     */
+    private String courseCode;
+
+    private Course course;
+    /**
+     * 调卷类型
+     * 成套调用
+     * 重组调用
+     */
+    private String callType;
+    /**
+     * 是否生成 1:生成 0:没生成
+     * 生成预览卷
+     */
+    private Short ifFinish;
+    /**
+     * 已经生成的试卷ID Map
+     * 数据结构:
+     * {
+     * "A":"0001",
+     * "B":"0002"
+     * }
+     * A 类型下生成的paperId为 0001
+     * B 类型下生成的paperId为 0002
+     */
+    private Map<String, String> finishedPaperIdMap;
+    /**
+     * 抽取试卷对象集合
+     */
+    private List<ExamPaper> examPaperList;
+    /**
+     * 小题乱序
+     * 1:乱序
+     * 0:不乱序
+     */
+    private Short scrambling_the_question_order;
+    /**
+     * 选项乱序
+     * 1:乱序
+     * 0:不乱序
+     */
+    private Short scrambling_the_option_order;
+
+    /**
+     * 抽卷规则
+     */
+    private ExtractPolicy policy;
+    /**
+     * 类型参数
+     */
+    private Map<String, Object> params;
+    /**
+     * 机构ID
+     */
+    private String orgId;
+
+    private String orgName;
+
+    public ExtractConfig() {
+
+    }
+
+    public ExtractConfig(String id) {
+        this.id = id;
+    }
+
+    public ExtractConfig(Long exam_id, String course_code) {
+        this.examId = exam_id;
+        this.courseCode = course_code;
+    }
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public ExtractPolicy getPolicy() {
+        return policy;
+    }
+
+    public void setPolicy(ExtractPolicy policy) {
+        this.policy = policy;
+    }
+
+    public String getExamType() {
+        return examType;
+    }
+
+    public void setExamType(String examType) {
+        this.examType = examType;
+    }
+
+    public String getExamName() {
+        return examName;
+    }
+
+    public void setExamName(String examName) {
+        this.examName = examName;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getCallType() {
+        return callType;
+    }
+
+    public void setCallType(String callType) {
+        this.callType = callType;
+    }
+
+    public Short getIfFinish() {
+        return ifFinish;
+    }
+
+    public void setIfFinish(Short ifFinish) {
+        if (ifFinish == null) {
+            this.ifFinish = 0;
+        } else {
+            this.ifFinish = ifFinish;
+        }
+    }
+
+    public Map<String, Object> getParams() {
+        return params;
+    }
+
+    public void setParams(Map<String, Object> params) {
+        this.params = params;
+    }
+
+    public String getOrgId() {
+        return orgId;
+    }
+
+    public void setOrgId(String orgId) {
+        this.orgId = orgId;
+    }
+
+    public List<ExamPaper> getExamPaperList() {
+        return examPaperList;
+    }
+
+    public void setExamPaperList(List<ExamPaper> examPaperList) {
+        this.examPaperList = examPaperList;
+    }
+
+    public Short getScrambling_the_question_order() {
+        return scrambling_the_question_order;
+    }
+
+    public void setScrambling_the_question_order(Short scrambling_the_question_order) {
+        if (scrambling_the_question_order == null) {
+            this.scrambling_the_question_order = 0;
+        } else {
+            this.scrambling_the_question_order = scrambling_the_question_order;
+        }
+    }
+
+    public Short getScrambling_the_option_order() {
+        return scrambling_the_option_order;
+    }
+
+    public void setScrambling_the_option_order(Short scrambling_the_option_order) {
+        if (scrambling_the_option_order == null) {
+            this.scrambling_the_option_order = 0;
+        } else {
+            this.scrambling_the_option_order = scrambling_the_option_order;
+        }
+    }
+
+    public Map<String, String> getFinishedPaperIdMap() {
+        return finishedPaperIdMap;
+    }
+
+    public void setFinishedPaperIdMap(Map<String, String> finishedPaperIdMap) {
+        this.finishedPaperIdMap = finishedPaperIdMap;
+    }
+
+    public String getOrgName() {
+        return orgName;
+    }
+
+    public void setOrgName(String orgName) {
+        this.orgName = orgName;
+    }
+
+    public Course getCourse() {
+        return course;
+    }
+
+    public void setCourse(Course course) {
+        this.course = course;
+    }
+}

+ 23 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/enums/question/ExtractPolicy.java

@@ -0,0 +1,23 @@
+package cn.com.qmth.dp.examcloud.oe.enums.question;
+
+public enum ExtractPolicy {
+
+    RANDOM_POLICY("RANDOM_PAPER", "随机抽卷");
+
+    private String key;
+    private String value;
+
+    ExtractPolicy(String key, String value) {
+        this.key = key;
+        this.value = value;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+}

+ 181 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/modules/load_question_cache/LoadQuestionsCacheService.java

@@ -0,0 +1,181 @@
+package cn.com.qmth.dp.examcloud.oe.modules.load_question_cache;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.io.IOUtils;
+import org.springframework.stereotype.Service;
+
+import com.alibaba.fastjson.JSON;
+import com.google.common.collect.Maps;
+
+import cn.com.qmth.dp.examcloud.oe.entity.question.ExtractConfig;
+import cn.com.qmth.dp.examcloud.oe.modules.update_correct_answer.util.OKHttpUtil;
+import cn.com.qmth.examcloud.commons.exception.StatusException;
+import cn.com.qmth.examcloud.commons.util.HttpMethod;
+import cn.com.qmth.examcloud.commons.util.JsonUtil;
+import cn.com.qmth.examcloud.question.commons.core.paper.DefaultQuestionGroup;
+import cn.com.qmth.examcloud.question.commons.core.paper.DefaultQuestionStructureWrapper;
+import cn.com.qmth.examcloud.question.commons.core.question.DefaultQuestionUnit;
+import cn.com.qmth.examcloud.question.commons.core.question.QuestionType;
+import cn.com.qmth.examcloud.support.cache.bean.BasePaperCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.ExtractConfigCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.ExtractConfigDetailCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.ExtractConfigPaperCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.QuestionCacheBean;
+import okhttp3.Response;
+
+/**
+ * 加载题库缓存
+ * 
+ * @author chenken
+ *
+ */
+@Service
+public class LoadQuestionsCacheService {
+	
+	//变动参数
+	private final static String examId="14";
+	
+	private final static String key = "U_C_0_6";
+
+	private final static String token = "848cc9362be84796b902f9991a1c6629";
+	
+	private final static String domain="https://192.168.10.39/api/ecs_ques/";
+	
+	
+	
+	private final static String url1=domain+"cache-load/extract-config-list";
+	
+	private final static String url2=domain+"cache-load/extract-config-cache";
+	
+	private final static String url3=domain+"cache-load/extract-config-paper-cache";
+	
+//	private final static String url4=domain+"cache-load/base-paper-cache";
+	
+	private final static String url5=domain+"cache-load/question-cache";
+	
+	private final static String url6=domain+"cache-load/question-answer-cache";
+	
+
+	public static void main(String[] args) {
+		start();
+	}
+	public static void start() {
+		Map<String, String> params1 = Maps.newHashMap();
+		params1.put("examId", examId);
+		List<ExtractConfig> ecs=getListData(url1, params1, ExtractConfig.class);
+		if(CollectionUtils.isEmpty(ecs)) {
+			return;
+		}
+		System.out.println("考试名称:"+ecs.get(0).getExamName());
+		System.out.println("--课程数:"+ecs.size());
+		for(ExtractConfig ec:ecs) {
+			Map<String, String> params2 = Maps.newHashMap();
+			params2.put("examId", examId);
+			params2.put("courseCode", ec.getCourseCode());
+			//课程
+			ExtractConfigCacheBean ecCache=getObjectData(url2, params2, ExtractConfigCacheBean.class);
+			System.out.println("----课程code:"+ec.getCourseCode());
+			if(ecCache!=null&&CollectionUtils.isNotEmpty(ecCache.getDetails())) {
+				for(ExtractConfigDetailCacheBean ecdCache:ecCache.getDetails()) {
+					Map<String, String> params3 = Maps.newHashMap();
+					params3.put("examId", examId);
+					params3.put("courseCode", ec.getCourseCode());
+					params3.put("groupCode", ecdCache.getGroupCode());
+					params3.put("paperId", ecdCache.getPaperId());
+					//试卷
+					ExtractConfigPaperCacheBean paper=getObjectData(url3, params3, ExtractConfigPaperCacheBean.class);
+					System.out.println("------试卷名:"+paper.getDefaultPaper().getName());
+					Map<String, String> params4 = Maps.newHashMap();
+					params4.put("paperId", ecdCache.getPaperId());
+					//原卷 阅卷用
+//					BasePaperCacheBean bpCache=getObjectData(url4, params4, BasePaperCacheBean.class);
+					
+					
+					if(paper!=null&&CollectionUtils.isNotEmpty(paper.getDefaultPaper().getQuestionGroupList())) {
+						for(DefaultQuestionGroup dqg:paper.getDefaultPaper().getQuestionGroupList()) {
+							if(CollectionUtils.isNotEmpty(dqg.getQuestionWrapperList())) {
+								for(DefaultQuestionStructureWrapper dqsw:dqg.getQuestionWrapperList()) {
+									Map<String, String> params5 = Maps.newHashMap();
+									params5.put("examId", examId);
+									params5.put("courseCode", ec.getCourseCode());
+									params5.put("groupCode", ecdCache.getGroupCode());
+									params5.put("questionId", dqsw.getQuestionId());
+									//小题
+									QuestionCacheBean qCache=getObjectData(url5, params5, QuestionCacheBean.class);
+									if(isObjective(qCache)) {
+										Map<String, String> params6 = Maps.newHashMap();
+										params6.put("questionId", dqsw.getQuestionId());
+										//答案
+										getObjectData(url6, params6, BasePaperCacheBean.class);
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+	
+	private static boolean isObjective(QuestionCacheBean ques) {
+		if(CollectionUtils.isNotEmpty(ques.getDefaultQuestion().getMasterVersion().getQuestionUnitList())){
+			for(DefaultQuestionUnit qu:ques.getDefaultQuestion().getMasterVersion().getQuestionUnitList()) {
+				if(QuestionType.SINGLE_CHOICE.equals(qu.getQuestionType())
+						||QuestionType.MULTIPLE_CHOICE.equals(qu.getQuestionType())
+						||QuestionType.TRUE_OR_FALSE.equals(qu.getQuestionType())) {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	private static <T> T getObjectData(String url, Map<String, String> params, Class<T> responseType) {
+		Map<String, String> headers = Maps.newHashMap();
+		headers.put("key", key);
+		headers.put("token", token);
+		Response resp = null;
+		try {
+			resp = OKHttpUtil.call(HttpMethod.POST, url, headers, params);
+			if (resp.code() == 200) {
+				String resultJson = resp.body().string();
+				T res = JsonUtil.fromJson(resultJson, responseType);
+				return res;
+			} else {
+				throw new StatusException("500", resp.body().string());
+			}
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new StatusException("500", e.getMessage(), e);
+		} finally {
+			IOUtils.closeQuietly(resp);
+		}
+	}
+	
+	private static <T> List<T> getListData(String url, Map<String, String> params, Class<T> responseType) {
+		Map<String, String> headers = Maps.newHashMap();
+		headers.put("key", key);
+		headers.put("token", token);
+		Response resp = null;
+		try {
+			resp = OKHttpUtil.call(HttpMethod.POST, url, headers, params);
+			if (resp.code() == 200) {
+				String resultJson = resp.body().string();
+				List<T> res = JSON.parseArray(resultJson, responseType);
+				return res;
+			} else {
+				throw new StatusException("500", resp.body().string());
+			}
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new StatusException("500", e.getMessage(), e);
+		} finally {
+			IOUtils.closeQuietly(resp);
+		}
+	}
+}

+ 18 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/modules/load_question_cache/TrustAllTrustManager.java

@@ -0,0 +1,18 @@
+package cn.com.qmth.dp.examcloud.oe.modules.load_question_cache;
+
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+
+import javax.net.ssl.X509TrustManager;
+
+public class TrustAllTrustManager implements X509TrustManager {
+    @Override public void checkClientTrusted(X509Certificate[] chain, String authType)
+            throws CertificateException {
+    }
+    @Override public void checkServerTrusted(X509Certificate[] chain, String authType)
+            throws CertificateException {
+    }
+    @Override public X509Certificate[] getAcceptedIssuers() {
+        return new X509Certificate[0];
+    }
+}

+ 38 - 9
src/main/java/cn/com/qmth/dp/examcloud/oe/modules/update_correct_answer/util/OKHttpUtil.java

@@ -1,19 +1,31 @@
 package cn.com.qmth.dp.examcloud.oe.modules.update_correct_answer.util;
 
-import cn.com.qmth.examcloud.commons.util.HttpMethod;
-import cn.com.qmth.examcloud.commons.util.JsonUtil;
-import okhttp3.*;
-import okhttp3.Request.Builder;
-import org.apache.commons.collections.CollectionUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import java.io.IOException;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.concurrent.TimeUnit;
 
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.TrustManager;
+
+import org.apache.commons.collections.CollectionUtils;
+
+import cn.com.qmth.dp.examcloud.oe.modules.load_question_cache.TrustAllTrustManager;
+import cn.com.qmth.examcloud.commons.util.HttpMethod;
+import okhttp3.FormBody;
+import okhttp3.MediaType;
+import okhttp3.MultipartBody;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Request.Builder;
+import okhttp3.RequestBody;
+import okhttp3.Response;
+
 /**
  * OKHttp
  *
@@ -71,8 +83,25 @@ public class OKHttpUtil {
 	private static OkHttpClient okHttpClient;
 
 	static {
+		SSLContext sslContext = null;
+		try {
+			sslContext = SSLContext.getInstance("TLS");
+			sslContext.init(null, new TrustManager[]{new TrustAllTrustManager()}, null);
+		} catch (KeyManagementException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (NoSuchAlgorithmException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
 		okHttpClient = new OkHttpClient.Builder().connectTimeout(60, TimeUnit.SECONDS)
-				.readTimeout(60, TimeUnit.SECONDS).build();
+				.readTimeout(60, TimeUnit.SECONDS).sslSocketFactory(sslContext.getSocketFactory(), new TrustAllTrustManager()).hostnameVerifier(new HostnameVerifier() {
+					
+					@Override
+					public boolean verify(String hostname, SSLSession session) {
+						return true;
+					}
+				}).build();
 	}
 
 	public static OkHttpClient getOkHttpClient() {

+ 2 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/modules/update_student_answer/entity/ExamQuestionEntity.java

@@ -2,6 +2,8 @@ package cn.com.qmth.dp.examcloud.oe.modules.update_student_answer.entity;
 
 import java.io.Serializable;
 
+import cn.com.qmth.examcloud.question.commons.core.question.QuestionType;
+
 /**
  * @author chenken
  * @date 2018/8/17 10:18

+ 0 - 60
src/main/java/cn/com/qmth/dp/examcloud/oe/modules/update_student_answer/entity/QuestionType.java

@@ -1,60 +0,0 @@
-package cn.com.qmth.dp.examcloud.oe.modules.update_student_answer.entity;
-
-/**
- * 题型
- *
- * @author WANGWEI
- * @date 2018年8月15日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-public enum QuestionType {
-
-	/**
-	 * 单选题
-	 */
-	SINGLE_CHOICE("单选题"),
-
-	/**
-	 * 多选题
-	 */
-	MULTIPLE_CHOICE("多选题"),
-
-	/**
-	 * 填空题
-	 */
-	FILL_UP("填空题"),
-
-	/**
-	 * 问答题
-	 */
-	ESSAY("问答题"),
-
-	/**
-	 * 判断题
-	 */
-	TRUE_OR_FALSE("判断题");
-
-	// ===========================================================================
-
-	/**
-	 * 描述
-	 */
-	private String desc;
-
-	/**
-	 * 构造函数
-	 *
-	 * @param desc
-	 */
-	private QuestionType(String desc) {
-		this.desc = desc;
-	}
-
-	/**
-	 * @return the desc
-	 */
-	public String getDesc() {
-		return desc;
-	}
-
-}