BatchCreateDataTest.java 13 KB

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