BatchCreateDataTest.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524
  1. import cn.com.qmth.stmms.ms.Application;
  2. import cn.com.qmth.stmms.ms.admin.utils.BultInAccountUtil;
  3. import cn.com.qmth.stmms.ms.admin.utils.RandomUtils;
  4. import cn.com.qmth.stmms.ms.commons.utils.RandomUtil;
  5. import cn.com.qmth.stmms.ms.core.cache.ParamCache;
  6. import cn.com.qmth.stmms.ms.core.domain.*;
  7. import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
  8. import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
  9. import cn.com.qmth.stmms.ms.core.domain.user.MarkRight;
  10. import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
  11. import cn.com.qmth.stmms.ms.core.domain.user.Role;
  12. import cn.com.qmth.stmms.ms.core.repository.*;
  13. import cn.com.qmth.stmms.ms.core.vo.Subject;
  14. import com.lowagie.text.html.Markup;
  15. import org.junit.Test;
  16. import org.junit.runner.RunWith;
  17. import org.slf4j.Logger;
  18. import org.slf4j.LoggerFactory;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.boot.test.context.SpringBootTest;
  21. import org.springframework.test.context.junit4.SpringRunner;
  22. import java.util.*;
  23. import java.util.concurrent.atomic.AtomicLong;
  24. /**
  25. * 机构线上压测数据生成
  26. */
  27. @RunWith(SpringRunner.class)
  28. @SpringBootTest(classes = {Application.class})
  29. // 指定启动类
  30. public class BatchCreateDataTest {
  31. private static final Logger logger = LoggerFactory.getLogger(BatchCreateDataTest.class);
  32. @Autowired
  33. private OrganizationRepo organizationRepo;
  34. @Autowired
  35. private ExamQuestionRepo examQuestionRepo;
  36. @Autowired
  37. private StudentRepo studentRepo;
  38. @Autowired
  39. private PaperRepo paperRepo;
  40. @Autowired
  41. private WorkRepo workRepo;
  42. @Autowired
  43. private MarkTaskRepo markTaskRepo;
  44. @Autowired
  45. private MarkUserRepo markUserRepo;
  46. @Autowired
  47. private MarkSubjectRepo markSubjectRepo;
  48. @Autowired
  49. BultInAccountUtil bultInAccountUtil;
  50. @Autowired
  51. ParamSettingRepo paramSettingRepo;
  52. @Autowired
  53. private LevelRepo levelRepo;
  54. @Autowired
  55. RandomUtil randomUtil;
  56. @Autowired
  57. RandomUtils randomUtils;
  58. // 考号起始值
  59. private int initNumber = 20000;
  60. // 考生数量
  61. private static int STUDENT_COUNT = 6000;
  62. // 科目数量
  63. private List<Subject> subjects = Arrays.asList(Subject.SX, Subject.SC, Subject.SM);
  64. // 评卷员数量
  65. private static int MARKER_COUNT = 3;
  66. // 机构数量
  67. private static int ORG_COUNT = 7;
  68. // 工作数量
  69. private static int WORK_COUNT = 3;
  70. // 默认密码
  71. private static String INIT_PASSWORD = "123456";
  72. // @Test
  73. public void createSxTask() throws Exception {
  74. for (int i = 1; i <= ORG_COUNT; i++) {
  75. // 机构
  76. Organization org = createOrg(i);
  77. for (int i1 = 0; i1 < WORK_COUNT; i1++) {
  78. // 工作
  79. Long workId = createWork(org.getId(), i1);
  80. // 随机数
  81. randomUtil.getRandom(workId, false);
  82. // 5秒生成随机数
  83. Thread.sleep(5000);
  84. //exam_question
  85. createQuestions(workId);
  86. //生成student信息
  87. List<Student> students = createStudent(workId);
  88. for (Subject subject : subjects) {
  89. // 试卷
  90. List<Paper> papers = createPaper(workId, students, subject);
  91. // 评卷员
  92. List<MarkUser> markUsers = createMarkUsers(org, workId, subject);
  93. if(i1 < WORK_COUNT - 1) {
  94. //发分档任务
  95. assignLevels(workId, papers, markUsers);
  96. // 发打分任务
  97. assignScores(workId, papers, markUsers);
  98. }
  99. }
  100. }
  101. }
  102. }
  103. /**
  104. * 创建机构
  105. *
  106. * @param i
  107. * @return
  108. */
  109. private Organization createOrg(int i) {
  110. Organization organization = new Organization();
  111. //机构名称
  112. organization.setName("机构" + i);
  113. //默认启用
  114. organization.setEnabled(true);
  115. organization.setCreatedOn(new Date());
  116. //机构id号
  117. String abbreviation = randomUtils.organAbbreviation();
  118. organization.setAbbreviation(abbreviation);
  119. organizationRepo.save(organization);
  120. //账号(机构id-账号)
  121. MarkUser m = new MarkUser();
  122. m.setLoginName(abbreviation.toLowerCase() + "-admin");
  123. m.setName("机构" + i);
  124. m.setPassword(INIT_PASSWORD);
  125. m.setEnabled(true);
  126. m.setOrganizationId(organization.getId());
  127. m.setRole(Role.ADMIN);
  128. m.setWorkId(0l);
  129. m.setSubject(Subject.SC);
  130. m.setUserType("1");
  131. markUserRepo.save(m);
  132. MarkUser m1 = new MarkUser();
  133. m1.setLoginName(abbreviation.toLowerCase() + "-admin1");
  134. m1.setName("机构管理" + i);
  135. m1.setPassword(INIT_PASSWORD);
  136. m1.setEnabled(true);
  137. m1.setOrganizationId(organization.getId());
  138. m1.setRole(Role.ADMIN);
  139. m1.setWorkId(0l);
  140. m1.setSubject(Subject.SC);
  141. m1.setUserType("2");
  142. markUserRepo.save(m1);
  143. return organization;
  144. }
  145. /**
  146. * 创建工作
  147. *
  148. * @param orgId
  149. * @param i
  150. * @return
  151. */
  152. private Long createWork(Long orgId, int i) {
  153. Work work = new Work();
  154. work.setActive(false);
  155. work.setName("工作" + i);
  156. work.setOrganizationId(orgId);
  157. work.setCreatedOn(new Date());
  158. workRepo.save(work);
  159. for (Subject subject : subjects) {
  160. MarkSubject markSubject = new MarkSubject(subject, work.getId());
  161. markSubject.setWorkId(work.getId());
  162. markSubject.setEnable(true);
  163. markSubjectRepo.save(markSubject);
  164. }
  165. //新增工作的同时,初始化该工作的全局参数
  166. ParamSetting paramSetting = ParamSetting.init();
  167. paramSetting.setWorkId(work.getId());
  168. paramSettingRepo.save(paramSetting);
  169. ParamCache.resetParam(paramSetting);
  170. //默认增加档位
  171. Level A = new Level(work.getId(), "A", 0, 100, 90, Level.LevelType.ADMITED, 95);
  172. Level B = new Level(work.getId(), "B", 1, 89, 85, Level.LevelType.ADMITED, 87);
  173. Level C = new Level(work.getId(), "C", 2, 84, 80, Level.LevelType.ADMITED, 82);
  174. Level D = new Level(work.getId(), "D", 3, 79, 75, Level.LevelType.ADMITED, 77);
  175. Level E = new Level(work.getId(), "E", 4, 74, 70, Level.LevelType.ADMITED, 72);
  176. Level F = new Level(work.getId(), "F", 5, 69, 65, Level.LevelType.ADMITED, 67);
  177. Level G = new Level(work.getId(), "G", 6, 64, 60, Level.LevelType.ADMITED, 62);
  178. Level H = new Level(work.getId(), "H", 7, 59, 55, Level.LevelType.ADMITED, 57);
  179. Level I = new Level(work.getId(), "I", 8, 54, 50, Level.LevelType.ADMITED, 52);
  180. Level J = new Level(work.getId(), "J", 9, 49, 45, Level.LevelType.ADMITED, 47);
  181. Level K = new Level(work.getId(), "K", 10, 44, 0, Level.LevelType.ADMITED, 40);
  182. List<Level> levels = Arrays.asList(A, B, C, D, E, F, G, H, I, J, K);
  183. levelRepo.save(levels);
  184. //生成内置账号
  185. bultInAccountUtil.createAccout(work);
  186. return work.getId();
  187. }
  188. /**
  189. * 考区
  190. *
  191. * @param workId
  192. */
  193. private void createQuestions(Long workId) {
  194. List<ExamQuestion> questions = new ArrayList<>();
  195. for (Subject subject : subjects) {
  196. ExamQuestion examQuestion = new ExamQuestion();
  197. examQuestion.setAreaCode("1");
  198. examQuestion.setAreaName("湖北");
  199. examQuestion.setName(subject.name() + "1");
  200. examQuestion.setSubject(subject);
  201. examQuestion.setWorkId(workId);
  202. examQuestion.setTest(0);
  203. questions.add(examQuestion);
  204. }
  205. examQuestionRepo.save(questions);
  206. logger.info("questions新增成功:{}", questions.size());
  207. }
  208. /**
  209. * 考生
  210. *
  211. * @param workId
  212. * @return
  213. */
  214. private List<Student> createStudent(Long workId) {
  215. List<Student> students = new ArrayList<>();
  216. for (int i = 0; i < STUDENT_COUNT; i++) {
  217. Student student = new Student();
  218. student.setAreaCode("1");
  219. student.setAreaName("湖北");
  220. student.setExamNumber(String.valueOf(initNumber + i));
  221. student.setExamRoom("第一考场");
  222. student.setSchool("湖北美院");
  223. student.setAbsent(false);
  224. student.setName("考生" + i);
  225. student.setUploadStatus("SX:1,SC:1,SM:1");
  226. student.setWorkId(workId);
  227. student.setSourceName("湖北");
  228. student.setTest("0");
  229. student.setRelateExamNumber(student.getExamNumber());
  230. students.add(student);
  231. }
  232. List<Student> data = new ArrayList<>();
  233. for (Student stu : students) {
  234. if (data.size() == 2000) {
  235. studentRepo.save(data);
  236. data.clear();
  237. }
  238. data.add(stu);
  239. }
  240. //将剩下的数据也导入
  241. if (!data.isEmpty()) {
  242. studentRepo.save(data);
  243. }
  244. logger.info("students新增:{}", students.size());
  245. return students;
  246. }
  247. /**
  248. * 试卷
  249. *
  250. * @param workId
  251. * @param students
  252. * @param subject
  253. * @return
  254. * @throws Exception
  255. */
  256. private List<Paper> createPaper(Long workId, List<Student> students, Subject subject) throws Exception {
  257. List<Paper> papers = new ArrayList<>();
  258. ExamQuestion examQuestion = examQuestionRepo.findByWorkIdAndSubjectAndAreaCodeAndTest(workId, subject, "1", TrialEnum.DEFAULT.getId());
  259. for (Student student : students) {
  260. Long random = getRandom(student.getWorkId(), student.getExamNumber());
  261. Paper paper = new Paper(student.getWorkId(), null, subject, examQuestion, student, false, random);
  262. papers.add(paper);
  263. }
  264. List<Paper> data = new ArrayList<>();
  265. for (Paper p : papers) {
  266. if (data.size() == 2000) {
  267. paperRepo.save(data);
  268. data.clear();
  269. }
  270. data.add(p);
  271. }
  272. //将剩下的数据也导入
  273. if (!data.isEmpty()) {
  274. paperRepo.save(data);
  275. }
  276. logger.info("papers新增:{}", papers.size());
  277. return papers;
  278. }
  279. /**
  280. * 评卷员、科组长
  281. *
  282. * @param org
  283. * @param workId
  284. * @param subject
  285. * @return
  286. */
  287. private List<MarkUser> createMarkUsers(Organization org, Long workId, Subject subject) {
  288. List<MarkUser> markUsers = new ArrayList<>();
  289. for (int i = 1; i <= MARKER_COUNT; i++) {
  290. MarkUser markUser = new MarkUser();
  291. markUser.setEnabled(true);
  292. markUser.setLoginName(org.getAbbreviation().toLowerCase() + "-" + workId + "-" + subject.name().toLowerCase() + i);
  293. markUser.setName(markUser.getLoginName());
  294. markUser.setPassword(INIT_PASSWORD);
  295. markUser.setPwChangedCount(1);
  296. markUser.setRole(Role.MARKER);
  297. markUser.setSubject(subject);
  298. markUser.setWorkId(workId);
  299. markUser.setOrganizationId(org.getId());
  300. markUser.setWeight(1D);
  301. markUser.setOneClickLevel(false);
  302. markUser.setStandardVolume(false);
  303. markUser.setLevelCallback(false);
  304. markUser.setLeaderConfirm(false);
  305. markUser.setMarkRight(MarkRight.ALLOW_ALL);
  306. markUsers.add(markUser);
  307. }
  308. markUserRepo.save(markUsers);
  309. // 科组长
  310. MarkUser markUser = new MarkUser();
  311. markUser.setEnabled(true);
  312. markUser.setLoginName(org.getAbbreviation().toLowerCase() + "-" + workId + "-" + subject.name().toLowerCase() + "kzz");
  313. markUser.setName(markUser.getLoginName());
  314. markUser.setPassword(INIT_PASSWORD);
  315. markUser.setPwChangedCount(1);
  316. markUser.setRole(Role.MARK_LEADER);
  317. markUser.setSubject(subject);
  318. markUser.setWorkId(workId);
  319. markUser.setOrganizationId(org.getId());
  320. markUser.setWeight(1D);
  321. markUser.setOneClickLevel(true);
  322. markUser.setStandardVolume(true);
  323. markUser.setLevelCallback(true);
  324. markUser.setLeaderConfirm(true);
  325. markUser.setMarkRight(MarkRight.ALLOW_ALL);
  326. markUserRepo.save(markUser);
  327. return markUsers;
  328. }
  329. /**
  330. * 分档
  331. *
  332. * @param workId
  333. * @param papers
  334. * @param markUsers
  335. * @throws Exception
  336. */
  337. private void assignLevels(Long workId, List<Paper> papers, List<MarkUser> markUsers) throws Exception {
  338. List<MarkTask> markTaskList = new ArrayList<>();
  339. List<Paper> paperList = new ArrayList<>();
  340. Long batchNo = System.currentTimeMillis();
  341. for (Paper paper : papers) {
  342. for (MarkUser markUser : markUsers) {
  343. Long random = getRandomSecret(markUser.getId(), paper.getId(), markUser.getWorkId(), paper.getExamNumber(), null);
  344. MarkTask markTask = new MarkTask(markUser, paper, MarkStage.LEVEL, random, 0);
  345. markTask.setBatchNo(batchNo);
  346. markTask.setResult("A");
  347. markTask.setLevel("A");
  348. markTaskList.add(markTask);
  349. }
  350. //将paper置为激活
  351. paper.setLevel("A");
  352. paper.setActive(true);
  353. paper.setBatchNo(batchNo);
  354. paperList.add(paper);
  355. }
  356. List<MarkTask> data = new ArrayList<>();
  357. //5000条提交一次
  358. for (MarkTask markTask : markTaskList) {
  359. if (data.size() == 2000) {
  360. markTaskRepo.save(data);
  361. data.clear();
  362. }
  363. data.add(markTask);
  364. }
  365. //将剩下的数据也导入
  366. if (!data.isEmpty()) {
  367. markTaskRepo.save(data);
  368. }
  369. paperRepo.save(paperList);
  370. List<MarkSubject> subjects = markSubjectRepo.findAllByWorkId(workId);
  371. for (MarkSubject subject : subjects) {
  372. subject.setStage(MarkStage.LEVEL);
  373. markSubjectRepo.save(subject);
  374. }
  375. }
  376. /**
  377. * 分档
  378. *
  379. * @param workId
  380. * @param papers
  381. * @param markUsers
  382. * @throws Exception
  383. */
  384. private void assignScores(Long workId, List<Paper> papers, List<MarkUser> markUsers) throws Exception {
  385. List<MarkTask> markTaskList = new ArrayList<>();
  386. List<Paper> paperList = new ArrayList<>();
  387. Long batchNo = System.currentTimeMillis();
  388. for (Paper paper : papers) {
  389. for (MarkUser markUser : markUsers) {
  390. Long random = getRandomSecret(markUser.getId(), paper.getId(), markUser.getWorkId(), paper.getExamNumber(), null);
  391. MarkTask markTask = new MarkTask(markUser, paper, MarkStage.SCORE, random, 0);
  392. markTask.setBatchNo(batchNo);
  393. markTask.setResult("95");
  394. markTask.setLevel(paper.getLevel());
  395. markTaskList.add(markTask);
  396. }
  397. //将paper置为激活
  398. paper.setScore(95D);
  399. paper.setScoreBatchNo(batchNo);
  400. paperList.add(paper);
  401. }
  402. List<MarkTask> data = new ArrayList<>();
  403. //5000条提交一次
  404. for (MarkTask markTask : markTaskList) {
  405. if (data.size() == 2000) {
  406. markTaskRepo.save(data);
  407. data.clear();
  408. }
  409. data.add(markTask);
  410. }
  411. //将剩下的数据也导入
  412. if (!data.isEmpty()) {
  413. markTaskRepo.save(data);
  414. }
  415. paperRepo.save(paperList);
  416. List<MarkSubject> subjects = markSubjectRepo.findAllByWorkId(workId);
  417. for (MarkSubject subject : subjects) {
  418. subject.setStage(MarkStage.SCORE);
  419. markSubjectRepo.save(subject);
  420. }
  421. }
  422. /**
  423. * 获取随机号
  424. *
  425. * @param workId
  426. * @param examNumber
  427. * @return
  428. * @throws Exception
  429. */
  430. public Long getRandom(Long workId, String examNumber) throws Exception {
  431. int count = 0, result = 0;
  432. Long random = 0L;
  433. while (true) {
  434. random = randomUtil.getRandomMap().get(workId).get(new Random().nextInt(randomUtil.getRandomMap().get(workId).size()));
  435. result = paperRepo.countByWorkIdAndExamNumberAndRandomSeq(workId, examNumber, random);
  436. if (result == 0 && random != Long.parseLong(examNumber.substring(3))) {
  437. break;
  438. } else {
  439. count++;
  440. }
  441. if (count > 1000) {
  442. randomUtil.getRandom(workId, true);
  443. getRandom(workId, examNumber);
  444. }
  445. }
  446. return random;
  447. }
  448. public Long getRandomSecret(Long markerId, Long paperId, Long workId, String examNumber, Map<Long, Object> randomMap) throws Exception {
  449. int count = 0;
  450. Long random = 0L;
  451. while (true) {
  452. random = randomUtil.getRandomMap().get(workId).get(new Random().nextInt(randomUtil.getRandomMap().get(workId).size()));
  453. if (Objects.isNull(randomMap) || randomMap.size() == 0) {
  454. break;
  455. }
  456. if (Objects.isNull(randomMap.get(random))) {
  457. break;
  458. } else {
  459. count++;
  460. }
  461. if (count > 1000) {
  462. // throw new Exception("重复几率较高,建议重新生成随机号");
  463. randomUtil.getRandom(workId, true);
  464. getRandomSecret(markerId, paperId, workId, examNumber, randomMap);
  465. }
  466. }
  467. return random;
  468. }
  469. }