签到 7天

@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": 1,
        "signDetial": [
            "05-12",
            "05-13",
            "05-14",
            "05-15",
            "05-16",
            "05-17",
            "05-18"
        ],
        "text": "再打卡6次",
        "status": "1"
    }

}

{
    "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 getDatesList(Date date, int days) {
    List dateList = new ArrayList();
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        SimpleDateFormat sdf=new SimpleDateFormat("MM-dd");
        dateList.add(sdf.format(cal.getTime()));
        for(int i=0;i        cal.add(Calendar.DAY_OF_MONTH, 1);
        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天获得礼包重新开始计算

你可能感兴趣的:(签到 7天)