浏览代码

add get data for pdf

chenxz 7 年之前
父节点
当前提交
dd1852f2c4

+ 11 - 0
mooctest-site-server/pom.xml

@@ -280,6 +280,17 @@
             <artifactId>zip4j</artifactId>
             <version>1.3.2</version>
         </dependency>
+        <!-- PDF -->
+        <dependency>
+            <groupId>com.itextpdf</groupId>
+            <artifactId>itext-asian</artifactId>
+            <version>5.2.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.itextpdf</groupId>
+            <artifactId>itextpdf</artifactId>
+            <version>5.5.10</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 28 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/data/CasePDF.java

@@ -0,0 +1,28 @@
+package cn.iselab.mooctest.site.data;
+
+import cn.iselab.mooctest.site.web.data.forMongo.ReportForMongoDTO;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午2:53 2017/12/20
+ * @Modified By:
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CasePDF {
+
+    private String caseName;
+
+    private String caseScore;
+
+    private String description;
+
+    private String content;
+
+    private ReportForMongoDTO report;
+}

+ 44 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/data/ReportPDF.java

@@ -0,0 +1,44 @@
+package cn.iselab.mooctest.site.data;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.catalina.LifecycleState;
+
+import java.util.List;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午1:36 2017/12/19
+ * @Modified By:
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ReportPDF {
+
+    private String examName;
+
+    private String workerName;
+
+    private String school;
+
+    private String teacherName;
+
+    private String groupName;
+
+    private String dateTime;
+
+    private String score;
+
+    private String max;
+
+    private String min;
+
+    private String avg;
+
+    private String variance;
+
+    private List<CasePDF> cases;
+}

+ 2 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/CalculateScoreService.java

@@ -23,4 +23,6 @@ public interface CalculateScoreService {
     void calculatePersonalTotal(long taskId, long caseId, long userId, List<ScoreRuleItemVO> scoreRule);
 
     void calculatePersonalDevScore(long taskId, long caseId, long userId);
+
+    List<Double> calculateScores(List<Double> scores);
 }

+ 19 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/common/PdfService.java

@@ -0,0 +1,19 @@
+package cn.iselab.mooctest.site.service.common;
+
+import cn.iselab.mooctest.site.data.ReportPDF;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午1:24 2017/12/19
+ * @Modified By:
+ */
+public interface PdfService {
+
+    ReportPDF getReportPDF(Long examId,Long workerId) throws Exception;
+
+    void generatePDF(ReportPDF pdf, File file) throws Exception;
+}

+ 176 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/common/impl/PdfServiceImpl.java

@@ -0,0 +1,176 @@
+package cn.iselab.mooctest.site.service.common.impl;
+
+import cn.iselab.mooctest.site.data.AssignedCase;
+import cn.iselab.mooctest.site.data.CasePDF;
+import cn.iselab.mooctest.site.data.ReportPDF;
+import cn.iselab.mooctest.site.models.*;
+import cn.iselab.mooctest.site.service.*;
+import cn.iselab.mooctest.site.service.common.MongoAPIService;
+import cn.iselab.mooctest.site.service.common.PdfService;
+import cn.iselab.mooctest.site.web.data.forMongo.ReportForMongoDTO;
+import cn.iselab.mooctest.site.web.exception.HttpBadRequestException;
+import com.itextpdf.text.Document;
+import com.itextpdf.text.Image;
+import com.itextpdf.text.PageSize;
+import com.itextpdf.text.pdf.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午1:24 2017/12/19
+ * @Modified By:
+ */
+@Service
+public class PdfServiceImpl implements PdfService{
+
+    private String templatePdfPath="/Users/ROKG/学生测试报告文档3.pdf";
+    private String templateImgPath="/Users/ROKG/柱状图.jpg";
+
+    @Autowired
+    ExamService examService;
+
+    @Autowired
+    UserService userService;
+
+    @Autowired
+    GroupService groupService;
+
+    @Autowired
+    AssignedTaskService assignedTaskService;
+
+    @Autowired
+    CalculateScoreService calculateScoreService;
+
+    @Autowired
+    MongoAPIService mongoAPIService;
+
+    @Autowired
+    CaseService caseService;
+
+    @Override
+    public ReportPDF getReportPDF(Long examId,Long workerId) throws Exception{
+        ReportPDF reportPDF=new ReportPDF();
+        Task task=examService.getExamByIdAndParticipantIdIfPermited(examId,workerId);
+        if (task == null) {
+            throw new HttpBadRequestException("task not exits");
+        }
+        reportPDF.setExamName(task.getName());
+        SimpleDateFormat format=new SimpleDateFormat("HH:mm:ss");
+        reportPDF.setDateTime(task.getBeginTime()+"-"+format.format(task.getEndTime()));
+        User user=userService.findByUserId(workerId);
+        if (user == null) {
+            throw new HttpBadRequestException("user not exits");
+        }
+        reportPDF.setWorkerName(user.getName());
+        reportPDF.setSchool(user.getSchool());
+        List<Group> groups=groupService.getByExamId(task.getId());
+        if(!groups.isEmpty()){
+            throw new HttpBadRequestException("group not exits");
+        }
+        reportPDF.setGroupName(groups.get(0).getName());
+        User teacher=userService.findByUserId(task.getOwnerId());
+        if (teacher == null) {
+            throw new HttpBadRequestException("teacher not exits");
+        }
+        reportPDF.setTeacherName(teacher.getName());
+        AssignedTask assignedTask=assignedTaskService.getAssignedTask(examId,workerId);
+        if(assignedTask == null){
+            throw new HttpBadRequestException("score not exits");
+        }
+        reportPDF.setScore(assignedTask.getScore().toString());
+        List<AssignedTask> assignedTasks=assignedTaskService.getAssignedTasks(examId);
+        List<Double> scores=calculateScoreService.calculateScores(assignedTasks.stream().map(assignedTask1 -> assignedTask1.getScore()).collect(Collectors.toList()));
+        reportPDF.setMax(scores.get(0).toString());
+        reportPDF.setMin(scores.get(1).toString());
+        reportPDF.setAvg(scores.get(2).toString());
+        reportPDF.setVariance(scores.get(3).toString());
+
+        List<CasePDF> pdfs=new ArrayList<>();
+        List<AssignedCase> cases=assignedTaskService.wrapAssignedCases(assignedTask);
+        List<Long> caseIds=caseService.getCasesByTaskId(examId);
+        for (Long caseId:caseIds){
+            CasePDF pdf=new CasePDF();
+            Case caseEntity=caseService.getCaseById(caseId);
+            pdf.setCaseName(caseEntity.getName());
+            pdf.setDescription(caseEntity.getDescription());
+            pdf.setCaseScore(String.valueOf(cases.stream().findAny().filter(casse->  casse.getCaseId()==caseId).get().getMaxScore()));
+            pdf.setReport(this.getReport(examId,workerId,caseId));
+            pdfs.add(pdf);
+        }
+        return  reportPDF;
+    }
+
+    @Override
+    public void generatePDF(ReportPDF pdf, File file) throws Exception{
+        CasePDF casePDF=pdf.getCases().get(0);
+        PdfReader reader=new PdfReader(templatePdfPath);
+        ByteArrayOutputStream bos=new ByteArrayOutputStream();
+        PdfStamper ps=new PdfStamper(reader,bos);
+
+        BaseFont bf=BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
+        ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();
+        fontList.add(bf);
+        AcroFields fields=ps.getAcroFields();
+        fields.setSubstitutionFonts(fontList);
+
+        fields.setField("examName",pdf.getExamName());
+        fields.setField("workerName",pdf.getWorkerName());
+        fields.setField("school",pdf.getSchool());
+        fields.setField("teacherName",pdf.getTeacherName());
+        fields.setField("groupName",pdf.getGroupName());
+        fields.setField("dateTime",pdf.getDateTime());
+        fields.setField("score",pdf.getScore());
+        fields.setField("max",pdf.getMax());
+        fields.setField("min",pdf.getMin());
+        fields.setField("avg",pdf.getAvg());
+        fields.setField("variance",pdf.getVariance());
+
+        Image img = Image.getInstance(templateImgPath);  //使用png格式
+        img.setAlignment(Image.MIDDLE | Image.TEXTWRAP);
+        img.setBorderWidth(10);
+        img.setAbsolutePosition(100, 250);
+        img.scaleToFit(2000, 150);// 大小
+        PdfContentByte over = ps.getUnderContent(1); // overCount 与underCount
+        over.addImage(img);
+
+        fields.setField("caseName",casePDF.getCaseName());
+        fields.setField("caseScore",casePDF.getCaseScore());
+        fields.setField("description",casePDF.getDescription());
+        fields.setField("content",casePDF.getContent());
+
+        ps.setFormFlattening(true);
+        ps.close();
+
+        FileOutputStream fos = new FileOutputStream(file);
+        //方法一,生成的pdf文件较大
+//        fos.write(bos.toByteArray());
+//        fos.close();
+        //方法二,生成的pdf文件较小
+        Document doc = new Document(PageSize.A4);
+        PdfCopy copy = new PdfCopy(doc, fos);
+        doc.open();
+        for(int i=1;i<=2;i++) {
+            doc.newPage();
+            PdfImportedPage importPage = copy.getImportedPage(
+                    new PdfReader(bos.toByteArray()), i);
+            copy.addPage(importPage);
+        }
+        doc.close();
+    }
+
+    private ReportForMongoDTO getReport(long examId, long participantId, long caseId){
+        ReportForMongoDTO report=new ReportForMongoDTO();
+        return report;
+    }
+}

