From d108e7325e346c53775b00f15cfe9f53e20fbde3 Mon Sep 17 00:00:00 2001 From: tianea Date: Fri, 25 Mar 2022 14:17:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=92=E8=A1=8C=E6=A6=9C=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platform/common/core/tools/DateUtil.java | 7 ++ .../api/CompetitionExamController.java | 18 +++- .../api/CompetitionIndexControll.java | 21 ++++- .../api/biz/CompetitionIndexBiz.java | 91 ++++++++++++++++++- .../competitiion/api/dto/CompetitionDTO.java | 14 ++- .../competitiion/api/dto/ExamDTO.java | 15 +++ .../api/dto/IndexCompetitionDTO.java | 9 +- .../competitiion/api/dto/SubmitResultDTO.java | 10 ++ .../competitiion/api/dto/TaskDTO.java | 8 ++ .../competitiion/api/dto/TaskListDto.java | 8 ++ .../competitiion/api/vo/SubmitQuestionVO.java | 11 +++ .../competitiion/api/vo/SubmitVo.java | 4 +- .../competitiion/job/CompetitionJob.java | 33 +++++++ .../job/biz/CompetitionJobBiz.java | 4 +- .../competitiion/job/biz/RankingBiz.java | 79 ++++++++++++++++ .../tz/platform/entity/CompetitionGroup.java | 3 + .../tz/platform/entity/CompetitionMember.java | 22 ++++- .../com/tz/platform/entity/ExamPaper.java | 27 ++++++ .../com/tz/platform/entity/JueJinToken.java | 14 +++ .../java/com/tz/platform/entity/Ranking.java | 29 +++++- .../java/com/tz/platform/entity/Stock.java | 14 +++ .../com/tz/platform/entity/TenPosition.java | 28 ++++++ .../com/tz/platform/juejin/JueJinApi.java | 49 +++++++--- .../platform/repository/CompetitionDao.java | 4 +- .../repository/CompetitionMemberDao.java | 21 +++++ .../platform/repository/JueJinTokenDao.java | 10 ++ .../tz/platform/repository/RankingDao.java | 9 ++ .../com/tz/platform/repository/StockDao.java | 10 ++ .../platform/repository/TenPositionDao.java | 12 +++ .../src/main/resources/bootstrap.yml | 3 + .../tz/platform/feign/exam/IFeignExam.java | 8 +- ...cheQuetionQO.java => CacheQuestionQO.java} | 2 +- .../tz/platform/feign/exam/vo/QuestionVo.java | 18 +++- .../exam/feign/FeignExamController.java | 6 +- .../gateway/GlobalErrorAttributes.java | 2 + 35 files changed, 577 insertions(+), 46 deletions(-) create mode 100644 tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/dto/ExamDTO.java create mode 100644 tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/dto/SubmitResultDTO.java create mode 100644 tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/dto/TaskDTO.java create mode 100644 tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/dto/TaskListDto.java create mode 100644 tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/vo/SubmitQuestionVO.java create mode 100644 tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/job/biz/RankingBiz.java create mode 100644 tz/competition/competition-service/src/main/java/com/tz/platform/entity/ExamPaper.java create mode 100644 tz/competition/competition-service/src/main/java/com/tz/platform/entity/JueJinToken.java create mode 100644 tz/competition/competition-service/src/main/java/com/tz/platform/entity/Stock.java create mode 100644 tz/competition/competition-service/src/main/java/com/tz/platform/entity/TenPosition.java create mode 100644 tz/competition/competition-service/src/main/java/com/tz/platform/repository/JueJinTokenDao.java create mode 100644 tz/competition/competition-service/src/main/java/com/tz/platform/repository/RankingDao.java create mode 100644 tz/competition/competition-service/src/main/java/com/tz/platform/repository/StockDao.java create mode 100644 tz/competition/competition-service/src/main/java/com/tz/platform/repository/TenPositionDao.java rename tz/exam/exam-feign/src/main/java/com/tz/platform/feign/exam/qo/{CacheQuetionQO.java => CacheQuestionQO.java} (84%) diff --git a/tz/common/common-core/src/main/java/com/tz/platform/common/core/tools/DateUtil.java b/tz/common/common-core/src/main/java/com/tz/platform/common/core/tools/DateUtil.java index 9429157..f4df89d 100644 --- a/tz/common/common-core/src/main/java/com/tz/platform/common/core/tools/DateUtil.java +++ b/tz/common/common-core/src/main/java/com/tz/platform/common/core/tools/DateUtil.java @@ -253,6 +253,13 @@ public class DateUtil { return calendar.getTime(); } + public static Date addHours(Date date,int hours){ + Calendar calendar = Calendar.getInstance(); + long millis = getMillis(date) + ((long) hours) * 1 * 3600 * 1000; + calendar.setTimeInMillis(millis); + return calendar.getTime(); + } + /** * 当前日期加上年 * diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/CompetitionExamController.java b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/CompetitionExamController.java index 62e3c84..713e9f4 100644 --- a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/CompetitionExamController.java +++ b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/CompetitionExamController.java @@ -1,7 +1,13 @@ package com.tz.platform.competitiion.api; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import com.tz.platform.common.core.base.BaseController; +import com.tz.platform.common.core.base.Result; import com.tz.platform.competitiion.api.biz.CompetitionExamBiz; +import com.tz.platform.competitiion.api.dto.ExamDTO; +import com.tz.platform.competitiion.api.dto.SubmitResultDTO; +import com.tz.platform.competitiion.api.vo.SubmitQuestionVO; import com.tz.platform.competitiion.api.vo.SubmitVo; import com.tz.platform.feign.exam.vo.QuestionVo; import org.springframework.beans.factory.annotation.Autowired; @@ -22,8 +28,14 @@ public class CompetitionExamController extends BaseController { } @PostMapping(value = "submit") - public String submit(@RequestBody SubmitVo vo){ - System.out.println(vo.getCompId()+" "+vo.getStageId()+ " "+ vo.getQList().size()); - return "success"; + public Result submit(@RequestBody String vo){ + SubmitVo questionVO = JSONUtil.toBean(vo, SubmitVo.class); + return examBiz.submit(questionVO); } + + @GetMapping(value = "start") + public Result startExam(@RequestParam("compId") Long compId, @RequestParam("stageId") Integer stageId){ + return examBiz.startExam(compId,stageId,getUserNo()); + } + } diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/CompetitionIndexControll.java b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/CompetitionIndexControll.java index 8add9f5..e2e15ee 100644 --- a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/CompetitionIndexControll.java +++ b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/CompetitionIndexControll.java @@ -1,14 +1,17 @@ package com.tz.platform.competitiion.api; +import cn.hutool.json.JSONArray; +import com.tz.platform.common.core.base.BaseController; import com.tz.platform.common.core.base.Result; import com.tz.platform.competitiion.api.biz.CompetitionIndexBiz; +import com.tz.platform.competitiion.api.dto.CompetitionDTO; import com.tz.platform.competitiion.api.dto.IndexListCompetitionDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping(value = "/api/competition") -public class CompetitionIndexControll { +public class CompetitionIndexControll extends BaseController { @Autowired private CompetitionIndexBiz competitionIndexBiz; @@ -17,4 +20,20 @@ public class CompetitionIndexControll { public Result list(@PathVariable("type") Integer type,@PathVariable("pageNo") Integer pageNo){ return competitionIndexBiz.list(pageNo,type); } + + + @GetMapping(value = "get") + public Result get(@RequestParam("compId") Long compId){ + return competitionIndexBiz.get(compId); + } + + @GetMapping(value = "position") + public Result getTenPosition(@RequestParam("compId") Long cmpId, @RequestParam("stageId") Integer stageId){ + return competitionIndexBiz.position(getUserNo(),cmpId,stageId); + } + + @GetMapping(value = "system") + public Result getSystemInfo(){ + return Result.error("failed"); + } } diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/biz/CompetitionIndexBiz.java b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/biz/CompetitionIndexBiz.java index df3bb20..6f76e81 100644 --- a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/biz/CompetitionIndexBiz.java +++ b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/biz/CompetitionIndexBiz.java @@ -1,36 +1,125 @@ package com.tz.platform.competitiion.api.biz; +import cn.hutool.json.JSON; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import com.tz.platform.common.core.base.Result; import com.tz.platform.common.core.tools.BeanUtils; +import com.tz.platform.competitiion.api.dto.CompetitionDTO; import com.tz.platform.competitiion.api.dto.IndexCompetitionDTO; import com.tz.platform.competitiion.api.dto.IndexListCompetitionDTO; import com.tz.platform.entity.Competition; +import com.tz.platform.entity.CompetitionMember; +import com.tz.platform.entity.JueJinToken; +import com.tz.platform.feign.user.IFeignUser; +import com.tz.platform.juejin.JueJinApi; import com.tz.platform.repository.CompetitionDao; +import com.tz.platform.repository.CompetitionMemberDao; +import com.tz.platform.repository.CompetitionTaskDao; +import com.tz.platform.repository.JueJinTokenDao; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; +import java.util.ArrayList; import java.util.List; @Component +@Slf4j public class CompetitionIndexBiz { @Autowired private CompetitionDao competitionDao; + @Autowired + private JueJinTokenDao jueJinTokenDao; + + @Autowired + private CompetitionMemberDao competitionMemberDao; + + @Autowired + private CompetitionTaskDao competitionTaskDao; + + + @Autowired + private IFeignUser feignUser; + public Result list(int pageNo,int type){ int pageSize = 20; + pageNo = pageNo - 1; if(pageNo<0){ pageNo = 0; } pageNo =pageNo* pageSize; Pageable pageable = PageRequest.of(pageNo,pageSize); Page competitionList = competitionDao.findAllByStatus(type,pageable); - System.out.println(competitionList.getContent()); IndexListCompetitionDTO dto = new IndexListCompetitionDTO(); List competitionDTOList = BeanUtils.copyProperties(competitionList.getContent(),IndexCompetitionDTO.class); dto.setList(competitionDTOList); return Result.success(dto); } + + public Result get(Long compId){ + Competition competition = competitionDao.getById(compId); + CompetitionDTO dto = BeanUtils.copyProperties(competition,CompetitionDTO.class); + return Result.success(dto); + } + + public Result position(Long userNo,Long compId,Integer stageId){ +// UserVo userVo = feignUser.getByUserNo(userNo); + JueJinToken jueJinToken = jueJinTokenDao.getById(1); + JueJinApi jueJinApi = new JueJinApi(jueJinToken.getToken()); + CompetitionMember member = competitionMemberDao.getByCompetitionIdAndStageIdAndUserId(compId,stageId,userNo); + if(member == null ){ + return Result.error("未报名参赛"); + } + if(StringUtils.isEmpty(member.getAccountId())){ + return Result.error("无交易系统权限"); +// CompetitionTask task = competitionTaskDao.getByCompetitionIdAndStageId(compId,stageId); +// int type = task.getTradeType(); +// if(type != 1){ +// type = 4; +// } +// AccountInfo accountInfo = jueJinApi.createAccount(userVo.getName(),task.getInitCapital(),type); + } + try { + String jsonStr = jueJinApi.getTenPosition(member.getAccountId()); + JSONObject jsonObject = JSONUtil.parseObj(jsonStr); + JSONArray resultArray = new JSONArray(); + if (jsonObject.containsKey("data")) { + JSONArray dataArray = jsonObject.getJSONArray("data"); + List symbols = new ArrayList<>(); + dataArray.forEach(jo ->{ + JSONObject positionObj = (JSONObject) jo; + if(positionObj.containsKey("available")){ + String symbol = positionObj.getStr("symbol"); + symbols.add(symbol); + resultArray.put(positionObj); + } + }); + String stockStr = jueJinApi.getStockInfo(String.join(",",symbols)); + JSONObject stockObj = JSONUtil.parseObj(stockStr); + if(stockObj.containsKey("data")){ + JSONArray jsonArray = stockObj.getJSONArray("data"); + jsonArray.forEach(stock->{ + JSONObject s = (JSONObject) stock; + JSONObject tmp =(JSONObject) resultArray.stream().filter(object -> { + JSONObject t = (JSONObject)object; + return t.getStr("symbol").equals(s.getStr("symbol")); + }).findFirst().orElse(null); + tmp.set("sec_name",s.getStr("sec_name")); + }); + } + return Result.success(resultArray); + } + }catch (Exception ex){ + log.error("用户:{} 竞赛:{} 阶段:{} 持仓数据获取失败:{}",userNo,compId,stageId,ex.getMessage()); + } + + return Result.error("获取数据失败"); + } } diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/dto/CompetitionDTO.java b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/dto/CompetitionDTO.java index 5457a31..6d71585 100644 --- a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/dto/CompetitionDTO.java +++ b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/dto/CompetitionDTO.java @@ -3,20 +3,24 @@ package com.tz.platform.competitiion.api.dto; import com.tz.platform.common.core.bo.Stage; import lombok.Data; +import java.io.Serializable; import java.util.Date; import java.util.List; @Data -public class CompetitionDTO { - private Integer id; +public class CompetitionDTO implements Serializable { + private Long id; private String name; private String sponsor; + private String supporter; + private String thumbnail; private Date startTime; private Date endTime; - private Date sinUpStartTime; - private Date sinUpEndTime; + private Date signupStartTime; + private Date signupEndTime; + private Boolean enableSignup; + private Integer type; private Integer peopleCount; private Integer teamCount; - private Integer type; private List stageList; } diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/dto/ExamDTO.java b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/dto/ExamDTO.java new file mode 100644 index 0000000..aff5943 --- /dev/null +++ b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/dto/ExamDTO.java @@ -0,0 +1,15 @@ +package com.tz.platform.competitiion.api.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Data +public class ExamDTO implements Serializable { + @JsonFormat(shape = JsonFormat.Shape.STRING,pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date startTime; + @JsonFormat(shape = JsonFormat.Shape.STRING,pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date endTime; +} diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/dto/IndexCompetitionDTO.java b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/dto/IndexCompetitionDTO.java index 59003b6..3932d38 100644 --- a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/dto/IndexCompetitionDTO.java +++ b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/dto/IndexCompetitionDTO.java @@ -11,14 +11,17 @@ import java.util.Date; @NoArgsConstructor @AllArgsConstructor public class IndexCompetitionDTO implements Serializable { - private Integer id; + private Long id; private String name; private String sponsor; private String supporter; private String thumbnail; private Date startTime; private Date endTime; - private Date sinUpStartTime; - private Date sinUpEndTime; + private Date signupStartTime; + private Date signupEndTime; private Boolean enableSignup; + private Integer type; + private Integer peopleCount; + private Integer teamCount; } diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/dto/SubmitResultDTO.java b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/dto/SubmitResultDTO.java new file mode 100644 index 0000000..a835124 --- /dev/null +++ b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/dto/SubmitResultDTO.java @@ -0,0 +1,10 @@ +package com.tz.platform.competitiion.api.dto; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class SubmitResultDTO implements Serializable { + private Long score; +} diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/dto/TaskDTO.java b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/dto/TaskDTO.java new file mode 100644 index 0000000..04735b8 --- /dev/null +++ b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/dto/TaskDTO.java @@ -0,0 +1,8 @@ +package com.tz.platform.competitiion.api.dto; + +import lombok.Data; + +@Data +public class TaskDTO { + +} diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/dto/TaskListDto.java b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/dto/TaskListDto.java new file mode 100644 index 0000000..a754018 --- /dev/null +++ b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/dto/TaskListDto.java @@ -0,0 +1,8 @@ +package com.tz.platform.competitiion.api.dto; + +import lombok.Data; + +@Data +public class TaskListDto { + +} diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/vo/SubmitQuestionVO.java b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/vo/SubmitQuestionVO.java new file mode 100644 index 0000000..e843d20 --- /dev/null +++ b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/vo/SubmitQuestionVO.java @@ -0,0 +1,11 @@ +package com.tz.platform.competitiion.api.vo; + +import lombok.Data; +import java.util.List; + +@Data +public class SubmitQuestionVO { + private Long id; + private Integer subId; + private List ids; +} diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/vo/SubmitVo.java b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/vo/SubmitVo.java index 2d0f4b5..4fce116 100644 --- a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/vo/SubmitVo.java +++ b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/vo/SubmitVo.java @@ -1,13 +1,13 @@ package com.tz.platform.competitiion.api.vo; -import com.tz.platform.feign.exam.vo.QuestionVo; import lombok.Data; import java.util.List; @Data public class SubmitVo { + private Long userNo; private Long compId; private Integer stageId; - private List qList; + private List qList; } diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/job/CompetitionJob.java b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/job/CompetitionJob.java index f88b4c7..0d4ff49 100644 --- a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/job/CompetitionJob.java +++ b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/job/CompetitionJob.java @@ -1,7 +1,12 @@ package com.tz.platform.competitiion.job; import com.tz.platform.competitiion.job.biz.CompetitionJobBiz; +import com.tz.platform.competitiion.job.biz.RankingBiz; +import com.tz.platform.entity.JueJinToken; +import com.tz.platform.juejin.JueJinApi; +import com.tz.platform.repository.JueJinTokenDao; import lombok.extern.slf4j.Slf4j; +import org.checkerframework.checker.units.qual.A; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.RedisTemplate; @@ -22,6 +27,10 @@ public class CompetitionJob { @Autowired private CompetitionJobBiz jobBiz; + @Autowired + private RankingBiz rankingBiz; + + /** * 过期时间 毫秒 */ @@ -45,6 +54,30 @@ public class CompetitionJob { } } +// @Scheduled(cron = "*/5 * * * * ?") + public void fetchRanking(){ + String jobName = "rankingJob"; + boolean lock = lock(jobName,ms); + if(lock){ + try { + rankingBiz.fetchRanking(); + }catch (Exception ex){ + + }finally { + unLock(jobName); + } + } + } + + @Scheduled(cron = "*/5 * * * * ?") + public void fetchPic(){ + String jobName = "picJob"; + boolean lock = lock(jobName,ms); + if(lock){ + + } + } + /** * 每分钟执行一次 */ diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/job/biz/CompetitionJobBiz.java b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/job/biz/CompetitionJobBiz.java index 24d8d4b..4f7f957 100644 --- a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/job/biz/CompetitionJobBiz.java +++ b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/job/biz/CompetitionJobBiz.java @@ -5,7 +5,7 @@ import com.tz.platform.entity.Competition; import com.tz.platform.entity.CompetitionMember; import com.tz.platform.entity.CompetitionTask; import com.tz.platform.feign.exam.IFeignExam; -import com.tz.platform.feign.exam.qo.CacheQuetionQO; +import com.tz.platform.feign.exam.qo.CacheQuestionQO; import com.tz.platform.feign.user.IFeignUser; import com.tz.platform.repository.CompetitionDao; import com.tz.platform.repository.CompetitionMemberDao; @@ -85,7 +85,7 @@ public class CompetitionJobBiz { ids.addAll(taskQuestion.getQuestionIds()); }); long ms = (task.getExamEndTime().getTime() - now)+24*3600*1000; - CacheQuetionQO qo = new CacheQuetionQO(); + CacheQuestionQO qo = new CacheQuestionQO(); qo.setIds(ids); qo.setKey("exam_"+competition.getId()+"_"+current.getId()); qo.setMs(ms); diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/job/biz/RankingBiz.java b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/job/biz/RankingBiz.java new file mode 100644 index 0000000..79ca38f --- /dev/null +++ b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/job/biz/RankingBiz.java @@ -0,0 +1,79 @@ +package com.tz.platform.competitiion.job.biz; + +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.tz.platform.common.core.tools.DateUtil; +import com.tz.platform.entity.*; +import com.tz.platform.juejin.JueJinApi; +import com.tz.platform.repository.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import java.util.Date; +import java.util.List; + +@Component +@Slf4j +public class RankingBiz { + + + @Autowired + private JueJinTokenDao jueJinTokenDao; + + @Autowired + private CompetitionDao competitionDao; + + @Autowired + private CompetitionTaskDao taskDao; + + @Autowired + private CompetitionMemberDao memberDao; + + @Autowired + private RankingDao rankingDao; + + public void fetchRanking(){ + JueJinToken jueJinToken = jueJinTokenDao.getById(1); + if(jueJinToken == null) {return;} + JueJinApi jueJinApi = new JueJinApi(jueJinToken.getToken()); + List competitionList = competitionDao.findAllByStatus(1); + String endTime = DateUtil.format(new Date()); + competitionList.forEach(competition -> { + try { + CompetitionTask currentTask = taskDao.getByCompetitionIdAndStageId(competition.getId(), competition.getCurrentStage()); + String startTime = DateUtil.format(currentTask.getOperationStartTime()); + String baseRatio = jueJinApi.getBaseRatio(startTime, endTime); + List memberList = memberDao.findAllByCompetitionIdAndStageId(competition.getId(), competition.getCurrentStage()); + memberList.forEach(member -> { + if (StringUtils.hasText(member.getAccountId())) { + String jsonStr = jueJinApi.createReport(member.getAccountId(), endTime); + if(StringUtils.isEmpty(jsonStr)){ + return; + } + JSONObject jsonObject = JSONUtil.parseObj(jsonStr); + if(jsonObject.containsKey("report_id")){ + Integer reportId =jsonObject.getInt("report_id"); +// JSONArray jsonArray = jsonObject.getJSONArray("indicator_durations"); + String contentStr = jueJinApi.getReport(reportId.toString()); + + Ranking ranking = new Ranking(); + ranking.setAccountId(member.getAccountId()); +// ranking.setTotalRatio(baseRatio); + rankingDao.save(ranking); + } + } + }); + }catch (Exception ex){ + log.error("排行榜数据获取失败:{}",competition.getId(),ex); + } + }); + } + + private Long computeCombineScore(CompetitionTask task){ + + return 0L; + } +} diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/entity/CompetitionGroup.java b/tz/competition/competition-service/src/main/java/com/tz/platform/entity/CompetitionGroup.java index 93f3ac7..ba6c81a 100644 --- a/tz/competition/competition-service/src/main/java/com/tz/platform/entity/CompetitionGroup.java +++ b/tz/competition/competition-service/src/main/java/com/tz/platform/entity/CompetitionGroup.java @@ -17,6 +17,9 @@ public class CompetitionGroup { private Long competitionId; private Long userNo; private String name; + /** + * 1 为层次限制;2为区域限制 + */ private Integer limitType; @Type(type = "json") @Column(columnDefinition = "json") diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/entity/CompetitionMember.java b/tz/competition/competition-service/src/main/java/com/tz/platform/entity/CompetitionMember.java index a99d843..1904d03 100644 --- a/tz/competition/competition-service/src/main/java/com/tz/platform/entity/CompetitionMember.java +++ b/tz/competition/competition-service/src/main/java/com/tz/platform/entity/CompetitionMember.java @@ -7,7 +7,7 @@ import java.util.Date; @Entity @Data -@Table(indexes={@Index(columnList = "competitionId,stageId,teamId"),@Index(columnList = "studentNo"),@Index(columnList = "name"),@Index(columnList = "school")}) +@Table(indexes={@Index(columnList = "competitionId,stageId,teamId"),@Index(columnList = "userId"),@Index(columnList = "studentNo"),@Index(columnList = "name"),@Index(columnList = "school")}) public class CompetitionMember { @Id @@ -27,8 +27,28 @@ public class CompetitionMember { private Long examScore; private Long financeScore; private Long combineScore; + private Integer personalRank; + private Integer teamRank; private Date examStartTime; private Date examEndTime; private Long examCostTime; private Integer levelId; + private Long initFounds; + private Long totalFounds; + private Long availableFounds; + private Long marketValue; + private Long currentRatio; + private Long highestRatio; + private Long overRatio; + private Long commission; + private Long totalRatio; + private Long baseRatio; + private Long yearRatio; + private Long maxDrawDown; + private String kammaRatio; + private String sharpRatio; + private Integer openCount; + private Integer closeCount; + private Long winRatio; + private Integer reportId; } diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/entity/ExamPaper.java b/tz/competition/competition-service/src/main/java/com/tz/platform/entity/ExamPaper.java new file mode 100644 index 0000000..0edacb7 --- /dev/null +++ b/tz/competition/competition-service/src/main/java/com/tz/platform/entity/ExamPaper.java @@ -0,0 +1,27 @@ +package com.tz.platform.entity; + +import com.tz.platform.competitiion.api.vo.SubmitQuestionVO; +import com.vladmihalcea.hibernate.type.json.JsonStringType; +import lombok.Data; +import org.hibernate.annotations.Type; +import org.hibernate.annotations.TypeDef; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import java.util.List; + +@Data +@Entity +@TypeDef(name = "json", typeClass = JsonStringType.class) +public class ExamPaper { + @Id + private String id; + private Long userNo; + private Long compId; + private Integer stageId; + + @Type(type = "json") + @Column(columnDefinition = "json") + private List qList; +} diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/entity/JueJinToken.java b/tz/competition/competition-service/src/main/java/com/tz/platform/entity/JueJinToken.java new file mode 100644 index 0000000..0995367 --- /dev/null +++ b/tz/competition/competition-service/src/main/java/com/tz/platform/entity/JueJinToken.java @@ -0,0 +1,14 @@ +package com.tz.platform.entity; + +import lombok.Data; + +import javax.persistence.Entity; +import javax.persistence.Id; + +@Data +@Entity +public class JueJinToken { + @Id + private Integer id; + private String token; +} diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/entity/Ranking.java b/tz/competition/competition-service/src/main/java/com/tz/platform/entity/Ranking.java index f88f51a..e9fe9a7 100644 --- a/tz/competition/competition-service/src/main/java/com/tz/platform/entity/Ranking.java +++ b/tz/competition/competition-service/src/main/java/com/tz/platform/entity/Ranking.java @@ -12,8 +12,8 @@ import java.util.Date; @Entity public class Ranking { @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Integer id; + private String id; + private String accountId; /** @@ -34,7 +34,7 @@ public class Ranking { /** * 累计盈亏 */ - private Long accumulativeTotalProfitLoss; + private Long totalRatio; /** * 累计手续费 @@ -51,6 +51,27 @@ public class Ranking { */ private Long pnlRation; + /** + * 基准收益率 + */ + private Long baseRatio; + + /** + * 团队收益率 + */ + private Long teamRatio; + + /** + * 个人排名 + */ + private Integer personalRank; + + + /** + * 团队排名 + */ + private Integer teamRank; + /** * 最大回测 */ @@ -89,6 +110,6 @@ public class Ranking { /** * 更新时间 */ - private Date updateTime; + private String updateTime; } diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/entity/Stock.java b/tz/competition/competition-service/src/main/java/com/tz/platform/entity/Stock.java new file mode 100644 index 0000000..a92bb61 --- /dev/null +++ b/tz/competition/competition-service/src/main/java/com/tz/platform/entity/Stock.java @@ -0,0 +1,14 @@ +package com.tz.platform.entity; + +import lombok.Data; + +import javax.persistence.Entity; +import javax.persistence.Id; + +@Data +@Entity +public class Stock { + @Id + private String symbol; + private String name; +} diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/entity/TenPosition.java b/tz/competition/competition-service/src/main/java/com/tz/platform/entity/TenPosition.java new file mode 100644 index 0000000..68c5a72 --- /dev/null +++ b/tz/competition/competition-service/src/main/java/com/tz/platform/entity/TenPosition.java @@ -0,0 +1,28 @@ +package com.tz.platform.entity; + +import lombok.Data; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Index; +import javax.persistence.Table; + +@Data +@Entity +@Table(indexes = {@Index(columnList = "accountId")}) +public class TenPosition { + @Id + private String id; + private String accountId; + private String symbol; + private String name; + private Long volume; + private String available; + private String lastPrice; + private String price; + private String amount; + private String ratio; + private String profit; + private Long createTime; + private Long updateTime; +} diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/juejin/JueJinApi.java b/tz/competition/competition-service/src/main/java/com/tz/platform/juejin/JueJinApi.java index 8da8596..3924a2e 100644 --- a/tz/competition/competition-service/src/main/java/com/tz/platform/juejin/JueJinApi.java +++ b/tz/competition/competition-service/src/main/java/com/tz/platform/juejin/JueJinApi.java @@ -1,5 +1,8 @@ package com.tz.platform.juejin; +import cn.hutool.json.JSON; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.tz.platform.common.core.base.BaseException; import com.tz.platform.common.core.tools.HttpUtil; @@ -20,6 +23,12 @@ public class JueJinApi { headers.put("Authorization","bearer "+token); } + + public JueJinApi(String token){ + this.token = token; + headers.put("Authorization","bearer "+token); + } + /** * * @param accountName 账号名称 @@ -73,7 +82,7 @@ public class JueJinApi { String url = baseUrl+ "/perfweb-rpcgw/api/v1/sim/detail/"+accountId+"?title="+title; String content = HttpUtil.get(url,headers); logger.info("报告生成请求: {}",content); - return ""; + return content; } /** @@ -92,11 +101,19 @@ public class JueJinApi { * 基准收益率 * @return */ - public String getBaseRatio(){ - String url = baseUrl +"/ds-history-rpcgw/v3/data-history/benchmark-return?symbol=SHSE.000300&frequency=1d&start_time=2022-03-07&end_time=2022-03-09&adjust=0"; + public String getBaseRatio(String start,String end){ + String url = baseUrl +"/ds-history-rpcgw/v3/data-history/benchmark-return?symbol=SHSE.000300&frequency=1d&start_time="+start+"&end_time="+end+"&adjust=0"; String content = HttpUtil.get(url,headers); - logger.info("基准收益率:{}",content); - return content; + + JSONObject jsonObject = JSONUtil.parseObj(content); + if(jsonObject.containsKey("data")){ + JSONArray jsonArray = jsonObject.getJSONArray("data"); + JSONObject ratioObj = (JSONObject) jsonArray.get(jsonArray.size()-1); + logger.info("基准收益率:{}",ratioObj.get("ratio").toString()); + return ratioObj.get("ratio").toString(); + } + + return ""; } /** @@ -107,7 +124,14 @@ public class JueJinApi { public String getTenPosition(String accountId){ String url = baseUrl + "/broker-rpcgw/v3/account-trade/positions/"+accountId; String content = HttpUtil.get(url,headers); - logger.info("10大持仓:{}",content); + logger.info("持仓数据:{}",content); + return content; + } + + public String getStockInfo(String symbols){ + String url =baseUrl+"/ds-core-rpcgw/v3/data-fundamental/instrument-infos?symbols="+symbols; + String content = HttpUtil.get(url,headers); + logger.info("股票信息:{}",content); return content; } @@ -156,8 +180,8 @@ public class JueJinApi { String zhangSan1Qihuo = "0cfc7894-9f4e-11ec-bf20-00163e0e6ad0"; String zhangSan1GuPiao = ""; - String start = "1970-01-01"; - String end = "2022-03-15"; + String start = "2022-03-07"; + String end = "2022-03-21"; // AccountInfo info = api.createAccount("张三1",1000000L,4); // System.out.println(info.getAccount_id()); @@ -165,11 +189,12 @@ public class JueJinApi { // api.getCashInfo("2e41a913-9dc1-11ec-89b3-00163e0e6ad0"); // api.test(); // api.createReport(accountId,"report"+ System.currentTimeMillis()); -// api.getReport("10"); -// api.getTenPosition(accountId); +// api.getCashInfo(accountId); + api.getReport("489327"); +// api.getStockInfo("SHSE.600547,SHSE.603160"); // api.getProfit("2022-03-11","2022-03-15"); - api.getHeavy(accountId,start,end); -// api.getBaseRatio(); +// api.getHeavy(accountId,start,end); +// api.getBaseRatio(start,end); } } diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/repository/CompetitionDao.java b/tz/competition/competition-service/src/main/java/com/tz/platform/repository/CompetitionDao.java index f418e19..a1651cd 100644 --- a/tz/competition/competition-service/src/main/java/com/tz/platform/repository/CompetitionDao.java +++ b/tz/competition/competition-service/src/main/java/com/tz/platform/repository/CompetitionDao.java @@ -30,11 +30,11 @@ public interface CompetitionDao extends JpaRepository { @Transactional @Modifying - @Query(value = "upate cometition set status=:status where id=:compId",nativeQuery = true) + @Query(value = "update competition set status=:status where id=:compId",nativeQuery = true) int updateStatus(@Param("compId") Long compId,@Param("status") Integer status); @Transactional @Modifying - @Query(value = "upate cometition set status=:status,stage_name=:stageName,stage_id=:stageId where id=:compId",nativeQuery = true) + @Query(value = "update competition set status=:status,current_stage_name=:stageName,current_stage=:stageId where id=:compId",nativeQuery = true) int updateStatus(@Param("compId") Long compId,@Param("status") Integer status,@Param("stageName") String stageName,@Param("stageId") Integer stageId); } diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/repository/CompetitionMemberDao.java b/tz/competition/competition-service/src/main/java/com/tz/platform/repository/CompetitionMemberDao.java index 8666ca1..90f9b30 100644 --- a/tz/competition/competition-service/src/main/java/com/tz/platform/repository/CompetitionMemberDao.java +++ b/tz/competition/competition-service/src/main/java/com/tz/platform/repository/CompetitionMemberDao.java @@ -5,8 +5,12 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.util.Date; import java.util.List; @Repository @@ -25,4 +29,21 @@ public interface CompetitionMemberDao extends JpaRepository { + JueJinToken getById(Integer id); +} diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/repository/RankingDao.java b/tz/competition/competition-service/src/main/java/com/tz/platform/repository/RankingDao.java new file mode 100644 index 0000000..3bd4826 --- /dev/null +++ b/tz/competition/competition-service/src/main/java/com/tz/platform/repository/RankingDao.java @@ -0,0 +1,9 @@ +package com.tz.platform.repository; + +import com.tz.platform.entity.Ranking; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface RankingDao extends JpaRepository { +} diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/repository/StockDao.java b/tz/competition/competition-service/src/main/java/com/tz/platform/repository/StockDao.java new file mode 100644 index 0000000..c9f8252 --- /dev/null +++ b/tz/competition/competition-service/src/main/java/com/tz/platform/repository/StockDao.java @@ -0,0 +1,10 @@ +package com.tz.platform.repository; + +import com.tz.platform.entity.Stock; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface StockDao extends JpaRepository { + Stock getBySymbol(String symbol); +} \ No newline at end of file diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/repository/TenPositionDao.java b/tz/competition/competition-service/src/main/java/com/tz/platform/repository/TenPositionDao.java new file mode 100644 index 0000000..fc96f15 --- /dev/null +++ b/tz/competition/competition-service/src/main/java/com/tz/platform/repository/TenPositionDao.java @@ -0,0 +1,12 @@ +package com.tz.platform.repository; + +import com.tz.platform.entity.TenPosition; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface TenPositionDao extends JpaRepository { + List findByAccountId(String accountId); +} diff --git a/tz/competition/competition-service/src/main/resources/bootstrap.yml b/tz/competition/competition-service/src/main/resources/bootstrap.yml index 0e07d4f..4d94314 100644 --- a/tz/competition/competition-service/src/main/resources/bootstrap.yml +++ b/tz/competition/competition-service/src/main/resources/bootstrap.yml @@ -1,5 +1,8 @@ server: port: 50012 + error: + whitelabel: + enabled: false spring: application: name: tz-competition-service diff --git a/tz/exam/exam-feign/src/main/java/com/tz/platform/feign/exam/IFeignExam.java b/tz/exam/exam-feign/src/main/java/com/tz/platform/feign/exam/IFeignExam.java index e41c2a7..11c16ca 100644 --- a/tz/exam/exam-feign/src/main/java/com/tz/platform/feign/exam/IFeignExam.java +++ b/tz/exam/exam-feign/src/main/java/com/tz/platform/feign/exam/IFeignExam.java @@ -1,10 +1,8 @@ package com.tz.platform.feign.exam; -import com.tz.platform.feign.exam.qo.CacheQuetionQO; +import com.tz.platform.feign.exam.qo.CacheQuestionQO; import com.tz.platform.feign.exam.vo.QuestionVo; import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -14,8 +12,8 @@ import java.util.List; public interface IFeignExam { @PostMapping(value = "/feign/exam/question/putToCache") - boolean putToCache(@RequestBody CacheQuetionQO qo); + boolean putToCache(@RequestBody CacheQuestionQO qo); @PostMapping(value = "/feign/exam/question/list") - List listQusetion(@RequestBody CacheQuetionQO qo); + List listQusetion(@RequestBody CacheQuestionQO qo); } diff --git a/tz/exam/exam-feign/src/main/java/com/tz/platform/feign/exam/qo/CacheQuetionQO.java b/tz/exam/exam-feign/src/main/java/com/tz/platform/feign/exam/qo/CacheQuestionQO.java similarity index 84% rename from tz/exam/exam-feign/src/main/java/com/tz/platform/feign/exam/qo/CacheQuetionQO.java rename to tz/exam/exam-feign/src/main/java/com/tz/platform/feign/exam/qo/CacheQuestionQO.java index bcf72fd..56cfdd4 100644 --- a/tz/exam/exam-feign/src/main/java/com/tz/platform/feign/exam/qo/CacheQuetionQO.java +++ b/tz/exam/exam-feign/src/main/java/com/tz/platform/feign/exam/qo/CacheQuestionQO.java @@ -5,7 +5,7 @@ import lombok.Data; import java.util.List; @Data -public class CacheQuetionQO { +public class CacheQuestionQO { private List ids; private String key; private Long ms; diff --git a/tz/exam/exam-feign/src/main/java/com/tz/platform/feign/exam/vo/QuestionVo.java b/tz/exam/exam-feign/src/main/java/com/tz/platform/feign/exam/vo/QuestionVo.java index 38a7f6f..433ce99 100644 --- a/tz/exam/exam-feign/src/main/java/com/tz/platform/feign/exam/vo/QuestionVo.java +++ b/tz/exam/exam-feign/src/main/java/com/tz/platform/feign/exam/vo/QuestionVo.java @@ -1,5 +1,7 @@ package com.tz.platform.feign.exam.vo; +import com.tz.platform.common.core.bo.Answer; +import com.tz.platform.common.core.bo.SubQuestionVO; import lombok.Data; import lombok.experimental.Accessors; @@ -8,6 +10,20 @@ import java.util.List; @Accessors(chain = true) public class QuestionVo { private Long id; - private Long subId; + private Long courseId; + private String courseName; + private Integer levelId; + private String levelName; + private Integer questionType; + private String title; + private Long score; + private Integer type; + private String content; + private String stem; + private String stemImg; + private Long creatorId; + List answerList; + private String analysis; private List answerId; + private List children; } diff --git a/tz/exam/exam-service/src/main/java/com/tz/platform/exam/feign/FeignExamController.java b/tz/exam/exam-service/src/main/java/com/tz/platform/exam/feign/FeignExamController.java index 52e326d..f291c1f 100644 --- a/tz/exam/exam-service/src/main/java/com/tz/platform/exam/feign/FeignExamController.java +++ b/tz/exam/exam-service/src/main/java/com/tz/platform/exam/feign/FeignExamController.java @@ -3,7 +3,7 @@ package com.tz.platform.exam.feign; import com.tz.platform.common.core.base.BaseController; import com.tz.platform.exam.feign.biz.FeignExamBiz; import com.tz.platform.feign.exam.IFeignExam; -import com.tz.platform.feign.exam.qo.CacheQuetionQO; +import com.tz.platform.feign.exam.qo.CacheQuestionQO; import com.tz.platform.feign.exam.vo.QuestionVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RestController; @@ -17,12 +17,12 @@ public class FeignExamController extends BaseController implements IFeignExam { @Override - public boolean putToCache(CacheQuetionQO qo) { + public boolean putToCache(CacheQuestionQO qo) { return feignExamBiz.putToCache(qo.getIds(),qo.getKey(),qo.getMs()); } @Override - public List listQusetion(CacheQuetionQO qo) { + public List listQusetion(CacheQuestionQO qo) { return feignExamBiz.list(qo.getIds()); } diff --git a/tz/gateway/src/main/java/com/tz/platform/gateway/GlobalErrorAttributes.java b/tz/gateway/src/main/java/com/tz/platform/gateway/GlobalErrorAttributes.java index 90f89e8..691f899 100644 --- a/tz/gateway/src/main/java/com/tz/platform/gateway/GlobalErrorAttributes.java +++ b/tz/gateway/src/main/java/com/tz/platform/gateway/GlobalErrorAttributes.java @@ -9,6 +9,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.boot.web.error.ErrorAttributeOptions; import org.springframework.boot.web.reactive.error.DefaultErrorAttributes; import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler; +import org.springframework.core.annotation.Order; import org.springframework.core.io.buffer.DataBufferFactory; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -24,6 +25,7 @@ import java.util.Map; @Component @Slf4j @RequiredArgsConstructor +@Order(-1) public class GlobalErrorAttributes extends DefaultErrorAttributes implements ErrorWebExceptionHandler { private final ObjectMapper objectMapper; @Override