diff --git a/mt/src/main/java/com/ccsens/mt/api/TopicController.java b/mt/src/main/java/com/ccsens/mt/api/TopicController.java index 1e6da26d..da0f790d 100644 --- a/mt/src/main/java/com/ccsens/mt/api/TopicController.java +++ b/mt/src/main/java/com/ccsens/mt/api/TopicController.java @@ -3,6 +3,7 @@ package com.ccsens.mt.api; import com.ccsens.mt.bean.dto.TopicDto; import com.ccsens.mt.bean.vo.TopicVo; import com.ccsens.mt.service.ITopicService; +import com.ccsens.util.CodeEnum; import com.ccsens.util.JsonResponse; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParams; @@ -69,6 +70,16 @@ public class TopicController { return JsonResponse.newInstance().ok(queryRankings); } + @ApiOperation(value = "晋级", notes = "") + @ApiImplicitParams({ + }) + @RequestMapping(value = "/promoted", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) + public JsonResponse promoted(@RequestBody @ApiParam @Validated TopicDto.Promoted promoted) throws Exception { + log.info("查排名:{}",promoted.toString()); + CodeEnum codeEnum = topicService.promoted(promoted); + return JsonResponse.newInstance().ok(codeEnum); + } + @ApiOperation(value = "选手抢答", notes = "") @ApiImplicitParams({ }) @@ -80,7 +91,6 @@ public class TopicController { } - /*=============================================================================*/ @ApiOperation(value = "主持人在大屏点击开始抢答(倒计时结束后)", notes = "") @ApiImplicitParams({ }) @@ -100,6 +110,7 @@ public class TopicController { public JsonResponse getResponder(@RequestBody @ApiParam @Validated TopicDto.Topic topic) throws Exception { log.info("查询抢答成功的组:{}",topic.toString()); TopicVo.GroupInfo group = topicService.getResponder(topic); + return JsonResponse.newInstance().ok(group); } diff --git a/mt/src/main/java/com/ccsens/mt/api/VoteController.java b/mt/src/main/java/com/ccsens/mt/api/VoteController.java index e8638196..9d70c949 100644 --- a/mt/src/main/java/com/ccsens/mt/api/VoteController.java +++ b/mt/src/main/java/com/ccsens/mt/api/VoteController.java @@ -43,14 +43,13 @@ public class VoteController { return JsonResponse.newInstance().ok(); } - @MustLogin @ApiOperation(value = "查询投票结果", notes = "") @ApiImplicitParams({ }) @RequestMapping(value = "/get", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) public JsonResponse> queryVote(@RequestBody @ApiParam @Validated QueryDto params) throws Exception { log.info("查询投票结果:{}",params.toString()); - List groupInfoList = voteService.queryVote(params); + List groupInfoList = voteService.queryVote(params.getParam()); return JsonResponse.newInstance().ok(groupInfoList); } diff --git a/mt/src/main/java/com/ccsens/mt/bean/dto/TopicDto.java b/mt/src/main/java/com/ccsens/mt/bean/dto/TopicDto.java index fbeaf9be..60f4ea22 100644 --- a/mt/src/main/java/com/ccsens/mt/bean/dto/TopicDto.java +++ b/mt/src/main/java/com/ccsens/mt/bean/dto/TopicDto.java @@ -24,6 +24,9 @@ public class TopicDto { @NotNull @ApiModelProperty("当前环节的题号") private int topicNum; + @NotNull + @ApiModelProperty("项目ID") + private long projectId; } @Data @@ -69,6 +72,17 @@ public class TopicDto { private int linkType; } + @Data + @ApiModel("晋级") + public static class Promoted{ + @ApiModelProperty("晋级 1志在必得 2以快制胜 3绝地反击 4你说我猜") + @Min(1) + @Max(4) + private Byte linkTypes; + @ApiModelProperty("分组ID") + private List groupIds; + } + @Data @ApiModel("题目id") public static class Topic{ diff --git a/mt/src/main/java/com/ccsens/mt/bean/vo/TopicVo.java b/mt/src/main/java/com/ccsens/mt/bean/vo/TopicVo.java index 2cb9ef27..4da64334 100644 --- a/mt/src/main/java/com/ccsens/mt/bean/vo/TopicVo.java +++ b/mt/src/main/java/com/ccsens/mt/bean/vo/TopicVo.java @@ -24,6 +24,32 @@ public class TopicVo { private List options; @ApiModelProperty("正确答案") private String answersTrue; + @ApiModelProperty("题号") + private int sequence; + @ApiModelProperty("有无上一个:0:无 1:有") + private Byte prev; + @ApiModelProperty("有无下一个:0:无 1:有") + private Byte next; + @ApiModelProperty("答案") + private List answers; + } + + @Data + @ApiModel("最小和最大题号") + public static class TopicSequence{ + @ApiModelProperty("最小题号") + private Integer min ; + @ApiModelProperty("最大题号") + private Integer max ; + } + + public static class Answer{ + @ApiModelProperty("分组ID") + private Long groupId; + @ApiModelProperty("分组的名字") + private String groupName; + @ApiModelProperty("答案") + private String answer; } @Data diff --git a/mt/src/main/java/com/ccsens/mt/persist/dao/TopicDao.java b/mt/src/main/java/com/ccsens/mt/persist/dao/TopicDao.java index bdf040b6..57b142dd 100644 --- a/mt/src/main/java/com/ccsens/mt/persist/dao/TopicDao.java +++ b/mt/src/main/java/com/ccsens/mt/persist/dao/TopicDao.java @@ -29,6 +29,14 @@ public interface TopicDao extends MtTopicMapper { * @return */ List queryGroupByProject(@Param("projectId")Long projectId, @Param("linkType")int linkType, @Param("type")int type); + /** + * 查询答案 + * @param projectId + * @param topicId + * @return + */ + List queryAnswer(@Param("projectId") Long projectId, @Param("topicId")Long topicId); + /** * 查询所有绝地反击类型的题 * @param getTopicAll 请求类型 @@ -44,10 +52,17 @@ public interface TopicDao extends MtTopicMapper { List queryOption(@Param("topicId") Long topicId); /** +<<<<<<< HEAD * 查询当前阶段的排名 * @param projectId 项目id * @param linkType 阶段类型 * @return 返回排名(按分数从大到小排列) */ List queryRanking(@Param("projectId")Long projectId, @Param("linkType")int linkType); + /** + * 查询该类型下最小最大题号 + * @param linkType 类型 + * @return 最小 最大 + */ + TopicVo.TopicSequence getMinAndMax(@Param("linkType") int linkType); } diff --git a/mt/src/main/java/com/ccsens/mt/persist/dao/VoteDao.java b/mt/src/main/java/com/ccsens/mt/persist/dao/VoteDao.java new file mode 100644 index 00000000..f4bd23e4 --- /dev/null +++ b/mt/src/main/java/com/ccsens/mt/persist/dao/VoteDao.java @@ -0,0 +1,30 @@ +package com.ccsens.mt.persist.dao; + +import com.ccsens.mt.bean.dto.TopicDto; +import com.ccsens.mt.bean.vo.VoteVo; +import com.ccsens.mt.persist.mapper.MtVoteMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @description: 投票 + * @author: whj + * @time: 2020/8/13 18:52 + */ +public interface VoteDao extends MtVoteMapper { + /** + * 查看投票结果 + * @param params + * @return + */ + List queryVote(TopicDto.Project params); + + /** + * 判断是否已经在当前项目中投票 + * @param userId + * @param projectId + * @return + */ + long countUserVoteNums(@Param("userId") Long userId, @Param("projectId") Long projectId); +} diff --git a/mt/src/main/java/com/ccsens/mt/service/ITopicService.java b/mt/src/main/java/com/ccsens/mt/service/ITopicService.java index 4bc44e25..a82de2d0 100644 --- a/mt/src/main/java/com/ccsens/mt/service/ITopicService.java +++ b/mt/src/main/java/com/ccsens/mt/service/ITopicService.java @@ -2,9 +2,13 @@ package com.ccsens.mt.service; import com.ccsens.mt.bean.dto.TopicDto; import com.ccsens.mt.bean.vo.TopicVo; +import com.ccsens.util.CodeEnum; import java.util.List; +/** + * @author zy + */ public interface ITopicService { /** * 通过比赛环节查询题目 @@ -53,9 +57,16 @@ public interface ITopicService { TopicVo.GroupInfo getResponder(TopicDto.Topic topic); /** - * 查询所有绝地反击类型的题 - * @param getTopicAll - * @return + * 根据类型和数量查询试题 + * @param getTopicAll 类型 + * @return 试题 */ List queryTopicAllByLink(TopicDto.GetTopicAll getTopicAll); + + /** + * 晋级 + * @param promoted 晋级组信息 + * @return 结果 + */ + CodeEnum promoted(TopicDto.Promoted promoted); } diff --git a/mt/src/main/java/com/ccsens/mt/service/IVoteService.java b/mt/src/main/java/com/ccsens/mt/service/IVoteService.java index 1e40be28..150fd9b0 100644 --- a/mt/src/main/java/com/ccsens/mt/service/IVoteService.java +++ b/mt/src/main/java/com/ccsens/mt/service/IVoteService.java @@ -15,8 +15,8 @@ public interface IVoteService { /** * 查看投票结果 - * @param params + * @param project * @return */ - List queryVote(QueryDto params); + List queryVote(TopicDto.Project project); } diff --git a/mt/src/main/java/com/ccsens/mt/service/MessageServicer.java b/mt/src/main/java/com/ccsens/mt/service/MessageServicer.java index 787633ae..e10b94b5 100644 --- a/mt/src/main/java/com/ccsens/mt/service/MessageServicer.java +++ b/mt/src/main/java/com/ccsens/mt/service/MessageServicer.java @@ -10,8 +10,12 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.core.AmqpTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + @Slf4j @Service +@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public class MessageServicer implements IMessageService{ @Autowired private AmqpTemplate rabbitTemplate; diff --git a/mt/src/main/java/com/ccsens/mt/service/ScoreService.java b/mt/src/main/java/com/ccsens/mt/service/ScoreService.java index ede50273..66c6a059 100644 --- a/mt/src/main/java/com/ccsens/mt/service/ScoreService.java +++ b/mt/src/main/java/com/ccsens/mt/service/ScoreService.java @@ -30,6 +30,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.ResourceLoader; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; import java.io.*; import java.math.BigDecimal; @@ -38,6 +40,7 @@ import java.util.*; import static java.math.BigDecimal.ROUND_HALF_UP; @Service +@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public class ScoreService implements IScoreService { @Autowired private TallFeignClient tallFeignClient; diff --git a/mt/src/main/java/com/ccsens/mt/service/SigninService.java b/mt/src/main/java/com/ccsens/mt/service/SigninService.java index 14343c9d..0c126c7e 100644 --- a/mt/src/main/java/com/ccsens/mt/service/SigninService.java +++ b/mt/src/main/java/com/ccsens/mt/service/SigninService.java @@ -15,11 +15,14 @@ import com.ccsens.util.CodeEnum; import com.ccsens.util.exception.BaseException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; @Service +@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public class SigninService implements ISigninService{ @Autowired private MtSigninDao mtSigninDao; diff --git a/mt/src/main/java/com/ccsens/mt/service/TopicService.java b/mt/src/main/java/com/ccsens/mt/service/TopicService.java index 440843a4..e5fa2306 100644 --- a/mt/src/main/java/com/ccsens/mt/service/TopicService.java +++ b/mt/src/main/java/com/ccsens/mt/service/TopicService.java @@ -5,11 +5,13 @@ import cn.hutool.core.lang.Snowflake; import cn.hutool.core.util.ObjectUtil; import com.ccsens.mt.bean.dto.TopicDto; import com.ccsens.mt.bean.po.*; +import com.ccsens.mt.bean.po.MtGroup; import com.ccsens.mt.bean.vo.TopicVo; import com.ccsens.mt.persist.dao.GroupDao; import com.ccsens.mt.persist.dao.GroupTopicDao; import com.ccsens.mt.persist.dao.TopicDao; import com.ccsens.mt.persist.mapper.MtResponderMapper; +import com.ccsens.mt.persist.mapper.MtGroupMapper; import com.ccsens.mt.util.Constant; import com.ccsens.util.CodeEnum; import com.ccsens.util.RedisUtil; @@ -39,11 +41,25 @@ public class TopicService implements ITopicService{ private GroupTopicDao groupTopicDao; @Resource private MtResponderMapper mtResponderMapper; + @Resource + private MtGroupMapper mtGroupMapper; @Override public TopicVo.TopicInfo getTopicByLink(TopicDto.GetTopic getTopic) { log.info("查询题目:{}",getTopic.toString()); - return topicDao.getTopicByLink(getTopic.getLinkType(),getTopic.getTopicNum()); + TopicVo.TopicInfo topicInfo = topicDao.getTopicByLink(getTopic.getLinkType(), getTopic.getTopicNum()); + if (topicInfo == null) { + throw new BaseException(CodeEnum.PARAM_ERROR); + } + // 查询做题答案 + List answers = topicDao.queryAnswer(getTopic.getProjectId(), topicInfo.getTopicId()); + // 查询是否有最小最大序号 + TopicVo.TopicSequence sequence = topicDao.getMinAndMax(getTopic.getLinkType()); + + topicInfo.setAnswers(answers); + topicInfo.setPrev(topicInfo.getSequence() == sequence.getMin() ? (byte)0 : 1); + topicInfo.setNext(topicInfo.getSequence() == sequence.getMax() ? (byte)0 : 1); + return topicInfo; } @Override @@ -177,7 +193,14 @@ public class TopicService implements ITopicService{ Object o = redisUtil.get(topic.getProjectId() + Constant.Redis.RESPONDER + topic.getTopicId()); log.info("缓存:{}", o); if (o!=null) { - return (TopicVo.GroupInfo)o; + MtGroup mtGroup = mtGroupMapper.selectByPrimaryKey((Long) o); + if (mtGroup == null) { + throw new BaseException(CodeEnum.PARAM_ERROR); + } + TopicVo.GroupInfo info = new TopicVo.GroupInfo(); + info.setGroupId(mtGroup.getId()); + info.setGroupName(mtGroup.getName()); + return info; } TopicVo.GroupInfo info = groupDao.getResponder(topic); log.info("查询抢答成功的组:{}", info); @@ -191,4 +214,16 @@ public class TopicService implements ITopicService{ log.info("所有绝地反击题:{}", list); return list; } + + @Override + public CodeEnum promoted(TopicDto.Promoted promoted) { + + promoted.getGroupIds().forEach(groupId -> { + MtGroup mtGroup = new MtGroup(); + mtGroup.setId(groupId); + mtGroup.setAdvanceStatus(promoted.getLinkTypes()); + mtGroupMapper.updateByPrimaryKeySelective(mtGroup); + }); + return CodeEnum.SUCCESS; + } } diff --git a/mt/src/main/java/com/ccsens/mt/service/UserService.java b/mt/src/main/java/com/ccsens/mt/service/UserService.java index 28ba0c3a..524ad55b 100644 --- a/mt/src/main/java/com/ccsens/mt/service/UserService.java +++ b/mt/src/main/java/com/ccsens/mt/service/UserService.java @@ -10,11 +10,14 @@ import com.ccsens.util.exception.BaseException; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpServletRequest; @Slf4j @Service +@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public class UserService implements IUserService{ @Autowired private TallFeignClient tallFeignClient; diff --git a/mt/src/main/java/com/ccsens/mt/service/VoteService.java b/mt/src/main/java/com/ccsens/mt/service/VoteService.java index 80b3c8d6..3efe86a6 100644 --- a/mt/src/main/java/com/ccsens/mt/service/VoteService.java +++ b/mt/src/main/java/com/ccsens/mt/service/VoteService.java @@ -1,21 +1,83 @@ package com.ccsens.mt.service; +import cn.hutool.core.lang.Snowflake; import com.ccsens.mt.bean.dto.TopicDto; +import com.ccsens.mt.bean.po.MtGroup; +import com.ccsens.mt.bean.po.MtVote; import com.ccsens.mt.bean.vo.VoteVo; +import com.ccsens.mt.persist.dao.VoteDao; +import com.ccsens.mt.persist.mapper.MtGroupMapper; +import com.ccsens.mt.util.Constant; +import com.ccsens.util.CodeEnum; import com.ccsens.util.bean.dto.QueryDto; +import com.ccsens.util.exception.BaseException; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; import java.util.List; +@Slf4j @Service +@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public class VoteService implements IVoteService{ + + @Resource + private VoteDao voteDao; + @Resource + private MtGroupMapper mtGroupMapper; + @Resource + private Snowflake snowflake; + @Override public void saveVote(QueryDto> params) { + Long projectId = null; + List groups = params.getParam(); + + //获取项目ID,并校验参数 + if (groups == null || groups.size() != Constant.VOTE_TOTAL) { + throw new BaseException(CodeEnum.PARAM_ERROR); + } + for (TopicDto.Group group: groups) { + if (group == null || group.getGroupId() == null) { + throw new BaseException(CodeEnum.PARAM_ERROR); + } + MtGroup mtGroup = mtGroupMapper.selectByPrimaryKey(group.getGroupId()); + if (mtGroup == null) { + throw new BaseException(CodeEnum.PARAM_ERROR); + } + if (projectId == null) { + projectId = mtGroup.getProjectId(); + } else { + if (projectId.longValue() != mtGroup.getId().longValue()) { + throw new BaseException(CodeEnum.PARAM_ERROR); + } + } + } + + // 判断是否在当前项目中已投 + long count = voteDao.countUserVoteNums(params.getUserId(), projectId); + log.info("{}-{}投票数:{}", params.getUserId(), projectId, count); + if (count > 0) { + throw new BaseException(CodeEnum.VOTED); + } + groups.forEach(group -> { + MtVote mtVote = new MtVote(); + mtVote.setId(snowflake.nextId()); + mtVote.setGroupId(group.getGroupId()); + mtVote.setUserId(params.getUserId()); + voteDao.insertSelective(mtVote); + }); + } @Override - public List queryVote(QueryDto params) { - return null; + public List queryVote(TopicDto.Project params) { + + + return voteDao.queryVote(params); } } diff --git a/mt/src/main/java/com/ccsens/mt/util/Constant.java b/mt/src/main/java/com/ccsens/mt/util/Constant.java index bef13826..4934eb3e 100644 --- a/mt/src/main/java/com/ccsens/mt/util/Constant.java +++ b/mt/src/main/java/com/ccsens/mt/util/Constant.java @@ -15,4 +15,6 @@ public class Constant { public final static String RESPONDER = "_responder_"; } + + public static final int VOTE_TOTAL = 2; } diff --git a/mt/src/main/resources/application.yml b/mt/src/main/resources/application.yml index 5c2cd5c4..5889ff7f 100644 --- a/mt/src/main/resources/application.yml +++ b/mt/src/main/resources/application.yml @@ -1,4 +1,4 @@ spring: profiles: - active: dev - include: common, util-dev \ No newline at end of file + active: test + include: common, util-test \ No newline at end of file diff --git a/mt/src/main/resources/mapper_dao/GroupDao.xml b/mt/src/main/resources/mapper_dao/GroupDao.xml index b51f3262..9bc3814e 100644 --- a/mt/src/main/resources/mapper_dao/GroupDao.xml +++ b/mt/src/main/resources/mapper_dao/GroupDao.xml @@ -14,6 +14,7 @@ r.group_id = g.id AND g.project_id = #{projectId} AND r.topic_id = #{topicId} + AND g.type = 0 AND r.rec_status = 0 AND g.rec_status = 0 ORDER BY diff --git a/mt/src/main/resources/mapper_dao/TopicDao.xml b/mt/src/main/resources/mapper_dao/TopicDao.xml index 790ab703..621e1f26 100644 --- a/mt/src/main/resources/mapper_dao/TopicDao.xml +++ b/mt/src/main/resources/mapper_dao/TopicDao.xml @@ -51,9 +51,11 @@ p.link_type = #{linkType} and p.rec_status = 0 and (g.project_id = #{projectId} or g.id is null) + and (g.type = 0 or g.id is null) and (gp.rec_status = 0 or gp.id is null) and (g.rec_status = 0 or gp.id is null) GROUP BY p.id + order by p.score LIMIT ${nums} + + + SELECT + g.id as groupId, + g.name as groupName, + count(*) as voteNums + FROM + t_mt_group g + LEFT JOIN t_mt_vote v ON g.id = v.group_id + WHERE + g.project_id = #{projectId} + AND g.type = 1 + AND g.rec_status = 0 + AND ( v.rec_status = 0 OR v.id IS NULL ) + GROUP BY g.id, g.name + + + \ No newline at end of file diff --git a/util/src/main/java/com/ccsens/util/CodeEnum.java b/util/src/main/java/com/ccsens/util/CodeEnum.java index 9cdd69d4..6f096563 100644 --- a/util/src/main/java/com/ccsens/util/CodeEnum.java +++ b/util/src/main/java/com/ccsens/util/CodeEnum.java @@ -131,6 +131,7 @@ public enum CodeEnum { VERIFICATION_CODE_PAST(110,"验证码失效,请刷新重试",true), VERIFICATION_CODE_ERROR(111,"验证码错误",true), NOT_ROW(112,"该行不存在",true), + VOTED(113,"对不起,您已经支持过看好的队伍了",true), NOT_TOPIC(113,"找不到该题目",true), NOT_GROUP(113,"找不到该组信息",true),