Browse Source

上传catchNode至教育版主站(已在测试版测试,未在主站测试)

xujiawei 5 năm trước cách đây
mục cha
commit
a7fb2fe774

+ 33 - 0
src/main/java/edu/nju/controller/NodeController.java

@@ -54,6 +54,39 @@ public class NodeController {
         }
     }
 
+    @RequestMapping(value = "/getBasicNode")
+    @ResponseBody
+    public void getBasicNode(String jobId,String teacherId, HttpServletResponse response){
+        try {
+            PrintWriter out = response.getWriter();
+            BasicNode basicNode=nodeService.getBasicNode(jobId,teacherId);
+            out.print(new JSONObject(basicNode));
+            out.flush();
+            out.close();
+        }catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+    }
+
+    @RequestMapping(value = "/uploadCatchNode")
+    @ResponseBody
+    public void uploadCatchNode(String jobId,HttpServletResponse response){
+        JSONObject result;
+        try {
+            PrintWriter out = response.getWriter();
+            result=nodeService.uploadCatchNodeToMoocTest(jobId);
+            out.print(result);
+            out.flush();
+            out.close();
+        }catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+    }
+
+
+
 
 
 }

+ 38 - 0
src/main/java/edu/nju/dao/AnswerNodeDao.java

@@ -1,7 +1,45 @@
 package edu.nju.dao;
 
+import edu.nju.entities.AnswerNode;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoOperations;
 import org.springframework.stereotype.Repository;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+
+import java.util.List;
 
 @Repository
 public class AnswerNodeDao {
+
+
+    @Autowired
+    private MongoOperations mongoOperations;
+
+
+    //save存在则更新,不存在则插入
+    public String save(AnswerNode answerNode) {
+        mongoOperations.save(answerNode);
+        return answerNode.getId();
+    }
+
+    public AnswerNode find(String id){
+        Query query = new Query();
+        query.addCriteria(Criteria.where("_id").is(id));
+        List<AnswerNode> list = mongoOperations.find(query,AnswerNode.class);
+        if(list.size() == 0 ) {return null;}
+        return list.get(0);
+    }
+
+    public AnswerNode findByJobWorker(String jobId,String workerId){
+        Query query = new Query();
+        query.addCriteria(Criteria.where("jobId").is(jobId).and("workerId").is(workerId));
+        List<AnswerNode> list = mongoOperations.find(query,AnswerNode.class);
+        if(list.size() == 0 ) {return null;}
+        return list.get(0);
+    }
+
+
+
+
 }

+ 33 - 0
src/main/java/edu/nju/dao/BasicNodeDao.java

@@ -1,7 +1,40 @@
 package edu.nju.dao;
 
+import edu.nju.entities.BasicNode;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoOperations;
 import org.springframework.stereotype.Repository;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+
+import java.util.ArrayList;
+import java.util.List;
 
 @Repository
 public class BasicNodeDao {
+
+
+    @Autowired
+    private MongoOperations mongoOperations;
+
+
+    //save存在则更新,不存在则插入
+    public String save(BasicNode basicNode) {
+        mongoOperations.save(basicNode);
+        return basicNode.getId();
+    }
+
+    public BasicNode findByJobTeacher(String jobId,String teacherId){
+        Query query = new Query();
+        query.addCriteria(Criteria.where("jobId").is(jobId).and("teacherId").is(teacherId));
+        List<BasicNode> basicNodeList = mongoOperations.find(query,BasicNode.class);
+        if(basicNodeList.size()!=0) {
+            return basicNodeList.get(0);
+        }
+        return null;
+    }
+
+
+
+
 }

+ 8 - 0
src/main/java/edu/nju/entities/ReviewJob.java

@@ -154,4 +154,12 @@ public class ReviewJob implements java.io.Serializable{
     public void setValidationNum(int validationNum) {
         this.validationNum = validationNum;
     }
+
+    public String getCase_id() {
+        return case_id;
+    }
+
+    public void setCase_id(String case_id) {
+        this.case_id = case_id;
+    }
 }

+ 308 - 105
src/main/java/edu/nju/service/NodeService.java

@@ -6,7 +6,16 @@ import org.json.JSONArray;
 import org.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import edu.nju.util.HTTP;
 
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.ProtocolException;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
 @Service
