TaskService.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. package com.mooctest.service;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONArray;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.mooctest.dao.MasterReportDao;
  6. import com.mooctest.dao.TaskDao;
  7. import com.mooctest.dao2.CrowdTaskDao;
  8. import com.mooctest.data.SimpleResponse;
  9. import com.mooctest.data.TaskDTO;
  10. import com.mooctest.data.enums.CollaborativeType;
  11. import com.mooctest.model.CrowdTask;
  12. import com.mooctest.model.Task;
  13. import com.mooctest.util.EncodeUtil;
  14. import com.mooctest.util.TimeUtil;
  15. import org.springframework.beans.BeanUtils;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.beans.factory.annotation.Value;
  18. import org.springframework.core.io.ByteArrayResource;
  19. import org.springframework.http.*;
  20. import org.springframework.http.converter.HttpMessageConverter;
  21. import org.springframework.http.converter.StringHttpMessageConverter;
  22. import org.springframework.stereotype.Service;
  23. import org.springframework.util.LinkedMultiValueMap;
  24. import org.springframework.util.MultiValueMap;
  25. import org.springframework.web.client.RestTemplate;
  26. import org.springframework.web.multipart.MultipartFile;
  27. import java.io.IOException;
  28. import java.nio.charset.Charset;
  29. import java.nio.charset.StandardCharsets;
  30. import java.util.*;
  31. import java.util.stream.Collectors;
  32. @Service
  33. public class TaskService {
  34. List<Task> tasks = Arrays.asList(
  35. new Task(2613, 1489, "途牛旅游", "/static/images/apps/tuniu.png", "9.56.0", 0, "2018-11-12", "2018-12-20"),
  36. new Task(2613, 1489, "花田小憩", "/static/images/apps/huatianxiaoqi.png", "6.5.0", 1, "2018-10-12", "2018-10-20"),
  37. new Task(2613, 1489, "小猿搜题", "/static/images/apps/xiaoyuansouti.png", "8.5.0", 1, "2018-10-03", "2018-10-15"),
  38. new Task(2613, 1489, "途牛旅游", "/static/images/apps/tuniu.png", "9.50.0", 1, "2018-10-02", "2018-10-12"),
  39. new Task(2613, 1489, "JayMe", "/static/images/apps/JayMe.jpeg", "3.5.8", 1, "2018-10-01", "2018-11-01"),
  40. new Task(2613, 1489, "和苗智家", "/static/images/apps/hemiaozhijia.png", "1.0.8", 1, "2018-09-22", "2018-09-29"),
  41. new Task(2613, 1489, "邻里快讯", "/static/images/apps/linlikuaixun.png", "2.1.3", 1, "2018-09-18", "2018-09-29"),
  42. new Task(2613, 1489, "探记", "/static/images/apps/tanji.png", "4.1.0", 1, "2018-09-13", "2018-09-22"),
  43. new Task(2973, 1717, "月度赛", "/static/images/apps/tanji.png", "4.1.0", 1, "2018-09-13", "2018-09-22")
  44. );
  45. @Autowired
  46. MasterReportDao masterReportDao;
  47. @Autowired
  48. TaskDao taskDao;
  49. @Autowired
  50. CrowdTaskDao crowdTaskDao;
  51. @Autowired
  52. BugReportService bugReportService;
  53. @Autowired
  54. BugDataService bugDataService;
  55. @Autowired
  56. FileService fileService;
  57. @Autowired
  58. ConfigurationService configurationService;
  59. @Value("${baseUrl.taskDistribute}")
  60. String distributeUrl;
  61. @Value("${baseUrl.report.host}")
  62. String reportHost ;
  63. private final String HTTP = "http://";
  64. /**
  65. * 获得所有任务
  66. * @return
  67. */
  68. public List<TaskDTO> getAllTasks() {
  69. // 传统情况下在java代码里访问restful服务,一般使用Apache的HttpClient。不过此种方法使用起来太过繁琐。
  70. // spring提供了一种简单便捷的模板类来进行操作,这就是RestTemplate。
  71. RestTemplate rt = new RestTemplate();
  72. // springMVC通过StringHttpMessageConverter将Controller的返回对象转为字符串
  73. StringHttpMessageConverter stringHttpMessageConverter=new StringHttpMessageConverter(Charset.forName("UTF-8"));
  74. List<HttpMessageConverter<?>> list=new ArrayList<HttpMessageConverter<?>>();
  75. list.add(stringHttpMessageConverter);
  76. rt.setMessageConverters(list);
  77. // 将获得task字符串以json格式解析
  78. String taskInfoAddr = HTTP + reportHost + "/Bug/api/extra/getExamList";
  79. System.out.println("taskInfoAddr:" + taskInfoAddr);
  80. JSONObject tasksJson = JSON.parseObject(rt.getForObject(taskInfoAddr, String.class));
  81. // 获得tasksJson中的“data”字段的迭代器
  82. ListIterator<Object> tasksIter = tasksJson.getJSONArray("data").listIterator();
  83. // 新建TaskDTO队列,TaskDTO没有持久化处理
  84. List<TaskDTO> dtos = new ArrayList<>();
  85. // 遍历taskJson中“data“
  86. while (tasksIter.hasNext()) {
  87. // 获得每个”data“对象
  88. JSONObject taskInfo = (JSONObject) tasksIter.next();
  89. TaskDTO dto = new TaskDTO();
  90. // 将获得的每个taskJson的exam_id,case_id,name赋给taskdto
  91. dto.setExamId(Long.parseLong(taskInfo.getString("task_id")));
  92. dto.setCaseId(Long.parseLong(taskInfo.getString("case_id")));
  93. dto.setName(taskInfo.getString("name"));
  94. // 将taskdto加入taskdtos队列
  95. dtos.add(dto);
  96. }
  97. // return中是给taskDTO各个属性赋值的过程
  98. return dtos.stream()
  99. .map(taskDTO -> {
  100. // 获得报告数量
  101. long totalBugs = bugDataService.getReportNum(taskDTO.getExamId(),taskDTO.getCaseId());
  102. // 设没有处理的Bug数为0
  103. long undealBugs = 0;
  104. // 如果总Bug报告数为0(没有初始化),将没有处理的报告数设置为报告总数
  105. if (totalBugs == 0) {
  106. totalBugs = bugReportService.getAllBugs(taskDTO.getExamId(), taskDTO.getCaseId()).size();
  107. undealBugs = totalBugs;
  108. } else {
  109. // 否则将获得没有处理的报告数
  110. undealBugs = bugDataService.getReportUnDealNum(taskDTO.getExamId(),taskDTO.getCaseId());
  111. }
  112. // 给taskDTO的总bug数和为处理的bug数赋值
  113. taskDTO.setNumOfTotalBug(totalBugs);
  114. taskDTO.setNumOfUndeal(undealBugs);
  115. return taskDTO;
  116. }).sorted(Comparator.comparing(TaskDTO::getExamId).reversed())
  117. .collect(Collectors.toList());
  118. }
  119. // 在本地获得task方法
  120. public List<TaskDTO> findTask() {
  121. List<TaskDTO> taskDTOs = new ArrayList<>();
  122. List<Task> tasks = taskDao.findAll();
  123. for (Task task: tasks) {
  124. TaskDTO taskDTO = TaskDTO.builder().examId((long) task.getTaskId()).caseId( (long) task.getCaseId()).name(task.getName()).build();
  125. taskDTOs.add(taskDTO);
  126. }
  127. return taskDTOs.stream()
  128. .map(taskDTO -> {
  129. // 获得报告数量
  130. long totalBugs = bugDataService.getReportNum(taskDTO.getExamId(),taskDTO.getCaseId());
  131. // 设没有处理的Bug数为0
  132. long undealBugs = 0;
  133. // 如果总Bug报告数为0(没有初始化),将没有处理的报告数设置为报告总数
  134. if (totalBugs == 0) {
  135. totalBugs = bugReportService.getAllBugs(taskDTO.getExamId(), taskDTO.getCaseId()).size();
  136. undealBugs = totalBugs;
  137. } else {
  138. // 否则将获得没有处理的报告数
  139. undealBugs = bugDataService.getReportUnDealNum(taskDTO.getExamId(),taskDTO.getCaseId());
  140. }
  141. // 给taskDTO的总bug数和为处理的bug数赋值
  142. taskDTO.setNumOfTotalBug(totalBugs);
  143. taskDTO.setNumOfUndeal(undealBugs);
  144. return taskDTO;
  145. }).sorted(Comparator.comparing(TaskDTO::getExamId).reversed())
  146. .collect(Collectors.toList());
  147. }
  148. public List<TaskDTO> getAllTasks2() {
  149. return tasks.stream()
  150. .map(task -> {
  151. TaskDTO taskDTO = new TaskDTO();
  152. BeanUtils.copyProperties(task, taskDTO);
  153. return taskDTO;
  154. })
  155. .map(taskDTO -> {
  156. if (taskDTO.getName().equals("途牛旅游") && taskDTO.getVersion().equals("9.56.0")) {
  157. long totalBugs = bugDataService.getReportNum(taskDTO.getExamId(),taskDTO.getCaseId());
  158. long undealBugs = 0;
  159. if (totalBugs == 0) {
  160. totalBugs = bugReportService.getAllBugs(taskDTO.getExamId(), taskDTO.getCaseId()).size();
  161. undealBugs = totalBugs;
  162. } else {
  163. undealBugs = bugDataService.getReportUnDealNum(taskDTO.getExamId(),taskDTO.getCaseId());
  164. }
  165. taskDTO.setNumOfTotalBug(totalBugs);
  166. taskDTO.setNumOfUndeal(undealBugs);
  167. } else {
  168. Random r = new Random();
  169. int n = r.nextInt(100)%(100-20+1) + 20;
  170. taskDTO.setNumOfTotalBug(n * 10);
  171. taskDTO.setNumOfUndeal(0);
  172. }
  173. return taskDTO;
  174. }).sorted(Comparator.comparing(TaskDTO::getStatus))
  175. .collect(Collectors.toList());
  176. }
  177. public JSONObject getAllTaskDashboard (long caseId,long taskId){
  178. RestTemplate template = new RestTemplate();
  179. String url = HTTP+reportHost+"/Bug/api/analyze/analyseExam";
  180. MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<String, Object>();
  181. paramMap.add("caseId", caseId);
  182. paramMap.add("taskId", taskId);
  183. template.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
  184. HttpHeaders headers = new HttpHeaders();
  185. HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(paramMap,headers);
  186. ResponseEntity<String> response2 = template.postForEntity(url, httpEntity, String.class);
  187. JSONObject tasksJson = JSON.parseObject(response2.getBody());
  188. tasksJson.put("taskName","第一次众测测试");
  189. tasksJson.put("startTime", TimeUtil.timestamp2strSimple(tasksJson.get("startTime").toString()));
  190. tasksJson.put("endTime", TimeUtil.timestamp2strSimple(tasksJson.get("endTime").toString()));
  191. tasksJson.put("gradeArray" , getGradeInt(tasksJson.getJSONObject("gradeDistrubute")));
  192. return tasksJson;
  193. }
  194. public boolean distribute(String examId,String caseId){
  195. RestTemplate template = new RestTemplate();
  196. String url = distributeUrl+"team/dopreteam";
  197. JSONObject vo = new JSONObject();
  198. vo.fluentPut("clusterNum",4); // 默认大小
  199. vo.fluentPut("peopleSizeInTeam",4); // 默认大小
  200. JSONObject exam = new JSONObject();
  201. TaskDTO task = getByExamIdAndCaseId(Long.parseLong(examId),Long.parseLong(caseId));
  202. exam.fluentPut("beginTime",TimeUtil.timestampTo24format(Long.parseLong(task.getStartTime())));
  203. exam.fluentPut("endTime",TimeUtil.timestampTo24format(Long.parseLong(task.getEndTime())));
  204. exam.fluentPut("caseTakeId",examId + "-" + caseId);
  205. exam.fluentPut("caseTypeId",1); // 默认是app类型的
  206. exam.fluentPut("state",0); // 有默认值无需传
  207. exam.fluentPut("groupId",30); // 需要从前端获取
  208. exam.fluentPut("id",0);
  209. vo.fluentPut("exam",exam);
  210. template.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
  211. HttpHeaders headers = new HttpHeaders();
  212. HttpEntity<String> entity = new HttpEntity<String>(vo.toJSONString(),headers);
  213. ResponseEntity<String> response2 = template.postForEntity(url, entity, String.class);
  214. JSONArray tasksJson = JSON.parseArray(response2.getBody());
  215. return tasksJson != null;
  216. }
  217. private int [] getGradeInt(JSONObject jsonObject){
  218. int [] res = new int[11];
  219. // for (int i = 0 ; i < 11 ; i++ ){
  220. // res[i] = Integer.parseInt(jsonObject.get(i+"").toString());
  221. // }
  222. Iterator<String> sIterator = jsonObject.keySet().iterator();
  223. while(sIterator.hasNext()){
  224. // 获得key
  225. String key = sIterator.next();
  226. // 根据key获得value, value也可以是JSONObject,JSONArray,使用对应的参数接收即可
  227. String value = jsonObject.getString(key);
  228. res[Integer.valueOf(key)]+=Integer.getInteger(value);
  229. }
  230. return res;
  231. }
  232. public String addCrowdTaskPure(String name,String description,String time,String type,MultipartFile threePage){
  233. if(threePage ==null || threePage.isEmpty()) return "请提交三级页面";
  234. String threePageUrl = fileService.uploadFile(threePage);
  235. try {
  236. long flag = createCrowdTest(threePageUrl,threePage.getOriginalFilename(),"",getMaxCaseId()+1,type,description,name, CollaborativeType.IS_COLLABORATIVE.getId());
  237. return flag!=-1 ?""+flag:"创建失败";
  238. } catch (Exception e) {
  239. e.printStackTrace();
  240. return "创建众测失败";
  241. }
  242. }
  243. public SimpleResponse addCrowdTask(String name, String description, String os, MultipartFile threePage){
  244. if(threePage ==null || threePage.isEmpty()) return new SimpleResponse(400,"请提交三级页面");
  245. String threePageUrl = fileService.uploadFile(threePage);
  246. try {
  247. long flag = createCrowdTest(threePageUrl,threePage.getOriginalFilename(),generatePaperType(os),getMaxCaseId()+1,"",description,name, CollaborativeType.IS_COLLABORATIVE.getId());
  248. return flag!=-1 ?new SimpleResponse(200,"创建成功,id为"+flag):new SimpleResponse(400,"创建失败");
  249. } catch (Exception e) {
  250. e.printStackTrace();
  251. return new SimpleResponse(400,"创建众测失败");
  252. }
  253. }
  254. public long addCrowdTaskDefault(String name, String description, String os, String threePageUrl, String fileName, int collaborativeType){
  255. // 不进行上传是否存在问题
  256. // String threePageUrl = fileService.uploadFile(threePage);
  257. try {
  258. long caseId = createCrowdTest(threePageUrl,fileName,generatePaperType(os),getMaxCaseId()+1,"",description,name, collaborativeType);
  259. return caseId;
  260. } catch (Exception e) {
  261. e.printStackTrace();
  262. return -1;
  263. }
  264. }
  265. public long createCrowdTest(String file, String fileName, String paperType, Long caseId, String testType, String description, String appName, int collaborativeType) throws Exception {
  266. MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
  267. params.add("file", file);
  268. params.add("file_name", fileName);
  269. params.add("paper_type", paperType);
  270. params.add("case_id", caseId + "");
  271. params.add("test_type", testType);
  272. params.add("description", description);
  273. params.add("app_name", appName);
  274. params.add("collaborative_type", collaborativeType + "");
  275. RestTemplate restTemplate = new RestTemplate();
  276. restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
  277. ResponseEntity<String> responseEntity = restTemplate.postForEntity
  278. ("http://" + reportHost + "/Bug/api/extra/uploadExamUrl", params, String.class);
  279. // System.out.println(responseEntity.getStatusCode());
  280. if (responseEntity.getStatusCode().equals(HttpStatus.OK)){
  281. fileService.uploadJson(responseEntity.getBody(),caseId);
  282. return caseId;
  283. }else {
  284. return -1;
  285. }
  286. }
  287. public String getEncodeTaskReportUrl(long examId,long caseId){
  288. // String url = HTTP + reportHost + "/report/detail/" + examId +"/" +caseId +"/userId";
  289. String url = HTTP + "127.0.0.1:5555/report/detail/" + examId +"/" +caseId +"/userId";
  290. String encodedUrl = EncodeUtil.strConvertBase(url);
  291. return encodedUrl;
  292. }
  293. public String getTaskReportUrl(long examId,long caseId){
  294. // 修改
  295. // return HTTP + reportHost + "/report/detail/" + examId +"/" +caseId +"/userId";
  296. return HTTP + "127.0.0.1:5555/report/detail/" + examId +"/" +caseId +"/userId";
  297. }
  298. public TaskDTO getByExamIdAndCaseId(long examId, long caseId) {
  299. TaskDTO taskDefault = new TaskDTO();
  300. taskDefault.setExamId(examId);
  301. taskDefault.setCaseId(caseId);
  302. taskDefault.setName("no name");
  303. List<TaskDTO> tasks = getAllTasks();
  304. TaskDTO taskDTO = tasks.stream().filter(task -> task.getExamId() == examId && task.getCaseId() == caseId).findFirst().orElse(taskDefault);
  305. long totalBugs = bugDataService.getReportNum(examId, caseId);
  306. long undealBugs = 0;
  307. if (totalBugs == 0) {
  308. totalBugs = bugReportService.getAllBugs(taskDTO.getExamId(), taskDTO.getCaseId()).size();
  309. undealBugs = totalBugs;
  310. } else {
  311. undealBugs = bugDataService.getReportUnDealNum(examId, caseId);
  312. }
  313. taskDTO.setNumOfTotalBug(totalBugs);
  314. taskDTO.setNumOfUndeal(undealBugs);
  315. return taskDTO;
  316. }
  317. private long getMaxCaseId(){
  318. List<CrowdTask> list = crowdTaskDao.findAll();
  319. long max =0;
  320. long temp =0;
  321. for(CrowdTask task : list){
  322. temp=Long.parseLong(task.getId());
  323. max=temp>max?temp:max;
  324. }
  325. // CrowdTask task = crowdTaskDao.findFirstByOrderByIdDesc();
  326. return max;
  327. }
  328. public boolean exportTask(String caseId){
  329. MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
  330. params.add("caseId", caseId);
  331. RestTemplate restTemplate = new RestTemplate();
  332. restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
  333. ResponseEntity<String> responseEntity = restTemplate.postForEntity
  334. ("http://" + reportHost + "/Bug/api/data/outputByCaseId", params, String.class);
  335. return responseEntity.getStatusCode().equals(HttpStatus.OK);
  336. }
  337. public boolean importTask(String number,String originId,
  338. MultipartFile zipFile, MultipartFile jsonFile) {
  339. HttpHeaders headers = new HttpHeaders();
  340. MediaType type = MediaType.parseMediaType("multipart/form-data");
  341. // 设置请求的格式类型
  342. headers.setContentType(type);
  343. ByteArrayResource zipFileResource = null;
  344. ByteArrayResource jsonFileResource = null;
  345. try {
  346. zipFileResource= new ByteArrayResource(zipFile.getBytes()) {
  347. @Override
  348. public String getFilename() {
  349. return zipFile.getOriginalFilename();
  350. }
  351. };
  352. jsonFileResource= new ByteArrayResource(jsonFile.getBytes()) {
  353. @Override
  354. public String getFilename() {
  355. return jsonFile.getOriginalFilename();
  356. }
  357. };
  358. }catch (IOException e){
  359. return false;
  360. }
  361. MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
  362. params.add("zipFile", zipFileResource);
  363. params.add("jsonFile", jsonFileResource);
  364. params.add("originalCaseId", originId);
  365. params.add("cpSerialNum", number);
  366. HttpEntity<MultiValueMap<String, Object>> files = new HttpEntity<>(params, headers);
  367. RestTemplate restTemplate = new RestTemplate();
  368. restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
  369. ResponseEntity<String> responseEntity = restTemplate.postForEntity("http://" + reportHost + "/Bug/api/data/inputFromFile", files, String.class);
  370. return responseEntity.getStatusCode().equals(HttpStatus.OK);
  371. }
  372. private static String generatePaperType(String os){
  373. StringBuffer value = new StringBuffer();
  374. if(os==null||os.length()==0){
  375. value.append("\"windows\",\"linux\",\"macos\"");
  376. }else{
  377. String [] data = os.split(";");
  378. for(int i =0;i<data.length;i++){
  379. if(i!=data.length-1){
  380. value.append("\""+data[i]+"\",");
  381. }else{
  382. value.append("\""+data[i]+"\"");
  383. }
  384. }
  385. }
  386. return "{\"title\":\"测试报告名称\",\"subTitles\":[{\"name\":\"设备名称\", \"type\":\"text\"},{\"name\":\"设备品牌\",\"type\":\"text\"},{\"name\":\"操作系统\",\"type\":\"enum\",\"value\":["
  387. +value.toString()
  388. + "]}],\"caseList\":true,\"bugList\": true,\"testScript\":false,\"suppleReport\":false,\"testLog\":false}";
  389. }
  390. public String getTaskDaPanUrl(long taskId,long caseId){
  391. // return "test";
  392. MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
  393. params.add("caseId", caseId+"");
  394. params.add("taskId", taskId+"");
  395. RestTemplate restTemplate = new RestTemplate();
  396. restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
  397. ResponseEntity<String> responseEntity = restTemplate.postForEntity
  398. ("http://" + reportHost + "/Bug/api/analyze/analyse/getTaskToken", params, String.class);
  399. if (responseEntity.getStatusCode().equals(HttpStatus.OK)){
  400. String token = responseEntity.getBody();
  401. return "http://"+reportHost+"/dashboard/#/taskboard?token="+token;
  402. }else return "error";
  403. }
  404. }