AnalyzeService.java 34 KB

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