import cn.com.qmth.stmms.ms.Application; import cn.com.qmth.stmms.ms.commons.utils.RandomUtil; import cn.com.qmth.stmms.ms.core.domain.*; import cn.com.qmth.stmms.ms.core.domain.user.MarkRight; import cn.com.qmth.stmms.ms.core.domain.user.MarkUser; import cn.com.qmth.stmms.ms.core.domain.user.Role; import cn.com.qmth.stmms.ms.core.repository.*; import cn.com.qmth.stmms.ms.core.vo.Subject; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import net.coobird.thumbnailator.Thumbnails; import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.util.CollectionUtils; import java.io.File; import java.io.IOException; import java.util.*; @RunWith(SpringRunner.class) @SpringBootTest(classes = {Application.class}) // 指定启动类 public class BatchCreateDataTest { private static final Logger logger = LoggerFactory.getLogger(BatchCreateDataTest.class); @Autowired private ExamQuestionRepo examQuestionRepo; @Autowired private StudentRepo studentRepo; @Autowired private PaperRepo paperRepo; @Autowired private WorkRepo workRepo; @Autowired private MarkSubjectRepo markSubjectRepo; @Autowired private MarkUserRepo markUserRepo; @Autowired private ParamSettingRepo paramSettingRepo; @Autowired private LevelRepo levelRepo; @Autowired RandomUtil randomUtil; // 考生初始准考证号 private int initNumber = 1000000; // 考生数量 private static int COUNT = 60000; // 评卷员数量 private static int MARKER_COUNT = 15; // 科组长数量 private static int MARKER_LEADER_COUNT = 4; // 工作id private static Long WORK_ID = 1L; // 是否开启粗分档 private static Boolean isOpenRoughLevel = true; // 生成科目 private List subjects = Arrays.asList(Subject.SX, Subject.SC, Subject.SM); // 是否复制图片 private boolean isCreateImage = false; // 图片存放目录 private String baseDir = "D:\\my_workspaces\\ide_workspace_qmth\\idea_workspace\\stmms-ms-server\\upload"; /** * 生成数据 * * @throws Exception */ // @Test public void createTask() throws Exception { createData(); } private void createData() throws Exception { // 生成工作 createWork(); // 生成用户 createUser(); randomUtil.getRandom(WORK_ID, false); //生成exam_question信息 List questions = createQuestions(); examQuestionRepo.save(questions); logger.info("questions新增:{}", questions.size()); //生成student信息 List students = createStudent(); List data = new ArrayList<>(); for (Student stu : students) { if (data.size() == 2000) { studentRepo.save(data); data.clear(); } data.add(stu); } //将剩下的数据也导入 if (!data.isEmpty()) { studentRepo.save(data); } logger.info("students新增:{}", students.size()); //生成paper信息 List papers = createPaper(students, subjects); List data1 = new ArrayList<>(); for (Paper p : papers) { if (data1.size() == 2000) { paperRepo.save(data1); data1.clear(); } data1.add(p); } //将剩下的数据也导入 if (!data1.isEmpty()) { paperRepo.save(data1); } logger.info("papers新增:{}", papers.size()); if (isCreateImage) { //生成image createImage(students); logger.info("image成功"); //生成sheet createSheet(students); logger.info("sheet成功"); //生成thumb createThumb(students); logger.info("thumb成功"); } } private void createWork() { Work work = workRepo.findOne(WORK_ID); if (work == null) { work = new Work(); work.setId(WORK_ID); work.setActive(true); work.setCreatedOn(new Date()); work.setName("批量测试"); workRepo.save(work); } List markSubjects = markSubjectRepo.findAllByWorkId(work.getId()); if (CollectionUtils.isEmpty(markSubjects)) { Subject[] subjects = Subject.values(); for (int i = 0; i < subjects.length - 1; i++) { MarkSubject markSubject = new MarkSubject(subjects[i], work.getId()); markSubject.setWorkId(work.getId()); markSubject.setEnable(true); markSubjectRepo.save(markSubject); } } //新增工作的同时,初始化该工作的全局参数 ParamSetting paramSetting = ParamSetting.init(WORK_ID); if (isOpenRoughLevel) { String levelConfig = paramSetting.getLevelConfig(); JSONObject jsonObject = JSON.parseObject(levelConfig, JSONObject.class); jsonObject.put("roughLevelEnable", 1); paramSetting.setLevelConfig(JSON.toJSONString(jsonObject)); } paramSetting.setWorkId(WORK_ID); paramSettingRepo.save(paramSetting); //默认增加档位 Level aLevel = new Level(WORK_ID, "A", 0, 100, 90, Level.LevelType.ADMITED, 95, "1", 93); Level bLevel = new Level(WORK_ID, "B", 1, 89, 85, Level.LevelType.ADMITED, 87, "1", 93); Level cLevel = new Level(WORK_ID, "C", 2, 84, 80, Level.LevelType.ADMITED, 82, "2", 80); Level dLevel = new Level(WORK_ID, "D", 3, 79, 75, Level.LevelType.ADMITED, 77, "2", 80); Level eLevel = new Level(WORK_ID, "E", 4, 74, 70, Level.LevelType.ADMITED, 72, "3", 68); Level fLevel = new Level(WORK_ID, "F", 5, 69, 65, Level.LevelType.ADMITED, 67, "3", 68); Level gLevel = new Level(WORK_ID, "G", 6, 64, 60, Level.LevelType.ADMITED, 62, "3", 68); Level hLevel = new Level(WORK_ID, "H", 7, 59, 55, Level.LevelType.ADMITED, 57, "4", 55); Level iLevel = new Level(WORK_ID, "I", 8, 54, 50, Level.LevelType.ADMITED, 52, "4", 55); Level jLevel = new Level(WORK_ID, "J", 9, 49, 45, Level.LevelType.ADMITED, 47, "5", 35); Level kLevel = new Level(WORK_ID, "K", 10, 44, 0, Level.LevelType.ADMITED, 40, "5", 35); List levels = Arrays.asList(aLevel, bLevel, cLevel, dLevel, eLevel, fLevel, gLevel, hLevel, iLevel, jLevel, kLevel); levelRepo.save(levels); } private void createUser() { List markUsers = new ArrayList<>(); for (Subject subject : subjects) { // 评卷员 for (int i = 1; i <= MARKER_COUNT; i++) { MarkUser markUser = new MarkUser(); markUser.setLoginName(subject.name().toLowerCase() + i); markUser.setName(subject.name() + i); markUser.setRole(Role.MARKER); markUser.setPassword("123456"); markUser.setPwChangedCount(1); markUser.setSubject(subject); markUser.setWorkId(WORK_ID); markUser.setMarkRight(MarkRight.ALLOW_ALL); markUser.setWeight(1D); markUser.setLeaderConfirm(true); markUser.setLevelCallback(false); markUser.setOneClickLevel(false); markUser.setStandardVolume(false); markUsers.add(markUser); } // 科组长 for (int i = 1; i <= MARKER_LEADER_COUNT; i++) { MarkUser markUser = new MarkUser(); markUser.setLoginName(subject.name().toLowerCase() + "-kzz" + i); markUser.setName(subject.name() + "KZZ" + i); markUser.setRole(Role.MARK_LEADER); markUser.setPassword("123456"); markUser.setPwChangedCount(1); markUser.setSubject(subject); markUser.setWorkId(WORK_ID); markUser.setMarkRight(MarkRight.ALLOW_ALL); markUser.setWeight(null); markUser.setLeaderConfirm(true); markUser.setLevelCallback(true); markUser.setOneClickLevel(true); markUser.setStandardVolume(true); markUsers.add(markUser); } } markUserRepo.save(markUsers); } private List createQuestions() { List questions = new ArrayList<>(); ExamQuestion examQuestion1 = new ExamQuestion(); examQuestion1.setId(1l); examQuestion1.setAreaCode("1"); examQuestion1.setAreaName("省艺术培训协会"); examQuestion1.setName("速写1"); examQuestion1.setSubject(Subject.SX); examQuestion1.setWorkId(WORK_ID); // examQuestion1.setTest(0); questions.add(examQuestion1); ExamQuestion examQuestion2 = new ExamQuestion(); examQuestion2.setId(2l); examQuestion2.setAreaCode("1"); examQuestion2.setAreaName("省艺术培训协会"); examQuestion2.setName("色彩1"); examQuestion2.setSubject(Subject.SC); examQuestion2.setWorkId(WORK_ID); // examQuestion2.setTest(0); questions.add(examQuestion2); ExamQuestion examQuestion3 = new ExamQuestion(); examQuestion3.setId(3l); examQuestion3.setAreaCode("1"); examQuestion3.setAreaName("省艺术培训协会"); examQuestion3.setName("素描1"); examQuestion3.setSubject(Subject.SM); examQuestion3.setWorkId(WORK_ID); // examQuestion3.setTest(0); questions.add(examQuestion3); return questions; } private List createStudent() { List students = new ArrayList<>(); StringJoiner stringJoiner = new StringJoiner(","); stringJoiner.add("SX:" + (subjects.contains(Subject.SX) ? 1 : 0)) .add("SC:" + (subjects.contains(Subject.SC) ? 1 : 0)) .add("SM:" + (subjects.contains(Subject.SM) ? 1 : 0)); for (int i = 0; i < COUNT; i++) { Student student = new Student(); student.setAreaCode("1"); student.setAreaName("省艺术培训协会"); student.setExamNumber(String.valueOf(initNumber + i)); student.setExamRoom("第一考场"); student.setSchool("湖北美术学院"); student.setAbsent(false); student.setName("考生" + i); student.setUploadStatus(stringJoiner.toString()); student.setWorkId(WORK_ID); student.setSourceName("湖北"); student.setRelateExamNumber(student.getExamNumber()); students.add(student); } return students; } private List createPaper(List students, List subjects) throws Exception { List papers = new ArrayList<>(); for (Subject subject : subjects) { ExamQuestion examQuestion = examQuestionRepo.findByWorkIdAndSubjectAndAreaCode(WORK_ID, subject, "1"); for (Student student : students) { Long random = getRandom(student.getWorkId(), student.getExamNumber()); Paper paper = new Paper(student.getWorkId(), subject, examQuestion, student, false, random); papers.add(paper); } } return papers; } private void createImage(List students) throws IOException { String imageDir = baseDir + File.separator + "images" + File.separator + WORK_ID + File.separator + Subject.SX.name() + File.separator + "1"; File out = new File(imageDir); if (!out.exists()) { out.mkdirs(); } File in = new File(imageDir, "sx.jpg"); for (Student student : students) { Thumbnails.of(in).scale(1f).toFile(new File(imageDir, student.getExamNumber() + ".jpg")); } } private void createSheet(List students) throws IOException { String sheetDir = baseDir + File.separator + "sheet" + File.separator + WORK_ID + File.separator + Subject.SX.name() + File.separator + "1"; File out = new File(sheetDir); if (!out.exists()) { out.mkdirs(); } File in = new File(sheetDir, "sx.jpg"); for (Student student : students) { Thumbnails.of(in).scale(1f).toFile(new File(sheetDir, student.getExamNumber() + ".jpg")); } } private void createThumb(List students) throws IOException { String thumbDir = baseDir + File.separator + "thumbs" + File.separator + WORK_ID + File.separator + Subject.SX.name() + File.separator + "1"; File out = new File(thumbDir); if (!out.exists()) { out.mkdirs(); } File in = new File(thumbDir, "sx.jpg"); for (Student student : students) { Thumbnails.of(in).scale(1f).toFile(new File(thumbDir, student.getExamNumber() + ".jpg")); } } /** * 获取随机号 * * @param workId * @param examNumber * @return * @throws Exception */ public Long getRandom(Long workId, String examNumber) throws Exception { int count = 0, result = 0; Long random = 0L; while (true) { random = randomUtil.getRandomMap().get(workId).get(new Random().nextInt(randomUtil.getRandomMap().get(workId).size())); // random = RandomUtil.randomList.get(new Random().nextInt(RandomUtil.randomList.size())); result = paperRepo.countByWorkIdAndExamNumberAndRandomSeq(workId, examNumber, random); if (result == 0 && random != Long.parseLong(examNumber.substring(3, examNumber.length()))) { break; } else { count++; } if (count > 1000) { // throw new Exception("重复几率较高,建议重新生成随机号"); randomUtil.getRandom(workId, true); getRandom(workId, examNumber); } } return random; } }