Commit b7e673c5 authored by liming's avatar liming

个人成就主页

parent 6cc4a262
package com.antai.sport.http.server.constants;
public class AchievementLevel {
public static final Integer BASE = 10;
public static final Integer ADVANCED = 20;
public static final Integer MASTER = 30;
}
package com.antai.sport.http.server.server.api.business.achievement.controller;
import com.antai.sport.http.server.common.base.Result;
import com.antai.sport.http.server.server.api.business.achievement.dto.AchievementHomeVO;
import com.antai.sport.http.server.server.api.business.achievement.dto.NewAchievementVO;
import com.antai.sport.http.server.server.api.business.achievement.service.AchievementService;
import io.swagger.annotations.Api;
......@@ -28,4 +29,10 @@ public class AchievementController {
public ResponseEntity<Result<List<NewAchievementVO>>> getNewAchievement(@PathVariable("sportUserId") Long sportUserId) {
return success(achievementService.getNewAchievement(sportUserId));
}
@ApiOperation(value = "查询用户成就主页")
@GetMapping("/home/{sportUserId}")
public ResponseEntity<Result<AchievementHomeVO>> getUserAchievementHome(@PathVariable("sportUserId") Long sportUserId) {
return success(achievementService.getUserAchievementHome(sportUserId));
}
}
package com.antai.sport.http.server.server.api.business.achievement.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@ApiModel("成就主页单项成就数据")
public class AchievementHomeItemVO {
@ApiModelProperty("成就名称")
private String achievementName;
@ApiModelProperty("logo url")
private String logo;
@ApiModelProperty("成就说明")
private String remark;
@ApiModelProperty("获得成就时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
private LocalDateTime createTime;
@ApiModelProperty("百分比(精确到小数点后两位)")
private BigDecimal percent;
@ApiModelProperty("是否已获得 true:已获得 false:未获得")
private Boolean awarded;
}
package com.antai.sport.http.server.server.api.business.achievement.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel("个人成就主页数据")
public class AchievementHomeVO {
@ApiModelProperty("已获得成就数量")
private Integer myAchievementNum;
@ApiModelProperty("总成就数量")
private Integer totalAchievementNum;
@ApiModelProperty("初级成就列表")
List<AchievementHomeItemVO> baseAchievementList;
@ApiModelProperty("中级成就列表")
List<AchievementHomeItemVO> advancedAchievementList;
@ApiModelProperty("高级成就列表")
List<AchievementHomeItemVO> masterAchievementList;
}
......@@ -18,6 +18,8 @@ public class NewAchievementVO {
private String logo;
@ApiModelProperty("成就对应赠送积分")
private Integer currency;
@ApiModelProperty("成就等级 10 初级 20 中级 30 高级")
private Integer level;
@ApiModelProperty("成就获取时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
private LocalDateTime createTime;
......
package com.antai.sport.http.server.server.api.business.achievement.service;
import com.antai.sport.http.server.constants.AchievementCondition;
import com.antai.sport.http.server.constants.GameCurrencySourceType;
import com.antai.sport.http.server.constants.GameMode;
import com.antai.sport.http.server.constants.*;
import com.antai.sport.http.server.repository.achievement.entity.Achievement;
import com.antai.sport.http.server.repository.achievement.entity.AchievementForSportUser;
import com.antai.sport.http.server.repository.achievement.mapper.AchievementForSportUserMapper;
import com.antai.sport.http.server.repository.achievement.mapper.AchievementMapper;
import com.antai.sport.http.server.repository.sport.entity.SportUserContinuousLoginDays;
import com.antai.sport.http.server.repository.sport.entity.SportUserSummary;
import com.antai.sport.http.server.repository.sport.mapper.SportUserContinuousLoginDaysMapper;
import com.antai.sport.http.server.repository.sport.mapper.SportUserSummaryMapper;
import com.antai.sport.http.server.server.api.business.achievement.dto.AchievementHomeItemVO;
import com.antai.sport.http.server.server.api.business.achievement.dto.AchievementHomeVO;
import com.antai.sport.http.server.server.api.business.achievement.dto.NewAchievementVO;
import com.antai.sport.http.server.server.api.business.achievement.mapper.AchievementBizMapper;
import com.antai.sport.http.server.server.api.business.sportusergamecurrency.service.SportUserGameCurrencyService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class AchievementService {
@Resource
private AchievementMapper achievementMapper;
@Resource
private AchievementForSportUserMapper achievementForSportUserMapper;
@Resource
private SportUserContinuousLoginDaysMapper sportUserContinuousLoginDaysMapper;
@Resource
private SportUserSummaryMapper sportUserSummaryMapper;
@Resource
private AchievementBizMapper achievementBizMapper;
......@@ -104,4 +120,112 @@ public class AchievementService {
return achievementVOList;
}
/**
* 查询用户成就主页
*
* @param sportUserId
* @return
*/
public AchievementHomeVO getUserAchievementHome(Long sportUserId) {
AchievementHomeVO result = new AchievementHomeVO();
result.setMyAchievementNum(0);
result.setBaseAchievementList(new ArrayList<>());
result.setAdvancedAchievementList(new ArrayList<>());
result.setMasterAchievementList(new ArrayList<>());
QueryWrapper<Achievement> achievementQuery = new QueryWrapper<>();
achievementQuery.lambda().eq(Achievement::getDeleted, DeleteStatus.UNDELETED).orderBy(true, true,
Achievement::getShowOrder);
List<Achievement> achievementList = achievementMapper.selectList(achievementQuery);
result.setTotalAchievementNum(achievementList.size());
QueryWrapper<AchievementForSportUser> myAchievementQuery = new QueryWrapper<>();
myAchievementQuery.lambda().eq(AchievementForSportUser::getSportUserId, sportUserId);
List<AchievementForSportUser> myAchievementList = achievementForSportUserMapper.selectList(myAchievementQuery);
Map<Long, AchievementForSportUser> myAchievementMap = new HashMap<>();
for (AchievementForSportUser myAchievement : myAchievementList) {
myAchievementMap.put(myAchievement.getAchievementId(), myAchievement);
}
QueryWrapper<SportUserContinuousLoginDays> continuousLoginDaysQuery = new QueryWrapper<>();
continuousLoginDaysQuery.lambda().eq(SportUserContinuousLoginDays::getSportUserId, sportUserId);
SportUserContinuousLoginDays continuousLoginDays =
sportUserContinuousLoginDaysMapper.selectOne(continuousLoginDaysQuery);
QueryWrapper<SportUserSummary> summaryQuery = new QueryWrapper<>();
summaryQuery.lambda().eq(SportUserSummary::getUserId, sportUserId);
SportUserSummary summary = sportUserSummaryMapper.selectOne(summaryQuery);
for (Achievement achievement : achievementList) {
AchievementHomeItemVO homeItem = new AchievementHomeItemVO();
homeItem.setAchievementName(achievement.getAchievementName());
homeItem.setLogo(achievement.getLogo());
homeItem.setRemark(achievement.getRemark());
homeItem.setPercent(BigDecimal.ZERO);
if (myAchievementMap.containsKey(achievement.getId())) {
homeItem.setPercent(BigDecimal.ONE);
homeItem.setAwarded(true);
homeItem.setCreateTime(myAchievementMap.get(achievement.getId()).getCreateTime());
result.setMyAchievementNum(result.getMyAchievementNum() + 1);
} else {
homeItem.setAwarded(false);
//计算百分比
//计算签到
if (achievement.getAchievementCondition().equals(AchievementCondition.SIGN_IN_DAYS)) {
if (continuousLoginDays != null) {
homeItem.setPercent(this.calcPercent(continuousLoginDays.getDays(),
achievement.getConditionValue()));
}
}
//计算团练成就
if (summary != null) {
if (achievement.getAchievementCondition().equals(AchievementCondition.TEAM_TRAINING)) {
homeItem.setPercent(this.calcPercent(summary.getTotalTeamTrainingFinishNum(),
achievement.getConditionValue()));
}
if (achievement.getAchievementCondition().equals(AchievementCondition.SIMPLE_MATCH)) {
homeItem.setPercent(this.calcPercent(summary.getTotalSimpleMatchFinishNum(),
achievement.getConditionValue()));
}
if (achievement.getAchievementCondition().equals(AchievementCondition.ROOM_MODE)) {
homeItem.setPercent(this.calcPercent(summary.getTotalGameModeFinishNum(),
achievement.getConditionValue()));
}
if (achievement.getAchievementCondition().equals(AchievementCondition.DISTANCE)) {
homeItem.setPercent(this.calcPercent(summary.getTotalDistance().intValue(),
achievement.getConditionValue()));
}
if (achievement.getAchievementCondition().equals(AchievementCondition.CLIMB_DISTANCE)) {
homeItem.setPercent(this.calcPercent(summary.getTotalClimbDistance().intValue(),
achievement.getConditionValue()));
}
if (achievement.getAchievementCondition().equals(AchievementCondition.CALORIE)) {
homeItem.setPercent(this.calcPercent(summary.getTotalCalorie(),
achievement.getConditionValue()));
}
}
}
if (achievement.getLevel().equals(AchievementLevel.BASE)) {
result.getBaseAchievementList().add(homeItem);
}
if (achievement.getLevel().equals(AchievementLevel.ADVANCED)) {
result.getAdvancedAchievementList().add(homeItem);
}
if (achievement.getLevel().equals(AchievementLevel.MASTER)) {
result.getMasterAchievementList().add(homeItem);
}
}
return result;
}
private BigDecimal calcPercent(Integer molecule, Integer denominator) {
if (molecule == null || denominator == null || denominator == 0) {
return BigDecimal.ZERO;
}
return BigDecimal.valueOf(molecule).divide(BigDecimal.valueOf(denominator), 2, RoundingMode.HALF_UP);
}
}
......@@ -17,7 +17,7 @@
<select id="getNewAchievement"
resultType="com.antai.sport.http.server.server.api.business.achievement.dto.NewAchievementVO">
select t1.id, t2.achievement_name, t2.logo, t2.currency, t1.create_time
select t1.id, t2.achievement_name, t2.logo, t2.currency, t2.level, t1.create_time
from achievement_for_sport_user t1
left join achievement t2 on t1.achievement_id = t2.id
where t1.mark_read = 0
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment