فهرست منبع

Merge branch 'prod' of http://git.mooctest.net/summer/crowdsource-backend into prod

xujiawei 5 سال پیش
والد
کامیت
4d00219624

+ 4 - 0
.gitattributes

@@ -1,2 +1,6 @@
 # Auto detect text files and perform LF normalization
 * text=auto
+
+/target/
+.yml
+.xml

+ 32 - 0
src/main/java/edu/nju/controller/AnalyzeController.java

@@ -1,5 +1,6 @@
 package edu.nju.controller;
 
+import java.io.IOException;
 import java.io.PrintWriter;
 import java.util.HashMap;
 import java.util.List;
@@ -9,6 +10,8 @@ import javax.servlet.http.HttpServletResponse;
 
 import edu.nju.model.AnalyseVO;
 import edu.nju.model.BugDataVO;
+import edu.nju.model.HistoricalDataVO;
+import edu.nju.util.BlockChainAspect;
 import org.json.JSONArray;
 import org.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -30,6 +33,9 @@ public class AnalyzeController {
 	
 	@Autowired
 	ReportService rservice;
+
+	@Autowired
+	BlockChainAspect blockChainAspect;
 	
 	//根据用例获取所有有效bug
 	@RequestMapping(value = "/valid")
@@ -341,4 +347,30 @@ public class AnalyzeController {
 			e.printStackTrace();
 		}
 	}
+
+	@RequestMapping(value = "/historicalData")
+	@ResponseBody
+	public HistoricalDataVO getHistoricalData(Long workerId,int caseTypeId){
+		return aservice.getHistoricalData(workerId, caseTypeId);
+	}
+
+	@RequestMapping(value = "/uploadTestReportToBlockChain")
+	@ResponseBody
+	public void uploadTestReport(String bug_id,HttpServletResponse response){
+		try {
+			PrintWriter out = response.getWriter();
+			JSONObject result = new JSONObject();
+			if (blockChainAspect.uploadTestReportInfoToBlockChain(bug_id)) {
+				result.put("status","200");
+			}else{
+				result.put("status","500");
+			}
+			out.print(result);
+			out.flush();
+			out.close();
+		}catch (IOException e){
+			e.printStackTrace();
+		}
+	}
+
 }

+ 4 - 1
src/main/java/edu/nju/controller/CrowdsourcingToReviewController.java

@@ -30,9 +30,12 @@ public class CrowdsourcingToReviewController {
         ReviewJob reviewJob=rService.getJob(jobId);
         String result="";
         if(reviewJob!=null){
-            String temp=reviewJob.getExam_id();
+            String temp=reviewJob.getCase_id();
             if(temp!=null)
                 result=temp;
+            String taskId=reviewJob.getExam_id();
+            if(taskId!=null)
+                result=result+"-"+taskId;
         }
         return result;
     }

+ 9 - 22
src/main/java/edu/nju/controller/ExtraController.java

@@ -9,6 +9,8 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import edu.nju.entities.*;
+import edu.nju.model.ExamVO;
+import edu.nju.model.PageExamVO;
 import org.json.JSONArray;
 import org.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -95,6 +97,13 @@ public class ExtraController {
 			e.printStackTrace();
 		}
 	}
+
+	//获得一场众测三级页面信息
+	@RequestMapping(value = "/getPageVo")
+	@ResponseBody
+	public PageExamVO findPage(Long examId, Long caseId) {
+		return extraService.findPageAndExam(examId,caseId);
+	}
 	
 	//使用worker_id获取测试报告
 	@RequestMapping(value = "/findByWorker")
@@ -421,28 +430,6 @@ public class ExtraController {
 			e.printStackTrace();
 		}
 	}
-	
-	//获取页面json
-	@RequestMapping(value = "/getPageJson")
-	@ResponseBody
-	public void getPageJson(String caseId, HttpServletResponse response) {
-		try {
-			PrintWriter out = response.getWriter();
-			JSONObject result = new JSONObject();
-			Exam exam = extraService.getExam(caseId);
-			if(exam != null) { 
-				result.put("status", 200);
-				result.put("result", exam.getJson());
-			}
-			else { result.put("status", 500); }
-			out.print(result);
-			out.flush();
-			out.close();
-		} catch (IOException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-	}
 
 
 	@RequestMapping(value = "/updateTask", method = RequestMethod.POST)

+ 26 - 5
src/main/java/edu/nju/controller/ReviewAnalyzeController.java

@@ -1,12 +1,11 @@
 package edu.nju.controller;
 
+import edu.nju.entities.ReviewJob;
 import edu.nju.service.ReviewAnalyzeService;
 import org.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.CrossOrigin;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
@@ -35,11 +34,33 @@ public class ReviewAnalyzeController {
     }
 
     //获取众审任务的结果excel
-    @RequestMapping(value = "/getJobExcel")
+    @RequestMapping(value = "/job/excel" , method = RequestMethod.GET)
     @ResponseBody
     public String getExcel (String jobId){
         String res = reviewAnalyzeService.getExcel(jobId);
-        return res==null?"errpr":res;
+        return res==null?"err0r":res;
     }
 
+    @RequestMapping(value = "/job/json", method = RequestMethod.GET)
+    @ResponseBody
+    public void getJson ( @RequestParam("id") String jobId , HttpServletResponse response){
+        try {
+            PrintWriter out = response.getWriter();
+            JSONObject job = reviewAnalyzeService.getJsonExport(jobId);
+            out.print(job);
+            out.flush();
+            out.close();
+        }catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+    }
+
+//    @RequestMapping(value = "/job/json", method = RequestMethod.GET)
+//    @ResponseBody
+//    public JSONObject getJson ( @RequestParam("id") String jobId , HttpServletResponse response){
+//        JSONObject job = reviewAnalyzeService.getJsonExport(jobId);
+//        return job;
+//    }
+
 }