@@ -36,6 +45,9 @@ public class NodeService {
     @Autowired
     ReviewAnswerDao reviewAnswerDao;
 
+    @Autowired
+    ReviewWorkerDao reviewWorkerDao;
+
 
     public BasicNode generateBasicNode(String jobId,String teacherId){
         ReviewJob reviewJob=reviewJobDao.findJob(jobId);
@@ -89,13 +101,26 @@ public class NodeService {
             }
         }
         nodeJson.put("nodes",nodesArray);
-        BasicNode basicNode=new BasicNode(jobId,teacherId,nodesArray.toString());
+        //查询是否已有之前的basicNode
+        BasicNode basicNode=basicNodeDao.findByJobTeacher(jobId,teacherId);
+        //新建
+        if(basicNode==null){
+            basicNode=new BasicNode(jobId,teacherId,nodeJson.toString());
+            basicNodeDao.save(basicNode);
+        }
+        //更新
+        else{
+            basicNode.setNodeJson(nodeJson.toString());
+            basicNodeDao.save(basicNode);
+        }
         System.out.println(nodeJson);
         return basicNode;
     }
 
 
     public AnswerNode generateCatchNode(String jobId,String workerId){
+//        System.out.println("job"+jobId);
+//        System.out.println("worker"+workerId);
         ReviewJob reviewJob=reviewJobDao.findJob(jobId);
         ReviewPaper reviewPaper=reviewPaperDao.findPaper(reviewJob.getPaper_id());
         List<ReviewReport> reviewReportList=reviewReportDao.getReportsByPaperId(reviewPaper.getId());
@@ -106,138 +131,316 @@ public class NodeService {
             List<ReviewItem> reviewItemList=reviewItemDao.findItemsByReport(reportId);
             for(ReviewItem reviewItem:reviewItemList){
                 String itemId=reviewItem.getId();
-                //此时reviewAnswer一定已经被创建
+                //只要进入过答题界面,所有reviewAnswer就会被创建
                 ReviewAnswer reviewAnswer=reviewAnswerDao.findAnswerByWorkerJobReportItem(jobId,reportId,workerId,itemId);
                 ReviewCorrectAnswer reviewCorrectAnswer=reviewCorrectAnswerDao.findCorrectAnswerByReportItem(reportId,itemId,jobId);
-
                 //多选题
-                if(reviewItem.getType().equals("Multiple")){
-                    List<String> answers=reviewAnswer.getAnswers();
-                    List<String> correctAnswers=reviewCorrectAnswer.getCorrect_answer();
-                    int num=0;
-                    //共有几个正确选项
-                    for(int i=0;i<correctAnswers.size();i++){
-                        if(correctAnswers.get(i).equals("1")){
-                            num++;
-                        }
+                switch (reviewItem.getType()) {
+                    case "Multiple":
+                        generateCatchNodeMultiple(catchNodeArray, reviewAnswer, reviewCorrectAnswer, jobId, reportId, itemId);
+                        break;
+                    //单选题
+                    case "Single":
+                        generateCatchNodeSingle(catchNodeArray, reviewAnswer, reviewCorrectAnswer, jobId, reportId, itemId);
+                        break;
+                    //描述题和文件题,默认只要有作答就得分
+                    case "Description":
+                        generateCatchNodeDescription(catchNodeArray, reviewAnswer, reviewCorrectAnswer, jobId, reportId, itemId);
+                        break;
+                    case "File":
+                        generateCatchNodeFile(catchNodeArray, reviewAnswer, reviewCorrectAnswer, jobId, reportId, itemId);
+                        break;
+                }
+            }
+        }
+
+        System.out.println(catchNodeArray);
+
+        AnswerNode answerNode=new AnswerNode(jobId,workerId,catchNodeArray.toString(),"0");
+//        answerNodeDao.save(answerNode);
+        return answerNode;
+
+
+
+
+    }
+
+    private void generateCatchNodeMultiple(JSONArray catchNodeArray,ReviewAnswer reviewAnswer,ReviewCorrectAnswer reviewCorrectAnswer,String jobId,String reportId,String itemId){
+        if(reviewAnswer!=null) {
+            List<String> answers = reviewAnswer.getAnswers();
+            List<String> correctAnswers = reviewCorrectAnswer.getCorrect_answer();
+            int num = 0;
+            //共有几个正确选项
+            for (int i = 0; i < correctAnswers.size(); i++) {
+                if (correctAnswers.get(i).equals("1")) {
+                    num++;
+                }
+            }
+            if (num != 0) {
+                List<JSONObject> multipleNodeList = new ArrayList<>();
+                boolean chooseWrong = false;
+                //是否作答该题
+                if (answers.size() != correctAnswers.size()) {
+                    for (int i = 0; i < correctAnswers.size(); i++) {
+                        JSONObject node = new JSONObject();
+                        node.put("category", "CrowdReview");
+                        node.put("ifCatch", false);
+                        node.put("nodeName", jobId + "/" + reportId + "/" + itemId + "/" + i);
+                        multipleNodeList.add(node);
                     }
-                    if(num!=0){
-                        List<JSONObject> multipleNodeList=new ArrayList<>();
-                        boolean chooseWrong=false;
-                        //是否作答
-                        if(answers.size()!=correctAnswers.size()){
-                            for (int i = 0; i < correctAnswers.size(); i++) {
-                                JSONObject node = new JSONObject();
+                    chooseWrong = true;
+                } else {
+                    for (int i = 0; i < correctAnswers.size(); i++) {
+                        String correctAnswer = correctAnswers.get(i);
+                        String answer = answers.get(i);
+                        JSONObject node = new JSONObject();
+                        if (correctAnswer.equals("1")) {
+                            if (answer.equals("1")) {
+                                node.put("category", "CrowdReview");
+                                node.put("ifCatch", true);
+                                node.put("nodeName", jobId + "/" + reportId + "/" + itemId + "/" + i);
+                            } else {
                                 node.put("category", "CrowdReview");
                                 node.put("ifCatch", false);
                                 node.put("nodeName", jobId + "/" + reportId + "/" + itemId + "/" + i);
-                                multipleNodeList.add(node);
-                            }
-                            chooseWrong=true;
-                        }else {
-                            for (int i = 0; i < correctAnswers.size(); i++) {
-                                String correctAnswer = correctAnswers.get(i);
-                                String answer = answers.get(i);
-                                JSONObject node = new JSONObject();
-                                if (correctAnswer.equals("1")) {
-                                    if (answer.equals("1")) {
-                                        node.put("category", "CrowdReview");
-                                        node.put("ifCatch", true);
-                                        node.put("nodeName", jobId + "/" + reportId + "/" + itemId + "/" + i);
-                                    } else {
-                                        node.put("category", "CrowdReview");
-                                        node.put("ifCatch", false);
-                                        node.put("nodeName", jobId + "/" + reportId + "/" + itemId + "/" + i);
-                                    }
-                                    multipleNodeList.add(node);
-                                } else if (correctAnswer.equals("")) {
-                                    if (answer.equals("1")) {
-                                        chooseWrong = true;
-                                        break;
-                                    }
-                                }
-                            }
-                        }
-                        //有一个选错,则多选题不得分
-                        if(chooseWrong){
-                            for(JSONObject node:multipleNodeList){
-                                node.put("ifCatch",false);
-                                catchNodeArray.put(node);
-                            }
-                        }
-                        //否则按选中的个数得分
-                        else{
-                            for(JSONObject node:multipleNodeList){
-                                catchNodeArray.put(node);
                             }
-                        }
-                    }
-                }
-                //单选题
-                else if(reviewItem.getType().equals("Single")) {
-                    List<String> answers=reviewAnswer.getAnswers();
-                    List<String> correctAnswers=reviewCorrectAnswer.getCorrect_answer();
-                    boolean chooseWrong=false;
-                    if(answers.size()!=correctAnswers.size()){
-                        chooseWrong=true;
-                    }else {
-                        for (int i = 0; i < correctAnswers.size(); i++) {
-                            String correctAnswer = correctAnswers.get(i);
-                            String answer = answers.get(i);
-                            if (!answer.equals(correctAnswer)) {
+                            multipleNodeList.add(node);
+                        } else if (correctAnswer.equals("")) {
+                            if (answer.equals("1")) {
                                 chooseWrong = true;
                                 break;
                             }
                         }
                     }
-                    JSONObject node=new JSONObject();
-                    node.put("category", "CrowdReview");
-                    node.put("nodeName", jobId + "/" + reportId + "/" + itemId);
-                    node.put("ifCatch",!chooseWrong);
-                    catchNodeArray.put(node);
                 }
-                //描述题和文件题,默认只要有作答就得分
-                else if(reviewItem.getType().equals("Description")){
-                    List<String> answers=reviewAnswer.getAnswers();
-                    boolean hasContent=false;
-                    for(String answer:answers){
-                        if(!answer.equals("")){
-                            hasContent=true;
-                            break;
-                        }
+                //有一个选错,则多选题不得分
+                if (chooseWrong) {
+                    for (JSONObject node : multipleNodeList) {
+                        node.put("ifCatch", false);
+                        catchNodeArray.put(node);
                     }
-                    JSONObject node=new JSONObject();
-                    node.put("category", "CrowdReview");
-                    node.put("nodeName", jobId + "/" + reportId + "/" + itemId);
-                    node.put("ifCatch",hasContent);
-                    catchNodeArray.put(node);
-                }else if(reviewItem.getType().equals("File")){
-                    List<String> fileList=reviewAnswer.getFile_url();
-                    boolean hasContent=false;
-                    for(String file:fileList){
-                        if(!file.equals("")){
-                            hasContent=true;
-                            break;
-                        }
+                }
+                //否则按选中的个数得分
+                else {
+                    for (JSONObject node : multipleNodeList) {
+                        catchNodeArray.put(node);
                     }
-                    JSONObject node=new JSONObject();
+                }
+            }
+        }
+        //该工人未进入答题界面
+        else{
+            List<String> correctAnswers = reviewCorrectAnswer.getCorrect_answer();
+            int num = 0;
+            //共有几个正确选项
+            for (int i = 0; i < correctAnswers.size(); i++) {
+                if (correctAnswers.get(i).equals("1")) {
+                    num++;
+                }
+            }
+            if (num != 0) {
+                List<JSONObject> multipleNodeList = new ArrayList<>();
+                for (int i = 0; i < correctAnswers.size(); i++) {
+                    JSONObject node = new JSONObject();
                     node.put("category", "CrowdReview");
-                    node.put("nodeName", jobId + "/" + reportId + "/" + itemId);
-                    node.put("ifCatch",hasContent);
+                    node.put("ifCatch", false);
+                    node.put("nodeName", jobId + "/" + reportId + "/" + itemId + "/" + i);
+                    multipleNodeList.add(node);
+                }
+                for (JSONObject node : multipleNodeList) {
                     catchNodeArray.put(node);
                 }
             }
+
         }
 
-        System.out.println(catchNodeArray);
+    }
 
-        AnswerNode answerNode=new AnswerNode(jobId,workerId,catchNodeArray.toString(),"0");
-        return answerNode;
 
+    private void generateCatchNodeSingle(JSONArray catchNodeArray,ReviewAnswer reviewAnswer,ReviewCorrectAnswer reviewCorrectAnswer,String jobId,String reportId,String itemId){
+        if(reviewAnswer!=null) {
+            List<String> answers = reviewAnswer.getAnswers();
+            List<String> correctAnswers = reviewCorrectAnswer.getCorrect_answer();
+            boolean chooseWrong = false;
+            if (answers.size() != correctAnswers.size()) {
+                chooseWrong = true;
+            } else {
+                for (int i = 0; i < correctAnswers.size(); i++) {
+                    String correctAnswer = correctAnswers.get(i);
+                    String answer = answers.get(i);
+                    if (!answer.equals(correctAnswer)) {
+                        chooseWrong = true;
+                        break;
+                    }
+                }
+            }
+            JSONObject node = new JSONObject();
+            node.put("category", "CrowdReview");
+            node.put("nodeName", jobId + "/" + reportId + "/" + itemId);
+            node.put("ifCatch", !chooseWrong);
+            catchNodeArray.put(node);
+        }else{
+            JSONObject node = new JSONObject();
+            node.put("category", "CrowdReview");
+            node.put("nodeName", jobId + "/" + reportId + "/" + itemId);
+            node.put("ifCatch", false);
+            catchNodeArray.put(node);
+        }
+    }
+
+    private void generateCatchNodeDescription(JSONArray catchNodeArray,ReviewAnswer reviewAnswer,ReviewCorrectAnswer reviewCorrectAnswer,String jobId,String reportId,String itemId){
+        if(reviewAnswer!=null) {
+            List<String> answers = reviewAnswer.getAnswers();
+            boolean hasContent = false;
+            for (String answer : answers) {
+                if (!answer.equals("")) {
+                    hasContent = true;
+                    break;
+                }
+            }
+            JSONObject node = new JSONObject();
+            node.put("category", "CrowdReview");
+            node.put("nodeName", jobId + "/" + reportId + "/" + itemId);
+            node.put("ifCatch", hasContent);
+            catchNodeArray.put(node);
+        }else{
+            JSONObject node = new JSONObject();
+            node.put("category", "CrowdReview");
+            node.put("nodeName", jobId + "/" + reportId + "/" + itemId);
+            node.put("ifCatch", false);
+            catchNodeArray.put(node);
+        }
+    }
+
+    private void generateCatchNodeFile(JSONArray catchNodeArray,ReviewAnswer reviewAnswer,ReviewCorrectAnswer reviewCorrectAnswer,String jobId,String reportId,String itemId){
+        if(reviewAnswer!=null) {
+            List<String> fileList = reviewAnswer.getFile_url();
+            boolean hasContent = false;
+            for (String file : fileList) {
+                if (!file.equals("")) {
+                    hasContent = true;
+                    break;
+                }
+            }
+            JSONObject node = new JSONObject();
+            node.put("category", "CrowdReview");
+            node.put("nodeName", jobId + "/" + reportId + "/" + itemId);
+            node.put("ifCatch", hasContent);
+            catchNodeArray.put(node);
+        }else{
+            JSONObject node = new JSONObject();
+            node.put("category", "CrowdReview");
+            node.put("nodeName", jobId + "/" + reportId + "/" + itemId);
+            node.put("ifCatch", false);
+            catchNodeArray.put(node);
+        }
+    }
+
+    private void generateCatchNodeFalse(JSONArray catchNodeArray,String jobId,String reportId,String itemId){
+        JSONObject node = new JSONObject();
+        node.put("category", "CrowdReview");
+        node.put("nodeName", jobId + "/" + reportId + "/" + itemId);
+        node.put("ifCatch", false);
+        catchNodeArray.put(node);
+    }
+
+    public BasicNode getBasicNode(String jobId,String teacherId){
+        return basicNodeDao.findByJobTeacher(jobId,teacherId);
+    }
+
+    public AnswerNode getAnswerNode(String jobId,String workerId){
+        return answerNodeDao.findByJobWorker(jobId,workerId);
+    }
 
+    public JSONObject uploadCatchNodeToMoocTest(String jobId){
+         ReviewJob reviewJob=reviewJobDao.findJob(jobId);
+         List<ReviewWorker> reviewWorkerList=reviewWorkerDao.getWorkersByJob(jobId);
+         JSONObject result=new JSONObject();
+         for(ReviewWorker reviewWorker:reviewWorkerList){
+             AnswerNode answerNode=generateCatchNode(jobId,reviewWorker.getId());
+             //获取上传学生成绩至主站的uploadId
+             String uploadId=getCatchNodeUploadId(reviewJob.getExam_id(),answerNode,reviewWorker.getOriginal_id());
+             if(uploadId!=null){
+                 //上传catchNode至主站
+                 String uploadResult=uploadCatchNode(reviewJob.getCase_id(),uploadId,answerNode);
+                 if(uploadResult==null){
+                     result.put("status","500");
+                     result.put("cause","上传catchNode失败");
+                 }else{
+                     JSONObject uploadResultJson=new JSONObject(result);
+                     if(uploadResultJson.get("code").equals("20000")){
+                         result.put("status","200");
+                     }else{
+                         result.put("status","500");
+                         result.put("cause","上传catchNode失败");
+                     }
+                 }
+             }else{
+                 result.put("status","500");
+                 result.put("cause","获取uploadId失败");
+             }
 
+         }
+         return result;
+    }
 
+    private String getCatchNodeUploadId(String taskId,AnswerNode answerNode,String workerOriginalId){
+        String url = "http://www.mooctest.net/api/dev/plugin/submitAnswersSig" + "?" +
+                "taskID=" + taskId + "&" +
+                "workerID=" + workerOriginalId + "&" +
+                "caseName=CrowdReview";
+        String result = HTTP.sendGet(url, "");
+        if(result != null && !result.equals("")) {
+            JSONObject json = new JSONObject(result);
+            if(json.has("data")){
+                JSONObject data=json.getJSONObject("data");
+                return data.getString("uploadId");
+            }
+        }
+        return null;
     }
 
+    //向慕测主站上传catchNode
+    private String uploadCatchNode(String caseId,String uploadId,AnswerNode answerNode){
+        String result = "";
+        String uploadTime=String.valueOf(System.currentTimeMillis());
+        String source="CrowdReview";
+        String url="http://test.mooctest.net/api/common/generalUploadCaughtNode/"+caseId+"/"+uploadTime+"/"+uploadId+"/"+source;
+        try{
+            URL realUrl = new URL(url);
+            // 打开和URL之间的连接
+            HttpURLConnection connection;
+            connection = (HttpURLConnection)realUrl.openConnection();
+            connection.setDoInput(true);
+            connection.setDoOutput(true);
+            // 设置请求属性,必须要设置contentType
+            connection.setRequestProperty("accept", "*/*");
+            connection.setRequestProperty("Content-Type","application/json");
+            connection.setRequestMethod("PUT");
+            connection.setRequestProperty("user-agent",
+                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+            // 建立实际的连接
+            connection.connect();
+            //写入body数据,catchNode
+            OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); // utf-8编码
+            out.append(answerNode.getCatchNodeJson());
+            out.flush();
+            out.close();
+
+            BufferedReader in = new BufferedReader(new InputStreamReader(
+                    connection.getInputStream()));
+            String line;
+            while ((line = in.readLine()) != null) {
+                result += line;
+            }
+            return result;
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+
 
 }