From d33b041f4b2a63a22682c9b3f344ef35f84b4542 Mon Sep 17 00:00:00 2001
From: zxl <763096477@qq.com>
Date: 星期二, 30 九月 2025 14:37:36 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/user_action' into user_action

---
 framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeServiceImpl.java |  386 ++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 341 insertions(+), 45 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 60c0963..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,10 @@
 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;
 import cn.lili.modules.promotion.service.CouponService;
 import cn.lili.mybatis.BaseEntity;
@@ -60,12 +64,21 @@
     private final PrizeRecordService prizeRecordService;
     private static final String PRIZE_PREFIX = "prize_draw:";
     private static final String PRIZE_NUMBER = "prize_number:";
+    private static final String PRIZE_ADD_NUM = "prize_add_num:";
     private final RedisTemplate<String, String> redisTemplate;
     private final RedissonClient redissonClient;
     private final RocketmqCustomProperties rocketmqCustomProperties;
     private final RocketMQTemplate rocketMQTemplate;
     private final COSUtil cosUtil;
     private final CouponService couponService;
+    private final AddPrizeRuleService addPrizeRuleService;
+    private final ActionRecordService actionRecordService;
+    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)
@@ -390,13 +403,26 @@
         try {
             lock.lock();
             prizeNumberList = getPrizeNumberList(prizeId, userId);
+            //榛樿鐢熸垚
+            boolean needGenerate = true;
+            for (PrizeNumber prizeNumber : prizeNumberList) {
+                String userAction = prizeNumber.getUserAction();
+                if (PrizeUserActionEnum.SYSTEM.name().equals(userAction)) {
+                    needGenerate = false;
+                    break;
+                }
+            }
             // 褰撳墠鐢ㄦ埛娌℃湁鍒濆鍖栨娊濂栨暟鎹渶瑕佸垵濮嬪寲褰撳ぉ鎶藉鏁版嵁
-            if (prizeNumberList == null || prizeNumberList.isEmpty()) {
-                //娌℃湁榛樿鎶藉娆℃暟鐩存帴杩斿洖0娆�
+            if (prizeNumberList.isEmpty() || needGenerate) {
+                //娌℃湁榛樿鎶藉娆℃暟涓嶇敓鎴愭娊濂栨鏁�
+                int size = prizeNumberList.size();
                 if (prizeNum == null || prizeNum <= 0) {
-                    return Result.ok().data(0);
+                    return Result.ok().data(size);
                 }
                 prizeNumberList = new ArrayList<>();
+                if (size+prizeNum>activity.getMaxPrize()){
+                    prizeNum =  activity.getMaxPrize()-size;
+                }
                 //璁剧疆榛樿鎶藉娆℃暟骞惰繑鍥為粯璁ゆ娊濂栨鏁�
                 for (int i = 0; i < prizeNum; i++) {
                     PrizeNumber prizeNumber = new PrizeNumber();
@@ -408,13 +434,9 @@
                 }
                 //娣诲姞鎶藉娆℃暟骞惰繑鍥�
                 prizeNumberService.saveBatch(prizeNumberList);
-                return Result.ok().data(prizeNumberList.size());
+                return Result.ok().data(prizeNumberList.size()+size);
             }
-        } finally {
-            if (lock.isHeldByCurrentThread()) {
-                lock.unlock();
-            }
-        }
+
         Integer maxPrize = activity.getMaxPrize();
         //鍏朵粬鎯呭喌
         int useNum = 0;
@@ -431,6 +453,24 @@
             return Result.ok().data(0);
         } else {
             return Result.ok().data(userPrizeNum > maxPrize ? maxPrize - useNum : notUseNum);
+        }
+        } 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();
+                    }
+                }
+            });
+
         }
     }
 
@@ -489,48 +529,304 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Result addPrizeNum(AddPrizeNumForm addPrizeNumForm) {
-        PrizeActivity activity = prizeActivityService.getById(addPrizeNumForm.getPrizeActivityId());
-        if (activity == null) {
-            throw new ServiceException("褰撳墠娲诲姩涓嶅瓨鍦�");
+        //鎸囧畾娲诲姩缁欐寚瀹氭椿鍔ㄦ坊鍔犳病鎸囧畾娲诲姩缁欓粯璁ゆ椿鍔ㄦ坊鍔�
+        String prizeActivityId = addPrizeNumForm.getPrizeActivityId();
+        if (StringUtils.isBlank(prizeActivityId)) {
+            LambdaQueryWrapper<PrizeActivity> pop = Wrappers.<PrizeActivity>lambdaQuery()
+                    .eq(PrizeActivity::getEnableStatus, PrizeActivityStatusEnum.ON.name())
+                    .eq(PrizeActivity::getPopup, true);
+            PrizeActivity one = prizeActivityService.getOne(pop);
+            if (one == null) {
+                return Result.ok().data(0);
+            }
+            addPrizeNumForm.setPrizeActivityId(one.getId());
         }
-        if (!PrizeActivityStatusEnum.ON.name().equals(activity.getEnableStatus())) {
-            throw new ServiceException("褰撳墠娲诲姩娌″紑鍚�");
+
+        AuthUser currentUser = UserContext.getCurrentUser();
+        if (currentUser == null) {
+            return Result.ok().data(0);
+        }
+        //鎸囧畾鐢ㄦ埛缁欐寚瀹氱敤鎴锋坊鍔犳病鎸囧畾娲诲姩缁欏綋鍓嶇櫥褰曠敤鎴锋坊鍔�
+        if (StringUtils.isBlank(addPrizeNumForm.getUserId())) {
+            addPrizeNumForm.setUserId(currentUser.getId());
+
+        }
+        String extend = addPrizeNumForm.getExtend();
+        JSONObject jsonObject = JSONObject.parseObject(extend);
+        String shareId =null;
+        if (jsonObject != null) {
+            shareId  = jsonObject.getString("shareId");
         }
         Date date = new Date();
-        //娲诲姩缁撴潫涓嶉渶瑕佹坊鍔�
-        if (date.after(activity.getEndTime())) {
-            throw new ServiceException("褰撳墠娲诲姩宸茬粨鏉�");
+        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);
+            }
         }
-        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("褰撳墠绫诲瀷涓嶅瓨鍦�");
-        }
-        //todo 杩涜鏁版嵁鏍¢獙
-        switch (actionEnum) {
-            case BUY:
-                System.err.println("BUY");
-                break;
-            case SHARE:
-                //鐩存帴鑾峰緱鎶藉娆℃暟
-                System.err.println("SHARE");
-                break;
-            case SEE_SHOP:
-                System.err.println("SEE_SHOP");
-                break;
-            case SEE_VIDEO:
-                System.err.println("SEE_VIDEO");
-                break;
-            default:
 
-                break;
+        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();
+                    }
+                }
+            });
         }
-        return null;
+    }
+
+    public AddPrizeRule getAddPrizeRule(String ruleCode) {
+        LambdaQueryWrapper<AddPrizeRule> one = Wrappers.<AddPrizeRule>lambdaQuery().eq(AddPrizeRule::getRuleCode, ruleCode);
+        return addPrizeRuleService.getOne(one);
     }
 }

--
Gitblit v1.8.0