AnalyzeService.java 33 KB

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