Jelajahi Sumber

Merge branch 'xjw' into 'master'

Xjw



See merge request !1

xuexiaobo 5 tahun lalu
induk
melakukan
4167884b77
30 mengubah file dengan 1555 tambahan dan 36 penghapusan
  1. TEMPAT SAMPAH
      .DS_Store
  2. TEMPAT SAMPAH
      src/.DS_Store
  3. TEMPAT SAMPAH
      src/main/.DS_Store
  4. 15 0
      src/main/java/edu/nju/controller/AnalyzeController.java
  5. 146 1
      src/main/java/edu/nju/controller/ExtraController.java
  6. 51 0
      src/main/java/edu/nju/controller/HistoryController.java
  7. 152 0
      src/main/java/edu/nju/controller/ItemController.java
  8. 40 8
      src/main/java/edu/nju/controller/RecommendController.java
  9. 1 0
      src/main/java/edu/nju/controller/UploadController.java
  10. 40 0
      src/main/java/edu/nju/dao/AnswerDao.java
  11. 5 0
      src/main/java/edu/nju/dao/CTBDao.java
  12. 42 0
      src/main/java/edu/nju/dao/ItemDao.java
  13. 12 0
      src/main/java/edu/nju/dao/ItemToUserDao.java
  14. 31 0
      src/main/java/edu/nju/dao/JobDao.java
  15. 31 0
      src/main/java/edu/nju/dao/UserToItemDao.java
  16. 96 0
      src/main/java/edu/nju/entities/Answer.java
  17. 33 1
      src/main/java/edu/nju/entities/Exam.java
  18. 113 0
      src/main/java/edu/nju/entities/Item.java
  19. 49 0
      src/main/java/edu/nju/entities/ItemToUser.java
  20. 124 0
      src/main/java/edu/nju/entities/Job.java
  21. 36 0
      src/main/java/edu/nju/entities/TestCase.java
  22. 59 0
      src/main/java/edu/nju/entities/UserToItem.java
  23. 21 4
      src/main/java/edu/nju/service/AnalyzeService.java
  24. 1 0
      src/main/java/edu/nju/service/CTBService.java
  25. 183 8
      src/main/java/edu/nju/service/ExtraService.java
  26. 85 0
      src/main/java/edu/nju/service/ItemService.java
  27. 154 3
      src/main/java/edu/nju/service/RecommendService.java
  28. 1 0
      src/main/java/edu/nju/service/SaveService.java
  29. 29 8
      src/main/java/edu/nju/util/ExcelToJson.java
  30. 5 3
      src/main/resources/application.properties

TEMPAT SAMPAH
.DS_Store


TEMPAT SAMPAH
src/.DS_Store


TEMPAT SAMPAH
src/main/.DS_Store


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

@@ -241,4 +241,19 @@ public class AnalyzeController {
 		}
 		return result;
 	}
