wangwei 6 years ago
parent
commit
d036cc2d7c

+ 14 - 9
examcloud-core-examwork-api-provider/src/main/java/cn/com/qmth/examcloud/core/examwork/api/controller/ExamController.java

@@ -36,6 +36,8 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 
 import cn.com.qmth.examcloud.commons.base.exception.StatusException;
+import cn.com.qmth.examcloud.commons.base.helpers.DynamicEnum;
+import cn.com.qmth.examcloud.commons.base.helpers.DynamicEnumManager;
 import cn.com.qmth.examcloud.commons.base.util.JsonUtil;
 import cn.com.qmth.examcloud.commons.web.helpers.page.PageInfo;
 import cn.com.qmth.examcloud.commons.web.redis.RedisClient;
@@ -316,9 +318,10 @@ public class ExamController extends ControllerSupport {
 
 		Map<String, String> map = Maps.newHashMap();
 		List<ExamPropertyEntity> list = examPropertyRepo.findByexamId(examId);
+		DynamicEnumManager manager = ExamProperty.getDynamicEnumManager();
 		for (ExamPropertyEntity cur : list) {
-			ExamProperty ep = ExamProperty.getByKeyId(cur.getKeyId());
-			map.put(ep.name(), cur.getValue());
+			DynamicEnum de = manager.getById(cur.getKeyId());
+			map.put(de.getName(), cur.getValue());
 		}
 
 		return map;
@@ -339,9 +342,9 @@ public class ExamController extends ControllerSupport {
 			throw new StatusException("E-001250", "examId is wrong");
 		}
 		validateRootOrgIsolation(examEntity.getRootOrgId());
-
-		ExamProperty ep = ExamProperty.valueOf(key);
-		ExamPropertyEntity one = examPropertyRepo.findByexamIdAndKeyId(examId, ep.getKeyId());
+		DynamicEnumManager manager = ExamProperty.getDynamicEnumManager();
+		DynamicEnum de = manager.getByName(key);
+		ExamPropertyEntity one = examPropertyRepo.findByexamIdAndKeyId(examId, de.getId());
 		if (null == one) {
 			return null;
 		}
@@ -609,9 +612,10 @@ public class ExamController extends ControllerSupport {
 					.findByexamIdAndOrgId(next.getExamId(), next.getOrgId());
 
 			Map<String, String> map = Maps.newHashMap();
+			DynamicEnumManager manager = ExamProperty.getDynamicEnumManager();
 			for (ExamOrgPropertyEntity cur : propList) {
-				ExamProperty ep = ExamProperty.getByKeyId(cur.getKeyId());
-				map.put(ep.name(), cur.getValue());
+				DynamicEnum de = manager.getById(cur.getKeyId());
+				map.put(de.getName(), cur.getValue());
 			}
 
 			bean.setProperties(map);
@@ -764,8 +768,9 @@ public class ExamController extends ControllerSupport {
 
 		Map<String, Object> map = Maps.newHashMap();
 
+		DynamicEnumManager manager = ExamProperty.getDynamicEnumManager();
 		ExamPropertyEntity ipLimitProperty = examPropertyRepo.findByexamIdAndKeyId(exam.getId(),
-				ExamProperty.IP_LIMIT.getKeyId());
+				manager.getByName("IP_LIMIT").getId());
 
 		Boolean ipLimit = null;
 		if (null != ipLimitProperty) {
@@ -790,7 +795,7 @@ public class ExamController extends ControllerSupport {
 		realIp = realIp.trim();
 
 		ExamPropertyEntity ipAddressesProperty = examPropertyRepo.findByexamIdAndKeyId(exam.getId(),
-				ExamProperty.IP_ADDRESSES.getKeyId());
+				manager.getByName("IP_ADDRESSES").getId());
 
 		String ipAddresses = null;
 		if (null != ipAddressesProperty) {

+ 6 - 3
examcloud-core-examwork-api-provider/src/main/java/cn/com/qmth/examcloud/core/examwork/api/provider/ExamCloudServiceProvider.java

@@ -24,6 +24,8 @@ import org.springframework.web.bind.annotation.RestController;
 import com.google.common.collect.Lists;
 
 import cn.com.qmth.examcloud.commons.base.exception.StatusException;
+import cn.com.qmth.examcloud.commons.base.helpers.DynamicEnum;
+import cn.com.qmth.examcloud.commons.base.helpers.DynamicEnumManager;
 import cn.com.qmth.examcloud.commons.web.support.ControllerSupport;
 import cn.com.qmth.examcloud.core.examwork.base.enums.ExamProperty;
 import cn.com.qmth.examcloud.core.examwork.dao.ExamOrgSettingsRepo;
@@ -172,13 +174,14 @@ public class ExamCloudServiceProvider extends ControllerSupport implements ExamC
 		String key = req.getKey();
 		String value = req.getValue();
 
-		ExamProperty prop = ExamProperty.valueOf(key);
+		DynamicEnumManager manager = ExamProperty.getDynamicEnumManager();
+		DynamicEnum de = manager.getByName(key);
 
-		ExamPropertyEntity entity = examPropertyRepo.findByexamIdAndKeyId(examId, prop.getKeyId());
+		ExamPropertyEntity entity = examPropertyRepo.findByexamIdAndKeyId(examId, de.getId());
 		if (null == entity) {
 			entity = new ExamPropertyEntity();
 			entity.setExamId(examId);
-			entity.setKeyId(prop.getKeyId());
+			entity.setKeyId(de.getId());
 		}
 		entity.setValue(value);
 

+ 10 - 166
examcloud-core-examwork-base/src/main/java/cn/com/qmth/examcloud/core/examwork/base/enums/ExamProperty.java

@@ -1,7 +1,6 @@
 package cn.com.qmth.examcloud.core.examwork.base.enums;
 
-import java.util.HashMap;
-import java.util.Map;
+import cn.com.qmth.examcloud.commons.base.helpers.DynamicEnumManager;
 
 /**
  * 类注释
@@ -10,182 +9,27 @@ import java.util.Map;
  * @date 2018年8月6日
  * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
  */
-public enum ExamProperty {
+public class ExamProperty {
 
-	/**
-	 * 是否允许上传附件(离线考试)
-	 */
-	CAN_UPLOAD_ATTACHMENT(31L, "是否允许上传附件(离线考试)"),
-	/**
-	 * 是否显示客观题成绩
-	 */
-	IS_OBJ_SCORE_VIEW(30L, "是否显示客观题成绩"),
-	/**
-	 * IP白名单
-	 */
-	IP_ADDRESSES(29L, "IP白名单"),
-	/**
-	 * 是否IP限制
-	 */
-	IP_LIMIT(28L, "是否IP限制"),
-	/**
-	 * 活体检测结束分钟数
-	 */
-	FACE_VERIFY_END_MINUTE(27L, "活体检测结束分钟数"),
-	/**
-	 * 活体检测开始分钟数
-	 */
-	FACE_VERIFY_START_MINUTE(26L, "活体检测开始分钟数"),
-	/**
-	 * 是否开启人脸活体检测
-	 */
-	IS_FACE_VERIFY(25L, "是否开启人脸活体检测"),
-	/**
-	 * 阅卷方式
-	 */
-	MARKING_TYPE(24L, "阅卷方式"),
-	/**
-	 * 预警阈值
-	 */
-	WARN_THRESHOLD(23L, "预警阈值"),
-	/**
-	 * 抓拍间隔
-	 */
-	SNAPSHOT_INTERVAL(21L, "抓拍间隔"),
-	/**
-	 * 进入考试是否验证人脸识别(强制、非强制)
-	 */
-	IS_FACE_CHECK(21L, "进入考试是否验证人脸识别(强制、非强制)"),
-	/**
-	 * 是否启用人脸识别
-	 */
-	IS_FACE_ENABLE(20L, "是否启用人脸识别"),
-	/**
-	 * 套题补充说明
-	 */
-	nestedAnswerRemark(19L, "套题补充说明"),
-	/**
-	 * 问答题补充说明
-	 */
-	TEXT_ANSWER_REMARK(18L, "问答题补充说明"),
-	/**
-	 * 填空题补充说明
-	 */
-	FILL_BLANK_REMARK(17L, "填空题补充说明"),
-	/**
-	 * 判断题补充说明
-	 */
-	BOOL_ANSWER_REMARK(16L, "判断题补充说明"),
-	/**
-	 * 多选题补充说明
-	 */
-	MUTIPLE_ANSWER_REMARK(15L, "多选题补充说明"),
-	/**
-	 * 单选题补充说明
-	 */
-	SINGLE_ANSWER_REMARK(14L, "单选题补充说明"),
-	/**
-	 * 填空题补充说明是否可填
-	 */
-	FILL_BLANK_EDIT(13L, "填空题补充说明是否可填"),
-	/**
-	 * 判断题补充说明是否可填
-	 */
-	BOOL_EDIT(12L, "判断题补充说明是否可填"),
-	/**
-	 * 多选题补充说明是否可填
-	 */
-	MUTIPLE_EDIT(11L, "多选题补充说明是否可填"),
-	/**
-	 * 单选题补充说明是否可填
-	 */
-	SINGLE_EDIT(10L, "单选题补充说明是否可填"),
-	/**
-	 * 练习模式
-	 */
-	PRACTICE_TYPE(9L, "练习模式"),
-	/**
-	 * 作弊说明
-	 */
-	CHEATING_REMARK(8L, "作弊说明"),
-	/**
-	 * 是否展示作弊
-	 */
-	SHOW_CHEATING_REMARK(7L, "是否展示作弊"),
-	/**
-	 * 考后说明
-	 */
-	AFTER_EXAM_REMARK(6L, "考后说明"),
-	/**
-	 * 考前说明
-	 */
-	BEFORE_EXAM_REMARK(5L, "考前说明"),
-	/**
-	 * 断点续考时间(秒)
-	 */
-	EXAM_RECONNECT_TIME(4L, "断点续考时间(秒)"),
-	/**
-	 * 交卷冻结时间
-	 */
-	FREEZE_TIME(3L, "交卷冻结时间"),
-	/**
-	 * 是否入学考试
-	 */
-	IS_ENTRANCE_EXAM(2L, "是否入学考试"),
-
-	/**
-	 * 发布成绩
-	 */
-	SCORE_PUBLISHING(1L, "发布成绩");
-
-	// ===========================================================================
+	private static DynamicEnumManager manager;
 
 	/**
-	 * key ID
-	 */
-	private Long keyId;
-
-	/**
-	 * 描述
-	 */
-	private String desc;
-
-	private static Map<Long, ExamProperty> map = new HashMap<Long, ExamProperty>();
-
-	static {
-		for (ExamProperty e : ExamProperty.values()) {
-			map.put(e.keyId, e);
-		}
-	}
-
-	/**
-	 * 构造函数
+	 * 启动初始化
 	 *
-	 * @param keyId
-	 * @param desc
+	 * @author WANGWEI
 	 */
-	private ExamProperty(Long keyId, String desc) {
-		this.keyId = keyId;
-		this.desc = desc;
+	public static void init() {
+		manager = DynamicEnumManager.newInstance("exam-properties.xml");
 	}
 
 	/**
-	 * get ExamProperty by keyId
+	 * 方法注释
 	 *
 	 * @author WANGWEI
-	 * @param keyId
 	 * @return
 	 */
-	public static ExamProperty getByKeyId(Long keyId) {
-		return map.get(keyId);
-	}
-
-	public Long getKeyId() {
-		return keyId;
-	}
-
-	public String getDesc() {
-		return desc;
+	public static DynamicEnumManager getDynamicEnumManager() {
+		return manager;
 	}
 
 }

+ 27 - 22
examcloud-core-examwork-service/src/main/java/cn/com/qmth/examcloud/core/examwork/service/impl/ExamServiceImpl.java

@@ -11,6 +11,8 @@ import org.springframework.stereotype.Service;
 import com.google.common.collect.Maps;
 
 import cn.com.qmth.examcloud.commons.base.exception.StatusException;
+import cn.com.qmth.examcloud.commons.base.helpers.DynamicEnum;
+import cn.com.qmth.examcloud.commons.base.helpers.DynamicEnumManager;
 import cn.com.qmth.examcloud.core.basic.api.OrgCloudService;
 import cn.com.qmth.examcloud.core.examwork.base.enums.ExamProperty;
 import cn.com.qmth.examcloud.core.examwork.dao.ExamOrgPropertyRepo;
@@ -97,7 +99,7 @@ public class ExamServiceImpl implements ExamService {
 		}
 
 		Map<String, String> properties = examInfo.getProperties();
-		Map<ExamProperty, String> map = checkAndGetExamProperties(properties);
+		Map<DynamicEnum, String> map = checkAndGetExamProperties(properties);
 
 		ExamEntity findOne = examRepo.findByNameAndRootOrgId(exam.getName(), exam.getRootOrgId());
 		if (null != findOne && !findOne.getId().equals(exam.getId())) {
@@ -106,15 +108,15 @@ public class ExamServiceImpl implements ExamService {
 
 		ExamEntity saved = examRepo.save(exam);
 
-		for (Entry<ExamProperty, String> entry : map.entrySet()) {
-			ExamProperty prop = entry.getKey();
+		for (Entry<DynamicEnum, String> entry : map.entrySet()) {
+			DynamicEnum de = entry.getKey();
 			String value = entry.getValue();
 			ExamPropertyEntity entity = examPropertyRepo.findByexamIdAndKeyId(saved.getId(),
-					prop.getKeyId());
+					de.getId());
 			if (null == entity) {
 				entity = new ExamPropertyEntity();
 				entity.setExamId(saved.getId());
-				entity.setKeyId(prop.getKeyId());
+				entity.setKeyId(de.getId());
 			}
 			entity.setValue(value);
 
@@ -131,34 +133,36 @@ public class ExamServiceImpl implements ExamService {
 	 * @param properties
 	 * @return
 	 */
-	private Map<ExamProperty, String> checkAndGetExamProperties(Map<String, String> properties) {
-		Map<ExamProperty, String> map = Maps.newHashMap();
+	private Map<DynamicEnum, String> checkAndGetExamProperties(Map<String, String> properties) {
+		DynamicEnumManager manager = ExamProperty.getDynamicEnumManager();
+
+		Map<DynamicEnum, String> map = Maps.newHashMap();
 		for (Entry<String, String> entry : properties.entrySet()) {
 			String key = entry.getKey();
 			String value = entry.getValue();
 			if (StringUtils.isBlank(value)) {
 				continue;
 			}
-			ExamProperty ep = null;
+			DynamicEnum de = null;
 			try {
-				ep = ExamProperty.valueOf(key);
+				de = manager.getByName(key);
 			} catch (Exception e) {
 				throw new StatusException("E-001004", "考试属性错误");
 			}
-			map.put(ep, value.trim());
+			map.put(de, value.trim());
 		}
 
-		String beforeExamRemark = map.get(ExamProperty.BEFORE_EXAM_REMARK);
+		String beforeExamRemark = properties.get("BEFORE_EXAM_REMARK");
 		if (null != beforeExamRemark && beforeExamRemark.length() > 250000) {
 			throw new StatusException("E-001002", "考前说明内容过大");
 		}
 
-		String afterExamRemark = map.get(ExamProperty.AFTER_EXAM_REMARK);
+		String afterExamRemark = properties.get("AFTER_EXAM_REMARK");
 		if (null != afterExamRemark && afterExamRemark.length() > 250000) {
 			throw new StatusException("E-001002", "考后说明内容过大");
 		}
 
-		String cheatingRemark = map.get(ExamProperty.CHEATING_REMARK);
+		String cheatingRemark = properties.get("CHEATING_REMARK");
 		if (null != cheatingRemark && cheatingRemark.length() > 250000) {
 			throw new StatusException("E-001002", "作弊说明内容过大");
 		}
@@ -198,20 +202,20 @@ public class ExamServiceImpl implements ExamService {
 		examOrgEntity.setExamId(examOrgInfo.getExamId());
 		examOrgEntity.setOrgId(examOrgInfo.getOrgId());
 
-		Map<ExamProperty, String> map = checkAndGetExamProperties(examOrgInfo.getProperties());
+		Map<DynamicEnum, String> map = checkAndGetExamProperties(examOrgInfo.getProperties());
 
 		ExamOrgSettingsEntity saved = examOrgSettingsRepo.save(examOrgEntity);
 
-		for (Entry<ExamProperty, String> entry : map.entrySet()) {
-			ExamProperty prop = entry.getKey();
+		for (Entry<DynamicEnum, String> entry : map.entrySet()) {
+			DynamicEnum de = entry.getKey();
 			String value = entry.getValue();
-			ExamOrgPropertyEntity entity = examOrgPropertyRepo.findByexamIdAndOrgIdAndKeyId(
-					saved.getExamId(), saved.getOrgId(), prop.getKeyId());
+			ExamOrgPropertyEntity entity = examOrgPropertyRepo
+					.findByexamIdAndOrgIdAndKeyId(saved.getExamId(), saved.getOrgId(), de.getId());
 			if (null == entity) {
 				entity = new ExamOrgPropertyEntity();
 				entity.setExamId(saved.getExamId());
 				entity.setOrgId(saved.getOrgId());
-				entity.setKeyId(prop.getKeyId());
+				entity.setKeyId(de.getId());
 			}
 			entity.setValue(value);
 
@@ -223,18 +227,19 @@ public class ExamServiceImpl implements ExamService {
 
 	@Override
 	public String getOrgProperty(Long examId, Long orgId, String key) {
-		ExamProperty ep = ExamProperty.valueOf(key);
+		DynamicEnumManager manager = ExamProperty.getDynamicEnumManager();
+		DynamicEnum de = manager.getByName(key);
 
 		if (null != orgId) {
 			ExamOrgPropertyEntity examOrgPropertyEntity = examOrgPropertyRepo
-					.findByexamIdAndOrgIdAndKeyId(examId, orgId, ep.getKeyId());
+					.findByexamIdAndOrgIdAndKeyId(examId, orgId, de.getId());
 			if (null != examOrgPropertyEntity) {
 				return examOrgPropertyEntity.getValue();
 			}
 		}
 
 		ExamPropertyEntity examPropertyEntity = examPropertyRepo.findByexamIdAndKeyId(examId,
-				ep.getKeyId());
+				de.getId());
 		if (null == examPropertyEntity) {
 			return null;
 		}

+ 6 - 1
examcloud-core-examwork-starter/src/main/java/cn/com/qmth/examcloud/core/examwork/starter/CoreExamWorkApp.java

@@ -33,6 +33,7 @@ import cn.com.qmth.examcloud.commons.base.logging.SLF4JImpl;
 import cn.com.qmth.examcloud.commons.web.redis.RedisClient;
 import cn.com.qmth.examcloud.commons.web.redis.RedisClientImpl;
 import cn.com.qmth.examcloud.commons.web.support.CustomResponseErrorHandler;
+import cn.com.qmth.examcloud.core.examwork.base.enums.ExamProperty;
 
 @ComponentScan(basePackages = {"cn.com.qmth"})
 @EntityScan(basePackages = {"cn.com.qmth"})
@@ -49,7 +50,8 @@ public class CoreExamWorkApp {
 
 	/**
 	 * main
-	 * 
+	 *
+	 * @author WANGWEI
 	 * @param args
 	 * @throws Exception
 	 */
@@ -57,6 +59,9 @@ public class CoreExamWorkApp {
 		if (LOG instanceof SLF4JImpl) {
 			MDC.put("TRACE_ID", Thread.currentThread().getName());
 		}
+
+		ExamProperty.init();
+
 		SpringApplication.run(CoreExamWorkApp.class, args);
 	}