Ver código fonte

机构版-迭代

xiaof 3 anos atrás
pai
commit
0282514507

+ 7 - 0
stmms-ms-core/pom.xml

@@ -38,5 +38,12 @@
             <artifactId>ehcache</artifactId>
             <version>2.10.6</version><!--$NO-MVN-MAN-VER$ -->
         </dependency>
+
+        <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.8.0</version>
+        </dependency>
     </dependencies>
 </project>

+ 3 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/ExamQuestionRepo.java

@@ -41,4 +41,7 @@ public interface ExamQuestionRepo extends JpaRepository<ExamQuestion, Long> {
     List<ExamQuestion> findByWorkIdAndSubjectAndTestNot(Long workId, Subject subject, int id);
 
     void deleteByWorkIdAndAreaCode(Long workId, String areaCode);
+
+    @Query(value = "select id, area_name areaName, name from exam_question eq where eq.id in (select question_id from paper p where p.work_id = ? and p.subject = ? and p.is_sample = 1 and p.is_missing = 0)", nativeQuery = true)
+    List<Object[]> listByWorkIdAndSubject(Long workId, String subject);
 }

+ 9 - 9
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/specification/StudentSpecification.java

@@ -21,8 +21,8 @@ public class StudentSpecification extends PagingAndSortingSpecification {
     private String studentName;
     private String uploadStatus;
     private Boolean isAbsent;
-    private Long startNumber;//起始考号
-    private Long endNumber;//终止考号
+    private String startNumber;//起始考号
+    private String endNumber;//终止考号
     private Boolean upload;//上传状态
     private String subject;//科目
 
@@ -45,19 +45,19 @@ public class StudentSpecification extends PagingAndSortingSpecification {
         this.subject = subject;
     }
 
-    public Long getStartNumber() {
+    public String getStartNumber() {
         return startNumber;
     }
 
-    public void setStartNumber(Long startNumber) {
+    public void setStartNumber(String startNumber) {
         this.startNumber = startNumber;
     }
 
-    public Long getEndNumber() {
+    public String getEndNumber() {
         return endNumber;
     }
 
-    public void setEndNumber(Long endNumber) {
+    public void setEndNumber(String endNumber) {
         this.endNumber = endNumber;
     }
 
@@ -200,11 +200,11 @@ public class StudentSpecification extends PagingAndSortingSpecification {
                     }
                 }
             }
-            if (startNumber != null && endNumber != null) {
+            if (!StringUtils.isEmpty(startNumber) && !StringUtils.isEmpty(endNumber)) {
                 predicates.add(cb.between(root.get("examNumber"), startNumber, endNumber));
-            } else if (startNumber != null) {
+            } else if (!StringUtils.isEmpty(startNumber)) {
                 predicates.add(cb.equal(root.get("examNumber"), startNumber));
-            } else if (endNumber != null) {
+            } else if (!StringUtils.isEmpty(endNumber)) {
                 predicates.add(cb.equal(root.get("examNumber"), endNumber));
             }
             if (getSchool() != null && getSchool() != "") {

+ 41 - 9
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/utils/DbBackupUtils.java

@@ -5,15 +5,15 @@ import cn.com.qmth.stmms.ms.core.domain.Organization;
 import cn.com.qmth.stmms.ms.core.domain.Work;
 import cn.com.qmth.stmms.ms.core.repository.OrganizationRepo;
 import cn.com.qmth.stmms.ms.core.repository.WorkRepo;
+import org.apache.commons.io.FileUtils;
 import org.apache.http.client.utils.DateUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
-import sun.security.acl.WorldGroupImpl;
 
-import java.io.File;
-import java.io.IOException;
+import java.io.*;
+import java.nio.charset.Charset;
 import java.util.Date;
 import java.util.Objects;
 import java.util.concurrent.ExecutorService;
@@ -62,25 +62,57 @@ public class DbBackupUtils {
                 if (!fileSql.exists()) {
                     fileSql.createNewFile();
                 }
+
+                String mysqldump = getMysqldump(fileSql);
                 //mysqldump -hlocalhost -uroot -p123456 db > /home/back.sql
                 StringBuffer sb = new StringBuffer();
-                sb.append("mysqldump");
+                sb.append("cmd /c ");
+                sb.append(mysqldump);
                 sb.append(" -h " + dbConfig.getHost());
                 sb.append(" -u" + dbConfig.getUserName());
                 sb.append(" -p" + dbConfig.getPassword());
+                sb.append(" -P" + dbConfig.getPort());
                 sb.append(" " + dbConfig.getDbName() + " >");
                 sb.append(fileSql.getAbsolutePath());
-                LOGGER.info("cmd命令为:{},开始备份数据库:{}" , sb.toString(), dbConfig.getDbName());
+                LOGGER.info("cmd命令为:{}", sb.toString());
                 Runtime runtime = Runtime.getRuntime();
-                Process process = runtime.exec("cmd /c" + sb.toString());
+                runtime.exec(sb.toString());
                 LOGGER.info("备份成功!");
-            } catch (IOException e) {
+            } catch (Exception e) {
                 LOGGER.info("备份失败!原因:{}", e.getMessage());
             }
         };
     }
 
-    public static void main(String[] args) {
-        System.out.println(System.getProperty("os.name"));
+    public static String getMysqldump(File fileSql) throws IOException, InterruptedException {
+        Runtime runtime = Runtime.getRuntime();
+        Process process = runtime.exec("where mysqldump");
+        BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream(), Charset.forName("GBK")));
+        String line = null;
+        String result = "";
+        while ((line = br.readLine()) != null) {
+            System.out.println(line);
+            result += line;
+        }
+        br.close();
+        process.waitFor();
+        File destFile = new File(fileSql.getParent(), "mysqldump.exe");
+        if (result.contains("mysqldump")) {
+            if (destFile.exists()) {
+                destFile.delete();
+            }
+            FileUtils.copyFile(new File(result), destFile);
+        } else {
+            try {
+                FileOutputStream out = new FileOutputStream(fileSql.getAbsolutePath(), true);
+                String str = "没有找到mysqldump命令";
+                out.write(str.getBytes());
+                out.close();
+            } catch (Exception e) {
+                throw new RuntimeException(e.getMessage());
+            }
+            throw new RuntimeException("没有找到mysqldump命令");
+        }
+        return destFile.getParent() + File.separator + "mysqldump";
     }
 }

+ 260 - 0
stmms-ms-main/src/test/BatchCreateTaskTest.java

@@ -0,0 +1,260 @@
+import cn.com.qmth.stmms.ms.Application;
+import cn.com.qmth.stmms.ms.commons.utils.RandomUtil;
+import cn.com.qmth.stmms.ms.core.domain.ExamQuestion;
+import cn.com.qmth.stmms.ms.core.domain.Paper;
+import cn.com.qmth.stmms.ms.core.domain.Student;
+import cn.com.qmth.stmms.ms.core.domain.Work;
+import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
+import cn.com.qmth.stmms.ms.core.repository.ExamQuestionRepo;
+import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
+import cn.com.qmth.stmms.ms.core.repository.StudentRepo;
+import cn.com.qmth.stmms.ms.core.repository.WorkRepo;
+import cn.com.qmth.stmms.ms.core.vo.Subject;
+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 java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Random;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = {Application.class})
+// 指定启动类
+public class BatchCreateTaskTest {
+
+    private static final Logger logger = LoggerFactory.getLogger(BatchCreateTaskTest.class);
+
+    @Autowired
+    private ExamQuestionRepo examQuestionRepo;
+
+    @Autowired
+    private StudentRepo studentRepo;
+
+    @Autowired
+    private PaperRepo paperRepo;
+
+    @Autowired
+    private WorkRepo workRepo;
+
+    @Autowired
+    RandomUtil randomUtil;
+
+    //考生数量
+    private int initNumber = 20000;
+    private static int COUNT = 60000;
+    private static Long WORK_ID = 10l;
+    private List<Subject> subjects = Arrays.asList(Subject.SX, Subject.SC, Subject.SM);
+    private String baseDir = "D:\\my_workspaces\\ide_workspace_qmth\\idea_workspace\\stmms-ms\\stmms-ms-org-server\\upload";
+
+    @Test
+    public void createSxTask() throws Exception {
+        //默认用id为1000的工作
+        Work work = workRepo.findOne(WORK_ID);
+        if (work == null) {
+            logger.info("指定id为10的工作不存在");
+            return;
+        }
+        randomUtil.getRandom(work.getId(), false);
+
+        //生成exam_question信息
+        List<ExamQuestion> questions = createQuestions();
+//        examQuestionRepo.save(questions);
+        logger.info("questions新增:{}", questions.size());
+
+        //生成student信息
+        List<Student> students = createStudent();
+        /*List<Student> 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<Paper> papers = createPaper(students, subjects);
+        List<Paper> 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());
+         */
+
+        //生成image
+        createImage(students, subjects);
+        logger.info("image成功");
+
+        //生成sheet
+//        createSheet(students, subjects);
+        logger.info("sheet成功");
+
+        //生成thumb
+//        createThumb(students, subjects);
+        logger.info("thumb成功");
+
+    }
+
+    private List<ExamQuestion> createQuestions() {
+        List<ExamQuestion> 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<Student> createStudent() {
+        List<Student> students = new ArrayList<>();
+        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("SX:1,SC:1,SM:1");
+            student.setWorkId(WORK_ID);
+            student.setSourceName("湖北");
+            student.setTest("0");
+            student.setRelateExamNumber(student.getExamNumber());
+            students.add(student);
+        }
+        return students;
+    }
+
+    private List<Paper> createPaper(List<Student> students, List<Subject> subjects) throws Exception {
+        List<Paper> papers = new ArrayList<>();
+        for (Subject subject : subjects) {
+            ExamQuestion examQuestion = examQuestionRepo.findByWorkIdAndSubjectAndAreaCodeAndTest(WORK_ID, subject, "1", TrialEnum.DEFAULT.getId());
+            for (Student student : students) {
+                Long random = getRandom(student.getWorkId(), student.getExamNumber());
+                Paper paper = new Paper(student.getWorkId(), null, subject, examQuestion, student, false, random);
+                papers.add(paper);
+            }
+        }
+        return papers;
+    }
+
+    private void createImage(List<Student> students, List<Subject> subjects) throws IOException {
+        for (Subject subject : subjects) {
+            String imageDir = baseDir + File.separator + "images" + File.separator + WORK_ID + File.separator + subject.name() + File.separator + "1";
+            File out = new File(imageDir);
+            if (!out.exists()) {
+                out.mkdirs();
+            }
+            File in = new File(imageDir, "source.jpg");
+            for (Student student : students) {
+                Thumbnails.of(in).scale(1f).toFile(new File(imageDir, student.getExamNumber() + ".jpg"));
+            }
+        }
+    }
+
+    private void createSheet(List<Student> students, List<Subject> subjects) throws IOException {
+        for (Subject subject : subjects) {
+            String sheetDir = baseDir + File.separator + "sheet" + File.separator + WORK_ID + File.separator + subject.name() + File.separator + "1";
+            File out = new File(sheetDir);
+            if (!out.exists()) {
+                out.mkdirs();
+            }
+            File in = new File(sheetDir, "source.jpg");
+            for (Student student : students) {
+                Thumbnails.of(in).scale(1f).toFile(new File(sheetDir, student.getExamNumber() + ".jpg"));
+            }
+        }
+
+    }
+
+    private void createThumb(List<Student> students, List<Subject> subjects) throws IOException {
+        for (Subject subject : subjects) {
+            String thumbDir = baseDir + File.separator + "thumbs" + File.separator + WORK_ID + File.separator + subject.name() + File.separator + "1";
+            File out = new File(thumbDir);
+            if (!out.exists()) {
+                out.mkdirs();
+            }
+            File in = new File(thumbDir, "source.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()));
+            result = paperRepo.countByWorkIdAndExamNumberAndRandomSeq(workId, examNumber, random);
+            if (result == 0 && random != Long.parseLong(examNumber.substring(3))) {
+                break;
+            } else {
+                count++;
+            }
+            if (count > 1000) {
+//                throw new Exception("重复几率较高,建议重新生成随机号");
+                randomUtil.getRandom(workId, true);
+                getRandom(workId, examNumber);
+            }
+        }
+        return random;
+    }
+}

+ 23 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/ExamQuestionApi.java

@@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -47,4 +48,26 @@ public class ExamQuestionApi {
             return examQuestionRepo.findByWorkIdAndSubjectAndTest(workId, Subject.CUSTOM, TrialEnum.DEFAULT.getId());
         }
     }
