1. 需求分析
簽到可以獲得積分,禮券,小樣,正品等
連續簽到,需要顯示給用戶,已經連續簽到多少天
若中斷簽到,從中斷后的第一天簽到時間,開始計算簽到時間
有沒有補簽功能
展示簽到的歷史,顯示該會員已經連續簽到多少天
簽到對於時間的精確度要求比較高,當天簽到的,那么記錄的簽到時間是當天,如果還有后續的一系列操作,比如計算積分,那后續操作的時間必須和簽到的時間一致
對於凌晨,跨天之類的場景,特別需要注意
2.表結構設計
會員表,積分表,是以前就有的,本次新增簽到功能,需要新增一下的表:
首先要有記錄用戶簽到,暫且定義為HSignIn表
3. 后台代碼實現
Controller
@RestController @RequestMapping(value = "signIn") public class SignController extends BaseController { @Autowired SignInService signInService; @Autowired SocialProviderService socialProviderService; @ApiOperation(value = "簽到歷史記錄查詢", notes = "簽到歷史記錄查詢") @GetMapping(value = "history", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE}) private ResponseBean signHis(@RequestParam("userId") String userId, @RequestParam("social") String social) { ResponseBean responseBean = new ResponseBean(); SignInHisResponse signInHisResponse = signInService.getSignInRecord(userId, social); responseBean.setData(signInHisResponse); return responseBean; } @ApiOperation(value = "天貓簽到", notes = "天貓簽到") @GetMapping(value = "signInTmallByJasmine", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE}) private ResponseBean signInTmallByJasmine(@RequestParam("userId") String userId, @RequestParam("time") Long time, @RequestParam("social") String social) { ResponseBean responseBean = new ResponseBean(); SignInHisResponse signInHisResponse = signInService.tmallSignInWithTime(userId, social,time); responseBean.setData(signInHisResponse); return responseBean; } }
具體實現:
連續簽到,今日是否已經簽到 ===方法判斷
private static int getContinuousSignInDay( List<HTmallSignInRecord> signInList) { // continuousDay 連續簽到數 int continuousDay = 1; boolean todaySignIn = false; Date today = new Date(); for (int i = 0; i < signInList.size(); i++) { HTmallSignInRecord signIn = signInList.get(i); int intervalDay = distanceDay(today, signIn.getSignDT()); // 當天簽到 if (intervalDay == 0 && i == 0) { todaySignIn = true; } else if (intervalDay == continuousDay) { continuousDay++; } else { // 不連續,終止判斷 break; } } if (!todaySignIn) { continuousDay--; } return continuousDay; } /** * 兩個日期對比間隔天數 * * @param smallDay * @return boolean * @Param largeDay **/ private static int distanceDay(Date largeDay, Date smallDay) { int day = (int) ((largeDay.getTime() - smallDay.getTime()) / (1000 * 60 * 60 * 24)); return day; }
簽到相關的接口
public interface SignInService { SignInHisResponse getSignInRecord(String userId, String social); SignInHisResponse tmallSignIn(String userId, String social); SignInHisResponse tmallSignInWithTime(String userId, String social,Long time); }
和具體的實現
@Service public class SignInServiceImpl implements SignInService { @Autowired HTmallSignMapper hTmallSignMapper; @Autowired SocialService socialService; @Autowired SocialProviderService socialProviderService; @Autowired BCustomerService bCustomerService; @Autowired PEService peService; @Autowired CustomerService customerService; @Autowired SendMemberInfoToEcrmMqTask sendMemberInfoToEcrmMqTask; @Value("${sys.name}") private String sysName; @Value("${pe.event.signIn.tmall}") String tmallSignInPeEventCode; @Override public SignInHisResponse getSignInRecord(String userId, String social) { int cstId = socialService.findCstIdBySocialAndSocialId(userId, social); SignInHisResponse signInHisResponse = new SignInHisResponse(); List<HTmallSignInRecord> tlist = hTmallSignMapper.getTmallSignRecords(cstId); signInHisResponse.setAlreadySignInTodayFlag((hTmallSignMapper.getSignInToday(cstId) > 0) ? true : false); if (null != tlist && tlist.size() > 0) { signInHisResponse.setTmallSignInRecords(tlist); signInHisResponse .setContinuousSignInDay(getContinuousSignInDay(tlist)); } return signInHisResponse; } @Override public SignInHisResponse tmallSignInWithTime(String userId, String social, Long time) { Date date = new Date(time); SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String tt =sd.format(date); int cstId = socialService.findCstIdBySocialAndSocialId(userId, social); SignInHisResponse signInHisResponse = new SignInHisResponse(); // 今天是否已簽到 if (hTmallSignMapper.getSignInThisDay(cstId,tt) > 0){ System.out.println("今日已經簽到"); List<HTmallSignInRecord> tlist = hTmallSignMapper.getTmallSignRecords(cstId); signInHisResponse.setTmallSignInRecords(tlist); return signInHisResponse;} else { // 開始簽到 Boolean result = hTmallSignMapper.insertSignInRecord4ThisDay(cstId, tt); if (result) { List<HTmallSignInRecord> tlist = hTmallSignMapper.getTmallSignRecords(cstId); signInHisResponse.setAlreadySignInTodayFlag((hTmallSignMapper.getSignInToday(cstId) > 0) ? true : false); signInHisResponse.setContinuousSignInDay(getContinuousSignInDay(tlist)); signInHisResponse.setTmallSignInRecords(tlist); try { peService.sendEventWithTime(cstId, sysName, tmallSignInPeEventCode, time); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } sendMemberInfoToEcrmMqTask.syncMemberInfoToECRM(cstId,tmallSignInPeEventCode); } return signInHisResponse; } } }