Lucky vs Unluck

忙碌的一天中经历了忘订午餐、寻找饭点未果、观看《下雪了》奇幻舞台剧等一系列趣事。该剧舞台效果出色,互动丰富,尽管剧情难以理解,但仍给人留下深刻印象。

今天事情多了。。。
上午带人检查作业,午饭忘了订,结果有人居然帮我订好了——但我知道的时候已经1点了
下午去单老师那里混了几本清华的教程,那里还有很多,质量都不行
然后去搞软件产品登记的事情,结果科技处、校办没有一个知道怎么办,只好把材料丢在科技处小徐那里,等明天下午去看情况

然后搞笑的事情来了
晚上去东方艺术中心看《下雪了》,结果路上把票搞丢了
跑到售票处,好说殆说就是不肯帮我和门卫说一句
然后找到大堂经理,给她看了购票的短信,然后看到票确实已出,同意开场10分钟后,如果座位还空着就让我们进去
结果终于进去了——东方艺术中心有点蛮好,一开场就关门,10分钟放一波进去,不过门外有一个屏幕可以看里面情况的,还是有很多人在外面等的


这是一件,还有更搞笑的
我们从地铁出来以后,科技馆附近怎么也找不到吃饭的地方,跑了30分钟,我想算了,就去东方艺术中心八音盒饭店吧,据说有90的和250的套餐。
跑进去坐下一看,一个人都没有,再一看菜单,550、800、1100,faint...然后问了一下,说上面两个都是中午特价
于是灰溜溜的跑出来,还好服务员很好的告诉我们上面有三明治,终于解决晚饭了,当然,回家之后的夜宵是一定要加量了
关于《下雪了》,奇幻舞台剧,舞台效果不错,剧情完全没有看懂,
就看小丑的演出和场景了
互动也很不错,前排的人一直可以玩到东西,我们在中间,也还可以了,丝绸的波浪、大气球都能碰到
场景里面,打雷,丝绸的波浪,下雪(飘纸),风雪(强风+纸),都蛮震撼的,尤其最后一个

最后说一下东方艺术中心歌剧馆的座位
vip是最前排的,最互动的位置(有时也蛮倒霉的)
A档是一楼一般的中间位置,
B档是1楼中间偏后的位置,以上大多活动都能参与到
C档是1楼最后两侧的位置,D档是2楼最前排,E档是2楼后面及两侧,如果看互动不强,后面问题也不大,距离都不远的
我在票务之星订的B档,最后给我的是A档偏后的票,还不错,呵呵