+
+    /**
+     * 标准卷对应的考区
+     * @param workId
+     * @param subject
+     * @return
+     */
+    @RequestMapping(value = "/sampleQuestions", method = RequestMethod.GET)
+    public List<ExamQuestion> sampleQuestions(@RequestParam Long workId, @RequestParam Subject subject) {
+        List<Object[]> list =  examQuestionRepo.listByWorkIdAndSubject(workId, subject.name());
+        List<ExamQuestion> questionList = new ArrayList<>();
+        if (list != null && list.size() > 0){
+            for (Object[] objects : list) {
+                ExamQuestion examQuestion = new ExamQuestion();
+                examQuestion.setId(Long.valueOf(objects[0].toString()));
+                examQuestion.setAreaName((String) objects[1]);
+                examQuestion.setName((String) objects[2]);
+                questionList.add(examQuestion);
+            }
+        }
+        return questionList;
+    }
 }

+ 4 - 2
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/PaperApi.java

@@ -207,7 +207,7 @@ public class PaperApi {
      * @return
      */
     @RequestMapping(method = RequestMethod.GET)
-    public PageableDTO list(@RequestParam Long questionId,
+    public PageableDTO list(@RequestParam(required = false) Long questionId,
                             @RequestParam(required = false) String level,
                             @RequestParam(required = false) Boolean isSample,
                             @RequestParam(required = false) Boolean markedLogic,
@@ -219,7 +219,9 @@ public class PaperApi {
 //        Long batchNo = paperRepo.findByQuestionId(questionId);
         Specification<Paper> specification = (root, query, builder) -> {
             List<Predicate> predicates = new ArrayList<>();
-            predicates.add(builder.equal(root.get("questionId"), questionId));
+            if(Objects.nonNull(questionId)) {
+                predicates.add(builder.equal(root.get("questionId"), questionId));
+            }
             //isScore为true时,为科组长打分详情页面数据查询条件
             if (isScore) {
                 //level为null时,查询待评数量