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