package com.datao.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.datao.domain.*; import com.datao.result.PageResult; import com.datao.result.Result; import com.datao.service.*; import com.datao.vo.*; import io.swagger.v3.oas.annotations.Parameter; import lombok.RequiredArgsConstructor; import org.springdoc.core.annotations.ParameterObject; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.time.LocalDateTime; import java.time.ZoneOffset; import java.util.Map; @RestController @RequiredArgsConstructor public class DataServiceController { private final FetchService fetchService; private final ScanService scanService; private final MatchService matchService; private final OurateService rateService; private final OustatService oustatService; private final GameService gameService; private final TeamService teamService; // private final PredMatchService predMatchService; // private final PredWjrulesService predWjRulesService; private DataThreadService thread = null; // private static String startServiceTime = ""; // private static String stopServiceTime = ""; // private static String lastScanTime = ""; @GetMapping("/startService") public Result startService() { int res = 1; if(thread == null){ thread = new DataThreadService(fetchService,scanService,matchService, rateService,oustatService);//,predMatchService,predWjRulesService); thread.start(); } else{ if(thread.isInterrupted()){ thread = null; res = -1; } } return Result.success(new ServiceVo(res)); } @GetMapping("/stopService") public Result stopService() { int res = 0; if(thread != null) { thread.interrupt(); try { thread.join(5000); // 5秒超时 if (thread.isAlive()) { res = -1; // 超时未停止 } } catch (InterruptedException e) { Thread.currentThread().interrupt(); res = -1; } thread = null; } return Result.success(new ServiceVo(res)); } @GetMapping("/checkService") public Result checkService() { int res = 1; if(thread == null){ res = 0; } else{ if(thread.isInterrupted()) { res = -1; } } return Result.success(new ServiceVo(res)); } @GetMapping("/scan") public PageResult getScanPage(@ParameterObject BasePageQuery query) { IPage page = scanService.page( new Page<>(query.getPageNum(), query.getPageSize()), new LambdaQueryWrapper() .orderByDesc(Scan::getState) .orderByDesc(Scan::getSeason) .orderByAsc(Scan::getGid) .orderByAsc(Scan::getSubid) ); return PageResult.success(page); } @PutMapping("/scan") public Result updateScan(@RequestBody @Validated Scan scanData) { boolean result = scanService.updateById(scanData); return Result.judge(result); } @PostMapping("/scan") public Result addScan(@RequestBody @Validated Scan scanData) { boolean result = scanService.save(scanData); return Result.judge(result); } @GetMapping("/game") public PageResult getGamePage(@ParameterObject BasePageQuery query) { IPage page = gameService.page(new Page<>(query.getPageNum(), query.getPageSize()), new QueryWrapper().orderByAsc("gid")); return PageResult.success(page); } @PostMapping("/game") public Result saveGame(@RequestBody @Validated Game gameData) { boolean result = gameService.saveOrUpdate(gameData); return Result.judge(result); } private QueryWrapper buildWrapper(OUStatQuery query){ QueryWrapper wrapper = new QueryWrapper<>(); wrapper.ge(ObjectUtils.isNotEmpty(query.getDtstart()),"time",query.getDtstart()) .le(ObjectUtils.isNotEmpty(query.getDtend()),"time",query.getDtend()) .eq(ObjectUtils.isNotEmpty(query.getIhand()),"ihand",query.getIhand()) .eq(ObjectUtils.isNotEmpty(query.getEhand()),"ehand",query.getEhand()) .eq(ObjectUtils.isNotEmpty(query.getHname()),"th.name",query.getHname()) .in(ObjectUtils.isNotEmpty(query.getGids()),"g.gid", (Object[]) query.getGids()); if(ObjectUtils.isNotEmpty(query.getIorate())){ wrapper.ge("iorate", query.getIorate() - query.getFluct()) .le("iorate", query.getIorate() + query.getFluct()); } if(ObjectUtils.isNotEmpty(query.getIurate())){ wrapper.ge("iurate", query.getIurate() - query.getFluct()) .le("iurate", query.getIurate() + query.getFluct()); } if(ObjectUtils.isNotEmpty(query.getEorate())){ wrapper.ge("eorate", query.getEorate() - query.getFluct()) .le("eorate", query.getEorate() + query.getFluct()); } if(ObjectUtils.isNotEmpty(query.getEurate())){ wrapper.ge("eurate", query.getEurate() - query.getFluct()) .le("eurate", query.getEurate() + query.getFluct()); } if(ObjectUtils.isNotEmpty(query.getGoal())){ String cmp = (query.getGoal()<5 ? "=" : ">="); wrapper.apply("(hgoal+agoal)" + cmp + "{0}", query.getGoal()); } if(ObjectUtils.isNotEmpty(query.getChgnum())){ String cmp = (query.getChgnum()<5 ? "=" : ">="); wrapper.apply("chgnum" + cmp + "{0}", query.getChgnum()); } if(ObjectUtils.isNotEmpty(query.getVhour()) && query.getVhour()>0){ int hrMax = query.getVhour() + query.getVhfluct() * 100, hrMin = query.getVhour() - query.getVhfluct() * 100; wrapper.isNotNull("vhour") .ge("vhour", Math.max(hrMin, 0)) .le("vhour", hrMax ); } return wrapper; } @PostMapping("/oustat") public Result getOUStat(@RequestBody @Validated OUStatQuery query) { QueryWrapper wrapper = buildWrapper(query); wrapper.apply("LENGTH(hgoal)>0"); //只计算完场比赛 OUStatVo stat = matchService.getOUStat(wrapper); return Result.success(stat); } @PostMapping("/ouinfos") public PageResult getOUInfoPage(@RequestBody @Validated OUInfoQuery query) { QueryWrapper wrapper = buildWrapper(query); wrapper.orderByDesc("time"); IPage page = matchService.getOUInfo(new Page<>(query.getPageNum(), query.getPageSize()), wrapper); return PageResult.success(page); } @GetMapping("/dbinfo") public Result getDBInfo() { DBInfoVo dbInfo = new DBInfoVo(); dbInfo.setGameNum((int) gameService.count()); dbInfo.setTeamNum((int) teamService.count()); dbInfo.setMatchNum(matchService.getMatchCount()); Map map = matchService.getMap(new QueryWrapper().select("min(time) as dtMin, max(time) as dtMax")); Number dtMin = (Number) map.get("dtMin"); Number dtMax = (Number) map.get("dtMax"); if (dtMin == null || dtMax == null) { return Result.failed("DB time range unavailable"); } LocalDateTime dt = LocalDateTime.ofEpochSecond(dtMin.longValue(), 0, ZoneOffset.ofHours(8)); dbInfo.setYearStart(dt.getYear()); dt = LocalDateTime.ofEpochSecond(dtMax.longValue(), 0, ZoneOffset.ofHours(8)); dbInfo.setYearEnd(dt.getYear()); return Result.success(dbInfo); } @GetMapping("/ourate/{id}") public Result getOurate(@Parameter @PathVariable Integer id){ Ourate rate = rateService.getById(id); return Result.success(rate); } // @GetMapping("/predmatches") // public Result> getPredMatches(@RequestParam(required=false) Integer sid){ // List list = new ArrayList<>(); // // if(sid==null) // sid = 20; // // LambdaQueryWrapper wrapper = sid==21 ? new LambdaQueryWrapper().gt(PredMatch::getWjstate, 0) // : new LambdaQueryWrapper().eq(PredMatch::getState, 1); // List matches = predMatchService.list(wrapper); // for(PredMatch m : matches){ // PredMatchVo vo = new PredMatchVo(); // vo.setMid( m.getMid() ); // vo.setLname( m.getLname() ); // vo.setTime( m.getTime() ); // vo.setHname( m.getHname() ); // vo.setGname( m.getGname() ); // vo.setPred( sid==21 ? m.getWjstate() : m.getPred() ); // // list.add( vo ); // } // // return Result.success(list); // } }