AnalyzeService.java 34 KB

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