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;
}
}
}
