Просмотр исходного кода

按科目导出小题各题型数

xiatian 3 лет назад
Родитель
Сommit
3b8ac3e638

+ 93 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/modules/export_course_questions_count/CourseQuestionsCountRetDto.java

@@ -0,0 +1,93 @@
+package cn.com.qmth.dp.examcloud.oe.modules.export_course_questions_count;
+
+import cn.com.qmth.dp.examcloud.oe.excel.ExcelProperty;
+
+public class CourseQuestionsCountRetDto {
+	@ExcelProperty(name = "课程名称", width = 40, index = 1)
+	private String courseName;
+	@ExcelProperty(name = "课程代码", width = 40, index = 2)
+	private String courseCode;
+	@ExcelProperty(name = "单选", width = 40, index = 3)
+	private long singleAnswerQuestion;
+	
+	@ExcelProperty(name = "多选", width = 40, index = 4)
+	private long multipleAnswerQuestion;
+	
+	@ExcelProperty(name = "判断", width = 40, index = 5)
+	private long boolAnswerQuestion;
+	
+	@ExcelProperty(name = "填空", width = 40, index = 6)
+	private long fillBlankQuestion;
+	
+	@ExcelProperty(name = "问答", width = 40, index = 7)
+	private long textAnswerQuestion;
+	
+	@ExcelProperty(name = "套题", width = 40, index = 8)
+	private long nestedAnswerQuestion;
+
+	public String getCourseName() {
+		return courseName;
+	}
+
+	public void setCourseName(String courseName) {
+		this.courseName = courseName;
+	}
+
+	public String getCourseCode() {
+		return courseCode;
+	}
+
+	public void setCourseCode(String courseCode) {
+		this.courseCode = courseCode;
+	}
+
+	public long getSingleAnswerQuestion() {
+		return singleAnswerQuestion;
+	}
+
+	public void setSingleAnswerQuestion(long singleAnswerQuestion) {
+		this.singleAnswerQuestion = singleAnswerQuestion;
+	}
+
+	public long getMultipleAnswerQuestion() {
+		return multipleAnswerQuestion;
+	}
+
+	public void setMultipleAnswerQuestion(long multipleAnswerQuestion) {
+		this.multipleAnswerQuestion = multipleAnswerQuestion;
+	}
+
+	public long getBoolAnswerQuestion() {
+		return boolAnswerQuestion;
+	}
+
+	public void setBoolAnswerQuestion(long boolAnswerQuestion) {
+		this.boolAnswerQuestion = boolAnswerQuestion;
+	}
+
+	public long getFillBlankQuestion() {
+		return fillBlankQuestion;
+	}
+
+	public void setFillBlankQuestion(long fillBlankQuestion) {
+		this.fillBlankQuestion = fillBlankQuestion;
+	}
+
+	public long getTextAnswerQuestion() {
+		return textAnswerQuestion;
+	}
+
+	public void setTextAnswerQuestion(long textAnswerQuestion) {
+		this.textAnswerQuestion = textAnswerQuestion;
+	}
+
+	public long getNestedAnswerQuestion() {
+		return nestedAnswerQuestion;
+	}
+
+	public void setNestedAnswerQuestion(long nestedAnswerQuestion) {
+		this.nestedAnswerQuestion = nestedAnswerQuestion;
+	}
+	
+	
+}

+ 133 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/modules/export_course_questions_count/ExportCourseQuestionsCountService.java

