AnalyzeService.java 38 KB

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