Controller
@RequestMapping(value = "/generatetoken",method = RequestMethod.POST,consumes = CONTENT_TYPE_FORMED)
@ResponseBody
public CommonRetureType generateToken() {
String killToken = promoService.generateSecondKillToken(itemId, promoId,userModel.getId());
if (killToken == null){
throw new BusinessException(EmBusinessError.UNKOWN_ERRORR,"生成秒杀令牌失败");
}
return CommonRetureType.create(killToken);
}
Service
@Override
public String generateSecondKillToken(Integer promoId,Integer itemId,Integer userId) {
if(redisTemplate.hasKey("promo_item_stock_invalid_"+itemId)){
return null;
}
PromoDO promoDO = promoDOMapper.selectByPrimaryKey(promoId);
PromoModel promoModel = convertFromDataObject(promoDO);
if(promoModel == null){
return null;
}
if(promoModel.getStartDate().isAfterNow()){
promoModel.setStatus(1);
}else if(promoModel.getEndDate().isBeforeNow()){
promoModel.setStatus(3);
}else{
promoModel.setStatus(2);
}
if(promoModel.getStatus().intValue() != 2){
return null;
}
ItemModel itemModel = itemService.getItemByIdInCache(itemId);
if(itemModel == null){
return null;
}
UserModel userModel = userService.getUserByIdInCache(userId);
if(userModel == null){
return null;
}
long result = redisTemplate.opsForValue().increment("promo_door_count_"+promoId,-1);
if(result < 0){
return null;
}
String token = UUID.randomUUID().toString().replace("-","");
redisTemplate.opsForValue().set("promo_token_"+promoId+"_userid_"+userId+"_itemid_"+itemId,token);
redisTemplate.expire("promo_token_"+promoId+"_userid_"+userId+"_itemid_"+itemId,5, TimeUnit.MINUTES);
return token;
}