TaskService.java 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  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.model.CrowdTask;
  11. import com.mooctest.model.Task;
  12. import com.mooctest.util.EncodeUtil;
  13. import com.mooctest.util.TaskUtil;
  14. import com.mooctest.util.TimeUtil;
  15. import org.bson.Document;
  16. import org.springframework.beans.BeanUtils;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.beans.factory.annotation.Value;
  19. import org.springframework.core.io.ByteArrayResource;
  20. import org.springframework.http.*;
  21. import org.springframework.http.converter.HttpMessageConverter;
  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.bind.annotation.RequestParam;
  27. import org.springframework.web.client.RestTemplate;
  28. import org.springframework.web.multipart.MultipartFile;
  29. import java.io.BufferedWriter;
  30. import java.io.File;
  31. import java.io.FileWriter;
  32. import java.io.IOException;
  33. import java.nio.charset.Charset;
  34. import java.nio.charset.StandardCharsets;
  35. import java.util.*;
  36. import java.util.stream.Collectors;
  37. @Service
  38. public class TaskService {
  39. List<Task> tasks = Arrays.asList(
  40. new Task(2613, 1489, "途牛旅游", "/static/images/apps/tuniu.png", "9.56.0", 0, "2018-11-12", "2018-12-20"),
  41. new Task(2613, 1489, "花田小憩", "/static/images/apps/huatianxiaoqi.png", "6.5.0", 1, "2018-10-12", "2018-10-20"),
  42. new Task(2613, 1489, "小猿搜题", "/static/images/apps/xiaoyuansouti.png", "8.5.0", 1, "2018-10-03", "2018-10-15"),
  43. new Task(2613, 1489, "途牛旅游", "/static/images/apps/tuniu.png", "9.50.0", 1, "2018-10-02", "2018-10-12"),
  44. new Task(2613, 1489, "JayMe", "/static/images/apps/JayMe.jpeg", "3.5.8", 1, "2018-10-01", "2018-11-01"),
  45. new Task(2613, 1489, "和苗智家", "/static/images/apps/hemiaozhijia.png", "1.0.8", 1, "2018-09-22", "2018-09-29"),
  46. new Task(2613, 1489, "邻里快讯", "/static/images/apps/linlikuaixun.png", "2.1.3", 1, "2018-09-18", "2018-09-29"),
  47. new Task(2613, 1489, "探记", "/static/images/apps/tanji.png", "4.1.0", 1, "2018-09-13", "2018-09-22"),
  48. new Task(2973, 1717, "月度赛", "/static/images/apps/tanji.png", "4.1.0", 1, "2018-09-13", "2018-09-22")
  49. );
  50. @Autowired
  51. MasterReportDao masterReportDao;
  52. @Autowired
  53. TaskDao taskDao;
  54. @Autowired
  55. CrowdTaskDao crowdTaskDao;
  56. @Autowired
  57. BugReportService bugReportService;
  58. @Autowired
  59. BugDataService bugDataService;
  60. @Autowired
  61. FileService fileService;
  62. @Value("${task.info.addr}")
  63. String taskInfoAddr;
  64. @Value("${task.distribute.url}")
  65. String distributeUrl;
  66. @Value("${report.host}")
  67. String reportHost ;
  68. private final String HTTP = "http://";
  69. // 获得所有任务
  70. public List<TaskDTO> getAllTasks() {
  71. // 传统情况下在java代码里访问restful服务,一般使用Apache的HttpClient。不过此种方法使用起来太过繁琐。
  72. // spring提供了一种简单便捷的模板类来进行操作,这就是RestTemplate。
  73. RestTemplate rt = new RestTemplate();
  74. // springMVC通过StringHttpMessageConverter将Controller的返回对象转为字符串
  75. StringHttpMessageConverter stringHttpMessageConverter=new StringHttpMessageConverter(Charset.forName("UTF-8"));
  76. List<HttpMessageConverter<?>> list=new ArrayList<HttpMessageConverter<?>>();
  77. list.add(stringHttpMessageConverter);
  78. rt.setMessageConverters(list);
  79. // 将获得task字符船以json格式解析
  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);
  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);
  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 createCrowdTest(String file, String fileName, String paperType, Long caseId, String testType, String description, String appName) throws Exception {
  255. MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
  256. params.add("file", file);
  257. params.add("file_name", fileName);
  258. params.add("paper_type", paperType);
  259. params.add("case_id", caseId + "");
  260. params.add("test_type", testType);
  261. params.add("description", description);
  262. params.add("app_name", appName);
  263. RestTemplate restTemplate = new RestTemplate();
  264. restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
  265. ResponseEntity<String> responseEntity = restTemplate.postForEntity
  266. ("http://" + reportHost + "/Bug/api/extra/uploadExamUrl", params, String.class);
  267. if (responseEntity.getStatusCode().equals(HttpStatus.OK)){
  268. fileService.uploadJson(responseEntity.getBody(),caseId);
  269. return caseId;
  270. }else return -1;
  271. }
  272. public String getEncodeTaskReportUrl(long examId,long caseId){
  273. String url = HTTP + reportHost + "/report/detail/" + examId +"/" +caseId +"/userId";
  274. String encodedUrl = EncodeUtil.strConvertBase(url);
  275. return encodedUrl;
  276. }
  277. public TaskDTO getByExamIdAndCaseId(long examId, long caseId) {
  278. TaskDTO taskDefault = new TaskDTO();
  279. taskDefault.setExamId(examId);
  280. taskDefault.setCaseId(caseId);
  281. taskDefault.setName("no name");
  282. List<TaskDTO> tasks = getAllTasks();
  283. TaskDTO taskDTO = tasks.stream().filter(task -> task.getExamId() == examId && task.getCaseId() == caseId).findFirst().orElse(taskDefault);
  284. long totalBugs = bugDataService.getReportNum(examId, caseId);
  285. long undealBugs = 0;
  286. if (totalBugs == 0) {
  287. totalBugs = bugReportService.getAllBugs(taskDTO.getExamId(), taskDTO.getCaseId()).size();
  288. undealBugs = totalBugs;
  289. } else {
  290. undealBugs = bugDataService.getReportUnDealNum(examId, caseId);
  291. }
  292. taskDTO.setNumOfTotalBug(totalBugs);
  293. taskDTO.setNumOfUndeal(undealBugs);
  294. return taskDTO;
  295. }
  296. private long getMaxCaseId(){
  297. List<CrowdTask> list = crowdTaskDao.findAll();
  298. long max =0;
  299. long temp =0;
  300. for(CrowdTask task : list){
  301. temp=Long.parseLong(task.getId());
  302. max=temp>max?temp:max;
  303. }
  304. // CrowdTask task = crowdTaskDao.findFirstByOrderByIdDesc();
  305. return max;
  306. }
  307. public boolean exportTask(String caseId){
  308. MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
  309. params.add("caseId", caseId);
  310. RestTemplate restTemplate = new RestTemplate();
  311. restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
  312. ResponseEntity<String> responseEntity = restTemplate.postForEntity
  313. ("http://" + reportHost + "/Bug/api/data/outputByCaseId", params, String.class);
  314. return responseEntity.getStatusCode().equals(HttpStatus.OK);
  315. }
  316. public boolean importTask(String number,String originId,
  317. MultipartFile zipFile, MultipartFile jsonFile) {
  318. HttpHeaders headers = new HttpHeaders();
  319. MediaType type = MediaType.parseMediaType("multipart/form-data");
  320. // 设置请求的格式类型
  321. headers.setContentType(type);
  322. ByteArrayResource zipFileResource = null;
  323. ByteArrayResource jsonFileResource = null;
  324. try {
  325. zipFileResource= new ByteArrayResource(zipFile.getBytes()) {
  326. @Override
  327. public String getFilename() {
  328. return zipFile.getOriginalFilename();
  329. }
  330. };
  331. jsonFileResource= new ByteArrayResource(jsonFile.getBytes()) {
  332. @Override
  333. public String getFilename() {
  334. return jsonFile.getOriginalFilename();
  335. }
  336. };
  337. }catch (IOException e){
  338. return false;
  339. }
  340. MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
  341. params.add("sourceZipFile", zipFileResource);
  342. params.add("sourceJsonFile", jsonFileResource);
  343. params.add("originalCaseId", originId);
  344. params.add("cpSerialNum", number);
  345. HttpEntity<MultiValueMap<String, Object>> files = new HttpEntity<>(params, headers);
  346. RestTemplate restTemplate = new RestTemplate();
  347. restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
  348. ResponseEntity<String> responseEntity = restTemplate.postForEntity("http://" + reportHost + "/Bug/api/data/inputFromFile", files, String.class);
  349. return responseEntity.getStatusCode().equals(HttpStatus.OK);
  350. }
  351. private static String generatePaperType(String os){
  352. StringBuffer value = new StringBuffer();
  353. if(os==null||os.length()==0){
  354. value.append("\"windows\",\"linux\",\"macos\"");
  355. }else{
  356. String [] data = os.split(";");
  357. for(int i =0;i<data.length;i++){
  358. if(i!=data.length-1){
  359. value.append("\""+data[i]+"\",");
  360. }else{
  361. value.append("\""+data[i]+"\"");
  362. }
  363. }
  364. }
  365. return "{\"title\":\"测试报告名称\",\"subTitles\":[{\"name\":\"设备名称\", \"type\":\"text\"},{\"name\":\"设备品牌\",\"type\":\"text\"},{\"name\":\"操作系统\",\"type\":\"enum\",\"value\":["
  366. +value.toString()
  367. + "]}],\"caseList\":true,\"bugList\": true,\"testScript\":false,\"suppleReport\":false,\"testLog\":false}";
  368. }
  369. public String getTaskDaPanUrl(long taskId,long caseId){
  370. MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
  371. params.add("caseId", caseId+"");
  372. params.add("taskId", taskId+"");
  373. RestTemplate restTemplate = new RestTemplate();
  374. restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
  375. ResponseEntity<String> responseEntity = restTemplate.postForEntity
  376. ("http://" + reportHost + "/Bug/api/analyze/analyse/getTaskToken", params, String.class);
  377. if (responseEntity.getStatusCode().equals(HttpStatus.OK)){
  378. String token = responseEntity.getBody();
  379. return "http://"+reportHost+"/dashboard/#/taskboard?token="+token;
  380. }else return "error";
  381. }
  382. }