package cn.seecoder.data.server.schedule; import cn.seecoder.data.server.domain.CoderDao; import cn.seecoder.data.server.dto.coder.CoderDto; import cn.seecoder.data.server.dto.coder.Response; import cn.seecoder.data.server.repository.CoderRepository; import cn.seecoder.data.server.service.ExtractionLogService; import cn.seecoder.data.server.utils.aspects.dataExtraction.DataExtractor; import cn.seecoder.data.server.utils.enums.ErrorCodeEnum; import cn.seecoder.data.server.utils.exception.GlobalException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.client.RestTemplate; import java.time.LocalDateTime; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; @Component public class CoderSchedule { @Value("${remoteUrls.coder}") private String coderBaseUrl; @Autowired private ExtractionLogService extractionLogService; @Autowired private CoderRepository coderRepository; @Autowired private RestTemplate restTemplate; private final String source1 = "coder1"; // @Scheduled(cron = "00 00 00 * * ?") @DataExtractor(source1) @Transactional(rollbackFor = Exception.class) public void coderDataExtraction() throws Exception { LocalDateTime start = extractionLogService.getExtractionStartTime(source1,1); LocalDateTime middle = extractionLogService.getExtractionStartTime(source1); LocalDateTime end = extractionLogService.getExtractionEndTime(source1); Map param1 = new HashMap<>(); param1.put("startTime",start.toString()); param1.put("endTime",middle.toString()); System.out.println(param1); Map param2 = new HashMap<>(); param2.put("startTime",middle.toString()); param2.put("endTime",end.toString()); System.out.println(param2); String coderApi1 = "/xxx?startTime={startTime}&endTime={endTime}"; String url = coderBaseUrl + coderApi1; ParameterizedTypeReference>> responseType = new ParameterizedTypeReference>>() {}; //再pull一次上次pull的时间段的数据,将一些遗漏的数据存入数据库 List source = getCoderApi1Data(url,param1,responseType); source.forEach(data -> { CoderDao coderDao = coderRepository.findCoderDaoByRecordIdAndSubmitAt(data.getRecordId(),data.getSubmitAt()); if (coderDao == null) { coderRepository.save(coderDtoAndDaoMapper(data)); } }); //pull本次的数据 List source2 = getCoderApi1Data(url,param2,responseType); source2.forEach(data -> { coderRepository.save(coderDtoAndDaoMapper(data)); }); } private List getCoderApi1Data(String url1,Map params,ParameterizedTypeReference>> responseType) throws Exception { ResponseEntity>> r = restTemplate.exchange(url1, HttpMethod.GET,null,responseType,params ); Response> body = r.getBody(); if (body == null || body.getCode()!=200) throw new GlobalException(ErrorCodeEnum.SERVICE_ERROR_C0002); List source = body.getSource(); if(source == null || source.size()==0) throw new GlobalException(ErrorCodeEnum.SERVICE_ERROR_C0003); return source; } private CoderDao coderDtoAndDaoMapper(CoderDto data) { return CoderDao.builder() .commitId(data.getCommitId()) .examId(data.getExamId()) .endAt(data.getEndAt()) .lastCommitAt(data.getLastCommitAt()) .problemId(data.getProblemId()) .recordId(data.getRecordId()) .score(data.getScore()) .userId(data.getUserId()) .submitAt(data.getSubmitAt()) .startAt(data.getStartAt()) .id(null).createdAt(null).updatedAt(null) .build(); } }