From e4dd7447aaa4563b9e64a7556710677a140776eb Mon Sep 17 00:00:00 2001 From: peng <peng.com> Date: 星期二, 30 九月 2025 18:58:42 +0800 Subject: [PATCH] Merge branch 'send_coupon' into user_action --- framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeServiceImpl.java | 442 ++++++++++++++++++++++++++++++++++--------------------- 1 files changed, 274 insertions(+), 168 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..5a03622 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 @@ -16,6 +16,8 @@ import cn.lili.modules.lmk.domain.vo.PrizeResultVO; import cn.lili.modules.lmk.enums.general.*; import cn.lili.modules.lmk.service.*; +import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.member.service.MemberService; import cn.lili.modules.order.order.entity.dos.Order; import cn.lili.modules.order.order.service.OrderService; import cn.lili.modules.promotion.entity.dos.Coupon; @@ -74,6 +76,9 @@ private final ShareActionService shareActionService; private final AddNumCheekService addNumCheekService; private final OrderService orderService; + private final MemberService memberService; + private final VideoService videoService; + private final VideoAuditRecordService videoAuditRecordService; @Override @Transactional(rollbackFor = Exception.class) @@ -524,6 +529,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public Result addPrizeNum(AddPrizeNumForm addPrizeNumForm) { //鎸囧畾娲诲姩缁欐寚瀹氭椿鍔ㄦ坊鍔犳病鎸囧畾娲诲姩缁欓粯璁ゆ椿鍔ㄦ坊鍔� String prizeActivityId = addPrizeNumForm.getPrizeActivityId(); @@ -547,180 +553,280 @@ 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; - } - } 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: + String shareId =null; + if (jsonObject != null) { + shareId = jsonObject.getString("shareId"); + } + Date date = new Date(); + ShareAction shareAction =null; + //鍒嗕韩杩涙潵鐨勯渶瑕佹坊鍔犲垎浜殑鐢ㄦ埛 + if (StringUtils.isNotBlank(shareId)) { + shareAction = shareActionService.getById(shareId); + String userId = shareAction.getUserId(); + addPrizeNumForm.setUserId(userId); + Date createTime = shareAction.getCreateTime(); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(createTime); // 灏咲ate璁剧疆鍒癈alendar涓� + calendar.add(Calendar.DAY_OF_MONTH, 1); // 鍔犱竴澶� + Date nextDay = calendar.getTime(); + //鍒ゆ柇鏄惁鏄柊鐢ㄦ埛 + if (nextDay.before(date)) { + //褰撳墠鍒嗕韩涓嶆槸浠婂ぉ鐨勫垎浜� + log.info("褰撳墠鍒嗕韩涓嶆槸浠婂ぉ鐨勫垎浜珄}",shareId); return Result.ok().data(0); + } + if (currentUser.getId().equals(userId)) { + //鍒嗕韩鐨勭敤鎴疯嚜宸辩偣鍑讳簡 + log.info("鐢ㄦ埛鑷繁鐐瑰嚮浜嗚嚜宸辩殑鍒嗕韩"); + 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); + + String userId = addPrizeNumForm.getUserId(); + RLock lock = redissonClient.getLock(PRIZE_ADD_NUM + userId); + try { + + lock.lock(); + PrizeActivity activity = prizeActivityService.getById(addPrizeNumForm.getPrizeActivityId()); + if (activity == null) { + throw new ServiceException("褰撳墠娲诲姩涓嶅瓨鍦�"); + } + if (!PrizeActivityStatusEnum.ON.name().equals(activity.getEnableStatus())) { + throw new ServiceException("褰撳墠娲诲姩娌″紑鍚�"); + } + //娲诲姩缁撴潫涓嶉渶瑕佹坊鍔� + 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; + } + } + LambdaQueryWrapper<AddNumCheek> query = Wrappers.lambdaQuery(); + AddNumCheek addNumCheek = null; + String orderSn = null; + Order order = null; + String ruleValue = null; + switch (actionEnum) { + case SHARE_GOODS_VIDEO: + if (shareAction == null) { + log.info("褰撳墠鐢ㄦ埛娌℃湁鍒嗕韩{}",userId); + return Result.ok().data(0); + } + if (addFlag) { + log.info("褰撳墠鐢ㄦ埛褰撳ぉ宸茬粡娣诲姞杩囦簡鍒嗕韩娣诲姞娆℃暟浜�-------->{}", userId); + return Result.ok().data(0); + } + break; + case SHARE_USER_REGISTRY: + if (shareAction == null) { + log.info("褰撳墠鐢ㄦ埛娌℃湁鍒嗕韩{}",userId); + return Result.ok().data(0); + } + Member member = memberService.getById(shareAction.getUserId()); + Date createTime = member.getCreateTime(); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(createTime); // 灏咲ate璁剧疆鍒癈alendar涓� + calendar.add(Calendar.DAY_OF_MONTH, 1); // 鍔犱竴澶� + Date nextDay = calendar.getTime(); + //鍒ゆ柇鏄惁鏄柊鐢ㄦ埛 + if (nextDay.before(date)) { + //褰撳墠鐢ㄦ埛涓嶆槸鏂扮敤鎴� + log.info("褰撳墠鐢ㄦ埛涓嶆槸鏂扮敤鎴穥}",currentUser.getId()); + return Result.ok().data(0); + } + query.eq(AddNumCheek::getType, PrizeUserActionEnum.SHARE_USER_REGISTRY.name()) + .eq(AddNumCheek::getCheckNo, currentUser.getId()); + if (addNumCheekService.getOne(query) != null) { + log.info("褰撳墠鐢ㄦ埛宸茬粡琚個璇疯繃浜�----------------->{}", currentUser.getId()); + return Result.ok().data(0); + } + addNumCheek = new AddNumCheek(); + addNumCheek.setType(PrizeUserActionEnum.SHARE_USER_REGISTRY.name()); + addNumCheek.setUserId(userId); + addNumCheek.setCheckNo(currentUser.getId()); + 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: + if (addFlag) { + log.info("褰撳墠鐢ㄦ埛褰撳ぉ宸茬粡娣诲姞杩囦簡鍋滅暀鏃堕棿娣诲姞娆℃暟浜�-------->{}", userId); + return Result.ok().data(0); + } + ruleValue = addPrizeRule.getRuleValue(); + LocalDate now = LocalDate.now(); + LocalDateTime begin = LocalDateTime.of(now, LocalTime.MIN); + LocalDateTime end = LocalDateTime.of(now, LocalTime.MAX); + BigDecimal toDayStayTime = actionRecordService.getToDayStayTime(currentUser.getId(), begin, end); + BigDecimal divide = toDayStayTime.divide(new BigDecimal(60), 2, RoundingMode.HALF_UP); + if (divide.compareTo(new BigDecimal(ruleValue)) < 0) { + log.info("褰撳墠鐢ㄦ埛鍋滅暀鏃堕棿涓嶈冻鏃犳硶澧炲姞娆℃暟"); + 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: + String videoId = jsonObject.getString("videoId"); + query.eq(AddNumCheek::getType, PrizeUserActionEnum.USER_PUBLISH_EXAMINE.name()) + .eq(AddNumCheek::getCheckNo, videoId); + if (addNumCheekService.getOne(query) != null) { + log.info("褰撳墠瑙嗛瀹℃牳宸茬粡鍙戞斁杩囦簡----------------->{}", videoId); + return Result.ok().data(0); + } + Video video = videoService.getById(videoId); + if (video == null) { + log.info("褰撳墠瑙嗛涓嶅瓨鍦▄}",videoId); + return Result.ok().data(0); + } + String status = video.getStatus(); + if (!"1".equals(status)) { + log.info("褰撳墠瑙嗛娌℃湁瀹℃牳閫氳繃{}",videoId); + return Result.ok().data(0); + } + LambdaQueryWrapper<VideoAuditRecord> eq = Wrappers.<VideoAuditRecord>lambdaQuery() + .eq(VideoAuditRecord::getVideoId, videoId) + .eq(VideoAuditRecord::getAuditSuccess, true); + List<VideoAuditRecord> list = videoAuditRecordService.list(eq); + if (list.isEmpty()) { + log.info("褰撳墠瑙嗛娌℃湁瀹℃牳閫氳繃{}",videoId); + return Result.ok().data(0); + } + addNumCheek = new AddNumCheek(); + addNumCheek.setType(PrizeUserActionEnum.USER_PUBLISH_EXAMINE.name()); + addNumCheek.setUserId(userId); + addNumCheek.setCheckNo(videoId); + addNumCheekService.save(addNumCheek); + 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(); + } + } + }); } - 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