ReportController.java 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  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.BugData;
  11. import com.mooctest.model.MasterReport;
  12. import com.mooctest.service.*;
  13. import com.mooctest.util.NLPUtil;
  14. import com.mooctest.util.ReportUtil;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.data.mongodb.core.aggregation.ArrayOperators;
  17. import org.springframework.stereotype.Controller;
  18. import org.springframework.ui.Model;
  19. import org.springframework.util.ResourceUtils;
  20. import org.springframework.web.bind.annotation.GetMapping;
  21. import org.springframework.web.bind.annotation.PathVariable;
  22. import org.springframework.web.bind.annotation.RequestParam;
  23. import org.springframework.web.bind.annotation.ResponseBody;
  24. import javax.servlet.http.HttpServletRequest;
  25. import java.io.*;
  26. import java.util.*;
  27. import java.util.function.Function;
  28. import java.util.stream.Collectors;
  29. import static java.util.stream.Collectors.toMap;
  30. @Controller
  31. public class ReportController {
  32. @Autowired
  33. SupplementService supplementService;
  34. @Autowired
  35. BugReportService bugReportService;
  36. @Autowired
  37. MasterReportService masterReportService;
  38. @Autowired
  39. FinalReportService finalReportService;
  40. @Autowired
  41. BugReviewService bugReviewService;
  42. @Autowired
  43. TaskService taskService;
  44. @Autowired
  45. HistoryService historyService;
  46. @Autowired
  47. BugDataService bugDataService;
  48. @GetMapping(value = "/index")
  49. public String hello(HttpServletRequest request, @RequestParam(value = "name", required = false, defaultValue = "springboot-thymeleaf") String name) {
  50. request.setAttribute("name", name);
  51. return "index";
  52. }
  53. //聚合报告
  54. @GetMapping(value = "/report")
  55. public String showAggrReport(@RequestParam("masterId") String masterId,
  56. @RequestParam("examId") long examId,
  57. @RequestParam("caseId") long caseId,
  58. @RequestParam(value = "finalReportId", required = false) Long finalReportId,
  59. Model model) {
  60. Map<String, BugDTO> bugMap = bugReportService.getAllBugsMap(examId, caseId);
  61. BugDTO masterReport = bugMap.get(masterId);
  62. List<SupplementDTO> supplements = supplementService.getSupplementByMasterId(masterId, bugMap);
  63. List<BugDTO> bugs = new LinkedList<>();
  64. supplements.forEach(supplementDTO -> bugs.addAll(supplementDTO.getBugs()));
  65. List<BugDTO> sourceReports = bugs.stream().distinct().collect(Collectors.toList());
  66. Map<String, Long> categoryCounts = sourceReports.stream().collect(Collectors.groupingBy(BugDTO::getBugCategory, Collectors.counting()));
  67. Map<String, Long> pageCounts = sourceReports.stream().collect(Collectors.groupingBy(BugDTO::getBug_page,Collectors.counting()));
  68. Map<String, Long> recurrentCounts = sourceReports.stream()
  69. .map(BugDTO::getRecurrent)
  70. .map((recurrentNum) -> ReportUtil.recurrent2String.get(recurrentNum))
  71. .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
  72. Map<String, Long> severityCounts = sourceReports.stream()
  73. .map(BugDTO::getSeverity)
  74. .map((severityNum) -> ReportUtil.severity2String.get(severityNum))
  75. .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
  76. List<FinalReportDTO> finalReports = finalReportService.getBySourceId(masterId);
  77. Map<String,String> single2rootMap = historyService.getSingle2Root(caseId, examId);
  78. model.addAttribute("single2root",single2rootMap);
  79. model.addAttribute("wordList", getWordCloudList(sourceReports));
  80. model.addAttribute("categoryCounts", categoryCounts);
  81. model.addAttribute("severityCounts", severityCounts);
  82. model.addAttribute("pageCounts",pageCounts);
  83. model.addAttribute("recurrentCounts",recurrentCounts);
  84. model.addAttribute("aggReportId", "ML-AG-" + masterId.substring(10));
  85. model.addAttribute("masterReport", masterReport);
  86. model.addAttribute("createTime", new Date(Long.parseLong(masterReport.getCreateTimeMillis())));
  87. model.addAttribute("supplements", supplements);
  88. model.addAttribute("finalReports", finalReports);
  89. model.addAttribute("category2String", ReportUtil.category2String);
  90. model.addAttribute("recurrent2String", ReportUtil.recurrent2String);
  91. model.addAttribute("severity2String", ReportUtil.severity2String);
  92. model.addAttribute("examId", examId);
  93. model.addAttribute("caseId", caseId);
  94. // model.addAttribute("show")
  95. model.addAttribute("showReference",true);//是否展示其他聚合报告的参考标签
  96. boolean bugReviewed = bugReviewService.isBugReviewed(masterId);
  97. model.addAttribute("reviewed", bugReviewed);
  98. if (finalReportId != null) {
  99. Optional<FinalReportDTO> finalReportDTO = finalReports.stream().filter(finalReport -> finalReport.getId()==finalReportId).findFirst();
  100. model.addAttribute("finalReportId", finalReportId);
  101. model.addAttribute("editReport", finalReportDTO.get());
  102. }
  103. return "agg_report_new";
  104. }
  105. //part of aggreate report
  106. @GetMapping(value = "/report_part")
  107. public String showAggrReportPart(@RequestParam("masterId") String masterId,
  108. @RequestParam("examId") long examId,
  109. @RequestParam("caseId") long caseId,
  110. @RequestParam(value = "finalReportId", required = false) Long finalReportId,
  111. Model model) {
  112. Map<String, BugDTO> bugMap = bugReportService.getAllBugsMap(examId, caseId);
  113. BugDTO masterReport = bugMap.get(masterId);
  114. List<SupplementDTO> supplements = supplementService.getSupplementByMasterId(masterId, bugMap);
  115. List<BugDTO> bugs = new LinkedList<>();
  116. supplements.forEach(supplementDTO -> bugs.addAll(supplementDTO.getBugs()));
  117. List<BugDTO> sourceReports = bugs.stream().distinct().collect(Collectors.toList());
  118. Map<String, Long> categoryCounts = sourceReports.stream().collect(Collectors.groupingBy(BugDTO::getBugCategory, Collectors.counting()));
  119. Map<String, Long> pageCounts = sourceReports.stream().collect(Collectors.groupingBy(BugDTO::getBug_page,Collectors.counting()));
  120. Map<String, Long> recurrentCounts = sourceReports.stream()
  121. .map(BugDTO::getRecurrent)
  122. .map((recurrentNum) -> ReportUtil.recurrent2String.get(recurrentNum))
  123. .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
  124. Map<String, Long> severityCounts = sourceReports.stream()
  125. .map(BugDTO::getSeverity)
  126. .map((severityNum) -> ReportUtil.severity2String.get(severityNum))
  127. .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
  128. List<FinalReportDTO> finalReports = finalReportService.getBySourceId(masterId);
  129. Map<String,String> single2rootMap = historyService.getSingle2Root(caseId, examId);
  130. model.addAttribute("single2root",single2rootMap);
  131. model.addAttribute("wordList", getWordCloudList(sourceReports));
  132. model.addAttribute("categoryCounts", categoryCounts);
  133. model.addAttribute("severityCounts", severityCounts);
  134. model.addAttribute("pageCounts",pageCounts);
  135. model.addAttribute("recurrentCounts",recurrentCounts);
  136. model.addAttribute("aggReportId", "ML-AG-" + masterId.substring(10));
  137. model.addAttribute("masterReport", masterReport);
  138. model.addAttribute("createTime", new Date(Long.parseLong(masterReport.getCreateTimeMillis())));
  139. model.addAttribute("supplements", supplements);
  140. model.addAttribute("finalReports", finalReports);
  141. model.addAttribute("category2String", ReportUtil.category2String);
  142. model.addAttribute("recurrent2String", ReportUtil.recurrent2String);
  143. model.addAttribute("severity2String", ReportUtil.severity2String);
  144. model.addAttribute("examId", examId);
  145. model.addAttribute("caseId", caseId);
  146. model.addAttribute("showReference",false);//是否展示其他聚合报告的参考标签
  147. boolean bugReviewed = bugReviewService.isBugReviewed(masterId);
  148. model.addAttribute("reviewed", bugReviewed);
  149. if (finalReportId != null) {
  150. Optional<FinalReportDTO> finalReportDTO = finalReports.stream().filter(finalReport -> finalReport.getId()==finalReportId).findFirst();
  151. model.addAttribute("finalReportId", finalReportId);
  152. model.addAttribute("editReport", finalReportDTO.get());
  153. }
  154. return "agg_report_new::masterBody";
  155. }
  156. @GetMapping(value = "/report/{id}")
  157. public String showAggrReportTest(@PathVariable("id") String id,
  158. @RequestParam("examId") long examId,
  159. @RequestParam("caseId") long caseId,
  160. Model model) {
  161. //single 的单个的报告展示页面
  162. BugDTO singleReport = bugReportService.getBugById(id,examId, caseId); // 具体的bug的DTO
  163. MasterReport masterReportSource = masterReportService.getByBugId(id+""); // 找到该报告的master报告报告;
  164. List<FinalReportDTO> finalReports =new ArrayList<>();
  165. Map<String,String> sing2root = historyService.getSingle2Root(caseId, examId);
  166. String treeReportId = sing2root.get(id);
  167. if(masterReportSource == null){
  168. // 如果不存在聚合报告;
  169. model.addAttribute("hasMaster",false);
  170. }else{
  171. model.addAttribute("hasMaster",true);
  172. String masterId = masterReportSource.getMasterId();
  173. finalReports.addAll(finalReportService.getBySourceId(masterId)); // 和这份报告suoshu julei baogao de fincal bgoa
  174. model.addAttribute("masterName","ML-AG-"+masterId.substring(10));
  175. model.addAttribute("masterUrl","/report?masterId="+masterId+"&examId="+examId+"&caseId="+caseId);
  176. }
  177. if(treeReportId == null){
  178. //如果不存在树状报告
  179. model.addAttribute("hasTree",false);
  180. }else{
  181. model.addAttribute("hasTree",true);
  182. finalReports.addAll(finalReportService.getBySourceId(treeReportId)); // 和这份报告suoshu julei baogao de fincal bgoa
  183. model.addAttribute("treeName","ML-TR-"+getShortId(treeReportId));
  184. model.addAttribute("treeUrl","/history/report?treeId="+treeReportId+"&examId="+examId+"&caseId="+caseId);
  185. }
  186. // Map<String, BugDTO> bugMap = bugReportService.getAllBugsMap(examId, caseId);
  187. // BugDTO masterReport = bugMap.get(masterId);
  188. model.addAttribute("singleReport",singleReport);//
  189. // model.addAttribute("masterReport", masterReport);
  190. model.addAttribute("reviewed",bugDataService.isReviewed(id));
  191. model.addAttribute("createTime", new Date(Long.parseLong(singleReport.getCreateTimeMillis())));
  192. model.addAttribute("finalReports", finalReports);
  193. model.addAttribute("category2String", ReportUtil.category2String);
  194. model.addAttribute("recurrent2String", ReportUtil.recurrent2String);
  195. model.addAttribute("severity2String", ReportUtil.severity2String);
  196. model.addAttribute("examId", examId);
  197. model.addAttribute("caseId", caseId);
  198. model.addAttribute("reportId",id);
  199. return "single_report";
  200. }
  201. private String getShortId ( String input ){
  202. return input.length()<10?input:input.substring(input.length()-10);
  203. }
  204. @GetMapping("editReportData")
  205. @ResponseBody
  206. public FinalReportDTO getEditReportData(@RequestParam("masterId") String masterId,
  207. @RequestParam(value = "finalReportId", required = false) Long finalReportId,
  208. Model model){
  209. List<FinalReportDTO> finalReports = finalReportService.getBySourceId(masterId);
  210. Optional<FinalReportDTO> finalReportDTO = finalReports.stream().filter(finalReport -> finalReport.getId()==finalReportId).findFirst();
  211. return finalReportDTO.get();
  212. }
  213. //报告列表
  214. @GetMapping("created_reports")
  215. public String getCreatedReports(@RequestParam("masterId") String masterId,
  216. @RequestParam("examId") long examId,
  217. @RequestParam("caseId") long caseId,Model model){
  218. List<FinalReportDTO> finalReports = finalReportService.getBySourceId(masterId);
  219. model.addAttribute("examId", examId);
  220. model.addAttribute("caseId", caseId);
  221. model.addAttribute("finalReports", finalReports);
  222. model.addAttribute("category2String", ReportUtil.category2String);
  223. model.addAttribute("recurrent2String", ReportUtil.recurrent2String);
  224. model.addAttribute("severity2String", ReportUtil.severity2String);
  225. return "agg_report_new::ul_reports";
  226. }
  227. //创建报告界面
  228. @GetMapping("created_reports_form")
  229. public String getCreatedReportssd(Model model){
  230. model.addAttribute("category2String", ReportUtil.category2String);
  231. model.addAttribute("recurrent2String", ReportUtil.recurrent2String);
  232. model.addAttribute("severity2String", ReportUtil.severity2String);
  233. return "agg_report_new::create_reports";
  234. }
  235. private String getWordCloudList(List<BugDTO> sourceReports) {
  236. Map<String, Integer> wordCount = new HashMap<>();
  237. Set<String> stopWords = new HashSet<>();
  238. try {
  239. File file = ResourceUtils.getFile("classpath:stopwords.txt");
  240. BufferedReader reader = new BufferedReader(new FileReader(file));
  241. String line;
  242. while ((line = reader.readLine()) != null) {
  243. stopWords.add(line.trim());
  244. }
  245. } catch (FileNotFoundException e) {
  246. e.printStackTrace();
  247. } catch (IOException e) {
  248. e.printStackTrace();
  249. }
  250. sourceReports.forEach((bug) -> {
  251. Segment seg = NLPUtil.getDefaultSegment();
  252. List<Term> terms = seg.seg(bug.getDescription());
  253. for (Term term : terms) {
  254. if (stopWords.contains(term.word)) {
  255. continue;
  256. }
  257. if (wordCount.get(term.word) == null) {
  258. wordCount.put(term.word, 1);
  259. continue;
  260. }
  261. int count = wordCount.get(term.word);
  262. wordCount.put(term.word, ++count);
  263. }
  264. });
  265. JSONArray wordList = new JSONArray();
  266. wordCount.forEach((word, count) -> {
  267. if (word.length() > 1) {
  268. JSONObject wordObj = new JSONObject();
  269. wordObj.fluentPut("text", word)
  270. .fluentPut("weight", count * 10);
  271. wordList.add(wordObj);
  272. }
  273. });
  274. return wordList.toJSONString();
  275. }
  276. //审核报告;
  277. @GetMapping(value = "agg_report_list")
  278. public String showAggReportList(@RequestParam("examId") long examId,
  279. @RequestParam("caseId") long caseId,
  280. @RequestParam(value = "status", required = false, defaultValue = "-1") int status,
  281. Model model) {
  282. List<String> masterIds = masterReportService.getAllMasterIdByExamIdAndCaseId(examId, caseId);//get all masterreport id String
  283. List<MasterReport> mrs = masterReportService.getByBugIds(masterIds); // masterReport的报告内容
  284. Map<String, MasterReport> mrMap = mrs.stream().collect(toMap(MasterReport::getBugId, Function.identity()));//单个的master报告的对应map
  285. if (status >= 0) {
  286. masterIds = masterIds.stream().filter(masterId -> mrMap.get(masterId).getStatus() == status).collect(Collectors.toList());
  287. }
  288. // Map<String, List<String>> master2BugIdsMap = supplementService.getMaster2BugIdsMap(masterIds);
  289. Map<String, List<String>> master2BugIdsMap = masterReportService.getMaster2BugIdsMap(masterIds); // master报告对应的report的列表
  290. Map<String, BugDTO> bugsMap = bugReportService.getAllBugsMap(examId, caseId); //得到所有bug的对应map
  291. // Map<String, List<BugDTO>> masterBugMap = bugReportService.getMasterBugMap(master2BugIdsMap, bugsMap);
  292. TaskDTO task = taskService.getByExamIdAndCaseId(examId, caseId); // 任务情况
  293. masterIds.forEach(masterId -> {
  294. bugsMap.get(masterId).setStatus(mrMap.get(masterId).getStatus());
  295. });
  296. model.addAttribute("master2BugIdsMap", master2BugIdsMap);
  297. model.addAttribute("bugMap", bugsMap);
  298. model.addAttribute("examId", examId);
  299. model.addAttribute("caseId", caseId);
  300. model.addAttribute("task", task);
  301. model.addAttribute("aggNum", masterReportService.getAggNum(examId, caseId));
  302. return "agg_report_list";
  303. }
  304. @GetMapping(value = "review_report")
  305. public String showAggReportLisst(@RequestParam("examId") long examId,
  306. @RequestParam("caseId") long caseId,
  307. @RequestParam(value = "status", required = false, defaultValue = "-1") int status,
  308. Model model) {
  309. boolean aggregated = masterReportService.isAggregated(examId, caseId);
  310. List<BugDTO> allReports = bugReportService.getAllBugs(examId, caseId);
  311. TaskDTO task = taskService.getByExamIdAndCaseId(examId, caseId);
  312. List<String> treeRootids = historyService.getTreeRoots(caseId+"-"+examId);
  313. Map<String,List<String>> tree2BugIdsMap = historyService.getTree2BugIdsMap(treeRootids);
  314. Map<String,String> single2rootMap = historyService.getSingle2Root(caseId, examId);
  315. Map<String , BugData> bugIds2Data = bugDataService.bugId2BugData(examId,caseId) ;
  316. Map<String, BugDTO> bugsMap = bugReportService.getAllBugsMap(examId, caseId);
  317. List<String> bugIds = allReports.stream().map(BugDTO::getId).collect(Collectors.toList());
  318. if (aggregated) { // 如果报告已经是聚合过的。
  319. List<MasterReport> mrs = masterReportService.getByBugIds(bugIds);
  320. Map<String, MasterReport> mrMap = mrs.stream().collect(toMap(MasterReport::getBugId, Function.identity()));
  321. allReports.forEach(bug -> {
  322. bug.setMasterId(mrMap.get(bug.getId()).getMasterId());
  323. });
  324. List<String> masterIds = masterReportService.getAllMasterIdByExamIdAndCaseId(examId, caseId);
  325. List<MasterReport> mrs0 = masterReportService.getByBugIds(masterIds);
  326. Map<String, MasterReport> mrMap0 = mrs0.stream().collect(toMap(MasterReport::getBugId, Function.identity()));
  327. if (status >= 0) {
  328. masterIds = masterIds.stream().filter(masterId -> mrMap0.get(masterId).getStatus() == status).collect(Collectors.toList());
  329. }
  330. Map<String, List<String>> master2BugIdsMap = masterReportService.getMaster2BugIdsMap(masterIds);
  331. model.addAttribute("master2BugIdsMap", master2BugIdsMap); // 聚合才有的
  332. model.addAttribute("aggNum", masterReportService.getAggNum(examId, caseId)); // 聚合才有的
  333. }
  334. bugIds.forEach(id -> {
  335. bugsMap.get(id).setStatus(bugIds2Data.get(id).getStatus());
  336. });
  337. allReports.forEach(bug -> {
  338. bug.setStatus(bugIds2Data.get(bug.getId()).getStatus());
  339. bug.setReviewerId(bugIds2Data.get(bug.getId()).getReviewerId());
  340. String te = single2rootMap.get(bug.getId());
  341. bug.setTreeId(te==null?"null":te);
  342. });
  343. model.addAttribute("bugMap", bugsMap);// 聚合才有de
  344. model.addAttribute("treeNum",treeRootids.size());
  345. model.addAttribute("tree2BugIdsMap",tree2BugIdsMap);
  346. model.addAttribute("aggregated", aggregated);
  347. model.addAttribute("allReports", allReports);
  348. model.addAttribute("severity2String", ReportUtil.severity2String);
  349. model.addAttribute("recurrent2String", ReportUtil.recurrent2String);
  350. model.addAttribute("reviewMap", ReportUtil.reviewerMap);
  351. model.addAttribute("task", task);
  352. model.addAttribute("examId", examId);
  353. model.addAttribute("caseId", caseId);
  354. return "test";
  355. }
  356. }