Java实现积分中心功能(包含一周积分板,今天是否已签到,连续签到几天)
概要
Java实现积分中心功能
1,积分中心—查询一周积分板(包括今天是否已签到,连续签到几天)
根据当前的登录人查询一周计分板,要求根据连续签到天数不同,从今天开始展示每天不用的积分:
【连续签到三天每日加1分,第四天至第六加2分,之后每天加3分】
1.1 查询当前登录人今天是否已签到,签到则获取对应的连续签到天数(连续签到字段会讲如何实现)
@Override
public R<MiniPointsMainVO> selectSignInChart(Long memberId) {
MiniPointsMainVO mainVO = new MiniPointsMainVO();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String localDateNow = LocalDate.now().format(formatter);
// 1,今天是否签到(今天如果是首次进入则今日签到数据为空)
PointsDetail detail = baseMapper.selectOne(new QueryWrapper<PointsDetail>().lambda()
.eq(PointsDetail::getMemberId, memberId)
.eq(PointsDetail::getOperateMode, "积分签到")
.eq(PointsDetail::getCreateTime, localDateNow));
// 2.1,存在,则设置【todaySignIn今天是否签到】=1
if (detail != null){
mainVO.setTodaySignIn(CommonConstant.INT_1);
// 2.2,连续签到天数
mainVO.setContinuousDays(detail.getContinuousDays());
}else {
mainVO.setTodaySignIn(CommonConstant.INT_0);
// 3.1 今天没签,则查询昨天是否签到,有则取昨天连续签到天数,否则取0
String yesterday = LocalDate.now().minusDays(1).format(formatter);
// 3.2 查询昨天是否签到
PointsDetail detail_yes = baseMapper.selectOne(new QueryWrapper<PointsDetail>().lambda()
.eq(PointsDetail::getMemberId, memberId)
.eq(PointsDetail::getOperateMode, "积分签到")
.eq(PointsDetail::getCreateTime, yesterday));
// 3.3 昨天签到则获取 昨天【continuousDays连续几天签到】
if (detail_yes != null){
mainVO.setContinuousDays(detail_yes.getContinuousDays());
}else {
mainVO.setContinuousDays(CommonConstant.INT_0);
}
}
// 4,从今天开始计算周几以及根据连续天数计算周几对应的积分数
List<MiniPointsDetailVO> detailVOList = buildWeekPoints(mainVO.getContinuousDays());
mainVO.setDetailVOList(detailVOList);
return R.data(mainVO);
}
1.2 从今天开始计算周几以及根据连续天数计算周几对应的积分数
// 核心方法
private List<MiniPointsDetailVO> buildWeekPoints(Integer continuousDays){
List<MiniPointsDetailVO> detailVOS = new ArrayList<>();
// 从今日开始,获取今天,明天,后天。。共一周数据
for (int i=0; i<7;i++){
MiniPointsDetailVO detailVO = new MiniPointsDetailVO();
// 1,计算每天的积分数(重点)
int points = calculateWeeklyPoints(continuousDays+i);
detailVO.setPoints(Integer.valueOf(points));
// 2,循环获取今天开始一周的日期
LocalDate nextDay = LocalDate.now().plusDays(i);
DayOfWeek dayOfWeek = nextDay.getDayOfWeek();
// 3,使用中文的星期表示
Locale chineseLocale = new Locale("zh", "CN");
String dayOfWeek_CN = dayOfWeek.getDisplayName(TextStyle.FULL, chineseLocale);
// 4,计算周几
detailVO.setWeekDay(dayOfWeek_CN);
detailVOS.add(detailVO);
}
return detailVOS;
}
1.3 计算今天开始共一周的积分数据
private int calculateWeeklyPoints(int consecutiveDays) {
if (consecutiveDays < 3) {
return 1;
} else if (consecutiveDays < 6) {
return 2;
} else {
return 3;
}
}
1.4 2个返回VO类
1,MiniPointsMainVO
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="OrderMessageVO对象", description="客房消息VO类")
public class MiniPointsMainVO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "七天签到数据图展示")
private List<MiniPointsDetailVO> detailVOList;
@ApiModelProperty(value = "今天是否签到(0否,1是)")
private Integer todaySignIn;
@ApiModelProperty(value = "连续几天签到")
private Integer continuousDays;
}
2,MiniPointsDetailVO
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="OrderMessageVO对象", description="客房消息VO类")
public class MiniPointsDetailVO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "周几")
private String weekDay;
@ApiModelProperty(value = "积分数")
private Integer points;
}
2,用户今天点击签到
描述:查询昨天是否有签到记录,如果有则获取昨天的【连续签到天数】字段值,+1后,赋值给今天的签到记录保存。
因为假设从第一天开始,查询昨天签到不存在,则今天连续天数为1,明天查今天,查到连续签到是1,明天+1后就是2,依次类推,只需要查询昨天的连续签到数据+1即可得到今天的连续签到天数。
// 当前登录人id,要加的积分数(用户保存到签到记录表)
@Override
public R dailySignIn(Long memberId, BigDecimal addPoints) {
// 1,需要增加会员积分明细
PointsDetail pointsDetail = new PointsDetail();
// 2,判断是否签到,签到则连续天数=昨天的连续天数+1,否则为1
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String yesterday = LocalDate.now().minusDays(1).format(formatter);
// 3,昨天是否签到
PointsDetail detail = baseMapper.selectOne(new QueryWrapper<PointsDetail>().lambda()
.eq(PointsDetail::getMemberId, memberId)
.eq(PointsDetail::getOperateMode, "积分签到")
.eq(PointsDetail::getCreateTime, yesterday));
if (detail != null){
int continuousDays= detail.getContinuousDays()+1;
pointsDetail.setContinuousDays(Integer.valueOf(continuousDays));
}else {
// 昨天不存在说明今天是第一天签到或者昨天没签到导致断开连续,从1开始计数
pointsDetail.setContinuousDays(CommonConstant.INT_1);
}
pointsDetail.setMemberId(memberId);
pointsDetail.setOperateMode("积分签到");
pointsDetail.setBillAmount(addPoints);
pointsDetail.setCreateTime(LocalDate.now());
log.info(" 会员点击签到{}生成一条【积分签到】积分明细,积分{}", members.getMemberName(), addPoints );
// 新增一条积分明细数据
baseMapper.insert(pointsDetail);
return R.data(pointsDetail.getId(), "签到成功");
}
总结
本文章结合作者项目实战,通过Java实现了小程序常用的积分中心签到功能,如后更好的方式欢迎留言评论,
创作不易,尊重知识,转载请附带本文链接