AnalyzeService.java 33 KB

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