From 6c3c5f3fb28cc65684e065b60a09768cf8a77429 Mon Sep 17 00:00:00 2001 From: peng <peng.com> Date: 星期一, 29 九月 2025 23:45:13 +0800 Subject: [PATCH] 添加抽奖次数加锁 --- framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeServiceImpl.java | 361 +++++++++++++++++++++++++++------------------------ 1 files changed, 192 insertions(+), 169 deletions(-) diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeServiceImpl.java b/framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeServiceImpl.java index fa8eda8..b550cc6 100644 --- a/framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeServiceImpl.java @@ -524,6 +524,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public Result addPrizeNum(AddPrizeNumForm addPrizeNumForm) { //鎸囧畾娲诲姩缁欐寚瀹氭椿鍔ㄦ坊鍔犳病鎸囧畾娲诲姩缁欓粯璁ゆ椿鍔ㄦ坊鍔� String prizeActivityId = addPrizeNumForm.getPrizeActivityId(); @@ -547,180 +548,202 @@ addPrizeNumForm.setUserId(currentUser.getId()); } - PrizeActivity activity = prizeActivityService.getById(addPrizeNumForm.getPrizeActivityId()); - if (activity == null) { - throw new ServiceException("褰撳墠娲诲姩涓嶅瓨鍦�"); - } - if (!PrizeActivityStatusEnum.ON.name().equals(activity.getEnableStatus())) { - throw new ServiceException("褰撳墠娲诲姩娌″紑鍚�"); - } - Date date = new Date(); - //娲诲姩缁撴潫涓嶉渶瑕佹坊鍔� - if (date.after(activity.getEndTime())) { - throw new ServiceException("褰撳墠娲诲姩宸茬粨鏉�"); - } - Integer maxPrize = activity.getMaxPrize(); String userId = addPrizeNumForm.getUserId(); - List<PrizeNumber> prizeNumberList = getPrizeNumberList(activity.getId(), userId); - if (prizeNumberList.size() >= maxPrize) { - throw new ServiceException("鎶藉娆℃暟宸茶揪鍒颁笂闄愪簡"); - } - PrizeUserActionEnum actionEnum = PrizeUserActionEnum.select(addPrizeNumForm.getAddType()); - if (actionEnum == null) { - throw new ServiceException("褰撳墠绫诲瀷涓嶅瓨鍦�"); - } - AddPrizeRule addPrizeRule = getAddPrizeRule(actionEnum.name()); - if (addPrizeRule == null) { - return Result.ok().data(0); - } - List<PrizeNumber> needAdd = new ArrayList<>(); - Integer addNum = addPrizeRule.getAddNum(); - if (addNum == null) { - return Result.ok().data(0); - } - //鍒よ娣诲姞鍚庢槸鍚﹀ぇ浜庢渶澶ф鏁� - if (prizeNumberList.size()+addNum >= maxPrize){ - addNum = maxPrize-prizeNumberList.size(); - } - boolean addFlag = false; - //鍒ゆ柇璇ョ被鍨嬪綋澶╂槸鍚︽坊鍔犺繃浜� - for (PrizeNumber prizeNumber : prizeNumberList) { - if (actionEnum.name().equals(prizeNumber.getUserAction())) { - addFlag = true; - break; + RLock lock = redissonClient.getLock(PRIZE_ADD_NUM + userId); + try { + + lock.lock(); + PrizeActivity activity = prizeActivityService.getById(addPrizeNumForm.getPrizeActivityId()); + if (activity == null) { + throw new ServiceException("褰撳墠娲诲姩涓嶅瓨鍦�"); } - } - String extend = addPrizeNumForm.getExtend(); - JSONObject jsonObject = JSONObject.parseObject(extend); - LambdaQueryWrapper<AddNumCheek> query = Wrappers.lambdaQuery(); - AddNumCheek addNumCheek = null; - String orderSn = null; - Order order = null; - String ruleValue= null; - switch (actionEnum) { - case SHARE_GOODS_VIDEO: - String shareId = jsonObject.getString("shareId"); - ShareAction shareAction = shareActionService.getById(shareId); - if (shareAction == null) { - return Result.ok().data(0); - } - if (addFlag){ - log.info("褰撳墠鐢ㄦ埛褰撳ぉ宸茬粡娣诲姞杩囦簡鍒嗕韩娣诲姞娆℃暟浜�-------->{}",userId); - return Result.ok().data(0); - } - break; - case SHARE_USER_REGISTRY: - String memberId = jsonObject.getString("memberId"); - query.eq(AddNumCheek::getType,PrizeUserActionEnum.SHARE_USER_REGISTRY.name()) - .eq(AddNumCheek::getCheckNo, memberId); - if (addNumCheekService.getOne(query) != null) { - log.info("褰撳墠鐢ㄦ埛宸茬粡琚個璇疯繃浜�----------------->{}",memberId); - return Result.ok().data(0); - } - addNumCheek = new AddNumCheek(); - addNumCheek.setType(PrizeUserActionEnum.SHARE_USER_REGISTRY.name()); - addNumCheek.setUserId(userId); - addNumCheek.setCheckNo(memberId); - addNumCheekService.save(addNumCheek); - break; - case SHARE_USER_SHOPPING: - orderSn = jsonObject.getString("orderSn"); - //鏍¢獙璁㈠崟鏄惁瀛樺湪 - order = orderService.getBySn(orderSn); - if (order == null) { - log.info("鍒嗕韩鐢ㄦ埛璐墿璁㈠崟涓嶅瓨鍦▄}",orderSn); - return Result.ok().data(0); - } - query.eq(AddNumCheek::getType,PrizeUserActionEnum.SHARE_USER_SHOPPING.name()) - .eq(AddNumCheek::getCheckNo, orderSn); - if (addNumCheekService.getOne(query) != null) { - log.info("褰撳墠閭�璇疯鍗曞凡缁忚棰嗗彇杩囦簡----------------->{}",orderSn); - return Result.ok().data(0); - } - addNumCheek = new AddNumCheek(); - addNumCheek.setType(PrizeUserActionEnum.SHARE_USER_SHOPPING.name()); - addNumCheek.setUserId(userId); - addNumCheek.setCheckNo(orderSn); - addNumCheekService.save(addNumCheek); - break; - case USER_STAY_TIME: - //todo 閫氳繃鐢ㄦ埛琛屼负鍒嗘瀽鑾峰彇鏁版嵁杩涜鍒ゆ柇 - ruleValue = addPrizeRule.getRuleValue(); - - if (addFlag){ - log.info("褰撳墠鐢ㄦ埛褰撳ぉ宸茬粡娣诲姞杩囦簡鍋滅暀鏃堕棿娣诲姞娆℃暟浜�-------->{}",userId); - return Result.ok().data(0); - } - break; - case USER_BUY_SUM_PRICE: - orderSn = jsonObject.getString("orderSn"); - //鏍¢獙璁㈠崟鏄惁瀛樺湪 - order = orderService.getBySn(orderSn); - if (order == null) { - log.info("鐢ㄦ埛璐墿璁㈠崟涓嶅瓨鍦▄}",orderSn); - return Result.ok().data(0); - } - ruleValue = addPrizeRule.getRuleValue(); - double price = Double.parseDouble(ruleValue); - Double flowPrice = order.getFlowPrice(); - if (flowPrice < price) { - log.info("褰撳墠璐墿璁㈠崟閲戦灏忎簬娣诲姞瑕佹眰----------------->{}",orderSn); - return Result.ok().data(0); - } - query.eq(AddNumCheek::getType,PrizeUserActionEnum.USER_BUY_SUM_PRICE.name()) - .eq(AddNumCheek::getCheckNo, orderSn); - if (addNumCheekService.getOne(query) != null) { - log.info("褰撳墠璐墿璁㈠崟宸茬粡琚鍙栬繃浜�----------------->{}",orderSn); - return Result.ok().data(0); - } - addNumCheek = new AddNumCheek(); - addNumCheek.setType(PrizeUserActionEnum.USER_BUY_SUM_PRICE.name()); - addNumCheek.setUserId(userId); - addNumCheek.setCheckNo(orderSn); - addNumCheekService.save(addNumCheek); - break; - case USER_BUY_ORDER_NUM: - orderSn = jsonObject.getString("orderSn"); - //鏍¢獙璁㈠崟鏄惁瀛樺湪 - order = orderService.getBySn(orderSn); - if (order == null) { - log.info("鐢ㄦ埛璐墿鏁伴噺璁㈠崟涓嶅瓨鍦▄}",orderSn); - return Result.ok().data(0); - } - query.eq(AddNumCheek::getType,PrizeUserActionEnum.USER_BUY_ORDER_NUM.name()) - .eq(AddNumCheek::getCheckNo, orderSn); - if (addNumCheekService.getOne(query) != null) { - log.info("褰撳墠璐墿璁㈠崟鏁伴噺宸茬粡琚鍙栬繃浜�----------------->{}",orderSn); - return Result.ok().data(0); - } - addNumCheek = new AddNumCheek(); - addNumCheek.setType(PrizeUserActionEnum.USER_BUY_ORDER_NUM.name()); - addNumCheek.setUserId(userId); - addNumCheek.setCheckNo(orderSn); - addNumCheekService.save(addNumCheek); - break; - case USER_SCAN_STORE: - break; - case USER_PUBLISH_EXAMINE: - - break; - default: + if (!PrizeActivityStatusEnum.ON.name().equals(activity.getEnableStatus())) { + throw new ServiceException("褰撳墠娲诲姩娌″紑鍚�"); + } + Date date = new Date(); + //娲诲姩缁撴潫涓嶉渶瑕佹坊鍔� + if (date.after(activity.getEndTime())) { + throw new ServiceException("褰撳墠娲诲姩宸茬粨鏉�"); + } + Integer maxPrize = activity.getMaxPrize(); + List<PrizeNumber> prizeNumberList = getPrizeNumberList(activity.getId(), userId); + if (prizeNumberList.size() >= maxPrize) { + throw new ServiceException("鎶藉娆℃暟宸茶揪鍒颁笂闄愪簡"); + } + PrizeUserActionEnum actionEnum = PrizeUserActionEnum.select(addPrizeNumForm.getAddType()); + if (actionEnum == null) { + throw new ServiceException("褰撳墠绫诲瀷涓嶅瓨鍦�"); + } + AddPrizeRule addPrizeRule = getAddPrizeRule(actionEnum.name()); + if (addPrizeRule == null) { return Result.ok().data(0); + } + List<PrizeNumber> needAdd = new ArrayList<>(); + Integer addNum = addPrizeRule.getAddNum(); + if (addNum == null) { + return Result.ok().data(0); + } + //鍒よ娣诲姞鍚庢槸鍚﹀ぇ浜庢渶澶ф鏁� + if (prizeNumberList.size() + addNum >= maxPrize) { + addNum = maxPrize - prizeNumberList.size(); + } + boolean addFlag = false; + //鍒ゆ柇璇ョ被鍨嬪綋澶╂槸鍚︽坊鍔犺繃浜� + for (PrizeNumber prizeNumber : prizeNumberList) { + if (actionEnum.name().equals(prizeNumber.getUserAction())) { + addFlag = true; + break; + } + } + String extend = addPrizeNumForm.getExtend(); + JSONObject jsonObject = JSONObject.parseObject(extend); + LambdaQueryWrapper<AddNumCheek> query = Wrappers.lambdaQuery(); + AddNumCheek addNumCheek = null; + String orderSn = null; + Order order = null; + String ruleValue = null; + switch (actionEnum) { + case SHARE_GOODS_VIDEO: + String shareId = jsonObject.getString("shareId"); + ShareAction shareAction = shareActionService.getById(shareId); + if (shareAction == null) { + return Result.ok().data(0); + } + if (addFlag) { + log.info("褰撳墠鐢ㄦ埛褰撳ぉ宸茬粡娣诲姞杩囦簡鍒嗕韩娣诲姞娆℃暟浜�-------->{}", userId); + return Result.ok().data(0); + } + break; + case SHARE_USER_REGISTRY: + String memberId = jsonObject.getString("memberId"); + query.eq(AddNumCheek::getType, PrizeUserActionEnum.SHARE_USER_REGISTRY.name()) + .eq(AddNumCheek::getCheckNo, memberId); + if (addNumCheekService.getOne(query) != null) { + log.info("褰撳墠鐢ㄦ埛宸茬粡琚個璇疯繃浜�----------------->{}", memberId); + return Result.ok().data(0); + } + addNumCheek = new AddNumCheek(); + addNumCheek.setType(PrizeUserActionEnum.SHARE_USER_REGISTRY.name()); + addNumCheek.setUserId(userId); + addNumCheek.setCheckNo(memberId); + addNumCheekService.save(addNumCheek); + break; + case SHARE_USER_SHOPPING: + orderSn = jsonObject.getString("orderSn"); + //鏍¢獙璁㈠崟鏄惁瀛樺湪 + order = orderService.getBySn(orderSn); + if (order == null) { + log.info("鍒嗕韩鐢ㄦ埛璐墿璁㈠崟涓嶅瓨鍦▄}", orderSn); + return Result.ok().data(0); + } + query.eq(AddNumCheek::getType, PrizeUserActionEnum.SHARE_USER_SHOPPING.name()) + .eq(AddNumCheek::getCheckNo, orderSn); + if (addNumCheekService.getOne(query) != null) { + log.info("褰撳墠閭�璇疯鍗曞凡缁忚棰嗗彇杩囦簡----------------->{}", orderSn); + return Result.ok().data(0); + } + addNumCheek = new AddNumCheek(); + addNumCheek.setType(PrizeUserActionEnum.SHARE_USER_SHOPPING.name()); + addNumCheek.setUserId(userId); + addNumCheek.setCheckNo(orderSn); + addNumCheekService.save(addNumCheek); + break; + case USER_STAY_TIME: + //todo 閫氳繃鐢ㄦ埛琛屼负鍒嗘瀽鑾峰彇鏁版嵁杩涜鍒ゆ柇 + ruleValue = addPrizeRule.getRuleValue(); + + if (addFlag) { + log.info("褰撳墠鐢ㄦ埛褰撳ぉ宸茬粡娣诲姞杩囦簡鍋滅暀鏃堕棿娣诲姞娆℃暟浜�-------->{}", userId); + return Result.ok().data(0); + } + break; + case USER_BUY_SUM_PRICE: + orderSn = jsonObject.getString("orderSn"); + //鏍¢獙璁㈠崟鏄惁瀛樺湪 + order = orderService.getBySn(orderSn); + if (order == null) { + log.info("鐢ㄦ埛璐墿璁㈠崟涓嶅瓨鍦▄}", orderSn); + return Result.ok().data(0); + } + ruleValue = addPrizeRule.getRuleValue(); + double price = Double.parseDouble(ruleValue); + Double flowPrice = order.getFlowPrice(); + if (flowPrice < price) { + log.info("褰撳墠璐墿璁㈠崟閲戦灏忎簬娣诲姞瑕佹眰----------------->{}", orderSn); + return Result.ok().data(0); + } + query.eq(AddNumCheek::getType, PrizeUserActionEnum.USER_BUY_SUM_PRICE.name()) + .eq(AddNumCheek::getCheckNo, orderSn); + if (addNumCheekService.getOne(query) != null) { + log.info("褰撳墠璐墿璁㈠崟宸茬粡琚鍙栬繃浜�----------------->{}", orderSn); + return Result.ok().data(0); + } + addNumCheek = new AddNumCheek(); + addNumCheek.setType(PrizeUserActionEnum.USER_BUY_SUM_PRICE.name()); + addNumCheek.setUserId(userId); + addNumCheek.setCheckNo(orderSn); + addNumCheekService.save(addNumCheek); + break; + case USER_BUY_ORDER_NUM: + orderSn = jsonObject.getString("orderSn"); + //鏍¢獙璁㈠崟鏄惁瀛樺湪 + order = orderService.getBySn(orderSn); + if (order == null) { + log.info("鐢ㄦ埛璐墿鏁伴噺璁㈠崟涓嶅瓨鍦▄}", orderSn); + return Result.ok().data(0); + } + query.eq(AddNumCheek::getType, PrizeUserActionEnum.USER_BUY_ORDER_NUM.name()) + .eq(AddNumCheek::getCheckNo, orderSn); + if (addNumCheekService.getOne(query) != null) { + log.info("褰撳墠璐墿璁㈠崟鏁伴噺宸茬粡琚鍙栬繃浜�----------------->{}", orderSn); + return Result.ok().data(0); + } + addNumCheek = new AddNumCheek(); + addNumCheek.setType(PrizeUserActionEnum.USER_BUY_ORDER_NUM.name()); + addNumCheek.setUserId(userId); + addNumCheek.setCheckNo(orderSn); + addNumCheekService.save(addNumCheek); + break; + case USER_SCAN_STORE: + break; + case USER_PUBLISH_EXAMINE: + + break; + default: + return Result.ok().data(0); + } + //璁剧疆榛樿鎶藉娆℃暟骞惰繑鍥為粯璁ゆ娊濂栨鏁� + for (int i = 0; i < addNum; i++) { + PrizeNumber prizeNumber = new PrizeNumber(); + prizeNumber.setActivityPrizeId(Long.parseLong(addPrizeNumForm.getPrizeActivityId())); + prizeNumber.setUserId(Long.parseLong(userId)); + prizeNumber.setUserAction(actionEnum.name()); + prizeNumber.setUseStatus(PrizeNumberUseEnum.WAIT.name()); + needAdd.add(prizeNumber); + } + prizeNumberService.saveBatch(needAdd); + return Result.ok().data(0); + } finally { + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + @Override + public void afterCommit() { + if (lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + + @Override + public void afterCompletion(int status) { + if (lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + }); } - //璁剧疆榛樿鎶藉娆℃暟骞惰繑鍥為粯璁ゆ娊濂栨鏁� - for (int i = 0; i < addNum; i++) { - PrizeNumber prizeNumber = new PrizeNumber(); - prizeNumber.setActivityPrizeId(Long.parseLong(addPrizeNumForm.getPrizeActivityId())); - prizeNumber.setUserId(Long.parseLong(userId)); - prizeNumber.setUserAction(actionEnum.name()); - prizeNumber.setUseStatus(PrizeNumberUseEnum.WAIT.name()); - needAdd.add(prizeNumber); - } - prizeNumberService.saveBatch(needAdd); - return Result.ok().data(0); } - public AddPrizeRule getAddPrizeRule(String ruleCode) { + + public AddPrizeRule getAddPrizeRule(String ruleCode) { LambdaQueryWrapper<AddPrizeRule> one = Wrappers.<AddPrizeRule>lambdaQuery().eq(AddPrizeRule::getRuleCode, ruleCode); - return addPrizeRuleService.getOne(one); + return addPrizeRuleService.getOne(one); } } -- Gitblit v1.8.0