@@ -0,0 +1,133 @@
+package cn.com.qmth.dp.examcloud.oe.modules.export_course_questions_count;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.aggregation.Aggregation;
+import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
+import org.springframework.data.mongodb.core.aggregation.AggregationResults;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.RowMapper;
+import org.springframework.stereotype.Service;
+
+import cn.com.qmth.dp.examcloud.oe.entity.question.Course;
+import cn.com.qmth.dp.examcloud.oe.entity.question.Question;
+import cn.com.qmth.dp.examcloud.oe.enums.question.QuesStructType;
+import cn.com.qmth.dp.examcloud.oe.excel.ExportUtils;
+
+/**
+ * 按科目导出小题各题型数.单线程处理
+ * 
+ * @author chenken
+ *
+ */
+@Service
+public class ExportCourseQuestionsCountService {
+//	private String rootOrgId = "371";
+	private String rootOrgId = "1627";
+
+	@Autowired
+	private JdbcTemplate jdbcTemplate;
+	@Autowired
+	private MongoTemplate mongoTemplate;
+
+	public void start() {
+		Date s=new Date();
+		List<CourseQuestionsCountRetDto> ret = new ArrayList<CourseQuestionsCountRetDto>();
+		List<Course> cs = getCourse();
+		System.out.println("courseCount:" + cs.size());
+		int index = 0;
+		if (CollectionUtils.isNotEmpty(cs)) {
+			for (Course c : cs) {
+				index++;
+				CourseQuestionsCountRetDto rd = new CourseQuestionsCountRetDto();
+				ret.add(rd);
+				rd.setCourseCode(c.getCode());
+				rd.setCourseName(c.getName());
+				List<QuestionTypeCount> tc = countByType(c.getCode());
+				if (CollectionUtils.isNotEmpty(tc)) {
+					setCount(rd, tc);
+				}
+				System.out.println("index:" + index);
+			}
+		}
+		FileOutputStream fos = null;
+		try {
+			File file = new File("d:/ret.xlsx");
+			if (file.exists()) {
+				file.delete();
+			}
+			file.createNewFile();
+			fos = new FileOutputStream(file);
+			ExportUtils.makeExcel(CourseQuestionsCountRetDto.class, ret, fos);
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			if (fos != null) {
+				try {
+					fos.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		System.out.println("finish! totalQuestionCount:" + getTotalQuestionCount());
+		Date e=new Date();
+		System.out.println("time:" + (e.getTime()-s.getTime()));
+	}
+
+	private void setCount(CourseQuestionsCountRetDto rd, List<QuestionTypeCount> tc) {
+		for (QuestionTypeCount t : tc) {
+			if (t.getQuestionType().equals(QuesStructType.SINGLE_ANSWER_QUESTION.name())) {
+				rd.setSingleAnswerQuestion(t.getCount());
+			} else if (t.getQuestionType().equals(QuesStructType.MULTIPLE_ANSWER_QUESTION.name())) {
+				rd.setMultipleAnswerQuestion(t.getCount());
+			} else if (t.getQuestionType().equals(QuesStructType.BOOL_ANSWER_QUESTION.name())) {
+				rd.setBoolAnswerQuestion(t.getCount());
+			} else if (t.getQuestionType().equals(QuesStructType.FILL_BLANK_QUESTION.name())) {
+				rd.setFillBlankQuestion(t.getCount());
+			} else if (t.getQuestionType().equals(QuesStructType.TEXT_ANSWER_QUESTION.name())) {
+				rd.setTextAnswerQuestion(t.getCount());
+			} else if (t.getQuestionType().equals(QuesStructType.NESTED_ANSWER_QUESTION.name())) {
+				rd.setNestedAnswerQuestion(t.getCount());
+			}
+		}
+	}
+
+	private long getTotalQuestionCount() {
+		Query query = new Query();
+		query.addCriteria(Criteria.where("orgId").is(rootOrgId));
+		long count = mongoTemplate.count(query, Question.class, "question");
+		return count;
+	}
+
+
+	private List<Course> getCourse() {
+		String sql = "select t.code,t.name,t.id from ec_b_course t where t.root_org_id=" + rootOrgId
+				+ " order by t.code";
+		RowMapper<Course> rowMapper = new BeanPropertyRowMapper<Course>(Course.class);
+		List<Course> ret = jdbcTemplate.query(sql, rowMapper);
+		return ret;
+	}
+
+	private List<QuestionTypeCount> countByType(String courseCode) {
+		List<AggregationOperation> operations = new ArrayList<>();
+		operations.add(Aggregation.match(Criteria.where("orgId").is(rootOrgId).and("course.code").is(courseCode)));
+		operations.add(Aggregation.group("questionType").count().as("count"));
+		operations.add(Aggregation.project("count").and("questionType").previousOperation());
+		Aggregation aggregation = Aggregation.newAggregation(operations);
+		AggregationResults<QuestionTypeCount> outputTypeCount = mongoTemplate.aggregate(aggregation, Question.class,
+				QuestionTypeCount.class);
+		return outputTypeCount.getMappedResults();
+	}
+}

+ 38 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/modules/export_course_questions_count/ExportCourseQuestionsCountService2.java

@@ -0,0 +1,38 @@
+package cn.com.qmth.dp.examcloud.oe.modules.export_course_questions_count;
+
+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;
+
+/**
+ * 按科目导出小题各题型数.多线程处理
+ * 
+ * @author chenken
+ *
+ */
+@Service
+public class ExportCourseQuestionsCountService2 {
+//	private String rootOrgId = "371";
+	private String rootOrgId = "1627";
+	private int threadCount=10;
+
+	public void start() {
+		Date s=new Date();
+		ExportQuesProducer pr = SpringContextHolder.getBean(ExportQuesProducer.class);
+		try {
+			Map<String, Object> param=new HashMap<>();
+			param.put("rootOrgId", rootOrgId);
+			pr.startDispose(ExportQuesConsumer.class, threadCount, param);
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+
+		}
+		Date e=new Date();
+		System.out.println("time:" + (e.getTime()-s.getTime()));
+	}
+
+}

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

@@ -0,0 +1,72 @@
+package cn.com.qmth.dp.examcloud.oe.modules.export_course_questions_count;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Scope;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.aggregation.Aggregation;
+import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
+import org.springframework.data.mongodb.core.aggregation.AggregationResults;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.stereotype.Service;
+
+import cn.com.qmth.dp.examcloud.oe.entity.question.Course;
+import cn.com.qmth.dp.examcloud.oe.entity.question.Question;
+import cn.com.qmth.dp.examcloud.oe.enums.question.QuesStructType;
+import cn.com.qmth.dp.examcloud.oe.multithread.Consumer;
+
+@Service
+@Scope("prototype")
+public class ExportQuesConsumer extends Consumer<Course> {
+
+	@Autowired
+	private MongoTemplate mongoTemplate;
+
+	@Override
+	public void consume(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());
+		List<QuestionTypeCount> tc = countByType(c.getCode(),rootOrgId);
+		if (CollectionUtils.isNotEmpty(tc)) {
+			setCount(rd, tc);
+		}
+
+	}
+	private void setCount(CourseQuestionsCountRetDto rd, List<QuestionTypeCount> tc) {
+		for (QuestionTypeCount t : tc) {
+			if (t.getQuestionType().equals(QuesStructType.SINGLE_ANSWER_QUESTION.name())) {
+				rd.setSingleAnswerQuestion(t.getCount());
+			} else if (t.getQuestionType().equals(QuesStructType.MULTIPLE_ANSWER_QUESTION.name())) {
+				rd.setMultipleAnswerQuestion(t.getCount());
+			} else if (t.getQuestionType().equals(QuesStructType.BOOL_ANSWER_QUESTION.name())) {
+				rd.setBoolAnswerQuestion(t.getCount());
+			} else if (t.getQuestionType().equals(QuesStructType.FILL_BLANK_QUESTION.name())) {
+				rd.setFillBlankQuestion(t.getCount());
+			} else if (t.getQuestionType().equals(QuesStructType.TEXT_ANSWER_QUESTION.name())) {
+				rd.setTextAnswerQuestion(t.getCount());
+			} else if (t.getQuestionType().equals(QuesStructType.NESTED_ANSWER_QUESTION.name())) {
+				rd.setNestedAnswerQuestion(t.getCount());
+			}
+		}
+	}
+	private List<QuestionTypeCount> countByType(String courseCode,String rootOrgId) {
+		List<AggregationOperation> operations = new ArrayList<>();
+		operations.add(Aggregation.match(Criteria.where("orgId").is(rootOrgId).and("course.code").is(courseCode)));
+		operations.add(Aggregation.group("questionType").count().as("count"));
+		operations.add(Aggregation.project("count").and("questionType").previousOperation());
+		Aggregation aggregation = Aggregation.newAggregation(operations);
+		AggregationResults<QuestionTypeCount> outputTypeCount = mongoTemplate.aggregate(aggregation, Question.class,
+				QuestionTypeCount.class);
+		return outputTypeCount.getMappedResults();
+	}
+
+
+}

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

@@ -0,0 +1,100 @@
+package cn.com.qmth.dp.examcloud.oe.modules.export_course_questions_count;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.RowMapper;
+import org.springframework.stereotype.Service;
+
+import cn.com.qmth.dp.examcloud.oe.entity.question.Course;
+import cn.com.qmth.dp.examcloud.oe.entity.question.Question;
+import cn.com.qmth.dp.examcloud.oe.excel.ExportUtils;
+import cn.com.qmth.dp.examcloud.oe.multithread.Consumer;
+import cn.com.qmth.dp.examcloud.oe.multithread.Producer;
+
+@Service
+public class ExportQuesProducer extends Producer {
+
+	@Autowired
+	private JdbcTemplate jdbcTemplate;
+	
+	@Autowired
+	private MongoTemplate mongoTemplate;
+	
+	@Override
+	protected void produce() throws Exception {
+		Map<String, Object> param=getParam();
+		List<Course> cs = getCourse((String)param.get("rootOrgId"));
+		if (CollectionUtils.isNotEmpty(cs)) {
+			for (Course c : cs) {
+				offer(c);
+			}
+		}
+		List<CourseQuestionsCountRetDto> ret = new ArrayList<CourseQuestionsCountRetDto>();
+		int index=0;
+		for(Consumer c:getConsumers()) {
+			ret.addAll(c.getRet());
+			index++;
+		}
+		Collections.sort(ret, new Comparator<CourseQuestionsCountRetDto>() {
+			@Override
+			public int compare(CourseQuestionsCountRetDto o1, CourseQuestionsCountRetDto o2) {
+				String c1 = o1.getCourseCode();
+				String c2 = o2.getCourseCode();
+				return c1.compareTo(c2);
+			}
+
+		});
+		FileOutputStream fos = null;
+		try {
+			File file = new File("d:/ret.xlsx");
+			if (file.exists()) {
+				file.delete();
+			}
+			file.createNewFile();
+			fos = new FileOutputStream(file);
+			ExportUtils.makeExcel(CourseQuestionsCountRetDto.class, ret, fos);
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			if (fos != null) {
+				try {
+					fos.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		System.out.println("courseCount:" + cs.size());
+		System.out.println("finish! TotalQuestionCount:" + getTotalQuestionCount((String)param.get("rootOrgId")));
+	}
+	
+	private List<Course> getCourse(String rootOrgId) {
+		String sql = "select t.code,t.name,t.id from ec_b_course t where t.root_org_id=" + rootOrgId
+				+ " order by t.code";
+		RowMapper<Course> rowMapper = new BeanPropertyRowMapper<Course>(Course.class);
+		List<Course> ret = jdbcTemplate.query(sql, rowMapper);
+		return ret;
+	}
+	
+	private long getTotalQuestionCount(String rootOrgId) {
+		Query query = new Query();
+		query.addCriteria(Criteria.where("orgId").is(rootOrgId));
+		long count = mongoTemplate.count(query, Question.class, "question");
+		return count;
+	}
+
+}

+ 19 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/modules/export_course_questions_count/QuestionTypeCount.java

@@ -0,0 +1,19 @@
+package cn.com.qmth.dp.examcloud.oe.modules.export_course_questions_count;
+
+public class QuestionTypeCount {
+	private String questionType;
+	private long count;
+	public long getCount() {
+		return count;
+	}
+	public void setCount(long count) {
+		this.count = count;
+	}
+	public String getQuestionType() {
+		return questionType;
+	}
+	public void setQuestionType(String questionType) {
+		this.questionType = questionType;
+	}
+	
+}

+ 0 - 13
src/main/java/cn/com/qmth/dp/examcloud/oe/modules/export_questions_count/ExportQuesConsumer.java

@@ -1,13 +0,0 @@
-package cn.com.qmth.dp.examcloud.oe.modules.export_questions_count;
-
-import cn.com.qmth.dp.examcloud.oe.multithread.Consumer;
-
-public class ExportQuesConsumer extends Consumer {
-
-	@Override
-	public void consume(Object t) {
-		// TODO Auto-generated method stub
-		
-	}
-
-}

+ 0 - 15
src/main/java/cn/com/qmth/dp/examcloud/oe/modules/export_questions_count/ExportQuesProducer.java

@@ -1,15 +0,0 @@
-package cn.com.qmth.dp.examcloud.oe.modules.export_questions_count;
-
-import java.util.Map;
-
-import cn.com.qmth.dp.examcloud.oe.multithread.Producer;
-
-public class ExportQuesProducer extends Producer {
-
-	@Override
-	protected void produce(Map<String, Object> param) throws Exception {
-		// TODO Auto-generated method stub
-
-	}
-
-}

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

@@ -1,27 +1,31 @@
 package cn.com.qmth.dp.examcloud.oe.multithread;
 
-import java.util.HashMap;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.logging.log4j.ThreadContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import cn.com.qmth.dp.examcloud.oe.modules.export_questions_count.RetDto;
 
 public abstract class Consumer<T>  extends Thread{
 	private static final Logger logger = LoggerFactory.getLogger(Consumer.class);
 	private Basket basket;
 	
-	private Map<String,RetDto> ret;
+	private List<Object> ret=new ArrayList<>();
 	
 	private String traceId;
 	
+	/**
+	 * 业务参数
+	 */
+	private Map<String, Object> param;
+	
 	public Consumer() {
 	}
 	@Override
 	public void run() {
-		ret=new HashMap<>();
 		logger.info("*******************Consumer:"+Thread.currentThread().getId()+" start");
 		try {
 			while (true) {
@@ -63,11 +67,20 @@ public abstract class Consumer<T>  extends Thread{
 	public void setTraceId(String traceId) {
 		this.traceId = traceId;
 	}
-	public Map<String, RetDto> getRet() {
+	public List<Object> getRet() {
 		return ret;
 	}
-	public void setRet(Map<String, RetDto> ret) {
-		this.ret = ret;
+	
+	public void addRet(Object r) {
+		ret.add(r);
+	}
+	protected Map<String, Object> getParam() {
+		return param;
 	}
+	protected void setParam(Map<String, Object> param) {
+		this.param = param;
+	}
+	
+	
 	
 }

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

@@ -1,5 +1,6 @@
 package cn.com.qmth.dp.examcloud.oe.multithread;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -7,12 +8,13 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import cn.com.qmth.examcloud.commons.exception.StatusException;
+import cn.com.qmth.examcloud.web.support.SpringContextHolder;
 
 public abstract class Producer {
 	private static final Logger logger = LoggerFactory.getLogger(Producer.class);
 	private Basket basket;
 	
-	private List<Consumer<?>> consumers;
+	private List<Consumer<?>> consumers=new ArrayList<>();
 	
 	/**
 	 * 业务参数
@@ -47,7 +49,7 @@ public abstract class Producer {
 		try {
 			logger.info("*******************Producer:开始处理");
 			// 生产数据
-			produce(param);
+			produce();
 			logger.info("*******************Producer:生产结束");
 			// 发送生产结束信息
 			endConsumer();
@@ -82,8 +84,9 @@ public abstract class Producer {
 	private void startConsumer() throws InstantiationException, IllegalAccessException {
 		int count = basket.getConsumerCount();
 		for (int i = 0; i < count; i++) {
-			Consumer<?> co = (Consumer<?>) consumer.newInstance();
+			Consumer<?> co = (Consumer<?>) SpringContextHolder.getBean(consumer);
 			co.setBasket(basket);
+			co.setParam(param);
 			consumers.add(co);
 			co.start();
 		}
@@ -133,7 +136,7 @@ public abstract class Producer {
 		basket.await();
 	}
 
-	protected abstract void produce(Map<String, Object> param) throws Exception;
+	protected abstract void produce() throws Exception;
 
 	public List<Consumer<?>> getConsumers() {
 		return consumers;
@@ -143,5 +146,11 @@ public abstract class Producer {
 		this.consumers = consumers;
 	}
 
+	protected Map<String, Object> getParam() {
+		return param;
+	}
+	protected void setParam(Map<String, Object> param) {
+		this.param = param;
+	}
 	
 }