+ 19 - 0
src/main/java/edu/nju/controller/ReviewPaperController.java

@@ -6,6 +6,7 @@ import edu.nju.entities.ReviewReport;
 import edu.nju.entities.ReviewWorker;
 import edu.nju.model.CrowdReviewReportDTO;
 import edu.nju.model.CrowdReviewReportVO;
+import edu.nju.service.ReviewAnalyzeService;
 import edu.nju.service.ReviewPaperService;
 import org.json.JSONArray;
 import org.json.JSONObject;
@@ -27,6 +28,9 @@ public class ReviewPaperController {
     @Autowired
     ReviewPaperService reviewPaperService;
 
+    @Autowired
+    ReviewAnalyzeService analyzeService;
+
     @RequestMapping(value = "/uploadReport", method = RequestMethod.POST)
     @ResponseBody
     public  CrowdReviewReportVO uploadReport(@RequestBody CrowdReviewReportDTO crowdReviewReportDTO){
@@ -151,5 +155,20 @@ public class ReviewPaperController {
         return url;
     }
 
+    @RequestMapping(value = "/answer", method = RequestMethod.GET)
+    @ResponseBody
+    public void getPaperAnswerJson (@RequestParam("paperId") String peperId, HttpServletResponse response ){
+        try {
+            PrintWriter out = response.getWriter();
+            JSONArray paperJson = analyzeService.getJsonExportByPaper(peperId);
+            out.print(paperJson);
+            out.flush();
+            out.close();
+        }catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+    }
+
 
 }

+ 5 - 0
src/main/java/edu/nju/controller/UploadController.java

@@ -5,6 +5,7 @@ import java.io.PrintWriter;
 
 import javax.servlet.http.HttpServletResponse;
 
+import edu.nju.util.BlockChainAspect;
 import org.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -26,6 +27,9 @@ public class UploadController {
 	
 	@Autowired
 	CTBService ctbservice;
+
+	@Autowired
+	BlockChainAspect blockChainAspect;
 	
 	//上传新的Bug报告
 	@RequestMapping(value = "/submit", method = RequestMethod.POST)
@@ -36,6 +40,7 @@ public class UploadController {
 		String id = saveservice.save(case_take_id, bug_category, description, img_url, severity, recurrent, title, report_id, parent, page, useCase, case_id);
 //		System.out.println(useCase);
 		if(!useCase.equals("null") && !id.equals("")) {flag = ctbservice.save(useCase, id, case_take_id, report_id);}
+		boolean uploadBlockResult=blockChainAspect.uploadTestReportInfoToBlockChain(id);
 		if(flag && !id.equals("")) {
 			result.put("status", "200");
 			result.put("id", id);

+ 5 - 0
src/main/java/edu/nju/dao/ReportDao.java

@@ -60,5 +60,10 @@ public class ReportDao {
 		query.addCriteria(Criteria.where("task_id").is(task_id));
 		return mongoOperations.find(query, Report.class);
 	}
+	public List<Report> findReportsByWorker(String worker_id) {
+		Query query = new Query();
+		query.addCriteria(Criteria.where("worker_id").is(worker_id));
+		return mongoOperations.find(query, Report.class);
+	}
 	
 }

+ 8 - 0
src/main/java/edu/nju/dao/StuInfoDao.java

@@ -35,4 +35,12 @@ public class StuInfoDao {
 		if(stu_info == null || stu_info.size() == 0) { return "null"; }
 		else { return stu_info.get(0).getWorker_id(); }
 	}
+
+	public String findWorkerName(String report_id) {
+		Query query = new Query();
+		query.addCriteria(Criteria.where("_id").is(report_id));
+		List<StuInfo> stu_info = mongoOperations.find(query, StuInfo.class);
+		if(stu_info == null || stu_info.size() == 0) { return "null"; }
+		else { return stu_info.get(0).getName(); }
+	}
 }

+ 75 - 0
src/main/java/edu/nju/model/ExamVO.java

@@ -0,0 +1,75 @@
+package edu.nju.model;
+
+import java.util.Date;
+
+public class ExamVO {
+    private Long id;
+
+    private Long caseId;
+
+    private int state;
+
+    private int caseTypeId;
+
+    private Date beginTime;
+
+    private Date endTime;
+
+    public ExamVO(Long id,Long caseId, int state, int caseTypeId, Date beginTime, Date endTime) {
+        this.id = id;
+        this.caseId=caseId;
+        this.state = state;
+        this.caseTypeId = caseTypeId;
+        this.beginTime = beginTime;
+        this.endTime = endTime;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getCaseId() {
+        return caseId;
+    }
+
+    public void setCaseId(Long caseId) {
+        this.caseId = caseId;
+    }
+
+    public int getState() {
+        return state;
+    }
+
+    public void setState(int state) {
+        this.state = state;
+    }
+
+    public int getCaseTypeId() {
+        return caseTypeId;
+    }
+
+    public void setCaseTypeId(int caseTypeId) {
+        this.caseTypeId = caseTypeId;
+    }
+
+    public Date getBeginTime() {
+        return beginTime;
+    }
+
+    public void setBeginTime(Date beginTime) {
+        this.beginTime = beginTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+}
+

+ 64 - 0
src/main/java/edu/nju/model/HistoricalDataVO.java

@@ -0,0 +1,64 @@
+package edu.nju.model;
+
+
+import java.util.List;
+
+public class HistoricalDataVO {
+    private int reportNum;
+
+    private List<Double>scoreList;  //各个报告的得分
+
+    private Double totalScore;   //报告总分
+
+    private int participateNum;   //参加的和本次考试类型有关的众包测试次数
+
+    private int totalParticipateNum;  //参加众包考试次数
+
+    public HistoricalDataVO(int reportNum, List<Double> scoreList, Double totalScore, int participateNum, int totalParticipateNum) {
+        this.reportNum = reportNum;
+        this.scoreList = scoreList;
+        this.totalScore = totalScore;
+        this.participateNum = participateNum;
+        this.totalParticipateNum = totalParticipateNum;
+    }
+
+    public int getReportNum() {
+        return reportNum;
+    }
+
+    public void setReportNum(int reportNum) {
+        this.reportNum = reportNum;
+    }
+
+    public List<Double> getScoreList() {
+        return scoreList;
+    }
+
+    public void setScoreList(List<Double> scoreList) {
+        this.scoreList = scoreList;
+    }
+
+    public Double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Double totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public int getParticipateNum() {
+        return participateNum;
+    }
+
+    public void setParticipateNum(int participateNum) {
+        this.participateNum = participateNum;
+    }
+
+    public int getTotalParticipateNum() {
+        return totalParticipateNum;
+    }
+
+    public void setTotalParticipateNum(int totalParticipateNum) {
+        this.totalParticipateNum = totalParticipateNum;
+    }
+}

+ 59 - 0
src/main/java/edu/nju/model/PageExamVO.java

@@ -0,0 +1,59 @@
+package edu.nju.model;
+
+public class PageExamVO {
+
+    private Long examId;
+
+    private Long caseId;
+
+    private ExamVO examVO;
+
+    private int caseTypeId;   //web:0 app:1
+
+    private String pageContent;
+
+    public PageExamVO(Long examId,Long caseId) {
+        this.examId = examId;
+        this.caseId = caseId;
+    }
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long id) {
+        this.examId = id;
+    }
+
+    public Long getCaseId() {
+        return caseId;
+    }
+
+    public void setCaseId(Long caseId) {
+        this.caseId = caseId;
+    }
+
+    public ExamVO getExamVO() {
+        return examVO;
+    }
+
+    public void setExamVO(ExamVO examVO) {
+        this.examVO = examVO;
+    }
+
+    public int getCaseTypeId() {
+        return caseTypeId;
+    }
+
+    public void setCaseTypeId(int caseTypeId) {
+        this.caseTypeId = caseTypeId;
+    }
+
+    public String getPageContent() {
+        return pageContent;
+    }
+
+    public void setPageContent(String pageContent) {
+        this.pageContent = pageContent;
+    }
+}

+ 5 - 0
src/main/java/edu/nju/model/WebBrand.java

@@ -0,0 +1,5 @@
+package edu.nju.model;
+
+public enum WebBrand {
+    windows,linux,macos
+}

+ 34 - 5
src/main/java/edu/nju/service/AnalyzeService.java

@@ -4,11 +4,9 @@ import java.util.*;
 
 import edu.nju.dao.*;
 import edu.nju.entities.*;
-import edu.nju.model.AnalyseVO;
-import edu.nju.model.BugDataVO;
-import edu.nju.model.BugSeverity;
-import edu.nju.model.WorkerVO;
+import edu.nju.model.*;
 import edu.nju.util.HTTP;
+import org.apache.commons.lang3.EnumUtils;
 import org.json.JSONArray;
 import org.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -129,7 +127,7 @@ public class AnalyzeService {
 		List<Report> reports = reportDao.findByExamId(examId);
 		for(Report report : reports) {
 			if(report!=null) {
-				String workerId=findWorkerId(report.getId());
+				String workerId=report.getWorker_id();
 				if(!workerId.equals("")&&!result.contains(workerId))
 					result.add(Long.parseLong(workerId));
 			}
@@ -573,5 +571,36 @@ public class AnalyzeService {
 		return analyseVO;
 	}
 
+	public HistoricalDataVO getHistoricalData(Long workerId, int caseTypeId){
+		List<Report>reports=reportDao.findReportsByWorker(String.valueOf(workerId));
+		int reportNum=reports.size();
+		List<Double>reportScoreList=new ArrayList<>();
+		double totalScore=0;
+		int participateSimilarNum=0;
+		for(Report report:reports){
+			String reportId=report.getId();
+			List<String>bugIds=bdao.findByReport(reportId);
+			double score=0;
+			for(String bugId:bugIds){
+				BugScore bugScore=bsdao.findById(bugId);
+				if(bugScore!=null) {
+					score += bugScore.getGrade();
+				}
+			}
+			totalScore+=score;
+			reportScoreList.add(score);
+			int itemCaseType=1;
+			String brand=report.getDevice_os();
+			if(EnumUtils.isValidEnum(WebBrand.class, brand)){
+				itemCaseType=0;
+			}
+			if(itemCaseType==caseTypeId){
+				participateSimilarNum++;
+			}
+		}
+		HistoricalDataVO historicalDataVO=new HistoricalDataVO(reportNum,reportScoreList,totalScore,participateSimilarNum,reportNum);
+		return historicalDataVO;
+	}
+
 
 }

+ 43 - 2
src/main/java/edu/nju/service/ExtraService.java

@@ -9,9 +9,9 @@ import java.util.*;
 
 import edu.nju.dao.*;
 import edu.nju.entities.*;
-import edu.nju.model.BugRecurrent;
-import edu.nju.model.BugSeverity;
+import edu.nju.model.*;
 import edu.nju.util.*;
+import org.apache.commons.lang3.EnumUtils;
 import org.json.JSONArray;
 import org.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -276,6 +276,47 @@ public class ExtraService {
 		return null;
 	}
 
+	public PageExamVO findPageAndExam(long examId, long caseId){
+		PageExamVO pageExamVO=new PageExamVO(examId,caseId);
+		Exam examCase=getExam(String.valueOf(caseId));
+		pageExamVO.setPageContent(examCase.getJson());
+		String json=examCase.getPaper_type();
+		int caseTypeId=getPaperType(json);
+		pageExamVO.setCaseTypeId(caseTypeId);
+		Task task=taskDao.findById(String.valueOf(examId));
+		Date startTime=null;
+		Date endTime=null;
+		if(task!=null){
+			startTime=new Date(task.getStart_time());
+			endTime=new Date(task.getEnd_time());
+		}
+		ExamVO examVO=new ExamVO(examId,caseId,0,caseTypeId,startTime,endTime);
+		pageExamVO.setExamVO(examVO);
+		return pageExamVO;
+	}
+
+	private int getPaperType(String json){
+		//json=json.substring(1,json.length()-1);
+		JSONObject jsonObject = new JSONObject(json);
+		JSONArray jsonArray=jsonObject.getJSONArray("subTitles");
+		int caseTypeId=1;//这里只对WEB和APP进行了判断
+		for(int i=0;i<jsonArray.length();i++) {
+			JSONObject item = jsonArray.getJSONObject(i);
+			String label=item.getString("name");
+			if(label.equals("操作系统")){
+				JSONArray brandList=item.getJSONArray("value");
+				String brand=String.valueOf(brandList.get(0));
+				if(EnumUtils.isValidEnum(WebBrand.class, brand)){
+					caseTypeId=0;
+				}
+				break;
+			}
+		}
+		return caseTypeId;
+	}
+
+
+
 
 
 

+ 75 - 0
src/main/java/edu/nju/service/ReviewAnalyzeService.java

@@ -9,6 +9,7 @@ import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.util.CellRangeAddress;
+import org.json.JSONArray;
 import org.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -97,6 +98,80 @@ public class ReviewAnalyzeService {
     }
 
 
+    public JSONArray getJsonExportByPaper( String paperId ) {
+        List<ReviewJob> jobs =    reviewJobDao.findJobsByPaper(paperId);
+        JSONArray res = new JSONArray();
+        for (ReviewJob job : jobs){
+            res.put(getJsonExport(job.getId()));
+        }
+        return res;
+    }
+
+    public JSONObject getJsonExport ( String jobId){
+        ReviewJob job = reviewJobDao.findJob(jobId) ;
+        JSONObject res = new JSONObject();
+        JSONArray reportInfo = new JSONArray();
+        List<ReviewReport > reports = reviewReportDao.getReportsByPaperId(job.getPaper_id());
+        JSONObject reportJsonInfo ;
+        for( ReviewReport r : reports){ // 便利所有的报告,报告报告的信息 和 评审信息
+            reportJsonInfo = new JSONObject();
+            reportJsonInfo.put("info",new JSONObject(r));
+            List<ReviewItem> items = reviewItemDao.findItemsByReport(r.getId());
+            JSONArray itemArray = new JSONArray();
+            for (ReviewItem i : items){
+                JSONObject itemJson = new JSONObject();
+                itemJson.put("description" , i.getDescription());
+                List<ReviewAnswer> answers = reviewAnswerDao.getItemReportJobAnswers(i.getId(),r.getId(),jobId);
+                int [] answerCount = new int [i.getOptions().size()];
+                StringBuffer sb = new StringBuffer() ;
+                JSONArray answerTemp = new JSONArray();
+                JSONObject jsonTemp ;
+                itemJson.put("type",i.getType());
+                switch (i.getType()){
+                    case "Single" :
+                    case "Multiple":
+                        for(ReviewAnswer answer : answers){
+                            for( int ii = 0 ;ii < answer.getAnswers().size();ii++){
+                                answerCount[ii] ++;
+                            }
+                        }
+                        for( int ii =0;ii<i.getOptions().size();ii++){
+                            jsonTemp = new JSONObject();
+                            jsonTemp.put(i.getOptions().get(ii),answerCount[ii]);
+                            answerTemp.put(jsonTemp);
+                        }
+                        break;
+                    case "Description" :
+                        for(ReviewAnswer answer : answers){
+                            sb.append(answer.getAnswers().toString()+"\n");
+                        }
+                        jsonTemp = new JSONObject();
+                        jsonTemp.put(i.getDescription(),sb.toString());
+                        answerTemp.put(jsonTemp);
+                        break;
+                    case "File":
+                        for(ReviewAnswer answer : answers){
+                            sb.append(answer.getFile_url()+"\n");
+                        }
+                        jsonTemp = new JSONObject();
+                        jsonTemp.put(i.getDescription(),sb.toString());
+                        answerTemp.put(jsonTemp);
+                        break;
+                    default:
+                        break;
+                }
+                itemJson.put("answer",answerTemp);
+                itemArray.put(itemJson);
+            }
+            reportJsonInfo.put("checkItem",itemArray);
+            reportInfo.put(reportJsonInfo);
+        }
+        res.put("reportInfo",reportInfo);
+        res.put("jobInfo",new JSONObject(job));
+        return res;
+    }
+
+
 
     public String getExcel (String jobId){
         int rIndex = 0;

+ 8 - 0
src/main/java/edu/nju/service/ReviewPaperService.java

@@ -117,6 +117,14 @@ public class ReviewPaperService {
         JSONObject object = new JSONObject();
         try {
             JSONObject jsonObject = new JSONObject(paperJson);
+            if(jsonObject.has("paper_id")){
+                String paperId=jsonObject.getString("paper_id");
+                if(reviewPaperDao.findPaper(paperId)!=null){
+                    object.put("status","success");
+                    object.put("paperId",paperId);
+                    return object;
+                }
+            }
             ReviewPaperVO reviewPaperVO = getReviewPaperVO(jsonObject);
             reviewPaperVO.setCreate_time(Long.toString(System.currentTimeMillis()));
             ReviewPaper reviewPaper = new ReviewPaper(reviewPaperVO);

+ 233 - 61
src/main/java/edu/nju/util/BlockChainAspect.java

@@ -2,14 +2,22 @@ package edu.nju.util;
 
 import edu.nju.dao.BugDao;
 import edu.nju.dao.ReportDao;
+import edu.nju.dao.StuInfoDao;
+import edu.nju.dao.TaskDao;
 import edu.nju.entities.Bug;
 import edu.nju.entities.Report;
+import edu.nju.entities.StuInfo;
+import edu.nju.entities.Task;
 import org.aspectj.lang.JoinPoint;
 import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.annotation.*;
+import org.json.JSONArray;
+import org.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 import javax.servlet.http.HttpServletResponse;
+import java.util.List;
 
 
 /**
@@ -28,6 +36,17 @@ public class BlockChainAspect {
     @Autowired
     ReportDao reportDao;
 
+    @Autowired
+    TaskDao taskDao;
+
+    @Autowired
+    StuInfoDao stuInfoDao;
+
+    private static final String blockChainHost="http://111.231.68.200:8082/";
+
+    @Value("${mooctest.url}")
+    private String MOOCTEST_HOST;
+
 
     /**
      * 定义切入点,切入点为com.example.demo.aop.AopController中的所有函数
@@ -42,34 +61,13 @@ public class BlockChainAspect {
     public void saveBugGrade(){
 
     }
-    /**
-     * @description  在连接点执行之前执行的通知
-     */
-    @Before("saveBugGrade()")
-    public void doBeforeGame(JoinPoint joinPoint){
-        Object[] obj = joinPoint.getArgs();
-        for (Object argItem : obj) {
-            System.out.println("---->now-->argItem:" + argItem);
-        }
-
-    }
-
-    /**
-     * @description  在连接点执行之后执行的通知(返回通知和异常通知的异常)
-     */
-    @After("saveBugGrade()")
-    public void doAfterGame(JoinPoint joinPoint){
-        Object[] obj = joinPoint.getArgs();
-        for (Object argItem : obj) {
-            System.out.println("---->now-->argItem:" + argItem);
-        }
-    }
 
     /**
      * @description  保存bug分数后传递给区块链
      */
     @AfterReturning(value="saveBugGrade()",returning = "keys")
     public void doAfterReturningSaveBugGrade(JoinPoint joinPoint,Object keys){
+        System.out.println("传递给区块链");
         Object[] obj = joinPoint.getArgs();
         for (Object argItem : obj) {
             System.out.println("---->now-->argItem:" + argItem);
@@ -82,57 +80,231 @@ public class BlockChainAspect {
 
         Bug bug=bugDao.findByid(bugId);
         Report report=reportDao.findById(bug.getReport_id());
-        String crowdTestId=report.getCase_take_id();
 
-        String bugReviewerId="default";
+
+
+        String defaultString="default";
+
+        JSONObject bugReviewVO=new JSONObject();
+
+        if(report==null){
+            bugReviewVO.put("bugReportId",bugId);
+            bugReviewVO.put("bugReportScore",Integer.parseInt(grade));
+            bugReviewVO.put("reportReviewer",defaultString);
+            bugReviewVO.put("taskId",defaultString);
+            bugReviewVO.put("taskName",defaultString);
+            bugReviewVO.put("testReportId",defaultString);
+            bugReviewVO.put("type",0);
+            bugReviewVO.put("updateTime",System.currentTimeMillis());
+        }else{
+            bugReviewVO.put("bugReportId",bugId);
+            bugReviewVO.put("bugReportScore",Integer.parseInt(grade));
+            bugReviewVO.put("reportReviewer",defaultString);
+            bugReviewVO.put("taskId",report.getCase_take_id());
+
+            Task task=taskDao.findById(report.getTask_id());
+            if(task==null){
+                task=getAndSaveTaskInfo(report.getTask_id());
+                if(task==null){
+                    bugReviewVO.put("taskName",defaultString);
+                }else{
+                    bugReviewVO.put("taskName",task.getName());
+                }
+            }else {
+                bugReviewVO.put("taskName",task.getName());
+            }
+            bugReviewVO.put("testReportId",report.getId());
+            bugReviewVO.put("type",0);
+            bugReviewVO.put("updateTime",System.currentTimeMillis());
+        }
+
+//        System.out.println(bugReviewVO);
+        String url=blockChainHost+"reportReview";
+        try {
+            String result = HTTP.postBody(url, bugReviewVO.toString());
+                    if (!result.equals("")) {
+                        JSONObject resultJson = new JSONObject(result);
+                        System.out.println(resultJson);
+                    }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+
     }
 
-    /**
-     * @description  上传bug后传递给区块链
-     */
-    @AfterReturning(value="bugSubmit()",returning = "keys")
-    public void doAfterReturningBugSubmit(JoinPoint joinPoint,Object keys){
-        Object[] obj = joinPoint.getArgs();
-        for (Object argItem : obj) {
-            System.out.println("---->now-->argItem:" + argItem);
+    private Task getAndSaveTaskInfo(String id){
+        String result = HTTP.sendGet(MOOCTEST_HOST+"/api/exam/" + id + "/info", "");
+        if (!"".equals(result)) {
+            JSONObject json = new JSONObject(result);
+            long beginTime = json.getLong("beginTime");
+            long endTime = json.getLong("endTime");
+            String name=json.getString("name");
+            double totalMins = (endTime - beginTime) / 1000 / 60.0;
+            Task newTask = new Task(id, name,beginTime, endTime, totalMins, totalMins);
+            taskDao.save(newTask);
+            return newTask;
+        }else{
+            return null;
         }
-        //todo 将该信息传递给区块链服务 如何获得该bugID????
-        //任务ID、缺陷报告hash、缺陷报告 ID、众测工人ID
+    }
 
 
-        String bugId= (String) obj[0];
-        String grade=(String) obj[1];
+    //将一场众测的所有报告上传至区块链
+    public void uploadTestReportInfo(String case_take_id){
+        String defaultString="defaultString";
+        List<Report> reportList=reportDao.findByCaseTakeId(case_take_id);
+        if(reportList!=null){
+            for(Report report:reportList){
+                JSONObject testReportVO=new JSONObject();
+                testReportVO.put("reportHash",defaultString);
+                testReportVO.put("taskId",report.getCase_take_id());
+                Task task=taskDao.findById(report.getTask_id());
+                if(task==null){
+                    task=getAndSaveTaskInfo(report.getTask_id());
+                    if(task==null){
+                        testReportVO.put("taskName",defaultString);
+                    }else{
+                        testReportVO.put("taskName",task.getName());
+                    }
+                }else {
+                    testReportVO.put("taskName",task.getName());
+                }
+                testReportVO.put("testReportId",report.getId());
+                testReportVO.put("testReportName",report.getName());
+                testReportVO.put("type",0);
+                testReportVO.put("updateTime",System.currentTimeMillis());
+                testReportVO.put("workerId",report.getWorker_id());
+                String workerName=stuInfoDao.findWorkerName(report.getId());
+                if(!"null".equals(workerName)){
+                    testReportVO.put("workerName",workerName);
+                }else{
+                    testReportVO.put("workerName",defaultString);
+                }
+                List<Bug> bugList=bugDao.findByReport(report.getId(),case_take_id);
+                JSONArray bugReportList=new JSONArray();
+                for(Bug bug:bugList){
+                    JSONObject bugInfo=new JSONObject();
+                    bugInfo.put("bugId",bug.getId());
+                    bugInfo.put("bugName",bug.getTitle());
+                    bugReportList.put(bugInfo);
+                }
+                testReportVO.put("bugReportList",bugReportList);
+//                System.out.println(testReportVO);
+                String url=blockChainHost+"testReport";
+                try {
+                    String result = HTTP.postBody(url, testReportVO.toString());
+//                    if (!result.equals("")) {
+//                        JSONObject resultJson = new JSONObject(result);
+//                        System.out.println(resultJson);
+//                    }
+                }catch (Exception e){
+                    e.printStackTrace();
+                }
 
-        Bug bug=bugDao.findByid(bugId);
-        Report report=reportDao.findById(bug.getReport_id());
-        String crowdTestId=report.getCase_take_id();
+            }
+        }
+    }
+
+
+    public boolean uploadTestReportInfoToBlockChain(String bug_id){
+        Bug bug=bugDao.findByid(bug_id);
+        String report_id=bug.getReport_id();
+        String defaultString="defaultString";
+        Report report=reportDao.findById(report_id);
+        if(report!=null) {
+            JSONObject testReportVO = new JSONObject();
+            testReportVO.put("reportHash", defaultString);
+            testReportVO.put("taskId", report.getCase_take_id());
+            Task task = taskDao.findById(report.getTask_id());
+            if (task == null) {
+                task = getAndSaveTaskInfo(report.getTask_id());
+                if (task == null) {
+                    testReportVO.put("taskName", defaultString);
+                } else {
+                    testReportVO.put("taskName", task.getName());
+                }
+            } else {
+                testReportVO.put("taskName", task.getName());
+            }
+            testReportVO.put("testReportId", report.getId());
+            testReportVO.put("testReportName", report.getName());
+            testReportVO.put("type", 0);
+            testReportVO.put("updateTime", System.currentTimeMillis());
+            testReportVO.put("workerId", report.getWorker_id());
+            String workerName = stuInfoDao.findWorkerName(report.getId());
+            if (!"null".equals(workerName)) {
+                testReportVO.put("workerName", workerName);
+            } else {
+                testReportVO.put("workerName", defaultString);
+            }
+            List<Bug> bugList = bugDao.findByReport(report.getId(), report.getCase_take_id());
+            JSONArray bugReportList = new JSONArray();
+            JSONObject bugInfo = new JSONObject();
+            bugInfo.put("bugId", bug.getId());
+            bugInfo.put("bugName", bug.getTitle());
+            bugReportList.put(bugInfo);
+            testReportVO.put("bugReportList", bugReportList);
+            String url = blockChainHost + "testReport";
+            try {
+                String result = HTTP.postBody(url, testReportVO.toString());
+                    if (!result.equals("")) {
+                        JSONObject resultJson = new JSONObject(result);
+//                        System.out.println(resultJson);
+//                        System.out.println(resultJson.get("code").toString());
+                        if("200".equals(resultJson.get("code").toString())){
+                            return true;
+                        }else{
+                            return false;
+                        }
 
-        String bugReviewerId="default";
+                    }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return false;
     }
-//
-//    /**
-//     * @description  在连接点执行之后执行的通知(异常通知)
-//     */
-//    @AfterThrowing("BugSubmit()")
-//    public void doAfterThrowingGame(){
-//        System.out.println("异常通知:球迷要求退票!");
-//    }
 
-//    /**
-//     * @description  使用环绕通知
-//     */
-//    @Around("saveBugGrade()")
-//    public void doAroundGameData(ProceedingJoinPoint pjp) throws Throwable {
-//        try{
-//            System.out.println("球星上场前热身!");
-//            pjp.proceed();
-//
-//            System.out.println("球星本场得到" + point + "分" );
-//        }
-//        catch(Throwable e){
-//            System.out.println("异常通知:球迷要求退票!");
+//    public static void main(String[] args){
+//        String url=blockChainHost+"testReport";
+////        String json="{\"workerId\":\"22383\",\"reportHash\":\"defaultString\",\"taskName\":\"12-1众包测试\",\"updateTime\":1585284050330,\"type\":0,\"workerName\":\"李陈龙\",\"testReportName\":\"宋少行\",\"taskId\":\"1281-2724\",\"testReportId\":\"5cbc1a9f825a8960cdc7bd4f\",\"bugReportList\":[{\"bugId\":\"5cbc1b5c825a8960cdc7bd53\",\"bugName\":\"我再测试测试这个单独分离的\"},{\"bugId\":\"5cbc1b37825a8960cdc7bd52\",\"bugName\":\"帮助出错了\"},{\"bugId\":\"5cbc38f9825a8960cdc7bd57\",\"bugName\":\"测试图片能不能上传\"},{\"bugId\":\"5cbc1d31825a8960cdc7bd54\",\"bugName\":\"无法打开最近账薄\"},{\"bugId\":\"5cbc3919825a8960cdc7bd58\",\"bugName\":\"测试图片\"},{\"bugId\":\"5cbc3ab3825a8960cdc7bd5a\",\"bugName\":\"测试fork\"},{\"bugId\":\"5cbc3a50825a8960cdc7bd59\",\"bugName\":\"测试图片上传\"},{\"bugId\":\"5cbc3e9b825a8960cdc7bd5b\",\"bugName\":\"测试一键fork\"},{\"bugId\":\"5cde9be7825a8948e757cac1\",\"bugName\":\"测试下不选择页面会咋样\"},{\"bugId\":\"5cdfa0cc825a8948e757cade\",\"bugName\":\"打开一下就闪退了\"},{\"bugId\":\"5d402ef3f00e7a801b85e472\",\"bugName\":\"账薄有问题\"},{\"bugId\":\"5d7e1ac33c5a507c1c1cda33\",\"bugName\":\"账薄有问题\"},{\"bugId\":\"5d7e1b003c5a507c1c1cda37\",\"bugName\":\"账薄有问题\"},{\"bugId\":\"5d7e1c363c5a507c60f0766d\",\"bugName\":\"账薄有问题\"},{\"bugId\":\"5d7e1d3a3c5a507c9120b76a\",\"bugName\":\"test\"},{\"bugId\":\"5d7e1e1b3c5a507c9120b76f\",\"bugName\":\"继续测试\"},{\"bugId\":\"5d7f4254f52b558caaaee01a\",\"bugName\":\"11\"},{\"bugId\":\"5d7f42e1f52b558cecef1ffd\",\"bugName\":\"222\"},{\"bugId\":\"5dd761e307bcfb195d0dfe56\",\"bugName\":\"test\"},{\"bugId\":\"5df8a2a2eea9d780220b1b24\",\"bugName\":\"mm\"},{\"bugId\":\"5df8af01eea9d78664436920\",\"bugName\":\"kkkkk\"},{\"bugId\":\"5df9e097336bd0ad48b598b2\",\"bugName\":\"cninvorm o\"},{\"bugId\":\"5e463a89709308afcfb15a2c\",\"bugName\":\"。。。。\"}]}";
+////        String json="{\"workerId\":\"22383\",\"reportHash\":\"defaultString\",\"taskName\":\"12-1众包测试\",\"updateTime\":1585284050330,\"type\":0,\"workerName\":\"李陈龙\",\"testReportName\":\"宋少行\",\"taskId\":\"1281-2724\",\"testReportId\":\"5cbc1a9f825a8960cdc7bd4f\",\"bugReportList\":[{\"bugId\":\"5cbc1b5c825a8960cdc7bd53\",\"bugName\":\"我再测试测试这个单独分离的\"},{\"bugId\":\"5cbc1b37825a8960cdc7bd52\",\"bugName\":\"帮助出错了\"},{\"bugId\":\"5cbc38f9825a8960cdc7bd57\",\"bugName\":\"测试图片能不能上传\"},{\"bugId\":\"5cbc1d31825a8960cdc7bd54\",\"bugName\":\"无法打开最近账薄\"},{\"bugId\":\"5cbc3919825a8960cdc7bd58\",\"bugName\":\"测试图片\"},{\"bugId\":\"5cbc3ab3825a8960cdc7bd5a\",\"bugName\":\"测试fork\"},{\"bugId\":\"5cbc3a50825a8960cdc7bd59\",\"bugName\":\"测试图片上传\"},{\"bugId\":\"5cbc3e9b825a8960cdc7bd5b\",\"bugName\":\"测试一键fork\"},{\"bugId\":\"5cde9be7825a8948e757cac1\",\"bugName\":\"测试下不选择页面会咋样\"},{\"bugId\":\"5cdfa0cc825a8948e757cade\",\"bugName\":\"打开一下就闪退了\"},{\"bugId\":\"5d402ef3f00e7a801b85e472\",\"bugName\":\"账薄有问题\"},{\"bugId\":\"5d7e1ac33c5a507c1c1cda33\",\"bugName\":\"账薄有问题\"},{\"bugId\":\"5d7e1b003c5a507c1c1cda37\",\"bugName\":\"账薄有问题\"},{\"bugId\":\"5d7e1c363c5a507c60f0766d\",\"bugName\":\"账薄有问题\"},{\"bugId\":\"5d7e1d3a3c5a507c9120b76a\",\"bugName\":\"test\"},{\"bugId\":\"5d7e1e1b3c5a507c9120b76f\",\"bugName\":\"继续测试\"},{\"bugId\":\"5d7f4254f52b558caaaee01a\",\"bugName\":\"11\"},{\"bugId\":\"5d7f42e1f52b558cecef1ffd\",\"bugName\":\"222\"},{\"bugId\":\"5dd761e307bcfb195d0dfe56\",\"bugName\":\"test\"},{\"bugId\":\"5df8a2a2eea9d780220b1b24\",\"bugName\":\"mm\"},{\"bugId\":\"5df8af01eea9d78664436920\",\"bugName\":\"kkkkk\"},{\"bugId\":\"5df9e097336bd0ad48b598b2\",\"bugName\":\"cninvorm o\"},{\"bugId\":\"5e463a89709308afcfb15a2c\",\"bugName\":\"。。。。\"}]}";
+//        String json="{\n" +
+//                "  \"bugReportList\": [\n" +
+//                "    {\n" +
+//                "      \"bugId\": \"string\",\n" +
+//                "      \"bugName\": \"string\"\n" +
+//                "    },\n" +
+//                "   {\n" +
+//                "      \"bugId\": \"string\",\n" +
+//                "      \"bugName\": \"string\"\n" +
+//                "    }\n" +
+//                "\n" +
+//                "  ],\n" +
+//                "  \"reportHash\": \"string\",\n" +
+//                "  \"taskId\": \"string\",\n" +
+//                "  \"taskName\": \"string\",\n" +
+//                "  \"testReportId\": \"string\",\n" +
+//                "  \"testReportName\": \"string\",\n" +
+//                "  \"type\": 0,\n" +
+//                "  \"updateTime\": 0,\n" +
+//                "  \"workerId\": \"string\",\n" +
+//                "  \"workerName\": \"string\"\n" +
+//                "}";
+//        try {
+//            String result = HTTP.postBody(url, json);
+//            if(!result.equals("")){
+//                JSONObject resultJson = new JSONObject(result);
+//                System.out.println(resultJson);
+//            }
+//        }catch (Exception e){
+//            e.printStackTrace();
 //        }
+//
 //    }
 
 
+
+
+
 }

+ 1 - 1
src/main/java/edu/nju/util/HTTP.java

@@ -191,7 +191,7 @@ public class HTTP {
             // 获取URLConnection对象对应的输出流
             out = new PrintWriter(conn.getOutputStream());
             // 发送请求参数
-            out.print(JSON.toJSONString(json));
+            out.print(json);
             // flush输出流的缓冲
             out.flush();
             // 定义BufferedReader输入流来读取URL的响应

+ 2 - 2
src/main/java/edu/nju/util/LoadConf.java

@@ -30,8 +30,8 @@ public class LoadConf {
             }else if(name.equals("OSS_CONFIG.json")){
                 s="{\n" +
                         "\tOSS_CONFIG:{\n" +
-                        "\t    ACCESS_KEY_ID:\"LTAI4FwTqQ2grekcxanKHnBL\",\n" +
-                        "\t    ACCESS_KEY_SECRET:\"90nz7r8aImh2NhcNh0HAg8xiOJtn5V\",\n" +
+                        "\t    ACCESS_KEY_ID:\"LTAI4FdrT3HsfdR5edBVN7ws\",\n" +
+                        "\t    ACCESS_KEY_SECRET:\"yroxrpm46DzTyzHrLBZzS3MRNIicP6\",\n" +
                         "\t    BUCKET:\"mooctest-site\",\n" +
                         "\t    END_POINT:\"http://oss-cn-shanghai.aliyuncs.com\",\n" +
                         "\t    EXPIRE_TIME:600,\n" +

+ 2 - 2
src/main/java/edu/nju/util/OssAliyun.java

@@ -50,8 +50,8 @@ import com.aliyun.oss.model.PutObjectRequest;
 public class OssAliyun {
 
     private static String endpoint = "http://oss-cn-shanghai.aliyuncs.com";
-    private static String accessKeyId = "LTAI4FwTqQ2grekcxanKHnBL";
-    private static String accessKeySecret = "90nz7r8aImh2NhcNh0HAg8xiOJtn5V";
+    private static String accessKeyId = "LTAI4FdrT3HsfdR5edBVN7ws";
+    private static String accessKeySecret = "yroxrpm46DzTyzHrLBZzS3MRNIicP6";
     private static String bucketName = "mooctest-site";
 
     public static void uploadFile(String objectName,File file) throws IOException {

+ 2 - 2
src/main/java/paperjson

@@ -1,8 +1,8 @@
 {
-	"description": "job描述ddd",
+	"description": "job??ddd",
 	"name": "jobname",
 	"create_time":"2019/10/02",
-	"type":"漏洞扫描分析",
+	"type":"??????",
 	"application_url":"url1",
 	"requirement_url":"url2",
 	"item_group_list": [{

+ 1 - 0
src/main/resources/bootstrap.yml

@@ -1,6 +1,7 @@
 #spring.profiles.active: dev
 #spring.profiles.active: test
 spring.profiles.active: prod
+
 spring:
   application:
     name: mooctest-crowdsource-backend