AnalyzeService.java 32 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025
  1. package edu.nju.service;
  2. import java.nio.charset.StandardCharsets;
  3. import java.util.*;
  4. import java.util.stream.Collectors;
  5. import com.google.common.cache.Cache;
  6. import com.google.common.cache.CacheBuilder;
  7. import edu.nju.dao.*;
  8. import edu.nju.entities.*;
  9. import edu.nju.model.*;
  10. import edu.nju.util.HTTP;
  11. import edu.nju.util.TimeUtil;
  12. import org.apache.commons.lang3.EnumUtils;
  13. import org.json.JSONArray;
  14. import org.json.JSONObject;
  15. import org.slf4j.Logger;
  16. import org.slf4j.LoggerFactory;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.beans.factory.annotation.Value;
  19. import org.springframework.http.HttpEntity;
  20. import org.springframework.http.HttpHeaders;
  21. import org.springframework.http.converter.StringHttpMessageConverter;
  22. import org.springframework.stereotype.Service;
  23. import org.springframework.util.LinkedMultiValueMap;
  24. import org.springframework.util.MultiValueMap;
  25. import org.springframework.web.client.RestTemplate;
  26. @Service
  27. public class AnalyzeService {
  28. @Autowired
  29. CTBDao ctbdao;
  30. @Autowired
  31. BugScoreDao bsdao;
  32. @Autowired
  33. BugHistoryDao hdao;
  34. @Autowired
  35. BugMirrorDao mdao;
  36. @Autowired
  37. StuInfoDao studao;
  38. @Autowired
  39. BugDao bdao;
  40. @Autowired
  41. HistoryService hservice;
  42. @Autowired
  43. BugScoreByWorkerDao bugScoreByWorkerDao;
  44. @Autowired
  45. BugSimilarScoreDao bugSimilarScoreDao;
  46. @Autowired
  47. ReportDao reportDao;
  48. @Autowired
  49. TaskDao taskDao;
  50. @Autowired
  51. TestCaseDao testCaseDao;
  52. @Value("${mainsite.url}")
  53. String mainSiteUrl;
  54. @Autowired
  55. ThumsUpDao thumsUpDao;
  56. @Autowired
  57. BugHistoryDao bugHistoryDao;
  58. @Autowired
  59. UserLabelDao userLabelDao;
  60. @Autowired
  61. ExtraService extraService;
  62. Logger logger= LoggerFactory.getLogger(RecommendService.class);
  63. //获取所有bug
  64. public List<String> getValid(String case_take_id) {
  65. List<String> result = new ArrayList<String>();
  66. List<BugMirror> mirrors = mdao.findValid(case_take_id);
  67. for(BugMirror ctb : mirrors) {
  68. result.add(ctb.getId());
  69. }
  70. return result;
  71. }
  72. public List<String> getValidByBugId(String id) {
  73. List<String> result = new ArrayList<String>();
  74. BugMirror bugMirror=mdao.findById(id);
  75. String case_take_id=bugMirror.getCase_take_id();
  76. List<BugMirror> mirrors = mdao.findValid(case_take_id);
  77. for(BugMirror ctb : mirrors) {
  78. result.add(ctb.getId());
  79. }
  80. return result;
  81. }
  82. //获取所有有测试用例的bug
  83. public List<String> getValidTwo(String case_take_id) {
  84. List<String> result = new ArrayList<String>();
  85. List<CaseToBug> lists = ctbdao.findByCase(case_take_id);
  86. for(CaseToBug ctb : lists) {
  87. for(String str: ctb.getBug_id()) {
  88. result.add(str);
  89. }
  90. }
  91. return result;
  92. }
  93. public List<BugDataVO>getBugDataVO(String case_take_id){
  94. List<BugDataVO>result=new ArrayList<>();
  95. List<BugMirror> mirrors = mdao.findValid(case_take_id);
  96. List<Bug>bugs=bdao.findByCaseid(case_take_id);
  97. Map<String,Bug>bugMap=new HashMap<>();
  98. for(Bug bug:bugs){
  99. if(bug!=null){
  100. bugMap.put(bug.getId(),bug);
  101. }
  102. }
  103. for(BugMirror bugMirror : mirrors) {
  104. if(bugMirror!=null){
  105. Bug bug=bugMap.get(bugMirror.getId());
  106. BugHistory bugHistory=hdao.findByid(bugMirror.getId());
  107. if(bug!=null&&bugHistory!=null){
  108. BugSeverity bugSeveritsy=BugSeverity.getValue(2);
  109. String bugSeverity=bugSeveritsy.toString();
  110. BugScore bugScore=bsdao.findById(bug.getId());
  111. int score=bugScore==null?0:bugScore.getGrade();
  112. String reportId=bug.getReport_id();
  113. String workerId=findWorkerId(reportId);
  114. BugDataVO bugDataVO=new BugDataVO(bug.getId(),bug.getBug_category(),bugSeverity,bug.getCreate_time_millis(),bug.getBug_page(),score,bugHistory.getParent(),bugHistory.getChildren(),bugHistory.getRoot(),bugMirror.getGood().size(),bugMirror.getBad().size(),reportId,workerId);
  115. result.add(bugDataVO);
  116. }
  117. }
  118. }
  119. return result;
  120. }
  121. public List<String> getReports(String case_take_id) {
  122. List<String> result = new ArrayList<String>();
  123. List<CaseToBug> lists = ctbdao.findByCase(case_take_id);
  124. for(CaseToBug ctb : lists) {
  125. if(!result.contains(ctb.getReport_id())) {result.add(ctb.getReport_id());}
  126. }
  127. return result;
  128. }
  129. public List<Long> getUsers(String examId) {
  130. List<Long> result = new ArrayList<Long>();
  131. List<Report> reports = reportDao.findByExamId(examId);
  132. for(Report report : reports) {
  133. if(report!=null) {
  134. String workerId=report.getWorker_id();
  135. if(!workerId.equals("")&&!result.contains(workerId))
  136. result.add(Long.parseLong(workerId));
  137. }
  138. }
  139. return result;
  140. }
  141. public int getGrade(String id) {
  142. BugScore bs = bsdao.findById(id);
  143. if(bs != null) {return bs.getGrade();}
  144. return -1;
  145. }
  146. public boolean saveGrade(String id, int grade) {
  147. try {
  148. bsdao.save(new BugScore(id, grade, 0));
  149. return true;
  150. } catch(Exception e) {
  151. return false;
  152. }
  153. }
  154. public BugSimilarScore getSimilarScore(String id) {
  155. BugSimilarScore bss = bugSimilarScoreDao.findById(id);
  156. return bss;
  157. }
  158. public boolean saveGradeByWorker(String id, String workerId, int grade) {
  159. try {
  160. bsdao.save(new BugScore(id, grade, 0));
  161. return true;
  162. } catch(Exception e) {
  163. return false;
  164. }
  165. }
  166. public boolean saveSimiliarGrade(String id, int grade,String similiarBug) {
  167. try {
  168. bugSimilarScoreDao.save(new BugSimilarScore(id, grade, similiarBug));
  169. return true;
  170. } catch(Exception e) {
  171. return false;
  172. }
  173. }
  174. public int mark(String id, Map<String, Integer> grades, BugMirror mirror) {
  175. int mark = 0;
  176. int grade = grades.get(id);
  177. BugHistory history = hdao.findByid(id);
  178. int parent = 0;
  179. if(!history.getParent().equals("null")) {
  180. parent = grades.getOrDefault(history.getParent(), 0);
  181. }
  182. int count = 0;
  183. for(String child : history.getChildren()) {
  184. if(grades.getOrDefault(child, 3) <= 2) {count ++;}
  185. }
  186. switch(grade) {
  187. case 1:
  188. if(parent == 1) {mark += 40;}
  189. else {mark += 100;}
  190. mark += count * 2;
  191. break;
  192. case 2:
  193. if(parent == 1) {break;}
  194. else if(parent == 2) {mark += 40;}
  195. else {mark += 80;}
  196. mark += count * 2;
  197. break;
  198. case 3:
  199. mark += count;
  200. break;
  201. }
  202. if(grade <= 2) {
  203. mark += 2 * (mirror.getGood().size() - mirror.getBad().size());
  204. }
  205. return mark;
  206. }
  207. //todo 搞清楚究竟是通过哪种方式写回主站分数
  208. public JSONArray getScores(String case_take_id) {
  209. // Map<String, Integer> reviewScore = new HashMap<String, Integer>(); //评审他人bug得分
  210. // Map<String, Integer> bugScore = new HashMap<String, Integer>(); //系统或专家评审你的bug得分
  211. // Map<String, Integer> finalScores = new HashMap<String, Integer>(); //计算bug得分
  212. // JSONArray json = new JSONArray();
  213. //
  214. // //获取所有bugID
  215. // List<String> bugIdList = getValid(case_take_id);
  216. // logger.info(String.valueOf(bugIdList.size()));
  217. // //获取bug本身得分
  218. // for(String bugId: bugIdList) {
  219. // BugScore temp = bsdao.findById(bugId);
  220. // if(temp != null) {bugScore.put(bugId, temp.getGrade());}
  221. // else {bugScore.put(bugId, 0);}
  222. // }
  223. //
  224. // //计算树状bug得分
  225. // countScore(case_take_id, finalScores, bugScore);
  226. //
  227. // //计算审查得分
  228. // for(String bug: bugIdList) {
  229. // BugMirror mirror = mdao.findById(bug);
  230. // if(mirror == null) { continue; }
  231. // int grade = bugScore.getOrDefault(bug, 0);
  232. // int thumbsScore=0;
  233. // if(grade>=0&&grade<3){
  234. // thumbsScore=-2;
  235. // }else if(grade<5){
  236. // thumbsScore=-1;
  237. // }else if(grade<8){
  238. // thumbsScore=1;
  239. // }else{
  240. // thumbsScore=2;
  241. // }
  242. // //点赞点踩积分减分
  243. // ThumsUp(thumbsScore,reviewScore,mirror);
  244. // }
  245. // int maxReviewScore=0;
  246. // int maxReportScore=0;
  247. // for(Map.Entry<String, Integer> entry : reviewScore.entrySet()) {
  248. // //审查得分低于零分按零分算
  249. // if(entry.getValue() < 0) { reviewScore.put(entry.getKey(), 0); }
  250. // if(entry.getValue()>maxReviewScore){
  251. // maxReviewScore=entry.getValue();
  252. // }
  253. // }
  254. //
  255. // //将bug得分汇总为report得分
  256. // Map<String, Integer> reportScore = new HashMap<String, Integer>();
  257. // for(String bugId: bugIdList) {
  258. // BugMirror mirror = mdao.findById(bugId);
  259. // if(mirror == null) { continue; }
  260. // String reportId=mirror.getReport_id();
  261. // //出现过bug和bugMirror中没有reportId的问题,需要单独检查
  262. // if(reportId!=null) {
  263. // reportScore.put(reportId, finalScores.getOrDefault(bugId, 0) + reportScore.getOrDefault(reportId, 0));
  264. // if (reportScore.get(reportId) > maxReportScore) {
  265. // maxReportScore = reportScore.get(reportId);
  266. // }
  267. // }
  268. // }
  269. // //确保被除数不为0
  270. // if(maxReportScore==0){
  271. // maxReportScore=1;
  272. // }
  273. // if(maxReviewScore==0){
  274. // maxReviewScore=1;
  275. // }
  276. // //得分要以最高分为满分
  277. // for(Map.Entry<String, Integer> entry : reportScore.entrySet()) {
  278. // JSONObject json_temp = new JSONObject();
  279. // json_temp.put("report_id", entry.getKey());
  280. // json_temp.put("worker_id", findWorkerId(entry.getKey()));
  281. // json_temp.put("名字", report_trans(entry.getKey()));
  282. // json_temp.put("报告得分", (entry.getValue()/maxReportScore)*100);
  283. // json_temp.put("审查得分", (reviewScore.getOrDefault(entry.getKey(), 0)/maxReviewScore)*100);
  284. // json.put(json_temp);
  285. // }
  286. List<Report> reportList=reportDao.findByCaseTakeId(case_take_id);
  287. HashMap<String,Integer> hashMap=new HashMap<>();
  288. int maxScore=0;
  289. for(Report report:reportList){
  290. String workerId=report.getWorker_id();
  291. hashMap.put(workerId,0);
  292. List<Bug> bugList=bdao.findByReport(report.getId(),case_take_id);
  293. // logger.info(String.valueOf(bugList.size()));
  294. for(Bug bug:bugList){
  295. if(bug!=null) {
  296. logger.info(bug.getId());
  297. BugScore bugScore = bsdao.findById(bug.getId());
  298. int score = hashMap.get(workerId);
  299. if (bugScore != null) {
  300. score += bugScore.getGrade();
  301. logger.info(String.valueOf(bugScore.getGrade()));
  302. }
  303. if (score > maxScore) {
  304. maxScore = score;
  305. }
  306. hashMap.put(workerId, score);
  307. }
  308. }
  309. }
  310. logger.info(String.valueOf(maxScore));
  311. JSONArray json = new JSONArray();
  312. for(Map.Entry<String, Integer> entry : hashMap.entrySet()) {
  313. String key=entry.getKey();
  314. int value=entry.getValue();
  315. value=(value*100/maxScore);
  316. JSONObject json_temp = new JSONObject();
  317. json_temp.put("worker_id",key);
  318. json_temp.put("score",value);
  319. json.put(json_temp);
  320. }
  321. //把分写回主站
  322. // logger.info("计算结束");
  323. logger.info(json.toString());
  324. writeScores(case_take_id, json);
  325. return json;
  326. }
  327. public JSONArray getNewScores(JSONArray array) {
  328. if(array == null || array.length() <= 0) { return array; }
  329. for(int i = 0; i < array.length(); i ++) {
  330. JSONObject object = array.getJSONObject(i);
  331. if(object.keySet().size() < 5) { continue; }
  332. object.put("name", object.get("名字"));
  333. object.remove("名字");
  334. int bugScore=Integer.parseInt(object.get("报告得分").toString());
  335. int reviewScore=Integer.parseInt(object.get("审查得分").toString());
  336. double score = bugScore*0.7+reviewScore*0.3;
  337. if(score > 100) { object.put("score", 100); }
  338. else { object.put("score", score); }
  339. object.remove("报告得分");
  340. object.remove("审查得分");
  341. }
  342. return array;
  343. }
  344. //计算点赞得分
  345. private void ThumsUp(int grade, Map<String, Integer> result, BugMirror mirror) {
  346. //给好的点赞加分,点踩减分,不好的反之
  347. for(String report : mirror.getGood()) {
  348. result.put(report, result.getOrDefault(report, 0) + grade);
  349. }
  350. for(String report : mirror.getBad()) {
  351. result.put(report, result.getOrDefault(report, 0) - grade);
  352. }
  353. }
  354. public Map<String, String> getThums(String case_take_id) {
  355. Map<String, String> result = new HashMap<String, String>();
  356. List<String> bugs = getValid(case_take_id);
  357. for(String bug: bugs) {
  358. BugMirror mirror = mdao.findById(bug);
  359. if(mirror.getGood().size() > 0 || mirror.getBad().size() > 0) {
  360. result.put(bug, mirror.getGood().size() + "," + mirror.getBad().size());
  361. }
  362. }
  363. return result;
  364. }
  365. public Map<String, Integer> getBugDetail(String case_take_id) {
  366. Map<String, Integer> page = new HashMap<String, Integer>();
  367. List<String> bugs = getValid(case_take_id);
  368. for(String id : bugs) {
  369. Bug bug = bdao.findByid(id);
  370. page.put(bug.getBug_page(), page.getOrDefault(bug.getBug_page(), 0) + 1);
  371. }
  372. return page;
  373. }
  374. public JSONObject getCaseDetail(String case_take_id) {
  375. JSONObject result = new JSONObject();
  376. Map<String, Integer> kind = new HashMap<String, Integer>();
  377. List<String> bugs = getValid(case_take_id);
  378. for(String id : bugs) {
  379. Bug bug = bdao.findByid(id);
  380. kind.put(bug.getBug_category(), kind.getOrDefault(bug.getBug_category(), 0) + 1);
  381. }
  382. result.put("page", new JSONObject(getBugDetail(case_take_id)));
  383. result.put("category", new JSONObject(kind));
  384. return result;
  385. }
  386. public Map<String, Integer> getAllGrades(String case_take_id) {
  387. Map<String, Integer> result = new HashMap<String, Integer>();
  388. List<BugMirror> mlist = mdao.findByCase(case_take_id);
  389. List<String> idlist = new ArrayList<String>();
  390. for(BugMirror mirror : mlist) {
  391. idlist.add(mirror.getId());
  392. }
  393. List<BugScore> slist = bsdao.findByIds(idlist);
  394. for(BugScore bugscore: slist) {
  395. result.put(bugscore.getId(), bugscore.getGrade());
  396. }
  397. return result;
  398. }
  399. public List<String> getDiff(String case_take_id) {
  400. List<String> bugs = getValid(case_take_id);
  401. bugs.add("split");
  402. for(Map.Entry<String, Integer> entry: getAllGrades(case_take_id).entrySet()) {
  403. if(bugs.contains(entry.getKey())) {bugs.remove(entry.getKey());}
  404. else {bugs.add(entry.getKey());}
  405. }
  406. return bugs;
  407. }
  408. //评价页面获取评分
  409. public List<List<String>> getScores(List<String> ids) {
  410. List<List<String>> result = new ArrayList<List<String>>();
  411. List<BugScore> list = bsdao.findByIds(ids);
  412. for(BugScore bs: list) {
  413. List<String> temp = new ArrayList<String>();
  414. temp.add(bs.getId());
  415. temp.add(Integer.toString(bs.getGrade()));
  416. result.add(temp);
  417. }
  418. return result;
  419. }
  420. //根据树状结构计算分数,会根据fork关系减去父节点的分数
  421. public void countScore(String case_take_id, Map<String, Integer> result, Map<String, Integer> grades) {
  422. List<String> roots = hservice.getRoots(case_take_id);
  423. for(String root : roots) {
  424. List<List<String>> lists = hservice.getDepth(root);
  425. for(List<String> path : lists) {
  426. int max = 0;
  427. for(String id : path) {
  428. int grade = grades.getOrDefault(id, 0);
  429. result.put(id, Math.max(grade - max, 0));
  430. max = Math.max(max, grade);
  431. }
  432. }
  433. }
  434. }
  435. private void writeScores(String case_take_id, JSONArray array) {
  436. // String host = "http://www.mooctest.net";
  437. // String url = "/api/common/uploadCaseScore";
  438. // String[] ids = case_take_id.split("-");
  439. // String param1 = "caseId=" + ids[0] + "&examId=" + ids[1];
  440. // for(int i = 0; i < array.length(); i ++) {
  441. // JSONObject json = (JSONObject)array.get(i);
  442. // String worker_id = json.get("worker_id").toString();
  443. // //报告得分*0.7+审查得分*0.3
  444. //// int bugScore=Integer.parseInt(json.get("报告得分").toString());
  445. //// int reviewScore=Integer.parseInt(json.get("审查得分").toString());
  446. // double score = json.getDouble("score");
  447. // if(worker_id.equals("")) { continue; }
  448. // if(score<0){
  449. // score=0;
  450. // }
  451. // if(score > 100) { score = 100; }
  452. // String param2 = "&userId=" + worker_id + "&score=" + score;
  453. // HTTP.sendPut(host, url, param1 + param2);
  454. // logger.info("---------------");
  455. // logger.info(worker_id);
  456. // }
  457. RestTemplate template = new RestTemplate();
  458. String url = "http://www.test.mooctest.net/api/common/uploadCaseScore";
  459. String[] ids = case_take_id.split("-");
  460. for(int i = 0; i < array.length(); i ++) {
  461. MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<String, Object>();
  462. JSONObject json = (JSONObject)array.get(i);
  463. String worker_id = json.get("worker_id").toString();
  464. paramMap.add("examId", ids[1]);
  465. paramMap.add("caseId", ids[0]);
  466. paramMap.add("userId", worker_id);
  467. paramMap.add("score", json.getDouble("score"));
  468. template.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
  469. HttpHeaders headers = new HttpHeaders();
  470. HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(paramMap, headers);
  471. template.put(url, httpEntity);
  472. logger.info("workerId:" +worker_id);
  473. logger.info("score:" +json.getDouble("score"));
  474. }
  475. }
  476. private String report_trans(String report_id) {
  477. String name = studao.findById(report_id);
  478. if(name == null || name.equals("null")) { return report_id;}
  479. return name;
  480. }
  481. private String findWorkerId(String report_id) {
  482. String workerId = studao.findWorkerId(report_id);
  483. if(workerId == null || workerId.equals("null")) { return "";}
  484. return workerId;
  485. }
  486. public List<Bug> getAfterSimilarBug(String bug_id){
  487. Bug bug =bdao.findByid(bug_id);
  488. List<Bug> bugList=bdao.findByCaseid(bug.getCase_id());
  489. List<Bug> result=new ArrayList<>();
  490. for(Bug tempBug: bugList){
  491. if(Long.parseLong(tempBug.getCreate_time_millis())>Long.parseLong(bug.getCreate_time_millis())){
  492. if(checkSimilarity(bug,tempBug)){
  493. result.add(tempBug);
  494. }
  495. }
  496. }
  497. return result;
  498. }
  499. //todo check similarity
  500. private boolean checkSimilarity(Bug bug1,Bug bug2){
  501. return true;
  502. }
  503. public AnalysePeopleVO getReviewAnalysePeopleVO(String caseId,String taskId,String workerId) {
  504. Task task=taskDao.findById(taskId);
  505. AnalysePeopleVO res = new AnalysePeopleVO();
  506. if(task!=null)res.setTaskName(task.getName());
  507. String caseTakeId = caseId+"-"+taskId;
  508. // 部分数据从主战接口中取得
  509. String result = HTTP.sendGet("http://114.55.91.83:8191/api/user/" + workerId, "");
  510. if (result != null && !result.equals("")) {
  511. JSONObject json = new JSONObject(result);
  512. if (json.has("name") && !json.isNull("name")) {
  513. res.setName(json.getString("name"));
  514. }
  515. if (json.has("school") && !json.isNull("school")) {
  516. res.setSchool( json.getString("school"));
  517. }
  518. if (json.has("province") && !json.isNull("province")) {
  519. res.setProvince(json.getString("province"));
  520. }
  521. if (json.has("city") && !json.isNull("city")) {
  522. res.setCity(json.getString("city"));
  523. }
  524. if (json.has("createTime") && !json.isNull("createTime")) {
  525. res.setRegisterTime(json.getLong("createTime"));
  526. }
  527. if (json.has("photoUrl") && !json.isNull("photoUrl")) {
  528. res.setPhotoUrl(json.getString("photoUrl"));
  529. }
  530. }
  531. //用户lebels
  532. res.setLabels(getUserLabels(workerId));
  533. Report userReport = extraService.findByWorker(caseTakeId,workerId);
  534. List<Bug> bugList = extraService.getBugList(userReport.getId(),caseTakeId);
  535. Collections.sort(bugList, Comparator.comparing(Bug::getCreate_time_millis));
  536. JSONArray array=new JSONArray();
  537. Map<String,Integer> severityCount = new HashMap<>();
  538. int [] severityValueCount = new int[5];
  539. for(Bug bug : bugList){
  540. severityValueCount[bug.getSeverity()]++;
  541. JSONObject object = new JSONObject();
  542. object.put("content",bug.getTitle());
  543. object.put("timestamp", TimeUtil.timestamp2DayHour(bug.getCreate_time_millis()));
  544. array.put(object);
  545. }
  546. int severityMax = Arrays.stream(severityValueCount).max().getAsInt();
  547. for(int i = 0 ;i<severityValueCount.length;i++){
  548. severityCount.put(BugSeverity.getValue(i).toString(),severityValueCount[i]*100/severityMax);
  549. }
  550. res.setFirstActivate(bugList.size()==0?0:Long.parseLong(bugList.get(0).getCreate_time_millis()));
  551. res.setLastActivate(bugList.size()==0?0:Long.parseLong(bugList.get(bugList.size()-1).getCreate_time_millis()));
  552. res.setBugList(bugList);
  553. res.setTimeLine(array);
  554. return res;
  555. }
  556. private void getTimeDistribute(String workerId){
  557. List<Report>reports=reportDao.findReportsByWorker(String.valueOf(workerId));
  558. reports = reports.stream().filter(e->{
  559. return Long.parseLong(e.getCreate_time_millis()) > monthAgoStart(5);
  560. }).collect(Collectors.toList());
  561. List<Bug> bugs = new ArrayList<>();
  562. for(Report report : reports){
  563. bugs.addAll(bdao.findByReport(report.getId(),report.getCase_take_id()));
  564. }
  565. Map<String,Integer> data = new HashMap<>(6);
  566. for(Bug bug : bugs){
  567. }
  568. }
  569. private long monthAgoStart(int offset){
  570. Calendar calendar = Calendar.getInstance();
  571. calendar.set(Calendar.HOUR_OF_DAY, 0);
  572. calendar.set(Calendar.MINUTE, 0);
  573. calendar.set(Calendar.SECOND, 0);
  574. calendar.set(Calendar.MILLISECOND, 0);
  575. calendar.add(Calendar.MONTH, -offset);
  576. calendar.set(Calendar.DAY_OF_MONTH,1);
  577. return calendar.getTimeInMillis();
  578. }
  579. public AnalyseVO getReviewAnalyseVO(String caseId, String taskId){
  580. Task task=taskDao.findById(taskId);
  581. long startTime=0;
  582. long endTime=0;
  583. String taskName="";
  584. double writeMins=0.0;
  585. if(task!=null) {
  586. startTime = task.getStart_time();
  587. endTime = task.getEnd_time();
  588. taskName = task.getName();
  589. writeMins = task.getTotal_mins();
  590. }
  591. String caseTakeId=caseId+"-"+taskId;
  592. List<Bug>bugs=bdao.findByCaseid(caseTakeId);
  593. int bugNum=bugs.size();
  594. List<Report>reports=reportDao.findByCaseTakeId(caseTakeId);
  595. int participateNum=reports.size();
  596. int testCaseNum=0;
  597. for(Report report:reports){
  598. List<TestCase>testCases=testCaseDao.findByReport(report.getId());
  599. if(testCases!=null){
  600. testCaseNum+=testCases.size();
  601. }
  602. }
  603. Map<Integer,Integer>gradeDistribution=new HashMap<>();
  604. Map<String,Integer>workerDistribution=new HashMap<>();
  605. for(Bug bug:bugs){
  606. BugScore bugScore=bsdao.findById(bug.getId());
  607. String reportId=bug.getReport_id();
  608. if(reportId!=null) {
  609. Report report = reportDao.findById(reportId);
  610. if(report !=null) {
  611. String workerId=report.getWorker_id();
  612. if (workerId!=null) {
  613. int grade=0;
  614. if(bugScore!=null) {
  615. grade = bugScore.getGrade();
  616. if (gradeDistribution.containsKey(grade)) {
  617. gradeDistribution.replace(grade, gradeDistribution.get(grade) + 1);
  618. } else {
  619. gradeDistribution.put(grade, 1);
  620. }
  621. }
  622. if (workerDistribution.containsKey(workerId)) {
  623. workerDistribution.replace(workerId, workerDistribution.get(workerId) + grade);
  624. } else {
  625. workerDistribution.put(workerId, grade);
  626. }
  627. }
  628. }
  629. }
  630. }
  631. //分数排序
  632. List<Map.Entry<String, Integer>> list = new ArrayList<>(workerDistribution.entrySet());
  633. Collections.sort(list, new Comparator<Map.Entry<String, Integer>>()
  634. {
  635. @Override
  636. public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2)
  637. {
  638. return o2.getValue().compareTo(o1.getValue());
  639. }
  640. });
  641. List<WorkerVO>workerVOS=new ArrayList<>();
  642. Map<String,Integer>provinceDistribute=new HashMap<>();
  643. for(int i=0;i<list.size();i++) {
  644. String workerId = list.get(i).getKey();
  645. int grade=list.get(i).getValue();
  646. String result = HTTP.sendGet(mainSiteUrl+"/api/user/" + workerId, "");
  647. String name = "";
  648. String school = "";
  649. String province="";
  650. if (result != null && !result.equals("")) {
  651. JSONObject json = new JSONObject(result);
  652. if (json.has("name") && !json.isNull("name")) {
  653. name = json.getString("name");
  654. }
  655. if (json.has("school") && !json.isNull("school")) {
  656. school = json.getString("school");
  657. }
  658. if (json.has("province") && !json.isNull("province")) {
  659. province = json.getString("province");
  660. if(province.endsWith("省")||province.endsWith("市")){
  661. province=province.substring(0,province.length()-1);
  662. }
  663. if (provinceDistribute.containsKey(province)) {
  664. provinceDistribute.replace(province, provinceDistribute.get(province) + 1);
  665. } else {
  666. provinceDistribute.put(province, 1);
  667. }
  668. }
  669. }
  670. WorkerVO workerVO=new WorkerVO(workerId,name,school,grade);
  671. workerVOS.add(workerVO);
  672. }
  673. JSONArray jsonArray=new JSONArray();
  674. for(Map.Entry<String, Integer> entry : provinceDistribute.entrySet()){
  675. String mapKey = entry.getKey();
  676. int mapValue = entry.getValue();
  677. JSONObject jsonObject=new JSONObject();
  678. jsonObject.put("name",mapKey);
  679. jsonObject.put("value",mapValue);
  680. jsonArray.put(jsonObject);
  681. }
  682. AnalyseVO analyseVO=new AnalyseVO(startTime,endTime,taskName,participateNum,bugNum,testCaseNum,gradeDistribution,workerVOS,jsonArray);
  683. return analyseVO;
  684. }
  685. public HistoricalDataVO getHistoricalData(Long workerId, int caseTypeId){
  686. List<Report>reports=reportDao.findReportsByWorker(String.valueOf(workerId));
  687. int reportNum=reports.size();
  688. List<Double>reportScoreList=new ArrayList<>();
  689. double totalScore=0;
  690. int participateSimilarNum=0;
  691. for(Report report:reports){
  692. String reportId=report.getId();
  693. List<String>bugIds=bdao.findByReport(reportId);
  694. double score=0;
  695. for(String bugId:bugIds){
  696. BugScore bugScore=bsdao.findById(bugId);
  697. if(bugScore!=null) {
  698. score += bugScore.getGrade();
  699. }
  700. }
  701. totalScore+=score;
  702. reportScoreList.add(score);
  703. int itemCaseType=1;
  704. String brand=report.getDevice_os();
  705. if(EnumUtils.isValidEnum(WebBrand.class, brand)){
  706. itemCaseType=0;
  707. }
  708. if(itemCaseType==caseTypeId){
  709. participateSimilarNum++;
  710. }
  711. }
  712. HistoricalDataVO historicalDataVO=new HistoricalDataVO(reportNum,reportScoreList,totalScore,participateSimilarNum,reportNum);
  713. return historicalDataVO;
  714. }
  715. /**
  716. * 根据用户信息获取用户的labels
  717. * @param wordkId
  718. * @return
  719. */
  720. private List<String> getUserLabels(String wordkId){
  721. List<UserLabel> labels = userLabelDao.findLabelsByWorkerId(wordkId);
  722. return labels.stream().map(UserLabel::getLabel).collect(Collectors.toList());
  723. }
  724. public AnalyseVO2 getReviewAnalyseVO2(String caseId, String taskId){
  725. // Cache<String,String> cache = CacheBuilder.newBuilder().build();
  726. // cache.put("word","Hello Guava Cache");
  727. // System.out.println(cache.getIfPresent("word"));
  728. Task task=taskDao.findById(taskId);
  729. long startTime=0;
  730. long endTime=0;
  731. String taskName="";
  732. double writeMins=0.0;
  733. if(task!=null) {
  734. startTime = task.getStart_time();
  735. endTime = task.getEnd_time();
  736. taskName = task.getName();
  737. writeMins = task.getTotal_mins();
  738. }
  739. String caseTakeId=caseId+"-"+taskId;
  740. List<Bug>bugs=bdao.findByCaseid(caseTakeId);
  741. int bugNum=bugs.size();
  742. List<Report>reports=reportDao.findByCaseTakeId(caseTakeId);
  743. List<String>reportIds=new ArrayList<>();
  744. int reportNum=reports.size();
  745. int testCaseNum=0;
  746. Map<String,String>reportWorkerMap=new HashMap<>();
  747. for(Report report:reports){
  748. reportIds.add(report.getId());
  749. reportWorkerMap.put(report.getId(),report.getWorker_id());
  750. }
  751. List<TestCase>testCases=testCaseDao.findByReports(reportIds);
  752. testCaseNum+=testCases.size();
  753. List<BugMirror>bugMirrors=mdao.findByCase(caseTakeId);
  754. int likeNum=0;
  755. int dislikeNum=0;
  756. for(BugMirror bugMirror:bugMirrors){
  757. if(bugMirror.getGood()!=null){
  758. likeNum+=bugMirror.getGood().size();
  759. }
  760. if(bugMirror.getBad()!=null){
  761. dislikeNum+=bugMirror.getBad().size();
  762. }
  763. }
  764. List<String>bugIds=new ArrayList<>();
  765. Map<String,String>bugWorkerMap=new HashMap<>();
  766. for(Bug bug:bugs){
  767. bugIds.add(bug.getId());
  768. String reportId=bug.getReport_id();
  769. if(reportId!=null) {
  770. String workerId=reportWorkerMap.get(reportId);
  771. if (workerId!=null) {
  772. bugWorkerMap.put(bug.getId(),workerId);
  773. }
  774. }
  775. }
  776. Map<Integer,Integer>gradeDistribution=new HashMap<>();
  777. Map<String,Integer>workerDistribution=new HashMap<>();
  778. List<BugScore>bugScores=bsdao.findByIds(bugIds);
  779. for(BugScore bugScore:bugScores){
  780. int grade = bugScore.getGrade();
  781. String workerId=bugWorkerMap.get(bugScore.getId());
  782. if(workerId!=null){
  783. if (workerDistribution.containsKey(workerId)) {
  784. workerDistribution.replace(workerId, workerDistribution.get(workerId) + grade);
  785. } else {
  786. workerDistribution.put(workerId, grade);
  787. }
  788. }
  789. if (gradeDistribution.containsKey(grade)) {
  790. gradeDistribution.replace(grade, gradeDistribution.get(grade) + 1);
  791. } else {
  792. gradeDistribution.put(grade, 1);
  793. }
  794. }
  795. int forkNum=0;
  796. List<BugHistory>bugHistories=bugHistoryDao.findBugHistoryList(bugIds);
  797. for(BugHistory bugHistory:bugHistories){
  798. if(bugHistory.getChildren()!=null&&bugHistory.getChildren().size()!=0){
  799. forkNum+=1;
  800. }
  801. }
  802. //分数排序
  803. List<Map.Entry<String, Integer>> list = new ArrayList<>(workerDistribution.entrySet());
  804. Collections.sort(list, new Comparator<Map.Entry<String, Integer>>()
  805. {
  806. @Override
  807. public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2)
  808. {
  809. return o2.getValue().compareTo(o1.getValue());
  810. }
  811. });
  812. List<WorkerVO>workerRank=new ArrayList<>();
  813. Map<String,Integer>provinceDistribute=new HashMap<>();
  814. for(int i=0;i<list.size();i++) {
  815. String workerId = list.get(i).getKey();
  816. int grade=list.get(i).getValue();
  817. String result = HTTP.sendGet("http://114.55.91.83:8191/api/user/" + workerId, "");
  818. String name = "";
  819. String school = "";
  820. String province="";
  821. if (result != null && !result.equals("")) {
  822. JSONObject json = new JSONObject(result);
  823. if (json.has("name") && !json.isNull("name")) {
  824. name = json.getString("name");
  825. }
  826. if (json.has("school") && !json.isNull("school")) {
  827. school = json.getString("school");
  828. }
  829. if (json.has("province") && !json.isNull("province")) {
  830. province = json.getString("province");
  831. if(province.endsWith("省")||province.endsWith("市")){
  832. province=province.substring(0,province.length()-1);
  833. }
  834. if (provinceDistribute.containsKey(province)) {
  835. provinceDistribute.replace(province, provinceDistribute.get(province) + 1);
  836. } else {
  837. provinceDistribute.put(province, 1);
  838. }
  839. }
  840. WorkerVO workerVO=new WorkerVO(workerId,name,school,grade);
  841. workerRank.add(workerVO);
  842. }
  843. }
  844. JSONArray workerDistribute=new JSONArray();
  845. for(Map.Entry<String, Integer> entry : provinceDistribute.entrySet()){
  846. String mapKey = entry.getKey();
  847. int mapValue = entry.getValue();
  848. JSONObject jsonObject=new JSONObject();
  849. jsonObject.put("name",mapKey);
  850. jsonObject.put("value",mapValue);
  851. workerDistribute.put(jsonObject);
  852. }
  853. AnalyseVO2 analyseVO=new AnalyseVO2(likeNum,dislikeNum,forkNum,reportNum,testCaseNum,bugNum,startTime,endTime,reportNum,taskName,workerDistribute,workerRank,gradeDistribution);
  854. return analyseVO;
  855. }
  856. public Map<String,Integer> getPageCover(String taskId,String caseId){
  857. String caseTakeId=caseId+"-"+taskId;
  858. Map<String,Integer>coverMap=getBugDetail(caseTakeId);
  859. List<String>pageStr=getPageStr(caseId);
  860. for(String page:pageStr){
  861. if(!coverMap.containsKey(page)){
  862. coverMap.put(page,0);
  863. }
  864. }
  865. return coverMap;
  866. }
  867. //将三级页面信息的jsonobject转为string
  868. private List<String> getPageStr(String caseId){
  869. List<String>result=new ArrayList<>();
  870. Exam exam=extraService.getExam(String.valueOf(caseId));
  871. JSONArray jsonArray=new JSONArray(exam.getJson());
  872. LinkedList<String> res = new LinkedList<>();
  873. if(jsonArray==null){
  874. return res;
  875. }
  876. for(int i=0;i<jsonArray.length();i++){
  877. JSONObject jsonObject=jsonArray.getJSONObject(i);
  878. if(jsonObject==null||jsonObject.getString("item")==null)
  879. return res;
  880. solve(jsonObject, jsonObject.getString("item")+"-", res);
  881. }
  882. return res;
  883. }
  884. private void solve(JSONObject jsonObject, String cur, LinkedList<String> res) {
  885. if(jsonObject==null||jsonObject.getString("item")==null)
  886. return;
  887. cur+=jsonObject.getString("item");
  888. if (!jsonObject.has("children")||jsonObject.get("children")==null) {
  889. res.add(cur);
  890. } else {
  891. JSONArray jsonArray=jsonObject.getJSONArray("children");
  892. for(int i=0;i<jsonArray.length();i++){
  893. JSONObject jsonObject1=jsonArray.getJSONObject(i);
  894. solve(jsonObject1,cur+"-",res);
  895. }
  896. }
  897. }
  898. public int[][] getBugInfo(String taskId,String caseId){
  899. String caseTakeId=caseId+"-"+taskId;
  900. List<Bug>bugs=bdao.findByCaseid(caseTakeId);
  901. int[][]bugInfo=new int[6][6]; //bug的复现程度和严重程度都为1-5
  902. for(Bug bug:bugs){
  903. int bugSeverity=bug.getSeverity();
  904. int bugRecurrent=bug.getRecurrent();
  905. bugInfo[bugSeverity][bugRecurrent]+=1;
  906. }
  907. return bugInfo;
  908. }
  909. public Map<Integer,Integer> getBugSubmitInfo(String taskId,String caseId,int piece){
  910. Task task=taskDao.findById(taskId);
  911. Map<Integer,Integer>map=new HashMap<>();
  912. long startTime=0;
  913. long endTime=0;
  914. if(task!=null) {
  915. startTime = task.getStart_time();
  916. endTime = task.getEnd_time();
  917. }
  918. long pieceTime=(endTime-startTime)/piece;
  919. String caseTakeId=caseId+"-"+taskId;
  920. List<Bug>bugs=bdao.findByCaseid(caseTakeId);
  921. for(Bug bug:bugs){
  922. long time=Long.parseLong(bug.getCreate_time_millis());
  923. int index=(int)((time-startTime)/pieceTime);
  924. if(map.containsKey(index)){
  925. map.replace(index,map.get(index)+1);
  926. }
  927. else{
  928. map.put(index,1);
  929. }
  930. }
  931. return map;
  932. }
  933. }