浏览代码

抓拍信息数据处理

xiatian 3 年之前
父节点
当前提交
6463868aee

+ 23 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/modules/cut_exam_capture_data/CutExamCaptureData.java

@@ -0,0 +1,23 @@
+package cn.com.qmth.dp.examcloud.oe.modules.cut_exam_capture_data;
+
+public class CutExamCaptureData {
+	private String cameraInfos;
+	private Long examRecordDataId;
+
+	public String getCameraInfos() {
+		return cameraInfos;
+	}
+
+	public void setCameraInfos(String cameraInfos) {
+		this.cameraInfos = cameraInfos;
+	}
+
+	public Long getExamRecordDataId() {
+		return examRecordDataId;
+	}
+
+	public void setExamRecordDataId(Long examRecordDataId) {
+		this.examRecordDataId = examRecordDataId;
+	}
+
+}

+ 98 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/modules/cut_exam_capture_data/CutExamCaptureDataConsumer.java

@@ -0,0 +1,98 @@
+package cn.com.qmth.dp.examcloud.oe.modules.cut_exam_capture_data;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Scope;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.RowMapper;
+import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
+import org.springframework.jdbc.core.namedparam.SqlParameterSourceUtils;
+import org.springframework.stereotype.Service;
+
+import cn.com.qmth.dp.examcloud.oe.multithread.Consumer;
+
+@Service
+@Scope("prototype")
+public class CutExamCaptureDataConsumer extends Consumer<CutExamCaptureDataDto> {
+	
+	@Autowired
+	private JdbcTemplate jdbcTemplate;
+
+	@Autowired
+	private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
+
+	@Override
+	public void consume(Map<String, Object> param, CutExamCaptureDataDto dto) {
+		List<CutExamCaptureData> cs = getData(dto.getStart(), dto.getEnd());
+		if(CollectionUtils.isEmpty(cs)) {
+			return;
+		}
+		Map<String, ExamCaptureCameraInfo> map = new LinkedHashMap<>();
+		for (CutExamCaptureData c : cs) {
+			try {
+				if (StringUtils.isNotBlank(c.getCameraInfos())) {
+					JSONArray jsonArray = new JSONArray(c.getCameraInfos());
+					for (int i = 0; i < jsonArray.length(); i++) {
+						JSONObject jsonObject = (JSONObject) jsonArray.get(i);
+						ExamCaptureCameraInfo ci = new ExamCaptureCameraInfo();
+						ci.setExamRecordDataId(c.getExamRecordDataId());
+						ci.setDetail(getVal(jsonObject, "detail"));
+						ci.setName(getVal(jsonObject, "name"));
+						ci.setPid(getVal(jsonObject, "pid"));
+						ci.setVid(getVal(jsonObject, "vid"));
+						if (jsonObject.isNull("pid") || StringUtils.isBlank(jsonObject.getString("pid"))) {
+							ci.setVirtualCamera(true);
+						} else {
+							ci.setVirtualCamera(false);
+						}
+						if (map.get(getKey(ci))==null) {
+							map.put(getKey(ci), ci);
+						}
+					}
+				}
+			} catch (JSONException e) {
+			}
+		}
+		if(!map.isEmpty()) {
+			List<ExamCaptureCameraInfo> list = new ArrayList<>();
+			for(ExamCaptureCameraInfo ci:map.values()) {
+				list.add(ci);
+			}
+			namedParameterJdbcTemplate.batchUpdate(
+					"INSERT INTO ec_oe_exam_capture_camera_info (exam_record_data_id, pid,vid,virtual_camera,name,detail,creation_time,update_time)"
+							+ " VALUES (:examRecordDataId, :pid,:vid,:virtualCamera,:name,:detail,now(),now())",
+					SqlParameterSourceUtils.createBatch(list));
+		}
+	}
+	
+    private String getVal(JSONObject jsonObject,String name) throws JSONException {
+    	if (jsonObject.isNull(name) || StringUtils.isBlank(jsonObject.getString(name))) {
+    		return "";
+    	}else {
+    		return jsonObject.getString(name);
+    	}
+    }
+    
+    private String getKey(ExamCaptureCameraInfo ci) {
+    	return ci.getExamRecordDataId()+"_"+ci.getPid()+"_"+ci.getVid()+"_"+ci.getName();
+    }
+
+	private List<CutExamCaptureData> getData(long start, long end) {
+		String sql = "select t.exam_record_data_id examRecordDataId,t.camera_infos cameraInfos from ec_oe_exam_capture t where t.exam_record_data_id>"
+				+ start + " and t.exam_record_data_id<=" + end + " order by t.exam_record_data_id ";
+		RowMapper<CutExamCaptureData> rowMapper = new BeanPropertyRowMapper<CutExamCaptureData>(
+				CutExamCaptureData.class);
+		List<CutExamCaptureData> ret = jdbcTemplate.query(sql, rowMapper);
+		return ret;
+	}
+}

