AnalyzeService.java 37 KB

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