ReportController.java 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  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. bugs.add(masterReport);
  65. supplements.forEach(supplementDTO -> bugs.addAll(supplementDTO.getBugs()));
  66. Collection<BugDTO> distinctBugs = bugs.stream().collect(Collectors.toMap(BugDTO::getId,Function.identity(),(v1,v2)->v1)).values();
  67. // List<BugDTO> sourceReports = distinctBugs.stream().distinct().collect(Collectors.toList());
  68. // 各种类型的报告数量的统计,
  69. Map<String, Long> categoryCounts = distinctBugs.stream().collect(Collectors.groupingBy(BugDTO::getBugCategory, Collectors.counting()));
  70. Map<String, Long> pageCounts = distinctBugs.stream().filter(e->e.getBug_page()!=null).collect(Collectors.groupingBy(BugDTO::getBug_page,Collectors.counting()));
  71. Map<String, Long> recurrentCounts = distinctBugs.stream()
  72. .map(BugDTO::getRecurrent)
  73. .map((recurrentNum) -> ReportUtil.recurrent2String.get(recurrentNum))
  74. .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
  75. Map<String, Long> severityCounts = distinctBugs.stream()
  76. .map(BugDTO::getSeverity)
  77. .map((severityNum) -> ReportUtil.severity2String.get(severityNum))
  78. .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
  79. //得到创建的final report
  80. List<FinalReportDTO> finalReports = finalReportService.getBySourceId(masterId);
  81. Map<String,String> single2rootMap = historyService.getSingle2Root(caseId, examId);
  82. model.addAttribute("single2root",single2rootMap);
  83. // model.addAttribute("wordList", getWordCloudList(sourceReports));
  84. model.addAttribute("categoryCounts", categoryCounts);
  85. model.addAttribute("severityCounts", severityCounts);
  86. model.addAttribute("pageCounts",pageCounts);
  87. model.addAttribute("recurrentCounts",recurrentCounts);
  88. model.addAttribute("aggReportId", "ML-AG-" + masterId.substring(10));
  89. model.addAttribute("masterReport", masterReport);
  90. model.addAttribute("createTime", new Date(Long.parseLong(masterReport.getCreateTimeMillis())));
  91. model.addAttribute("supplements", supplements);
  92. model.addAttribute("finalReports", finalReports);
  93. model.addAttribute("category2String", ReportUtil.category2String);
  94. model.addAttribute("recurrent2String", ReportUtil.recurrent2String);
  95. model.addAttribute("severity2String", ReportUtil.severity2String);
  96. model.addAttribute("examId", examId);
  97. model.addAttribute("caseId", caseId);
  98. // model.addAttribute("show")
  99. model.addAttribute("showReference",true);//是否展示其他聚合报告的参考标签
  100. boolean bugReviewed = bugReviewService.isBugReviewed(masterId);
  101. model.addAttribute("reviewed", bugReviewed);
  102. if (finalReportId != null) {
  103. Optional<FinalReportDTO> finalReportDTO = finalReports.stream().filter(finalReport -> finalReport.getId()==finalReportId).findFirst();
  104. model.addAttribute("finalReportId", finalReportId);
  105. model.addAttribute("editReport", finalReportDTO.get());
  106. }
  107. return "agg_report_new";
  108. }
  109. //part of aggreate report 为了在树状报告页面展示聚合报告信息
  110. @GetMapping(value = "/report_part")
  111. public String showAggrReportPart(@RequestParam("masterId") String masterId,
  112. @RequestParam("examId") long examId,
  113. @RequestParam("caseId") long caseId,
  114. @RequestParam(value = "finalReportId", required = false) Long finalReportId,
  115. Model model) {
  116. Map<String, BugDTO> bugMap = bugReportService.getAllBugsMap(examId, caseId);
  117. BugDTO masterReport = bugMap.get(masterId);
  118. List<SupplementDTO> supplements = supplementService.getSupplementByMasterId(masterId, bugMap);
  119. List<BugDTO> bugs = new LinkedList<>();
  120. supplements.forEach(supplementDTO -> bugs.addAll(supplementDTO.getBugs()));
  121. List<BugDTO> sourceReports = bugs.stream().distinct().collect(Collectors.toList());
  122. Map<String, Long> categoryCounts = sourceReports.stream().collect(Collectors.groupingBy(BugDTO::getBugCategory, Collectors.counting()));
  123. Map<String, Long> pageCounts = sourceReports.stream().collect(Collectors.groupingBy(BugDTO::getBug_page,Collectors.counting()));
  124. Map<String, Long> recurrentCounts = sourceReports.stream()
  125. .map(BugDTO::getRecurrent)
  126. .map((recurrentNum) -> ReportUtil.recurrent2String.get(recurrentNum))
  127. .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
  128. Map<String, Long> severityCounts = sourceReports.stream()
  129. .map(BugDTO::getSeverity)
  130. .map((severityNum) -> ReportUtil.severity2String.get(severityNum))
  131. .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
  132. List<FinalReportDTO> finalReports = finalReportService.getBySourceId(masterId);
  133. Map<String,String> single2rootMap = historyService.getSingle2Root(caseId, examId);
  134. model.addAttribute("single2root",single2rootMap);
  135. // model.addAttribute("wordList", getWordCloudList(sourceReports));
  136. model.addAttribute("categoryCounts", categoryCounts);
  137. model.addAttribute("severityCounts", severityCounts);
  138. model.addAttribute("pageCounts",pageCounts);
  139. model.addAttribute("recurrentCounts",recurrentCounts);
  140. model.addAttribute("aggReportId", "ML-AG-" + masterId.substring(10));
  141. model.addAttribute("masterReport", masterReport);
  142. model.addAttribute("createTime", new Date(Long.parseLong(masterReport.getCreateTimeMillis())));
  143. model.addAttribute("supplements", supplements);
  144. model.addAttribute("finalReports", finalReports);
  145. model.addAttribute("category2String", ReportUtil.category2String);
  146. model.addAttribute("recurrent2String", ReportUtil.recurrent2String);
  147. model.addAttribute("severity2String", ReportUtil.severity2String);
  148. model.addAttribute("examId", examId);
  149. model.addAttribute("caseId", caseId);
  150. model.addAttribute("showReference",false);//是否展示其他聚合报告的参考标签
  151. boolean bugReviewed = bugReviewService.isBugReviewed(masterId);
  152. model.addAttribute("reviewed", bugReviewed);
  153. if (finalReportId != null) {
  154. Optional<FinalReportDTO> finalReportDTO = finalReports.stream().filter(finalReport -> finalReport.getId()==finalReportId).findFirst();
  155. model.addAttribute("finalReportId", finalReportId);
  156. model.addAttribute("editReport", finalReportDTO.get());
  157. }
  158. return "agg_report_new::masterBody";
  159. }
  160. /**
  161. * 单个报告的展示页面,
  162. * @param id
  163. * @param examId
  164. * @param caseId
  165. * @param model
  166. * @return
  167. */
  168. @GetMapping(value = "/report/{id}")
  169. public String showAggrReportTest(@PathVariable("id") String id,
  170. @RequestParam("examId") long examId,
  171. @RequestParam("caseId") long caseId,
  172. Model model) {
  173. BugDTO singleReport = bugReportService.getBugById(id,examId, caseId); // 具体的bug的DTO
  174. MasterReport masterReportSource = masterReportService.getByBugId(id+""); // 找到该报告的master报告报告;
  175. List<FinalReportDTO> finalReports =new ArrayList<>();
  176. Map<String,String> sing2root = historyService.getSingle2Root(caseId, examId);
  177. String treeReportId = sing2root.get(id);
  178. finalReports.addAll(finalReportService.getBySourceId(id));
  179. if(masterReportSource == null){// 如果不存在聚合报告;
  180. model.addAttribute("hasMaster",false);
  181. }else{
  182. model.addAttribute("hasMaster",true);
  183. String masterId = masterReportSource.getMasterId();
  184. addDistinctFinalReport(finalReports,finalReportService.getBySourceId(masterId));
  185. StringBuffer masterName = new StringBuffer("ML-AG-");
  186. masterName.append(masterId.substring(10));
  187. model.addAttribute("masterName",masterName.toString());
  188. StringBuffer masterUrl = new StringBuffer("/report?masterId=");
  189. masterUrl.append(masterId).append("&examId=").append(examId).append("&caseId=").append(caseId);
  190. model.addAttribute("masterUrl",masterUrl.toString());
  191. }
  192. if(treeReportId == null){
  193. //如果不存在树状报告
  194. model.addAttribute("hasTree",false);
  195. }else{
  196. model.addAttribute("hasTree",true);
  197. addDistinctFinalReport(finalReports,finalReportService.getBySourceId(treeReportId));
  198. model.addAttribute("treeName","ML-TR-"+getShortId(treeReportId));
  199. model.addAttribute("treeUrl","/history/report?treeId="+treeReportId+"&examId="+examId+"&caseId="+caseId);
  200. }
  201. model.addAttribute("singleReport",singleReport);
  202. model.addAttribute("reviewed",bugDataService.isReviewed(id));
  203. model.addAttribute("createTime", new Date(Long.parseLong(singleReport.getCreateTimeMillis())));
  204. model.addAttribute("finalReports", finalReports);
  205. model.addAttribute("category2String", ReportUtil.category2String);
  206. model.addAttribute("recurrent2String", ReportUtil.recurrent2String);
  207. model.addAttribute("severity2String", ReportUtil.severity2String);
  208. model.addAttribute("examId", examId);
  209. model.addAttribute("caseId", caseId);
  210. model.addAttribute("reportId",id);
  211. return "single_report";
  212. }
  213. private String getShortId ( String input ){
  214. return input.length()<10?input:input.substring(input.length()-10);
  215. }
  216. @GetMapping("editReportData")
  217. @ResponseBody
  218. public FinalReportDTO getEditReportData(@RequestParam("masterId") String masterId,
  219. @RequestParam(value = "finalReportId", required = false) Long finalReportId,
  220. Model model){
  221. List<FinalReportDTO> finalReports = finalReportService.getBySourceId(masterId);
  222. Optional<FinalReportDTO> finalReportDTO = finalReports.stream().filter(finalReport -> finalReport.getId()==finalReportId).findFirst();
  223. return finalReportDTO.get();
  224. }
  225. //报告列表
  226. @GetMapping("created_reports")
  227. public String getCreatedReports(@RequestParam("masterId") String masterId,
  228. @RequestParam("examId") long examId,
  229. @RequestParam("caseId") long caseId,Model model){
  230. List<FinalReportDTO> finalReports = finalReportService.getBySourceId(masterId);
  231. model.addAttribute("examId", examId);
  232. model.addAttribute("caseId", caseId);
  233. model.addAttribute("finalReports", finalReports);
  234. model.addAttribute("category2String", ReportUtil.category2String);
  235. model.addAttribute("recurrent2String", ReportUtil.recurrent2String);
  236. model.addAttribute("severity2String", ReportUtil.severity2String);
  237. return "agg_report_new::ul_reports";
  238. }
  239. //报告列表
  240. @GetMapping("created_reports_single")
  241. public String getCreatedReportsSingle(@RequestParam("masterId") String masterId,
  242. @RequestParam("examId") long examId,
  243. @RequestParam("caseId") long caseId,Model model){
  244. List<FinalReportDTO> finalReports = finalReportService.getBySourceId(masterId);
  245. model.addAttribute("examId", examId);
  246. model.addAttribute("caseId", caseId);
  247. model.addAttribute("finalReports", finalReports);
  248. model.addAttribute("category2String", ReportUtil.category2String);
  249. model.addAttribute("recurrent2String", ReportUtil.recurrent2String);
  250. model.addAttribute("severity2String", ReportUtil.severity2String);
  251. return "single_report::ul_reports";
  252. }
  253. //创建报告界面
  254. @GetMapping("created_reports_form")
  255. public String getCreatedReportssd(Model model){
  256. model.addAttribute("category2String", ReportUtil.category2String);
  257. model.addAttribute("recurrent2String", ReportUtil.recurrent2String);
  258. model.addAttribute("severity2String", ReportUtil.severity2String);
  259. return "agg_report_new::create_reports";
  260. }
  261. private String getWordCloudList(List<BugDTO> sourceReports) {
  262. Map<String, Integer> wordCount = new HashMap<>();
  263. Set<String> stopWords = new HashSet<>();
  264. try {
  265. File file = ResourceUtils.getFile("classpath:stopwords.txt");
  266. BufferedReader reader = new BufferedReader(new FileReader(file));
  267. String line;
  268. while ((line = reader.readLine()) != null) {
  269. stopWords.add(line.trim());
  270. }
  271. } catch (FileNotFoundException e) {
  272. e.printStackTrace();
  273. } catch (IOException e) {
  274. e.printStackTrace();
  275. }
  276. sourceReports.forEach((bug) -> {
  277. Segment seg = NLPUtil.getDefaultSegment();
  278. List<Term> terms = seg.seg(bug.getDescription());
  279. for (Term term : terms) {
  280. if (stopWords.contains(term.word)) {
  281. continue;
  282. }
  283. if (wordCount.get(term.word) == null) {
  284. wordCount.put(term.word, 1);
  285. continue;
  286. }
  287. int count = wordCount.get(term.word);
  288. wordCount.put(term.word, ++count);
  289. }
  290. });
  291. JSONArray wordList = new JSONArray();
  292. wordCount.forEach((word, count) -> {
  293. if (word.length() > 1) {
  294. JSONObject wordObj = new JSONObject();
  295. wordObj.fluentPut("text", word)
  296. .fluentPut("weight", count * 10);
  297. wordList.add(wordObj);
  298. }
  299. });
  300. return wordList.toJSONString();
  301. }
  302. //审核报告;
  303. @GetMapping(value = "agg_report_list")
  304. public String showAggReportList(@RequestParam("examId") long examId,
  305. @RequestParam("caseId") long caseId,
  306. @RequestParam(value = "status", required = false, defaultValue = "-1") int status,
  307. Model model) {
  308. List<String> masterIds = masterReportService.getAllMasterIdByExamIdAndCaseId(examId, caseId);//get all masterreport id String
  309. List<BugData> bugDatas = bugDataService.getBugDataByIds(masterIds);
  310. Map<String,BugData> bugDataMap = bugDatas.stream().collect(toMap(BugData::getBugId,Function.identity()));
  311. if (status >= 0) {
  312. masterIds = masterIds.stream().filter(masterId -> bugDataMap.get(masterId).getStatus() == status).collect(Collectors.toList());
  313. }
  314. // Map<String, List<String>> master2BugIdsMap = supplementService.getMaster2BugIdsMap(masterIds);
  315. Map<String, List<String>> master2BugIdsMap = masterReportService.getMaster2BugIdsMap(masterIds); // master报告对应的report的列表
  316. Map<String, BugDTO> bugsMap = bugReportService.getAllBugsMap(examId, caseId); //得到所有bug的对应map
  317. // Map<String, List<BugDTO>> masterBugMap = bugReportService.getMasterBugMap(master2BugIdsMap, bugsMap);
  318. TaskDTO task = taskService.getByExamIdAndCaseId(examId, caseId); // 任务情况
  319. masterIds.forEach(masterId -> {
  320. bugsMap.get(masterId).setStatus(bugDataMap.get(masterId).getStatus());
  321. });
  322. model.addAttribute("master2BugIdsMap", master2BugIdsMap);
  323. model.addAttribute("bugMap", bugsMap);
  324. model.addAttribute("examId", examId);
  325. model.addAttribute("caseId", caseId);
  326. model.addAttribute("task", task);
  327. model.addAttribute("aggNum", masterReportService.getAggNum(examId, caseId));
  328. return "agg_report_list";
  329. }
  330. @GetMapping(value = "review_report")
  331. public String showAggReportLisst(@RequestParam("examId") long examId,
  332. @RequestParam("caseId") long caseId,
  333. @RequestParam(value = "status", required = false, defaultValue = "-1") int status,
  334. Model model) {
  335. boolean aggregated = masterReportService.isAggregated(examId, caseId);
  336. List<BugDTO> allReports = bugReportService.getAllBugs(examId, caseId);
  337. TaskDTO task = taskService.getByExamIdAndCaseId(examId, caseId);
  338. List<String> treeRootids = historyService.getTreeRoots(caseId+"-"+examId);
  339. Map<String,List<String>> tree2BugIdsMap = historyService.getTree2BugIdsMap(treeRootids);
  340. Map<String,String> single2rootMap = historyService.getSingle2Root(caseId, examId);
  341. Map<String , BugData> bugIds2Data = bugDataService.bugId2BugData(examId,caseId) ;
  342. Map<String, BugDTO> bugsMap = bugReportService.getAllBugsMap(examId, caseId);
  343. List<String> bugIds = allReports.stream().map(BugDTO::getId).collect(Collectors.toList());
  344. if (aggregated) { // 如果报告已经是聚合过的。
  345. List<MasterReport> mrs = masterReportService.getByBugIds(bugIds);
  346. Map<String, MasterReport> mrMap = mrs.stream().collect(toMap(MasterReport::getBugId, Function.identity()));
  347. allReports.forEach(bug -> {
  348. bug.setMasterId(mrMap.get(bug.getId()).getMasterId());
  349. });
  350. List<String> masterIds = masterReportService.getAllMasterIdByExamIdAndCaseId(examId, caseId);
  351. List<MasterReport> mrs0 = masterReportService.getByBugIds(masterIds);
  352. Map<String, MasterReport> mrMap0 = mrs0.stream().collect(toMap(MasterReport::getBugId, Function.identity()));
  353. if (status >= 0) {
  354. masterIds = masterIds.stream().filter(masterId -> mrMap0.get(masterId).getStatus() == status).collect(Collectors.toList());
  355. }
  356. Map<String, List<String>> master2BugIdsMap = masterReportService.getMaster2BugIdsMap(masterIds);
  357. model.addAttribute("master2BugIdsMap", master2BugIdsMap); // 聚合才有的
  358. model.addAttribute("aggNum", masterReportService.getAggNum(examId, caseId)); // 聚合才有的
  359. }
  360. bugIds.forEach(id -> {
  361. bugsMap.get(id).setStatus(bugIds2Data.get(id).getStatus());
  362. });
  363. allReports.forEach(bug -> {
  364. bug.setStatus(bugIds2Data.get(bug.getId()).getStatus());
  365. bug.setReviewerId(bugIds2Data.get(bug.getId()).getReviewerId());
  366. String te = single2rootMap.get(bug.getId());
  367. bug.setTreeId(te==null?"null":te);
  368. });
  369. model.addAttribute("bugMap", bugsMap);// 聚合才有de
  370. model.addAttribute("treeNum",treeRootids.size());
  371. model.addAttribute("tree2BugIdsMap",tree2BugIdsMap);
  372. model.addAttribute("aggregated", aggregated);
  373. model.addAttribute("allReports", allReports);
  374. model.addAttribute("severity2String", ReportUtil.severity2String);
  375. model.addAttribute("recurrent2String", ReportUtil.recurrent2String);
  376. model.addAttribute("reviewMap", ReportUtil.reviewerMap);
  377. model.addAttribute("task", task);
  378. model.addAttribute("examId", examId);
  379. model.addAttribute("caseId", caseId);
  380. return "all_review_report";
  381. }
  382. private void addDistinctFinalReport( List<FinalReportDTO>source , List<FinalReportDTO> adds ){
  383. List<FinalReportDTO> shouldAdds = new ArrayList<>();
  384. for(FinalReportDTO d : adds){
  385. boolean flag = true;
  386. for(FinalReportDTO x : source){
  387. if( x.getId() == d.getId()){
  388. flag = false;
  389. break ;
  390. }
  391. }
  392. if(flag){
  393. shouldAdds.add(d);
  394. }
  395. }
  396. source.addAll(shouldAdds);
  397. }
  398. }