AnalyzeService.java 31 KB

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