+ 25 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/modules/cut_exam_capture_data/CutExamCaptureDataDto.java

@@ -0,0 +1,25 @@
+package cn.com.qmth.dp.examcloud.oe.modules.cut_exam_capture_data;
+
+public class CutExamCaptureDataDto {
+	private Long start;
+	private Long end;
+	public Long getStart() {
+		return start;
+	}
+	public void setStart(Long start) {
+		this.start = start;
+	}
+	public Long getEnd() {
+		return end;
+	}
+	public void setEnd(Long end) {
+		this.end = end;
+	}
+	public CutExamCaptureDataDto(Long start, Long end) {
+		super();
+		this.start = start;
+		this.end = end;
+	}
+
+
+}

+ 57 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/modules/cut_exam_capture_data/CutExamCaptureDataProducer.java

@@ -0,0 +1,57 @@
+package cn.com.qmth.dp.examcloud.oe.modules.cut_exam_capture_data;
+
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Service;
+
+import cn.com.qmth.dp.examcloud.oe.multithread.Producer;
+
+@Service
+public class CutExamCaptureDataProducer extends Producer {
+
+	@Autowired
+	private JdbcTemplate jdbcTemplate;
+
+	@Override
+	protected void produce(Map<String, Object> param) throws Exception {
+		Integer idStep = (Integer) param.get("idStep");
+		if(idStep==null) {
+			throw new RuntimeException("idStep can not be null");
+		}
+		Long start = (Long) param.get("startId");
+		if(start==null) {
+			start= 0L;
+		}
+		Long maxId=(Long) param.get("maxId");
+		if(maxId==null) {
+			maxId= getMaxId();
+		}
+		if(maxId!=null) {
+			if(start>=maxId) {
+				throw new RuntimeException("param invalid");
+			}
+			Long end = start+idStep;
+			for (;;) {
+				offer(new CutExamCaptureDataDto(start, end));
+				System.out.println("---------------------produce offer:"+end+"/"+maxId);
+				if (end > maxId) {
+					break;
+				}
+				start = start + idStep;
+				end = end + idStep;
+			}
+		}
+		System.out.println("---------------------finish!");
+	}
+
+	private long getMaxId() {
+		String sql = "select max(t.exam_record_data_id) examRecordDataId from ec_oe_exam_capture t";
+		Long ret = jdbcTemplate.queryForObject(sql, Long.class);
+		return ret;
+	}
+
+
+
+}

+ 54 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/modules/cut_exam_capture_data/CutExamCaptureDataService.java

@@ -0,0 +1,54 @@
+package cn.com.qmth.dp.examcloud.oe.modules.cut_exam_capture_data;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.springframework.stereotype.Service;
+
+import cn.com.qmth.examcloud.web.support.SpringContextHolder;
+
+/**
+ * 抓拍数据camareInfos 处理.多线程处理
+ * 
+ * @author chenken
+ *
+ */
+@Service
+public class CutExamCaptureDataService {
+	/**
+	 * 取数据范围(startId,startId+idStep]。为空取0L
+	 */
+	private Integer startId = null;
+	/**
+	 * 整个任务结束判断标志。为空取数据库最大ID
+	 */
+	private Integer maxId = null;
+	/**
+	 * 每批数据id间隔。不能为空
+	 */
+	private Integer idStep = 1000;
+	
+	/**
+	 * 线程数
+	 */
+	private int threadCount=10;
+
+	public void start() {
+		Date s=new Date();
+		CutExamCaptureDataProducer pr = SpringContextHolder.getBean(CutExamCaptureDataProducer.class);
+		try {
+			Map<String, Object> param=new HashMap<>();
+			param.put("idStep", idStep);
+			param.put("startId", startId);
+			param.put("maxId", maxId);
+			pr.startDispose(CutExamCaptureDataConsumer.class, threadCount, param);
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+
+		}
+		Date e=new Date();
+		System.out.println("time:" + (e.getTime()-s.getTime()));
+	}
+
+}

