wangwei il y a 5 ans
Parent
commit
c580956ec8

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

@@ -94,6 +94,7 @@ import cn.com.qmth.examcloud.core.oe.admin.api.response.CheckExamIsStartedResp;
 import cn.com.qmth.examcloud.support.cache.CacheHelper;
 import cn.com.qmth.examcloud.support.cache.bean.ExamOrgPropertyCacheBean;
 import cn.com.qmth.examcloud.support.cache.bean.ExamOrgSettingsCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.ExamPropertyCacheBean;
 import cn.com.qmth.examcloud.support.cache.bean.ExamSettingsCacheBean;
 import cn.com.qmth.examcloud.support.cache.bean.OrgPropertyCacheBean;
 import cn.com.qmth.examcloud.support.cache.bean.StudentCacheBean;
@@ -1323,9 +1324,8 @@ public class ExamController extends ControllerSupport {
 		User accessUser = getAccessUser();
 		OrgPropertyCacheBean orgConf = CacheHelper.getOrgProperty(accessUser.getRootOrgId(),
 				"WEIXIN_ANSWER_ENABLED");
-		StudentCacheBean student = CacheHelper.getStudent(accessUser.getUserId());
-		ExamOrgPropertyCacheBean examConf = CacheHelper.getExamOrgProperty(examId,
-				student.getOrgId(), "WEIXIN_ANSWER_ENABLED");
+		ExamPropertyCacheBean examConf = CacheHelper.getExamProperty(examId,
+				"WEIXIN_ANSWER_ENABLED");
 
 		String orgValue = orgConf.getValue();
 		String examValue = examConf.getValue();

+ 11 - 1
examcloud-core-examwork-service/src/main/java/cn/com/qmth/examcloud/core/examwork/service/ExamService.java

@@ -38,7 +38,7 @@ public interface ExamService {
 	ExamSpecialSettingsEntity saveExamSpecialSettings(ExamSpecialSettingsInfo examOrgInfo);
 
 	/**
-	 * 查询机构属性
+	 * 查询考试机构属性
 	 *
 	 * @author WANGWEI
 	 * @param examId
@@ -58,4 +58,14 @@ public interface ExamService {
 	 */
 	List<Map<String, Object>> importExamSpecialSettings(Long examId, File file);
 
+	/**
+	 * 查询考试属性
+	 *
+	 * @author WANGWEI
+	 * @param examId
+	 * @param key
+	 * @return
+	 */
+	String getExamProperty(Long examId, String key);
+
 }

+ 41 - 0
examcloud-core-examwork-service/src/main/java/cn/com/qmth/examcloud/core/examwork/service/cache/ExamPropertyCache.java

@@ -0,0 +1,41 @@
+package cn.com.qmth.examcloud.core.examwork.service.cache;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import cn.com.qmth.examcloud.core.examwork.service.ExamService;
+import cn.com.qmth.examcloud.support.cache.bean.ExamPropertyCacheBean;
+import cn.com.qmth.examcloud.web.cache.RandomObjectRedisCache;
+
+@Service
+public class ExamPropertyCache extends RandomObjectRedisCache<ExamPropertyCacheBean> {
+
+	@Autowired
+	private ExamService examService;
+
+	@Override
+	public ExamPropertyCacheBean loadFromResource(Object... keys) {
+		Long examId = (Long) keys[0];
+		String key = (String) keys[1];
+
+		String value = examService.getExamProperty(examId, key);
+
+		ExamPropertyCacheBean b = new ExamPropertyCacheBean();
+		b.setExamId(examId);
+		b.setKey(key);
+		b.setValue(value);
+		return b;
+	}
+
+	@Override
+	protected String getKeyPrefix() {
+		return "E_EXAM_PROP:";
+	}
+
+	@Override
+	protected int getTimeout() {
+		// 2分钟
+		return 60 * 2;
+	}
+
+}

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

@@ -48,6 +48,7 @@ import cn.com.qmth.examcloud.core.examwork.service.ExamService;
 import cn.com.qmth.examcloud.core.examwork.service.ExamStudentService;
 import cn.com.qmth.examcloud.core.examwork.service.bean.ExamInfo;
 import cn.com.qmth.examcloud.core.examwork.service.bean.ExamSpecialSettingsInfo;
+import cn.com.qmth.examcloud.core.examwork.service.cache.ExamPropertyCache;
 import cn.com.qmth.examcloud.core.examwork.service.cache.ExamSettingsCache;
 import cn.com.qmth.examcloud.support.privilege.PrivilegeDefine;
 import cn.com.qmth.examcloud.support.privilege.PrivilegeManager;
@@ -91,6 +92,9 @@ public class ExamServiceImpl implements ExamService {
 	@Autowired
 	ExamSettingsCache examSettingsCache;
 
+	@Autowired
+	ExamPropertyCache examPropertyCache;
+
 	private static final String[] EXAM_ORG_SETTINGS_EXCEL_HEADER = new String[]{"学习中心ID", "学习中心代码",
 			"学习中心名称", "是否可以考试(是/否)", "开始考试时间 yyyy-MM-dd hh:mm:ss", "结束考试时间 yyyy-MM-dd hh:mm:ss"};
 
@@ -273,6 +277,11 @@ public class ExamServiceImpl implements ExamService {
 		dataSyncCloudService.syncExam(req);
 
 		examSettingsCache.remove(saved.getId());
+
+		for (String cur : properties.keySet()) {
+			examPropertyCache.remove(saved.getId(), cur);
+		}
+
 		return saved;
 	}
 
@@ -309,33 +318,32 @@ public class ExamServiceImpl implements ExamService {
 		}
 
 		String beforeExamRemark = properties.get("BEFORE_EXAM_REMARK");
-        
-        
+
 		if (null != beforeExamRemark) {
 			Document doc = Jsoup.parse(beforeExamRemark);
 			Matcher m = pattern.matcher(doc.text());
 			String simpleText = m.replaceAll("").replaceAll(" ", "");
-	        if (simpleText.length() > 800) {
-	            throw new StatusException("001002", "考前说明内容不得超过800个字符");
-	        }
-	        long imgsize=getImgSizeByBase64String(beforeExamRemark);
-	        if(imgsize>150*1024) {
-	        	throw new StatusException("001002", "考前说明图片总大小不得超过150KB");
-	        }
+			if (simpleText.length() > 800) {
+				throw new StatusException("001002", "考前说明内容不得超过800个字符");
+			}
+			long imgsize = getImgSizeByBase64String(beforeExamRemark);
+			if (imgsize > 150 * 1024) {
+				throw new StatusException("001002", "考前说明图片总大小不得超过150KB");
+			}
 		}
 
 		String afterExamRemark = properties.get("AFTER_EXAM_REMARK");
-		if (null != afterExamRemark ) {
+		if (null != afterExamRemark) {
 			Document doc = Jsoup.parse(afterExamRemark);
 			Matcher m = pattern.matcher(doc.text());
 			String simpleText = m.replaceAll("").replaceAll(" ", "");
-	        if (simpleText.length() > 800) {
-	            throw new StatusException("001002", "考后说明内容不得超过800个字符");
-	        }
-	        long imgsize=getImgSizeByBase64String(afterExamRemark);
-	        if(imgsize>150*1024) {
-	        	throw new StatusException("001002", "考后说明图片总大小不得超过150KB");
-	        }
+			if (simpleText.length() > 800) {
+				throw new StatusException("001002", "考后说明内容不得超过800个字符");
+			}
+			long imgsize = getImgSizeByBase64String(afterExamRemark);
+			if (imgsize > 150 * 1024) {
+				throw new StatusException("001002", "考后说明图片总大小不得超过150KB");
+			}
 		}
 
 		String cheatingRemark = properties.get("CHEATING_REMARK");
@@ -343,13 +351,13 @@ public class ExamServiceImpl implements ExamService {
 			Document doc = Jsoup.parse(cheatingRemark);
 			Matcher m = pattern.matcher(doc.text());
 			String simpleText = m.replaceAll("").replaceAll(" ", "");
-	        if (simpleText.length() > 800) {
-	            throw new StatusException("001002", "作弊说明内容不得超过800个字符");
-	        }
-	        long imgsize=getImgSizeByBase64String(cheatingRemark);
-	        if(imgsize>150*1024) {
-	        	throw new StatusException("001002", "作弊说明图片总大小不得超过150KB");
-	        }
+			if (simpleText.length() > 800) {
+				throw new StatusException("001002", "作弊说明内容不得超过800个字符");
+			}
+			long imgsize = getImgSizeByBase64String(cheatingRemark);
+			if (imgsize > 150 * 1024) {
+				throw new StatusException("001002", "作弊说明图片总大小不得超过150KB");
+			}
 		}
 
 		// 校验机构权限
@@ -380,31 +388,33 @@ public class ExamServiceImpl implements ExamService {
 	}
 
 	/**
-	 * @param content 内容
+	 * @param content
+	 *            内容
 	 * @return 内容中图片文件总大小
 	 */
 	private long getImgSizeByBase64String(String content) {
-		long size=0;
-		if(StringUtils.isNoneEmpty(content)) {
+		long size = 0;
+		if (StringUtils.isNoneEmpty(content)) {
 			Document doc = Jsoup.parse(content);
-	        Elements imgs=doc.getElementsByTag("img");
-	        if(imgs!=null) {
-	        	for(Element img:imgs) {
-	        		String src=img.attr("src");
-	        		if(src.startsWith("data:")) {
-		        		String base64=src.split(",")[1];
-		        		int equalIndex= base64.indexOf("=");
-		        		if(equalIndex>0){
-		        			base64=base64.substring(0, equalIndex);
-		        		}
-		        		long fileSize=base64.length()-(base64.length()/8)*2;
-		        		size=size+fileSize;
-	        		}
-	        	}
-	        }
+			Elements imgs = doc.getElementsByTag("img");
+			if (imgs != null) {
+				for (Element img : imgs) {
+					String src = img.attr("src");
+					if (src.startsWith("data:")) {
+						String base64 = src.split(",")[1];
+						int equalIndex = base64.indexOf("=");
+						if (equalIndex > 0) {
+							base64 = base64.substring(0, equalIndex);
+						}
+						long fileSize = base64.length() - (base64.length() / 8) * 2;
+						size = size + fileSize;
+					}
+				}
+			}
 		}
 		return size;
 	}
+
 	/*
 	 * 实现
 	 *
@@ -703,4 +713,18 @@ public class ExamServiceImpl implements ExamService {
 		return false;
 	}
 
+	@Override
+	public String getExamProperty(Long examId, String key) {
+		DynamicEnumManager manager = ExamProperty.getDynamicEnumManager();
+		DynamicEnum de = manager.getByName(key);
+
+		ExamPropertyEntity examPropertyEntity = examPropertyRepo.findByExamIdAndKeyId(examId,
+				de.getId());
+		if (null == examPropertyEntity) {
+			return null;
+		}
+
+		return examPropertyEntity.getValue();
+	}
+
 }