ReportController.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. package com.mooctest.controller;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.hankcs.hanlp.seg.Segment;
  5. import com.hankcs.hanlp.seg.common.Term;
  6. import com.mooctest.data.BugDTO;
  7. import com.mooctest.data.FinalReportDTO;
  8. import com.mooctest.data.SupplementDTO;
  9. import com.mooctest.data.TaskDTO;
  10. import com.mooctest.model.MasterReport;
  11. import com.mooctest.service.*;
  12. import com.mooctest.util.NLPUtil;
  13. import com.mooctest.util.ReportUtil;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.stereotype.Controller;
  16. import org.springframework.ui.Model;
  17. import org.springframework.util.ResourceUtils;
  18. import org.springframework.web.bind.annotation.GetMapping;
  19. import org.springframework.web.bind.annotation.PathVariable;
  20. import org.springframework.web.bind.annotation.RequestParam;
  21. import org.springframework.web.bind.annotation.ResponseBody;
  22. import javax.servlet.http.HttpServletRequest;
  23. import java.io.*;
  24. import java.util.*;
  25. import java.util.function.Function;
  26. import java.util.stream.Collectors;
  27. import static java.util.stream.Collectors.toMap;
  28. @Controller
  29. public class ReportController {
  30. @Autowired
  31. SupplementService supplementService;
  32. @Autowired
  33. BugReportService bugReportService;
  34. @Autowired
  35. MasterReportService masterReportService;
  36. @Autowired
  37. FinalReportService finalReportService;
  38. @Autowired
  39. BugReviewService bugReviewService;
  40. @Autowired
  41. TaskService taskService;
  42. @GetMapping(value = "/index")
  43. public String hello(HttpServletRequest request, @RequestParam(value = "name", required = false, defaultValue = "springboot-thymeleaf") String name) {
  44. request.setAttribute("name", name);
  45. return "index";
  46. }
  47. @GetMapping(value = "/report")
  48. public String showAggrReport(@RequestParam("masterId") String masterId,
  49. @RequestParam("examId") long examId,
  50. @RequestParam("caseId") long caseId,
  51. @RequestParam(value = "finalReportId", required = false) Long finalReportId,
  52. Model model) {
  53. Map<String, BugDTO> bugMap = bugReportService.getAllBugsMap(examId, caseId);
  54. BugDTO masterReport = bugMap.get(masterId);
  55. List<SupplementDTO> supplements = supplementService.getSupplementByMasterId(masterId, bugMap);
  56. List<BugDTO> bugs = new LinkedList<>();
  57. supplements.forEach(supplementDTO -> bugs.addAll(supplementDTO.getBugs()));
  58. List<BugDTO> sourceReports = bugs.stream().distinct().collect(Collectors.toList());
  59. Map<String, Long> categoryCounts = sourceReports.stream().collect(Collectors.groupingBy(BugDTO::getBugCategory, Collectors.counting()));
  60. Map<String, Long> pageCounts = sourceReports.stream().collect(Collectors.groupingBy(BugDTO::getBug_page,Collectors.counting()));
  61. Map<String, Long> recurrentCounts = sourceReports.stream()
  62. .map(BugDTO::getRecurrent)
  63. .map((recurrentNum) -> ReportUtil.recurrent2String.get(recurrentNum))
  64. .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
  65. Map<String, Long> severityCounts = sourceReports.stream()
  66. .map(BugDTO::getSeverity)
  67. .map((severityNum) -> ReportUtil.severity2String.get(severityNum))
  68. .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
  69. List<FinalReportDTO> finalReports = finalReportService.getBySourceId(masterId);
  70. model.addAttribute("wordList", getWordCloudList(sourceReports));
  71. model.addAttribute("categoryCounts", categoryCounts);
  72. model.addAttribute("severityCounts", severityCounts);
  73. model.addAttribute("pageCounts",pageCounts);
  74. model.addAttribute("recurrentCounts",recurrentCounts);
  75. model.addAttribute("aggReportId", "ML-AG-" + masterId.substring(10));
  76. model.addAttribute("masterReport", masterReport);
  77. model.addAttribute("createTime", new Date(Long.parseLong(masterReport.getCreateTimeMillis())));
  78. model.addAttribute("supplements", supplements);
  79. model.addAttribute("finalReports", finalReports);
  80. model.addAttribute("category2String", ReportUtil.category2String);
  81. model.addAttribute("recurrent2String", ReportUtil.recurrent2String);
  82. model.addAttribute("severity2String", ReportUtil.severity2String);
  83. model.addAttribute("examId", examId);
  84. model.addAttribute("caseId", caseId);
  85. boolean bugReviewed = bugReviewService.isBugReviewed(masterId);
  86. model.addAttribute("reviewed", bugReviewed);
  87. if (finalReportId != null) {
  88. Optional<FinalReportDTO> finalReportDTO = finalReports.stream().filter(finalReport -> finalReport.getId()==finalReportId).findFirst();
  89. model.addAttribute("finalReportId", finalReportId);
  90. model.addAttribute("editReport", finalReportDTO.get());
  91. }
  92. return "agg_report_new";
  93. }
  94. @GetMapping(value = "/report/{id}")
  95. public String showAggrReportTest(@PathVariable("id") String id,
  96. @RequestParam("examId") long examId,
  97. @RequestParam("caseId") long caseId,
  98. Model model) {
  99. BugDTO singleReport = bugReportService.getBugById(id,examId, caseId); // 具体的bug的DTO
  100. MasterReport masterReportSource = masterReportService.getByBugId(id+""); // 找到该报告的master报告报告;
  101. String masterId = masterReportSource.getMasterId();
  102. Map<String, BugDTO> bugMap = bugReportService.getAllBugsMap(examId, caseId);
  103. BugDTO masterReport = bugMap.get(masterId);
  104. List<FinalReportDTO> finalReports = finalReportService.getBySourceId(masterId); // 和这份报告suoshu julei baogao de fincal bgoa
  105. model.addAttribute("singleReport",singleReport);//
  106. model.addAttribute("masterReport", masterReport);
  107. model.addAttribute("createTime", new Date(Long.parseLong(singleReport.getCreateTimeMillis())));
  108. model.addAttribute("finalReports", finalReports);
  109. model.addAttribute("category2String", ReportUtil.category2String);
  110. model.addAttribute("recurrent2String", ReportUtil.recurrent2String);
  111. model.addAttribute("severity2String", ReportUtil.severity2String);
  112. model.addAttribute("masterName","ML-AG-"+masterId.substring(10));
  113. model.addAttribute("masterUrl","/report?masterId="+masterId+"&examId="+examId+"&caseId="+caseId);
  114. model.addAttribute("examId", examId);
  115. model.addAttribute("caseId", caseId);
  116. return "single_report";
  117. }
  118. @GetMapping("editReportData")
  119. @ResponseBody
  120. public FinalReportDTO getEditReportData(@RequestParam("masterId") String masterId,
  121. @RequestParam(value = "finalReportId", required = false) Long finalReportId,
  122. Model model){
  123. List<FinalReportDTO> finalReports = finalReportService.getBySourceId(masterId);
  124. Optional<FinalReportDTO> finalReportDTO = finalReports.stream().filter(finalReport -> finalReport.getId()==finalReportId).findFirst();
  125. return finalReportDTO.get();
  126. }
  127. //报告列表
  128. @GetMapping("created_reports")
  129. public String getCreatedReports(@RequestParam("masterId") String masterId,
  130. @RequestParam("examId") long examId,
  131. @RequestParam("caseId") long caseId,Model model){
  132. List<FinalReportDTO> finalReports = finalReportService.getBySourceId(masterId);
  133. model.addAttribute("examId", examId);
  134. model.addAttribute("caseId", caseId);
  135. model.addAttribute("finalReports", finalReports);
  136. model.addAttribute("category2String", ReportUtil.category2String);
  137. model.addAttribute("recurrent2String", ReportUtil.recurrent2String);
  138. model.addAttribute("severity2String", ReportUtil.severity2String);
  139. return "agg_report_new::ul_reports";
  140. }
  141. //创建报告界面
  142. @GetMapping("created_reports_form")
  143. public String getCreatedReportssd(Model model){
  144. model.addAttribute("category2String", ReportUtil.category2String);
  145. model.addAttribute("recurrent2String", ReportUtil.recurrent2String);
  146. model.addAttribute("severity2String", ReportUtil.severity2String);
  147. return "agg_report_new::create_reports";
  148. }
  149. private String getWordCloudList(List<BugDTO> sourceReports) {
  150. Map<String, Integer> wordCount = new HashMap<>();
  151. Set<String> stopWords = new HashSet<>();
  152. try {
  153. File file = ResourceUtils.getFile("classpath:stopwords.txt");
  154. BufferedReader reader = new BufferedReader(new FileReader(file));
  155. String line;
  156. while ((line = reader.readLine()) != null) {
  157. stopWords.add(line.trim());
  158. }
  159. } catch (FileNotFoundException e) {
  160. e.printStackTrace();
  161. } catch (IOException e) {
  162. e.printStackTrace();
  163. }
  164. sourceReports.forEach((bug) -> {
  165. Segment seg = NLPUtil.getDefaultSegment();
  166. List<Term> terms = seg.seg(bug.getDescription());
  167. for (Term term : terms) {
  168. if (stopWords.contains(term.word)) {
  169. continue;
  170. }
  171. if (wordCount.get(term.word) == null) {
  172. wordCount.put(term.word, 1);
  173. continue;
  174. }
  175. int count = wordCount.get(term.word);
  176. wordCount.put(term.word, ++count);
  177. }
  178. });
  179. JSONArray wordList = new JSONArray();
  180. wordCount.forEach((word, count) -> {
  181. if (word.length() > 1) {
  182. JSONObject wordObj = new JSONObject();
  183. wordObj.fluentPut("text", word)
  184. .fluentPut("weight", count * 10);
  185. wordList.add(wordObj);
  186. }
  187. });
  188. return wordList.toJSONString();
  189. }
  190. @GetMapping(value = "agg_report_list")
  191. public String showAggReportList(@RequestParam("examId") long examId,
  192. @RequestParam("caseId") long caseId,
  193. @RequestParam(value = "status", required = false, defaultValue = "-1") int status,
  194. Model model) {
  195. List<String> masterIds = masterReportService.getAllMasterIdByExamIdAndCaseId(examId, caseId);
  196. List<MasterReport> mrs = masterReportService.getByBugIds(masterIds);
  197. Map<String, MasterReport> mrMap = mrs.stream().collect(toMap(MasterReport::getBugId, Function.identity()));
  198. if (status >= 0) {
  199. masterIds = masterIds.stream().filter(masterId -> mrMap.get(masterId).getStatus() == status).collect(Collectors.toList());
  200. }
  201. // Map<String, List<String>> master2BugIdsMap = supplementService.getMaster2BugIdsMap(masterIds);
  202. Map<String, List<String>> master2BugIdsMap = masterReportService.getMaster2BugIdsMap(masterIds);
  203. Map<String, BugDTO> bugsMap = bugReportService.getAllBugsMap(examId, caseId);
  204. // Map<String, List<BugDTO>> masterBugMap = bugReportService.getMasterBugMap(master2BugIdsMap, bugsMap);
  205. TaskDTO task = taskService.getByExamIdAndCaseId(examId, caseId);
  206. masterIds.forEach(masterId -> {
  207. bugsMap.get(masterId).setStatus(mrMap.get(masterId).getStatus());
  208. });
  209. model.addAttribute("master2BugIdsMap", master2BugIdsMap);
  210. model.addAttribute("bugMap", bugsMap);
  211. model.addAttribute("examId", examId);
  212. model.addAttribute("caseId", caseId);
  213. model.addAttribute("task", task);
  214. model.addAttribute("aggNum", masterReportService.getAggNum(examId, caseId));
  215. return "agg_report_list";
  216. }
  217. @GetMapping(value = "agg_report_list_test")
  218. public String showAggReportLisst(@RequestParam("examId") long examId,
  219. @RequestParam("caseId") long caseId,
  220. @RequestParam(value = "status", required = false, defaultValue = "-1") int status,
  221. Model model) {
  222. boolean aggregated = masterReportService.isAggregated(examId, caseId);
  223. List<BugDTO> allReports = bugReportService.getAllBugs(examId, caseId);
  224. TaskDTO task = taskService.getByExamIdAndCaseId(examId, caseId);
  225. if (aggregated) { // 如果报告已经是聚合过的。
  226. List<String> bugIds = allReports.stream().map(BugDTO::getId).collect(Collectors.toList());
  227. List<MasterReport> mrs = masterReportService.getByBugIds(bugIds);
  228. Map<String, MasterReport> mrMap = mrs.stream().collect(toMap(MasterReport::getBugId, Function.identity()));
  229. allReports.forEach(bug -> {
  230. MasterReport mr = mrMap.get(bug.getId());
  231. bug.setStatus(mr.getStatus());
  232. bug.setReviewerId(mr.getReviewerId());
  233. bug.setMasterId(mr.getMasterId());
  234. });
  235. List<String> masterIds = masterReportService.getAllMasterIdByExamIdAndCaseId(examId, caseId);
  236. List<MasterReport> mrs0 = masterReportService.getByBugIds(masterIds);
  237. Map<String, MasterReport> mrMap0 = mrs0.stream().collect(toMap(MasterReport::getBugId, Function.identity()));
  238. if (status >= 0) {
  239. masterIds = masterIds.stream().filter(masterId -> mrMap0.get(masterId).getStatus() == status).collect(Collectors.toList());
  240. }
  241. Map<String, List<String>> master2BugIdsMap = masterReportService.getMaster2BugIdsMap(masterIds);
  242. Map<String, BugDTO> bugsMap = bugReportService.getAllBugsMap(examId, caseId);
  243. masterIds.forEach(masterId -> {
  244. bugsMap.get(masterId).setStatus(mrMap0.get(masterId).getStatus());
  245. });
  246. model.addAttribute("master2BugIdsMap", master2BugIdsMap); // 聚合才有的
  247. model.addAttribute("bugMap", bugsMap);// 聚合才有de
  248. model.addAttribute("aggNum", masterReportService.getAggNum(examId, caseId)); // 聚合才有的
  249. }
  250. model.addAttribute("aggregated", aggregated);
  251. model.addAttribute("allReports", allReports);
  252. model.addAttribute("severity2String", ReportUtil.severity2String);
  253. model.addAttribute("recurrent2String", ReportUtil.recurrent2String);
  254. model.addAttribute("reviewMap", ReportUtil.reviewerMap);
  255. model.addAttribute("task", task);
  256. model.addAttribute("examId", examId);
  257. model.addAttribute("caseId", caseId);
  258. return "test";
  259. }
  260. }