+ 65 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/modules/cut_exam_capture_data/ExamCaptureCameraInfo.java

@@ -0,0 +1,65 @@
+package cn.com.qmth.dp.examcloud.oe.modules.cut_exam_capture_data;
+
+public class ExamCaptureCameraInfo {
+
+	private Long examRecordDataId;
+
+	private Boolean virtualCamera;
+
+	private String detail;
+
+	private String pid;
+
+	private String vid;
+
+	private String name;
+
+	public Long getExamRecordDataId() {
+		return examRecordDataId;
+	}
+
+	public void setExamRecordDataId(Long examRecordDataId) {
+		this.examRecordDataId = examRecordDataId;
+	}
+
+	public Boolean getVirtualCamera() {
+		return virtualCamera;
+	}
+
+	public void setVirtualCamera(Boolean virtualCamera) {
+		this.virtualCamera = virtualCamera;
+	}
+
+	public String getDetail() {
+		return detail;
+	}
+
+	public void setDetail(String detail) {
+		this.detail = detail;
+	}
+
+	public String getPid() {
+		return pid;
+	}
+
+	public void setPid(String pid) {
+		this.pid = pid;
+	}
+
+	public String getVid() {
+		return vid;
+	}
+
+	public void setVid(String vid) {
+		this.vid = vid;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+}

+ 1 - 2
src/main/java/cn/com/qmth/dp/examcloud/oe/modules/export_course_questions_count/ExportQuesConsumer.java

@@ -27,10 +27,9 @@ public class ExportQuesConsumer extends Consumer<Course> {
 	private MongoTemplate mongoTemplate;
 
 	@Override
-	public void consume(Course c) {
+	public void consume(Map<String, Object> param,Course c) {
 		CourseQuestionsCountRetDto rd = new CourseQuestionsCountRetDto();
 		addRet(rd);
-		Map<String, Object> param=getParam();
 		String rootOrgId=(String)param.get("rootOrgId");
 		rd.setCourseCode(c.getCode());
 		rd.setCourseName(c.getName());

+ 1 - 2
src/main/java/cn/com/qmth/dp/examcloud/oe/modules/export_course_questions_count/ExportQuesProducer.java

@@ -35,8 +35,7 @@ public class ExportQuesProducer extends Producer {
 	private MongoTemplate mongoTemplate;
 	
 	@Override
-	protected void produce() throws Exception {
-		Map<String, Object> param=getParam();
+	protected void produce(Map<String, Object> param) throws Exception {
 		List<Course> cs = getCourse((String)param.get("rootOrgId"));
 		if (CollectionUtils.isNotEmpty(cs)) {
 			for (Course c : cs) {

+ 3 - 3
src/main/java/cn/com/qmth/dp/examcloud/oe/multithread/Consumer.java

@@ -41,9 +41,9 @@ public abstract class Consumer<T>  extends Thread{
 				}
 				@SuppressWarnings("unchecked")
 				T t=(T)o;
-				logger.info("*******************Consumer:"+Thread.currentThread().getId()+" consume");
+//				logger.info("*******************Consumer:"+Thread.currentThread().getId()+" consume");
 				//消费数据实现
-				consume(t);
+				consume(this.param,t);
 			}
 		} catch (Exception e) {
 			basket.setExcuteError(true);
@@ -54,7 +54,7 @@ public abstract class Consumer<T>  extends Thread{
 			ThreadContext.clearAll();
 		}
 	}
-	public abstract void consume(T t);
+	public abstract void consume(Map<String, Object> param,T t);
 	public Basket getBasket() {
 		return basket;
 	}

+ 2 - 2
src/main/java/cn/com/qmth/dp/examcloud/oe/multithread/Producer.java

@@ -49,7 +49,7 @@ public abstract class Producer {
 		try {
 			logger.info("*******************Producer:开始处理");
 			// 生产数据
-			produce();
+			produce(this.param);
 			logger.info("*******************Producer:生产结束");
 			// 发送生产结束信息
 			endConsumer();
@@ -136,7 +136,7 @@ public abstract class Producer {
 		basket.await();
 	}
 
-	protected abstract void produce() throws Exception;
+	protected abstract void produce(Map<String, Object> param) throws Exception;
 
 	public List<Consumer<?>> getConsumers() {
 		return consumers;