@Transactional(rollbackFor = Exception.class) @ReadMaster @Override public ResultVo<RewardRecordVo> luckyDraw(Long userId) { //锁 String rechargeLock = RedisKeyEnum.LUCKY_DRAW_LOCK.getKey() + userId; //获取今天的年月日 String date = DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD); String userIdStr = String.valueOf(userId); int count = 0; //获取当前剩余次数 if (redisCache.hHasKey(RedisKeyEnum.LUCKY_DRAW_CURRENT_COUNT.getKey() + date, userIdStr)) { count = (Integer) redisCache.hget(RedisKeyEnum.LUCKY_DRAW_CURRENT_COUNT.getKey() + date, userIdStr); } else { //不存在则初始化 //当前次数 每日免费抽一次 redisCache.hset(RedisKeyEnum.LUCKY_DRAW_CURRENT_COUNT.getKey() + date, userIdStr, 1); //当天总次数 4次包含(每日免费抽一次) redisCache.hset(RedisKeyEnum.LUCKY_DRAW_TODAY_COUNT.getKey() + date, userIdStr, 4); count = 1; } Integer totalCount = (Integer) redisCache.hget(RedisKeyEnum.LUCKY_DRAW_TODAY_COUNT.getKey() + date, userIdStr); AssertUtil.isTrue(totalCount > 0, "51186"); //校验今日次数是否用完 AssertUtil.isTrue(count > 0, "51187"); //当前次数不够 try { //加锁 if (!redisLockUtil.tryLock(rechargeLock, 5, 10, TimeUnit.SECONDS)) { return ResultVoUtil.error(51065, "系统繁忙", null); } Long activityId = ActivityIdEnum.LUCKY_DRAW.getKey(); //判断是否是今日第一次抽奖 Integer randomType = totalCount == 4 ? 1 : 0; //从缓存中获取 活动奖励 Object o = redisCache.hget(RedisKeyEnum.GAME_ACTIVITY_REWARD_POOL_ITEM_CONFIG.getKey() + activityId, String.valueOf(randomType)); List<GameRewardPoolItemBo> listRewardItem = null; if (o == null) { //获取奖励图片 Map<Object, Object> rewardPic = gameDictDataService.getGameDictDataMapByType("reward_pic"); listRewardItem = gameRewardPoolItemMapper.queryRandomPoolItemListByActivityId(activityId, randomType); listRewardItem.forEach(item -> { //获取奖励图片 if (item.getRewardType().equals(CurrencyCodeEnum.GOOD.getId())) { GameProductBo gameProduct = gameProductService.getGameProduct(item.getProductId()); item.setRewardPic(gameProduct.getProductPicVos().get(0).getProductPic()); } else if (item.getRewardType().equals(CurrencyCodeEnum.POINT.getId()) || item.getRewardType().equals(CurrencyCodeEnum.COIN.getId())) { item.setRewardPic(String.valueOf(rewardPic.get(item.getRewardType()))); } else { item.setRewardPic(String.valueOf(rewardPic.get("WITHOUT"))); } item.setRewardPic(item.getRewardPic()); }); redisCache.hset(RedisKeyEnum.GAME_ACTIVITY_REWARD_POOL_ITEM_CONFIG.getKey() + activityId, String.valueOf(randomType), JSONObject.toJSONString(listRewardItem)); } else { listRewardItem = JSONObject.parseArray(o.toString(), GameRewardPoolItemBo.class); } long rewardRecordId = IdWorker.getId(); GameRewardPoolItemBo gameRewardPoolItemBo = getGameReward(userId, listRewardItem, rewardRecordId); //减去当前次数 redisCache.hset(RedisKeyEnum.LUCKY_DRAW_CURRENT_COUNT.getKey() + date, userIdStr, count - 1); redisCache.hset(RedisKeyEnum.LUCKY_DRAW_TODAY_COUNT.getKey() + date, userIdStr, totalCount - 1); //添加抽奖记录 RewardRecordDoc rewardRecordDoc = new RewardRecordDoc(); BeanUtils.copyProperties(gameRewardPoolItemBo, rewardRecordDoc); rewardRecordDoc.setId(rewardRecordId); rewardRecordDoc.setUserId(userId); rewardRecordDoc.setRewardId(gameRewardPoolItemBo.getRewardId()); rewardRecordDoc.setActivityId(activityId); rewardRecordDoc.setStatus(0); rewardRecordDoc.setCreateTime(new Date()); rewardRecordDoc.setIsDelete(0); rewardRecordDocMongo.save(rewardRecordDoc); //返回奖励信息 RewardRecordVo rewardRecordVo = new RewardRecordVo(); BeanUtils.copyProperties(gameRewardPoolItemBo, rewardRecordVo); rewardRecordVo.setRewardRecordId(rewardRecordId); return ResultVoUtil.success(rewardRecordVo); } catch (Exception e) { log.error("抽奖异常:", e); // 手动回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } finally { //释放锁 redisLockUtil.unlock(rechargeLock); } AssertUtil.isTrue(false, "51190"); return null; } /** * 获取抽奖信息并发放 * * @param userId 用户id * @param listRewardItem 奖品列表 * @param rewardRecordId 抽奖记录id * @return 返回奖品信息 */ private GameRewardPoolItemBo getGameReward(Long userId, List<GameRewardPoolItemBo> listRewardItem, long rewardRecordId) { GameRewardPoolItemBo gameRewardPoolItemBo = RandomUtil.selectRandomEntity(listRewardItem); //发送奖励 if (gameRewardPoolItemBo.getRewardType().equals(CurrencyCodeEnum.POINT.getId())) { //积分 gameAccountService.rechargeAccount(userId, gameRewardPoolItemBo.getRewardAmount(), FlowBusinessTypeEnum.LUCKY_DRAW, CurrencyCodeEnum.POINT, rewardRecordId); } else if (gameRewardPoolItemBo.getRewardType().equals(CurrencyCodeEnum.COIN.getId())) { //金币 gameAccountService.rechargeAccount(userId, gameRewardPoolItemBo.getRewardAmount(), FlowBusinessTypeEnum.LUCKY_DRAW, CurrencyCodeEnum.COIN, rewardRecordId); } else if (gameRewardPoolItemBo.getRewardType().equals(CurrencyCodeEnum.GOOD.getId())) { //商品 //判断商品库存 Long goodsId = gameGoodsService.gainGameGoodsId(gameRewardPoolItemBo.getProductId()); if (goodsId == null) { //库存不足 是否需要发送通知 重新抽奖 getGameReward(userId, listRewardItem, rewardRecordId); } else { //发放该商品 ResultVo<GameGoods> gameGoodsResultVo = gameGoodsService.setGameGoods(userId, goodsId); //校验是否发放成功 AssertUtil.isTrue(gameGoodsResultVo.isSuccess(), "51190"); gameRewardPoolItemBo.setGoodsId(goodsId); GameGoods data = gameGoodsResultVo.getData(); gameRewardPoolItemBo.setCardKey(data.getCardKey()); gameRewardPoolItemBo.setCardNum(data.getCardNum()); } } return gameRewardPoolItemBo; } 优化代码
10-31
@Transactional(rollbackFor = Exception.class, isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED) @ReadMaster @Override public ResultVo<RewardRecordVo> luckyDraw(Long userId) { //获取今天的年月日 String date = DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD); String userIdStr = String.valueOf(userId); //锁 String rechargeLock = RedisKeyEnum.LUCKY_DRAW_LOCK.getKey() + userId; //加锁 if (!redisLockUtil.tryLock(rechargeLock, 5, 10, TimeUnit.SECONDS)) { return ResultVoUtil.error(51065, "系统繁忙", null); } try { Long activityId = ActivityIdEnum.LUCKY_DRAW.getKey(); int count = 0; //获取当前剩余次数 String luckyDrawCurrentCountKey = RedisKeyEnum.LUCKY_DRAW_CURRENT_COUNT.getKey() + date; String luckyDrawTotalCountKey = RedisKeyEnum.LUCKY_DRAW_TODAY_COUNT.getKey() + date; if (redisCache.hHasKey(luckyDrawCurrentCountKey, userIdStr)) { count = (Integer) redisCache.hget(luckyDrawCurrentCountKey, userIdStr); } else { //不存在则初始化 count = 1; //当前次数 每日免费抽一次 redisCache.hset(luckyDrawCurrentCountKey, userIdStr, count, RedisKeyEnum.LUCKY_DRAW_CURRENT_COUNT.getExpire()); //当天总次数 4次包含(每日免费抽一次) redisCache.hset(luckyDrawTotalCountKey, userIdStr, 4, RedisKeyEnum.LUCKY_DRAW_TODAY_COUNT.getExpire()); } Integer totalCount = (Integer) redisCache.hget(luckyDrawTotalCountKey, userIdStr); AssertUtil.isTrue(totalCount > 0, "51186"); //校验今日次数是否用完 AssertUtil.isTrue(count > 0, "51187"); //当前次数不够 //判断是否是今日第一次抽奖 Integer randomType = totalCount == 4 ? 1 : 0; //获取奖励池项 List<GameRewardPoolItemBo> listRewardItem = getGameRewardPoolItemBos(activityId, randomType); long rewardRecordId = IdWorker.getId(); GameRewardPoolItemBo gameRewardPoolItemBo = getGameReward(userId, listRewardItem, rewardRecordId); //减去当前次数 redisCache.hset(luckyDrawCurrentCountKey, userIdStr, count - 1); redisCache.hset(luckyDrawTotalCountKey, userIdStr, totalCount - 1); //添加抽奖记录 RewardRecordDoc rewardRecordDoc = new RewardRecordDoc(); BeanUtils.copyProperties(gameRewardPoolItemBo, rewardRecordDoc); rewardRecordDoc.setId(rewardRecordId); rewardRecordDoc.setUserId(userId); rewardRecordDoc.setRewardId(gameRewardPoolItemBo.getRewardId()); rewardRecordDoc.setActivityId(activityId); rewardRecordDoc.setStatus(0); rewardRecordDoc.setCreateTime(new Date()); rewardRecordDoc.setIsDelete(0); rewardRecordDocMongo.save(rewardRecordDoc); //发送站内通知 gameSysNoticeService.sendLuckyDrawNotice(userId, gameRewardPoolItemBo); //todo 后期 发送邮箱 //返回奖励信息 RewardRecordVo rewardRecordVo = new RewardRecordVo(); BeanUtils.copyProperties(gameRewardPoolItemBo, rewardRecordVo); rewardRecordVo.setRewardRecordId(rewardRecordId); return ResultVoUtil.success(rewardRecordVo); } catch (Exception e) { log.error("抽奖异常, userId: {}, date: {}", userId, date, e); // 手动回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); throw e; } finally { //释放锁 redisLockUtil.unlock(rechargeLock); } } 到了rewardRecordDocMongo.save(rewardRecordDoc);这里报错了 但是事务没有回滚
最新发布
11-01
@Transactional(rollbackFor = Exception.class, isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED) @ReadMaster @Override public ResultVo<RewardRecordVo> luckyDraw(Long userId) { //获取今天的年月日 String date = DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD); String userIdStr = String.valueOf(userId); //锁 String rechargeLock = RedisKeyEnum.LUCKY_DRAW_LOCK.getKey() + userId; //加锁 if (!redisLockUtil.tryLock(rechargeLock, 5, 10, TimeUnit.SECONDS)) { return ResultVoUtil.error(51065, "系统繁忙", null); } try { Long activityId = ActivityIdEnum.LUCKY_DRAW.getKey(); int count = 0; //获取当前剩余次数 String luckyDrawCurrentCountKey = RedisKeyEnum.LUCKY_DRAW_CURRENT_COUNT.getKey() + date; String luckyDrawTotalCountKey = RedisKeyEnum.LUCKY_DRAW_TODAY_COUNT.getKey() + date; if (redisCache.hHasKey(luckyDrawCurrentCountKey, userIdStr)) { count = (Integer) redisCache.hget(luckyDrawCurrentCountKey, userIdStr); } else { //不存在则初始化 count = 1; //当前次数 每日免费抽一次 redisCache.hset(luckyDrawCurrentCountKey, userIdStr, count, RedisKeyEnum.LUCKY_DRAW_CURRENT_COUNT.getExpire()); //当天总次数 4次包含(每日免费抽一次) redisCache.hset(luckyDrawTotalCountKey, userIdStr, 4, RedisKeyEnum.LUCKY_DRAW_TODAY_COUNT.getExpire()); } Integer totalCount = (Integer) redisCache.hget(luckyDrawTotalCountKey, userIdStr); AssertUtil.isTrue(totalCount > 0, "51186"); //校验今日次数是否用完 AssertUtil.isTrue(count > 0, "51187"); //当前次数不够 //判断是否是今日第一次抽奖 Integer randomType = totalCount == 4 ? 1 : 0; //获取奖励池项 List<GameRewardPoolItemBo> listRewardItem = getGameRewardPoolItemBos(activityId, randomType); long rewardRecordId = IdWorker.getId(); GameRewardPoolItemBo gameRewardPoolItemBo = getGameReward(userId, listRewardItem, rewardRecordId); //减去当前次数 redisCache.hset(luckyDrawCurrentCountKey, userIdStr, count - 1); redisCache.hset(luckyDrawTotalCountKey, userIdStr, totalCount - 1); //添加抽奖记录 RewardRecordDoc rewardRecordDoc = new RewardRecordDoc(); BeanUtils.copyProperties(gameRewardPoolItemBo, rewardRecordDoc); rewardRecordDoc.setId(rewardRecordId); rewardRecordDoc.setUserId(userId); rewardRecordDoc.setRewardId(gameRewardPoolItemBo.getRewardId()); rewardRecordDoc.setActivityId(activityId); rewardRecordDoc.setStatus(0); rewardRecordDoc.setCreateTime(new Date()); rewardRecordDoc.setIsDelete(0); rewardRecordDocMongo.save(rewardRecordDoc); //发送站内通知 gameSysNoticeService.sendLuckyDrawNotice(userId, gameRewardPoolItemBo); //todo 后期 发送邮箱 //返回奖励信息 RewardRecordVo rewardRecordVo = new RewardRecordVo(); BeanUtils.copyProperties(gameRewardPoolItemBo, rewardRecordVo); rewardRecordVo.setRewardRecordId(rewardRecordId); return ResultVoUtil.success(rewardRecordVo); } catch (Exception e) { log.error("抽奖异常, userId: {}, date: {}", userId, date, e); // 手动回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); throw e; } finally { //释放锁 redisLockUtil.unlock(rechargeLock); } } 到了rewardRecordDocMongo.save(rewardRecordDoc);这里报错了 但是事务没有回滚
11-01
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值