Эх сурвалжийг харах

完成各选项数据导出

4228306 5 жил өмнө
parent
commit
1c3d4fa3b4

+ 2 - 2
deploy.sh

@@ -4,6 +4,6 @@ docker build -t feick/diagnosis:$date .
 echo "backend current tag is $date"
 sed -i "s/\${date}/$(echo $date)/g" deployment.yaml
 kubectl apply -f deployment.yaml
-sed -i "s/\${date}/$(echo $date)/g" deployment-prod.yaml
-kubectl apply -f deployment-prod.yaml
+#sed -i "s/\${date}/$(echo $date)/g" deployment-prod.yaml
+#kubectl apply -f deployment-prod.yaml
 echo "build finish."

+ 109 - 6
src/main/java/com/yaoxiang/diagnosis/controller/TestController.java

@@ -1,23 +1,37 @@
 package com.yaoxiang.diagnosis.controller;
 
+import com.google.gson.reflect.TypeToken;
 import com.yaoxiang.diagnosis.dao.OptionRepo;
 import com.yaoxiang.diagnosis.dao.QuestionRepo;
+import com.yaoxiang.diagnosis.entity.Paper;
+import com.yaoxiang.diagnosis.entity.PaperCommit;
 import com.yaoxiang.diagnosis.file.FileService;
 import com.yaoxiang.diagnosis.entity.Question;
+import com.yaoxiang.diagnosis.model.AnswerContrast;
 import com.yaoxiang.diagnosis.model.AuthUser;
+import com.yaoxiang.diagnosis.model.OptionPercentVo;
 import com.yaoxiang.diagnosis.model.Result;
+import com.yaoxiang.diagnosis.service.CommitService;
+import com.yaoxiang.diagnosis.service.PaperService;
 import com.yaoxiang.diagnosis.service.SpecialKnowledgeService;