+ 16 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/CalculateScoreServiceImpl.java

@@ -22,6 +22,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -101,6 +102,21 @@ public class CalculateScoreServiceImpl implements CalculateScoreService {
         this.dev(taskId,caseId,grades,weight);
     }
 
+    @Override
+    public List<Double> calculateScores(List<Double> scores){
+        List<Double> result=new ArrayList<>();
+        result.add(Collections.max(scores));
+        result.add(Collections.min(scores));
+        double avg=scores.stream().reduce((sum,score)-> sum).get()/scores.size();
+        double sum=0;
+        result.add(avg);
+        for(Double score:scores){
+            sum+=Math.scalb((score-avg),1);
+        }
+        result.add(sum/(scores.size()-1));
+        return result;
+    }
+
     private void manual(List<CaseTake> caseTakeList){
         for(CaseTake caseTake:caseTakeList){
             List<ManagerScore> managerScoreList=managerScoreDao.findByCaseTakeId(caseTake.getId());

+ 7 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/OSSController.java

@@ -89,4 +89,11 @@ public class OSSController extends BaseController {
                          @RequestParam(value = "fileName")String fileName) throws Exception{
         return ossLogic.zipFile(examId,workerId,fileName);
     }
+
+    @RequestMapping(value = UrlConstants.API_COMMON + "pdf/file", method = RequestMethod.GET)
+    public String getPdf(@RequestParam(value = "examId")Long examId,
+                         @RequestParam(value = "workerId")Long workerId,
+                         @RequestParam(value = "fileName")String fileName) throws Exception{
+        return ossLogic.getPdf(examId,workerId,fileName);
+    }
 }

+ 2 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/OSSLogic.java

@@ -37,4 +37,6 @@ public interface OSSLogic {
     String zipFile(Long examId,Long workerId,String fileName) throws Exception;
 
     String zipFilePath(String fileName);
+
+    String getPdf(Long examId, Long workerId, String fileName) throws Exception;
 }

+ 40 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/OSSLogicImpl.java

@@ -2,7 +2,10 @@ package cn.iselab.mooctest.site.web.logic.impl;
 
 import cn.iselab.mooctest.site.common.constant.AliyunOSSConstants;
 import cn.iselab.mooctest.site.common.constant.PathConstants;
+import cn.iselab.mooctest.site.data.CasePDF;
+import cn.iselab.mooctest.site.data.ReportPDF;
 import cn.iselab.mooctest.site.data.config.OSSClientConfig;
+import cn.iselab.mooctest.site.service.common.PdfService;
 import cn.iselab.mooctest.site.web.exception.HttpBadRequestException;
 import cn.iselab.mooctest.site.web.logic.OSSLogic;
 import com.aliyun.oss.HttpMethod;
@@ -14,6 +17,7 @@ import com.aliyuncs.http.MethodType;
 import com.aliyuncs.http.ProtocolType;
 import com.aliyuncs.sts.model.v20150401.AssumeRoleRequest;
 import com.aliyuncs.sts.model.v20150401.AssumeRoleResponse;
+import lombok.AllArgsConstructor;
 import net.lingala.zip4j.core.ZipFile;
 import net.lingala.zip4j.model.ZipParameters;
 import net.lingala.zip4j.util.Zip4jConstants;
@@ -26,6 +30,7 @@ import org.springframework.web.multipart.MultipartFile;
 
 import java.io.*;
 import java.net.URL;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
@@ -45,6 +50,9 @@ public class OSSLogicImpl implements OSSLogic {
     @Autowired
     private DefaultAcsClient acsClient;
 
+    @Autowired
+    private PdfService pdfService;
+
     @Value("${aliOSS.endPoint}")
     private String endPoint;
     @Value("${aliOSS.accessKeyId}")
@@ -240,4 +248,36 @@ public class OSSLogicImpl implements OSSLogic {
             return null;
         }
     }
+
+    @Override
+    public String getPdf(Long examId, Long workerId, String fileName) throws Exception{
+        ReportPDF reportPDF=new ReportPDF();
+        reportPDF.setExamName("2017软件测试大赛秋季赛开发者总决赛");
+        reportPDF.setSchool("中国药科大学");
+        reportPDF.setScore("99.9");
+        reportPDF.setTeacherName("陈振宇");
+        reportPDF.setWorkerName("Mr.哈哈哈");
+        reportPDF.setGroupName("三年二班");
+        reportPDF.setMax("99.9");
+        reportPDF.setAvg("66.6");
+        reportPDF.setMin("12.2");
+        reportPDF.setVariance("52.9");
+        reportPDF.setDateTime("2017-11-09 14:00:00-16:00:00");
+        CasePDF pdf=new CasePDF();
+        pdf.setCaseName("DataLog");
+        pdf.setCaseScore("99.9");
+        pdf.setDescription("2017软件测试大赛秋季赛开发者总决赛第一题");
+        pdf.setContent("请在在慕测平台的Eclipse客户端上完成Appium测试脚本。\n" +
+                "请仔细阅读 脚本编写要求文档\n" +
+                "请仔细阅读代码示例\n" +
+                "请仔细阅读 测试需求文档\n" +
+                "请于官网查看 评分规则\n" +
+                "Eclipse中题目包比较大,请同学们耐心等待下载题目!\n");
+        List<CasePDF> pdfs=new ArrayList<>();
+        pdfs.add(pdf);
+        reportPDF.setCases(pdfs);
+        File file = new File(FileUtils.getUserDirectory()+"/"+fileName);
+        pdfService.generatePDF(reportPDF,file);
+        return FileUtils.getUserDirectory()+"/"+fileName;
+    }
 }

+ 7 - 3
mooctest-site-server/src/main/resources/application.yaml

@@ -54,9 +54,13 @@ aliOSS:
 spring:
     profiles: dev
     datasource:
-        url: jdbc:mysql://101.37.175.111:3306/mooctest_main_dev?useUnicode=yes&characterEncoding=UTF-8
-        username: mooctest
-        password: secr3t!
+         url: jdbc:mysql://127.0.0.1:3306/mooctest_main_dev?useUnicode=yes&characterEncoding=UTF-8
+         username: root
+         password: cxz6518
+#    datasource:
+#        url: jdbc:mysql://101.37.175.111:3306/mooctest_main_dev?useUnicode=yes&characterEncoding=UTF-8
+#        username: mooctest
+#        password: secr3t!
     dubbo:
         application.name: local-dubbo-main-site-provider-consumer3
         registry.address: zookeeper://101.37.175.111:2181