@Service
public class SignLogServiceImpl implements SignLogService{
Logger logger = LoggerFactory.getLogger(SignLogServiceImpl.class);
@Autowired
UserMapper userMapper;
@Autowired
SignLogMapper signLogMapper;
@Autowired
GiftLogMapper giftLogMapper;
@Override
public Map getSignDetial(String uid) {
// 获取用户信息
User user = userMapper.selectByPrimaryKey(uid);
// 返回页面信息
Map returnMap = new HashMap();
// 如果不存在
if(user == null || user.getRecentlySigninDate() == null){
// 状态:0未打卡1已打卡
returnMap.put("status", "0");
// 文案
returnMap.put("text", "立即打卡");
// 打卡明细
returnMap.put("signDetial", DateUtil.getDatesList(DateUtil.getCurrentDate(),6));
// 打卡次数
returnMap.put("signCount", 0);
return returnMap;
}
// 今日
String today = DateUtil.getCurrentDateByFormat("yyyy-MM-dd");
String recentlySignInDay = DateUtil.formatDate(user.getRecentlySigninDate(), "yyyy-MM-dd");
// 已经打卡
if(today.equals(recentlySignInDay)){
// 0未打卡1已打卡
returnMap.put("status", "1");
// 连续打卡次数
returnMap.put("signCount", user.getContinuousSigninTimes());
// 是否满足领取条件
if(user.getContinuousSigninTimes()==7){
// 文案
returnMap.put("text", "您已领取");
}else{
int count = 7-user.getContinuousSigninTimes().intValue();
// 文案
returnMap.put("text", "再打卡"+count+"次");
}
Date signDateStar = DateUtil.addDays(DateUtil.getCurrentDate(),-1*(user.getContinuousSigninTimes().intValue()-1));
// 打卡明细
returnMap.put("signDetial", DateUtil.getDatesList(signDateStar,6));
// 今日尚未打卡
}else{
// 0未打卡1已打卡
returnMap.put("status", "0");
// 昨天是否打卡过
if(DateUtil.isYesterday(user.getRecentlySigninDate())){
if(user.getContinuousSigninTimes().intValue()==7){
// 状态:0未打卡1已打卡
returnMap.put("status", "0");
// 文案
returnMap.put("text", "立即打卡");
// 打卡明细
returnMap.put("signDetial", DateUtil.getDatesList(DateUtil.getCurrentDate(),6));
// 打卡次数
returnMap.put("signCount", 0);
}else{
// 连续打卡次数
returnMap.put("signCount", user.getContinuousSigninTimes());
Date signDateStar = DateUtil.addDays(DateUtil.getCurrentDate(),-1*user.getContinuousSigninTimes().intValue());
// 打卡明细
returnMap.put("signDetial", DateUtil.getDatesList(signDateStar,6));
}
}else{
// 连续打卡次数
returnMap.put("signCount", 0);
// 打卡明细
returnMap.put("signDetial", DateUtil.getDatesList(DateUtil.getCurrentDate(),6));
}
// 文案
returnMap.put("text", "立即打卡");
}
return returnMap;
}
@Override
public Map doSign(String uid) {
// 防止用户
String keyuid = "doSign_falg" + uid;
// 获取缓存
String uidRedis = RedisUtil.get(keyuid);
if(uidRedis != null){
throw new MemberException(ErrorInfoConsts.BUSINESS_ERROR_CODE_41008, "处理中");
}else{
// 存入redis缓存
RedisUtil.set(keyuid, uid, 60);
}
Map map = new HashMap();
try{
// 获取用户信息
User user = userMapper.selectByPrimaryKey(uid);
// 如果用户不存在
if(user == null){
user = new User();
user.setContinuousSigninTimes(1);
user.setRecentlySigninDate(DateUtil.getCurrentDate());
user.setUid(uid);
user.setWelcomeGiftFlag("0");
userMapper.insertSelective(user);
// 登录日志表
insertSignLog(uid);
return null;
}
// 是否今天第一次签到
String today = DateUtil.getCurrentDateByFormat("yyyy-MM-dd");
int flag=0;
// 尚未打卡
if(user.getRecentlySigninDate() == null){
flag=1;
}else{
String recentlySignInDay = DateUtil.formatDate(user.getRecentlySigninDate(), "yyyy-MM-dd");
// 已经打卡
if(today.equals(recentlySignInDay)){
flag=0;
// 今日尚未打卡
}else{
flag=1;
}
}
if(flag ==0){
throw new MemberException(ErrorInfoConsts.BUSINESS_ERROR_CODE_41008, "您已经打过卡了");
}
// 更新用户表
User userUpdate = new User();
userUpdate.setUid(uid);
// 最近打卡日期
userUpdate.setRecentlySigninDate(DateUtil.getCurrentDate());
// 昨天打卡了
if(DateUtil.isYesterday(user.getRecentlySigninDate())){
// 打卡次数加1
int count = user.getContinuousSigninTimes().intValue()+1;
//
if(count ==3){
// 是否领取过欢迎礼包
if("0".equals(user.getWelcomeGiftFlag())){
map.put("flag", "获取礼品3");
userUpdate.setWelcomeGiftFlag("1");
userUpdate.setContinuousSigninTimes(count);
}else{
userUpdate.setContinuousSigninTimes(count);
}
}else if(count==7){
userUpdate.setContinuousSigninTimes(count);
map.put("flag", "获取礼品3");
// 第八次清空
}else if(count==8){
userUpdate.setContinuousSigninTimes(1);
}else{
userUpdate.setContinuousSigninTimes(count);
}
// 昨天未打卡
}else{
// 清空原先记录
userUpdate.setContinuousSigninTimes(1);
}
// 如果领取成功,更新,领取失败,不操作,重新打卡
try{
userMapper.updateByPrimaryKeySelective(userUpdate);
}catch(Exception e){
e.printStackTrace();
logger.error("更新用户表异常{},{}",uid,DateUtil.getCurrentDate());
throw new MemberException(ErrorInfoConsts.BUSINESS_ERROR_CODE_41007, "签到异常联系客服");
}
// 登录日志表
insertSignLog(uid);
}catch (Exception e) {
e.printStackTrace();
throw e;
}finally {
RedisUtil.delete(keyuid);
}
return map;
}
private void insertSignLog(String uid){
// 登录日志表
SignLog signLog = new SignLog();
signLog.setId(UUIDUtils.getUUID());
signLog.setSignTime(DateUtil.getCurrentDate());
signLog.setUid(uid);
try{
signLogMapper.insertSelective(signLog);
}catch(Exception e){
e.printStackTrace();
logger.error("登录日志表异常{},{}",uid,DateUtil.getCurrentDate());
}
}
}
}
{
"code": "200",
"message": "OK",
"data": {
"signCount": 7,
"signDetial": [
"05-10",
"05-11",
"05-12",
"05-13",
"05-14",
"05-15",
"05-16"
],
"text": "您已领取",
"status": "1"
}
}
{
"code": "41008",
"message": "您已经打过卡了",
"data": null
}
public static List
List
Calendar cal = Calendar.getInstance();
cal.setTime(date);
SimpleDateFormat sdf=new SimpleDateFormat("MM-dd");
dateList.add(sdf.format(cal.getTime()));
for(int i=0;i
dateList.add(sdf.format(cal.getTime()));
}
return dateList;
}
#用户表
DROP TABLE IF EXISTS user ;
CREATE TABLE user (
`uid` varchar(64) Not NULL COMMENT '用户ID: 用户中心的用户ID',
`recently_signIn_date` date() DEFAULT NULL COMMENT '最近签到日期',
`continuous_signIn_times` int(9) DEFAULT 0 COMMENT '连续签到次数',
`welcome_gift_flag` varchar(1) DEFAULT 0 COMMENT '欢迎礼包标志: 0:未领取1:已领取',
`create_date` timestamp Not NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_date` timestamp NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';
#用户签到日志表
DROP TABLE IF EXISTS sign_log ;
CREATE TABLE sign_log (
`id` varchar(64) Not NULL COMMENT 'ID',
`uid` varchar(64) DEFAULT NULL COMMENT '用户ID',
`sign_time` timestamp NULL DEFAULT NULL COMMENT '签到时间',
`create_date` timestamp Not NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_date` timestamp NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户签到日志表';
需求:
1.第一次连续签到3天,领取欢迎礼包
2.连续7天签到,领取礼包
3.中断清零,第8天清零
4.7天为一个周期,若未打过卡或未连续打卡,则左起第一个为今天,
若连续打卡,则从左到右显示连续打卡天数,直至连续打卡7天获得礼包重新开始计算