-import com.yaoxiang.diagnosis.util.SecurityUtil;
+import com.yaoxiang.diagnosis.util.*;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.ResponseEntity;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
-import java.util.Date;
-import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.*;
 import java.util.concurrent.atomic.AtomicLong;
 
 /**
@@ -37,12 +51,17 @@ public class TestController {
     @Resource
     private SpecialKnowledgeService specialKnowledgeService;
 
+    @Resource
+    private CommitService commitService;
+    @Resource
+    private PaperService paperService;
+
     private AtomicLong visitCount = new AtomicLong();
 
     private static final Logger logger = LoggerFactory.getLogger(TestController.class);
 
     @GetMapping("/")
-    public String index(){
+    public String index() {
         return "hello";
     }
 
@@ -120,7 +139,91 @@ public class TestController {
     }
 
     @PostMapping("syncKnowledgeToSpecial")
-    public boolean syncKnowledgeToSpecial(Long subjectId,String grade,Long pid){
-        return specialKnowledgeService.syncKnowledgeToSpecial(subjectId,grade,pid);
+    public boolean syncKnowledgeToSpecial(Long subjectId, String grade, Long pid) {
+        return specialKnowledgeService.syncKnowledgeToSpecial(subjectId, grade, pid);
+    }
+
+    @GetMapping("optionPercent")
+    @ApiOperation("导出试卷每张选项的选中率")
+    @ApiImplicitParams({@ApiImplicitParam(name = "pid", value = "pid", paramType = "query"),
+            @ApiImplicitParam(name = "startTime", value = "startTime", paramType = "query"),
+            @ApiImplicitParam(name = "endTime", value = "endTime", paramType = "query")})
+    public void exportOptionPercent(Long pid, HttpServletResponse response,
+                                    @RequestParam(defaultValue = "1584107900000") Long startTime,
+                                    @RequestParam(required = false) Long endTime) throws IOException {
+        logger.info("start {}", new Date(startTime));
+        if (endTime == null) {
+            endTime = DateUtil.getLastTimeOfDay(new Date()).getTime();
+        }
+        logger.info("end {}", new Date(endTime));
+        List<PaperCommit> list = commitService.listPaperCommit(pid, startTime, endTime);
+        Paper p = paperService.getOnePaper(pid);
+        byte[] data = calc1(list, p);
+        logger.info("commit size {},", list.size());
+//        logger.info("list={}", list);
+//        List<>
+//        HttpHeaders headers = new HttpHeaders();
+//        headers.add("Content-Disposition", "attachment; filename=xxx.xlxs");
+//        headers.add("Content-Type");
+        response.setHeader("Content-Disposition", "attachment;fileName=xxx.xlsx");
+        response.getOutputStream().write(data);
+    }
+
+    public byte[] calc1(List<PaperCommit> list, Paper p) {
+        //Map<number,Map<option,count>>
+        Map<Integer, Map<String, Integer>> mapCount = new LinkedHashMap<>();
+        Map<Integer, String> collects = new LinkedHashMap<>();
+        for (int i = 1; i <= p.getQuestionNum(); i++) {
+            LinkedHashMap<String, Integer> linkedHashMap = new LinkedHashMap<>();
+//            for (int j=0;j<5;j++) {
+//                linkedHashMap.put((char)(j+65), 0);
+//            }
+            linkedHashMap.put("A", 0);
+            linkedHashMap.put("B", 0);
+            linkedHashMap.put("C", 0);
+            linkedHashMap.put("D", 0);
+            linkedHashMap.put("E", 0);
+            linkedHashMap.put("blank", 0);
+            mapCount.put(i, linkedHashMap);
+        }
+        for (Question q : p.getQuestions()) {
+            collects.put(q.getNumber(), q.getAnswer());
+        }
+        for (PaperCommit commit : list) {
+            String jsonAnswer = commit.getJsonAns();
+            List<AnswerContrast> contrasts = convertAnswerContrast(jsonAnswer);
+            for (AnswerContrast contrast : contrasts) {
+                String options = contrast.getOptions();
+                Map<String, Integer> os = mapCount.get(contrast.getNumber());
+                if (StringUtils.isBlank(options)) {
+                    options = "blank";
+                }
+                int c = os.get(options);
+                os.put(options, c + 1);
+                mapCount.put(contrast.getNumber(), os);
+            }
+        }
+        List<OptionPercentVo> vos = new ArrayList<>();
+        for (Map.Entry<Integer, Map<String, Integer>> entry : mapCount.entrySet()) {
+            int number = entry.getKey();
+            Map<String, Integer> os = entry.getValue();
+            OptionPercentVo vo = new OptionPercentVo();
+            vo.setNumber(number);
+            vo.setAnswer(collects.get(number));
+            vo.setA(NumberUtil.format(os.get("A") * 100.0 / list.size()));
+            vo.setB(NumberUtil.format(os.get("B") * 100.0 / list.size()));
+            vo.setC(NumberUtil.format(os.get("C") * 100.0 / list.size()));
+            vo.setD(NumberUtil.format(os.get("D") * 100.0 / list.size()));
+            vo.setE(NumberUtil.format(os.get("E") * 100.0 / list.size()));
+            vo.setBlank(NumberUtil.format(os.get("blank") * 100.0 / list.size()));
+            logger.info(vo.toString());
+            vos.add(vo);
+        }
+        return ExportUtil.export1(vos);
+    }
+
+    private List<AnswerContrast> convertAnswerContrast(String json) {
+        return ObjectUtil.getGson().fromJson(json, new TypeToken<List<AnswerContrast>>() {
+        }.getType());
     }
 }

+ 6 - 1
src/main/java/com/yaoxiang/diagnosis/dao/PaperCommitRepo.java

@@ -1,8 +1,11 @@
 package com.yaoxiang.diagnosis.dao;
 
 import com.yaoxiang.diagnosis.entity.PaperCommit;
+import org.springframework.data.jpa.domain.Specification;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -10,7 +13,7 @@ import java.util.List;
  * @DATE: Create in 2018/7/7 11:54
  * @DESCRIPTION:
  */
-public interface PaperCommitRepo extends JpaRepository<PaperCommit, Long> {
+public interface PaperCommitRepo extends JpaRepository<PaperCommit, Long>, JpaSpecificationExecutor<PaperCommit> {
 
     List<PaperCommit> findByPidOrNameContaining(Long pid, String name);
 
@@ -18,6 +21,8 @@ public interface PaperCommitRepo extends JpaRepository<PaperCommit, Long> {
 
     List<PaperCommit> findByPid(Long pid);
 
+//    List<PaperCommit> findBySpec(Specification spec);
+
     boolean existsByPidAndUid(Long pid, Long uid);
 
     List<PaperCommit> findByPidAndUidOrderByCreatetimeDesc(Long pid, Long uid);

+ 90 - 0
src/main/java/com/yaoxiang/diagnosis/model/OptionPercentVo.java

@@ -0,0 +1,90 @@
+package com.yaoxiang.diagnosis.model;
+
+public class OptionPercentVo {
+    private Integer number;
+    private double A;
+    private double B;
+    private double C;
+    private double D;
+    private double E;
+    private double blank;
+    private String answer;
+
+    public Integer getNumber() {
+        return number;
+    }
+
+    public void setNumber(Integer number) {
+        this.number = number;
+    }
+
+    public double getA() {
+        return A;
+    }
+
+    public void setA(double a) {
+        A = a;
+    }
+
+    public double getB() {
+        return B;
+    }
+
+    public void setB(double b) {
+        B = b;
+    }
+
+    public double getC() {
+        return C;
+    }
+
+    public void setC(double c) {
+        C = c;
+    }
+
+    public double getD() {
+        return D;
+    }
+
+    public void setD(double d) {
+        D = d;
+    }
+
+    public double getE() {
+        return E;
+    }
+
+    public void setE(double e) {
+        E = e;
+    }
+
+    public double getBlank() {
+        return blank;
+    }
+
+    public void setBlank(double blank) {
+        this.blank = blank;
+    }
+
+    public String getAnswer() {
+        return answer;
+    }
+
+    public void setAnswer(String answer) {
+        this.answer = answer;
+    }
+
+    @Override
+    public String toString() {
+        return "OptionPercentVo{" +
+                "number=" + number +
+                ", A=" + A +
+                ", B=" + B +
+                ", C=" + C +
+                ", D=" + D +
+                ", E=" + E +
+                ", blank=" + blank +
+                ", answer='" + answer + '\'' +
+                '}';
+    }
+}

+ 18 - 0
src/main/java/com/yaoxiang/diagnosis/service/CommitService.java

@@ -16,10 +16,18 @@ import com.yaoxiang.diagnosis.util.SecurityUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.data.jpa.domain.Specification;
+
+import javax.persistence.criteria.Predicate;
+
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Root;
+import java.sql.Timestamp;
 import java.util.*;
 
 /**
@@ -196,4 +204,14 @@ public class CommitService {
         }
         return code;
     }
+
+    public List<PaperCommit> listPaperCommit(Long pid, Long startTime, Long endTime) {
+        //TODO 增加时间区间查询,待优化查询
+        return paperCommitRepo.findAll((root, query1, criteriaBuilder) -> {
+            Predicate p1 = criteriaBuilder.equal(root.get("pid"), pid);
+            Predicate p2 = criteriaBuilder.between(root.get("createtime"), new Date(startTime), new Date(endTime));
+            return criteriaBuilder.and(p1, p2);
+        });
+    }
+
 }

+ 69 - 0
src/main/java/com/yaoxiang/diagnosis/util/ExportUtil.java

@@ -0,0 +1,69 @@
+package com.yaoxiang.diagnosis.util;
+
+import com.yaoxiang.diagnosis.model.OptionPercentVo;
+import org.apache.poi.xssf.usermodel.XSSFCell;
+import org.apache.poi.xssf.usermodel.XSSFRow;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class ExportUtil {
+
+    public static byte[] export1(List<OptionPercentVo> data) {
+        List<String> header = new ArrayList<>();
+        header.add("number");
+        header.add("A");
+        header.add("B");
+        header.add("C");
+        header.add("D");
+        header.add("E");
+        header.add("blank");
+        header.add("answer");
+//        header.add("useTime");
+        XSSFWorkbook workbook = new XSSFWorkbook();
+        XSSFSheet sheet = workbook.createSheet();
+        XSSFRow row = sheet.createRow(0);
+        for (int i = 0; i < header.size(); i++) {
+            XSSFCell cell = row.createCell(i);
+            cell.setCellValue(header.get(i));
+        }
+        int i = 1;
+        for (OptionPercentVo vo : data) {
+            row = sheet.createRow(i++);
+            XSSFCell cell = row.createCell(0);
+            cell.setCellValue(vo.getNumber());
+            XSSFCell cell1 = row.createCell(1);
+            cell1.setCellValue(vo.getA());
+            XSSFCell cell2 = row.createCell(2);
+            cell2.setCellValue(vo.getB());
+            XSSFCell cell3 = row.createCell(3);
+            cell3.setCellValue(vo.getC());
+            XSSFCell cell4 = row.createCell(4);
+            cell4.setCellValue(vo.getD());
+            XSSFCell cell5 = row.createCell(5);
+            cell5.setCellValue(vo.getE());
+            XSSFCell cell6 = row.createCell(6);
+            cell6.setCellValue(vo.getBlank());
+            XSSFCell cell7 = row.createCell(7);
+            cell7.setCellValue(vo.getAnswer());
+        }
+        ByteArrayOutputStream os =new ByteArrayOutputStream();
+        try {
+            workbook.write(os);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }finally {
+            try {
+                workbook.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return os.toByteArray();
+    }
+}