+
+	@RequestMapping(value = "/afterSimilarBug")
+	@ResponseBody
+	public void getAfterSimilarBug(String bug_id, HttpServletResponse response){
+		try {
+			PrintWriter out = response.getWriter();
+			JSONObject result = new JSONObject();
+			result.put("bugList",aservice.getAfterSimilarBug(bug_id));
+			out.print(result);
+			out.flush();
+			out.close();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
 }

+ 146 - 1
src/main/java/edu/nju/controller/ExtraController.java

@@ -21,6 +21,13 @@ import edu.nju.entities.TestCase;
 import edu.nju.service.ExtraService;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.net.URL;
+import java.io.BufferedInputStream;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URLConnection;
+
 @Controller
 @RequestMapping(value = "/extra")
 @CrossOrigin(origins = "*", maxAge = 3600, allowCredentials = "true")
@@ -195,6 +202,122 @@ public class ExtraController {
 	}
 
 	/**
+	 *
+	 * @param file 文件oss的url
+	 * @param file_name
+	 * @param paper_type
+	 * @param case_id
+	 * @param test_type
+	 * @param description
+	 * @param app_name
+	 * @return
+	 */
+	@RequestMapping(value = "/uploadExamUrl", method = RequestMethod.POST)
+	@ResponseBody
+	public String uploadExamUrl(String file, String file_name, String paper_type,
+								String case_id, String test_type, String description, String app_name) {
+		try {
+
+			File dest = new File("/Users/hannatao/Downloads/" + file_name);
+			if(!dest.getParentFile().exists()) { dest.getParentFile().mkdirs(); }
+			//从oss下载文件
+			// 统一资源
+			URL url = new URL(file);
+			// 连接类的父类,抽象类
+			URLConnection urlConnection = url.openConnection();
+			// http的连接类
+			HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;
+			//设置超时
+			httpURLConnection.setConnectTimeout(1000*5);
+			//设置请求方式,默认是GET
+//          httpURLConnection.setRequestMethod("GET");
+			// 设置字符编码
+			httpURLConnection.setRequestProperty("Charset", "UTF-8");
+			// 打开到此 URL引用的资源的通信链接(如果尚未建立这样的连接)。
+			httpURLConnection.connect();
+			// 文件大小
+			int fileLength = httpURLConnection.getContentLength();
+
+			// 建立链接从请求中获取数据
+			URLConnection con = url.openConnection();
+			BufferedInputStream bin = new BufferedInputStream(httpURLConnection.getInputStream());
+			// 指定文件名称(有需求可以自定义)
+			// 指定存放位置(有需求可以自定义)
+
+
+			OutputStream out = new FileOutputStream(dest);
+			int size = 0;
+			int len = 0;
+			byte[] buf = new byte[2048];
+			while ((size = bin.read(buf)) != -1) {
+				len += size;
+				out.write(buf, 0, size);
+			}
+			// 关闭资源
+			bin.close();
+			out.close();
+			String json = extraService.saveExam(case_id, dest.getPath(), app_name, paper_type, test_type, description);
+			return json;
+		} catch (IOException e) {
+			e.printStackTrace();
+			return "";
+		}
+	}
+
+//	@RequestMapping(value = "/uploadExamUrl", method = RequestMethod.POST)
+//	@ResponseBody
+//	public String uploadExamUrl1(String file, String file_name, String paper_type,
+//								String case_id, String test_type, String description, String app_name,
+//								String if_test_case,String if_bug) {
+//		try {
+//
+//			File dest = new File("/Users/hannatao/Downloads/" + file_name);
+//			if(!dest.getParentFile().exists()) { dest.getParentFile().mkdirs(); }
+//			//从oss下载文件
+//			// 统一资源
+//			URL url = new URL(file);
+//			// 连接类的父类,抽象类
+//			URLConnection urlConnection = url.openConnection();
+//			// http的连接类
+//			HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;
+//			//设置超时
+//			httpURLConnection.setConnectTimeout(1000*5);
+//			//设置请求方式,默认是GET
+////          httpURLConnection.setRequestMethod("GET");
+//			// 设置字符编码
+//			httpURLConnection.setRequestProperty("Charset", "UTF-8");
+//			// 打开到此 URL引用的资源的通信链接(如果尚未建立这样的连接)。
+//			httpURLConnection.connect();
+//			// 文件大小
+//			int fileLength = httpURLConnection.getContentLength();
+//
+//			// 建立链接从请求中获取数据
+//			URLConnection con = url.openConnection();
+//			BufferedInputStream bin = new BufferedInputStream(httpURLConnection.getInputStream());
+//			// 指定文件名称(有需求可以自定义)
+//			// 指定存放位置(有需求可以自定义)
+//
+//
+//			OutputStream out = new FileOutputStream(dest);
+//			int size = 0;
+//			int len = 0;
+//			byte[] buf = new byte[2048];
+//			while ((size = bin.read(buf)) != -1) {
+//				len += size;
+//				out.write(buf, 0, size);
+//			}
+//			// 关闭资源
+//			bin.close();
+//			out.close();
+//			String json = extraService.saveExam1(case_id, dest.getPath(), app_name, paper_type, test_type, description,if_test_case,if_bug);
+//			return json;
+//		} catch (IOException e) {
+//			e.printStackTrace();
+//			return "";
+//		}
+//	}
+
+	/**
 	 * 47.99.140.117:9001/Bug/api/extra/getExamList
 	 *
 	 * @return 200 成功; 500 失败
@@ -242,8 +365,11 @@ public class ExtraController {
 	@RequestMapping(value = "/uploadTestCase", method = RequestMethod.POST)
 	@ResponseBody
 	public void uploadTestCase(String report_id, String name, String front, String behind, 
-			String description, HttpServletResponse response) {
+			String description,String if_execute,String if_bug, HttpServletResponse response) {
 		try {
+
+			System.out.println(if_execute);
+			System.out.println(if_bug);
 			String id = extraService.saveTestCase(report_id, name, front, behind, description);
 			PrintWriter out = response.getWriter();
 			JSONObject result = new JSONObject();
@@ -321,4 +447,23 @@ public class ExtraController {
 		}
 	}
 
+	@RequestMapping(value = "/uploadJob", method = RequestMethod.POST)
+	@ResponseBody
+	public void uploadExamUrl(String jobJson, HttpServletResponse response) {
+		try {
+			PrintWriter out = response.getWriter();
+			JSONObject result = new JSONObject();
+			String job_id = extraService.saveJob(jobJson);
+			result.put("id", job_id);
+			out.print(result);
+			out.flush();
+			out.close();
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+
+	}
+
+
 }

+ 51 - 0
src/main/java/edu/nju/controller/HistoryController.java

@@ -161,4 +161,55 @@ public class HistoryController {
 		if(session.getAttribute("trees") != null) {session.removeAttribute("trees");}
 		if(session.getAttribute("single") != null) {session.removeAttribute("single");}
 	}
+
+	//根据条件筛选单个节点的数据
+	@RequestMapping(value = "/getSingleByCondition")
+	@ResponseBody
+	public void getSingleByCondition(String case_take_id, String start, String count, String page,String condition, HttpSession session, HttpServletResponse response) {
+		try {
+			String bugCondition="";
+			PrintWriter out = response.getWriter();
+			JSONObject result = new JSONObject();
+			List<String> all = new ArrayList<String>();
+			for(String id : hisservice.getRoots(case_take_id)) {
+				//根据是否有子bug判断是否是单节点
+				if(hisservice.getHistory(id).getChildren().size() == 0) {
+					//判断是否满足条件
+					int score = aservice.getGrade(id);
+					if(score != -1) {
+						bugCondition="true";
+					}
+					else {bugCondition="false";}
+					if(bugCondition.equals(condition)){
+						all.add(id);
+					}
+				}
+			}
+			hisservice.pageFilter(all, page);
+
+			List<String> ids = all.subList(Integer.parseInt(start), Math.min(all.size(), Integer.parseInt(start) + Integer.parseInt(count)));
+			List<String> invalid = hisservice.getInvalid(ids);
+			for(String id: invalid) {
+				if(ids.contains(id)) {ids.remove(id);}
+			}
+
+			List<List<String>> list = new ArrayList<List<String>>();
+			for(String id : ids) {
+				List<String> temp = new ArrayList<String>();
+				temp.add(id);
+				temp.add(condition);
+				temp.add(recservice.getTitle(id));
+				list.add(temp);
+			}
+			//所有符合条件的,而非仅仅是展示的
+			result.put("Count", all.size());
+			result.put("TreeRoot", new JSONArray(list));
+			out.print(result);
+			out.flush();
+			out.close();
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
 }

+ 152 - 0
src/main/java/edu/nju/controller/ItemController.java

@@ -0,0 +1,152 @@
+package edu.nju.controller;
+
+import edu.nju.entities.Answer;
+import edu.nju.entities.Item;
+import edu.nju.entities.Job;
+import edu.nju.service.ItemService;
+import org.json.JSONArray;
+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 javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.List;
+
+@Controller
+@RequestMapping(value = "/item")
+@CrossOrigin(origins = "*", maxAge = 3600, allowCredentials = "true")
+public class ItemController {
+
+    @Autowired
+    ItemService iservice;
+
+    @RequestMapping(value = "/getJob")
+    @ResponseBody
+    public void getJobById(String job_id, HttpServletResponse response){
+        try {
+            PrintWriter out = response.getWriter();
+            Job job = iservice.getJob(job_id);
+            out.print(new JSONObject(job));
+            out.flush();
+            out.close();
+        }catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+    }
+
+    @RequestMapping(value = "/getItemsByJob")
+    @ResponseBody
+    public void getItemListByJobId(String job_id, HttpServletResponse response){
+        try {
+            PrintWriter out = response.getWriter();
+            List<Item> items = iservice.getJobItems(job_id);
+            out.print(new JSONArray(items));
+            out.flush();
+            out.close();
+        }catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+
+    }
+
+    @RequestMapping(value = "/getItemsByWorker")
+    @ResponseBody
+    public void getItemListByWorkerJob(String job_id, String worker_id, HttpServletResponse response){
+        try {
+            PrintWriter out = response.getWriter();
+            List<Item> items = iservice.getItemsByWorkerJob(worker_id, job_id);
+            out.print(new JSONArray(items));
+            out.flush();
+            out.close();
+        }catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+
+    }
+
+    @RequestMapping(value = "/getAnswerByWorkerItem")
+    @ResponseBody
+    public void getAnswerByWorkerItem(String item_id,String worker_id, HttpServletResponse response){
+        try {
+            PrintWriter out = response.getWriter();
+            Answer answer = iservice.getAnswerByItemWorker(item_id, worker_id);
+            out.print(new JSONObject(answer));
+            out.flush();
+            out.close();
+        }catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+    }
+
+    @RequestMapping(value = "/getAnswersByWorkerJob")
+    @ResponseBody
+    public void getAnswersByWorkerJob(String job_id,String worker_id, HttpServletResponse response){
+        try {
+            PrintWriter out = response.getWriter();
+            List<Answer>answers=iservice.getAnswersByWorkerJob(job_id, worker_id);
+            out.print(new JSONArray(answers));
+            out.flush();
+            out.close();
+        }catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+    }
+
+    @RequestMapping(value = "/saveAnswer")
+    @ResponseBody
+    public void saveAnswer(String item_id, String worker_id,String job_id,List<String>answers,List<String> attachment_location, HttpServletResponse response){
+        JSONObject result = new JSONObject();
+        String id = iservice.saveAnswer(item_id, worker_id, job_id, answers, attachment_location);
+        if(id.equals("")) {
+            result.put("status", "200");
+            result.put("id", id);
+        }
+        else {
+            result.put("status", "500");
+        }
+        try {
+            PrintWriter out = response.getWriter();
+            out.print(result);
+            out.flush();
+            out.close();
+        }catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+    }
+
+    @RequestMapping(value = "/updateAnswer")
+    @ResponseBody
+    public void updateAnswer(String id, String item_id, String worker_id, String job_id, List<String>answers,List<String> attachment_location, HttpServletResponse response){
+        JSONObject result = new JSONObject();
+        if(iservice.updateAnswer(id, item_id, worker_id, job_id, answers, attachment_location)){
+            result.put("status", "200");
+        } else {
+            result.put("status", "500");
+        }
+        try {
+            PrintWriter out = response.getWriter();
+            out.print(result);
+            out.flush();
+            out.close();
+        }catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+    }
+
+
+
+    
+
+}

+ 40 - 8
src/main/java/edu/nju/controller/RecommendController.java

@@ -2,18 +2,15 @@ package edu.nju.controller;
 
 import java.io.IOException;
 import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 
 import org.json.JSONArray;
 import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.CrossOrigin;
@@ -27,6 +24,8 @@ import edu.nju.service.HistoryService;
 import edu.nju.service.RecommendService;
 import edu.nju.service.UserBasedService;
 
+import java.util.Map.Entry;
+
 @Controller
 @RequestMapping(value = "/rec")
 @CrossOrigin(origins = "*", maxAge = 3600, allowCredentials = "true")
@@ -109,6 +108,7 @@ public class RecommendController {
 	}
 	
 	/**
+	 * 用户编辑bug时推荐相似bug
 	 * 用户点击六个类别之后,都使用该接口
 	 * @param type("category", "severity", "recurrent", "page1", "page2", "page3"), content
 	 * @return List<BugMirror>
@@ -123,6 +123,8 @@ public class RecommendController {
 			List<Float> scores = new ArrayList<Float>();
 			Set<BugMirror> mirror2 = new HashSet<BugMirror>();
 			Map<BugMirror, Float> map;
+			System.out.println(type);
+			System.out.println(content);
 			if(type.equals("title") || type.equals("description")) {
 				if(type.equals("title")) {map = recservice.recommandByTitle(content, session);}
 				else {map = recservice.recommandByDes(content, session);}
@@ -147,9 +149,35 @@ public class RecommendController {
 			}
 //			mirror2.addAll(historyservice.getNew(case_take_id, (String)session.getAttribute("report")));
 //			filter(mirror2, mirror1);
-			result.put("same", new JSONArray(mirror1));
-			result.put("scores", new JSONArray(scores));
+			List<BugMirror> resultMirror = new ArrayList<BugMirror>();
+			List<Float> resultScore = new ArrayList<Float>();
+
+			Map<BugMirror,Float> hashMap=new HashMap<>();
+			for(int i=0;i<mirror1.size();i++){
+				hashMap.put(mirror1.get(i),scores.get(i));
+			}
+			//根据score排序
+			List<Entry<BugMirror, Float>> tList = new ArrayList<>(hashMap.entrySet());
+			tList.sort((a, b) -> (Float.compare(b.getValue(), a.getValue())));
+
+			//最多展示前六项分数最高的
+			for (int i = 0; i < 6 && i < tList.size(); i++) {
+				Entry<BugMirror, Float> entry = tList.get(i);
+				resultMirror.add(entry.getKey());
+				resultScore.add(entry.getValue());
+			}
+
+
+			result.put("same", new JSONArray(resultMirror));
+			result.put("scores", new JSONArray(resultScore));
 			result.put("new", new JSONArray(mirror2));
+//			System.out.println("result:"+result);
+
+			recservice.createSimilarBugLog(session,resultMirror,resultScore);
+
+
+
+
 			out.print(result);
 			out.flush();
 			out.close();
@@ -229,4 +257,8 @@ public class RecommendController {
 			if(a.contains(mirror)) {a.remove(mirror);}
 		}
 	}
+
+
+
+
 }

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

@@ -34,6 +34,7 @@ public class UploadController {
 		JSONObject result = new JSONObject();
 		boolean flag = true;
 		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);}
 		if(flag && !id.equals("")) {
 			result.put("status", "200");

+ 40 - 0
src/main/java/edu/nju/dao/AnswerDao.java

@@ -0,0 +1,40 @@
+package edu.nju.dao;
+
+import edu.nju.entities.Answer;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoOperations;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public class AnswerDao {
+
+    @Autowired
+    private MongoOperations mongoOperations;
+
+    public Answer findAnswerByItemWorker(String item_id, String worker_id){
+        Query query = new Query();
+        query.addCriteria(Criteria.where("item_id").is(item_id).and("worker_id").is(worker_id));
+        List<Answer>answers= mongoOperations.find(query, Answer.class);
+        if(answers!=null&&answers.size()!=0){
+            return answers.get(0);
+        }
+        return null;
+    }
+
+    public List<Answer> findAnswersByJobWorker(String job_id, String worker_id){
+        Query query = new Query();
+        query.addCriteria(Criteria.where("job_id").is(job_id).and("worker_id").is(worker_id));
+        List<Answer>answers= mongoOperations.find(query, Answer.class);
+        return answers;
+    }
+
+    //存在则更新,不存在则插入
+    public String save(Answer answer){
+        mongoOperations.save(answer);
+        return answer.getId();
+    }
+}

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

@@ -25,8 +25,10 @@ public class CTBDao {
 		Query query = new Query();
 		query.addCriteria(Criteria.where("_id").is(useCase));
 		List<CaseToBug> result = mongoOperations.find(query, CaseToBug.class);
+		System.out.println(useCase);
 		if(result.size() != 0) {
 			CaseToBug ctb = result.get(0);
+//			System.out.println("1"+ctb.getId());
 			if(!ctb.getBug_id().contains(bug_id)) {
 				ctb.getBug_id().add(bug_id);
 				mongoOperations.save(ctb);
@@ -35,6 +37,7 @@ public class CTBDao {
 			List<String> list = new ArrayList<String>();
 			list.add(bug_id);
 			CaseToBug ctb = new CaseToBug(useCase, list, case_take_id, report_id);
+//			System.out.println("2"+ctb.getId());
 			mongoOperations.save(ctb);
 		}
 		
@@ -43,10 +46,12 @@ public class CTBDao {
 	public CaseToBug find(String id) {
 		Query query = new Query();
 		query.addCriteria(Criteria.where("_id").is(id));
+//		System.out.println("3"+id);
 		return mongoOperations.find(query, CaseToBug.class).get(0);
 	}
 	
 	public List<String> findById(String id) {
+//		System.out.println("3"+id);
 		Query query = new Query();
 	    query.addCriteria(Criteria.where("_id").is(id));
 	    List<CaseToBug> result = mongoOperations.find(query, CaseToBug.class);

+ 42 - 0
src/main/java/edu/nju/dao/ItemDao.java

@@ -0,0 +1,42 @@
+package edu.nju.dao;
+
+import edu.nju.entities.Item;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoOperations;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+
+import java.util.List;
+
+@Repository
+public class ItemDao {
+
+    @Autowired
+    private MongoOperations mongoOperations;
+
+    public String saveItem(Item item){
+        mongoOperations.save(item);
+        return item.getId();
+    }
+
+    public List<Item>findItemsByJob(String job_id){
+        Query query = new Query();
+        query.addCriteria(Criteria.where("task_id").is(job_id));
+        return mongoOperations.find(query, Item.class);
+    }
+
+    public Item getItem(String id){
+        Query query = new Query();
+        query.addCriteria(Criteria.where("_id").is(id));
+        List<Item> list = mongoOperations.find(query, Item.class);
+        if(list.size() == 0 || list == null) {return null;}
+        return list.get(0);
+    }
+
+
+
+
+}
+

+ 12 - 0
src/main/java/edu/nju/dao/ItemToUserDao.java

@@ -0,0 +1,12 @@
+package edu.nju.dao;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoOperations;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public class ItemToUserDao {
+
+    @Autowired
+    private MongoOperations mongoOperations;
+}

+ 31 - 0
src/main/java/edu/nju/dao/JobDao.java

@@ -0,0 +1,31 @@
+package edu.nju.dao;
+
+import edu.nju.entities.Job;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoOperations;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public class JobDao {
+
+    @Autowired
+    private MongoOperations mongoOperations;
+
+    //id查询,find查询所有
+    public Job findJob(String id){
+        Query query = new Query();
+        query.addCriteria(Criteria.where("_id").is(id));
+        List<Job> list = mongoOperations.find(query,Job.class);
+        if(list.size() == 0 || list == null) {return null;}
+        return list.get(0);
+    }
+
+    public String save(Job job) {
+        mongoOperations.save(job);
+        return job.getId();
+    }
+}

+ 31 - 0
src/main/java/edu/nju/dao/UserToItemDao.java

@@ -0,0 +1,31 @@
+package edu.nju.dao;
+
+import edu.nju.entities.UserToItem;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoOperations;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public class UserToItemDao {
+
+    @Autowired
+    private MongoOperations mongoOperations;
+
+    public List<String>getItemsByUserJob(String worker_id,String job_id){
+        Query query = new Query();
+        query.addCriteria(Criteria.where("worker_id").is(worker_id).and("job_id").is(job_id));
+        List<UserToItem>list = mongoOperations.find(query, UserToItem.class);
+        if(list.size() == 0 || list == null) {return null;}
+        return list.get(0).getItem_id();
+    }
+
+    //存在则更新,不存在则插入
+    public String save(UserToItem userToItem){
+        mongoOperations.save(userToItem);
+        return userToItem.getId();
+    }
+}

+ 96 - 0
src/main/java/edu/nju/entities/Answer.java

@@ -0,0 +1,96 @@
+package edu.nju.entities;
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Document
+public class Answer implements java.io.Serializable{
+
+
+    private static final long serialVersionUID = -8263451883506704407L;
+
+    @Id
+    private String id;
+
+    private String item_id;
+
+    private List<String> answers;
+
+    private String worker_id;
+
+    private String job_id;
+
+    private List<String> attachment_location;
+
+    public Answer(String item_id, List<String> answers, String worker_id, List<String> attachment_location,String job_id) {
+        this.item_id = item_id;
+        this.answers = answers;
+        this.worker_id = worker_id;
+        this.attachment_location = attachment_location;
+        this.job_id=job_id;
+    }
+    public Answer(String item_id,String worker_id,String job_id,int optionNum){
+        this.item_id = item_id;
+        this.worker_id = worker_id;
+        this.attachment_location = new ArrayList<>();
+        this.job_id=job_id;
+        this.answers=new ArrayList<>();
+        for(int i=0;i<optionNum;i++){
+            answers.add("-1");
+        }
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getItem_id() {
+        return item_id;
+    }
+
+    public void setItem_id(String item_id) {
+        this.item_id = item_id;
+    }
+
+    public List<String> getAnswers() {
+        return answers;
+    }
+
+    public void setAnswers(List<String> answers) {
+        this.answers = answers;
+    }
+
+    public String getWorker_id() {
+        return worker_id;
+    }
+
+    public void setWorker_id(String worker_id) {
+        this.worker_id = worker_id;
+    }
+
+    public List<String> getAttachment_location() {
+        return attachment_location;
+    }
+
+    public void setAttachment_location(List<String> attachment_location) {
+        this.attachment_location = attachment_location;
+    }
+
+    public String getJob_id() {
+        return job_id;
+    }
+
+    public void setJob_id(String job_id) {
+        this.job_id = job_id;
+    }
+
+
+
+}

+ 33 - 1
src/main/java/edu/nju/entities/Exam.java

@@ -25,6 +25,10 @@ public class Exam implements java.io.Serializable {
 
 	private String description;
 
+//	private String if_test_case;
+//
+//	private String if_bug;
+
 	@PersistenceConstructor
 	public Exam(String id, String json, String app_name, String paper_type, String test_type, String description) {
 		this.id = id;
@@ -35,6 +39,19 @@ public class Exam implements java.io.Serializable {
 		this.description = description;
 	}
 
+//	@PersistenceConstructor
+//	public Exam(String id, String json, String app_name, String paper_type, String test_type, String description,
+//				String if_test_case,String if_bug) {
+//		this.id = id;
+//		this.json = json;
+//		this.app_name = app_name;
+//		this.paper_type = paper_type;
+//		this.test_type = test_type;
+//		this.description = description;
+//		this.if_test_case=if_test_case;
+//		this.if_bug=if_bug;
+//	}
+
 	public String getId() {
 		return id;
 	}
@@ -82,5 +99,20 @@ public class Exam implements java.io.Serializable {
 	public void setDescription(String description) {
 		this.description = description;
 	}
-	
+
+//	public String getIf_test_case() {
+//		return if_test_case;
+//	}
+//
+//	public void setIf_test_case(String if_test_case) {
+//		this.if_test_case = if_test_case;
+//	}
+//
+//	public String getIf_bug() {
+//		return if_bug;
+//	}
+//
+//	public void setIf_bug(String if_bug) {
+//		this.if_bug = if_bug;
+//	}
 }

+ 113 - 0
src/main/java/edu/nju/entities/Item.java

@@ -0,0 +1,113 @@
+package edu.nju.entities;
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.annotation.PersistenceConstructor;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import java.util.List;
+import java.util.Set;
+
+@Document
+public class Item implements java.io.Serializable {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1884350958222679356L;
+
+    @Id
+    private String id;
+
+    private String job_id;
+
+    private String description;
+
+    private List<String> img_urls;
+
+    private boolean isRequired;
+
+    private boolean isMultiple;
+
+    private List<String> attachment_locations;
+
+    private List<String> options;
+
+    @PersistenceConstructor
+    public Item(String description, List<String> img_urls, boolean isRequired, boolean isMultiple, List<String> attachment_locations, List<String> options, String job_id) {
+        this.description = description;
+        this.img_urls = img_urls;
+        this.isRequired = isRequired;
+        this.isMultiple = isMultiple;
+        this.attachment_locations = attachment_locations;
+        this.options = options;
+        this.job_id = job_id;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public List<String> getImg_urls() {
+        return img_urls;
+    }
+
+    public void setImg_urls(List<String> img_urls) {
+        this.img_urls = img_urls;
+    }
+
+    public boolean isRequired() {
+        return isRequired;
+    }
+
+    public void setRequired(boolean required) {
+        isRequired = required;
+    }
+
+    public boolean isMultiple() {
+        return isMultiple;
+    }
+
+    public void setMultiple(boolean multiple) {
+        isMultiple = multiple;
+    }
+
+    public List<String> getAttachment_locations() {
+        return attachment_locations;
+    }
+
+    public void setAttachment_locations(List<String> attachment_locations) {
+        this.attachment_locations = attachment_locations;
+    }
+
+    public List<String> getOptions() {
+        return options;
+    }
+
+    public void setOptions(List<String> options) {
+        this.options = options;
+    }
+
+    public String getJob_id() {
+        return job_id;
+    }
+
+    public void setJob_id(String job_id) {
+        this.job_id = job_id;
+    }
+
+
+
+
+}

+ 49 - 0
src/main/java/edu/nju/entities/ItemToUser.java

@@ -0,0 +1,49 @@
+package edu.nju.entities;
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import java.util.List;
+
+@Document
+public class ItemToUser implements java.io.Serializable{
+
+    private static final long serialVersionUID = -4472809119623302014L;
+
+    @Id
+    private String id;
+
+    private String item_id;
+
+    private List<String>user_id;
+
+    public ItemToUser(String id, String item_id, List<String> user_id) {
+        this.id = id;
+        this.item_id = item_id;
+        this.user_id = user_id;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getItem_id() {
+        return item_id;
+    }
+
+    public void setItem_id(String item_id) {
+        this.item_id = item_id;
+    }
+
+    public List<String> getUser_id() {
+        return user_id;
+    }
+
+    public void setUser_id(List<String> user_id) {
+        this.user_id = user_id;
+    }
+}

+ 124 - 0
src/main/java/edu/nju/entities/Job.java

@@ -0,0 +1,124 @@
+package edu.nju.entities;
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+@Document
+public class Job implements java.io.Serializable{
+
+    private static final long serialVersionUID = 3417624501014997684L;
+
+    @Id
+    private String id;
+
+    private String description;
+
+    private String name;
+
+    private String create_time_millis;
+
+    private String device_model;
+
+    private String device_brand;
+
+    private String device_os;
+
+    private String script_location;
+
+    private String report_location;
+
+    private String log_location;
+
+    public Job(String description, String name, String create_time_millis, String device_model, String device_brand, String device_os, String script_location, String report_location, String log_location) {
+        this.description = description;
+        this.name = name;
+        this.create_time_millis = create_time_millis;
+        this.device_model = device_model;
+        this.device_brand = device_brand;
+        this.device_os = device_os;
+        this.script_location = script_location;
+        this.report_location = report_location;
+        this.log_location = log_location;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String desciption) {
+        this.description = desciption;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getCreate_time_millis() {
+        return create_time_millis;
+    }
+
+    public void setCreate_time_millis(String create_time_millis) {
+        this.create_time_millis = create_time_millis;
+    }
+
+    public String getDevice_model() {
+        return device_model;
+    }
+
+    public void setDevice_model(String device_model) {
+        this.device_model = device_model;
+    }
+
+    public String getDevice_brand() {
+        return device_brand;
+    }
+
+    public void setDevice_brand(String device_brand) {
+        this.device_brand = device_brand;
+    }
+
+    public String getDevice_os() {
+        return device_os;
+    }
+
+    public void setDevice_os(String device_os) {
+        this.device_os = device_os;
+    }
+
+    public String getScript_location() {
+        return script_location;
+    }
+
+    public void setScript_location(String script_location) {
+        this.script_location = script_location;
+    }
+
+    public String getReport_location() {
+        return report_location;
+    }
+
+    public void setReport_location(String report_location) {
+        this.report_location = report_location;
+    }
+
+    public String getLog_location() {
+        return log_location;
+    }
+
+    public void setLog_location(String log_location) {
+        this.log_location = log_location;
+    }
+
+}

+ 36 - 0
src/main/java/edu/nju/entities/TestCase.java

@@ -29,6 +29,10 @@ public class TestCase implements java.io.Serializable {
 	
 	private String create_time_millis;
 
+//	private String if_execute;
+//
+//	private String if_bug;
+
 	@PersistenceConstructor
 	public TestCase(String name, String front, String behind, String description, String report_id, String create_time_millis) {
 		this.name = name;
@@ -37,8 +41,23 @@ public class TestCase implements java.io.Serializable {
 		this.behind = behind;
 		this.description = description;
 		this.create_time_millis = create_time_millis;
+
 	}
 
+//	@PersistenceConstructor
+//	public TestCase(String name, String front, String behind, String description, String report_id, String create_time_millis,
+//					String if_execute,String if_Bug) {
+//		this.name = name;
+//		this.report_id = report_id;
+//		this.front = front;
+//		this.behind = behind;
+//		this.description = description;
+//		this.create_time_millis = create_time_millis;
+//		this.if_execute=if_execute;
+//		this.if_bug=if_Bug;
+//	}
+
+
 	public String getId() {
 		return id;
 	}
@@ -94,5 +113,22 @@ public class TestCase implements java.io.Serializable {
 	public void setCreate_time_millis(String create_time_millis) {
 		this.create_time_millis = create_time_millis;
 	}
+
+//	public String getIf_execute() {
+//		return if_execute;
+//	}
+//
+//	public void setIf_execute(String if_execute) {
+//		this.if_execute = if_execute;
+//	}
+//
+//	public String getIf_bug() {
+//		return if_bug;
+//	}
+//
+//	public void setIf_bug(String if_bug) {
+//		this.if_bug = if_bug;
+//	}
+
 	
 }

+ 59 - 0
src/main/java/edu/nju/entities/UserToItem.java

@@ -0,0 +1,59 @@
+package edu.nju.entities;
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import java.util.List;
+
+@Document
+public class UserToItem implements java.io.Serializable{
+
+    private static final long serialVersionUID = -5082515228801224799L;
+
+    @Id
+    private String id;
+
+    private String worker_id;
+
+    private List<String> item_id;
+
+    private String job_id;
+
+    public UserToItem(String worker_id, List<String> item_id, String job_id) {
+        this.item_id = item_id;
+        this.worker_id = worker_id;
+        this.job_id = job_id;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public List<String> getItem_id() {
+        return item_id;
+    }
+
+    public void setItem_id(List<String> item_id) {
+        this.item_id = item_id;
+    }
+
+    public String getWorker_id() {
+        return worker_id;
+    }
+
+    public void setWorker_id(String worker_id) {
+        this.worker_id = worker_id;
+    }
+
+    public String getJob_id() {
+        return job_id;
+    }
+
+    public void setJob_id(String job_id) {
+        this.job_id = job_id;
+    }
+}

+ 21 - 4
src/main/java/edu/nju/service/AnalyzeService.java

@@ -1,9 +1,6 @@
 package edu.nju.service;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 import edu.nju.util.HTTP;
 import org.json.JSONArray;
@@ -324,4 +321,24 @@ public class AnalyzeService {
 		if(workerId == null || workerId.equals("null")) { return "";}
 		return workerId;
 	}
+
+
+	public List<Bug> getAfterSimilarBug(String bug_id){
+		Bug bug =bdao.findByid(bug_id);
+		List<Bug> bugList=bdao.findByCaseid(bug.getCase_id());
+		List<Bug> result=new ArrayList<>();
+		for(Bug tempBug: bugList){
+			if(Long.parseLong(tempBug.getCreate_time_millis())>Long.parseLong(bug.getCreate_time_millis())){
+				if(checkSimilarity(bug,tempBug)){
+					result.add(tempBug);
+				}
+			}
+		}
+		return result;
+	}
+
+	//todo check similarity
+	private boolean checkSimilarity(Bug bug1,Bug bug2){
+		return true;
+	}
 }

+ 1 - 0
src/main/java/edu/nju/service/CTBService.java

@@ -15,6 +15,7 @@ public class CTBService {
 	
 	public boolean save(String useCase, String bug_id, String case_take_id, String report_id) {
 		try {
+//			System.out.println(useCase);
 			ctbdao.save(useCase, bug_id, case_take_id, report_id);
 			return true;
 		} catch (Exception e) {

+ 183 - 8
src/main/java/edu/nju/service/ExtraService.java

@@ -2,19 +2,14 @@ package edu.nju.service;
 
 import java.util.*;
 
+import com.google.gson.JsonArray;
+import edu.nju.dao.*;
+import edu.nju.entities.*;
 import org.json.JSONArray;
 import org.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import edu.nju.dao.ReportDao;
-import edu.nju.dao.BugDao;
-import edu.nju.dao.ExamDao;
-import edu.nju.dao.TestCaseDao;
-import edu.nju.entities.Bug;
-import edu.nju.entities.Exam;
-import edu.nju.entities.Report;
-import edu.nju.entities.TestCase;
 import edu.nju.util.ExcelToJson;
 
 @Service
@@ -31,12 +26,26 @@ public class ExtraService {
 	
 	@Autowired
 	BugDao bugDao;
+
+	@Autowired
+	JobDao jobDao;
+
+	@Autowired
+	ItemDao itemDao;
+
+	@Autowired
+	ItemService itemService;
 	
 	//测试用例相关
 	public String saveTestCase(String report_id, String name, String front, String behind, String description) {
 		TestCase testCase = new TestCase(name, front, behind, description, report_id, Long.toString(System.currentTimeMillis()));
 		return testDao.save(testCase);
 	}
+
+//	public String saveTestCase(String report_id, String name, String front, String behind, String description,String if_execute,String if_bug) {
+//		TestCase testCase = new TestCase(name, front, behind, description, report_id, Long.toString(System.currentTimeMillis()),if_execute,if_bug);
+//		return testDao.save(testCase);
+//	}
 	
 	public boolean updateTestCase(String id, String report_id, String name, String front, String behind, String description) {
 		try {
@@ -90,6 +99,15 @@ public class ExtraService {
 		return json;
 	}
 
+// 	public String saveExam1(String case_id, String path, String app_name, String paper_type, String test_type, String description,
+//							String if_test_case,String if_bug) {
+//		String json = ExcelToJson.ExcelTranse(path).toString();
+////		Exam exam = new Exam(case_id, json, app_name, paper_type, test_type, description);
+//		Exam exam = new Exam(case_id, json, app_name, paper_type, test_type, description,if_test_case,if_bug);
+//		examDao.save(exam);
+//		return json;
+//	}
+
 	public JSONArray getExamList() {
 		List<Exam> result = examDao.findAll();
 		JSONArray array = new JSONArray();
@@ -119,4 +137,161 @@ public class ExtraService {
 	public Exam getExam(String id) {
 		return examDao.findById(id);
 	}
+
+	public String saveJob(String jobJson){
+		JSONObject jsonObject=new JSONObject(jobJson);
+		String description=jsonObject.getString("description");
+		String name=jsonObject.getString("name");
+//		String create_time_millis=Long.toString(System.currentTimeMillis());
+
+		String job_id=jobDao.save(new Job(description,name,Long.toString(System.currentTimeMillis()),"","","","","",""));
+
+		JSONArray itemArray=jsonObject.getJSONArray("itemList");
+		//save item
+		//item index-id
+		HashMap<String,String> item_index_to_id=new HashMap<>();
+		HashMap<String,Integer>item_id_to_optionNum=new HashMap<>();
+		for(int i=0;i<itemArray.length();i++) {
+			JSONObject itemObject = itemArray.getJSONObject(i);
+			String item_id=saveItem(itemObject,job_id,item_id_to_optionNum);
+			String item_index=itemObject.getString("index");
+			item_index_to_id.put(item_index,item_id);
+		}
+
+		//worker_id-item_id_list
+		JSONArray workerArray=jsonObject.getJSONArray("workerList");
+		createWorkerToItem(item_index_to_id,workerArray,job_id,item_id_to_optionNum);
+
+		return job_id;
+
+	}
+
+	private String saveItem(JSONObject itemObject,String job_id,HashMap<String,Integer>item_id_to_optionNum){
+
+//			JSONObject itemObject=itemArray.getJSONObject(i);
+			String description=itemObject.getString("description");
+			List<String> img_urls=new ArrayList<>();
+			JSONArray imgUrlArray=itemObject.getJSONArray("img_urls");
+			for (int j=0;j<imgUrlArray.length();j++){
+				JSONObject imgUrlObject=imgUrlArray.getJSONObject(j);
+				img_urls.add(imgUrlObject.getString("url"));
+			}
+			boolean isRequired=Boolean.parseBoolean(itemObject.getString("isRequired"));
+			boolean isMultiple=Boolean.parseBoolean(itemObject.getString("isMultiple"));
+			List<String> file_urls=new ArrayList<>();
+			JSONArray fileArray=itemObject.getJSONArray("file_urls");
+//			System.out.println(fileArray);
+			for (int j=0;j<fileArray.length();j++){
+				JSONObject fileObject=fileArray.getJSONObject(j);
+//				System.out.println(fileObject.getString("url"));
+				file_urls.add(fileObject.getString("url"));
+			}
+
+			List<String>  options=new ArrayList<>();
+			JSONArray optionArray=itemObject.getJSONArray("options");
+//			System.out.println(optionArray);
+			for (int j=0;j<optionArray.length();j++){
+				JSONObject optionObject=optionArray.getJSONObject(j);
+//				System.out.println(optionObject.getString("option"));
+				options.add(optionObject.getString("option"));
+			}
+			Item item=new Item(description,img_urls,isRequired,isMultiple,file_urls,options,job_id);
+			String item_id = itemDao.saveItem(item);
+			item_id_to_optionNum.put(item_id,optionArray.length());
+			return item_id;
+
+	}
+
+	private void createWorkerToItem(HashMap<String,String> item_index_to_id,JSONArray workerArray,String job_id,HashMap<String,Integer>item_id_to_optionNum){
+		HashMap<String,List<String>> worker_to_item=new HashMap<>();
+
+		for(int i=0;i<workerArray.length();i++){
+			JSONObject workerObject=workerArray.getJSONObject(i);
+			String worker_id=workerObject.getString("worker_id");
+			JSONArray itemIndexArray=workerObject.getJSONArray("item_index_list");
+			List<String> itemIdList=new ArrayList<>();
+			for (int j=0;j<itemIndexArray.length();j++){
+				JSONObject itemIndexObject=itemIndexArray.getJSONObject(j);
+				itemIdList.add(item_index_to_id.get(itemIndexObject.getString("index")));
+			}
+			worker_to_item.put(worker_id,itemIdList);
+			itemService.saveUserToItem(worker_id,itemIdList,job_id);
+			for(int j=0;j<itemIdList.size();j++){
+				String item_id=itemIdList.get(j);
+				int optionNum=item_id_to_optionNum.get(item_id);
+				String answer_id=itemService.saveAnswer(item_id,worker_id,job_id,optionNum);
+			}
+		}
+	}
+
+
+//	public static void main(String[] args) {
+//		System.out.println("11");
+////		String jobJson = "{\"description\":\"job描述\",\"name\":\"jobname\",\"itemList\":[{\"description\":\"itemdesc\",\"img_urls\":[{\"url\":\"imgurl1\"},{\"url\":\"imgurl2\"},{\"url\":\"imgurl3\"}]}],\"isReuqired\":\"true\",\"isMutilple\":\"true\",\"file_urls\":[{\"url\":\"fileurl1\"},{\"url\":\"fileurl2\"},{\"url\":\"fileurl3\"}],\"options\":[{\"option\":\"option1\"},{\"option\":\"option2\"},{\"option\":\"option3\"}]}";
+////		String jobJson="{\"description\":\"job描述\",\"name\":\"jobname\",\"itemList\":[{\"description\":\"itemdesc1\",\"img_urls\":[{\"url\":\"imgurl1\"},{\"url\":\"imgurl2\"},{\"url\":\"imgurl3\"},{\"description\":\"itemdesc2\",\"img_urls\":[{\"url\":\"imgurl1\"},{\"url\":\"imgurl2\"},{\"url\":\"imgurl3\"},{\"description\":\"itemdesc3\",\"img_urls\":[{\"url\":\"imgurl1\"},{\"url\":\"imgurl2\"},{\"url\":\"imgurl3\"}]}],\"isReuqired\":\"true\",\"isMutilple\":\"true\",\"file_urls\":[{\"url\":\"fileurl1\"},{\"url\":\"fileurl2\"},{\"url\":\"fileurl3\"}],\"options\":[{\"option\":\"option1\"},{\"option\":\"option2\"},{\"option\":\"option3\"}]}";
+////		String jobJson="{\"description\":\"job描述\",\"name\":\"jobname\",\"itemList\":[{\"description\":\"itemdesc1\",\"img_urls\":[{\"url\":\"imgurl1\"},{\"url\":\"imgurl2\"},{\"url\":\"imgurl3\"}]},{\"description\":\"itemdesc2\",\"img_urls\":[{\"url\":\"imgurl1\"},{\"url\":\"imgurl2\"},{\"url\":\"imgurl3\"}]},{\"description\":\"itemdesc3\",\"img_urls\":[{\"url\":\"imgurl1\"},{\"url\":\"imgurl2\"},{\"url\":\"imgurl3\"}]}],\"isReuqired\":\"true\",\"isMutilple\":\"true\",\"file_urls\":[{\"url\":\"fileurl1\"},{\"url\":\"fileurl2\"},{\"url\":\"fileurl3\"}],\"options\":[{\"option\":\"option1\"},{\"option\":\"option2\"},{\"option\":\"option3\"}]}";
+////		String jobJson="{\"description\":\"job描述\",\"name\":\"jobname\",\"itemList\":[{\"description\":\"itemdesc1\",\"img_urls\":[{\"url\":\"imgurl1\"},{\"url\":\"imgurl2\"},{\"url\":\"imgurl3\"}],\"isRequired\":\"true\",\"isMultiple\":\"true\",\"file_urls\":[{\"url\":\"fileurl1\"},{\"url\":\"fileurl2\"},{\"url\":\"fileurl3\"}],\"options\":[{\"option\":\"option1\"},{\"option\":\"option2\"},{\"option\":\"option3\"}]},{\"description\":\"itemdesc2\",\"img_urls\":[{\"url\":\"imgurl1\"},{\"url\":\"imgurl2\"},{\"url\":\"imgurl3\"}],\"isReuqired\":\"true\",\"isMutilple\":\"true\",\"file_urls\":[{\"url\":\"fileurl1\"},{\"url\":\"fileurl2\"},{\"url\":\"fileurl3\"}],\"options\":[{\"option\":\"option1\"},{\"option\":\"option2\"},{\"option\":\"option3\"}]},{\"description\":\"itemdesc3\",\"img_urls\":[{\"url\":\"imgurl1\"},{\"url\":\"imgurl2\"},{\"url\":\"imgurl3\"}],\"isReuqired\":\"true\",\"isMutilple\":\"true\",\"file_urls\":[{\"url\":\"fileurl1\"},{\"url\":\"fileurl2\"},{\"url\":\"fileurl3\"}],\"options\":[{\"option\":\"option1\"},{\"option\":\"option2\"},{\"option\":\"option3\"}]}]}";
+//		String jobJson="{\"description\":\"job描述\",\"name\":\"jobname\",\"itemList\":[{\"description\":\"itemdesc1\",\"img_urls\":[{\"url\":\"imgurl1\"},{\"url\":\"imgurl2\"},{\"url\":\"imgurl3\"}],\"isRequired\":\"true\",\"isMultiple\":\"false\",\"file_urls\":[{\"url\":\"fileurl1\"},{\"url\":\"fileurl2\"},{\"url\":\"fileurl3\"}],\"options\":[{\"option\":\"option1\"},{\"option\":\"option2\"},{\"option\":\"option3\"}]},{\"description\":\"itemdesc2\",\"img_urls\":[{\"url\":\"imgurl1\"},{\"url\":\"imgurl2\"},{\"url\":\"imgurl3\"}],\"isRequired\":\"true\",\"isMultiple\":\"true\",\"file_urls\":[{\"url\":\"fileurl1\"},{\"url\":\"fileurl2\"},{\"url\":\"fileurl3\"}],\"options\":[{\"option\":\"option1\"},{\"option\":\"option2\"},{\"option\":\"option3\"}]},{\"description\":\"itemdesc3\",\"img_urls\":[{\"url\":\"imgurl1\"},{\"url\":\"imgurl2\"},{\"url\":\"imgurl3\"}],\"isRequired\":\"true\",\"isMultiple\":\"true\",\"file_urls\":[{\"url\":\"fileurl1\"},{\"url\":\"fileurl2\"},{\"url\":\"fileurl3\"}],\"options\":[{\"option\":\"option1\"},{\"option\":\"option2\"},{\"option\":\"option3\"}]}]}";
+//
+//		JSONObject jsonObject = new JSONObject(jobJson);
+//		String description = jsonObject.getString("description");
+//		String name = jsonObject.getString("name");
+//		System.out.println(description);
+//		System.out.println(name);
+//
+////		System.out.println();
+//
+//		JSONArray itemArray = jsonObject.getJSONArray("itemList");
+////		System.out.println(itemArray);
+//		for (int i = 0; i < itemArray.length(); i++) {
+//			JSONObject itemObject = itemArray.getJSONObject(i);
+//
+//			System.out.println(itemObject);
+////			System.out.println(itemObject);
+//
+//			String itemDescription=itemObject.getString("description");
+//			System.out.println(itemDescription);
+//
+////			System.out.println(itemObject.getString("isRequired"));
+//
+//
+//
+//			boolean isRequired=Boolean.parseBoolean(itemObject.getString("isRequired"));
+//			boolean isMultiple=Boolean.parseBoolean(itemObject.getString("isMultiple"));
+//
+//			System.out.println(isRequired);
+//			System.out.println(isMultiple);
+//			List<String> img_urls=new ArrayList<>();
+//			JSONArray imgUrlArray=itemObject.getJSONArray("img_urls");
+//			System.out.println(imgUrlArray);
+//			for (int j=0;j<imgUrlArray.length();j++){
+//				JSONObject imgUrlObject=imgUrlArray.getJSONObject(j);
+//				System.out.println(imgUrlObject.getString("url"));
+//
+//			}
+//
+//
+//			System.out.println(itemObject.keySet());
+//
+//			JSONArray fileArray=itemObject.getJSONArray("file_urls");
+//			System.out.println(fileArray);
+//			for (int j=0;j<fileArray.length();j++){
+//				JSONObject fileObject=fileArray.getJSONObject(j);
+//				System.out.println(fileObject.getString("url"));
+//
+//			}
+//
+//			JSONArray optionArray=itemObject.getJSONArray("options");
+//			System.out.println(optionArray);
+//			for (int j=0;j<optionArray.length();j++){
+//				JSONObject optionObject=optionArray.getJSONObject(j);
+//				System.out.println(optionObject.getString("option"));
+//
+//			}
+//
+//
+//
+//
+//		}
+//	}
 }

+ 85 - 0
src/main/java/edu/nju/service/ItemService.java

@@ -0,0 +1,85 @@
+package edu.nju.service;
+
+import edu.nju.dao.AnswerDao;
+import edu.nju.dao.ItemDao;
+import edu.nju.dao.JobDao;
+import edu.nju.dao.UserToItemDao;
+import edu.nju.entities.Answer;
+import edu.nju.entities.Item;
+import edu.nju.entities.Job;
+import edu.nju.entities.UserToItem;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class ItemService {
+    @Autowired
+    ItemDao itemDao;
+    @Autowired
+    JobDao jobDao;
+    @Autowired
+    AnswerDao answerDao;
+    @Autowired
+    UserToItemDao userToItemDao;
+
+    public List<Item>getJobItems(String job_id){
+        return itemDao.findItemsByJob(job_id);
+    }
+
+    public Job getJob(String job_id){
+        return jobDao.findJob(job_id);
+    }
+
+    public Answer getAnswerByItemWorker(String item_id, String worker_id){
+        return answerDao.findAnswerByItemWorker(item_id, worker_id);
+    }
+    public List<Answer> getAnswersByWorkerJob(String job_id, String worker_id){
+        return answerDao.findAnswersByJobWorker(job_id, worker_id);
+    }
+
+    public String saveAnswer(String item_id, String worker_id,String job_id, List<String>answers,List<String> attachment_location){
+        Answer answer=new Answer(item_id,answers,worker_id,attachment_location,job_id);
+        return answerDao.save(answer);
+    }
+
+    //对answer进行初始化
+    public String saveAnswer(String item_id, String worker_id,String job_id, int optionNum){
+        Answer answer=new Answer(item_id,worker_id,job_id,optionNum);
+        return answerDao.save(answer);
+    }
+
+    public boolean updateAnswer(String id, String item_id, String worker_id, String job_id, List<String>answers,List<String> attachment_location){
+        try {
+            if(id == null || id.equals("undefined")) { return false; }
+            Answer answer=new Answer(item_id,answers,worker_id,attachment_location,job_id);
+            answer.setId(id);
+            answerDao.save(answer);
+            return true;
+        } catch(Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    public List<Item>getItemsByWorkerJob(String worker_id,String job_id){
+        List<String>itemIds = userToItemDao.getItemsByUserJob(worker_id, job_id);
+        List<Item>items=new ArrayList<>();
+        if(itemIds==null||itemIds.size()==0){
+            return null;
+        }else{
+            for(int i=0;i<itemIds.size();i++){
+                items.add(itemDao.getItem(itemIds.get(i)));
+            }
+        }
+        return items;
+    }
+
+    public String saveUserToItem(String worker_id, List<String> item_id, String job_id){
+        UserToItem userToItem=new UserToItem(worker_id, item_id, job_id);
+        return userToItemDao.save(userToItem);
+    }
+
+}

+ 154 - 3
src/main/java/edu/nju/service/RecommendService.java

@@ -1,5 +1,7 @@
 package edu.nju.service;
 
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -10,6 +12,10 @@ import java.util.Map.Entry;
 
 import javax.servlet.http.HttpSession;
 
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -172,6 +178,16 @@ public class RecommendService {
 		}
 		
 		Map<String, String> map = (Map<String, String>)session.getAttribute("path");
+//		for(Entry<String, String> entry : map.entrySet()) {
+//			System.out.println(entry.getKey());
+//			System.out.println(entry.getValue());
+////			String content = ;
+//		}
+
+//		System.out.println("mirror");
+//		for(BugMirror mirror : mirrors) {
+//			System.out.println(mirror.getId());
+//		}
 		return finalScore(mirrors, map);
 	}
 	
@@ -314,7 +330,8 @@ public class RecommendService {
 		else { results = recommend(case_take_id, type, content, true, session); }
 		return results;
 	}
-	
+
+
 	@SuppressWarnings("unchecked")
 	private Map<BugMirror, Float> count(String content, List<BugMirror> lists, boolean type, HttpSession session) {
 		StringMatch match = new StringMatch();
@@ -324,17 +341,24 @@ public class RecommendService {
 		Map<String, String> titleMap = new HashMap<String, String>();
 		Map<String, String> desMap = new HashMap<String, String>();
 		Map<String, String> pmap = null;
-		
+
+		//文本相似度计算,主要是使用StringMatch
+		//获取keywords中已经分词完毕的关键词
 		for(BugMirror mirror: lists) {
 			String id = mirror.getId();
 			bmap.put(id, mirror);
 			titleMap.put(id, kwdao.findById(id).getTitle());
 			desMap.put(id, kwdao.findById(id).getDescription());
 		}
+		//对于关键词和用户输入的信息进行文本相似度计算
 		for(BugMirror mirror: lists) {
 			String id = mirror.getId();
 			float score = 0;
+			//recommendByTitle:type==true
+			//recommendByDes:type==false
 			if(type) {
+				//ansj算法进行中文分词
+				//wmd算法计算相似度?
 				score += match.score(match.Ansj(content), match.Ansj(titleMap.get(id))) * 30;
 				if(session.getAttribute("des") != null) {
 					score += match.score(match.Ansj((String)session.getAttribute("des")), match.Ansj(desMap.get(id))) * 40;
@@ -348,11 +372,13 @@ public class RecommendService {
 			tmap.put(mirror, score);
 		}
 		List<Entry<BugMirror, Float>> tlist = new ArrayList<Entry<BugMirror, Float>>(tmap.entrySet());
+		//根据score排序
 		Collections.sort(tlist, (a, b) -> (Float.compare(b.getValue(), a.getValue())));
 		if(session.getAttribute("path") != null) {
 			pmap = (Map<String, String>)session.getAttribute("path");
 		}
-		
+
+		//只推荐前六个
 		for(int i = 0; i < tlist.size() && i < 6; i ++) {
 			float score = (float) (tlist.get(i).getValue());
 			result.put(tlist.get(i).getKey(), score + categoryCount(tlist.get(i).getKey(), pmap));
@@ -436,5 +462,130 @@ public class RecommendService {
 		}
 		return 0;
 	}
+
+	public void createSimilarBugLog(HttpSession session,List<BugMirror> mirrorList,List<Float> scores){
+		Bug userBug=constructUserBug(session);
+		StringBuilder log=new StringBuilder("userJson:");
+		log.append(objectToStr(userBug,','));
+		log.append("\n");
+		log.append("similarJson:");
+//
+//		JSONObject similarJson=new JSONObject();
+//		similarJson.put("userJson",new JSONObject(userBug));
+//		JSONArray similarBugJSONArray=new JSONArray();
+
+		//如果传过来的列表是未排过序的,就需要自己排序
+//		Map<BugMirror,Float> hashMap=new HashMap<>();
+//		for(int i=0;i<mirrorList.size();i++){
+////			System.out.println(scores.get(i));
+//			hashMap.put(mirrorList.get(i),scores.get(i));
+//		}
+//		//根据score排序
+//		List<Entry<BugMirror, Float>> tList = new ArrayList<Entry<BugMirror, Float>>(hashMap.entrySet());
+//		Collections.sort(tList,(a,b)->(Float.compare(b.getValue(),a.getValue())));
+//
+//		for(Entry<BugMirror, Float> entry:tList){
+//			Bug similarBug=bugdao.findByid(entry.getKey().getId());
+//			JSONObject similarBugJSONObject=new JSONObject();
+//			similarBugJSONObject.put("bugDetail",new JSONObject(similarBug));
+//			similarBugJSONObject.put("score",entry.getValue());
+//			System.out.println(entry.getValue());
+//			similarBugJSONArray.put(similarBugJSONObject);
+//		}
+
+		for(int i=0;i<mirrorList.size();i++){
+			Bug similarBug=bugdao.findByid(mirrorList.get(i).getId());
+			log.append(objectToStr(similarBug,','));
+			log.append("score:"+scores.get(i)+",");
+			log.append("\n");
+//			JSONObject similarBugJSONObject=new JSONObject();
+//			similarBugJSONObject.put("bugDetail",new JSONObject(similarBug));
+//			similarBugJSONObject.put("score",scores.get(i));
+//			similarBugJSONArray.put(similarBugJSONObject);
+		}
+
+//		similarJson.put("similarJson",similarBugJSONArray);
+
+		Logger logger= LoggerFactory.getLogger(RecommendService.class);
+		logger.info(String.valueOf(log));
+	}
+
+
+	private static StringBuilder objectToStr(Object o,char separator){
+		StringBuilder sb=new StringBuilder();
+		Field[] fields=o.getClass().getDeclaredFields();
+		String[] fieldNames=new String[fields.length];
+		for(int i=0;i<fields.length;i++){
+//            System.out.println(fields[i].getType());
+			fieldNames[i]=fields[i].getName();
+			sb.append(fieldNames[i]+":");
+			sb.append(getFieldValueByName(fieldNames[i],o));
+			sb.append(separator);
+		}
+		return sb;
+	}
+	private static Object getFieldValueByName(String fieldName, Object o) {
+		try {
+			String firstLetter = fieldName.substring(0, 1).toUpperCase();
+			String getter = "get" + firstLetter + fieldName.substring(1);
+			Method method = o.getClass().getMethod(getter, new Class[] {});
+			Object value = method.invoke(o, new Object[] {});
+			return value;
+		} catch (Exception e) {
+
+			return null;
+		}
+	}
+
+	private Bug constructUserBug( HttpSession session){
+		String case_take_id="";
+		String create_time_millis=Long.toString(System.currentTimeMillis());
+		String bug_category="";
+		String description="";
+		String img_url="";
+		int severity=0;
+		int recurrent=0;
+		String title="";
+		String report_id="";
+		String bug_page="";
+		String case_id="";
+		if(session.getAttribute("case")!=null){
+			case_take_id=(String)session.getAttribute("case");
+			case_id=case_take_id.split("-")[0];
+		}
+		if(session.getAttribute("path")!=null){
+			LinkedHashMap<String,String> path=(LinkedHashMap<String,String>)session.getAttribute("path");
+			if(path.containsKey("page1")){
+				bug_page+=path.get("page1");
+				if(path.containsKey("page2")){
+					bug_page+=("-"+path.get("page2"));
+					if(path.containsKey("page3")){
+						bug_page+=("-"+path.get("page3"));
+					}
+				}
+			}
+			if(path.containsKey("bug_category")){
+				bug_category=path.get("bug_category");
+			}
+			if(path.containsKey("severity")){
+				severity=severityTranse(path.get("severity"));
+			}
+			if(path.containsKey("recurrent")){
+				recurrent=recurrentTranse(path.get("recurrent"));
+			}
+
+		}
+		if(session.getAttribute("title")!=null){
+			title=(String)session.getAttribute("title");
+		}
+		if(session.getAttribute("des")!=null){
+			description=(String)session.getAttribute("des");
+		}
+		Bug userBug=new Bug(case_take_id,create_time_millis,bug_category,description,img_url,severity,recurrent,title,report_id,bug_page,case_id);
+//		JSONObject userBugJson=new JSONObject(userBug);
+//		System.out.println(userBugJson);
+		return userBug;
+
+	}
 	
 }

+ 1 - 0
src/main/java/edu/nju/service/SaveService.java

@@ -63,6 +63,7 @@ public class SaveService {
 	public String save(String case_take_id, String bug_category, String description, String img_url, String severity, String recurrent, String title, String report_id, String parent, String page, String useCase, String case_id) {
 		try {
 			StringMatch match = new StringMatch();
+//			System.out.println("report"+report_id);
 			String id = bugdao.save(new Bug(case_take_id, Long.toString(System.currentTimeMillis()), bug_category, description, img_url, severityTranse(severity), recurrentTranse(recurrent), title, report_id, page, case_id));
 			mirrordao.save(new BugMirror(id, case_take_id, bug_category, severityTranse(severity), recurrentTranse(recurrent), title, img_url, new HashSet<String>(), new HashSet<String>(), report_id, useCase, true));
 			kwdao.save(new KeyWords(id, match.Ansj(title), match.Ansj(description)));

+ 29 - 8
src/main/java/edu/nju/util/ExcelToJson.java

@@ -22,10 +22,14 @@ public class ExcelToJson {
 			int xssfLastRowNum = xssfSheet.getLastRowNum();
 			JSONObject object = new JSONObject();
 			JSONObject second = new JSONObject();
+			//是否是第一行
+			boolean firstRow=true;
+			//是否更改一级页面
+			boolean changeFirstPage=false;
 			for(int rowNum = 1; rowNum <= xssfLastRowNum; rowNum++) {
 				XSSFRow xssfRow = xssfSheet.getRow(rowNum);
 				if(xssfRow == null) { continue; }
-				
+
 				XSSFCell cell = xssfRow.getCell(0);
 				String cellValue0 = cell.getStringCellValue();
 				if(cellValue0 != "") {
@@ -35,16 +39,29 @@ public class ExcelToJson {
 					}
 					object.put("item", cellValue0);
 					object.put("children", new JSONArray());
+					changeFirstPage=true;
+				}else{
+					changeFirstPage=false;
 				}
-				
+
 				cell = xssfRow.getCell(1);
 				String cellValue1 = cell.getStringCellValue();
 				if(cellValue1 != "") {
 					if(second.length() != 0) {
-						JSONArray array = (JSONArray)object.get("children");
-						array.put(second);
-						object.put("children", array);
-						second = new JSONObject();
+						//不是第一行且更改了第一级界面,需要将上一个一级页面的最后一个二级页面放进去
+						if(changeFirstPage&&!firstRow){
+							JSONArray array = (JSONArray) dataArray.getJSONObject(dataArray.length()-1).get("children");
+							array.put(second);
+							second = new JSONObject();
+							changeFirstPage=false;
+							firstRow=false;
+						}else{
+							//直接将二级页面放入当前一级页面
+							JSONArray array = (JSONArray) object.get("children");
+							array.put(second);
+							object.put("children", array);
+							second = new JSONObject();
+						}
 					}
 					second.put("item", cellValue1);
 					second.put("children", new JSONArray());
@@ -56,10 +73,14 @@ public class ExcelToJson {
 				third.put("item", cell.getStringCellValue());
 				arr.put(third);
 				second.put("children", arr);
-				
+				firstRow=false;
 			}
+
 			dataArray.put(object);
-			
+			//最后一个一级页面的最后一个二级页面也要放入
+			JSONArray array = (JSONArray) dataArray.getJSONObject(dataArray.length()-1).get("children");
+			array.put(second);
+
 			return dataArray;
 		} catch (Exception e) {
 			e.printStackTrace();

+ 5 - 3
src/main/resources/application.properties

@@ -1,9 +1,11 @@
 server.port = 8090
 server.servlet.context-path = /Bug/api/
 
-spring.data.mongodb.host = ${MONGO_HOST:10.81.65.118}
-spring.data.mongodb.port = ${MONGO_PORT:29019}
-spring.data.mongodb.database = ${MONGO_DBNAME:co-report}
+#spring.data.mongodb.host = ${MONGO_HOST:10.81.65.118}
+#spring.data.mongodb.port = ${MONGO_PORT:29019}
+#spring.data.mongodb.database = ${MONGO_DBNAME:co-report}
+
+spring.data.mongodb.uri= mongodb://localhost:27017/test
 
 spring.http.encoding.force = true
 spring.http.encoding.charset = UTF-8