BatchCreateDataTest.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. import cn.com.qmth.stmms.ms.Application;
  2. import cn.com.qmth.stmms.ms.commons.utils.RandomUtil;
  3. import cn.com.qmth.stmms.ms.core.domain.*;
  4. import cn.com.qmth.stmms.ms.core.domain.user.MarkRight;
  5. import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
  6. import cn.com.qmth.stmms.ms.core.domain.user.Role;
  7. import cn.com.qmth.stmms.ms.core.repository.*;
  8. import cn.com.qmth.stmms.ms.core.vo.Subject;
  9. import com.alibaba.fastjson.JSON;
  10. import com.alibaba.fastjson.JSONObject;
  11. import net.coobird.thumbnailator.Thumbnails;
  12. import org.junit.Test;
  13. import org.junit.runner.RunWith;
  14. import org.slf4j.Logger;
  15. import org.slf4j.LoggerFactory;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.boot.test.context.SpringBootTest;
  18. import org.springframework.test.context.junit4.SpringRunner;
  19. import org.springframework.util.CollectionUtils;
  20. import java.io.File;
  21. import java.io.IOException;
  22. import java.util.*;
  23. @RunWith(SpringRunner.class)
  24. @SpringBootTest(classes = {Application.class})
  25. // 指定启动类
  26. public class BatchCreateDataTest {
  27. private static final Logger logger = LoggerFactory.getLogger(BatchCreateDataTest.class);
  28. @Autowired
  29. private ExamQuestionRepo examQuestionRepo;
  30. @Autowired
  31. private StudentRepo studentRepo;
  32. @Autowired
  33. private PaperRepo paperRepo;
  34. @Autowired
  35. private WorkRepo workRepo;
  36. @Autowired
  37. private MarkSubjectRepo markSubjectRepo;
  38. @Autowired
  39. private MarkUserRepo markUserRepo;
  40. @Autowired
  41. private ParamSettingRepo paramSettingRepo;
  42. @Autowired
  43. private LevelRepo levelRepo;
  44. @Autowired
  45. RandomUtil randomUtil;
  46. // 考生初始准考证号
  47. private int initNumber = 1000000;
  48. // 考生数量
  49. private static int COUNT = 60000;
  50. // 评卷员数量
  51. private static int MARKER_COUNT = 15;
  52. // 科组长数量
  53. private static int MARKER_LEADER_COUNT = 4;
  54. // 工作id
  55. private static Long WORK_ID = 1L;
  56. // 是否开启粗分档
  57. private static Boolean isOpenRoughLevel = true;
  58. // 生成科目
  59. private List<Subject> subjects = Arrays.asList(Subject.SX, Subject.SC, Subject.SM);
  60. // 是否复制图片
  61. private boolean isCreateImage = false;
  62. // 图片存放目录
  63. private String baseDir = "D:\\my_workspaces\\ide_workspace_qmth\\idea_workspace\\stmms-ms-server\\upload";
  64. /**
  65. * 生成数据
  66. *
  67. * @throws Exception
  68. */
  69. // @Test
  70. public void createTask() throws Exception {
  71. createData();
  72. }
  73. private void createData() throws Exception {
  74. // 生成工作
  75. createWork();
  76. // 生成用户
  77. createUser();
  78. randomUtil.getRandom(WORK_ID, false);
  79. //生成exam_question信息
  80. List<ExamQuestion> questions = createQuestions();
  81. examQuestionRepo.save(questions);
  82. logger.info("questions新增:{}", questions.size());
  83. //生成student信息
  84. List<Student> students = createStudent();
  85. List<Student> data = new ArrayList<>();
  86. for (Student stu : students) {
  87. if (data.size() == 2000) {
  88. studentRepo.save(data);
  89. data.clear();
  90. }
  91. data.add(stu);
  92. }
  93. //将剩下的数据也导入
  94. if (!data.isEmpty()) {
  95. studentRepo.save(data);
  96. }
  97. logger.info("students新增:{}", students.size());
  98. //生成paper信息
  99. List<Paper> papers = createPaper(students, subjects);
  100. List<Paper> data1 = new ArrayList<>();
  101. for (Paper p : papers) {
  102. if (data1.size() == 2000) {
  103. paperRepo.save(data1);
  104. data1.clear();
  105. }
  106. data1.add(p);
  107. }
  108. //将剩下的数据也导入
  109. if (!data1.isEmpty()) {
  110. paperRepo.save(data1);
  111. }
  112. logger.info("papers新增:{}", papers.size());
  113. if (isCreateImage) {
  114. //生成image
  115. createImage(students);
  116. logger.info("image成功");
  117. //生成sheet
  118. createSheet(students);
  119. logger.info("sheet成功");
  120. //生成thumb
  121. createThumb(students);
  122. logger.info("thumb成功");
  123. }
  124. }
  125. private void createWork() {
  126. Work work = workRepo.findOne(WORK_ID);
  127. if (work == null) {
  128. work = new Work();
  129. work.setId(WORK_ID);
  130. work.setActive(true);
  131. work.setCreatedOn(new Date());
  132. work.setName("批量测试");
  133. workRepo.save(work);
  134. }
  135. List<MarkSubject> markSubjects = markSubjectRepo.findAllByWorkId(work.getId());
  136. if (CollectionUtils.isEmpty(markSubjects)) {
  137. Subject[] subjects = Subject.values();
  138. for (int i = 0; i < subjects.length - 1; i++) {
  139. MarkSubject markSubject = new MarkSubject(subjects[i], work.getId());
  140. markSubject.setWorkId(work.getId());
  141. markSubject.setEnable(true);
  142. markSubjectRepo.save(markSubject);
  143. }
  144. }
  145. //新增工作的同时,初始化该工作的全局参数
  146. ParamSetting paramSetting = ParamSetting.init(WORK_ID);
  147. if (isOpenRoughLevel) {
  148. String levelConfig = paramSetting.getLevelConfig();
  149. JSONObject jsonObject = JSON.parseObject(levelConfig, JSONObject.class);
  150. jsonObject.put("roughLevelEnable", 1);
  151. paramSetting.setLevelConfig(JSON.toJSONString(jsonObject));
  152. }
  153. paramSetting.setWorkId(WORK_ID);
  154. paramSettingRepo.save(paramSetting);
  155. //默认增加档位
  156. Level aLevel = new Level(WORK_ID, "A", 0, 100, 90, Level.LevelType.ADMITED, 95, "1", 93);
  157. Level bLevel = new Level(WORK_ID, "B", 1, 89, 85, Level.LevelType.ADMITED, 87, "1", 93);
  158. Level cLevel = new Level(WORK_ID, "C", 2, 84, 80, Level.LevelType.ADMITED, 82, "2", 80);
  159. Level dLevel = new Level(WORK_ID, "D", 3, 79, 75, Level.LevelType.ADMITED, 77, "2", 80);
  160. Level eLevel = new Level(WORK_ID, "E", 4, 74, 70, Level.LevelType.ADMITED, 72, "3", 68);
  161. Level fLevel = new Level(WORK_ID, "F", 5, 69, 65, Level.LevelType.ADMITED, 67, "3", 68);
  162. Level gLevel = new Level(WORK_ID, "G", 6, 64, 60, Level.LevelType.ADMITED, 62, "3", 68);
  163. Level hLevel = new Level(WORK_ID, "H", 7, 59, 55, Level.LevelType.ADMITED, 57, "4", 55);
  164. Level iLevel = new Level(WORK_ID, "I", 8, 54, 50, Level.LevelType.ADMITED, 52, "4", 55);
  165. Level jLevel = new Level(WORK_ID, "J", 9, 49, 45, Level.LevelType.ADMITED, 47, "5", 35);
  166. Level kLevel = new Level(WORK_ID, "K", 10, 44, 0, Level.LevelType.ADMITED, 40, "5", 35);
  167. List<Level> levels = Arrays.asList(aLevel, bLevel, cLevel, dLevel, eLevel, fLevel, gLevel, hLevel, iLevel, jLevel, kLevel);
  168. levelRepo.save(levels);
  169. }
  170. private void createUser() {
  171. List<MarkUser> markUsers = new ArrayList<>();
  172. for (Subject subject : subjects) {
  173. // 评卷员
  174. for (int i = 1; i <= MARKER_COUNT; i++) {
  175. MarkUser markUser = new MarkUser();
  176. markUser.setLoginName(subject.name().toLowerCase() + i);
  177. markUser.setName(subject.name() + i);
  178. markUser.setRole(Role.MARKER);
  179. markUser.setPassword("123456");
  180. markUser.setPwChangedCount(1);
  181. markUser.setSubject(subject);
  182. markUser.setWorkId(WORK_ID);
  183. markUser.setMarkRight(MarkRight.ALLOW_ALL);
  184. markUser.setWeight(1D);
  185. markUser.setLeaderConfirm(true);
  186. markUser.setLevelCallback(false);
  187. markUser.setOneClickLevel(false);
  188. markUser.setStandardVolume(false);
  189. markUsers.add(markUser);
  190. }
  191. // 科组长
  192. for (int i = 1; i <= MARKER_LEADER_COUNT; i++) {
  193. MarkUser markUser = new MarkUser();
  194. markUser.setLoginName(subject.name().toLowerCase() + "-kzz" + i);
  195. markUser.setName(subject.name() + "KZZ" + i);
  196. markUser.setRole(Role.MARK_LEADER);
  197. markUser.setPassword("123456");
  198. markUser.setPwChangedCount(1);
  199. markUser.setSubject(subject);
  200. markUser.setWorkId(WORK_ID);
  201. markUser.setMarkRight(MarkRight.ALLOW_ALL);
  202. markUser.setWeight(null);
  203. markUser.setLeaderConfirm(true);
  204. markUser.setLevelCallback(true);
  205. markUser.setOneClickLevel(true);
  206. markUser.setStandardVolume(true);
  207. markUsers.add(markUser);
  208. }
  209. }
  210. markUserRepo.save(markUsers);
  211. }
  212. private List<ExamQuestion> createQuestions() {
  213. List<ExamQuestion> questions = new ArrayList<>();
  214. ExamQuestion examQuestion1 = new ExamQuestion();
  215. examQuestion1.setId(1l);
  216. examQuestion1.setAreaCode("1");
  217. examQuestion1.setAreaName("省艺术培训协会");
  218. examQuestion1.setName("速写1");
  219. examQuestion1.setSubject(Subject.SX);
  220. examQuestion1.setWorkId(WORK_ID);
  221. // examQuestion1.setTest(0);
  222. questions.add(examQuestion1);
  223. ExamQuestion examQuestion2 = new ExamQuestion();
  224. examQuestion2.setId(2l);
  225. examQuestion2.setAreaCode("1");
  226. examQuestion2.setAreaName("省艺术培训协会");
  227. examQuestion2.setName("色彩1");
  228. examQuestion2.setSubject(Subject.SC);
  229. examQuestion2.setWorkId(WORK_ID);
  230. // examQuestion2.setTest(0);
  231. questions.add(examQuestion2);
  232. ExamQuestion examQuestion3 = new ExamQuestion();
  233. examQuestion3.setId(3l);
  234. examQuestion3.setAreaCode("1");
  235. examQuestion3.setAreaName("省艺术培训协会");
  236. examQuestion3.setName("素描1");
  237. examQuestion3.setSubject(Subject.SM);
  238. examQuestion3.setWorkId(WORK_ID);
  239. // examQuestion3.setTest(0);
  240. questions.add(examQuestion3);
  241. return questions;
  242. }
  243. private List<Student> createStudent() {
  244. List<Student> students = new ArrayList<>();
  245. StringJoiner stringJoiner = new StringJoiner(",");
  246. stringJoiner.add("SX:" + (subjects.contains(Subject.SX) ? 1 : 0))
  247. .add("SC:" + (subjects.contains(Subject.SC) ? 1 : 0))
  248. .add("SM:" + (subjects.contains(Subject.SM) ? 1 : 0));
  249. for (int i = 0; i < COUNT; i++) {
  250. Student student = new Student();
  251. student.setAreaCode("1");
  252. student.setAreaName("省艺术培训协会");
  253. student.setExamNumber(String.valueOf(initNumber + i));
  254. student.setExamRoom("第一考场");
  255. student.setSchool("湖北美术学院");
  256. student.setAbsent(false);
  257. student.setName("考生" + i);
  258. student.setUploadStatus(stringJoiner.toString());
  259. student.setWorkId(WORK_ID);
  260. student.setSourceName("湖北");
  261. student.setRelateExamNumber(student.getExamNumber());
  262. students.add(student);
  263. }
  264. return students;
  265. }
  266. private List<Paper> createPaper(List<Student> students, List<Subject> subjects) throws Exception {
  267. List<Paper> papers = new ArrayList<>();
  268. for (Subject subject : subjects) {
  269. ExamQuestion examQuestion = examQuestionRepo.findByWorkIdAndSubjectAndAreaCode(WORK_ID, subject, "1");
  270. for (Student student : students) {
  271. Long random = getRandom(student.getWorkId(), student.getExamNumber());
  272. Paper paper = new Paper(student.getWorkId(), subject, examQuestion, student, false, random);
  273. papers.add(paper);
  274. }
  275. }
  276. return papers;
  277. }
  278. private void createImage(List<Student> students) throws IOException {
  279. String imageDir = baseDir + File.separator + "images" + File.separator + WORK_ID + File.separator + Subject.SX.name() + File.separator + "1";
  280. File out = new File(imageDir);
  281. if (!out.exists()) {
  282. out.mkdirs();
  283. }
  284. File in = new File(imageDir, "sx.jpg");
  285. for (Student student : students) {
  286. Thumbnails.of(in).scale(1f).toFile(new File(imageDir, student.getExamNumber() + ".jpg"));
  287. }
  288. }
  289. private void createSheet(List<Student> students) throws IOException {
  290. String sheetDir = baseDir + File.separator + "sheet" + File.separator + WORK_ID + File.separator + Subject.SX.name() + File.separator + "1";
  291. File out = new File(sheetDir);
  292. if (!out.exists()) {
  293. out.mkdirs();
  294. }
  295. File in = new File(sheetDir, "sx.jpg");
  296. for (Student student : students) {
  297. Thumbnails.of(in).scale(1f).toFile(new File(sheetDir, student.getExamNumber() + ".jpg"));
  298. }
  299. }
  300. private void createThumb(List<Student> students) throws IOException {
  301. String thumbDir = baseDir + File.separator + "thumbs" + File.separator + WORK_ID + File.separator + Subject.SX.name() + File.separator + "1";
  302. File out = new File(thumbDir);
  303. if (!out.exists()) {
  304. out.mkdirs();
  305. }
  306. File in = new File(thumbDir, "sx.jpg");
  307. for (Student student : students) {
  308. Thumbnails.of(in).scale(1f).toFile(new File(thumbDir, student.getExamNumber() + ".jpg"));
  309. }
  310. }
  311. /**
  312. * 获取随机号
  313. *
  314. * @param workId
  315. * @param examNumber
  316. * @return
  317. * @throws Exception
  318. */
  319. public Long getRandom(Long workId, String examNumber) throws Exception {
  320. int count = 0, result = 0;
  321. Long random = 0L;
  322. while (true) {
  323. random = randomUtil.getRandomMap().get(workId).get(new Random().nextInt(randomUtil.getRandomMap().get(workId).size()));
  324. // random = RandomUtil.randomList.get(new Random().nextInt(RandomUtil.randomList.size()));
  325. result = paperRepo.countByWorkIdAndExamNumberAndRandomSeq(workId, examNumber, random);
  326. if (result == 0 && random != Long.parseLong(examNumber.substring(3, examNumber.length()))) {
  327. break;
  328. } else {
  329. count++;
  330. }
  331. if (count > 1000) {
  332. // throw new Exception("重复几率较高,建议重新生成随机号");
  333. randomUtil.getRandom(workId, true);
  334. getRandom(workId, examNumber);
  335. }
  336. }
  337. return random;
  338. }
  339. }